From cac6ef59e3442013d3e697656ddb16aef33ceaf4 Mon Sep 17 00:00:00 2001 From: haped <531618102@qq.com> Date: Tue, 26 Aug 2025 10:46:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E7=89=A9=E8=81=94=E7=BD=91?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化WiFi连接,实现温度上传,底座电量上传,体温贴电量上传 --- .../applications/app_temperature.c | 364 +++------- .../applications/app_temperature.h | 673 +++++++++++++++++- .../applications/app_wifi.c | 299 ++++++++ .../applications/app_wifi.h | 20 + .../applications/belon_ble.c | 28 +- .../applications/ring_queue.c | 3 + .../applications/ring_queue.h | 3 +- .../beken378/SConscript | 2 +- .../beken378/app/config/sys_config_bk7252n.h | 20 +- .../beken378/beken_src.mk | 2 +- .../codec/lib_aac_decode/SConscript | 2 +- .../codec/lib_amr_encode/SConscript | 2 +- .../codec/lib_opencore_amr/SConscript | 2 +- .../components/codec/lib_speex/SConscript | 2 +- .../player/example/cmd/cmd_player.c | 3 +- .../config/rtconfig/rtconfig_bk7252n.h | 2 +- .../config/sys_config.h | 20 +- .../drivers/audio/audio_device.h | 1 + .../packages/pahomqtt/samples/mqtt_sample.c | 99 ++- beken_rtt_sdk_release-SDK_3.0.76/rtconfig.h | 2 +- .../test/test_config.h | 4 +- tlv.bin | Bin 0 -> 48 bytes ...702030-400 0.2C放电曲线 250322_004_1_1.xls | Bin 0 -> 216064 bytes 23 files changed, 1247 insertions(+), 306 deletions(-) create mode 100644 beken_rtt_sdk_release-SDK_3.0.76/applications/app_wifi.c create mode 100644 beken_rtt_sdk_release-SDK_3.0.76/applications/app_wifi.h create mode 100644 tlv.bin create mode 100644 副本702030-400 0.2C放电曲线 250322_004_1_1.xls diff --git a/beken_rtt_sdk_release-SDK_3.0.76/applications/app_temperature.c b/beken_rtt_sdk_release-SDK_3.0.76/applications/app_temperature.c index 66e5fe1d..ad71676f 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/applications/app_temperature.c +++ b/beken_rtt_sdk_release-SDK_3.0.76/applications/app_temperature.c @@ -28,6 +28,7 @@ #include "ring_queue.h" #include "charge.h" #include "mqtt_client.h" +#include "app_wifi.h" static app_temperature_info_t temperature_info; @@ -41,7 +42,7 @@ static beken_timer_t timer_bind; static beken_timer_t timer_idle; static beken_timer_t timer_battery_refresh; static beken_timer_t timer_ble_scan; -static beken_timer_t timer_charge_hell ; +//static beken_timer_t timer_charge_hell ; int start_bind_detect = 0; int hall_key_down_count = 0; @@ -67,18 +68,13 @@ static RingQueue ring_queue; extern mqtt_client client; +static int e = 0; +static int mean_value = 0; + //WIFI信息 extern char last_ssid[33] ; extern char last_password[65]; -char last_bssid[65]; -char last_channel[65]; -char last_security[65]; -network_InitTypeDef_adv_st adv_config; - -//MQTT账号密码 -char mqtt_username[128]; -char mqtt_password[128]; extern char g_sta_mac[6]; @@ -304,6 +300,7 @@ void temperature_adv_callback(recv_adv_t *r_ind) last_body_temp = temp_body; app_enter_ui(UI_SHOW_TEMPERATURE); + //添加数据到队列,数量足够后取出所有温度数据 计算方差 如果小于 N N可以趋近于0 暂定小于100 则表示温度稳定 RingQueue_enqueue(&ring_queue,(int)last_body_temp); @@ -311,31 +308,41 @@ void temperature_adv_callback(recv_adv_t *r_ind) bk_printf("RingQueue_size -> %d \r\n", size); if (RingQueue_isFull(&ring_queue)) { - int i = 0; - int t_datas[MAX_SIZE]; - for(i = 0;i < MAX_SIZE; i++){ + //int i = 0; + //int t_datas[MAX_SIZE]; + //for(i = 0;i < MAX_SIZE; i++){ int value = 0; RingQueue_dequeue(&ring_queue,&value); - t_datas[i] = value; + //t_datas[i] = value; bk_printf("%d ", value); - } - bk_printf("\r\n", size); + //} + bk_printf("size: %d\r\n", size); //计算平均值 int sum = 0; - for(i = 0;i < MAX_SIZE; i++){ - sum += t_datas[i]; - } - int mean_value = sum / MAX_SIZE; - bk_printf("mean_value:%d \r\n", mean_value); + //for(i = 0;i < MAX_SIZE; i++){ + // sum += t_datas[i]; + //} + //int mean_value = ring_queue.sum / MAX_SIZE; + //bk_printf("mean_value:%d \r\n", mean_value); - //计算方差 - double sumOfSquares = 0; - for (int i = 0; i < MAX_SIZE; i++) { - sumOfSquares += (t_datas[i] - mean_value) * (t_datas[i] - mean_value); + for (int j=0;j=MAX_SIZE){ + e=0; + if(client.isconnected){ + if(mean_value!=0) + mqtt_upload_temperature(mean_value); + //mqtt_upload_boxbat(box_battery_percent); + mqtt_upload_bat(temperature_info.batt_percent); } } } -//MQTT上传温度 -void mqtt_upload_temperature(uint16_t t_value){ - uint16_t xy = t_value/10; //整数 - // uint16_t y = xy % 10 ;//个位 - // uint16_t x = (xy / 10) % 10 ;//十位 - // uint16_t z = t_value/10%10 ;//小数位 - char msg[128]; - char *topic_properties =(char *)os_malloc(128); - char device_id [64]; - rt_memset(device_id,0,sizeof(device_id)); - rt_sprintf(device_id,"%s_%02X%02X%02X%02X%02X%02X", - PRODUCTID,g_sta_mac[0],g_sta_mac[1],g_sta_mac[2],g_sta_mac[3],g_sta_mac[4],g_sta_mac[5]); - - os_memset(topic_properties,0,128); - rt_sprintf(topic_properties, "/%s/%s/properties/report", PRODUCTID, device_id); - - rt_sprintf(msg, "{\"properties\": {\"temperature\":%d}}", xy); - paho_mqtt_publish(&client, QOS1, topic_properties, msg, strlen(msg)); - bk_printf("MQTT publish: %s\n", msg); - bk_printf("device_id: %s\n", device_id); - os_free(topic_properties); -} - UINT32 usb_power_is_pluged(void) { @@ -388,7 +388,9 @@ UINT32 usb_power_is_pluged(void) return (reg & (1 << 21)); } void box_poweroff_timeout_callback(void *arg); +void timer_battery_refresh_callback(void *arg); int first_poweron = 0; +static int s=0; void timer_check_device_run_callback(void *arg){ uint16_t reg_charge = CHARGE_REG0X2_CHARGE_X_STA_GET(0); @@ -401,6 +403,11 @@ void timer_check_device_run_callback(void *arg){ } // box_info.charge_state = 0; rt_kprintf("usb_power_is_pluged reg:%d state:%d hall:%d\r\n", reg_charge, box_info.charge_state, box_info.hall_state); + s++; + if(s>=10){ + timer_battery_refresh_callback(NULL); + s=0; + } for(int i = 0; i < 5; i++){ //1秒内处于合盖状态就关机 if(hall || !first_poweron){ @@ -483,6 +490,7 @@ void app_show_box_battery(){ OLED_Clear(); char str_batt[12] = {0}; rt_sprintf(str_batt,"%d%",box_battery_percent); + extern unsigned char f35x40_box_ico[]; //满电显示屏显示不全 缩小字体显示 if(box_battery_percent >= 100){ @@ -503,18 +511,47 @@ static void box_adc_detect_callback(int new_mv, void *user_data) { static int cnt = 0; box_batt_adc.user_data = (void*)new_mv; - u32 kmah=0; + //u32 kmah=0; if(cnt++ >= 20){ cnt = 0; rt_kprintf("adc channel%d voltage:%d,%x\r\n",box_batt_adc.channel,new_mv,box_batt_adc.user_data); int bat_volt = new_mv*2; //int batt_min = 3300; //3300 - int batt_max = 4151; + //int batt_max = 4151; if(box_info.charge_state){ bat_volt -= 48 ; } rt_kprintf("battery_calc --> bat_volt:%d\n",bat_volt); - if(bat_volt >= batt_max) + if (bat_volt >= voltage_table[0].voltage) { + printf("0000000000000000000000000000\r\n"); + printf("voltage:%d\r\n",voltage_table[0].voltage); + box_battery_percent = 100; + } + // 电压低于最低阈值,返回0% + else if (bat_volt <= voltage_table[BATTERY_TABLE_SIZE-1].voltage) { + printf("11111111111111111111111111111\r\n"); + printf("voltage:%d\r\n",voltage_table[BATTERY_TABLE_SIZE-1].voltage); + box_battery_percent = 0; + } + + // 查表法查找对应的电量百分比 + else{ + for (int i = 1; i < BATTERY_TABLE_SIZE; i++){ + if (bat_volt >= voltage_table[i].voltage){ + // 线性插值计算百分比 + //u16 voltage_range = voltage_table[i].voltage - voltage_table[i-1].voltage; + //u16 voltage_offset = bat_val - voltage_table[i-1].voltage; + box_battery_percent=(443570-voltage_table[i].mah)*100/443570; + printf("i:%d \r\n", i); + printf("voltage_table[i].mah:%d \r\n", voltage_table[i].voltage); + printf("tmp_bat_val:%d \r\n", box_battery_percent); + break; + //return box_battery_percent; + } + } + } + + /*if(bat_volt >= batt_max) box_battery_percent = 100; else if(bat_volt <= batt_max && bat_volt >= 4000){ kmah = (-28880*bat_volt+120895600)/151; @@ -537,7 +574,7 @@ static void box_adc_detect_callback(int new_mv, void *user_data) box_battery_percent = (443570-kmah)*100/443570; // 3000~3400 } else - box_battery_percent = 1; + box_battery_percent = 1;*/ // if (bat_volt < batt_min) { // box_battery_percent=0; @@ -580,6 +617,8 @@ void timer_battery_refresh_callback(void *arg) // 重新采样电池电压 adc_obj_start(&box_batt_adc); // 重新显示电量 + if(client.isconnected) + mqtt_upload_boxbat(box_battery_percent); if(app_mode == UI_BOX_BATTERY || app_mode == UI_SHOW_MEMORY_INFO) { app_show_box_battery(); @@ -850,8 +889,7 @@ void app_enter_ui(app_ui_mode mode){ app_show_box_battery(); //static int battery_timer_inited = 0; - rtos_init_timer(&timer_battery_refresh, 10000, timer_battery_refresh_callback, NULL); - rtos_start_timer(&timer_battery_refresh); + // battery_timer_inited = 1; @@ -975,15 +1013,15 @@ void charge_sleep_on(int on) { // voice_player_mute(1); //声音 // rtos_start_timer(&timer_detect); // bk_wlan_start_sta(BK_STATION); //WIFI - belon_ble_scan_start(); //蓝牙扫描 - belon_ble_start_adv(); //蓝牙广播 + //belon_ble_scan_start(); //蓝牙扫描 + //belon_ble_start_adv(); //蓝牙广播 }else{ OLED_DisPlay_Off();//屏幕 voice_player_mute(0); //声音 // rtos_stop_timer(&timer_detect); // //bk_wlan_stop(BK_STATION); //WIFI - belon_ble_scan_stop(); //蓝牙扫描 - belon_ble_deinit_adv(); //蓝牙广播 + //belon_ble_scan_stop(); //蓝牙扫描 + //belon_ble_deinit_adv(); //蓝牙广播 } } } @@ -1207,198 +1245,6 @@ void temperature_led_ble(bool onoff){ } } -void connnect_wifi(char *oob_ssid,char *connect_key){//连接wifi - /*定义一个结构体,用于传入参数*/ - network_InitTypeDef_st wNetConfig; - int len; - - /*把这个结构体置空*/ - os_memset(&wNetConfig, 0x0, sizeof(network_InitTypeDef_st)); - - /*检查SSID的长度,不能超过32字节*/ - len = os_strlen(oob_ssid); - if(SSID_MAX_LEN < len) - { - bk_printf("ssid name more than 32 Bytes\r\n"); - return; - } - - /*将SSID跟密码传入结构体*/ - os_strcpy((char *)wNetConfig.wifi_ssid, oob_ssid); - os_strcpy((char *)wNetConfig.wifi_key, connect_key); - - /*当前为客户端模式*/ - wNetConfig.wifi_mode = BK_STATION; - /*采用DHCP CLIENT的方式获得,从路由器动态获取IP地址*/ - wNetConfig.dhcp_mode = DHCP_CLIENT; - wNetConfig.wifi_retry_interval = 100; - bk_printf("ssid:%s key:%s\r\n", wNetConfig.wifi_ssid, wNetConfig.wifi_key); - /*启动WiFi连接*/ - bk_wlan_start(&wNetConfig); - //rt_thread_mdelay(5000); -} - -// 读取最新联网信息 -void wifi_read_info(char *ssid, size_t ssid_len, char *password, size_t pass_len, -char *bssid, size_t bssid_len, char *channel, size_t channel_len, char *security, size_t security_len){ - - char *t_ssid = ef_get_env(BLE_WIFI_FLASH_KEY_SSID); - char *t_pass = ef_get_env(BLE_WIFI_FLASH_KEY_PASS); - char *t_bssid = ef_get_env(BLE_WIFI_FLASH_KEY_BSSID); - char *t_channel = ef_get_env(BLE_WIFI_FLASH_KEY_CHANNEL); - char *t_security = ef_get_env(BLE_WIFI_FLASH_KEY_SECURITY); - - if(t_ssid) { - strncpy(last_ssid, t_ssid, ssid_len - 1); - last_ssid[ssid_len - 1] = '\0'; - } - if(t_pass) { - strncpy(last_password, t_pass, pass_len - 1); - last_password[pass_len - 1] = '\0'; - } - if (t_bssid) { - strncpy(bssid, t_bssid, bssid_len - 1); - bssid[bssid_len - 1] = '\0'; - } - if (t_channel) { - strncpy(channel, t_channel, channel_len - 1); - channel[channel_len - 1] = '\0'; - } - if (t_security) { - strncpy(security, t_security, security_len - 1); - security[security_len - 1] = '\0'; - } -} - -//将flash存储的mac地址字符串转换为二进制格式 -void mac_string_to_binary(const char *mac_str, uint8_t *mac_bin) { - if (!mac_str || !mac_bin) return; - - char temp[18]; - strncpy(temp, mac_str, sizeof(temp)-1); - temp[sizeof(temp)-1] = '\0'; - - for (int i = 0; temp[i]; i++) { - temp[i] = toupper(temp[i]); - } - - char *p = temp; - char *end = temp + strlen(temp); - while (p < end) { - if (*p == ':' || *p == '-') { - memmove(p, p+1, end - p); - end--; - } else { - p++; - } - } - - if (strlen(temp) != 12) { - bk_printf("Invalid MAC length: %d\n", strlen(temp)); - return; - } - - for (int i = 0; i < 6; i++) { - char byte_str[3] = { temp[i*2], temp[i*2+1], '\0' }; - char *endptr; - mac_bin[i] = (uint8_t)strtol(byte_str, &endptr, 16); - - if (*endptr != '\0') { - bk_printf("MAC conversion error at position %d\n", i); - } - } - -} -//int fast_connect_try = 0; -//快速连接 -void fast_connect_wifi(){ - // 检查是否有效 - // if (fci.ssid[0] != 0 && strlen((char*)fci.ssid) < 32) { - uint8_t mac_bin[6] ={0}; - int sec_value = atoi(last_security); - - memset(&adv_config, 0, sizeof(adv_config)); - strncpy(adv_config.ap_info.ssid, last_ssid, sizeof(adv_config.ap_info.ssid)); - adv_config.ap_info.ssid[sizeof(adv_config.ap_info.ssid)-1] = '\0'; - - mac_string_to_binary(last_bssid, mac_bin); - memcpy(adv_config.ap_info.bssid, mac_bin, 6); - - adv_config.ap_info.channel = (uint8_t)atoi(last_channel); - - if (sec_value >= BK_SECURITY_TYPE_NONE && sec_value <= BK_SECURITY_TYPE_AUTO) { - adv_config.ap_info.security = (wlan_sec_type_t)sec_value; - } else { - adv_config.ap_info.security = BK_SECURITY_TYPE_AUTO; - } - - strncpy(adv_config.key, last_password, sizeof(adv_config.key)); - adv_config.key[sizeof(adv_config.key)-1] = '\0'; - adv_config.key_len = strlen(last_password); - adv_config.dhcp_mode = DHCP_CLIENT; - - bk_printf(" SSID: %s\n", adv_config.ap_info.ssid); - bk_printf(" BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n", - adv_config.ap_info.bssid[0], adv_config.ap_info.bssid[1], - adv_config.ap_info.bssid[2], adv_config.ap_info.bssid[3], - adv_config.ap_info.bssid[4], adv_config.ap_info.bssid[5]); - bk_printf(" Channel: %d\n", adv_config.ap_info.channel); - bk_printf(" Security: %d\n", adv_config.ap_info.security); - - bk_wlan_start_sta_adv(&adv_config); - // } else { - // fast_connect_try = 0; - // //fast_connect_failed = 1; - // bk_printf("No fast connect info, fallback to normal connect\n"); - // // 调用普通连接流程 - // } -} - -//wifi初始化连接 -void wifi_init(){ - wifi_read_info(last_ssid, sizeof(last_ssid), last_password, sizeof(last_password), - last_bssid, sizeof(last_bssid), last_channel, sizeof(last_channel), last_security, sizeof(last_security)); - - //fast_connect_wifi(); - - if(last_ssid[0] != '\0' && last_password[0] != '\0') { - bk_printf("Auto connect WiFi: SSID=%s, PASSWORD=%s\r\n", last_ssid, last_password); - bk_printf("BSSID: %s\n", last_bssid); - bk_printf("Channel: %s\n", last_channel); - bk_printf("Security: %s\n", last_security); - connnect_wifi(last_ssid, last_password); - }else{ - bk_printf("NOT WiFi INFO\r\n"); - } -} - -void poka_client_username(time_t now){ - rt_tick_t tick = rt_tick_get(); - uint32_t ms_part = (tick % RT_TICK_PER_SECOND) * 1000 / RT_TICK_PER_SECOND; - uint64_t ms = ((uint64_t)now) * 1000 + ms_part; - snprintf(mqtt_username, sizeof(mqtt_username), "%s|%llu", SECUREID_MQTT, (unsigned long long)ms); -} - -void poka_client_password(){ - char input[512]; - unsigned char md5sum[16]; - int i; - - // 拼接 username 和 SECUREKEY_MQTT - snprintf(input, sizeof(input), "%s|%s", mqtt_username, SECUREKEY_MQTT); - MD5_CTX ctx; - MMD5Init(&ctx); - MMD5Update(&ctx, (unsigned char *)input, strlen(input)); - MMD5Final(&ctx,md5sum); - - - for(i = 0; i < 16; i++) - sprintf(mqtt_password + i * 2, "%02x", md5sum[i]); - mqtt_password[32] = '\0'; - - rt_kprintf("username=%s\r\n",mqtt_username); - rt_kprintf("password=%s\r\n", mqtt_password); -} void record_init(void){ app_detect_record_t record; @@ -1440,6 +1286,8 @@ void temperature_init(void){ rtos_init_timer(&timer_poweroff, BLE_TEMPERATURE_POWEROFF_TIMEOUT, box_poweroff_timeout_callback, NULL); rtos_init_timer(&timer_bind, BLE_TEMPERATURE_BIND_MODE_TIMEOUT, box_bind_timeout_callback, NULL); rtos_init_timer(&timer_idle, BLE_TEMPERATURE_IDLE_MODE_TIMEOUT, timer_app_idle_callback, NULL); + + //初始化电量 box_init_power(); //user_app_start(); @@ -1460,9 +1308,11 @@ void temperature_init(void){ //app_enter_ui(UI_WAIT_TEMPERATURE); //注册WIFI回调 - //bk_wlan_status_register_cb(wifi_status_cb); + bk_wlan_status_register_cb(wifi_status_cb); //自动联网 + //if(wifi_auto_connect) wifi_init(); + rt_thread_mdelay(3000); //初始化BLE belon_ble_active(); @@ -1475,9 +1325,11 @@ void temperature_init(void){ //启动定时器 定时更新温度显示 rtos_init_timer(&timer_detect, BLE_TEMPERATURE_DETECT_DEVICE_INTERVAL, timer_check_device_run_callback, NULL); rtos_start_timer(&timer_detect); + rtos_init_timer(&timer_battery_refresh, 2000, timer_battery_refresh_callback, NULL); + //rtos_start_timer(&timer_battery_refresh); - rtos_init_timer(&timer_charge_hell, 300000, timer_hall_detect_callback, NULL); - rtos_start_timer(&timer_charge_hell); + //rtos_init_timer(&timer_charge_hell, 300000, timer_hall_detect_callback, NULL); + //rtos_start_timer(&timer_charge_hell); charger_module_enable(0); //sctrl_ctrl(CMD_SCTRL_USB_CHARGE_STOP, 0); diff --git a/beken_rtt_sdk_release-SDK_3.0.76/applications/app_temperature.h b/beken_rtt_sdk_release-SDK_3.0.76/applications/app_temperature.h index 779a8164..bf66b632 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/applications/app_temperature.h +++ b/beken_rtt_sdk_release-SDK_3.0.76/applications/app_temperature.h @@ -106,8 +106,8 @@ /** * MQTT ID and KEY */ -#define SECUREID_MQTT "pokaAdmin" -#define SECUREKEY_MQTT "poka@123456" +#define SECUREID_MQTT "poka" +#define SECUREKEY_MQTT "Poka&Lock12345" /** * 配置文件easyflah KEY BIND MAC @@ -127,6 +127,674 @@ */ #define BLE_TEMPERATURE_FLASH_RECORD_KEY_VOLUME "m1_volume" +#define BATTERY_TABLE_SIZE 662 // 查表法数据点数量 +static const struct { + u16 voltage; // 电压值(mV) + u32 mah; // 对应电量 +} voltage_table[BATTERY_TABLE_SIZE] = { + {4179, 0}, + {4174, 670}, + {4171, 1340}, + {4169, 2020}, + {4166, 2690}, + {4164, 3360}, + {4160, 4030}, + {4159, 4700}, + {4156, 5370}, + {4153, 6050}, + {4151, 6720}, + {4148, 7390}, + {4145, 8060}, + {4143, 8730}, + {4140, 9400}, + {4138, 10070}, + {4135, 10750}, + {4133, 11420}, + {4129, 12090}, + {4125, 12760}, + {4122, 13430}, + {4120, 14100}, + {4116, 14770}, + {4112, 15450}, + {4109, 16120}, + {4106, 16790}, + {4101, 17460}, + {4096, 18130}, + {4093, 18800}, + {4087, 19470}, + {4082, 20150}, + {4078, 20820}, + {4074, 21490}, + {4068, 22160}, + {4064, 22830}, + {4059, 23510}, + {4055, 24180}, + {4050, 24850}, + {4046, 25520}, + {4042, 26190}, + {4038, 26860}, + {4034, 27530}, + {4031, 28210}, + {4028, 28880}, + {4024, 29550}, + {4020, 30220}, + {4018, 30890}, + {4015, 31560}, + {4013, 32240}, + {4009, 32910}, + {4007, 33580}, + {4005, 34250}, + {4002, 34920}, + {4000, 35600}, + {3997, 36270}, + {3995, 36940}, + {3992, 37610}, + {3991, 38280}, + {3988, 38950}, + {3986, 39620}, + {3983, 40290}, + {3983, 40970}, + {3980, 41640}, + {3977, 42310}, + {3976, 42980}, + {3973, 43650}, + {3972, 44320}, + {3970, 44990}, + {3968, 45670}, + {3966, 46340}, + {3964, 47010}, + {3961, 47680}, + {3960, 48350}, + {3957, 49020}, + {3956, 49700}, + {3954, 50370}, + {3953, 51040}, + {3950, 51710}, + {3948, 52380}, + {3946, 53060}, + {3945, 53730}, + {3943, 54400}, + {3942, 55070}, + {3940, 55740}, + {3938, 56410}, + {3935, 57080}, + {3935, 57760}, + {3933, 58430}, + {3931, 59100}, + {3929, 59770}, + {3928, 60440}, + {3925, 61110}, + {3923, 61780}, + {3923, 62460}, + {3920, 63130}, + {3918, 63800}, + {3917, 64470}, + {3915, 65140}, + {3914, 65810}, + {3912, 66480}, + {3910, 67160}, + {3909, 67830}, + {3908, 68500}, + {3906, 69170}, + {3904, 69840}, + {3902, 70510}, + {3900, 71190}, + {3899, 71860}, + {3898, 72530}, + {3896, 73200}, + {3894, 73870}, + {3892, 74540}, + {3890, 75210}, + {3889, 75890}, + {3888, 76560}, + {3887, 77230}, + {3884, 77900}, + {3882, 78570}, + {3881, 79240}, + {3879, 79920}, + {3878, 80590}, + {3876, 81260}, + {3874, 81930}, + {3872, 82600}, + {3871, 83270}, + {3870, 83940}, + {3869, 84620}, + {3867, 85290}, + {3865, 85960}, + {3864, 86630}, + {3862, 87300}, + {3860, 87970}, + {3859, 88640}, + {3857, 89320}, + {3855, 89990}, + {3855, 90660}, + {3853, 91330}, + {3851, 92000}, + {3850, 92680}, + {3848, 93350}, + {3846, 94020}, + {3845, 94690}, + {3844, 95360}, + {3840, 96030}, + {3840, 96700}, + {3839, 97370}, + {3837, 98050}, + {3835, 98720}, + {3834, 99390}, + {3832, 100060}, + {3830, 100730}, + {3830, 101400}, + {3829, 102080}, + {3826, 102750}, + {3825, 103420}, + {3823, 104090}, + {3821, 104760}, + {3819, 105430}, + {3819, 106100}, + {3816, 106770}, + {3815, 107450}, + {3814, 108120}, + {3812, 108790}, + {3811, 109460}, + {3809, 110130}, + {3808, 110800}, + {3806, 111470}, + {3805, 112140}, + {3804, 112820}, + {3803, 113490}, + {3800, 114160}, + {3799, 114830}, + {3798, 115500}, + {3796, 116170}, + {3794, 116840}, + {3794, 117510}, + {3792, 118190}, + {3789, 118860}, + {3789, 119530}, + {3788, 120200}, + {3787, 120870}, + {3784, 121540}, + {3783, 122210}, + {3780, 122890}, + {3780, 123560}, + {3778, 124230}, + {3777, 124900}, + {3776, 125570}, + {3774, 126240}, + {3772, 126920}, + {3771, 127590}, + {3769, 128260}, + {3769, 128930}, + {3768, 129600}, + {3766, 130270}, + {3765, 130940}, + {3763, 131620}, + {3761, 132290}, + {3760, 132960}, + {3758, 133630}, + {3757, 134300}, + {3755, 134970}, + {3754, 135640}, + {3754, 136310}, + {3752, 136990}, + {3750, 137660}, + {3749, 138330}, + {3748, 139000}, + {3746, 139670}, + {3745, 140340}, + {3743, 141010}, + {3742, 141690}, + {3741, 142360}, + {3740, 143030}, + {3738, 143700}, + {3738, 144370}, + {3735, 145040}, + {3734, 145710}, + {3732, 146380}, + {3732, 147060}, + {3730, 147730}, + {3729, 148400}, + {3727, 149070}, + {3726, 149740}, + {3725, 150410}, + {3723, 151090}, + {3722, 151760}, + {3720, 152430}, + {3720, 153100}, + {3717, 153770}, + {3716, 154440}, + {3716, 155110}, + {3714, 155790}, + {3712, 156460}, + {3712, 157130}, + {3710, 157800}, + {3709, 158470}, + {3708, 159140}, + {3707, 159810}, + {3705, 160490}, + {3704, 161160}, + {3703, 161830}, + {3702, 162500}, + {3701, 163170}, + {3700, 163840}, + {3699, 164520}, + {3697, 165190}, + {3697, 165860}, + {3695, 166530}, + {3694, 167200}, + {3693, 167870}, + {3691, 168540}, + {3690, 169210}, + {3689, 169890}, + {3688, 170560}, + {3688, 171230}, + {3686, 171900}, + {3685, 172570}, + {3683, 173240}, + {3683, 173920}, + {3681, 174590}, + {3680, 175260}, + {3679, 175930}, + {3678, 176600}, + {3677, 177270}, + {3677, 177940}, + {3677, 178610}, + {3673, 179290}, + {3673, 179960}, + {3672, 180630}, + {3672, 181300}, + {3672, 181970}, + {3669, 182650}, + {3668, 183320}, + {3668, 183990}, + {3666, 184660}, + {3666, 185330}, + {3665, 186000}, + {3664, 186670}, + {3664, 187350}, + {3662, 188020}, + {3661, 188690}, + {3661, 189360}, + {3659, 190030}, + {3658, 190700}, + {3657, 191380}, + {3656, 192050}, + {3656, 192720}, + {3654, 193390}, + {3654, 194060}, + {3653, 194740}, + {3653, 195410}, + {3652, 196080}, + {3650, 196750}, + {3649, 197420}, + {3648, 198090}, + {3647, 198770}, + {3647, 199440}, + {3646, 200110}, + {3645, 200780}, + {3646, 201450}, + {3644, 202120}, + {3642, 202800}, + {3642, 203470}, + {3642, 204140}, + {3640, 204810}, + {3641, 205480}, + {3639, 206150}, + {3638, 206820}, + {3638, 207500}, + {3637, 208170}, + {3637, 208840}, + {3637, 209510}, + {3636, 210180}, + {3636, 210850}, + {3635, 211530}, + {3633, 212200}, + {3633, 212870}, + {3632, 213540}, + {3632, 214210}, + {3631, 214880}, + {3629, 215550}, + {3628, 216220}, + {3628, 216900}, + {3627, 217570}, + {3626, 218240}, + {3626, 218910}, + {3626, 219580}, + {3625, 220250}, + {3625, 220920}, + {3625, 221600}, + {3623, 222270}, + {3621, 222940}, + {3621, 223610}, + {3621, 224280}, + {3621, 224950}, + {3620, 225620}, + {3620, 226300}, + {3619, 226970}, + {3619, 227640}, + {3618, 228310}, + {3617, 228980}, + {3617, 229650}, + {3617, 230330}, + {3616, 231000}, + {3615, 231670}, + {3614, 232340}, + {3613, 233010}, + {3612, 233680}, + {3612, 234350}, + {3612, 235020}, + {3612, 235700}, + {3610, 236370}, + {3610, 237040}, + {3610, 237710}, + {3610, 238380}, + {3609, 239050}, + {3608, 239730}, + {3607, 240400}, + {3606, 241070}, + {3606, 241740}, + {3606, 242410}, + {3605, 243080}, + {3605, 243750}, + {3605, 244420}, + {3603, 245090}, + {3603, 245770}, + {3602, 246440}, + {3601, 247110}, + {3601, 247780}, + {3601, 248450}, + {3601, 249120}, + {3599, 249790}, + {3598, 250470}, + {3597, 251140}, + {3597, 251810}, + {3597, 252480}, + {3596, 253150}, + {3596, 253820}, + {3595, 254490}, + {3594, 255160}, + {3594, 255840}, + {3594, 256510}, + {3593, 257180}, + {3593, 257850}, + {3593, 258520}, + {3592, 259190}, + {3592, 259870}, + {3591, 260540}, + {3590, 261210}, + {3590, 261880}, + {3590, 262550}, + {3588, 263220}, + {3588, 263890}, + {3587, 264570}, + {3587, 265240}, + {3586, 265910}, + {3586, 266580}, + {3585, 267250}, + {3585, 267920}, + {3584, 268590}, + {3583, 269260}, + {3583, 269940}, + {3583, 270610}, + {3583, 271280}, + {3581, 271950}, + {3581, 272620}, + {3580, 273290}, + {3580, 273960}, + {3579, 274640}, + {3579, 275310}, + {3578, 275980}, + {3577, 276650}, + {3577, 277320}, + {3578, 277990}, + {3577, 278660}, + {3577, 279340}, + {3575, 280010}, + {3575, 280680}, + {3575, 281350}, + {3574, 282020}, + {3574, 282690}, + {3574, 283370}, + {3572, 284040}, + {3571, 284710}, + {3571, 285380}, + {3570, 286050}, + {3570, 286720}, + {3570, 287390}, + {3569, 288070}, + {3568, 288740}, + {3567, 289410}, + {3567, 290080}, + {3568, 290750}, + {3567, 291420}, + {3566, 292090}, + {3566, 292770}, + {3565, 293440}, + {3564, 294110}, + {3565, 294780}, + {3564, 295450}, + {3563, 296120}, + {3562, 296790}, + {3562, 297470}, + {3561, 298140}, + {3561, 298810}, + {3560, 299480}, + {3559, 300150}, + {3559, 300820}, + {3558, 301500}, + {3558, 302170}, + {3557, 302840}, + {3557, 303510}, + {3556, 304180}, + {3555, 304850}, + {3554, 305520}, + {3554, 306190}, + {3553, 306870}, + {3553, 307540}, + {3552, 308210}, + {3551, 308880}, + {3551, 309550}, + {3551, 310220}, + {3551, 310890}, + {3549, 311570}, + {3549, 312240}, + {3548, 312910}, + {3548, 313580}, + {3547, 314250}, + {3547, 314920}, + {3545, 315590}, + {3545, 316270}, + {3544, 316940}, + {3544, 317610}, + {3543, 318280}, + {3542, 318950}, + {3542, 319620}, + {3541, 320300}, + {3541, 320970}, + {3541, 321640}, + {3540, 322310}, + {3540, 322980}, + {3538, 323660}, + {3537, 324330}, + {3537, 325000}, + {3536, 325670}, + {3537, 326340}, + {3536, 327010}, + {3535, 327680}, + {3534, 328360}, + {3533, 329030}, + {3532, 329700}, + {3532, 330370}, + {3531, 331040}, + {3531, 331710}, + {3530, 332380}, + {3530, 333050}, + {3529, 333730}, + {3528, 334400}, + {3528, 335070}, + {3527, 335740}, + {3526, 336410}, + {3526, 337080}, + {3525, 337750}, + {3524, 338430}, + {3522, 339100}, + {3522, 339770}, + {3522, 340440}, + {3521, 341110}, + {3520, 341780}, + {3520, 342450}, + {3518, 343120}, + {3517, 343800}, + {3517, 344470}, + {3515, 345140}, + {3516, 345810}, + {3515, 346480}, + {3513, 347150}, + {3513, 347820}, + {3513, 348490}, + {3512, 349170}, + {3511, 349840}, + {3510, 350510}, + {3509, 351180}, + {3508, 351850}, + {3508, 352520}, + {3506, 353190}, + {3506, 353860}, + {3504, 354530}, + {3504, 355200}, + {3505, 355880}, + {3504, 356550}, + {3501, 357220}, + {3501, 357890}, + {3500, 358560}, + {3500, 359230}, + {3499, 359900}, + {3498, 360570}, + {3497, 361240}, + {3496, 361910}, + {3495, 362580}, + {3494, 363260}, + {3493, 363930}, + {3491, 364600}, + {3490, 365270}, + {3490, 365940}, + {3490, 366610}, + {3488, 367280}, + {3487, 367950}, + {3486, 368620}, + {3486, 369290}, + {3485, 369960}, + {3484, 370630}, + {3482, 371300}, + {3482, 371970}, + {3481, 372640}, + {3479, 373320}, + {3479, 373990}, + {3477, 374660}, + {3476, 375330}, + {3475, 376000}, + {3473, 376670}, + {3472, 377340}, + {3470, 378010}, + {3469, 378680}, + {3469, 379350}, + {3469, 380020}, + {3467, 380690}, + {3465, 381370}, + {3464, 382040}, + {3464, 382710}, + {3463, 383380}, + {3460, 384050}, + {3460, 384720}, + {3459, 385390}, + {3456, 386060}, + {3457, 386730}, + {3455, 387400}, + {3454, 388080}, + {3453, 388750}, + {3451, 389420}, + {3449, 390090}, + {3449, 390760}, + {3446, 391430}, + {3445, 392100}, + {3444, 392770}, + {3443, 393440}, + {3441, 394110}, + {3439, 394780}, + {3438, 395450}, + {3438, 396130}, + {3436, 396800}, + {3434, 397470}, + {3433, 398140}, + {3430, 398810}, + {3429, 399480}, + {3428, 400150}, + {3427, 400820}, + {3425, 401490}, + {3424, 402160}, + {3422, 402840}, + {3421, 403510}, + {3419, 404180}, + {3417, 404850}, + {3416, 405520}, + {3415, 406190}, + {3412, 406860}, + {3411, 407530}, + {3409, 408200}, + {3408, 408870}, + {3407, 409540}, + {3406, 410210}, + {3404, 410880}, + {3403, 411560}, + {3401, 412230}, + {3399, 412900}, + {3398, 413570}, + {3396, 414240}, + {3394, 414910}, + {3393, 415580}, + {3391, 416250}, + {3389, 416920}, + {3386, 417590}, + {3384, 418260}, + {3382, 418930}, + {3381, 419610}, + {3379, 420280}, + {3376, 420950}, + {3375, 421620}, + {3372, 422290}, + {3369, 422960}, + {3367, 423630}, + {3364, 424300}, + {3361, 424970}, + {3358, 425640}, + {3354, 426310}, + {3351, 426980}, + {3348, 427650}, + {3343, 428330}, + {3339, 429000}, + {3335, 429670}, + {3331, 430340}, + {3324, 431010}, + {3318, 431680}, + {3312, 432350}, + {3305, 433020}, + {3297, 433690}, + {3289, 434360}, + {3280, 435030}, + {3269, 435700}, + {3257, 436370}, + {3245, 437040}, + {3229, 437710}, + {3212, 438380}, + {3193, 439050}, + {3174, 439720}, + {3151, 440390}, + {3125, 441060}, + {3096, 441740}, + {3065, 442410}, + {3029, 443080}, + {3000, 443570} +}; typedef enum { @@ -207,6 +875,7 @@ void temperature_adv_callback(recv_adv_t *r_ind); void app_enter_bind_mode(bool enter); void mqtt_upload_temperature(uint16_t t_value); int mqtt_start(char username[],char password[]); +int mqtt_start2(char* username,char *password ,char * client_id); void poka_client_password(); void poka_client_username(); void connnect_wifi(char *oob_ssid,char *connect_key); diff --git a/beken_rtt_sdk_release-SDK_3.0.76/applications/app_wifi.c b/beken_rtt_sdk_release-SDK_3.0.76/applications/app_wifi.c new file mode 100644 index 00000000..793748da --- /dev/null +++ b/beken_rtt_sdk_release-SDK_3.0.76/applications/app_wifi.c @@ -0,0 +1,299 @@ +#include +#include +#include "common.h" +#include "param_config.h" +#include "ble_pub.h" +#include +#include +#include "wlan_ui_pub.h" +#include "sys_ctrl_pub.h" +#include "sys_ctrl.h" +#include "target_util_pub.h" +#include "drv_model_pub.h" +#include "md5.h" +#include "app_temperature.h" +#include "BkDriverFlash.h" +#include "manual_ps_pub.h" +#ifdef PKG_USING_EASYFLASH +#include "easyflash.h" + +#endif + +#include "mqtt_client.h" + +extern mqtt_client client; + +//WIFI信息 +extern char last_ssid[33] ; +extern char last_password[65]; +char last_bssid[65]; +char last_channel[65]; +char last_security[65]; + +network_InitTypeDef_adv_st adv_config; + +//MQTT账号密码 +char mqtt_username[128]={0}; +char mqtt_password[128]={0}; + +extern char g_sta_mac[6]; + +//MQTT上传温度 +void mqtt_upload_temperature(uint16_t t_value){ + uint16_t xy = t_value/10; //整数 + // uint16_t y = xy % 10 ;//个位 + // uint16_t x = (xy / 10) % 10 ;//十位 + // uint16_t z = t_value/10%10 ;//小数位 + char msg[128]; + char *topic_properties =(char *)os_malloc(128); + char device_id [64]; + rt_memset(device_id,0,sizeof(device_id)); + rt_sprintf(device_id,"%s_%02X%02X%02X%02X%02X%02X", + PRODUCTID,g_sta_mac[0],g_sta_mac[1],g_sta_mac[2],g_sta_mac[3],g_sta_mac[4],g_sta_mac[5]); + + os_memset(topic_properties,0,128); + rt_sprintf(topic_properties, "/%s/%s/properties/report", PRODUCTID, device_id); + + rt_sprintf(msg, "{\"properties\": {\"temperature\":%d}}", xy); + paho_mqtt_publish(&client, QOS1, topic_properties, msg, strlen(msg)); + bk_printf("MQTT publish: %s\n", msg); + bk_printf("device_id: %s\n", device_id); + os_free(topic_properties); +} + +void mqtt_upload_boxbat(uint16_t b_value){ + uint16_t xy = b_value; //整数 + // uint16_t y = xy % 10 ;//个位 + // uint16_t x = (xy / 10) % 10 ;//十位 + // uint16_t z = t_value/10%10 ;//小数位 + char msg[128]; + char *topic_properties =(char *)os_malloc(128); + char device_id [64]; + rt_memset(device_id,0,sizeof(device_id)); + rt_sprintf(device_id,"%s_%02X%02X%02X%02X%02X%02X", + PRODUCTID,g_sta_mac[0],g_sta_mac[1],g_sta_mac[2],g_sta_mac[3],g_sta_mac[4],g_sta_mac[5]); + + os_memset(topic_properties,0,128); + rt_sprintf(topic_properties, "/%s/%s/properties/report", PRODUCTID, device_id); + + rt_sprintf(msg, "{\"properties\": {\"box_bat\":%d}}", xy); + paho_mqtt_publish(&client, QOS1, topic_properties, msg, strlen(msg)); + bk_printf("MQTT publish: %s\n", msg); + bk_printf("device_id: %s\n", device_id); + os_free(topic_properties); +} + +void mqtt_upload_bat(uint16_t b_value){ + uint16_t xy = b_value; //整数 + // uint16_t y = xy % 10 ;//个位 + // uint16_t x = (xy / 10) % 10 ;//十位 + // uint16_t z = t_value/10%10 ;//小数位 + char msg[128]; + char *topic_properties =(char *)os_malloc(128); + char device_id [64]; + rt_memset(device_id,0,sizeof(device_id)); + rt_sprintf(device_id,"%s_%02X%02X%02X%02X%02X%02X", + PRODUCTID,g_sta_mac[0],g_sta_mac[1],g_sta_mac[2],g_sta_mac[3],g_sta_mac[4],g_sta_mac[5]); + + os_memset(topic_properties,0,128); + rt_sprintf(topic_properties, "/%s/%s/properties/report", PRODUCTID, device_id); + + rt_sprintf(msg, "{\"properties\": {\"bat\":%d}}", xy); + paho_mqtt_publish(&client, QOS1, topic_properties, msg, strlen(msg)); + bk_printf("MQTT publish: %s\n", msg); + bk_printf("device_id: %s\n", device_id); + os_free(topic_properties); +} + +void connnect_wifi(char *oob_ssid,char *connect_key){//连接wifi + /*定义一个结构体,用于传入参数*/ + network_InitTypeDef_st wNetConfig; + int len; + + /*把这个结构体置空*/ + os_memset(&wNetConfig, 0x0, sizeof(network_InitTypeDef_st)); + + /*检查SSID的长度,不能超过32字节*/ + len = os_strlen(oob_ssid); + if(SSID_MAX_LEN < len) + { + bk_printf("ssid name more than 32 Bytes\r\n"); + return; + } + + /*将SSID跟密码传入结构体*/ + os_strcpy((char *)wNetConfig.wifi_ssid, oob_ssid); + os_strcpy((char *)wNetConfig.wifi_key, connect_key); + + /*当前为客户端模式*/ + wNetConfig.wifi_mode = BK_STATION; + /*采用DHCP CLIENT的方式获得,从路由器动态获取IP地址*/ + wNetConfig.dhcp_mode = DHCP_CLIENT; + wNetConfig.wifi_retry_interval = 100; + bk_printf("ssid:%s key:%s\r\n", wNetConfig.wifi_ssid, wNetConfig.wifi_key); + /*启动WiFi连接*/ + bk_wlan_start(&wNetConfig); + //rt_thread_mdelay(5000); +} + +// 读取最新联网信息 +void wifi_read_info(char *ssid, size_t ssid_len, char *password, size_t pass_len, +char *bssid, size_t bssid_len, char *channel, size_t channel_len, char *security, size_t security_len){ + + char *t_ssid = ef_get_env(BLE_WIFI_FLASH_KEY_SSID); + char *t_pass = ef_get_env(BLE_WIFI_FLASH_KEY_PASS); + char *t_bssid = ef_get_env(BLE_WIFI_FLASH_KEY_BSSID); + char *t_channel = ef_get_env(BLE_WIFI_FLASH_KEY_CHANNEL); + char *t_security = ef_get_env(BLE_WIFI_FLASH_KEY_SECURITY); + + if(t_ssid) { + strncpy(last_ssid, t_ssid, ssid_len - 1); + last_ssid[ssid_len - 1] = '\0'; + } + if(t_pass) { + strncpy(last_password, t_pass, pass_len - 1); + last_password[pass_len - 1] = '\0'; + } + if (t_bssid) { + strncpy(bssid, t_bssid, bssid_len - 1); + bssid[bssid_len - 1] = '\0'; + } + if (t_channel) { + strncpy(channel, t_channel, channel_len - 1); + channel[channel_len - 1] = '\0'; + } + if (t_security) { + strncpy(security, t_security, security_len - 1); + security[security_len - 1] = '\0'; + } +} + +//将flash存储的mac地址字符串转换为二进制格式 +void mac_string_to_binary(const char *mac_str, uint8_t *mac_bin) { + if (!mac_str || !mac_bin) return; + + char temp[18]; + strncpy(temp, mac_str, sizeof(temp)-1); + temp[sizeof(temp)-1] = '\0'; + + for (int i = 0; temp[i]; i++) { + temp[i] = toupper(temp[i]); + } + + char *p = temp; + char *end = temp + strlen(temp); + while (p < end) { + if (*p == ':' || *p == '-') { + memmove(p, p+1, end - p); + end--; + } else { + p++; + } + } + + if (strlen(temp) != 12) { + bk_printf("Invalid MAC length: %d\n", strlen(temp)); + return; + } + + for (int i = 0; i < 6; i++) { + char byte_str[3] = { temp[i*2], temp[i*2+1], '\0' }; + char *endptr; + mac_bin[i] = (uint8_t)strtol(byte_str, &endptr, 16); + + if (*endptr != '\0') { + bk_printf("MAC conversion error at position %d\n", i); + } + } + +} +//int fast_connect_try = 0; +//快速连接 +void fast_connect_wifi(){ + // 检查是否有效 + // if (fci.ssid[0] != 0 && strlen((char*)fci.ssid) < 32) { + uint8_t mac_bin[6] ={0}; + int sec_value = atoi(last_security); + + memset(&adv_config, 0, sizeof(adv_config)); + strncpy(adv_config.ap_info.ssid, last_ssid, sizeof(adv_config.ap_info.ssid)); + adv_config.ap_info.ssid[sizeof(adv_config.ap_info.ssid)-1] = '\0'; + + mac_string_to_binary(last_bssid, mac_bin); + memcpy(adv_config.ap_info.bssid, mac_bin, 6); + + adv_config.ap_info.channel = (uint8_t)atoi(last_channel); + + if (sec_value >= BK_SECURITY_TYPE_NONE && sec_value <= BK_SECURITY_TYPE_AUTO) { + adv_config.ap_info.security = (wlan_sec_type_t)sec_value; + } else { + adv_config.ap_info.security = BK_SECURITY_TYPE_AUTO; + } + + strncpy(adv_config.key, last_password, sizeof(adv_config.key)); + adv_config.key[sizeof(adv_config.key)-1] = '\0'; + adv_config.key_len = strlen(last_password); + adv_config.dhcp_mode = DHCP_CLIENT; + + bk_printf(" SSID: %s\n", adv_config.ap_info.ssid); + bk_printf(" BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n", + adv_config.ap_info.bssid[0], adv_config.ap_info.bssid[1], + adv_config.ap_info.bssid[2], adv_config.ap_info.bssid[3], + adv_config.ap_info.bssid[4], adv_config.ap_info.bssid[5]); + bk_printf(" Channel: %d\n", adv_config.ap_info.channel); + bk_printf(" Security: %d\n", adv_config.ap_info.security); + + bk_wlan_start_sta_adv(&adv_config); + // } else { + // fast_connect_try = 0; + // //fast_connect_failed = 1; + // bk_printf("No fast connect info, fallback to normal connect\n"); + // // 调用普通连接流程 + // } +} + +//wifi初始化连接 +void wifi_init(){ + wifi_read_info(last_ssid, sizeof(last_ssid), last_password, sizeof(last_password), + last_bssid, sizeof(last_bssid), last_channel, sizeof(last_channel), last_security, sizeof(last_security)); + + //fast_connect_wifi(); + + if(last_ssid[0] != '\0' && last_password[0] != '\0') { + bk_printf("Auto connect WiFi: SSID=%s, PASSWORD=%s\r\n", last_ssid, last_password); + bk_printf("BSSID: %s\n", last_bssid); + bk_printf("Channel: %s\n", last_channel); + bk_printf("Security: %s\n", last_security); + connnect_wifi(last_ssid, last_password); + }else{ + bk_printf("NOT WiFi INFO\r\n"); + } +} + +void poka_client_username(time_t now){ + rt_tick_t tick = rt_tick_get(); + uint32_t ms_part = (tick % RT_TICK_PER_SECOND) * 1000 / RT_TICK_PER_SECOND; + uint64_t ms = ((uint64_t)now) * 1000 + ms_part; + snprintf(mqtt_username, sizeof(mqtt_username), "%s|%llu", SECUREID_MQTT, (unsigned long long)ms); +} + +void poka_client_password(){ + char input[512]; + unsigned char md5sum[16]; + int i; + + // 拼接 username 和 SECUREKEY_MQTT + snprintf(input, sizeof(input), "%s|%s", mqtt_username, SECUREKEY_MQTT); + MD5_CTX ctx; + MMD5Init(&ctx); + MMD5Update(&ctx, (unsigned char *)input, strlen(input)); + MMD5Final(&ctx,md5sum); + + + for(i = 0; i < 16; i++) + sprintf(mqtt_password + i * 2, "%02x", md5sum[i]); + mqtt_password[32] = '\0'; + + rt_kprintf("username=%s\r\n",mqtt_username); + rt_kprintf("password=%s\r\n", mqtt_password); +} diff --git a/beken_rtt_sdk_release-SDK_3.0.76/applications/app_wifi.h b/beken_rtt_sdk_release-SDK_3.0.76/applications/app_wifi.h new file mode 100644 index 00000000..c2cae17b --- /dev/null +++ b/beken_rtt_sdk_release-SDK_3.0.76/applications/app_wifi.h @@ -0,0 +1,20 @@ +#ifndef _APP_WIFI_H_ +#define _APP_WIFI_H_ +#include +#include +#include "common.h" +#include "param_config.h" + +void mqtt_upload_temperature(uint16_t t_value); +void connnect_wifi(char *oob_ssid,char *connect_key); +void wifi_read_info(char *ssid, size_t ssid_len, char *password, size_t pass_len, +char *bssid, size_t bssid_len, char *channel, size_t channel_len, char *security, size_t security_len); +void mac_string_to_binary(const char *mac_str, uint8_t *mac_bin); +void fast_connect_wifi(); +void wifi_init(); +void poka_client_username(time_t now); +void poka_client_password(); +void mqtt_upload_boxbat(uint16_t b_value); +void mqtt_upload_bat(uint16_t b_value); + +#endif \ No newline at end of file diff --git a/beken_rtt_sdk_release-SDK_3.0.76/applications/belon_ble.c b/beken_rtt_sdk_release-SDK_3.0.76/applications/belon_ble.c index 3611adcf..e2f87545 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/applications/belon_ble.c +++ b/beken_rtt_sdk_release-SDK_3.0.76/applications/belon_ble.c @@ -135,7 +135,7 @@ uint8_t cli_ble_read_callback(read_req_t *read_req) read_req->value[2] = 0x30; return 3; } -/* + static void ble_command_usage(void) { bk_printf("ble help - Help information\n"); @@ -149,12 +149,12 @@ static void ble_command_usage(void) bk_printf("ble disc - Disconnect\n"); bk_printf("ble dut - dut test\n"); -}*/ +} void sdp_event_cb(sdp_notice_t notice, void *param) { - /*switch (notice) { + switch (notice) { case SDP_CHARAC_NOTIFY_EVENT: { sdp_event_t *g_sdp = (sdp_event_t *)param; @@ -186,7 +186,7 @@ void sdp_event_cb(sdp_notice_t notice, void *param) default: bk_printf("[%s]Event:%d\r\n",__func__,notice); break; - }*/ + } } void ble_cmd_cb(ble_cmd_t cmd, ble_cmd_param_t *param) @@ -271,6 +271,12 @@ static void ntp_get_time_thread(void *parameter){ //获取ntp时间戳并生成m if (now > 0) { poka_client_username(now); poka_client_password(); + + char device_id [64]={0}; + rt_memset(device_id,0,sizeof(device_id)); + rt_sprintf(device_id,"%s_%02X%02X%02X%02X%02X%02X", + PRODUCTID,g_sta_mac[0],g_sta_mac[1],g_sta_mac[2],g_sta_mac[3],g_sta_mac[4],g_sta_mac[5]); + mqtt_start(mqtt_username, mqtt_password); }else{ bk_printf("ntp_time failed!\r\n"); @@ -356,7 +362,7 @@ void wifi_status_cb(void *param){ } } -void ble_connnect_wifi(uint8_t data[]){ +void ble_connect_wifi(uint8_t data[]){ char ssid[33] = {0}; char password[65] = {0}; char *p = strchr((char *)data + 8, ','); @@ -410,7 +416,7 @@ void ble_notice_cb(ble_notice_t notice, void *param) bk_wlan_start_scan(); } if(strncmp((char *)data, "AT+WIFI:", 8) == 0){ //连接WiFi命令:AT+WIFI:SSID,PASSWORD - ble_connnect_wifi(data); + ble_connect_wifi(data); } if(strstr((char *)data,"AT+STATE")!=NULL){ //返回当前状态 char msg[32] = "AT+STATE=0"; @@ -462,7 +468,7 @@ void ble_notice_cb(ble_notice_t notice, void *param) int new_volume; memset((void *)&record, 0, sizeof(record)); volume_read_record(&record); - if(sscanf((char*)data, "AT+VOLUME=%d", &new_volume) == 1) { + if(sscanf((char*)data, "AT+SETVOICE=%d", &new_volume) == 1) { record.volume = new_volume; if(record.volume>=99) record.volume=99; @@ -686,7 +692,7 @@ void ble_notice_cb(ble_notice_t notice, void *param) } static void ble(int argc, char **argv) -{/* +{ uint8_t adv_data[31]; uint8_t actv_idx; if ((argc < 2) || (os_strcmp(argv[1], "help") == 0)) @@ -939,11 +945,11 @@ static void ble(int argc, char **argv) }else{ bk_printf("handle(%x) error\r\n",handle); } - }*/ + } } static void ble_advertise_start(int argc, char **argv) -{/* +{ uint8_t adv_data[31]; uint8_t actv_idx; uint8_t adv_data_len; @@ -982,7 +988,7 @@ static void ble_advertise_start(int argc, char **argv) bk_ble_set_scan_rsp_data(actv_idx, adv_data, adv_data_len, ble_cmd_cb); rt_thread_mdelay(10); - bk_ble_start_advertising(actv_idx, 0, ble_cmd_cb);*/ + bk_ble_start_advertising(actv_idx, 0, ble_cmd_cb); } void belon_ble_deinit_adv() { diff --git a/beken_rtt_sdk_release-SDK_3.0.76/applications/ring_queue.c b/beken_rtt_sdk_release-SDK_3.0.76/applications/ring_queue.c index 4076f343..87095573 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/applications/ring_queue.c +++ b/beken_rtt_sdk_release-SDK_3.0.76/applications/ring_queue.c @@ -12,6 +12,7 @@ void RingQueue_init(RingQueue *q) { q->front = 0; q->rear = 0; q->size = 0; + //q->sum = 0; } bool RingQueue_isFull(RingQueue *q) { return q->size == MAX_SIZE; @@ -24,6 +25,7 @@ bool RingQueue_enqueue(RingQueue *q, int value) { if (RingQueue_isFull(q)) { return false; // 队列已满,返回失败 } + //q->sum += value; q->data[q->rear] = value; // 将值放入队尾 q->rear = (q->rear + 1) % MAX_SIZE; // 更新队尾指针,注意使用模运算实现循环 q->size++; // 队列大小加一 @@ -35,6 +37,7 @@ bool RingQueue_dequeue(RingQueue *q, int *value) { return false; } *value = q->data[q->front]; // 获取队头元素的值 + //q->sum -= q->data[q->front]; q->front = (q->front + 1) % MAX_SIZE; // 更新队头指针,注意使用模运算实现循环 q->size--; // 队列大小减一 return true; // 成功出队返回true diff --git a/beken_rtt_sdk_release-SDK_3.0.76/applications/ring_queue.h b/beken_rtt_sdk_release-SDK_3.0.76/applications/ring_queue.h index 0c4e6b2c..4535b6fe 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/applications/ring_queue.h +++ b/beken_rtt_sdk_release-SDK_3.0.76/applications/ring_queue.h @@ -2,13 +2,14 @@ #include #include -#define MAX_SIZE 20 +#define MAX_SIZE 30 typedef struct { int data[MAX_SIZE]; // 存储数据的数组 int front; // 队头指针 int rear; // 队尾指针 int size; // 队列当前大小 + //int sum; } RingQueue; void RingQueue_init(RingQueue *q); diff --git a/beken_rtt_sdk_release-SDK_3.0.76/beken378/SConscript b/beken_rtt_sdk_release-SDK_3.0.76/beken378/SConscript index 73e8a729..1121f7b7 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/beken378/SConscript +++ b/beken_rtt_sdk_release-SDK_3.0.76/beken378/SConscript @@ -88,7 +88,7 @@ else: src += ["driver/pwm/pwm_bk7231n.c"] src += ["driver/gpio/gpio.c"] -src += ["demo/ieee802_11_demo.c"] +#src += ["demo/ieee802_11_demo.c"] src += ["func/func.c"] src += ["func/audio/audio_intf.c"] src += ["func/power_save/power_save.c"] diff --git a/beken_rtt_sdk_release-SDK_3.0.76/beken378/app/config/sys_config_bk7252n.h b/beken_rtt_sdk_release-SDK_3.0.76/beken378/app/config/sys_config_bk7252n.h index 2864448e..d92454b5 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/beken378/app/config/sys_config_bk7252n.h +++ b/beken_rtt_sdk_release-SDK_3.0.76/beken378/app/config/sys_config_bk7252n.h @@ -99,7 +99,7 @@ */ #define CFG_WIFI_AP_HW_MODE 0 -#define CfG_MACRO_MAYBE_UNUSED 0 +#define CfG_MACRO_MAYBE_UNUSED 1 #if CfG_MACRO_MAYBE_UNUSED #define CFG_WIFI_RSSI 1 #define CFG_WIFI_VERSION 1 @@ -160,7 +160,7 @@ /* The following four macro will be reconstruct * TODO */ -#define CFG_ENABLE_SDIO_DEV 0 +#define CFG_ENABLE_SDIO_DEV 1 #define CFG_SDIO 0 #define CFG_SDIO_TRANS 0 #define CFG_REAL_SDIO 0 @@ -233,8 +233,8 @@ #define CFG_USE_LWIP_NETSTACK 1 /*section 9-----for DHCP servicers and client*/ -#define CFG_USE_DHCP 0//1 -#define CFG_USE_DHCPD 0//1 // for servicers in ap mode +#define CFG_USE_DHCP 1 +#define CFG_USE_DHCPD 1 // for servicers in ap mode /*section 11-----temperature detect*/ #define CFG_USE_TEMPERATURE_DETECT 1 @@ -323,9 +323,9 @@ /*section 21 ----- support ota*/ #if( ( CFG_SUPPORT_ALIOS ) || ( CFG_SUPPORT_RTT ) || (CFG_SUPPORT_MATTER == 1)) -#define CFG_SUPPORT_OTA_HTTP 0 +#define CFG_SUPPORT_OTA_HTTP 1 #else -#define CFG_SUPPORT_OTA_HTTP 0 +#define CFG_SUPPORT_OTA_HTTP 1 #endif #define CFG_SUPPORT_OTA_TFTP 0 @@ -430,10 +430,10 @@ #define CFG_TASK_WDG_PERIOD_MS 60000 /*section 29 ----- peripheral interface open */ -#define CFG_USE_SPI 0 -#define CFG_USE_SPI_MASTER 0 -#define CFG_USE_SPI_SLAVE 0 -#define CFG_USE_SPI_DMA 0 +#define CFG_USE_SPI 1 +#define CFG_USE_SPI_MASTER 1 +#define CFG_USE_SPI_SLAVE 1 +#define CFG_USE_SPI_DMA 1 /*section 30 ----- peripheral interface test case */ #define CFG_PERIPHERAL_TEST 0 diff --git a/beken_rtt_sdk_release-SDK_3.0.76/beken378/beken_src.mk b/beken_rtt_sdk_release-SDK_3.0.76/beken378/beken_src.mk index 8060c65f..347b5e56 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/beken378/beken_src.mk +++ b/beken_rtt_sdk_release-SDK_3.0.76/beken378/beken_src.mk @@ -381,7 +381,7 @@ SRC_C += ./beken378/app/net_work/video_demo_p2p.c #demo module -SRC_C += ./beken378/demo/ieee802_11_demo.c +#SRC_C += ./beken378/demo/ieee802_11_demo.c #driver layer SRC_DRV_C += ./beken378/driver/common/dd.c diff --git a/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_aac_decode/SConscript b/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_aac_decode/SConscript index dd3b05f8..1ad3a047 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_aac_decode/SConscript +++ b/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_aac_decode/SConscript @@ -10,6 +10,6 @@ CPPPATH = [cwd] libs = ['aac_decoder'] libpath = [cwd] -group = DefineGroup('aac_decoder', src, depend = ['PKG_USING_PLAYER'], CPPPATH = CPPPATH, LIBS = libs, LIBPATH = libpath) +group = DefineGroup('aac_decoder', src, depend = ['PKG_USING_PLAYER1'], CPPPATH = CPPPATH, LIBS = libs, LIBPATH = libpath) Return('group') diff --git a/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_amr_encode/SConscript b/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_amr_encode/SConscript index 58a7d0fa..4e4211c0 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_amr_encode/SConscript +++ b/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_amr_encode/SConscript @@ -10,6 +10,6 @@ CPPPATH = [cwd] libs = ['amrnb_encoder'] libpath = [cwd] -group = DefineGroup('amrnb_encoder', src, depend = ['PKG_USING_PLAYER'], CPPPATH = CPPPATH, LIBS = libs, LIBPATH = libpath) +group = DefineGroup('amrnb_encoder', src, depend = ['PKG_USING_PLAYER1'], CPPPATH = CPPPATH, LIBS = libs, LIBPATH = libpath) Return('group') diff --git a/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_opencore_amr/SConscript b/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_opencore_amr/SConscript index efd99fe3..a4eb95af 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_opencore_amr/SConscript +++ b/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_opencore_amr/SConscript @@ -10,6 +10,6 @@ CPPPATH = [cwd + '/'] libs = ['opencore_amr_arm968_gcc'] libpath = [cwd] -group = DefineGroup('opencore_amr', src, depend = ['PKG_USING_PLAYER'], CPPPATH = CPPPATH, LIBS = libs, LIBPATH = libpath) +group = DefineGroup('opencore_amr', src, depend = ['PKG_USING_PLAYER1'], CPPPATH = CPPPATH, LIBS = libs, LIBPATH = libpath) Return('group') diff --git a/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_speex/SConscript b/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_speex/SConscript index 8d12df7f..dd102f52 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_speex/SConscript +++ b/beken_rtt_sdk_release-SDK_3.0.76/components/codec/lib_speex/SConscript @@ -9,6 +9,6 @@ CPPPATH = [cwd, cwd + '/include'] libs = ['speex_arm968_gcc'] libpath = [cwd] -group = DefineGroup('speex', src, depend = ['PKG_USING_PLAYER'], CPPPATH = CPPPATH, LIBS = libs, LIBPATH = libpath) +group = DefineGroup('speex', src, depend = ['PKG_USING_PLAYER1'], CPPPATH = CPPPATH, LIBS = libs, LIBPATH = libpath) Return('group') diff --git a/beken_rtt_sdk_release-SDK_3.0.76/components/player/example/cmd/cmd_player.c b/beken_rtt_sdk_release-SDK_3.0.76/components/player/example/cmd/cmd_player.c index c4768062..e000e97d 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/components/player/example/cmd/cmd_player.c +++ b/beken_rtt_sdk_release-SDK_3.0.76/components/player/example/cmd/cmd_player.c @@ -266,7 +266,8 @@ int player(int argc, char **argv) } else { - player_set_volume(volume); + //player_set_volume(volume); + rt_kprintf("set play ok? %d%%.\n", player_set_volume(volume)); rt_kprintf("set play volume %d%%.\n", volume); } } diff --git a/beken_rtt_sdk_release-SDK_3.0.76/config/rtconfig/rtconfig_bk7252n.h b/beken_rtt_sdk_release-SDK_3.0.76/config/rtconfig/rtconfig_bk7252n.h index e3113981..130b0e08 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/config/rtconfig/rtconfig_bk7252n.h +++ b/beken_rtt_sdk_release-SDK_3.0.76/config/rtconfig/rtconfig_bk7252n.h @@ -188,7 +188,7 @@ #define PKG_USING_WEBCLIENT #define WEBCLIENT_HEADER_BUFSZ 4096 #define WEBCLIENT_RESPONSE_BUFSZ 4096 -//#define PKG_USING_WEBCLIENT_LATEST_VERSION +#define PKG_USING_WEBCLIENT_LATEST_VERSION //#define PKG_USING_CJSON #define PKG_USING_CJSON_V102 diff --git a/beken_rtt_sdk_release-SDK_3.0.76/config/sys_config.h b/beken_rtt_sdk_release-SDK_3.0.76/config/sys_config.h index 2864448e..d92454b5 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/config/sys_config.h +++ b/beken_rtt_sdk_release-SDK_3.0.76/config/sys_config.h @@ -99,7 +99,7 @@ */ #define CFG_WIFI_AP_HW_MODE 0 -#define CfG_MACRO_MAYBE_UNUSED 0 +#define CfG_MACRO_MAYBE_UNUSED 1 #if CfG_MACRO_MAYBE_UNUSED #define CFG_WIFI_RSSI 1 #define CFG_WIFI_VERSION 1 @@ -160,7 +160,7 @@ /* The following four macro will be reconstruct * TODO */ -#define CFG_ENABLE_SDIO_DEV 0 +#define CFG_ENABLE_SDIO_DEV 1 #define CFG_SDIO 0 #define CFG_SDIO_TRANS 0 #define CFG_REAL_SDIO 0 @@ -233,8 +233,8 @@ #define CFG_USE_LWIP_NETSTACK 1 /*section 9-----for DHCP servicers and client*/ -#define CFG_USE_DHCP 0//1 -#define CFG_USE_DHCPD 0//1 // for servicers in ap mode +#define CFG_USE_DHCP 1 +#define CFG_USE_DHCPD 1 // for servicers in ap mode /*section 11-----temperature detect*/ #define CFG_USE_TEMPERATURE_DETECT 1 @@ -323,9 +323,9 @@ /*section 21 ----- support ota*/ #if( ( CFG_SUPPORT_ALIOS ) || ( CFG_SUPPORT_RTT ) || (CFG_SUPPORT_MATTER == 1)) -#define CFG_SUPPORT_OTA_HTTP 0 +#define CFG_SUPPORT_OTA_HTTP 1 #else -#define CFG_SUPPORT_OTA_HTTP 0 +#define CFG_SUPPORT_OTA_HTTP 1 #endif #define CFG_SUPPORT_OTA_TFTP 0 @@ -430,10 +430,10 @@ #define CFG_TASK_WDG_PERIOD_MS 60000 /*section 29 ----- peripheral interface open */ -#define CFG_USE_SPI 0 -#define CFG_USE_SPI_MASTER 0 -#define CFG_USE_SPI_SLAVE 0 -#define CFG_USE_SPI_DMA 0 +#define CFG_USE_SPI 1 +#define CFG_USE_SPI_MASTER 1 +#define CFG_USE_SPI_SLAVE 1 +#define CFG_USE_SPI_DMA 1 /*section 30 ----- peripheral interface test case */ #define CFG_PERIPHERAL_TEST 0 diff --git a/beken_rtt_sdk_release-SDK_3.0.76/drivers/audio/audio_device.h b/beken_rtt_sdk_release-SDK_3.0.76/drivers/audio/audio_device.h index 417ecc81..dcdb6765 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/drivers/audio/audio_device.h +++ b/beken_rtt_sdk_release-SDK_3.0.76/drivers/audio/audio_device.h @@ -29,4 +29,5 @@ void audio_device_mic_set_rate(int sample_rate); void audio_device_mic_set_channel(int channel); int audio_device_mic_read(void *buffer, int size); void audio_device_mic_close(void); +int audio_device_get_volume(void); #endif diff --git a/beken_rtt_sdk_release-SDK_3.0.76/packages/pahomqtt/samples/mqtt_sample.c b/beken_rtt_sdk_release-SDK_3.0.76/packages/pahomqtt/samples/mqtt_sample.c index c3ef08a8..0c392bb8 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/packages/pahomqtt/samples/mqtt_sample.c +++ b/beken_rtt_sdk_release-SDK_3.0.76/packages/pahomqtt/samples/mqtt_sample.c @@ -26,7 +26,8 @@ mqtt_client client; extern char g_sta_mac[6]; static int is_started = 0; static uint32_t reciver_num=0; -static beken_timer_t mqtt_connect_timer; +//static beken_timer_t mqtt_connect_timer; +static char device_id[64]; static void mqtt_sub_callback(mqtt_client *c, message_data *msg_data) { reciver_num++; @@ -59,13 +60,14 @@ static void mqtt_connect_callback(mqtt_client *c) static void mqtt_online_callback(mqtt_client *c) { LOG_D("inter mqtt_online_callback!"); - rtos_stop_timer(&mqtt_connect_timer); + //rtos_stop_timer(&mqtt_connect_timer); //paho_mqtt_subscribe(&client, QOS1, MQTT_SUBTOPIC, mqtt_sub_callback); } static void mqtt_offline_callback(mqtt_client *c) { LOG_D("inter mqtt_offline_callback!"); + connect_mqtt(); } // void mqtt_connect_timeout_cb(void *arg) @@ -83,7 +85,6 @@ static void mqtt_offline_callback(mqtt_client *c) // } // is_started = 0; // } - int mqtt_start(char username[],char password[]) { /* init condata param by using MQTTPacket_connectData_initializer */ @@ -102,13 +103,100 @@ int mqtt_start(char username[],char password[]) /* config connect param */ memcpy(&client.condata, &condata, sizeof(condata)); - char device_id [64]; + rt_memset(device_id,0,sizeof(device_id)); - rt_sprintf(device_id,"%s_%02X%02X%02X%02X%02X%02X", + sprintf(device_id,"%s_%02X%02X%02X%02X%02X%02X", PRODUCTID,g_sta_mac[0],g_sta_mac[1],g_sta_mac[2],g_sta_mac[3],g_sta_mac[4],g_sta_mac[5]); + device_id[17]='\0'; + + bk_printf("username: %s\n", username); + bk_printf("password: %s\n", password); bk_printf("device_id: %s\n", device_id); + client.condata.username.cstring = username; + client.condata.password.cstring = password; client.condata.clientID.cstring = device_id; + client.condata.keepAliveInterval = 60; + client.condata.cleansession = 1; + + /* config MQTT will param. */ + client.condata.willFlag = 1; + client.condata.will.qos = 1; + client.condata.will.retained = 0; + client.condata.will.topicName.cstring = "/mqtt/will";//MQTT_SUBTOPIC; + client.condata.will.message.cstring = MQTT_WILLMSG; + + /* malloc buffer. */ + client.buf_size = client.readbuf_size = 1024; + client.buf = rt_calloc(1, client.buf_size); + client.readbuf = rt_calloc(1, client.readbuf_size); + if (!(client.buf && client.readbuf)) + { + LOG_E("no memory for MQTT client buffer!"); + return -1; + } + + /* set event callback function */ + client.connect_callback = mqtt_connect_callback; + client.online_callback = mqtt_online_callback; + client.offline_callback = mqtt_offline_callback; + + /* set subscribe table and event callback */ + client.message_handlers[0].topicFilter = rt_strdup(MQTT_SUBTOPIC); + client.message_handlers[0].callback = mqtt_sub_callback; + client.message_handlers[0].qos = QOS1; + + /* set default subscribe event callback */ + client.default_message_handlers = mqtt_sub_default_callback; + } + + { + int value; + uint16_t u16Value; + value = 5; + paho_mqtt_control(&client, MQTT_CTRL_SET_CONN_TIMEO, &value); + value = 5; + paho_mqtt_control(&client, MQTT_CTRL_SET_MSG_TIMEO, &value); + value = 5; + paho_mqtt_control(&client, MQTT_CTRL_SET_RECONN_INTERVAL, &value); + value = 30; + paho_mqtt_control(&client, MQTT_CTRL_SET_KEEPALIVE_INTERVAL, &value); + u16Value = 3; + paho_mqtt_control(&client, MQTT_CTRL_SET_KEEPALIVE_COUNT, &u16Value); + } + + /* run mqtt client */ + paho_mqtt_start(&client, 8196, 20); + // rtos_init_timer(&mqtt_connect_timer, 10000, mqtt_connect_timeout_cb, NULL); + // rtos_start_timer(&mqtt_connect_timer); + + is_started = 1; + + return 0; +} + +#if 0 +int mqtt_start2(char* username,char *password ,char * client_id) +{ + /* init condata param by using MQTTPacket_connectData_initializer */ + MQTTPacket_connectData condata = MQTTPacket_connectData_initializer; + + if (is_started) + { + LOG_E("mqtt client is already connected."); + return -1; + } + /* config MQTT context param */ + { + client.isconnected = 0; + client.uri = MQTT_URI; + + /* config connect param */ + memcpy(&client.condata, &condata, sizeof(condata)); + + + + client.condata.clientID.cstring = client_id; client.condata.username.cstring = username; client.condata.password.cstring = password; client.condata.keepAliveInterval = 60; @@ -169,6 +257,7 @@ int mqtt_start(char username[],char password[]) return 0; } +#endif int mqtt_stop(int argc, char **argv) { diff --git a/beken_rtt_sdk_release-SDK_3.0.76/rtconfig.h b/beken_rtt_sdk_release-SDK_3.0.76/rtconfig.h index e3113981..130b0e08 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/rtconfig.h +++ b/beken_rtt_sdk_release-SDK_3.0.76/rtconfig.h @@ -188,7 +188,7 @@ #define PKG_USING_WEBCLIENT #define WEBCLIENT_HEADER_BUFSZ 4096 #define WEBCLIENT_RESPONSE_BUFSZ 4096 -//#define PKG_USING_WEBCLIENT_LATEST_VERSION +#define PKG_USING_WEBCLIENT_LATEST_VERSION //#define PKG_USING_CJSON #define PKG_USING_CJSON_V102 diff --git a/beken_rtt_sdk_release-SDK_3.0.76/test/test_config.h b/beken_rtt_sdk_release-SDK_3.0.76/test/test_config.h index 45fe825e..40d2fe02 100644 --- a/beken_rtt_sdk_release-SDK_3.0.76/test/test_config.h +++ b/beken_rtt_sdk_release-SDK_3.0.76/test/test_config.h @@ -1,4 +1,4 @@ -#define MIC_DAC_LOOP_TEST +//#define MIC_DAC_LOOP_TEST #if 0 /*adc test*/ @@ -78,4 +78,4 @@ #define PSRAM_TEST #endif -#define PM_TEST \ No newline at end of file +//#define PM_TEST \ No newline at end of file diff --git a/tlv.bin b/tlv.bin new file mode 100644 index 0000000000000000000000000000000000000000..b80242aad385594096e889236da262ae544e1b73 GIT binary patch literal 48 rcmWIX31d)V00KclK`9``2&7qnv|r*L1|}ez4ahzqsATNY@gEETklqV0 literal 0 HcmV?d00001 diff --git a/副本702030-400 0.2C放电曲线 250322_004_1_1.xls b/副本702030-400 0.2C放电曲线 250322_004_1_1.xls new file mode 100644 index 0000000000000000000000000000000000000000..b2c4f54b399665555f3bdbd8953ad89f0a096434 GIT binary patch literal 216064 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⋙k)ygLlx%LesL?PN>~?qR&Z7?(>)9i5MA8 zLAgU5N$~O%CZ!~`X6OsaK4rW@lyCaVUAn$)y`}#Bun@M$w`8wS+CPnXzx{j}ixf~8 zC~F1;$92V@pQ{L)uT*>dG9L@?!jZ@^w3lEaC!g>TO@@Q?0B@ae1W5h!)G3S6w3l5v zrN7b)<&&9&(iF4*)^b9gx|8CT>ckzF{)OZaU~bsMl=g0v>udP~39O7dwN*+8#Z)8; zjcr|uFVY3g+AvCd5!K?Ptok+0{oKZBwG9r9vemGD+HZMgj@#;qU*USpX#zdMKTj=Q zAzfhADB4g8>bTHwUgB8OT}1pPmz$8sUNIF+5tOr$Xo!Cv0%Out=-YY;6yvOamiSxQ z%|kdpOB&ND?Dvnbw;Jr?o@dI&YA#{Md!Uy_`_%zrmjAXOnvpX#4Ie_$`RAvkxiz^q zhr%88M`OIK1a+`UbxbMzi(CO=7s>E06{(!~QQ=3@ef2mDv?djtW{iQCHfd4&5r>t$ z?LmU@Z^GV#6{5ah*k&CzTBghWIZjB)n$jE1NBwxyq&_U3*z_}B=X3b647lZ5)@m#m zb(5gr{Sn?=s8-@$z!8kpbl2H264uT^^$5xN;x?HN+R{8Y){icReegxU2|CH>g# zl=@8&UIoi;Ff4GBg{!_?kBw5!bp?IfViuoB#=^!~PCG9K+YLcb-Vpfe9Yt_dIVmMg4zCUv+V^>|{HmcKYx+1dC7yDsvSn`DI z{`O1gN%`4Ni|1PDe@n9F?>YolYbLGZ^(iK%In=^fCcek)Q@@=ZiK1yRRo~vjw}I52 zk~tYT#q+TIkmq*6Q`&Fz;_1drDk_woAL>W#Hd}{}bwz4xd7=-0h7n$ufGzv`by@AQ zjrFF1{b=uemuh`SDUgT`(#n?AhIB33l+}uD@Dw`lNA^$;KMS*)O*z)c{5rfWhBL5$ zfi2HsW!IJKXK6f1Soa?-BQr|0V>v{LQt$e|=E}Ha&UbB#QCWLLH?u_9ySM7C6nGR7 zpEGuJ1VRLki#=*W4C&<7O)*>}o)c?V?I!U+hX0k~y!(UklPfuVBrre<~2W z!HaRmcuaq;d`W)9fhfEs9AX}Ma|z>7`TyEMgzy!U7rG6E!|*pSNo)mZJz)|IjkdI)YCfTm z4|s7*vH3;))TtN0&}c`vOru43hdfNk@rZf3GoFrYP5{|G_=(J$Od1>h((rNy2v&&{ z?HFb0f^RAV-3mKD6Drm$WBt10pfFF$A)VmOTD7ko;+!bs=(tZZ^GP|72igTw)TH0f zv>H6882{?c=xuSa!Z;|{pQPaiD#Hox5!M!;*BP#p2ew!1BwS6$Keg|}MEx_A=3<(Dzu(mYFkQ~%- zJuIV?dyt}$vjyj|>CJnIW{AvjE7|>6ky9+c6?bkRnX$ZC6CDGwZ2GpPNs2HQT7||i zDixv&v<>=9M0|+Qk^OhTKJMM?Gq~x((a-8=TMyr1?!7+SJ^1L}TCkqvm0fu*vV6MW z5HBgL$Jz|sI=qPQ;24mkB4IE3{eOK@2DSU)3sb>EjEOa;%gsLOF?nVoM`$q1>F!<BIcWrxBF{joBY}IZBM@*U&dE0uN|J6%5{_ z)Wc3BWFa5EitabCSlpDyc__Rqrt@VzHT|yg36%c5)D$Z_d57xHj>4vmE%|onk7KMq zsy8K)X?IQpypUY^k(9T-=ITi!3Y59qwsO9$ZlD*Iri+|OhP~K^)vd<4 z)>eyjMO_I1rk%+=jbCR*h`%C*s=q77mBIt9?$dnqh#$ATX8i33Iwl}}n)MT9X%8)g z^*qHjOW7xCsQFmf+uxs<%G;iZSBv#HVko!UbF_346Q23i9Ic;_Y2HPlU3BxN2F3O5 zv5uQ;?cgP4<@Y7bGAB=L0mOkzN(We!h6i?2fCmdXK@vPgWo9ATh?X8}T9a;{&=+rR zM~N&|@M2sZ;c+y_&s*?S6;*g+f64*jE=}WK$6AE}o}#baEr!lf87xZ496cP+tEYOw zVTSxcbB((vFPkL0>4%5rBM@lSeD;C$hbR% zN)u);_;;NPvYMzl-OIph;KYA{@6a1jH}}8*=xZODNY#P}mR`_n01V+odQP4|f?bDfifN z2o1(kFfoWQYEcOC(r!k&(AzQD>YMxyC-4J8mL+qH5Wia(DpeM%DXy4ojcD2d&FdC> z_d}AvG5});=zlctV95(LT~u$1c7M(7R}OPLC9(RHs~Tg{p54n6-J7bMyJRL=7~{@% zYRC_vuM)&y4G9D+!@eJ?T~d5jn!yfv|SD+8U^sC$iJychk z7oHot`1qd@4aJCqY^fA#P4Hb5ObS?;Qw1@gCN^WeJqnG`X1^$66392J0F?QzX{jWf>|oyatO!%oCa8_T_xRKOO)(15=AAqs13 z@u994)U#NHC>jW5Ayd+1WBr32`_;(@H*%wN#K>LAs zu^b@bl<*9XEeZ0G8S42oU&54{i7KSDg|nhFCOqxc?6KHbwh!&s^KT-npo=o%rENzM zq3%CgsDi%iW^A(J{K0hM=woTqQvC{!c^!04$|8~mK-o%&D-Da>zcpR-Z+E)TPgDXg zs_G+SJko&HM%fRm>-R3n`AzYjEgfrz*YhnE!l}&eYod1Fm#a^3SV&)}Tz*h|-i9?0 z^PQ8AHBh}xGU>9^X1_vnLQjrCSMBLldqsCkQU$bet&9Hc-emA9G5p`|C6%i+orw>6MCw*RlqhmIFAIas6i9bNlL`i#A zI$Lu3XNkGa83hqGsP&Owv;en*+B4n8SR1`UT(#iH-dXXTYTiIz*8yLKT7ULdq!}w8`GW%lnHyU^??&9+Gjs;{v2MdIo%;lPp9ZAEFvNmTTQC&dfqtH~9bn|Y!mTKBnBUO< z>nepp>E-q$FvEDwsJGLd>+?}?P_70zS~#T`Ptjv>EWMH|cfOpGF%v2c0qz+6N!kll z0IA>h_W>4g1!gbWel3Tag8oFCiV4k2s?3m}1sxE$7mR#;Z2y29HME_H6yc>M2kNQ2 zX%dC!VXjcGf;L9x{PQBvHxbA~Na2SpOMc%1H28N^^$W###Lh_%$132UAUy##viDZ3 z-ptTHIW}o92qlo*5$c!VzQSd@)m`R^fY0j2j|aJ&KS75vFYcuuhC-R&=YEe=-}~P> zUEv9o=AriVJKa;7lkq}>0qKA4HUqI=kDyJ?Fg}*Olt&RSQdMbjIQu-KVy#{xDCq*c z(*oxuMo|`W`sLBX-gsP$320fr)Ycf&5d>Q0?m~x6 zN%y zr)9kwB1T2GHO-_euPP{4zij#R){T@M6etSUv zR8xO*_VJF%cT@3u+0S=ffI=+8ThIHrXf%HDn^PVL6{RzRvIup&>C->}Z5%Vrd~!MWyn;L}Wa~{Hxl}hsc^NJ?Z;<70a;BY zN|{Hd0X9kL-(7tM`h?pBj)x6mWn&O73QqJ05EVwI8exTD0sZe;ZC~TV-!}(*aK?QB zVC&{eCaMAsWm9B4(@pk<+1K9Fpp_OQcDK9;@BMx8P4UOab%)PBCD>DM6+$>^4IQh%MuVA$?$Ono(6Bls8$^v^2 z>OkOC!mx>7@gm!xr0t@N+f2>M(6Bnr#)e5%;s&g(h-(Fx=3+P-ls|!c9L1&9%XcMa zz85a~1B$*88q%&7v`DppKB7PQiTk(!JCJaYw}a$c4P; zbDV6YpX~BpVC6ietUtd+@4Ggpi*!+X6x$UA80ZklOb3#q^~D6VT#a(sZ*;>#5raWA zX04*_1PgxvB`h4iPc8x$O3{eJrspde=a$#h(Fq_9y=JM>b-43(XQ7D9Ca89%!YxLD zN-C4&zcqtGlz=U+xdlOqE2f+yv zDdIR;8JPN}SKfha88y3yh&RKXEWl3lzYhTGT?^X7=KpP!OMG|@TQX}@^X;u4D{h=i z$ca=wz;yE@D67u2F+=9vDr)Ap^%qX-Tf04k)omfhy@5a5W(z6s=o2<@WO5xa8kbZj zD0&w!6Y9$o3^m5uN$6|wv{BeTs?wkY7bid)6tPfjq#)~^N*FWKq>kshyyvI?{ICw0 zpaO}a>l^=cdkTdK?Z4Ot5={bsWKKui8)F~>MI7)<;R)Wvh%#?sV`Rb$P<%hfbbj3A*j#EO$Hzq`~h0) zVA>EEpXo2@L|M3Z`nb=IL5{SkK#$|0By)~=U?6Clmr%{_qPqWA=~+jT*n zkogJt-2(Q&8o+LJ<`J=RPu(%!ywgs4|I!E0^$NeBNx1^As9<0IBJ5LNe7SMA6|FX2 zz;?}JBXu8+;A?Qy@c=;pFs(h)v>1`~>Y?f2E-2qzUcq-A{dC?}erP&Q&7vlL1 z?7z@L|6sbPgGoNrxMWH8XT)24G2Myp132Y>Cm8@1YQPVt?y#IzH%gnwX~%$Ke7?^a z1Qwn<=;mn@U4UkHjpJ%I;Hif4$Yw@kdACJR)jqla$z3k^Dl(@B_Tf;-osMh1dZKdq z?ti3-UI9Lmr$xT^7un(t{Qvh-TT>T&4H3C%v;|Qv9-WfO{{e6NtZjV51An`Bda9DG=v)97ew|@KF%@^Dq4NQX@iPO}Bn2o()GU;V^2Q1OzF#HmkhpFdS(aov^0altHZoSgQe1;PL7Uz)8$8bM7G} ze*M}o3Qk;~M$DO(;+%L1uN|Ud z9qUZD`FO;c=nqmJQi-x9?;>)i*#wIsb67ubB{gYdQ77eO2yKbB!BVoHj2i%Q)0@2B zo~Zc1wdcb|?ntlA6BwBUj=xB`BvQIH3YV{tFfYDzWmM^#rbCionx{hr+) z;*FNra-Kb#EH+A0gxI)+)4b`@ok425#UVDhATZC-%>Uk-@oJ`?VC)DbgE!My?*+vo znv8|Nqrpb|-#qhmv?r281Pc51gT3|*iuFU}IKzMXbeH_68yDZgSTk@{kNUDb<--h5_ub}a zZdY1ZLmrflGEP_W#>^Wt2#}Lcg0S9MJ~908+rsNg_H)816tAAH`9{+Fgx&p-O zf#m<svOC^YNT3^Z(d+LQkNxQD7P9<0;lPdxe_C!|wYX zv>0mvX^Qg?67lZ2&11HxFMjW_w)dMEdk|vH-P^Wg+5ojGd7g>T-VBa_HgEJUrqOo% z*}-mGIkitDXA%~cS@#_-Sr~t)vH^mygb|a3i**>*^E1({pj*w(K0F29>i%+O@XalU zLCF$N0NJ86nLTe8age|+Y1_t!JJbip^DPiZia3*TT@-Fn$KPx}I|eX|m^%$|STG|F z4Yt6#Gdo%dyLDjmbJKS}YuQ|CDo}(=_R&LYie=C|ojn3}>KUEV9rOWjws!s~De~7; zkz)Gu*rPYC$A;_9@JXuo@RH;qFiIm&73&D9sV>60QfQUa!e8B|1)uj2Z4Jqro!uT) zrC^3|j%aDGa!j+MY;$)F?2TE$Mhfty^1luPq}{3ty#4t08tCy zx2U`c*JnW4+~jSg!{ebA(vL?vu4lT}@+y8h;%3=tKhKxcii{lx7-efjzqy|npu*{U zN9`lUSRZTGLV6!!eCYH*;6>0L3O}r2%rBQ~)ZdldB3&$pJ=2V%IAW*l?cs|HptY_F zeBEP0%^@1~D-_oSPuMmn6rz zP4y`gcEouO66`MM2pn`80kQ8lWV^(Ez-imU8zH%^Sfm(eKVax;5JIWjxJ(Y*C>fIt zInA4^v3*gCaE?A392bQ?ZfBx=&S;1uP^!Y`fSYoiZd(~1$x1%OF2aF?^g5v%D1DlTOeqczDL{_lB0ot4Xidh_dge0oN^T;_ z*74x+IZ6K8On_dBklMtXvt6x=hsJ&V8Ev2Kb?8tL)xGAbEc@q!ezACmgn%A~G$O7k zT^R10lMS3Stw9%#C?JZFE3fMGk#>sF-WLv!!romye15_+?{Him;hm#S4(~{Kl6-nE zmtp?PbuZdp;9p+dNHzIre=qv6fmJ<@{?biXmV0G+3B5_AkwRc}lI5r8fbkcxVix)2 zu_||%$y3P!!IpZ&>(%dwk=n23jCaQIvaVYWMc+&O)_BSGaFy1$kaJjtBm-=?fBz+g zb0PDR9H&-&r!(upF!a-mPsL_LtS;&%F!2I<$PUm$)-!jHV<|TpVMsJ_bKD7Q9xm7d zds2#>@Hly5e&KEH)I-8I(V>F!#DzcK^Q4+~MUf_TyEierDY9)0@bbl1SPpP9L#mU% zTZM};CR0XZ#GsLQN#&bn@fBQ6%gbIezQ7x=Gl5-Tml~ELZ^pR?hsF|TU^)u1D1r;% zr`mkbpEKEbVy5X9$++VRtM97{5y5*f40Xr&>QZtJ`-BTIxpotL z#faUm)aU#e%U2Tc=A6uU987Y%6Us^WZqzda_@D;KnxHugTcaq&w99X+Y>-!BeN((~ z@6~L#unqp}=r<~Sc+^9)woV!xNITky_~K@0-=Fb7P3dY;xb`}B8P>RKl!aB8RA(Re zBy7gt6WN{@{lBuH238;7A?$v(R0B2(2qFQZb2Y=oNXM_(fUl+fHwTgE^FU+asi?m- zq@GeoJ?8I0x>B~a-d-r`w;oQz!jIZ|Xv|RdTH5yH?dWGrBAGdA68%Z5*f<8q+J4 zmWEk}+{PN*qn0Tp(HCLoC6A6O?~rfyaLbouMk;1<-%uY*wYH;GJ7-rr!A<*#;0?pwTL z8lZJCP_kA{2<-tL|6O|iCL|0sXmit;LA0}-%=oodz7Zq^T$LOq-k=yE&>scj`fIlHL!5u{2L9|zk9`Uy6! z0dDsft|8a;Surf#mQD|@_wg9I-2W|Rm6sr|;t=6@_7kMA(e)yKzk4KgkFX9Ws@?v(Z3 z6Y)-ulh2@(t$y{dlyzS3wfi7Ju`0c653ALY`nmE_vmAYXa z=hySMOB2O^l3ACC;0(=Z=w3Re!rH+)B@xg~ zJQf76(nVx*q_G^Cm7IYG)f7t*w$lQdW zgSamRKMWYg@m`g2#)DcIL;U*%#W*GZWB8qq1FDforJ%~>$JNJp79w@_!>3ljX}bO4 z3rdXu+QT-{7aU?Oy37^FF9sMxI+kgLsuIJV|33WC3GutB;gl0%3T~@Ecemi(fPGgB zuoxTyw0kz@Xwmr5H%JF;c>>K+aAG}lMbZy*(5C!4J935^Wt zeJ;GK)4~7{PmDd>OB`h0(ElXDIS_vbfb;Zg4sqXRlwWrAVhJbmF- z9a=t^Iz`zrfR`W(aDbfW&R@IFSK5 z|83})BW(=X-qSNrfPg_L_n@Z;rY8h!x8I3dwKieX`08$ihMz!I<#(W{yGT78h>C-d z`WE)zD>*s!Iggh2%(%fKY09afUJYXP;MSf1tT_XL0U*lgok<~VeC)|S#-eHrio(O7 zaaYGDh{YzI^rGVQ62<8rK(S6=jivi^=K>2&l^%&3{K$y;|NQa)+PkDVx)V?voB;L2!^iAD z1@^`%ynm{IFEGGZh(W(iIG1N_1%*?Hj`v$DH7FhgTL11mc^7nO#yqUP63yv8>+%4A z4J=4K)TWMpp{ecmpUewfC6Ry3`@Q|T|7~1?n<@F4`ETXKh=O~jrIc`oWci+G(4+BO zeYObQ8VuZ;@HUq@0~Gy>AgS2@Pk)JWthW&WVE{9p<(}vJVG_$XuMJ4(zX3bo3aCn2 zJSw1WI0TA;z&JTuGZ_8;;qMJc{iOJ7dVWV%pg&pzkp|+`3sj-<`2w7;HYWx^I%Bqb zGB0nZfDp+z;P0{3OIt%0NQwidD%CHVM#_C&YS;V#u&50HUIR7KccX{fh5d%}NTWZX zxUAF$P!O0l75TaG?Ou{rCD4h2E85Gch!Xl<48XfPV6`t~Jw%HBXCv$R2jEiPXuK)| zl!3xPzf=L)e~mea{{`Z3 zZ*<)^W7&Ja0=>eU6^Kd1_kzpV(w0L=H?%$eGicxg0zf?;R}Zs)CmSCPCw}TXppb7p z>p@3<1n%QOrT&>TiA7>Fu@MCr5z=18QrWx>hMX|)cN{un1p zoZW~>uxrE@fT(Aa0;JzI;Q2s9pj7RxO&q`>0Eu0IoUEEtESq zPt^)p&-3>!=s9+9W7wf}fN@yRR3^Zcd)$_`=nkY^wH=Vixe5#~fTk~j`q{RwP5KPE z-5y|qotpvZD!yt>wm?Rvn9mN23K899h}7a%Q`3W3 zaDRWY)Xc#0v3$2IuZou0T4I=A0x|vf2_U9IpX{VSFBLf-q=gh@zmo1vz+&?OX6j~b z{Aj#CtjFB#m-*GN5N8^5nVY8@b9I}USvUHZLm*8*xGP#+?hFW1g53QH9g9FWGlZ3V zRh}lx`+R7JA>@UkTE-RLi06OL4#OYl?!b7k1;VtwArKEffFE?0rr3zDXk(w(0(<*B z1JZTlb-AZ$eM3NQbq6MQ+ye1q1~6&>&Ip%a@w%3ld@jW(WQF(@;i9y-ho<{T2*H^X zV1Z>1%nyNV;P|8GJ0RA`0>>&C7C`dc3xei>l8k?bu~g8M=?s8;_Fyp3KXoF&8>LN` zNZfqDH|1Kp&b4~b{_zkFGPKAZH_!oH$oC>_fN}>?3CP0W*kJFkE7))zs#7)Y1F%}6 za8Yb3m0V5JFaolk7j}QrKl~ms;{IJ-cTk;n*7W7?n3eb5uwC60K?Kp=TWI_bmhiC? zm`Cx|aPpDzGoQuMTl4~KJq;(O)$~{KmnKL4?{tMj!rb5J!ma=-5zFX3N=Jl&ZuZY4 zwxBf|Eon**^W`&WEkVPs7Yh;-XQGU$N710j_~tOR{{R=JH! zc2^j2iB$sls?eLE?ar>a%2_o!az4q$#z=w z*FCCJ4Zv~vOYQ*{364AP*3f~A8t!>WLPiJDV_gp_ZV z9Zofwth`{}591o+o%!E#AQ;@CCQRLmK%(tcbc!y&E*JajgGn78DzBM6=;k*N%%z`F zl4(ecw2t@OloVyW3?vG4vL%StkXSB4pemklAFFb#Au@|LRvbl1%Q+VlfgIC1{syr zE@g}ryO8NFWpZJ2o2CD(;R$AG-0q6O0|)JSy?@TTDleUe{s#fPDA zP2)TAXt(UD7SnUx78=23-sM`@_7)pTkH7pLb6h^1WodMj@1(f%9goon6J0UT4mCdA zdhNn;P*z?WK^|XV9NVY$%paQLb~-G=`o40qb)Ciz1IXpDW;ET=;(=^Z~zXYN+u&7ykYt&or@8Qqwzx=&+k9uW^KdQnpZxa9>z<|f z0FE8j__0p2SP86Wbas@i#KMgq0Xp*t9;9tgUO6y`POXiS!SL)L$_Yahp|~1*(=+x( z(BIF0WOJR=%G{aolGLluX?=PHt5S?9r0pAXTzYP|c;iA2`)n$#q zF_5o)d6}6UZB%b%Q23z|gxNbNef+eFq)J2XKx-^dJiE zb@O#B51hR<;{?Tyk&q^dJAq>d9p%l9>T%qI@}t{q3QA8{J0M+wP8H)w+PLZ}{e}BB zuNjYDy8|fSl#cZ+eDD?*aCRAczCd#&Ed(q|By*TxPWRytCb zcPHfhX#V9zNw7a4|JX%jwL{mCU|FfCt^k2ec@OxYRN~|(6YOZM`*+$zQ{023DZ&@B zd-&ruDTcz=cn)lv7;$hIB8jGfID0WI^^)--2KdfwN4^`UjbBE2ToXz_Qsm+}*Pf*h znxnto0e0A{yU>0A)jB?OI%C5chuwqCQ}4*2~I_J@&j4a)lXZ}NS{zFbZ#+%tTN1f76- zYVzx1pGP+;BLOI9rYC4D>E`S1<0A-If_^MK>$uV7nST%c8neC6)~$~cN?Hzqv}fu2zHpmJsx}*xMkvuN7g@_>uI(KgWZ>dZ z3Mp<%G1|FkmA>hm8)b>qTHy)T2viOnfu@E5^C$M@4j}F#)xU}>iy1xoL3a@Mkn}4X z%s;t`BQwP+W=8}~$>g(FKWJ2&h@HyP7TAY@+XxoNSHO_dBszOIc!(p(FMT~x9GA5H zYe@M+Uify|=3(dZX!vTcTchFJ$$QC2V4M`KgD1CjUW^D=vQFg=l5X@W3{j7I<`$L_ z40}W%Sw>j~0`0MAko}dBp{&^K2ghT$p1mCf-23iuNPdpF2$4m}U*|KUc1Mu*V2)B- z=N?L8IqPi?1BMuDNY&USa3bnnkS=r}*E|S+1I>?R$gtx!Yd>v0YL&V%>aDZBW}8P# zh<(J__X+DV;0-^#&P&AdRC>}Uz$?OBt)SsT=G0Jo`IA>F2Z`24h|wp%wk*0!!B`dR z75=f1PdjiF5C*q11Y7-w}aBrd5$8G?Gz|e=%eM;Dmr&5uMHtFe`v#d za~^0&9MFc5*S`4{Zl`Sb&r=B4+6*h#bdp@gVQI)+Vd&QG!&6>@z&i4V@9k&aZ(*yw zWAnYK6RU=@Jo+mcyf||)U>pcHfgK13_tk|Jsi^mAJ%!&x9ukiko<65uD8)UICJh?K zuFwagp$1-u;}#Lt^ns+%$m8!^5{5~2|5qS-7V5`WJ7i11AEA zlvj(x5uX@@RX`m0*RTYfw!z}agateev_sNmH}vs6G%qFLqTBvh zk>7v~em&i z!z%>pCx-6|L7BaNO^xNpv1_e{XwyZIN=7?HyL5=p{ss`-QfFCX7VCyOqBymz>$yPV z*Cg!X66*z{79S!Vg+Fpjo}Ny#e;Zeisv3K3tr0E=!+vQ|8MzWZTM_g-ok1 zY80vPza*}AdmCEkST6tkX{mcW*Re+}Vl@wYoCeJdH7w4iLac+L(8J<($oZ!~3guy3 zXG0EIg{7h10~a%g(2DJ(FDMbxmKu$V8~D1-qhEAyr0ymAzO}2{pOS*vfx6W2Q~6}^ zl`7}Y2+h*)d2s{8S9h(4cg^-4rp`caj@I_y0t z=^T3}QEU^2f{1G0n7m#53i*E^x6%6kutsFO3GZTU9@2ETkn66OZlPEhw%R8cgiUWS z=dExKIA&F-vV7H$(6cu)By2wJO7r;UilS@eK|P{j_LlRk5^lb|uorg|Q3~x^921=c z&o7#SW)UXuDR)aI59%Q0#yO*wca&6hxDcC^Cm0r6FYJznXny zwh1~hFiWaeSl;kmEIaRe*xxK+&4H8z6nw%w?U>31nv}iVEmm>nzk3Y>jPzOVKH4`> zz!`Fqdl&3qelK*{P3bt+;udf9vWB=a=ts7E~whq;kXscfuz)tox1xCQn?)U=0@ zz0W`4{=^x`z0ZxWe9vzICO^>WjkQBLxGWAxJw?h4;RfvVoIs*NVPJA6yB0UUHq5D zwWDy%HO9)@Pb)4HB4hTSLwAKwpIa}N{RL0Z8hqQH5w+D{&p+y+oDLP1 z>mPCpByDYGJN>htIhNw}_R@fh|xjNa7VXz;v z+QAfYkD#y~opB1I39wKLOyO^zs3@<-93@j~>ZbxD0TAuwa0|$0JtUJj9Y$y&t~@@L z=^z@C0ue-ss?9W3gDCGS8wZMgmhr`6uT07U$D?ukaWecdl8==?^YV1L+8|uK0DdH< zxHX$w9D~t4mccmuG;#tq(^`hu6C_h)l3V4Ve~|{84SDnvehy7FASo3O9YuoD8!#q^ zAePi27>+q1-~-Mo^Ra>RqQ<8}yX+5#z`e4SX!q9hkt4!|ypW%JKbBSVcwal6z&2jMB&J@`}h8&ec&G&A^WDvM$6PE|w{?RvXkfdPvn z5C~8k%*BpQR_1~fCXAVff@kPF*qbn-*%v({5_Dpv>A zRh`5;+r_ZY<;Ij$ui4c2w*y2_z1|fLx5kief@+lc5o>s9zUN$8CfEvS&yU=|LiB3>Pg$43zv4uVSt4hiSRA>au^ldvV4mtU5@i2M$I!wXI-(S zGa8;B{HVDi=2|GgiOXd-OV!6MJX}pPo6KgZz@OcT=cW3xH3bbuF|w>c4F>G?7D^CX zeR2-lWsN@kVMC@%|89u|N_V9M?Mr{hRLI`SQ17Ludo9x3g4X4x=8Sr#rR`hn5o&3v z74<4|G$CxM&*Uy$A2Of$`PyrKWB{Xc2me(3;V3?rCF>8UN|4jg4QX9sueZo6MeaNrO2nETvPXg~DrHH)q%qlV)gY1IF_U=)svX^Y?0RR9JkZAnKw!7z}v9QH)uDwz4ZPcjw6qoUhO+ZXqM+k<|m$W?pznr zSn?O)Qs&lp$8{b@uRr`$bjjS7D}Q+@U$Mn<^NKP$f-4*U$EuXljl_@e{V+WLPS~W@ zZR{CQ1Iy+Y<25;?1?`;K?4!Y9>J!ubXfeqhu|i^z*Kn`;3)pw!glcdhfB1 zS`3PpzfG+*hp4P)Kd4-OafF?l?O8oewdO_~n2VM;^xUt&bVW{RSWA6J4=;fL7f(Zs zx47{XUah+@qOm`=K_=}6pnLX_{^J1M!IJcQ#el0V{)pcu*uc^rY&6zWN&B1YO#_kP zc9CBNE`#A+)i}mRvA)0W6MSvQYuM`YI8#yI{twy&x*#Ef@B!#MMz1;V_wt|j$*i1i z(O)#)p_<=?i!xAC1)$w0vE*1bH7Sw4I=C*B0kcqBLWOU{EGF>$32AUj0^+M4Yi1+o-Qqr_c9LN94&7n2DsYmAelxcW-5SE7e40?QA1L@@8!`Cd}vMC-r_V9Y;} z2vRFhOiEk^huYoXQ=1szCCL2&D3OfbS?$Z}J`y62{s%Ja`uS79>itmrST~>TE5r~& z`0ebZ{U@BwKy|IKZ%;A5^qOXJ4i@JAnzTjVx)da26=gEB1LL5A#QkF@ zgnRfD5%IYmAd*E=MsmOC#o%$Bc_dU)HPoJY$y>`2E^0-q^4*a7K(v5rFdrGQHNyjf z&}ErfODw)^?wE41ZI_vW;I5_Uz}p!5El;i2bx6;X+#kT`b&cK)A~AX!Tkp6o0K#=7 zx$9H=Q#b0>cqd@+f0Y_y+BN@(Gl<6&u?B$n*NAAi9)Pia%lyJsDGXqV#pH0l^!{$l z9NF}t!J=euu?4P8Ao>dTC2BR~f0i^ix~OtnLZ7T{3Q#L(EcPE#SH+iZ0B0W27iYA5 zJk!3~+oPl)qb|WbKTMtQE*YbzxoD{+^mmAOZAnY04u=#dFG7tZ$U5M2>EXm^H+4IgUnPHxh-raXQ15Cm1wYN z8bnhJZwJUazwixb5w=+g=gk=?LTCC0fASrmoy3tnTjaD)17fhdYldP?xape5a{c|- zYk-Dk2yA3!i%5~u-_<|OwAlx0VpJ>;W;AkD<+f^9d;f$Nin!*#GpBFT(*Dfno18T+ zqW?fvTOR_* z?X8U2UK4m?D)Iv$?Bs3c>s|3)f`l);NeW4%+v0Z|{|{|v0#(x&J^uTOBvYsikqSkn zi9*C{LM2LrCP_+3B}x?E6qQso(4eA}3~7=|NHS9)L#9YVWtE}<-rc?TIs5E;=CjYaTSf-pSw!h0VAu)s+G*z%2VJ{0F&);i%@(cJ{xa1K4&vS- z%WaU|apYQG@!GuxCmvjR1giqSo~v!#>J+bb_oDbp1EX=b2IMAwu-`s7Hv+aG4jZWa z1&&Y-+dQ>i{ldXVWeUsJP5U0`{&-NR&cL|I6NUBfY~9;%G9_?n>y%^n9L08hg(WfZ zCWB3<@j0k47agYDYovdi3!LY*=Ar)hnB5vHf3@Ny*#LQXXz*Iyl_kFpjoswEvB!Ow zRj(0uwz%b{`@Z76!smd-iC1LC3hmxj1&81~yg%~orbd|OI%80+svtBnyb5N4zCppw z8RDTkVC=4AGHst44Ks%fw1xBAdMZi7s6J>_Yro-snkzSl)Oy0Yx?aehMf;9O`5kvc#^XGVjG1#m{#(JHhl=+c+Vdqxl~B z@H1xy?7ezP=o1=rEpYcT>8~S|3hV(6}l^7gacDi zPG|FP4iBq|Zwo@N?oF9xsWqNE`afJ;nvhqeHTl4GJS`mdt}QgqdJkv!K8FmG7+l`c zB69r5+1kvJ4sW6S#T>A1D|-9z>CU(b!R>=vu0A}cHQns{sTJjia~(QHbzC`oA}8W3 zOx4@hRj(efaQ*u5=M%sB9vxTtr2Y4k0UP74EmActEJkPe%epEvrFFKq;M$Yj13UvV zs~r~S46ofrzn~|-u87fWBOa=H=ktPASXX_E?ksQ^uoG@Y~YT0${YpAHd#^(r|GphF=tSB6rs~XhM z+3{lL(C-%$M_Y{~*j4qs#x*$tGrr4G&B*PZ8H*lQ4uPf9dAShuV z|4W6Wn~`kYdKwnXuJ*>A>;E2@y6D3>n}*TT!Oe1VgV#}oz(S*B1voq&JZ-!{#pRyr zr@B0s8o*|0uRG4E{PNIXFvPmG9l=U;368V#(%w{m~lG-y1_@r z&uBe8+fwlsoCSLQyZeFN0iH^qKkaiJb_(bD(*iRBTZS!PmRel_-d86!h&irT4vZ{K zJX0}Z{{3m%X@SqLFT36--uYmbfDOqu{ii;Q zgEiu`Q?D}HmpWPW5}m&}Denk3yz)PTyrIcaQZWa$`p37-?sGAr@tk$2%CcK{)N8KK zp}j>O=2{P}-%WU>>o~zBap!#9mD^V4RnU`oQem|XwlG#`z}n!T(BXJBu>Ak(f7tI) z+;nQ;)q~Hsk^6mnGdEVV(D^ky8_`#{>iH=ui~-@wtLu25iRH%rDB7BKZK25wx!=i9 zmM_61K^qjaIbL#CGpw9pa3SKZG;dnP>f>^F;t1}Z8N=}(y+w7r1gws(-~S2x%1(c; z_>`A8&|shQcGv0}lS3_Vj_2m7r}E-Am2OeHHMvu_ydXDJIBT~{gxzc#^IQ1h29OD-SP}@NZU-0{ih5hCc z*)WA~vGk3~;j48rfzJl+-I4a78oWT5hKQ$@cV570gMo17XZ!6`og|ndi5=iznPz@G zPZd0yK4<2)CQRP-YgLEkH=WeRWqIQ#+&{P>^S9`+hpVHvR=@fVhsR=1K{D>@3RuHz zGerN9w444RP}kkUiC^QK)3tEqf~r}*%b@?Nr=2s_`8@+B6V+!2jJLzXDmEHVp0!%- z^pBt47N74lEwhoT-R$S;lNM%c!0<{Q{h;I%@XQ$61Vs z|25->2QC#Bo!k1!s9$jN(1^moxwCeSYZ{jt=_GkfqG!6{D62uLvsOjFnX?hjdSCu+ zwCSj_T-kSeqqM`;K}*6N-?F6E)yrd9f{ghXJ-KD$owjRw9BFNPdRO|^6wk;{7V{m) z|L#-yqrOx1_vUjyHh$Ogxe@fyeXESlGvlFcp+V34+V5`>>Qr-EdDYtg={AFg_2mh6 z*6%D$Vfp=tjH}a%LgeWUwm`9t5F#@-RpBbnh42p=)$$VOsvjHBiC$ zjQ(-oA1k(=oEGu2GYvQWC+WEES_@rS)#5YK?r+m|Y-PXMza6qQ{^4!spWYiv$fx`E z;RLLfuRJy|LvF?O=mopp#(N%_u%QqhY!0)eI6LA9k5$Lb(|7H*K6wc1xEX=f3rr_m zXxn!rR?p$BCp-b1KB)v;C6$)%z3ebkgp(l%6f=fMf36 z4%Wo2XtIIE$oorjp4+gZg$)_sj^=@KW@hjc^xJOrUhicRQNF;@{l|mp4e@t|R<~U>)_`+MwL4zzv$nI2 z+Yc}3n=#XLiS>RXiF6yc#7ad^<=L;tNDsPy*%DkEdQ48s+A|Y8Uk0hx+juvkPs*cc zuBBgPKe3v)`p-$*9XE_vG1jibBLJUa06wp~kG+S@hbHfQ;mDOwTxp5@DmX?n=o<>V z$g;ML9^PEL9_Ao>mM2NVB7*jl$yWXF_?V`?lPW%Hp$h|?#{>uUxi@;3-QUmkgK@@$ z)l)1rixdYh+?#0Y?m()q9zq7`fuA+#Ns($oLMf#KceyrdZ+e`!-}nb~9+n>UypHZT znLgm}@g_oD8Ea8hL+AX`J1&h41=}H?_4)2aj#l4V1&^9kZXEUQwVvk6lX2Gr@M~+) z+2N6U#_0Jyf`)MpMW|MOYYvdB%dS=4d^yuDe(r>pYr?F+l@6^CgLoeJ7DsqdM>CSExOExdh-~G-WIpX&k9l=cRO2iWzWm5@g&Kq z;o$6eH0~-<`rJVDO&h)1>rJd{i=tKg(- zHLoQO7vpOir0yNP0koIPVYvNS1|Iux;prk+DGKzwbQiX8&JKcuYFZ}i{%ZAW1y`EU zt+4r{wCCo%wH3GKPTZDK!8shZw)hdAgcjc`7^b``AeU{BTK=SAQ}E~E_!N$`g@Jd{ zMf(oxk(zpY4YM;sOFH-Q%YPu`_;n zfDcaG;LB@<9fgzTKEpbrsmR=YG0}%}1MAL842O4Kxl^W48pI@&d%rXw*|rr z2rnVLg76x`8whV9yo2x_!UqVg5I#cq1mQD;HVEwyzCid2;TweS5Pm@T384eRF9^RO zbV6V_pbK;;^Ah#?+;!x>IIf4DKZERsB+jv&a4C1cbmE!~=LgQlMG|^R%b>Wmm6+{V+N@umKvz6Gyk@9$l%MI!+bO(Z6uF z*>%pc|0X|!-Pa%CgbyFtqFwE$l+-7_S#J%Ct#8)1wQisGehN6l{(SeYw_>{ayKzct zk43zNw>raFQb{7)nCH5qd-<;U5S3~IBjYEq7r|lilGor+r*yU6#`4kbb%S%h;E6t4 zb!%q8Ks~G~!Bo|_%=^FC2UQg!-*097zHNW#P;|BCxUb-J3+t(3uP!B}?mjkUF^nPG z_O+M0M?)Q4CntJ&OT&*nC82=>RomZ#hwkh?vz~r|?F(8f@AW)BO>Xfed#>N4npMFt zou*aTo;MXLcGwDv3%>auT%}Vciv+@kPT5L0VSmT%T>+*2HnwW+E~zm;@?y;<-@ao|gCk6<7lo8joX zJ|(&R3V8fZhG#HoJj(QPlc*29KKdk9mx-f&VK>p*SEIhec}C_ANSw)zAc=6S}oEA=_WPhf$v| z>@_O#4u;iChv{#fJhs1bQtLbMQi|y9*eaNOaojl8y1q`PDYCI=wmfZk1TC{9N7IpEx3fQ*Gw{vYRre0yl8?e{kcXR1>!X{EoEC zuFX5_4K6b8N>tr8!rnSS=+c-ohx0FN zD=VK`76cxOE2E{a!ep+Gp)>SsE5N!A_dnZARC}`xJsvh~U3ae47oT?qTkDHp_Uvfl z(rabJpLm=>$fP?abM3EI%zc60pHVw%%0jD7f>-iSiJ5tcOW((r8EzZYZ{KW@v~zQN zyf);9aH_BCC?D$hVl%OD&&Pxo-6L?^Sa07;xohEM1Mh`Du2(O4eK7%^#$`NkZ@Ki( zjQ{3AlOIwywb{Ki?}E1a%9w2?X@*~5@bM6wbEQXW{hOxBk@JJ#3=?a+vXY1a4h|2+W{q59)exj~7Y_t|VHwjD zaV$|%0owMj^1g6t^z5u+@bg>NI1x7X!>-r(m*y`;9$qS180nL496xvtTiLMz_k-l?j70Cbu7@cd`?@FE&tztu zY}U?$ljv42FgKh56^LfqCqk>)37cR?^P?ebCbL9(vq@@AvD;1(iETX)g2u*T;mA+qZhHR5_F?cTp;5PmoCE zT_t=7ZyG#=AT?FtHH-o{(Y19~rA0N)=K6rPD?PKuOYMSF8KxZ4uRYze?SjdT(`&$G z=_gDe^zty$P_P3(i#6V+Yj*kKwkYF4si`Tmm0d2Vz)}6e9V5^8n|x*0Qv2^7S`w83>Z;WX7NJ|b)SuFc`tNZ|Q$zHY)&$n;uCwrRzy5k44Z<9-Z zA56cwA;jijko3(hwYrXyF}f-1@4Y##6j?2HtmV4?>)d@i${t8aFF3wsYCq|l;Fh#< zHAlBfA23Xs z6>2ZJyS7hS)AMdcuVgql`JKLVyphz@H+e^gR%jOrL$(;YwXWZVICI}ab05U)^=u9i z?jM(|;w8O7Qr7IPjI{YxkAm#iZMoUD9}cRzx#I@wkPUZktM~VIZp8C>VFGSP`zNSn za$b}^)!X5nk$-5w=E@E5aF=nZ;@JlR??{-9oKu=;s=fvqPpkC{lW@n)e)&3)7To;w z?wjQl9ERlezkFJI*7D#qooh}7)6coIeY$o12t3yqBDvPXMf7WwaUJZ2m=V@1#lW=3 ziTbxSjO>tHt5N z=#i*DY&zUhJdV$I>ce~XomMFeN~T=#dvnS5PBS{EelA-(dK!*o@CyM#?>mH`n6%7$ zXK9O_o{&hp=mmr+h zw&zvTX#L7hnth#AO>r#X2a|W+{R>7eeuD#4)e9p#cNT9pkP6+i)G7W(ere~oOEdf5 zpPed;cbX((y-`Z{=xjB8N%`m#l9?~5$yn&l!tM zR-5vzDqGtCT%My~rFFjQ5e3~d;FLN>{yQEppfGyYj<^e3!4*Abr})(s`qwW(cM3KZ zxWULKPy1NK@v)BX9lO=TZFesS|8#U6tXcgOl3()Ddf_4?i(6JLlEw!1FJTkMG2{7T za(|s0_1pRF#fA!-CVVs#&H&>o&u9CAo95XJY1C-6y}F|3xjis#1ny=_hdG#mE8Kz+ z-v(Pe4D{<0)?E6l&R{@&(o5Vlh(jIIka17HUfgb~?1WA2xy&cIr}X#3lvwz#s>x*o zIt$B8R?809r5Q1DX}m9)5&cqbzvFUHQ{IQf*j3=LB9rO6?7zYh#$(sZz4-}FMRt-3 z!b5znX5^gB`*5RPF0uWTomyP=>r#c{84Hr;6vGxD>j29n+>T%f4-9C#)4yTy?@zb@ zf59bgwI@#Kt0&nlB2&eQa&->14j$6`{0sVKbnQQRI`AbtPHK9X9o?1$N08JyjCHod zEqa4OPvFd?^w~Tdwhs!06E|A&2NkK{hRUtnM>tUJx5Neu%~mc9e?Qywww0nM>-u0Z zfy&&p@#UKAWJ&yhym=p-!G-4JQ@S)6sv7(TZXPUs zqTS;|DlDHxG#y+$XDb&rebzR_$Bvzb18#%iFpVVlYu$9Fe7K)47EqY!{v7aZ>6Ll7 z`#f$|reexh@QJ|gbo7gFF!iDfySog29BFAnb7c=4`lEI|OtD;r9ueI4ypWeN7qY;K zrcS@lljd)!bc1RBZ0DB~3%#-vj>1uz_hFK8yJIMv7j;@?Jsdv~T`?b*Sl$f0E=AT6 zhBhDH;%1cSp)Ke2yP))Q+g$oRo^`ci>;=5w_|=} z&)fCf2hLi=`39-4LH6XR4u9!`t{p>{>hxLLE??uuWI}J z1osJCR*ixAkZrF69tYJP0f&2Im+ub-eYClE1YG&%>FBK}hk^V4vkso)mbqMRd9`vu z(!-#vtqKVrf1q2uL2=JZ8E$YY=r`yeIT|P`SGd8%*v|aGoJ5;XmqxWE!9zvcp+4XF z^S`Hu7#8RPKT{R%ALR4OV}Y%BkGy;J5iED}UHRGi2D=Ea2{?!l8}S3&>aaM9VW z9m>K3ho%NO)#&y)W&37#(Cb5$Iw})kb3!xhvAX#k&MIB@eL5^!Xo**oV_*h_ioxe= z9dy3I4kc}=88{X72Ig3jKjUN3V035{KGcowxE>x|Rp$;5F;1ipF^28)S1Q_{R|W@B>UZbOo};MW0vDXLkKO zyQizH*a+V$&f6T@r;lKi6Lo*M+rH=3;Ix+A0ypG0ROz@(g#JhSL%nhzu7d@XS4Fex zJ7D%sS^dp~>@BCpm-aMh*hKlfvz$RFY zP>1b!6D99nfy=5>URUq|UohNT2^-opKEf#JI6Rl@e4&!s$YkZ$CBHIFCoR3`783FF zcsd+-0_JOh$FUxPjr6rJtAD~()>HcgJg1hqyr**D_ud{i-k~peG`L#-gp3C#yA^uQ<3@YonB9!Kay(y>G>Bv^g!_Z`Jz7C1!mtj{P0HEp^hl+%4g6!7&PQ zLB~5>K>6Vi2z_94={v0%mu&FS!}j0X3paW@47%$p(JADR9U*M-`AL0C+}Tl45y_d#5h$^{j~a2^&QvMppSlFRG+KeuiPJ{1M?VTdQHpZNXkMt36Tc zw!F)XsF-LQ)9f7`n7JB96b`2m|`N2AMxX>V%W7kLk6#Vu3LxO1Yl3cY5&H^iixlfOxdkt-vHI& zH6qepnXi5*I^C{Iomm3|t6sare%3nOswqEv)_Ta{J8ykFb}Ei7b(YQ7u<+Wc`=KgC z{AB93l+!v&%LA05s+#@<{+@Ea-eB7osw3m|jk%A-0}V*CXdn_Q^JqzS!Zes~*ivg* z8;X^|TAU9y?K!Kyeo?H_`ZR28;A3u$a-Ta^%VJBj4O^P0mNheQntClh-1E_Owe=bB z!AFrW+dFwi>03X*`%i`%CUM5hq{c+4{Ol3y&*{7`XuESW&p)xz^1rE#=Jk)Q9*x{E zY~3B}we#C^M!|u?5$8K)%H7^?s9&4^dfK{DtN-S=PcBL>{JlRHcCs!me(hr&U;xW` zA48sr*#*k4)F1h zANZ&=sNqM1kGh*VI#*7y=VHy-%OzU$91g+zSkFrLhv!7{E5=pr4yqo1;91DRClj7L zm<-DaHvJd&n>v0lWHts>hvdq*qq)As72Ww27NhTgVwBUXItmzHpVX3maCcmJMEyy%MWdwFU3^VKDecAAjUTTEv22!A~>()(uG-9dmE=` z>Gz&b6j)=s;!eqT{Y%PU** z9%>O>QM^4^YtG3g$4`4IB|r7?jaM_aei{|DEPd6*X4UxVZsi}XBlcG2pHHm5<#}j! zb4Iyof$U;6@D}~1#F?+5`pVDb2d|&LXJm|d9ppoT=^v=q?SfFeaezT9H z#u1t_vYs}bMJzvpRJvd>@p>M`Qxi`<)Oc^nLf3xbYxTs!oYxejJ(`Z&) zo)Pun8>ha`Bz*VxncK`>-H~1bNfovxdnt*gv8++AOG)~I1ZJXiVsZrEQf zZ{)z#f8F>j-V6>2mF&OwvFgX&$_9lil}FU#bKr*C$H&xf9=Cg@#qpSo;+sa{BZfT9 zN)Ov__B`LpR&&?ajUn>E)iZ4yDn>}v$)t7W&)>c;B~sbDL*to~%8G*zHtH{rE*@v% z5}9wJ7G#lpttBgX{8BfIw!wjpnoVK{B3&vb9M{^hwpmKvJFcfvY*1wV^q8j$)r1%9 z8SK-3{(H5Fy!Ez`kue))_)_!rN2&NpNAo5g zJe~Q}WY+lu_a}_7&Xz1VIK%ki9;@31E&b+w_-br@({R=3$nkbJ=$je_FT6*AE}qjxRy9ijFjE4Om>f_)?2HMC`B9#Rrr6k+LNQadVe(b#40 z8=`ue%>4$Ag0mZ+>nRtOan(GfGasfJX!>2>tW*_UVmu*18J7Nk-mJc%`na?DQK#~& zl<&hew;PBpnOI+5yXe`1EAJAMZv=MsdcJ#I_BvBz85OSHb1ka{H#P6~Ip;n$e1-Dp z%fg@V)YGNy!#8QmsMP1&w((mvBvQ0YbAH;gRjXhde6eT2(Fes11}mMP>xHxq{uLW~ zS;?$-T~);G@t=>(pSrL9?eljlgx{#;${ToGh*p>Ie>Xih=e3-<%)@g*3vca8G7)d@ zTUH{uu>v-SOmTWzynS}5m3>alm(+%0Z8g`%tQ-2S;v)`N$!`}b-oG$0tbRhcsCk6b zhEiYUJO3ql9l3dahQD88tZC5atfGyw{Z_YHX-Jv&G92u7P(d4}^uLY&Juh(tjC6x; za|8N6D)=lrTM-x2=8NsJ&75)v`bTq4IEuZ^>^E?FzEZPl_1E&rStWI97Ri_9TlKI= zjGP(Y|9Gy=zCgtfmSZn0k~?V>jt@_LVQsVI^sV5!Bj-0~Iu-3dq9D2`{hKeW#=VDz zupPFWer*slTWh^^{5$FM>V=BWUA!zj^i_XU`lWqY2D68w{6&pI56U&W28v(k7$3nc zNxoB=H(ht{!w-qa7A(2qbX!|IyLr*I6@a%1x|pn2<8LZE^n}YRA$ld-~kD zu{W-?;i>$QtWQ6}H$?}HIH>M3=JU<#Q(&88pkr+HsRDgD>F_=y=Y)G-Saf+_U}4TT zPor0ddxrT1`Mqe9E*Wd23#_XIp+OkNxtoVkJ;9M{HlVbUU%;GolH^qzO*3vsn+ zesp+jgM9$c^GETlqd71eEbp0H&Oi?^D38}I<fXQ>Cxf>4kw+$6N}f9yk5PdEimLi?i7^T5MaIDL{>vp>Mk;8Y5UPx_Q;n-= z6N6_aZ;|NT>>1tjeU!iFDbAAZ#aqFy+5;cvo!BNC7l2QgHXiou%lTg^6p-;CV3Z%6Ql5JJRtez8#Op-Hd(~FAAPd znk#i*K0mcPI%LC<9=1_JyMp%_Z{Khwr`ICG`0E$j(SO)SU zWBvkVom{Vp(TYNeI6E?afnC8#@uKBruzIsVE3D1rl=QD;uaE9Cf9}dCd$_s=MkRB7 zzRwvjcb7UGY!&Bgd`WC3%nX;?RyW`@S;0Ne9f^0`Ir^^x*UIfU^{z(`P2pvV)5G5y z_zkSu3!?$2XUmcnFDiEW@z5i|=LsAOW)CZKsSTU+bO(NWjM+1Wmp$R3=x(A+_|R3jFD2p*-Brx8u_v1s2Id=`6zpiC=S`x6Rom1*n1j3MCf z2TLWRT2}=RvBfi;hjhG3a`3qiBX5%>@7}yt)Ud0Fno3O-b!nAwPP8$fm?q1BRI#TLj@f}t9;;b)_6crPjx)P`ncEX za+UC(aDv+B#Je4^$LmGd(H7X~Ty|MLdhX0$Z5t;4oRNaVd>mXlzQ`OlBUM!u&aqkb z5gd~Gy$^;hgQr9~o^?R~2UkAAek@^PDPg4>3rO%ogjB&9iN z&Rq4I_m`#RpZH#7aq6srwBZBTZoT1jr;PlpK3=b#zPY%b`5My-Abjk&BThQS>bxG; z_z_l$(}H*S;`IC7$q#)EG8A|FC*aVi1CIGNfA9lF+)v(MjSj~`WSxa|B;{bqoezX( zz}m$0IdO~N+(oCdj`zRD_%624lsA>!5~+CY1w4IVTuXiKqiO4MO8K7@pR+yd z9u6HJ>i>?8K07JdS`#V@6Z1`ems9cdl_EPk&Wx7@O{a#cWlh5c^)Ifr3v=TFuN=?X z!t{R!ZpWu!T41<~(Ptc+NB;L7oC)BW;p?7+s}{ht45)Wtasw=RPk8VOoKAbW-2G(| zcRmeWNhO%G2QEg-`%4UbY#5S&-UQZ-N$@!G#iIG>FaVi#g|l*gNkVG9?1n39!5{mC zC$>#F{k=u{Mfk+v+gC21J8-tYWtf-hxT<{SmF!$AVO(z)RQSBK^W?rUQ*M|nOkdwOb8l9y>kc!im{8qK;(hm(h{z>{^)(U= zmQR642i==kt8VbpT4huAm>*xpZJrYE4V&Md zB|IX<#Gqr?o}5s{wcyjQJRRnSe&X56h@UZEbTJos$%@%w$6F7mg~SbVSL*=NGotZ)n>Q zC44%2=?TllTlcncB%Al!O4hEJzR$koB+UQDZ`8sg`qqO(f5 zW||-5!XhOed^K-@vy!%_2Y)=wd^gg#E%7E;etdm^_2+$JEt0OOtCKjwM;6BRlYBER z(>Ucqnf5KQDOrP^gkT=cH^pE|y7blrCq0<5lkFLxu_x%AnP&@Uc$6U>-W% zHrBjfbhgP#bT8x76puacY2PPmXi-xC8Fz-P9{lq7BkdPb3Q7mweodHL6P2rA0$vc+ z;zb7G7dn2`6zmwaD&6eBoHU6yKc@I*b;@2;d9>xg)uYZ|54<0;BurfH_2xX|`!lZO z-YNfmwujpKnFZn%R{G;gB-O51c067r*JrfPGnw;)dTzKdRO0-%N1ukvHSJiS&mC^m z@AbzAMa_%7OY2S654|XTW~Qx$?kcAz7Ck@Dn{>ml?M}&qon@YiRkNi1C#MYDZ`cHr zrpG3o(q1vq!E;8hcV_q0ojnT;(|vyS*E+fB&GPsV{i9wtG{C~k$8dA4(Y#k-W=%>HzB%Gg&^M%)=vmU}k+>;*W#W@GB|{i|F))V#S+;C9=1oBqJ3 zW2|0XzCBgGf6urf+jUE_)+hzMP}jeu6#FL3_l8wo!Tiru1B+cK=h7pr=QMv@%#AP-0IXX z8(;W}4|&zA$i@yvHhq;w{MTFWedVUe4ioj*gq_kx*3W!i*gAPz57RC`997`O?di&p&JTu#CcI>_E6Y0J4-(Fc((h)V{DyM$7)G>;!-ZEaBlA%l{?iZM_k}P70yx5ncQ9N|kDd%O6#gf~ zaAKXlS_(6q+{J}{UoGMK`69O!@JDNno;Udujl$y&*W=;O7q_;=9t>xJv!1t+h1MGK zHrf*3!awbjeKvOebA}s{AhY+MkBfGCGkS~%)4P)h=@&7b#*yl9+!vMn^S>@3sw~=R#w=%iAmT27DZ-C~PhCo>$Z{SkZz!|4{?J!Ty;(k#}tkTEGW|`tt-`f8Tp-T4gYr&z8OqEQ7Khi6b7yZLPhUo>V z=MjNi2tMSF%s>h!Sn$U2h@OfeLg@kM48DT zafj-}{jV=Tb_0LiPGQ6UQ$8)?(?5dc#K3!Z40z(|_vSD~LpV(3SPs)Mk;4S&bC?oy z4pZyIVPw5IjQV;GlOD-oM3Xtpyc`Y_a+JfApW!g~u5*|fjU1-#Er*f#$zi;D3o&^^ zgqYi7g&37WyIA4v!mI=>NLOXki}+iEfHQ!| zFjN04gCus7VV?Z=a|r)ehQ;k)nTP-x>h$mDFkAjB>n%Wr73#mA!`%L_46FEmWzeX0 zlVKI~@8<>xkYQEx@8<>zkYTg_@8<>!kYV-l@8__Z{#S<0(7!V16m*ke$Kc=34HF<6 zEmvu3!!x;edUnPaDdAN%P>r^kQjUh*-PSXafPAr!KRGMq@R~9 zTJ6z?OBu+=ANndn$U?kpE=pUWWx&{l_+(@W5%Mbq4beRD<-i&W5~Op=*TA?v7F@ zr(qVPbWut-Oh69Tvx|;3A=2ep^xiCb?{4(oggy&$%k6cP-n+}@I|;|9i;i_F(#Npq zn8W{+95I&7#R&O%oqWUhU`iIF!yL^ccrDRvg%k{$u&RB#yuDYhMyi>j79@+DcQ< zm!_a79XXl)T`9me1L;aEI(F6n(EAbkRz2tEb-z7G+3!c_9P-&juT8K9`9thah`ibaOB9w*F7qSUv%-G|)fY<{(AzSR@tzoobM{PJ29mTQa2&pmhB# zyP=DY?J06KSaci&{n343H~K(AUpZ)VRrOv9 zZuCKfe*fB6%cnV%K8Vs)_9LfhV;3FUc%)Bc(FgPCm~RIYI zkVCr2*i%6ABofRs>4LZ&5@OG>CDLrdr;QbMs0gK=oH;*es+A;pRV(qz-5%EQlRhILs4ds0Z5 z!lGb%{wEg>?WXNeqOFTK>PziCl-m1uK62v1yXe>_L;6$}eHe>AjL`ospTh`!GO1!H zeHf+BEksU8L>C=!wLQG+G;qVb0Uc~%!=^4zFWG8*f&JtG!{{sMU*DQ zziU@%LWBkxsuZfPG}X6_(48Z@=-A6d`g9h31dBeR8+`V;_eSr zUm2?JOF~zV?xJJA8R;`w^ieGOsBYF6Md->~q`)4OK8n&~k0M7l2IzMgI3^t$9xovm z#-3TgIFVm_{$E#k$CKj!@IS6F>o<#hg8m0zaU>}V8vZ-dkP{%27a$ugKsH8zY^(s8 zf&iJK0NFSJvhf0BN&;lc0%R%zWD^9)R0YV?1jy6{$Z*2wUz=(Qkl_s4zn_~VK&B-? zrY%5*vqJy!rU;Nt6(G|QAe$yYHeG;BSAcAW02xk${H-63(PTl!#lR{hvaC`f+pP@B zl2Ss)PPCNB(o&*bf*kQ}U1bn+GF*qS>2fT(TsOKLp=&vvFzzeVkF-T{l>Ug&neAP4 zc}i#WSh~xz=<CUnMmF4CJ~yL88L3fGK2O8I@iF)aERLg%$ySeuR^bWS;`O>dUrcRk{|h*-+u zI)qIe%O_$_V=N)^`b=X9&7`joRCiR@vD6ZQ$B^8_BV%0w*Ng#5`MN6b$!JvtLjJqe zQXq8F7L1^D1!{?=dC0Mi@6sD<9k>o*(-m2C#cp<1By?gMSxQ%=x?e0udL56B^%q<- zhA8FhK8{5n*Uir32%U48*xCCyes@knm%dp0!F33mIG#luPl$i#y77cavb1tP($5=D z^rihgbJG7B&(MBe0?G4Oqe4845leGitl&Z^W*D@(Qa8IOk$A4akbAfqjYo;Z^VXtV zCS2Nr#G^#xnX-e#gS9lo6T*%MmqY%dBnflFq7)5O7&fM3OPd)yY$6& z46Z}ibTt-Tts7m9(8<8eh|<+4{Wqb<@#xqh0-c$|(p{ZT$GfLa=)8JBosj>Vi8U@I zt5b4LB{D>ly7b0&6|O_rWDPzU@0kW6|DE$S2>r!RTyvvz4N5mXjr0&69b0I)W{gqF z&m)>Fx+bCXYDA1rlh8+E*LXgqYf}0rLjT62V_Og05H@`xpN^xMiF~WTXyzs6i_p1M zsEu!Omj$qQ0N0EOO8GiY;#1JJllTXlPU@=qNmeREdJ@hl7JEwH%jlC71Go~!PwfS^Ry*6KONPR0Q6|>La z=kM_-*uR165H@8ppMt5M%%`A!lS%5aJZL#l{U%fWQVH37SC@X+O9C=O+DN`#r|`+h znnK8b-}@N>A#D0I7JV9vj&<8KLg#!V zckv}5s;717i#pPuK#Jf115P9{(bV8%Ew$u{Ssjkz`VVV!}$k-2s>ku|s zmrusKs7uIy-$h+Q$C>PCFG|;?cQKaGWz)O##vU!unfVweU+)<#`V2zSsR~Wg> z-=zds8KL}bC8Z=1O9|33Cj*zurt9(PSpM`_LMW=|JcpOQn^ zWPLsvYa)F@{<|j9??%_BdaGaHf}ZPmbSznLUB#vwu;>QetYSduus90MA=TZ0>K;bu ztvouGQJ^yx7$@K6FyjPLUccY48{Lr5=^7HH8&cix61qo5mu0ZD1DDID8?op{-RMT$ z=thLjI6I=2O*}f*8*m-Mrq5#0XLYmtEJCNNR8;p_RQKSENLR`1(j99cxUOQ;XS3+D zS-N9eIGfNp;@ARkZW5vgkBIdb5SaxS58u{vSj0Kqh;#lTGMS6;yZd-Vto`7c%O)DL zh{oM4U`&W~{ft_`m|9@nC8Rg;=va@!bqJeo!lIjWqnmW2n-Dsume5D+?XoY{$Uv`R z(@j})Q$pvpuvm^v34JVSz^U%0RQFMrQFmJ&9qV?uW-L+4xAj~WeJ)FPynAyAoimi& zJwHO+$s=OR04y$>XvQL%5#ryqlNljiKsSYWs;?Q<_adR!@#xsb06m0FpU0xlW9f_5 zm`CVzWs#1*=Mg#?=Zia&@%KDN1j&7~$oL!EEx4*;$1|T5&-`wwm`~!NYm77%^Jyx) zuW*4jC#&n8Vhae@j1@}xRyXIV`~i8A#CyjJ{egHx>;lai%vg- ztq%3fq$yZHQ_w+EfGs@6%Z|sA9}lL$l9d8W5(ix!r75taDL6?|FeRHyTQ=+`0GYAo z;wx{y!-_?=Vv(%~nXZgdvK1k72Gk(KpGU^t23&L5Wb{>|tpn<8%_3WOBU@9QT?n~| zN5(!2kVDvH8$KB=YD36>x0yDCP8MShP`zy^y_C@3^61$60eTgizK~Bxy%)0dUP#D> z(OxihK*5;|QkrgU4Xw6 z)+_cz-_%|36YoOm6?=x%D-ZXPdIkH35JMF^9tT!D4lK>lQVt{@y3$SU;y|sw@G9y% zG^fkz*wch-W+5vTjx4%kw^TS1`aH6*OH<)U=n@69p9FQ#R5;R9SmlsZVDA;;;j-gd z#ENH8w|Ewjc+iKzsEnp!5lzK!l8QK9DzG06^bj`PiA8rJ^uNdMPK5p*CpAvcR5%fO z?Ai8lj_ymzy>OzbsHLgEzBR;C#f}Hv&;Ru47L$1XE?bL9Jfp!Y$g_f`Vlhoc&NVL3 zMEAqJz|p2ce>&Ratw7RIByR;0|9U{MhhGo!il4)P<5BuQ4>H1jyV4$UFqdmJ5)13XrW3AoCI+^A;fU5g=PBK;|nzwn~6(wE&r) z0GYo4*%|?|00FYK0%Yq1$N~k(f&|Fc3y^IPAp1{%ELebS<3BR&hd6_b3&9q1H@{|d zW|b1>Zl%PTloIOMLQ9D=DJ7xbNGUPIQi62M$-w2Z=}TDjCEd#Ul5X@Rv<%L@j#`HB z=q{8V!lt{h=q`lLYbUU_bs_X`;0={_p6c#GbR zi31mDJ++k3&p|a6yV{l1Q%f1rW_;UEYFjL^5D#OAY2)7kS5`c(-BRI7;zVeU z3Rh~Q(RIj~bfD`FVA+RjE}QPgr{gTN8=-ggMdz%A@1L1VD84)j))qhsVN;gzDQMSa zEFG~$UPg4}5MpQmA?ERjSl0lticNH95#764*PRfl7ZFXhJ4rP&#|^Y*Uh?QzYr!>R zk5ax(J@|C&`FQYCjoNzKEWObZ%c&*I ziETduy{7mM!IO?NLsr@mE`?nQ0AiqItv zb=ex*1>kbobZ_qZo8rT#pf!C6t{am4rN(WMWEQNp1U{kT3Jd*s=kcA+tSv+xqg! z$nx!`w=ba+hv`?8?n~%rhTP-=tw(N`ZLy7nYc89V=)AfU^YJP|=QyLCL-h!e z%Ohe73&apMaW#v$x|_bM2~mzr(NTR@Q){ds^bI^Zw$(tdV$=OtbU#Ahhz`ahmXq~< zKSDo)UDD5#?nmgHL_#m;(XrJBIz#4___p?E(fwK0KxV^|zx|37|F~gtHNh z7mtkn8Mv-ulh^XeXoIzc{C7`%EuoXD<2$9Vr8b{V=m&Xp>=^-_al$zHHebi0uj^)& zb%dS->sBv*Qu;b-b2mbN#-n2&3%Fc1J&;8YBy?WAhxt2@&|$kK=oA`Dh_ZQIcE%nW z5JT9+AQmyG8!_lFBIh_EI`W9vzXM_wo4B4uTu+F+GKdymPl(i0t3T;Mtfv-eCiD~@ z9eavEXBIZIhc?+&V)RdN5;M{kgM3_jeIg% zc4IeNZzOc$q|uk^y^-2_E1^ds9Y=!~`~6va#PQuM80X=5k2fAfFH}1EB9apQun z&*3-`M}8ro<-eoBPyw<{0%V&7$if83!Uf181jx1skVOiRZ51Gk5+I8fAd3+o+a^G^ zU4SfBfGkdcEM9;tL4a(B0NG9fvP1#0BmuHy0kRYUvRwjXsRCqa0%Yj|WV;2(_6U$= z{3FBhS_sIv5S+RA%9}$C;g=GuGeTJ9FNBnkT-@6)PD@A#tuv025^|nb{xBB z5?QKa1hqgup{o>j-6gC=fZoKWZ(-55bhE$~LMOcnc}m|xEpV66J$Q7ikATiBfpq=J zuaSH@=GRER1u!L%gxm)E312BtawH+^aqb{vACHW+8eGe=$y@nkWNqzcm92zMJx(co zE1@&aUPy1^(XoDnYc87}#iBo6rmG0=LwV^MQv_Hbnjo(Wpk`)f$q$vN3-bB z-RRMT{u>RWLFv)d=D~!n!lPrI4fGH;J%&Y(>1LT2LMLvTT9h6`?S7EZO?Y&y{ehmz zrf*}>w{@d$BXsJuO6l9EWo{6<2ak^J2+*t8^zAJA_HOj;gpRv&U8hm{c50cQgdV}8 zV~YgzCN@2mMUQ3Cv5t!+bWSFzETtzDfW(WMa;g(svNLUM-=IIMP*m zu+0a02%El>Pe-flWLae=AyaQ#O5REB{e_Tqcx3E306CLQPGpf2S>!}QCL5zHDLIjl z&y2dq1(Gd~jQtO|u40pu_++$qQa6hv5jx#>PU%V1BF2Osz@uYN2Ix&}dNPZi+>M^x zjh;-c;z#H^d35X(0i9WjDdOkx6h0m8ox-w83L#S;RH}ChwMsf67xT#2vjV0po4kup zMyu>18N)qOYc-dre2qnoJ#H8O33ed zWbEky*_lmF(C*ov%zmU1I`x9^B{R=y4E2I2CgVozJwiMo?0C{y z@uaij!8E0lcsQ5Wk~q>y9Ap(vnZ}V$<4~e;U~d%S$YjT{n-#}y635?VbvKEFEW-Iy zOYJ7{gnHlS0&PxlS6Rh=EnHWz>3dl8J>BSg2%VlPKLk4;io1Vd< zXLO@y5IXe=qxT_$(5Y7kwNVDOQCKk-M~`2~=n+SYbhjdXr6WY%c#)1L@e0R^^e?`r zzO8g$VrZ5ovLcNWPNB3UX3}#0nv}#WUP;7U3`|)z zc`u8+mqp%7$hezPc?%`)rDa^=0cuypBWF=Emrc&%ld-PNBILi@h%7><{&%#DXZp?7E5U(>ko@`b;*(9F7=TfstJY=KIHkyiT63-cTl8O#qDzKyiJ%ml) z$D;4+mWq9ZPK=*O>HDbl;|YEEQ7&D@#WD}{Og24-Mb9C0-WVDCwK;^&dAXJgWA~GU zIE6>V8Uu(`Y~p?vaep^`_Y)%ZWusQ#PxK|;X4vMp_Lp{!@T@FyI_iuo-F#fz$V0{MH3|V{R=l6qrI_CF-gwD(F2ML*aZc*|< zYVj$AoWLVvtq5dUHu(^rjJfhqH~SnSbn34}?Q`gleIlrR4pI9QQTt#`3-NH-@#OO3 z!4%}OQjkmHpx#6@1-aBV(If@ecqzd88pzIU@?kz1Q*fA&|IY7+37s6BQ$^{AseMWb z{Vk7MT6@mHo1^RE@Y7l2{{W7#~%5gj&OqSR<21#x@$rTsFCw zPsaRLOvr!N>&1jlS5GOum|EmM(YumI$JQR`&TRTo7X4^9`cXosr)bdpca+faU?|`C z)ujG9O7q`Cn*Xo|0r7;e<0)aqQ$ph543wzViAr<$OA(pq!P0azduF;gnoXEq|MkSM$i&YXhb%n|z#4M!k=Bv;1*Fr}M&; zew$taRUcS4eAD1O@zFU_Yh`M>4i)r37HZ_(NGBCS?jm% zKAqp}{rvx*GtYCD$9J#0&e{9ybI-Zw=x2Vxi8_0f^*k2ejzq1*+f<3Sq1pGWmh0PA ziE|-;=wzLPid@L@{7BYH%!eHBr}LrPFYZmBZ{BJKa}o>hIOj=PenXQ8^L*DcE=%j##I<$>6OKeHw_Z3dBAO#8wAlp9f-V0OYn`^R_p6! z*4MAFzOMVUw2;N^lv6w9UOVMz$DSBq?UbV(d~3GHFpMeX)=r_dqy0qMNpU+1qIPuL zT7Y)kv2y|1uwVUKk6&Qp$?$KqCXc%DM0=a8=dt{LB<=xzK8|&}y>QYNGvL+9~077EwEk(2hH*X*-M1 zj(wA8by;L}`4yjHr~4E-l89c$`eM=-d-`JN_WM%P7ei0huS|*7@Qsv>;yNbDdL`>0 zkp6*JqYt3lcNnIB0DXOP=*Kx-M>o+E1GUX)?_Wat64G^>E`gq$tJ}2v1c>K3QO8EH zvRGUiiMszSh3NLbrO@oRahB^+C2!O z^@l#m={i=6p2zy~NY}iVQ{Kywx1Eujyc}}>5s;sAvX1y77qa|eBx{x*LcTNo6jh68 z-gZWA`iIb)-3@)2)AiUPdI{?vMY`tw5#{|6^0wc@nEVmsWC`TWPSzuk$Ym_Ah-A%j z1?2erVFh$MQ#O4C^!2YouQM;bU+b|<^h(x0CjDcoitc$ILr<>3p0^ZY3n%K4P{hQb zl>T)ic||1ZJq;C6CFK0NQkB{3pmcSL9y{gV&thd|q-Z@?MvB&8C33PeR{O*&@rjGJ zL(X%u9)U$pvHVFStM!Rj&rhJ^aT}XV{{(vfjP?3C$2wh)<+7f~`lqCS>gk_CxARKV zKZTyyJY4mePS;t1tQWGriu6^`<8$p*(CvOs(^o-n)(*M9<#e52h+e|_XQY4T>7PNz zH^9kE%%?wto;(Bk8mH?_Mf5V(SChWl(^o^cI~q-2ZI$UbLM!vT({;`x>y@m3PWtE2 zT`$r7_;cvV%+X@aE-m@0E8~xWp#^`^b$!j6! zya;)ylXWgAavsZHMzZ#vFTK3KgpSHLHvLQJ%@#tx$LTt&6upr3uSoyO)4zg_JwD6y zub?Ntfc}irb$%*(3F}{z{mpriz7D#p`8vpU zuaU{?AeYzJkP_*8C+mD!)+<^5hU9NZ{syw0U7P$3hpE<+NIw2 zYUhx8X6P2ZrfJtJ-9Od;bP>DjwNf&ye)hON5Ze%leH(~v48*<*#J&&2HU(mv1F;_h zu^$7mErHn9KC!*gt{Tzk%3))na<~SShiTEVxH68mlX#9-^aCrPs47(M#~F?RM5nD$z@d+Mt&- z*IuH!?#ZHOvA#aiwP&xV{6}=02hm&=j5;-v>rGMSr zc{9nIN!|?E?k_WWGvxlCLf-G~^ggVkotRlH{}9QVHRBoKak3 z@=uUwp9FcXll2%Pav94%ll(KuKSRbfuz@E347n&5@?t0Jkx1l9mba0-jpS{R@ms$k zCU1k>|0>8Eovg<*krP8x`q%BpRgtXQt;(x)6?A(7n(0;0bH+fgF+aU8>yc61EY^P^ z{TJwN&(rpPfo@MhGyNCn&F+Jq<#av9ik@QqSJHp=a{m=N&ap^zEL$9lCu>W%_pL>*qo5=X5>pi(bh34$^mcmDvFuzegKq`VQ#jA3-1Ebe%zn zUc&lsr2hupeS@N7$Zyb-724wy!|->S6LtO}(J~f)k3{V?ze9Ar=67iJ%rDFJcjVgt z59Io~lXVs&awW@uM6&J?e|VMn1G?R{mHm=R>ldxK5+d{=Jj*ozUHA zs_pHBZqLv%eJAw9LR95fr|Zm0+$`4rB>hjSv+93B$5pNeP5%>mvIBC@d?(#|bdDx^ ziuJ!p|I4e)U(j*oa+>LXL0{hkdRwRKY)|w&*8h%l-J*X(cU$yt$mppvP5v8l`Q?y% zI$7t8A{Vl}E0VPayCBDFz6&}cC8qC!K6@DSK~C4%r|2cD|3mseURC~qj&s8~rvC%I z=uYSpov!m((aTu>m-K%rckMaUaM59o0+LOA^W25^1&sy<~&ygSsb+o5^}I(sis$ zLU&_b60$vE%j6{F^GTx%lN*>%1XKhfFA+9zc_#d57k)?90OHLeBS?h`b<7WAS+ zpkM5C?cJj1vR<3?+MZq;I_{oWWO{Ar{j;Hua=MNaqUW(*hx9sBXZ zJ?C`j4>?^&9MKC{-y_ns=6g`h_kfIFI4w7M56I1WLw?4|I&O(v$Z`hcjD+pi8IbXN zy`}lM7c0ZlGoZ`Apql)jecz!YpsW|Oz9;E>LdT6>Bd&(Nr>E};Jy~*PN;G+2mFYT` z%6bXwdy&2ubljslU;y;JJbf?IOL5nrJeS>c9hF5dWqohb_lAzU2A;SA`re+tx9Jty zmv+B*RL6H&FJrwf>2;ywTipZuL$B-UbxqGIQeB>(VY%y(Le?u-uSa@4=(u<9tjnR- z^YnVA7vHXW*%fJBk2$hl$$EX#>qE!2_O1P(*Z1`L>AFu)z3}R^u17CfuVQ^4()Zb2 z_u&`Im7+$8eV`}h-H!6_CYtHr)S$Ge$3Bf-kALRQAu~zLgotaXo%$l*OfTO|%QyR8 zI78FA9z{jZWPM-K_l0hEWLyA!U($6f*cUqP|2(+`?gQC3Sx055vmSx;$SiAF+|GW~ z&VFbIPcgl>59+dCtS-r|#hSUiY1H--J+8}oHjDd{xIaY9OB?q_=KE9Tn%VwVmmT-3 z9=&T+X9%*MV!Z+B4WQ$th;N(=y@97UFn#j_sz>h~)wzbO=dykP=?6f^bJ05GLO;OM z4={bnWYwehj_RyM*I92!dPC^=j^Wp{p*QsOhNe$@Q1$4&qdNbQ^#axpB>h0>xF>Md zSz6V>reWz-^m4)ei zb#5r@rK}%9`XSKm7;!rELp=Qu)3-v8-Z!eVOwr3&Z%le)=y=B0XQ!bWjpNlAHBIv^ z8<);k=cuw?!D15M*n^?ZPpvxOYt;g$ZSM*BOo08rXx_yV!6?#+B zb*yR%9rvvD%EnmL)W#}#@2HLlI)j#Ws<@p)shva7j=kR{2kjh6?UZcsQ=;Lm zqk2wRSEkzfb`L#^+e;2gdrN`QkUw*B*<}qq&V9@+Muai}o#PC!5&B^*q*FM!J6Lme7;aACrGmw_~k@*1RP=8?oD=<}Iz}@AV%*S)lpQ$5*AyN*cu|P4!1I~ zbzGbWF?z?Sj=>_9vUpS^>RJ0y5R>Q4Ks}H0>Uosy2Rk80?;6#ST;wvA+eET%tu~PH zgo&QVLT}^gZA{O8G$mT}zEM3U$a)3qN0WXubX?!~DI2vtI$nvv5TkdD>Jdd-V6iQU zZ6VH;cTL_|)E4=+rF``>wMD-84cNo&u@|?sy;$Bis(Y~>rKFuIZs(Y&9j*8=R`K5- zLL0|W8)jhCScOjzy>(QNbs{HjOzB@YR%b`DW|s}w#-ujTvq`uAjq3OWU)U$ewog!I zZynX+r?imC?Hn7mqo3ed`vl{rpp9dx4gCbirnl-W%~jqqYI8q53d?#H%k3grvug(# z?|c~88hSfVZ)bWx=<m2BN1}KaTX{ zpyN@xnMXiB&eM-Gy%c)%wo#p9h@Q*(@sX}IKi+EI@_xw2d-CxnuYnxBX;fz_BImK( zA(FM`9U$YI+!1!(-vPRgd-l(DkHPQSuRad@dlvqPl#1RXM`e`vV0QBCy{)T zC!Z9Tqi^eUUMX@J%biK?Omb&W?i`n+Z|Zb*DslzOCzE_K$tQdA$#FUQmQLrmB3H6} zN+j$3Pp3q(%tSicH*@&6qHpGORxC;tD_uzG^8b{CegmiHgGKi1iD^ zE)B#k3&bw37SrQ)N@CI*62nsZ*Ud3fQE$+ZJQei@9m!K(Z%xH}t9)~8W0&s5VrH_O z6Uo|Jb0WD~ZV(mR5XR~~2Bx`=BMsl_M zqVI&YzloA!s{TKT*n9=?P^o$xip+o>1^qm`;5#AM1&I8h2#B zVe^Ha@qJqUJ?kwxl8Roz`q`wP4IMMF=BA$w-QNFY`q|KvWx1%Bn?dQAEP5sD=a7Dm zr=J5Izvg(+^mEdB9&|U0($QV?D%N|E-U~Y3ZqwFs?*$#tqUZ$t;o4{x$rN;@; z6Zl11v=8Kxo(mmMx@l;7E_8bzo$0xzr>}ClYoB_=5j~Ujb4fqftIWC3?YEz%pKH2h z8O^Bl*d=-v>*tYv9(1?Q=+(*dpeGYL2TEq+9=&KLrAIyyvsvs-VsEe3y&>Z6$j2<- z-j;9PEz-vBYoB@y)pgeUklx3ubsy-sE;q~cKBg}zR2?%fJ!0w6Sk`k{KcDpTz1+`- z9=}iTeA73NQ$0Fr>2Y1w^H{%t^b5S)FMy7xk4?ASFGz36J5-O3W;#QV^#ax}B>h6@ zZcFNTa3OU2ZL{eYn%-!F>N2ib@7KA8tQWH0m-N2ShJ>L5-fgZn~_7c-a-KV)nM@*fQ$$A;<{YdXey7te0(35Md zXCAI%boA62ovc@|cqxgOdeyiTBHnT_(W-H&<-6v7)uW@T&JA^)^~*@VjPljJ@G|K5 zuJm@(FEf4P1JK>kR%e-_SFwIM>6b%y`?yx)a_EV|OtF$xlU2l#SI@Ot;9Tos{F1Mm z{N?}mueQY_dQPV6dhIPwGOK>B)jtrsA`rVW5E~GPT@{F39f(~Mh~)=j0|T)^f!MWy z*x*2HNFX*e5W6lAD+t7{55#T=#BL14h6Q571F;c-*vLR^R3J7w5E~PS-4ux39EjZ# zh>Z=zZmky6BbV-fvR^0g+wW)&l1Duw&+B)2=o#@}Pvlv@+x4LKlISYF?#Z&A$$Ed% z`+NPaKlEgojzY-{+$B-!uH0)s5HX9zD@eQoVtht+1;qF-Rj#mn8{j?$xms^WEA3ID zXS04K=~sHyxDtB&S2kCg-U4?W;Cj8*TKlHxDb@#&KETrlK*y5|uCp<2fa%$|8z8#Q zsl8nET-L85{VK0AS3$SuZ<~IV>7DtSr;Zn*=dpe@=~sLD)zIU=$hz9}?zmbg*Ey~3 zI`W8K!1^_$U*lEg8tCy~l3inZA6zYru5{`cCVC<3`K0H2dOq~{ui)}c&%-sS=t`%K zhN2gV(y8OB=q0QVB7Klo_d(FzZy5DRIS4wwJ#T5> zo)4nyo;p@bJEh#twbahF-lw=0?ZkhDd98hl(@IjJMb|xb)R*-#)(4Y57#x;+oh^dY9_&eq(c>!ErilJ!c~hmt(`NfomcnkpyN*R&Zb{y`el!4?$Py8Jvz#ILZ3G*jmX!` z|0MQG6p&s(x$C^A0D7`7#@~$)qidpiY!xe$#p_AD9-`ZlDqe45F2q5PYc|m}Q9Uxt zdKQZ}kaz>-sQdE`5aZ8dxWOt=1zoO#+Q_2Ec+v3&^xYM>k@OoWU)67f9)FI+ji!&7 zqq#>{Lv^+w>nYBC80o`2eHe6m4y0|pVW#hbE>}P;cb#{LjyI(4&V4xP!##aCbes`4 zH+{J2tjeC13iA;HwJqAIW=QUZ$4LZFP@U#XLQae z>!qyUMEXr$?l(clIqN=_`%R|Lg)Vb2+aq=MDS8>}HZPf;*6T_c@k%X$^-w~~G}R<5Sti?-5H486^Pv(h}{#2-5ZEa3dHUU#EJv4`vb8D01kd2xUA!;*t;uz2kCb}j~~JA zfNpQKwrA$uVftq1^PH}uh3N7vto)7Utm8=^@8v!ox_g?Sewy*nafjLHQ&IKtR`u)| zsJf0o(n0~ZGlANf;I%UW?bx&SZR<`zJ2-ZJZ0$_2cIH|;I;u%Kh1||WYGfsRkG!t{GgUj{w#XgYU2c8FfV`n{yz>(%;R=yqR~>Gzsm@1>MzqnxfsAz80v zeG=)Dyxb>2$9!n9>61*)gl_u8N+?`u(Ke@74N#=6b#!ce)pqGu$(g;?oCopXqYv-8~}?i3QIkf>X73dHzRf~Q!% zEni8A)_8Wh);fEU^*qk^A<`f6^oO9^?>(&651Bp)dS9pOJV^8c)~Av_)zha!k3Tzk zs_D-|f6(bVqY}N4^=YI}^Ym%Z?W(cmKF#zh=oL=axtZw2tUpZp!=&q$d>DEXBWSYy zt0@ucK9;Vv&g^8pgvIG3PA5^feGXuIk zqsR0aroRRKcBkuXQ}i;{XOcdXbgjlrs|KFfo%{!4nGgkU{x2G+c{;27ZI9f&;^h&>*N z%?ZSw2*jQY#GVSo<_2O<2V&0zV$TL*&jn)72VyS-VlM__rGeN>f!ND|*eik9tAW^S zf!OPT*c*Y^yg=;DKaaT zxDxaXd#j@LyAtbnd%mu{y43YM-IHZK)9%uC-N?M&e^MPN?`;Tr7szYEF7=&|V~BHj9sw_&AALfyW`*HBhU-<5q!Bp$~An_D9j> zJ{9>J&0gk^J_maItalD{y9R3d9Mc=Vp-zd@wP(wEF6&Q3x_(>t1oWa)-ov+fPe68W z#n3(A36n2^{FRe+d=NR0qsMd0qakZ z{uFd~?9;9Ilx;` z@@%ANM$dXVK8qaPn`3l;c-C^<3jH*v>$oj?8SBrH{+w6e=b+;$JQrAfpELcKH|29A z3Z1S;09mhK{dv-#hwk<^-5;KZo*ad0+yHUD6ZQBZVkL_&kobaEjTa!=6xz~PM^%ir}_0?m%tfyFi zmGoDkyU|B0^D1+;{u=48L646WuR)K$749|YcvDo#x%kHI zHTx!P=3IQ^rZW&}Cy(2Co!WUF?YJY0_L+?vT2i^5?t@=FZ@%Qk}GyQz%xlY$PmFUH+ zze)O=Ue(`(Zdax)_cu+KC%}q!kJEK_ChH}vzeW06UhZ!}kH4YtEz`e*zQpM|&lA0r z^|wiX+pGKA(Cx~!eRujcbZqU%&chz_w(T*sp1~fYb4O{XjN6${?aZed>HJ|n+R?W* z>h_qAHt;;DkF1UP)<(+O(7C9zQNeAzLv6f6ZK(PV+OR9twjJKFN6@X?bGputMXzH0J<{Lva(@qc{GFNanSRu}n)?pb z^^Eby=#0_M{_NL;dal?lcHU_J-L5n4K5NX!dl1uaLX<44pD~sPVhaMX_XDwof!Lxz zY;hp=K_Ipy5L+6EEeph!2Vx%vVjl%!D*~~P1F?!gY-J$!Ng(!VAhs$H`z#P!9f*A% zh^-04z6iwD24Y_ZVqXPfUk76A07O_V63a3jU?I6VzknIT3X2DcFL)pa<8wKqaAy{k+oBfc5wf~9BZfC z+8J!^Xg`s5y=UG7QEbw~$0<`1a@T;G20ot)ESJut~YiF*tqkT_W$mVw5r*_^) zJMrV+`)CJu{AbwM^}dZR9ra8gvGLjT$f&(o)>Eu6Bz>W$FNAJyuQGk1={G^odM>T& zcp!Q%>x)QVR!GKV)-&HwpC-9RbvA5iB8v%T=Y`bmy^ES)0abc?=RQUX1P^kF7$;?*JFa{WvqWl z`iG=zH9oXzv_dtOK}@`muCE?ZM66)(BN9I%QLFJ0#Q59XKeBwcK=15yJvND6$@&V? zS9tmg=y>wWcUJ2aR_l7@DbYqbU5|3IUd8&yq<;+EjVxM?kF6S6T8*N%5MOno9wS9e z;8%aq7+*nR1&LaX3W&JJ`y0!*!t%|9UgdN>+KQgZ`byGQdevA7y(>DR=_^gY0eYJk z(_2!H+oET&{t4-yKzC<%T8&Sv8jVnm$q@6Ms7HMfvswI<#7`+-6+exM$=4vxaiY!{ zL`<=`io{ivqtX)YLtMeFHw_k)t`^IY0S3{5QZL6&sndo~5FHo_K6Ll6O>jj+e=Olja<@-5AyA#0j z{oJZ?67(KU*ZGv_g{-e3eT}EDfo|_7HGPfkZI?pNce>8ZL@#Fj3(~)U?#}jg-}u6+ zk%7H!EX46n)OnqVB`mHbaV?3uZ>)uA&nvfl*IK?Mswc&)AxlkJYROVtmO8TRAxnlV zd&;txEPKmRSC)FR)R$!+Su$nWSC;)`*B1=D6E|ujn zSuU3)PnQ0&Tp`PqvRoz0KmYyr-_`P;*T|AD%RpHM$#ShMgJl^a%TQUalchkG>t(q? zmK$XmCd+VHM#wT!mQk{dmSv1AH_39dEVsxqR+d|3DU>BK$L(ET%9`w5rM!22Nqg6q z*t_Dr_eZ>h}g!_})OTF5C5GcbBq#JHUT=ZTDTwdZoEiGOPZ*!TLaK zLm>8TAht0O`z{dsJ`md!h;0tUeh9>V48*nsVp{{Tp8~O;1F>y^SXChQOCa`ZAhtaa z+YyNU7Kr^Gi2V_W?F_{J48;Bl#QqM%b_HVp1Y-XNV*gc(=}cbtKk0|^3wZtOu4+_L zhJT_t*ky%EUzU8VKAf#@ZDUBA;kS=>z4*OR{98#C5Jx4W)PUvEdvyP=P8y7mdt zvsm8{>3T(G1N8J28T?+M=s744Iz@YtDA}xh8!0-@d`lJ3k@8y`8z3fEKz!MW+6P5U zvAB`Mjozo;2+{7>vQNFyK6MrJ3a4vt7Co2s?@0fS^3_l99rTa?=q)$jnf@L0MCnB- z(SCNijtjD$$NKlAe-Ax=B>LW}u^A&}`-LjjeK|e$>Zl^?1uSkNaTAG}?H_hX0O(pq1*jhrf;@dkAU9Y={nMhUd;Lrr2pXQKR~zVSD5~T zXR_Mt!x}Oy7f>`E6Jqn0e!QxLO{^V8TCy2S2Vq3mHSv8t2 zk~R|SoUX?cS+8XM=SbIUDnCPa_hkGG`MZkd@?sN{f3`|=fxOGfdQ=j*isfyQtb6k| zs)R-Kimp9f!1QgFcYo*yzmo1fdVCW-acfHdy79S+^eRuULhg8`^(fP;EcbEHJ33vD zl;UQx{tM~9K#$M5et~Xx*_i%|c2s^dv{F#&8pEF`UwiYN_V7QW3g{>K6SBRj$K*dP?^5L5&B;196S;)tzam+! zzr4Kvf_?3@6r-nZF6i+d zz6-kDA!NDlGW~!LQd$Y8>&#QuD_H-B^nX14ALw>JkLmwdWln(puG4i6D|#jC|C0W% zSDAl3{a?$yFZ8dRuCrm$t62Y!^#7p8ubBM@9bfjHZMpwvxsQSVm+E?cxF&sFS+66< z&;RT$WR18d)Ve1n*)`_fQM<03sNtUg7l`d2h&2er4hX~=24V*WVvPc^g95RG1F=H_ zvBrT|lR&I#Aa-cAn4TZ%{wKX8QJB)dZvK&w-7O_g*|6tkCTi4_wfHeHQKObb?4CO7 zC5alfB~mm4y`<4==_7*f$>L_Po+Ld9Jw7@mq1)YXrYE5%-+|u2>B6X<$$AaaYj}DM z=yo@p=`}3(bDl@%zEz;MRp33cxO`zwz(eGkihJoF!(uH%;IDb_Pc&+zmN z=yq3~=^2*$T<96Er}t|e0Y&f5`ktik>D7Ht=y;~;(WdWd`ZDM(oxYdpxvcL+`d(h{ zdqKCm>P+9uDzgRpX-?NsS#s~o`rf4P?df|%x4Y_0-`jGpw=^Z%6;9XjUDoqhuS+06Zf75AXCG=uN0xoiPI4m7Y$hY~ zwJvi#3W`|BVkU{15aZ))CPceK&+3wCb$Jc?PN(bfRP>3g?@Ri=Ue))7-UE*ZGkss% zrmLaLZz}A0EP7-Xy_og=NZ*fit;T*vkqx@ zF1K?4wR3=1mjkRWqqHtX{gC-2m$}YaL@Z^oA&CvW%o{?qd!a1zhR7WEcI~jt8(QYi zS>`$ql6K~CI|oub2cn($-gqFjqjQr3t^Tv{DVDiUp))Gc%UEwjdL!>sG=h$&tk$xv z+sO2C=$oCcb2HJGuznEf2T|_2Hy#9CuHL5PO47Fw><-#W7sv4X{eNj%ug_h5*2 zcU3)%DhDH9oU8Qck5T1dt9pxh*k5$EDDAA_b`GI-4naHdxxgW42X7AkyI$IF`LK1E~GD_L($dSj}K_Nm6u?LI5}6pisIa3}L{`xK4sQ{>sF(7CL%yP4Z*LhUr6 zPoed1f_9Sm7!3w4*UZPd%ylL#>s2f^C9$bj|E3V{9;|1AR+px>zuX0Vrqgv!E&5K@ z4<-FjuP%o|w>z#(Kh*T+pueTMo@F*oKQ&3uD#Oo4a__~|Gfw^Q?$@yTpZ3r6DrA;q zS^X+xvp}qQAa+Och#e7#wF<0fu2nMJ)Mi+Z(=9$Dxm_Ou-vJ+jbC@V3e2HhN^)=&{B|58bDwg$!<|8MV`ldZUgW z&CpIV568@H=z+hx{;fSi#7q{Oli1uFJ(@$bC;3?B&5=2tUHZFa-rO>8@FqrG?PbzV zBW~v~YUeP@Tq|@KwWF0j%*K&+AErcW_h$MSr2SRa({Gk{^>0CX3;GmVmljr+z8F>e zK+JWb_I43lalVI>csPlg@8J;bUPT-C4!3-VLm%pN9XCYJX1yipEj_&@bh}s4^p?<* zQ=#AEbRB_2@5uTQq#pr2exy9Y(~mIyP3X@!UB@!fQ>?cly%p*D&2=lQb?!(U>svv_ zUF{>Uz_GrS?JY}eZ_%+)+UU-097$~)>DA{*wDFkUu)WIabEJKOUHAmwyHB8_tmwI{ zwhj#2PJ^K{Lp`D^3_!QZ1 zr~Bsdrq5;lc+!uD9{)D@c<6SQp6SP1jqZbfj?;BEBe|Ed-huQE(BoUWgQs_}+)JSk zcDl}sM4!j{38bGumCpV-^DC0IdQX3t;`gBAa zb~lyPr=xv>?f3+9-6zl)o9IheKaunkz51L8-QJ~SJ>f*?I6vQLpW;OO6pQUs=qym$ zso-`xQ9GT`PJDdtgm&z%E&CLm>{E33I3?Of_bGHfDeG%kKZ*2{NY^pvB-;+HFy{1y zSYv*AuhiM7h?OjMCb6?u_0ACOek;qjGxAN2fu7}bo!5%Kne~%NKbi8?etI%=dp?#` z{bcC2=MKR5bFx+al=1c1}S%wQ#CvpW+m>lgJ&A60M*66gumc z^_{GDA-xOq_))40bh~TJK1CPkI6uG2K1CP%6l3P6^o+Cz&Pd&vrd|2GEd4uKccoL$ zRPFrJu7(c4xv2e9jq4d{O7g9KMw%0dbq&N$4a80h#7+;yx&>lq1Y+F-u`>g)9)Z|d zfmqK#?Ce17oItEsAeI}5og0Xq7l`!^#QFqc=LcdJ1Y#EkVtoU#ivqEW1F=g2v3`Nr zrGeOGf!O8MVtSsW`=9ie#JH6Hb!S8=>MtqkjXFxD&|i{SI!YxI75eYWGYjl{Y~6ch zJ%hy@5_7yBm;=$?L1z6s$404rp}+2Q?FXV~vfh>SuAbf%`d?%9dr#B5LN9LyeU;O- zM~U8u^;1bdm8zj*;HjQ|D)gdu(0_Hh_D#{VSU-*Q(@57^pJuggq_xgD6=LQ)=~`>g z7O@qJr;~U(#Q03&bclA}rd8u~t92jfZJn-Tgy`9=`+ z?9SquB%TQ|eq=clqTRP?`JRbnJR8UzX2`WZi?$qDok#mi$|B{Vdyx^Pq2Vx{l|f=ds?C^q!vH6S>=6p_Y43 z+lot}C*Do(-+E*aJ)iZnNk1F9+XJ=7oNZe%16y$|#HLQvAg(f1^r^D>#NRtWRY9T++{_+_l!{TCEdW>!KzQA9CV(CKj`J9*O6XsQI1;(e5*~ ze9uF^Ic=f8>U2GNOTN=s?;YvdV|qh(J*GEgyT{bz-d5)>kUw#<&H+R&VYyEvYnFYy zy!$|3skc!NGQE%0xfk>*r=M^7T-MJg{d`Y9-_y^BUX%yD{(I>jqw^BUy_EF}NWZ|- zFYxpWtmfB4Z{u{G;fOwu^$SVA5W4G+TB{48+nudenF~!H2fc^Wb*?0O8S8yX?+ZPC zKGxUM`$A7nhMw7V#5Qm5rNpqKx|YXHaZX+6Nuduh}|5B-4ck64a9D( z7SnS`-T!32PTZE#zwR6|k9tX-*TeI?UXo|y$3f^NZCoGJJz3lg*87v*AG({d>Aa*r z^yKCdnp5f;{d~ZOI|fM><`{3(>P#znb)`y~P52SLv%hrYn+Izo%ym-TB&zt+>Q_4I3@ zCqIF{(&;+Zi=M~&VA2PBl^G1(o|bC44~Aa80eYp=^{63wKI=nBAL8Xc#M6gZ-M2&E z=5#&&h+e?@P|}Bb`cUY0SGwgs)bv`PrbPSK>3SrS^--)}NBVW1ex0XZ2R-Ki=<;kQ z`xdXj^g`APNH6g80_b+nyX9U0J=qd^W2awl`b5^RC;fWTbxgk=deYtvJ1svYpZ+K( z>akhYi&?yZ#2X;SN3I(n+I{Yp?+sS#Gmvj5r|VH(^l7Z$NcxS?gPWo`KGQ&N6xNXTX(64d2 z&S69^WqkzcBcR969Y#R6d-N^$5zx!;fYP zoTzgt5zAN{MdBzD_4ql;%XgI3`Z?$iI$dXFqAy{6H0h(E$M=)b(Cs$`R*lhC>vy0( z?sT2siC)3_7}CdhxsQP^r?2u8Z_~$^z5@EoPS=^D=xbQNiS(PGyLpyY<|a?S$+qM= z=;cn=Ij88Atlv!f&0g*|d-~1Li?%_paJtT3Mc>T&Eu`NKI&HvLwsbu;My zsIKRgng914qwzCGca_p&?p#yX^uOzQWuatQ{k*a$5E~bW-4=-59*Er$h>Z`#CIn&= z1F<^;vAY7Xy92R%0i#FaByoF6|GM+aLh2=jUN0#`FR@?qST8BGF{2%N zN!9;|TkJYz%`fbpYS3y6~>Do_4&tm;{(r@?be!HjN4!wLh^zKgA z9xr+;*6$$w4lnmRpxdvgtTJ~%FB%X1LZ^>6J)8CMq>uONKHk&ETivHZzuM_K3Q6uA zS)V}q1geZ4XC^>T&eQow&RmGYov34&h$$8)k~on>J?c(`Xur|2YD}~(`6l$+ovx#y z=-pYrlk_{iTHopEciNU*3VpKEbzBuam-V|yzst-0F6j0PFw6Ze+mdUcKjw5Dp+)b@ z`rV}8?d5*Ar{8T`atrjAoUUWN=y|N)L;5{l?)N~q=Wbi>_gLL`K`(Q<9yLVIXZ>E% z@AY!O7rOnz%=CM$?sY#)iT1J6_4p&}1*}gZeUhh7f^JXSHhq%Sy$SSnPS+!u=%ZM_ zkM#Sz%G~Ga_nF=n`cF>RW1{GVtQV7B?CHhO?N@7-dolE!F3@*5U5~D!Ph|am((m{5 z`=Q&D!cD&)dNLRK-tVW67@r#}F_JP-Q8PS+#8=+juAO!{Om z_sO0<+3J2h^dp_Fa|h8&Sbvc82cf$ohK^hhLYF79rnIWp>feq|)R~8@&t-86iBl+F z6{p0+ABu}}AYS0asV2^2aVm*ZNz~DGDn$D&U|rm^IMue; ztI)4+DeUHLTAdeTJvc@bnp0_dlS|cDl|p zMXzLiCh0S&?z-pAgq|$Hw*ncfQzDc)QD>>LzL~{GNPNT-ABl?xL441NI>!~Uip57s ze3V4pdXGZ1=iA%9@u+RR*3jkoi}vlD&Xz^r$@(nPXL^@(NpC9gy+SwxiBGcCN{INu`tbYDDI}m#;5PLijn-hpV5r{n*h&>gE%?-q!4#b`b z#GVbro(sgD55!&w#9j=?7eC+J%7~wPkKq>j+Fj&=Z_`SOG?m7;v;AYdWrqw+4^9KjY4Okmuz)? zQ1@hUGgzNZ`fRTc&W3Kkcs6}D^rC*y|8~0e3DGlIe~k3UpvTAO$2|Qp8$X6X-)mud z{LtPddLz~!C;f4+GLL)u=evs3(pNgKv`W({dc$Jw0-G1e2m6-!QQ8_pzS}Uh( zkJok9pCJ7S%3VkQC!i;%jS#DR7Vw6||qzE9egEQQ|9 z=}(#7k@crYf6A-IQ_$^~v!*{~wJwK#zSDIKliX9R&n11Xr_Y6M@Afc#F7)Il&<8kO zM?=xOv;H*cPkZ{)p8hoS@(s{$bh?hKqUW;y4C&86kMHBpc=|I|_wCTfIbBC+(fhLg zEa}fekN5s(J^fkJYki&)?S7~0STE~&tUpKkbCkR8h0j4x7LO1s=KzQ$PShiXi1{o& zPvY~Q_bcWp*nl*CfXQTtvgMEm`;?Z2hiN;!R@f8}&NT8ciA^_NJ033_}VcnSJQ zJSfTZmrNfBeT&oexGQ=w>o1f3vZucc-F}^I`peLhW1#=#bUlKLK8^KPNPoqv%q!6G zu%RzZe+7E^UC{Sjls*EyYI+Iluaf?%r@!jyuR<@H0lksaUo(9!>#vdi8ua+p*w;M$ zHLLq`(2sDs&QGK=rL4bB`s0u|iPN2^b0b+VV{smd^E`20Oe|W59Q!y?XI3IEVew58--H++E#HJ_Z|$-D;Z3XQ zHt1J6UFT?`SFrvT>2Fa@wI9Ca>2H~ySd$X%2B+(6PuAD4{x<1vQ#Dk78@m0H-g18% zdU9XrMNZdwqv(~a&nJDpm-~F^*q$p)pAWsf8T4YO>kL%%&8)ve`a7Qfj;Fr^y{H}Z zSx(ovtmsv&zf1bN(BoV6T~B}4>V7Kp7o4uMV$pZ9{vPS?dAYym>F-(H`#^t3bv;k4 ztahHr=ZJb9$Y+LnWwClh&lAfe%j)Ne<$>6OKeHw_Z3dBAO#8wAlp9f-V0g^#4_q7W#}bt^w-g;47~)sa+!@EWj1~cKri{w z^+DZ}#m!*7ob+<9hnGXQ=Vq8*Zu)TOUpig;gy@;9FCcw^*TWY;$E7z%8J&-O06jShXBTTB9`8gQ!$eH6xP-(dB$s^gPx-B>h8A|B!Uu5+6dx6FHg`;He59+Vcns7vlYUd-bMjuf-Iu?FpTc8U*#eMEm=#fbD0@hcMz5;r@FRg%X&!({&t*|Z7 z3;Lr@*JGOKqgel#^pCyVKlb#GP0xe=ywmmQD0(656{J^qdIfZQ-c4ORYp4RcJd?uqhYh88p_%Gr#7C$BNQ;2TMs`zP4EPov04^GtCgNP+8t|D<2 z#Q0dS3gS69;90#_p%!=o(2Z7$RaT3gRtuexNIP@6ozJ3nw7Q?69ryds&!`RE+do4a zIg9WK_V^%uY>f_}Kub*?3P8S86EUjyB3PyIA&pvx<>7G{-N_18ehvFlN*{u-04 z_@#+!Sp1U2FFo@55zVFVw(f89|Ex-1FTJ0k9Nu@p*Ozm`nvWG(KA`!K>7x+uW#`54K|X@g1*e@ z+RsF9#QL|Se@nUR@&8-s$vm4~eG3^gxCYl_4*jjw=L@Tk_FHKqi`&>3wV~T;Bicy6 zTTI+q39bA_$e6bsYVt;tH=F#O$*oxaE|S&w4s!fh@g1_aC%0MUze798Pf(jbTy1n5 zk-W26|DN>kJ^g!6{~mhz2IzH`q-R4qB8lFS^-ZL2qRQ*1*#zC53un1+f?l*8`Tzhg6?B%{0x;+ifj-s2PXLmoLon&8pyU`aFy3SQdk5nQSu=q2HKU3x^{u~pN10jxeq8{f&9L3_c zNYs5{8^rWjAbHtXunnIcXX;bz({Hm+f3JOdJz9!f$Z}OA>z1m59RKF13c1?z(X2mJ zp`D_;koQcNw;p#zpUC`UGXwgwPS+#2=*6u6O8T#!{;Q||YWj1~ z-*URn1w^05`gYQ{LwEay)@nO+d$ya61>2!xoG-I2u-&%6QriMLzmRrHxSbu;&JOQW z>_9vAE?sM92in1?zuel{VePE3c681n?abwNexr7N^FGgS)Q;|FzoDI?b*R=RS1q0W zh+fM2@1*}uy6*G8Lr>HoV9PUn*3ok zsl62A@J?%^jN8~rZS3^2-Wjzackg6=m69wQEKMJu{xoq3i+_^%CyAQppAhXCc-Ei( zMCRqqpdaRRofArH6|Db7`d^;@7j%0Dp6P$tHf#sIozr!8Df$}L|0ex!s<`Iw8JH(+M-w^cpIs;)CuX{VCg*+uQ_^4i%&?dYDk3+*KP;8Vz3qwH=} zo%@Qune~52|HrG*KVFUgfu3k{LrS#Eo&K-sRjmI@`oEt3ub2D3wgrYG_n}VL`M9*U zllA{d|IgF^gKkeDv@P%-bR6??YzzEnTi}+ZDLq#mkbYjQo~I6o-ic}Fp!s-1$$7D; zoule`tN!opf0ceuW=;QGRbJldoxe)TUaV#yRx1#z9f;Kl#P$fpG6JzZ1F^jVvAqMa zx`9}|K&*Zswof3I8Hnv0i0v1M?H`CW2*eHu#2N--2L@t|00fuQDknh_joy) zI9+>`=#5yfNqSAnSC5!AqkMHVuL&7v?SpOPs9Cd)s&CrZtvyuMvbc>})J84u6V&oP zK`peCvlgFViTecF*F|r|dTr8cdwOl?_Hn zX(z?)WKcU9XeU0q&Okf%v{S2A2HGiV@^wnITFcVMQ5`2`y*ulBlD?;>@9F7#LeFUn zeSfFxh%0(7>wA&D7u87n)?Uz)DfF!_5Su$u$7>P$vbZ;idy}YJcW;Q@aO1RX-Mx`7 z&fOPS)%UilAG-{5Mm+{dJ9*qrU23PUSC_ifj*dBXt?GIB6e;&9^k^b_KI`>JujlFY zpxYB+ZJXAEo>+s~OE0JEaY^(7*6WjAAA0<3ufC_(w{1EOxnJgVJ;I4TiuHX+-^bem z`#{&{l+GV!TVNmPn7#aDTVNmC0z+&I=uuPJDdcuCshv!;go;oR;@;8C)s*kO0*rWS~}B{^(Cwy zMEXJAr#Q&d53+6133|=t>Enye8AY#P{b14$h8`b_4klf<#lg_+-8@#KgRMsUEysAR z^H6DL4YzX$wR4D9qeG}29W4$)J30OEDVn)Yp)*?1D_L($dSg#-4EnvOJD%P8l-V}O#FKr6lo}X-cX;bLfN|S60 zG_@^oj%@**xl21cxt&9)okP8L4yAT<3ml4eie}+cT&kZ!&t-3qJzq%QX`*MSc8=<< zs=9Ml`=`7AxjU21$Mc1%K+0*x`X#%RuaiK&(|Dc4Q#dIuJW5 z5Ni{N9UX|Z4aANK#IggiV*{~vfmr)M?6^Se_&}^fAa+6^)-ez}F%at%h@BLObq>T% z4#Z9g#JW_A>E5mTpY)Q%ohkk6&SkTxmt=W;Jqx|Wo(OIuNfvrZV$O}~40e58_hebm zV7(dX%{;xCr#G{aq#S+lCZ}tk5IvLi=A<_#U1v4Tp(k6}tfo0+%=+H6QKY$zBJyru zt&jFGX`>OhaTv967`35i42MN+$ocXHWc{$qT6?I7SuD07u?58V_}2oWJ!#x3-onPE z?a=2sUHiJ|tyn*t^usA%J(?Zv>4!tlsr5}tv^SitqlTQmeAvK;Fi$sIp#KY zw}ftQC9|rxw5l(*s_RH3?R4aJj-Ymq@Y*>7?a1qG8r8bMYIFqJDL)*a;xqRtbW9UH z#d<5!TS1S{0a|%_E87Acpl@`#j*g;tXZ=XhkMy>{k6ZJErk??QyVG@?6+M^r z)}*)g^wy;77HwVK(2|wm^*!vES?1E$#H>c8;QUjzT-}z4Rz*NBhrFXeT)k zpJLw+)3Y!=3W%P^dK=Q)&=$~M)dqSpOV7j0M?=hVq8>v;%xCdv5|5_3sCaZtEV>Kg zF;3JYkcb5=wk5GG#Q4767NWi>{FAe7UvG;F*q&sSZfli3#VV~wHECxQw{r}&bBx!{ zF=)r0W^Mb+F=!{}Iedz<-KWswqv(aKXOo@{J-!{YJv|$GB6nCyw0=(4Bdx4YWc^su zkM(jt7P>tv+j2h^dih7l{aUB%Fly9s0@yNF*1Nu`=*O`szrL1=#y#wW|HSPf2p7L#a2k7fF zp}+2Qog;}pkM$EsKLL7to1OsOp7L$_30CWapf7T|&bCA^W4$Bk9lgqQ^z@F^?}~j={mO- zeJAT(Nbln5T|B*uZM}ZbPgY&eHd{t_`BuLkYFA15oOAd6zj|Kker>9E`KBbx>Svod zfmqi-?9@Q)v_S0iK&)FJc19r9JrFxH5bF_$ofU}n48+b3#LfxCdIe&+f!Mi$*m;3i z??9|iAa;Hrc0nL^VIbBw5W6T4yEqWLBoONth+P_pT^5L4UM;4xLEZnPmn7~=>0fuY zDL?y>sJn8S@_Kj*y~LiVZ+$R@UQ#{)y`-n>gSsb+o56Yx={eBjGqxP)`S<^HbC=^y z&w<`-2=q&wu6;uEOxC-S-qp*!tEYE`UNju~Ag62Z61@@Yr;>gu<*wuNsnC-dIzA^F z57)n=ov3|N*0WeVjl|Qud{2XDZv(JuoMt1^c;q|L>DtRhZ^ioQq@V8Tr$e{r^_zaW zZOKW{r#fB73(>P#??!qzs)im3x_Npx+mchEKk0NGc|`BX`Wd93;pKjYr=MY4au)R0 zoUUV-=qc8_linSAe8$}!y1fm+D$^bM`lp~Tbh?g)qIYNgOw!M!%IJP_CiG-N_miAb zh@U!9$5Ih7wVc-jnp6p57Dsop=L)={;@hErp&~k)GA)(LwZl*3TyWZ0Pa%>Diuswr#zY z(D!k=9%n=^VEr7@&!OD4*5_EQcWVF6SqrhL6ZI%1;wTn-k=Tnwt#vPm_Kbe3Mla+$ zdjs^Novz0_(FE}aF9sqrU z({+9#dMWD{kbVJl*K2e?xd3{yO84vjO&~txM4jD;IFH2(Nxaa@_dk-RZlYJPelh76d%0f>-JaTQxnB%@{VC8tak|a|MPI}EC8S^C>6du=CD3!u zfWF@8I-eB1lJ$P1_k$jvq4k4q&jh#J`$3=G3wo8)b!IC1X4Wqy{ZdcA)YC78p6m<# zKd0*)SM(~@FC+aj=x(d(K7JYW8xx4#6o}m%h}{y1jSa+ZtrpXBM&19Umn80%9<=+MF^_slp4Y4M&`a!j_BLkZ z*@$#KdPy7C2X#*tH-q*5k*-$^`$Kn6Q0VW;{cSWF4f!M|Ykv?qljSQSS&t}JQ1909 z;tJ@AL|yr`$#D>SI8l3(h>cjhlEf=L@yeLk|1O9ZIZ^wfh*>NSAaMXhH>PRU10XJ+ zeY)JgxHqmA4L}9TAAp|kbnVrmw_^P&(yxLZAMLM#Zcm;!{VM3qWsG)ctrMM7JLggl5lKw_FF>R-6y{6({Ss zDRM5$gCbe?h(TVR2SK+dNSi*$w&Eh_3!JVau;_hRzn1iCy*ghD-JX+d`n9$dKZ3r} z={lB+p2zy&NPj2MG%+};iuAY&t?l~Hpj0|VM}JZBSs4;3T7e-{0qw~{Y->TxSqE{O z6ZP03VgZXoNgV2lLu2CX?;-x{L_P9|IEuyVNW2cB+oLq=>mb?_maUH0p^nLIsu$L& zNY7OC7$$ll>jk72czOYJd&08m1G-vOb*j;hsJmx;?Mg z^x@ERnj!c0PS-hy=%uWWAbkW?L$~AzPagq&_L0c_B&X}_Mf7>Bk0gDhm-|TQ_B3G2 zeI)c`JLKNg={gS*y^Qryq>u7)9|ip}Jru4oeH8SfPRPB7({)BA`V!VhlRg@Hd@mgB z>7${q?~2^db-K>YM6Y0d4C!OM%8Y?-&z7~^$3V|H3%Ot9be-jizJ~RiNWaO;{U+%6 zG%HNM3Ht2b$UV>LI$spMlJ%QOznOB^9&|JG2#d|%lb~% zZzcU!(zP15S~W_w8qJ0y-?1v{d0<)kJn-V^N}yd8yclPC-Ks@*pZ(c?v-3l}c33Ex zRX-0b3dF_*Vz&iiw+CW(1Y+X@u?d0L#6axMKR9O%B8!48*1cVh;skQvO%AkdwQq!yF&E4qFd1K#=Cx}d$PD0tQV191U)`~D)RIq=fci2{Z3i&?kbR8>1&t`o*>Ek_pyr+-1t@t8xf5quK>WJQv^$C%#b)G{r0t8CjD+t zzZ<$em&^3Kp_hMw+}Ai=$8yp0Sigt#d!WaA_dU?-BV_tL(3@>Q?v+m0qk`!9tlvxe zy`*cc@3mS_)2&zZBl6wkL_Ma6Sis^W5+`}pm;}+Dm1X%(LcYoE$akC5_2?w}DAw;I z{XS2>54t_g%Jlo7Cwh*OPf+-~)AcwfdLiq@q!&{)bU!JE{;@t_ZHDQ^wk2zRD|+Hz zr|S_@)+e%lKk4^Fcl)*K_d~ZQ2bq4qZOOW-7uH^xKF`%-ujs|BKS25ep8kNRKLEX` z0dlYBbUliTK8^Lsq)+xLGa0%)bH{R@41IlLXb5PEW= z?u9vrBj3hO)Y*iHb6K21;uJ66DG=?cGM4WYTk;|3 z_EZ_uAA+9jfZUIAy3TM!pU3)C(x-a4PlayJXfS;$^!}$H_jXR#xsvE*tWP6-nwR@D z==MYf)2Bf%?}pqvIbCO6qAy|nVbUM=^oOC_^9W3T7<#i_$UVpDI)4+rg7xX7PxmS_ z-P5N-pM4>6KhxoZ87;psD=+tUFo_ZiTWdB{E2={lzry^{5rq|byN@BK5O z+pq0Sp9#HxK63Btbe)}wzM1t$NPoo3{SoN)D|pi%fnHvK+%I>!&T~btV*Sxb*Y6@9 zg`R$zS^?%yqmkn^PSKgMC_7o16)DxI(b#LtV^S=Mj z`+qGMppu9^AX*Sgob59?X$S&w8{^H_1LCpOL#8}Ert@Wdv1Vv{_v$)4C0PwZJw zY^oxsSSiOuuG=6hl| z>6To;+{Zf|J&)*ZtUlT3lc~qwXE>RpQMgpH6+qcIIB`bc__D7g+r{qd%9({W^pm5j=ra@gOzQfMAk}A5AJT}qfA4gR z&7zO6`YfZ*O6aqw>$?$DpGAFR4s-v-=@{ijA8qy7MxUL~XH(a!`&FM!y~9z=J#$rf z9E|yb=%rSlWAr)HdUXkHQcJtp+5FF=3d|Fn0bgk#p*8@{e?vCFHqMjzK_!}hY`KZ>T``gH=)m^{@pLD2W>q<^|{pZPG{~1IUTbh(dSwHMWer%sF@e3 z>$UBwzev5}Eau+S>6llEUT*byMxU3+eI9kanp^dG)Pu~M(xM&hbj;9Xd70Jc8-0Ev z_xaSf9)X#F>hq}&xsU{zA>-csS)fZ47Tg==$IUO@u z(YILr6{EkB&|jghSL~|(3iT$pF!%GEjybXD)mDGi=&vT~{Z;CEO|9y$QXg_BbHB*x zm|cs$!|Dr-zA#bm3#seXcd9R>zVUwMeg$+KZ#IwK*ZBKKmNkzw-7-HtQ?jgiyjkIi zz2=E6^28Q50AViB)=H?|5RXJh68@ zvDKc~8c*y!Pwah9Y^^7@&J+8<6I<_zZScfC^u#{$#6GSO!|`Uh#H5u352W$c9dDMK zR#I+SIA+V`Y$ZWZPyVXIqilD*UAx2HD^`{jD~wo?Xm=G9_3Fmmd1YpW_DD~&-Su-i z+JWfVR)5XtuO;-?sOuGjs=r1(HJQ0z=XA6v(HmKPkT*4&)f$) z9c@$e9IG!j`eN$wab_`f-f(lP>WisYyvW>#IvuTC^yXH7-RQ4Vj~^?)PF=4>Q~h=7 zP0E@3eNIPzA$lvTFNt)VL0m%JovB?ySwDwe$Zf2=G?H<&voulX zOR4MCOR6uWzOj;dKjC!rU!te2zRc*$68bXg+zKmIUq-#dI_5sk>F5bX?_~AmMqi$& z^X1g_dL7l5Qy;sLxj*Z4^r@ofT78AlS0r*@L0v!FQuP(on|#6CXF46dv*_Ke{)W-t zNaX$obv>W0`Ww`PO3c_w<~bexyy!iw{$`}(HRCs_hp!p0#r;_}{=^*1oq~};lme@~ z6)D&^-b&>77IV~dtD56my7g*pMvhCJjxk2`LaVPd`pSg9lDeLeQ+=gwy?W4tx1EmB zN|py%{cWSaO+DV)-=?l-iBx}^da5CFf6wU{_e3wTdS#@eJyu5bi+ZZ0toLPBxsq~T zW9I#llQDXVJj}}PL^7;*D7zylj0o>gPffvAtZ2quH#-qyuZSb8xXOsD67{@_qQ1_i z`L1HVO^#*0UpXD4xagy;{;tvAP3Z4ZKbR-`RDYNHkQ15vcTUHAK=e|puQvK>qoX!f zYi*QppFWNG{_I4|CPbWK#WhA;V?@;W8j5<9r}?g7z8%hFzO~*BkAE>Q5xvan?-~6) z>Tc^ne~-Ez52*eg^|76qdp)OPh9mkstG{pb_f77ojrX-SI-xdF7ct+xorw97h~-vX zYs9sQeAiOc-oGwq3u~Eg-j&SvK&NA-CHgX}uZwiFl6BPGsI`u=eh#S0>nK-T&Agj9 z8S^!fE3N!NB%@Y8Fg2kO+(}zTK{=B@I2 z%0mV*?^aI6{88j8D{qKoWVs=c_Xg_v+K%cQsBbJ`-ff(YnW*Sntp1_VKcw#ZJnSDI zQV)W12)f{(>Z1M#2?Fzws~S-d1Bi=v9CR`YESGN zPwZPy>>r-kcb?eyp4bnb*nfFqJ3O%;J+YrWv447EKYL=ocw)bLVmoWZa9mg=F=-jW zgR+nBIxeg-Eu$*Y?yA@_^!00PcU9U8jbpp(=Gq39`d!kd#IpCk>xg4`8-mvwLXs&Y^~3k zpMD~;=J$C#znmVSjDAVvw3W9Qd5e*^P>vtbY>CTNJwqA2o5-E4yw%8Cjl7j|{77tT zTrRyjl+j0uoNMJTjQoX>zn~mHg8U*b_xO7#qo)+*jn3|Uq9YVRJYc)cz%V~hBA71kqfN+m65+P@>i7g{ah-46_;}d zhBC$pkqfQ7-N@UGyq$9V^@{Crxz%-{jL}BqL00}cl2NB$N3zsufOE=t$k*%}LIvZK zESFfNI#N)l)sccat!94uoq>Ue(DgF+djoXEqh{Ed;nG4eN*^}UoTe-oGG$XgN==M;?Ohn{)R{pO@#=iSsku3Xec5L4r?G(&iL@8G#NT-5dY0@t@f_vvbT7j!Nc3e^|Iz3_CiEYv$L|vJBlT2Oep`Ja)DI`}7L-t(w& zAN{09>bP63{v4lE#=DC*Y#9E$Hq?@CJc_|APnN1|89$pcel}%5{h4LN@6i3TuECa} zY0-i!!ZpBrQI@w@{THMELY?=s+E2IZFVy4rcmGB89NrzK{HjpL%v1DgtN&{BUlY0i zN?osq(z{asN}Zqa(x4gZ=vTcba!GI25oWVe&JJ77&Zr!0;hiieZ-j2)oh&2%`7S$k z4bB;f`bl3SYk*_BQQmvJ+XZ~ zvHd);{XMZpp4b7N*nytdL7rG+PwZe%><~}v&>Aru+hPBc{W=(dy<5K3{yWIbkf`gw zgUnj8#49s0wVemDo23KyX-n#$w@Pgpm4?$lZ0FdMWjWL8DWj*TyU_v1b}8!k#4Zts zJ_fO>Fci@aWI4-<8Ai;Y=z3Q4dKnbspYfKF$$WF3fL>k{>S$52T;J-oA|3rjE$VJW zs6{#ciGa0KUN8o7X>lmauR+eXa%LnW%gjVQXHt)UI%B5lmpuc$Z*$I+WdKgk#UEqw?tSkaOHD68#pIt(+CfnB8PWvg~KwdH31!Q=tTI z#)zIymYZ3nZloZ;x{-pqsLT8^Ic3y4Hr3VqPMQR{>b7u;p}&;n=2qT4l40#mIX=Gb zPF>GtslL1FLnl*r^HKD?q90@RdXbL2>rr?6aXrfV4o8*isk~|m zl96|P%C1FgBvbxMUrATJzUnzsp_jYaBt`;RZf*5FjJ}7_u_k*k_f(hbN`fV#d$t$G91>(78b;?7XVXeY~Qt7jWMJCS=fbv=Wv^QLU-{0zSAj;y0> zt)r5=SVtH^rJRnooV`prdnL-*i{U&2zw&~u~ z-QKx3Wj)eYd2f|}rrcv#C}Tty`5Y_n6Uk`x`%p$dD6M`3$C&XmkzejTp@KO8maWn- zQjlN6NWuQykooDct>)KI^E+!6s6V1u(xWY`sdVx2SOdQY|-@ zxe(>pT}90FWx1~v4>ICG6y2x+@gNoFQQSaLa#9h;2_hC+v2i3~?Hf~ceQaZD>?IoM z+BepSP>kh+J&tgCiMz?7>mJN*`O!{EnUnrTar+emFjnP|EzgrE_yRMjonT zWT%m7yaMo2^a{YPGq#rmIOf-7ca)DMMBRB{eJ3hndUiKQa;&y*tU{m+DcBMCFZcL==)f- zCFW>L%y}s-TKUMZonudy<)Kz@V)Q1|_V0=26{ZO`22IcV?>GoN|!e6?vC989kmX zPq6Y)kqql7%5Fr_NT&RievYE*M`_+cIrJS)N8c&SQ>=b;q$BU6sk{C7Xy&cgEUJ7o z=Y;&$CL4 zNWuEHNaWapIqJCv&9Q~%IF5Sm<6({%kwjl$^_G#2E!Q&25oNWcte*j{a!ak-?etLdI^E+PGzM68YC&T7Cl~0Idto;d;A)=8A(z0gSs{Upu1-D1>A z_ETZrn7zpI2CJWJ^pg{Helqp-Ki+!Hf@016WX*jf^p@SUtgqawe2V6M%Im0=K~BcJOqRD;`P4{8 zou8Vhl~bwf751v1s`~xZtDTM+p6J`G{^v+X-hVcE|CzGhe@W#(YmHP^&tqt9w9|aoQ!j8jX1=2TZ1wh$j(Toy>bX7T>d8yaKKUM% z+iN|ySSr~E6CmR_(A}99$9eAfZ`Tpw6+F(vF`*tA>QD4Muzv5Z@=Z&IHID;3cw(n} zVrO__9X+wXcw%RIVt@6-I(cG$^Tf{b#Lo7_&hf;~^~5@RV&{2cxt`eho>&)8>;g}$ zt0#7$C)UjqyT}vk?ulLOiCyA}UFwNl=80YIiCy7|U0EZB<3Q|xvR?-eVegi2_0_m^ z)I!i-q!aBg%~qoCV$fES)>d*mTS=8`f7p}7&9r(4qjyO37agdl8lk^Py+^U}*s#Aq zI}kC;il;{+TJ-6rMW0Sh&mC&6r)#c9EyFr@cQRU&EZ4X48Ad*XvOD%WBO#wbIdu!= zQBLlta<-K_8o8s%xg+J4yg`cQ+);C`q+ID_v~0<_p_Ts<$=G^-q3mV`=#T$GJ(a`y zZMGb>P=8!lzvvfaxsesmj6~G$nI_jWsp;J>HP76wu7!NImgPKA{n*NiE?~i*NM8`6IAo=qP; z7g(orDC7T$~<$rLuDcxm@acMZ2y+F7<8a&pYJKo>y_d$<;L|)iuDF zDdlvu<(zNIIp36np5%O%lWN1Bq`_Ore1ppzBd#oWvSJq_cA*$=m0c+6-MuyQF3h|) z9xFBTE}D6xiL85!;!@5zwww!0ITx7BQD+yJaxfBJp!GkOYteOLSpS$0h@NZpu14>g zSc|UI^|}FFi>}n4cw8Q*^kn^a)wLL*Yk@h2l+)Fgb752tdYKDZPIzRVW-oL3%C!8| zn=V_-N@Q8ix5!udR!8%0k%BevmZ*zv%vP^M&}_RgTV91aL9^|q*=9{*onxjWC0u69 zxhN_J{lG;m$Fb-hM3pY`2c*Puk#0CO-YC*PKHu_@B z`XxrcB%xnIU9Z^CwYY>jd;6PoEiTcu*r98I8KRWa*OqgsDd*BeIhV2=eQ$= z5l8jQsi$tCKHce<|B61y>Q@;33hMFk_6q8H#fj=yP_LLoeT&mElNNoj)vt_n?EhC% zcl-a9l=ZzODql%?NG0WFQ>4yuT$vr-RmfdotpDRUvVdn8aUJm`@_iRB7ch?HEBMs+ znBofK9+F|r?%*Jrze*0iS_ctdV6A5dtwEiSRYU98c*!+o>*T`te+>=-xC|) zi4}Tc*Lq?_p4dQ7tk@H~&J(-d6T86^8{~=I=!xCriQVjp4fe!t@x*TR#BQq*L%)dq zPg+QcZ6Q6P7J`1f2U|#d-qM4uL_Y~kTS*V?JAPs->48=P9ec9qL#>_{=@>2ZsE4Cv zcZ`-Dn!O`mgE3CQzAwweta4SPAjhi`IbOva^}SM><5k)Nb*8@7>1aiw54UiLn59w?u>>w)qq>-(iN?|kin#!}98GFr9BqpaL3 zl2I$YD93xwUextHQ>ypUE%yfX;Z8^YAo^&l_cnTO>h6dY<@KhnSFWkvTkBlzSSi{v zr=zElH@Vsp}nKR4=5SdW?F`^svq`DvG|?>em|mTBGC0@mlIB ze)?TSImOGIh%r^fWmYUQVo{fl;KCXb`IZnhpL&UXKyxxe{Q;fI6>nXBl&e43YXTB8=Q6J`X%veO< zVD%e}enUdPfx6z|Nc9`Eo?oWE*y))2h+bv&K}H{x&<7>-L0Z?FsRuK{y2dO@^i5X3 z(dai)kGGZ^sq2+dn){8^Qw`RnMQiJH%*SMTi`8$6bnJaMQFr^uO_cS{#46vU@+p)D zIT^D$k+)g-=19gqax>-l$a*t%y)sJmo2ge^MSYIbF+UW&+UkQN9eEEnc@L(nS4OEk znDUU}l&hVLS*FO}S^1VoM&7q1^1g+--pN|^Tc~%KOZ}MV!>x(=s^~kceyh=MrS5uG zw47V1r%KUsWDvmD0w-d&E6YDy@wP}rP26T`;x=k}$8gQ{Hm&2j??Ijb8OMHe!fQ+Q z9zi&J7(b7=>l~uqEoj%ZrMu2McHy0aN+iRY$9_XRvD-bdJ3O(Wp4gq9*j=93-JaMm zPwXB~>|RgoK2L18Cw9Ll_JAk$peHuM6MM)L8|jHX?1_!?#2)d)9`(c?^TbAbVvl=b zPk3TadSYWdv8Oz-r#-P}YQ%7KhW$_W>tH1IZuwSUg)A{Gq{Ot461EWiJOFJWCE8b< zz!p;F+8*{|F*B_^B$Clr451t!wT4jF>j+gJqJ72X)b}h4`wFxN(X*_6yU}l_9`8YK zr>@r$s(w55)ZNsNaXMO-==H6Bhtcn#9v@fkpsrW^seXs{9c9$da{5r!v#mbV=tC1V zGnBgC7eMu)s((Pe!0Bl1l6ym|-x=xX^X{bXMy)$3>pcNfzLWBh%=gnG-Q{HT8M55S z%6A$0E+gMXS+CJk`7X*GT2P+gWb`~DH@5QKk&J!i?nHgxozU;5p6X8hHK(Hw6FtZ3 z!y+9=L&KuH!oMmFR7){$Qjd?*~oZ z4^q}^##DY#>w6OASx&}yCvw`#BaA$PvTNNVDC<>HDvwaPl5(Y!F=~q3(aH}Q`5_}e zL|LyaQTZXtsh=oscQVFak>y=E@>RaoF=k{Wqpn9L>Utz~{X9z5M^djiY#p5Xv%-BF zqqr>V-9IAzVWU4x-OU&>UvFt>W^sckEPz* z>6odA-reetMmq9-)a3mrWxbL?n3e2ltY3!pXs z7ibUS=a zy_?f94;Fop)t`=Z-YDHq#TE<%!Mq#O8QnFL+{eJ+T)(v3Z`@d{68pPwZt+Y=I~CiYNA}C$_Lg410g6 z#H59k*cMV6wGg!NQnrxz7+uPisAuoAjhC{$4C%W*En1mt)9{uJ;qVybs?{58y}}_e4F+jXkSvs za9hTBQ^t5x#(0*Y@7~w!$Fq!zt;~M+IbqK_LFExvo?zq&MxH=f-?`s_{r&{X!H#QD z$GN)HmN!)Y5Jp6NvN6tX;$^o?zu?BN?^)EamvI)w9&^>45!1>*QJL zoY~%@b@Hs%$*Wo?=vAehDYl%cQ8`$Hsb&qPvJ8C%UCWrtGB}4Dtz}HrGB#)#=%uBM z>9&k%Q5jg5X)GhYeW$S;eV4J;)HIfpYV%=Qw4Yo}p}&{qGOJHF`t*c8ow~j*t@?E8 z6?xPfy%4q|j2xoRvHEjHe=e~do};dxY^nNls^3TbB&TBx5`CW4XBd43_4rJ226cTm zuWo@E)HzG3HIRG$4BY}Z`kI!m#q%tu!^d2UBDWS8 zAw@5@dYRG7sJk8kTfB_AzRy(kGU}!+w|-m|sN?_%CxxV$lo5WUjsb0Qt>c21Nx%9=x2-wCMl9Lm9jfwEpf*4%K9 z$6Q2~S6lf7Bfnte7bxrNE-Jr3IrRZ^KElbE(TKd(%5x(bS`%(rV#|0bDg$-@Qeq8WVmbP1fUdzyET>{B*Io zzpwhs)Q7C5{(;jmBNe^c>I;m%fO>o^TtI#MU|e^h`U0)}U#ahKI_9>be`obqjQ$FB zH#%W&d4+na5_?ONhE?)4*zd)#1z~0^%R8+2su5pJ)W)k6^|)N~eU6l}S z{K$`-UB9YFocIaO zbGo0p_e+*bmNkz$D?G8+Jh4Td*kVuYbx&-GC$`iRTjq%^_rz9sVsCh2Z+c>Hd15O) zv9~?3N>A(^Pi&PZ_O2(k+7nyjiM{8Ez3+*w^~BbBVjp;7>pigzp4f+;*hik&$2DRY zv$6k4D+wM(%am{Rb?0)^O3D*$u$-+#um09nQqERV(S@y~(6vGA$>L^Oy~5}f3B7{4 zelCFO71YOGP5l9}B+9mIX zR)3v(R-pH?f1Nr%)#k+l9uvOK-1VAF)nBJBe*jG$dZjY@4Ownv^(B#xT3JFp)npar zB?);6<&=C5iAd3X?9uzka$_qmjbzlpQp$Wqb4M@gOR4K|zUIADb@|*3=$*r{2K|^U z=U9E2(U(!@vCf)&>dO+jFH^nMVCZrWd#x4ph_c+w>dTG3oH}1K{YOvg%Mri15E!=#~38K+^0*v%D37#t~B~e>g)-3Q+;JZU#a?F&P1YnfMYZh zx2@IRHu~Gtd2B!P3g-THLVsKJoKeU!x(7JMMOjW;z0&BF)Ol`l+U3+M6MCiUa~^>n z-3J^atSoo5`a4E{hdS?`J@GQ??Gp|4fFT`BbFe&Lw0$#TBc*BN~sb>73}^9!l3OX%xVucTgn zdzd@sexesx{R5+aK%K8jG*a$l>jH~M<&Jbt~uD|26; z(ATTJje4oOQ#j_Mq8D0ygV8ro*OBi6>KhXJ2GxtkA@}G`;h5RVaLquDHG?^_=!2~Ok~cKc*g^&wQ+UHFe%29LJw+!sAbOmUGwDw21t%fBaNV$+G70=SENL6Hn|@ zPi&JXw%HT=%oF?E6Wij6ZS};y@Wj6K#I|{2UwLBNJ+ZGnvFaKz98*KhaKM%Cs12BJmx zcE@&>0`X=gpN9HrrYSZO#QQj{+a4OP>=5OjaDW47^{D7^v|hx z#st6hxzs;T=%1_JeKKk#y5~3Ar!1FReT&hzQ0I~B<>ye}lF+xP{u1?q5n&&SmM;1P zt8X>>R_c5=!ZT-6-8Or=O!P9VZ!`Kf>bwg5;lDBWZ6*3q<_3%z3d5!>mqm(npmh+V<=PQ=OyLGnKa=tR@dvZl|p8sMh2C?UeEJG`<8{Kj^Dvd4ZL`HuBd-{+hCW z?uW`>8@XMWGkScH%dK1;$+%LwI+Eo~*jl{yjfZ?KIa`$XgCl}L^08Fu)UI)Q*Y!(? zxqBmQ3(A8AK}PjF`Rkk@s~WH0WXQ92{XpWis!Qej20>BeNf&4$RzQ$q6haCnzgL>6194zgN4e@h;jL91FR=3AO-EdK|=Ue${`K?tRv*9itlUN6I`@MHtI)Cr-|8EbZn<>K`ysnC;2`%+2fK?SAG;yT`rCDbbAv8f_2n4^^7bu0+;SbRlXSg1qRaJ)QEkY|oOTgcKGLAzcj zUiWS9g}0ucy-$$Bst5IgKL^3dDSUW#ra=1y88*C|)DwK!9r>s&--oNnvae(fq9%Ix zeq4S7zjhL9LVq7$Q&JD-2KD%xm&;daUD??8O2TI#8Ri7}vgB$9%?J;-EE9B=>Zz@h zpS^6~Z}7WMXB{F>e5ViHgZ7b@(lj_MctwJ)KB3`(`uq#CazAn9;wK$tOCKb^)l7aP zBRD)eN2*3E;S<@&@3;*uztKwCL-t|1EzXlQ!|&I893e_wv!&d+;kQwv6Qw;)jO9OJ zbJgKcTyD-pZpf+DZ{{@fe=8^0XNsK)I%K0KDv}lcUY=#L``%K|uHkd?b9`dYLaENr zq~Z?dUm)Z71N-Np*+<7izxn+ksY9|4k>7CpTg_ia1!-M2kvwf1%#=2WXa-wmd3m|~ z95uUNv>!=;4_EhS%hCyZT4B}U*KJ*M41T%hK9>VA;BdNSm(N>q*52wNvvi zefy!7LBF7bjQZMB*NS>-`333AcJ9oQz9`;PBi=dIQ)lQX7VR^x_f6JSzo6ps=}0Qt z58Ur!KR7bGHZzvbtjcODPyC)fl6!~yiU0peS@)zS#s0ovb^HCV6QphXLH+vXT;Ho` zV4nf~PiuNyi&jl@diC!)Aiq!lt50isVb?Q{ZPPSoU~yjm{Jg#c`u94m>5aVxHf`T- zkKNnmom$kVXTh08#W^DMA9!lsX-x}?iwjR}*>Ygdf?oad2DTVb*sH(%toMMTetE^R zSafyE{Gz-YMDEwO97DmeCx&P{Xj`WBzVfZs~^~d_lyZ%_Q=#LYB-m8CpZeCHIr1X2GBVR36E3DnqGGNDt8Qs+n-~jKsgLqdR z-~G`IPLh517WscR_JR!T{+F2DA0KA6m;4C3ehYc}c7K#<2Yn1&nW+=6yYGUQLAU>g zUBBD!?)q8>HFy2(v0+nE{@ur#w|LK=&O9%dE*ZE$W1^nKw z87-n1F_0NXj9rg^HKWzv!2Ag_-h5faNPwrSA!i^qIjf^QUBpe{pOabD!aXsg`lF9{ z7gHsDLu2{F^>TP~wNz`i%oJ*lus?l}2cUDd|F zJ{dtD`Auy9b{TsIb1`iS()c0|%-HUeR}Aip?SY6MEN!Azod9EyOd#doUVD8l6Rxb_ zWQkmzwZA;^=lYOzWoO!1tD}~puRvs*S0L(T;8;%|m@G9rp;j>T#9A_7VqNRY*L)n; z%lCW9SKVXvvv6|TU&;80^ItU&&%kh49So75RAm02drhNSGSb&Hu#)bz z4EKNk)BgCY85c@sQfJ{d=Y)~d1)MX&V-Lxmk5mJ`dk*_U%@}GX9{Yt`HIS_-hh>2- zrDO@+hAw5u681S=swGR<=X5DkmKsD$yU7wV(Vx|pC2V|Msv}D{64a$ES=uLBsw+#V zZ~fWsvV=*CF4dDI?6JC3UzYZlCA_YWwM)yhx;bFoHFBX4-RWulz*MZKtG7$lBxWpYw0#Yp?S9mqdcJo>|AP z9A5Et*Z{s7o04rJKW}w)Ivu38U7xPY*F;lNuaeJuulH*m=>7CkQp3nsv%WZ8pKFm3 zE(gp9dv7{8z1@~|(>q-kMz9v!zbrrHu%pvq1Zz=#X-8T~N!77Q~O`Ee+NGY|Ox zKac-EYv5Oz;?z!I53mpH7gcvY^X-r46=Y9)C@c8Wk+avK=NT$b>>v1f8+l@%Ny`&+ zith5n_?0hDj9i8C#Aq{Eo+x3844rsw5Mxz`{C<7<_Ze7Rlvg~UNR|_PwPs9Jh6Ud@^tH?Io0RiOZZ>@e~7?XKeVe03VQV_K2G{pxq7YF zz~YX1#d*8p$J==Q@b6GR_}lpt-v6(eU-5-06pb*PML#e4=ZkY!PUa7=Zh!QVk{Rd# zdBv?TI4`&=xaN=kS@e52w-av}(GPy(8`S@R-}w2z`=fui{D0T~z2E