From 11f2d26fce2ae8557e7288d01ad72a9e6eb3a532 Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Wed, 12 Nov 2025 08:14:29 +0800 Subject: [PATCH] openflow lab finished maybe --- openflow.pcap | Bin 19432 -> 0 bytes openflow/GEMINI.md | 40 ++++ openflow/main_user_openflow.c | 6 +- openflow/main_user_openflow_analysis.md | 243 +++++++++++++----------- openflow/openflow.log | 178 +++++++++++++++++ openflow/openflow.pcap | Bin 0 -> 10766 bytes openflow/user_openflow | Bin 291676 -> 291676 bytes 7 files changed, 357 insertions(+), 110 deletions(-) delete mode 100644 openflow.pcap create mode 100644 openflow/GEMINI.md create mode 100644 openflow/openflow.log create mode 100644 openflow/openflow.pcap diff --git a/openflow.pcap b/openflow.pcap deleted file mode 100644 index 48638631520c74ba59d33a98ef32c18d578fa392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19432 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 Kmzq`J$o~VU+Da$@ diff --git a/openflow/GEMINI.md b/openflow/GEMINI.md new file mode 100644 index 0000000..10437c0 --- /dev/null +++ b/openflow/GEMINI.md @@ -0,0 +1,40 @@ +# Project Overview + +This project is an OpenFlow agent written in C. It implements a subset of the OpenFlow 1.3 protocol to allow a remote controller to manage a network switch. The agent is designed to run on an ARM-based device. + +The core logic resides in `main_user_openflow.c`, which handles various OpenFlow message types such as `HELLO`, `FEATURES_REQUEST`, `GET_CONFIG_REQUEST`, and `PACKET_OUT`. The agent responds to these messages by sending back appropriate replies, allowing the controller to inspect and manage the switch's state. + +The project is built using a `Makefile` and links against several local libraries, including `libofp` (for OpenFlow protocol handling) and `libnet` (for network packet manipulation). + +# Building and Running + +## Building + +To build the project, you can use the provided `Makefile`. The `Makefile` uses the `arm-linux-gnueabihf-gcc` cross-compiler, so you'll need to have that installed and in your `PATH`. + +```bash +# To build the project +make +``` + +This will create an executable file named `user_openflow` in the project's root directory. + +## Running + +The `user_openflow` executable can only be run on the target ARM device. Based on the comment at the end of `main_user_openflow.c`, the following command can be used to run the agent: + +```bash +sudo ./user_openflow -c eth0 -i obx0,obx1,obx2,obx3 +``` + +* `-c eth0`: Specifies the control interface. +* `-i obx0,obx1,obx2,obx3`: Specifies the data plane interfaces. + +The agent will then listen for incoming connections from an OpenFlow controller. + +# Development Conventions + +* **Coding Style:** The code follows a C-style with a focus on clarity and modularity. Functions are well-documented with comments explaining their purpose, parameters, and return values. +* **Testing:** There is a Python script `openflow_flow-test.py`, which suggests that testing is done using Python scripts. +* **Dependencies:** The project relies on several pre-compiled libraries located in the `lib/` directory. Any new dependencies should be added there. +* **Architecture:** The main application logic is event-driven, with a central callback function that dispatches OpenFlow messages to their respective handlers. This makes it easy to extend the agent by adding new handlers for additional OpenFlow message types. diff --git a/openflow/main_user_openflow.c b/openflow/main_user_openflow.c index 3158bbb..ec6e7ff 100644 --- a/openflow/main_user_openflow.c +++ b/openflow/main_user_openflow.c @@ -27,6 +27,7 @@ #include #include #include +#include extern void nms_exec_action(u32 inport,u32 outport,struct eth_header *eth,int len,int hit_idx); extern void pkt_print(u8 *data, u16 len); @@ -315,8 +316,9 @@ handle_ofpmsg_aggregate(struct ofp_buffer *ofpbuf) if (flow_stats_addr[i] != 0) { ((struct ofp_flow_stats *)flow_stats_addr[i])->duration_sec = htonl(tv.tv_sec - flow_stats_time[i].tv_sec); ((struct ofp_flow_stats *)flow_stats_addr[i])->duration_nsec = htonl(tv.tv_usec - flow_stats_time[i].tv_usec); - ((struct ofp_flow_stats *)flow_stats_addr[i])->packet_count = ((uint64_t)0x100); // 涉及硬件地址,拼尽全力无法找到,姑且填充256 - ((struct ofp_flow_stats *)flow_stats_addr[i])->byte_count = ((uint64_t)0x40000); // 涉及硬件地址,拼尽全力无法找到,姑且填充262144=256*1024 + // Read packet and byte counts from hardware registers + ((struct ofp_flow_stats *)flow_stats_addr[i])->packet_count = fast_reg_rd(FAST_OFP_FLOW_STATS_PKTS + i * sizeof(uint64_t)); + ((struct ofp_flow_stats *)flow_stats_addr[i])->byte_count = fast_reg_rd(FAST_OFP_FLOW_STATS_BYTES + i * sizeof(uint64_t)); packet_count += ((struct ofp_flow_stats *)flow_stats_addr[i])->packet_count; byte_count += ((struct ofp_flow_stats *)flow_stats_addr[i])->byte_count; diff --git a/openflow/main_user_openflow_analysis.md b/openflow/main_user_openflow_analysis.md index 62607d6..e246f2a 100644 --- a/openflow/main_user_openflow_analysis.md +++ b/openflow/main_user_openflow_analysis.md @@ -5,50 +5,57 @@ --- ## 目录 -1. [辅助函数](#1-辅助函数) - - [`htonll`](#htonll) - - [`ntohll`](#ntohll) -2. [报文构建函数](#2-报文构建函数) - - [`build_opfmsg_header`](#build_opfmsg_header) - - [`build_opfmsg_reply_ofpbuf`](#build_opfmsg_reply_ofpbuf) -3. [OpenFlow 消息处理函数](#3-openflow-消息处理函数) - - [`handle_opfmsg_hello`](#handle_opfmsg_hello) - - [`handle_opfmsg_features_request`](#handle_opfmsg_features_request) - - [`handle_ofpmsg_get_config_request`](#handle_ofpmsg_get_config_request) - - [`handle_ofpmsg_desc`](#handle_ofpmsg_desc) - - [`handle_ofpmsg_flow_stats`](#handle_ofpmsg_flow_stats) - - [`handle_ofpmsg_aggregate`](#handle_ofpmsg_aggregate) - - [`handle_ofpmsg_table`](#handle_ofpmsg_table) - - [`handle_ofpmsg_port_stats`](#handle_ofpmsg_port_stats) - - [`handle_ofpmsg_group_features`](#handle_ofpmsg_group_features) - - [`handle_ofpmsg_port_desc`](#handle_ofpmsg_port_desc) - - [`handle_ofpmsg_packet_out`](#handle_ofpmsg_packet_out) - - [`handle__opfmsg_role_request`](#handle__opfmsg_role_request) -4. [核心回调与主函数](#4-核心回调与主函数) - - [`handle_openflow_callback`](#handle_openflow_callback) - - [`main`](#main) + +- [`main_user_openflow.c` 函数功能详解](#main_user_openflowc-函数功能详解) + - [目录](#目录) + - [1. 辅助函数](#1-辅助函数) + - [`htonll`](#htonll) + - [`ntohll`](#ntohll) + - [2. 报文构建函数](#2-报文构建函数) + - [`build_opfmsg_header`](#build_opfmsg_header) + - [`build_opfmsg_reply_ofpbuf`](#build_opfmsg_reply_ofpbuf) + - [3. OpenFlow 消息处理函数](#3-openflow-消息处理函数) + - [`handle_opfmsg_hello`](#handle_opfmsg_hello) + - [`handle_opfmsg_features_request`](#handle_opfmsg_features_request) + - [`handle_ofpmsg_get_config_request`](#handle_ofpmsg_get_config_request) + - [`handle_ofpmsg_desc`](#handle_ofpmsg_desc) + - [`handle_ofpmsg_flow_stats`](#handle_ofpmsg_flow_stats) + - [`handle_ofpmsg_aggregate`](#handle_ofpmsg_aggregate) + - [`handle_ofpmsg_table`](#handle_ofpmsg_table) + - [`handle_ofpmsg_port_stats`](#handle_ofpmsg_port_stats) + - [`handle_ofpmsg_group_features`](#handle_ofpmsg_group_features) + - [`handle_ofpmsg_port_desc`](#handle_ofpmsg_port_desc) + - [`handle_ofpmsg_packet_out`](#handle_ofpmsg_packet_out) + - [`handle__opfmsg_role_request`](#handle__opfmsg_role_request) + - [4. 核心回调与主函数](#4-核心回调与主函数) + - [`handle_openflow_callback`](#handle_openflow_callback) + - [`main`](#main) --- ## 1. 辅助函数 ### `htonll` + ```c static inline uint64_t htonll(uint64_t n) ``` + - **功能**: 将64位无符号整数从主机字节序(Host Byte Order)转换网络字节序(Network Byte Order)。 - **参数**: - - `n`: 需要转换的64位无符号整数。 + - `n`: 需要转换的64位无符号整数。 - **返回值**: 转换后的网络字节序64位整数。 - **逻辑**: 通过检查 `htonl(1)` 的结果来判断当前系统是否为大端序。如果是小端序,则将高32位和低32位分别转换后交换位置。 ### `ntohll` + ```c static inline uint64_t ntohll(uint64_t n) ``` + - **功能**: 将64位无符号整数从网络字节序转换为主机字节序。 - **参数**: - - `n`: 需要转换的64位网络字节序整数。 + - `n`: 需要转换的64位网络字节序整数。 - **返回值**: 转换后的主机字节序64位整数。 - **逻辑**: 与 `htonll` 类似,根据系统的大小端情况进行相应的转换。 @@ -57,36 +64,40 @@ static inline uint64_t ntohll(uint64_t n) ## 2. 报文构建函数 ### `build_opfmsg_header` + ```c void build_opfmsg_header(struct ofp_header *ofpbuf_header, uint16_t len, uint8_t type, uint32_t xid) ``` + - **功能**: 构建一个标准的 OpenFlow 报文头。 - **参数**: - - `ofpbuf_header`: 指向 `ofp_header` 结构体的指针,用于填充报文头信息。 - - `len`: 整个 OpenFlow 报文的总长度。 - - `type`: OpenFlow 报文的类型 (例如 `OFPT_HELLO`, `OFPT_FEATURES_REPLY` 等)。 - - `xid`: 事务ID (Transaction ID),用于匹配请求和响应。 + - `ofpbuf_header`: 指向 `ofp_header` 结构体的指针,用于填充报文头信息。 + - `len`: 整个 OpenFlow 报文的总长度。 + - `type`: OpenFlow 报文的类型 (例如 `OFPT_HELLO`, `OFPT_FEATURES_REPLY` 等)。 + - `xid`: 事务ID (Transaction ID),用于匹配请求和响应。 - **逻辑**: - 1. 设置版本号为 `OFP13_VERSION` (0x04)。 - 2. 使用 `htons` 将长度 `len` 转换网络字节序后填充。 - 3. 设置报文类型 `type`。 - 4. 设置事务ID `xid`。 + 1. 设置版本号为 `OFP13_VERSION` (0x04)。 + 2. 使用 `htons` 将长度 `len` 转换网络字节序后填充。 + 3. 设置报文类型 `type`。 + 4. 设置事务ID `xid`。 ### `build_opfmsg_reply_ofpbuf` + ```c u8 *build_opfmsg_reply_ofpbuf(uint8_t type, uint32_t xid, uint16_t len) ``` + - **功能**: 分配内存并构建一个用于回复的 OpenFlow 报文缓冲区。 - **参数**: - - `type`: 回复报文的类型。 - - `xid`: 对应请求报文的事务ID。 - - `len`: 回复报文的总长度。 + - `type`: 回复报文的类型。 + - `xid`: 对应请求报文的事务ID。 + - `len`: 回复报文的总长度。 - **返回值**: 指向新分配和初始化的报文缓冲区的指针 (`u8 *`)。 - **逻辑**: - 1. 使用 `malloc` 分配指定长度 `len` 的内存。 - 2. 使用 `memset` 将分配的内存清零。 - 3. 调用 `build_opfmsg_header` 函数填充报文的头部信息。 - 4. 返回指向该缓冲区的指针。 + 1. 使用 `malloc` 分配指定长度 `len` 的内存。 + 2. 使用 `memset` 将分配的内存清零。 + 3. 调用 `build_opfmsg_header` 函数填充报文的头部信息。 + 4. 返回指向该缓冲区的指针。 --- @@ -95,159 +106,175 @@ u8 *build_opfmsg_reply_ofpbuf(uint8_t type, uint32_t xid, uint16_t len) 这些函数遵循 `handle_openflow_callback` 的规范,返回 `HANDLE` (0x1) 表示消息已处理,返回 `CONTINUE` (0x2) 表示未处理。 ### `handle_opfmsg_hello` + - **对应消息**: `OFPT_HELLO` - **功能**: 处理与控制器建立连接时的 `HELLO` 消息。 - **逻辑**: - 1. 检查接收到的 `HELLO` 消息中的 OpenFlow 版本号。 - 2. 如果版本号是 `0x04` (OpenFlow 1.3),则打印 "RECV HELLO!"。 - 3. 如果版本号不匹配,则构建一个 `OFPT_ERROR` 消息并发送给控制器,表明版本不兼容。 - 4. 返回 `HANDLE` 表示消息已处理。 + 1. 检查接收到的 `HELLO` 消息中的 OpenFlow 版本号。 + 2. 如果版本号是 `0x04` (OpenFlow 1.3),则打印 "RECV HELLO!"。 + 3. 如果版本号不匹配,则构建一个 `OFPT_ERROR` 消息并发送给控制器,表明版本不兼容。 + 4. 返回 `HANDLE` 表示消息已处理。 ### `handle_opfmsg_features_request` + - **对应消息**: `OFPT_FEATURES_REQUEST` - **功能**: 响应控制器查询交换机功能的请求。 - **逻辑**: - 1. 构建一个 `OFPT_FEATURES_REPLY` 类型的回复报文。 - 2. 填充 `ofp_switch_features` 结构体,包含交换机的功能信息,如: + 1. 构建一个 `OFPT_FEATURES_REPLY` 类型的回复报文。 + 2. 填充 `ofp_switch_features` 结构体,包含交换机的功能信息,如: - `datapath_id`: 交换机的唯一标识符。 - `n_buffers`: 交换机可以缓存的数据包数量。 - `n_tables`: 支持的流表数量(此处硬编码为1)。 - `capabilities`: 支持的特性(如流统计、端口统计等)。 - 3. 发送该回复报文给控制器。 - 4. 返回 `HANDLE`。 + 3. 发送该回复报文给控制器。 + 4. 返回 `HANDLE`。 ### `handle_ofpmsg_get_config_request` + - **对应消息**: `OFPT_GET_CONFIG_REQUEST` - **功能**: 响应控制器查询交换机配置的请求。 - **逻辑**: - 1. 构建一个 `OFPT_GET_CONFIG_REPLY` 类型的回复报文。 - 2. 填充 `ofp_switch_config` 结构体,包含交换机的配置信息,如: + 1. 构建一个 `OFPT_GET_CONFIG_REPLY` 类型的回复报文。 + 2. 填充 `ofp_switch_config` 结构体,包含交换机的配置信息,如: - `flags`: 配置标志。 - `miss_send_len`: 当发生 table-miss 时,发送到控制器的报文最大长度。 - 3. 发送该回复报文。 - 4. 返回 `HANDLE`。 + 3. 发送该回复报文。 + 4. 返回 `HANDLE`。 ### `handle_ofpmsg_desc` + - **对应消息**: `OFPT_MULTIPART_REQUEST` (子类型 `OFPMP_DESC`) - **功能**: 响应控制器查询交换机描述信息的请求。 - **逻辑**: - 1. 构建一个 `OFPT_MULTIPART_REPLY` 类型的回复报文。 - 2. 设置 multipart 类型为 `OFPMP_DESC`。 - 3. 填充 `ofp_desc_stats` 结构体,包含制造商、硬件、软件、序列号等描述信息(此处使用硬编码的字符串)。 - 4. 发送该回复报文。 - 5. 返回 `HANDLE`。 + 1. 构建一个 `OFPT_MULTIPART_REPLY` 类型的回复报文。 + 2. 设置 multipart 类型为 `OFPMP_DESC`。 + 3. 填充 `ofp_desc_stats` 结构体,包含制造商、硬件、软件、序列号等描述信息(此处使用硬编码的字符串)。 + 4. 发送该回复报文。 + 5. 返回 `HANDLE`。 ### `handle_ofpmsg_flow_stats` + - **对应消息**: `OFPT_MULTIPART_REQUEST` (子类型 `OFPMP_FLOW`) - **功能**: 响应控制器查询流表统计信息的请求。 - **逻辑**: - 1. 遍历全局流表统计地址数组 `flow_stats_addr`,计算所有有效流表项的总长度。 - 2. 构建一个足够大的 `OFPT_MULTIPART_REPLY` 回复报文。 - 3. 设置 multipart 类型为 `OFPMP_FLOW`。 - 4. 再次遍历 `flow_stats_addr`,将每个有效的流表统计信息 (`ofp_flow_stats`) 拷贝到回复报文中。 - 5. 发送该回复报文。 - 6. 返回 `HANDLE`。 + 1. 遍历全局流表统计地址数组 `flow_stats_addr`,计算所有有效流表项的总长度。 + 2. 构建一个足够大的 `OFPT_MULTIPART_REPLY` 回复报文。 + 3. 设置 multipart 类型为 `OFPMP_FLOW`。 + 4. 再次遍历 `flow_stats_addr`,将每个有效的流表统计信息 (`ofp_flow_stats`) 拷贝到回复报文中。 + 5. 发送该回复报文。 + 6. 返回 `HANDLE`。 ### `handle_ofpmsg_aggregate` + - **对应消息**: `OFPT_MULTIPART_REQUEST` (子类型 `OFPMP_AGGREGATE`) - **功能**: 响应控制器查询聚合统计信息(总流数、总包数、总字节数)的请求。 - **逻辑**: - 1. 构建一个 `OFPT_MULTIPART_REPLY` 回复报文,类型为 `OFPMP_AGGREGATE`。 - 2. 初始化 `flow_count`, `packet_count`, `byte_count` 为 0。 - 3. 遍历 `flow_stats_addr`,累加每个流的包计数和字节计数,并统计流的数量。 + 1. 构建一个 `OFPT_MULTIPART_REPLY` 回复报文,类型为 `OFPMP_AGGREGATE`。 + 2. 初始化 `flow_count`, `packet_count`, `byte_count` 为 0。 + 3. 遍历 `flow_stats_addr`,累加每个流的包计数和字节计数,并统计流的数量。 - **注意**: 此处代码会更新每个流的 `duration_sec` 和 `duration_nsec`,并为 `packet_count` 和 `byte_count` 填充了硬编码的示例值。 - 4. 将聚合统计结果填充到 `ofp_aggregate_stats_reply` 结构体中。 - 5. 发送该回复报文。 - 6. 返回 `HANDLE`。 + 4. 将聚合统计结果填充到 `ofp_aggregate_stats_reply` 结构体中。 + 5. 发送该回复报文。 + 6. 返回 `HANDLE`。 ### `handle_ofpmsg_table` + - **对应消息**: `OFPT_MULTIPART_REQUEST` (子类型 `OFPMP_TABLE`) - **功能**: 响应控制器查询流表自身统计信息的请求。 - **逻辑**: - 1. 构建一个 `OFPT_MULTIPART_REPLY` 回复报文,类型为 `OFPMP_TABLE`。 - 2. 填充 `ofp_table_stats` 结构体,包含活动流表项数量、查询次数、匹配次数等信息(此处硬编码为1个流表,活动数量为1)。 - 3. 发送该回复报文。 - 4. 返回 `HANDLE`。 + 1. 构建一个 `OFPT_MULTIPART_REPLY` 回复报文,类型为 `OFPMP_TABLE`。 + 2. 填充 `ofp_table_stats` 结构体,包含活动流表项数量、查询次数、匹配次数等信息(此处硬编码为1个流表,活动数量为1)。 + 3. 发送该回复报文。 + 4. 返回 `HANDLE`。 ### `handle_ofpmsg_port_stats` + - **对应消息**: `OFPT_MULTIPART_REQUEST` (子类型 `OFPMP_PORT_STATS`) - **功能**: 响应控制器查询端口统计信息的请求。 - **逻辑**: - 1. 根据全局端口信息结构体 `nmps` 中的端口数量 `cnt`,构建一个 `OFPT_MULTIPART_REPLY` 回复报文。 - 2. 设置 multipart 类型为 `OFPMP_PORT_STATS`。 - 3. 遍历所有端口,将每个端口的统计信息 `nmps.ports[i].stats` 拷贝到回复报文中,并计算和填充端口的活动时间。 - 4. 发送该回复报文。 - 5. 返回 `HANDLE`。 + 1. 根据全局端口信息结构体 `nmps` 中的端口数量 `cnt`,构建一个 `OFPT_MULTIPART_REPLY` 回复报文。 + 2. 设置 multipart 类型为 `OFPMP_PORT_STATS`。 + 3. 遍历所有端口,将每个端口的统计信息 `nmps.ports[i].stats` 拷贝到回复报文中,并计算和填充端口的活动时间。 + 4. 发送该回复报文。 + 5. 返回 `HANDLE`。 ### `handle_ofpmsg_group_features` + - **对应消息**: `OFPT_MULTIPART_REQUEST` (子类型 `OFPMP_GROUP_FEATURES`) - **功能**: 响应控制器查询交换机组表(Group Table)特性的请求。 - **逻辑**: - 1. 构建一个 `OFPT_MULTIPART_REPLY` 回复报文。 - 2. 填充 `ofp_group_features` 结构体,设置其类型为 `OFPMP_GROUP_FEATURES`。 - 3. 发送该回复报文。 - 4. 返回 `HANDLE`。 + 1. 构建一个 `OFPT_MULTIPART_REPLY` 回复报文。 + 2. 填充 `ofp_group_features` 结构体,设置其类型为 `OFPMP_GROUP_FEATURES`。 + 3. 发送该回复报文。 + 4. 返回 `HANDLE`。 ### `handle_ofpmsg_port_desc` + - **对应消息**: `OFPT_MULTIPART_REQUEST` (子类型 `OFPMP_PORT_DESC`) - **功能**: 响应控制器查询端口描述信息的请求。 - **逻辑**: - 1. 根据全局端口信息结构体 `nmps` 中的端口数量 `cnt`,构建一个 `OFPT_MULTIPART_REPLY` 回复报文。 - 2. 设置 multipart 类型为 `OFPMP_PORT_DESC`。 - 3. 遍历所有端口,将每个端口的状态描述信息 `nmps.ports[i].state` 拷贝到回复报文中。 - 4. 发送该回复报文。 - 5. 返回 `HANDLE`。 + 1. 根据全局端口信息结构体 `nmps` 中的端口数量 `cnt`,构建一个 `OFPT_MULTIPART_REPLY` 回复报文。 + 2. 设置 multipart 类型为 `OFPMP_PORT_DESC`。 + 3. 遍历所有端口,将每个端口的状态描述信息 `nmps.ports[i].state` 拷贝到回复报文中。 + 4. 发送该回复报文。 + 5. 返回 `HANDLE`。 ### `handle_ofpmsg_packet_out` + - **对应消息**: `OFPT_PACKET_OUT` - **功能**: 处理控制器下发的 `Packet Out` 消息,该消息指示交换机将特定数据包通过指定端口发送出去。 - **逻辑**: - 1. 解析 `ofp_packet_out` 消息,提取出 `in_port`(入端口)、`actions_len`(动作列表长度)以及附带的数据包(`eth`)。 - 2. 检查 `actions_len`: + 1. 解析 `ofp_packet_out` 消息,提取出 `in_port`(入端口)、`actions_len`(动作列表长度)以及附带的数据包(`eth`)。 + 2. 检查 `actions_len`: - 如果为 0,表示没有指定动作,默认执行泛洪(`OFPP_FLOOD`)。 - 如果不为 0,则遍历动作列表。 - 3. 对于 `OFPAT_OUTPUT` 类型的动作,提取 `port`(出端口),并调用 `nms_exec_action` 函数将数据包从指定端口发送出去。 - 4. 返回 `HANDLE`。 + 3. 对于 `OFPAT_OUTPUT` 类型的动作,提取 `port`(出端口),并调用 `nms_exec_action` 函数将数据包从指定端口发送出去。 + 4. 返回 `HANDLE`。 ### `handle__opfmsg_role_request` + - **对应消息**: `OFPT_ROLE_REQUEST` - **功能**: 处理控制器设置或查询交换机角色的请求(如 Master, Slave)。 - **逻辑**: - 1. 构建一个 `OFPT_ROLE_REPLY` 类型的回复报文。 - 2. 将请求中的角色信息 (`ofp_role`) 直接拷贝到回复报文中。 - 3. 发送该回复报文。 - 4. 返回 `HANDLE`。 + 1. 构建一个 `OFPT_ROLE_REPLY` 类型的回复报文。 + 2. 将请求中的角色信息 (`ofp_role`) 直接拷贝到回复报文中。 + 3. 发送该回复报文。 + 4. 返回 `HANDLE`。 --- ## 4. 核心回调与主函数 ### `handle_openflow_callback` + ```c int handle_openflow_callback(struct ofp_buffer *ofpbuf, int len) ``` + - **功能**: 这是注册给 OpenFlow 库的核心回调函数,作为所有进入的 OpenFlow 消息的分发中枢。 - **参数**: - - `ofpbuf`: 指向包含 OpenFlow 消息的缓冲区的指针。 - - `len`: 消息的总长度。 + - `ofpbuf`: 指向包含 OpenFlow 消息的缓冲区的指针。 + - `len`: 消息的总长度。 - **返回值**: - - `HANDLE` (0x1): 如果消息被此回调中的某个函数处理了。 - - `CONTINUE` (0x2): 如果消息类型不被支持或未被处理,交由后续处理。 + - `HANDLE` (0x1): 如果消息被此回调中的某个函数处理了。 + - `CONTINUE` (0x2): 如果消息类型不被支持或未被处理,交由后续处理。 - **逻辑**: - 1. 从报文头中提取消息类型 `oftype`。 - 2. 使用 `switch` 语句根据 `oftype` 将消息分发给对应的 `handle_...` 函数。 - 3. 对于 `OFPT_MULTIPART_REQUEST` 类型的消息,会进一步检查其子类型(`multipart->type`),并分发给相应的处理函数(如 `handle_ofpmsg_desc`, `handle_ofpmsg_flow_stats` 等)。 - 4. 如果 `switch` 语句中没有匹配的类型,则打印未处理信息并返回 `CONTINUE`。 + 1. 从报文头中提取消息类型 `oftype`。 + 2. 使用 `switch` 语句根据 `oftype` 将消息分发给对应的 `handle_...` 函数。 + 3. 对于 `OFPT_MULTIPART_REQUEST` 类型的消息,会进一步检查其子类型(`multipart->type`),并分发给相应的处理函数(如 `handle_ofpmsg_desc`, `handle_ofpmsg_flow_stats` 等)。 + 4. 如果 `switch` 语句中没有匹配的类型,则打印未处理信息并返回 `CONTINUE`。 ### `main` + ```c int main(int argc, char* argv[]) ``` + - **功能**: 程序的主入口点。 - **逻辑**: - 1. 调用 `ofp_init(argc, argv)` 初始化 OpenFlow 环境。 - 2. 定义一个 `mask` 变量,用于指定程序希望监听和处理哪些类型的 OpenFlow 消息。 - 3. 通过位或运算 (`|`) 将多个消息类型的掩码(如 `MASK_HELLO`, `MASK_FEATURES_REQUEST` 等)组合起来,赋值给 `mask`。 - 4. 调用 `openflow_hook_init(mask, handle_openflow_callback)`,将 `mask` 和核心回调函数 `handle_openflow_callback` 注册到 OpenFlow 库。这样,只有 `mask` 中指定类型的消息到达时,`handle_openflow_callback` 才会被调用。 - 5. 调用 `pause()`,使程序进入挂起状态,等待网络事件(即等待 OpenFlow 消息的到来)。 - 6. 程序将在此处循环等待和处理消息,直到被终止。 + 1. 调用 `ofp_init(argc, argv)` 初始化 OpenFlow 环境。 + 2. 定义一个 `mask` 变量,用于指定程序希望监听和处理哪些类型的 OpenFlow 消息。 + 3. 通过位或运算 (`|`) 将多个消息类型的掩码(如 `MASK_HELLO`, `MASK_FEATURES_REQUEST` 等)组合起来,赋值给 `mask`。 + 4. 调用 `openflow_hook_init(mask, handle_openflow_callback)`,将 `mask` 和核心回调函数 `handle_openflow_callback` 注册到 OpenFlow 库。这样,只有 `mask` 中指定类型的消息到达时,`handle_openflow_callback` 才会被调用。 + 5. 调用 `pause()`,使程序进入挂起状态,等待网络事件(即等待 OpenFlow 消息的到来)。 + 6. 程序将在此处循环等待和处理消息,直到被终止。 diff --git a/openflow/openflow.log b/openflow/openflow.log new file mode 100644 index 0000000..4e781d1 --- /dev/null +++ b/openflow/openflow.log @@ -0,0 +1,178 @@ +hnxs@NESystem-NetEXP:~/case/openflow$ sudo ./user_openflow -4 127.0.0.1 -c eth0 -i obx0,obx1,obx2,obx3 +fastU->REG Version:20180827,OpenBox HW Version:2030200729,Base_addr:43c00000 +port_name:eth0,port:0 +port_name:obx0,port:0 +port_name:obx1,port:1 +port_name:obx2,port:2 +port_name:obx3,port:3 +fastU->librule version:20181015,Default Action:0x40000080 +user_openflow)Connect to SDN Controller [ 127.0.0.1:6653 ] OK! +send openflow messages to openflow_msg_callback !! +header.version:6, type:0, len:16 +header.version:6 +ofpbuf_header->length=8 +ofpbuf_reply,malloc:0xb3505478,type:1,len:8 +NO CONNECTED! +send openflow messages to openflow_msg_callback !! +header.version:4, type:5, len:8 +ofpbuf_header->length=32 +ofpbuf_reply,malloc:0xb3505488,type:6,len:32 +send openflow messages to openflow_msg_callback !! +header.version:4, type:18, len:16 +ofpbuf_header->length=336 +ofpbuf_reply,malloc:0xb35054b0,type:19,len:336 +send openflow messages to openflow_msg_callback !! +header.version:4, type:7, len:8 +ofpbuf_header->length=12 +ofpbuf_reply,malloc:0xb3505478,type:8,len:12 +send openflow messages to openflow_msg_callback !! +header.version:4, type:18, len:16 +ofpbuf_header->length=1072 +ofpbuf_reply,malloc:0xb3505478,type:19,len:1072 +send openflow messages to openflow_msg_callback !! +header.version:4, type:18, len:16 +Unsupported multipart request type: 12 +send openflow messages to openflow_msg_callback !! +header.version:4, type:24, len:24 +ofpbuf_header->length=24 +ofpbuf_reply,malloc:0xb3505478,type:25,len:24 +0_nms_of13)>> handle__opfmsg_role_request :main_user_openflow.c[515] +0_nms_of13)<< handle__opfmsg_role_request :main_user_openflow.c[519] +0_nms_of13)DELETE ALL RULE! +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx0 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx1 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx2 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx3 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx0 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx1 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx2 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx3 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +eth0 ADD! +obx0 ADD! +obx1 ADD! +obx2 ADD! +obx2(0x36f58) Start... +obx1(0x348d8) Start... +obx0(0x32410) Start... +obx3(0x39340) Start... +obx3 ADD! +fastU->PKT__IN-obx0 IPv4 [ 0x0800 ]/[ 1 ] Packet len:98 OK! reason:NO MATCH[0] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:138 +fastU->PKT_OUT-obx1 IPv4 [ 0x0800 ]/[ 1 ] Packet len:98 OK! [ in:0x00000001 ] +fastU->PKT_OUT-obx2 IPv4 [ 0x0800 ]/[ 1 ] Packet len:98 OK! [ in:0x00000001 ] +fastU->PKT_OUT-obx3 IPv4 [ 0x0800 ]/[ 1 ] Packet len:98 OK! [ in:0x00000001 ] +fastU->PKT__IN-obx3 IPv4 [ 0x0800 ]/[ 1 ] Packet len:98 OK! reason:NO MATCH[0] +FLOW_MOD->Output:0x0001,len:16,max_len:0xFFFF,action:30000000 +Flow mod ADD(0) 30000000,Aging time:1762854049(5) +0_nms_of13)ADD HW NEW(0) RULE! +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:138 +fastU->PKT_OUT-obx0 IPv4 [ 0x0800 ]/[ 1 ] Packet len:98 OK! [ in:0x00000004 ] +fastU->PKT__IN-obx0 IPv4 [ 0x0800 ]/[ 1 ] Packet len:98 OK! reason:NO MATCH[0] +FLOW_MOD->Output:0x0004,len:16,max_len:0xFFFF,action:30000003 +Flow mod ADD(1) 30000003,Aging time:1762854050(5) +0_nms_of13)ADD HW NEW(1) RULE! +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:138 +fastU->PKT_OUT-obx3 IPv4 [ 0x0800 ]/[ 1 ] Packet len:98 OK! [ in:0x00000001 ] +obx1 DELETE! +obx2 DELETE! +fastU->PKT__IN-obx3 ARP [ 0x0806 ]/[ 0 ] Packet len:60 OK! reason:NO MATCH[0] +FLOW_MOD->Output:0x0001,len:16,max_len:0xFFFF,action:30000000 +Flow mod ADD(2) 30000000,Aging time:1762854054(5) +0_nms_of13)ADD HW NEW(2) RULE! +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:100 +fastU->PKT_OUT-obx0 ARP [ 0x0806 ]/[ 0 ] Packet len:60 OK! [ in:0x00000004 ] +fastU->PKT__IN-obx0 ARP [ 0x0806 ]/[ 0 ] Packet len:60 OK! reason:NO MATCH[0] +FLOW_MOD->Output:0x0004,len:16,max_len:0xFFFF,action:30000003 +Flow mod ADD(3) 30000003,Aging time:1762854054(5) +0_nms_of13)ADD HW NEW(3) RULE! +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:100 +fastU->PKT_OUT-obx3 ARP [ 0x0806 ]/[ 0 ] Packet len:60 OK! [ in:0x00000001 ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx3 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx0 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx3 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx0 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +Aging Rule Delay 0,add 5s +Aging Rule Delay 1,add 5s +Aging Rule Delete 2 start(1762854049)--end(now:1762854055,aging:1762854054) +Aging Rule Delete 3 start(1762854049)--end(now:1762854055,aging:1762854054) +Aging Rule Delay 0,add 5s +Aging Rule Delete 1 start(1762854045)--end(now:1762854061,aging:1762854060) +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx3 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx0 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx3 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx0 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +Aging Rule Delete 0 start(1762854044)--end(now:1762854070,aging:1762854069) +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx3 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx0 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx3 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx0 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx3 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx0 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx3 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx0 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx3 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:115 +fastU->PKT_OUT-obx0 LLDP [ 0x88CC ]/[ 0 ] Packet len:75 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx3 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] +send openflow messages to openflow_msg_callback !! +header.version:4, type:13, len:123 +fastU->PKT_OUT-obx0 ETHX [ 0x8942 ]/[ 0 ] Packet len:83 OK! [ in:0xFFFFFFFD ] + diff --git a/openflow/openflow.pcap b/openflow/openflow.pcap new file mode 100644 index 0000000000000000000000000000000000000000..40539763c5b31fa35f547e7e9aec88361570d8bb GIT binary patch literal 10766 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 PNV2d{3>Feq3!MBv_p!W> literal 0 HcmV?d00001 diff --git a/openflow/user_openflow b/openflow/user_openflow index b6654539459e176d1527ee71b9bb09b16cfe485a..3a4bc89baf9afbe75a1b3a447d3053ba317d7af5 100755 GIT binary patch delta 53887 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 AP5=M^ delta 53952 zcma&Pc|cXg`#*l>T$T%nfPn0BSw#U^L{LFR#VfMombrqO;gY*%ZlGD3siA|6iYb+u zsTrER-(+s>W@c(;W@=WZ>>zKt=Z2`i*PL@eF3{)u`{Ux_%rnpaJoC&mbMfXqhnx2t z^7~pX{!0)R|3!qwTL(`w&%-ZyTi^fLsrQx0JL|Kqo!f9cvN6rVb7=3=udn~8fPC&G z3ifnd*A&syp6>7J>zrVJww?%2q%GAeay*uq1zTKBF^r?Py7sX;|Ky*X(i~E^pL)2w zMzZOdgJFy^3R>}&re*voO8MWmzds=x8RACSpCw>zB5VP>5nR1 zhmu^+e~6!}-aqD)KL1o`dEL-AN`w!WWd->?%wCZ*A*XTXwqtI3N8J-i`?xgw)0x`d zE3yT@71IR2*lFo?f{2gin{sQvr_WkH5zzKk8oj%I#Z31+0l(eAZ@Z4Im^nVr@^ohH3ZZn2%dM(gz1IdrFTFq(3@B6Y*rxSdK)DiJzqYs{5 zHu}mx{p6qi^3MSIXQ2GEyRKs_LGox1{2WqeCcd0&>?ywpmVbuGKSSl8z2u)^9iVa3 zThB_K^>ewFtaBY)sWJbiTsy2iF*p6jS>FN5n%Gy0TEJOBFP8tf5OhW5{##13Vw0-*`@o+0?Wwdj)(U zHroty_EqpXv8t`-0>iFjv9PrO9~yke@_|;h_yL;j6%nSd7*c=JPcizZIX}8{Ul>@~ zZ|1|9<2@bqzY0a}9>gZW6+H2gNcx%Avvy8R%{*#BFNF5!Hq5KyVe>m%yc1;}n)$v! zU+-2#*3s_X-d>B9k(rii3{HByL?mx_AAEK>bZWAFA&@>0pe*=C*<7@4n~= zmIJm?gW860JWg5M0@ZjqTgKn7b zhfgRzG58F|XG*J2a;xX&_haymQ*!`-J>RI&_miK@sI7mWn8%UxRYWqsxaa7CI3*ne|)$b8FMV^W)mP%uGHe00EfwtAuG|1PKMOO0Z(b`|XUS>N_#n@i#np>|Y)F!;&gPI% z01wXQXgCUS>tHmTP zdUUN`0F0CLw~YQJ4oR*)GS+EC2P_)$(8ia?TtPN4)4@F)odc^aiY#|ICKTzlMc)~Z zho8R3vCr%=fQaLx>D}(jsyL|LQz{~KUQIBojx7XQh@3h@^d*|(3*$;XIlXLj# zMx%Sixh$`8g*vs(>P!SpE$8dCo?c;TRa|Yu^cF>~x~WiFS@!ovvl1?whME^~iG>1@ z66oQvG^1)4t?lmYXh|PSaaD(eNWD45svs*dd$uFB5AOU_k%@F}U-#aRC83I|azLVM zU~E#eGKs7_3m`AniLwHl)%jTJN|ywOS^iO}m6doXIKWD1VfdF|ujKueT#>`{_9I+% zox$*dX|jzqiXnuD)=*^;*nNueByd?4IVM=``oefzcMhubth^wKLNOg25<_;;mqKFA zS604h^rt>Oo$1989hpvRLtM;9w!G7YYMpZ`te|A8?bh45q905B<SMdV zEp(676{QcJ40>?cY^SSkW>WGpZV0lKJ4xOG#iy0|JLrO5&Q|j)tST);?#plVa#&v4chnYK>J!~|FF)gmG+J0mPHo3k`uV@7ee>r%Wa`Y!QZx^ zbAerfeZga?s{ELb?Llt81JhCr@e9C*M%EGB&Mf({bgi7n_m*?mA(`?3>olD9qeYQ`mRYlFe5Lh|HGoqx1Cj@JFizT-&2nYpF<2AnCFKfj8aC1@M5!7^^ z2qDxtx*tld^ypD`7B%J%Mw9uz+6VT+BdL@gjUI#|;X!n)Rkwd5nHA${cUR7hhd}ZW zCrMwA=`9+n>Dicp>hqV=cSM#r9{*0n$5HlS#{#DU=Yp;UkEA0sv;Q!0 zV->v}~C3Vsrza+d4ziNpUWukS>Yq?UGfg zMvA$-%CsLGk3uGhoSbV5ODy+2VLO?YVGOLUK;376v&;tWPtjR_BWvRO-S_iwxqg8(m?7rsE18wU~e|k<#3aTNvu#XN-1Vg#5|HNm4B+Hry|hZ*_JN-Y>*3zt6v6%*_4!96q)T(TtT7I z$;#^%Pk21-$HsS$ov-2=gPKEEJRA6O+Tw#8R!G?K_0vq`SWDlG?_rYx3ddAuyBzOl zu3-Kr-Y>>U#jJgE5U|E}fYn0Ay2b=+ARRS0*s7t-qS9J+mi2>uT3Pt$V6Vw1%DBr9 z(>nocI}5ky{GE)}I=@(EQ8X%Hm)^SQJS_f1nqJC7lv|vKEDu#~b)KlGeT=77e%Zey z0;E2>v1Q!DVi0mMTqgS7kWjlM;Qv2;#oM~9*~NKDV&7I9GW9&)=Z+4`nWdXsdxhMU#_s( z=u|wVabx4?`>FNIXjr13)y7t9lOvs**f~JJR+w+COLOqA_8q;aeyE-lV86oTor_Oj zeG_u%TZxW72eOsbHN9co{HN8JnOcoCNi*nAiJ>-;)iy<))Nr>QfnXfUJ)zHt?g0%| zC*+jTdG{@2TnTqUf$^Mgy_a)fno!zQ94=>JXt&2!v-=*l`}Wk^~^gD!Yu?^nKamWVFx@E(!t3tBi^oRrdWI_Fl$EE{;YeT z*R9GI)%JmD=?(A92W1D?w3zEavsIv}^(hXDo{8?gWbj-S4hx*1Zza3gT&pzS^^xF? ziYuQg@nPR8F+E83_TJU9roIaOzS=f6XjqC1IZTJAbhlYqY2K1FJH!HTsSMI%v*@!f~J~Yua zAT-I&q~1?&INIW4=Agr=@J!KIVH$03!ZXHKJk@Mn1=pvqo@RK2-cMvc`cFBP7 z==(oSXiVV@TOOL7?n0dCOX)tg_sZW9%%D=Gyma``k)B9L_0fXwa=KUY!E&C!QuOvn zVfIOuhvXnrLpQ$u1^bRd7rnZoT?vO!jqtTej})fECgv*bmodriN_hr!akKnoJ^wd{ zzMIj*qXfp_xl^G(vV<~dW5 zyJZ&4BL9HG&Nsh@BATgPGoe=63St?J9XSXq!-|o-vvg+U1d>QSM!jLRn5$KIC~c!3 zjp}W4wpLqYrRLHHqmWAxgQe7MbdLdf>I!(v7?L+ezkugb-u#(nv75WiTqT!gE72)D zH1oARl-}SmUz1OC52bvXJ382Ea&1pFGCvyaVj$D$H@>TtIbJfR2f0G`j&XkOxQ`pB zL_}tL2rF0~=Z*7JQS5V7wJ_Vt zC4`0YQtQin1Udg`k~xlZH9`7^((0Nj>Na+Os;dcOW5^~-$HtNr`omZsY%3p(b#_jO z5O{c@1_{3xTx_Z-~u~fY_ z$<<$A!B|N$BG463bJs)Zc6I6fhmxL_KhpzST*q;K17C0)3!MrdN+H!WV{%tI>)9lvn~$Fz23mAv8d?*=$nQnB*gh;Wmk{%iF-}9=P z`kSZE#&jXO{q&kj`sIWWf;QfSWU)}5+hcy4x&1KrLI?}x=>a{Cx5}D4D!7VHMzpnHqjZsK zru%fUHbK`Yovf8*Nt+%?7ISp{(%PUa1-eZgpv$R!B8@y@2F3jD+WA1Ebd&xzJ&dGL zyXTUL1;<4GplhCUoISCFxlJ`sq`y8%t&hq=!V(&#{F=9y5nXD1RyI#ypT{>Mb^ftz z?a{bCsr8GWACrK$mO`MjkpvT6KfOglqjUq~$AtH<<4nd18ZGKmE32jnYB--HZh>eQS0Z-Lhi!sfIez6Qvz5 z$ArR0DX>PTZ7!Hd$~ zrytIA39YKKDB6)=UUUvM)nh5)%s61|T=mO6!OwznJqi8}Et}rLEG+ z4Y9j4dp6qftv17uug^ufv9}a;A4W8tp(M+C0bmxqT@Y=J~drpAk@k+%i2`yIHN1vG! z>$0g5wyM9G-R!TcE4l6t(D&zbw@s;R-D0>k$1B&rlD9>Dc>{1ein446xznsH?1H}* zemJDks$l(HAwRV~XaUz0=M@}5V^&2(*C<6+R^Mxsc2tS zGIq*?pI64$XAbVESDOD=+@Ci8?csQ0a-(El84o7Eu4tmKy%2!Ynh#%a6YDGJ`4=L` z9GJ#E!;%UC_P)@fPpTox(e40$M`)@cNIt)-YB z(ofd^h_2h-#^!BRs-b~q&h9N=gry`gxp zxZPK;*^0~osS6z94V`!ajWX;bsBc_(IFFBVo67Z?^oHDpxX*InN8|D0p@sonCx2-a z?lek0+q33lrn0tM>Hiwy9Gd&TmZ)$VC0{yeftQ`3tesE;E|n=l?Uc_~)+E6YIP6py zQqEWS{ED)>_jo5nK-=?>U`1i!GQR)*eL;Y>RBn>m-lF*noFej7be1@uoIWDHe)H9;mY8D&cI z1kB!X)map!8ZJ4+%cV5OYIa9>sPR>-Fsp3;J=qHacnR&iz3cWyv}S%^$X6VPMPUw3 zVE^tk8}v5832*$+%tbxWt6j0kdr$!mQADOHLHCc;SZh(FiRF93F@GsFgZ%{}1mTnS zy?V6JLggQ+f*xJsNY5^_riMjbP^2DR;!L|Oc6ZoO+Y!Yax@fT<+1N7Y_~I^Pp*-g% z=Jf4wjx~)~5<&c1=Hx92Cy(j8rOx#0CGHMi)^tRtfO;(TBmbd;mWGi%fDLn)-XUBx z{bgwc$pD-O4SdlP7X&!oaWA?%G*-9A>(brv4sY?zfgUpOiNnVXA5u6}FBB-PGoAh) z>2vzoi=ilxYhMf_UsLa8VGf%*z}5q0`)kYm#Jp-mrzbtXtc#daP3JFlqV>z%9eQ;% zLwsCC6JPQbb;^_tFLe>M%9N6q+#N1fwP(2pb`R#u!)*P*W*tm;2cHXc@bW&$RY#XQ z(v8al$!a{M;+DgcqLx zSW2H+*;~w4X6#=XMCQ^TR)#r5bqH)h`>pCtbo7N)FTy|nS{3GSu%aWR%W3**H}6u2 zvk#vQ_{_)0$v4%I=%cJ4|45tY`qkd_!rX53%hm2UarlEPAc}`>w{Sm;C9Ri!t0c-k+?h5d>HBS7B#hNgOa~%fs zF6yw>2Yu4sYiIgQggO%O>5C5!-e1bi{2Yf0b=9w2Nf!cA4LS7G+CH`u%YxAX%|sFL zkCZ{5tWCD+TxPAFmyLS4&H1i-j8VEOpYZNTcJz^z+ZwLgZH1&%J&Ur2KMfu2H zBX81qb~5sI^~>E8OKa7vXKB}x^{}NbB!iyDj!`P8<<|jTQWN{Sh~~tO6J%gIR(t3k zz5TN5unip`lLJsj2eioCMrnHOav;lAkzMyOMYfg}t@H9OeO}WCNzu|MjjXl0LkeSC zg|bnKra!Oq>RRW+_s%?tD*~mVxW9LT7O!(ne>%Ne2h+t`GC&CZ-_5Wj*MMJ)orF|_ zF5(xXXE;YC;QEip36jt6uQ(nu2LU5LvUtVOxxU7x(vo)$$_toGvQS?6$^Icuev!; z{a4sX`g;p(B6V2r=G^VyU_EN8Vau@p-Q;a(%f0dSuRE?ux{;u^_}4p!n$=jyt^NGF zrkvia{x?n!)5`VDoPJI{Hn`dCs{T}fHfGtVy;ZU?%qOQ>``}4mesJ>OCSQq%j!18~ zwR*tQm6$Gg-I1)M?``mQ&H$|rb?c^6x%XAMf6LLm`FH}_?n@(H^K$O=FPu6jyWSDb z@HK(kg0BfY?D#s-9EPTAgi*R!rReIsO3l&l+t#}3aTogt<;?JIX|uL?DPojP;BHeJ z4PZr$*ys(5W^Qy0-BV?SD=ib`D=m+u^`}f{FYI78+8Qmh$F`dNMEbFX_NOxKo>lF& z-&kp?{i&#fe(pBeRQtU>+0mtZXuQz)Dc8QzZoQwYr)?j}v)6H5@=ui9?oQhrf3d8Nn*Zby`rg<@KYu9cn536Jz(i`?p zTiKciR2cm>dpTnV)`1t!-W=+7twNDuf-1uYe&bXxJi6J9RM77*`)tL(Xv-sCo!w8J zJ!w%N6YBfvm@R&|?Df)?;LvpyzZvJ};rPpt5}~Y^MrmxmABsR z4chJDW0d;KH@oJkxx695O5O1B(`2JGj@IUTTZNSWKTndqjZ(eZj!K4-Mkt$jz5`G< z@vFAFph2^JYp~T-oW}p3C&#%)X_tH{K!@#ew>Bro@rItl(_@$B`)fw&NSWzrmi2w3 z)Va*`)|pXyyDZ+|Pnz$Yr5g4{a1P~V1IvY3vQgStrt1W44=Gb>^a8qbTQC_(zuGp6 zBvCgy)1?rn_R%^lXN9ST@WIU%HlsV~P>*ry?~-)0mgo-LPc``Sow^`l-zd@HRt2@q zMZoX^pIqgv$&Vit$nEeH{Z3_`$$q>`K~}mH%8+P2RaZ^lG3O-3$=2uIVK#GZ#l#=pP?;RZf1iao1yv= zeK)8P#n1qLXP74^9aMU!TDj-s08edq<%I5KE*=flmN+eXdKLG-_atd_HBVNh^fG%M zt%80#B1GI9p0mTQuwkA?CWSAbX`s zTV%Z>)le*J3k+Jg=LG9J6`DO1Mf4#J$9c!m%(lQRQj*41+r1xzIlHK|gEzd7?sTNl zJAH|kKD*No75u85q1wi(V%QdYmt#BiIPUmoXLquV`s^Bny-D^iM;v8J(lYEj^69Ew zJ#tHDaDtJyxDI&3fuFeaR$VNNl<=Y| z-tdP;LtPF@(#Wb#a^nBw9-1v9w7oq(1Pv=Idh{Ou_u73Wgf77KLTNxzcgG8rR_{08 zrCp1*h9m{jDMdaG|11=IFhkTHIByh6;0ttXk&C&A`vLxR!3SRSe389aRw<`3Ls6XV zE|ad+pxs`mye94Ta>>X95@Pef44oi;9fn_)m81=H>uztWiIuHW*oEEp!%F4)4U7-R zEKAGnxSPeS9z5wM6a=^Q3M5IV9+_CanE_`>YnRr1-gMz>&zr$kV&(sx*8FnMRq)f~ z0K~ChyQJpQ>MXfAsUeG0n3-INc>*_#t1wM!i0+EP^{x&$8z(q|U1WPu^U%hT?;+w1 z4tR@w^wv~^Hq)$IZvjOySCLsVSIm(L9t$%n6f0e)nR{mU9$S%W$jeMMtjpkVe6l31 zEnkB*MyRXLO9cGsa_b=1GbOlvB3_KMHpNmI1c9U^=%Lk{;cm}-H zy-%IIwA?br=a1Gq?D5lEC3W8IigR^s3HoT6M7gMq9<0DPMvL;dp!2yO?R;wh+F`TWM|IkGdWb4<;J)4&i#zeW)>fl?63OhiU3NOMGUO zIq&kz*)=5avP((bsZ@h&78nu?(zx3C`{B^xSo-HX{rZI9Y8X$?Fs9=xC7#$j8YItJ zKNJ!fQ~CW5%n=1DZc8;xlwFs%I}>Q;zB4%Qc6fJ`&Dxq5?~|Q;mMfk2u8U2l+SiQQ zc>enwy7k?d+)Fsq<<{lOGDx~wo(YJLMsKbskZ3+e4fy8FEu)z~=T&oA(Am~^N)10{ zKyI%47>mYq%rv7V=8)Sjhxmv(2S^xLYtb$ES9{+cdUIe&tTBfUxl1K*2wv#1$|qY}|(aQ&B@cR}zmNKHuOi|La0`r&Bj!}n4>w&DJhsJF}y_X1X| z7C!oLy??knXqZu#1GNE%t1a}US*Xn}rPn=)6#Rs3w(pNR2whf_@G+N&Pic+;ckYAV zcZ-RxBH`JW91r4)9pF2o`fFo@AOtPDWK(Gc%EI64<{PBBRsXra(I{l>(!1R+&C%{O z;MUuU_XAK-z4g9h?ty7&VRMn>94*k^$p)zkcbyE<+sd7*?e^RGJphArugdXIyy1Nx z+%Gyv&^#99n+|B9FL*lJAG0r1abDKRvxNY=mib@H^N*_Ykz}Tc1!r?X7`>kbius&m z^&hU{?lis1Lf`t*mqFSuBlxc=0(t&9bv{o{25FPbenOQ&s;?Bz)WL{VxPC6`)9STE z`!Tm3hgx2hRzF7=fL{dzzR;OgzndRN;Mp3_7u07nJbT(J?;lsD)#t0v#!4<@7g~ET z)uGN_nsOeR%pIG>PXWS6+ z{r$9hW2=#IRYFkzOML6>dnv8HsntjlMq(~&ip+vXUK)__LJn6`0l3oo5g%bYs4WB^ z8f}6mKL#{+Rgx%N#nB!EetR9yt}>ejDF|o|Tpo~+R`2A~OYU9g%t^#IB`SA%q}V#$5WBZP~)a6kfg zovD=$U?8rNE5Kod2=_Kfbrq!Wg&eGze$9*$A8n!l$LdcnA9hAp_Wt3);*d&OQ{ve@ zseafHH-6+OS{yJ)V=I-Nif&Eo>s`o0^o0*1;KzGEc*eH0qV4{~AZ@GQcV6en`;)Z# zEFa5O`xApyLI)l3vU;_`TG{sDCZ7k*J7T6DET$d{h)z;(DU87KJ-qGmt=?~qHw1=T zwp{5(7R253V>;W&ibEzh#N6y!o$AfpZ0toJZ1u`DNCx?qm^apSFMdZ%{^po+?J(XD z7T$id0{6ta{`8KR{e7h9a{g^D!Jlv6_?Ki1*xJP#dPLYDOnI24)w}W%NeysZ5JZrc z;VUu*UujP{uS=T{BHEAB>Nn}Q9~*Fh^p6zqgnRfFDt*|UH_S_tZC7Il=p=tbMqXA+ zyu8PiPebiz$#2>eY7V8<@9^O_ZImSySm;M3{YVzAF7XcdtCckutNYHj)*MJ9jz)<7 z<+S*Nv9{OB+L+T91}kfA&W1MTyjVu#k9b<`L$6eBCbhSxSB|>N?9iU{jbkpnA%(9N zWt9E@GoF)N4s>k1(H$BusLa%Oe@h!{+ZxXk`^>af#yi~3cot|<+R+xkM}sE={SwB<77s*kH#*<{VkQ%wAPjW{@+p(?sHdJh(gdui?ER>Tx;-yPQ#{Um!O=`t0-|g35uMec05|V{ z|H3){~8Q)R~Z2IT*7wV)jXj28G<2H?I2p-aBB8@8p^ ztZtBIP;mX_eh{-kdKFy+vxEr!j*yxb&Ssxc%0$rUy}l$7%MRZ>X$4QcP`CG=G~59C z_DesXeJyg2Mxm$m`@UR^8lpExd5DE7ra?-gwqJRWINIZ@?hZkqYN@ddzOPc%(d@5= z#h49NIBt-PHKh-#IS%L*lu%8l>?x zD1O3?{I50)PH!MM_|4P93iEkU)gW!F;j4(?w=RA#c1fJKv-S35r@pJc0pFV){LKiTOV#``E2km^24!*Gi#5SHSIfoM(&~%B z#bJ8r8=tU>>XiD>1xiRZNd2qB_3~BLmwj^H$@vy*Y`#i=VKwJ!(?<`#8RJE!f0X&x zi&nI%rY{}?YX3*b`yaVIV8p={-%kn0Cmx>+d~!betiHPj2WsVid&Bvy4Bn#Ce`rrb zH&RAN;1}T=I?E79az5H>@HEHi){%!Pr3^i|?$(QhU z9Dgfl>Y68;6HIQx!1-h%q>u~}kwP-fHBlG&ZzILU08i}&A~V>}VI(-W6Ci&AWPFss zp*34K0K~>8{?ytaS|z{_rj}6yn3N|N}e)B$e4=}14h#01C?2?sk0)4 zj4Zq&DHxlJht7D|&&RYRgR_*J$6gC3p=1O5Z#d~ewy@vBi8Co=QaI_^?QKl(#{{q^ zF2T=CacPSv$%SlC1nEW&u*ngac$jU7Afw49b}NERBo(ZGBnc3mdN5qi^Ckn?nn)5A zoY;d1kz8r(V`Ef>-_(GG<#=zZvjTPp^W8SV4N}BaT64_-u0(NFCsDgz5Yq3lZoP?{ zSQf;5?h+3+x;Gg|zGffvMg?EiokhfuUSd`adxGCdJ<~-I7soC^ZAqMEgU=CfGhhp3 zFGK;`@$T&R65`4BMFCqhdlW?i{KjG02AGv>-qsHsZ-@1En&V+39**K6c`aDzC-w@T z!aeF$K+E!Ne$1h{Lw(7CO4|`HV1xhnFY;{$M_KImKHw-4$e$(dV#XHc8Vyw!u$X8v zj1;p~(PTEcz{;aZ0BK})F_7Ccgv;GK*f#`UN98&$s)$v2_|y_Sq~U#A9lsF+9*R5A zaS?d9z`l4Eb)yzk zjd*WLwTw&d$DZ^huAW^nIuh=cjyXJD;^ASMtzW(<8+zg4ypAh^q3r!K%2$2M4Nz-@raGc^BTB5-wobb4Xx^;ub^PA#8Jhi0cG#pCuk1 zM!4h*u+|8y-1`^fXC{dd(k*(j+x|QJw z-5t~j9z35_CdR6`w(r^@eZtW80_wWIl1b7 z1u|3BjSEu@b|a3A^ZPm!$MXm=^1<7KL6!UO6;PG^w}O+e2yMlq5zs;0iXSv`Xzss{ zIFPPaTOM71VA+qb+0h~)fSVia)&MB)bf{uAr-AU5B=*8UC}D1|RskN#1)8l_UrZsR%rz=w zLQ66<6Sc>{7{|!9vj_N|YUe7Vs2gzZQrM7JpLC~CFCx5$H{Z*!nPyu{UbFxWv#rNp zv=GwMSjk`{|9k)adN4U+NrKpt5hMY5=EMlHLUf8_F-cHwJe!n+ZrAiUZr5Hce+e-U znG;8ZURa7t#t(pAc4Mn9pwlzrDL0{!09U-sVg(21e(cGiMq|K~o5QAloX;kw zfOtbV8@!EpSPU2Sf-sgrh5e&%!Ww&@OUDZfO@sVAL4G#7g!j{*$MbWGr^sOG#kp2QlYwVHa``r8$FaWE2mGFkcmT8)n%BcjZ~Sv;0R_nV!)JHWzldi z>p*oG=1|=-7Lf+-8;3A5fq0k?3KxVzHYbhr3_J$GFDV6qxYQn*%v{6e;ofD95=Kbn zu*cX*z;^%oDXeB`z9<88flYzGX13`7zF`7vCIfSgm;&EmlK~u9WdaPp0~=gh02Z}~ z37Ly3b_B3pg~%3;HA_pHVOdQ&(UXO&PX-CZYB(_i+B`jkF9*FnKOdq7)@1XF(W)Zn zb%j%=yGOE%8N^kbJ4DXyo-@ElQhz~+9is%yP?_6sGa=bJl6hwmkFMiDJ&XJEDT`5K z1tGE5a6uS3j%8$$XxGUYMO+<&AZd^-o1%W-+6 zpf_7Jns|nP4hV!gV%_`?4ly6WE7NZoXer{eFm#c9i&-8QF)N?r9hSsVZgU3)A(d17 zqi_sy7R4y$GKR#F(QNb>D0V4ZF$Rh)j*?v`6&0V7zCJPc8Lzs|LJt_{3I^I}`64uk z+8hI1nXv#jRb~e3HWn4{6*h1zaqa61zIeg@h61PAdJ?%jQ?9#3pcpzxo-VEcl1x#{ z*WTeji~!SY%UCj$gs>}P;SGA`@C=w<$of75rV9r=%^qYAd*c~+!-WCu_++0gApw2( zUwmlm4X)5ry4Xh%Abet50pbR*?8)%Rxh#Af89+|6x#K|m4%akiyGhk9%G$)wuS>j3R*nnq=tJhq>H4Ce3Botw|uTlg$V5uLtcXP*VZW$f{@ zAh?eOj0eGUgIY;@iLD$DX&(=2FD;77z}_7Q+rV9aakL_=*OazgE-aitbmRu}nLxb2 z>!1n9pJp*^`~>*QSjHxRk!9@k1e}?_&F)MfQJ(u_h|mpYB7#Lqmg*|M>F^@GYYYpY zh%7TQM$R%ZQ$dtR{9b@HN4)vg4KEgmLi#z3akuzH8B^VYgbV4{*zSp_n!v;9iBR8{ z?AM8Kgm~sX36AhNn>+~|)v#A4K{Z`ksYY}k#BNQ(J}0qb-2_DOzX;LR6ZUXVxC@E6 zE3cZ`Ryn0CYclZ^o%*uXlcA64?9<64(EruGxZ{i3p1f@_avC(i7vm^DJn%hH3LcV6 z`pQlceH@UouHLqo&ms9bJOuzkx<5uZ&5d|%8a`QlW$i^@0asjmXH^I}Uuydb$xfKs z>`8nxim>Sml*8XjMrq5=Oo6s0GEEk=6~%^RL0c2q%q(bYLp*yh2uU=5Es|&fJDWvZ zoj#9m=SUZsuCLgQ-C05``tU!T(N<;CxXQHs6!x>9Ys-GGcqMqS*~o@3-(!2TNua3h z&%ViqRU`Y$ioxd6YbtT`*sr3QJEJX{KUn5eSl__rP9?73cKuYc7$Mk%14>aGz*mFb zAzH+|J0vIN7N?(AwR<=a>i2Dz4E)*ZX~Y*<@2zR@?~8G2b(5QdOv!FdgUS{&pXpFp zJ#GzJWpiLf^%g{a@F^$QH=2(Skci=Jg(8d9>hejTRSlmN1R0uSCMxsd~ zBwJu=vxmMUdnn$b5{P8U&yy^&jvam;g6?NOJ`ZbNidACeDkjOXQe}}nM`gXJC#Iz* zsGO|8Yg110aK#7h0hf$DC>1C1rQP;cDB4SLuF%+*2Uva%x>)%Pe|UDH*mW4|IurZV z{w#JTEIWM|BacWg3wakai*22W)KNIBV>W@VRX{>oQEK-os{L zTZYciERejI(2C?0c6%0aajH*fOETjU4?rKWO9Bg-jcmFvLD}FB-5~ini}}4k&S43wdI5c!UToZ4a6Oi- zo=bFOE!#U6+tMu~R9F3T{34a#!x7;3B;L2>x1<`I1^0Qx+HGG4miQA)zs&~B1Jgkx zSluf0i?S}T#q*#cv*E089*mC6J&(A%M-3;!0c^KPlNOCXrS?kYeXHrLb{=s}UWjp( zwo;LpYf4a_qmbf2*Dxx3C?VT0UC!qHBf)Y*`)Q?Yy%-%S!@pqMC2rCoi^-!5_EXa2W!7-eT-^;b%P;LN(V}`a*OsZ?g*viOvcZ$gD*& zy35|?Z!7rQU{b}53(@g8$$S=(Y_f~Jya+;l%?>U?Sx~{UmyjqVP9$hoM_p=rd3YV> zak8D^G}c(*g!FDnYz}7P;(-z|Z!IQEv23_5K^pFo!s3^}Wuj#oAp;R=a(2rkUdvSj z%#Vfv=3t<$&v2^l9Z}8XRL2)Cg}dBImh*>2>II0L$6}X~LF4x)6Ty``@dR?KnaD9t z1%li%wfB`n)`<#qAc6BKU%)OR`h7`v?g^XRH3UQv} zufu>T{sI|4@0)`PA`VFSY@Tt1EVDFhB=D*ZND{vF0m5g<2pd7*-4fYdod6&=0iGdW zHxv3J8r4K{G)7D*nfyHG2S4BmyWRP?Y6IM76F-uj(pj?2g*lEKz5gF`K6N0z~%cC$;%NL0w%@FdyTQ_1F4 zs-E!eQX%AVxBtbEfahLtJoH)B@0fQO#*kpIyT0waBeJsfQ!CZ5dbzVWT zMb~t;U*{!Xd-vm1HtG$EsGsR`twr6$m?Jv}Cjp_YBowFOd2*swT(xhawX(VCrs4 zj_Z(>7dR{DRaQDd=4SOPteoYnc&Q@hy!*Q7$-^qk`w&f7)^hy zO0XYqIX}v=mb^5ikIz)3`@Dm(wd&YyjD@wCn0!PXZ1Y}OYkV`=Z@H)s2DSt8zrxPu z5uJt1v7UwJ5!c*HD%9F_?fA=ZAF1${5ve{Tk5(T#B-{X0o=^z36;FUo)k z&ANVB_9Q`M-{hh3bCUg$N1{SMhpuX2n#5ORUU=F{=BjT}LP<_zGkwv!BspRZ8@dMB zzKWe#1E=mXnt82-Q}<^>*K(&G{j~NDSv(p^gtIkA^j)vAH64U)xS}SdtxyTd9NSh_Xivl}39#K?#l4wI)I@p~w*1I@AcU68q0X|cH zE`cA^xR$AWS#}@APOrnd9LUPnkvtqy&U^)YeL3c-rpP6B_7%i`eLGf;v&vUU1a{J1 zuVU%jFh(gWN54wC^|~-h?cy&LPi<5MdSwU%x{iUCHvZx(h)p5O$ckSjy4+4gB9ze5$5*Y=s*kU+-Y)X3lZXX^pK-nj#Oc;R#BDSl=%4C@ zxAo)361$eghwm-Y*Rr(rBnhxsZbBHBN_7v?ybkC@5)GOkE&8lE$hC;A-444X*z#an!DP_9Xu)H*k zRa83mH8R2fYXFbqUVc^d-2yDUNf4HR2i_zYj)&y3XL#=H$)3E1!?7BGyK`+`6&G`G zzMhQdP}*^AiDs~Q3YS z`|d_mHfXbwO(cnIV=0?Z(amQ^Ho?uev7a_UB`0RGrX$!I$yLN@7P1-cR5i0L8}f4E z6^CAyxXR32)6_wvMQC7|iQt3t`Tf?Xd@7MPhm~w5d_Qn`GwF$Q_omI{3+(vMZUGNx zCoqS7q<84~32M!KQL~n+dfAxHwTA&yV+hyysiBW&8b&z5-GFaaj6!hN1jRtR-#};^ zSmPTY)G0?H)HO#XbVPHqKqZu&0YXt2FeSA6Cz%lXVtexuN%x-T-2@#O&wkB^968Kl zD_KtdU~9Gly>YyPUTl`*J+q1AF-Z|SoJO$F-7 z@E5;)$XVvM9RgisY1_$iQ9GHP-;O<8x5j%6Re2^r>0 zRb*JoI_-fF1t{-LNmQ|;yJ4qBmBiM!+mg^vRos2+9x_SPO=ER?5W3OK0sm=5Nc=Qa zlovHe-%&-GH4&mr#(*iE6h)LT!2lQKJAj*-!+x6L5Bu4ry%6I#d$<=tTEUhULk#pA zcy<%5r?ZR2Xgmc?Z;St=EC-UJ$6H7-H&kTv*)wke*=n}-Eg<_3d-N8NT~LsPTmur> znMP{P>{q$JIvLzIw8Oqh(b9MfaPEHrxGDGhrz_mYvD2NpN7;CB#GX3w!_ z-XY%n-(~NRC1|kK@X`Iuejk)r@|?;>lBVQ<%EsO-uyGLsrb?Wsun~m;&c=Cwo3fGj zoZ=6>`+`di`-rRCZ2-4aBvIFRMIx_LcM9LdX;WQ08d)-kTr3+fnD30__OoW~`zmMm zIcN4WSO#YI?m9y)gMQJJHUm820R9*-WqqZLHhnxRdY8C8^Y*j2YrP3^hgpz-?~l`S zkiLtsRTT~@?^ZbRzRY4XA$=fHJ|A(CN0fIK$c_A6P^))mnazGQ$+sY(@}Y_C5RGMn z0N_%OP~H!KO$vb7)*bvRLlc{~pE!r&?>xzar6z;-)VCL#-xlyG``J<8LpAUn{_%=~ zcW}B~Amw-t%&R-4YmB^y9HAS}Jl-ST(KjIfb*|Y)&D=w1tVQxtJxhQFL_BQ5D`mqa znDGr)ST-Nkj%V}V!^NS#?7jEkJqhgF_pmEp%I?2MdU|Yv!uicWMVY*30F1+VYTL#_ z4!|StuxAdSp?`-h=fBmlcMkwn2D^Cx(L9wsIzU{9FMqzR(dw?tb*OxiZxm`wR4#&i zeJ6P;V7Uu6yB{y4ls#cFoA^F)oro548xPo_BIBj1>|S33`>2Z?J;VmmJGc8DMxa5947J}^)r^EyP_ z26sa{LF)px63hxdRN0!u*^0-2DO*hlBi;;xEyyS{v@5ZH&x&U+9wNH&BLOXUW=5O+ zuNln}j%Ip0H2F`NL!*paB$>}{Z&7~v)OQYhaESQk2F^jP!`Yl|Hm^iwb2G=EfB{oB zJzMO>8*zwkA!|HG=ni_PfY<>*%`=)GlUQ#uI=?M*z3 z9X$+P>R-U00N_j}n*|+JnLNd@OvQjHlR>HyOmsPi*?d5BIC2U3fVjr)Z#OBUwdPu? zc$1x3CZaxl9m@rR{)d5}x#_nI(x>-F;Cz%ygd1Q^NfbhQ9^UcWwl(TIIUBOe9}u_h z%Mc1~7|O`QgM1@54IacFdL4V3IEId%kFn0@S*BgiHf*~24fN?&2&AEHbUG0jw01#H5HB+$L1O-lh6cLyu_5bN&h z+3e_M;?6F8h|bqz7FL4gR`&wm9pQ4~R%{rTlo0z6e<)=>;*i|a{CQlp(FPohCJ$++ z?hWi{332jpRpagvz?)N!vPChlJ0+xlzfy2)5B-urv-uyZD2qADbL~XAsfG~GSh!0A zuW`yu?>mkNzr!p=m<$5)9jA;rNUHp0`cgdb!}rtbsB$NRAHF-mbTt6^Ng2WYEnj5t zbbnTQ6xlY4{d$ym={KnM?fIXlHWwffx7EO>?=teit8BK5c;JH*S`Fs>ci=H%YlXrn zUI9hYNvlWGC&X;dW!hOCe9_o5I}PU;rd^5XPWnd(9;k41tWZcXx`yQ;RRCt zHV845?L9>XTJt~mG`yjd|9<}z>7UF0293NFOauU3u!F*(&ddk~*}7z3t$oT$tu3FsE&v*OdFA5QykoQCRlY-qVQ(wVKS zz>)uS7IB6IhP=H&?c1Cnx4%$%iy_gwbq3~|Zm*-p?6U{zfyBQaRV)pM4t`BG)!dCo#oyICdjtgMl2 z`dQp2*v8&I3-8#&zC8;OFXYPYI7GSbGvbyx6_dH~7kt&$_}egIQccL~4Zr!vW4#nw z<>zPbsq>@o--VTaH6(hP+}~3kbP0lQIX)CbBc1;nt40klB8Y$|aBm ze-5S+7q-&-ZxUKNX$w__Z?@Eaqap}=0SK01psm8WJG*heYNPPYmf&KQ78m`~qapFK9zH^wI+L_-Bh{w{t4llDQyThXGTvK{xna=5AaWdl>l=C15ej zG!ie?_e)SX$QFGG3g;Fo&CiSAI*_NPb(S&Ts(7>J0dIXfaW3%?A|pF(&41B?Im{+* zp55jvHp;|I)5KT2keB)%EaNL;j*aWsuTYHSv87+(@@SVW>_1;2%DZi0x4uF{AZZJ4 zclKiT|HH-Gj4i0TJiyK*%m1EN*%>z<>@3HCshG;`(MbN+6}fhm0uatTiR;#4k;2(! zATi~v^A_2^#gYE(^4AEk8O-Jz+{{>r33Z%sw&mO3fiQ2CG=i|)D(SKS9275-H5R=e zkk(vd*_LNHB=7A706<8OR*BxgYg3{#7O}S)u*%%{hQx-H08Hlz1h*|WTu>2|atfC) z&`!p4Xn>;lKgX}#tYz#RG#0&9)|glNg*A$ly6@W(Y+57VLy=)cDNYBL#U*PCVCbM78gPU1}-+`GO zi)Gb&>{+aw`H*zWEs#W3{g2=SUnF7+zC$ccUM%a`Vz>@+A7n?qgWF}Wi{C-KL}q&d z2uHK13&5E7YAf+xeU%93ydYjbOS{V|+V4>2B$r^Iok6&G{7;sdh}VyccM|OJl+^=B zOvOuhRdu=>tjG7HpXj-SP5&NeBSCEA_uyvi5+(JaclSNQwTeB&KOBfVjm7Z7(}Ix0 z`d%b`NF1Ac5i#VxksY~6bm*gGR*)#scOx_ZfdqtPZB%nppykmYRY9bs5M(0;Iuay` z|81@|xhar~vSEoL%6C9xDvImIr+1w8vmbsy-^F4n>vahc-DN4mpFYru@knSkk92Rb)SS ztu4Rjo6WeE9lV0v@g=)^1ynCFn;&7t$BNh};igAeud6_Lf{nQfl=og~vkvgHkgKSjoc_%-{o9IU z&&?SQmbhmo{nA#XgRdwT{Km4RpPW^8IF`-3hHE_HGWPm4eC?}_9lQon@qMpr zpmm+u{|r&hHnoaK>rJ=~;e&{DH?RCvrTE!OIC2yQI&x%J{)gpEOzCb8{+yPvAAUw> zoDA6Ht0G?=dl^rLHfut#b1xJQ`gazw3#F%3nP9GoH*fcNmJxfn+3G^b3egX1jg?k&Uh7LyzsjFRx*H%j=OtOD=!Gw-&S+!48obIW zb5t(3orn?c6FczQG{hrcQWH;E4?$SX_WX)0dV!t(6*66CkA4M_yUhP4i1gar%4SiU z(KW&zni$QV+)*hd=fP%^G0>6C*nfY9l=#!)xU8V^;`V!6UamGvd4##$f|PY^)GaX3 z#FpOz13i~3mJ4T>Zy|A>WtI3xtZU{!8u1m!f^K8NC6<00Uue6{4&TNNRDbr>ZQ|qM ziX8}7L9_UBFJL(DDxh%sjRbewh^m9{P$&N>^Tqo}8HIQ!Z+iEzq~D15sEhbr-rT)! zb_QUwhPSST+_&46EGfToTFN(Plh0$gW8wyO62yZI0FXD#x;GSx!1*dx{QqoGnBge} z8<KL%Yj2EJU(bu=f1}VO zj6M)yp54n8R&V^();udWE5++CzoWFg!JPg8#in&i(yECSE!nBN#6DDf1r<*KT;r&C z>z=BjC9gu9o)|E7jk+7kmjy2kAeR1C4P zj9aS^N*?)&%y=|sycjQK#!rg>EpKLA{?f<3rz4kJM$#eD$A97aKq>p}FHk6E7WYsr z?qgB^Utd=OU(>bq&)w&Sn}m=^WN;HnL?n^OU?!3v2th7FwWg>bQByUPHY8Q`%tf(K zL(D^|p}47f6{?Y-?~p{gjVB} zAu%^slQ@+I-o&cHBUkg_j^8Vr(=JyIU$o;U_8#+T?@d@WgGz70DO)M}mYmmk*<{*H z({Dk3DQ&+6clgb&Y@+54@IJp~^0w~O6?VH@S>fhc+8lb7y8VVZG=ygVh8;!BWb7yq zdZxck!KH{<-cg*wT?M(LxPgn*fs?Qxa41j^YUj@MdCN=W8f71}QDG z6f#*`I;{c)Pq`oJ6fJnljYpOmK{1k3)jtdlM?NknpBsU(sT= z=B>w6{|>y>iiX@lBXp!$cVI@&6s?ipp`Y)7)@2Gky@MM;t+1*8-&_8C_>X;%{fFkI zW<17P0+rOq)b%dTJYS})yI4D?(5kzra4B893x!X~TndF@Gac$JH~5XvEyB3MYfL}g z*DE|@J}QiZAe9Cyy}zVX?k{V&x=OwlppPJ=V%y!Gp?M&b9+koaS=9W$Ferxx{ui;i zmh%6LHP>cv%a~Yiy8WkaMehY16D{aJ|AlL^@?`+{-9a{lE8qHorlzsJ<_gWHvFA-* zP8SeN`>5qT%;7EQ)q8M2IxW2ieHnD{9`wzTYvss=SR-4|&ZgO><$vk=x-CSl5B!hC zvv-TiwMIPPNg$g12duMc`#I6`I_>!b({>o$!2?Z5IeOiP(_ep2Yvn8&c^{+hL)}yV zd|262VN`G*naT2GF$J4a#dM+SxktLm-+cs=GhP^Mru`^W zB6VTl3VqLf7c3Q<#j1@z;?15^`lrdu`#Dy#|L7*Egq&-;<;CEg2xNU=itt`I8fW6V z^K{+=NX_R;#u6Iv0E7HydiMd=x!Y*@15~<*4m~i%;Hc$2Fk+JQ|I3sUl7zHPA^Y3e zBA&u{9v$9Wj0--Ru?!cfufLE3$^wrcSJ>H-&OAI$Y-7@?FXVvYFVL>vO#!%poOTbE z@;YNQSSnVy1*e7H!4P@kA>6uqY^9zMRfzOXAnS9ntazsD8@dGgih-y&ZBLZ?f@`oZ zI2kh@Y-zz`DE|>w-!sO_WRS?XO!h~n!1#M$4`I30EPbBqawoIg+Aq{&(FJ40B(u24 z4A**$!=EgH>of-JMxEp_W-BBZcQhuj4QEGbS@OjiC6a_T9AeU4vO{N2L@RR6Sh0-& zX46P8R{y;N&d&2~uq3R$a615pcYkDK`DUo=Vpyy6;D?O+(&5LZ@ERE);s=tI9{9mL zC4(M6M*EK--zOM;CQ{QUrX(DMp6~?izme8FL0?=-hn}GKZKGeFV5Tb~>r;F!qTWw& zeyau9pCWGh)1{{%nZD#1pUYUFA5yGqIbcGM=eA$73_jZrM8&qyMkT*R-)c)a$HR$r zEpW+wTKx=Nw8;W();{-4o{Vh#95L`=4+=lYWxkAw`kPgNNQDENQ?jGq}D=y`lWGXtA%<+BP?&3 zb%ldIhQcf$Dpzzco_uNgvWiAWV7dP77g0IFcl5+|tQW5g%>b2aFMqIS7xm+OWwDH@XIDq}LImM<&0Rc79JzmyNhyc~$3V-rs=Chu zSHb7EfOv_|1E_m@Ve#XaPIGT}jIe?1j|BQq6}}>Kk$k2lFJr<-+98s73l=5WV--`9 zWq}KJ_)w8H6*xYZP!~8fl8WOFJf@EK<1w{~k~&YvOWX<#7og#kPVAILASh(xU$^8# zhV)7|mb@GY_DbMrL-aJXNIO)?@YMnoC>aGb#4HjcH-o%3{AC(z`J3f%5BrIo@Ffrx zoq*fwX5k(Az~IQWv~$)u{$h@5FSxBQxjTtkbyx@As_PGOS)r#BII9)IX8;nNL|lWK z;FQyTrsaSkvc_tNv;t9fP$qZ(@Ff8-hXWvqk}L>-zN8H?6D(o?&LW((;6b>aOL&OU-m?+acZq%ue6D3n zbzS9oRyhNRiYoIz}S7h&)}yU<|Gk zTu{rCw9*BNA1;x1A0wYabR%x(&6eC6x=x>U(1~MrP&N|fuA7yM>O{_pFGZ4khQEGW&aO`D{Q?$OOXcICI_)-nu(+d*Wx8DLU zS6A1VaP2b9ud)hZ?xLDCMYnAv7%F;X$}(;Jl2$^a+=Z_f+siL9v+I;il{D)z`WPsj zD%k5T;;_}Y;Vx2;EsOO)9R5Hbc_0p-(|!*)FKneY$3F59-slwWwS-Ttfh#LlRGY-< zZZqLhbMr~rh`6_fAF$@b8}HUa)SX|Ub*^2t(77_Gh9_EUD#d!DCr@9YcPlUFVjtb1 zy|$p%`+%tEP#Z1q6yfM2UwCqdU7=0T_dFqU9@)HL_D*`+3ugbYQqIrFpq=!B#W=88 zNs`uCq{R)(E%s)M6{zJE!C1e_uAQ|~PQ)T`6}?#-qgNa)s4aY=vR;sGxyY>L4;>V1 zfz5LPV~@8n<#1fP?V3k;vKC>T~H(s5Xi?a z)khc@_@of#Y8wn4=q*A5CPHX49z|B11WWsD#T4Sqv+d-qa5K7xHyU>*6?%(>!=8h* zCX=>uUSmZ!>46nuPouC`KR{1E0h4*PNg1L|;`(-jmy&KMm9tW7=SyYGMxkV`u?@_g zt7)f?@Z`j%4~Cym`qKx)PaFmMir_&zAp;p4#njt*wm%Fgdj&}u!gvKqw+wWY!v=XD z=lvDP%McaFOK6R+@bNAImt31vK;EHKjJ#7B*@+e1r@wKR3p1A0PxwYY0F4bbHVtx~ z5};eznbTs7$YO*cIU|w=`-zN@r3Gj-MhtU~tE>0&f!p<7J^>f02MWrbq>DNNYPnq; z<~)n3d48YCM3;f6*eM=f_Kwn#xk~+5@YI@p}q&9H@5!%L7&JU2JsPilO!j-L;Cqpa+PWuMiI1f+U%f zI!*QfykaOH7kG@GV*EuNFB_b53S^TtGCu!^W2_ne!p~K`BiJ$uG z={%hd5J5F=8E6?ucL;ard^+7hp$tFmT{f+EAQY8O!_jc1z#QWSeA9VSJv7NQTz3aL zWg;$Y=C!&mDJ+XJSXdSc9fW0;3mXB<4Hh=Rx!4f)cA2m#6@*QtgAkTCwW6@O<-(=` zV~K;Xx1F1Z=#~|f30rCi8^>Y%*pTwJb9vV)E7U5zPl{H06v9BuI=pO!yCd}p6cNF0 z0C^1I^&l4SJjnfF>IDzKRu43DoolY6wSl5Y1gxXXAPm)wXdaHO;cG__M*J3Z8c^MB z5aPlz*E@%Y!d?Y-&A_obEq#85@UsTK$frgG3#;>Mp!G~MA(QbYmyVK*+}hm6c!t1Heh&8=9wEl?!=B>LVH3)V`14qH$y}n&pt4UNt%WmWNFXIr#{wa zvnZiHtU5u1>WiMp4DPNEwrU&c*ZLwDZ>Mny6@l%aLO~n&VrYb>TE6wi=!_m4QAr>t zl_3>d7|P`SEqfO?WCNEl8Wk#rxLn1|)olUHOQ9b^(SkkcDdZzr;NJiv_YCURKr}=y ze^LWcH*Ys&$V^Eimzt5fA3xa#Kb{Ao;+U0%ra|n81?e(V!dkHKtFTvXIX;LEtscEUHY;>sS5QQXwtC2$i3hKn~a<;@94 zGey#laN*N6`33Vzbn~Q!NT7MR^l7BEA_`Nx=w%#GOq4ws`)$)$mvpKXA=bL^j}vrC zKrp{U2O~rR)>zLYL>Pwo1`S1!^%9t6XP)7b8;x0uJD$>wkG2PIrp$&~e{Bf+8quzX zn3ChEq#?Ft`{+qSH2P7pMq;^hXG>+D-q(yquK!)xoNR>NoHRHRd_rYnn z5JSI`ai6wEiolNMt$GrBi%V*(9yq^#j><*?Q893u{KT%n%IYPmaO=)rm~q!6O89uh zfz{B(`8~V<=G7?ZN;Y)ua(Qg%`kQr)d_mWY|3}wB=)(AMF$&chS6NjKSsFprG((l$ zWlNl1E${tMwe1B}$NnExqZ>ihG`v$8s&+f5Vh`fkQ#({8pGCv+R=s9p87W8)q9u@* z0L5dVRz;y_YA6nxwBXHJV6|{4>q>Q^F~CMr(`XDb$wpT9 zD7+zL^SgLM$Uf9`09j&0Eb@)5Vi1!>G$01k;F%YkXSuA!giI#M2XdIE8r)+#?s64U zz>(6ES#3wW;R(MCbIpXI_e5xnP^vFf7Malk`KPpn};`s@!ixs1ALd-o5 zLobpEapjIRGXO0O#^ywj8Yigwr6I;o%F|_WZ#Kxiy@-zJ!V_Y~%`03vW zQweQqEJE;g0*dfR3F{MhnVx$SQ7i8lgz-JG0WD~Pa$wPz0 zps>IkR$aZNZqn1r6zptP9i&mnAnvYnwKuqGvZKok&V%Y3;Q$1-Pm+}hKATf(6;j>6(5X@z2D0!9?ca$LPaf+hKSgqrRNXRUoG*PhO>|p%wtcu z>&ygQL1$L*-~|OfS^$)#>~&2QmONPRbhTMj~!dHF?mF%0iP2~HEQA@w*p4J(@;=(jYCBDbiz z4Li8o6lD`5MC~tWnN5WGCw+-DC{lK{<(yg@dq-Z?`<}tS;4kTt4Oz|@og`pl8LiC; zKB&#Nm1_Q3KsgIe{#S~8yo^bqNRJ3)wwDgC8jn^@4F#gB&)J_+nqM5jTVcpOx_ zQK?lr72~n}1g)exuM7F7j(%IB$6FYkq4tq`PmyK85b^VCSS8)2D*f

s8U<}IU8 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