From a3773026238c7c779cad79aa9d9c468e680e7004 Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Wed, 1 Feb 2023 14:19:45 +1100 Subject: [PATCH 1/9] extmod/modnetwork: Add network.hostname() and network.country(). This provides a standard interface to setting the global networking config for all interfaces and interface types. For ports that already use either a static hostname (mimxrt, rp2) they will now use the configured value. The default is configured by the port (or optionally the board). For interfaces that previously supported .config(hostname), this is still supported but now implemented using the global network.hostname. Similarly, pyb.country and rp2.country are now deprecated, but the methods still exist (and forward to network.hostname). Because ESP32/ESP8266 do not use extmod/modnetwork.c they are not affected by this commit. Signed-off-by: Jim Mussared --- extmod/extmod.cmake | 3 ++ extmod/modnetwork.c | 42 +++++++++++++++++++ extmod/modnetwork.h | 8 ++++ extmod/network_cyw43.c | 10 ++++- .../boards/MIMXRT1020_EVK/mpconfigboard.h | 2 + .../boards/MIMXRT1050_EVK/mpconfigboard.h | 2 + .../boards/MIMXRT1060_EVK/mpconfigboard.h | 2 + .../boards/MIMXRT1064_EVK/mpconfigboard.h | 2 + .../boards/MIMXRT1170_EVK/mpconfigboard.h | 3 ++ .../boards/SEEED_ARCH_MIX/mpconfigboard.h | 2 + ports/mimxrt/boards/TEENSY41/mpconfigboard.h | 2 + ports/mimxrt/eth.c | 2 +- ports/mimxrt/mpconfigport.h | 4 ++ ports/rp2/CMakeLists.txt | 12 ------ ports/rp2/boards/PICO_W/mpconfigboard.h | 1 + .../boards/W5100S_EVB_PICO/mpconfigboard.h | 23 +++++----- .../rp2/boards/W5500_EVB_PICO/mpconfigboard.h | 23 +++++----- ports/rp2/cyw43_configport.h | 3 ++ ports/rp2/modrp2.c | 25 +++-------- ports/rp2/mpconfigport.h | 7 ++-- ports/rp2/mpnetworkport.c | 2 - .../ARDUINO_PORTENTA_H7/mpconfigboard.h | 2 + ports/stm32/boards/PYBD_SF2/mpconfigboard.h | 2 + ports/stm32/eth.c | 2 +- ports/stm32/modpyb.c | 27 ++++-------- ports/stm32/mpconfigport.h | 4 ++ 26 files changed, 138 insertions(+), 79 deletions(-) diff --git a/extmod/extmod.cmake b/extmod/extmod.cmake index ed7d16d1b5ca9..2a19a0e85c381 100644 --- a/extmod/extmod.cmake +++ b/extmod/extmod.cmake @@ -37,6 +37,9 @@ set(MICROPY_SOURCE_EXTMOD ${MICROPY_EXTMOD_DIR}/moduwebsocket.c ${MICROPY_EXTMOD_DIR}/moduzlib.c ${MICROPY_EXTMOD_DIR}/modwebrepl.c + ${MICROPY_EXTMOD_DIR}/network_cyw43.c + ${MICROPY_EXTMOD_DIR}/network_ninaw10.c + ${MICROPY_EXTMOD_DIR}/network_wiznet5k.c ${MICROPY_EXTMOD_DIR}/uos_dupterm.c ${MICROPY_EXTMOD_DIR}/utime_mphal.c ${MICROPY_EXTMOD_DIR}/vfs.c diff --git a/extmod/modnetwork.c b/extmod/modnetwork.c index d5c8f83ea4718..0431e5f418e8b 100644 --- a/extmod/modnetwork.c +++ b/extmod/modnetwork.c @@ -54,6 +54,14 @@ /// /// This module provides network drivers and routing configuration. +char mod_network_country_code[2] = "XX"; + +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#error "MICROPY_PY_NETWORK_HOSTNAME_DEFAULT must be set in mpconfigport.h or mpconfigboard.h" +#endif + +char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN] = MICROPY_PY_NETWORK_HOSTNAME_DEFAULT; + void mod_network_init(void) { mp_obj_list_init(&MP_STATE_PORT(mod_network_nic_list), 0); } @@ -89,9 +97,43 @@ STATIC mp_obj_t network_route(void) { } STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_route_obj, network_route); +STATIC mp_obj_t network_country(size_t n_args, const mp_obj_t *args) { + if (n_args == 0) { + return mp_obj_new_str(mod_network_country_code, 2); + } else { + size_t len; + const char *str = mp_obj_str_get_data(args[0], &len); + if (len != 2) { + mp_raise_ValueError(NULL); + } + mod_network_country_code[0] = str[0]; + mod_network_country_code[1] = str[1]; + return mp_const_none; + } +} +// TODO: Non-static to allow backwards-compatible pyb.country. +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj, 0, 1, network_country); + +STATIC mp_obj_t network_hostname(size_t n_args, const mp_obj_t *args) { + if (n_args == 0) { + return mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname)); + } else { + size_t len; + const char *str = mp_obj_str_get_data(args[0], &len); + if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + mp_raise_ValueError(NULL); + } + strcpy(mod_network_hostname, str); + return mp_const_none; + } +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_hostname_obj, 0, 1, network_hostname); + STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) }, { MP_ROM_QSTR(MP_QSTR_route), MP_ROM_PTR(&network_route_obj) }, + { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&mod_network_country_obj) }, + { MP_ROM_QSTR(MP_QSTR_hostname), MP_ROM_PTR(&mod_network_hostname_obj) }, // Defined per port in mpconfigport.h MICROPY_PORT_NETWORK_INTERFACES diff --git a/extmod/modnetwork.h b/extmod/modnetwork.h index a28ec6e420cb6..0ef612d108964 100644 --- a/extmod/modnetwork.h +++ b/extmod/modnetwork.h @@ -52,6 +52,14 @@ #define MOD_NETWORK_SS_CONNECTED (2) #define MOD_NETWORK_SS_CLOSED (3) +extern char mod_network_country_code[2]; + +#ifndef MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN +#define MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN (16) +#endif + +extern char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN]; + #if MICROPY_PY_LWIP struct netif; void mod_network_lwip_init(void); diff --git a/extmod/network_cyw43.c b/extmod/network_cyw43.c index 90d964a67b123..95901eaddfb01 100644 --- a/extmod/network_cyw43.c +++ b/extmod/network_cyw43.c @@ -38,6 +38,7 @@ #if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER #include "lib/cyw43-driver/src/cyw43.h" +#include "lib/cyw43-driver/src/cyw43_country.h" #else #include "drivers/cyw43/cyw43.h" #endif @@ -119,14 +120,21 @@ STATIC mp_obj_t network_cyw43_deinit(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_cyw43_deinit_obj, network_cyw43_deinit); +#if !MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER +// TODO: The old driver expects this to be available at link time. +char pyb_country_code[2]; +#endif + STATIC mp_obj_t network_cyw43_active(size_t n_args, const mp_obj_t *args) { network_cyw43_obj_t *self = MP_OBJ_TO_PTR(args[0]); if (n_args == 1) { return mp_obj_new_bool(cyw43_tcpip_link_status(self->cyw, self->itf)); } else { #if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER - cyw43_wifi_set_up(self->cyw, self->itf, mp_obj_is_true(args[1]), MICROPY_CYW43_COUNTRY); + uint32_t country = CYW43_COUNTRY(mod_network_country_code[0], mod_network_country_code[1], 0); + cyw43_wifi_set_up(self->cyw, self->itf, mp_obj_is_true(args[1]), country); #else + memcpy(pyb_country_code, mod_network_country_code, sizeof(pyb_country_code)); cyw43_wifi_set_up(self->cyw, self->itf, mp_obj_is_true(args[1])); #endif return mp_const_none; diff --git a/ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h index 9a9befa126cd8..390e91814d16a 100644 --- a/ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1020 EVK" #define MICROPY_HW_MCU_NAME "MIMXRT1021DAG5A" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1020evk" + // i.MX RT1020 EVK has 1 board LED // Todo: think about replacing the define with searching in the generated pins? #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_05) diff --git a/ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h index 9cc740b1a631c..134c9637ea57e 100644 --- a/ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1050 EVKB-A1" #define MICROPY_HW_MCU_NAME "MIMXRT1052DVL6B" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1050evk" + // MIMXRT1050_EVKB has 1 user LED #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin)) diff --git a/ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h index 7eecb1f6b4db9..01ae3ba303c68 100644 --- a/ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1060 EVK" #define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1060evk" + // MIMXRT1060_EVK has 1 user LED #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin)) diff --git a/ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h index 367b4a780bde9..b6752c3e1ba3e 100644 --- a/ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1064 EVK" #define MICROPY_HW_MCU_NAME "MIMXRT1064DVL6A" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1064evk" + // MIMXRT1064_EVK has 1 user LED #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin)) diff --git a/ports/mimxrt/boards/MIMXRT1170_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1170_EVK/mpconfigboard.h index 0ec7ed7778432..d37050eb56041 100644 --- a/ports/mimxrt/boards/MIMXRT1170_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1170_EVK/mpconfigboard.h @@ -1,5 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1170 EVK" #define MICROPY_HW_MCU_NAME "MIMXRT1176DVMAA" + +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1070evk" + #define MICROPY_EVENT_POLL_HOOK \ do { \ extern void mp_handle_pending(bool); \ diff --git a/ports/mimxrt/boards/SEEED_ARCH_MIX/mpconfigboard.h b/ports/mimxrt/boards/SEEED_ARCH_MIX/mpconfigboard.h index 37ff6a94c2bf2..c98cdcb0a7492 100644 --- a/ports/mimxrt/boards/SEEED_ARCH_MIX/mpconfigboard.h +++ b/ports/mimxrt/boards/SEEED_ARCH_MIX/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "Seeed ARCH MIX" #define MICROPY_HW_MCU_NAME "MIMXRT1052DVL5B" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-arch-mix" + // MIMXRT1050_EVKB has 1 user LED #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09) #define MICROPY_HW_LED2_PIN (pin_GPIO_AD_B0_10) diff --git a/ports/mimxrt/boards/TEENSY41/mpconfigboard.h b/ports/mimxrt/boards/TEENSY41/mpconfigboard.h index 7fe97fd9ccf61..56740f48ea3d0 100644 --- a/ports/mimxrt/boards/TEENSY41/mpconfigboard.h +++ b/ports/mimxrt/boards/TEENSY41/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "Teensy 4.1" #define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-teensy41" + // Teensy 4.1 has 1 board LED #define MICROPY_HW_LED1_PIN (pin_GPIO_B0_03) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin)) diff --git a/ports/mimxrt/eth.c b/ports/mimxrt/eth.c index ad015941a220b..f1814286e621a 100644 --- a/ports/mimxrt/eth.c +++ b/ports/mimxrt/eth.c @@ -559,7 +559,7 @@ STATIC void eth_lwip_init(eth_t *self) { n->name[0] = 'e'; n->name[1] = (self == ð_instance0 ? '0' : '1'); netif_add(n, &ipconfig[0], &ipconfig[1], &ipconfig[2], self, eth_netif_init, ethernet_input); - netif_set_hostname(n, "MPY"); + netif_set_hostname(n, mod_network_hostname); netif_set_default(n); netif_set_up(n); diff --git a/ports/mimxrt/mpconfigport.h b/ports/mimxrt/mpconfigport.h index 2e955fd06aae4..772f080a9264c 100644 --- a/ports/mimxrt/mpconfigport.h +++ b/ports/mimxrt/mpconfigport.h @@ -118,6 +118,10 @@ uint32_t trng_random_u32(void); #define MICROPY_PY_LWIP_REENTER MICROPY_PY_PENDSV_REENTER #define MICROPY_PY_LWIP_EXIT MICROPY_PY_PENDSV_EXIT +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-mimxrt" +#endif + #endif // For regular code that wants to prevent "background tasks" from running. diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt index 357125e734c3a..8e8db47355813 100644 --- a/ports/rp2/CMakeLists.txt +++ b/ports/rp2/CMakeLists.txt @@ -263,10 +263,6 @@ if (MICROPY_PY_NETWORK_CYW43) machine_pin_cyw43.c ) - list(APPEND MICROPY_SOURCE_EXTMOD - ${MICROPY_DIR}/extmod/network_cyw43.c - ) - target_link_libraries(${MICROPY_TARGET} cyw43_driver_picow cmsis_core @@ -289,10 +285,6 @@ if (MICROPY_PY_NETWORK_NINAW10) ${MICROPY_DIR}/drivers/ninaw10/nina_wifi_bsp.c ${MICROPY_DIR}/drivers/ninaw10/machine_pin_nina.c ) - - list(APPEND MICROPY_SOURCE_EXTMOD - ${MICROPY_DIR}/extmod/network_ninaw10.c - ) endif() if (MICROPY_PY_NETWORK_WIZNET5K) @@ -331,10 +323,6 @@ if (MICROPY_PY_NETWORK_WIZNET5K) ${MICROPY_DIR}/lib/wiznet5k/Internet/DNS/dns.c ${MICROPY_DIR}/lib/wiznet5k/Internet/DHCP/dhcp.c ) - - list(APPEND MICROPY_SOURCE_EXTMOD - ${MICROPY_DIR}/extmod/network_wiznet5k.c - ) endif() # Add qstr sources for extmod and usermod, in case they are modified by components above. diff --git a/ports/rp2/boards/PICO_W/mpconfigboard.h b/ports/rp2/boards/PICO_W/mpconfigboard.h index 227e7e3ff4c06..ef812b6301356 100644 --- a/ports/rp2/boards/PICO_W/mpconfigboard.h +++ b/ports/rp2/boards/PICO_W/mpconfigboard.h @@ -6,6 +6,7 @@ // Enable networking. #define MICROPY_PY_NETWORK 1 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "PicoW" // CYW43 driver configuration. #define CYW43_USE_SPI (1) diff --git a/ports/rp2/boards/W5100S_EVB_PICO/mpconfigboard.h b/ports/rp2/boards/W5100S_EVB_PICO/mpconfigboard.h index ca2f7d0cea94d..323cee7a69f5f 100644 --- a/ports/rp2/boards/W5100S_EVB_PICO/mpconfigboard.h +++ b/ports/rp2/boards/W5100S_EVB_PICO/mpconfigboard.h @@ -1,19 +1,20 @@ // Board config for Wiznet W5100S-EVB-Pico. // Board and hardware specific configuration -#define MICROPY_HW_BOARD_NAME "W5100S-EVB-Pico" -#define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024) +#define MICROPY_HW_BOARD_NAME "W5100S-EVB-Pico" +#define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024) // Enable networking. -#define MICROPY_PY_NETWORK (1) +#define MICROPY_PY_NETWORK (1) +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "W5100S-EVB" // Wiznet HW config. -#define MICROPY_HW_WIZNET_SPI_ID (0) -#define MICROPY_HW_WIZNET_SPI_BAUDRATE (20 * 1000 * 1000) -#define MICROPY_HW_WIZNET_SPI_SCK (18) -#define MICROPY_HW_WIZNET_SPI_MOSI (19) -#define MICROPY_HW_WIZNET_SPI_MISO (16) -#define MICROPY_HW_WIZNET_PIN_CS (17) -#define MICROPY_HW_WIZNET_PIN_RST (20) +#define MICROPY_HW_WIZNET_SPI_ID (0) +#define MICROPY_HW_WIZNET_SPI_BAUDRATE (20 * 1000 * 1000) +#define MICROPY_HW_WIZNET_SPI_SCK (18) +#define MICROPY_HW_WIZNET_SPI_MOSI (19) +#define MICROPY_HW_WIZNET_SPI_MISO (16) +#define MICROPY_HW_WIZNET_PIN_CS (17) +#define MICROPY_HW_WIZNET_PIN_RST (20) // Connecting the INTN pin enables RECV interrupt handling of incoming data. -#define MICROPY_HW_WIZNET_PIN_INTN (21) +#define MICROPY_HW_WIZNET_PIN_INTN (21) diff --git a/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.h b/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.h index 1ad7a0e905327..e8526cdba491f 100644 --- a/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.h +++ b/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.h @@ -1,19 +1,20 @@ // Board config for Wiznet W5500-EVB-Pico. // Board and hardware specific configuration -#define MICROPY_HW_BOARD_NAME "W5500-EVB-Pico" -#define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024) +#define MICROPY_HW_BOARD_NAME "W5500-EVB-Pico" +#define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024) // Enable networking. -#define MICROPY_PY_NETWORK (1) +#define MICROPY_PY_NETWORK (1) +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "W5500-EVB" // Wiznet HW config. -#define MICROPY_HW_WIZNET_SPI_ID (0) -#define MICROPY_HW_WIZNET_SPI_BAUDRATE (20 * 1000 * 1000) -#define MICROPY_HW_WIZNET_SPI_SCK (18) -#define MICROPY_HW_WIZNET_SPI_MOSI (19) -#define MICROPY_HW_WIZNET_SPI_MISO (16) -#define MICROPY_HW_WIZNET_PIN_CS (17) -#define MICROPY_HW_WIZNET_PIN_RST (20) +#define MICROPY_HW_WIZNET_SPI_ID (0) +#define MICROPY_HW_WIZNET_SPI_BAUDRATE (20 * 1000 * 1000) +#define MICROPY_HW_WIZNET_SPI_SCK (18) +#define MICROPY_HW_WIZNET_SPI_MOSI (19) +#define MICROPY_HW_WIZNET_SPI_MISO (16) +#define MICROPY_HW_WIZNET_PIN_CS (17) +#define MICROPY_HW_WIZNET_PIN_RST (20) // Connecting the INTN pin enables RECV interrupt handling of incoming data. -#define MICROPY_HW_WIZNET_PIN_INTN (21) +#define MICROPY_HW_WIZNET_PIN_INTN (21) diff --git a/ports/rp2/cyw43_configport.h b/ports/rp2/cyw43_configport.h index c17b7a5c523c1..08cded6f1f156 100644 --- a/ports/rp2/cyw43_configport.h +++ b/ports/rp2/cyw43_configport.h @@ -30,6 +30,7 @@ #include "py/mpconfig.h" #include "py/mperrno.h" #include "py/mphal.h" +#include "extmod/modnetwork.h" #include "pendsv.h" #define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "w43439A0_7_95_49_00_combined.h" @@ -48,6 +49,8 @@ #define CYW43_THREAD_EXIT MICROPY_PY_LWIP_EXIT #define CYW43_THREAD_LOCK_CHECK +#define CYW43_HOST_NAME mod_network_hostname + #define CYW43_SDPCM_SEND_COMMON_WAIT \ if (get_core_num() == 0) { \ cyw43_yield(); \ diff --git a/ports/rp2/modrp2.c b/ports/rp2/modrp2.c index 2601a7f443de4..5dfedb9929f4a 100644 --- a/ports/rp2/modrp2.c +++ b/ports/rp2/modrp2.c @@ -29,25 +29,11 @@ #include "modrp2.h" #if MICROPY_PY_NETWORK_CYW43 -#include "lib/cyw43-driver/src/cyw43_country.h" - -extern uint32_t cyw43_country_code; +#include "extmod/modnetwork.h" +#endif -STATIC mp_obj_t rp2_country(size_t n_args, const mp_obj_t *args) { - if (n_args == 0) { - char code[2] = {cyw43_country_code, cyw43_country_code >> 8}; - return mp_obj_new_str(code, 2); - } else { - size_t len; - const char *str = mp_obj_str_get_data(args[0], &len); - if (len != 2) { - mp_raise_ValueError(NULL); - } - cyw43_country_code = CYW43_COUNTRY(str[0], str[1], 0); - return mp_const_none; - } -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(rp2_country_obj, 0, 1, rp2_country); +#if MICROPY_PY_NETWORK_CYW43 +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj); #endif STATIC const mp_rom_map_elem_t rp2_module_globals_table[] = { @@ -57,7 +43,8 @@ STATIC const mp_rom_map_elem_t rp2_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_StateMachine), MP_ROM_PTR(&rp2_state_machine_type) }, #if MICROPY_PY_NETWORK_CYW43 - { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&rp2_country_obj) }, + // Deprecated (use network.country instead). + { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&mod_network_country_obj) }, #endif }; STATIC MP_DEFINE_CONST_DICT(rp2_module_globals, rp2_module_globals_table); diff --git a/ports/rp2/mpconfigport.h b/ports/rp2/mpconfigport.h index 35bc22e55a305..180216329a7bc 100644 --- a/ports/rp2/mpconfigport.h +++ b/ports/rp2/mpconfigport.h @@ -141,6 +141,10 @@ // By default networking should include sockets, ssl, websockets, webrepl, dupterm. #if MICROPY_PY_NETWORK +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-rp2" +#endif + #ifndef MICROPY_PY_USOCKET #define MICROPY_PY_USOCKET (1) #endif @@ -263,10 +267,7 @@ typedef intptr_t mp_off_t; extern uint32_t rosc_random_u32(void); extern void lwip_lock_acquire(void); extern void lwip_lock_release(void); - -extern uint32_t cyw43_country_code; extern void cyw43_irq_init(void); extern void cyw43_post_poll_hook(void); #define CYW43_POST_POLL_HOOK cyw43_post_poll_hook(); -#define MICROPY_CYW43_COUNTRY cyw43_country_code diff --git a/ports/rp2/mpnetworkport.c b/ports/rp2/mpnetworkport.c index 96cd16af0f594..d8e33e229d9f8 100644 --- a/ports/rp2/mpnetworkport.c +++ b/ports/rp2/mpnetworkport.c @@ -40,14 +40,12 @@ static alarm_id_t lwip_alarm_id = -1; #if MICROPY_PY_NETWORK_CYW43 #include "lib/cyw43-driver/src/cyw43.h" -#include "lib/cyw43-driver/src/cyw43_country.h" #include "lib/cyw43-driver/src/cyw43_stats.h" #include "hardware/irq.h" #define CYW43_IRQ_LEVEL GPIO_IRQ_LEVEL_HIGH #define CYW43_SHARED_IRQ_HANDLER_PRIORITY PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY -uint32_t cyw43_country_code = CYW43_COUNTRY_WORLDWIDE; volatile int cyw43_has_pending = 0; static void gpio_irq_handler(void) { diff --git a/ports/stm32/boards/ARDUINO_PORTENTA_H7/mpconfigboard.h b/ports/stm32/boards/ARDUINO_PORTENTA_H7/mpconfigboard.h index a2981352a1b80..986ed2b877c72 100644 --- a/ports/stm32/boards/ARDUINO_PORTENTA_H7/mpconfigboard.h +++ b/ports/stm32/boards/ARDUINO_PORTENTA_H7/mpconfigboard.h @@ -9,6 +9,8 @@ #define MICROPY_PY_SYS_PLATFORM "Portenta" #define MICROPY_HW_FLASH_FS_LABEL "portenta" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "Portenta" + #define MICROPY_OBJ_REPR (MICROPY_OBJ_REPR_C) #define UINT_FMT "%u" #define INT_FMT "%d" diff --git a/ports/stm32/boards/PYBD_SF2/mpconfigboard.h b/ports/stm32/boards/PYBD_SF2/mpconfigboard.h index 6dfb8c38d23a2..09736d8bd78f2 100644 --- a/ports/stm32/boards/PYBD_SF2/mpconfigboard.h +++ b/ports/stm32/boards/PYBD_SF2/mpconfigboard.h @@ -27,6 +27,8 @@ #define MICROPY_HW_BOARD_NAME "PYBD-SF2W" #define MICROPY_HW_MCU_NAME "STM32F722IEK" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "PYBD" + #define MICROPY_PY_PYB_LEGACY (1) #define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0) #define MICROPY_HW_HAS_SWITCH (1) diff --git a/ports/stm32/eth.c b/ports/stm32/eth.c index be418235e13d4..1207a728c388a 100644 --- a/ports/stm32/eth.c +++ b/ports/stm32/eth.c @@ -737,7 +737,7 @@ STATIC void eth_lwip_init(eth_t *self) { n->name[0] = 'e'; n->name[1] = '0'; netif_add(n, &ipconfig[0], &ipconfig[1], &ipconfig[2], self, eth_netif_init, ethernet_input); - netif_set_hostname(n, "MPY"); + netif_set_hostname(n, mod_network_hostname); netif_set_default(n); netif_set_up(n); diff --git a/ports/stm32/modpyb.c b/ports/stm32/modpyb.c index 7f87dd5820ec6..641d66efaf0cf 100644 --- a/ports/stm32/modpyb.c +++ b/ports/stm32/modpyb.c @@ -52,11 +52,10 @@ #include "usb.h" #include "portmodules.h" #include "modmachine.h" +#include "extmod/modnetwork.h" #include "extmod/vfs.h" #include "extmod/utime_mphal.h" -char pyb_country_code[2]; - #if MICROPY_PY_PYB STATIC mp_obj_t pyb_fault_debug(mp_obj_t value) { @@ -115,21 +114,9 @@ STATIC mp_obj_t pyb_repl_uart(size_t n_args, const mp_obj_t *args) { } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_repl_uart_obj, 0, 1, pyb_repl_uart); -STATIC mp_obj_t pyb_country(size_t n_args, const mp_obj_t *args) { - if (n_args == 0) { - return mp_obj_new_str(pyb_country_code, 2); - } else { - size_t len; - const char *str = mp_obj_str_get_data(args[0], &len); - if (len != 2) { - mp_raise_ValueError(NULL); - } - pyb_country_code[0] = str[0]; - pyb_country_code[1] = str[1]; - return mp_const_none; - } -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_country_obj, 0, 1, pyb_country); +#if MICROPY_PY_NETWORK +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj); +#endif STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_pyb) }, @@ -160,7 +147,11 @@ STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = { #endif { MP_ROM_QSTR(MP_QSTR_main), MP_ROM_PTR(&pyb_main_obj) }, { MP_ROM_QSTR(MP_QSTR_repl_uart), MP_ROM_PTR(&pyb_repl_uart_obj) }, - { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&pyb_country_obj) }, + + #if MICROPY_PY_NETWORK + // Deprecated (use network.country instead). + { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&mod_network_country_obj) }, + #endif #if MICROPY_HW_ENABLE_USB { MP_ROM_QSTR(MP_QSTR_usb_mode), MP_ROM_PTR(&pyb_usb_mode_obj) }, diff --git a/ports/stm32/mpconfigport.h b/ports/stm32/mpconfigport.h index 18521ef1d8cdf..ee12ab8140583 100644 --- a/ports/stm32/mpconfigport.h +++ b/ports/stm32/mpconfigport.h @@ -290,6 +290,10 @@ static inline mp_uint_t disable_irq(void) { #define MICROPY_PY_LWIP_REENTER MICROPY_PY_PENDSV_REENTER #define MICROPY_PY_LWIP_EXIT MICROPY_PY_PENDSV_EXIT +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-stm32" +#endif + #if MICROPY_PY_BLUETOOTH_USE_SYNC_EVENTS // Bluetooth code only runs in the scheduler, no locking/mutex required. #define MICROPY_PY_BLUETOOTH_ENTER uint32_t atomic_state = 0; From f78464c12ba97688e3d234d88362a90e38892f7c Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Wed, 1 Feb 2023 14:19:45 +1100 Subject: [PATCH 2/9] extmod/modnetwork: Allow more extensive port-specific customisation. This allows for a port (e.g. esp8266/esp32) to use extmod/modnetwork.c and provide the globals dict, rather than just a list of interfaces. When this is used, the default implementation of `network.route` and the NIC list is not enabled. Also splits out the LWIP-specific helpers from modnetwork.c into network_lwip.c. Signed-off-by: Jim Mussared --- extmod/extmod.cmake | 1 + extmod/extmod.mk | 1 + extmod/modnetwork.c | 83 ++++++++----------------------------- extmod/modnetwork.h | 6 ++- extmod/network_lwip.c | 95 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 119 insertions(+), 67 deletions(-) create mode 100644 extmod/network_lwip.c diff --git a/extmod/extmod.cmake b/extmod/extmod.cmake index 2a19a0e85c381..0e5ed942260f0 100644 --- a/extmod/extmod.cmake +++ b/extmod/extmod.cmake @@ -38,6 +38,7 @@ set(MICROPY_SOURCE_EXTMOD ${MICROPY_EXTMOD_DIR}/moduzlib.c ${MICROPY_EXTMOD_DIR}/modwebrepl.c ${MICROPY_EXTMOD_DIR}/network_cyw43.c + ${MICROPY_EXTMOD_DIR}/network_lwip.c ${MICROPY_EXTMOD_DIR}/network_ninaw10.c ${MICROPY_EXTMOD_DIR}/network_wiznet5k.c ${MICROPY_EXTMOD_DIR}/uos_dupterm.c diff --git a/extmod/extmod.mk b/extmod/extmod.mk index 08138ead56a17..03fdb43546b8e 100644 --- a/extmod/extmod.mk +++ b/extmod/extmod.mk @@ -37,6 +37,7 @@ SRC_EXTMOD_C += \ extmod/moduzlib.c \ extmod/modwebrepl.c \ extmod/network_cyw43.c \ + extmod/network_lwip.c \ extmod/network_ninaw10.c \ extmod/network_wiznet5k.c \ extmod/uos_dupterm.c \ diff --git a/extmod/modnetwork.c b/extmod/modnetwork.c index 0431e5f418e8b..438c1ed744513 100644 --- a/extmod/modnetwork.c +++ b/extmod/modnetwork.c @@ -37,19 +37,15 @@ #include "shared/netutils/netutils.h" #include "modnetwork.h" -#if MICROPY_PY_LWIP -#include "lwip/netif.h" -#include "lwip/timeouts.h" -#include "lwip/dns.h" -#include "lwip/dhcp.h" -#include "lwip/apps/mdns.h" -#endif - #if MICROPY_PY_NETWORK_CYW43 && MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER // So that CYW43_LINK_xxx constants are available to MICROPY_PORT_NETWORK_INTERFACES. #include "lib/cyw43-driver/src/cyw43.h" #endif +#ifdef MICROPY_PY_NETWORK_INCLUDEFILE +#include MICROPY_PY_NETWORK_INCLUDEFILE +#endif + /// \module network - network configuration /// /// This module provides network drivers and routing configuration. @@ -62,6 +58,8 @@ char mod_network_country_code[2] = "XX"; char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN] = MICROPY_PY_NETWORK_HOSTNAME_DEFAULT; +#ifdef MICROPY_PORT_NETWORK_INTERFACES + void mod_network_init(void) { mp_obj_list_init(&MP_STATE_PORT(mod_network_nic_list), 0); } @@ -97,6 +95,10 @@ STATIC mp_obj_t network_route(void) { } STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_route_obj, network_route); +MP_REGISTER_ROOT_POINTER(mp_obj_list_t mod_network_nic_list); + +#endif // MICROPY_PORT_NETWORK_INTERFACES + STATIC mp_obj_t network_country(size_t n_args, const mp_obj_t *args) { if (n_args == 0) { return mp_obj_new_str(mod_network_country_code, 2); @@ -131,16 +133,23 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_hostname_obj, 0, 1, netwo STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) }, - { MP_ROM_QSTR(MP_QSTR_route), MP_ROM_PTR(&network_route_obj) }, { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&mod_network_country_obj) }, { MP_ROM_QSTR(MP_QSTR_hostname), MP_ROM_PTR(&mod_network_hostname_obj) }, // Defined per port in mpconfigport.h + #ifdef MICROPY_PORT_NETWORK_INTERFACES + { MP_ROM_QSTR(MP_QSTR_route), MP_ROM_PTR(&network_route_obj) }, MICROPY_PORT_NETWORK_INTERFACES + #endif + // Allow a port to take mostly full control of the network module. + #ifdef MICROPY_PY_NETWORK_MODULE_GLOBALS_INCLUDEFILE + #include MICROPY_PY_NETWORK_MODULE_GLOBALS_INCLUDEFILE + #else // Constants { MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(MOD_NETWORK_STA_IF) }, { MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(MOD_NETWORK_AP_IF) }, + #endif }; STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table); @@ -152,60 +161,4 @@ const mp_obj_module_t mp_module_network = { MP_REGISTER_MODULE(MP_QSTR_network, mp_module_network); -/*******************************************************************************/ -// Implementations of network methods that can be used by any interface - -#if MICROPY_PY_LWIP - -mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_obj_t *args) { - if (n_args == 0) { - // Get IP addresses - const ip_addr_t *dns = dns_getserver(0); - mp_obj_t tuple[4] = { - netutils_format_ipv4_addr((uint8_t *)&netif->ip_addr, NETUTILS_BIG), - netutils_format_ipv4_addr((uint8_t *)&netif->netmask, NETUTILS_BIG), - netutils_format_ipv4_addr((uint8_t *)&netif->gw, NETUTILS_BIG), - netutils_format_ipv4_addr((uint8_t *)dns, NETUTILS_BIG), - }; - return mp_obj_new_tuple(4, tuple); - } else if (args[0] == MP_OBJ_NEW_QSTR(MP_QSTR_dhcp)) { - // Start the DHCP client - if (dhcp_supplied_address(netif)) { - dhcp_renew(netif); - } else { - dhcp_stop(netif); - dhcp_start(netif); - } - - // Wait for DHCP to get IP address - uint32_t start = mp_hal_ticks_ms(); - while (!dhcp_supplied_address(netif)) { - if (mp_hal_ticks_ms() - start > 10000) { - mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("timeout waiting for DHCP to get IP address")); - } - mp_hal_delay_ms(100); - } - - return mp_const_none; - } else { - // Release and stop any existing DHCP - dhcp_release(netif); - dhcp_stop(netif); - // Set static IP addresses - mp_obj_t *items; - mp_obj_get_array_fixed_n(args[0], 4, &items); - netutils_parse_ipv4_addr(items[0], (uint8_t *)&netif->ip_addr, NETUTILS_BIG); - netutils_parse_ipv4_addr(items[1], (uint8_t *)&netif->netmask, NETUTILS_BIG); - netutils_parse_ipv4_addr(items[2], (uint8_t *)&netif->gw, NETUTILS_BIG); - ip_addr_t dns; - netutils_parse_ipv4_addr(items[3], (uint8_t *)&dns, NETUTILS_BIG); - dns_setserver(0, &dns); - return mp_const_none; - } -} - -#endif - -MP_REGISTER_ROOT_POINTER(mp_obj_list_t mod_network_nic_list); - #endif // MICROPY_PY_NETWORK diff --git a/extmod/modnetwork.h b/extmod/modnetwork.h index 0ef612d108964..11691140fd6f1 100644 --- a/extmod/modnetwork.h +++ b/extmod/modnetwork.h @@ -65,7 +65,7 @@ struct netif; void mod_network_lwip_init(void); void mod_network_lwip_poll_wrapper(uint32_t ticks_ms); mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_obj_t *args); -#else +#elif defined(MICROPY_PORT_NETWORK_INTERFACES) struct _mod_network_socket_obj_t; @@ -107,11 +107,13 @@ typedef struct _mod_network_socket_obj_t { #endif } mod_network_socket_obj_t; -#endif // MICROPY_PY_LWIP +#endif // MICROPY_PY_LWIP / MICROPY_PORT_NETWORK_INTERFACES +#ifdef MICROPY_PORT_NETWORK_INTERFACES void mod_network_init(void); void mod_network_deinit(void); void mod_network_register_nic(mp_obj_t nic); mp_obj_t mod_network_find_nic(const uint8_t *ip); +#endif #endif // MICROPY_INCLUDED_MODNETWORK_H diff --git a/extmod/network_lwip.c b/extmod/network_lwip.c new file mode 100644 index 0000000000000..caa30f6fff4d2 --- /dev/null +++ b/extmod/network_lwip.c @@ -0,0 +1,95 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/runtime.h" +#include "py/mphal.h" + +#if MICROPY_PY_NETWORK && MICROPY_PY_LWIP + +#include "shared/netutils/netutils.h" +#include "extmod/modnetwork.h" + +#include "lwip/init.h" + +#if LWIP_VERSION_MAJOR >= 2 + +#include "lwip/netif.h" +#include "lwip/timeouts.h" +#include "lwip/dns.h" +#include "lwip/dhcp.h" + +// Implementations of network methods that can be used by any interface. + +mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_obj_t *args) { + if (n_args == 0) { + // Get IP addresses + const ip_addr_t *dns = dns_getserver(0); + mp_obj_t tuple[4] = { + netutils_format_ipv4_addr((uint8_t *)&netif->ip_addr, NETUTILS_BIG), + netutils_format_ipv4_addr((uint8_t *)&netif->netmask, NETUTILS_BIG), + netutils_format_ipv4_addr((uint8_t *)&netif->gw, NETUTILS_BIG), + netutils_format_ipv4_addr((uint8_t *)dns, NETUTILS_BIG), + }; + return mp_obj_new_tuple(4, tuple); + } else if (args[0] == MP_OBJ_NEW_QSTR(MP_QSTR_dhcp)) { + // Start the DHCP client + if (dhcp_supplied_address(netif)) { + dhcp_renew(netif); + } else { + dhcp_stop(netif); + dhcp_start(netif); + } + + // Wait for DHCP to get IP address + uint32_t start = mp_hal_ticks_ms(); + while (!dhcp_supplied_address(netif)) { + if (mp_hal_ticks_ms() - start > 10000) { + mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("timeout waiting for DHCP to get IP address")); + } + mp_hal_delay_ms(100); + } + + return mp_const_none; + } else { + // Release and stop any existing DHCP + dhcp_release(netif); + dhcp_stop(netif); + // Set static IP addresses + mp_obj_t *items; + mp_obj_get_array_fixed_n(args[0], 4, &items); + netutils_parse_ipv4_addr(items[0], (uint8_t *)&netif->ip_addr, NETUTILS_BIG); + netutils_parse_ipv4_addr(items[1], (uint8_t *)&netif->netmask, NETUTILS_BIG); + netutils_parse_ipv4_addr(items[2], (uint8_t *)&netif->gw, NETUTILS_BIG); + ip_addr_t dns; + netutils_parse_ipv4_addr(items[3], (uint8_t *)&dns, NETUTILS_BIG); + dns_setserver(0, &dns); + return mp_const_none; + } +} + +#endif // LWIP_VERSION_MAJOR >= 2 + +#endif // MICROPY_PY_NETWORK && MICROPY_PY_LWIP From eb51ca4a110ee6047509bdb6ba3073ebe398ea0a Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Wed, 1 Feb 2023 14:20:45 +1100 Subject: [PATCH 3/9] esp32: Use extmod/modnetwork.c instead of port-specific version. Rather than duplicating the implementation of `network`, this allows ESP32 to use the shared one in extmod. In particular this gains access to network.hostname and network.country. Set default hostnames for various ESP32 boards. Other than adding these two methods and the change to the default hostname, there is no other user-visible change. Signed-off-by: Jim Mussared --- .../boards/LILYGO_TTGO_LORA32/mpconfigboard.h | 1 + .../boards/LOLIN_C3_MINI/mpconfigboard.h | 1 + .../boards/LOLIN_S2_MINI/mpconfigboard.h | 1 + .../boards/LOLIN_S2_PICO/mpconfigboard.h | 1 + .../esp32/boards/M5STACK_ATOM/mpconfigboard.h | 1 + .../esp32/boards/UM_FEATHERS2/mpconfigboard.h | 1 + .../boards/UM_FEATHERS2NEO/mpconfigboard.h | 1 + .../esp32/boards/UM_FEATHERS3/mpconfigboard.h | 1 + ports/esp32/boards/UM_PROS3/mpconfigboard.h | 1 + .../esp32/boards/UM_TINYPICO/mpconfigboard.h | 1 + ports/esp32/boards/UM_TINYS2/mpconfigboard.h | 1 + ports/esp32/boards/UM_TINYS3/mpconfigboard.h | 1 + ports/esp32/main/CMakeLists.txt | 2 +- ports/esp32/modnetwork.h | 12 +- ports/esp32/modnetwork_globals.h | 77 +++++++++++++ ports/esp32/mpconfigport.h | 14 +++ .../esp32/{modnetwork.c => network_common.c} | 103 +----------------- ports/esp32/network_lan.c | 4 +- ports/esp32/network_ppp.c | 2 +- ports/esp32/network_wlan.c | 30 ++--- 20 files changed, 134 insertions(+), 122 deletions(-) create mode 100644 ports/esp32/modnetwork_globals.h rename ports/esp32/{modnetwork.c => network_common.c} (66%) diff --git a/ports/esp32/boards/LILYGO_TTGO_LORA32/mpconfigboard.h b/ports/esp32/boards/LILYGO_TTGO_LORA32/mpconfigboard.h index 1c7b6fd557672..6be22dd0ffc40 100644 --- a/ports/esp32/boards/LILYGO_TTGO_LORA32/mpconfigboard.h +++ b/ports/esp32/boards/LILYGO_TTGO_LORA32/mpconfigboard.h @@ -1,2 +1,3 @@ #define MICROPY_HW_BOARD_NAME "LILYGO TTGO LoRa32" #define MICROPY_HW_MCU_NAME "ESP32" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-ttgo-lora32" diff --git a/ports/esp32/boards/LOLIN_C3_MINI/mpconfigboard.h b/ports/esp32/boards/LOLIN_C3_MINI/mpconfigboard.h index 5872bdc8ae5ef..12fd285da1753 100644 --- a/ports/esp32/boards/LOLIN_C3_MINI/mpconfigboard.h +++ b/ports/esp32/boards/LOLIN_C3_MINI/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "LOLIN_C3_MINI" #define MICROPY_HW_MCU_NAME "ESP32-C3FH4" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-c3-mini" #define MICROPY_HW_ENABLE_SDCARD (0) #define MICROPY_PY_MACHINE_DAC (0) diff --git a/ports/esp32/boards/LOLIN_S2_MINI/mpconfigboard.h b/ports/esp32/boards/LOLIN_S2_MINI/mpconfigboard.h index e0ef10d1db928..9776b7b478aa1 100644 --- a/ports/esp32/boards/LOLIN_S2_MINI/mpconfigboard.h +++ b/ports/esp32/boards/LOLIN_S2_MINI/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "LOLIN_S2_MINI" #define MICROPY_HW_MCU_NAME "ESP32-S2FN4R2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-s2-mini" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/LOLIN_S2_PICO/mpconfigboard.h b/ports/esp32/boards/LOLIN_S2_PICO/mpconfigboard.h index 549dd9847c7f3..9241280dec6a3 100644 --- a/ports/esp32/boards/LOLIN_S2_PICO/mpconfigboard.h +++ b/ports/esp32/boards/LOLIN_S2_PICO/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "LOLIN_S2_PICO" #define MICROPY_HW_MCU_NAME "ESP32-S2FN4R2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-s2-pico" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/M5STACK_ATOM/mpconfigboard.h b/ports/esp32/boards/M5STACK_ATOM/mpconfigboard.h index 4270b19caf966..18a59b15a50a6 100644 --- a/ports/esp32/boards/M5STACK_ATOM/mpconfigboard.h +++ b/ports/esp32/boards/M5STACK_ATOM/mpconfigboard.h @@ -1,2 +1,3 @@ #define MICROPY_HW_BOARD_NAME "M5Stack ATOM" #define MICROPY_HW_MCU_NAME "ESP32-PICO-D4" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "m5stack-atom" diff --git a/ports/esp32/boards/UM_FEATHERS2/mpconfigboard.h b/ports/esp32/boards/UM_FEATHERS2/mpconfigboard.h index 8d0c9f78c83ae..d8529b6342fe2 100644 --- a/ports/esp32/boards/UM_FEATHERS2/mpconfigboard.h +++ b/ports/esp32/boards/UM_FEATHERS2/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "FeatherS2" #define MICROPY_HW_MCU_NAME "ESP32-S2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "FeatherS2" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/UM_FEATHERS2NEO/mpconfigboard.h b/ports/esp32/boards/UM_FEATHERS2NEO/mpconfigboard.h index 5ee6874b87bab..e7e4d37ece95a 100644 --- a/ports/esp32/boards/UM_FEATHERS2NEO/mpconfigboard.h +++ b/ports/esp32/boards/UM_FEATHERS2NEO/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "FeatherS2 Neo" #define MICROPY_HW_MCU_NAME "ESP32-S2FN4R2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "FeatherS2-Neo" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/UM_FEATHERS3/mpconfigboard.h b/ports/esp32/boards/UM_FEATHERS3/mpconfigboard.h index 738b32ca1e841..91ea5056d17b7 100644 --- a/ports/esp32/boards/UM_FEATHERS3/mpconfigboard.h +++ b/ports/esp32/boards/UM_FEATHERS3/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "FeatherS3" #define MICROPY_HW_MCU_NAME "ESP32-S3" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "FeatherS3" #define MICROPY_PY_MACHINE_DAC (0) diff --git a/ports/esp32/boards/UM_PROS3/mpconfigboard.h b/ports/esp32/boards/UM_PROS3/mpconfigboard.h index 1522e2aee3adc..ecff1e6570666 100644 --- a/ports/esp32/boards/UM_PROS3/mpconfigboard.h +++ b/ports/esp32/boards/UM_PROS3/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "ProS3" #define MICROPY_HW_MCU_NAME "ESP32-S3" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "ProS3" #define MICROPY_PY_MACHINE_DAC (0) diff --git a/ports/esp32/boards/UM_TINYPICO/mpconfigboard.h b/ports/esp32/boards/UM_TINYPICO/mpconfigboard.h index 6bf70cc13b580..0bb3fa6184155 100644 --- a/ports/esp32/boards/UM_TINYPICO/mpconfigboard.h +++ b/ports/esp32/boards/UM_TINYPICO/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "TinyPICO" #define MICROPY_HW_MCU_NAME "ESP32-PICO-D4" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "TinyPICO" #define MICROPY_HW_I2C0_SCL (22) #define MICROPY_HW_I2C0_SDA (21) diff --git a/ports/esp32/boards/UM_TINYS2/mpconfigboard.h b/ports/esp32/boards/UM_TINYS2/mpconfigboard.h index 1052f6d79ca2b..e0bde417c8a2a 100644 --- a/ports/esp32/boards/UM_TINYS2/mpconfigboard.h +++ b/ports/esp32/boards/UM_TINYS2/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "TinyS2" #define MICROPY_HW_MCU_NAME "ESP32-S2FN4R2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "TinyS2" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/UM_TINYS3/mpconfigboard.h b/ports/esp32/boards/UM_TINYS3/mpconfigboard.h index b2638a9847882..c0f81f0c447c8 100644 --- a/ports/esp32/boards/UM_TINYS3/mpconfigboard.h +++ b/ports/esp32/boards/UM_TINYS3/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "TinyS3" #define MICROPY_HW_MCU_NAME "ESP32-S3-FN8" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "TinyS3" #define MICROPY_PY_MACHINE_DAC (0) diff --git a/ports/esp32/main/CMakeLists.txt b/ports/esp32/main/CMakeLists.txt index fccfd6b7c7a9f..f8acfa90524f4 100644 --- a/ports/esp32/main/CMakeLists.txt +++ b/ports/esp32/main/CMakeLists.txt @@ -68,7 +68,7 @@ set(MICROPY_SOURCE_PORT ${PROJECT_DIR}/machine_i2s.c ${PROJECT_DIR}/machine_uart.c ${PROJECT_DIR}/modmachine.c - ${PROJECT_DIR}/modnetwork.c + ${PROJECT_DIR}/network_common.c ${PROJECT_DIR}/network_lan.c ${PROJECT_DIR}/network_ppp.c ${PROJECT_DIR}/network_wlan.c diff --git a/ports/esp32/modnetwork.h b/ports/esp32/modnetwork.h index d90679fa8a4e3..5f2767ac8d4fd 100644 --- a/ports/esp32/modnetwork.h +++ b/ports/esp32/modnetwork.h @@ -45,11 +45,13 @@ typedef struct _wlan_if_obj_t { int if_id; } wlan_if_obj_t; -MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(get_wlan_obj); -MP_DECLARE_CONST_FUN_OBJ_KW(get_lan_obj); -MP_DECLARE_CONST_FUN_OBJ_1(ppp_make_new_obj); -MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_ifconfig_obj); -MP_DECLARE_CONST_FUN_OBJ_KW(esp_config_obj); +MP_DECLARE_CONST_FUN_OBJ_0(esp_network_initialize_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_get_wlan_obj); +MP_DECLARE_CONST_FUN_OBJ_KW(esp_network_get_lan_obj); +MP_DECLARE_CONST_FUN_OBJ_1(esp_network_ppp_make_new_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_ifconfig_obj); +MP_DECLARE_CONST_FUN_OBJ_KW(esp_network_config_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj); NORETURN void esp_exceptions_helper(esp_err_t e); diff --git a/ports/esp32/modnetwork_globals.h b/ports/esp32/modnetwork_globals.h new file mode 100644 index 0000000000000..72d1ff3afbbc9 --- /dev/null +++ b/ports/esp32/modnetwork_globals.h @@ -0,0 +1,77 @@ +{ MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&esp_network_initialize_obj) }, + +#if MICROPY_PY_NETWORK_WLAN +{ MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&esp_network_get_wlan_obj) }, +#endif + +#if MICROPY_PY_NETWORK_LAN +{ MP_ROM_QSTR(MP_QSTR_LAN), MP_ROM_PTR(&esp_network_get_lan_obj) }, +#endif +{ MP_ROM_QSTR(MP_QSTR_PPP), MP_ROM_PTR(&esp_network_ppp_make_new_obj) }, +{ MP_ROM_QSTR(MP_QSTR_phy_mode), MP_ROM_PTR(&esp_network_phy_mode_obj) }, + +#if MICROPY_PY_NETWORK_WLAN +{ MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(WIFI_IF_STA)}, +{ MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(WIFI_IF_AP)}, + +{ MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(WIFI_PROTOCOL_11B) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(WIFI_PROTOCOL_11G) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(WIFI_PROTOCOL_11N) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_LR), MP_ROM_INT(WIFI_PROTOCOL_LR) }, + +{ MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(WIFI_AUTH_OPEN) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(WIFI_AUTH_WEP) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(WIFI_AUTH_WPA_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(WIFI_AUTH_WPA_WPA2_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_ENTERPRISE), MP_ROM_INT(WIFI_AUTH_WPA2_ENTERPRISE) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA3_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_WPA3_PSK) }, +#if ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 3, 0) +{ MP_ROM_QSTR(MP_QSTR_AUTH_WAPI_PSK), MP_ROM_INT(WIFI_AUTH_WAPI_PSK) }, +#endif +{ MP_ROM_QSTR(MP_QSTR_AUTH_MAX), MP_ROM_INT(WIFI_AUTH_MAX) }, +#endif + +#if MICROPY_PY_NETWORK_LAN +{ MP_ROM_QSTR(MP_QSTR_PHY_LAN8710), MP_ROM_INT(PHY_LAN8710) }, +{ MP_ROM_QSTR(MP_QSTR_PHY_LAN8720), MP_ROM_INT(PHY_LAN8720) }, +{ MP_ROM_QSTR(MP_QSTR_PHY_IP101), MP_ROM_INT(PHY_IP101) }, +{ MP_ROM_QSTR(MP_QSTR_PHY_RTL8201), MP_ROM_INT(PHY_RTL8201) }, +{ MP_ROM_QSTR(MP_QSTR_PHY_DP83848), MP_ROM_INT(PHY_DP83848) }, +#if ESP_IDF_VERSION_MINOR >= 3 +// PHY_KSZ8041 is new in ESP-IDF v4.3 +{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8041), MP_ROM_INT(PHY_KSZ8041) }, +#endif +#if ESP_IDF_VERSION_MINOR >= 4 +// PHY_KSZ8081 is new in ESP-IDF v4.4 +{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8081), MP_ROM_INT(PHY_KSZ8081) }, +#endif + +#if CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL +{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8851SNL), MP_ROM_INT(PHY_KSZ8851SNL) }, +#endif +#if CONFIG_ETH_SPI_ETHERNET_DM9051 +{ MP_ROM_QSTR(MP_QSTR_PHY_DM9051), MP_ROM_INT(PHY_DM9051) }, +#endif +#if CONFIG_ETH_SPI_ETHERNET_W5500 +{ MP_ROM_QSTR(MP_QSTR_PHY_W5500), MP_ROM_INT(PHY_W5500) }, +#endif + +{ MP_ROM_QSTR(MP_QSTR_ETH_INITIALIZED), MP_ROM_INT(ETH_INITIALIZED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_STARTED), MP_ROM_INT(ETH_STARTED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_STOPPED), MP_ROM_INT(ETH_STOPPED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_CONNECTED), MP_ROM_INT(ETH_CONNECTED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_DISCONNECTED), MP_ROM_INT(ETH_DISCONNECTED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_GOT_IP), MP_ROM_INT(ETH_GOT_IP)}, +#endif + +{ MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STAT_IDLE)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STAT_CONNECTING)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STAT_GOT_IP)}, +// Errors from the ESP-IDF +{ MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(WIFI_REASON_NO_AP_FOUND)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(WIFI_REASON_AUTH_FAIL)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_BEACON_TIMEOUT), MP_ROM_INT(WIFI_REASON_BEACON_TIMEOUT)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_ASSOC_FAIL), MP_ROM_INT(WIFI_REASON_ASSOC_FAIL)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_HANDSHAKE_TIMEOUT), MP_ROM_INT(WIFI_REASON_HANDSHAKE_TIMEOUT)}, diff --git a/ports/esp32/mpconfigport.h b/ports/esp32/mpconfigport.h index 38468cf9cfbb3..94daa2caa175d 100644 --- a/ports/esp32/mpconfigport.h +++ b/ports/esp32/mpconfigport.h @@ -110,6 +110,20 @@ #ifndef MICROPY_PY_MACHINE_I2S #define MICROPY_PY_MACHINE_I2S (1) #endif +#define MICROPY_PY_NETWORK (1) +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#if CONFIG_IDF_TARGET_ESP32 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp32" +#elif CONFIG_IDF_TARGET_ESP32S2 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp32s2" +#elif CONFIG_IDF_TARGET_ESP32S3 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp32s3" +#elif CONFIG_IDF_TARGET_ESP32C3 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp32c3" +#endif +#endif +#define MICROPY_PY_NETWORK_INCLUDEFILE "ports/esp32/modnetwork.h" +#define MICROPY_PY_NETWORK_MODULE_GLOBALS_INCLUDEFILE "ports/esp32/modnetwork_globals.h" #ifndef MICROPY_PY_NETWORK_WLAN #define MICROPY_PY_NETWORK_WLAN (1) #endif diff --git a/ports/esp32/modnetwork.c b/ports/esp32/network_common.c similarity index 66% rename from ports/esp32/modnetwork.c rename to ports/esp32/network_common.c index 3f56fcfae2639..1e76d679db046 100644 --- a/ports/esp32/modnetwork.c +++ b/ports/esp32/network_common.c @@ -48,8 +48,6 @@ #define DNS_MAIN ESP_NETIF_DNS_MAIN #endif -#define MODNETWORK_INCLUDE_CONSTANTS (1) - NORETURN void esp_exceptions_helper(esp_err_t e) { switch (e) { case ESP_ERR_WIFI_NOT_INIT: @@ -144,7 +142,7 @@ STATIC mp_obj_t esp_initialize() { } return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(esp_initialize_obj, esp_initialize); +MP_DEFINE_CONST_FUN_OBJ_0(esp_network_initialize_obj, esp_initialize); STATIC mp_obj_t esp_ifconfig(size_t n_args, const mp_obj_t *args) { wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -207,12 +205,12 @@ STATIC mp_obj_t esp_ifconfig(size_t n_args, const mp_obj_t *args) { return mp_const_none; } } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_ifconfig_obj, 1, 2, esp_ifconfig); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_ifconfig_obj, 1, 2, esp_ifconfig); STATIC mp_obj_t esp_phy_mode(size_t n_args, const mp_obj_t *args) { return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_phy_mode_obj, 0, 1, esp_phy_mode); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj, 0, 1, esp_phy_mode); #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0) #define TEST_WIFI_AUTH_MAX 9 @@ -220,98 +218,3 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_phy_mode_obj, 0, 1, esp_phy_mode) #define TEST_WIFI_AUTH_MAX 8 #endif _Static_assert(WIFI_AUTH_MAX == TEST_WIFI_AUTH_MAX, "Synchronize WIFI_AUTH_XXX constants with the ESP-IDF. Look at esp-idf/components/esp_wifi/include/esp_wifi_types.h"); - -STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) }, - { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&esp_initialize_obj) }, - - #if MICROPY_PY_NETWORK_WLAN - { MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&get_wlan_obj) }, - #endif - - #if MICROPY_PY_NETWORK_LAN - { MP_ROM_QSTR(MP_QSTR_LAN), MP_ROM_PTR(&get_lan_obj) }, - #endif - { MP_ROM_QSTR(MP_QSTR_PPP), MP_ROM_PTR(&ppp_make_new_obj) }, - { MP_ROM_QSTR(MP_QSTR_phy_mode), MP_ROM_PTR(&esp_phy_mode_obj) }, - - #if MODNETWORK_INCLUDE_CONSTANTS - - #if MICROPY_PY_NETWORK_WLAN - { MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(WIFI_IF_STA)}, - { MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(WIFI_IF_AP)}, - - { MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(WIFI_PROTOCOL_11B) }, - { MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(WIFI_PROTOCOL_11G) }, - { MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(WIFI_PROTOCOL_11N) }, - { MP_ROM_QSTR(MP_QSTR_MODE_LR), MP_ROM_INT(WIFI_PROTOCOL_LR) }, - - { MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(WIFI_AUTH_OPEN) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(WIFI_AUTH_WEP) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(WIFI_AUTH_WPA_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(WIFI_AUTH_WPA_WPA2_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_ENTERPRISE), MP_ROM_INT(WIFI_AUTH_WPA2_ENTERPRISE) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA3_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_WPA3_PSK) }, - #if ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 3, 0) - { MP_ROM_QSTR(MP_QSTR_AUTH_WAPI_PSK), MP_ROM_INT(WIFI_AUTH_WAPI_PSK) }, - #endif - { MP_ROM_QSTR(MP_QSTR_AUTH_MAX), MP_ROM_INT(WIFI_AUTH_MAX) }, - #endif - - #if MICROPY_PY_NETWORK_LAN - { MP_ROM_QSTR(MP_QSTR_PHY_LAN8710), MP_ROM_INT(PHY_LAN8710) }, - { MP_ROM_QSTR(MP_QSTR_PHY_LAN8720), MP_ROM_INT(PHY_LAN8720) }, - { MP_ROM_QSTR(MP_QSTR_PHY_IP101), MP_ROM_INT(PHY_IP101) }, - { MP_ROM_QSTR(MP_QSTR_PHY_RTL8201), MP_ROM_INT(PHY_RTL8201) }, - { MP_ROM_QSTR(MP_QSTR_PHY_DP83848), MP_ROM_INT(PHY_DP83848) }, - #if ESP_IDF_VERSION_MINOR >= 3 - // PHY_KSZ8041 is new in ESP-IDF v4.3 - { MP_ROM_QSTR(MP_QSTR_PHY_KSZ8041), MP_ROM_INT(PHY_KSZ8041) }, - #endif - #if ESP_IDF_VERSION_MINOR >= 4 - // PHY_KSZ8081 is new in ESP-IDF v4.4 - { MP_ROM_QSTR(MP_QSTR_PHY_KSZ8081), MP_ROM_INT(PHY_KSZ8081) }, - #endif - - #if CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL - { MP_ROM_QSTR(MP_QSTR_PHY_KSZ8851SNL), MP_ROM_INT(PHY_KSZ8851SNL) }, - #endif - #if CONFIG_ETH_SPI_ETHERNET_DM9051 - { MP_ROM_QSTR(MP_QSTR_PHY_DM9051), MP_ROM_INT(PHY_DM9051) }, - #endif - #if CONFIG_ETH_SPI_ETHERNET_W5500 - { MP_ROM_QSTR(MP_QSTR_PHY_W5500), MP_ROM_INT(PHY_W5500) }, - #endif - - { MP_ROM_QSTR(MP_QSTR_ETH_INITIALIZED), MP_ROM_INT(ETH_INITIALIZED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_STARTED), MP_ROM_INT(ETH_STARTED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_STOPPED), MP_ROM_INT(ETH_STOPPED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_CONNECTED), MP_ROM_INT(ETH_CONNECTED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_DISCONNECTED), MP_ROM_INT(ETH_DISCONNECTED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_GOT_IP), MP_ROM_INT(ETH_GOT_IP)}, - #endif - - { MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STAT_IDLE)}, - { MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STAT_CONNECTING)}, - { MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STAT_GOT_IP)}, - // Errors from the ESP-IDF - { MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(WIFI_REASON_NO_AP_FOUND)}, - { MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(WIFI_REASON_AUTH_FAIL)}, - { MP_ROM_QSTR(MP_QSTR_STAT_BEACON_TIMEOUT), MP_ROM_INT(WIFI_REASON_BEACON_TIMEOUT)}, - { MP_ROM_QSTR(MP_QSTR_STAT_ASSOC_FAIL), MP_ROM_INT(WIFI_REASON_ASSOC_FAIL)}, - { MP_ROM_QSTR(MP_QSTR_STAT_HANDSHAKE_TIMEOUT), MP_ROM_INT(WIFI_REASON_HANDSHAKE_TIMEOUT)}, - #endif -}; - -STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table); - -const mp_obj_module_t mp_module_network = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&mp_module_network_globals, -}; - -// Note: This port doesn't define MICROPY_PY_NETWORK so this will not conflict -// with the common implementation provided by extmod/modnetwork.c. -MP_REGISTER_MODULE(MP_QSTR_network, mp_module_network); diff --git a/ports/esp32/network_lan.c b/ports/esp32/network_lan.c index d4d630e345697..9b7a31cc4f9d3 100644 --- a/ports/esp32/network_lan.c +++ b/ports/esp32/network_lan.c @@ -331,7 +331,7 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar return MP_OBJ_FROM_PTR(&lan_obj); } -MP_DEFINE_CONST_FUN_OBJ_KW(get_lan_obj, 0, get_lan); +MP_DEFINE_CONST_FUN_OBJ_KW(esp_network_get_lan_obj, 0, get_lan); STATIC mp_obj_t lan_active(size_t n_args, const mp_obj_t *args) { lan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -423,7 +423,7 @@ STATIC const mp_rom_map_elem_t lan_if_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&lan_isconnected_obj) }, { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&lan_status_obj) }, { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&lan_config_obj) }, - { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_ifconfig_obj) }, + { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_network_ifconfig_obj) }, }; STATIC MP_DEFINE_CONST_DICT(lan_if_locals_dict, lan_if_locals_dict_table); diff --git a/ports/esp32/network_ppp.c b/ports/esp32/network_ppp.c index 703cdc7889fdc..b3cab835981e1 100644 --- a/ports/esp32/network_ppp.c +++ b/ports/esp32/network_ppp.c @@ -91,7 +91,7 @@ STATIC mp_obj_t ppp_make_new(mp_obj_t stream) { return MP_OBJ_FROM_PTR(self); } -MP_DEFINE_CONST_FUN_OBJ_1(ppp_make_new_obj, ppp_make_new); +MP_DEFINE_CONST_FUN_OBJ_1(esp_network_ppp_make_new_obj, ppp_make_new); static u32_t ppp_output_callback(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) { ppp_if_obj_t *self = ctx; diff --git a/ports/esp32/network_wlan.c b/ports/esp32/network_wlan.c index e4b34b2204fab..aefc4394c2ac3 100644 --- a/ports/esp32/network_wlan.c +++ b/ports/esp32/network_wlan.c @@ -36,6 +36,7 @@ #include "py/objlist.h" #include "py/runtime.h" #include "py/mphal.h" +#include "extmod/modnetwork.h" #include "modnetwork.h" #include "esp_wifi.h" @@ -91,12 +92,8 @@ void network_wlan_event_handler(system_event_t *event) { if (!mdns_initialised) { mdns_init(); #if MICROPY_HW_ENABLE_MDNS_RESPONDER - const char *hostname = NULL; - if (tcpip_adapter_get_hostname(WIFI_IF_STA, &hostname) != ESP_OK || hostname == NULL) { - hostname = "esp32"; - } - mdns_hostname_set(hostname); - mdns_instance_name_set(hostname); + mdns_hostname_set(mod_network_hostname); + mdns_instance_name_set(mod_network_hostname); #endif mdns_initialised = true; } @@ -182,7 +179,7 @@ STATIC mp_obj_t get_wlan(size_t n_args, const mp_obj_t *args) { mp_raise_ValueError(MP_ERROR_TEXT("invalid WLAN interface identifier")); } } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(get_wlan_obj, 0, 1, get_wlan); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_get_wlan_obj, 0, 1, get_wlan); STATIC mp_obj_t network_wlan_active(size_t n_args, const mp_obj_t *args) { wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -260,6 +257,8 @@ STATIC mp_obj_t network_wlan_connect(size_t n_args, const mp_obj_t *pos_args, mp esp_exceptions(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_sta_config)); } + esp_exceptions(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, mod_network_hostname)); + wifi_sta_reconnects = 0; // connect to the WiFi AP MP_THREAD_GIL_EXIT(); @@ -474,8 +473,13 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_ } case MP_QSTR_hostname: case MP_QSTR_dhcp_hostname: { - const char *s = mp_obj_str_get_str(kwargs->table[i].value); - esp_exceptions(tcpip_adapter_set_hostname(self->if_id, s)); + // TODO: Deprecated. Use network.hostname(name) instead. + size_t len; + const char *str = mp_obj_str_get_data(kwargs->table[i].value, &len); + if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + mp_raise_ValueError(NULL); + } + strcpy(mod_network_hostname, str); break; } case MP_QSTR_max_clients: { @@ -568,9 +572,9 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_ } case MP_QSTR_hostname: case MP_QSTR_dhcp_hostname: { - const char *s; - esp_exceptions(tcpip_adapter_get_hostname(self->if_id, &s)); - val = mp_obj_new_str(s, strlen(s)); + // TODO: Deprecated. Use network.hostname() instead. + req_if = WIFI_IF_STA; + val = mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname)); break; } case MP_QSTR_max_clients: { @@ -618,7 +622,7 @@ STATIC const mp_rom_map_elem_t wlan_if_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&network_wlan_scan_obj) }, { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&network_wlan_isconnected_obj) }, { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&network_wlan_config_obj) }, - { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_ifconfig_obj) }, + { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_network_ifconfig_obj) }, }; STATIC MP_DEFINE_CONST_DICT(wlan_if_locals_dict, wlan_if_locals_dict_table); From 6207b605cec6b6499c48a6ea81698076d3aff21a Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Wed, 1 Feb 2023 14:21:23 +1100 Subject: [PATCH 4/9] esp8266: Use extmod/modnetwork.c instead of port-specific version. Rather than duplicating the implementation of `network`, this allows ESP8266 to use the shared one in extmod. In particular this gains access to network.hostname and network.country. Other than adding these two methods, there is no other user-visible change. Signed-off-by: Jim Mussared --- ports/esp8266/Makefile | 2 +- ports/esp8266/boards/esp8266_common.ld | 2 +- ports/esp8266/modnetwork.h | 2 + ports/esp8266/modnetwork_globals.h | 22 ++++++ ports/esp8266/mpconfigport.h | 6 ++ .../esp8266/{modnetwork.c => network_wlan.c} | 67 ++++--------------- 6 files changed, 46 insertions(+), 55 deletions(-) create mode 100644 ports/esp8266/modnetwork.h create mode 100644 ports/esp8266/modnetwork_globals.h rename ports/esp8266/{modnetwork.c => network_wlan.c} (88%) diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile index c5eb63fad6ff6..fb994c752ed71 100644 --- a/ports/esp8266/Makefile +++ b/ports/esp8266/Makefile @@ -106,8 +106,8 @@ SRC_C = \ machine_wdt.c \ machine_hspi.c \ modesp.c \ - modnetwork.c \ modutime.c \ + network_wlan.c \ ets_alt_task.c \ fatfs_port.c \ posix_helpers.c \ diff --git a/ports/esp8266/boards/esp8266_common.ld b/ports/esp8266/boards/esp8266_common.ld index c2d62e9dd4ce6..bccfaa261f998 100644 --- a/ports/esp8266/boards/esp8266_common.ld +++ b/ports/esp8266/boards/esp8266_common.ld @@ -163,12 +163,12 @@ SECTIONS *machine_hspi.o(.literal*, .text*) *hspi.o(.literal*, .text*) *modesp.o(.literal* .text*) - *modnetwork.o(.literal* .text*) *moduos.o(.literal* .text*) *modutime.o(.literal* .text*) *modlwip.o(.literal* .text*) *modsocket.o(.literal* .text*) *modonewire.o(.literal* .text*) + *network_wlan.o(.literal* .text*) *esp_mphal.o(.literal* .text*) /* we put as much rodata as possible in this section */ diff --git a/ports/esp8266/modnetwork.h b/ports/esp8266/modnetwork.h new file mode 100644 index 0000000000000..dc9203b0fb917 --- /dev/null +++ b/ports/esp8266/modnetwork.h @@ -0,0 +1,2 @@ +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_get_wlan_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj); diff --git a/ports/esp8266/modnetwork_globals.h b/ports/esp8266/modnetwork_globals.h new file mode 100644 index 0000000000000..f977cd14e4958 --- /dev/null +++ b/ports/esp8266/modnetwork_globals.h @@ -0,0 +1,22 @@ +{ MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&esp_network_get_wlan_obj) }, +{ MP_ROM_QSTR(MP_QSTR_phy_mode), MP_ROM_PTR(&esp_network_phy_mode_obj) }, + +{ MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(STATION_IF)}, +{ MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(SOFTAP_IF)}, + +{ MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STATION_IDLE)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STATION_CONNECTING)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(STATION_WRONG_PASSWORD)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(STATION_NO_AP_FOUND)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_CONNECT_FAIL), MP_ROM_INT(STATION_CONNECT_FAIL)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STATION_GOT_IP)}, + +{ MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(PHY_MODE_11B) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(PHY_MODE_11G) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(PHY_MODE_11N) }, + +{ MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(AUTH_OPEN) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(AUTH_WEP) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(AUTH_WPA_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(AUTH_WPA2_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(AUTH_WPA_WPA2_PSK) }, diff --git a/ports/esp8266/mpconfigport.h b/ports/esp8266/mpconfigport.h index ded56663b32bf..7576c99a87753 100644 --- a/ports/esp8266/mpconfigport.h +++ b/ports/esp8266/mpconfigport.h @@ -71,6 +71,12 @@ #define MICROPY_PY_MACHINE_SOFTI2C (1) #define MICROPY_PY_MACHINE_SPI (1) #define MICROPY_PY_MACHINE_SOFTSPI (1) +#define MICROPY_PY_NETWORK (1) +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp8266" +#endif +#define MICROPY_PY_NETWORK_INCLUDEFILE "ports/esp8266/modnetwork.h" +#define MICROPY_PY_NETWORK_MODULE_GLOBALS_INCLUDEFILE "ports/esp8266/modnetwork_globals.h" #define MICROPY_PY_UWEBSOCKET (1) #define MICROPY_PY_ONEWIRE (1) #define MICROPY_PY_WEBREPL (1) diff --git a/ports/esp8266/modnetwork.c b/ports/esp8266/network_wlan.c similarity index 88% rename from ports/esp8266/modnetwork.c rename to ports/esp8266/network_wlan.c index 29bdd3a1b7eac..9f89b126f62da 100644 --- a/ports/esp8266/modnetwork.c +++ b/ports/esp8266/network_wlan.c @@ -31,6 +31,7 @@ #include "py/objlist.h" #include "py/runtime.h" #include "py/mphal.h" +#include "extmod/modnetwork.h" #include "shared/netutils/netutils.h" #include "queue.h" #include "user_interface.h" @@ -39,8 +40,6 @@ #include "ets_alt_task.h" #include "lwip/dns.h" -#define MODNETWORK_INCLUDE_CONSTANTS (1) - typedef struct _wlan_if_obj_t { mp_obj_base_t base; int if_id; @@ -71,7 +70,7 @@ STATIC mp_obj_t get_wlan(size_t n_args, const mp_obj_t *args) { } return MP_OBJ_FROM_PTR(&wlan_objs[idx]); } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(get_wlan_obj, 0, 1, get_wlan); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_get_wlan_obj, 0, 1, get_wlan); STATIC mp_obj_t esp_active(size_t n_args, const mp_obj_t *args) { wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -152,6 +151,9 @@ STATIC mp_obj_t esp_connect(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k if (set_config) { error_check(wifi_station_set_config(&config), "Cannot set STA config"); } + + wifi_station_set_hostname(mod_network_hostname); + error_check(wifi_station_connect(), "Cannot connect to AP"); return mp_const_none; @@ -399,11 +401,13 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs } case MP_QSTR_hostname: case MP_QSTR_dhcp_hostname: { - req_if = STATION_IF; - if (self->if_id == STATION_IF) { - const char *s = mp_obj_str_get_str(kwargs->table[i].value); - wifi_station_set_hostname((char *)s); + // TODO: Deprecated. Use network.hostname(name) instead. + size_t len; + const char *str = mp_obj_str_get_data(kwargs->table[i].value, &len); + if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + mp_raise_ValueError(NULL); } + strcpy(mod_network_hostname, str); break; } case MP_QSTR_protocol: { @@ -474,12 +478,8 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs case MP_QSTR_hostname: case MP_QSTR_dhcp_hostname: { req_if = STATION_IF; - char *s = wifi_station_get_hostname(); - if (s == NULL) { - val = MP_OBJ_NEW_QSTR(MP_QSTR_); - } else { - val = mp_obj_new_str(s, strlen(s)); - } + // TODO: Deprecated. Use network.hostname() instead. + val = mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname)); break; } case MP_QSTR_protocol: { @@ -530,43 +530,4 @@ STATIC mp_obj_t esp_phy_mode(size_t n_args, const mp_obj_t *args) { return mp_const_none; } } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_phy_mode_obj, 0, 1, esp_phy_mode); - -STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) }, - { MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&get_wlan_obj) }, - { MP_ROM_QSTR(MP_QSTR_phy_mode), MP_ROM_PTR(&esp_phy_mode_obj) }, - - #if MODNETWORK_INCLUDE_CONSTANTS - { MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(STATION_IF)}, - { MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(SOFTAP_IF)}, - - { MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STATION_IDLE)}, - { MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STATION_CONNECTING)}, - { MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(STATION_WRONG_PASSWORD)}, - { MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(STATION_NO_AP_FOUND)}, - { MP_ROM_QSTR(MP_QSTR_STAT_CONNECT_FAIL), MP_ROM_INT(STATION_CONNECT_FAIL)}, - { MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STATION_GOT_IP)}, - - { MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(PHY_MODE_11B) }, - { MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(PHY_MODE_11G) }, - { MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(PHY_MODE_11N) }, - - { MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(AUTH_OPEN) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(AUTH_WEP) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(AUTH_WPA_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(AUTH_WPA2_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(AUTH_WPA_WPA2_PSK) }, - #endif -}; - -STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table); - -const mp_obj_module_t network_module = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&mp_module_network_globals, -}; - -// Note: This port doesn't define MICROPY_PY_NETWORK so this will not conflict -// with the common implementation provided by extmod/modnetwork.c. -MP_REGISTER_MODULE(MP_QSTR_network, network_module); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj, 0, 1, esp_phy_mode); From bad0098a4954e686cddb9321b4ecdd830d3b036e Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Wed, 1 Feb 2023 14:24:46 +1100 Subject: [PATCH 5/9] stm32: Update to use the open-source lib version of cyw43-driver. This removes the previous WiFi driver from drivers/cyw43 (but leaves behind the BT driver), and makes the stm32 port (i.e. PYBD and Portenta) use the new "lib/cyw43-driver" open-source driver already in use by the rp2 port. Signed-off-by: Jim Mussared --- drivers/cyw43/cyw43.h | 144 -------- drivers/cyw43/cyw43_ctrl.c | 595 --------------------------------- drivers/cyw43/cyw43_ll.h | 135 -------- drivers/cyw43/cyw43_lwip.c | 199 ----------- drivers/cyw43/cywbt.c | 5 +- drivers/cyw43/libcyw43.a | Bin 437538 -> 0 bytes extmod/extmod.mk | 16 +- extmod/modnetwork.c | 2 +- extmod/network_cyw43.c | 42 +-- ports/rp2/CMakeLists.txt | 1 - ports/rp2/main.c | 1 + ports/rp2/mpconfigport.h | 4 - ports/rp2/mpnetworkport.h | 33 ++ ports/stm32/Makefile | 5 +- ports/stm32/cyw43_configport.h | 135 ++++++++ ports/stm32/extint.c | 7 +- ports/stm32/main.c | 4 +- ports/stm32/mpnetworkport.c | 5 +- 18 files changed, 213 insertions(+), 1120 deletions(-) delete mode 100644 drivers/cyw43/cyw43.h delete mode 100644 drivers/cyw43/cyw43_ctrl.c delete mode 100644 drivers/cyw43/cyw43_ll.h delete mode 100644 drivers/cyw43/cyw43_lwip.c delete mode 100644 drivers/cyw43/libcyw43.a create mode 100644 ports/rp2/mpnetworkport.h create mode 100644 ports/stm32/cyw43_configport.h diff --git a/drivers/cyw43/cyw43.h b/drivers/cyw43/cyw43.h deleted file mode 100644 index 5ca4898318a3c..0000000000000 --- a/drivers/cyw43/cyw43.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef MICROPY_INCLUDED_STM32_CYW43_H -#define MICROPY_INCLUDED_STM32_CYW43_H - -#include "lwip/netif.h" -#include "lwip/dhcp.h" -#include "shared/netutils/dhcpserver.h" -#include "drivers/cyw43/cyw43_ll.h" - -// For trace_flags -#define CYW43_TRACE_ASYNC_EV (0x0001) -#define CYW43_TRACE_ETH_TX (0x0002) -#define CYW43_TRACE_ETH_RX (0x0004) -#define CYW43_TRACE_ETH_FULL (0x0008) -#define CYW43_TRACE_MAC (0x0010) - -// Return value of cyw43_wifi_link_status -#define CYW43_LINK_DOWN (0) -#define CYW43_LINK_JOIN (1) -#define CYW43_LINK_NOIP (2) -#define CYW43_LINK_UP (3) -#define CYW43_LINK_FAIL (-1) -#define CYW43_LINK_NONET (-2) -#define CYW43_LINK_BADAUTH (-3) - -#ifndef MICROPY_BOARD_HOSTNAME -#define MICROPY_BOARD_HOSTNAME "PYBD" -#endif - -#ifndef MICROPY_BOARD_HOSTNAME_LENGTH -#define MICROPY_BOARD_HOSTNAME_LENGTH 16 -#endif - -typedef struct _cyw43_t { - cyw43_ll_t cyw43_ll; - - uint8_t itf_state; - uint32_t trace_flags; - - // State for async events - volatile uint32_t wifi_scan_state; - uint32_t wifi_join_state; - void *wifi_scan_env; - int (*wifi_scan_cb)(void*, const cyw43_ev_scan_result_t*); - - // Pending things to do - bool pend_disassoc; - bool pend_rejoin; - bool pend_rejoin_wpa; - - // AP settings - uint8_t ap_channel; - uint8_t ap_auth; - uint8_t ap_ssid_len; - uint8_t ap_key_len; - uint8_t ap_ssid[32]; - uint8_t ap_key[64]; - - // lwIP data - struct netif netif[2]; - struct dhcp dhcp_client; - dhcp_server_t dhcp_server; - char hostname[MICROPY_BOARD_HOSTNAME_LENGTH]; -} cyw43_t; - -extern cyw43_t cyw43_state; -extern void (*cyw43_poll)(void); -extern uint32_t cyw43_sleep; - -void cyw43_init(cyw43_t *self); -void cyw43_deinit(cyw43_t *self); - -int cyw43_ioctl(cyw43_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface); -int cyw43_send_ethernet(cyw43_t *self, int itf, size_t len, const void *buf, bool is_pbuf); - -int cyw43_wifi_pm(cyw43_t *self, uint32_t pm); -int cyw43_wifi_link_status(cyw43_t *self, int itf); -void cyw43_wifi_set_up(cyw43_t *self, int itf, bool up); -int cyw43_wifi_get_mac(cyw43_t *self, int itf, uint8_t mac[6]); -int cyw43_wifi_scan(cyw43_t *self, cyw43_wifi_scan_options_t *opts, void *env, int (*result_cb)(void*, const cyw43_ev_scan_result_t*)); - -static inline bool cyw43_wifi_scan_active(cyw43_t *self) { - return self->wifi_scan_state == 1; -} - -int cyw43_wifi_join(cyw43_t *self, size_t ssid_len, const uint8_t *ssid, size_t key_len, const uint8_t *key, uint32_t auth_type, const uint8_t *bssid, uint32_t channel); -int cyw43_wifi_leave(cyw43_t *self, int itf); - -static inline void cyw43_wifi_ap_get_ssid(cyw43_t *self, size_t *len, const uint8_t **buf) { - *len = self->ap_ssid_len; - *buf = self->ap_ssid; -} - -static inline void cyw43_wifi_ap_set_channel(cyw43_t *self, uint32_t channel) { - self->ap_channel = channel; -} - -static inline void cyw43_wifi_ap_set_ssid(cyw43_t *self, size_t len, const uint8_t *buf) { - self->ap_ssid_len = MIN(len, sizeof(self->ap_ssid)); - memcpy(self->ap_ssid, buf, self->ap_ssid_len); -} - -static inline void cyw43_wifi_ap_set_password(cyw43_t *self, size_t len, const uint8_t *buf) { - self->ap_key_len = MIN(len, sizeof(self->ap_key)); - memcpy(self->ap_key, buf, self->ap_key_len); -} - -static inline void cyw43_wifi_ap_set_auth(cyw43_t *self, uint32_t auth) { - self->ap_auth = auth; -} - -void cyw43_wifi_ap_get_stas(cyw43_t *self, int *num_stas, uint8_t *macs); - -void cyw43_tcpip_init(cyw43_t *self, int itf); -void cyw43_tcpip_deinit(cyw43_t *self, int itf); -void cyw43_tcpip_set_link_up(cyw43_t *self, int itf); -void cyw43_tcpip_set_link_down(cyw43_t *self, int itf); -int cyw43_tcpip_link_status(cyw43_t *self, int itf); - -#endif // MICROPY_INCLUDED_STM32_CYW43_H diff --git a/drivers/cyw43/cyw43_ctrl.c b/drivers/cyw43/cyw43_ctrl.c deleted file mode 100644 index 73e6e5895779e..0000000000000 --- a/drivers/cyw43/cyw43_ctrl.c +++ /dev/null @@ -1,595 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include - -#include "py/mperrno.h" -#include "py/mphal.h" -#include "drivers/cyw43/cyw43.h" -#include "pendsv.h" -#include "sdio.h" - -#define CYW_ENTER MICROPY_PY_LWIP_ENTER -#define CYW_EXIT MICROPY_PY_LWIP_EXIT - -#ifdef pyb_pin_WL_HOST_WAKE -#define USE_SDIOIT (0) -#else -#define USE_SDIOIT (1) -#endif - -#define CYW43_SLEEP_MAX (50) - -#define WIFI_JOIN_STATE_ACTIVE (0x0001) -#define WIFI_JOIN_STATE_FAIL (0x0002) -#define WIFI_JOIN_STATE_NONET (0x0003) -#define WIFI_JOIN_STATE_BADAUTH (0x0004) -#define WIFI_JOIN_STATE_AUTH (0x0200) -#define WIFI_JOIN_STATE_LINK (0x0400) -#define WIFI_JOIN_STATE_KEYED (0x0800) -#define WIFI_JOIN_STATE_ALL (0x0e01) - -#define CYW43_STA_IS_ACTIVE(self) (((self)->itf_state >> CYW43_ITF_STA) & 1) -#define CYW43_AP_IS_ACTIVE(self) (((self)->itf_state >> CYW43_ITF_AP) & 1) - -cyw43_t cyw43_state; -void (*cyw43_poll)(void); -uint32_t cyw43_sleep; - -STATIC void cyw43_poll_func(void); -STATIC void cyw43_wifi_ap_init(cyw43_t *self); -STATIC void cyw43_wifi_ap_set_up(cyw43_t *self, bool up); - -static inline uint32_t cyw43_get_be16(const uint8_t *buf) { - return buf[0] << 8 | buf[1]; -} - -static inline uint32_t cyw43_get_be32(const uint8_t *buf) { - return buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]; -} - -static inline void cyw43_delay_ms(uint32_t ms) { - mp_hal_delay_ms(ms); -} - -/*******************************************************************************/ -// Initialisation and polling - -void cyw43_init(cyw43_t *self) { - #ifdef pyb_pin_WL_HOST_WAKE - mp_hal_pin_config(pyb_pin_WL_HOST_WAKE, MP_HAL_PIN_MODE_INPUT, MP_HAL_PIN_PULL_NONE, 0); - #endif - mp_hal_pin_config(pyb_pin_WL_REG_ON, MP_HAL_PIN_MODE_OUTPUT, MP_HAL_PIN_PULL_NONE, 0); - mp_hal_pin_low(pyb_pin_WL_REG_ON); - #ifdef pyb_pin_WL_RFSW_VDD - mp_hal_pin_config(pyb_pin_WL_RFSW_VDD, MP_HAL_PIN_MODE_OUTPUT, MP_HAL_PIN_PULL_NONE, 0); // RF-switch power - mp_hal_pin_low(pyb_pin_WL_RFSW_VDD); - #endif - - cyw43_ll_init(&self->cyw43_ll, self); - - self->itf_state = 0; - self->wifi_scan_state = 0; - self->wifi_join_state = 0; - self->pend_disassoc = false; - self->pend_rejoin= false; - self->pend_rejoin_wpa = false; - self->ap_channel = 3; - self->ap_ssid_len = 0; - self->ap_key_len = 0; - strncpy(self->hostname, MICROPY_BOARD_HOSTNAME, MICROPY_BOARD_HOSTNAME_LENGTH); - self->hostname[MICROPY_BOARD_HOSTNAME_LENGTH - 1] = 0; - - cyw43_poll = NULL; -} - -void cyw43_deinit(cyw43_t *self) { - if (cyw43_poll == NULL) { - return; - } - - CYW_ENTER - - // Stop the TCP/IP network interfaces. - cyw43_tcpip_deinit(self, 0); - cyw43_tcpip_deinit(self, 1); - - // Turn off the SDIO bus. - #if USE_SDIOIT - sdio_enable_irq(false); - #endif - sdio_deinit(); - - // Power off the WLAN chip and make sure all state is reset. - cyw43_init(self); - - CYW_EXIT -} - -STATIC int cyw43_ensure_up(cyw43_t *self) { - if (cyw43_poll != NULL) { - cyw43_ll_bus_sleep(&self->cyw43_ll, false); - return 0; - } - - CYW_ENTER - - // Disable the netif if it was previously up - cyw43_tcpip_deinit(self, CYW43_ITF_STA); - cyw43_tcpip_deinit(self, CYW43_ITF_AP); - self->itf_state = 0; - - // Reset and power up the WL chip - mp_hal_pin_low(pyb_pin_WL_REG_ON); - cyw43_delay_ms(20); - mp_hal_pin_high(pyb_pin_WL_REG_ON); - cyw43_delay_ms(50); - - // Initialise SDIO bus - // IRQ priority only needs to be higher than CYW_ENTER/EXIT protection (PENDSV) - sdio_init(NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 14, 0)); - - // Initialise the low-level driver - uint8_t mac[6]; - mp_hal_get_mac(MP_HAL_MAC_WLAN0, mac); - int ret = cyw43_ll_bus_init(&self->cyw43_ll, mac); - - if (ret != 0) { - CYW_EXIT - return ret; - } - - // Enable async events from low-level driver - cyw43_sleep = CYW43_SLEEP_MAX; - cyw43_poll = cyw43_poll_func; - #if USE_SDIOIT - sdio_enable_irq(true); - #else - extern void extint_set(const pin_obj_t *pin, uint32_t mode); - extint_set(pyb_pin_WL_HOST_WAKE, GPIO_MODE_IT_FALLING); - #endif - - CYW_EXIT - - return ret; -} - -// This function must always be executed at the level where CYW_ENTER is effectively active -STATIC void cyw43_poll_func(void) { - if (cyw43_poll == NULL) { - // Poll scheduled during deinit, just ignore it - return; - } - - cyw43_t *self = &cyw43_state; - cyw43_ll_process_packets(&self->cyw43_ll); - - if (self->pend_disassoc) { - self->pend_disassoc = false; - cyw43_ll_ioctl(&self->cyw43_ll, CYW43_IOCTL_SET_DISASSOC, 0, NULL, CYW43_ITF_STA); - } - - if (self->pend_rejoin_wpa) { - self->pend_rejoin_wpa = false; - cyw43_ll_wifi_set_wpa_auth(&self->cyw43_ll); - } - - if (self->pend_rejoin) { - self->pend_rejoin = false; - cyw43_ll_wifi_rejoin(&self->cyw43_ll); - self->wifi_join_state = WIFI_JOIN_STATE_ACTIVE; - } - - if (cyw43_sleep == 0) { - cyw43_ll_bus_sleep(&self->cyw43_ll, true); - #if !USE_SDIOIT - sdio_deinit(); // save power while WLAN bus sleeps - #endif - } - - #if USE_SDIOIT - sdio_enable_irq(true); - #endif -} - -/*******************************************************************************/ -// Callback interface to low-level driver - -int cyw43_cb_read_host_interrupt_pin(void *cb_data) { - #ifdef pyb_pin_WL_HOST_WAKE - return mp_hal_pin_read(pyb_pin_WL_HOST_WAKE); - #else - return mp_hal_pin_read(pyb_pin_WL_SDIO_1); - #endif -} - -void cyw43_cb_ensure_awake(void *cb_data) { - cyw43_sleep = CYW43_SLEEP_MAX; - #if !USE_SDIOIT - sdio_reenable(); - #endif -} - -STATIC const char *cyw43_async_event_name_table[89] = { - [0 ... 88] = NULL, - [CYW43_EV_SET_SSID] = "SET_SSID", - [CYW43_EV_JOIN] = "JOIN", - [CYW43_EV_AUTH] = "AUTH", - [CYW43_EV_DEAUTH_IND] = "DEAUTH_IND", - [CYW43_EV_ASSOC] = "ASSOC", - [CYW43_EV_DISASSOC] = "DISASSOC", - [CYW43_EV_DISASSOC_IND] = "DISASSOC_IND", - [CYW43_EV_LINK] = "LINK", - [CYW43_EV_PSK_SUP] = "PSK_SUP", - [CYW43_EV_ESCAN_RESULT] = "ESCAN_RESULT", - [CYW43_EV_CSA_COMPLETE_IND] = "CSA_COMPLETE_IND", - [CYW43_EV_ASSOC_REQ_IE] = "ASSOC_REQ_IE", - [CYW43_EV_ASSOC_RESP_IE] = "ASSOC_RESP_IE", -}; - -STATIC void cyw43_dump_async_event(const cyw43_async_event_t *ev) { - printf("[% 8d] ASYNC(%04x,", - (int)mp_hal_ticks_ms(), - (unsigned int)ev->flags - ); - if (ev->event_type < MP_ARRAY_SIZE(cyw43_async_event_name_table) - && cyw43_async_event_name_table[ev->event_type] != NULL) { - printf("%s", cyw43_async_event_name_table[ev->event_type]); - } else { - printf("%u", (unsigned int)ev->event_type); - } - printf(",%u,%u,%u)\n", - (unsigned int)ev->status, - (unsigned int)ev->reason, - (unsigned int)ev->interface - ); -} - -void cyw43_cb_process_async_event(void *cb_data, const cyw43_async_event_t *ev) { - cyw43_t *self = cb_data; - - if (self->trace_flags & CYW43_TRACE_ASYNC_EV) { - cyw43_dump_async_event(ev); - } - - if (ev->event_type == CYW43_EV_ESCAN_RESULT && self->wifi_scan_state == 1) { - // Escan result event - if (ev->status == 8) { - // Partial result - int ret = self->wifi_scan_cb(self->wifi_scan_env, &ev->u.scan_result); - if (ret != 0) { - // TODO need to abort scan, or just ignore any more results - } - } else if (ev->status == 0) { - // Scan complete - self->wifi_scan_state = 2; - } - - } else if (ev->event_type == CYW43_EV_DISASSOC) { - cyw43_tcpip_set_link_down(self, CYW43_ITF_STA); - self->wifi_join_state = 0x0000; - - /* - } else if (ev->event_type == CYW43_EV_DISASSOC_IND) { - if (ev->interface == CYW43_ITF_AP) { - // Station disassociated with our AP, let DHCP server know so it can free the IP address - dhcp_server_disassoc(&self->dhcp_server, buf + 24); - } - */ - - // WiFi join events - } else if (ev->event_type == CYW43_EV_PRUNE) { - if (ev->status == 0 && ev->reason == 8) { - // RSN mismatch, retry join with WPA auth - self->pend_rejoin = true; - self->pend_rejoin_wpa = true; - pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll_func); - } - } else if (ev->event_type == CYW43_EV_SET_SSID) { - if (ev->status == 0) { - // Success setting SSID - } else if (ev->status == 3 && ev->reason == 0) { - self->wifi_join_state = WIFI_JOIN_STATE_NONET; - // No matching SSID found (could be out of range, or down) - } else { - // Other failure setting SSID - self->wifi_join_state = WIFI_JOIN_STATE_FAIL; - } - } else if (ev->event_type == CYW43_EV_AUTH) { - if (ev->status == 0) { - self->wifi_join_state |= WIFI_JOIN_STATE_AUTH; - } else if (ev->status == 6) { - // Unsolicited auth packet, ignore it - } else { - // Cannot authenticate - self->wifi_join_state = WIFI_JOIN_STATE_BADAUTH; - } - } else if (ev->event_type == CYW43_EV_DEAUTH_IND) { - if (ev->status == 0 && ev->reason == 2) { - // Deauth, probably because password was wrong; disassociate - self->pend_disassoc = true; - pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll_func); - } - } else if (ev->event_type == CYW43_EV_LINK) { - if (ev->status == 0) { - if (ev->flags & 1) { - // Link is up - if (ev->interface == CYW43_ITF_STA) { - self->wifi_join_state |= WIFI_JOIN_STATE_LINK; - } else { - cyw43_tcpip_set_link_up(self, ev->interface); - } - } else { - // Link is down - cyw43_tcpip_set_link_down(self, ev->interface); - } - } - } else if (ev->event_type == CYW43_EV_PSK_SUP) { - if (ev->status == 6) { // WLC_SUP_KEYED - self->wifi_join_state |= WIFI_JOIN_STATE_KEYED; - } else if ((ev->status == 4 || ev->status == 8 || ev->status == 11) && ev->reason == 15) { - // Timeout waiting for key exchange M1/M3/G1 - // Probably at edge of the cell, retry - self->pend_rejoin = true; - pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll_func); - } else { - // PSK_SUP failure - self->wifi_join_state = WIFI_JOIN_STATE_BADAUTH; - } - } - - if (self->wifi_join_state == WIFI_JOIN_STATE_ALL) { - // STA connected - self->wifi_join_state = WIFI_JOIN_STATE_ACTIVE; - cyw43_tcpip_set_link_up(self, CYW43_ITF_STA); - } -} - -/*******************************************************************************/ -// Ioctl and Ethernet interface - -int cyw43_ioctl(cyw43_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface) { - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - CYW_ENTER - ret = cyw43_ll_ioctl(&self->cyw43_ll, cmd, len, buf, iface); - CYW_EXIT - - return ret; -} - -int cyw43_send_ethernet(cyw43_t *self, int itf, size_t len, const void *buf, bool is_pbuf) { - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - CYW_ENTER - ret = cyw43_ll_send_ethernet(&self->cyw43_ll, itf, len, buf, is_pbuf); - CYW_EXIT - - return ret; -} - -/*******************************************************************************/ -// WiFi control - -STATIC int cyw43_wifi_on(cyw43_t *self, uint32_t country) { - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - #ifdef pyb_pin_WL_RFSW_VDD - // Turn the RF-switch on - mp_hal_pin_high(pyb_pin_WL_RFSW_VDD); - #endif - - CYW_ENTER - ret = cyw43_ll_wifi_on(&self->cyw43_ll, country); - CYW_EXIT - - return ret; -} - -int cyw43_wifi_pm(cyw43_t *self, uint32_t pm_in) { - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - // pm_in: 0x00adbrrm - uint32_t pm = pm_in & 0xf; - uint32_t pm_sleep_ret = (pm_in >> 4) & 0xff; - uint32_t li_bcn = (pm_in >> 12) & 0xf; - uint32_t li_dtim = (pm_in >> 16) & 0xf; - uint32_t li_assoc = (pm_in >> 20) & 0xf; - - CYW_ENTER - ret = cyw43_ll_wifi_pm(&self->cyw43_ll, pm, pm_sleep_ret, li_bcn, li_dtim, li_assoc); - CYW_EXIT - - return ret; -} - -int cyw43_wifi_get_mac(cyw43_t *self, int itf, uint8_t mac[6]) { - mp_hal_get_mac(MP_HAL_MAC_WLAN0, &mac[0]); - return 0; -} - -#define MAKE_COUNTRY(a, b, rev) ((a) | (b) << 8 | (rev) << 16) - -void cyw43_wifi_set_up(cyw43_t *self, int itf, bool up) { - if (up) { - if (self->itf_state == 0) { - uint32_t country; - extern char pyb_country_code[2]; - if (pyb_country_code[0] == '\0' || pyb_country_code[1] == '\0') { - country = MAKE_COUNTRY('X', 'X', 17); // default to world-wide (passive ch 12-14) - } else { - country = MAKE_COUNTRY(pyb_country_code[0], pyb_country_code[1], 0); - } - if (cyw43_wifi_on(self, country) != 0) { - return; - } - cyw43_wifi_pm(self, 10 << 20 | 1 << 16 | 1 << 12 | 20 << 4 | 2); - } - if (itf == CYW43_ITF_AP) { - cyw43_wifi_ap_init(self); - cyw43_wifi_ap_set_up(self, true); - } - if ((self->itf_state & (1 << itf)) == 0) { - CYW_ENTER - cyw43_tcpip_deinit(self, itf); - cyw43_tcpip_init(self, itf); - self->itf_state |= 1 << itf; - CYW_EXIT - } - } else { - if (itf == CYW43_ITF_AP) { - cyw43_wifi_ap_set_up(self, false); - } - } -} - -int cyw43_wifi_scan(cyw43_t *self, cyw43_wifi_scan_options_t *opts, void *env, int (*result_cb)(void*, const cyw43_ev_scan_result_t*)) { - if (self->itf_state == 0) { - return -MP_EPERM; - } - - cyw43_ensure_up(self); - - CYW_ENTER - - // Set state and callback data - self->wifi_scan_state = 1; - self->wifi_scan_env = env; - self->wifi_scan_cb = result_cb; - - // Start the scan - int ret = cyw43_ll_wifi_scan(&self->cyw43_ll, opts); - - CYW_EXIT - - return ret; -} - -int cyw43_wifi_link_status(cyw43_t *self, int itf) { - if (itf == CYW43_ITF_STA) { - int s = self->wifi_join_state & 0xf; - if (s == WIFI_JOIN_STATE_ACTIVE) { - return CYW43_LINK_JOIN; - } else if (s == WIFI_JOIN_STATE_FAIL) { - return CYW43_LINK_FAIL; - } else if (s == WIFI_JOIN_STATE_NONET) { - return CYW43_LINK_NONET; - } else if (s == WIFI_JOIN_STATE_BADAUTH) { - return CYW43_LINK_BADAUTH; - } else { - return CYW43_LINK_DOWN; - } - } else { - return CYW43_LINK_DOWN; - } -} - -/*******************************************************************************/ -// WiFi STA - -int cyw43_wifi_join(cyw43_t *self, size_t ssid_len, const uint8_t *ssid, size_t key_len, const uint8_t *key, uint32_t auth_type, const uint8_t *bssid, uint32_t channel) { - if (!CYW43_STA_IS_ACTIVE(self)) { - return -MP_EPERM; - } - - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - CYW_ENTER - - ret = cyw43_ll_wifi_join(&self->cyw43_ll, ssid_len, ssid, key_len, key, auth_type, bssid, channel); - - if (ret == 0) { - // Wait for responses: EV_AUTH, EV_LINK, EV_SET_SSID, EV_PSK_SUP - // Will get EV_DEAUTH_IND if password is invalid - self->wifi_join_state = WIFI_JOIN_STATE_ACTIVE; - - if (auth_type == 0) { - // For open security we don't need EV_PSK_SUP, so set that flag indicator now - self->wifi_join_state |= WIFI_JOIN_STATE_KEYED; - } - } - - CYW_EXIT - - return ret; -} - -int cyw43_wifi_leave(cyw43_t *self, int itf) { - // Disassociate with SSID - return cyw43_ioctl(self, CYW43_IOCTL_SET_DISASSOC, 0, NULL, itf); -} - -/*******************************************************************************/ -// WiFi AP - -STATIC void cyw43_wifi_ap_init(cyw43_t *self) { - int ret = cyw43_ensure_up(self); - if (ret) { - return; - } - - CYW_ENTER - cyw43_ll_wifi_ap_init(&self->cyw43_ll, self->ap_ssid_len, self->ap_ssid, self->ap_auth, self->ap_key_len, self->ap_key, self->ap_channel); - CYW_EXIT -} - -STATIC void cyw43_wifi_ap_set_up(cyw43_t *self, bool up) { - int ret = cyw43_ensure_up(self); - if (ret) { - return; - } - - CYW_ENTER - cyw43_ll_wifi_ap_set_up(&self->cyw43_ll, up); - CYW_EXIT -} - -void cyw43_wifi_ap_get_stas(cyw43_t *self, int *num_stas, uint8_t *macs) { - int ret = cyw43_ensure_up(self); - if (ret) { - return; - } - - CYW_ENTER - cyw43_ll_wifi_ap_get_stas(&self->cyw43_ll, num_stas, macs); - CYW_EXIT -} diff --git a/drivers/cyw43/cyw43_ll.h b/drivers/cyw43/cyw43_ll.h deleted file mode 100644 index 879367a2edd9e..0000000000000 --- a/drivers/cyw43/cyw43_ll.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef MICROPY_INCLUDED_STM32_CYW43_LL_H -#define MICROPY_INCLUDED_STM32_CYW43_LL_H - -// IOCTL commands -#define CYW43_IOCTL_GET_SSID (0x32) -#define CYW43_IOCTL_GET_CHANNEL (0x3a) -#define CYW43_IOCTL_SET_DISASSOC (0x69) -#define CYW43_IOCTL_GET_ANTDIV (0x7e) -#define CYW43_IOCTL_SET_ANTDIV (0x81) -#define CYW43_IOCTL_SET_MONITOR (0xd9) -#define CYW43_IOCTL_GET_VAR (0x20c) -#define CYW43_IOCTL_SET_VAR (0x20f) - -// Async events, event_type field -#define CYW43_EV_SET_SSID (0) -#define CYW43_EV_JOIN (1) -#define CYW43_EV_AUTH (3) -#define CYW43_EV_DEAUTH_IND (6) -#define CYW43_EV_ASSOC (7) -#define CYW43_EV_DISASSOC (11) -#define CYW43_EV_DISASSOC_IND (12) -#define CYW43_EV_LINK (16) -#define CYW43_EV_PRUNE (23) -#define CYW43_EV_PSK_SUP (46) -#define CYW43_EV_ESCAN_RESULT (69) -#define CYW43_EV_CSA_COMPLETE_IND (80) -#define CYW43_EV_ASSOC_REQ_IE (87) -#define CYW43_EV_ASSOC_RESP_IE (88) - -enum { - CYW43_ITF_STA, - CYW43_ITF_AP, -}; - -typedef struct _cyw43_ev_scan_result_t { - uint32_t _0[5]; - uint8_t bssid[6]; - uint16_t _1[2]; - uint8_t ssid_len; - uint8_t ssid[32]; - uint32_t _2[5]; - uint16_t channel; - uint16_t _3; - uint8_t auth_mode; - int16_t rssi; -} cyw43_ev_scan_result_t; - -typedef struct _cyw43_async_event_t { - uint16_t _0; - uint16_t flags; - uint32_t event_type; - uint32_t status; - uint32_t reason; - uint8_t _1[30]; - uint8_t interface; - uint8_t _2; - union { - cyw43_ev_scan_result_t scan_result; - } u; -} cyw43_async_event_t; - -typedef struct _cyw43_wifi_scan_options_t { - uint32_t version; - uint16_t action; - uint16_t _; - uint32_t ssid_len; // 0 to select all - uint8_t ssid[32]; - uint8_t bssid[6]; - int8_t bss_type; // fill with 0xff to select all - int8_t scan_type; // 0=active, 1=passive - int32_t nprobes; - int32_t active_time; - int32_t passive_time; - int32_t home_time; - int32_t channel_num; - uint16_t channel_list[1]; -} cyw43_wifi_scan_options_t; - -typedef struct _cyw43_ll_t { - uint32_t opaque[528]; -} cyw43_ll_t; - -void cyw43_ll_init(cyw43_ll_t *self, void *cb_data); -void cyw43_ll_deinit(cyw43_ll_t *self); - -int cyw43_ll_bus_init(cyw43_ll_t *self, const uint8_t *mac); -void cyw43_ll_bus_sleep(cyw43_ll_t *self, bool can_sleep); -void cyw43_ll_process_packets(cyw43_ll_t *self); -int cyw43_ll_ioctl(cyw43_ll_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface); -int cyw43_ll_send_ethernet(cyw43_ll_t *self, int itf, size_t len, const void *buf, bool is_pbuf); - -int cyw43_ll_wifi_on(cyw43_ll_t *self, uint32_t country); -int cyw43_ll_wifi_pm(cyw43_ll_t *self, uint32_t pm, uint32_t pm_sleep_ret, uint32_t li_bcn, uint32_t li_dtim, uint32_t li_assoc); -int cyw43_ll_wifi_scan(cyw43_ll_t *self, cyw43_wifi_scan_options_t *opts); - -int cyw43_ll_wifi_join(cyw43_ll_t *self, size_t ssid_len, const uint8_t *ssid, size_t key_len, const uint8_t *key, uint32_t auth_type, const uint8_t *bssid, uint32_t channel); -void cyw43_ll_wifi_set_wpa_auth(cyw43_ll_t *self); -void cyw43_ll_wifi_rejoin(cyw43_ll_t *self); - -int cyw43_ll_wifi_ap_init(cyw43_ll_t *self, size_t ssid_len, const uint8_t *ssid, uint32_t auth, size_t key_len, const uint8_t *key, uint32_t channel); -int cyw43_ll_wifi_ap_set_up(cyw43_ll_t *self, bool up); -int cyw43_ll_wifi_ap_get_stas(cyw43_ll_t *self, int *num_stas, uint8_t *macs); - -// Callbacks to be provided by mid-level interface -int cyw43_cb_read_host_interrupt_pin(void *cb_data); -void cyw43_cb_ensure_awake(void *cb_data); -void cyw43_cb_process_async_event(void *cb_data, const cyw43_async_event_t *ev); -void cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len, const uint8_t *buf); - -#endif // MICROPY_INCLUDED_STM32_CYW43_LL_H diff --git a/drivers/cyw43/cyw43_lwip.c b/drivers/cyw43/cyw43_lwip.c deleted file mode 100644 index f12a378c5da6d..0000000000000 --- a/drivers/cyw43/cyw43_lwip.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include - -#include "py/mphal.h" -#include "shared/netutils/netutils.h" -#include "lwip/etharp.h" -#include "lwip/dns.h" -#include "lwip/apps/mdns.h" -#include "drivers/cyw43/cyw43.h" - -STATIC void cyw43_ethernet_trace(cyw43_t *self, struct netif *netif, size_t len, const void *data, unsigned int flags) { - bool is_tx = flags & NETUTILS_TRACE_IS_TX; - if ((is_tx && (self->trace_flags & CYW43_TRACE_ETH_TX)) - || (!is_tx && (self->trace_flags & CYW43_TRACE_ETH_RX))) { - const uint8_t *buf; - if (len == (size_t)-1) { - // data is a pbuf - const struct pbuf *pbuf = data; - buf = pbuf->payload; - len = pbuf->len; // restricted to print only the first chunk of the pbuf - } else { - // data is actual data buffer - buf = data; - } - - if (self->trace_flags & CYW43_TRACE_MAC) { - printf("[% 8d] ETH%cX itf=%c%c len=%u", (int)mp_hal_ticks_ms(), is_tx ? 'T' : 'R', netif->name[0], netif->name[1], len); - printf(" MAC type=%d subtype=%d data=", buf[0] >> 2 & 3, buf[0] >> 4); - for (size_t i = 0; i < len; ++i) { - printf(" %02x", buf[i]); - } - printf("\n"); - return; - } - - if (self->trace_flags & CYW43_TRACE_ETH_FULL) { - flags |= NETUTILS_TRACE_PAYLOAD; - } - netutils_ethernet_trace(MP_PYTHON_PRINTER, len, buf, flags); - } -} - -STATIC err_t cyw43_netif_output(struct netif *netif, struct pbuf *p) { - cyw43_t *self = netif->state; - if (self->trace_flags != 0) { - cyw43_ethernet_trace(self, netif, (size_t)-1, p, NETUTILS_TRACE_IS_TX | NETUTILS_TRACE_NEWLINE); - } - int itf = netif->name[1] - '0'; - int ret = cyw43_send_ethernet(self, itf, p->tot_len, (void*)p, true); - if (ret) { - printf("[CYW43] send_ethernet failed: %d\n", ret); - return ERR_IF; - } - return ERR_OK; -} - -STATIC err_t cyw43_netif_init(struct netif *netif) { - netif->linkoutput = cyw43_netif_output; - netif->output = etharp_output; - netif->mtu = 1500; - netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP; - cyw43_wifi_get_mac(netif->state, netif->name[1] - '0', netif->hwaddr); - netif->hwaddr_len = sizeof(netif->hwaddr); - return ERR_OK; -} - -void cyw43_tcpip_init(cyw43_t *self, int itf) { - ip_addr_t ipconfig[4]; - #if LWIP_IPV6 - #define IP(x) ((x).u_addr.ip4) - #else - #define IP(x) (x) - #endif - if (itf == 0) { - // need to zero out to get isconnected() working - IP4_ADDR(&IP(ipconfig[0]), 0, 0, 0, 0); - IP4_ADDR(&IP(ipconfig[2]), 192, 168, 0, 1); - } else { - IP4_ADDR(&IP(ipconfig[0]), 192, 168, 4, 1); - IP4_ADDR(&IP(ipconfig[2]), 192, 168, 4, 1); - } - IP4_ADDR(&IP(ipconfig[1]), 255, 255, 255, 0); - IP4_ADDR(&IP(ipconfig[3]), 8, 8, 8, 8); - #undef IP - - struct netif *n = &self->netif[itf]; - n->name[0] = 'w'; - n->name[1] = '0' + itf; - #if LWIP_IPV6 - netif_add(n, &ipconfig[0].u_addr.ip4, &ipconfig[1].u_addr.ip4, &ipconfig[2].u_addr.ip4, self, cyw43_netif_init, ethernet_input); - #else - netif_add(n, &ipconfig[0], &ipconfig[1], &ipconfig[2], self, cyw43_netif_init, netif_input); - #endif - netif_set_hostname(n, self->hostname); - netif_set_default(n); - netif_set_up(n); - - if (itf == CYW43_ITF_STA) { - dns_setserver(0, &ipconfig[3]); - dhcp_set_struct(n, &self->dhcp_client); - dhcp_start(n); - } else { - dhcp_server_init(&self->dhcp_server, &ipconfig[0], &ipconfig[1]); - } - - #if LWIP_MDNS_RESPONDER - // TODO better to call after IP address is set - char mdns_hostname[9]; - int len = MIN(strlen(self->hostname), 4); - memcpy(&mdns_hostname[0], self->hostname, len); - mp_hal_get_mac_ascii(MP_HAL_MAC_WLAN0, 4 + len, 8 - len, &mdns_hostname[len]); - mdns_hostname[8] = '\0'; - mdns_resp_add_netif(n, mdns_hostname, 60); - #endif -} - -void cyw43_tcpip_deinit(cyw43_t *self, int itf) { - struct netif *n = &self->netif[itf]; - if (itf == CYW43_ITF_STA) { - dhcp_stop(n); - } else { - dhcp_server_deinit(&self->dhcp_server); - } - #if LWIP_MDNS_RESPONDER - mdns_resp_remove_netif(n); - #endif - for (struct netif *netif = netif_list; netif != NULL; netif = netif->next) { - if (netif == n) { - netif_remove(netif); - netif->ip_addr.addr = 0; - netif->flags = 0; - } - } -} - -void cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len, const uint8_t *buf) { - cyw43_t *self = cb_data; - struct netif *netif = &self->netif[itf]; - if (self->trace_flags) { - cyw43_ethernet_trace(self, netif, len, buf, NETUTILS_TRACE_NEWLINE); - } - if (netif->flags & NETIF_FLAG_LINK_UP) { - struct pbuf *p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); - if (p != NULL) { - pbuf_take(p, buf, len); - if (netif->input(p, netif) != ERR_OK) { - pbuf_free(p); - } - } - } -} - -void cyw43_tcpip_set_link_up(cyw43_t *self, int itf) { - netif_set_link_up(&self->netif[itf]); -} - -void cyw43_tcpip_set_link_down(cyw43_t *self, int itf) { - netif_set_link_down(&self->netif[itf]); -} - -int cyw43_tcpip_link_status(cyw43_t *self, int itf) { - struct netif *netif = &self->netif[itf]; - if ((netif->flags & (NETIF_FLAG_UP | NETIF_FLAG_LINK_UP)) - == (NETIF_FLAG_UP | NETIF_FLAG_LINK_UP)) { - if (netif->ip_addr.addr != 0) { - return CYW43_LINK_UP; - } else { - return CYW43_LINK_NOIP; - } - } else { - return cyw43_wifi_link_status(self, itf); - } -} diff --git a/drivers/cyw43/cywbt.c b/drivers/cyw43/cywbt.c index e394e02b33f9e..d0e0aac009c7b 100644 --- a/drivers/cyw43/cywbt.c +++ b/drivers/cyw43/cywbt.c @@ -35,8 +35,7 @@ #if MICROPY_PY_NETWORK_CYW43 -extern const char fw_4343WA1_7_45_98_50_start; -#define CYWBT_FW_ADDR (&fw_4343WA1_7_45_98_50_start + 749 * 512 + 29 * 256) +#include "lib/cyw43-driver/firmware/cyw43_btfw_4343A1.h" // Provided by the port. extern pyb_uart_obj_t mp_bluetooth_hci_uart_obj; @@ -195,7 +194,7 @@ int mp_bluetooth_hci_controller_init(void) { cywbt_set_baudrate(MICROPY_HW_BLE_UART_BAUDRATE_SECONDARY); mp_bluetooth_hci_uart_set_baudrate(MICROPY_HW_BLE_UART_BAUDRATE_SECONDARY); - cywbt_download_firmware((const uint8_t*)CYWBT_FW_ADDR); + cywbt_download_firmware((const uint8_t*)&cyw43_btfw_4343A1[0]); // Reset cywbt_hci_cmd(0x03, 0x0003, 0, NULL); diff --git a/drivers/cyw43/libcyw43.a b/drivers/cyw43/libcyw43.a deleted file mode 100644 index 7d0ff93dcbe686e225efd2e119694d13e36ece5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437538 zcmeFa2~<>9+BUk+IaO3qfEJ>r1c#!^p#U+(pyJqNfd>?gsOiLLIusP>K~XAz35g~F zH3?++gJKet3??Ss4oSB-d@V6FCMIb!eO=|y4Gyu4NpMIy2gRJDAa$R8PLU9Af8T%C z`tSPxyYA{@z4botyWc(U{qB7RcEwK3D|HLg4R@M<{jv8ERowU6Y)(x}4O+Migpepg z*oXetD1I*?D!CtdI5j1=xHz|HRZ%(lSt=;}wOm%Xsvx(pTqrDERoKVOQ(EFKEGx_P zPmOyFYzp&5q+|~k0=FrlFR`)4)uYMWyW#xHgWa-1XsVS)` z_s&SlotT?CK6g@D?sz*5DlPvn!qArgMMzoEqlJXrdHVqAGd}(mOiJt3x(sR$mKK(k ztS)sIjw`t{s6h|AS5Aa%{;x*cgj98uCE1fxRU4P#iJ5bFhG8)1)DJ^!KD;i!!s#(7_tCR}9>1&hX<2750QM@7V;MPh+`{-!YWdme}+y zJNe&c{H=Wl-_=f9Xp=b-#Qo2u-*Wws8jL*2tlxkj%oiHe5BK&J8*2T^D-$-H9IfQh-G%o5XlUhzP{;ISwpxzzmqjxX$N9E0~ws4 zq=`5 zN3Vy044}kI(!5H35I=(N$HyJoem$!!Dr2AAZ~J@KZ$7~utCJ(FTN{UG(Gr!2v^>oh z#TP=+3U6HrMKARP7Bz-;FrlB#>}NSUpD4{b<|Id~-2YFSLHr zPF*DZhzCfAUV8`s1}|%+uTg z()0i`j^-8SvqL&VW~jM_(2+Z=E|=5Eqh@@G*gF<=x$PUF>B z9#G^TdWePF&7u#Cyv7=kCiXPT;l^gUpLzaemNWR=t2KTi&{kn=|M0QY)7fE9y8+$50mOZXy;V@(t_Zwp#gg*>q?Av$4+} zOW(A2qw@h@SX^$K>xs>>*-XU#tOn9*+ENKdI>d(cBzv2Gc9uxPQw)W@EMNd1Y`%+Vl{DtVxqf=aC zUB7QP#-+7=^Tg1MuPZcH*0Gx8;|O`9BK`6QWht(B*GmXbX#4t!=!_E;?3E3{@W?gQ zaaP~_HN|mepKopGp~%OKal?J{A2Y?p_)Jqw$tkY$?Ij{Z9>zCI%JI#S2l1^TtMIKQ zEASmc1bpjAA-?q_AK#%Q7k&@5H9d|ok$6d*H;iAu=E*%8zJ|Ypk7;tQ;nr+*PW93D z-gf;++B*K6{QjOD9ozI&6E}O?6+IWi*EvJl_V9YE#xh#zL$vKKb|>v!f?m@3&R$}f zfb@@U2BU<=dt=Rzru;Qlq}<>4`zwZ!2WE!0xz||M+z}kFD~VR|QTCS4+jSk`TvG?z zAKsWHFE;EAZ|N5s9?O^$Do>}csI;!R^dK9X@F0`&q^zyo^<{))dG&JRt|@csFH*GWk&KcbZ@BBKt=BP&zwi-+#p>yS0~ zJLK@G5e*J`oN>6h8`WZog`r_wrTI!s(hhmoZtKOp4?sP3HnTrF*(=k`!( z+Z6-JnyGI~;hp>>KBl*B+J1g!SCJCy!5%HYsEKT4w(NC=*V|f>mDaKGs)uH5p=ddR zmYe)@%h_9e?W|4jGYbfbiWQ0T)BZHCtL?-lo@V$(N(xs{=j*8Jh&OcPQ>9<8Ws;6m zjh5H*Tlh_UwPKYyG=!hQPY(9UeBM7KAbsCeHq3EVH-L?`@n2pdvjS34fTex$bmAp7 zjgZ^Y(Ei`j_^eA9Hj6i7Rrt7zSk=_*G_`bXM=1Kl5lm5ncTUyz!>Xm>BNeapZkNWI z%(Jm(YJG1&N(gY6+tmM3OEu?ej7wVMjG>d^L2W2=4?OY=B|cX4zWFV@fY4B+f%2~> zR;*Q}jBCAXUDf(BE^qxhPo^gmBYwtkp6wXGY2cseSa?-7d4{%{t(CIP7;h)CW-74~ znVU*vX6mv=hTpW8t{!Ut?;3^`Cl;yC$onoy(O$!x8bqL}nh38KHMh5?*WPjtW%w8` zH|#omhd$V^cXjp7h|B-7SI@Q6b*m?Ex}Do&Zze6n8A2u=2zhl5LHmr4;%DnMBAr<; z_t0>Tk8NZhi*6)l)9Sar@qeS#Ze9)MGPjYYLM$#Y5XGV$Mz7OwGbulhOWVlbR{@*6J8ZOrJJ=4@#z$t*p0m- zOR-aA*?_dF%V9ApAw^v(AKLA(h43NXgIOQ9GZPBN9ryh?>u@{EtD*OFCG+z-s~@E4 z<|tUB;MrZo;^rP1mIj z=F4`e=^yA~Flqx*ayK2l0cl*2&*|pi71t|Xu@bXEW2sW`qg_k*%GpG*HFrIpJ+IST z`nVD@r0cP4jpZ=~FAJs`*UeZSQ8X`g5%_h+#(E!8dWx~ER`kzw9oDfYA5?VM(?3)= zPpw-~7lXQ8s}zxQv0^!`i-vPp%Zn6we3#y`OsVNBH`Th#>vE#4&R4n>ZB|#_tPl4x z!G3(^rrshdZSdqx){?DQRNlN#;VE55bRj1`+Bu54J2hLwuIQNRmcL%t-*Z$Z=4$Ng zHJolm=CXpIkJ8< z*8PB_yY=VmVlL+Y!cTm6W;^-N>oJcklr=HgGoARp;TuwI<{K&^D@kmfCklRIeJSEr z1*9w8?iEpuBb8R=8bT}LF+w;JBOQC{K18Xd91)l`Y3)=s!o3^}LcwqJi z(Hor+t=#niDcp6rY*;kaS0Y8a8tTcD&Ks@w%+_>FB~gOgy-;{>Zy7vNKx&jHg*(I- zDg)LHvctYXo&j=#((PnaB(LenAk3J6^qM>{=-rjREeuF8-NP+`Sk)hIMl3q_tfGmd zDQuQA>{c-nI0JYlumgA|aHgFTp8(FZr)EbB`R>I+sVlms;nCzOx>oHg9d1SMBlYjQ zlF@!EMWPHFGC-ef+|2ygEoPFoW&9k_?w`2LF)c~I3K<5XuPfEsKtP`A=cUH{jsJ? z@TgRZ0Pg70Y^691_)3>n!J)w4c2R9Se@|>citi?7PcvgVgE4&&X@3IpfzE;$OBioF z@WCZw!MZTAN=`OoPo6xd;0-y;@xi4C%LkYGTjp3;q!`m}=8etRrqg|9=9_!^V<)nO z*ITeM&(iQ?Upsp#{z+Qj6+=UP^je>Y)s^&0KkI6UR^LKK5$ol>PbnVr>#l^MbU)~v zWolup)W7WMqW2PreyP6vr>ul^1xE=4x2K&3R9@lm~0oL3j zJ&qm2yw0ae*;uBI-HjU8W#F3Q$D4Hg4^;Ac2VQ$H5SEGx3S#4X zr1^o#{Cr;X(@^wJPvD__yoJQFJ1CySvpagE8A>>(Xo%G=@RsN0v36QwW38DVIP1$x z;VEBU>X)*w`dy4x#yX%bu^}Da>Row`o!uRf9`7P%3mpSb&*ay%WAxlJ(i)9biPn6} zO|hMh18n+905q5*Bo0Jp>f7kMIfsZKvf%@C z&+stE;c_x+>Vaf4<3B2V26GJeLCB71Zy(NzCew{1LP- zZR>Gp-^n0sGYAiU4@iH2&ICHnm&0D)oC}>Lo9>!7^3eiDFTAYNJx^rxiv_gwqjCJY zU@K3xN1&CbRnk_To)a>rQvOX&rR>O2z0l4ZcC_{I9+qc#ieh?nUF@|u{&kBcMX7~= z{hwkJjuuX1K9dR2b&;!CO6vxF$J3|nTvb+!m3ga{78OjhS0oqM32qn{D1v=r z@&xh_?u05*Qfgr;DJXnM5mHkMlSzI_UTH!3Bc4J;RBRPRY2ibVlalR0gH@|nPD@TE zEA!lW1qG$k?Dol%?2}X7lilMdCnZl#Nh4*YB`ay9q$D-PrNw#6%4m}IRC{W&y{|Tf zs?+Sshg6j36)!C|^Z}?ldH@!t-!x z$QPrDJr)A*B$e4u|3$?N%>^u>WacudHJ+!?WFACf})3V3s)gO z6)y7>l|aD9UA(fmBo8-~f`Hy-FJE0ogPG$26n({j{EQ<@wt4hkvON&+&n3Wm=macp_ue9)ItA!b}=9%3q3&tm#3rkB& zN`p@kR+N>{X9BiS1#y$jOY@3~3kwWC$8ndG7AgrBtuo^tJRX(w=BXqx*(?;4npYN; zt;{QT3+7Sw)C%(h3i~CAg?D2_*+#9NGHP|=sMW}$yl7=%$?Ec7EDB0;mB%ZS&C5`Q z)vF3CJcaJ^!UD7U6vjNNPl0-EZKH};k2R}b|1#14c~VMy6k^5|mgbcg2HT{!dP-nf zVKEAFTga*s+7h0URb_?drI?Lor4xQ`7d*@vQ*K5}ne&TF+$+q=6Oi6igH<;_oL5v{ zv}&1oX-TO$ACH8PI@9gk`LyO=ZPlPXeO zFr>61cWIux90RKmey}`uW!bVa%;vnZ^4#L0vU1{CnXEoD%PmE5^WCeU&IRj*1!x_j zjB&-ja1|+39*tr6yO%DTT(;UnAAr%>&__(pEzI*gREXmKN}XH2vVybEf+PIW)b}}Ocvoo(S zFTaQ|ae&&1GZW{MkOBc z?Pn!}s})>t^pR=!i9Rxg{ys7ducYgg@=@bg_mOFMXCIkHmHWsv{2i>j>PL-#u#Zf` z_4G^msNn7l6t~ZNHu_TqnTC7&|2n+0k4(eo7=Impe;=8KKi5a5<*V%@ z({O*}uj6<2k!g5V)UU$}`p7iAypK%NujnJwaLvG9;`buTIigj@-!D4tFHi~pxuX<4 z?xNfl{_{WyhSS`B`Ecatj#HEzuH5@-XfxdLi#eh4@Z03%+hoUW^32=hxwpx8-zG1= zO@8(^dB<(?pKg=?e4FgMO>Tv(#rUI5J^=0Y9rzH)bjnfrC-4}^i-U4RpC+aC9|3ta z!WRX@(;$BdIXWn3LT-mVASf?}d;_uxO;6J=hTQw1=~dq*zXdrGjV^M(r_P>GMh|_d`VkkcS3kE94jyc6QKy668XR z&))W#5BU+uwLyC_vYd=8AS*q&LSAuhd69cXSuXZQD+^b;S9(ZUK~YI=d1>CNvZaNk zcom>ve9EtN#IqVNaFmsouA=6i(xO%6OM_b;cRsdbWvfdIbMqd~TT%FnmM)sPLJ3wZ zSYwB?+EbqE`T120MC*M&B(Lm|RqkA6ol^?rd4#f+B@gvUtk?GEw@gr$VytREzmxLo zw?+Q@H&i_NtC!}wOFWO@)s)imqP#xuqV(qTzw*wC(wcP3T3nbb6fF~S%RGgJ1-YsD zc!%b{dmrTIy7a#5f>xlLkzecoKmW=LF=Nabk_Z_c_Yc`2=;nWfKV50GaYrR1dpvf_8MhrTSHHk5vDA$|n-C2b}8Pr*ax0H-ma3<}TGA z12;^`R0EDav8Di}IoLTTNyy*BRQ=^3 zzZeb~`8lw@Q+pTX=r_9l(|pzjd1a7q2=Z4bk3;_i(L;u401o^v(Z2Bvy{{Q1&wzi$XkQ_OpyD7{37MZ=lh_H$L&fy zy8oc@bAtTtAYT;ZbpJua2Sg%2w9oP&e~5DAUmcX`K7`tR6XX|z{QDpmgS;00oW`rC z9O?ZOl<7NtRHpkCTFyC?({cs*-9dhTkh_AM?q8_gPvA5@-LKI2_hbGIPr>9ISN6!t z^1OWT@=}!xy{NRXcw9N|T##`EdAM8|M>q20aC=4(R8C_hjY}fq+$Ael;u?jFo3UW- zxV-Z6(xUv;xF>)N{-1qDzzjtqn0CqsLzU=J*4_`Mt@4S%cPPlANEpu+LUv%TQyq;@ z?J!kvgG-eWqG4&0COq3Qi{EuiL01K@fTJGeUK^U+}3 zcj!$#7)H~<6jSVIy7V&!n~=WyGipOA2ZZPzFy%87cC>AJKh%bPDDN#BmDj?~jxDDF zI0;1C#R#J9)TcP)9W?xkJ`sDxz3&dDCQlfj zs=ST(^Sgt2zohx=cL$5B)X|{U*Y@*{x-k~_`py4mh-8sWn*aZdV&|@(3sf4;oi)X2=IfCl8#4U0B7CbD&G0@v!-HBSTscb{g`hTNrW@ z{7LBDAl)dAybeALb*6FWk3qR!V98(CvgBDzzL!Dw;ek`ci!AwVJxi9XV@cR!EO~Vk zOFn)MZL*#vKIpc9sz7T%e?{2YDwZUGpWn!m8?Zk)j3YxvaAYph$OO^69)pd9d>Dkk z{47geM_$(bu zh&=uZ-P0(~y}-{S&M@FNz>84kI@sO;qUE3z2fXhomTW{=CdxSlo$)3Z8S$h@en2g_#~(c;eSKeeO8YA7GX5rh50I{_*@@M`aO4vDf96__ECa0oJq%LP!sadA!;x(8C(D0H z^Tmz7;NCp{-{K#S#CV4z?3>;stg|ygXS08;@3ooHr0Vxs326guK^i{LdHBM!sB z`UgVZ21V{bU3cO6KlsUa)O!6!M4k4cjQd~@S`8}vGwjfom)=7#`z+Zrv(G2-3ZtOid zks(D>7;-+HAv?1fQg}B*KE_4)`F9zz9G3hBb0Qn0y^kaJf@(ltf;vDq zK(|2eF6KxhXbi?TLzIu+Oc~Z)4OoCv*LfO7iRyZBFTV&IsyFELWYrJ=d>AM+_@nP* z{QL9o7Wj7y{JRDI-2(q^fq%Eazgyt{uPwlJUd3(_pUzeLDZ@L?uTtJ4EvTpbrnC(^ zTguM_x#cxgeqXV>DMd94?%Kg?C7= zDCvmOnxLNU*6}`_RIbQBO5MS9M=0t3C>>PN`B4f4?e+xuRi(V0lBmS%lr|{&{va(^ z;{PaZQ1q9B^}Ht86#EY8mJ)tNs#MYyrOS%`qGVI@yC{7Z%=cl%?t=7*(oX-B_A2@d zl2hSdOJ1cM=cUbx-Fc~Ak-wGxQ_1&RX_sR6jr5)p{~KwflFtRHpJI1G8XT0rQ25u< zhf4XsmaZ!0`daFz=+8?ZDCwP-nuGal49cOw{1*gyof7}NbW6$iy!2`?-S>m(zNy&x zrKw7J&P!7jy)qTP|=@}1}XWSk>)DpIxBsmgkP3Y6#2CDQ;?qt z#(P=G|BN(7;isgHO86;hnH{J8XxqCYN~f_7?uv zap`d-yfxTg$AkTTEI7W7NpqC?9+Mtb_yy@Mr956KOUeIl(ql@y{Y}y<{A=k&h5My^ zCEag>ec!3sg$AQ^Qn}k@Xw@jCH`m9UlsdLrQa&?Kb52)|56FRAlVdtRJx+n z@2}ENO8k!{O)po%KbBrs!oQSqmG=EodR)`hD;LQ)J_%N`iRK-Vuv&vNL1s2Oy+zLGK5f%G^JJ+iC zBJk$NRV)I36vQ&cPpEnlNyxS;73+b$PpQ}lOrBG*iRxceu^IULdKKG%tGB7x4!q$_ z6{i6kJ5}re&XQD|1-wXBaSm_=yH077MZoX(SFsCt{|FTez{}|<1H0Z$@X(zqwgLP9sA4t9N_L26)ysQ|05N< zsQy1yEC6S;sn`R2@SiHK0CvP}Q2MSC_(YkrrIw% zfOFDS`#r$VWvlog@YJ~~J`8*?h>ueITUGA`F3wYNEASk*iv7Udg(|)Xym^(1Mc@-2 z70bY1l&P3Lk2gN5VmZ*&4a-98LItZU~`U&k5ZevRO|)5 zf2V5S3jF5IT(q>5$WZ_3nk=u2+3kE@uzC$Qm9YFs05`DRsb z0@lBzVl(izAhrQ7+O6vCz;89HI1RYsFDiBbYd%zQ7PSxJ9N^X?s(ul0^+zgp0e63* zVgcCmsfsXD8-JtXR$%+b!S<&%L3|PToujH=1pXpVwU>e4 z%2zQNgm(A;RN3}l+Jdmhu;sx#w zj+s_!U;ebxr+#38Utct%DC_`Nv>5-t*Ka@lAHk6QM}&34454Q~Cwy4+<2A0T-~M&r z+NzNKToxmcxE`;-S7#2~Lz=5&@vkla;mIroX=dpi#Kw8KSq6bkH@I-Z5(xw_pU)G& z8m3Xg4yUsY8cM?|5ys966>2Tji>Q4q(xdV#mg<~d`Rse|9zrVr<%gXeDHvV)q12w1 z=bo&4XAz4bhY{|XZE)N(ufO9rIDsaICr;Muz;~Rlr@cFN#v+5z-x}rUpU~lD5*V*0 z>8EymQg(KfBYVzv*c0&sxsoU1XL1#PsXY_A?|fk+Vg!DU)nOWW!SM>h_Q>n--6XH) zTia*MinTa%CeC)us#z4U4sj0g&KIU<4{;9iMhdCfLmbDK8~xjz{k(_yaQ`IO3~}nc zX_Py*IB)tUWJeYaadvxW@xO6ueD&7P7a5TU<4?-|e9_R6RtG@|iMUC2@Z)CbU0Hl0 zzH^js7e5ww?5zH-v2zn=MYs~P5>b22;VNf$t7h7}JbCr|bffj`jCY(y-^lQ{$e6if zT`TyQn9*6I=h|FktkyeB(7H4!8oOrdjWbnyEZH%$B7`5JBV5J&H_>nN0*@DXm?wEw zJaV(A9i3nr7!vGP3{?`qOKb6ZyzB>p+Rwm;A)LOIWC9PT7<)MSKL@mLH-qXyuYjHd zA%vv0a-4Ug&SpB(V-{{0$#7+vt#ZsKr2_ufEb^bpGTG zh9az|-F|>rL;N4#|Hb`pJ423h9Sj%JTIc-9N6hwSdR~sbnE~SB>1i+P`MGUb4kOMK z$o6GBIg#UzMRWe}`@>}7VC?nI8@>_oVOI#pWEk2k;s~NQHC`0&*bb`3|8le92)0(w zq=neVw4S?2L``VFDAO^dN}<>Hz8>dWwud zMvkILphyk{sZK zs78kn%hzWbo2kt~*l0um-Qp(Z~}tHzc}ZO z4m}&~T4D;%B9U&}*Uv{p4sD&fW;Hn77<96Q3@Sgd4u!!g8nS zS*O-FL|7s$FzJ(LLgRLE0`g$jncj5j6q^Q)D3XSj$tt+_W(;{g)uuxNNj zy#JIj+v+lAyFuGQ7eLlL$e`_@3m|JgWYBid1(4MZ8MGaA!Hu46!HggSHgQopJ5g!>bO zVYAz6jDkk|=mwLD|J!XeWt#+6oYJ;^$RX#Crw3=p2_}KDuwwYl!Ty1FB~@%`GSr9t zoa^7(3`(xww&}AXX3=td-$sxhV@>gB#er>+I29)q{r7e2)8rp@9Qg?SSPps7w;aj9 z9591wzj&H3$QA2C3vCnp2Y==h2O?%iWDgP|X2%Ev@jXCzv~h67s>Um(3(?&5$IEr8 zZyCtufi=wL1vTuZklBnVwmpG1relTnA00n5pTUEx@&C^2m!~um>-zjk*=#r3wc>ki z4F2!gbHI9+UBJO--Z1fvuNbpdeE&3K#_2FU%*et1VcA24Q2zyCm{aQ=b(zz;g|NnL zLVe~)A)*mmZl6|+Y#WrV;Z1^8tUhfQ!o?q22V}!XJI?#a*mFMP+yuee7=yXJ2o}CG zz0wl&LA#fp`VzQBloQCbVr7E|WluwSJs<}t3q;>1XL0TWlN?Rg=$4^qtKN2^n0m!m z_ZaZM`n!4p(gQdpE+FLv3=Lsh`)@fG-LE0y)gxD!(8w*uhE;cc9v!~roJ`hza77zd zmys;A%EZWCCkqxt&(1hzTAVR($VgM@=5z8lZxqZam}e1A$t1^}^{#2Mps)M*3LE~V zJoGRl_O$97La#smAXA4vDAT1h7<5Tt*B>vfG3b)nI=yw1fo$aJ?&Guh-(vi=x26bY zVUlo`#;xV*$o0oPG+y}i#~)%4OJ~=mR2q;*vTnkE7&aN$T1{P6mYc^RB;u#7p?nf);^Z1yTQK!Z>IJ&Yp4i!fW7nyvUKeKxH60{M?kIoUg z_GrYvpoCg+{b{ZE@M$xA$3x2Z+_tWE{ecI0>>)*MD?KF-`$dtwH}oZrNC$K{xp5$D zN4G87M@E_Xh>j3uIsdL4l0#n9in(V=Jw1`{jcyI!+8D=^twd}-=N7IGU3P6CXTeJ8 zb}^G=`0yU0tr4o{+C)x2GsE#y8uzMmbZg>18&A)?x))`V8=brEdIM*Zq~TmJaYhKvGP?umJ=3b;X$=PSjPuj8L*h@9J8h?@ znhDN+2tf%=`>xfr>|GKvr{%zk@%-)zoO6+~+cVWd#3ASQ3U0xf(Obr4N*OQIyy;5E zi7|hux}daWM(f*db0zVUk!HI4sG@z%Se?Rp&yng6uMK3`D+>p#hfi4&u|#{!q|g3h zsMT>idcEsNO;r`w8NTpH6^S+4ZI z`M`*~7)t~X{~fClH{B$$dW#N{Mttrjo5=7+pYAfz4D75d2=Us5*v`s4?6t+mZ;s_} zYKEW85H*?@zcvw8ouuGI2ct=AAtMiIBTw3e89`g&W`=0i=>6lH>_Qx`MSI8&jrhCw zXuHbI)K|wfaoLgZ|2Wx8oKMfFRmv5DJzxaRi6gObt`zJEnUv@Xb9|TAurFQ+Z*<5O zJChvm3in&$Lw!{u!=yIm4qsfs$xH%?zv-L8Q~T&f68BG^IsSXPl6Xn{SuakSghg9> zMw1OYMaEu9=-Ds&CYuZU#8h_dUwv5HEe_dgmYXLYh=RvDE^o`>D!Lk(odIcofN9Y1 zQ<|!q?(ieNK*T4$GBy4nkVMI6@UIYd2+S4>_MckuPp4>a%{F+3<)N%&m57sgDUdk}D`aav_FM^^ zFB5BgnE3rEtFRrX5%!PQv}&lA%fzXH?{f+LeU8}|iY+*etIiqf%P$T|smpU0(-V54 zU5ee)ld>n@RahJ&bQC2EX;~j%;S4yY_3ZXy)Tho}jJ-$Qb|EE;t-BzQF=Uv`vVC%LoZ{oSSexDNY#k1R2XgctMXx)VsqhVn!KFG65 zNcGt(f;EfOy?7D-HY8S^y;7uAQW}v(<2`cL_fr>5q__SHTIhTHbo`8Z zx>DH}j)YIig1>zLR0sM5bR87+GNf#%5T{n%j+{+n^u&# zz#-?jmhZ@9Y+QPFVT~0u(qGE`QaOO#KSV@?7*swsoAy+U!1yWO^$hiFBvJOUexA!d@+){GAne%&6*qAgjpHy%3s%V;&WZNH(?{< z-zq1+J6;Y+^ve3mbyZ0?nTUwyGjTYr$bnvcOm3FHw(C1sayp&r5ErKgmCAaYIm*<% zD}U$O$1nFUn!URwQrO9}{@R+2e2l3{9%!B~Tg)W>Cm)TmTZn#S$S`&zx9Jd89?qLs zy;~lbWAbxbX3y4lXow+w^3EBuF;Q0XN%U=8ULHci;6#|gVuB|gDfM`5vxOHat#Vv&Mz;qWD< zeO*_tElh8gzcV-Ny)XJ*`5SwK33aeD4LfC{@ztRwe$q}BDX{YAJoBR3#wMlBpZCS_ z3zV_3^vvJUQu}IlbcB=elzLp%Ms$3~?5koedt5!zw*jPXr<&90tYt@sfzb4Oq_)5; z(cw<-bd)JIou)^a9&ZSJ89-f=(r8_i;&?qy(M-m;NjFf&=-`a{b3%*ds$)GkJi&O0A*nQ(P zv6=Z3E%QX8r{fho6n?PB;opYUh7q@S1xJrl+m?oVeRLFuotftUqd=_t9^8!i8po%U z(lXN$m!Wm_$*$!L&M4O>mp&4oy-uuTkA*g1{vK>PAGwrA5aV*Y6sC%`hIe2UoE zv(y95!Y+itZ2a+*PMKM+VD`N=Uza%Ct4~b!GKrj*T1^PN;8*=h$Z;wkzD2(i0#Euk z%a6yBc!yYpc$=9M@+*-V(S2$))hAh-re?dA$E>W+^rPqNlU{e4j-8PAB$0$A-n}&^ z3omRr}1sc7UXYB?rKuf4u-Fl;h{!RTLX6f zU2W7FwhJPZ`p(8E>8oYai;)UH8W3HLDxwd0hn+%Woa2rkQ&6?k1 z7xhzggK2x!?_Cazp0hVJe;OmR5jX|ULeDPy_!iFbwol@z_t-P^UEm(+(5)9`eeAr; z1}oR;aYvoDuplcLrA zYZ}(v$Fb&SH+s?TJ<_`Y65HE1iES62Ckc1?Hp}tJF^z5^a*8%V-*!SC%Gw&aikL=5 z9C(9{1RB0gz{(Pt5VT@iJCj(9or_8LnK&_5#=PAJD+^tHERFd}uhh46rtHQ#8j!ed zs^2A;`D3PCu3a^8{PF1BRrG9heIN(p!I(_voiQ2y13nP*J}IsFgdDDD!;{mR;s4-` z=njCUcBbou+?lijr3y=;>&8}RxEH&E*oNp6GO?WATj$g$R{%!r<||vMPxKrJ=Skdn zZ`N{ROIG#=Bw-vl-7my@eR4Nu)oAa)yZ(+H$c{{SCHRlw$I6slN$-w><~hOi(_ZX5 z@|Gxh;};bEWxgKdo6*v{H&M%OhQEJ2DIk4_t2FAZG5?#rGD)hH*TjaU9|pSIxLBt> ziTzP5&eV2O4GoVH4gH69c%YGTuiP8ARfq}WQt)x$4_irRWlX4!%NAw=-IYRanh zlN=2xE z`!qaKfzlTRNtJ#sUf1fCvmhVFw^uf?6@J#j;1tKD-8%(bmlHOLwe(22IL#8*mR(01 zH_O`OT|#yvuCt99*`KD@?B$Ze9H-N9^=_xv-p%+OfYa$)_EzJLNmOM@<-4-Ro?H#B zebe5pPS$%u9%+ehJcX4z#7Iw}ALvc4rXd=H%u&iYC-yWA#k#)Lc_*|vN@;VF;{3ZX zQb*=T4cqP7T{C1v&EB0=4>aoHw5=zU8hnKBJN)6v;Zt_Gc317J(Zw0tb_@DR(G{%~ zHGB0byIni01~+Y^yB+_wj)C0iy<439;CW4~8FM145o>}d2k6>~(>+B^fS3ovuZ1Sz zymyr1?xYPEiF6F#jjr{i?Oi^g0(OeUH-c63yd)QR%s;*(W8UiD$6tZ6VkJ z&^o-?L;MjqjUAVnzMf`f-%*5fz~MJ6`NXPSj(vare>T<1k0tGc57`j81>fpUWVXW~ z7Jao@egd_AEN_EcnMc=%T6md9Z*7pD$XiZAPGScyUcucSy*T((?0J%S=P7s51HxcY z6Jo;bsfdijI-?iAJ43$*ouRY5B8iqa>5RJwCyWYgtW(tBo<4s4q9@W%uLIQZ62wSC zoKKaQ@@aQbv|v#zkt*i1L%dRXMW;jlOsrn~4_Gm{?=iDyoKAm|dJF13=t!d@cIB-d zy3ms}?KMg8AxSZfxCa31aXpu`be;&x*bXH9yD^&`2{ zPUGptC(i67uJB8I83vUtMc^ zq`!B=Z{%g%HO?^_Wx{?@{Gly`$Bh7_z9I4k&TvJ`C%KD;Enl*Hm}8JAYU!RsFLs}e zgm2M120M-d)XCH|eg1h#R1pg)vQcG)C-b z%-GRP^`VT|vrO~#uHu|%_=>LKsdRP6byskwbIiJ;Avhwrgwe{5&Xydl*sOqeuvr$s z@7KrHIzx_GR%{X$RM7Fx#Yg%Gb_BKsz4gC`)_*>2ol!~~)!xL8Y_y$+cg1zw=QYLy zG1`77=$_#F*fYv6Lo}GS*6=@7r*Cx*Y=Mum;95$#!xWH?9a=cl;AP{n^W=!v(6kO` zqDS3iuO8b=`~eHSGG*ezTcXpgmsz$Fei-+--(O!;Uqr;RLp4PlUtKhWuIqU6O!p{H z?%_7|-^y+@Zn*>ZV9v^E+n7xaJW0S#cg!1&&kM7KQNOzWa~2Owu5&WSDuwC(XKRep zj498%o~_F9bH&aT9Ip2(OtsF@EpK)h^+&Gg^#}QF!i)@7+}n-2Jhu5>ckz?L4<PJRzR)W3AaHsR0Cw3g|ZC#?8< zx0X+9LaNy7DEotXtoZi(^KqhVCH6P#Zjgrf>b)5)F7is!(XuZ0Q0tU}aO;`^jrFf`c;$50W3KmIhYIL#AJO}X zw4GlN8j;5#VdI|AI$}M9I~@POlgCQz3?u6L)%CB_7W2i9tN*NeREP|Z*ktf-+WYLx zh)vpK5p~0PeO-wdp}TP2z(+LT*=8=+Mn*@xq<^XP{O%58*y5RKEp>dpum<-h>2-R8 z>FesGVIN+bJ%C9*W;zzr6^*oy4lo=MFt+K;N9s54LVla&6 zqx@@D92B;q?hE-Lyta-NE4#D}q>)tT&)T!jAS{s0uIY_OU`yj)JfnM+jGpA*{>%c| zYW)4WgNnDS>C)A+;=-~3Hs!%u3u?t^pm$%g*MP%%Od{JhI8^;wIOxBjHc^vK4EL|@lDs)KQY@I(n^10 z=d> z_w8r!p2YN1J%JYsE6J_sYC`9g|4Iz8@lGWLuCuzyksYx$Mj*8`?(0Qye8ld9nH)wD zp5}>9w(9uL_$1U0*AO#88bZUO;P1k{{dY5U{dTi;4CWH9({YA4p3U#!>U4hN?uBxA z1h?t=i=l*C&~z5?2^c?q$4*LyP}8& zB7W7T_hY=8$+&?nDZG{6T7?t0>-sn1Sz(=iOHxxTPp$P^Sx&5qX<$>ip_VzC#zH2YRmKYXc8b>fKZ-_oIwtU!iK9A? zNo4Rg3-Nm^s>>USiTN0wUq6Et1}i1%x#tFh)9Ojwkrkn5*As-0fd=Gc-E{XQrEl)7T-`XWAPt6umaYUG!ZZlj6=}{TFcO=t4d{IbU5T zqzOWj8b!599q*!tdvZcizCdA7)TwRxG%oZ{(^8 z-le&)PQzRLyHT#)`F~UHU1_~^X0Se{VarUTmsl^XODWp1;)ng< z7v__V^j#ba+H+aA-$iWUxJMVT6Z0Vd7H6dI$cj3=8}<}>GSqJ^=B`v~7vh})#vaua z@0y>_`S&=lou>9{n?0Gv15?C1x~GVvx+jZF&lJ&zr+bsd_i*oKhPdX&E$I$C)1p_M zJyKc|{gn$HkCkKOblmMIUyn8|8jN?G#(Oynen%t@a$K#h%f}{gUM?ZZJ0xoW^(bkk zEV}07*GJN*M9JDm#u2Akfos-|Sl$ReqN7y~AJQrtk=npXt@6-NQX2++R7Y4Ao{wJZ z-@&A6#{Wb1q`cyM|G4^Wa|NC=tN}d@`s2`QQV;G0(YZZ>Cs!Cf>FCGR&s2V)jpy2G zZ}hX1gqf%ANc>G(>{|C)O~(NI{vu;NZmOR-;rN9$Z?1tKwq#vpxUJ4)-_R^gM-;)07ae-@u?vq;FU=&3@?|EDXxl6&+BeH%&5G}KZHYoI8h4|6ZB!Fhz3Ids&xa>#u6)QY#66dduwuq< zU;C=_`_t~V>(OiOaykPEaS9>X#sjnSH2e$~vCy}12FlhNCdFE1Y^Lwc;8|>qmM?D1 zz^d;qisjQ?T0HAvMFw{d-FXQ$%#;M&-$_$!>Als=mH3Se_=c>e3u~j`A8>yPBai+b zrk3|KF0EMFl-sy$rI~+YCGIj?4`!P2+@6LX3XI2ZM#%I&52XG0ZNK!U?Q2sSt!u5g zI#lnMY`~oydT%=fJHHod*v1y)e%Vk-Mh*1a`SUgT@CtuFTgBHSS9pSJMu{1p)@TPN z7Di0MFDM4a<2f&$z8`XacN+J3{n&MAx39G#k0|63knYC4Tza3_Su-`x)-pAg<2O3T zw&?NOQ1w-wOlCFpkJ@Yk-=y(BQ&VYrhCZ<|k~rDt$)s~#4deXJJj2-4kQ)e5*K+#- zj(@K)B1mJc1Cba&PhYI$}Mt&faX~?ZIcz z;sH&?xOp5u{dbIguxJjEdKyGX_cXZW!Pn&S51jg<;! z{CoEg5HtGAzAzW{GGeotAI6WZU{daoHHU{HB-}ex)Zj|MK2_@eM2jAT`81uHln70j&xmK5ynH?ljOjAJBHZn6Rkeq1C9X8;#xgjsYS+;2x%H!tE|5+ z=OwKQ`!lj>u3ztPLR$}`l}2p$bZ&Yk>QT_Nt8>k1>Lmj`hp+Rwy3?v9E+;s2MtAxz zpf~Pno-u7zuyj|s@Z*LG?2{2euS~fEJ8 zX-YCPMb|~o;+BjCQa8|3qCAb8rVd8u79f=UI(^N~6c%0x76>l`Ls28v3D?tzD=U3< zTp6A!{Zf(Oc&Xisf&tuxBaweuc!E)V@O+7*P69=d4qxk}WwYNaPYW<0yOF)F>b ziCdaOCSGP5JKGV@QtV#II~=xzfY)XW7;UiuNWLGB#*xX>(e(@3z`<+GmLWO{K4%gA z7hetJ@D5WdcEiD)d_wzHK>nHg300SDYJS2n(w87P@>Icb>=&aeM;~$P#Mk4-u@=eU zTyR;v;EmB=jQ($TKyEN!c6UN^>G#VwxOaNaYGYed*e^_nJpb_gepRuf$g|9`%7Ha{ zr_r~d*E@a#G$eKw?SQO2$rCTJajIU&^aY@{s-^|KOg_z?<=P7Qgb};)LMrdNyu(!? ze`q8g)pdFP$_n|E5&JQ1!5o%fA!i%)K0LKn$QS6Um)R1K>y3EAC%TQN8{~R>w6{Ut z<VMiyCCXXhfd~`kX~c1p)bEvv*^XV|+6H`u7?S%4Z$NY}>F*wlEGqo1HtB zb5u6I>%0bz(Rdm(j`W6Hh{rMBZ&1cNwIryd4O+g@qIcATP0x6$A2gFVb*h zcDG}8uL#JWdSBX@1nDceB%x3pYE1y=R8w=Zy!P{|Fk~${brt zRETobAa77g+wR+`l=gFTK(1hhmp6d&ZbW%kJ^i1{i&)GJaN-e_m<`Yf5FF$O-W z-dF0eUS`=S*Ey}B)l~$|Kj`hGx?M%7o}^yp>7=I7Zqgjt>4ud8<_05n7(|X~7vJ>N z0XBnbnhPF7`7Giw)cm7G?>eJ`lMBwF#@^XD-SK}Z({Hy5pJ5CZ;LWGYG8_jsE>1z1 zW#x?-4!!jp=nx!3Z(y_8IZ;Xr1I0=IbAX;vo(>{+?j(kQ=a4c58d}57rBHlQzvbahK_^$1EVPY^DZ`8O? z#kv^lW9Jw=@yfqMOkVkwF({GkM0~ae0HCov~)@2nW(I{v2^^Ty}p-rlT&Io%^xe zW^ei?Z9^toZrbaKUCPeb>rUIS$8^q3Ur~7a?q9#*fJ-vsJy=)D3O_`3ie6@q_Ju>Q zH_`fP_6ap)nZIIIL5{H07w+l1s=`jEt$0Gn^dI`wB0HWJ4;2!}($>cUl?{h3gjwJO zy}{{9xQNDEICSzQvG|Ze3CI^eeT_O&`LCtFUmt8x;( zjF?!4XW*Lln^ysAoZZ9;s2L{LccT1=lWS|-!2l~=k@CL0%*=?5I}on;e^bIHZ1diA z(6d%Es z=tZBWQN$-oX@>R4#t-v^3vMgG-PjoGQXOG^a?q;Kw%ae+a zqwgP=b1N_+F0)a;Us&s@EpGuDO)qHofsMIBDr|AZGa(8|K(MeisM>N?Y{3qe4jPJ%j zrr(+L2)*B~+xNMRZwLBsR#&p%&(y&Cn5gTJSNw`8!PqGB@#QL;woTP-W}aU>(DT^U z637aE#e_p&+|W^8jOtoYuLbpmS-6CLW>I+HqZ#1oN7lRUZ=dIq2&ld#4ucF7Z$xtC&JHqTv% zv-}3pkYA(yW`cI?F9t1v{tDw_rWl&;22XkY*_f)|z+~rz6snDFquIOOKu?LObxPh9 zF_ke#jyhYK*edpQrZPuZfo#mH#wibs}vuVQh;Q z{OKDC6Z0lJ_id*Nt>j%9Qx#Klq&)WMe2JOwl2v2S>ky}NFwU3zPsl6K<2Tq_Wk*G; zyueF2WoO>WC#8m*Ld$-9{RfRNqx*5J&*e5)^;J4p&A>}BH zO2$k|OB*WUqsGWgX~3$c0krXeJqn{S+5swaNGCdJ-?|<806-G7A=4 z6f`#1Xtb@4>yuc+|>;r%Ff$%s^q;85y5+k99*WHb-J8e#(=TqpY za3gCy>L8u}#TZ%48`z~CyE?L#gg#A=4fVlPM&5)&pAAg7%&6I!pelh=C&u{VAz_TlyT(04)}K9C_zohkqlGcMr%TUQmwb>?BM34RH5NCkAkn@?9mBYxI}R9gAvk)4Gub2oIMYlRVQvzEU7$gHLB z;GYQeedf}-NBF9lblorm*Id;My7o?Adf*YQ$V@mSaIYT~_}32$)1b{lEfS-&NF)!D z7FpOy_Mg-yyhv9{4wQDJy6x?vuj264Dve=SJ7#ujFGumm9Fg3s#mF7Lt%B4IW6^Q- z5q#a+#n+Yka{HpM>Mlp=aE68z_g04Rt|Pin)f16)Lj$cTBAsTM7Ghp`0RM;acjI4x zf6LE#M#TBA_!GuR)JP{y?_kn2$g@uR(FNjT!y!N9*mQ60S_}l;DawYDvW{T;e#+QSlx~k;-y0_ z(nz8ivs%CmR>8iG-F?Gs#hsXkQ*sNJ7P$qwAhx$GB-GR5;U#yBoZy@k)VzgPp+t!U4LwLU3KLwlc4? zZ;}nFN+|Qca%l(Sutwf>K_h_j#@EgE*DZK#f$RF4*0-HvJM>sEpG8`l+OcMku8c>T!d@6>#R%H50lGz-6z89VjL@6u6G2_LC_qPXcwXmE_+xWufv&{FdC zlP>V)0NvN{s+Ne9EF9VszEh9GbMVXCF-Fo4xBn*^{_b}|UIwBTcFlFm{szxZVq}IxroJ;J?8LWW@8?tYF@NmewEh~zJo$Fc zBBSCNlw-ay*X_Ej(MGuHxsW}FLs5PC1zOh-og7|g(cg(-W!ro~>&{gA#mBdZgJq?} z3+Uw!M|yb7u(}^!qu;bqKZvxg0sVFwa+2e82HAVR4&E!?<*D^Y+DzZ|^)Sx$^V?rV z@}Jbkc`U>7PIeaI(9s)|`&mwdBEK0b#qhpz=v(nfIi(9giyF%bY~oSIjj?C;OJ?%guiagpQ}yczmTOcj4fbvQ@3)#Jae zKE&6kYE9N3x^DGczpnOAajR<)4qOL#kChbeLsM1%wVqo&2d{HVScCOe&zINDf~H1W ztCNz>bJcoS@{=S`C!J8*@U)^YeXuFA+6afbK}psBmdlMFR$HI1*Gj7|!iR~K5gNxHjnEnI zd6LRtAeyo*# zdU1IF(@Oum&{M*u#rN?&95gJF2m20<#!Mx@#fxZVRk{&YsAy$cQ{@BA`P|4{*}(?o z7A9?D89Y_EH&!p&0iL=BJ$oO@pp{NvVA3LES#zE{>=pPUl&{zu+&j!f{*91tE<$At zu7~oF+u0a(95^|eA%}WwHsZ;BY{wUa( z?gjGo9FVX5PD7gsx@P-ivrj$fAHjH9b^D6!-j{(!K8QbL<*089ncd_u{o}FhSW{zcl$}>;1kX5Cx=hcI(_%X z2%r2EjVwDem}g$evt#3-MbO{C%7{i)LYG%q1pR_J&>fnKzPmHbNUUar$V>(1${C;= zmq^n4NuZ9C@+5|({#^{62@aTy*Fs+u%aIbz{f{M5^sG<@33>{sr4v!`niCG)PbmQl zBk5=H2@Rg~h1+}#?5x6}IfI^nNSleB@%Kj6l%60v9zMAsy$FZ8!u3wrvO@=)YKE*? zcEg$lR=&k1AAj3R$ab`2J^s{p$;Ze)k?S8r|3mIG`^b|6)##t0vjLu~M3LnpEXj6g z&B3J40wNL)eHs4A#;5*myAQ9!;!Z8Xc7#{?Nb@@!Y8l|+A;m#jEi>eD@RQKiY>x|`7DxXyFw%G*S|9n%#xp0V7yAJIkJvsHN? z35hwO%L4t#q4-qay1UhBg%<6zowt6U(;#TtXq9XM_NbLwI?x-<_n`cddF+jFl9l3o#zH;xGsQAOh1i!s>JO_? zTrI?vDviaJqsy2EeSGmN<(*@3< zkU?0uK4dooEq`ns?(J3H_`ulG?UUahpg(*V6=it)kuT4`-(I{XI^>fyNls}+d4f`!7O+{H_l8nYk#K_Vy<=U?p8El%`Bdr}>| zh@)%#WnN`*FqKSNvBiqIzjQtoSgH={=7}eg1ZP21W?WZ>kIhgAxQwXaE(<4?K%%!D z7S>D}g%1FKL;39r<^%nFtyGGf6SW{zBOLk|mVtCf+)p^v8fGkNg$qo?-5t=xH>xic$aPw*&WJCX6W# zf@%{lmx%QM)x!&2u#EsM7qiZ@JXY)^k39i>FyQFW;Vdm+Ce$)2#q&&VD}9#}g zTe3`AO$&SXb!f5DvllNCRy$<`y;-frs{igDv?NJ#Gr|XCtvvi%?4uTb3oX2e>LF*Suhee77jNm^->CKX zX{F`um=D!+#0ft0V2|QOPPw9S4RPcRQY6$hVAY5z^*$nS)- zBBWzNwD|YNp&W{v!)TpR?ZgSN6As96N{w--v4=aq-dOZ6T&oJaP8Mbx~IlF8lHUqYrx^(Cu*hFVbc$bEw6SebM<8}<^uFd#?mT(UZIsncVa%q z+Z|qhDi3=J>dScpEwVk!DyjI7ab|&)(OK25nrdi@vFbsGW32pCdX@*h0fd-pg|?Cs z7GV|!QL|9(&+GkavkSQcg6q{vhudiWi*3v6{StPqD}aoaf%hd!I}{GQf7{#wU~-^8 zdAMs!n|Zx2IB6DtW;uAv8y_98b@*-BThHxW|9duYTv=H*H8u$N`-DSe8U#_^@!Kck$_e7|&~a{uHR z<$UHz(r}&a!2DYmS)+tQsr?l`NHWrBbvY2~=-;W0f*qqSjYG}`Lg%plA^vJ0r23Vj zxdnZ0LO4^A(|6%Xfwc0i3cb}z$7>i%-u3V%;zl;tL@?1QOJ6G=0UiB4dt#;;gjdP# z)GKslZ`(o|)7E3xnxE!7U^CA%X$En`v^iatTupZ@tFiQj9)VOUE2x20ESqL3SwsFE zEREOLJYBGQ%+=8qPHUTK>zb{q9D44!u3>gMlY{l;G!H}tV$)AzzTjXrqqA$oxY^0+ zhV~{CmvcS&!_ldkOs76*bElfiF?$eijvfbXFS+z-@UV1_=rJ@OdkOSdg?WiR6f5+F zCJnIF#n33LPgP&>GFgHOd5jtW|2bVZ8NN}>gf$aYA<`xaZf2QgKG1;2-GN)HQ4i2i$Mu`HTIENw(y`9{4bF3fR@svlEv*NQCJP0o ziS%qq2bby<>l)XK_rKI&^QeRlSb#G-c=!)wq?=wARCyGrvWV7izS;|&0$7IQ%~da3 z!yk#wG7HgC!v(g6J7UTrP9j=5jJq8Iy$OdVh1nXfU{bEr!pyX!Cf!74A|Zs-8Y(?z zL&ds-?l|&JqGM|wSRgEj%~E8^Gf@`Qe)cW4=Cd-=_Vff{0iH$vImiO{zN}lJ3pWUn zeBWyTH9X|Kcu6DOqkaGV`R~8~{j87)-Bxw zssqdvhqM=^QCV2js41%tRsw9b#-g*k7WajEK^KNXpC9-h+L*10mWnR0kkAhQ=8Kz5 zx+h@s)M=k+xnqz1@L>3r2)`gYK_VQeTy&GOI}1OOIstW9*@a zZGMs+bw#6#4V+x<_6F@bxh@Boa`5TN%TB%0H_nosH z{&`1;pFhIRQ%yFa>?(=ZMn}VgX&E$VRT`1boQhMTWkN|DkczppY`fg+zAIds@gL9WNKIfsPEFs2s{Dx}T{iCCC z*4VF@qHxxk8?HI>k{1}7j^Bu~GuD8q7`&FN@U8Ni?JB8R^{$?oygI-`+k8y{llfqv zLe5EJGMC}J%e=>V-&t6(HtunHaVG@V7BtK0Sy+uj1HD3?o@GTX;f>vkYkUWL`RM^y zA$?i1y>t6I*B&R=$!62H74WH)a13vZwcGbO$DCc`sq-MNv}Sp77R3>bSZlW9y<@rS zWoL9SAg9OUY1(22q2dGb)~- zSvE?TAjFEZWbS{DFVqAvZ$>znxW%#fjUUrE96bw9n8xJElk2gps|}pxJ9BL8i!e>z_?mu zM|?H3wwVrS;l;;;nj5A1HpcoMLcWJEMzraR4XUFIR#O@)TSd4kd8bK)J!dmKqAk0T zhIJEfxdhw8@g0x(W4aSz3(14_f7EC8UxJ+%Z?Q9h`N>`8<<%#zNY+CUKOHFQ`!`wekh$HQJWM-sY!Of&H>Ei=Dd*N4@|nQh2rj zzqEy4rvY^kudy?Z-!MYY_m3U1=$qD^@O*gUH_!@UrmP9FX(TQAI80}=5GU=!`Y2BF zD924*?n3D4A&&pK28~13gq&z@eJsDVoUyDg{c7ENvctR!{dku=J#Cl#BF?+u z{Kw%xHm%;oWix5s%zC-ZD1#0=vUbTY8Q+t2@$mM7e{}rEvH@o!{_*%H#7C@~ItEZ% z#n2K!>MvZQ8idZFG@E}9SF=w)EsbVKt}eR*@;rFpN%6$O3s17=E+2YbS^|zjT9ofm z4-3u5$;;vI2D9puZK`Y4#XRi1Z}!MNO!{L1X38T0PwGR#)k;lIvL_epKe zx?ofCVQ0p<1jz_{^5XU8pcB?3$?NvZFWObtYKzJ9$cy&<@)*!{lsM~VPv|<@AfBD` zJ9x1%#xFj#5-3R&dit32Vfc}V&oYa!fZ3e9E>+y8P9BVZiQ4iV=TACXQ1Z3#14E^T?kY-+@r6=99x3%EDm6!*>}`(* zBPC~1@@**jL-0SaGO#sud7vKtw;X!1gI_3Kf*0la0lq|Kn;b0l^dz5h-gU01{Jh58 zqOBK3&*=K4Sn4of*t8tSeuu&2Ig^XR4TASXfZ!X@vF5 zq;s}yD%;4Q&T892EuiFc4x2;m@S>gC!go7A4-e)i2Dyk1!lO36`1h&*0oqeCG$=xO zq^~g@TGLEb0QrDEo^2$a*ozC=m^$iHk4LnagUmEWnzw^StgV8$@{xg```Tg0Q4N2j zgX1y(ceqFEX6d@av)Q>vgva~J;O{FnYw`@B*3)JMJ~&2Sj8Mt(a))Q*{e#(5Hs_%+o=p4t^ld(NE*t^!W<_?zZCI5rsQ@$E} z%h~inm6h7;h)|AuYPHET4C1U~Q;*Smoh=Q0iM_W`c^hsVUV>fWZ?{G&djtCVet06I zy!+95cXCc~!8|1nNdO~K&%b!)aq`PV$7fd}{$PY3LQM0>4sUg!G4L|CSB)yNb>XZ^~y0M+L#kWNlH)3upOXY#Tq{J^R=D;mz(0=O&BJCH0_M=#+6=mp+RG}TiJvVyR z7w!}iJ)CV>@XG==V>#CPjPQ^cOFDSkU- zwg2d=@Xr>~Em;_CQwO%Zf_mFLcXv-Ae3bCy-*emUqn^pLV3F^(V_dTO{KAy&H486x z)EALPHt#u@KM=YlQ=ehyf*Y{6EquR-J1&MHoe=T4#{wt8}W-M2|Dch%8R-z=P=u`bY{inKBaffJi8%>@B zRskz8sTv@$VWQ@XE)RnpGq5tU^RH4ld5MKzRjb&K(#}R{f7loBr(@+m2c`Yxt!=Nc zwfVcPuO#?f6i&3_Xx-gk$kd)o{(3$5q!;sF>?xZ*oz3a-+GkPeiOQZKvzD|UWJT)gL2#m{S`JoNm)~T zggeq3#w?$94PKKiJB1H#!!huW00ddSRE~AkmTKpyz-dtS**+6=vEKC-m2ZQu zJ|GDqc}}bKddhJJy?>K~4^}GAD!j?P3~ZFv+qpoEmT%o9p4T$nyS;pEO0OdiGHfer ztrC9U<4E{@k2jepz9ulspNQFsMUB_Mre=~auWzrk6+ZuBIym24A7NrlAjNO-??JDI zM`K-JCnYqtt(ObTL=C0>d-AT-i(Bb}Vugnn+ zz6k#$FRHp{b2cGYLFQAWe_XIbmXax?S>q&o=WL%@xE1=*03j}l*8>_6rAvW`O7k5y znrHJnQTA?~=A@7gk053CHf?;Xv=$nPTYy~5pMUia79Vhkq^5ZIi)wDX*|VXWwHt%? ziQQ|zA|LiEV>4ccRLU`*Njob)!j5(=lGt|I>x8H;H>(JKsn0=^+6#=TjOpvSa-Dqq zy=2eWYJpG8my9vuOqq*ja~!?ihhs4#Atnc7p6z;9E@Qat+{RMpKd>fG%0kWpo9v8UR@Of*V{j$Ly0I+aM$ zk>B=f#zu807Vpv@I;Wt%n6!xA!-uCx157>Way5C^F74p-XlqLVXZ?SU}p6AoP zh!=``22+%wF>wSl@_04T5BrHkVRu6US}3X}x;6*C1PnGk?BACJW5n^c`GE;GXCTq$ z3hG4{)*KzG`7Q8ncyqBB4*m3|ApWL+nKBoAE`R7oXn!9M?r~Pva4y0Q{sOD|XYvc} zmXz)6+?B4`Ip7xHJ+lEv>oIoUK+l5ESMYYG%SwQ+$g>3vu;M!_i)IEqNJ~?+JIbAi zv_|zCaoiY=0j(X$MBzAw(JFM8W|CCQB-HQJ4R+us?_uvKqQWm*;2-!FA}R*@xD7XqUZSCDls+7KWk5T2!}%)lVWB`QDopJ4+M)x; zWhb=Fo(!%ptSnEE#>X+zOWtb1ErQ!M-IyncpY3dzqzQ;+WUfw5Sukxex0_}DtUPxSVNS8E<|PJ6trv9zyT7nXiNel z$vRq?;>#&;^)f4S*4bXo7}K-k=&M_H5JyDPlhI73=SE1lVe{ntKqE%xzzk1+&*MD} z>#Td$7mRLXbDVOTd-jaO-Lv)9o&N4wag{*iNZt(@fpwfO?{b-15TY?V-3Z2l`)6ma zT74^|yGbb2n&m15PkP&Vwc|bLB1GybGP32oaOnDJ@-e9JdfM~fpr>m8gd?kM!7*7I z{07*J;&pwrf)F0_Lm$Xm4=iw?r|LS5irg&t&1EZy$KOoY;TjiXHA<)8cNqACSTEYG`_ zVN&1JQQyQJeBRj%O#@bFR=^_);XaHdzc7N4MW?Ouu;`2FY_*3Fv%2z+<;iS{_RDpU zp|r+HkDb3)gzvGodGOA6SAd(MhV`N#7vzU$S*ulu9ljyVMKcHzluimdLM#RO``>`o*G~#=)lL4L{1K!4}1K^S;m>{ z4B|}>pnn-}zxzCF0(Oa-v};8BEc@*+|LFLtD8DGmm*{51gZW?QGimvS>++E^^IGIg z6&zZ{u5KePlDNE=pg%ztF{-McfzQ#$O>eqi&`&5DnwhD9m z%kXID@KZTSUUvZ89@Xp&=qRia`g(GDxVJg$f4gmNs+0UMS9{65WFgjD8ul#p09paD zBKP(Tcrl}N0^mmVIv@!-ld+PQj`%eA*F}=v_c7dt=$Se)E7zb`{<3N+c?Ln za6fsmQs^Bfjj!$N30>u^bKSoMA4BO*3I`U-ZY_3W8A^2vg!m94W+Q~Q zj}SBN?N8yu@{=oi{o5&ow>=IIou6Leb?9I2$NTp5p^qsR2ru;J{eq~&3%yH!5#ivl zQziI?W_Z(v|J{C*kElkhbghG#k`>TTVFQLKR%jNnSfjzu@l86@`$gxe!wY*+ijuEzXghQ}c9}D==(HZe*J4%E6hk zn9UwPT4sg@7Gt-0Vgj+y@zOvBsj*}Ta%lX(FE+CVl-Mu z4!kI9y%@<1SK~z3ScEM?*va)g?(Z(Rs~B0qn)dfLru3fm-l!)uOvvOxN5H<$SK(4ZuoPc zUPXu{U5(936yvpqmjCoNO(cAC3sCXY2riFrj9DW^!ZQ;U>~l+bhenTgK+Az@lZ*iP zCawk%^R)h+udeoZE|sk*sVPg4SOXXEYPlA@=+$alP);VQu>w*{PN?-piI>XowDngQ zL8_qV6(_WstG#QAdpv}+Vh`QSgkWvi+OkvFX(_*OdGaxM?bA1|aYFaD1J>_d3PO+c zjv&3qy=Q;~=){>GX6g&QOMdYwxFBXCBWlo#ciY!4guW6ka8({` zIR>NX(Ga!DU%Y<@N05R2!fe2I;E!LX_H0AVlXeVjU6lKPH>aRYy|OhC^&JO57c^HgxgqqXK1;-t>14bUH;-C@W+!gwmDU)Zt@!6aLMDfNH}gf>U5>7+Z@vMH9FmY=c7aJq z==DDG*D@|puC!5kq>aoB+UO*7nTt0^iGM9CyWK_wuRxZwV$bTZH>CXCW zl=@D80Gf~fFb1WrR8MZXTDIxA51m%rCmWa*pjXi8M~nC9f}} zH&xD&T^j6bLF01O&7xPRME_bIYDd^+^!%bb;S=&nJ zzryiF`xK0}ZejR(;x8V6jP!m54PUKY3{U7Jds!Gf*=>$I5|0(QAV21+HQlK! zje6#$$w$5FYH*sE?|JH#(2g-XDP5aL+NoUaN+Cv?f8Km5--9uw$Xnc?x{)zw%+grs z+L)!XQ>p&mpYJJr<>HRyotMihfrG5sMty$Gmi#h!UGZ{aep#07T)UcdCY1enXTx{J z-tBwfXJn6iPx-lIcw~h>{ytAxxhiS__Qzow8?G@=tAn5ZNRu8Fh)>VP+93J9dgs)j z4o_G-u?6od%lAi>CAs$C|6b#GUvvrabfx&WH5Q+)_AD&Zlx=XtlzGd_%bs;icFlJf z5bi;LpuD4;fhSo)u+9v6ngqsTZpK$+!$JS97eSQ4O(mWHCnr?NKZ9g~JHl9Oqc`q02Zm<@N5NhB(AqXELgxshCkRsG8ZL9yi@IJh>+J#Zl!oKw$uA=hB zJ@zfWH{>*EiI;9I!j&a^slQTQXg}A@^6(vK<*{;S_W`?yES{M-OE?CP=NZC!ajvqL z0yNq{9T@DTkndSla5J6n6Z;K_XjQurybI71WWwn_I0${J2b?{(OJh$x9(dK2#>&-ofAqZWCg z)R+1eVTXY^N{AP4hj0jy{$&Q%MDk^qXOuwxkN3$|?_$qm1?2yjyo{4?xwXl>ZED+b z%rbU?q*gaWWw-8lK)x9|cx$pS`9F9-{;}umw|pRbJxc_YT@DrXMSLIM4DG_#^C7%&yVw7DJ$Vj*b;gqTCGb_mc6jWYU(YvG?4`m^a#T_u|?Jv|3DKrddX2fw`l8Uye!`;r+5Z{JO3dsZG3IzQ^lHdHyrMTAB}D+6-?)UM5QFZBt{sZ^d{&Cs!L+W7IA6X|M~n$FaQzhiI%rdsK@XnBA@N5lV1;GO2!Su#+wj=vlBrQ8OwVzzD$^nT#QUzNQf4O6 z>hK+JQ0DAoW6w9HMAbEFs}ilz#Y;=zQz>U@@qYPbyXK9&%jXQKn7^X~|67(P>GXM* zAD(@$S_ho*-k2|BV+Aj2EdM2lf~pdGMKEFZ_7FZvmZ&FVF=( zG9{GfU0yM_(UhQ$me}Zo81(^N%_~lGP1k7t!fOI;3ll-jX`g{N z;rETNVP`r_4+<|9BbWAb^3Tj{_8A=0fdsJ8ADjNKgqxl+x}%XhaMXGD9QQVJz&rXu z%<|AkL|+|ogT6{GTRXbW#KHr2fkLPTL;Tz{#tS@GL9C(``i;Fmg;LK5 zP(^kktmEK6-EsAke0_6W@8%Y&PeG;;T_PVE?36t zxPSwx+zMUpQ>Ci{>hy#Fo1PfdDLA}3Py<;pq5X61Oa1wvSgU}-+%Hy;*AetLMS`yb zx)GqYmN|H(phFwon*XDvpsSQ~Rfl=-s}+zPQQOB71(Yi>>tKDu%n>F^e-00YaSCRU z<|yo;C9`+a%4Pd47B&rJnNa#ngywJQw*fIDDv^Ob0IC<|A|*MbyQKzQr`%<1PKU4@RI*=`3~Vz$3dHk`mWtoAE~ z7UAplEcV|c+ZJ;ZVa_b%JGq7FKDOZHf+QbVo7OKfp56l6EEQ}|9ZzHJ(plt5!2VO} zHlxiJnBEo*OjjeO0k4~C8yy%8Og9dBJO|yHecHQQISb{O?#^mwwz8HpvNF8h994J(>$6{@{wkPTA#49ArOqPr`s?yE<49@ifJSg* zhPC<&%6{GBWhY1vbROH9f|kz`=19(th;MNh_=1$@w}D1^8NKw-g?j8Hoq>6jaI8|< zY$O~jR{HZh#?uuy(m=)XdYg;MM;8OlvKz4EzjBx>Vr#53;hb|+z zYhFfzxGZC2z|`@`96lpnJd>g7{3s*#{GmCpn-YE3cDz0x%Seyc1hk%>2ITiFlzX)YKD{)7+^e&U`s7@v;|hznq;cqiM_(R$ zGx5PQg>5Cx`r<`AkYl=LAghSPTl!oij26#3N)jb|9Q*>HOhaK!C9p>s4Et#ruHi|X z&R#szZ9n7-qV^WQy4(@p>s}Tc;CkIF8sRBd6KK5F{J1(eJl435kAx z&DPO=27Uo2GbMhm*HH|u(-#bZV&6Ggm1Qc)_0@NC>`+;B(4eHRDVEPXxjwcG(!|aC zfMKQh*1%gJyz_&GB8(-}sqBC;lIgaTS&Gd}n8?Jfp#h1O_9HR&>S-EC%qHyg{t{pilTzjYKXsu+8c2mkg zaT%nKeGAms6-cLs+{p2yhn@MP`+d&`ruW@O->w37`mS|B8AQ%+DEL1Q*}Xmq^!Ukj zI={Z)Q_qfqa?_4=1w{ouZEmalvhmC#n%pywuvgCTt37PiYIluig{fBYW47mmmzW1X zdI|OgtBR<;US_oLkfdF5?h#cEgYavBrI7wdxv9pDJT(o4UjiS&RnGg$GCID7{xA>T zgTWq2X;@7}uC0N0HC(F;PtyYVT1!h3`i>>Q)r^!*fCn5G_!1K8(yfebOfU(0&0_*| zZ9rdCGZ9@57LwzqC6#jIm1C509El@YypoiLjv5@H>3X_s<7{y7BZPF{&5#Ga-48zb z9()MW8aJ=Eax>vKq0lChLcsevS#?zlu%LtI-};3{NDM!>*DQ<;e(gEx)CCW2t%G)b z1F-J9ASVrnN^Xt!Fq8kLXsSVf{DcEs>Ih*h^uku(PEWU0f~b-Z|JEt7(+)+kdxI(#6hZ)3va>N)zsu)^-_v zI~Jxl?GO%kXYy}5`Lp-9$*w~#rJcprd)l>eOII}=?oQRiw=tiKD~mqbcetC=KY*Qj ztUo%h)wg7T+dI@9$26Pfx*^|_=(({$S>Zo4nYa5MGkCjQEcycaUt1;PE`T=JiTe5m=G=a|enfeO#ga$V-^ z;BS7UnKC1|dmDCh(5T^6L~~`gdgC_ZR9g@TV8zDg@-FKOW~v@o@VXpTk)py~M&4ze z=Ya(-Jc$N>X_%b9;DH4lqu+KWv?tq>vqIR>-RoDu$~sL5g`#f`X?s&yjFGj6QY)ml zMe7jARde?>FrE=_#Z|=TCfu*BFngk3*HsvE^%eD=Cp=LVu@%}wOoggSWlpLy>}M;Y z?_|cUCapED>WSWw(&qK_a9n4=p+Q9_z*ZwrJ)`9;L_%|4b z@zN!yd&8kkH`yaB_`;FW|MdM)POsk~)B?>suN~0}n=0^-pWD}}XSI;`oVBm=y$;vG zYmWOmyBXef#lXjcnw0XZJfp=DAMuvqQ1~WKp3R}ZOTMx)rN#jx=4WGt8iuesJ*#i4+In91(eVp&NSVIwar3%1j6@&G&`JdRWHos^r8XG%Bk-#rv zCS9;;;142pineWRZU$CbzH2HW;yT#GzC(d&to#&$sKcm&?7>pd8m z6Jn(i9gLry(IP)Hy&jxY5@d4*7J9}2+5O-= zv{@k6JvnQa9GJ8VUt^6(*!O(RJ8D5QEeSL*zH3#gelc$eg&O)+`E$1FA)#xPm$7N^ z7CIL_SDOE@^nnTIBPinW%Puh5nmgcCB;49hyNw%7ZBzUnyI z`U}}1GFJ?-pI_0z&udci&*f+Ajk2Nn9+{i>ioBuuOiyznWT=Kwz1|mIk>}Vqd44XZ z7h^pL-+U(TEAs4S2K&tML6v=6mAL{o!uD|$W}qqYRf*f6H&bO1_@nEjQys=SyT1qA z<x{V|zv01PpmptJ#c>kP?9cRsgNh)Y-k&RlK zpQcLTlhE>j%!XR9+IdgV>Pdc{$-FB-?FY^50QPgqp6}msjN0vQ=mF8^cga&%Ocbk- z=fB0*qu+3f1ZQgY&7L2JU{}hifp5_}lJQ1EPBJyS4t62$)3fC!sUKdGIM8wyt=-g4 z`!G(;E(M%T14eR|NA9_JE#1Eb-o)Tl9-1_x13uw8kW49PH1~&IyIJD%Ub3^F zxFd)fw1^qILi2trALnwFtEZ(A(1jsAaVZZo_VU*n;Pb~C{W^It>5`wQH&oSOXOI1u zYi7a@K{e?g%nEr1)8LyUz>9BlqLg!?3uj(1AN%znuQw)uaI><7TGI-YP!#l)SN%QN@Gac~%iFmLlZ%|)F zBkm;ZK$6dAQmol)7o-%HA`aCgf~qB;tNzD941sWBWGAqB#Qx>8|m4%Jz5P*)q! zj>5j8WR)IMvtGy-=1F(MgPO??Ed#`&M;oukjPTkGLj}nhSL6M(P6M=c<_2|j+F9*d z(%wAWtKrx0L(-Kn3*Qwo-$@HX>)AZyY39As5k4JY3X{xjWGl4H%md_!24vV*YP#$Zqa96;>Id*o%jz7uuta?An-du*#C0@whj{TL&;6JiC`Biy9A)dWdTfUk;`#=&P*toTd$o@FN#@Ir8 zzK?pezAba#jA-&eP-O`FJCeGjT0U<~ko9I&_Ye5x@WBmPVI0sNj;Wljc>Ul4)1=orSaBN0>mMPJb|Eg4 z^%Ec%xWjpTT8zkdTeZbM9A3JY{{&y^6+DjCTBOTY zQGURq!CpYj#GgR2TkWnc|DaK4uijxSn;`29%W%{fDsWU80yuI8V|luFMY&EWgr(gL zSl7qS_BQfSE=XUFSdVVHvWd6aHZ#^k-lEM%H%IuZWH~2__#152gk8Wi6EAK4?;S*^ zCD&fi=~2S(%NKjd^8XIXe$2MJL4%n~Re?6ssoIxmxR!&k@VL7@S2zwoWM4oFrrMu_ zkpncc5Eka^r}^d$pEd=iv|lpL30q?Dh z+IOnQA$C1cd*cEd9XYTNC_eI)^gv#Zf7_PSNLVym(pnR)-dd0l(3u_LwE^d?w-LoY zYqT=IxoS^onW#fK&)-^bsl-rau~xkeop-)t#kzcGV+!-q+AnUQnp~`U%i-FR0!~V> z_*(5(&Mbmnu&d-@H&H_H^knUK`0LM7MU<7$AgG!sbk&70p`wT5jLnt$0`W)sO` zx_K4Q8?aNx!}3l=-?@f(kHSMP%wdhy(6!wGKX+cw?mt)OZ*d6V6e)(hcG`ieZ)&@% z%v(~cS8rKfZLUqNT3x%mYH#hXDx$TBqg8B#;$ za+=aF%IS!Hqc{us^$^mFs=sJiFvP zQ*fmhSKubY%6ceI0j_*6Ux{TWuhSJ9uAJ{P0zE+L>%pCc{DZ*mraR+s*et)Hg;>KkUnt)A#$VYYk;1S<>}tXn9TYwSy?#h-cqHIvVLd zq@$4TMLH7c9;E3=clD(qKT%Lp-_ABKbP;dhXvVP*haboLI6lO20>__moW^ku$KP=< z9K$%22L&z)M;s0Vj?p-*I0|sg#4!iQeK;25Sc$_1d>EDJ0Ea8}&F;$*%kcHb%3t3m z(?WF;|2*X2OsgS`IJfvrz*UB*CJ(Iz_i2~44K0o?WkE++PW6sMgCtNbD@o z%C(eYCCh(X8kaW%G+Yd`c7Fsf)I*RU?u4J57r0+74zqk`RQCyWcE|d4dVWkti{oT0 zN?O!n8M0{MZ)9daBtHGm!6BL={~+v0=j+qSLei)%;dOe212@l$+oQg8m&VTO-zl`F}Rk zRaSctE!FOp3d;$pB2o6jgUt^=vZEPJeSC*%f{`R@OSJo&S0Ofvl>YQS$8=cT{PqSv zK@r@Ch|XQt>G$OIfaHe#$Z`B?LUiQ|T-haG*=3{tQ=>L-g==Hy#{D&@l_~Ks-iGE7 zuv%a_bZ9u{=wE8di}#L1vK;bkF1ske<=6wihJ@#?05>LS^@FRoOZOSKOZVFBK;u(b zTAbiVus;@&_MzBXy1K$rLDw%kzo}@hcxM%zTdT?~>sHYYav8s4gqGFH-g4pc>eU-9 z8|nVKs^*Q~$Y(88*!65_5!P1*2c}8S7doo{i7TSbT3rrn>3WPP9Z)NW2mHf?j|PwH z1Dp$3cM|dG+cti__KpOWgUod^WQ1c_oUFOtQkKESoM|pgtG(#d9|flw&zZL^UE+6F z+S?5qZGOWhWBVy-2(d`FfQDD*8FPRv1xX{xKL z%a;=E+W9<-%QBj2Y=guxl@gUXdBYJ?T6K0BCJ}TD$tja zxA2Lj0clo3T1CAWi>u`Yt?&>_sXwt)TbEW5(J;c5P+RJVatTZ)__PYE_E?lB!4>7z z9s3hFJkHY7n(Bf)cLO8|zgSmPd|4&ris`N?P11mGc(PAvi>a&er)`X~V$NW_@k7@< z*3lDr6B~^2@kVWaj7u4s>{UW%kHe^gtU}iy zgmf-QAxygZLyopB2Sz`i|90>5+{lKuDndCsSZb&n=sS6>ZCe*;q}H;Vj5l4|cR8{wNR6hJ;#cd@#bBP}!-8Ii2smvSsEdqMY*FrFjvcoob6t)vANb(t}PR zl;GjB)xo$>f}78Z32-J2VrlEmng-62=T75&tw6d}M0gU4|5A;5;d+E`kE45Q+qR!l zTWvKljPK+@YqiO=R$EPhTbZQ|0;9(>Ny-@)!;D?;N^UMCl;_EJV+1JPlkU!+ISP#F zB_Y1HsG(I6Bx}^W^9wwSdC-I#66`$cn^26WY#z{9)7zuG3be}!+cYh{N?JQ&EHfjo zsb4dHx}B`ms)4~|Ur(}i!g@+TKij(6;B7ztG-tK;>>L~ou6JyYdF?~63^Nvta)J_pUM+;fbn*Cxfso5bjgqbQk>9QXtv&NDIq> zm!>%^&INkbYp@s^i^xZ(rBZ%$%Up5HfowMYR+Rg!w8;tN7@@>!Y~ll-!;cx5oNmr+ zVlQ@42~Ls9;4E5L>g0Kf8MmfwRq(cD$5CmQ@g#b-wG7_ui(6L_m-wCWeQUwgQd2Peseb6$;2WgzaTdOE0 z5MxuARNw~3_bW&aW>)!>A)-@;Iqo=Y0+@YspcP)XS2TgqIf^c0jwbN4X__2mS9)mA z+^r9CIfiapZAbKE^*aq&{q_nxu|7i9h6+LYib7EDFTp)!=m>E1wa0K?k&IHWxBmAM z(?Z+i5|iQeHlk;2zcYDkzx|iU`#;K?gL`+%!}%{^x1JH!3mt!ST+q-TGLH^Y&6A<= zMLUIr4(jb0#s;?x^OyAG*#1xswJNJWlvQ#`p*0+vcS#XxUaLJeuirUs(Nho3 zi?nk&OM*PJKkG-Y+#jIww@XH|GC+P5CH!2bb$74!PJNRCB)h#iS( zU&)dGDL+KJ^q&jX4vb%YgnDcTpO-1OIF@RB<*nX_cs@I#YYo2EV>zn8<2gd$i5vs< zy<9rw+WNodLX9Iy{;F~%u$Xi7JypKhfe{`>wl=8k4_RBTa(O3v0Xlja{!Ng3a8dNm z(K*Ua4SAxOcvED^n4=E7)%!DElO4W7qwtH?snDax#F_9L8^`5hw3!V3Tx?wZD2y$7 z`q#1_8>9!QGmWzFf5KNe*-EsC0tisi4cbt2gG-ESP=-SA3ZQWsU57qfKPCWAzSvB; zZT~Oj8ICE9F(LY5^!3m;h4iiT4dK$UdNyz&eO&&y2~Y_FY1WuAJFvub*1 zPg`JfYsLnqw2g2Z+h`|>>57GH1>>06A{Vfv$hIFq#mz--dnT!V(( z1X$6Nl%5MEBJMpOign9h;Mt`5v|yzCbaLlPJe`QA*W&4|cv^SoX;VC6mC;J0#}`cU z>G6D$TVI#p!I-vTj2-(za#X=GI)5Hyn{kjjibzKwEeeeA3OTkwtZ)A9mW)G7#-SzS z(UJ)PTKj2rw+7|CQ&9`8R{@?F)7e&*?k4KCZI#9s;URl9gL#y>xPMQv#>eShXOPw^(S;fx zqq)E-^jWw%F0moXx7V5|_ehUMe>&1r)!tTS6dzT=Dzrn-j-3-i(cVd@dt_&XccC*e z6zN;yp9u|2wAX$uC&9qZosIA~TNSnvXOwqu4t7p=F(eMtW~78@5AD+Mrz5>N@Ci}j zno62FBN{uNQCzMQvK>>vK?)cLIr5-liiLjAeq>ehhSfx6h>PhjZcpHG70eZn#jBl)QHOwz?CwL4i z71<-|(&g`*(n;f`&7bB|S`)gUHQ^)K(2er;6!!=ZcX_7Z+m_(R%u}g4;=HL;4n~B= zWdVG`>vf`5BYl`ZiFBc?n0fp2(-; zfyQJC3ZOLAw<*n2usP9K6FVn+U6p3XN$CUF4ac5rEo(AT>R;D^nZkh z?=>hCp$MPQJ4%u2=KMenl4ZLF&t#v4g)kO?#FqPZ??Nu2{wnbQK&{v^rJNb3r4nB2 zS;&5IW|Cx^;cSKE$&!gPs%IAJHx|bj9GN&Wa9D7dahPxzag3gkj4wg5T0VFoR z(NjkD^%>5rt^*c6&Vy&vK5bnBC_IBp9aMWp%>TSK4J)D0ofuNPGgm=s=$v+`76jJ+Aekto0GW&Q@VQm80n%86x=`%^xkwtG``d#ZStM z3TWKC>6uIR;%6=`kxPxM7eaAVqB*W%5=I8K0ns!uYbi2_TAn)Gc5!y0?2r z39F%HqKFVt@CiyhZeY(smymcoVV~@&K(V& zBJd2GE~q2}dOmqmgjdlU$;ZH(b^e`eA0*&AUmf^bh=MOV#58WH+dx)u| zq7PKk%nzXJI|$7jj&V3<;jkTSD_aiR{a8<#KMR;-7D+LlsPF=wBG$$DbZo;-l~k;w z+4$UyM0ciyh}RyXr=kM6w^vz3=P$9!0w>w1z`nwT6h^fdD;dTQaR^a?{B{M~tVqgH zbUr<|-p-xoEj|w15l||%9s^?k{3{=SJKvhy`O^3%P@j;qIGqFJb7nIvMM@%7On;M$XFkhudqbB-<7%~2rBKZX*}}iV>)Qp{|+{Tv|6Pz_mE|6bg!2;l*N0~nRf`!*k+2E z($8lQB@Bre%R8GXJ*8WO^61JamV^Imb;+JMdA7v{)Sf#zN8*k{r^SvI&N%}ApU}m6 z=lP?tj;g`?&BV@TV3j?YQlT!%UEUxo$u0mG-8~5-qjW5 z@k@$>M`lfuiZ-Rm^d9YTk>2;)>FG$6Vqp8uMEDi~aZiZSd#PLl+uXef*x!1T5s5v> zede#Hi2T>$*l)Y&>&ymUIw3&xh85b|$M_MR<)S4NzLU^a z;1jH)J5x)dJfE$EWvE~0ReSWTtSid5ytdk)3(-4cP*-zzv{!{10NE1%rk^QFp|Ylm z^MNBQoog$@%F7kQr@3uawyZe-Czz21s=i?`!I%TOozL0a-wR*!!FF2HNdDqFxLc|y zhkaAyZt11+v(j_NqZ-djPUkOSnX3~c8@$k#me;*2&EnpbMD7fb9d(Vw(d7l);Eff~ zU4A7?N)ozvVwb6Dw_=BhKAq=q!!9Lcg=C3OXWBz?`cu9d~hptI*nL!IhHK|=T zNcw`rwM)qJYuhA;Capo><9U|8Zpd!kmNBXa0a$PXTa-qX{uly6!D{VP=st96aniX zYLhD9hA)pB5};GC_Wnw86r?#WuT1mfN!y7&rx4l1nP2emnYDdshSa|sh>$&l`l)H*7>PtHP(pEeClIkc)wPhY%cS0#tyu>uGtaM z`+UUwS)?PeiCjE`VN0ewapvto)767FT}6h1$~%JyrT)@T&wV|6?j|5 zaYbM}i#!MK5Voe1-UY8IX*oxCq`vYibfv`K^7G~CkjBE&r|0JhkjyEqs=yK02oVL? zf;8HbjW4hl9^5K{w~h{c1>L4l(E}V69)2d<2S=e^iNH3^%-_}?>s=)tF`yTWqcJ}4 z1&q(<(>N0ve641YZ*;KC^9l0IAQ=YDf!eLx%9PNHrKP6n(v*hca>z0a3%J&G17YYuS|Gjfyml zw&Scc!S<8Q(e1y%haU|u`#Q3vDuL(lL*g+&!Y)F{H_g^ei>8CSF| zTcPUMO;+`gchdj0KmNDN|1baeUoZc+0evr8zZs1IaQGc(qx@rRbe?642?;;Bvt|oPTj_c9h~-Py6BF;2c1;{|oQMP#o6B zRya+-f}hVy&IxKn)G8{zq+df?0Gx9;H&&F=eZt7#-alMQy4p;(dXRfxDkZ$ok^cle!qjhn_Hca;OOX!mg5Qyt!CoBB zN+qvApvC|TzMCZY+uhM<4}-RBptu%(1uE#I6WDKI z&(CG8K`7Zttnl-it?8^ zW-(9Ko;8J7^)@M>J)y5yjBB13DxDJV6v{bEP5D=_Q%q4I9t6&J!lK|r`E*$2#Rgj| z=}w+sz*m#EQ{Q>hXtvWWzf-nU z(r35G5hPrQJol#aj`d$+@SwDPlFpQK;9V)h_B4DHe?3wQ4HeLF>*X=L1IWCtW#Vk} z10eysL^3oNC9oLOTXbXe4p=>f>K)F>KxESEvW2dQsU{}y&l~uBWnN8DFD%ps2mWIa zc9U68qPKLKRv;m8+PDyJ()PkCy&n2Hy%AUkOQ4yY(Y>(!1z@Z3TKM8b4jW*HmY?dV zoBjQ%FJSk|!7g)|m}*A+Qq+gMq?9|8*-%dj-f(zO8+z^gNKWC3gPn-dm1<6A{{@Rh zV?JTYki}U+LKOSpoOXOv;9*F;>G}e!hPq=PP(c5=Pj$84{A&TX<40gwNl* zU5X-zoJ&-&o=V5FT0ED,}#MCbGzJS)}twe?XA9#|_l79GJ#qy%lVy-MTS?f-pc zBkX`yvMb#h_&A=H9O|j?8q_Q1v#CG{=h($6WfmVie_^87E^&JxH;6pY>*Ry7FA^{N zBE9BPK~+&`cPGQFMc zsKS4>1~H$be+Sz5wnY@}@rs?JSuSE`*jY^#+QdKm`bw59$Iy6z{^!2n_rc2)nC+k- z7mH~vWJyKO{ft$2(o>GA-O$G$m7XvXU#js$_ueJMvU8nkQQLN+mOPpi2&}6(z2riV z%5eIq^oX9z=Gc8zeYI|l612!PV*}bTyNb@1*xj1g(;Hq}=TB>mXhrn2p27>KrNn%z z|LEW&#%V8g9VbA0HhOJ=d1Y2r3vq$r;w8w~u$rx2z zrLlF?I|)_GunPAhCNb_gk4k&EUjs$#1>l_Rv0;U2Jo2!DrxsJ+X~1<;uSGThcj>&*{~;s-kqwX$?rf>`YLvjs zKMc>nznv-fQ)?_zgxs2UoYb1Jb^XBqr}l86h`Mmj_s?~Hjgs7<7-K>HT!)I zm!IZ^2J(siftQDtw$s?u2D2b_UCA6h0%TX5^@HGte_wHDJ(z>I$aNYZ&7>1*pfg6y zhOS$(r9AhNbSXgy)k&XD;;fs4gl*!^e;$2Kdhi*x6*3J^8qY=8chs!KMR9P@*gjkGeGpSE9_l8^v>W)ZOa9H3wC z4jh)Aavtv0#ZCoJxg4?;T?Ez&?Lgnz{w#k9IKF|t)xf0+VAL+>1_s!mO}=U~U+X)L z>*aLa272xp1$-R2XOe>S%q-mX<8Fn2eFfF8(xJ%HTZ)ZP{6|OP;my)jbJwIS&HCUVVd!8t5F6Dr|9B@vrXvAJxd`X+NSJGDtyr$=g=V+6$3Zvk?{I+yF z54}3L*mlF8?z`;wf?qtmT^X^$z$EDEE0PGT7=HplRZXGP?!TZoUpNSNCDY;@ugn zZ%E;;^{;V|hDINVfVb)eL%hVt)=R7OwXlWb^Yw@WN_b`pAE7V-_rR^_cjm(1sHm=p z3$F1idslJUe!P{}qfh+T$xh*F-~4O*m~ih!8x0LZ?N zahX{2@|G|2V#UaSVarPRE2*&N8__ph!!QsTg#C19EE@^WT`sFPsGMXR|7~yzsFvpn zc2@}Fb;pEEK9h%!X{2ZbwwN#;^n6fb=0buQ^)!ZSNV=#KSmB>5D72+iX0TmD9G<|v zCF!i7t8fx$9;P+4E*o3}eU+>s<67KJc-(ehF7>MVx=qwjYyzSYXXbM3?8O?y*(?8D*|bd?Aq`2?f3Aswlq5qBj6q%< zl%J_z4qMaZtLI!at?iU-++0U3FgWN=_&PLruBjJ0A=mlM+!TA9|A#HGL*aGx?Uj7{ z$##?p7yTscE`K#HR>hzG`nElQz38p5caoy$vQ80`r$PMP#g2G?gYXK8gTnW_4$hv6GVR3SV=13t^Iw#$f?al1W0vN9{%regVqMf|A;RGs}nC zq*B`v*eGi{zbR8(p08*fOgDOqoL4?{#<;U#u{!1Eh^#7jDczP0qov-}=n+^>_Bg`r z>y*F1=lK2fn*)v`mGKQL{0Tt*)dDp}t0H-!mA!SI=ENVX)sQszw8ps_rDfRP&~|ud zX{bLb%FF3E?3^6iTMhh9lbUhG@2^};d5i(X%|jkz5ca;5!&Ne6YClIyK;?vQ1A zFM{sh^QT>q0CLuffZp4UFHbgk$=!dDzjy*!b!_)){ujDk30S(+k5sbQp|zC9I+F~O5?DCmx6!I6Q5*R=V(k>g5fvDcGH{I zv`>d@JK`tr5g^&-A=!@Yit)w6^Q4y7`4At+Wdybj5SJ~=ozP#^J@p^p~X;#V%!f($}}GMSW~a_Q_fl z8mT0o(Gi1Km@%Hl?{(ZG>=#`EdZ*HHZQzaTF@+eb#yH$4EH{;*#uc@k$dhZ4OUzBtx1_qBl~ z*L7ZA=ELv?nGP0m2HdI3+n2T)^%?!0Z@Anmh+ogB-h$b1a>gxIm~k7Cn$lFW%F zaJpra*;9y?9DJ6d*^XipdKUDbe3s6#d%`(0dtNU3HmDi@4frqn6!P)AmimVqSFR~; zsPjP~XzbSx=h_S(<7}@qBl%4+bp>46wyHx? zX93BK{!(?=G=+`owwv}!?{l`YDa_E_AsOTLN*{1>W{V^plo+Csc zK*1Lo2w3Rfueubb@W>5zfjbpbP}XydELt-RuC>cjh3v%6pd+y)N4(nSV1$91EeefenH}v`?6)S*c)W?oz~2X56zmcwcpo5*%6y zpDW(aw)Rjx%k9zZm%eiNO(+plFJ-+zXhG19q_Bgx!tEFy_`@+8NiQFa5p^CVxGOiX zv=&~^#jZ{9+=|5;135znd%1|?SDuFCbH$6(+l^(jnX}6PFZ&wbtY{>dUx9>-WuO&2o+3-LHz2d1fWC!%jc^J zv4I;CRG~jy-L^S0V84=v>uO+abIevnytKV)B`G>2oY__wcs&7L_Diz)YKbOO?8%{0{y9QZ%f;%lRlB_PC z?Hha_~bsroE@K3VJL=+=hKj3hN#+`YBFzyJ#)lFF(;!X)XOV zq!Y{2m7rLEgP5CqP(Yu{@ARNernUYrT5F_wJze3<)IO>!kGkF^DN*(ptyFRwW){`5 z`&o>lh!@ay!n-NMz8mhDQK*&6W-a}%zqd-?=ihhj-POKUSJBDgW;U z%W_KXp${v$36p{LC- zMo<(4K7weKBt#1idp82*ZKiftIA*h3@9~A8 z1@|PeNm6Zlt)zg%6F+(HB*lba@P?xV>vg3`ZPE08fS59k!@Olpx$HOgY64cPVMO?W zoQDO@(--D3F6#BhG8aZR*Pv&%VPhG!L~ozP-fTKiw&4)pt5XS=XRCgPO?D>VntH(L zmzKvLl$M$i`=WRc(zd~LecRwD<5ol4pb=+g+hRj^ku?Z8NM4Vc?_+or#7K|d^P zOzGwYh`^xi{Xom@NP_&o1lsx-*tBsLwHXn9xOXA_=o|1!N?FsZ-q$y=9#Y?F@9_ftrAU2_Q&ZVm47|$m_6Hx8@M0&~eiB$XSC(^IuR1Lu2 z*&lxH@cCjH7BGxD5eXu8^dcD^frrHAVO5z#M zk71KO&|_RmeTS}|ma--xqJfGqO0p*D;r~b1_v8AwNr-r}{zR$^D8!tF?jj#@aF!{^ zGgADMf4zsC^)ykKfe>hs&BQ@I=DK8rs?yD6T0on*_T zeL9s(J@f%&A>+nS@1=tFf!2@BK93$9L6mO}R+h=E>bzhvVuq5Wnb3>xLfJH%)BGgy z%VF!z(*InW%O93eFI%<0-k>i4%+JAieJrp(VB^7Nb<*#6{AMHluJfYfC8^{= zpx~Oa#Uf@`kcW(AEqutZS1yGYG}fjE3)#!(Uo=sBZgdxoYG_?>?dAq=k)~6BUDan# z*=I*2i$dT!Xc2|MU_y_*C#@W7Vzay9YipP*|DTm*!uvVI@qPwKg|OSj$XbHOz!k>9bsr-}lS3B<63)rwq0Mc8z{l>r#hs(owM{|;a6(<>qhK+2GEIaAwaJ*lZ zJrbDZ&zLbXPL};qim6LHb`mSiNy+A%23qi|oBN=zDg{dCz`z58Kb76&{{$}qh*6N- ze2QO-WBIyxzxU~QNOjk3DW08zaY1qk@&S(xxuhjPdybeF0eSPum5AVTL$SDFYtd}= z?Oa&@<_r&PCG5^uOFjz6H>cJR(p?4{*5vpt#b}}JzfdQ2DC3f#Y$~D_j|h%yr#H|J zePiI+!oYGDPm!o!)xhB=Vvs303!>R-AGC_it;!4~@PpxQ_X6+;}CqpAB! zQr4?|BfFEK*E^xg4w?_VB<=(eBAA<8v*LtUcrwT(5l}r_3sw%dNod z|Hn-y>~h9^@DQwZqq~%5ao;lW%0TJOhhVR!>YB3;(Mx$H>h{o0`<1waCdi8nRlvEd z$?jY>@x?$~=Uvc+{;o>dS%~!CoKq)G2ra;wse0+erGfh=+F4&s@;7hdO0Zhp=|Y-Q zy$4snulewsX8iM3A7?wN|9G_)RQS1?li%2{SS(FN9E-0R+4;w-m*EflWVIG&KWyFv zTK^Q@Z)bn5X#qcwAm{tI+J40>pJmn9uf*fb&fc&28_LO%uU@W>=(JxME1##<{PAie z-gBVlu8V)X8ileOYL2s`C}F((+#5B{i`KRC4;aek?HAw+`P(7%4A$y5YIaK#b9X}? zL2EGRUc?7VD7KW=BR9=+e%Q=jyAG*CqQk-Wmo9qq>hT9w70tY?`TZ}yra z_LAJn9?HJgt0; zSLxy!GQIO!_=czhiU!*O(i~9jBE1p55$x(MUl7Aqcd5q>1pODR zjx5-`)RvECPoMc3Uguv+$8(wEl;JbT&43$)|EGb-L;v^S|6ct6I2X8TMRaAa?KA1j z%+I7w9H((C#Sy^q*O?zYHsi6+q|b5wF^=OnI_;lH_ZEL9eSq`BINqB%v}(qx&!mGm ze+S3DnVU*!zW?mqM4L%0G57T?yS7K%bb&jTomIU?nMQ=J=~Mt>rZsi}m*Ycv8sh9AJv3p-$WI`sl<6=5|lbRC9P%Fgbo zqIJl?hHe$ZGHrU5=mWmBd1?CMR_ynAnjjzI^OS)cM?5g}>@2hDWyzRlKp%gS2W~tb znt#Cno8pAx=nEv5;rfzqmv{QsOq7=Zi#^d3!~W}R_$^=Dx*no<($_-!r5GnL^GxaN z$ulg3uXV-hcpJ2f3wVY!hOkRi?T{XMH9Y1+&Me>?+6_k5dA2`vNLo3iBXsyGw?Nq= z`wh&tvx`o8epc-%sgt|a=K&_=J^lW74uJ}yv2s#=epZ%|9X{KR=Vuij0{^doR_-(T zZAtJi@X0#27UXnd%kX?|>vAi!HeM(zp0m1MA4SMW8$1Dgc z>{DkxT&$c#tL;82110_{fY_awyN3r+PQK_(EnNY-log&l@L19f-ePg)K~L0Nn(sSk zw5%%dl{%YOP4ZnRwXB}(TeYfr^%UQQRhBh{zE!K6*G%orE8<`o21o-YC&Pp>M4ZW^17F*wTt%=Uy4Y~(OL=d8h%(H z<6q9<#=H*8tF7=xh!qROQK1`})Q)wC`aMRDD547{;Op`fhsaTc{+v7{gp~e_+P_xo z#Ch|1Q;FEK&OL|rvCBbz@@6eJ@m#P&dhZw5DE>_ykO%7e$GHD)JG6YvPLv!ieV1XCxTdQ9y1ruyw#RR+vq{WyLxbrH7pL&~k7?D=>F}1t{^QbnBb>;4kBNheapJy?NxRDD4B%~F<%0GB-}`%~a9cv! z;!I(_bA+$?RW5P5du~E6QdSI~P?f0nb7Sukiy*CZ@JiD%b`Q8lN8Y2$=CmEDobI1q zX=x)l;S{#2d$NHdQBP#gb-qwJ*>J*7Tq$vZQ^gg2vY|W=tK%u`KI9{-<$IX=j5;)h z3HT3=uXLdA)-~b={}%l8?}R$plajWMbd&Fx5lfzP&zWrCClyX1zLJnD|ItGzpz~#f z*#C^vvaikqeReYOuoECZx<0Uf2)0(Hl;sl{gk{HK z4dmO|BN2xPylj8pyuR@cZv0iq9AI7PpUFa9lMTkQNo-6fm-$Lcm~USNK6Xian7d88 z!^^@?Zw`EesrHv)ZMNol>PKjR$JoSMviCsL8_8nZ79h4M7FVUKOfRiwVAVAA4tA#ko8?tAgkIgspVOi2##6jS;Cs}EtI(~ zsRXt(Q$d~f50u{EO#&z>(lT>(OW3V5RBArF6+W1p<_In2vL*yLM`@b_oL`<8Z!xl8 zbuIPhZ*@4rXmxliVp#iHjqKSjd%M+v-a|AHSTcboS^k6`zWKCLr`4M9G`!UEvskGV z)^rTpI3pLbLtAmHX4Vx`zPo5~VAhocr1v9DMLG{@4pI?m64D~1Baz;XbUe~&NEaiW zjC48DJftN^Cm_v7ir6(*-aRcYjV&`TZ|?bEXNZ_ExQASSN{vV}N&UDE-h zD~&zetqzeCMzP;`z|?Yc;I$#(Tn9}aAv*&0T4CL!663jm7t9*)P5kd^uSgG7I^qu) z!8!l?;8Eae#wj%&mGImMV+?Iso5|9y^RiVm-s6FV!o>I%o|%To6T|3p&pzK{29pmQzeT!h%Fpb9I zw*n&e|W3!%Bm zvTXxRKNIW654Ut7aFu4-VcwIh@L#1_61I1Nr73XGhpM<^WUsaL53kDWJVw`oL+}e3 zaz?ujOOfT#h_tx0JWf2;S}(>oDzRtW+tV&3l^<_SZETm6<*{|qo)R&w(Zu%NLX?Ni z`Z_*fVzoC3S51)>5m07n0#RA2z#c?lUx+9e3Xa~3Cvm9t+}MUF&tSR@{sj#Yk<&0@ zxW+6tVQ{9$?u#vt^=RRppqu`_7}t12Olgd4jA@K$Ol(YO)HZ4wM>H5*y80+r5~6I~ zAIh)Tkv`sP3TQfcYeHb=DZv^a$g$oXObp#+9f|lVT5ldK?eauzLqTYsH7#(~Y734I zX?BhewN=34FjD8r3i;C$>Ju9>pjo5HfV0`#-H~-8fBg4ccT8QNQ-hs`G8Pyc6~*ZXG!|DqJ2Gg ziG(ho2}CwcY$yMqIPYxuF#{=O{4ay?O-DdCx73h*K4c=`tv%_>EA(vEP%cIz2YG_9 ziRQJpMu6o!$9C2bQvA}_`}>Yw(KWq_x&K;CE@GzUVr+c?pOx7GNcrI_T?{=;1MC~` z3fMh&`@WJ`xj->k>j}4re1$p4_tW7chP5|1{dEiWMVB-eD@abj1UuR13Kk+Zu%@?= z^HrFjYqK}qDV1vk#@QgvOWu_Seg4+~O)t8vQ79V7rzuzbm08{Ufsn|myZEuNgxG=T zyiHqbZE2Im*X}4|^+B)zRR=lop3GgRvzIuG|64~2TujG6dr;Az>5IP;u-=c4$gxMB@7 zS9c=d@va2eT;U5Ie1MI=jdtYI#0Tiv@;lE$>O{|Kn^KBnU^7R#`Np5IIi2DDngjeh zoq58(D}Ba+?ej-MX`qE%dImQC}+SqhQT< zeB{p8q>9jM(x!t~`uKtIjnPdO$JoZZn+SC&t1-5T?Ehbr_Lb|KApJXTZ5+|`nsm^{ zHyTjCO=`|mXPy8*D|g+O(q1R(bzIR{%zg&Ssa*b!*6N5R@|YM~O(SxFu~EaZt}=n2pmaD6*Fjh-unb@ll^s5z#6+BO!;pCFsiJWP@0Lde zis1FAoi$d?Y~tZvYjMD0_02HiRZ`%0en@!yDd-8Vk>n^bzQ~Yu(-PpwcL|z~$lKSa z!3Q&%?dYKy#<640yPL=YFdGyaeEWGFTPfo;%z*AR8c$?{s+up~na@Ucd!-0yRI)G{ zMzYRxUid`!fF4etlIn=`kKQ;%zM~Ii{(BXdjpJIMG$7wC3tN|{Wb2YF(B`99eHYzH zbC5q!8rt$%-|=|8hqNvkJ*2&MOT0c!S$v7NxDl`iQtI-kVz(sd6(X*!$%BSljXbI! z^Cx!bfmdmN; zza_5-e8O^j>AXP^b^kmISRYYKfdM041GIEmMh#Dmqho}500=k9po}8-g^3ukvm@S$FX(i zOR*ESOX)J@)B-8t=W$yNC#26!9J~L6cGRKNL0rGe8c_%T<10lkttr!bmPjU!_ND1B zc_agB158nt_fq+Mg^A=2PO%WXK79LFdY4n)zs9~qJsW%AIwIxXp@`K1lx{ofcF5rsXnWpLnAxr7Bak0v<~yKivd zv%x~Nfatzc(q1#gOWbRw>tFul`aAOVcg&rV!M0rWR7dQ))Nj`ZB8Rj`=EH`lfKNxv zY;K2!CEud@eFyvVWr1`^VIK?}l}b3ODOU$<2^(Q^E@#Ivr%Lfmq&I^l-kKE}>3I{l zV49q`An_bNAsSwu3laZfYgZP=*g}4!XA%34F1>%Gdos&A7c1k47Vz^$daH(=hkm;T zJoi_MHum0qXJvT?XsrO&3p=elkwy_3Y5d32H=-KBkg16q^DHW6t4m>%C zuUa}BqhY)zx~^SHUHBij`>ET(Pisi&E=~9O{7)j5*9*fW@7MC6sVTux=+&X?I|qA#-# zwyK|-!f*TBls>ukrdz+O@>X&=cJ{aGk(<4F zKKto63H{Ye?)e`r|L?7()}{ZC*7?vQWM${AKIsUzaQip^OO0eyrRJ(|efC!EuH?qs z*DQOS9U^0G2UvZC_T3i90#La=vVK2HKrSaLLgCpU+ z6IT7PMtIvN@^Q>~mdl(V9uObC zpz*5F@;OzSoY}#Vn0x<;2+G(&xbHje%&3Lz!ufyAsJlADGiu8jnyDRukv?DL3dn6T zY)z1HZF4-LRw9ZdSx02EhT?a>FHj_x(|ojLZs^Umn& zlt*9ZPe$KzIB+Jc;p>4f!|7`k#x{hFY&o9?7QFRj%7Em z6CXyFK03;AJA&0INoxWgBC9@|?yHgKr(K?tc5~u|Q_{Wi`Mu_t3#gUs6~~PMTJ!fM z9Ciy&qB+H<*eUE(?&LEQm>+R=Adk$XT1^nU%lNVQKCAxpA0x&8gb(ltaSD9HQ*kyD zXOQS*@`$$Gio2skeymrFMtnPdY-9*At;A~Fe^?BLCW(IoLd7HC(8<=R7*tZ$B&%QJ zQvu7GX2ybkX z&70_Kvsm}~9A2fdqpckWZ$3m#I;#1---LQjvT5xF(US^e7}-ACi6 z*#$Gg!Jn>73;0ozg>&cFgM;C3n8};_U2m-Y*D0|Ah?$S^Kl&CYe{(`yDfOq7sVQj1 zoBO|g^TNMrj*9?|qK4NuAl`5S_g9_>?pDfAe*+$TLL^i^`!nG{XBwDdqTBIZ=Kt*f zO;;K)2{qkqWg0NaFBTRry~9<+T7jpuZuGHG0|N?Ddj6BZ1}$;P#>)c@$od3-Kqjr_ zy@?DWz{#XGf5o+)4a!5EGD6e*X%Oo;>+itBPf?CUWU|c{9s|Zo;*H6kFPvy1i%!Yc zwxDj*;4K5rQk_p@L}t|i$tsv!Wt03THmu^-T5X$7i8p}R>2HCphF;w5hSjK|RT!cB z<Lwr))0Q*u@39`L! zPFzZ7;>JARvWl#B#D^pKA~6TCSf%xL??fg{N&8O3~C+a&9cn7^;>w%YF>I>i-!`=g6o9NUmL^NQlSi5Hi zFGL<1pl=1(Djc9V?=0R%-u^uUk*Zt_|(`DlINgj<(Z*Our1X zg-T^!>f$D_el~O8x}CrfSNno%t;kH#ATQYkeQb7SZRG_^cZVk+}rAiR0lny%Cu^NJz-XPE$m0xUdBCIb%-& za@6T3hK&btg=C?>Hw}4=40t>4f(5_K|2C90m`O=Tw~UpI&GU`hG#^X@?=qJovj$bf zY(I|d5GqR%q617i7`MkYB1YGVIHAO_JkIP(MZR%+_c6o`Uc{AM88}~N#d}HgO_r{p zf?sg3H5+{td|EFUgs;ySF~Y$UA#9h*Z4z9-#6mxh#;Q39LQfNeUcJ`70U3nR^8YUI z>^IV{Rpp1WFE0j1NX(&XVpLiIEV4X9%_nahjNCV9-I#)Fv#E*5vC9PJ7O}lY zAIwgJ4n!j2@NSF%W8fo7DYg2j9a#9e!aK;$K?H0JX)(QvcwJu)!0l2jESBG~W(co^ zZuls^zOttjUUm2GYZL2JYQAm%c5}AMbP`${jN8DbLGM_TC}`t!enU_OTe3i@JcZ2S z)C6SrssbkP&yfN=A{Eca2-|x}iA#5?49bNwF@k3~uSJdlElT6e2w|X8K1qM{9Z6e{ z;$bTP`BKVc;=rESRI_kylbf&(%{iRkT)IDX3UEv%$Ui{L8%iTNP}FOj&!p)jRFoQL z>Zfsiyt1tZT!xxgp+!XzuV_qHHeLjdITqPBDCfFqowF)F2iMS4e^xn%TFXOUS|X&M z#dwp^1O8|F=05Y}W}WW|Ut&-;Nf$U!nb&UHl!7sz;zk@eNJa_v>xy8;aE$k0s2_|x zcPou-#2ywA4lyzVEpujtN-zx)%K^peqI?JCKsPgE-J-SFBi;?>sW#XLF30Y|r+lwf zmcpmH!e^_b(hNp^iR;nG7P^O)6A2;4G^k$SNHi+x216nlNt&i>t|sXRmg`3 zU|1{76q4bgsgN_NLxk=4&ZK4veykFwuqr_#juyfm2DT(PpcGS>Q0kJA4k;(lV28#-aq^B#DFKmEsq`Zt1rnwqwxw z_kd-k!>01*+t@(XrW7C006b}C!I+~A6<2|?_-RaN^PwcZ0eNJJl`(t| zVp4MCO*}ck@iTn&U^^g>shZI17~|m4GBdjppw^*38qe!f_ipBPSfF{51I3NKzrl>% z08|&A;veG6V+JF0pa@TF&lHoTyhrg6ShVmahVc(TzwUgc0!(0ufmNlozzUG3OnEBH zg;}oH&KKp1k@p9w7Z;ZfM&5$TPsu8gvKAIIwzd|Phgb@=R*gsH9a0(-O4AsRnyt{& zd8-C68wT7w3*g7asP2qG7ECDor!eiC!H2?ov8A`?k@JI+3btHv+pD*T&leU$O*F}) z4kp2`L492vnjzC3Fu{%sL(g*TekRpu358dO!)t6i$9gi$#(933Hy(d!_?zGvdtl^S z@FJpoYELMrc*#EGkn5uuCj7it#oIBG&IIDh zl$wsbV7KI<&H;+}qxyK^g|n}T46|YTYw&($c;%THsOQ9X(xglbDnp}@-E=vUe8bS5 z(YO%!{)|Rg2HdWwILrSeOD+5>7l0qi7 zRNj0bw`SY>Be$-Vm#EuYN-$0}E#-fR#18&doU!LH*hQFKlvl=rJy7Q1JTozWLN|NN z3XD6#O^WC-mLZ+=)UdGJ;E?|wMxsMeYUCZIi5CYWYr#tm9H z_;|7EYd|deg_OzyUhY|f6#{Z%g?ZPqq?yB98Y>hIPzJ<|-usa$kSYATn^+pMnIkzL zi8o}*ZgXiXM!%l!Yz8<$j;w`uuJ05L4$2?72fzGJcZX)HXh6=Y33eD+%uv4*PW8^` z^+43@cjV6PSwo7xgmM`NlnXl@ZCFjKsKfRbfpTGBC6I-!lCX3Ne>NgYKu zpKhM~1IFs{7`u{s9!Fgu+HM^w^ut0MVnL?O2GS`pA>;Sm;w|`fr0`9bbq#(?FqRG# zMqzdwBTO2wy5?LiV}b3no64Xq73e9OdpX15$*}?@;l$@~|DvlOC3td-_*7avIZ4>R z6#J8osu1sq4bHjz&pCBDi2?5#;JKH25X;HF{8xNx!FB>%%@{VQun?ExnuSJTRS($& zr3)z|)hHD8;2pA7@CnfKE;jE_sr`5(quVehnfYZ;v#FznMZoObi2M$o*A-=-``#97 zrZHo@t+_x#yo&88CTEF{e$65@jx=VQ;%luV4@DO%wzumRiBR%Lu|x_xG1ShW-8J zB}{*L@sG!wbm~Bg!rcE`Cp5T(QH+tUB$G{(O;u0&Ye2$OU0Z6$CYpy+P-yg3SL)g)3VVC0cKWeKBvjV}!gAze zZ51cXP)R-UXbZ>m=hZOo=NqMdxQ&mm+18T8_W*IG*a0mtbyAb2p{Fj^rD!5f*AK!~ zEb>{v>&lK-@k4eiJy87Wm5nb6+!ItZCxGKj_{LF4u^KenXqq99FWyj+1TF^cNf0<@qJDe z^#HvPKx8som{k>Jm(vSv(sxId##?ekgE0~NN61538RCb+-x1wT4Jy1S`>zrItU7ch zdvkK&T)Wa6J%(bq7UA7NJg;5JYdmqmEEg+zZ@M3a=jInNUoRG9TICoe;?QP-=lb%j`sC_=#Y*E3!F>_?1P)?ce|UIWRliT^2gY#^g_2G0Ut0rUmt zZy+$}t#XvSnl00_u;1JX%@;!n-=aZV#_@Pdn)RQoa&6o2pLsK4p zJg7N73eR!@(9orR#anT2W@2>`6I!hqCT#B^OJo5rgkvJeQ%n6trrMIaKN(ht%MCsG zJ;PrZ@w^ZoylQoQDc00e3_1~hJQZ+#Uw{SNz3dKRVf0%nQGXXA^}r624Zy%6nbMQ) z1*?z83VXyYakxxuCYxlKpy&e5v(5S+Yk|&Uz%Z|N&k=s#P1XWsJA@;-w}`DtYGuom z7^5kw>VW+XaU+pc|z3fEw=wY*i9YM&`+a-+dvp7PuGW&&Oj8FHctlUJsdp%V#@P=_$dO zkX>Jb`KOQ{4!!Q-9oHky>x`AO#0h6Z7TZET&k{YKlu_b^f1XvP--}U5o?hr@EF`E@-jO~~HoJoaJ?&Lh2=kzZC^CvVHQgeYZV4t5U z#B|;dc2Ue+9?~Gmf)$;ujzoSpm?zzfV$(dl5zwjuCW+3_370zW`hT6F6LPy8(ittd zOFH!NwZ~|I4Y03nk8Rww& zW@1LI=+WVQ-TAiew)fp6^$oBf-RTFp^WVo9`NhH_&Ya+vC=v9zEx@3rut%yMl3>P+@v96)KQ6qc0uL1DRrvlo zGxB`U-VoGh(|kL{Z!;3%rQ3>6@;7aTZ$}Tm9Bp@=ren!xHB2xe6SwzQ6pwoc^J1)U z0G3N8G)Sl|PBwoC3&9SLA}NJfyK2ZQU|CjZ^EFi_`wA;HzLd%oU(_z(V4bQJU|Ky3 z-s`C;u6;OXxUdb@uW@P-IO8a7ze>+4=L(PVUN2$J_eneM5ZbG1npcUwYbQw-M;s;Eh#c^q3uJg1>~c zI-10sOtJ}R{A?1lt%_iyq-8n>R`Nnv`;%d>{&T9etx1&Ib#2h-$ymfESI}EpEg>If zOT4^yftQyMGS%%}K>eK*m$PS|@qnT7sEo~gIJXJjAR9)V1>h*Sm`u-n5Ee1A9?WZ~ z#HbydYnjz9-3hIGIm@Od2zq1)k#Eb4c*C_D)c>uRW#p+^UqXe6`hbkF$bu;wKW`Vm zsV?yNc7qM^3&Rj!tz2}i|18=1o#f+-SL7xE=jVjQ`(iGk&5A1!zx1-h1oi2(oN0|%d6T(C_PjQ zLy*_MQ)H(Tx@aXk8~!gldM%hKnr)a3G=dv_*@ZF1i@Xim@8FeSrrX0@kGvu(F{?cD z?S3XEG>$`lGRAe%nRw+I)mGEIdjmT$UNbgQL7e2sx}9~Q5K_)k%}#Rc6c102?mak6 zfial&9-h8a+=DS5cut!FeQGdr^Tt-u|CeE8x9YL=3Dr^&GV$yGLi6khVRRQU^B)`* zV_Cr~gijUM2V)wHb=>`RzKY^ZZLD|=oqs8 zGX`vke$qP{E*MVd!?$J=_TOe%Ab$akOovY^g57A3`S8-;ifkE(TAby`@R{Twtd(0l z{6MD9jXM24ULnjoLmUe99%f4Y!9U&1ze>L?F#xMdbvhmqIfbCRU8lFX1r~3st!;_1 zDUl7+ zZ>!{F=K?p(a7qtZ8k68_FTq&E*t=9|r;dnvdo=$grB!J&2ac3>D@L3mFQ_i0lva!f zMLEC6r-l*??bTyVmBi7yf^22Py6|Uk6JHzoV9CdNq}1B)-f(0U-779&+f?SGd-Z_P zlg?j+o@Wv2a7`vHCon8XzjY$dj%@5gMcm2%D)()5pV&-NEm{f2g7HviA{(a&sDq;7 zjo;{x{CG_#uKB4H<%`~<72jR$KlM>}i)K5U`8WK3@Efy=0V5%mSbZ8?f$(!jB6r^+ z3Pl)C+_HF5_#T#GN2mc1em#9{WUkYuc zeweTu@scSSsr)EhVFJ!SJfDv01%pMms5jh*e0Y;FPYMo~de)tOHBjqt(G^qVOUhF8 z168m2;ulhle7@4K@VL0${N+kjqkO8Y?_)(7`E)bOoTtzhLy?EY?791$sz&njf;(Vv z9FH~rWPczUAN>(GL%E0a{>jh!Ov}(esDR~AyS@Bj^aVst>!bZ4w$$6IK;K`0=aG9t z5xc0Ump8UtVHZyg&}x4S*0Ku&;OYdTe4g}1r1LBdt%;JVQC8r5?HtUzDlYfJQpdR} z^?tqOQsm~qKG)t_4&DIyti4qq;l3$#seJT~-qr=UlMopgRKKRE*ITmrOUU7rH!Zlj zmTQ8ak-;8#oe=$g`PN9g&d*@gOqskPC=yAL7-`)x;%gw8?HsZSl%6(e3~6#Ju`XvC zGBDm);oW-@`54)P7WyZNhFx4eh!hfLwEw?SosC5&Hm8!AoJ2 zFFL(6__p|w{V=edhk>^)%6?n?(4LoV$|a7Fx5d9=I}ysBq|`t;`Z-{}A7Aci#um|I)MujYB;&+G@B0Wz^9;OK{MI&)rCa+~Pl2;e5 z)ffv`<9Vkh`U=5ZQn-p#F%sKnmVV}9g2}vkEo)b=*0pDq_P7eyDjMnNWo6rZ=W8e4 zZoM|C^?trmohj=(#ud3}&Cu-HVr+KOJAM}LnDZ~VdJvz4j!wnf%A{Tdt-G4D^xUTQ zsGY6!e_b079(5UJULn#vsBAutNZ-pDP4c0qXf93kw^o81b?6MB8k3;0%viP=Yx2+4 zYNa}BuBuz9S@^KCZl&qh1Eq+8W)7^1whWVy(-m_&9&ra_Mt$T%*N&Fsq8o^?mB@JL9d;>9%Q>Hb@%u&eLG5Q_Ph%=Jyk?6)KsYg}$)jkBrt1bRT7skv$nX5f*+p9l0!)%-KAZMAQWP-dCT+p69W zXEDz?oi6nYLgcYqy7~=JUz4A7y1?{k=?@3PeKkN;jfD!r2IEnq^|ugPa?4VGP5aHDnBkA+kMwnS^KK5+tB#+Ra$5N!@ zowHT2{_`;w%@f}5WP(*-C)PGqi&l5FXsOR=OF?E^0nhqJBIgj9Z8F&eWVTH}W*b!3 z_rh*kgnDIVKudsW2n4n@&m*UeS_4Q(Yrs&dqwKaEtXw|0365`fU(H$ZdWEgTtN1} zc+jBt0xeivw^DnRg66uuX<|cO>G>Gg& z{Kt)T&N>`#XHS^6RmFtvMij7yp;(yyHAQpW0i|%CbmwNbCny7!;Ka(;ZJAh4vG&(( zlkq9DbI?(45;=SB5n46b@LvI35m2Fsk0fj7T;Nh`Tdzi*xbA{=p|Fc!)c)VUxvu9! z-xK9AcwF_h%9$&Sb4(uRj;e%UbZ>p_OQG0Uk86&pwsixz)|ptfHv0mb>T&J``+8H= zg_`3E-O2Cjy4(}CnW|jd3aY-VZF0X}TjYMURvS#K>vWgaC0D&(SA^dh-Q%|vx-Zs^ zaPLMRDE2kiswXJ@Kfn6BCHLL#AM_rnf8Z^^7fH3G-c8ZRCDNNp(xD$l{YznheKmAhsJ^}F$A%zbsr#-(7)Hv2eVN{zDV^DW2@ z^jxUJZ+1l^=2AOj(R=!8FKmg<&Q_P~DH<#Fx5r5uC6!OXq64PmuS%!uALxlfi& zb6dch?Q}7iLq8hO>?VBM9=9H7%FX@8H}QP=hk4B(ne+{QvkN6O_<@#u%rwlOhrtzX=pzrvWfdfD2ZWW|fiR%bn>hAnrDd)W2&4M>ctUj-D@5-j#&NR+Kb5#u7-8R92fQ69OH+gK5>t$ z$>jhF=1Qbt@ZR9~yvwjj7&D%{T-ZYXTOo4)jc3z_cD^OWeucV_Ha@!=bDy+l+NNdNP;skR7R<#y46RhWV0_SnA-Ka1DuRwD>P`Fk?^WFn|#1!Ch zKgNGW-vU`HdhS8-x8@x=iU9CO68`et)XnGHDm_PtldB1}T8*ntw3kU5#M;0vvD;j- zW-0QPp|=Pd{iSU>;rTOJQq-|Y91gT0N+S6t(r_k|YKN!kQfJf}P@menjgT4gz*q2$ zXYfB4UOHplj%;m2P5A14+qiyrZb=EADpBLxTVf4nwL5Ox)O~o?0{aR0L-&=;fK{>t zHY1I01sE$!%Cg%DFF6JXlE)=X>EjtA&s*UsDwn>MXHfZb+tr~04$sPfGlFZbX+%9S z7W#!SZwssF7c~@U4Twu3v(>HWtJT2wVyN_)Fe=MDmm~LGmw6R^HL?#euB$`$%09zL zGY|cS@UM)JRt4QOAnt~1&b#Pb{2JsuXW;WWBg&bgnD<3x$5KT{IEgVBXS&`8L-QBm zMZ<|xpX-ywepb3w(r-vH)w(v!Z8p~B*t_##cU-%M>qvP#Z*M6sb-Q-BmVsGo^SzV$ zov{tI$HGb6F=$$RW@6XQQ*Rb_-_C znp(!vSVh;qcx{%8YdQ`NjT)}O^~!>!rmw_LhbU()H60Uonpe5hmWz?sZS}#873FzEo;^XySz#_*L>Tk!Lz{X&DB#Me3vIROUh)Ndy zBJP|%B$pAgW(Hq^IFY(TExd~QURAmXWm_d(liuoGxc6|5)@((t;#J2)c?<5s%@eIH z9#;dbawChowXAaP#nwyCo#J?d)p^dDirCvocH}JV$G!>XS-xU$ELz+$N3nCSOEzn- z(^Rpd0-W2{ebpspD}4LP@_e3av8eGnW3dxk_PwqXCMZ{xl}Ng~@&H9@9}vzXcMN*X zu;OBc`+BK-*}`X4#iig!P#Tf3Pb-XUC=#|wh*UT7-HaKFg|R^Bc}tB@`QBCa6=qmM z9a@AJIuCqpbv4#>L6_CQydfqSjJ1WeVA#U8(a>1ig>4hIhZ~G_g>`R;W^7vwjdk>l zP`hO2_>#93Z1Zk|N-Mrkz^@bS`?kTJ*vx@7T^^9Xw(6HwpZb6zsK%DAU3mcNdIwgy ztiSZQX7I=QShY%cqqn5AskX+a8lQc6epRz;e@Lm$nfobzYj*B~r{LTpLxRf(e$QBu zmmGs*rb@@e{?{?q+H;Rc^SjkkwXduU^~Ku28)#F5!;HoVE9#B#QVbZf_mu&83H=c6 zc70}@1(z5UZO;G7TN_lSEQtB`N^o*O)1@#|JrN=JOA z)SdL!MxS-f!W3vVa{jS1x8bpbJPUJrQe_j3H8GC!QpGR3&tij^4@>0e@*v2{V z8BP*n&VGtD=gS$u44y*U#VqjS+a4y}NfRi+n;UN?+{1Xj6Q7sekv#V65e!?FF}Z8iSFe6PAV^B2}N=S@2rWQtr;9Vh`*n% zjcDcg7SM7n^;F;L$QwM~S~;I;ivt$+OL2AmGvdAYEgzo`;BPtpw&Sk=e=F+a z8*B{})n+?6*PP#+;LKQHX9c~?2)i4GH?)0U zx|03d26c+&Oo(CU^u@BW319}ia6uNZ`XxJLSZZ3rwfh7C;9dZ?TdVRZ&5``1vHf{JsMR5?PG$f24pJ&9rxUzp-EG} z4daC}bDMKptukv{)ovV-;`;%dbS#bm_kQ?l|4`s+c8m9!fvZVnvFcRrNcYH&AVbrx zBh1ZaO@M_GE23{1%I5R~_X~IROsrP~JE0pKJAw^@Pq_k6H0d`Uwecp|ne2I5a z^IIy3`M5%P5?3*sq+E<_As39C_rYGHeY1|xd1S#1t)>}IE_ul33Nc+V=hKldN29u? z8nFOvQjkiL(oXmjrW(qK_#8=Bf-i;6WP~eQnqi5em1%d2_uF&ZsJ^Owcs@jZqVvN) zx9k)XBvym7TMXXjQsVq=UZrY&j8^;HuNI;G*^jS8tAm$B)s)o03Ie zgTdQX+gOWO&r;*jHmn@=O@!me`lgVcAF+icV+|o6F*2ge$^`55!Pf^DF z8{+GB@@%gROa#g(7SRXRlm40w(UW3~24D}^(ta)-S%P3S-J)y8`*I*cA#A@nu|Dlc zx;JH0V%tGJfc3Hq2tbYVO9em?om=k3&Cv}bg5c>@V;CLuXaxrqx^Bu z5Sg;e(Esd@ougJoZAu=X5;3+}0VUqaeRwC)?+!$?(wm~!twqU=?Y46hy(y*Xo{>I^ ztxohd7t=Lwn3WQ*!`J||1JjXc+n|=>R~Swf#r5e%7RPpJJHLy^tE04ABM)?m&tt7#}klzI# zL?*lrS)Jo=dmwU!%ClG<@i?AIZ=4I?#6+)0+?zUq&NL^qQyg$<8?~}=$PZ-V=^1jw z)Ox}pE~x~UCqsLUM|WKt#c+L9><8kX*`<|B4GCcRBoqPtVm5HF@;(&5z}e`l4jNUD z5yAjt8|eoUuipqw#{U>y$3BI zMm0LH1EhTFHuX~-s*xvAZ%l{WbgG^+p4uUHF-gt&;FmrQMk8D?6A`^9J5@@YzZ|0o z>At*h!;H^~O-apTgoS6KZ`b|sL~oHR>1a+r0@J1m?NrV#6?+OL z!U)k^xwJiHQ!e#o^h0XlvH(}QUDqVfa0r7E&RbulZo-qAbzY3_hW%gxNZB;8DG~g4nm?kS zt5m>At;Ra%1N;wt_lQ*)48Vs)-<|lr+S-tu+ozH=uc$QMb}!cZUU;-jxnB595_7fw zPF$C~S!?Rd!m%3@z3Qf8;@WucH4bBv3V4X<`fKFpWMg}_v_0D~3)|V!cD7>* zw&zOQa~+egy+GPt;7G&vJ<|3)4hy#PrR{vjaBMG^wwF7GVjG-XxPF1dfbEsi_DY8q z+fHfQ>5yZ4wY0q&aa4@MzVt@jYgZy;Zqm2JBlO(#)GTyv7K;C8_9@2lUCl0d=t$Rk ze~m`#*2(HA>VA1(VpE=L1*bzBEr7K`tx16x=?qr)xxHHSg>{F3|>El>-$Jv;(7&^N{RD_$iD}&llM4h@CLAQhoBv+54Q3b z{uyoc*_-d~&wc}QAN)42z47wDCQF{(JGKk_xYHO5Vf3DL&3Bnf{NkrmWBAMP+ttE) z`P}4fJy4ZVw-7nqgdXEui-R(UEbDdWfhy}7D1X(PYLok!LgUdxux#|mBUHPgS-2;r zv+bH1Dp+Z<=4{oewwf;RyutglAw`~|Z*#ZRB=*k*+jWDR=GSA0<(^h96rS&D^lhjk zMGuxEjx3p9D>Qbp!ARtXn{=EN<18WJ2~Cz+*R5KAGBCG2q=H%x@+Im~ipNxeSk&E* zcFL;T-{7y6{2x10-xd@0m@wa_1~ig_vCPK!kHCLmV19^P8Zfpu!W!+tICA?ch@%w! z@@N0K$`{gAz5q_z&ME}U4d`7$rFcky-lYz>fCQ+ej)T=}hX-T=SOA6j3L*7f+)1`f;yTsC+Sc|0sTptXIZDR|`d$ckuapVsU3i zpOR4Vqs@za$h68p9&3dyxmvUtnbaGR**DoK>WLS@>;B)zPVm{1)3AcD8E-@;NXLY5 z4BkE%oStrhPtvR4IonV^7Hmqh-Ex<_i``Ei_U|LF-0H>po0}9>^HmD6gjw0dCwnP; z;WBG?&s*C?#ieVAFf*JQ8H6pr>1}cn_pjpXFrCx#%r= z;T(=3U2|6gWBpr!#aCZxXioqWk|Q9`G(+_`Ggu9@kvw&|@JM$ueEt>}ty3Drx7?3y z+=45WttWQPmF)NtvxGRPmY)>2v$KSMp8?tl>clu|eOxeYJ*n-)Fk1YNWk_v@Wk_vj zC_~)YDNIyrhp-Mz+9!d}ze)dYaLx{>Aue^v!JQ#@Gw}AtnJunZzCnBgw&N1av0s!A z>vzw;CqS7f!-d_Vg0Ba@>agfAFfSO9Qxqq&L38KRo22+$e{DSfNvqQ}TzEl*1&yo^ zLR=Ve4wW2u$kWgVjw3~-SifbBJhK6_`3d7i+_Eq)j@gY|K7W~ zm6?oVrXMw=n(+oKZKcnMG3A%SC08kD3N5Y5aA>YepB!`${xtxUyFb|idIt1p7bBWQHT_Lka z8CyvUIf&-DC8>3TMq4UXYw^LmLfm%O>S|CVqqn;EV; zUrTXdc@_r@-R1Dj%jK(LeAb%2EzIP9LGL&k(-jv(-)B!Xe0=0vZRFz~{ULlD%*~AO zv74eISQc&<&sxH2Pf7|KZ5;X`gC5VR{6evdvAkgH< zzLQ&%g6*&rWL87)0CaWr{wM+dVIc668LF5z1duw^RMFyNS zyCVq<5CJiN&kvDB*Xi9IlHQ&60>{zYd(*9%lpQ|cwp*>`taV>G>d<=R3iI%*VE8*< zzGNZL_KZC6eT2WELTxI8-$&*^FP&{N2``=vB5OsiF!(tj$m-lcwlnjj(%Px^HoO{& zRY8XZV>hk3)Ed-493A_3@0-k?WUYOcbgb#dtEfSC>V^$(w9-mMemClG@|g7{>z$}Q zwM^Fcw2W(zL3Q%|k%;qA9V+7eCa97aFe2XDOLdecUFixKx2cApR-kx)6dN3dc*7{X zXE&m_caERdtM2=~2G?Lxq;q-(*y%FVrUDw9^zKrC(?c02S^jez@DgYb&|aRd`pI#e z_eJz2c2W)EYAgf2kHQ$nx|8^KTzErv zOMgc(@nDmJ3F~>snSFVed#A{C?1cwZZ(%1;zQlf9@pvnkEIU`gPx-W4Zb7?8R?237 zw)Iay$;hooR{sXP3v%T3-6fUvp@A)!10Dk|WITVaa-{Gyj&}J~p#{1H@QC~n_J!e1 zgnl+_Gjy`vB4v?;QKIXX1vMI%ENC^w7zaWAXo0w?EYtAabk67vqR zI6La6W2P*m`F8YYSnHOm)F*S=Wv&F*@zSNGx(WM_>MSuqi!ZvTp;Q%&Zs~nXOW7dl z9v7`Es$@cb)-9d^F0WM-at=Z-a_iB0@l5W@byFO5IsJipG0nWBmCZ07Em~JtSudWm z?#P*ORLgg{n%B*Q3e=~oeFOcWx|}rZYhKrcBksC=MDsfPd-g+&WlHLjTxK+TW%jyU zPjP>fpkZ=vJZ21T+?7yA()h|45Vr0g&&^b(X&uIRw0SCb6dUJD;nlu9m%q zXbYbz%I=bfZZLz9!-ICTG^L$2=K?!*pjsPrPFMELS6;3mJQC|TP<`3`GCW|n-a|${ z=4n!IjSq~rg5QJnVSVHiACgt)9D|34J1`$KhqfnTYow9dGqEX~)P6D#pBkS=L+j=G0@89+0@ z=YbYC=USwaT3*#CNso+u4H*Y4V_7ad0cnh^7Qzfor1wC~ajX$1gg2gBRQ=@3Hzvn3}KeR%j;Afs<#!vUt zou-`1b$wnCsAYj|n3e&ay=-RU1V86`ep@4W_-3D(rkEDPstl(N!plH)O(^r__6)wb zVlWavco6l$X1!JI$3^OIZTN zr%z$UOsvg~h$kGwfAEY+TYJpsOWDlx$a;_RDWrcFS==CofY=_2_Bh|~2a*q7qGe3_ z9Dgu%sLwR7fnOQG8LD_ZA)hhBsT16NBEMr~~nU+^X*`8Oh76D@0 zJ-Mo^>RYEYl3J-{5{JC5oUs1=hJ6(Q;}m`ncAftBt@Tjnb;9=}v^DO}VqLksEy zYHvoy1eXz(x@eEK)VaV?C*6VNKk+|Nld{h_=Zg zkFb{aMC~3S5=YrFP>EqD$o<;>jy3OG>3B>H4I@@Vcy+SU#7N_;yX=T~Fe6+zvY^H?jF zXLPGBpORFIpCkUkDb~DPs!8t3>b<$7XZ}zw+RBtkC08}WCd&Qnlt(7YdZ|}GFggh%i+sZhSC6JGN9a04 zk*WT#i@5={=uKIcYvvCRgvAlUU(Tq(t)6B)92$&EBi;tJ8@1T^&7UC_LG5p`Fh#8% zV8u9oA@h9(THq2T+S?PS)mLU$DEid$gQ8{6-})HssOxptX+6#eHL&czcR06_o%pm{ z6*|qWDVruHV&+>8eQeDDcbRS6lJlD`V&b9t*1#UPo{B!v%AhqaJk5AN7a0cMEnlxO zxQf>-ovWEpT)e7ljtSQ-_6=OV+?u2AnsfR0nN2x(x7__*!QztQWx-wInPbJjU3`7} z)mGHmQ2uHwo_CFQKzVhls5ba=*q&hVv>@&uW*bxBUunuoKF(g*xULpkGmh%`F+dg& zFUfCi8W+(S$3=hYYU?@^a(6B-%55FEdUZptwFLYd6XLoCC&&Z((BSN?VsZx}9a?ho`vC7c*vOu?kkipj{qh&4@3+0x@DNy7gSNeg!ZFF}5uKhvAN4 z|D$1r&5DtWl2WJp*a3wl795f4AUHaLBc<<4U2L#4cWJ@m3k_*KYEp4X_ObBVWP(HL zQs>LGVzH4wWrXl-@6fzWz{l**Fa}=^4MFx}bpMuKgS6kDp~wCQxH#K!>G&slwRuUT zB9*zqwF&I6E0Ws=u7v5@AATdxJAwSN+xxCettx--$9j8Ki?U4}mX20G^^x@3t$s|B zwJdkoqBQ<1<5H1xkAQ)v9#D$%J_c-9om_PZet~yjgpl=L`?=M$Uyc2f|7-s-96#tn zen{_ca_Jg_>iMfbmioqwL%T|M6wm8-|9VV6GjG?b-J&6XsxL|S{n0QVgK!2H3rRiJ59TZnO+knNrn)}D(X^N>a z=x0jVu7jeJ!CaR=FZs=!nBHGhJe|W_HUed{9B7toA+d_hN`ak07KR~Xsf(=Wokzie zFh;&Z(V*N#D6*Yy*w|Op`&lSTxr@17%viEr_wk#9^2Q~YEw_c9hVSv&^aoCpcc``Y zH+f5j>$15}cI*aMiz`$^=oqeVN#dNCg-}>^8$axeja^|Jb^X~}DW(iw(YPLn8;%Ph zkC^;PQ~YjMTWyEEBdf*PR`n9l=Y7yJaPWt!RE@-6(|O}uZMc>q7KG7G%netq%-b79 zwc80%$C%r;u$Dd0d{Z{M8KCDp4^`8Qez zBR?QJgvL_pdq;rVn&qPRQSV|soY3865Y%z3R{<8d;bz1^mL9<83*y&_lC?538McY> z@;@-YYk_t+AujJ|eAJW&_Io}N83DohKc9C58FtI{b#V+6008*ObmUJ9gZ1&wcZ>9HlA}=%6YDREDdHb~e>doXh1drao<#Je))VC6PVI~ZAb z?S64W_U!h>{d4fNfm?E3-NplnLuzbu)|>h7!%szI@OLoQKb3zZ_Pe)=7wxZa>f6LL z>_UF)0w^j|9x^8ky-uUQ36Vt8FPPwPSXofykTTOT*1H;cvYa0TLgJ&$ZLsUC?e*eT zg?`jRsLeXyjQC?f5j46p=s8M7C~biZ8sG*sH?7 zDSOgj(+2398Q-WxC&iP9hH6gqNIu`K)2-66^y{f$cykkc3CH1U_z1WtM)=Y_VPo0G z1Z9f+xbeWo6xnfO-^LS0AdF#msN2wnqO%g@3gzsR3#I3&I<2e# zS984*6eUdG@07{??uVZTZfxDg){WtfP}p>9TWNuE(Mc#{qTbU_%PZtUoSf;~D*t+; zWh1x4x2|H0$s^E)<` zLu=@3>_cyw@_9kyMyxPl>kWb}f^o(0Ttg$T|KlyJXSrr3ZM8qKg0-y-&}>EZr(I^; z&ZHIkTScc~m#FM$#YnSt-i)J8{&Qm^>@E(q=52*)x&c0``c`pyxu%^(hK6MUMmFtd zE`z9L;N8<|2N*+(ICM`{-3NVImTa&IU8GC$5He`(%wcFDe~qht!I#XFflq{q8|8oI z+Z=|h_`%47H-1M)*^gk|4n_z^_nHJ_cQLY+!Oc(KO=Ss2Qwalv32Ty zw+;<78t)PhF{7ECgOTdN;k0&`zpNtaBcNQOR&gatUId>Yt3gdwAM4W~lB6j_lx4=^ z3(1A*3!It(EACG5>r5K)*(`7;Vc*eK8v7T|)BBZJgU-SFQrT}u4rZRT&Ga*A|MEj; z(>`FNnc-Dzy^S$?!1yZu5AzZ8>GyVeLI>U=>@nyT|M@6Be?J&`^Jw~aB4S0gs;C8? z#BUKV*r%OBDa*&f^8LCRt6UA0Pjx{J{}kQ()9_&*ZDEGdTnzs*9Nqg~*eUJ37=9=$ z?^AO?QJ2%q5?xcX)9+T?9di);Sx0hCpf3B(WzftE6j)H}@4|ON-|f=(TNs-#U$LoD zj0|NHn8UPwVXRdc7k8j^zk`;a9##$cBXwv)*+Q**hj_`JVPh_DbthvUH{sYzc1}8D zV-Q|9XU-AScP8w*>1@`>?0P;nn1S-=p1mgW;{BdADK-xUtB@6+zC_T zybC=Q&?u+u-%CI|z|-brr(K2hG%cnKOquoogY1i8oXoSgA`^_pX~;h9H?S|rgwFXaVzt0lE)1*Rb2)bNPF~X=L=taHoqv)zVlW zMUCvlonID;QRf~G9V~*fe9`ZvXAJB20?c%4Vl|ir%8iKDc-{z-Br$_ z4~n_FMRNz$+fbhHzOjCIh46gTUSP94=Dz&7`~KndR4<7SIgbZXTN^fxbY#~V{S^$N z`Z(I$nsb-`FD81AZ0cWdPO?+pC6#jRQlpM)#=fc|EM0M14(*rsG_S=y~A$GV_4Wt7sH#b&{Hs}MR=*&2VV9sLqz{q!`{{L~}Hn|9GG!4l{fM{1r^hcSovcs4ufZ2IdrSeDa!R#(FEVZjccY-zA2@wEf?QO<_&r%+lPNdeP{nYneRV zn3*j*fXOP+O4~4^ zwWl?DwLJ{(h`8%sJ6$oYJ+(chJtf3|H4$D<+`p$a-b45AX^rvFn*v7jMwctTkHPFX<)bS zkMHQy>(=3y{Xk@O#>X_$c4s_rd#tXHWx8A%W0&(QU~aw=XD4i!tA^I_496$pY}tAV zWg+>5{cNgXhi=Csh#*6EsM<QKtZ+oQQB#ncqd2MFoEU&nw#W7qQFfoC) zJZfW!$P&I4xqgc^GpV|I?T(aS4%*c)=;N>!T?1o{3u+pV)oeiN*;KltZbx$&<-?&5 zfR&Ms(Sl8zwdxT47!5r`MzC!m#(3HqyM@Zb2o^B!L?YvFjX2j01a55O5s~TmQrzBg z1enPbO@fEkw{N<=V!7RdRnKNF&O@Ffueib9rC}!|?Z_5hbRQA#=`bpR_w5*pxN*Lt z7w^!trg*NYm};oR7uPsknA1z!_uIKXH}VhYh~l|LPPz`^uZE&7qvsXjyrQ3+H%2<| z3Hvh9Y>u9li!Hj=G3mNPq~9n0uixp8YU!7qx9=F=m|!e&9ubqE4>8a06{oqSwbR0t|vIXFtg3;V_UE|-xv~uWF0%;d5*~9>4 zC9{9Uo6?UB5GKefA%&Lm8d6h3D>Qf9if9IV@u{n)c3AJGGIUBMNNi-Ys0>ufcsvIq zRJ)^3(sK1FX$3{~@H4*-7~Cv>ujuSBH*TFbt()SEGJiYznLThse8QgF&y*a%CtbO_ zg6bKFS=`~@_90Em=v>tC<6QPC_P~(w|CJOIAb)`;Z^gulx~C3s$U868bp zBqUZ#>Q@p*@Du$13LL|f<%|DTIYuQ}umrYt9v|D7GyHgKY=afKe@hT`x)gb6@Q#N) z3I6|lhZ%l`JqC6rv{f*o{sE)cG5j|*MI!&a9^2F_7IdtdrwI099MJc7lt2&du`%$y z_lm9#^1n}H3MBtKMXfjYpMPUmaG^E#x;hMx<|YQ70G6Y%0G8zJFU9iuQJybR`?2-I z>POTk)yLI;z<>5HuvOugXgiQg<7jkz9nqBPqt!QAGtXbY(^4h`^vyAiiN^SV7H>1# zAJ?4J7-emPB4UHmqo^mu=S)7id8ju&7~d4r%oqh|>tH-?l$-UWHa>iPdpHglS{ZQtayq*~<>7AMLDM|UJ3{y& zTAR0H4yLAEh&evx9D2R^Ya3vRP?rtu@eNjMnkx^@KllRa{ccfnCG zif!Sbd0`ahf??j$XcUCgw%fiTS|d?hg4RZIc)^(Q#4wi!YlIl=b6x*aa6-ZYO(W(D zXfRaxZLm6i?T^PA@>XQ>z#)tnYbuUOb|%IO-USw}uQw<{xmxyaRrb-=eE7@14?h81 z&SuK>3sZKsQ%^1#o@^a_w=Af7_9^>e_C~+EX+)-qwW!CO-8NZxoc)*wMG$!w<6Qp=_p$B5YCBwy(9VEqOtr|Wc)R< zh8iYkOvM<syy31%k0@E2}>51 zSpp;(mPv*^T84xiKu`i$glVWMjI5Y5o*gMV2wzj+E%Of z>kLcH3gZeUw4N}5IU$hz_j3l+_W!Q`y8eqR%$YN1dCz;^<$0gye(pOKXRE93cATxG zaREF`S1D@mid9#GdaRiwpnu0st~BoS;E zbdJJ(&{?b0oLhU3qGs*fgok!K^qcITBj23~?iSWN6txXY_-ej}?VijPNG4czOk8xJ zRmF6F?8-y_2Vbl3^oNE1h=SQ4U6iFyV`!5L82~QWYEegp@xn!^?6og|oP z&@N@^%tX=C@ov*$cwhyvQx9^HpM>?lCou;O!DBED+$QkffkBaxbwCEfcMlkaENHa@ z>ALu<@_T(IWMWaa5{{@E3tVez`x}?&I>a->gP)Mj90;2R3W8(je6oWl9+fJ_{OOiY zD;;t+@~7oAUa4-`exlb-Yn{311>XRx#z58jjERivLZ) z!7_eM&WCn=RT-4Cz`wf9(Lxz;rrR7XiQ=bi4$&7en35#Not0KOd8wWH0FqIA^mc!yFLR?Va>KWrBUyQB86-BY?d6dru5 z)Z1F=Eg_G4TyZTN&5XGohu#Y{hGSW>b@m$b%WgS zjq-!)9+b>ScxnOuT{G#+dVRdj>C#$8gfsn26(U^T{cBo(oaR1 z?*Z2aWqT%8VRcqSb7aK}HPStkqiRZP6Ma`gldiKshZWpvhR0l6$9HY#p%voT3jYty z5rs~iwVV-G{V{Qmwr<_LwqKa*GTfg_vuqhSb~f+b8SRd)dsjN0J;s;ns{`U>BsiF& z>!@Xo6r%T!tfTeC3~ucH=sJrqpc%KHd<*$#0SB^}tKcl2SraH+ zIjj!PU0mvAM&}eU;=}Jp^si397jQ5)K0xc=D0%&Bw6hb_lvhGGuBFAK14G4_`onh( z9FZQj536HF{|x8a-!JvP;;6y8{h0J(5t}nvYqKl5*E6Z^E8(nL8r=ELeQ|YrD|EJw z<+c{b2H1&ohtyiS`lq+AuEW?6BVV1~9`%u@`b|v)CRddA%`@tRL!N0>jYrs6Y4VgsSq`B5RwLZ=t zQ^!ux22$&ykgw5J7UM4UdYvDJ?6#rqn7V)XM%HWx$KBAnH+?nIIONwG>Mr>rwXxu8 zZ=%gkIof7daRob?@I1w?;rnX8f_fIzQ-lNFPrN4wb31z)9lqPjRdo!Qq+qYyZ4T8s8b zHfvN(ntLz$nFW1pYfn!wFBY$TgQ+GNnFyYm5#ODF?bg@(ca0}JIxS{nQA)r-w%8_wW9k` z|38PHLTk?J)M^hQzoOI=S5xi8yL?2`#c(?RnN7K9kB1~XSZu}_67z5j;`?VejjfHs zw*7||s12lfGJT7O@l*J&{c1RTf{H1p8lX|Qq1gA~`a5m+!!?YVUn{>oIa7`-9o?ct*wgBwYSs@Mf$?$+Kaf;fJ7WKp@QxeCx~WO724mG|m#U`JGvNrW zH7yQS9?Ml#ELP{s%UP^<9xfjOWo>#VsKKI!U}_!e?LeeQjl}k}q7%9Ht8cuAbsdaHa^!r>Y@gJ&fIASs80~-I(4h+M^KdCnFz7hb)rK{1A((Ir<)toj;#}tI(Mv zCn%cLP}PRbZH^5ZCg}Wcf?Xii64|2&5_W*$^y#F&%UGts=6_m|(c?q15`pSy)9a`m6TqT6LG5$9j;DwJnj%*4ljj%%Ix8Ig)qlf^@{0 z_W%4n*&Xfq#ODUKVzQ5VPaO1Nv_Y>!9ULitU*_O~*nic#WL%wBw;?aNE;4^6V;n0r zaH!!t(e-S~{sfhw4hoWD`PvjW-o15;G6gRJ5<&hI2V! z(p3R9N-`vqYhE&^%Fdi)jmVFUe{IX1QEsGvp^P!X7*bd0$XN+Az zpuT<7HMDMmJQqa1*SiMQscJT?tI3TCyoR2bSl5KJX!N=j9swLPBkp(2NJ`wVs>#Oo zZr9+tQ8g4HQ*$-Q|2yL-t)A=4ZR$r>(-^4HVn5&J7`(sKU5fSNO8-vh66HhZca~`C zPUJ2Ld|FA0>T3Q(?jp?YWF3)h^kz5NMjuFB&efhIx&JP6oK7a|NC`&5JJwO&4|YZd z)G$kHF~&=S>T;|(l_Tn04K?5cnvpb+lp`eLPUD(Oy|4w$-kt1p^5P`gQC7pUS#4$6 zzLEHS;;G?vLr@FJ!5Fj#)?ZpZBsi*WaP8FLS3(=b(yF*0`p})4RRpL;XoffjF7wFK zZSHyINFJi~^@48qaNsAXu2z)un8TRSH0P6Lr>ZSMAzK8P&UA zzSGv^`HJG{nYBibqi_q533|arbJp#-CStJwMS9fa9eHEt&8VjMnmLW1gEw%Oo^*qwl5;%j3)caHg{og!lgUiiv& z;Cag09$xosqg?Mb9_RcX*FysfebnsPb_>nZCS@p6vH3fX1 zvfpvdZ27&s()xf^-Q`kmKpx}<*c;QVLxOvHG4EUSvZwODkKguR$45M_df7u6;S$Ar zzkTghtW9kAKW!STPPSS>4a^xK8iwf9Sk3Cp3WeH|>kD$oAh?m!}No&&aEN`$4AaqsON zZ?yv(ySnzl+s6hacH;c}F6dNP{IDV&jX#t_)k;X8kw6z?1O>!@Xe6~2XZojVPSGRpHw=r%MpRXDOJWiDW&Y{!H*c|^G zB~Lk!!!{-sT($+-M!~bH=r)S=U*X@~`dDI034J4OpY8a5={J>1QLUUj=|O2!!C>En zGH${kFqt4)2`j_%_$VLwQX+noB6urUK(pSRHYDt@L#6MDlPT3jL3F3Bw|8 zM>*x+`olecgx_O<%26p~IYtV*;WtJWqeX#|rUcekq?u`rS%@{|kTqMACQ4lJ-HO(V zUsP;Ks%|)(3l+|m*zSR!{iQ2b2~}-Zt5cuSyqtU=gZ#v;w1n3KLB16Hr^JRzqvB-S zGRZ9KQu2NeY-x&a5uRc?;^eo&+zrMsA-KOc8EjTNOQJ^oO-i@M+{WB~AByk3yD4%k z@giL5Wev%}5aDl)0reH+us@x}1XI9;9L+FL3W{hOaC`Z^{bB13V$)oNvt|Nm89`K# zA4kf|dk!j4O~$##Ih~=}Ytw^$GbW~Cy*F_tGdgun7IcvwHUZC<-5J_; zjTr-#q%BcU_MFS6!!L360{jtRUP{1qesztVg4k@fx=W+2&Hq;iJ2`ElVtfZ(DJyCY ztqaLpN|cUwXl(Ac8#oH9>!-G{@nNjb~mp^$aAPOmBK%ks9UJL zKr3FxnIAGd5uBX;pkxBh{+IqeQfCnlT+{f*bYuk0L#|Gi&=qEeH7DJ%rna8ht3e3*mL!kE$DFZo<*HZ1ZH!bKebRt37C z5&XqK_z^tC^#;Wh&G;*bV?^>ChKcX=0q>pO5l|i#Pv$wo$N#Z}P-#q>Nnj_kX7U<; z4J6>q0nONJi1^dUP~cGGX;@QNXh~21$${|Kr~W&4Vxf4lO@&fX=0pVFat6NLJ9pe9 z-|>62_nYArP)wu@ic(~U5-MKfk6k+1HxPags(JqkZ;-L^ceu0jfHGSs@dv7V!A1xa zMg%*@wNg7s5AIpFcwGQ2F$y#CD>Mr_Ymnunj?=G8Zq~pvScsN!$Y(0!GUEda!A7YI z)NjPPnX3Y)omY!D%eOXE<;Gy8Wkjj^p^o>{wiW3q#if{|48S4kDPx0_OjTWT5OM#j z73d~d9*5u`21WoQP^!{Y8o{j|l9s@`i}DFepR7z;`j`=|>3sh`5s!#!vLV~0)e&t- z9L~AN&zk^Tq(*K){ljL+O6vihDgAEXG?y~U^IJ;x z<#GY=X%%bz@Lz&!mV=iPM_RkXFAb=Jq)4oj{f~Lb0WNIwH?bxMyqf>&_FF9L=Hv#mb+M<>*O+WTk{Ykt-WH86I%JF_E(?-G5&IWFxosrM`r$EGhC-$# zu%65s9_^MC|<1jYpG;LRN6Ni3My_X*Loy30sO=T9AkXn z)EWBjD&=wK7HBA6Tlub_lt0x1yvo3zMxsEu`7!>j(krgWy*Q)Ylmlgu2cVb28g*js zg>=j~H_OSpJ_4hdLO@$~4HjzP-()7({ETCQmam{qa`0Qmq-puxUhk($T)KsPZ1oO>*fvUPu*( z%{g^+xJ!Rp#>dOEDKM#cd*!Mzt(OvyYfNZWMu*TDdgiJTHKE9I2$#cWz(_j>_==T? zj6c&l?4<1PpXrAelo_R#Eny2V-$(VxJ6`ee4S2^UBRgen-wc@*Hmwk{o26>;y*v zVwPC{I|AcqBWp@r&GhC>Zza0dO#`A1TJfy9xTR8GzHvl5x#GVFEgW-Iqt_?;uq%KP==b-kKA~^*Lc1e zx{Yq=k&vbi<#>$2s6lzK? z&+P@{Nl7_tQw3Jo&ord?PF}VGU$yI$6`6iG(}pX|ie3tR5*)|M9AX3D%~bhKYfMc8 zaxEg~=afFuXXQ9bC6J5Cx0>aANSa#;#48tDg>QpvDYlv&;fH0TmLd|`;cBM(8MDms zfW#v%5M9N4&PdI$s~GVkml^0U=IVzo@@~D&mF*=9VXkZ=oxZUL=t0JkN|My_@ew#l6< z|LKN+D}Qe-9L7UG`Fn$+V~%VoeAjnZ@JGZvR#-A4J|k|rL063+<}El=#F;G46b)J# zx%lJ#=w3X=Zn_h-tQT)2;`pmLJ_pBNHAJ^i4byKoF{h;i)9FGvnS$xC;%KLYSY!nmp3eQUy8yQ1H!Qjyrva1Jx zs^G!cq5xw{6_C=gb&3|g9+tA{a`=Dx&SA|KUpohJ%jg4Y@$Wa3!n@t`;+U(Cm0!G^ zB+h3RG7mBRL-~RvqeT$+0U(9!m66fmJ82Jh# zS<`=9DU%)dAK&RNS!^ELg0Y|G@!`mmd=-eVfpB|Y!WXtOHQFy%{&mv9^;3nlrC9=J z>Imk@d&91;lQxt^c>NBp>BL(Y1BRGygS;2#gt}b{i#_yj%SokjU1-nRf9V z7pw%l;j1|Qj@I;v|F}#24|h3u`!02^4CoHfT{N;H0wdPqJ|BXill*vjjwQH{+ts&j zl!39mw+@IwGgC$R&kJvD44T*PzQlXYYo5JbJ2%7cNUQP0f3`i3{o8=PFTuBF+jE!p z^rl-kU>{?7${%HUvV9xYqGY+>+q)D>D}T&>62DdAbJ6Y6zG8h8=XBVXV?TOJ=KakJ zMC;7m_JZ@#y87=-F&Zx+mV|e^O3=s|MZB%`#N{{Rw_4)r?XJS;P z@n4F}KfjgdpWhnvC)o_jWo82g6Z$4%DF>ym&84&Hor>>L-~HFS(|q$Bu-45=f1cyx zC3tON~??j`!HIpRfFpILbB|M_A4l`5XRNu$HJ zfz2nU97kLM+SAnU2Mff|q=Mh`a`;@YdYm>u8omSJGwA1SZ(q09n2 zFMjX2LB9h{A`aYS49H`~cp^fb@aZ+%WwiVdLfT9y4MaIv=nz3?lw+#3P*_(U=BoY1 zT;T&-oanenS@_HSN-u9pDSf1Luk#2A%NmZ*g-nEv5B^cqO_JP(QqYEwghuP5t#@L-G{&M%UPta7YHp|y>m>vTa!~QS zOxk_Htw4edGRBD~F3<{3KwiAY^^~}QuRwoM0?(u}fnnu91u|ADV70)$U@nK*-V87h zL$8zhAnS7YhICT08Wvn-c}`?eN9ycE#CsJyqJGKsuzTyJgsQJ9)uLK$hMhe!54!T! zOXX2b7Cbu-+v}yvD&|!va2N%yx)m7_7Vz1Bd4nNcapcEF@=UD9i6KFUH%~3EK>VaF z8ms&zXmQk5GLXA?0qZwv4JqQ9Hd0_@F&jNEulGCQVX(?p8jGmiGRK>^QUz4nV!I?6lfaqhq&pUZ2&JF^6#g-BX%5+zcLS)Y@tsmz|(Y zh-r11kac|?bADkmW84CSvpKi{+LX|32U>|g3^o!l%j*yPlavnRnoO&|94?lqU+{-- zgjZl|p^$cX8Tsb>ntexelLMNrN|f*jEZ3<Ug$72#Rk337HH74EN9J$tIt-jGgupWHO{)Q-kI=vU^G47c6vT~GV0?G1Cv86 zGtBr2ezNG#!z(s#C7#V{4$}MVu0YM5)(FTdpGsLoI^@1^of@zXDYTQN#AQ&n<#1tbAW>3|O_Wr3rQ{8k6n7=& zZFN58PXSIKrKk}97Zwec_^}CU?wkkTJVoC+f8!f0siKK((U7k0IDkxTuIT|8WI9uJG`MpZz2zRC+S<6s0G(I$QAstwoeEDlSNTvGS+}+HnIr&A-7me`!v5c7vi)J(_4==*}cJ`M1i)@A6 zbTQ*={N$;OC=gE*N}Ti1;y1Uxbjgd>wZ4q7-f?Hp4%sPEyx!Rq>CG)Zb(fZn^yk3= zj+C{ZiigT|k;Cb{0xgw0h~Ya57>&+Ioae(}Q(2&!Wu~5jie9dw>hZH5bhDfn5xGd| zlwOf&QvAr=;&Lea$x&A8*PG^zh`|!d3l}?n1OWrXCBV23cQ=PfFPjxQJZ7tUX zBflh7;1}k+9^`mo96u`Z8ce9jT#zx7=w1pWkY9wjx5-y5jyIo7GerDYd!r$5Kh+R4?*yanAu~~m>2$ZfROLOy}Q^86D ze94dUNBcsdT10IRLY=F&gw3j5kp-+KvwtA$7=RZPE6ITd4Rq}y_fHXz43Ld@TIM6w z1&9@&MRubZ8WkA_Y8=a*{h>ei$a#L-G16ywoy{d=#eU#q%%nd9p1masTahJp)(u1j z6|DI}x;ZYBMVH(@#|j)x8?{q8C->-q3*$ zT6^wD8KI*`fh!z}hWmj>X*m=$I5^lFxzJ>&mh!-u3eIugT1OkNIIrl^A#2S5ZssFp zku&Jr?4W7=MZx=_m4J>Mt(HeAjx9og=Rxnm>V!TTtcEek6L^MXsKP{=mGFD zV8u@OTs1O0h+_-mq`aPw2~g?o+y@Z|aVwrFf~s7I%wWdYY`PqJDID>(owr8$K9)W^ zdP3XQut(A!P4q28F0xlpiT~4Y@GZgiR`}5t%?`CVL!IiF-MMopm4;SY(1~uZmp*0=It}0(mi;Kj3$FLCnQlK)##S?O{iTYw zAIev}gS8cJiTJ}Jp34H0%Xv98IUIDB`55Cyl-!DK+S+Kn9LkipB`fVuyZuCzhoTAO zJ!b zxfIUn`*C&Tu0$`NIS#R7nyJ;RRLyyEu1O)H)P;|mg8QH_l`W}8ri#zC8K5;$2!v{3 z@et&v=z#|E59ph08{2@fDUO^aGY6|9nf}kRhD}8$i(n0vf3=D++{tnkiDP0mze;~R z72`@GYH%RDalpK)&0)dYVU6Th9SE<5N09iBKCfimd5F0)4=RP7K=I9_;QJtt-@B zD$RRKhx+-9@qRW#8_4!~RsvIoY`eL5Gf4xi*#d?lZQx*KtR=3c8SyP+MeUZs*oW9T z>dsRfpFS@q4C60jJXQl zk_mot1$0+6c8~L8Nnr;bjC+5fXL$)MEz)TDj3teh&)Dx)X;wm^v6!u8GvfUVo#~E3 zSTDnoaY$E16tkb=i3~Ur<`ObAXci(&N%9(D0erG<-Vy8I@ir8~BTjBNVdz!W-+|*n zF%?V$$QD3(G_MJPVCDS7JIsXY2eOvfkrk$Yg?55h@=;`0{MB_HEEAV2-$xWf-@_C{ zcgIE#I&~bn3mh`=__((!mHznx+B`BzQXc&nrBi=R+X}tY@cp;=8>wnsGIhHhC*GmRM54d+4(+o(*&} z(eu05XyT+|q7}%l8V3F<%xTdH;MZsHY)5vGrX7u;Bm7amotjSjSddFw_%5c z-l;yr$C##~w@kjtm>RY`kgpF64t}|V-nPsdWD0E|b*HZI=$rTFa{_UiI$t=-lr;HvtUC;4k2FIy6b}5-M$;PjH9j){`@2XR zV5&7~Ts2>xyae>frc$IVyh>(HQiIW>0Vv+vWjvc7Wy&p zOOz0D_h7ey0e_?+f;5U2?)r5UGP^9k>0bE#bPAi+%?H(<1)^T3t!9krruh2Hq1>KS zun(nUG{3v&yz~$})baJoYY(nYH(d(vlcKya-Lsj@P)Oy$blN zSoee@G1a7UsfMQj7K%sF{Q(~<#$4DYBsImG>LrKaAHfM;@GcsYOAAXgOA;I$;yQbJ zlZ?71BRo7tQm9MN*|QOcAbppVid-nBq`3A$X22TD|kPlLhZ zn&2IGSOw(Vi_8RAl^a!5QmTom;=>o|87Y6W+{Nsvk&+BwIk+mmiiP(k9V)NO;lKI1 ze}Y$)GeNEq#u|03WgDB$!x}RRV-c^kIJ_mH6>9HdUrdd*R%QA&{MLX07#dCOm*5q<+D4yqkPA4f zB@>(!pMf=HfdN`Di=onLP5{@d(*KE~@YEWI{02;$jpTXK)u_7X%aPBc$TZ7>MPayE z>e081o0ij(+T6H5}R&B*X4MpLyZ*g0B>my_Q!da3H*M= zKFaYLCR)M&NqY-n^QMX?Ix>ZoR zRf@^|l(nveO1#3Ps-G)-i=16Tv?yED^|W$Tpx&8*`^Kw0v3_N9^!Rvx%y_$a#$^f? zK=J2Im+I_7eE-DtJMy1TiVK4ObJS@$6Mj$&lc{WrhxMt1UW6Z7@`HVrbvZ@8pwc_S zMtSLX7aa*EBI?1lgRh=H6jcA3AFuTPrki8$%N4p<75tl{napWFT;q4Q)Lug5SUZAE zbd9lrO!yC95LuN$Pyz2e7SFFlUjh3SuXIyHCPPq)PYx)n-j#jxW5t-(H9;`22ez)W z_+r3&9EB~i?+&js2xqXG&JeJ=HjNd}x2nCo#$%|bT8H^ZL2(L&i@oJpZUQfxMt*zV{R#{eugzxWc1_w7&mQ`f|lptEv#m%xoVWE zJDD3LZfvmxSFR)efDE+wrOj!$MxRf4ZAmFuu8rS?wuuoYo~cDc@r&CRZDbHZBu<90 z;^kJ$x?=f$TCq&#s%1@D@kBdeB9(Z0WlhA3E|1q+;YlyituX`paGQ@*b0gR@I zkreLIiS@TQ)RkQ<#C0s#lW@5f3yPE73BBdq~DHs5S;vc?QijhJ|;$?QlF z2S!5Y%0%9s8HWFTUm05{e&5Op#QcBq@>IJ@eEg3h%Ch}v4D1yZ_RnFXMD`~6aQU|~ z(Q?lrZ}kAit)nNs_cFr++>L9gtDLjpavrC$|k~e49rxN z0H27}&jjG6kOdYrL%SeaT!BbN`U%U9RJxvt5)-7&C&bTeL%!bb%>#|*Uayv#KhEl4SCfp-_4qazb z2^=Bzv?c-%^N`Kt*j?gr>`1BIv25qOJfQcXdchh;h*w&t!Vi~=BbT=-CL6|ojMj|j zhSzzHANMuteAVlAfO~7C_=h$VasEu)U2;ZBXYU(fO~ESvI^Q>h@kKu4D{{FO*0@c& zIfyZSAf?A!eAOl3{_N)a;>~&RZWpk6pCIP9>znpq>{{j{l?YEeWenY%i0mIJUCxb9 zH|~`d!nX^2nQ^#yU-MpAeTlv!PqMZnk1?aDE*@UG%h$MWgU_~ZC0c$KW(>B?etYYB zEA62^Fs)57$uREQz#T;h@`b?uMay4cRSUIh2ciIutVAEFnXL%)IGC}I1Z-H5q^?7@ z+RrKHWkHV}j8Vh$K9}`M6mqWbJ>bey!G9y*Q-RN1e>2`eqm*6MEWZ=RGR;2+al2}M`-ms$2>1*5xN|_3G2rB6@eMrc$P4Ip zj1UL6xPX&ih&ME(Rohdv)Q&A}YtuE?BjD{c+7TZafwj0|qG9Y|JS%z4BliB=*Vs)_ zZvH73JQgv6u3A;{glR17pq;P8x-W&^4e#*kYOHQ}sHi0cQyZ%yWUswmFa=>OQ)Z$I`o85+3==iB; zcg3nVu+i>4=)0uLNuFTdGV+G2j}IJl)F_$mm@WTA&8NyWZx_v5Y;sRK;NKY&x184O?(TQQ_!K?!kGVpXvANT-}XF?7~|VfqfNJ8Rcz4)cX;?r`_+N+ zDDUgt3LOs*pE4L#v%|xHH~;l+osJpv9(XAZNwZ4deDv>95Ga$c5ByzfuCj-|DJR8l z&gRKKef45FG{sGu@LZYUgY%{do7@NIrJ0^{KL(3V8DQrPJN?+6x20pNFM)4EsNGt0QF??Sa#KS(XewRdrhwn_`D=_Tom zVc}cL4$nTK6+e>CUI`y~^eDW=EKjaoe6*Zu-770gA}i8I2qMhZf2TBlF7XZMsxx-dM>g&skmTXGEI!cbgM<@9bnr1?gZF$kMO;AIH!UP{Eb`ZZ}aZ##hK&CbC zr|$}UkMVj|GUk|IOwFH?c0;*aqf(ux`|9gwK16tjuU)Loo%=odG4=8~b*A4@JG1eg zGONI4)0>(u3SjwEWB#R@nGWl=JA4TGK*LV|-Z#G(gO3e%;H0 zxvDvfVuaAbG(B7Yw$z$6_V?e0KgUd*Av|-~4Bv37`2Iyxa0D_j3Ssk zh6~1zf$GGVs9!^)ao>(#^KQF*j?RlatY-Id;2^vxDdB_65OkigM^Z(uIR;}NM#7i5 zc?>cx7E1=EboSKmcxEclaEeL05m}EGUUg0d^84QdtWcCpHp%7CE5}K7>c=DE(qDDz z{HMXp7YB8MmY*EC{WxI{N}&Q20As9D&^76tXB^s1XB>Y6ibA2}&&_mbeeATEMX$jJ zZA9ySZF&4~6BI-xNhMgD2p7$oI>W!ZX$4CwFvqk42HI6IN$0F{R`<>_q(YaV;%T4M zUZCjXCZfdFw-qkL7XFd^c65|44(Mg6f(;IY-yC4l_e-Bz2X&BLN*3hh(4OnZq?^`P zbD6VIO^2kL1;?a*;ESi8IwbWMu;z)dTxTGXM@Qbe3N?o;Gmh#9mi(r5R4{UER6r?P z&6mOd&!mqEuy?-=Ri19#HNApxPkO0TD{Oa86i%sAsoa& zI0Xz9oM14MJ*sH^=@FZ2rk;#)=+-4WE7#5R?S>~a;(g%GCBq6_d`eb+04h=OtLKlN zaJq!QCv{eURWWnEKMOHTnsKAL2PWSIp2T$2$l;!?PEKf1N1e+PS$?aWRiimo4x560 z?d};K+~A1vu{j%x`VfEZE26&TzRWXbCs*}0a9?&Baor=t11+rAE+h-w;bgJ2Pv10{ z{6$*IZj4&Ic-CUXk>}gp|c0Vz5R0Z=4Ha6E0OD`cr04@ z1L0ZZJ0arkVsI~o{!(&M(7dS)n)hqvGOaDz=>-1<%Dr znWy)ITdh+ss%u+*b=os3N ztQ!OmHCwMYy0Cf}9ZCyYHnrkC+-V!dD^pqJIkw)042jF3e})DH4>~iTrO5IJms8}< zijg1{*-@O)ggNN@a2vL1q#hw|Yqkrvw=TnOBxKH6=mJh^vN_^~B|xfnhJSHGg>lYS zdpY#mP$Y8@_rTG=yh^K~@38uyw^<{IUesok^dW~$@#nFcO;doDxdFI?pWd6otx5}0#2JOp%^R^-hRI?R6(A3Vn*jM zMLiSeQeJdL^ceOob)RBrIoe>ApqY{ipSKZpd*BYeSNoaqno}z5qkcL(q=Jn-69}t;@CO6rKge-3=6(}k?~0zWd{{U@Op|Mm>zoR~ zy)H&bY)XV~?qgUzp}oUCN}{p%85LAzfXI@4?+Uir$y%G2vxeuP?E1WPnejRqLs!xp z($~yZ=@WP)74dAw$iSJ~tvUr;J&b)9(_^jaD5imR;aY)RGg$4HqJx7ojYYfmV^%O6%L<;x9X>H;gbe_72lmCN=gN4D`Rr zurrCVD6u|&Iy;hs`gHb2WJ=}BoVQA$5~z0SB@x|4P3bRvC)P#za@IvP-3NZn!{vN~$p+W1k_DYhp_CJi zyaKHlr`7aqo`WZSV+eZLC8+tPgWYcsDtI8Q$DGI?PRCgCv4r<9Sm%A&nNkr>-YlUpivEp^F-dKq>OtXb;ha}f@$GY`dN zvhC2J3dWft@BY*+!wGOxT3G{Y`vjlJ8w3LCBmAEX4cj~UX)TVgDiv9jv3m9=Onm7W z8UGz#cJqz~1p2cfUiPU{E|?@+Y)o36a}=y2cJy!TA~FcMK2l@99BL3XzDariYG5ZS z#*%)LbdoOtr>D__sKiZcWA7QJrG)EZ68x0~zUs! z4m=$5@`;D?CUX3nVc%Ex2K1(e-MPBx)Neu4Ng5!*lXv+Ntn z+_P%ziYcyHtzh2t<_FsH&2i#XJq>{%MUnKWYO7g^p!Qe?r1_ppKZc$eTq6s;0@$L_M8@ST_T*pk(W=SDZt2t7kQ-4cVbFdcCn@}>fj+Elnp zD-PV?f`z+gh~KqMSd%UcY0`^hTX~EoqZ8uAzh4}`hB3mQW!ff{CV(v=Veyg;zM6H8 zrlj>tVC|H0EO0-iTtL)qr~1` z19CB+28w<)Jh{Wfrx3;H4sQl7Gfw;ljD=9a4fg<%nt}0FA?ZLW58)T^My)LBV4n%Sq^Ds0 za_3duPbo5jSgQlY?2u^xR*c}Zf2(3R?YA~wb3MiR34x~y?34CeTjgK(D`LTCr1{CJ zoMNj(f$Ud{zqtr~K-iAM#NuAdlMJ})&%-md*w+NtcS1@Ff!mFRmeLKG>oAR9r@x73D6Vp^eLeNi?%! z9C#5v$7hi5v;tS+aiypxF7r7*llcTzbewUi_$aQlKJXZhXSMmakAE0;VWCxn+@pgy zONFz{O)JVY)6X<;nMEzdWnk_Sv^ZC2DTfug3?&}IJak69jQS-s0gi$n;k8@T7fj;n zW@Z8-e(s_yd(>;STKsEAI%@gE`~q2STGTT9_}qCEP8{46;+|a=Y5ZOURKGr*$MXD!QKM^JdjLxSD%* z<;iO~n!_3*a~L8+Kh9eQ$-*0y zDgO8KC$(}Jw)WM-Fe4fdN@w)ihFJEkXpjVQA@! z!WCo-h8I*~edI_`0x3n>;5y&yxx8OtGgzd+{4bC{f;M@x6nG&-iA3ukq*lWacrREt zp_8+H6?4;t81cmp#`vbxs^3tevp`kUykP~|f@-YtK4bj8@51W7kEGA41_#Icn!t8W zZDqT3(#m?Op(V{)h*vopZ1waTSntb;(?j$V1e4&8u%c!gh!y3w_ke4klRE( z<jo-p~SjN4%YY*;~OotKc3 zjkxc}*ggZBgT;!T;=Gfg1vws8!ex@tnvoVN2D-EMnFWalqsreY44ruj>Ad@cYy6DE>L331*YKua*E3R zl6Z9QQDAb#74q35#oUg6eL?Sq1p>@mlrF3#YnMDfv)9A(qvmwPwOeY!m>eVSx-ftd zI#6DUaj~_>-s37j6secKo$ZNDm*aCY8ROhemNf_l?b?dHMo1&37$+|J)SvhwW>gxT; z&_P^s#Fx6x>x=g;Q4^CK$H%+ly|wZ-i*56h@g8%}mbGTYniBKy+Y!dC01}?C3Q4k6lhgJNlxx~ly7Q*nF$N24&yDcQV)ix7 z#Txcf_{fcN#Fh!W&YA4!8f2VC{B+efdZqhu59s}mLwltQ;pcsonPaB_%*k6iTtY)HAeML zS?Cn5MY){cb-!;P{8o%$_=||M~ z-}T6#Q##`yBNseiWP<7N*$xu_2YKpGPgK`W!<_Cd8zkPiWo=@rwB}*K2f)c-xVM5q z9MG^=ik{@jog~-r!KO94@Q%^LaBud<`Pd-7*iPr_C|d$3E=AQ)x%RBq)W*mYCW(Wk z%TT^bgVI7WvP9vlT|77t^AlT`j*HmB1~8WSC$c#-y3-c=QBTb8B3skYqjpFmXxg}ml-unA09xeZ%k0Mp^(3nwmYdPEc z0_6G?_}FxeKY@6oQS9qj5hNr-SKGs|z0Bh8+X{m;mU$Ga^XB#DrU-&7Uwj@&GFrP4 z5+NNJK=b-ktUZmw&%`fV&FkG*?L1>P$#d5T@h@$rpqFMtBXNux2n}Rr#NdsgG^%Fh z_*yZ3deuCv*%9I+t&w9H(+6FAENg_X4`<|c#qvh@?dU1U1}hL3wvjiBN~qwU$CgpN z(4s_1HCa?&r{13V?cg8A(8{AKcY;@yL747p0r)IJiIrkBtzyJ4T_+q#$ojtE+BLV< zZtre&-6OZkq2gW0qA&m*G#`D82@U~{pTi8!LJ7|Z{KoUGgh`zeu)@~gF3ok_E6!?J zi`DZA1C^*+wYG>x76reyXf0Ubfq_`OwkQhqJFmmM9#7!TMth!z>-_#A-UPNsiVw94 z=+kA2C+8lMQj9hsU!2)i9jtduga6dK#wPTIJ`BAC445*`h!yK+)*6Mq`#slwX)f3X zcniv4V6HY`&Erp_d6LVXd3^~KKuoUA(C1fa4Pq2yI*#?;Z$qW8oEJ!D<3hW^U|a2IPuvF zrj6%;=`so_z#7jGZ?&*Ntr*{%?wkyq<^l9F#@HXuld~X9VnLgEBeX2g)8u~U1}5vU z#%vO|wGaEk49`3REyG5K*{6qXO4g03P4&BMwCQwk1$}S}?_al2a0%O_JqO6!G0?UU zYqMDKBUoGuk#TZ&s}gJikNU}$`Zl}-@zRI!wlUl6$`V^HSTR0Cwr5;q(lcQ7GI96) z@Vgf_#q5BkHuoO% zg%d5RVPuu32Q4Lkkg^ZZ6&icDP)| z*f(1o)`5D|6#yUF*v}%84a6nh6}3x~_*;x{YcRs)piZC2eg$mU@DUQOET|T9fy+{1 ztbTV@y6~E zw>UQs%;Ag?u}(d_@@}Jeyp-XR#wxP9Wz+TsglC)JIG-gT^;R$u( zZ>2f;DQMC0q6P7uxroa3wnqGm#d6LS*)Qp~r9j=)PpZwOwjV2|qaLHgzjZ{8J0c&K zARkvKALjv!I9-tgMkCz@-;yI%jFr#%Jz_~ZSOKx(>2^AM0@gEx1xdwxs8ObhPhF%o zLD);6RK>9u-@)t%c15xNMn#j_3*QGYDVxAC#_VJF@%t3}RASl%G5f&e zV7i2^eY*y?`c&SvzEv`ElMtD6frD-4kll%F#tNy@S^zLa zSaoec8;0fy>VK$c=u>0 ztJeuVUf}GHWz{h1bDR;m0^l=&y|p`9{QhEuY3tJpynDmWqh1w7Q{+iTtIq8WrMtcbPw6|-AFa37op#`b^UR`- zfA)pnU@!IXHM@qGM~a1*MeO4LVeHKVqo}g>;aYl2XX_A_PQubl60#8JB!FR2n+_C9 zRD$Rj0f&Yt(*ZO=P=hks0h9nbhJ?{9qG%i^fM_}qH98nZ9d$;>x0}VuLZAdj6h_}_ zI?$Dbq`&7>2c3C;zxVsTKa#HH)~#Dr_nv$1InQ~{*sU8OMdEwyi^IrheGY6`%^8Ru zkCLosLuo*uN&2l}e=YeaH|2!K^DISH%!F0#9M-6INv`ZmGmQpguVPA~4Qeppv?KG-uvmY{=jP8kPVbb~yq>>qwsi-!Ny zmu3x_**#np^CDjpt~Y73u1;069CtGGQOjyoQK!f|9|^mgvIeYL2#had;jAO23e2+$ zA+@z#7}X}o*PL_(x6etLgEYzVJO40+b-i4T*KxKnQbCM)JQvR-v7g4`-UBoOlb8JU7WXxz$Z(;@_YvJUEj3hr9JXWlI?4P130|&}5on?*=|thgmB;bCFFX zXIR_ULffCEXje6z&@S;NcqyfSKXE@A=spEPKXeZPp+rv)nFAUY>o))EpA3?a5L#!e6*5@ z_R%{_mwxJ2P)=T&mC-iK`QSugaVS#gQZ77t50g)$!hJ*1oRsfkZ%gkwvv8ZlX2 z$67G5%d}M!JoH|s2;(3NTscc+tzu6Z;jP2W{Dh|t@4wg+mO6{BccKR`|J^oNsj06g zO1Y<1H<_lK^Ytik3rmsX{;KED=JSa8IpGQ4o90VepR=d54ck1IVV~;6iW5?QqZITG zh3g%Eop2K-eD7J^H|%uZ_()T^88KA}-APKUZ6v<_=#H6+)Eq7SDP+Lvw*WX-ZZdhA zs2}OO)sxj7i={8}TkY&AR*^Bf2Iw#~5sHq|0Ur8vMDurG4x@J&)vmQfSX4Djp{>5t z$xIpLRZnKU+~i0fzLBXGIhJUh1^r-nL@_Vj*d7YHkA}aVbi~&jrN}!Ud<<$q+jKs- z`nt9W8UVcB=YuP-{arA=&xv(AtU}Nt8cy#+&1BajyvcLeR$smIQ5&>urq9%-1vegD zXTJ^^Y>D=#Fwe<_h6{mjf|e)4d&wr1KY^W)Q3+(u`QRk*SKa}1-Hq9YWSl;SBN1?FFoI>$K4)aW(T@z^J7fM~9H%RA-jFT5 z(rLqYys@Y0*zaL2H}>N(V?2j>PKTb!o3#g7=+j5xOA6U)M5+bZK!&YfBY;V{!|?xY z{~Fa4FWoV8!w#1ZYfX_Y({mI|F!{i%9L6tgGZuP>v`3oGVPs25e1`laX+q*Nap2~( z;C&N^q*{uCbd8i!z+VJ^cIwL;=+^|c-<{5Ea3)^^uT-zijD4q*bh{kL<(59urqZQZ zU8D~dV}zp*Lyv%z+X((q+=JFAdg-r-i~2>QnB8pJ#sE4(4 zWIbixjPyroU-L)lj9^WkBdDLOUZ{9TDy87_o= z_wLzIu>LJyw^4bfT40>$`bep|BTYH-?@wrvzU>^@KsH#WMt2CK=n$=9mkXYUCP?GY z>KY0>%@6537lWq;bq$DXFtx6E17&F)c^HwXcxR?1Dh>$Ux8W;C%VB@f_~8FVn`RRd)C8T#x2u%E!#1FU^%cgH{nO?Ko}1m}kvbz@!i%YF;6% z3!NV!eU16!zk@L$?aQsMRu9&ec;9rNG@(8zyk6sKNK?mH_jh- zjBn3-p{~eRD$twQD;VFgkw?WOMQAJoKWPGw0Wmec~@}aXp(hqVs?s zEIXMoh%qo@M)Jrmr^dqqxuMVA<_P-g9mPN%N;~LV{TizkCVPBI=31bUvI+A>R^6ds zW8Z7*_sZ?IJxO&A-RZsZ%?65V@VHwN5#JFw><-U;k$7jnM9{p6qdHp*+VMv>MN{2u zD_;G^{VxD#GF!R&CHJazY`R^lb^l)0jXsgM+i~nl^?%fqk64^s&ziM)=zANnR#~&U zxR`31Z40-L$=vLv7P4S_mF5ox3)_m7nKz+hbqQEN9HYRKKy$KIX_pnX#UuL6B;Ag> zs6A9u@#^AL#l`ge#dv2+eCG9*b$GtQJ&re?R~FcwhL*X2NHj zhrSvQ>!}sE-5lS!wS>`|ZCkxMx{aBf;VZ@}&x#D};kT=6r?;E2R@a^c536J{wi8yX z#xc69cx_|b>dn<{)^&M8@oLr_4|Iz(-y+Gc&=rZw_aGm6`!(m=&k{;qLH?>;zZ>Sz z!Du8qteeT) z(Vh2-@mLp?J850_a@U>WM=s;!sE+i4R(r%LvUQRc#et`gvX1v(cZhHJBhjPcJD$J{ z8IK$ruqeULP>UYz_}O9x>$#a&BEK8R5Wj{-`Nh=S*2c}&4~sX)x5CrhrZ{3t2tlm@zOT&eLt9QOs$;Iiv-DG(rW4GErHX=^H z>XFwTStu02Ll7x(osep{Y65dUi0m&7k(LZ+o$%JTN93<CbPP_(&!_4V$QMd}Q?_)P9<=m&yk#RsIdk0oVE9?O;}1V@uRKz?bnl)~ewr zO7Qim#+)(>(f&0Ywe#z4DrFOXDcAS}STVs(H4A4Gy67p+yZ6eaCZM=%`C!(u>^cFC zuyA?n)+p=u!1q3GYnHbhOJaE-U*}xnwex$OkAZ*B`hoVY_9*{`s3`yDs0sbgUdLOr z6#)ev{(jJnkKH4^dZq`z;jajuTGvYJji-LoKZ3LV+mmk{esa7|o5ugqe?0rS;Hi)S zkxsv3RsLI<6nmT4GdagIu|?|`rn>hi`Al4YUpHb4|pxR zs8lJ?UDO}!QoZ|NCF(Lz9USUH-{eNOvwkDb;@iS=!@FA=T0Svua1~L!6i46Gc7~qr zDeu33(fPeE-Sh8Xb>#p0RnLLz>VPZ!UC#wqhY}Cw$lT2~AwiEft$bNCzSO0z|Ltk$ zJ5Iy1XnftWikX8s`y%lFGa%Lfw{IG4&2*CYA`|mE-UX}nKg+2PeHZvu@An?P|8_=w zz+gES90xni9H9%(*&F;(<{N;qU{1)#uzGnMR+qlO57(#;wO9wtGJR1-tiXCUi6p@D zy!HG>dZUGcJ9A|FkQJ*qSv^bbU%~27vou6j+5hskUxbX9L-7kMy?hCS`1xO#Fq7}~ zwt{=}SKj3cXYifg`&>-cV(&KBO11Xnj`doJ(=t;=wzCsC=;-{!OjlH9yf-@23>M(o zu*`UE%f@nCKJDHSBU}}@$X_|Pd5fU*_l+=0x%vNNtAMYK7)worf(-mz+jv!mB zYdN0$z5nCMb;D1$A)weQ;0*#|u z0sS>zwC zJkt5kz@0%2uxpGo3LJ{UC2eXH?z`O`jsM;5NL(9Hq3JyhTk7_w?8w)w^3UcGW$T~7 znk?#?bHOhMOI#8Dk=i`rV<0xp1)B#kUjei6lUwg!07l;rWDQn4&w|BAcZ{umZC8nl zul_hY4irn} zC&Ohd)h)jUDx(_t7)uScitGeqx_>3R%W(|(yYoHgDzO6e=^#VCb)5?q52krst{Fm{ zyiBI63*)KQ)fXtaszD$7F0dQ;9WAm|72sR0yuM4+^mZtAWWsp{)VfpQ z_TY)Q?*jLtMVsL@M@`6sd84MeS1r5nMl{ylMaZ=@mnp$a`X+Y|*6;L1+|YgvR;$y9 z*>1Ei8e5sWI<#8EeOaXl=(ScU1CrzpZ@4vcmDZ?~))=pcuV=lOCw*Yo6}nxU&E)OX zATDXlH*-CrF(FEwdQMfF!mp5~A99$<6cdWd8wgM&AI7&VDeE3HL}jJ!!4QCGhwnc9H@6BBY7U z>iWmGXOgehL8M>9o!|oks^mY%hCQj4|#M_NHxgBNm%Z@|| z39WnNH*Gxr-;{m1%_rNJ9BzxgV?oI`h#RS$&!eUwL_}TF5PR zmekH?()>PWiNV7bEHAB{Uv`vo#(U+xHse}VL9GMq?7gF%uq>68&1c#RO*$shbsTSg zYiZ%`G!Jt*pV2uHKRTZn*(mNGu~Hc6l~o#ng{J|WMPd(dUbmNwYhzP>Z%@9YR}cNyMh80O!tD6orxufsnbr0B9@MFB zVzMs!wBmUnbkqf9CChQe{W{fj2DzFj9*1eCwiAo_u~NOjuA6gZ9be}d>D#up@oL>h zV`glJ4v2-QQ_I>^X3qLk;Mz5nSwu{HPAc)76zJ2 zEXXu=Kc1{C1^$r6(xejdtRzeCccwh}0yKBvG1Z7C?`0mD)%uMRVfX^LfLM!I`cvSc zYcI%oaiMhHE0!YXa$pVizXEOxY|G|2#5ja9IB#4(cO^dmJ^5u-{v|cX=Q}Q`*+0rJ zPaTCXoi2!_8PLdS*7zx~@?DBsotsT4x5~l*Q1B9RFdf7HPoR67vU#j^Gx8!mV7Ue^ zMK7dC5BIP@fv08DS=h(33DHf_t*O%IFXtUaEf_;?mi6eIBY>#fo*nNDe@kgG=3wxO z63gDR@X6n@Khe`&azeH@E1u0+n4NX`!hGa-p9gEd9caHh7J7F@xVY*ivdMs+7RQ)< zTcbtQI_6DcP$oVD^^Joas2-%{k;L>*cLh*I{r^rX$vr z-pojFvVVgAe8ZttCowLH*1{Guba_`iGDGvdp;h$N?G7Fqz2lOPV=`&PxR);OJ+?GH z|MFHmPuQ9dc$ReLCsk&)TdyTg9U`e93X(d0RD7MRw7A7H@Wt(g= ziKX~R`~6>ONvx|MwO=ahPR(RqfJx$ z^fzn#@%-|Hh|EhJ;p1+UVZBIL`;qT%riaHI zziDa>#znR#GHy2fCI>j5w%Y?8ZdrXCT)XP?|DY9DvZGYllvBNeg^&e1-Z(GOu;E^3Y*d1va{tG zIb#XcW%P0 zi0lYxRfcSuEm9?qay4B^SDAztwUmUY|LEtJy~ru|ENs#@aJ@Q-dB2VP-EF>wp;m+jN` z%cckR%aiV=ZMqIu6|y-C6Eqn+Te`4%t~D>KOqEun6&+|*y}2HH%ZK;6Dw8T-GGi46 z?IIO;mvEV7JCk<4{PWRy@X^utOO{60l^v-DPw3O78dnN%#EqqP#dzh5QQut+dC#_wWuxvRuEmcbC{#RD7ZwlUV*JIzvbEgx>Fq1M)Pg2p4Up3R}vnaT4|LgqL=ZmvLnAUqkr9{Lcg7k$VUcHv3FaTj9IWPtFkrz zLU!+THgjjoyDej>7i8x7EYQZk!niX);{G0NzSS+EOx|n2_e{*MZlN!HtP3UJ6|1+C zWv;q~?37337;~!B+C@i>Ab!t4wG5Y`clw5M2GJSfZPUR8y8-3w)Xr3?t{!u$yw_kj zqJzv%me|w$LV5-R-t_qfrv0`9Jmy;oBa1xfyQ zYuS_RE!SWxOUv$n-CaFAg2OebeOBanq7`YXjWg@SLwM@CVmQP*i5@dNy@ ziQoo)3CMAk?}U;Op)dGuALU$m>pIEV99TkoVO35a{$jdUXg;lyBQ{VZ|7b*^jA@&J zH?m)mUElawwrK6^@}CM}hcj!X7q9PyPP46zBtb4#8hdSX5EYpLOZe-3w3m)OEs~r5 z3K&_zHuuUgZj0*-g$cNBh4*r-oNmx$M1RkYJle zGc5SOw739oB^x?Kij>+#K41=#Qks)2S!-#1mv(Taf9@1Do;`rjA|BhF5B#5%5#!O~$>ftBI(I0&||OX^!x1aD7NSMco+z-g)B9 z`!;xg=)NpnU72@cM`{)$HMtEPW3qG|BeUGnl8UITMc$Y!yJW9eB$~3ec+J?JS+Q2U z6D38rreh+0E8KH&bV|ib;3}>fQjO zNOK#1#SXpI&1_r9DZg76UI@hdP2iBw3m1ZO2eM%y2<7HFMOY=qW_v^?8}>;sfQ^lN zQ;et|(NOPT0^hhzz;jt8U-w@`?G*c!ui>{mhW}Vm){s6H(eP7X-Icu}k8{VAbH|i( z40N}6;itfTS8UFw#Ymj>C}%zH2;lkNghh9>x>RD-txBzp%DF~&L_L#n?8+-{CWZOE zSel9J7vlO?MH*9bU`o&pUGAsAfBOxs%G`ZL3!Xr3*7Uz)J2kjZHwnFEjd$GYacxOe~ zlu>9!wiWy$28*ic+u(ge>U~ku(%{>(BjTP(EAVC`{_NY}k|ArQNl1!>4Dx;#oYqJ8 znkRl2wDsML)?@yj4y~`Zxj5I!q|CsW8=u{G@wpZ@YjOu!lg2N>3I%pxlVzMI9eTk0PpottLfMjX-lW%dt1KBgdlVkc&SgEGT3XcJF0mbS?sYwCaNZb7{Nh73=o z!vOz9{UeQ~tXSz_eO-^}#IE16ImcU68C{QXoj9(XWlRmf%`JmO+R<2w@{j%PqI5); zz5|(Sz>*la;-28+AMC;N{GDssH17_>&JjI7)J>W4(=~9}m#pp{tdQ8~&) zmOA2)1;dSL8Q5km503DS=yfkXD#w^~UI*}6hp}a|bU96y#8o$omf<6LqB@K9>C8Hj z$8V)sC91MWKi|G#r1=|dLdB?4s~B zSmI8HWapy9WiA!?Dv!calMfEn!}!&SbdKc`D|pc|+&(<9lV+|Y&lnHQg>l!pR6GN8 zGRADMFfSxaADltEvCo>ZQh1n-cyPpkBZN|7?xZ74z)e}DBc1K_9yUIT`dMxK(@iDTerFcBvu=Ingx1EiN|T#Ol+4x7#eI)cnZ8Y`uX zqW#7QjA>c*+hplxrPa4VQ%RBb^x#?Y=nX8FvF>xLtjT6u$s&xlvE4IaHx)~N3@p6r zgf3*2R>B7w3O?M=9iY8)r`=#MraA_C^p+LM3g8;hkSAqRoKsVM;jV?rz=UBm z#*iA?qn&po3kR;+N|=wF?>XWRe*hZJk~1qN3|lAvXvy8 z7YTSu;2z;AHoqe`p{{zgTfp`~Z13$kB3DkQEJJ_5FKhjS{L*wLzsgPlZnSs{Z(*v@vtTEU zhfYAN`(&vS_k9b$Z=PM;+fi(1K820=Q@k1S-MrZoj!&4^Algt5~U-3Y$ap1ty2alpfRXf&YjOV5V(%6I>A1UB4l zsDptfYrz{JEy^M_o^8S`CkLJn5Ke-kMiA|4o1kb`R;e8R@$ImLkxl5PBOa_gRN#Ub zB}8;@D_y=e;Cc1x;~UiJ<4#-UIMXP2q25Fu+^wY}*6#8=l0M=za!eH(g?N!YFoZ}w z7sl{W;HwW}&U)uGMg(abHky@2GBhi(%q>Ubf4+xCxx**JchD$x&uZINnuNH>N77?Y z=OTYqj8gN8A^UL6$x_!Dl~OA!+OHk9jaBl^p;ch*OvV_d+3id42^(O|JpVxSuqL60 zb)FcVxNgjOuIxnqi7=O6-cT?4 z7*D)KwVsm7X8BWlv;491HhX&I276R~v;3L!0JhBeJ6jT9SN+Nmp;4cr*mq*_EyHRo zyc!PIxp7cz3)h)2TxYpb=SQgXPybfuv7hTq_fTDzey)q`VBxxMAN+o}u0*P9#1}Zn00zf2;Cgy9Jht45hXoP#dxZ;g8nVZY6^>1N4e3 zXT`lMJj~>X9_y1YJ2XIK5e6d%dj2BW=pkm}fBERE()yEFRa`*Edy9;oW;t=rv%?Yp z*HE|ND6%KOHbLJikw+E~+uU|55Yn{8gRiC=+=)pgK6!5OpTWt=T6b@V+(dc%3UleY z<&5g21stxt_hqHe9mN`fDI5N;@D9%h>w=R>1}|onTL3TGhG^m0 z4c`L~WfRT?ej6|gw^5^10Eb6oO{pOwD{j{)8K!l z{TcZ^8}Uklr9$6bvT1cIENq|2llH$M*V@`q!iTduX6C{Scs%65Gzqp{^w(l9JlY#~ z%46++MaG!}$YA$ZFiTv(^9laHfN7UWyTj|2MLS(PY53YP())Nff|rh^4Ihh^@^Ean zax8iH7%zP$e~No#_@-vI3>@`jfIUknc}d)3Xlrh6qQ4tn4com?4x%}tASE!)PMXk?SIF-x5u%S ziTh$J^9S>GW;giULcvQP0jmSfHz{A``Zuossxid%?;f#_nEsJ@23~qT7955O)BhYn z42}%74Kw|REf!)hGBn1+Pr1W)3wZfsGjH!SSmp>^lNbzPW=oZhcfq@4o9E?$pyeUG z>wp%SC8!QD$VSbepRDLWd_&p{FZr)SK~Knyxs$dn;v=n-A02Sbbk(`4T*1Jvg0U7B zu|GQIT%a)Uv^>V$G*;{X7#LYG__rauU_`9;T&BshaWlokWaG|XVuq#PtS)4f#_T_u zA&og&(U?a;V@?wk4&C`aOvI>X1#Vn90+N)p<}7j*g4rb0e-SEnMob%b1CZdUOHMK;GfXz{5oAb`N^J_kX5}Q z*V^ipU&@byN92n(AiHdk*#OC=jC*_89hHZTPufc>pR3g5{MJ4>Uz4I9;OE6w9MrYs`b%=?p~wk zpFzHlv1TsGgM|?>F(zJk_W5cLB>SDGWMmTP@UAImvQ$$^|Mx+XO?n?IIJErMT>c5TIHU~Q8Q~r&BHZ5M8Dbl*2vIU!p~`G>wYMn zaw#C^GG~bgmi0Tt9aGEK6o!9)L%%@!{f}DE&IfH_zXnrcl}2rfxZH4C7@emE?~CU7*RzceVNS>D^Yu9B7U|jEJ3Y(B zvan~U#7Iw~c9J)88;kEg$+QQ5AGfvoL${9fsbDvA6Td4D2D*}l(xfMOpbJidx1H~0 zfGCL?MwG-0k=q1Y`aMB1}51o|PKg?vr$8$4OTRi?@*WW;pWkjL8Ew&l>w)ZfnHF{8@wFcPmSwnh0Xs|jO3AvhfK~We?6aif z`@;GZ56c46&V)kDMzG&e980Ryq4YO!;K{duhjknNS0T!S*cW1a#O*<{Hx&GSkjkFM z`WA0)1m!%pg~Fu@eZ=#vu{|eiZTGdRveL17Lhf}_Mk_MbgY6BiRPsq&YNMFr6KLV< z*%<#1*HyAJc7oGT)w%q+c(9|~hYVHh&1_Z#q&*8SIuPG}Ef?+A@L=H{+$U=d`*4?6 z{VX%b(dcJm=3Hi2VqGB41@EV2RJ3~9Lq>#+PM(VyoW zLJWHb&y<+Qy*6$r*fH3+xfowDukiLZl|PF?ESBY4m}JWD1we!*d>gnUX!5A0rcEM! z5_iDg(sy|#AHF-4aKf{#q@ZmC_=%S%6uESs3qg61ogOs}vNC0|U|svN!+&Cb$%WvL zgN(ItmD6gFAj4!9dj z{$8@Mm0L=|HcI@!T|f2==z{!EBfr1#E-zOev>c- zD=8!F2vJd?lBfapTkbLfZ01dE|Fhr|z^$p>nz#TyIk#~p?DS%ASwG?FSC^a%Jl5-* z2mQPu_JpNm72X9uz{Mx6b*|dxaQN69YK>)8@hV2VNjUHNF`+x*yz^QTGx`xzD&{}+pxxY0x>zSmRQzCHPp_(NkH@wzHP(sx781_H$_diu6@PPt9(@s z-;&L0T!lFleeBv05GyHZ=(9u5t5U9BRHp(*&K^( z1^i?cMncR!MA9Qi6y*pMga6&9p2B%GQ&QpUkDVORnGT-^554hxAFb{q;oIQ79K4;j z>?kp+fU>w#t^#n=HiUxz7-G|KhSex>LR!2{o7vEi=mbVX(exr9vHYnV!%7U|oEhtA zuyn_kJCG4GssOzm*wI+%7{pc`LJo43U~ePM5)tee#pY{2IU!3>56cWe?!8u5iF$tg zC}v3QX~MUG>sR3?RdO#69o3>0 z+(EhuT%p-K?$+rF1>X+c;Hix{%1U(~kv-3gNJ1^vn#6%U7TUPU{cYgTRX#1HgLviP zBMf-2B7VUM-vyJ6yF7B$0HhdGr3Nc1d54I{`T*rsN0wh2V}%~83%Us64;+Ho2^oW| z<$s0#NESEgNP+8>W^f{d*P4g)-tBzVRe)#~=E^R2?%G7x9xw?oCegWFG?v61)JS{e z#3oi+3AP_5#VRJ&jyjMf6?E}JbK9$~QB7>Ru{{CY@!CUK;0$7{F$c%VyrF(YoP+hU z(_jP29h=$fV??!(*fjP)(m_^=N91z1R}H-CVP>C$?@V!$hJL$9cbSBYMh@R$c@v`+ zrVrn16z;{OP4WHDyWRaCcN+`#uCWIuAx72f8QV1O0Egc82YJ8eZARrcFvk+c;>fpw ztg9Cjz$~$89NI!9{wTB45CMrccKU9#?~_3$?ay9V*HivE+_$2b31K_?{JE}6%@u+H ztN2lfi;5b!zlo7L!5CtfA}h4vh6#ms zEwC*7SC8u;i+OdD)O^VN!{DlU%K88}rZm9Hs4AY3)!B9ORg>PcyybzKl?Pn4 zS<>%1Sw&8saF-lh*~I5$Npln)iZ9)Dh-)2c+2GmN_eUUev|yUhB1c*@=0KYN@RUHR zWkd6`N`LF5)=V+&f);19ZES|J;HIRd%VgzK5d5De8G~ zf2Ew_yZ;by&Om>v-(1<0FWkR}*~9IfB*k|U;@B=#x~=Gs#32$Z+*}%nPxS zX5ioVLj4i`DDbP8!RC-pCHBTj;|JzoZz=X-rPKYnZ_gRNdfHpei?Pyo{d6{5mPLKq z0UoRIaOuDF^N7Y#?u3%Q{^!0gWQfUt%EwAq`qz?2bccLo9(1U6PsRe-mF+zuFBr+Y zD5mk%tH*u~&4eu~AzOW{r0Q1*rdA6OEDJ^w`{iGTGJ#FfO1t`ErO|_%fqtPn$yPE6 z9I2UW!OK>HvdJ3hlAH^Mh@z5MN$MkOQ>mn9WJOPg^@(^*=Fi7WJZo(XuFy)W`?4YV z(cbH9+FAKz)o5=U;*&Qc$}Cp;`np>v^voIliW9FBLaL~Q_=`SQBF|%`F@p@gaJFy& zYu8xm57*tc5ncv*=OpQK$Sad@b4ivI)6EgPjZ#iQM$R7$dOy;HpLvDVb$a-zqwv%_ z`-p2b*_(knX`Wd$^be))eb+swg<7;3x((G{tJHogYCqe>jm?HE&s3u22a&Bl+)A>H z#7d=Y^v=t5^xT0t^ybIl%d!WfP)C1{TX^5Y-fCPp6Lms=3y{rX(hZDE_f4gA@!f>)eZwi~Ws zCOn{m-tG)>q86(P9p?O@qo@U(rL|>hq2prZ`#gjG3%S6oBx^e3|5W`|OOj7BiS2xK z0_w)h^KIZvkfZ(aH}<~?_Do_sURBsq>HOEh&Pj%jSI5OFk|4(SpQYRXqcjWKjTzUx z6C_-9nSGKJ06FLcV5>(L5PFMA*I^!F{V|NEPjB+{!4pu$`Yp`VY_^Kq1Gbcf-v&Ml zu+r9k4sm#3W5E7L0hI~TN7{m8HjfsbP8CM0!TxQ))2eDFtT8>O^QB7WY5djV&v3*b zv$LX*Q8!LzGxeSt$2G61+?Z%M8YvcxFR+_0@$7OPe~IDjI@2YdG2}1QG3kC^*?j2B zGMhBQAIj-JUN)aAxXZ!~FtEup?d3nfzqg=lelnHE^Mry@hzFZh(!ExX-DNZyV7&?d z(OI)66cj^tmkGypIL_w9d5#6#8zX@YHc587!C5wc0oaP*MVH)jz$Gf#9r}DWhr@AB zpwSTnIWQ748e^V>FaBnTpS-E#?Drap)5j&Gxk@lHNZSEsbK)q` zHN5|q5SyX~k6ZZcM>snLp6Tz0_us`?W+JlNTnPbzRp7N>8N%;EF9S_!8=g!v-Ho`x zR0Hk55Q-BgAOe|i>M9#A#N!>=%UQ|BjfmrOm;uhl+6uH+PO=Tl#~x)tx%`>t zja94({Sq1x#wz4QFrV_S=Z4gXqx>!W7L!9yLn90YGeYWB^qU%bTKTnv)T@`Ge-odL z$_%+xMQ5#{$u73)(Ka3{0=qX-WKE%9H13T)h%H^nXk)9Ui%jZa@DejAbj8q6k*spkY6R-LywMTSJ*RxPLvy;K zd~DL*0smEYVAPxh4{xhNjx@$(JF59BdwCAa3$`OmjEqSyjx2x4q3JPs)a8G0RJNnn zhz5br+2y$6vthj_FV?>jjowrXZ5TY^m=hAvr?w6;S$BIwla_jkkqvgRp(@0Ms)TKG z7l*^Dg!9InqUI_YPcTP%tnEtg-ef2ASdQZ|Sz) z7tyZ`S}yVYw!1^Ye-3WDkDWFl|L%D^?*5@WYU*USx0yv{>#0Gj%k;qVb#0!XgLQo<7(c{j zap=jRV9XHo3RqBN*f+v|uYb9N;mRY+iE-RfUVvY{&t1N|{FBQ}6tolMb{#cM_wfz616ULJp8$1o@{BTSIXX7n8IF?S_^4 zhzl%x2l+>sWKLAdLrUPAR~$Nc@L<`I(Xc($d3IurdFeWsK|K$;)R*U}=OrLMY3iE} z9kTOL{;qnZUQR@gGce+l-?;3^Zeve5W>TDOxxQ^}f#>|@&!9s;%Eb3;t^rZ<=(PN3 zaVSgU)pgjf4CW4I>DtF3E(?+!b|A=kpcTuG>W)yfMrVjhd^|i>bf`O8NW-&-f_tv> z(68==d_^0ODVKhqxX!F&2GokRNX`$J91}inCgch-_Yr3)e%D<0%C@R!JWO%~BCF{A zm@#JOduBT|B0Ketx#a(Q$>Hy2Qb|9M;o*_y%-y0z)(Tby`yk5C13QXF7zvFu6wJG> z!90@b%-dp+<}=g0d64JhujiTPkEeUhMoTL_oa;qL%<*u09oHFf?7M~V-mL3I@=dlT z=Q?NWx(^|-XX9$i|8Y&4a*byA8uRsE;hMBnm$4eBh*3Fzq%dlcYT^i)uY$DGExwcx z|3|y7pO>Qr?d5+w#+W(eJzj}5*HehF7Y9~eD$-56JHpG()}MUJV7wF&JF@-9gwHRl z)&7g&b$vMJ5!0^2_%|HEtUbWHR;(K-aVnj6?mG3tJHa#_3cd{A32epq?xf#b!x%6? zGex$o0mfy*vylFSx8810UHt@;Xr5+yE1&mTwjmX4z@brxX z6-sU>7P+Cg*gWqK7ilJ(>a`2tLPYyt8=$xvSokh)i&R6CBbocFA!C~gaY4ZoCaisR z2CDsc15Z@;Rq~MJTa8~P#)@&}h2;@kgfYbx(^gduO;mUqtdSbeo^rEOE%G_Uc<`^| zG+PwXSAU*c#20{_-5Cl#dGuwBJ<`Ewu72#O5uO>|X%wJ|VKnDq?Fdl{DjOvr4NMhxpa!T{R<|5^=Gn}(WGu@+$Kcvqc6-_10D znFK3b=_2D{pbx+{H#JWrJ!H#}8;mKmwSI`~oIO6Kfz7n|fRE_sT>%gAH;01EzzjrC z(boM##NQSQUhYS)Z`L4gav}Db2GiQun>vwYhq1vz*B$OAg z*oPeUW6n1nogKSQ`KCi%w>W3G4SFQc*F0i zxj+1tYQTn_?+w4FTaVLw2n;gGZp0U!mAC9?UeRAxfvZguqHbCBXYyrJd3bLAxwh!H=p8(WmS=mp zm;U9^HdxA;8ot3MsOyp-V|NU2;NYz<*ES%hJdV?`-wynUp5)f_(=1Xqqr`_&rMKiTj$veUXtaxtR<`y6A@W zAGY(w(wh8urv|MXkJeGdw5H**XIVK13>b@8MJ_{!yoDAQAzwM=m*XtXW#vl{mq|xe z*y|drsm96^BaO|`RAc=(d1O0}Sk^ey8t9{1o88RBLqI(nS(gx5M3$>v?hl0V^|d8KbwIa}_|yvaKb zwoU6LwK~N)$G8k*wG~#=iQ*`kodDa?o>1`KKDLgj->v&(1&bK&h0M}^)=yh(dW4rt zkMZtoBYa~Fd{6n3dufD7ds=0WDdvFQvr5cTtMiECl<(I9lTssa4LYB?mlQ`$0Jxt@LU`&h=PV4L7;Sgf-6JvO1j+ycE~rA!Esc)XR@@irJ~ zPDOk}uBU5k{Lj5Oz8dICSox_Jk4HJIGEgq70@~C8Jhwg+ygKlA*|=X*H_2L%AAj&< z5qFu7AZ`P`g0oBk`Y;rnB+snRbY-;J4n)>}Y2;Q1c;TS<`LNHO1xJ)O*Lr)Wq)9?nxDz#f{~L`iMG=N?u>1YuN2DDvW)U`ALnq z72@QCH`pfvLZz-d++Wi9J*FW&P_3%Ms9^5JF8hTf_Cq;Nwb-NM05Lf?t;)RxV zu9qBNw4ZJvrt4W=p7Q8g@Ysg%#*QJLV(vDuIX)mv5FyiK_U&yRZVy{M z6g(VSe5sy4wn7gUmE}w!;_<+~8OznN^?I+dPj8F&KLy6+MhD;H&SkwiS#Liyug6yn z-OD{G+%~?BNuQxGXixX)gvU$tb;NhD2yK`=+=jP8Z26l)gppbhjTX@T*=ksKj|~MM z{J-9xttXZlz3>061rG??hKPE0*1JY+jkb=>eyX?N?TGrAhS)mz(nhN43o(-8-xdT7 z=5=t6);!hw<69JuZ18IQE&OO$dbT3J2PA8U+oF-#Nv)3F4#xD$T#~JfVj9C+!utN= z-NLKQ)#RH+4{So@5weLW68tr{PDrp21~@oGOwvtY689J;)FY3yh6q{u1F{a9wLJKZ9P(`9rfcHMzoX5HWsQ;H$Yk zC$N^!L9f)-Q=dc>+vQ4>yU&#iNo@6M8i0$~KUSPnK3aSUazt0Bsb`4m`xuQ^iVU}V zR9Jzt<~??<_PpWa75e;-?>ba|!MF~q=YRI_(-QrmnP-oy>)2Z#HEtgJHy_`m{eomG zTi+$zsa-6b7hX8ogQp_t)CSFR8)j3ILgxRJoB3me=bFdEa?Yk(IwD(Hys14y-+S1G zZVy*~y8JlM|2^>ijvL3$juA`B^8_8N8jFC%4+SG-cDB)zS z#5Bp(4+WnNG$OD{{~*^vF9LgeLsO$W zlU0iUfPtL=UI1ZgdJc;Byy zwIkN@6?h0%u$dC9s)3KM>276hJAixm*d0E)t^?eU@Iae{vw^eMzAFnK-QPj1l62L* zKuU(U?!xu2U7H~|#==t1oDF<&?N#7j?p$~_P zPXaGFS@PEVBBvO7{?}{V8fu+Bn7oU?yGFbE6q*kuY zR<6Cnw@)5vqjn@=U6Cn$aRza62WASH(&uNW?pu6d*OeaV(fbkVg1esy_VkfYg|zM{ z_**6`tyQCSrB~H>=e*@?V9_=5g=;WYM)ny*Rg)UN+_QnCYlZN#B3C=C&FbUYIv_DQ zHg}1WN~#WMp%Huo&+|nuld8llYRKCktwFYvVOdgwctx@rs9d|6Ps&>=;OCH4HgM~2 z`mD(63ZumS2@Kg3=_K-a7(M%4-v#6PyT#{Q|A8EB)vnPq*^JB%&H@%_Fk(kb?{xvW z19S#56bMtKy=PI%*5DeA{H7|V|fa5ACO~| zrPJCMd?(Z-9@@;eZhV~0Bz$}_t38l`{0n!2nUDJ|u*kOK+E0oiP9htR=|!-)c;%)I zW7?9yd8r*P9Vh9bXMOKuCm!0&WM+D)rb&47{z_I_3{=-9utO7GG#WWueyQJbI!2`0 zKQ7{b+X*I9%Jzd?4^%(6BI3)ImW9j4N!_q2{NOW+8-X*5E5jEg7O98T(uMq<| z5?0$LwZJzRJmA1d*LNI8d`h7ZSITC`{pMbL;|S?oryy3#i_6BqW;@V5ME}p$WA~d5*D2e=zzbyT+* zj{Hy5xAR>Z*WZhL$k?)e^K2mLz$*_1uV?T}Rw;J&g_iXjHnpX@nq5}|NmBoF&8~D; z1XzRh!;ELWflKd&?N`#AS|Q)1c4>t#iwv&OLXoq&GEYdXh=LE)(lN~LB5Xkan$R63 z^1!PiHx)dl(Nbn7L2&_tH0$rV0Mv{$HQF{|%^`z*~(MjxdL{_Tka_27h|Ep7UOBv&`jotjjJ zctA0_!47oV3_M*Xo~1lQcN)!**Ho&|X&DAKV1F`iut3WddV(@E9vyIvh-(*;Z9VX7 zO){H=Ke)0W7jB>f$Vc-iP?t)y_Ts0(Uu@VH(?B^Y_F&w_zJe@)?yGIIw$)yJ_Ti1V z_A2np#9L3eCpF!9ah6n5OZ%(^_?V7E$TGp|zs^16Jhb!cS%)eVON9PS*Ftb)tNa?o z!uA9Y4c&{q1=xCHXaRbl22cGv*drS^Z$rOq+)ye###=Y8x00q^yb<+9mV%+aabwCt z-m+beZQd@As8adknV#S?Lt1|x{|j&Cc6oHwc6m&*3U(7(L#Vw#s&IC^F}^`Vaj5$V z*+TnEF+zW&2-yg&e-Xc6>Y)mitgX6`KoK6>;lr9FrJdcd&MsUJE+5>ujujF&+XXHo zsyz`gx|xtRJ&1Nxo*(vul^Ea8rxRY2;@smpl5HbAVqkxO6-A8WNm-FT)|@kTzl#tV zYUv|HN0cep5ZLUn#qTs_MtJ#-S;(Li>r;s~#A~@RPr+a8>Ml`<4j1pL-rQZ1*k*M7 z;t?V5akD(ay<^vByS8t3&;2~%nS|c96hV#X!Rd0mfz8E#(=JDhH>%*yL}P-x64=KW zrmDI{cbR3*7sU*)8*EZ9cw}@_qv74Wf#V~OY!Uis*^vVHBvhF|-lvQ!(4=Yx)YJC^ z^`XYMdVf&YR<^n9C_9bMl8|K>S1KYQ;t9VNidg~A6qoqgB9x9*Z z%-l>KwA`|HvzVlcLEuiS}j zstnL#D1}vV*sy)=I)zEyuGFf`v8_+t#4A;VSO!`Le9_@ycHuOl11(|@DQ;1RS z3BG&%m&^n!``!HvWXql4Ks_rnlb3mmU7oSw7SJ28Q@%Pxpnqk1xV$I$=Jnb>4O*q? z0xJ`c2z1q_vO%QhVsmHvR=NJBo^dKpa<9?=vA$CtXQRxR$NHv-bwEi05u2_Y^93%_ z71ma|1K(SrFgA|!&Guw&$!z=DbK?z+6vwx5$Xled>BU-EW6FJesXa*>;k65%u}1W~ z2d-1TY8sb+f>i zCB|T4nwsVI&ZtRQL?_W^k@VifI)`=s=RJeQ_V)k(rX$~WzH`3q{oehJzR~?^Uzj~l z=3eGyuiL6HrL_D$3U;8VDMHOj%&9HpWVTtDf|4zxC5&7$2_?_mX~R>SD3m;Tr;S_^ zijvjd646#jZ6=^3YqW$x$-1p-leXn>)cq(I`eLCAbtD1rgk}Gcgmqgra-D#>)H`+H zfZkiT5Owi)>vaE8N6$swt^2>v1>CLkK1bF=^Hjz^uS}?XYEx| zw(*2r*op|@keZG~^bxJ=`>>C~UYFJs?%F!r@*{Zk3^Z6HaD#VUVO$(EVWjgD8x~>S zx#J$U)58hb_M5py@Mg~)ug$#yU%9opCGfgPI;)JHw1h%{S1iuihc~s_jew+_qt3)Q zOwbPIa66GS?e9%DbJ^aN8=1-?J)1ziB+0#m!oQr{5ApxelN#^Mm2m|o_EHmP4mh6y zJRA)f{LFa+tOoq1P6TJ51d&19AdLa4IMdJeOlCeZ;=z7@U+zX5Z7M z?Q`uD;U(QDGV7kt#@oB&y8ug}ofG0RJ#Vyk>>|s0t+*E+swfsfIygCGX>3{#n`7{C z?iWA2@ijc*n@-nki#$zrdimQ}!+3E`ivx5@kGTOe)wb6xv}vjlXZ!ZrjJ2G#$@hkzjhPHxMPMzkE6JWAe%!1Fh4>H1 z^vuG5>yOVQvI@kos)D^gFJ_D|#*Wo?O7yQ+tS0;K6B76?GKOT{L?P1bSKGn&qQNu<@i?uBzOYjw)tp)tgWBq#gv_gSM zUgYzVF8pfN>4{l-`0Cw{NMszmu<6AwW#1A{%$n!oX7Gq)LMI{~y(`4d z>)Z_56QcXu0oh5UGmSFbbE zdC;Q>^&(!oCc+~Fc%5QVvz?_Cj288vX^)J_*hMST;r@K!*fZXniL|fa!-LTHdC#%ID2k&IT|AS8+-un<1TQdBy~zAekd$H{*iVs$Q`7-`xG4S#>c1Y)`# z-|@R8)fP+V${pvx%VN47-4Sx|hWpkq$)PQdukj^sS_7QEoe{iJ9=V}W)v<@WER`Bo zWj{fh)pa^>A0itwZ?ERK3Klr5rjD!OJ0mp8jxr4}b4#-Q58DWj1!h}*N!a6xe?bw= z08`Z&Y_O^_V_Xew>IoOR;&yy3*%IFd&tr<2t-1u-^{}wXWdfB;QLf^I$6pJnR`gir zAL+GN=3D1?FbX4RCY^X|&?a1HB(0B-Y9sO~LpFRnBlZ?UW4*!;(p9R_iBm_*e=MeW zu;AgoPI1ha+kdz1Ys^!c5LCTdSSJ4AI%Mmoi7H@y=t*65NKJy6D1TvdF@53Ju#Ceu zLduM&?Rumvsp3$}$!$rENm!2y=7UzYHM>CR0*wxD(GA6lx$6qN^Qdy1#A;Hnb1>>R z+P;~blSV--RFP2Kt z=5_ejV6Mf#M)PAX9aC-#s`iZ!a2g7T0)BBM7=7xDdbD38(3f6w-}EeSaq{~#s8bk& zTtU^#C-SE8;574MKmf-zz)DgByp%7#_kHnbccoroFciL1s4*x_#)5APStnWiKhp^d4We~_A4dY(YtRJvc`3VY|Tl;LuBV_ zO+oS(s5C0APX3=C!x|wcFd}Y*5qk(&?} z<}z;QOeQCdzfG+M31lpgv_jOZS zaZu6uBp=oo1`QGe^flPns*0J#18IgG`-LUSa!qh96T$Z zO*3LbA_~^O#Dt_?bmG_nv;88pmCeGTZPd?^YxF!}#H*D&yr$i7zc+Xc5KS$fZ)Oc@ z;brM@J&ktAJ!v2lx+H4RjwnLp3p7>;-~N-^e`riijXf%xnGyuv!Z>vR{#C1e@$Y!G zhH!;hN>?Vv0S_c<#x>@5so-+pE(Q%O0uS7jTrSO@zj~W)5@;;-Y90PnF~$gC3Or%Y z_xqs#lZ$KTPaaL*y0~sWo6O#)5Caw9sl=ac3QPPPDdTQAl?S!Z?Z|II0I7R52`AqCd)mm{He)l?Hs zpdY+qu*a@^XW-4#$G!)?PeOqW&4*71MWR0bC#OemsV9HNdb7FVvHB%Z zikvBqaw%H>NPPpe9^mZPRNVy2;;cucXdV2P#=k{5>m&6mq)C>&+i>T{yhz?nETKKj z6IutnqUd%hR99D7mRnX?Fau^A`jWMq)9upq<;0o7U8g}GfaRL}-`f9d4Rrijn$F+o zKG{7Ft#b{8*DAc9km`IoOTQ`KX7kyN9Q^66&OxLA;5i=mrG6e7cue$9?l}XBWc}2S;fbISCqyLx z$2NSml9@J#yxbahTT_5#4??5h#5Q=m<6$Rn)QLJqwvx{`G){eC9_*lbg~By;8#6Vu z3DUoqIP|fIoh6pGv7@QI*OP!X-UpuwT(nuXX*a?$OeywW)58q^Z6lkA=4 z`lV07&%YvJuH^FO|$okFHIX=Z)eZD+Jy&Mo{G_TG(SM@A)5Mr|~T` z_Ic)Rd()>U2Ct0j-XKQXg zMX|4P;FALI5_jGmKPXYMACy1_d~sO0Ge(@h0-JOSJN#WUolKluoJFaD%lQH{4X{V) zzWhjgWDX-omD)kx6@U>RF%wOKbpiDDxUYFSo}qWg3d!Q8c4ji2i$jma*?qT1g1UN; zT`WFxLy@AN-sSW@bq;=h$vZ50ADAVw*Nr)fX!NGn=Q8n#s|q>qMDg~u{n8TiP2lIK zS^5{8&YZ-RkCoX=;Gv4&o(CT!iiC*mOB%x=hvA&Qzz-o;k7J!bx&KEZ&q?25U&?y* zhzkIpy*YgR6x`yR7{sal98#E#i;2iIfJ>*dDPqDi$0PNE%@Q*%GYtOVwwep=e|;_$ zQjFhTKO=3|r3!mtz3ngLMg%TNLTL&->4n-@JQHg3%Vc9LDBFIW@I4D`8mEbquhZQv z$3aU|h*#i0dgBK#GpEkI%xuo(nBM}lap2P`bNn5AT#$o}3wC+{F^zhnUP^Ph$;qPg zy4K|}C~|F(<|!bn{Ny>yWY#r5mz}If|MMX!Nx&@8&R2-FH6oz+%XMU>Y)XWu)T>G2{u^fWxgvq=N{Q=N zWqS@Z)@;}_YHYAFtx6HATB@YFnJVFkB$S$fW6TCD6Bnw)FKZ}@`8lh`xd>8`ZgB_Z z^G5goiaQo;ba-o&a?N)lmERP}Psd?+(4%K~2lb;8PqclsARSSVSwk2+!Pu5@uq-56 zS|k4QnsGgB?M6#qf_Iq}32oT76xD3DkRmQ_v0&D|)aiwfx-ALCBFiR=8P|x~J}rM^ zikRBM33}{6qVaHxKzc;aJ%Z9$lz1h*)5W*JhgbnwDtunR3x+{_pp9(JD4&NsFAiTn zAk9un$Brg?(aVn!7v6T)og=;%JFchVBwV>?R;z7Qk~yE5 zVG;M+a5E-_?YhyuO0;2?1;vf-N1%hLb$HXz$0S=)lrAC7OvGD2`w+&k3ExjPrpe+T z+lZFRcdXm6&VCxP;j7@IpPk!QUy8pBY(CZ@W}Z|s5%}`YabD-jab6kIEaxF`H5pTq zqXl1)zF>xvVCQ0Co;bS=df&Kpbav7C4Tfqm9$uI zMI3~#UU(Rvl90N{|HcCe}-AUb$rXVhpVP&q%{o5h_cjG{zyq`RUoG2nx^pgri(ZU2eszn53rIJ^9_B~)uLhS3If$I3U|9pnqONy; z*b^({<}AT;&X(?+i)c?fJ5iV^K62dx-r8*JK;}CA^}xPP2Mcn7`dgvz&%%@GZ0Ktz zi64SbK{tYL<55YdQbH>_sep8oT89|px?flI>-FBMu zO8U`XG@>%mY-HeD$k)Wa0no$@-PflEIF|=EbF`T}_Y&1Y{F*OvXr*7S^M^OQ*h;Jz zbPpKJZ4ji@d}XrO-f~o$UT71DYmn~ffInbcK}(JqtNB^Ku9NX?lr)4{iLCGS?nnE0 zNQT+U>)_Y3h_5x#iCXhH_-HM&!3QuTrZdId_EdZs&32MFtDX2LJ8VRe@rWz3(^`mq zNp-9-Nxa;?0rTj6>fv^?OgEEW@^Sb9`9h%8P@y&LkeTfSMOG7yt?S6yy`TlMrPz`% z#}fm4x(YxWvIe4*e{^^DBW^7)g+tetqI4Nf5M+!sL_K=zzv(}V?}f*KEQ(2tI9lzr zj^3}?(@r-l6oXt0BwF8LuoAln9`U0$2lM(mO7$4*|qtOpzETbfEhIX_hj^x7QPF zs$F|??IiR|H*u1<^i3KiWb}x=z(vQ)rO9FkVoT5(@2k^R`fjt~w)Cl>)uy}g0DNgD z_WlS}jWN9xKC*cba9S!A+!0nqQzSGJ<4+M7z@H)yM&jQ=`GsZ)TvQH$9^^WH3+!l$n%2>#X7CPnPIK|DJZVroq< zrxIYdc#ga>q=;E^-JPd0uKQP0TzYz{vyq3?Yrl8N5MNC9R;u6{%OnaJAT@7z_mPz8oHeU2xzhkU9jUU%m0$M`RsK1KY-?y!J;ffWJA0)ZK2ies<) zz32Z&@0SNu2V%tR0mQGrPNSkPPsDitr`=ocSM5JqUvxuT;{$6C{~C55hZq0~L`?E4 zx8U?p9|tk(UoyHLW+@}ShxoZmF)M1c&|jDfA0KMOO447*v9HZrWv_?~hSy_t8%14F z0ME!_=p6310S81J`fs0M<5>qEKhYP>C(i+J-KJL(RbD>j|C0vf!`-2}tyo2>F zE`Bk*^j@-_>vd(m^Ay+mMQ>QT%5|=HUgnB+AEdv)jA2C&VaE0a9t)7??1lE9=PVHV z)808-{V#L2;{VLqKd$@KXscPw8B^h%GkW&Uy#3&Qa+m{5OfWwuhB5H!Y~U+sK9_*= z%pAr|a3ERyMY9?-4A0#0!u%X)$sjM+r=oGNtBdcwlzzD$nwg_dCSfOCZT{!?8gPVU zTvWdnvByimmuOo*7Z!*!#bwuaAi{^n;v>fXPD7S%>EtVwbo_E14E#&n1XiR+v|hp; z5EJ*quW)8*f3AT}V=Qh(*>4xHitzVKrFU)IHg$YDc=0)jS@qE8177GtaJh|#+fQwK3XtX47(Lp32U?t35j0DM9P>SI zOocQa+6N^6!|W~#$ayu#Nz$+Q6}UUe|K3u^9XR!HGZVYm@j9^R)!;Okjr*l^+`r0} zybaI=H9q^~%fK;DZ_8**dSR}8Ke(ty;Be+7Ht7}oOY;&g?UzpJw%VDv$&kaxf_Hez z{Ic|}?#HJ*?#H3ciyJg;rugSKg5+6zUD|*5jt_92-bS90;F-mKCsya&^WIdlcpLLU zHkjhVeUhqNDU`{2VJp&Ty%cy;v6Na_3_P9g@p*cZf|l64V|xkwjTP)cU;xBbsI)#- zuW2gpkJhQ<{I4-_zHOCO?1JE5)$>l2nrlF5pJx8H67=?D>N~d13G;O!D4&5?>?;88AAs&-j~Q_GF!{x15bbo`hV%tV4oDa< zNB`*WfM$~(n4WD7Ux!(O^?Vumv08CoeU z!VCqqbH^{R;I#TLLXB_(UyP_mFN1dO25yZxhJD#YDHb#ILK_P__tMlmjMZ63xfV!xV|vc)TXV?cixq(-Mf)vRDI{uUfl{pB!3u6HJRc^8l@|G%30VcrXjAxM;g*vOc77D*y!&tMS&+GX{BNdd{A@FIEz-0NC~6vA9{oe3)YMOuC*Lp!&lOn1>gWYn^mRhB#S?V{#p_e-?!pFWk=bsTO#JmM{z@&)T?P11W zrQe2TrK-~+&%vYZ9-quUC|00k4m-y(!PP41m}%lH=x#b1!>0Tuo#N?0VIDJ*hS^c$ zIZDrMztbz_lI5EF<(ld38k)DABF@3fppa=Fr-;98n+z^wG}=DcHpP_(ud+S*n=3Ex zg(h+d*--xAPJ~~3-$ug=tK@ckHCHoJoO*+vVGSwb_t&5^T*+2ap6XJ>v$79!s@vE? zr9=szXeWM`2(I1EI&j%4EnWY!OmR}Vk8nV>urwNRSvo&P#DoWLkgZL!Ly1|0mKb_f z)GUoo6o$LEbt!AYl4^_P8wDKg=i&WQ=^T8Xv{axywV8Ew=iC5&j!5ecYo?3I`skE8G5nk8Y{5oc@E+^WcE}g z0^hXh#ei1Qi%6C^im75}3uzvJ+V9k}zs~+PS1*3oLNUc*Wjs9AMVfy(z|a&1t0=<% z7jXnHw~T94(Kn`gb#s1bV_auJ&#!|v$<0DP)G!+2$Omf3Gx-<|NiriejElT0kmjqG z2l#3pMo>)B9dIwOM*Y`k3&l9uW>9~>z5%_1(*&=p6;WRe7I~v91UY?R!>jP&2YkBd z8Ct#kW)*H8Hrjx*?Ma#{W{vWu=K!uofRm+2r~#Lra1kHzNQ()&jO0;Rkq}wrEmezo zxEGLr{!YH7opv8##dF2;Z|WN6!>7=z_P4Ep&X1nw;?z!f1L}-oW3W?nmR7ga6yCVw zdE));DAeKnFflLJ?Ue#8id>xE$5c6M%7R1RWMKKwAFqV)#-ogH}E zM5E6Ym%K$cAfyL2zZlqEO$h}TUvt5)L!o?JQe1d-ffi>`aiMAfv_4ae_8W)|{tWmS z%mvs)Cof#^1NaZL-yYq>G3@62g=`!zXo2hgpnped4yl(~dB{HNYo)2t`3s4+MBcG~ zFxR54R%$iMIXz=U+a$C#B2s9APGRZUl5Y_?#@m)6tqg^rCi=8A!rSV-rD?Z0>qTh@ zJ&;7!182%MX?KE6nwp65F07OK;78k%$v3stUkEFg26%?#p{SwL^8fcQwJVoiOoRs* zt9Rabj0pS#`@w}rB-`3j>BTIPSu-&YgNGET+#Jclqs;h6*kr~>JGIC8*!DO3b^6^A zs|xbT+o^%AP*n5rB+ClNsc40jD}6=4d0m576Y`%;|Eblj(N>Tpq6bwqtZd=|-{1PV zpDQDlu8^cRtdBWnzyr;Q@eS)r#~7p%hL5Hxpc41()DMg zEaIEcU$%6q@H`{FCbvyP+X~xGl&Vph2p?s^_)GpPr@PMd3Po8CfAl^EWpR$_S1es) zk-879#^LW~XCj`9L~63^4<{Tccsl8dz~5gxqfs{jsd*@wh`+ybCb$rv$b1wu4HNUY ztD)bVl!iO~mYJ?3rorFk@vrEke*IV%Kp>$`7kuk87+PUA_ObvhLwK>t8OZ6L#07i!5(L z3il-9l(EOIb(eOMHKGEkBBT)Q5vlD+afp?9t$VYaQX`cwr<6$Lb*f;i&l#?DKiye{ zz8Jj`y+XSwK?@yPqH?Q}6~HvBqbXYUyV2_#Yx6RDc5V#I^%0kYM^=@51wPd;O8MN5 z2!B}Rm!Ks*gPV8b73mFVQ@xw8B)xvHyNijR*ye3t7JORTl*RVGksS+Dy8eSzn*KbB1c&=CqPm$%zyz*)vu?HHf8u>fUNPRlSfVdJ0tynog zIcRFJi~;^7QF3&E;&RPNsNDd~Ew)se$@-$dg9~+l02<+yx^P%ru`ycFgDAef0{_QY zXcXb5KA;t~(wqIEW?Pa!tUW`_Of)P(p?@+4dh-UsS0JCLTJcedv`!dCkr4@NIF4+% z03&0>$PeK+8oH6X2C~N$J&0Nl`7ptYb~kZK;HL<*u}E=C(g^Px2m1?>JEwx`Crl`b zpmJJ_IO9Vvd?st)ADbYP1Sg@bo;BH!;+sqIXg;4iNAM0ckZ@6XWTUtI*C-boCJL2x zj4`M(OqR;~3*mr3L9$I$tGi;Tp?7W($Jw97#br%j13^)(VJkpr{tmkg4xI4DdpMLOj z-Frh8)X;5NQBU`u$NlFI$ljZtoQUuH-H;yj_gfOd9f+3ONN98P14h1^=5X%wVZfEf1uKH-`L`0-B#v|xKz6miV zU)a=T!4muz6Otv)U%F_&U2`n>)~m1x}(0=mKp8XZlC9>@6~6Tuo@`O zoaqce-jW%P`s~c<&N%e4stg(llHvhaz|-X8_XxT?(K&Kw#ynu;3=9!>4_ z5Zt6%c#j-SmBYv1=o6mWsDcSh{E2H6HTsNM*8mSgI3a`wu#G*q-@i+OS5Dl~!_cL$ zN#-EzxPCKBH?7WIlE>R0`^}wHI8x=3M^6xfiGR*XQ0U2MK#*WSlHkmqMH>NGf~jN+ zO19#+9lsawdkH@qemn3h4c4N?b-8*M(m*egpV@ir**rUBd74pin&V zH>4av^z7%lTFAbaQkhO04af*Q1(C$=!cfK@cRM3+d%{`>G_|K`=6kTQV*UO zk|F3tK+lWPVf>EZcMQLGqxlVlOAt4SB6dKpAVkxUhIydV_)7mBPv{!>G9^B&2n)ao zh~t)O_7}Ly^U#0+Z?T+5%3=$@d|e z&o5o1X=QP!V1=p)dT88Avs}~ZaTkr;Dc?R4PZ&HXT`#YYI~0$7G8OtKGo^5N-&sH6^;E$J{?j?e z^{6yiPrQI&KaV>CeY1yVp@eh?C^c3O4-1Fh|0Tf+-$6D-+o{p2X0`!Nyk&j!idP!t zosom`jL=MY=foe}5}J_!%t&DFo%#3?UaIfR$IXG$LOrm4M)QPAKVuHGd^Iy3cIakg zVIJnqP&h2`!f&3D;T-4U4$=EB3>4#8kDDD?e4DW#CJ{rqfnjfH->|n-!6e=@dZm-* ztagB++VU=V85)k4!kIhc|H&DJ(NQlI1N@<4L6BnQKKBezUzGEc=K=mf2PR8ljB+&h z{D2DbOp3bT+o|!@cB-^_IR_WKF*+Yb4IKR9@cWdNKA?&fmF#gXq8O;_nDhVdHDW_r z#-2KYKx*8e>p`LD0>W}0gUvGksV1p#L89PxhULu8FlQ@I{O3BxXwE(&<lDD#_{*2m#*=uE5ve?-#EJR)iF zdl30hg>FU%C2S{MAAYwAT-`(hk1NMleLE_I2^4Jmo^;+&LdMzppEhuTKX=A9E1dg^yFX( zixR>^pwYPG5R)hwEu~h@nH9FQ3=lmj0NNb%ed7B(?3^#vQ``rVApsX@B7dv?upJ8p zUK?d->kjW>rub*{uR0)=A=Xb-9M^I*E}(^VmB;xyICvxtKnz9rt%NRC0P6I@weHV* z6|+)j+=AvB^=}47SY~Am0U1|TrT5sD2AJ@TJ(dN`q}cQ*dzFc8Icn0hkoH@ENzn{{ zF3^4pfRs>?m>Pcz8nI^hQK5bavz(aVn_n)aBqTvkYfc)xxh5#=tF6BI!N{j3gyhqh z%)q@O5C_N4ywo0ra^DrFm`V8t`)9x$%odG!xREqq#mov}M;@@y4VJFi%NXO%y4|1} z_e$f;JgA*L%XUM13+n@0NK1NcuO%%5kq}rOn&vTlCB++hL&1X6kP0t`wRtEFJ(%Mo z9vVPIorID`s-?9B1t7K#eIk`9%y!ak;hh9S-X56yjlA+k)Fji&*5=uP5gg1>I^OQR zkhKgk4mcL}d+2}d0QjhorW%W9%DV#3>66gMn}qL{FTz}Z((BWc{b+68pGSN6L+^#< zkD&*Cw1>2T+C0Q_Z9JHhAdGW)Td5pqwX(UBK~!DMXuD|x@EDJ=Bp{xnjql`_RyyN|eFfS#A1ejHw95rfE&$9EdRJBBpq&Mb@t=1n6*K6wy5-t$g5J^)1r z@Q$tG*~4K>DI+@;Id$i2I=23h)CljHekJc zlhr~EbI=N#cs5oz+jOJeNBm&GQx7ZL{t{?l88(7`*mq||eZ;pAWgw7t2565A$YS2W z*KG$S=3Q~(*ZYW%LQ?@0hn?t;QrM))Yww7Kj);%=SG;p_Lag9xCtZ=Megj4`1$QpA z8jwmEr13(dLEMa#w@)AONxT#M87I|2x>jD6L;C>r80F`Kch+px-PwC&boPA2rTyN0 zSG&PW{dhHX@*8&KO#mfrlO_h)=-d=3gl^~zh6VvT@xGRehz0tCnP3)d4)_w0RfgDg zfPO~M0;I1Ak66GWJZ_)<@r|{>el%kEFxlRhgVHLBjcqCd^eHD=EEYarkhWp|DH>l% z9?^Z&eq@MX9Q8Cu?&+39{g7lF3_-s(3(eQkgsAx(Tec&nA+h3p% zX*a?0m_rGzXKkJr%HBPRzu1U#q#E6;h^r-(gJP9e9=k3H@j3!IXiX2Bh2!ge#5T;i z_v{>i+;X;Xdp*304p(9I^+H~OvQx_{JA-*;X8@k5^w1u-X|KgtzQDOASz483Na)x^ z|C%;qWuYxd)GEAr;R|`5bD3Z_%HvC^wW6Omge7^ai+t@GaoV{sc!H&QF3Dr{mC`F_ z-+W4!NUzW=0&0#dB~5>3S^?z2HfaPF5Z?}g$FR&x;r%yuuXnYf4V*xi?0)OncbD!akkkwKN-NqyaO{+#%?$dUwN^AvU^HiVLAO zFAde^RZ6As&P{t(>kI~ek9D>_M_On$l)`2K(eGowEo}jJ6r8(P`11V8uXoSy+%1GZj99nII`NitDg(hj4?32+O13g`?im_jdG>^xzPEq5)QC z!DSzJ7FoI8mpHE1lh~CAA&iZ1p(@}(NAR;r%@Ks>5O)gttd2JIXZ2IQf;BJnD#km@ zrO)O-VrDGOyA{SJX-v@ZiZYa;Svp9}OUv7vG_JP=KasPBxB%kJ72IIk+JCMc3w`ZBWGeD(OYwR+{L; zja8Cv88dByGc5NttmIF)anhJw^=kI2=^+XJ73bC6*b9rD zFeVj}U=II!c~UP7a?u~xdu_tuKe!1eBKkRTHBQ?WSi%>4hf&U%&m)Cy?WZI?d@|W?K{In@r{AIaQi~HPQyOexbd1{sr z4oxGboUM$gfyA^jvWC1lP0uk3tAx6RkAOcAY1hH$PlqGOMSlaFk!VNyU1`vwjKF0ZfPO~csUc97-7-yQuy-!zD&}fTDp(fqVwloL?W6Qnl23sAh2!v3;HSo~T>6%0 zV>J#wHWV0KNq%O}9zYrvHQp4(g&`Ypi2@(S4^| zpQe5KQ9p}&m*hk&^by`42GlpSJWG9_K^mF|x#SOlQ!5D6NnBNaSQmWi1m@rf`{A54+a@eHd1NdFu`h~ zCEm^hEs>}}97Ps=_UVY4(1-;xz9dqsXiHy!5ivJ$QzOcpA$QEm0T zQU$0?I{)xNKk^Q>NDN+o5iN)toq-!FVm;z=CR~Y7n#hWdIMY|9gVFJ*3CCAaAO2Uo zZ{he5%Ut>EhGEl*yKOxp?4UJ$K_I@sbdJ7!8h8gI?l@pK=0vhr54N*&z*`13a}1Fg z=+5)rA$?K~`e2WT<&yQkM(o6`O3^UEdxURCUqG9v^MJO|2lFgpY=R~Z)@^`i)u3iS zmSTgP&+?GqU6FEvK7$wI;Pslsi_+uKjNwoimzddiBwru@wscJE1`SjqUDD<+O!uXz zU?JH@nreHQO(|AxQG+z}}%3EpT3bKt>wUue7SDy;2r6_S4> zx;K{(Fpy02U!!}AF(R4~_&m0>@HD@$Dr@HLrOX>mpLB4XCY^)*L8r4E)=MlnZ-m?I z)X~3Xdir;loZbyMxyUz?N z1TJ1meU) zCV`pDmti;XH4kJi;Gd1SFM8H(7;9JcjxS(cSl0rqtASt=@g`DE6MViY_qlv)Ax1&4bpbJ{)`&f*kx6(h#LcO~h0EY!1P+ zw`C4Vghi9fB*w`R(Fmdu&tEO7n@9_`9B|^`LJe;Ju?+E9-RZB$+(GV`A0ioAB*os1 zkoZl2C%ATLYI%zrewS-Pz%gZTbDv$HZsEm1E{i!40p6TG(uZ>;Zlx4)=_o?Qr3F7; znPGo^Lf7L@GNF+@D|#N0Jzrpk$Tv<1AP(e2`$pVtQWW-~uAv&%g%wQrSD0r#VX>jW zXVhW?ENMvQaAtBvy%nD9YmxGnoRv#1pycdi+Q~J!hnR8nv@H1!2Cn+=&k;AiUOJm% z6ff|Rib%hAkj`Jo3#`i*b`{W>?qUan6Pb9oQv*6cf~Q&Un$tZz;?{XAjc58Hi^)FI zACo*6|4vReWm6>XTMY5XJ|RDMb{poC=Jpb}Pa3SR264K)CGfcQZzT@7BuH*W&s>Gg zWkCpW#x>`e1l&W>Hfb~DD_*T&GDB3DX-<#d3o`&8hiWo7uI2KZ?Xr!28Kcw_UiyT~Y7O;ji za0-i!Z$k3@U~wbTyOCx@MX?gn?^onbUeA~~lnZs^U1q;tm|RD$C7FQ(1U9t&$cQ41gw27_^P0(xSvFX#oe_ z%|xcWN)kBom0u+-M2R(+L+S~n(hWRPi#Wx8CHVX!?mtTA?4Ns_LOmi{w-JBm)GQ{*F=ovaJm%mlE2p$HU{4488(*b+G#s9hDFo@9=^kiZR11X zRS!`Yo^PHQ?5Y1lr&iThuSBFaoJ$oyJ-@kBT4;y}j0{4aFO{qXrBeFZQfYoxDdwS6 z5`y6;2k>iA;&PV;zVJOskn!KAc6n)p5%4O&GQh{-ytH(qT|@Tt-+nml2+g)6}#QKG|2`mu`=cam#(u8C|s9CVdyd zy72FuE1fJ4ehVnNTk$sOA9LtV_1ncC;%c~kibIey98&C49a8RNAY~yhJ3330_{>3m zYf_^fa$jXLYeZDPx!&87I12n$U%K;v;nRORz#-qthO95KvR5MU#tZ2e!^)p6u_lAV zLll7bzmU%(PrqGkLi1oTQ$E-!5)6X=h@njdx~#=v-xPpH=EB4_KLRp1?gMJd}%`qG+3-(|g<> zdSY$&kJdvM&!X?iXAbvDOCLyOWAQFM^+Zpc@Ej|i`G4AN&7Syg?GAW;D4zO%+JU?E zZ|!z?JkhZ`wD^J-@hv$!;*r`4++xBa=zpxEuRYv5V5SkWW{gq(7LWVao^cr}p>nXN z=SZ*gtZAf82>fwNzvBMu+pJmfc6`Zfm8#Llp;L9%6f0DVr=K7*z)tz)WgH>S3GlRj=Bag*8H`6Pf_}? z`vp(8TxLfZ**9)QSpmivXfUDWJbXhQB3vwjiGa;;leKj9W8M;w ztHs*OwQGkF)e<^m@b+x!x({DuKu%-0$#`>-cj~aF!_e2oF2Y->HSK_5x34@uuYu-_ z%~yb@Fw#g6FJK;TO8sY@0TCas?ZM1?Af(OfqUp8T4nYW)3^&L z2C)v`*!W>Sajnc&19}+n3O?aqGX@rwQKsPpNwa(J@=o(9(r=X^u`gnUJv*$2h zIoK=LQGZ{I)_TXh5B>Rap(ro1Vn6gf3d<_2{|L>^qtPBit*m=9?0ymL;J*d4;wywV z(tN88TIf5|Znt9{o*7XasP_YFLh$_4Bd^$RD`D^DZ|V8~wSxoewU?2%be&7P?C*VZ z=lh_L;!;6Zg$jD7rLQ?Cci;F=oZE`Oc<x0vLXgV_oy{~eN_GwqtWm-?XV_glpcE(a7wV^Jjkc$3hiw!~ zkZOnBn+6!It==0&kouw(SwEof5!a>P{!0kW$LuukT6yQ>bG+3bv+QwS_pC27m8k@Z zgFx*X(x8)zH64cU;FD#LfZbM2rjpb3-Zz~BM)o6gIX)+-1KU8-ms*3~#sKdL0R?L5 zdn$>-Iu{7rn>Se(Wg zRx`tH6~^z)({A<*S-XO^kS;@e_ki15jx*B#v6}sgy}z5rjVEzN`Y)>EuHsHh)8nZv z{h&dxdnldX4_!7(PPV158nZC$&gswW*|)}9w^pt@mTl>JS$=L6o+}-FZiQSI3))Tg z2b1}F9bZvyU?xS_u%cb9fD#9Vfc=5{b^C|i_hYW!4Jwh}mx}bZpdE5Lu|G}-KH=4b z$?)h$*R^%cu)A`IAd7dMDZd92x;t>#gs&_a8r=ox3-DjA_1=c3S?uk*wFFI{K`q&h z!|Ktaox&K&Dh2SYK#$!U08g}YJvvwzUkTGV#-89hUS`>ur|PxS(xgT6utOebs%M}( zz+!HKVV^I_&~aPP5`4pT+`=@jETo$$jZv>c`m*FREu%$oG7Qi@El2SlGwD%D(XnyC z8%+x(Mbt)t`VSmPnwmzJ6@hVi{S3y;B*1^nvuZOvxt$I0CGts@=}@d^oQL$9|#e=}QQrxS_-DN0CkpQp@ROl5$WZJ(r$&`&h6FXD4Kh9{P^M z?xoWEK{PuFL6lo8ZB9QS=M#}9ozh|V184EKm}xrF=JlCRaNwv62c}3Ic7jdL)BE-g zp3aFjMag@a@QHB}VKLtK2T9l`)(~(j3Dcq0TLw|GmR4i)GCCp861N{wv~l;qh|JRU z3u}Opt3cdR18A#C!2coY-FLM2Iq;s>1vo`d$0JQrKl(1Kpr9E`8*<-lDgtltlr+}N zRq9}+?%z3<$Bu$LAy-(7*lHg4LC<+t z@tg`~DzQs%dFYL$QX%3Z47m>@>g$oTBhn^0cL;Uw1|5;M$hivCwXQiLZIyF-klVEE zh_qeKl_IwpxfkTzi^yf5mzU(+7UUj8&L-!cL+&BuO66P*-jIqnydvk;AU7MiGC8*j zIW>Dk+AZgndyYu2DN~{00>3J-%i_p0C`OrW^n)ZQSI`*&;W1Jj<|EW>1P(XWY_h5A zNbcl8bad}}54mS}{&l_g!zTOZ^+v1&c_g&nLpZ_zzTPhl{Ofve8TkKR@9pw#x_7+? z=uD5UcaMC&?_KW>U>Bd(v8S*`*$VL6$f5~eLb|`|R2$PP^~MF22c%2MY5UU~LycCP z$jqLlg=xp=*^dU1ZZg&K_Xg^w9c;1V2`tvp_nf@c8vB@l~g#! z<8A{!c}ChaiDrBVQNt;>WfJYHA@}ogZY%2EMcpPjw;gq@YleV1QOg&Q+q7&5m=on* zLT)p1PslkNavA7lrJO58?m^_1$+=gMdkDEDa;^+-NW~k{<=k%MW+OLm5?sSLk;Nr?*4RFOa6*mnpIu@;<2cfrTb< zn97y#)1k2;R`jr{^8&BH%KE^1ldV*~?m^5hpBiYNiW9k0QkZ^~&uZVc`cqPrSyOYl zel=na1oA4tKz(-l7`Y+O6xp?*8oeEsj!HCO-)*#SkR_y z^N(Z+>JV)f2+0}6XZ;Lt?rWf-J2>0{Njd4>+SmT2cBhmn`hrVN_|A@Qnx#$HMFGPlh{xE7NOoNW$MK~@ZpAQR zeuU%w6FA;iPMT|?^~-=wJSox6BA9K&PGcq!CXh>(zWd?%Z%B#RysY%n2Se@-IiCd@ zflAI{KYt5+B3DqNZ4G7=-sv!7L+-z$G!f}sq@7564C%;i1pYA%b3$MB6sX-{_heX> z;wC8(8`RM9BdEdwia_7iNYZK+R+-9^z)m)%b$yDsN+a$qh^&q5sl%Dsqbs}vT_!<#d&`{G z)dk)24<1398G-*(vXYglzNJU%_V=%NQXxERA9h=ZkxsUB{UPlz>}ow2eNFw4`#5;A z4(N=L2H{Q{#gs9gREbZIL}M)yWD6?NC{u}BMkbtu_i2y=9F4<6DoiNn5PIq@Mdo+VG?zL1XH1!oP}f!m+Sl zU~KYJA4{()6p32Y><8Q~Y*ZT~G5_N$#~LFl`IF%|H3Y%Kk4IsyP7c9OT@p!|ApOT$ zgEulnqvEl;bP_C{{Zdj&hn>nO|M}p4DPeLtvtLSlx~=}L$eM^qnfDW7p&jnT-kIVl zgjNWpJqDVSi8zVyZ7>{zn}IMfq5_V97NdPJgxKCpPxiw1APIQOW&uq?PZC^KcytEv z|1(3Oo8v95MQK0iX(o%x{qB~}Lis;YZu<}A-;5~aUNmS89sqc?nLX8L|J4XDzbmun zx5)i%?vR4t$7DE$%q(J!|^>Yq+7a+iC*ugfO;e;Ga$`P6gddGdtvV zBc6#8Blfrj%s#Aj@C>}crg^n_=E>fUZ{_c*gAXE{NO(w)Ph*HdS*fa2<3yesA}!dN zj)$OKpggWRp*}g{-ZQ}OpM{vlI@jyi5sXQ4oaz5^j;iuZ|KH}Q@vmc!5;TXokgx3c zUU@uL2>5KoeSV0YX`6p9GEaruYyAM2#RGGVE z!mPfJ^Fg;i`o_!;x$7w}*W1=o{)Ak=c^SQ%^6%Vj&ty@)8hJ0TjFIb!{vYkXfa-VO z&C~N6;2)gHqW6WM?ghE8hwyGDE1)q6mIPF~5#wa!aZs@$$9U1i6cs$cY^^}Y5yU9DfGRFk4adU8gHUB%`=13;=zeD-JLh=Z8?8u-iF-& zdr#iBcF6rbo#4Bx=6zE;?9xVe2wHp%%9~kxhue$uKQs}rj(BPG<$ncb?ak5GT%fk2 zd}f-rv-jj_-s*^ow|d*#kw12~Z|{m6#@DdG54=2~10S;FzZF(=oHJ;#%D}t$IE6EC zaUk~mn?wGtHI0NrK-!6(N``GG9x>0L+o zA@_Z9iQnB4@B0(+{y*W}>|#HB|9u~9LYnZasTq}s9}y^QfVGTXww9SB@P8p)&#BP$ zj4bnc*JO*y_|J7FTc({w>7l{r@`vwHXz(P(Bor)A zIpC#mphW6v1BYpAfa^Hm)0)-rr63_%$IK!3OOjz)pL1NJ88CIoV-^CTZvfoZL($mD zHx1csgvhwcRp{jP;g{{=nNQli<0zN>R{%!FFujg#3S&96G}y{Tuy%|W)F+v$VR$ts zzZU9~7TCuRq1N!9hSuw#bHThG4M`yP9zD@I@U?UdKHlcw z&fV=f0BbjBzQGSjAj=Q3%YuCnUHXx|k`6Wvb0 z2r-i(v4elRZwh{quC4aNN!h+}N&24#yZTZTPr_dd;{&Ne{sH8xg-gOzmj#&JuzT4s zboQox*;F_G(+-VheL8>Dt0|>$W!=@8VrmH6&O=>W2=TTRuGLm=YPHoXY20BXi>)P+ zVlFJ{`WqKGobW=ilc*a7`1cb8m1~)#@k1=Puw|0MZ(5jNLZ!90ZMlY-euid0fsMvk zpZ;eUzD{J1?;q^y9R^lQQNeT5*Qb9L!X{h}S*&9d-|n@o$pUZP6H*P|eG$STNFaR$ z?P9&K8!4@@N6ypN)+kTGkA00ldOmSV3NVkj%ZG~q+ZphI3LAFZ{ubI$-xex`82!rh z`F(oG?7Brp@uX4y8{gbyK~xo*pO1!EL_1fuMevs+yfdS8g)Lc?en+2-skyAU>_;u4 z_*)UTLfGUdbxN1+!N=3R=_jqX6u11?=^A(ovGiRH8k8j`mcFlpd|cdgtz7yQN~g(k zkiQ2R;PHHl=Y{jENc<`(J&-hOfC(+?vT?*`1O<^zG7!M{f#)X>W<_Vzx@O4z+yM4| z;hR?I58rpH-Xv2Xm(~!+74RQAy_T*tIhPJ7^4I_~-LHwA!cEam(hHM;)h#C|Yvo*) zt_Ri-O)}(OIKb+!buZ}se+YXI_$aHafBbo-r;$m633UpD6w0K4*kCe&p+pVEf`D!) zx&ycxh$uy25K!!agqDD^QkG(20&xwBiGr`L>$({NN)a8!T`{aWDa>=HB=h^8`%D7v z`~E+FKA$k>+;iJ=%em*Cd+xcEa{SzoAN z2gA~YK;OymFNqytSjr3-CX?h6mMn;6Yf(=)#STnM@uu*UR)kTyBw%vv#GaIKxZ837 zdBmeUH9U2`DULzE+f&p+Vt=)e-A66Vz~8_7sfAdBT1dg)tq6Y-VOM&q1=>9~v%wmj z`=Ye}J+kVlV7s%)Hb~5tZpOPE^)hah zsSeSZgGeD6D--fSxs|xGwcJNF@Fr1TIaooS@fcB&D^A-2?XWW)V^=; zxMVcaKKwhj)0K_8_c4Ojl#l+9b6YG+Y<^R2r*r`4hm+x_scQ*IaWO5TSm+;&TD^)| zO**PK&9l6GB^I(WxSk0*LfE_Lc4H*q9+BD$J(+O`-glJClrHIUy6i0{|B|r$fF3(P zT3&v%yj+x52Hg*&T%3v5?Ntc-_A3O~FAXMt$LgxIyNpA{DwB!){HYJYjvk&L!%}L< zHmubnY_m9op_zEAE`ADmgbYi%&~1=Ig-X>m*L=L;QK^ll`>~d&fuL*HZywt9Q5lWU z-KG|koHEcU4AFX%i&ITvNS#YkdP0{ts?L7RBMiZ+6bq9?k!6J<88z~TMj8o-A*ygTeO?`LnST^MOjQwaLx6(-Dd>{CKq zpX@ZzPRq75B>fATPov`vQwqM~I}STJd>;FfH_+2L2yX`L1Wc*_5wRiuJ|5>&>;a9A zwH*EkXD8j^?<4+Nla7~G$6=gzFD*stw}I`5=6V2dOcZ{Dm%M}Lw3COI@zh&+_*NcX zfp9uQp&Grw^;UBDdLG`3$6p;GJ%=2=9BcN6;BN{O?SQ@WLegW1xiy-@LV{UCfzpIk zD=#F?`|@tuccA4&YjnPg`dO|~Gs15%$)o2V zfM1J#<)?s0@%S`vLQ(_t)bfs%}EnC%R}nki>pFxc;H8#R^&h zuG?S8^?nWYCT)i}WG7~K*WEO`Bf-6xO#+`yfgsI31&7;%G%Hmc{v}8=QN!V%f;9Vd z9R5D2!0d}v??k<51m&YnL*)^KHXjBoucz0B^kCE<1A*<0wyuHt27SGn_jOVi&C|Uc zjw6bl@?MSaR{_IGVzjS1v0{xe$t^4KJz)2&^mS5?x_AyPwA(`(c^+TxH1<#~A^qBD z4Zh~5-eY+RPp1ZPC&JRB?K6?rL!RY@loEB% z;IVFj9f8pio&QMD%@;=S+REXXJkB7*mq(%T1X)gy)W4(AEz;{W+KD?&K0cdT0b>o|@Kqj8V}z_`Lek|A$i@&eV5-XT+z~omBHiy} zicV=oh%}|Ix#)bz$j^tMtG0+0s!C`$Zx!=hIYDUU#DiVZeK-TNLQ^XqR6##AmF#z+ zIeG@?2MfqI23m1CAgLJ30X?Tu6EbYb$XOf}g^=+#UV|)=gV9yez!G zCwx)(&pq&hu$9M9pvNB!KZZGr@8`VtKGGdbCmqaVpiK?S=Lfd7uM5F-poRS!vU%A& z#KCumq*bUJe0}h<0@5)FOKBdIh3T|WXwZG66k<*Uzts&x}*qg!U4DNpLJoDJ=fMsqxjO_v}bKneC16bz3Mx5X8yMY5Q#TXolHMMLW z^~qvjd9=cEjK-(TkBI|60BkS3dgi0l`{*1Wd_v~HQ$yD|@D!qeAIX#=V8l;kj&vJx z=;pwqqm}?NpB)*pfh))yI4hb)rkF#<9!h_tUmLAK@6cHAa(NZehlo$fWyJC_$oCug zKb6r_I^I`BESb|v!Rws16?5h~r){AVYqYVz@cewMI@lS=&3(nC-|S85t1fHOD227k`5z6Y&>LP5`6!G zv)&x+eK@{yF!r0em|m47@DQZOx5OX(2P>%1HX#1xKtHb86B-PaT%R|QpE(If*xUCUVMjg@jFazr_P(ul zRg-8<#OqXiZ+TVJPncrso5%EJ5q^U%ksdh3tR;RoJGWCM;$5xMICo z9f}F$Lo>Gr>ufxHHseLc0F4F0L(;AAshEd`BopE+GtEHjMv_BPUtl?oCt+b4l2QRL;W85K01|*LjqVQ6A`>zH>$iWb z6sj7O!lXvrhrr*DA1Q?c2=n6)zWrd=4IRFPX2P$i-_EFXcm?nvlh^D*U;F?#Lzct9 z11|y_jI#BhoaM0Ghr)d9|9}qxO$XYi9KKF#0G@%m*_L94mWOZ>j}_5uvt*!TH*TXE z9c#=v8$;4zgquuj%!>iT;sKx5&4mjc5fVnD+m)FLvRqj#@P+J=Y-H zt;v=~T?Ommmy5nkKrU9)dM{wAK{jCeN-A}5^vkH!fq-iePNfzJP=9pfeJ1f507psW%1!{uOW@U?bowfL8-H1O5T<(|}U} ze*^d!8$4u;DJXpva>2Ii7|TF-6T;UbPA1^b0gnZo4fqt`;edw${t$3F;1Ph|1DpZa z3b+>VAi#Nm-vs;=;AFu2LsTY}9h7#5RFKTz!yKBsyI~nz#m1&}O1jQt?6x%WH%WF- zKYpmMdjb2AAYKHsVZDC=^I~&tP{O4mq}KTlyJOdf%q$N31fiZ|1J1N#tlNF1ed z%rhO@7?gekf1hD$0n`HMZd3O2LFr$B?lUa{I52iy1dmYepQwyMKKzEt4Uk*xJ0F{^)0jdCWr|A%&7XjU2Y5_!Y z&lFSkD?!-w8y&@_MSz|HG|6-b(35~Bn_2)Z1vJ5w{c2G96Cj6a5g;cZgXs{U`G9US zwE%h$(6gpGW-|t*nSkZlP5neC@!e})P^#=)iWa9em}oD77LjVvt7OSfFW2GRD|_5&S0^LFPLgJinuBI z7TzZd!eU?O=$cQxj5TRqQOCxjAkO0wS`}Jhi1P5&IY!4ojHeng2wxPcC~h_P13tD> z&GA>kr)V7tN~2KQ3KPi#H!;PypftR5V9#tB+DWse)JNw!1NjIW*l9t?eF!l+Ugcvu zt+T|pK(_$5u_I$H;+;oX#@K|Od^;fD;6ADS?JV8df0gIZ8Q#o)Uk_B`E*_2AYMf7e zHmMQ*8%kQvO-l1c54FSYBpJdY09y_aFq^8B%UgIv$p1%$xvbOrAVr_~}3)`oBIC z^4`9eL}AY>qQL47nlz4HcM4vU-^t-^9G(bR6-`wbPDQGf zk`bv=kZVvH1AV-_>j+AD&>eJ_H7rcBrCe?XuY+74Bab7)eR&)iPDLr*b?X)W45duu zbt~d^P-C@}`EO8)@LgnzV>e0^r$cA0VyJ%uoXiS{HxSmG00#^Ex+eIV~rxrtXO^8YR|8=IZ=4`;d0YArMmDz(*BFB&i zbWX-#R=>L)i>Zq zLUB;=kvE}4<>z>rZu|JSpw73({(0-bSZy#?DrqT=6Gnc~@Q3k#zpB;h+}m(_7&n6S zwxY&X7o_|}orj(9cvh*X5D!;gfnD065N<6gYex6WDWxyCv-4xRi)6)lZ*61iK;>(; z*i6Nx*fFX?g}1RaR#Y;(^be5`V zzxt}RZo?7yNjo$EBX2a9;~2q?SLE1@6?h*lKJ4$^n%FEAh53JlxN4KjssPK4DV}K4EthY+-*Z zptnw5@+P#d79-MEkpYJW9>$6NLF|gUZ2pcUBi=vxqD$Z5f<>mSZ53=E_ZL#w$6bx; z#)L@bv+&wOZpj7uUv~nfHMXw933&g5+u=jT0BgXo^e(Fk7?x03pQb+tI}WYGpTM9hy1<|7VEa)Qp=THIB)h;jUtq+`q!YW31yfq#6jTf6LsPye)>) zY)-0pXvb7l{>&V%%Ycn)Kw8lSKNz(LpE;rLTeTfAMW!O?jGf= z?fZPK+pfIye7_eAMNBp9u)Q4?im;7^t!!_Lp;A2D2f7QglkIb`ZzU`eBPMR2$oC`N z@|al>67wJ2Xed_TK9gyx&Ho&3_XJ?QNiUN6=Hm3T^WBiIZA84$;fHUzXOjZ3-h2x? zd%O?XVVE0`Mu1~wLuauTluW>RfY$>y1Gf1$B*`y<2Bf|p>ahmNr(dw)hi1#xmOEGO z@5chf9SMg7vot9E5x3jA@0I1w1*gQ0p5A(UBN8#s;xV%kdUrqoPqFzYi2>ysm`C+Np6gNWYsbi0hGT=4)I(QmRS51Od$3FJRD7r(KjJr+=oua8O@W>F-xRSLV z-I$ekXAR;ra_`3@yoo7=fvCmZzs`7Y7nmi(f8sT?Gy$%nB@Z7T^f=`;EZJV z{G%aXyUp*$h$X2gD1Arwr@)Kp_D70?`(VTDIfFC!F_05{kkU87Ga=s3!~QP|`{rIj zxn=%|et59cSuDb@vr$8uvovnScGRBDeLmN0%q%_Z5)bP#^h1hPxUnE5EUU^Zx;$_Ns&gSQ-!NZ*-o6HHFR&Z=Hr!2el+kW;eb*TI+87 zDXs}1%v~6imf?0mx13P`U3B+)KZ1w%=PN}f;79Vdg0B^BGAF}l#mYxsC($#ju}9A} z1#lDpX4H^Yz<~7END|G-hBEY{9=6X@kfUoU&A_jbg5%gv(FzohK5AG8ub9J3FAkjI z7IS)?U+DgGt12Eobp_kicmY23ax~{Xt)ei7`%fkR8uX{f=ul-1hL=9kH_(!(R0=qS znoB1^0ldjUV@jJ#y2@Cu!b}wU^1no=Z-_$J?g+epo#;;W+fU>{kzT~0QyD*OztynV z9F|*ilsx!4b6sprKJ53(@k&Sj0(kS8ldr`8GxJmNe`)?r@HDbK-^Ets&js`ZpeOP7 zIR2L9(|vKsD&_#ZO>99pX`LvH+BhIR03T8P7Jb5;2&ei|eFD;Sd;xunjNx`FZYy_V z=X+VkrPO_KHABU6*ZgD`PhOiLliE)VO<1$D9_y4J#d59geX9h+c4~fqu&Vjlh z#LGhxq9Id@FgAEduV~0}gnWq*Dl?IX;hitwB^}_WJQs>_f~QG}rg<76#}GoJ(B@A@ z-QEJ`>%sN|lPPo}6p+a3K#rS&xZ8T-5>^q7n}YA6xEp)orh>Y*CoW+tqj6KCahG-_ zqF1P-G*B1!#3gJ&G;Ufn?i}DGq1pVsLA?i9Jg+ZdcL9@Iov?|(8X?8XF>S!8gx<)< zh8`LNJc>noVI)G7Jg+`TO{-YE+2-$qwhEUABqMNZ6!!r)0B`Jxodk@>`cNzo$-fLO%HkNCzQ{jfO^xW`oyG z>oammBwl}R?@k~T*$FO zpiSzGnB#$!bgairF9asn=>uT5plwPzKEPT}CoVS3u3XTE^0eQhlx)y#ZQoCm>HR@B z_0WF+y)UQ#5T*M-PXc`)Pk$NoSWdru16|}HKTe}q0Vx=cnA0e>f2%1VwPR;WP_#Dl z15yj<{JZ?yK))Pb6aC76A@6S}cH6&@_iF5re2Co)I?t``-=Kd158@Q#-#kV@I@Oc< zCs0rD)IUX28<6@~lwQ(t0xk0vPfal8ACUI-r2ZMHU*oBNj;7Wl^%l^3^Do(in!dun zWD~xG>NW}V4fvALygossU)}v(ZP$Q3$#c7g+^81{(29?OKA6Y$gZ@WO_ebe^&>!rf zOQ7G!>Cz4KyQ1`xjs|?oM9>M6^QZJz`-K~_HU)D$A<`ZHM1ziJr zNkfuz}TSRJIPs^PKU5xh1X&xg0twVR8HiO#6 z^#ZoG<|wtLhk6Fo%Tel?DD@(!YF_Uu)cXwfvo?QKw9R*;&HoO1GN*3={S?vL0!Z6E z*5BtLzeGb;76qUOr#L?%M7Gkv{0|xUT(q@4gc`gN((!~yQJd~-Bio7wJl5uKSpPxgbt#-@!TQhZbv9bB4^c1DI@tVl%0_KV zAqmlti1`mlq2XB84fIZE6>R=2oC^}&&#`-eJqYZ#;1-rSn&>46X?D*=*uUruKYB;( zXi`ABL@C@rx%C#Ygs`lC2|;E_T@L?6ma`+hAn_Bw?Mgt{i`ot_{_~ZdT4PHJo7qJ&TDP0 zA(sVKj7mvIRH;{`xx?m2Dt*)8yE_ddn3oNSF%UaYOg?w#V|EysMKRk39~l=W56Lf<|T zUsP(TwC7%o)|$7?6BcFu#aiT>Qfa69WKuaOww?%!&6AZ%F*YLG(V%knqbm8Yo= z)%MtC`ZB>ptxhd2x9*m3cWcQljFj`4G^eYv_F21pH{(7N(j#no7x@r+);_RFPB{zr zWl?%hzZ?l5UOvu@c?gZ@fV3ayUAXNRq7<|rR`~26lyNN$-O9vWF8Dj5cTnjJ%nToE zBqs0aO_9W%0WB8v3~KFs<0@77-nh&%$L8J4UI@Siv4Gi|0 zz&e1f0JfTAVPN}!JqauqI+lEXx`uW-ZmrXpHyla9NvP~MFCe|ll$>Xe1($n{on?2Y z(X2N`s#sF0(vptX1?g6U!i$~KCcLbSU4JZmaw#{#k_9_f(L_2tD|CjX_43)VXgUT> z3HAC?tYz!j=LK{EYlq*6$EPu9EC?G9Y#Fej9CL6V7ECg7th*P}Io92a$sFtM#W;?2 z_o9kp-M!d}bL3;JyBGZ&>+Z$hIM&^ZS2)()i{EpsyB9BTth*PRIo92aUvR9u7eB!X z{=WxfHt=5j5VR^jCgb1}qYC3Y67|MGW1GQ~;IW>ueSqiFJ+}YMvF<*u=2&+hS8}Yo zk6+@LA7g`N!3K_XkCfG@O^|AXQAG2NNy}i1s;|q0%}UH<27k)9-)zQveGBJHxS1i00=$_7%rEfZYu29LIhM(fr)UE^zGMz-|Nf4adF% zwglL>96N{8i?>m_mt!8#%0c^qW1je;QICF-lZp2X$)Lyp?Vf+`xVB%KNKnB;;sn_$;;nG-JOv5A|h$u4vHJ{Fd1 z#5vqTP>I9IH-v-IkK|Lagl@5II0Ahu-U(64ci0pdfn~yG`6ipf_Z$389WJDicLARD z_HyVfPN_?6bZQ-uUhaY~6i8(uoC%TTG@bl{(?iPIGWUOAHOr(Ak?xj4@_EK!E1)>o z*zQWF`2C>k6JVdEKrf5XFn$FdOdd~{r5t`m zxzIpDD@z{ApnXD)L8%|glWR=20=BlXXvwF75 zpmZJ@a5={Wo?{z4zsWhyMBZcPQp_2_lkinT`B&q_Ba)17L;Wcy(nv6P&Y_#?kz@+n zkMB6xnS~bUlCsg0=p8$S)7adFRE7AKjrf+ysQnD!ii5DZK&wz2PDfdpC^eGIM;=<3 zN$U{jezg5%q!D+7q`6%zryoeB@o{RIdZO&Z)K|=5s(zg}a;kd+|C>|orZ(V`*F@C!I;XP1 z;*)0Xub8>dh%|2Y@m(>^(mcd`6WqqZTRI2Wbxt%G*mX`cfO-M*x#NcUycYQoHU-t;1V@=#bX zk=G^Yz)@OQ@*zgIZv$#SvO4IJcJpz``9GgULCk~zyh_aqYT(O+Qhy!BoPeITvHV@M zd-sgU$2$LGXgHq{DKi@Z5kkB1ArNEJvXe!|qZjqFHtmdgTq8xrjLl zzJhXThZ^;X!=x=pkrxf2JwrbQg8TF5+V@@SPMsT}`|~dC*Pb}6J|t@%K&_}gZ;<5E zwv(?VR2L>ae|$CUtjULl%JKY>L`MaE2hN;aa|_#6Pv3!+!;2XtWKM1BUfp&Uo??$L zVbUYWa~HG0^VyS;Oq6po;-&=fqRtw%Lv>!hEmb`&kISQ9%_V(3_O{)&_gpS14rW^H zxbdAS&|7;q<2(P^m1a?HRaXibMvMaGL2adKi)JgVcj4D@JWe#l$}H~Lm2PXpwY;<^ zBA4?v&NFwgZXXrCl7n|{gI#i>Bh$IinQ&NnGW&UbMqiiykn-bx8_%*>A;l%&Rz*rh z%z-oQHLbL|{{#sj%wHUYbxD9$Y219`t#x6p&975PxUWgvQs!`bu`2yXKF@Beo+e4_ zx&*XLH394Mp7TA+a$P&{uLz5?b$wWw310Y!ikY zaMU{{6l<%0o-;drS`jP(<7O>)heECP7SYoC?F^>4{kD=4pFW=YhqQm_=SI9+;ra(l zZB%SyuxuJ#tliOq)KiLPFRu-SLPafcIhR1ywHlT1l^IP(Z@s+5?ma^3726b}nB)k( z*P5I-*3sZ8aoj_%$;2GT+)|ouN89e{BwIXc-)V(-d)F>u{|_I)Pm)i(bM35MrbyEI zPJIX7HiQRT?h_BOC23`+eyGquyL7O zgZ5v6`N5>IkQW^A(M9K&ls1k3uEE`rHvzTQcJbTOvVXBM=sx1>Wq--wUB;J>Y-SIq zX*b_hTrx!%s>ss8dy8n%Y=&>b%Hqj&c)b-n@oll&;8xn_&)?+Y&+g6#;P~}*d=7kN z9>(czjPu<=>9t_&j<_1Ups_@GO(=gpwkGz``uf(J5@XM+tL^phxa)A+Rp*Y{s~Ut1 zF#~>yGW@j}^#@zyV`v;#8EUae!)1of$Se9sc&UnfLBTT=Y0C zxb-`BY`xZE%&?fK#yRjt-OYQ?v1~_L4YdevgJAzm60QUpiFVD9Zn2i&1_`tu(|Gs@ z?3JTbPnSl2e#&FmiT5F2skU!`&#c`-L7-Nd((0_soQv!#6f{%b+9Qq;nhAELl zmx4P?dJdfnZZ#!ws5uCKXRjB@)_p>51mabCYKdyPbx_>y4G^rQ>sxi_TO|< zl;HR-XY{VKBx!In{f%h2fN*LxiWBUVeRmMt(Meu5Uozfr6-3z8 z{Vhh^w2ST3YdgI8LdNv?nmD0CvB~K8wB0sMxfLf_UDPXNcR@QBSw?sqYyJhCsYg8r zVoxhUi+zdd8_8eRJck&HX(iuD@Jt9lvSTsQsOLz!&d0Zq7F)($9Ixxa>Eur+m!vl- z?`Z4JK+r&5OS1kzOR}Wu%t11=FynlAy)D zzTUZf-RoU^@cMeU)1n_LuPX_yixik^+Z06OT?=o-)uYn8C=1Y6{y@Mj{gMZ*(X zAMJ_#WaLEPQR9igBi89fO1z%fr!EUay->gFv<0!x)t!c$@QZ3MgEek|5dk-#y1=2u4A7{akRR6t3Bd>;GI4-lY_B= z+2bw2*!KQ-g(~&-zK0>VVWt`mr5}cqQt2c3KUx6)M^2R8Y)GjlFYzg^h@=hDY$skA z;IbV3K8rq+y%5qkk))5qvNtW4U7j(=!7H;ctM`KAt~JF~OVV&~FQ+LUP$r-lQvx6h zAcd(Hpn-t)nGyk|1A4=x2Sm3mcbJj@k>BI3rer{|fMTnu)g@^NU>#tRWd;Re&?Ce* zqf^}5S?|%JcRNcRjoTZh9g|v!Ft)n(!<}FQV%~J-X0TBT<#cs#J*`}i^V;uZb z#RxIA35T#EmD9@db@&7;z*xz%_P^zH-}eHB-YGa)?Db8rgBpu6q)jfqvQ`qP!TJL*-{uxF`wf&2Rf++=4vK;g> z{d*0cw+gYatmrIhc_EgxqD#!1CulE;I9)w-ZRa9m&Y@OCY`Z6~R)9A=`1`A!Rr`eS zSV#ZWy+Vpd=?&-Uc189hm-t@zuEgLgzFelMz$>Fqy?NF9)b|r+do=KmrI;sV*5XC0 zTD)jAt5$bG$QCa>IBqkKX-6ZIJ7YLB;xTbCkM6rd9-{Os4dTd74~Jc9rLZJ<>7Zof4m*6i3pCq8=;p zsYTIqi$mmZ?gXSmSRVvP#2-a^(QJcHvT|73rQD=d>0i>{PTv}MG*$LxEBgK;pFF}E9iD?7eyO!< z3!5^kpW6lmk^KJ09^n$Qkfr~nIJ1+Z`vh25Tvqk#(@2bAD)>6pD2hGbfQ3b z1w3QpJi$O~dOL6VAkHaB125NEl70c#6meqv7yOPxzf5N8jB!J*ugJt%FG7z%(yt_? z;Re>%?Poe@&c7I;(6v|zBq@f6f5yYtM80NoMy(xR(y}n-MyB=if4{8GfK)%@EQ~3~Bk-vH;$dp_$hu#WHbhqvvZ@I*PRZNF5W9W`U+S2wPLg z8Db3XRN;ifA5mXj2)*$A=*y)+IXC%>FcQGep9vt}GFhKbudb%y^eYiwHL0!Wr8Kl6 zUJT20Nz$L-TY$?sph)mKfG?M&3%>*SgD4yNb@3Lo zoBt-!FO_wU_nRIfox<1cU$%FL&g!(f#oIePN*?}kyXd7@-PGbv9jL9?k;r)z;pUI} zY!$1|FT(6vk6(FA?n^?uOqZlTV~^D(dC)S%Y30`lBxx(FXOr$J@w=A(B2rEnqtE_f%pI3mKnb?u_4hWI`&ur`mMT%;<9JX*7sv zsl{xkw@XrDeuShj{>Qsn5u>HJOy#!@=E-vXvT1(l*9cZnzQR)dREKO9s+kVFgi_F`UkOQoa79;}4*L>np~}FX#afgVn@iYBz|^1>aoPr8q_OJ7X{!StrjJ$)H!Mrj!HeQmNf4Wsv z;C{CiH$%{Gq8Tv-&~9<*M8|Br*Sc@-zdFRWhLE<@iZGYdj9*HS@yk~8CF$GN>F_* zC8+Ay0h{tG*0*YpvYn}WYoD);_aqeUVLR_etc*x@N)y5dZ>}}Bs8n%YQ;S-Cou-b` zQYrp;5ihwCcd2Aq7#*b3JK2C6FYtH!qcz?WyL?)0QtOJu*o&H5rq}Lair#yeDuYS? zJaIIj7#&wyHj!S>*4Cv!`x@U+5h%#72#m@XD`WGO7x3Z_-a@$$>2*TFmr$S6*eC7( zm$jDqCRSB|w8p+=G`i?*0(#M4AjbUfUTen5p*$z{U~G}({}f{03_dXqqc9gdgyu8- z8aox>Spp<9lK7!{3}2r;uneiE@g#Wl_`W_E&z;cI42X{B72LX@i=Pm6No}-ZE+vja zyD2|jtB9VS`qiRe`VhACGOcilU-~O->0@a{YD>%YOGof(OoXSjwG9P+0PE}STc~Gg z7A=mxv)+Z)mcN{4MBlP7-q)cP_=MN$EYiqta0H~e;M`0q!1slvPw@5h$})NHr`$4N zg+_U+kheTbZpAEdIj^*jb<_WI-GVdCH?>A^rutsrMgKp};i4Ua^Ec^(_XOv!Qqu{+ znc~~{I{iOjm(p4D*!CB7u9~M)@anMORG89y$9KxV2k@Kb8(w2`ek-Nd+nhsv_rFFV zr+99keMnxaUv%EFP?@t9{(ny6>|*Qle{@c3vN(ktgCp*O&Z~4LIc!eBjQ5x`Z)sA& zce~Fp>deXXqxQUWw()rBxK*b(pMKb>%YDNz*Ff*p_wvMe^-S4#X3m#$;xUT%+Xr~W ze6nAC-`;jH*(>IxdFDI)eUFS!{I7VL8{&yZNb^?P1nInB%vqJ(6 zY$dPNyPZPjJ09Opv_sz08n0F34UBllCivMtEA0)@3EP~enAUhmOdjbN+v9wAt|DiI zM>+Do^W_^~w@>pNXw~cT2W-V@1~eJo*EcQ~bXM1dNzJ;OzDpPIGNX5_JeJ_uu_`7;l@;T;_%v?FdFC$?^XJdI>=g4amzJHFzp$u&&&&Ds z3ZG7B>b^U7f@Wr(ubf-&K5Ttxp=eC;9(ID$=48Q^LE*{s{p$jqqkq?BMUSjUkK`;A z^K<4Zyu+OkdpwpEN_@w5d!lF0%SEt6e%N|mt2!g+8vl*49$yQ;(R)z-WhY+3<~6}x zJ)GgvS+Z)H#;I~#S#0)wdEqPeNZwAn=&`IUa{s*O%3|e|=N0m6vu59tYP^3s?pdUv z_>|7-h_q+;&M;N(#TS+JhWB%p;|vOE+ue(oU#?&5Y_5mD{sIgBcjhj3*Q}WBCa)3j zsp*^jZK)ffqF@^1`|eu}&R9j07yguByWt!6&Eb`CNc|#KK+3tuy%=pFpr@7al%6v$ z&-XvyP@k09@_fU0Sys?GOc-9BYAEA8R5eZI$XTv&Dsp~XG|H3j?6+FT$!*G6te{ud zZ~uxlsm;EpF8t+cg;AX;o`27-K7V+T(Q$QN1n0B^yjSKC=U5t{S|3HN_w>|S__mD0 zdf)vQtnP!0=nEzbV|=T>rB~S#e6M}ibwW=qn%jS6|9ZR{1s;T(jCeCaPw)6l+8+r@fim8s6*2hJSIi|HNrU`HO zjHyq?E0pV%F|DzRA~t@QSU~3>f_Jy$Yj!4g`-C5wbDYiW1C7#ob>^+^ek*d^gWXw< z=?<|*>-!JOS$Wz0V|}Jm>8xaJRv~9pQxj_%eQ~3ZV{J-4jJw=-PRA~6xNrN#q?%d% zGn#tij9%n<-L|3fLz9sLOW zVXLr5k4U~qY0;PyG4(1dxGQ3aS;{6=GrjpCdMT`LG+dpPbgsm=vFJrx+?f)e0l#Ye z3N!F~wmY6R8aF1Z7r&3HjfvB0W7PP$F@_@=D={mD$BOTzkB{$_O#gJTK)T~nygB&m z&b6#=xm)cNEZQmG2-8`9>DzXtCpmqFbNfWhlYDhfn+NrW-Ntr&qnKroZ^>qh9?DPt zvN-4pW6p`UY9=eLu2W27X6vl}%BDtxOs6=FNUOM^y_$fhLbE0cWfRGV0a?dKuq#$> z++)`^;U#IT+rI(ZX{YkYZnjr6&W{K^YS$nR$u5`B+B$avxSI(7RuR1JO;k0{L7q!r zG#DLaCzK9-oz5BW=xt7SG-1DLarQR$&bO4(c$SKwLENNr#FgC*&$9`R;<7%-DIV|8 zM{q0Eh5t1X4gOcc>wV0^$u0VYx{fuICb#IaG#zU+lUsUcJX$&i^lQ-1&~Gd54dB(; zj7MEU#)zelE){EHF#?^-Bk+kGJH+MC5|=o53t}FN^ez}~5Jx*ET*IpnC$4m@BN+j; zh$A1gkNMV!3dkk2-k)xdckAjRxXr7w>TsU`UyZqkGJ9g3ZV&l}l#)jXnQ|p^R=SO; z9D2+jl#CfX26LL)fMhf|*R#?H+(8hA#5)pPlbsqz5-gp5i9A&LXQv7LAtL=05iG=Q z1!vhr1$uD|bW!A+;@@3U-6s69F42+chNmygnSq@u^bGoqjx!+Vf)1bGA zz=On0)Fcnk_dFHZ^EOG!PAI>yZcr*6Qtd#hGW51On#$c(%2TOo=)FTK4e}n+{S=Pv zNf(QBPybiCEjOfl=Z18D|F3j&dAc!pVLKHyTiK;_OyXbmA|NA5rZ01cRTcwUuRGQs zL8I@dH+NU@c&Z)rExW?H-^H5&+Dx~qMvnOikEz~4wci+y{awtlzl(X_4Kd53G3hm| zM2BX8FhuPwzwdqc!noB@evdfH=#1brZ-c#~In%*T&`iS(k_Lu%hO{dj1H{2JTts!}CABOJ< znY#Z5>JK3$pZPmGl~L-p8>r181*g7@-GZEU;|soD{i3H!M~jvwR)^m z9eq)4QRgUkCPqbX{-#rtwDS&zlTQgf2Ya+KhhldT^d2qWs^pPUa#s6ZFJxBvCgDo z53GTbkK>*fY#0%muI&qZ*{cdGm3Dof#ct@?~`b-iG7>M^F}KRK2Lv3?30-8WLHX4o0gn?tV; zIHz+Yq0FhNy@LoYkFLEBW_iB>IiXk^AR83C^5s^QXM(d(x!wQEsg@y??f*>WM5^)sAE{=A zb#7R?5cWRv$pH5j`N^5htJ@XpQx(CNXS_rgH zZL{Dv3!ch^DzQpYrL0m_wYBf@-|8$VeY~`i-DX|vKD=Uf{aJk3c9nScyi$EO)4^X^ zwWawwUnA|2R9A!&zL=SScgl2*_IBv44lU-n7WfLzSx~k@X(^rWEJ7XTmx_>$p?#_r z^At@#I4kX{^H!7}!K*$o-qU@_2T5(Hz3n}xX`x{Gsl8Wg*9rQLFJ@|-^PSHfvG`QT zLyMKsif>8uP5lP46*OO#(wn_zXO@F*b(%|s3Rr4YC@WMI35eI$eycwpGW%`T%lMY& z8@?qK-;(C@eS6hub)1K`0XnmK3+hSr?d7F*k-roc*bUZ&qAArk^PF{|62Et!qwm44 zx0G6-$VqbC7c*6sCTOQMj`_T$FG>we@C9%Ju<}V5sY*lLM$1wBiZ?-| zT}8fc_jh9T3~HAeX!M#cJFD&LbJP~fP@iqb?W$(EjaEi<-s63#ea)l5y+g(lzmZ;kFFPO^YLC#BV|a&E`DfqV;;VXyZ_!~MU*CpYx{ z9exS+>k8*AH#9t!j|`gvD!q`UyC~*Y+9i_9`Dmpb3H=E^Tlvve*BYfq@U0OFe4lTR z+z_hsG}aEvRGc?vs+;Z^)2I_6zyEj2IM2yiV~(zAP|n7Ndv3j`6Z1b-D9_I9FUK@s zMiB2H$xzi{D;KV&U>+JX%j&eA!nU%dh5nUBAxGDMnR6m0Q+a-O>wPM5SpK>D@KW*2 zOkG2aQSj=FiVpAKW7k~c;+u|L6UN0g)n2oWi^c!0k$9J{qh+aJR(T7|3hyJ(xwe?& z?-Z`ugkgq*vna-*vL3-(ZZhYE&+jkc69_Fq zuPv%PpTLeFSmrDm;H8!sgf_tUcL*w_M>Ik6mly9HlqsJ3ADzOxyY(K8Unh<(@QpZ^ zi#JofW=ntYPFSzK5)n{)+W(gEU2xe6e3??ri9bI-Gq!0#rmpFsOik0nnX0BinW}Sw zPm5ck^sUfQ6vIMMD4XcRey6*4;Gqn!%6<#2D|z+OU>2#oOVdvq1kHi=zqgYZ9C`A?}ZA{yf` zhkSLrpm8U!^-gfzKYFH@tqb4?dZJs{I zkJ^xrvX{H$m1+QLA~bl}bAo-ja(S|%+R(ThBW6ZTEVO|!N!m#bvvoF~OR%*l_1&Yf zC1P1VZ@FnjQH#QSc{z>!q88C&^9f57KI~bog)M@OQrbFP`V0J55N69bRuFyNx{dL; z9j8<(a*~>qIm4SEO*HA2t1UFD)Ly^zN~dMH(x+86&Or{)fy6GqygX)w0_7xYW;UQU zWmMiBfYz2#jC2i^B?zDa-s`a|%{1#A>5hL&Yd#c&q$woH zfPXdiL96$6q=CkqI6=0tT<_? zWJ=dAR`9;fw2(8V>6-9MtuXZA;rZuO7?D{Rk+Xbb-XAnv zJa<*6^%{q3o9ZxTCpGMAy-Rr!Z_0tkT4qe>{f$@y{b9odpR2s6!<9e5x3>I!Sfhwd zMID0D;1KW$r{6AguiHu#ULIjHvtIQnX%0x+BZ$#2iR=>wT_7bCWnS#`7Jk+Kq7$-!~B7 z_yJ1SU+C>sj7%Ut8UF#SwG*2@XjLV~dsy%o^6n#O`|?bS@KzNq`qk%^b*uI>ee(-Z~muL)wx6)cZNdHGZXWD z;a!xbIs#6Te|bH^o}+O-rcTfO=%-m#lm7`TcCsWO$p{*d6DAm#WM&D-0jIODLpj}k zy4KTv*I#L*ymX{*@h*0^EB!95=~H0`xPza2sT%4OS-ycd@Ck75<`2ai9?8 zUW_OX(60SdXG)D=Caa`fY?4)Rpr$Wzxtl?`HzJtFU^Z^Cr#4t{_C))$cz!w>k9z$0 z+jGKWzTV(wf}k!IjPRv6@&*2eLSt=Cro0-xi7{2dKDMS{W$xQxGgPn~fmRJ)ozhXk znrs#9ucZmz0qI*<70!XS+11S>SE}z!V?(FD46Th=@MG;U`)|#}X?-V-ATL%o5a~X$ zra4X;2AA|*DQ3|-w^fbzF|(lcRIThd=_iXUOZdCD19W}5A+Sp+E%UNas~YVP|Yj7Ki4Y^ z{{v!bJXOq=yUwm?mMK+%W&)X_JMV}b2CofZ!=*O z=ADAyz*Bf%qKY*d71`SxX7pdr8m(dmwcH2B*{iDUgPN&rF4tGFYt{=|!x_90kb6;^ ziu3J{tX1r^@iO>om34Yh*?wLdgERNkToLtb7SKB4Db!K$K8*8$Q`Ta)VD4L5b^^1d zX9o%C45x=*SgmzpPG3(2yJl4Ql0<#ht)3?KfgUHewgs4Be*Ljf>oqZyR)`BgQxDpQ zc}NC#A-2I`J)y`M>^XuuVMeM30g5%Xxsh@z<*?A;#=E_kd+<8W1^BXA zBCZ2rcnMab`m3GbPc<%ty zl%m?JMT5-eHQoxuaCam@k9t;X`*z>lz5JZ#cq6gFx8 zZs0i8d#LCk=-bg&6Q&|BTddfNj!cv2^!St+_LzEqJNP zYBT9F!+`S!6u!^bd%&#i^ZETA-@m@%d)}9G-sk-~=e*82ulsq~mhNU#b#5*-+|8s; z@Fbg1its*umkJs$z93|+;c#9m@M~&q39S@iglGpgg>!Q$F&-t-9z>p6+wfNGF1+Tj z^ec>Ywv{y^PDv_8GNM_~8#OKFcg&cBt&VCbSzuFh+nc1}m}6=%%J$oWxyd?|MkVW0a}|c2l91~}9(GCvuA2PO;Itnct%%(zrDD!^g32K} ziD(JI%H9cX&brl5BMF#;Qq03rb?qpH-HuhV8eW7>)ISgWKDF-*^E6l18rH~WWUUNA z?2sYOA3HbeNME4)zAV1(+s1`i`FANh&Td?z&xhp^o_GDu=9CuC|FyiQE(`p-Z@yDn zWHG<9!!{W<8?dFrv-^!s=>bd8OjAtM2qqe{Fb$9daqfHC5mT7q}cY3sGQPvvm842ch%_pQ8^G`@QmgU~a z)HBkI$cVPwF>D{R=!}#T`8viXt}~kYIy(pR8Sn9~aJWk?y^K#Ahi8%Q(!W^?40MGz zSWl_Bm-SCaN>1eI(pKvdq~t_qpnZM9pW`{7TFnYats8CG9V+FBUUg8>ahlyBePch? zsJ4!~!Z4Xxqf*PHZy46SFyVY7dY8*-SvtBx@|ju8JZgTARnc*YtC7CZ@07l`GgnxS z=Cwb?e%sg)S0R0GMxD${5(sBb;EJq;AZd{AzQ9}pRsY4x>UPQ^WuDId=XYoW}8U;^e^YkE6mKDk|uH#*7cZ{fyROHmgeU{ zhIj2^tYVPc<+z;d+v??o{Rp@y{W%*Z}fL=n=P9eEnN$-?#%7K#n<^XQNBaw(&c#sfF{ghpE&@@QJg;%IRKE(?kQM0_P#AnGsd_C9a3`gS-+yYOBc$tB*+RK10r7~5dY-2MN-G6zEXf%aa z(OvZzG|JsCJVxu>M1EIaZ+DhUrcd-sH}8OV;w_s$EoHpicwjmHYNapDSuVV_{zYgF zh}TGm#Qu@%8IJ4L49p4N8am=L>?lu8&vOuU2xm$CK-69%5KsoRMwKJ$sH)}#H^Hy`73vD{+y4m!@kpNE_yu@8iRY1Cq{iKnh<+^R=RT=O!9Sm5(dBf3s21T~{*4Z3f1EhTSQ^ zp|Sn&SHwE7z7Epf>b^jr&Nl7h8AMWIGlsiqe2tA<>R47#Q&<%TS@CI-B!`<$!QxeJ zd5nupOStKF@E)gv)z>Ni1mtHe#9NFtM!3&N=E!9Q^e%Bn$re~GcrxL^Ol6c%88Y98 zc+Zd(%tBm5@C_N$WcYU6fbZ8ofiLYGeK7}Ld_ex9aN~<+`HN$3`eMT17ei40;-)Vq z!#13tn1cO*2IP8#{RkSW8F(Tb6D$u!zA!_$`rtol4p4~GUDe>1xHJ}X z7DfPi>X?~HIw2j!hlK9dL@IQ0mN1bay z+qas%)jhlgbAoU>t{PZUXB&@ML1U?g(e(c2YU!Guy#rp{=jMPSs+RinPU)I?FJ@(U zb)O5>iJoXdV_i41cijB+x_Kbz!YI~&hx3{v({7Q=jixfqO62bc1q_-3?>VJDoO=b7 zKUl`n1hke3B@0fZ%kgJW4wXf6uVB^y{I1pJEC;waA-+HXPp@OX<4zV)Ce++2;BX!! z){O5h@Z|5BKb1;$$W%+w4|Gk|74^(aX% zXUh@Qz}5-CzXXzj10yD2HJD&onlQ}0+%elRtKhVhd<^((e6J&%tD<=xlsCbjoxR!p zYBQu6k%Yf{Z4vG7cc{YozVN``aAx}wGT!e{YMT0_KvTE#p-SlNkk7b2t1zq9wxFHX z{8tRorL^Yfg4Wt6sRdf~NuGllR~X|y-x!|8x<{nNdUp173b~MK)Y+oJ2c87R=`f#Z zU}qgB%jrHwEH%Ob$Uq0}bN_vfWI)BPostLqP)y56QjLgaGQAol1gMaITY(ZWJNgu?dzUY4bD;f`M3UMB4 zSXzt}XE-Lcf4ODlTWsRzk1PBFq^KIxKLcZe$$&1|Ss|rh{?E$&FKPJv1K=j#Pdotr zQHS3L%`wO^Bez1zMh?+_0DNABWY1ms$jXO*_sH)a{_>G8A3h;DbCVvCDQc39g1$m; zS%&!|IPQ=FeZ2&94deS##);y4hv-td$c7+Q6g_f_|G2RY!xgLDN=Y=7`L zVk22CF0tHpFJ`L*BUfJsJFU=cID{1fu!68>IwBMGK33g#)%PsqK(9Jqvkh;@y4gy2 zusMDX$$*xp#;N+ashM%uBjqaQ^DgK8RMwINt$T%IzGFc_C1S>ojhr6015stih;0%B ziX+At?@;!sdWnL;YSNeCn&=|iaQIHbZ~JTMT=sgha~(%GFW0UizBELm>t^qhBG6v% zq7=f7QJy&B9o!G~Rs}R^dKp9h221Q-0d(SzMqmX-U&T+uqvytS$Vs z4qV}*Xqy=pzT-IGWUFYQw+LpU{Mc#d8+B>Qwh-2_ptT@fzlq)=x!=3yarYcI#Fr|> zMN*>uYs_*4g95syXRz1$BC$i(mc}LDErf=w{#Dk_3 zc1ydMy<)SAIC=U?6u#2Y;}r8`%Jb%)@%C6je~*Cov+p$RJ6fE}-o{R)FTG?tbDlUE z8rM`G-3ygs*glmw3U+#E0gUC$ZYD9U=%`;Gk&M|=ubJTW8)iMZlz|*hiq;ElrX0N# zeT?bIVpJU$U@1PLI^3rYpVb?FEy2e|B(zNLa;|%M!SoVUhljB~N%E3h@bvFPhW7H( z>0J!cURla!aIUnX^Nm^A?(=J#A)|)RO4E~x*yAeCNw&*;djNO0@cVJcrm5Q#E8(xP z1@@;o&@cpsb%(gI7eQ0b#i2hF(gUesJuuJLuVIpEz1+l;Em@%PnA-Hx*+h|B_lhxS zvnSn~iHGPp0iB-O^StCfeBRH7$<$&P(Pc~+_5EAY1JE%q1{bvzC2Dn)qR~-Gv$Px1 zP;h$_7rWVH?gH^g3*B$})e&)`4reZcy9h62M(L%LSU2IhLLgphgqxiZ4StG?&|lzz z)pQl+Ss=pyJ57x{HbQ~B`+ytl*jzwv6r&XV*c%v{N=~@;q>2AL0=_ z@|vup8kAx9=8Y6zo?VZb77D(ENs6+D|xZ74!8tbepN`v@S`7}F?kSO=$^xam32J{SoN*q^XNr+gZG2t4g; z`w^L4hgdqv#eld$SyUkoXYeKyQtQ5ufXO(7Y zP%Dq1-p!^?zzP5>ot_gWHhr8Y?X5AeFi$pTO#f7!0B=i-b<^ht(dT@;T>kRRE~iCZ zr-60o-zB@e8X%9eKloa&0#;u1bpt`%snWqbOZ^Rdffqb1#H==1BpGhA&1lzM#qF+@eW!cGr;d7D&;HhrUk z`UGtfwjCHwI_-W$W}`OQ4oeYg6O#7%*_ATy z;4^Sd9j7Byke9#vgRhBfc}}{AI_L<PWLiQ0xgoB!U=EuSjX6Q(I~(-wWynSt-)n>NrB`M7(rj@d$)%j+vHWYS ztRV^0%ig`&R$rZyAk=t%(M(hpZ0s_KqZ$bQcHs4noCv-($@Q0xnGx)1XcD~RfNNIJ z;*=xLasH|3W@h3hH{(rm9n9viTK8jz21u98d9n3*XDZIK?3ah4>n$xanf@IDN@9WH?eck?gd~rzjG_1{tSZAcoV>7lHOugF9DoC4G z8%Y)w9{=T(}-#dNu9_SwIBPH?solx2Q6rMqwng~alP8B$lG(( z@Ii-)C(iN*iPO_Ak~u9Nlpu#>PD>KhgEA*b(ghCE08o68EnXYsJwtRaUrYNhS3{DR zNs`1O&{#bbw=mj;83F6mU!=Ihe~}Uz5Gkq;G+-~SH3|={GK|mXWA1L^Aq`&Q7QuVReUj(Sg+BLn)0__#2;;LXZ@ zzr`X(z-w%LFLUiA_SlTD)7rK$+kf#n*D-%M&yIh|8s?z&d)kaJyV~Qz+?*ko@M-L{ zxC~e=4&e{^N8u}x{Xso;82_n!aMn zym}zGtDj3|MZNoFKTEsT!E1hcM>v}*%F@<(13~splENM}^PtC%V&(~YLULFd3)}H6 zhZR!vW7?f$D+0?9jED#E)Q+#`=YkSTPAAD{5p(M#_dJ?$?P{Mv{g;k^MVLI=7Xiz$ zP}E0FHK1uw0IrzBs@?G1z4r4^h0z)SsQ%LYQ>f&W-x5^M9@f8fQJMj0asbU-K$4pa z=nfM!W`ahx(MfZwJ2+V9U}nTR0?3ZBK7;D*j*lbaJkMQrszb0KI_UMEheWm<1tjbK z0}?sqx5P8eAX+qSo_k~%X?3BS6;wW6RSR43-L@I9u6ofn9lwl!t`a<#KS!y7C$R_f ztDPv9^&}Onaw$5V;TEhlOvPEHYhG{Hc-J{DK}W~=GJ3gAZCsV1*lt>*YfiK4y(tc_ zti993CEG8RQhJo3%9d*9NuJcsrl;By*DQq`gUv`pg$EEC)`L>a;pXv`T#)^Cp95eB<8O8LwzBsiKa*HApFfmFI6;7*LsuMO1 zdfNLIR*-6D{09tLm(^u0P%H?iv^RuW8{fKc%=t#*K`)W!g_$)gs&t!37A)YQZ0UBI z$=K9k9>{xz(`wUMd<8PxwO4GmwO1C{Qk~3r17@p{9?0R0ZgmvsH;pk4Yuq&6_4b)dU;QQe%nlVYb@KYE_XOikVDlr1tH=u@i+l`!IZI=wNw9u2pem=D*QZ+53 zXk{2L%K?P=Qbbw-mq}JQ(_p`YFX*oa4_!~h>JCY|eu-Qo)>dr)tqbj>4^N>wx%Fi> zZ5x%0Jm&eb1;>n*QCW}McV7-?u&R2}OV^jy*}`Exg{V}BL)BC~#2aF-v?8KG$PN!$ zY3%N}2*>?69>`GAqBLS^MMK>! zqM|0Y&ME5aY3A71lY^17*pBg>tE_>!C7OWNGe3%*7WB&RHmhmGuSm7a`d88f#z=DL@r4Q*@LsEuuY(39-lMv&(`U;{2S$)= zL*=2h;t)mj#2O0xNy-!z-LI|-H&seZF6OoA9|d1+rf>XUY2sfK$ma))<;(S*NU%Jj4zkoS^v7i!6%Ui#yrF+rRXv)>Lodxd4`Y7@r8()_p*7CxKHwq(E~gE3wRZbX#J zYr(u8#Z+O^7aq(tn750py@59mQ>^qoixlFY3j**lH@jIJA&<!CzhxcJ$ zz~Q4BKQ@plO3(&MkZnuvAkHXo0N$dT*kmQF#}#}?V;{0UzYSxFtyR}!CyTTZh-}Rs zRP9xmJ_>$@s3)9TJ2A|o@E(zLCQW^uo%g?4NS4+dwpTRog zmd0*f=&J7V&PSw*boQ>X@Dx@~sqXn~9q+}H1#U@S%#4flhRs2|07L?#*m9sMYttOl z#njOk;qAB+CGpK;AqV)Yt>e6kRz29>e)HtB4EjlQI(h?Zx*Hr_ffw-0BpsH-n4ZAY z&i(LicBC&}lIbenl-A6b#=H0@!kW7SVFASyVInN45obJ1Y;cV6?fHa9d?_Ze0oJ+b zZS?gn-%u*`^~q26BfdhpG|bfC=nkw4(zmX3?T3DMg9*EAosCCtbYefK20+pn3_T}I zC`USMdSy8FEnz0!?tXO>lRDKyxUyum(Z{k&@@u8X^ep1_mP?NbX{A|BlorCDrCW4O z@uhvP2H6MuPFU@nm69_OU2)q`!^w5FC{GIf;=_Ia{Dg%kbdouZlWxp|Onl5%3=eB1>!S>ul< z$djiqY12H+t+#ucDzkh7-{h3*V>-KJMANIAxVP|4n}KUtN@!;^)rTq-A}pQrfN?9HJ$%U7 zF6o&uzJFe9!wB7vb_AwHe;?S4$YTm)hOh4&qCnIFV-hW5oGBE4O;P)OpdLND$8iS! zzFR-r+2gfv8N7!yrd~_wXZwjlMq~iSx3TOHBz+ZYHSWZ&io8QkM059beZnMLeGa6= zsb{p17t$f;PP|7Pq}Q^)K+%!KzqozB!y@jN%z4z_alX0da}aC6B8Kk%bwLjf;8Gd! zGpvTbKCid3v(~oqBAX5x!E*@hqDQG`qzjSz3)tJY+um-WQa{~(sPbUTz({Fv7Sw(V8tD{@~{JE-K(1FoxwKviUAt-Z1^>)+miTZg&# z7u*frdjInM4%Br$tx8_Yp~_{7W#MQO)T^)gP^Cc?duG1_I5!p;qNoN&|1)s8>#&Wq z^%=ff5V2tZv9GC3|0=id47q)eI$60iDuqcKcM&ZlWo4T#tSW3*>&}?Pe+GV!9#o4c zSMkq4L)Wvm2se$)Wr#k8K04pvI2Rn>-+(sn2_*VxEGv*=LE7qb+q{P=1;U|)hn$Gl zb)6Z1s4_=P^f}Syw9@WhZiGxd!xy~x=XLuX>0*2#hv-tB*i($kZo5eM`cKS4!N3MT z{rrbCEGG1@aYii zLOuh><#oS2(xt&V``<@t1!fY27>Ts%e*d?4Y^&Wlxy z+N)?YU<5ii=VGCmwJ6fnDcu)o1)^9?2aJ4y3DNXo9mjCJLo(W8TrX^5CS^*<9rGb|lYmMTFW+2`wK`bJpEZl&B6?-=eiIPR-_w`xS?Tx(fX zfi*m9S0%f>z-r9e))?zrhSmK$cww7ii4*Q1-$6aRQ5fT?z{kD`cIy33$EkqZr|6DZ ze*!vdMR&sbBs5aml#~+{ooFITQc9_3zxw< z>6w;+U>y(9vU#X@TL_j_OrC=UW6YVT@!t9ix^#^6wj-N!*bm^$ku%VWD#SX*g0S~pr6?v zoJkSqo^?9{9cqYQSzNA*$VDy2ELYK zWorh469z6yien4J<>E3(Va)i-WasebBX;X|MedYiG|uY}z63lB&U*p%F`Efqk|aNO zS)+$s=ci>hK(=uh@)@~Q25}%({G`;6q#2O$H+%`fE{ui z$F9Th3x#(z`h3S>DW`(*|J6CqaW}6$tLd^YKH7ckA$U*vI7EhIHKCRIth8ZlO;5Bw zCqeBQ)#bcx7&N?2wE-)#1{ShP`5Es%9ym6NIOSbELKJHWgKrZT!6VwC)wj*L7xFF9 z$EmK8{oS~;QUhxgt-jXwJV&{B4t~h^!sJ?MGqe-;c-p0K^L-NEKr+B0cd|)$P~o4; zo(x9yrO~=#u2&20!~*zTo7)ue@QxU6sc+^XQ+-al+Z={HXg7?lg|70do2WE4wbRXE z9;DP?z{YW>6oFOsvb*Ce-66C!`&c8BxTR51tE^Sks%tg1+FEWm|9m_2Eb}owmtlOa z#QvRMsEpziA9Fs%YXX0SFU0JSHtYA=IQa5!l~(AMDta~9sWRhAz8XOk|8H*rtH=T+g=&iL#JO8wg+ENBIJlv=QpL%>?SpTH-FPearngd1hok3| zhsl1Q-qR5V%n!Xi*|!E3X=7RT4+Fue*9BLH+f9FSP?r4F=3RBcO<=al4G}Y)_#BU zuAWhgUiT0Dg2(!{hfj9F&SfG8yVMw_+BItx+wmT}oYEmLQnji*&dLVjpTWsP2Pgn< zU~66Ujz{w97qC@^$b#**_*Txdqv~Z_Y}*dp(L2@K8^~V&rg!Wvg>Q@EbB+5!g-@*z zrc+elP*er7vm_fR-@F8|R|dmQ>Ec~N#)GCqD$Sp2|AUWoGX0tv`zTc^ldsKIf`)Q7=?YvtiC^kGM|7I zg{@r*4HN00$(oX^c3yTK+Qgv5OIzo_cCU}$6o``RL z9TrLF)r;Zh^lmt^XNfpA50@KOnyQ2E^CPhU)#k4DtJ> zC@**0`xZU?6+a4$3o^;!=YE}YJ1Ce_f#-ZLud2$Sv{Qj+ea!ezJ|n%~dm=0k(rcU3 z*4(0wIMc9-FXdnfb_&)o*5`Yn_^MbnC%|aQ_fE>NBgEQVaya}HFNT&zdth?*j_F~q~NqC<{*wGdP=CyRm_U5=&escuk&fiD4(Fd#jPvIIS5@Ib2czC z0DB6@ih>-BkGbcV@%vY?)y(s;NKbTJa(oz==53bl&?;jRG+c_80L~=tR>OW9?0)xlDBjvy!Ohf)6fPY9szzc zd{1PJ_jH=rnvbPDEOxi@$8b!o)hB$C;C*cqbL*Ba#cMzPI*k+h=2_2(aL`5waaEnWZk z^RAv5LMUpyS+roi>C#W}-QM<7I9jD|S zOI5o0)F^n2ZRx80^Kfsgq>=M!Oreoo0ItI;Kk=Hj{u{KUe9fSgYw|a*QOjcnScH6S za#|bG&d671Oa=d5UQo5|5@ewhg}P>{y>d@Y%7W6rvjQzV1)R?8?X2>p!v;5OIJb$x1ymHdsI?=6a=R{TV0UvFCY>!aXc(m zdmZEf4s)AY1#X$vZSf-OB^f?DK2scq`JGl){KP-haTxSJ|es}Vq`N# zGuQeO@aqOevUoE^sr?(r_`(?{{9;2s%Y0#N&ppV&$gv_fOkP@|f;^Oy~OUR(V`!kcO^>+Z~9nnEcDNlcw8yQ?%b&I z{*t*rHtNZ54SzDM_+=xaIPex#+Q+bdn*rOZttD9{kax7PDM?sAp8$2EgEumVxTKi1 zS`-2&7;MmRf$QYt6vbc)D=6d?ioAxk3?8@P@GW8GXXNY4r3^WV12wm z;7g*d)zU(Ne(#fi7ssLXLDFxun}Rhy zUGh;NzUvJ2MhW-?TCe54sXKh35bc@2ucS&;g9c(ubvgP6`Shq%M6`^6<Z$r6h}XZ_j58(Gt+Lw&&}i8peHj%~p8 zpCo>w67p=?RU;PnzmsV8kMOc4i%5C*NtDwf=Y1Y|zeiq+c=@YQhYUTu;Dp!pzvP}T z5i}An7=HFCKT+q2{n-?Y6`e&a~ z-ADXvN~rD{x$cpu)qDM+x<}*s?f#qV&dYVz7)K!GHKhD}-T7MLWi*Fms~NO`s)4?B+OR_`p3;*!L@QPIA|5+GQR5ko-G6>a=?!)b5C+6~X)IchI|DJtui)8G z3G{5JgilbyS2s$qh!?-o{A^vre)cJ~&G4U1xw&mLsP*K*wh6=aq#w170&VkvTVouK z6yyKcHi}x_G#tE8I3tJ;12-^_VMnzs17U|aNR7!}1o)B|=Cz0%_Hw`;6E~$ms)#2A z1I*a4LznJ%rYmk>{H6Pb|Hl(VXq|AyV-yL}_UlI2?-FEZuCK8j^YhF>8+)ElRMsvM znX%lV&lY3sz=Q6Y>x#*S2}+3#>+-}ApY$xv%Wypr&(w!*lHGU~Mu~Hn7{+3R1P@-UX zFWqI~?f}mF3t6FDx+nMZLi)uFB!mwA>sT4m6=EWy7g5ZX2Hf$Go=3G@NzfVV*kLIte16E1iMoF zq%bCN4&=gNPQEZ)G!*y|aXif-l+}W#jmEya;^e%tn8Z9gah`33nTWWl@ax%24i>Z2 zOo`p|1T=o!pH&h&ky-_@;Ef*z*7-v%u?IG(#2u^6tkDb#c%}TjuB6(g1z)DtFDE-!}?RcPArT^Bx%mWPE3Kl1D7_=Gx04d zhrYIrT~a0#d>!O^@}6pimQR3w=8V)3!zA_u%DO8dCzb-iAlc?L#C#k0)z#3|5lGO# z4UEQJXW+#k(pZh_7rsO7Pf&z8tXK!e9vPdDc(y67cm4TX6kF5h?_|6>F$+?jn#P{M z3s)I|V!S0Vdc;Ja7y+SHt(9_w9f%-ME0tRFCnUGzBeHM)*wc_y)Jn6=w7MmTY3R{a zCiB?985GU_==5YK|;bMF<$AwspecKuM_fWrKgHQ2A03(c=&}|u zx*_TVYvw$xdy`S_SPs!E9?2JtaBL1fXUsae+22@v>vC|N1l1WXtFbsN5cCuo^RnLP{Njk|M{6}zc@9nrU zi~k5N>`f~y0Pb}L4ZTW{aE$$f3D0Ntl2$Z9nJo4L%c!;=G%iJ4@G2XyLSN`U5B%Yk zd7fC?azr|WR}u43Aj3!4KzOuw)2}uyU3aXJ?kjD3*3EFkmfH=lYYz`^!`12Kl67Gs zq&~L_Rr1I+6)q{!7cAY>8T=A)?Ncz0+5?pS3(z!E+2|J;JX0goU`!cG@=~i2aUtLiG@vw zIz!)zeIliq<|^L3TbiqqwWhWUm=N<)&eJI!+t-L4fLBYc-Liz0zr5%Zn# z;@3oTHgB|=x&klz3C_$xIG1f6CT_QlaPye={P0aIgT3or)T%LpINU;`3=xIkJGWu7 zApUZ_u~3dyhS^T@`ock4xfQf>RGTh67uF9X_ahvvk*xvLUQJs$AdbZtSwAp@y@bI< zHz>JW^U1(ejNc8DRgkyj3coB_T10nCN|=<}-G7R!h3yPkL2h+LT6fr@-R08L0;Q8~ znj+n7n7nLl7UqaOGnMG)r-dljFxOB@tz-m-EGZd!v*N~^#{YP;V(`sS3X@b0n=vX~ z5ML}xB-&n&$Trtr#_Ti@90m)6&(IRu0m@N_x~e@(O4tGG-u{ihUXSgVAVFnz8QoE%=nm7{W=CYWss*Ap;H|b}m{{F$U2*j~hP3 z>QE~!faS)LUdoSA#4Ih@YTM|JD=}Z;Sk|M5f9H#_&ma%sVxf0&0&6@O*mjjQIz<{^ zCj;eI+2qNPzp@dQ_Wgy6SNCBrE7(D_?JwMe>nvQyw%-No;ti8AQ<+0$iQZ7o$wsLt&Z{~70_?D8ZpZE{=o`e&e~09QRUCPR zlI7-x$$Ls-yphml4EG>1ogCv0dw4-gH_SaUEzBJ@`yY+1_cLkA^BPb^n+I4k_%bgm zw}>)1xkU;2C65S%&L{PQap}~MmHu;pJH$)uFauWQlL2rkjl;2`kW}*J!%X6>d(&Q0 z!2US(#R>Z^N=FWlslBE4>)_6Q{?;-vtX*LmbI>Aw7<_s_eXFAVmV=hj3e$(dr=TS$ zX^8VP97dC=wehHbW(3nYrTo*&244 z-{U%fqYoR`4d6Tp4Cq5RMspLn&8(Asn%&OYxS8AzJbR5j!oJJ?oz-!}IRnfH=!dD@f(S zd|p02qxdvo$v2tr|kKH^MdD#diuxu;6!}!Fl^j0}+ zZ0WpY)3OrKnvtX#!7Ay4S&Em&0M((W|5o{X@g=Er2Is8AeEU?_vBv7J=-p+T#>naC zOX2|Yd|>%Na6Dogll?)8{1s>o*HKPb)bo2cWt#hf*hv9vC9Rm5d7XhryECT_(4Lvq z7ElDVGg@D8g}h=So^iiQF1>CG;`QjG6xjQH#oniMS+QGiWlE@teX8zBx*A=x;;B0@ zhg&<(%@yQb*CvYzf6$mVenz#bg_dofd{r))8}`ywOtSc( zMPXVA%%ZrFMSV(f|7YtfqtmRNHD%GaT04JRmQl$YoMZxbhLM1#GSlO zy8}bd*Gu;BOcLS3(}UlcXD;}RdgxeZNf~`PuB0a0*;!mxF3oHBMMK>M-CY2Yb17utuj^6^lo4N#IR7{0<6yIe{GhovOx{trbQNL-kA*0D3QFTDGK!4|@DwYOkP^NxWZDq$T{}bmP+d*!0tlTq@Jq z4eu4&`+-K>ulnc8*jOvgH-Ak13EHDfnlJF6S`}8F3PjNEv-<{NV zTeCNw9#cmp31YdlS)eh*`rqcR2j3YW9bN(KfBJ*B_dGCI!e;Y)%rc=70UPzkV-atB zIdp%-ALkoDr2Ms4tgv<@XIRIu;?0?Li+_Jz`mVE16ER5uPIZ>z?d2-8Qz0x z^HyoRp4N4RxE20#w5rx3W@91gPdx=_mxz8QDZ#s@d6<7->bN=7u1kK|AKZGKpAt0@ z9Bf3F=ew_#l{^RA-RH3D%5xHjgU6x3p)`AC?E0>8X>1KBLS6G{NhuI_3f`1k@MJx$ z_cyrR5UupBpK4iO@&g}CvjI^v?396Eo}`lZjwcJ%$=8M`xi#mWkma#+5)^4V?2v+p zuL=dW_v8@^0`#g73!e|7&5B@A@Lw(c!ELawfc$b>(M+<4-7uL0$Ff|nz;O`8co(9_{Qnv#7EWjB5AN)vts+H#i&OBY?IrVf^b) zH?olFR@)wP8?hi@gzN7hs$QNOY_gqZj*uwZ^{tdS37RwTeKXk}iS8HGs zeV)W2+6!UlFRm-aM91{bRV?KD=D1Z=Hnr!)!rymWA7&@Pi)kD?4!p^@`a)~xqw}}h zt~L&HQ(nsDLHxe`{;!!VTUH0d!{b5rKm|OIfiIW&ZSuY$+fLXfNWWK2RJ*i1lh}%V0n1xmRqrm(C#g#}c&%UBc8Ub&4)h_jpDEC{~ zr!h`vyTT{dH$DhjAg+9|sPyry#{X;XqrmxYq966;H|P2la;eMfrM3EcsR$k|tm&cj zT4?*PZw>QDaoU<$h|Q4+s=?Kx@#iyi_hIl*&r#_Vb27LNTKQRSRsA`Icy?Zwv*=Xt z8Bk@0=3LQOz?%N+k|3N4K6y+mu z9Oi`OL+nbLSJ)(dp>KEQ71G{dj4x)Z#-E@L^WVY>rX=i(pz+_S`Vf08E|Lsk@VYZ~ z2Go9IL9+OsMTI{8y+pXuTSnjK{W%;{bH0*nGJr`uS9=uuiN0syYbjpbM}e0Ds(S0y zX)EHa1T~vD#dqpc4UHbTy@r{l__ls}<}=OS+nej8k)Q@C!acK*k$p=-m^8P4dguEY zOfvc$X~)ols^oUIeYc*T*FrJ}^)z9|VuNsFzi!UG%46UX*5T z!pu!&;cIL<#*9KTyMzLT-@rzie&L(jw%{|gQ)ied)J{Cw>5flH9;w=^N(67NB>Yf# zMh&)_`ZHjYfVZ_rB?IEbK6hEc84EQ2KXP~b{{CsG-40(Dnk{mEjp=(YVUk5WiAe23 zqfl%5!fPwh_*bh`chocb2p!V1kSeh@q{um>J&M=@HSyIcX-=W$%k ztD6J|=Tji2g0Uc7yxXTA{9eiRBFu#ZC$$oTy6^fVu|RN~cWg2;wX?-fyec{MqL+G0 ziMgfSnOL~A>P^hNO&E(G1#b6+T3Ba#9wQA>=Jie8_AOT5-<;~9@qw9T1~}ae_s|#_ z8X+fx#v3&YGd=$QS+fUj)QqV)Dn$u`gRL2=A4a!azjX0oioApQD7lwrD(cg4)GOta zDdJ`?&0q<=>gpU=Mx6@A^$w-ReWKpC8t>6O7T#MSI*|^a&|{~t>#};!si3l#+K0+f zesU4dSBi_gYRqS=5sl#mj@`jktM+R5Xlm&lX7@*d%zzSn>8aq?J@od!d*~fI?mz26 zpH)x10o5lLEoe3B8#5mt`P}77>Mx8(s*RP`)bX`*&|9~EqN>kDEdMazixOC-{>1#F zUgNw}4;q($x%flx0n<2D;>W@7udzwVV#rU`hrMSaMGiZjyt4S2DkgQKTaTSXH@Yh~ z?}~j|N@m{Q%qNfWjB;?lU~i3Ui>R7+Wz>YZSJdNM8t2}sZmV4qFI&GXeUwdK`tTC( zZ=UF%1S^M0O313>z=>2|V}*I%XxP!u@n9wKY{wp(Gd*x~x?SU+P;@(rHpS1g&Fo;+7L45wg4z9o!zexp{UGh5&OOiXQtbLB@NfVe ziB}IEo)Ktg7230_^6*EC!^QHd?55OB=}q4)hJK}qc%zT8Q{xn0_jx6>&uVC6>E0+R zUR52M>>Jyzg2gL#T&^ddEv`1zL8*%R$-YGF&Pn-L^g`w{>b$p&Q}rnyyK^elg5W)O-QZ%UytQhd&EHDD;hu7=ponTt7T|I;_N?lbnw6FH;>gu*c*aWD~qsd=B5Y zLep|ly7Tb22H0FdQt*IB0o(WxJc|48oN66}r-tB}d}!4RfQNno&x8;>iu>8gcTW8y z;F&JNQ+=J8beo%CBE6A-IW);nJlkwQwDr0ZBkd9F)R)tgi>nn9&0x^@2knyJRr}v# z7eG6WQG@R?yV;!|1yX#JI$t8n;$CU7Nbv@Sxh<&G2f=06(QCxpF$&`C5Sf!~ynpZq zfBG=hbCgJ4w0w0qVsyd|x`9b$eAUjQ*r}Eo7mG+Jr<}iW-s`re-s#a`mDBhYEVKJ= zU($ucwx`a&A=5v@`rIy(mW*=q^+Wr0ZpVI|n_WmZFH?n`RRTYryF7#Wyb`NKR}ge{ig`ylwqHTp8u%b-Gz>Pt@U41GZ@e_;t)`XiK1 zWe-98-QpKrQ#bvFAhshCmMR?ahnR?HH$l$SFyjdFr6P;iV&C+eMGeM;N^VnLZeIp# zPpDlvN73u$RnK9BsKjp#Q+(Un2@eN?EBZ0!idE@}rAEwfQ+#XA(GGN92j};s6>3az zb~9p^(w>6V@Sv!u`p4q+u7ub~w3V5mo_y>Y>;w@XP5`cET0aOr`gSIEXaOHOKr z9v&rfwXnGdH}SSvS;N;JL1ZJU59|scN46e@ExuDxgSu4{<(65t6ZMSpgcH~oCje~vI#e_)*TN1!^^RS-Z zFm}NvHZ`pMNYCjayr&+B<8DQcTag2_G(VoAsZoo=r>>o=i)!R*)Lu5@4CZzCZ=2af zzJ>!0niHn+k7E@bWjN+=*n_X3u}5``O+4A53x9aVy><~1RZvSg$H&gu4jz$M*!0=< zGm;^adY^po43QeYDCfA>!A`vwX$R~_dg}Cbws$*JY{ZNc(t)Cxy;{TvpTi!I>WYr^ z9JIT7RQhDZ(cI@j5vQT6o8%9QGym-C}`H^p-kp`VR_W8EJHlT?ws72)1KG$xP__^zc z(bjv7MjK;#1{n5?lmah>5QJf3ask2fm_+IKNr?iRJ_Em7VEsU2m@s}7=AU!n|kVm*~=mE5vuTeLHH2AUO~5_6|l_4?`5G1zuyQS;@2nW;Dy>H%*L-IRN?oU z@F9LD7(c|f%tn%P>K>l+aM4WJE@H+RX~O*Hz%UkYAEUlH_7CFQ5(7%?Iu4r9?@$(w9=nMS* zYGUHVIR36_MO@;Ri3eM@ByEP~dJ8}A%0UIig%~ZqU39&O;$4tUt#VF$CB>fHkM(9D zWLF%|Q~ZmTk!rHHWyY$+BoRB;#=Z>-Q^`J9pi=zqI-BNomFI)t6=`TE z`H&S2?f$sVRq4>UJ_?@e^UCLs`-p-%gEdia{V=fg2z0UxqcaQQ!Myq^ zk7t!fV6?+9EPhxfw-cw_PKdpBGfc!E8J(a|$oIIGpCKoMm*t|ElPrh3Gx9V1P%+G- z6=C@O@w4zK!&q~UeKo^!yh5o`sWlp{P8Sw7EIfReJ|qvzcrTyO>?X=CZlGTyHj^$jVIQe2k8L z_~A=9KF9F|jxTZi8^>2TF5~zb#}ynMIKIL0EspQlk52kn9Yo9;#;VfDXASc>?y7LG zxMvxie734qa+A3VW&?9SLsy(4Y^2;UxEN|9T+-v)CQY6)>GsS?Q_Mng@zl)B+bmOr ztR*Q-@yfi_%L~>B>sRJ&C|LWbkhJ~|VZq7`8;c)ZnJ*;e3oABlSh-%H!Dv^qZ-$DEW2!i?n`mjCF1Z9Pi8DZ|1I z%kx&@N&XzXKD~J5qs#Gy4a-;4qhvfq8DjCul{ekadKBNg`9aPD_uNQEA)$03O<4Qb z%3^?-e6&*9eZ~>xC67S3W9#;_>2w4I5TI`jb3&2&6qWvuT#mugf5=5`BNVM&yE@c5CF5Pq63ch!bj`NDlez4Akc;0i6ZQf^=!v*vMTO+K^e-dXqL&b>n@UVc{+ z5ahnB>2l}Lm*jlH%96a5xTHqai4V-0A($-_lS*_CuU`JhdI1-V?!E=nb8(fNR08OW z@^Fb}ES68}i{w*Y(fXl#`9jACLa|v+Dz=19>7i3b=rlQWni4uq#YukUw$OcM=yZGN zWEm=Gup|o=1+WA`SYMQeL~~}zPkyK{q|uu{lc-~mmK1tN$2cC%UtYZCAsofR^8EY| zMxcgy#giW@$S(<@+lr0rfe;(kGt(E(64tL?{@6-kWpVM^V)=eU!J3t8H*S!x^H=7r z%^ynCQl`~wAGt$Vy_V1quuKpf1vf4W@^4&*nmd$-nLv28VdMJ2R2@^aJSqP!Bqo(G zMfo>fI&QjNedGF(yy6?zN#^v$Hy;y+ZvK~xp)5mZX3?YhD<3YPSx2rkFd6NeWS)%1 z!Cc3|`yP7%hGuPsp3r|gtDxDC&&Qcz#xrAarmJN6o?$?X%Ws$m&y#W1DT)|6fB)Ar z@>$6+19Z<0aA4XMi~(b3+a5{Lks2etQo9= z?zdKK-%V#Mcq%&6iYmi3SguZy%+d1;Z#w02(adr?6a4fX?f0{AxnCQq?~QY)o&Rs) zLWN|w@Jaga|4VQ&)DFPpYDI`1X~5YZV3@-=e}A1}4&pp85IR%FS8$K&FpW6(;rXkB z>2#)l2XOvp9K-x^@c#d>_a@*`6vMRf3c5;*{#BAc1K$XQb5NAm zUxcfr@PV;XIEp2O!(R+vBZXsS+Cz)})slbWWZ56I=>LG^Z=7O=8I_3$$r(VI9)F9lG6 z6yGSqC!u%>e@YGyM+FnzAk#Dt5UmlU_-d${Xst}s#7K0AKL>eIKO;KyI@-{apO?gZ zGPc8)_=d>-zJY!|l&?Tpeqs;*IzK7D+r@G+cAtvk&6mSz-k@-rHwe*gluxtF zH%_k4*)l|Ri21h4;qNQn7u(GrK_*-f!@rdI{DgLq{$6q7Pvd#z{de*E3H`+Kd0})9 zJ?a{NZ@3qZ@8SEO#b<1g*d9Cz2~y7@JrX2+Z|SLzYx&SUMLvSWxBcJbtNS30ZEuNHezU8o3i0uO&W=hGO_hS?&l~?(02rM@w>pCAk7SF6&{0 zEVu3&J;XCUOp+_{)7}WtUb(OJ=t0UCk9nWM8)4xPw94s^=Oj9oAJItut-M4dSWMr{ zLPdVEM=6}=Bs!Fn_`j2BnkXqenk9?;eP#adWx9|_{G&K2oZ;s#h`$dkRDv{*5d2c6 zlVtwOGR z|I3VzB=|wlWznAjll-OpkUzE0+5ENh6vvi@5+6-z6h2Q5zuLd94WBQEd;972@$Zzw zX^V{HULS7mNnaYji)C65eo8;MXMFdU@~f2cOZFPc+cJL3c!EF5{erPJv3@a~i{Z!L ztjncv{j7nq9uy+<=4bX{DV;lHx#)jNNuK1NBm3)N2arFu^F-K&m*psbg+1{?u91)N zK%|euKA?E(LL@k%|My0USKJeCgxnvt2a*5M9)GFb(`t_5H!{5_rx61J(FJn(zEv6r zN%=B~{`^bxY(`1GuPFDt;=I^SQ!*vFn|tIGi1~U> zrg`=_Pja4@=^s#jqF<0{Z@ylZ>2F~dQ9AP@B)&Ige{cOAm*em0@%QRmO1GiM|9vr? z{<0l`Xd>^Ppi-zLeL6t7O_cFQ{djS`_hXyzyao6YV3@-t>I0qy4U< z{jZ|~uA>95ql2!awKDB3PoL|;gRi4QuA}>2NB8SR)0&5#wXm<7d@!N{PMU;u5J76F zFym zCiz5r^;5ab#@d(L*w%Y&>q!VBVmtH4Jf8$-g97h#{r!Loz65!V=b45Yf;DS-u$zFktb4Hulz(fK&{y6w3)8n+N zOgeVc_c|A0Q>>->q)DEuLOn}~PaKtyP~b%@dRAJZXZgALdX`&aEm$stobn1URw`m;1aD`z=|cv6KbWrG1e!u_DwVOB}MtAOT{CO6}jd4mV%`V^$Uth3k&q( zAz5xYHGo)D{L&=_Wy7f6y%Dnt3$6Mo#YM=l$Z8-?V#sGDMN3d*>(Uj4r7VAW84mQ& zN)j0kPLPNELS`+=$;&Uv&%x1VVFAuBb5`UQm9x^Nx#Yj3cxhQ#&QgpJ9lHof`0Baq7=}slX@{JCvP@OIf`tI5 zwyL~i9qS|e&%J3KtYT)Q+2uCibAV&!XHSe+$1uE!`8+gZ9UCa(FNkuzAH;`QE};OQ zGwxa^QY7CD9O6YMddeRO2^MfKXJ`A-O90@Q-RkN6iAu>SSYBey$z8Z`LD7Px6fJ!( z<;*6^x(J-)l0DcCoYJRI)m!-9nCP!z{ecTI9t&J4#~lxx^h0r`0jGXSva*5q2NcT> zoTfX%i-3p8cq#C3$f3A4;LwX0_i^9@fYY-JICLaF2Z58VNY6*W^?)Sv6!5{wokko< z;2}R^Cqz?Zbkd$*yjYLsSGC@3uM@hHh%vOKpK zy{Vv3W}&f1MloP8ya13>nu}Ksu3|{UT5geeN^6D69v`=bZ-um)F zDONrrm5S|_&F#@5dwlUau^m#ITL+x#pZe{Ci`HSkUTV)?IRtacr1^#BnEQ}kEFiVd z8sJ0Gf=Ev92c@g1#OX0QO99GWUW9y?<>%#;$E(;>WQNqJ%E0t|^c`K5)q<%PXGO7RlKJ%uc?PU!+hC$iflGyphf9D!l=Y?qeviIhcv6vR?><~ zGD@sVOYvS$!lpM*#QyQ1*hazuv1P*= z;U5V2DIoer4_ptL%5gnxfIsQG8j$+t`!ZcrSVAw_2^M-)Z#F*0%*V&rr}1(7ahjsH z<3o61_R?DI`}pu_#7FQEyrU<)f)C9ed??<)2lqMxLXH-}jw)WpmMq0slv50|8}wTO!` zrH`o@bEl=v8_CiVr7`zNIY`RY%(Ze_&uBr zIx(_B;BCOkzZ5v*C443DIh;oHe;D{&8Gj1+O)~x>@Y`jXyMfagtrBuR0R9eVgnWU0 z4%`S_jlb`Jf5{mIvQ0XGeUG;4}^v z0N*a-4X{P00Vn=t@OMBCm1`aF78!pIcr0>8{=0!6kjwH{;KSfY{zrhnD9daD?oI1k z;0HNciv_cP)U0Fgi{-+(H2fQ6{5Rl@NQ?5>1^ic8j$eaXjfIlYVi-5Pw@*%e8v05sz@+!`;7M2z*Es#4)3Cs={S0(5` z2+t{5US5c`X|A+r&9&yj&dFPWS)P@ZE-fi7yhr3(SX_ja5Z23O7Lk_v-EwO$qF}`m zkwRifvlj}xsyMe&^jNU8RGiq$upAOSN-K(%6=DrTIT8Er!dxtr5CJQoF$*Or|LR}z zhXKp~K$4hiDbrLewq$t;tN|DpB`hx&#w6B(3t`hN&m(HgLMndllJcAaGH}W8#4XqAXSFcuQs!yp*sxG02U1+u-M#@GiTmt9sT@>GQ**}FW)`;?icPFoAc1!XYaD+^t=1u#=~Xm z{OX+4+kP>{Ji7AHibqy#Xnyq5M?TpQ`&jfN>90pV@#reey_ZUFx})D;171sc`@i10 z=e3vLzH{GquYI&{UE}z=4>vBmKYKBS#x}%eGuAs{(~0;4A#&*^lxht z^r(v$1X|d_2Y)XL9>oamMStWFvm0rjjLeEC`rOg zqRf{d&BJQN&u>(e$`@BZQTtTyrv(A&p2qmC5phAp$%o#W`5HUS96pWUIYqn8_@oi~ zYw+XAgfSxeW)@6knNw}>@rXVgyQDmgx9JzFICZn;sG^azvINe?o#S%(ZoWa-sx@j4 zYQO5UJmfFBO5c9`^L(}DE^uw5mN$i%AyeF4=*37ES-e5|T*}C~nFxxl2Xq`p{Qc_{pBLFeOSQr<^hbh8@FlCr3Ol?pn zs;8?9)HoN%**FJ>a}2m{xE|Y^8Vwa+0VlvI;b;rK-)HqV+U>y0}0iWIvb;Lm$ zdw^5T@>E(x$lK&S!yaKep8Ysq5#hvS@b7JixWY1YIp;HYi1jHhthxi2{l zKMNrjSPF0}|32@puz-)kth`ZCr_c&IF{Z!~&swet5(Ip^rx<_R0oUU1OD>v^=B>Qs zPhliklCI$=@)8GeQ3_Hj{)*cbV{v224t9!7<#uy_=OX!H8DGbn6`v?lgdGU^JGYMi zM4?sgQO;AHV!J_^K{cwjsI3~E7&DS5p5cn!kPykQ67D8?FigaW6B zhQgQ7k81(NwL2j3xj(`_4WRcSKN><2`~Uo7i)ZY2oQ?dd;+YMOtphGvE`*0a4f73v%#_3 z0pZvk$TJ+f6A+Hwg*?Hry8+=a4@y%Oeqx7dIW4cnFrigyRa&)H-CwO&k5n7~v{L`4 z@&8o#zXbkyUV5{;(Hh+-^Ldo{G+;B}A;5P4_xiD_Qn*fh&(P_MUq=I+0JzDAaqE3p z)ddaXE^0snZU$TgxLCv1mJjAUkv^>IXXN8&EpWg` z2AH}VU%X1bKVdo4hT`SHmidJGDt*8WtjzrP|7)|q}boQ)< z&9n$Oy*@(t^-q02>8$KsKpMlo03>tG1BlvWgZnGQ{cEy|yidOosrdFR0!49393zzH z;8dId?YfHmbUqdXM_NmVGsDri*4uF$-ss_Z{GcPp3kpHSD^&PYsx%5gqeLbsKlD&C zG+t7E&4M-SON#7lm}N9oc#E|fO$Q~JbXh6{tEJkTCuO*0k3)-z6n5Fe67 zX;ONW2F0cQ`9CU?UK;8-^mx3DBwC&v;&T|cITV9~>5CmI#=-REkS`8$ImqQ;mvPui z#E%d&4*BFTqHsuyL(AqcPjJ}V<&Z9i`GLC?Zay5cam_<@Lit5pvEHcse?}t@VmOtF z>iK$_^hWWK2Qi#6K`bPfG&ms7D^r!)H=;(LplHy8z*>Wo#OXw3uN}FN&goGtIiDSmj znKDz4?H~P;rAtO8B;ef*+8?5C-RcVp?4~1+ zb=O;e-unDKKWanXxZZmHJwIw&UcTP#%j?&>jr}`*lvnECz4J`%jq*x<-n>wo^ZNB} zcN9*1l&-h!Q8@YaZhsU`ez9=gHtF?C?Bz#iF~m2qm!G$PkzB9tdiOD}pSPcpE$H?0 z_BBe^>xc0|OoP((`q9|#P1oz^)gR^QkNgnyf8?R}H@t07n#XcV^2_K92zvvo=xj!7 zq;aA5gSkTbr%6Js7J`CGic0X3Q5jy(0mM5tW#tR-))1z{vYg!I(02}Rc+N8+xJa8bjrArE>;uI_|ugtH+8wWZ0`HOM7=%tn}C@ASgLQ*dZKhscJ zg6;qEikv0bOGZqnM|^>zYz21H#T=C}2^Wv-uJJ*v6@^6$E#)#teqnJ>w&gf@<3K8g zL?ebwqoQy5QnWve)PL^=j>kxCdJ%A%^a#HPI6_38zW_(S7J1eJr+!I%j{>K*LlU+D zr#Xw<7U0wm$bTnr>X(GS4xIWP;k$uT-z0oLaO!`w7uNus_D~4_3^?^SO6v#UH2%;T zSsQQ~PbiHp;MCtqj{jE*aeN_s0C4J$l%HY1$)+HD0&wcr8gOO;r?HCU-vwM658_!7 zaI!y052e7#jv<*g;AG1X{uppN_a*!p;MhVI@i&3f_7(ZR4SXQ>{wUoKfJZ@x8tinO z1Rf1P^8X&VLB{_HJO;R^-@i%kD-qrYxL)=L=y{3?Ffp-mYrgbaUk=`@Sy)(3ubVKI z^pkY%O8MycTC5vsU%4kX&iX6z*@|3iQ7x{ipDK z8~evcHg*N>p~=uE=mUU*-?NDkF2UdXRCyHaF1YD%PVmr^@v)6v1YQXE0G#(}_QkvL zel)A#J#pYa1PZL)AKxE^`@N@1_8%}X(ho0jUh|}!{^R^VvOr+J)mE|kC#%@VXQXHk zY^@TJlko5TP`e96D-9I?c(iYSv}Fx^xPJ@x1*ac4={pX+aUYy&_Y-9*5qcHB%7gF4 z|3TbP*1#Ik;`^XS{_oGtNi7SH|NGWxT((a-wePjgM# zeXjBE&C?sds;g`Hf8U=&@03O>f>+x_tid>Fd(eJA-Q{?9&H1{Yde^y#V<4!&fahqr zHYC=-*mew5I&9L{oTo4=hLZCTY<6Hn<69a)ddC}=G%_|uKVZW0<@k?_TR!0qeCAHL zBNs6jFq2;~d(pRy`TMS9_xV(@HqAqw>#-HHU z@;`HVSQ8p~J^qZq^5C-;A+LesD}D>OanUGZ-VF&GA?ZU!BBVw^x)!N$+y{aass4=A zPazkdAU7W%S8pSCuOXK^klU@u^+x3WA(WyDrCEtmm7#RSDCGjy;+M-_^1p*E2)KnM z1kPbTLAZamM{~wOr@p0cd&RrwN7Vh)gn=-kYdmhbla+4~}W9_jxV(m#_vq!AO3{T#k~!fwQO zushjUd}DkBzG#quh(@NzIf)Tt`wuvD8qupPVk;0cO5g8lQd|3{x1Cos+NJi1k!h zx?7op-`{2c9J8Es5ECc&_x~!EX%Uo$ja9L-B*-^V$9UC}^sY)!?S5bhQnd(nC%J zc-q-h>IAl#!E^=B4)!y*m@5R&B=!zlkNiY}2m1NlvX?SglHeH#9@6uTY$aOG@9P=A zX}~6PVd@L0+zZ^h{G+O=z@~Ck7p16Wk`pVZg}P9Qbpbt(k@e%@N;wbmjNbrYr#XL* zUTl#&6jQpj(36%uub3}m8nn%)|K4kaf^@v&CbmuEp!Bx=evS5cH@A4=m-Xj8DfRozqkKDO#8;mR)Q*v{A8a6-i;qY z68j3-%nw6{1K4=joO;DQ-Ei+uS~+b%J|O=9$R~yA8|)`_xCY!`}gqlxIKwfXwp-%jw}E`&@jk%QN{&x%Uz6 z?LXrAm3HEg7TNaV^E+~4xESQohv{K(|Ngjb?Qi++yu#ks?3mA=`u6&9`)WMnpmjfB z1__IIS19X#qB-629maOpzVmsE(btXl_;DST#@9bk8ywnC7aloKA00Eqo6Y~g|7hSp z8u*U}{-c5aXyE_L8lYcIR+`qCnw(=DEGiaoQj36FmzEU0S#;dl(ds*@%GB?4(5QY* zv8KMzPbp(-Jx=4fo{iG>5`3P4o-0^P_@J6ZhtJ{Kk4bZfA3N z6lo4#fnQjU=M4%wXW;DGnem1lme1AdFVzkmufg5u`?{R%*=;}crC+ONL;UPQyRnRZ zsa)9<&+Bv<_!VkqXq?WCeLuD34E+K#Hb;(4Qd0i=nYNhdw)oGSo7!2F8utw}InOv) zbQSLA3dvZfGg@{Z@Q=PJ?IYc%vu`#Za%*gQ@V<{blValiXAVpoWhVMhrMO1_x#g ziWXY@*-_`Cj%s(@>=VwP+Hm`kVP`%*73cERS^9iKfjX-&|4dO~!A^4u?$y^NkZszGqb#T(knWEL7vJXD*6<4_fW` zuLE>P@5va(4ukJDwP5o9N}a``!z`aU-{??g=y6Ae0lC-WCOS(4@lJ*O1C=%wk`=Nq z#2jMc?0sfLnuVm-TkaEfrn!L`=@KhDa?N9)#rVg!t9&Q zlWS*ld9zPui21OqyKAaB@?h4Kc{h!KZf3w$z`ccX>5x_X;cVE$8u0cZ!_5iPXGRV)t;RiO?VTYr^k%j<`@#db&51=FcKz5D zlx;Jmn1g0n>NDYU#M#xMx3H+A&TXv|EDZNcj4|U^?jOW$JQk&6Sl2P!oN)w>{8&Rg zDD8(`;g<)S;~^3EfZ`Si(sMb|s&BV1EyK;s zfw(nW)vPFD8(9>$aiGQ5QMmCFjxO9owF6JmN~;&+n#odMDDF0UcTZUqpK? z+n1b`JcHYu3`u%OA7B|$bi~=&&KV5mq^u#i5tehgxZ`yO?xVf@dVBYriQ{}tqtZRD z_1(vv6WUKW^IMps%k;B9kEwpXAYYYYgRiJUecRAuE#wd*BiJUh@su+Eh@*v zE74hcOSpw^wx>*pp8Oyz^@%qc%jk z_x3C5Q-krHnwD7XmA$24Ki_L({hm~?f81|lr=g=T;Pl({)_whFj|}tY4m7x zKOLWD<_tEB|BH(QCvb5J%ntz>;JfUfRci^ZkG32F5AN$S5bp`+-&@q_nv7`638w;@ zv!X3fT9jsjL&4?&zINb2mivH>Y4{}j_}52m%*%0qKQaWksmScR8h3vkrL z*_lCSTA%7@)*gI13g<``qeZ7PIMfPF(w0=*QL5)~3kBYp$x>$OEH$a&4Xj1Ohoiq+ zr%$Ex86Ay_&M7tL(-~q3n$aN+HP1Ic6ZTqaX44px4I`hz{@|SfZr;iz?n%AW{H*S! zRN*umc4O1nh$kW#?)*eN^@q5BlSK>mV7J=F+`NrT%$w$JUaiA6gMEM-+eh=b_&UVC zBW!NiFX2ot*ztpIjXWF|zdzO8%tqlX5M51>75?5XUN{jd6r-XK+l9%o>0Vj3XBnn#e5NsGw1FY24FI!|Vp!Qli<8 z9Qv@q;clhAuiFQ=gYZop=86Q|o1hu#Y^Ixx^F8Yh1ZKhhxcH$jm#n<#qaf~xm0sQm zk+-#(8|y#XH0=vm362N9)iY6luhNg$U^62$i*gcS37NUg5|XWO1o^Cr;0(c;xH0C^ zyIQ_W;budo;?AR3q!;JGSK~%Q+8EQcjx*7wceUA$n@0;>3WGX512d{)`Vr?3ds)L4 z)G5^wrA6t)p$|@JV+kqyQu759mtQ!TxBKdkV+=Gb#s=mY?nYO0%E2{@(i|*pO`di7 znneZ~bMISgQJT1zAd|`wr1H30J)xbdj@R<=@_vlc{`{U;6T@w@%^q&_TdA%y?t|id zImP4pu{&&5c-HrBt1T?MBRnkY_(lA}5pMfd;;t*fbXSDOwZ=0Y^O?~!9{oDkX@pgC z+_}POf}ekSBK&T3`lctquf%yX{PeK4(Epuu<1NZL<+w9vvWhT9ZZujV}?E7!c9=eai?}#LJm+%7;%N#KyG&m#+OCiu<}IT zs4Hk;L&-|>xJtUUm_-h|`d|6pec$%yEzy?KZWjO1MUIO`e>tHIjC-WSI|^?7J0jpocXxW|M!)?Hehe#mtWCHl}gzMZvKShL$!mZ{?x zX7BEDI#OVde&`(4UXWFod03ZQw709(nV%UwEX15YD}SaS&avEANfu_0vnbjRC3~$Jr5@CnN@2o}AXwbWK>k7$(KE9diBUN`j@zWG)(R z(GHG|RU(BuAcKQ!&d!S|L|C?v3^DBP>%zDjk-qK6=0mRAuZ*{xxX4s{I#)YujbVfK zbak|*WO0~3seC)obH=29WaP{rwCK5zPR?P|9di|TkFyAdAp5?~2U_3mTd-Knia9>)+QD=ffH#62;fi`p88P}#ajkJ8| zENk1>9mc8!HVb+Zk&nTN&nzq!6<@OC2381xPH6SG@IJMuGU4(`(X)ESPuO%J zedZj2mino4uSNTCJ_BBOG7nDlA*=RcCnt7QU%jtI;54px) zKH=8Q4zyb%!PB9^9C^q!=`!(*ynGtBn+{AvI9mBQziR+ zW*l**x=tNXI~?lCK0$VFvU=1Fxti1dqf||C#fmm#{@!-uQr4ucpO(ex7w57Yerx{9 zeLlh9&?=4s9(H}zbycS?x7;{WWr{T)c74>9VB$^V(~mfRruzt;c^xUR8scCjraEk> zQGz^b7&D^V9+g)#bhz>?ZheYMbr^Z_F}9w)MVbo&+Tw6mrafVs0$*X7)ZWaZ{GfGM z#d#iAqDP{P9l^Lk5VMdNX6zUSDn?xSd0btvVZ%|%&pOy%%1Pf2s;8B`ay_F3H%Zs1 zO-=4CHsTOE$nMAO$clS&)3Ij%(7h#Ik2{?{b53hP2^OW|zNqj#vi1Loc8l*;MHR#T zx$!BiVE{Yf=L_p>OM)Js+Y=hy@4+>~eVL$u-JK^@iT{x%^J)C+wYQ8r_gzk!Qx zbk~9UDFIehu7I$o!L=Lic%S3ZI>28Ou&#H%1?-bP+Gq`68>C)N;Ng1&R1;#K2Xw%( zMC)|iZJxFTxA;zNZHxB{pPy>HC|bO*m73gu(OeJa20q|hHAZH^D)<84?_6;nDeTm4?DkfvB8ms?XX88gB7pPYEN*C?NXVz zcn$8@B3WAEpDV7z#>Sfj`5sTQBWV}H*!quTseT7I^NYeu*l^(+ZgNL+3eBQbs#??3 zvHYGE+bWZTnH0^#E2!1Hts7W~cw?n_9O6ZkusFq;I4cLs$x+2kYHf}e8>?&Jh6pXO8Y6D7pMv$l0v9vTeO>(K6wLmarjTtaM|Y>) zOcFcM<4(2d&34PD*wxa*JO@p+t6)X)k;0Dgp1)@byq8Z6gqtR}$` zbJ?6n>Az#cjefxe*$3+VDqgMs8n?!6nVy#sje6GcN1Q7<2V%J+k?q=g>|L~IaGPBqsP8{iN%g-!U|w8cE^zB@VR5b z^HZC?zS^yvJ39Tab9V>RC&BNVw#Ge=xQ8%HJ#z%HY|I4?bW4oBE!v! z#BWer4*hLrq5XknTg`{vTHEcpG;_c}5^oA#vmbLB?QQgN3CsZ3wDv(( zKMud?kpNp~Jod-nmj`z{+>1wSY$RY9+!Qz^+)Vi8VQiWCfsIvQd`a2I1`8&eyK)XI zVvg_JdebLPwbO1HhLLNl^Gno6Z2ckJH&57y&UL8i8qw!|_|(8>Rfiq>E*9J*7@26O zkEjR{Yrg{)7TqLz%rzQ!5LOp$$NKvt4{;`6q1770`mwr*MUBRuT_i*QZ&ze(x8&!= zzpH!Q4^_07N zJ;CO}ySF~Dy29R84RlEF*{z3e z7sFu`cn{;nl!)vtrU?~Ff}BgJyWIp4{}u5604eD99jsMt(aJ8s$A z{JmRSWq_addG%(xhx~iDre3r88(=A!KAX<~evOgIck`I6U`v?Af0N(F(HZdrd@PFE zfQ`Ah$6M3LZ9e2mxfEp@Zb`8mb~d+-%;dIxLoTO#xFvo-lqpDDTO4*i^j7yT-M@&`W27%5 z?9hpD-=Lmpz4164tufBN^ZL8hfV6*9189TW07rWZD`?%D9bwtHTcG`yQ{`DY)J&_V z+cmG7cJn@UmbTNl_^ESJyV5itz2{Ts$hJ6G*vfARAKHd>Sz27)5tpZv=*2C8yEJGA zpLLMk`K8;q+iw%%wyXyAsdIcwl?cbS*hKhf3)z&PIv;LPiEu3}JB%vM_c~~I(0}7G z=U+Rjft_@ZZan6!@9?Yj-+C4}ze&@cnx2`dY)_rW+Eb0b?WvhQ?Wq}>_PPpnd+Kym zd#XvwYv9pwYK}W*WI_ftJUG#UboVxy{=N-UbjNkUUv`I zUbn2itF`5Ox7+?sS8FHVrQ7<~u2vV{)pr5kr9E`gE!e+z+wG&W_H=c(9_Z@6^mbQw zhi0SCrr{ZJnQ`e1x48T7KIztO$8GL4s;AUX9(I1`9FlJA2;g9oBzC*hS5oSuK@XE@ z&t?6AL7Doj0W)D4+UZOId)rs0w(4+;ucx#o6}PbBesoxSoG!iFb^da{3>K?vU{N#c zr_={$#bW>I4$GG5aYeBvf}}^YbC{{y^<1~!)Q8&0W2}MdpV|VgO};|Acna=sa8JX{ zKzpcwdk^EaKi-$6bB66}Ii@jLr&FtFc3+O)xZ7{DqTP)B3ZKo(eh9=m2_yZkMrVFo zP%PCQ-`wczau)xQk8wrL%KK}JVz)%scE111@btrOD5`m#261#Y(7lzl;` z6Pk@3p0a0CnIjV~JXYM4ec`4!y4^SplzTXQ6leUiFVv0?x#-KQHxF($wk}M1HZ`=_ zA9tz;yvlD5d{wbI=v4u87p2HHH98MEX|6U@`ENVoo}V=E2V?8EH$9uGX)?C@0SZl6 z^C_N9H9CT;zH~RuPB1B3-d5oLS*x<;7(qt%zyluP;sc7q?l19^$$oYYJA+br{^?{6 zyt@lq!ENJ`r%!9?l@B)bYEH(RCYab$jo3TU*B>wq#U2;FmS(Rq8DTT^&N+*|n)gQ3 z7mNKz^MMvFD6lDD8;dhKj@p7m_<=33b`M55qvJi?#D3-%|5_=3p;3Xg+)(5*s<+gj zSFwL5Y6Q7}Mn*f$_1q1<&4Jr!q*OKgZ$)hWko)mIhuoowTr!LOzB$=M>$Op){%Cn* z*Hi>!B{8UKdyrj?PDA7-GIcdS)Y zORcIlH2`g6OvtmTKCr>9NmRx)_#Nm&?(&c$pxyOB+b$lEG!Q1D&o7#qJBh9^9$==K4U( zvHHCaeSDzoVcgBDz$o18DALp)bN$_2_OO0{!67KhRwtMaIisA0hhPy-FjU2wtp}Gn zI7XjA_@sR{|L3@k{Yp13m!L2r>95CYc_CwB}TF0P8;}tWz4W)`f?>Owt zY~i+PqIa6}AJ*d}SE0zbpulOapvYf+8$u&mnStb;Tjt*kyJtIAN4A%8g%&*VAy0sus`3*zl1}EH(}$8Fp3+tK(+3 zU^2p5(L%$@mS4;))f-{`5xM_icqCq2uWL?i*d@%C9Ny+$z-woH=A+xpt5hq z2!EIKdz^U)g za}L2bGEy7apXm*0tBr;=t8E6Y-3WZmYMh>x`P$90e|B4AnZmA>DaC3!&*8@T4hs{d zh_4>%v^t$Ggc%L~h~;ay88r6o7<(EG0-eN_VV?mq(pKw{%9@8$AHFFqqK_npZoRfn zr`?2Pv-2LUn)A8R&{fy$wT;rQJb~tEfTMZd)+M-H+M!SP!~I&VJC`N#_r3EJ`V+ zGu$!WMAjR%)?uc28>Owsn#p~T8;Aa!Etocg{s(>73et#Y6kZuny8h9UMfMcEEs z8PaB38q$(d|VWvj0lM6BTP`)BjQx2vfDQ0)f)M) z{0(dJ0_`zzT+`4vq1o{8syO8-f7E_|_~`HkNT^|F-o+wCo85pJesW+_wnIpJHCO5% zuN1N2qcWxbaVz@A%}sGdI~MKCRU}efdR&2?*sL8z_@yReNE&?GjAbku`<|<+p+dS#qV4c(4yjnq@8OF7~jvWIakf?!uuuN2i+?DL6qZf;cxHhSAT9ze)W#(okeGq zzF(2-9g94!@4K0gZ4axruQ|7#*>|otRKJ0-*yGyQy|aj2Y_b})=ISjrD-gD6HMe=iS_gVnZUDp(^1#9%Qlm>ew-=V^nvU3OHvyjVHU@7z0MpfV$yu;s0w_` zxvvWCoEtXnwB}W#MO}-vv~z7oTBORPXxeGvCu~XO&ocdX^H{sta%0pX=k|8v-i4OI zmJcJMaLPI!X;?1pK5+4_8{aBg-PsM9hu&N7&~&^82YR-*P4*AMcxe zANI0YV~;b1xVg9iCN{jYIoI+?>Nj8Pv{)k}!eOOYB6Rt*%F<(B#HiR!YhPO9yt_NR zCTwHGCf#Nh$2$f-h|zWSQP+^m!8Mp+9Q__lt_$7@zquY)DfZh53*K_b`AM6uwvXjB zb{jvgpIRGY;jwZKwR7Wnq%d_0Z&|NHK4wH72yychSzK#V@Rko;p_is^O{w*>e4$I( z%nXmEmLX zl&AW}`87qvr8-L27TC30qlb-YivPkkEY-1S?LxaV?Dh)hUBUbpIyK(Xc`tHwShVR( zMsl6UH4rwzA*Ww^XJoMM6nysRJg!g=@5p|?Ei6xr^SLg$?sL3f;o~`1v7;h_Pp)gq zs0A19ZFWq2zxA%rO}r!J{m^ax(CiIspFxQka&g02=UoC|+*)-DuTfpp2(;fh`3j3o zbwsW0=hnoZQS&X4YlrTl^cAi?Te*Z(N9bB-SZ(E*O3G;;=*s_nXV^ED+bWam-pWY3 zz~l7$SU2zB-gn;B7WP;i-+K80ZpU1=!SO_2f&C13wx7VBh!EJa0Rp=j@QZMPwZJL* z3v4U=0tO0f3|t0W|H-&BI#OU0z_$WCKfo_)kicGsoLs=Aa2w&CgIfr>uLDw?2O#Sr z@U4JEdmX12*fhA?;O>vYUZ>$|*v~PD2f54P3gL2w2&@e5LAY&jB%=uFujnOnInrD> zOki&!d>CXV!z~AWcI;KT-n3stJoQk4CBT)z)x-T0Ze%R>1L1bT9fTwPnYwG^--@yy z=#{QlW-klIyhCN$-ah!2MTv$Nu-uRYX@t2xz1Ec?b(h+fm^ox7ZSd z*S*IY#wwNUu18`aBU4+~R`0;C5|HoXqVJR|8u;E@ZCLqZCH2b3#9le}iZ6Vv)#?^sjk?80Ku^;r zq32UCUWZ;h=TOA&Kb4ZntWxiQS}+n)Xy zr4ESU$#vs1QZFblMwKJ{&37MnE4CXdvoH8&W?oP%%CFehqVxmio8ItZ3-7nHBKyLt zL=VsDT;D}nhK{FdqoPH7Bm;yQn85*GXgd z`L1)7(JSR%f-xOoJ+0%LF3Pt?ZXHc%9f5zML8Yw0i`Qsyf~dg_Vm{{eXz*b%k28Ac z2Q!nD6{smv4(k)V5~y_wG+NO4>fy zqwP1|S(4>{O)r`x_M!qYeL>V&zL>Xe2k9?Y%(vUoTYqA1di0lmO-^sPCa2^7B&Q=p z-TKSAeGj@dztcMvX}n64$E&_wykqt|)Z&xtCd)0_4}PY1vK>mFeO;F>c}K>6_WTNM zRI-@wryYjMJh|snjfbTDSmEvYzjjjHDn}om_IIQm{Z4XSoY=SQojiJE`0C`k*o++* z0Zw)Dj*xd4Mv}o9`JkJ`@R_SQ_(WywgwKbaijlly>S`KoA~Vjx=lxCrJ{?tI7&#Tu zhDxkJI=QHjjXd6rrxFCCN59sYT-OKh&Xa_fkj4)OlIsG+96Sf=n**%D+tyuZ?}{x7 zvHd@T{!oR!5Cr-V+WkYk5?j~kFKGX-4h)3#aj;6VJ`g|R>YU@9dv1#q*ibk%+&_DT zU+w@b{+ZOF^x$k|I7c`H4xxt;zaH#B5Bd^F-5B<{;O!;t z9*u_VeB5o=qW0O6(a-Ipr;#F|lQj7R(eWPF@M~hI< z;|l5IM;~a32y!(0qlPl7yeX+PYi8`9x_he7663SQ&FiY`dxp0UNPr~^_wSPP)z{5U_QVNIG-J>%*z!x% z+V{5zK`q#I_79qAN^PyP2^TerJ1Qi;2_j#v%;%4sX`$sOui;4)d9r05EqHjx1N*5( z`_}KQh&T|3d>AkB_ThjNMUBN~e1rBq7I|B?U+TSs<=#62ehc^iYmXl&_xMPJ-?~4! zE<$XFeJ@e3%(f-h>BL?cfY9{)tl?3N`EjsaoR|-Gz>bN#g1gnwKl;Ld68gqu^o@b= zn*#d3sNaC@hILHOgCa}1ZTABcI!2*3Lx6Yol{Tbsc6^OA{g4)-h zM$JoWokOk@-7I#BdeBh$6Vi$ddtuLyzR7jNGrC>B zdIU*c-B3_JdjwG)jq=^D??92f~`HFhDesW6v7#96D1T$aWFzrjq}m?CQIGij1W_|>rT%=Xzt0id9X0Dp@n l&M+ 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

(@GJ*3h7f1`rRnqwd>WRN~{}XZ^Ntn<=8K8w4 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 diff --git a/extmod/extmod.mk b/extmod/extmod.mk index 03fdb43546b8e..5aecedc2281b2 100644 --- a/extmod/extmod.mk +++ b/extmod/extmod.mk @@ -301,11 +301,23 @@ endif # networking ifeq ($(MICROPY_PY_NETWORK_CYW43),1) +CYW43_DIR = lib/cyw43-driver +GIT_SUBMODULES += $(CYW43_DIR) CFLAGS_EXTMOD += -DMICROPY_PY_NETWORK_CYW43=1 -DRIVERS_SRC_C += drivers/cyw43/cyw43_ctrl.c drivers/cyw43/cyw43_lwip.c -LIBS += $(TOP)/drivers/cyw43/libcyw43.a +SRC_THIRDPARTY_C += $(addprefix $(CYW43_DIR)/src/,\ + cyw43_ctrl.c \ + cyw43_lwip.c \ + cyw43_ll.c \ + cyw43_sdio.c \ + cyw43_stats.c \ + ) +ifeq ($(MICROPY_PY_BLUETOOTH),1) +DRIVERS_SRC_C += drivers/cyw43/cywbt.c endif +$(BUILD)/$(CYW43_DIR)/src/cyw43_%.o: CFLAGS += -std=c11 +endif # MICROPY_PY_NETWORK_CYW43 + ifneq ($(MICROPY_PY_NETWORK_WIZNET5K),) ifneq ($(MICROPY_PY_NETWORK_WIZNET5K),0) WIZNET5K_DIR=lib/wiznet5k diff --git a/extmod/modnetwork.c b/extmod/modnetwork.c index 438c1ed744513..7c1b91de45d04 100644 --- a/extmod/modnetwork.c +++ b/extmod/modnetwork.c @@ -37,7 +37,7 @@ #include "shared/netutils/netutils.h" #include "modnetwork.h" -#if MICROPY_PY_NETWORK_CYW43 && MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER +#if MICROPY_PY_NETWORK_CYW43 // So that CYW43_LINK_xxx constants are available to MICROPY_PORT_NETWORK_INTERFACES. #include "lib/cyw43-driver/src/cyw43.h" #endif diff --git a/extmod/network_cyw43.c b/extmod/network_cyw43.c index 95901eaddfb01..2d0b228e54be8 100644 --- a/extmod/network_cyw43.c +++ b/extmod/network_cyw43.c @@ -36,12 +36,8 @@ #include "extmod/network_cyw43.h" #include "modnetwork.h" -#if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER #include "lib/cyw43-driver/src/cyw43.h" #include "lib/cyw43-driver/src/cyw43_country.h" -#else -#include "drivers/cyw43/cyw43.h" -#endif typedef struct _network_cyw43_obj_t { mp_obj_base_t base; @@ -120,23 +116,13 @@ STATIC mp_obj_t network_cyw43_deinit(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_cyw43_deinit_obj, network_cyw43_deinit); -#if !MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER -// TODO: The old driver expects this to be available at link time. -char pyb_country_code[2]; -#endif - STATIC mp_obj_t network_cyw43_active(size_t n_args, const mp_obj_t *args) { network_cyw43_obj_t *self = MP_OBJ_TO_PTR(args[0]); if (n_args == 1) { return mp_obj_new_bool(cyw43_tcpip_link_status(self->cyw, self->itf)); } else { - #if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER uint32_t country = CYW43_COUNTRY(mod_network_country_code[0], mod_network_country_code[1], 0); cyw43_wifi_set_up(self->cyw, self->itf, mp_obj_is_true(args[1]), country); - #else - memcpy(pyb_country_code, mod_network_country_code, sizeof(pyb_country_code)); - cyw43_wifi_set_up(self->cyw, self->itf, mp_obj_is_true(args[1])); - #endif return mp_const_none; } } @@ -277,13 +263,12 @@ STATIC mp_obj_t network_cyw43_connect(size_t n_args, const mp_obj_t *pos_args, m uint32_t auth_type; if (args[ARG_security].u_int == -1) { if (key.buf == NULL || key.len == 0) { - auth_type = 0; // open security + // Default to open when no password set. + auth_type = CYW43_AUTH_OPEN; } else { - #if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER + // Default to WPA2 otherwise. All other modes require the security + // kwarg to be set explicitly. auth_type = CYW43_AUTH_WPA2_MIXED_PSK; - #else - auth_type = 0x008006; // WPA2_MIXED_PSK - #endif } } else { auth_type = args[ARG_security].u_int; @@ -396,11 +381,9 @@ STATIC mp_obj_t network_cyw43_config(size_t n_args, const mp_obj_t *args, mp_map return mp_obj_new_str((const char *)buf, len); } } - #if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER case MP_QSTR_security: { return MP_OBJ_NEW_SMALL_INT(cyw43_wifi_ap_get_auth(self->cyw)); } - #endif case MP_QSTR_mac: { uint8_t buf[6]; cyw43_wifi_get_mac(self->cyw, self->itf, buf); @@ -412,11 +395,10 @@ STATIC mp_obj_t network_cyw43_config(size_t n_args, const mp_obj_t *args, mp_map cyw43_ioctl(self->cyw, CYW43_IOCTL_GET_VAR, 13, buf, self->itf); return MP_OBJ_NEW_SMALL_INT(nw_get_le32(buf) / 4); } - #if !MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER case MP_QSTR_hostname: { - return mp_obj_new_str(self->cyw->hostname, strlen(self->cyw->hostname)); + // TODO: Deprecated. Use network.hostname() instead. + return mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname)); } - #endif default: mp_raise_ValueError(MP_ERROR_TEXT("unknown config param")); } @@ -489,14 +471,16 @@ STATIC mp_obj_t network_cyw43_config(size_t n_args, const mp_obj_t *args, mp_map cyw43_ioctl(self->cyw, CYW43_IOCTL_SET_VAR, 9 + 4, buf, self->itf); break; } - #if !MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER case MP_QSTR_hostname: { - const char *hostname = mp_obj_str_get_str(e->value); - strncpy(self->cyw->hostname, hostname, MICROPY_BOARD_HOSTNAME_LENGTH); - self->cyw->hostname[MICROPY_BOARD_HOSTNAME_LENGTH - 1] = 0; + // TODO: Deprecated. Use network.hostname(name) instead. + size_t len; + const char *str = mp_obj_str_get_data(args[0], &len); + if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + mp_raise_ValueError(NULL); + } + strcpy(mod_network_hostname, str); break; } - #endif default: mp_raise_ValueError(MP_ERROR_TEXT("unknown config param")); } diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt index 8e8db47355813..ab09ab51482bd 100644 --- a/ports/rp2/CMakeLists.txt +++ b/ports/rp2/CMakeLists.txt @@ -250,7 +250,6 @@ if (MICROPY_PY_NETWORK_CYW43) target_compile_definitions(${MICROPY_TARGET} PRIVATE MICROPY_PY_NETWORK_CYW43=1 - MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER=1 MICROPY_PY_SOCKET_DEFAULT_TIMEOUT_MS=30000 # default socket timeout ) if (CMAKE_BUILD_TYPE MATCHES Debug) diff --git a/ports/rp2/main.c b/ports/rp2/main.c index c5b50374912c3..570c4302f0e61 100644 --- a/ports/rp2/main.c +++ b/ports/rp2/main.c @@ -42,6 +42,7 @@ #include "modmachine.h" #include "modrp2.h" #include "mpbthciport.h" +#include "mpnetworkport.h" #include "genhdr/mpversion.h" #include "mp_usbd.h" diff --git a/ports/rp2/mpconfigport.h b/ports/rp2/mpconfigport.h index 180216329a7bc..f5391b5a7800b 100644 --- a/ports/rp2/mpconfigport.h +++ b/ports/rp2/mpconfigport.h @@ -267,7 +267,3 @@ typedef intptr_t mp_off_t; extern uint32_t rosc_random_u32(void); extern void lwip_lock_acquire(void); extern void lwip_lock_release(void); -extern void cyw43_irq_init(void); -extern void cyw43_post_poll_hook(void); - -#define CYW43_POST_POLL_HOOK cyw43_post_poll_hook(); diff --git a/ports/rp2/mpnetworkport.h b/ports/rp2/mpnetworkport.h new file mode 100644 index 0000000000000..88c190f45e27d --- /dev/null +++ b/ports/rp2/mpnetworkport.h @@ -0,0 +1,33 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Jim Mussared + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_RP2_MPNETWORKPORT_H +#define MICROPY_INCLUDED_RP2_MPNETWORKPORT_H + +#if MICROPY_PY_NETWORK_CYW43 +extern void cyw43_irq_init(void); +#endif + +#endif // MICROPY_INCLUDED_RP2_MPNETWORKPORT_H diff --git a/ports/stm32/Makefile b/ports/stm32/Makefile index 1fd2757c4ada1..db89b2f4f135f 100644 --- a/ports/stm32/Makefile +++ b/ports/stm32/Makefile @@ -487,10 +487,7 @@ SRC_C += mpbtstackport.c MICROPY_BLUETOOTH_BTSTACK_H4 ?= 1 endif -ifeq ($(MICROPY_PY_NETWORK_CYW43),1) -DRIVERS_SRC_C += drivers/cyw43/cywbt.c -endif -endif +endif # MICROPY_PY_BLUETOOTH # SRC_O should be placed first to work around this LTO bug with binutils <2.35: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83967 diff --git a/ports/stm32/cyw43_configport.h b/ports/stm32/cyw43_configport.h new file mode 100644 index 0000000000000..666dfc43e27e4 --- /dev/null +++ b/ports/stm32/cyw43_configport.h @@ -0,0 +1,135 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Damien P. George + * Copyright (c) 2022 Jim Mussared + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_STM32_CYW43_CONFIGPORT_H +#define MICROPY_INCLUDED_STM32_CYW43_CONFIGPORT_H + +// The board-level config will be included here, so it can set some CYW43 values. +#include "py/mpconfig.h" +#include "py/mperrno.h" +#include "py/mphal.h" +#include "extmod/modnetwork.h" +#include "pendsv.h" +#include "sdio.h" + +#define CYW43_USE_SPI (0) +#define CYW43_LWIP (1) +#define CYW43_USE_STATS (0) + +#define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "lib/cyw43-driver/firmware/w4343WA1_7_45_98_50_combined.h" +#define CYW43_WIFI_NVRAM_INCLUDE_FILE "lib/cyw43-driver/firmware/wifi_nvram_1dx.h" +#define CYW43_IOCTL_TIMEOUT_US (1000000) +#define CYW43_SLEEP_MAX (50) +#define CYW43_NETUTILS (1) +#define CYW43_CLEAR_SDIO_INT (1) + +#define CYW43_EPERM MP_EPERM // Operation not permitted +#define CYW43_EIO MP_EIO // I/O error +#define CYW43_EINVAL MP_EINVAL // Invalid argument +#define CYW43_ETIMEDOUT MP_ETIMEDOUT // Connection timed out + +#define CYW43_THREAD_ENTER MICROPY_PY_LWIP_ENTER +#define CYW43_THREAD_EXIT MICROPY_PY_LWIP_EXIT +#define CYW43_THREAD_LOCK_CHECK + +#define CYW43_HOST_NAME mod_network_hostname + +#define CYW43_SDPCM_SEND_COMMON_WAIT __WFI(); +#define CYW43_DO_IOCTL_WAIT __WFI(); + +#define CYW43_ARRAY_SIZE(a) MP_ARRAY_SIZE(a) + +#define CYW43_HAL_PIN_MODE_INPUT MP_HAL_PIN_MODE_INPUT +#define CYW43_HAL_PIN_MODE_OUTPUT MP_HAL_PIN_MODE_OUTPUT +#define CYW43_HAL_PIN_PULL_NONE MP_HAL_PIN_PULL_NONE +#define CYW43_HAL_PIN_PULL_UP MP_HAL_PIN_PULL_UP +#define CYW43_HAL_PIN_PULL_DOWN MP_HAL_PIN_PULL_DOWN + +#define CYW43_HAL_MAC_WLAN0 MP_HAL_MAC_WLAN0 + +#define cyw43_hal_ticks_us mp_hal_ticks_us +#define cyw43_hal_ticks_ms mp_hal_ticks_ms + +#define cyw43_hal_pin_obj_t mp_hal_pin_obj_t +#define cyw43_hal_pin_config mp_hal_pin_config +#define cyw43_hal_pin_read mp_hal_pin_read +#define cyw43_hal_pin_low mp_hal_pin_low +#define cyw43_hal_pin_high mp_hal_pin_high + +#define cyw43_hal_get_mac mp_hal_get_mac +#define cyw43_hal_get_mac_ascii mp_hal_get_mac_ascii +#define cyw43_hal_generate_laa_mac mp_hal_generate_laa_mac + +#define CYW43_PIN_WL_REG_ON pyb_pin_WL_REG_ON +#define CYW43_PIN_WL_HOST_WAKE pyb_pin_WL_HOST_WAKE +#define CYW43_PIN_WL_RFSW_VDD pyb_pin_WL_RFSW_VDD +#define CYW43_PIN_WL_SDIO_1 pyb_pin_WL_SDIO_1 + +#define cyw43_schedule_internal_poll_dispatch(func) pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, func) + +void cyw43_post_poll_hook(void); + +static inline void cyw43_delay_us(uint32_t us) { + uint32_t start = mp_hal_ticks_us(); + while (mp_hal_ticks_us() - start < us) { + } +} + +static inline void cyw43_delay_ms(uint32_t ms) { + uint32_t us = ms * 1000; + uint32_t start = mp_hal_ticks_us(); + while (mp_hal_ticks_us() - start < us) { + MICROPY_EVENT_POLL_HOOK; + } +} + +static inline void cyw43_sdio_init(void) { + sdio_init(NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 14, 0)); +} + +static inline void cyw43_sdio_reinit(void) { + sdio_reenable(); +} + +static inline void cyw43_sdio_deinit(void) { + sdio_deinit(); +} + +static inline void cyw43_sdio_set_irq(bool enable) { + sdio_enable_irq(enable); +} + +static inline int cyw43_sdio_transfer(uint32_t cmd, uint32_t arg, uint32_t *resp) { + return sdio_transfer(cmd, arg, resp); +} + +static inline int cyw43_sdio_transfer_cmd53(bool write, uint32_t block_size, uint32_t arg, size_t len, uint8_t *buf) { + return sdio_transfer_cmd53(write, block_size, arg, len, buf); +} + +#define CYW43_EVENT_POLL_HOOK MICROPY_EVENT_POLL_HOOK + +#endif // MICROPY_INCLUDED_STM32_CYW43_CONFIGPORT_H diff --git a/ports/stm32/extint.c b/ports/stm32/extint.c index fd7950de3e953..e2605609254a8 100644 --- a/ports/stm32/extint.c +++ b/ports/stm32/extint.c @@ -36,6 +36,11 @@ #include "extint.h" #include "irq.h" +#if MICROPY_PY_NETWORK_CYW43 && defined(pyb_pin_WL_HOST_WAKE) +#include "lib/cyw43-driver/src/cyw43.h" +#include "lib/cyw43-driver/src/cyw43_stats.h" +#endif + /// \moduleref pyb /// \class ExtInt - configure I/O pins to interrupt on external events /// @@ -690,9 +695,9 @@ void Handle_EXTI_Irq(uint32_t line) { mp_obj_t *cb = &MP_STATE_PORT(pyb_extint_callback)[line]; #if MICROPY_PY_NETWORK_CYW43 && defined(pyb_pin_WL_HOST_WAKE) if (pyb_extint_callback_arg[line] == MP_OBJ_FROM_PTR(pyb_pin_WL_HOST_WAKE)) { - extern void (*cyw43_poll)(void); if (cyw43_poll) { pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll); + CYW43_STAT_INC(IRQ_COUNT); } return; } diff --git a/ports/stm32/main.c b/ports/stm32/main.c index 7f864a018c2ac..66dcb86ddc682 100644 --- a/ports/stm32/main.c +++ b/ports/stm32/main.c @@ -48,7 +48,9 @@ #if MICROPY_PY_LWIP #include "lwip/init.h" #include "lwip/apps/mdns.h" -#include "drivers/cyw43/cyw43.h" +#if MICROPY_PY_NETWORK_CYW43 +#include "lib/cyw43-driver/src/cyw43.h" +#endif #endif #if MICROPY_PY_BLUETOOTH diff --git a/ports/stm32/mpnetworkport.c b/ports/stm32/mpnetworkport.c index 1ce758e7dd78a..62f780a35a042 100644 --- a/ports/stm32/mpnetworkport.c +++ b/ports/stm32/mpnetworkport.c @@ -42,8 +42,11 @@ #include "lwip/dns.h" #include "lwip/dhcp.h" #include "lwip/apps/mdns.h" + +#if MICROPY_PY_NETWORK_CYW43 #include "extmod/network_cyw43.h" -#include "drivers/cyw43/cyw43.h" +#include "lib/cyw43-driver/src/cyw43.h" +#endif // Poll lwIP every 128ms #define LWIP_TICK(tick) (((tick) & ~(SYSTICK_DISPATCH_NUM_SLOTS - 1) & 0x7f) == 0) From 593375aa5ddc7e0ce3c45835c660d99614e0d7bb Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 21 Feb 2023 18:37:04 +1100 Subject: [PATCH 6/9] stm32/boards: Update linker scripts now that big_const is gone. Signed-off-by: Damien George --- .../boards/ARDUINO_PORTENTA_H7/stm32h747.ld | 22 +--------------- ports/stm32/boards/PYBD_SF2/f722_qspi.ld | 17 ++++--------- ports/stm32/boards/PYBD_SF6/f767.ld | 25 +------------------ 3 files changed, 7 insertions(+), 57 deletions(-) diff --git a/ports/stm32/boards/ARDUINO_PORTENTA_H7/stm32h747.ld b/ports/stm32/boards/ARDUINO_PORTENTA_H7/stm32h747.ld index 7a973289cb6bb..d5bd9598f9820 100644 --- a/ports/stm32/boards/ARDUINO_PORTENTA_H7/stm32h747.ld +++ b/ports/stm32/boards/ARDUINO_PORTENTA_H7/stm32h747.ld @@ -44,24 +44,4 @@ _micropy_hw_internal_flash_storage_ram_cache_end = ORIGIN(DTCM) + LENGTH(DTCM); _micropy_hw_internal_flash_storage_start = ORIGIN(FLASH_FS); _micropy_hw_internal_flash_storage_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS); -REGION_ALIAS("FLASH_COMMON", FLASH_TEXT); - -/* define output sections */ -SECTIONS -{ - INCLUDE common_isr.ld - - .text : - { - . = ALIGN(4); - *(.text*) - *(.rodata*) - . = ALIGN(512); - *(.big_const*) - . = ALIGN(4); - _etext = .; - } >FLASH_TEXT - - INCLUDE common_extratext_data_in_flash.ld - INCLUDE common_bss_heap_stack.ld -} +INCLUDE common_blifs.ld diff --git a/ports/stm32/boards/PYBD_SF2/f722_qspi.ld b/ports/stm32/boards/PYBD_SF2/f722_qspi.ld index 85145b22a326d..6ce4c74c3f34f 100644 --- a/ports/stm32/boards/PYBD_SF2/f722_qspi.ld +++ b/ports/stm32/boards/PYBD_SF2/f722_qspi.ld @@ -7,7 +7,7 @@ FLASH_APP .text FLASH_APP .data - FLASH_EXT .big_const + FLASH_EXT .text_ext RAM .data RAM .bss @@ -40,10 +40,6 @@ _ram_end = ORIGIN(RAM) + LENGTH(RAM); _heap_start = _ebss; /* heap starts just after statically allocated memory */ _heap_end = _sstack; -ENTRY(Reset_Handler) - -REGION_ALIAS("FLASH_COMMON", FLASH_APP); - /* Define output sections */ SECTIONS { @@ -53,13 +49,10 @@ SECTIONS *lib/btstack/*(.text* .rodata*) *lib/mbedtls/*(.text* .rodata*) *lib/mynewt-nimble/*(.text* .rodata*) - . = ALIGN(512); - *(.big_const*) + *lib/cyw43-driver/*(.rodata.w4343*_combined) + *drivers/cyw43/*(.rodata.cyw43_btfw_*) . = ALIGN(4); } >FLASH_EXT - - INCLUDE common_isr.ld - INCLUDE common_text.ld - INCLUDE common_extratext_data_in_flash.ld - INCLUDE common_bss_heap_stack.ld } + +INCLUDE common_bl.ld diff --git a/ports/stm32/boards/PYBD_SF6/f767.ld b/ports/stm32/boards/PYBD_SF6/f767.ld index cbe74696e8830..167d2c6a1e411 100644 --- a/ports/stm32/boards/PYBD_SF6/f767.ld +++ b/ports/stm32/boards/PYBD_SF6/f767.ld @@ -5,7 +5,6 @@ FLASH_APP .isr_vector FLASH_APP .text - FLASH_APP .big_const FLASH_APP .data RAM .data @@ -39,26 +38,4 @@ _ram_end = ORIGIN(RAM) + LENGTH(RAM); _heap_start = _ebss; /* heap starts just after statically allocated memory */ _heap_end = _sstack; -ENTRY(Reset_Handler) - -REGION_ALIAS("FLASH_COMMON", FLASH_APP); - -/* Define output sections */ -SECTIONS -{ - INCLUDE common_isr.ld - - .text : - { - . = ALIGN(4); - *(.text*) - *(.rodata*) - . = ALIGN(512); - *(.big_const*) - . = ALIGN(4); - _etext = .; - } >FLASH_APP - - INCLUDE common_extratext_data_in_flash.ld - INCLUDE common_bss_heap_stack.ld -} +INCLUDE common_bl.ld From 8b277d3c34f2613c1e204fcf055ebe91f119715b Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Wed, 1 Feb 2023 14:25:12 +1100 Subject: [PATCH 7/9] docs/library/network: Update docs for network.country, network.hostname. Also marks wlan.config(hostname) as deprecated. Signed-off-by: Jim Mussared --- docs/library/network.WLAN.rst | 2 +- docs/library/network.rst | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/docs/library/network.WLAN.rst b/docs/library/network.WLAN.rst index c673194700e59..d1e620ef09f9b 100644 --- a/docs/library/network.WLAN.rst +++ b/docs/library/network.WLAN.rst @@ -130,7 +130,7 @@ Methods hidden Whether SSID is hidden (boolean) security Security protocol supported (enumeration, see module constants) key Access key (string) - hostname The hostname that will be sent to DHCP (STA interfaces) and mDNS (if supported, both STA and AP) + hostname The hostname that will be sent to DHCP (STA interfaces) and mDNS (if supported, both STA and AP). (Deprecated, use :func:`network.hostname` instead) reconnects Number of reconnect attempts to make (integer, 0=none, -1=unlimited) txpower Maximum transmit power in dBm (integer or float) ============= =========== diff --git a/docs/library/network.rst b/docs/library/network.rst index 0a6f5506ea411..b13c84123ce7f 100644 --- a/docs/library/network.rst +++ b/docs/library/network.rst @@ -158,12 +158,39 @@ Network functions The following are functions available in the network module. +.. function:: country([code]) + + Get or set the two-letter ISO 3166-1 Alpha-2 country code to be used for + radio compliance. + + If the *code* parameter is provided, the country will be set to this value. + If the function is called without parameters, it returns the current + country. + + The default code ``"XX"`` represents the "worldwide" region. + +.. function:: hostname([name]) + + Get or set the hostname that will identify this device on the network. It is + applied to all interfaces. + + This hostname is used for: + * Sending to the DHCP server in the client request. (If using DHCP) + * Broadcasting via mDNS. (If enabled) + + If the *name* parameter is provided, the hostname will be set to this value. + If the function is called without parameters, it returns the current + hostname. + + The default hostname is typically the name of the board. + .. function:: phy_mode([mode]) Get or set the PHY mode. - If the *mode* parameter is provided, sets the mode to its value. If - the function is called without parameters, returns the current mode. + If the *mode* parameter is provided, the PHY mode will be set to this value. + If the function is called without parameters, it returns the current PHY + mode. The possible modes are defined as constants: * ``MODE_11B`` -- IEEE 802.11b, From 7d40317a4af2a8f46d3ed5546d27671ed0c75838 Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Thu, 2 Feb 2023 14:46:28 +1100 Subject: [PATCH 8/9] stm32: Add a default implementation of pyb.country. This is for boards without networking support so that the default boot.py continues to work. Also update boot.py to use network.country and network.hostname instead. Signed-off-by: Jim Mussared --- ports/stm32/factoryreset.c | 6 +++++- ports/stm32/modpyb.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ports/stm32/factoryreset.c b/ports/stm32/factoryreset.c index 10eb3a17a7eb3..2ac656db5950f 100644 --- a/ports/stm32/factoryreset.c +++ b/ports/stm32/factoryreset.c @@ -42,12 +42,16 @@ static const char fresh_boot_py[] = "\r\n" "import machine\r\n" "import pyb\r\n" - "pyb.country('US') # ISO 3166-1 Alpha-2 code, eg US, GB, DE, AU\r\n" "#pyb.main('main.py') # main script to run after this one\r\n" #if MICROPY_HW_ENABLE_USB "#pyb.usb_mode('VCP+MSC') # act as a serial and a storage device\r\n" "#pyb.usb_mode('VCP+HID') # act as a serial device and a mouse\r\n" #endif +#if MICROPY_PY_NETWORK + "#import network\r\n" + "#network.country('US') # ISO 3166-1 Alpha-2 code, eg US, GB, DE, AU or XX for worldwide\r\n" + "#network.hostname('...') # DHCP/mDNS hostname\r\n" +#endif ; static const char fresh_main_py[] = diff --git a/ports/stm32/modpyb.c b/ports/stm32/modpyb.c index 641d66efaf0cf..94aa6e65d1be6 100644 --- a/ports/stm32/modpyb.c +++ b/ports/stm32/modpyb.c @@ -116,6 +116,15 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_repl_uart_obj, 0, 1, pyb_repl_uar #if MICROPY_PY_NETWORK MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj); +#else +// Provide a no-op version of pyb.country for backwards compatibility on +// boards that don't support networking. +STATIC mp_obj_t pyb_country(size_t n_args, const mp_obj_t *args) { + (void)n_args; + (void)args; + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj, 0, 1, pyb_country); #endif STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = { @@ -148,10 +157,8 @@ STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_main), MP_ROM_PTR(&pyb_main_obj) }, { MP_ROM_QSTR(MP_QSTR_repl_uart), MP_ROM_PTR(&pyb_repl_uart_obj) }, - #if MICROPY_PY_NETWORK // Deprecated (use network.country instead). { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&mod_network_country_obj) }, - #endif #if MICROPY_HW_ENABLE_USB { MP_ROM_QSTR(MP_QSTR_usb_mode), MP_ROM_PTR(&pyb_usb_mode_obj) }, From 36ae5d3e87c3a3ab46a36c029c77722390db47b0 Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 27 Feb 2023 12:47:02 +1100 Subject: [PATCH 9/9] extmod/network_cyw43: Use CYW43_CHANNEL_NONE for default arg in connect. Signed-off-by: Damien George --- extmod/network_cyw43.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extmod/network_cyw43.c b/extmod/network_cyw43.c index 2d0b228e54be8..5204c4ebd6f04 100644 --- a/extmod/network_cyw43.c +++ b/extmod/network_cyw43.c @@ -226,7 +226,7 @@ STATIC mp_obj_t network_cyw43_connect(size_t n_args, const mp_obj_t *pos_args, m { MP_QSTR_auth, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} }, { MP_QSTR_security, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} }, { MP_QSTR_bssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} }, - { MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} }, + { MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = CYW43_CHANNEL_NONE} }, }; network_cyw43_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);