From ca60b88ea0e3666aad6d3ebbcb630dfa7fdaedb4 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 13 Jun 2024 11:54:38 +0800 Subject: [PATCH 001/113] feat(psram): support APS3204L --- components/esp_psram/esp32s3/esp_psram_impl_quad.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/esp_psram/esp32s3/esp_psram_impl_quad.c b/components/esp_psram/esp32s3/esp_psram_impl_quad.c index 12a428d3d77..3496a90bc5f 100644 --- a/components/esp_psram/esp32s3/esp_psram_impl_quad.c +++ b/components/esp_psram/esp32s3/esp_psram_impl_quad.c @@ -62,6 +62,7 @@ static const char* TAG = "quad_psram"; #define PSRAM_IS_VALID(id) (PSRAM_KGD(id) == PSRAM_ID_KGD) #define PSRAM_IS_64MBIT_TRIAL(id) (PSRAM_EID(id) == 0x26) +#define PSRAM_IS_2T_APS3204(id) ((((id) >> 21) && 0xfffff) == 1) // IO-pins for PSRAM. // WARNING: PSRAM shares all but the CS and CLK pins with the flash, so these defines @@ -327,6 +328,8 @@ esp_err_t esp_psram_impl_enable(void) //psram init if (PSRAM_IS_64MBIT_TRIAL(s_psram_id)) { s_psram_size = PSRAM_SIZE_8MB; + } else if (PSRAM_IS_2T_APS3204(s_psram_id)) { + s_psram_size = PSRAM_SIZE_4MB; } else { uint8_t density = PSRAM_SIZE_ID(s_psram_id); s_psram_size = density == 0x0 ? PSRAM_SIZE_2MB : From 96d011cdfc30a7e7094be678037d1f1b479689db Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Tue, 28 May 2024 12:24:08 +0530 Subject: [PATCH 002/113] fix(hal): updated ecdsa reset api to execute correctly This commit updated API to ensure ECDSA peripheral resets and waits until the state returns to idle. --- components/hal/esp32p4/include/hal/ecdsa_ll.h | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/components/hal/esp32p4/include/hal/ecdsa_ll.h b/components/hal/esp32p4/include/hal/ecdsa_ll.h index 898ce1fd275..f3429cf1b28 100644 --- a/components/hal/esp32p4/include/hal/ecdsa_ll.h +++ b/components/hal/esp32p4/include/hal/ecdsa_ll.h @@ -71,6 +71,16 @@ typedef enum { ECDSA_MODE_SHA_CONTINUE } ecdsa_ll_sha_mode_t; +/** + * @brief Get the state of ECDSA peripheral + * + * @return State of ECDSA + */ +static inline uint32_t ecdsa_ll_get_state(void) +{ + return REG_GET_FIELD(ECDSA_STATE_REG, ECDSA_BUSY); +} + /** * @brief Enable the bus clock for ECDSA peripheral module * @@ -95,6 +105,10 @@ static inline void ecdsa_ll_reset_register(void) // Clear reset on parent crypto, otherwise ECDSA is held in reset HP_SYS_CLKRST.hp_rst_en2.reg_rst_en_crypto = 0; + + while (ecdsa_ll_get_state() != ECDSA_STATE_IDLE) { + ; + } } /** @@ -273,16 +287,6 @@ static inline void ecdsa_ll_set_stage(ecdsa_ll_stage_t stage) } } -/** - * @brief Get the state of ECDSA peripheral - * - * @return State of ECDSA - */ -static inline uint32_t ecdsa_ll_get_state(void) -{ - return REG_GET_FIELD(ECDSA_STATE_REG, ECDSA_BUSY); -} - /** * @brief Set the SHA type * From 0b272072ecfadcf6ba70e3406fdd08ac3e77e41d Mon Sep 17 00:00:00 2001 From: Jakub Kocka Date: Mon, 1 Jul 2024 16:16:51 +0200 Subject: [PATCH 003/113] docs(jtag_debugging): Rewrite of configure part for Windows to reflect changes Related PR of new drivers for wrover-b kit https://github.com/espressif/esp-win-usb-drivers/pull/2 Closes https://github.com/espressif/idf-installer/issues/204 --- .../jtag-debugging/configure-ft2232h-jtag.rst | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/en/api-guides/jtag-debugging/configure-ft2232h-jtag.rst b/docs/en/api-guides/jtag-debugging/configure-ft2232h-jtag.rst index 8137dd625ff..52e3e47f4ed 100644 --- a/docs/en/api-guides/jtag-debugging/configure-ft2232h-jtag.rst +++ b/docs/en/api-guides/jtag-debugging/configure-ft2232h-jtag.rst @@ -37,11 +37,21 @@ Windows 2. Wait until USB ports of |devkit-name| are recognized by Windows and drives are installed. If they do not install automatically, then download them from https://ftdichip.com/drivers/d2xx-drivers/ and install manually. -3. Download Zadig tool (Zadig_X.X.exe) from https://zadig.akeo.ie/ and run it. +3. Download |devkit-name| driver from https://github.com/espressif/esp-win-usb-drivers/releases. Extract the driver files and `install the driver `_. This should change the driver for Dual RS232-HS (Interface 0). -4. In Zadig tool go to "Options" and check "List All Devices". +4. Now |devkit-name|'s JTAG interface should be available to the OpenOCD. To carry on with the debugging environment setup, proceed to section :ref:`jtag-debugging-run-openocd`. -5. Check the list of devices that should contain two |devkit-name| specific USB entries: "Dual RS232-HS (Interface 0)" and "Dual RS232-HS (Interface 1)". The driver name would be "FTDIBUS (vxxxx)" and USB ID: 0403 6010. +.. note:: + If the driver installation fails or OpenOCD is not working try the following manual driver change. Otherwise, this can be skipped. + +Windows - manual driver change +"""""""""""""""""""""""""""""" + +1. Download Zadig tool (Zadig_X.X.exe) from https://zadig.akeo.ie/ and run it. + +2. In Zadig tool go to "Options" and check "List All Devices". + +3. Check the list of devices that should contain two |devkit-name| specific USB entries: "Dual RS232-HS (Interface 0)" and "Dual RS232-HS (Interface 1)". The driver name would be "FTDIBUS (vxxxx)" and USB ID: 0403 6010. .. figure:: ../../../_static/jtag-usb-configuration-zadig.jpg :align: center @@ -50,14 +60,12 @@ Windows Configuration of JTAG USB driver in Zadig tool -6. The first device (Dual RS232-HS (Interface 0)) is connected to the JTAG port of the {IDF_TARGET_NAME}. Original "FTDIBUS (vxxxx)" driver of this device should be replaced with "WinUSB (v6xxxxx)". To do so, select "Dual RS232-HS (Interface 0) and reinstall attached driver to the "WinUSB (v6xxxxx)", see picture above. +4. The first device (Dual RS232-HS (Interface 0)) is connected to the JTAG port of the {IDF_TARGET_NAME}. Original "FTDIBUS (vxxxx)" driver of this device should be replaced with "WinUSB (v6xxxxx)". To do so, select "Dual RS232-HS (Interface 0) and reinstall attached driver to the "WinUSB (v6xxxxx)", see picture above. .. note:: Do not change the second device "Dual RS232-HS (Interface 1)". It is routed to {IDF_TARGET_NAME}'s serial port (UART) used for upload of application to {IDF_TARGET_NAME}'s flash. -Now |devkit-name|'s JTAG interface should be available to the OpenOCD. To carry on with debugging environment setup, proceed to section :ref:`jtag-debugging-run-openocd`. - Linux """"" From 6c097b58129935ca476bd268253988ce4c8f0aa9 Mon Sep 17 00:00:00 2001 From: zwl Date: Thu, 4 Jul 2024 21:11:23 +0800 Subject: [PATCH 004/113] feat(bluetooth/controller): optimize bt hci layer code --- components/bt/CMakeLists.txt | 59 +- components/bt/host/bluedroid/hci/hci_hal_h4.c | 39 - .../transport/driver/common/hci_driver_h4.c | 356 ++++++++++ .../transport/driver/common/hci_driver_mem.c | 55 ++ .../transport/driver/common/hci_driver_util.c | 225 ++++++ .../transport/driver/uart/hci_driver_uart.c | 222 ++++++ .../transport/driver/uart/hci_driver_uart.h | 97 +++ .../driver/uart/hci_driver_uart_config.c | 40 ++ .../driver/uart/hci_driver_uart_dma.c | 670 ++++++++++++++++++ .../transport/driver/vhci/hci_driver_nimble.c | 61 ++ .../driver/vhci/hci_driver_standard.c | 149 ++++ .../driver/vhci/hci_driver_tamplete.c | 133 ++++ .../transport/include/common/hci_driver_h4.h | 75 ++ .../transport/include/common/hci_driver_mem.h | 25 + .../include/common/hci_driver_util.h | 18 + .../transport/include/esp_hci_driver.h | 52 ++ .../transport/include/esp_hci_internal.h | 121 ++++ .../transport/include/esp_hci_transport.h | 83 +++ .../bt/porting/transport/include/hci_uart.h | 100 --- .../bt/porting/transport/src/hci_transport.c | 175 +++++ .../bt/porting/transport/uart/hci_uart.c | 207 ------ 21 files changed, 2599 insertions(+), 363 deletions(-) create mode 100644 components/bt/porting/transport/driver/common/hci_driver_h4.c create mode 100644 components/bt/porting/transport/driver/common/hci_driver_mem.c create mode 100644 components/bt/porting/transport/driver/common/hci_driver_util.c create mode 100644 components/bt/porting/transport/driver/uart/hci_driver_uart.c create mode 100644 components/bt/porting/transport/driver/uart/hci_driver_uart.h create mode 100644 components/bt/porting/transport/driver/uart/hci_driver_uart_config.c create mode 100644 components/bt/porting/transport/driver/uart/hci_driver_uart_dma.c create mode 100644 components/bt/porting/transport/driver/vhci/hci_driver_nimble.c create mode 100644 components/bt/porting/transport/driver/vhci/hci_driver_standard.c create mode 100644 components/bt/porting/transport/driver/vhci/hci_driver_tamplete.c create mode 100644 components/bt/porting/transport/include/common/hci_driver_h4.h create mode 100644 components/bt/porting/transport/include/common/hci_driver_mem.h create mode 100644 components/bt/porting/transport/include/common/hci_driver_util.h create mode 100644 components/bt/porting/transport/include/esp_hci_driver.h create mode 100644 components/bt/porting/transport/include/esp_hci_internal.h create mode 100644 components/bt/porting/transport/include/esp_hci_transport.h delete mode 100644 components/bt/porting/transport/include/hci_uart.h create mode 100644 components/bt/porting/transport/src/hci_transport.c delete mode 100644 components/bt/porting/transport/uart/hci_uart.c diff --git a/components/bt/CMakeLists.txt b/components/bt/CMakeLists.txt index 6dd5ef9b378..24e1517aa3e 100644 --- a/components/bt/CMakeLists.txt +++ b/components/bt/CMakeLists.txt @@ -117,6 +117,7 @@ if(CONFIG_BT_ENABLED) common/btc/include common/include porting/mem/ + porting/include ) list(APPEND include_dirs ${common_include_dirs}) @@ -573,29 +574,51 @@ if(CONFIG_BT_ENABLED) if(CONFIG_BT_LE_CONTROLLER_NPL_OS_PORTING_SUPPORT) + list(APPEND srcs + "porting/npl/freertos/src/npl_os_freertos.c" + "porting/mem/os_msys_init.c" + "porting/transport/src/hci_transport.c" + ) + + if(CONFIG_BT_CONTROLLER_DISABLED) list(APPEND srcs - "porting/npl/freertos/src/npl_os_freertos.c" - "porting/mem/os_msys_init.c" + "host/nimble/nimble/porting/nimble/src/hal_uart.c" ) - - if(CONFIG_BT_CONTROLLER_DISABLED) + elseif(CONFIG_BT_LE_HCI_INTERFACE_USE_RAM) + if(CONFIG_BT_NIMBLE_ENABLED) list(APPEND srcs - "host/nimble/nimble/porting/nimble/src/hal_uart.c" - ) + "porting/transport/driver/vhci/hci_driver_nimble.c" + "host/nimble/nimble/nimble/transport/esp_ipc/src/hci_esp_ipc.c" + ) + else() + list(APPEND srcs + "porting/transport/driver/vhci/hci_driver_standard.c" + ) endif() - list(APPEND include_dirs - porting/include - porting/npl/freertos/include - porting/transport/include - ) - - if(CONFIG_BT_LE_HCI_INTERFACE_USE_UART) + elseif(CONFIG_BT_LE_HCI_INTERFACE_USE_UART) list(APPEND srcs - "porting/transport/uart/hci_uart.c" - ) + "porting/transport/driver/common/hci_driver_util.c" + "porting/transport/driver/common/hci_driver_h4.c" + "porting/transport/driver/common/hci_driver_mem.c" + "porting/transport/driver/uart/hci_driver_uart_config.c" + ) + if(CONFIG_BT_LE_UART_HCI_DMA_MODE) + list(APPEND srcs + "porting/transport/driver/uart/hci_driver_uart_dma.c" + ) + else() + list(APPEND srcs + "porting/transport/driver/uart/hci_driver_uart.c" + ) endif() - endif() + endif() + list(APPEND include_dirs + porting/include + porting/npl/freertos/include + porting/transport/include + ) + endif() if(NOT (CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS OR CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS)) list(APPEND include_dirs @@ -621,7 +644,6 @@ if(CONFIG_BT_ENABLED) if(CONFIG_BT_NIMBLE_ENABLED) list(APPEND include_dirs - host/nimble/nimble/nimble/host/include host/nimble/nimble/nimble/include host/nimble/nimble/nimble/host/services/ans/include @@ -725,10 +747,12 @@ if(CONFIG_BT_ENABLED) "host/nimble/nimble/porting/npl/freertos/src/nimble_port_freertos.c" "host/nimble/port/src/nvs_port.c" ) + list(APPEND include_dirs host/nimble/nimble/porting/nimble/include host/nimble/port/include host/nimble/nimble/nimble/transport/include + host/nimble/nimble/nimble/include ) if(CONFIG_BT_CONTROLLER_DISABLED) @@ -762,6 +786,7 @@ if(CONFIG_BT_ENABLED) if(CONFIG_BT_NIMBLE_LEGACY_VHCI_ENABLE AND CONFIG_BT_CONTROLLER_ENABLED) list(APPEND srcs "host/nimble/esp-hci/src/esp_nimble_hci.c" + "host/nimble/nimble/nimble/transport/esp_ipc_legacy/src/hci_esp_ipc_legacy.c" ) list(APPEND include_dirs ${nimble_hci_include_dirs}) endif() diff --git a/components/bt/host/bluedroid/hci/hci_hal_h4.c b/components/bt/host/bluedroid/hci/hci_hal_h4.c index 9663126ad62..47717803aea 100644 --- a/components/bt/host/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/host/bluedroid/hci/hci_hal_h4.c @@ -35,10 +35,6 @@ #include "esp_bluedroid_hci.h" #include "stack/hcimsgs.h" -#if ((BT_CONTROLLER_INCLUDED == TRUE) && SOC_ESP_NIMBLE_CONTROLLER) -#include "ble_hci_trans.h" -#endif - #if (C2H_FLOW_CONTROL_INCLUDED == TRUE) #include "l2c_int.h" #endif ///C2H_FLOW_CONTROL_INCLUDED == TRUE @@ -622,42 +618,7 @@ static int host_recv_pkt_cb(uint8_t *data, uint16_t len) return 0; } -#if ((BT_CONTROLLER_INCLUDED == TRUE) && SOC_ESP_NIMBLE_CONTROLLER) - -int -ble_hs_hci_rx_evt(uint8_t *hci_ev, void *arg) -{ - if(esp_bluedroid_get_status() == ESP_BLUEDROID_STATUS_UNINITIALIZED) { - ble_hci_trans_buf_free(hci_ev); - return 0; - } - uint16_t len = hci_ev[1] + 3; - uint8_t *data = (uint8_t *)malloc(len); - assert(data != NULL); - data[0] = 0x04; - memcpy(&data[1], hci_ev, len - 1); - ble_hci_trans_buf_free(hci_ev); - host_recv_pkt_cb(data, len); - free(data); - return 0; -} - - -int -ble_hs_rx_data(struct os_mbuf *om, void *arg) -{ - uint16_t len = OS_MBUF_PKTHDR(om)->omp_len + 1; - uint8_t *data = (uint8_t *)malloc(len); - assert(data != NULL); - data[0] = 0x02; - os_mbuf_copydata(om, 0, len - 1, &data[1]); - host_recv_pkt_cb(data, len); - free(data); - os_mbuf_free_chain(om); - return 0; -} -#endif static const esp_bluedroid_hci_driver_callbacks_t hci_host_cb = { .notify_host_send_available = host_send_pkt_available_cb, .notify_host_recv = host_recv_pkt_cb, diff --git a/components/bt/porting/transport/driver/common/hci_driver_h4.c b/components/bt/porting/transport/driver/common/hci_driver_h4.c new file mode 100644 index 00000000000..c31b71164e6 --- /dev/null +++ b/components/bt/porting/transport/driver/common/hci_driver_h4.c @@ -0,0 +1,356 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include +#include +#include +#include +#include +#include "common/hci_driver_h4.h" + +#ifndef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef max +#define max(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#define HCI_H4_SM_W4_PKT_TYPE 0 +#define HCI_H4_SM_W4_HEADER 1 +#define HCI_H4_SM_W4_PAYLOAD 2 +#define HCI_H4_SM_COMPLETED 3 + +struct hci_h4_input_buffer { + const uint8_t *buf; + uint16_t len; +}; + +static int +hci_h4_frame_start(struct hci_h4_sm *rxs, uint8_t pkt_type) +{ + rxs->pkt_type = pkt_type; + rxs->len = 0; + rxs->exp_len = 0; + + switch (rxs->pkt_type) { + case HCI_H4_CMD: + rxs->min_len = 3; + break; + case HCI_H4_ACL: + case HCI_H4_ISO: + rxs->min_len = 4; + break; + case HCI_H4_EVT: + rxs->min_len = 2; + break; + default: + /* !TODO: Sync loss. Need to wait for reset. */ + return -1; + } + + return 0; +} + +static int +hci_h4_ib_consume(struct hci_h4_input_buffer *ib, uint16_t len) +{ + assert(ib->len >= len); + + ib->buf += len; + ib->len -= len; + + return len; +} + +static int +hci_h4_ib_pull_min_len(struct hci_h4_sm *rxs, + struct hci_h4_input_buffer *ib) +{ + uint16_t len; + + len = min(ib->len, rxs->min_len - rxs->len); + memcpy(&rxs->hdr[rxs->len], ib->buf, len); + + rxs->len += len; + hci_h4_ib_consume(ib, len); + + + return rxs->len != rxs->min_len; +} + +static int +hci_h4_sm_w4_header(struct hci_h4_sm *h4sm, struct hci_h4_input_buffer *ib) +{ + int rc; + + rc = hci_h4_ib_pull_min_len(h4sm, ib); + if (rc) { + /* need more data */ + return 1; + } + + switch (h4sm->pkt_type) { + case HCI_H4_CMD: + assert(h4sm->allocs && h4sm->allocs->cmd); + h4sm->buf = h4sm->allocs->cmd(); + if (!h4sm->buf) { + return -1; + } + + memcpy(h4sm->buf, h4sm->hdr, h4sm->len); + h4sm->exp_len = h4sm->hdr[2] + 3; + + break; + case HCI_H4_ACL: + assert(h4sm->allocs && h4sm->allocs->acl); + h4sm->om = h4sm->allocs->acl(); + if (!h4sm->om) { + return -1; + } + + os_mbuf_append(h4sm->om, h4sm->hdr, h4sm->len); + h4sm->exp_len = get_le16(&h4sm->hdr[2]) + 4; + break; +#if !CONFIG_BT_CONTROLLER_ENABLED + case HCI_H4_EVT: + if (h4sm->hdr[0] == BLE_HCI_EVCODE_LE_META) { + /* For LE Meta event we need 3 bytes to parse header */ + h4sm->min_len = 3; + rc = hci_h4_ib_pull_min_len(h4sm, ib); + if (rc) { + /* need more data */ + return 1; + } + } + + assert(h4sm->allocs && h4sm->allocs->evt); + + /* We can drop legacy advertising events if there's no free buffer in + * discardable pool. + */ + if (h4sm->hdr[2] == BLE_HCI_LE_SUBEV_ADV_RPT) { + h4sm->buf = h4sm->allocs->evt(1); + } else { + h4sm->buf = h4sm->allocs->evt(0); + if (!h4sm->buf) { + return -1; + } + } + + if (h4sm->buf) { + memcpy(h4sm->buf, h4sm->hdr, h4sm->len); + } + + h4sm->exp_len = h4sm->hdr[1] + 2; + break; +#endif // !CONFIG_BT_CONTROLLER_ENABLED + case HCI_H4_ISO: + assert(h4sm->allocs && h4sm->allocs->iso); + h4sm->om = h4sm->allocs->iso(); + if (!h4sm->om) { + return -1; + } + + os_mbuf_append(h4sm->om, h4sm->hdr, h4sm->len); + h4sm->exp_len = (get_le16(&h4sm->hdr[2]) & 0x7fff) + 4; + break; + default: + assert(0); + break; + } + + return 0; +} + +static int +hci_h4_sm_w4_payload(struct hci_h4_sm *h4sm, + struct hci_h4_input_buffer *ib) +{ + uint16_t mbuf_len; + uint16_t len; + int rc; + + len = min(ib->len, h4sm->exp_len - h4sm->len); + + + switch (h4sm->pkt_type) { + case HCI_H4_CMD: + case HCI_H4_EVT: + if (h4sm->buf) { + memcpy(&h4sm->buf[h4sm->len], ib->buf, len); + } + break; + case HCI_H4_ACL: + case HCI_H4_ISO: + assert(h4sm->om); + + mbuf_len = OS_MBUF_PKTLEN(h4sm->om); + rc = os_mbuf_append(h4sm->om, ib->buf, len); + if (rc) { + /* Some data may already be appended so need to adjust h4sm only by + * the size of appended data. + */ + len = OS_MBUF_PKTLEN(h4sm->om) - mbuf_len; + h4sm->len += len; + hci_h4_ib_consume(ib, len); + + return -1; + } + break; + default: + assert(0); + break; + } + + h4sm->len += len; + hci_h4_ib_consume(ib, len); + + /* return 1 if need more data */ + return h4sm->len != h4sm->exp_len; +} + +static void +hci_h4_sm_completed(struct hci_h4_sm *h4sm) +{ + int rc; + + switch (h4sm->pkt_type) { +#if CONFIG_BT_CONTROLLER_ENABLED + case HCI_H4_CMD: + if (h4sm->buf) { + assert(h4sm->frame_cb); + rc = h4sm->frame_cb(h4sm->pkt_type, h4sm->buf); + assert(rc == 0); + h4sm->buf = NULL; + } + break; + case HCI_H4_ACL: + case HCI_H4_ISO: + if (h4sm->om) { + assert(h4sm->frame_cb); + rc = h4sm->frame_cb(h4sm->pkt_type, h4sm->om); + assert(rc == 0); + h4sm->om = NULL; + } + break; +#else + case HCI_H4_CMD: + case HCI_H4_EVT: + if (h4sm->buf) { + assert(h4sm->frame_cb); + rc = h4sm->frame_cb(h4sm->pkt_type, h4sm->buf); + if (rc != 0) { + ble_transport_free(h4sm->buf); + } + h4sm->buf = NULL; + } + break; + case HCI_H4_ACL: + case HCI_H4_ISO: + if (h4sm->om) { + assert(h4sm->frame_cb); + rc = h4sm->frame_cb(h4sm->pkt_type, h4sm->om); + if (rc != 0) { + os_mbuf_free_chain(h4sm->om); + } + h4sm->om = NULL; + } + break; +#endif // CONFIG_BT_CONTROLLER_ENABLED + default: + assert(0); + break; + } +} + +int +hci_h4_sm_rx(struct hci_h4_sm *h4sm, const uint8_t *buf, uint16_t len) +{ + struct hci_h4_input_buffer ib = { + .buf = buf, + .len = len, + }; + + int rc = 0; + while (ib.len && (rc >= 0)) { + rc = 0; + switch (h4sm->state) { + case HCI_H4_SM_W4_PKT_TYPE: + if (hci_h4_frame_start(h4sm, ib.buf[0]) < 0) { + return -1; + } + + hci_h4_ib_consume(&ib, 1); + h4sm->state = HCI_H4_SM_W4_HEADER; + /* no break */ + case HCI_H4_SM_W4_HEADER: + rc = hci_h4_sm_w4_header(h4sm, &ib); + assert(rc >= 0); + if (rc) { + break; + } + h4sm->state = HCI_H4_SM_W4_PAYLOAD; + /* no break */ + case HCI_H4_SM_W4_PAYLOAD: + rc = hci_h4_sm_w4_payload(h4sm, &ib); + assert(rc >= 0); + if (rc) { + break; + } + h4sm->state = HCI_H4_SM_COMPLETED; + /* no break */ + case HCI_H4_SM_COMPLETED: + hci_h4_sm_completed(h4sm); + h4sm->state = HCI_H4_SM_W4_PKT_TYPE; + break; + default: + return -1; + } + } + + /* Calculate consumed bytes + * + * Note: we should always consume some bytes unless there is an oom error. + * It's also possible that we have an oom error but already consumed some + * data, in such case just return success and error will be returned on next + * pass. + */ + len = len - ib.len; + if (len == 0) { + assert(rc < 0); + return -1; + } + + return len; +} + +void +hci_h4_sm_init(struct hci_h4_sm *h4sm, const struct hci_h4_allocators *allocs, + hci_h4_frame_cb *frame_cb) +{ + memset(h4sm, 0, sizeof(*h4sm)); + h4sm->allocs = allocs; + h4sm->frame_cb = frame_cb; +} diff --git a/components/bt/porting/transport/driver/common/hci_driver_mem.c b/components/bt/porting/transport/driver/common/hci_driver_mem.c new file mode 100644 index 00000000000..acfdf793f67 --- /dev/null +++ b/components/bt/porting/transport/driver/common/hci_driver_mem.c @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "common/hci_driver_mem.h" +#include "common/hci_driver_h4.h" +#include "esp_hci_internal.h" + +void * +hci_driver_mem_cmd_alloc(void) +{ + return r_ble_hci_trans_buf_alloc(ESP_HCI_INTERNAL_BUF_CMD); +} + +void * +hci_driver_mem_evt_alloc(int discardable) +{ + /* The controller shouldn't invoke this. */ + assert(0); + return NULL; +} + +struct os_mbuf * +hci_driver_mem_acl_alloc(void) +{ + return os_msys_get_pkthdr(0, ESP_HCI_INTERNAL_ACL_MBUF_LEADINGSPCAE); +} + +struct os_mbuf * +hci_driver_mem_acl_len_alloc(uint32_t len) +{ + return os_msys_get_pkthdr(len, ESP_HCI_INTERNAL_ACL_MBUF_LEADINGSPCAE); +} + +struct os_mbuf * +hci_driver_mem_iso_alloc(void) +{ + return os_msys_get_pkthdr(0, ESP_HCI_INTERNAL_ACL_MBUF_LEADINGSPCAE); +} + +struct os_mbuf * +hci_driver_mem_iso_len_alloc(uint32_t len) +{ + return os_msys_get_pkthdr(len, ESP_HCI_INTERNAL_ACL_MBUF_LEADINGSPCAE); +} + +const struct hci_h4_allocators s_hci_driver_mem_alloc = { + .cmd = hci_driver_mem_cmd_alloc, + .evt = hci_driver_mem_evt_alloc, + .acl = hci_driver_mem_acl_alloc, + .iso = hci_driver_mem_iso_alloc, +}; diff --git a/components/bt/porting/transport/driver/common/hci_driver_util.c b/components/bt/porting/transport/driver/common/hci_driver_util.c new file mode 100644 index 00000000000..30fe8d13c46 --- /dev/null +++ b/components/bt/porting/transport/driver/common/hci_driver_util.c @@ -0,0 +1,225 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "esp_log.h" +#include "os/os.h" +#include "os/os_mempool.h" +#include "esp_hci_driver.h" +#include "esp_hci_internal.h" +#include "common/hci_driver_util.h" + +#define TAG "HCI_UTIL" +#define HCI_DRIVER_UTIL_TX_POOL_NUM \ + (CONFIG_BT_LE_ACL_BUF_COUNT + CONFIG_BT_LE_HCI_EVT_HI_BUF_COUNT + CONFIG_BT_LE_HCI_EVT_LO_BUF_COUNT) + +#ifndef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + +/** + * @brief Structure representing HCI TX data. + */ +typedef struct hci_driver_util_tx_entry { + hci_driver_data_type_t data_type; ///< Type of the HCI TX data. + uint8_t *data; ///< Pointer to the TX data. + uint32_t length; ///< Length of the TX data. + STAILQ_ENTRY(hci_driver_util_tx_entry) next; ///< Next element in the linked list. +} hci_driver_util_tx_entry_t; + +/* The list for hci_driver_util_tx_entry */ +STAILQ_HEAD(hci_driver_util_tx_list, hci_driver_util_tx_entry); + +typedef struct { + struct hci_driver_util_tx_list tx_head; + struct hci_driver_util_tx_entry *cur_tx_entry; + uint32_t cur_tx_off; + struct os_mempool *tx_entry_pool; + uint8_t *tx_entry_mem; +} hci_driver_util_env_t; + +static hci_driver_util_env_t s_hci_driver_util_env; + +static void +hci_driver_util_memory_deinit(void) +{ + if (s_hci_driver_util_env.tx_entry_pool) { + free(s_hci_driver_util_env.tx_entry_pool); + s_hci_driver_util_env.tx_entry_pool = NULL; + } + if (s_hci_driver_util_env.tx_entry_mem) { + free(s_hci_driver_util_env.tx_entry_mem); + s_hci_driver_util_env.tx_entry_mem = NULL; + } +} + +static int +hci_driver_util_memory_init(void) +{ + int rc; + + s_hci_driver_util_env.tx_entry_pool = (struct os_mempool *)malloc(sizeof(struct os_mempool)); + if (!s_hci_driver_util_env.tx_entry_pool) { + ESP_LOGE(TAG, "No memory for tx pool"); + goto init_err; + } + + s_hci_driver_util_env.tx_entry_mem = malloc(OS_MEMPOOL_SIZE(HCI_DRIVER_UTIL_TX_POOL_NUM, + sizeof(hci_driver_util_tx_entry_t)) * sizeof(os_membuf_t)); + if (!s_hci_driver_util_env.tx_entry_mem) { + ESP_LOGE(TAG, "No memory for tx pool buffer"); + goto init_err; + } + + rc = os_mempool_init(s_hci_driver_util_env.tx_entry_pool, HCI_DRIVER_UTIL_TX_POOL_NUM, + sizeof(hci_driver_util_tx_entry_t), s_hci_driver_util_env.tx_entry_mem, + "hci_tx_entry_pool"); + if (rc) { + ESP_LOGE(TAG, "Failed to initialize tx pool"); + goto init_err; + } + + return 0; + +init_err: + hci_driver_util_memory_deinit(); + return -1; +} + +void +hci_driver_util_tx_list_enqueue(hci_driver_data_type_t type, uint8_t *data, uint32_t len) +{ + os_sr_t sr; + hci_driver_util_tx_entry_t *tx_entry; + + tx_entry = os_memblock_get(s_hci_driver_util_env.tx_entry_pool); + assert(tx_entry != NULL); + tx_entry->data_type = type; + tx_entry->data = data; + tx_entry->length = len; + /* If the txbuf is command status event or command complete event, we should send firstly. + * The tx list maybe used in the controller task and hci task. Therefore, enter critical area. + */ + if ((type == HCI_DRIVER_TYPE_EVT) && ((data[0] == 0x0E) || (data[0] == 0x0F))) { + OS_ENTER_CRITICAL(sr); + STAILQ_INSERT_HEAD(&s_hci_driver_util_env.tx_head, tx_entry, next); + OS_EXIT_CRITICAL(sr); + } else { + OS_ENTER_CRITICAL(sr); + STAILQ_INSERT_TAIL(&s_hci_driver_util_env.tx_head, tx_entry, next); + OS_EXIT_CRITICAL(sr); + } +} + +uint32_t +hci_driver_util_tx_list_dequeue(uint32_t max_tx_len, void **tx_data, bool *last_frame) +{ + os_sr_t sr; + uint32_t tx_len; + uint32_t data_len; + uint16_t out_off; + struct os_mbuf *om; + hci_driver_util_tx_entry_t *tx_entry; + + /* Check if there is any remaining data that hasn't been sent completely. If it has been completed, + * free the corresponding memory. Therefore, the HCI TX entry needs to be sent one by one; multiple + * entries cannot be sent together. + */ + tx_len = 0; + tx_entry = s_hci_driver_util_env.cur_tx_entry; + if (tx_entry) { + data_len = tx_entry->length; + if (tx_entry->data_type == HCI_DRIVER_TYPE_ACL) { + om = (struct os_mbuf *)tx_entry->data; + if (s_hci_driver_util_env.cur_tx_off >= data_len) { + os_mbuf_free_chain(om); + } else { + om = os_mbuf_off(om, s_hci_driver_util_env.cur_tx_off, &out_off); + tx_len = min(max_tx_len, om->om_len - out_off); + *tx_data = (void *)&om->om_data[out_off]; + } + } else if (tx_entry->data_type == HCI_DRIVER_TYPE_EVT) { + if (s_hci_driver_util_env.cur_tx_off >= data_len) { + r_ble_hci_trans_buf_free(tx_entry->data); + } else { + tx_len = min(max_tx_len, data_len - s_hci_driver_util_env.cur_tx_off); + *tx_data = &tx_entry->data[s_hci_driver_util_env.cur_tx_off]; + } + } else { + assert(0); + } + /* If this is the last frame, inform the invoker not to call this API until the current data + * has been completely sent. + */ + if (tx_len) { + s_hci_driver_util_env.cur_tx_off += tx_len; + + if (s_hci_driver_util_env.cur_tx_off >= data_len) { + *last_frame = true; + } else { + *last_frame = false; + } + } else { + os_memblock_put(s_hci_driver_util_env.tx_entry_pool, (void *)tx_entry); + s_hci_driver_util_env.cur_tx_entry = NULL; + } + } + + /* Find a new entry. */ + if (!tx_len && !STAILQ_EMPTY(&s_hci_driver_util_env.tx_head)) { + OS_ENTER_CRITICAL(sr); + tx_entry = STAILQ_FIRST(&s_hci_driver_util_env.tx_head); + STAILQ_REMOVE_HEAD(&s_hci_driver_util_env.tx_head, next); + OS_EXIT_CRITICAL(sr); + + *tx_data = &tx_entry->data_type; + s_hci_driver_util_env.cur_tx_entry = tx_entry; + s_hci_driver_util_env.cur_tx_off = 0; + tx_len = 1; + *last_frame = false; + } + + return tx_len; +} + +int +hci_driver_util_init(void) +{ + memset(&s_hci_driver_util_env, 0, sizeof(hci_driver_util_env_t)); + + if (hci_driver_util_memory_init()) { + return -1; + } + + STAILQ_INIT(&s_hci_driver_util_env.tx_head); + + return 0; +} + +void +hci_driver_util_deinit(void) +{ + hci_driver_util_tx_entry_t *tx_entry; + hci_driver_util_tx_entry_t *next_entry; + + /* Free all of controller buffers which haven't been sent yet. The whole mempool will be freed. + * Therefore, it's unnecessary to put the tx_entry into mempool. + */ + tx_entry = STAILQ_FIRST(&s_hci_driver_util_env.tx_head); + while (tx_entry) { + next_entry = STAILQ_NEXT(tx_entry, next); + if (tx_entry->data_type == HCI_DRIVER_TYPE_ACL) { + os_mbuf_free_chain((struct os_mbuf *)tx_entry->data); + } else if (tx_entry->data_type == HCI_DRIVER_TYPE_EVT) { + r_ble_hci_trans_buf_free(tx_entry->data); + } + tx_entry = next_entry; + } + + hci_driver_util_memory_deinit(); + + memset(&s_hci_driver_util_env, 0, sizeof(hci_driver_util_env_t)); +} diff --git a/components/bt/porting/transport/driver/uart/hci_driver_uart.c b/components/bt/porting/transport/driver/uart/hci_driver_uart.c new file mode 100644 index 00000000000..6ac2a462fa1 --- /dev/null +++ b/components/bt/porting/transport/driver/uart/hci_driver_uart.c @@ -0,0 +1,222 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "esp_log.h" +#include "driver/uart.h" +#include "esp_hci_transport.h" +#include "esp_hci_internal.h" +#include "common/hci_driver_h4.h" +#include "common/hci_driver_util.h" +#include "common/hci_driver_mem.h" +#include "hci_driver_uart.h" + +static const char *TAG = "hci_uart"; + +#define CONFIG_BT_LE_HCI_RX_PROC_DATA_LEN (256) + +typedef struct { + TaskHandle_t tx_task_handler; + TaskHandle_t rx_task_handler; + hci_driver_uart_params_config_t *hci_uart_params; + SemaphoreHandle_t tx_sem; + QueueHandle_t rx_event_queue; + uint8_t *rx_data; + struct hci_h4_sm *h4_sm; + hci_driver_forward_fn *forward_cb; +} hci_driver_uart_env_t; + +static hci_driver_uart_env_t s_hci_driver_uart_env; +static struct hci_h4_sm s_hci_driver_uart_h4_sm; +static uint8_t s_hci_driver_uart_rx_data[CONFIG_BT_LE_HCI_RX_PROC_DATA_LEN]; +static hci_driver_uart_params_config_t hci_driver_uart_params = BT_HCI_DRIVER_UART_CONFIG_DEFAULT(); + +static int +hci_driver_uart_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, + hci_driver_direction_t dir) +{ + /* By now, this layer is only used by controller. */ + assert(dir == HCI_DRIVER_DIR_C2H); + ESP_LOGD(TAG, "controller tx len:%d\n", length); + + hci_driver_util_tx_list_enqueue(data_type, data, length); + xSemaphoreGive(s_hci_driver_uart_env.tx_sem); + + return 0; +} + +static int +hci_driver_uart_h4_frame_cb(uint8_t pkt_type, void *data) +{ + hci_driver_forward_fn *forward_cb; + + forward_cb = s_hci_driver_uart_env.forward_cb; + if (!forward_cb) { + return -1; + } + ESP_LOGD(TAG, "h4 frame\n"); + return forward_cb(pkt_type, data, 0, HCI_DRIVER_DIR_H2C); +} + +static void +hci_driver_uart_tx_task(void *p) +{ + void *data; + bool last_frame; + uint32_t tx_len; + uart_port_t port; + + port = s_hci_driver_uart_env.hci_uart_params->hci_uart_port; + while (true) { + xSemaphoreTake(s_hci_driver_uart_env.tx_sem, portMAX_DELAY); + while (true) { + tx_len = hci_driver_util_tx_list_dequeue(0xffffff, &data, &last_frame); + if (tx_len == 0) { + break; + } + ESP_LOGD(TAG, "uart tx"); + ESP_LOG_BUFFER_HEXDUMP(TAG, data, tx_len, ESP_LOG_DEBUG); + uart_write_bytes(port, data, tx_len); + } + } +} + +static void +hci_driver_uart_rx_task(void *p) +{ + void *data; + int read_len; + int ret; + uart_port_t port; + uart_event_t uart_event; + + port = s_hci_driver_uart_env.hci_uart_params->hci_uart_port; + while (true) { + xQueueReceive(s_hci_driver_uart_env.rx_event_queue, &uart_event, portMAX_DELAY); + data = s_hci_driver_uart_env.rx_data; + while (true) { + read_len = uart_read_bytes(port, data, CONFIG_BT_LE_HCI_RX_PROC_DATA_LEN, 0); + if (read_len == 0) { + break; + } + ESP_LOGD(TAG, "uart rx"); + ESP_LOG_BUFFER_HEXDUMP(TAG, data, read_len, ESP_LOG_DEBUG); + ret = hci_h4_sm_rx(s_hci_driver_uart_env.h4_sm, data, read_len); + if (ret < 0) { + r_ble_ll_hci_ev_hw_err(ESP_HCI_SYNC_LOSS_ERR); + } + } + } +} + +static int +hci_driver_uart_task_create(void) +{ + /* !TODO: Set the core id by menuconfig */ + xTaskCreatePinnedToCore(hci_driver_uart_tx_task, "hci_driver_uart_tx_task", + CONFIG_BT_LE_HCI_TRANS_TASK_STACK_SIZE, NULL, + ESP_TASK_BT_CONTROLLER_PRIO, &s_hci_driver_uart_env.tx_task_handler, + 0); + assert(s_hci_driver_uart_env.tx_task_handler); + + xTaskCreatePinnedToCore(hci_driver_uart_rx_task, "hci_driver_uart_rx_task", + CONFIG_BT_LE_HCI_TRANS_TASK_STACK_SIZE, NULL, + ESP_TASK_BT_CONTROLLER_PRIO, &s_hci_driver_uart_env.rx_task_handler, + 0); + assert(s_hci_driver_uart_env.rx_task_handler); + + ESP_LOGI(TAG, "hci transport task create successfully, prio:%d, stack size: %ld", + ESP_TASK_BT_CONTROLLER_PRIO, CONFIG_BT_LE_HCI_TRANS_TASK_STACK_SIZE); + + return 0; +} + +static void +hci_driver_uart_deinit(void) +{ + if (s_hci_driver_uart_env.tx_task_handler) { + vTaskDelete(s_hci_driver_uart_env.tx_task_handler); + s_hci_driver_uart_env.tx_task_handler = NULL; + } + + if (s_hci_driver_uart_env.rx_task_handler) { + vTaskDelete(s_hci_driver_uart_env.rx_task_handler); + s_hci_driver_uart_env.rx_task_handler = NULL; + } + + ESP_ERROR_CHECK(uart_driver_delete(s_hci_driver_uart_env.hci_uart_params->hci_uart_port)); + + if (!s_hci_driver_uart_env.tx_sem) { + vSemaphoreDelete(s_hci_driver_uart_env.tx_sem); + } + + hci_driver_util_deinit(); + memset(&s_hci_driver_uart_env, 0, sizeof(hci_driver_uart_env_t)); +} + +static int +hci_driver_uart_init(hci_driver_forward_fn *cb) +{ + int rc; + memset(&s_hci_driver_uart_env, 0, sizeof(hci_driver_uart_env_t)); + + s_hci_driver_uart_env.h4_sm = &s_hci_driver_uart_h4_sm; + hci_h4_sm_init(s_hci_driver_uart_env.h4_sm, &s_hci_driver_mem_alloc, hci_driver_uart_h4_frame_cb); + + rc = hci_driver_util_init(); + if (rc) { + goto error; + } + + s_hci_driver_uart_env.tx_sem = xSemaphoreCreateBinary(); + if (!s_hci_driver_uart_env.tx_sem) { + goto error; + } + + s_hci_driver_uart_env.rx_data = s_hci_driver_uart_rx_data; + s_hci_driver_uart_env.forward_cb = cb; + s_hci_driver_uart_env.hci_uart_params = &hci_driver_uart_params; + hci_driver_uart_config(&hci_driver_uart_params); + /* Currently, the queue size is set to 1. It will be considered as semaphore. */ + ESP_ERROR_CHECK(uart_driver_install(s_hci_driver_uart_env.hci_uart_params->hci_uart_port, + CONFIG_BT_LE_HCI_UART_RX_BUFFER_SIZE, + CONFIG_BT_LE_HCI_UART_TX_BUFFER_SIZE, + 1, &s_hci_driver_uart_env.rx_event_queue, + 0)); + + rc = hci_driver_uart_task_create(); + if (rc) { + goto error; + } + + return 0; + +error: + hci_driver_uart_deinit(); + return rc; +} + +int +hci_driver_uart_reconfig_pin(int tx_pin, int rx_pin, int cts_pin, int rts_pin) +{ + hci_driver_uart_params_config_t *uart_param = s_hci_driver_uart_env.hci_uart_params; + uart_param->hci_uart_tx_pin = tx_pin; + uart_param->hci_uart_rx_pin = rx_pin; + uart_param->hci_uart_rts_pin = rts_pin; + uart_param->hci_uart_cts_pin = cts_pin; + return hci_driver_uart_config(uart_param); +} + +hci_driver_ops_t hci_driver_uart_ops = { + .hci_driver_tx = hci_driver_uart_tx, + .hci_driver_init = hci_driver_uart_init, + .hci_driver_deinit = hci_driver_uart_deinit, +}; diff --git a/components/bt/porting/transport/driver/uart/hci_driver_uart.h b/components/bt/porting/transport/driver/uart/hci_driver_uart.h new file mode 100644 index 00000000000..8b5f5eb8560 --- /dev/null +++ b/components/bt/porting/transport/driver/uart/hci_driver_uart.h @@ -0,0 +1,97 @@ +/* + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include "driver/uart.h" +#include "os/os_mbuf.h" +#include "esp_bt.h" +#include "esp_hci_transport.h" + +/** + * @brief UART configuration parameters for the HCI driver + */ +typedef struct hci_driver_uart_params_config +{ + uint8_t hci_uart_port; /*!< Port of UART for HCI */ + uint8_t hci_uart_data_bits; /*!< Data bits of UART for HCI */ + uint8_t hci_uart_stop_bits; /*!< Stop bits of UART for HCI */ + uint8_t hci_uart_flow_ctrl; /*!< Flow control of UART for HCI */ + uint8_t hci_uart_parity; /*!< UART parity */ + uint8_t hci_uart_driver_mode; /*!< UART driver mode */ + uint32_t hci_uart_baud; /*!< Baudrate of UART for HCI */ + int hci_uart_tx_pin; /*!< Tx Pin number of UART for HCI */ + int hci_uart_rx_pin; /*!< Rx Pin number of UART for HCI */ + int hci_uart_rts_pin; /*!< RTS Pin number of UART for HCI */ + int hci_uart_cts_pin; /*!< CTS Pin number of UART for HCI */ +} hci_driver_uart_params_config_t; + +#define BT_HCI_DRIVER_UART_CONFIG_DEFAULT() { \ + .hci_uart_port = DEFAULT_BT_LE_HCI_UART_PORT, \ + .hci_uart_baud = DEFAULT_BT_LE_HCI_UART_BAUD, \ + .hci_uart_tx_pin = DEFAULT_BT_LE_HCI_UART_TX_PIN , \ + .hci_uart_rx_pin = DEFAULT_BT_LE_HCI_UART_RX_PIN, \ + .hci_uart_cts_pin = DEFAULT_BT_LE_HCI_UART_CTS_PIN, \ + .hci_uart_rts_pin = DEFAULT_BT_LE_HCI_UART_RTS_PIN, \ + .hci_uart_data_bits = DEFAULT_BT_LE_HCI_UART_DATA_BITS, \ + .hci_uart_stop_bits = DEFAULT_BT_LE_HCI_UART_STOP_BITS, \ + .hci_uart_flow_ctrl = DEFAULT_BT_LE_HCI_UART_FLOW_CTRL, \ + .hci_uart_parity = DEFAULT_BT_LE_HCI_UART_PARITY, \ +} + +/** + * @brief Configures the HCI driver UART parameters. + * This function sets up the UART interface according to the specified configuration parameters. + * + * @param uart_config A pointer to a structure containing the UART configuration parameters. + * The structure should include details such as baud rate, parity, stop bits, and flow control. + * Ensure that the uart_config structure is correctly initialized before calling this function. + * + * @return int Returns 0 on success, or a non-zero error code on failure. + * + * @note This function should be called before any UART communication is initiated. + */ +int hci_driver_uart_config(hci_driver_uart_params_config_t *uart_config); + +#if CONFIG_BT_LE_UART_HCI_DMA_MODE +/** + * @brief Reconfigure the UART pins for the HCI driver. + * + * This function changes the UART pin configuration for the HCI driver. + * + * @param tx_pin The pin number for the UART TX (transmit) line. + * @param rx_pin The pin number for the UART RX (receive) line. + * @param cts_pin The pin number for the UART CTS (clear to send) line. + * @param rts_pin The pin number for the UART RTS (request to send) line. + * + * @return int Returns 0 on success, or a negative error code on failure. + */ +int hci_driver_uart_dma_reconfig_pin(int tx_pin, int rx_pin, int cts_pin, int rts_pin); +#define hci_uart_reconfig_pin hci_driver_uart_dma_reconfig_pin +#else +/** + * @brief Reconfigure the UART pins for the HCI driver. + * + * This function changes the UART pin configuration for the HCI driver. + * + * @param tx_pin The pin number for the UART TX (transmit) line. + * @param rx_pin The pin number for the UART RX (receive) line. + * @param cts_pin The pin number for the UART CTS (clear to send) line. + * @param rts_pin The pin number for the UART RTS (request to send) line. + * + * @return int Returns 0 on success, or a negative error code on failure. + */ +int hci_driver_uart_reconfig_pin(int tx_pin, int rx_pin, int cts_pin, int rts_pin); +#define hci_uart_reconfig_pin hci_driver_uart_reconfig_pin +#endif // CONFIG_BT_LE_UART_HCI_DMA_MODE + +#ifdef __cplusplus +} +#endif diff --git a/components/bt/porting/transport/driver/uart/hci_driver_uart_config.c b/components/bt/porting/transport/driver/uart/hci_driver_uart_config.c new file mode 100644 index 00000000000..aae33634647 --- /dev/null +++ b/components/bt/porting/transport/driver/uart/hci_driver_uart_config.c @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "esp_log.h" +#include "driver/uart.h" +#include "hci_driver_uart.h" + + +static const char *TAG = "hci_uart_config"; +static uart_config_t s_uart_cfg; + +int hci_driver_uart_config(hci_driver_uart_params_config_t *uart_config) +{ + uart_config_t *uart_cfg; + uart_cfg = &s_uart_cfg; + uart_cfg->baud_rate = uart_config->hci_uart_baud; + uart_cfg->data_bits = uart_config->hci_uart_data_bits; + uart_cfg->stop_bits = uart_config->hci_uart_stop_bits; + uart_cfg->parity = uart_config->hci_uart_parity; + uart_cfg->flow_ctrl = uart_config->hci_uart_flow_ctrl; + uart_cfg->source_clk= UART_SCLK_DEFAULT; + uart_cfg->rx_flow_ctrl_thresh = UART_HW_FIFO_LEN(uart_config->hci_uart_port) - 1; + + + ESP_LOGI(TAG,"set uart pin tx:%d, rx:%d.\n", uart_config->hci_uart_tx_pin, uart_config->hci_uart_rx_pin); + ESP_LOGI(TAG,"set rts:%d, cts:%d.\n", uart_config->hci_uart_rts_pin, uart_config->hci_uart_cts_pin); + ESP_LOGI(TAG,"set baud_rate:%d.\n", uart_config->hci_uart_baud); + ESP_LOGI(TAG,"set flow_ctrl:%d.\n", uart_config->hci_uart_flow_ctrl); + + ESP_ERROR_CHECK(uart_driver_delete(uart_config->hci_uart_port)); + ESP_ERROR_CHECK(uart_param_config(uart_config->hci_uart_port, uart_cfg)); + ESP_ERROR_CHECK(uart_set_pin(uart_config->hci_uart_port, uart_config->hci_uart_tx_pin, uart_config->hci_uart_rx_pin, + uart_config->hci_uart_rts_pin, uart_config->hci_uart_cts_pin)); + return 0; +} diff --git a/components/bt/porting/transport/driver/uart/hci_driver_uart_dma.c b/components/bt/porting/transport/driver/uart/hci_driver_uart_dma.c new file mode 100644 index 00000000000..a90fb749a11 --- /dev/null +++ b/components/bt/porting/transport/driver/uart/hci_driver_uart_dma.c @@ -0,0 +1,670 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "esp_log.h" +#include "driver/uart.h" +#include "esp_hci_transport.h" +#include "esp_hci_internal.h" +#include "common/hci_driver_h4.h" +#include "common/hci_driver_util.h" +#include "common/hci_driver_mem.h" +#include "hci_driver_uart.h" + +#include "ble_hci_trans.h" +#include "esp_private/periph_ctrl.h" +#include "esp_private/gdma.h" +#include "hal/uhci_ll.h" + +/* + * UART DMA Desc struct + * + * -------------------------------------------------------------- + * | own | EoF | sub_sof | 5'b0 | length [11:0] | size [11:0] | + * -------------------------------------------------------------- + * | buf_ptr [31:0] | + * -------------------------------------------------------------- + * | next_desc_ptr [31:0] | + * -------------------------------------------------------------- + */ + +/* this bitfield is start from the LSB!!! */ +typedef struct uhci_lldesc_s { + volatile uint32_t size : 12, + length: 12, + offset: 5, /* h/w reserved 5bit, s/w use it as offset in buffer */ + sosf : 1, /* start of sub-frame */ + eof : 1, /* end of frame */ + owner : 1; /* hw or sw */ + volatile const uint8_t *buf; /* point to buffer data */ + union { + volatile uint32_t empty; + STAILQ_ENTRY(uhci_lldesc_s) qe; /* pointing to the next desc */ + }; +} uhci_lldesc_t; + +/** + * @brief Enumeration of HCI transport transmission states. + */ +typedef enum { + HCI_TRANS_TX_IDLE, ///< HCI Transport TX is in idle state. + HCI_TRANS_TX_START, ///< HCI Transport TX is starting transmission. + HCI_TRANS_TX_END, ///< HCI Transport TX has completed transmission. +} hci_trans_tx_state_t; + +typedef struct { + TaskHandle_t task_handler; + hci_driver_uart_params_config_t *hci_uart_params; + SemaphoreHandle_t process_sem; + struct hci_h4_sm *h4_sm; + hci_driver_forward_fn *forward_cb; + struct os_mempool *hci_rx_data_pool; /*!< Init a memory pool for rx_data cache */ + uint8_t *hci_rx_data_buffer; + struct os_mempool *hci_rxinfo_pool; /*!< Init a memory pool for rxinfo cache */ + os_membuf_t *hci_rxinfo_buffer; + volatile bool rxinfo_mem_exhausted; /*!< Indicate rxinfo memory does not exist */ + volatile bool is_continue_rx; /*!< Continue to rx */ + volatile hci_trans_tx_state_t hci_tx_state; /*!< HCI Tx State */ + struct os_mempool lldesc_mem_pool;/*!< Init a memory pool for uhci_lldesc_t */ + uhci_lldesc_t *lldesc_mem; +} hci_driver_uart_dma_env_t; + +#define ESP_BT_HCI_TL_STATUS_OK (0) /*!< HCI_TL Tx/Rx operation status OK */ +/* The number of lldescs pool */ +#define HCI_LLDESCS_POOL_NUM (CONFIG_BT_LE_HCI_LLDESCS_POOL_NUM) +/* Default block size for HCI RX data */ +#define HCI_RX_DATA_BLOCK_SIZE (DEFAULT_BT_LE_ACL_BUF_SIZE + BLE_HCI_TRANS_CMD_SZ) +#define HCI_RX_DATA_POOL_NUM (CONFIG_BT_LE_HCI_TRANS_RX_MEM_NUM) +#define HCI_RX_INFO_POOL_NUM (CONFIG_BT_LE_HCI_TRANS_RX_MEM_NUM + 1) + +/** + * @brief callback function for HCI Transport Layer send/receive operations + */ +typedef void (* esp_bt_hci_tl_callback_t) (void *arg, uint8_t status); + +struct uart_txrxchannel { + esp_bt_hci_tl_callback_t callback; + void *arg; + uhci_lldesc_t *link_head; +}; + +struct uart_env_tag { + struct uart_txrxchannel tx; + struct uart_txrxchannel rx; +}; + +typedef struct hci_message { + void *ptr; ///< Pointer to the message data. + uint32_t length; ///< Length of the message data. + STAILQ_ENTRY(hci_message) next; ///< Next element in the linked list. +} hci_message_t; + +static void hci_driver_uart_dma_recv_async(uint8_t *buf, uint32_t size, esp_bt_hci_tl_callback_t callback, void *arg); +int hci_driver_uart_dma_rx_start(uint8_t *rx_data, uint32_t length); +int hci_driver_uart_dma_tx_start(esp_bt_hci_tl_callback_t callback, void *arg); + +static const char *TAG = "uart_dma"; +static hci_driver_uart_dma_env_t s_hci_driver_uart_dma_env; +static struct hci_h4_sm s_hci_driver_uart_h4_sm; +static hci_driver_uart_params_config_t hci_driver_uart_dma_params = BT_HCI_DRIVER_UART_CONFIG_DEFAULT(); + +/* The list for hci_rx_data */ +STAILQ_HEAD(g_hci_rxinfo_list, hci_message); + +DRAM_ATTR struct g_hci_rxinfo_list g_hci_rxinfo_head; +static DRAM_ATTR struct uart_env_tag uart_env; +static volatile uhci_dev_t *s_uhci_hw = &UHCI0; +static DRAM_ATTR gdma_channel_handle_t s_rx_channel; +static DRAM_ATTR gdma_channel_handle_t s_tx_channel; + +static int hci_driver_uart_dma_memory_deinit(void) +{ + + if (s_hci_driver_uart_dma_env.hci_rxinfo_buffer) { + free(s_hci_driver_uart_dma_env.hci_rxinfo_buffer); + s_hci_driver_uart_dma_env.hci_rxinfo_buffer = NULL; + } + + if (s_hci_driver_uart_dma_env.hci_rxinfo_pool) { + free(s_hci_driver_uart_dma_env.hci_rxinfo_pool); + s_hci_driver_uart_dma_env.hci_rxinfo_pool = NULL; + } + + if (s_hci_driver_uart_dma_env.hci_rx_data_buffer) { + free(s_hci_driver_uart_dma_env.hci_rx_data_buffer); + s_hci_driver_uart_dma_env.hci_rx_data_buffer = NULL; + } + + if (s_hci_driver_uart_dma_env.hci_rx_data_pool) { + free(s_hci_driver_uart_dma_env.hci_rx_data_pool); + s_hci_driver_uart_dma_env.hci_rx_data_pool = NULL; + } + + if (s_hci_driver_uart_dma_env.lldesc_mem) { + free(s_hci_driver_uart_dma_env.lldesc_mem); + s_hci_driver_uart_dma_env.lldesc_mem = NULL; + } + + return 0; +} + +static int hci_driver_uart_dma_memory_init(void) +{ + int rc = 0; + + s_hci_driver_uart_dma_env.lldesc_mem = malloc(OS_MEMPOOL_SIZE(HCI_LLDESCS_POOL_NUM, + sizeof (uhci_lldesc_t)) * sizeof(os_membuf_t)); + if (!s_hci_driver_uart_dma_env.lldesc_mem) { + return -1; + } + + rc = os_mempool_init(&s_hci_driver_uart_dma_env.lldesc_mem_pool, HCI_LLDESCS_POOL_NUM, + sizeof (uhci_lldesc_t), s_hci_driver_uart_dma_env.lldesc_mem, "hci_lldesc_pool"); + if (rc) { + goto init_err; + } + + s_hci_driver_uart_dma_env.hci_rx_data_pool = (struct os_mempool *)malloc(sizeof(struct os_mempool)); + if (!s_hci_driver_uart_dma_env.hci_rx_data_pool) { + goto init_err; + } + + memset(s_hci_driver_uart_dma_env.hci_rx_data_pool, 0, sizeof(struct os_mempool)); + s_hci_driver_uart_dma_env.hci_rx_data_buffer = malloc(OS_MEMPOOL_SIZE(HCI_RX_DATA_POOL_NUM, + HCI_RX_DATA_BLOCK_SIZE) * sizeof(os_membuf_t)); + if (!s_hci_driver_uart_dma_env.hci_rx_data_buffer) { + goto init_err; + } + + memset(s_hci_driver_uart_dma_env.hci_rx_data_buffer, 0, OS_MEMPOOL_SIZE(HCI_RX_DATA_POOL_NUM, + HCI_RX_DATA_BLOCK_SIZE) * sizeof(os_membuf_t)); + rc = os_mempool_init(s_hci_driver_uart_dma_env.hci_rx_data_pool, HCI_RX_DATA_POOL_NUM, + HCI_RX_DATA_BLOCK_SIZE, s_hci_driver_uart_dma_env.hci_rx_data_buffer, + "hci_rx_data_pool"); + if (rc) { + goto init_err; + } + + + /* Malloc hci rxinfo pool */ + s_hci_driver_uart_dma_env.hci_rxinfo_pool = (struct os_mempool *)malloc(sizeof(struct os_mempool)); + if (!s_hci_driver_uart_dma_env.hci_rxinfo_pool) { + goto init_err; + } + + memset(s_hci_driver_uart_dma_env.hci_rxinfo_pool, 0, sizeof(struct os_mempool)); + s_hci_driver_uart_dma_env.hci_rxinfo_buffer = malloc(OS_MEMPOOL_SIZE(HCI_RX_INFO_POOL_NUM, + sizeof(hci_message_t)) * sizeof(os_membuf_t)); + if (!s_hci_driver_uart_dma_env.hci_rxinfo_buffer) { + goto init_err; + } + + memset(s_hci_driver_uart_dma_env.hci_rxinfo_buffer, 0, OS_MEMPOOL_SIZE(HCI_RX_INFO_POOL_NUM, + sizeof(hci_message_t)) * sizeof(os_membuf_t)); + rc = os_mempool_init(s_hci_driver_uart_dma_env.hci_rxinfo_pool, HCI_RX_INFO_POOL_NUM, + sizeof(hci_message_t), s_hci_driver_uart_dma_env.hci_rxinfo_buffer, + "hci_rxinfo_pool"); + if (rc) { + goto init_err; + } + + return rc; +init_err: + hci_driver_uart_dma_memory_deinit(); + return rc; +} + +static IRAM_ATTR bool hci_uart_tl_rx_eof_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data) +{ + esp_bt_hci_tl_callback_t callback = uart_env.rx.callback; + void *arg = uart_env.rx.arg; + assert(dma_chan == s_rx_channel); + assert(uart_env.rx.callback != NULL); + // clear callback pointer + uart_env.rx.callback = NULL; + uart_env.rx.arg = NULL; + // call handler + callback(arg, ESP_BT_HCI_TL_STATUS_OK); + return true; +} + +static IRAM_ATTR bool hci_uart_tl_tx_eof_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data) +{ + esp_bt_hci_tl_callback_t callback = uart_env.tx.callback; + assert(dma_chan == s_tx_channel); + assert(uart_env.tx.callback != NULL); + // clear callback pointer + uart_env.tx.callback = NULL; + // call handler + callback(uart_env.tx.arg, ESP_BT_HCI_TL_STATUS_OK); + uart_env.tx.arg = NULL; + return true; +} + +uint8_t * IRAM_ATTR hci_driver_uart_dma_rxdata_memory_get(void) +{ + uint8_t *rx_data; + rx_data = os_memblock_get(s_hci_driver_uart_dma_env.hci_rx_data_pool); + return rx_data; +} + +hci_message_t * IRAM_ATTR hci_driver_uart_dma_rxinfo_memory_get(void) +{ + hci_message_t *rx_info; + rx_info = os_memblock_get(s_hci_driver_uart_dma_env.hci_rxinfo_pool); + return rx_info; +} + +void IRAM_ATTR hci_driver_uart_dma_cache_rxinfo(hci_message_t *hci_rxinfo) +{ + os_sr_t sr; + + OS_ENTER_CRITICAL(sr); + STAILQ_INSERT_TAIL(&g_hci_rxinfo_head, hci_rxinfo, next); + OS_EXIT_CRITICAL(sr); +} + +void IRAM_ATTR hci_driver_uart_dma_continue_rx_enable(bool enable) +{ + os_sr_t sr; + OS_ENTER_CRITICAL(sr); + s_hci_driver_uart_dma_env.is_continue_rx = enable; + OS_EXIT_CRITICAL(sr); +} + +void IRAM_ATTR hci_driver_uart_dma_rxinfo_mem_exhausted_set(bool is_exhausted) +{ + os_sr_t sr; + OS_ENTER_CRITICAL(sr); + s_hci_driver_uart_dma_env.rxinfo_mem_exhausted = is_exhausted; + OS_EXIT_CRITICAL(sr); +} + +void IRAM_ATTR hci_driver_uart_dma_recv_callback(void *arg, uint8_t status) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + hci_message_t *hci_rxinfo; + uint8_t *rx_data; + + if (s_hci_driver_uart_dma_env.rxinfo_mem_exhausted) { + ESP_LOGE(TAG, "Will lost rx data, need adjust rxinfo memory count\n"); + assert(0); + } + + hci_rxinfo = hci_driver_uart_dma_rxinfo_memory_get(); + if (!hci_rxinfo) { + ESP_LOGW(TAG, "set rxinfo mem exhausted flag\n"); + hci_driver_uart_dma_rxinfo_mem_exhausted_set(true); + xSemaphoreGiveFromISR(s_hci_driver_uart_dma_env.process_sem, &xHigherPriorityTaskWoken); + return; + } + + hci_rxinfo->ptr = (void *)uart_env.rx.link_head->buf; + hci_rxinfo->length = uart_env.rx.link_head->length; + hci_driver_uart_dma_cache_rxinfo(hci_rxinfo); + xSemaphoreGiveFromISR(s_hci_driver_uart_dma_env.process_sem, &xHigherPriorityTaskWoken); + rx_data = hci_driver_uart_dma_rxdata_memory_get(); + if (!rx_data) { + hci_driver_uart_dma_continue_rx_enable(true); + }else { + hci_driver_uart_dma_rx_start(rx_data, HCI_RX_DATA_BLOCK_SIZE); + } +} + +void IRAM_ATTR hci_driver_uart_dma_txstate_set(hci_trans_tx_state_t tx_state) +{ + os_sr_t sr; + OS_ENTER_CRITICAL(sr); + s_hci_driver_uart_dma_env.hci_tx_state = tx_state; + OS_EXIT_CRITICAL(sr); +} + +void IRAM_ATTR hci_driver_uart_dma_send_callback(void *arg, uint8_t status) +{ + uhci_lldesc_t *lldesc_head; + uhci_lldesc_t *lldesc_nxt; + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + lldesc_head = uart_env.tx.link_head; + while (lldesc_head) { + lldesc_nxt = lldesc_head->qe.stqe_next; + os_memblock_put(&s_hci_driver_uart_dma_env.lldesc_mem_pool, lldesc_head); + lldesc_head = lldesc_nxt; + } + + uart_env.tx.link_head = NULL; + hci_driver_uart_dma_txstate_set(HCI_TRANS_TX_IDLE); + xSemaphoreGiveFromISR(s_hci_driver_uart_dma_env.process_sem, &xHigherPriorityTaskWoken); +} + +static IRAM_ATTR void hci_driver_uart_dma_recv_async(uint8_t *buf, uint32_t size, esp_bt_hci_tl_callback_t callback, void *arg) +{ + uhci_lldesc_t *lldesc_head; + assert(buf != NULL); + assert(size != 0); + assert(callback != NULL); + uart_env.rx.callback = callback; + uart_env.rx.arg = arg; + lldesc_head = uart_env.rx.link_head; + + while (lldesc_head) { + os_memblock_put(&s_hci_driver_uart_dma_env.lldesc_mem_pool, lldesc_head), + lldesc_head = lldesc_head->qe.stqe_next; + } + + uart_env.rx.link_head = NULL; + lldesc_head = os_memblock_get(&s_hci_driver_uart_dma_env.lldesc_mem_pool); + assert(lldesc_head); + memset(lldesc_head, 0, sizeof(uhci_lldesc_t)); + lldesc_head->buf = buf; + lldesc_head->size = size; + lldesc_head->eof = 0; + s_uhci_hw->pkt_thres.pkt_thrs = size; + uart_env.rx.link_head = lldesc_head; + gdma_start(s_rx_channel, (intptr_t)(uart_env.rx.link_head)); +} + +int IRAM_ATTR hci_driver_uart_dma_rx_start(uint8_t *rx_data, uint32_t length) +{ + hci_driver_uart_dma_recv_async(rx_data, length, hci_driver_uart_dma_recv_callback, NULL); + return 0; +} + +int hci_driver_uart_dma_tx_start(esp_bt_hci_tl_callback_t callback, void *arg) +{ + void *data; + bool last_frame; + bool head_is_setted; + uint32_t tx_len; + uhci_lldesc_t *lldesc_data; + uhci_lldesc_t *lldesc_head; + uhci_lldesc_t *lldesc_tail; + + lldesc_head = NULL; + lldesc_tail = NULL; + head_is_setted = false; + last_frame = false; + while (true) { + tx_len = hci_driver_util_tx_list_dequeue(0xffffff, &data, &last_frame); + if (!tx_len) { + break; + } + + lldesc_data = os_memblock_get(&s_hci_driver_uart_dma_env.lldesc_mem_pool); + /* According to the current processing logic, It should not be empty */ + assert(lldesc_data); + memset(lldesc_data, 0, sizeof(uhci_lldesc_t)); + lldesc_data->length = tx_len; + lldesc_data->buf = data; + lldesc_data->eof = 0; + if (!head_is_setted) { + lldesc_head = lldesc_data; + head_is_setted = true; + } else { + lldesc_tail->qe.stqe_next = lldesc_data; + } + + lldesc_tail = lldesc_data; + if (last_frame) { + break; + } + } + + if (lldesc_head) { + lldesc_tail->eof = 1; + uart_env.tx.link_head = lldesc_head; + uart_env.tx.callback = callback; + uart_env.tx.arg = arg; + gdma_start(s_tx_channel, (intptr_t)(uart_env.tx.link_head)); + return 0; + } else { + return -1; + } +} + +static void hci_driver_uart_dma_install(void) +{ + periph_module_enable(PERIPH_UHCI0_MODULE); + periph_module_reset(PERIPH_UHCI0_MODULE); + // install DMA driver + gdma_channel_alloc_config_t tx_channel_config = { + .flags.reserve_sibling = 1, + .direction = GDMA_CHANNEL_DIRECTION_TX, + }; + + ESP_ERROR_CHECK(gdma_new_channel(&tx_channel_config, &s_tx_channel)); + gdma_channel_alloc_config_t rx_channel_config = { + .direction = GDMA_CHANNEL_DIRECTION_RX, + .sibling_chan = s_tx_channel, + }; + + ESP_ERROR_CHECK(gdma_new_channel(&rx_channel_config, &s_rx_channel)); + gdma_connect(s_tx_channel, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_UHCI, 0)); + gdma_connect(s_rx_channel, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_UHCI, 0)); + gdma_strategy_config_t strategy_config = { + .auto_update_desc = false, + .owner_check = false + }; + + gdma_apply_strategy(s_tx_channel, &strategy_config); + gdma_apply_strategy(s_rx_channel, &strategy_config); + gdma_rx_event_callbacks_t rx_cbs = { + .on_recv_eof = hci_uart_tl_rx_eof_callback + }; + + gdma_register_rx_event_callbacks(s_rx_channel, &rx_cbs, NULL); + gdma_tx_event_callbacks_t tx_cbs = { + .on_trans_eof = hci_uart_tl_tx_eof_callback + }; + + gdma_register_tx_event_callbacks(s_tx_channel, &tx_cbs, NULL); + // configure UHCI + uhci_ll_init((uhci_dev_t *)s_uhci_hw); + // uhci_ll_set_eof_mode((uhci_dev_t *)s_uhci_hw, UHCI_RX_LEN_EOF); + uhci_ll_set_eof_mode((uhci_dev_t *)s_uhci_hw, UHCI_RX_IDLE_EOF); + // disable software flow control + s_uhci_hw->escape_conf.val = 0; + uhci_ll_attach_uart_port((uhci_dev_t *)s_uhci_hw, s_hci_driver_uart_dma_env.hci_uart_params->hci_uart_port); +} + +static int +hci_driver_uart_dma_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, + hci_driver_direction_t dir) +{ + /* By now, this layer is only used by controller. */ + assert(dir == HCI_DRIVER_DIR_C2H); + ESP_LOGD(TAG, "dma tx:"); + ESP_LOG_BUFFER_HEXDUMP(TAG, data, length, ESP_LOG_DEBUG); + + hci_driver_util_tx_list_enqueue(data_type, data, length); + xSemaphoreGive(s_hci_driver_uart_dma_env.process_sem); + return 0; +} + +static int +hci_driver_uart_dma_h4_frame_cb(uint8_t pkt_type, void *data) +{ + hci_driver_forward_fn *forward_cb; + forward_cb = s_hci_driver_uart_dma_env.forward_cb; + if (!forward_cb) { + return -1; + } + ESP_LOGD(TAG, "h4 frame\n"); + return forward_cb(pkt_type, data, 0, HCI_DRIVER_DIR_H2C); +} + +static void +hci_driver_uart_dma_process_task(void *p) +{ + hci_message_t *rxinfo_container; + os_sr_t sr; + int ret; + uint8_t* rx_data; + uint32_t rx_len; + + while (true) { + xSemaphoreTake(s_hci_driver_uart_dma_env.process_sem, portMAX_DELAY); + ESP_LOGD(TAG, "task run:%d\n",s_hci_driver_uart_dma_env.hci_tx_state); + if (s_hci_driver_uart_dma_env.rxinfo_mem_exhausted) { + rx_data = (void *)uart_env.rx.link_head->buf; + rx_len = uart_env.rx.link_head->length; + ESP_LOGD(TAG, "rxinfo exhausted:"); + ESP_LOG_BUFFER_HEXDUMP(TAG, rx_data, rx_len, ESP_LOG_DEBUG); + ret = hci_h4_sm_rx(s_hci_driver_uart_dma_env.h4_sm, rx_data, rx_len); + hci_driver_uart_dma_rx_start(rx_data, HCI_RX_DATA_BLOCK_SIZE); + hci_driver_uart_dma_rxinfo_mem_exhausted_set(false); + if (ret < 0) { + ESP_LOGW(TAG, "parse rx data error!\n"); + r_ble_ll_hci_ev_hw_err(ESP_HCI_SYNC_LOSS_ERR); + } + } + + while (!STAILQ_EMPTY(&g_hci_rxinfo_head)) { + OS_ENTER_CRITICAL(sr); + rxinfo_container = STAILQ_FIRST(&g_hci_rxinfo_head); + STAILQ_REMOVE_HEAD(&g_hci_rxinfo_head, next); + OS_EXIT_CRITICAL(sr); + + rx_data = rxinfo_container->ptr; + rx_len = rxinfo_container->length; + ESP_LOGD(TAG, "uart rx"); + ESP_LOG_BUFFER_HEXDUMP(TAG, rx_data, rx_len, ESP_LOG_DEBUG); + ret = hci_h4_sm_rx(s_hci_driver_uart_dma_env.h4_sm, rx_data, rx_len); + if (ret < 0) { + ESP_LOGW(TAG, "parse rx data error!\n"); + r_ble_ll_hci_ev_hw_err(ESP_HCI_SYNC_LOSS_ERR); + } + + os_memblock_put(s_hci_driver_uart_dma_env.hci_rxinfo_pool, rxinfo_container); + /* No need to enter CRITICAL */ + if (s_hci_driver_uart_dma_env.is_continue_rx) { + /* We should set continux rx flag first, RX interrupted may happened when rx start soon */ + hci_driver_uart_dma_continue_rx_enable(false); + hci_driver_uart_dma_rx_start(rx_data, HCI_RX_DATA_BLOCK_SIZE); + } else { + os_memblock_put(s_hci_driver_uart_dma_env.hci_rx_data_pool, rx_data); + } + } + + /* Process Tx data */ + if (s_hci_driver_uart_dma_env.hci_tx_state == HCI_TRANS_TX_IDLE) { + ret = hci_driver_uart_dma_tx_start(hci_driver_uart_dma_send_callback, (void*)&uart_env); + if (!ret) { + s_hci_driver_uart_dma_env.hci_tx_state = HCI_TRANS_TX_START; + } + } + } +} + +static int +hci_driver_uart_dma_task_create(void) +{ + /* !TODO: Set the core id by menuconfig */ + xTaskCreatePinnedToCore(hci_driver_uart_dma_process_task, "hci_driver_uart_dma_process_task", + CONFIG_BT_LE_HCI_TRANS_TASK_STACK_SIZE, NULL, + ESP_TASK_BT_CONTROLLER_PRIO, &s_hci_driver_uart_dma_env.task_handler, + 0); + assert(s_hci_driver_uart_dma_env.task_handler); + + ESP_LOGI(TAG, "hci transport task create successfully, prio:%d, stack size: %ld", + ESP_TASK_BT_CONTROLLER_PRIO, CONFIG_BT_LE_HCI_TRANS_TASK_STACK_SIZE); + + return 0; +} + + +static void +hci_driver_uart_dma_deinit(void) +{ + if (s_hci_driver_uart_dma_env.task_handler) { + vTaskDelete(s_hci_driver_uart_dma_env.task_handler); + s_hci_driver_uart_dma_env.task_handler = NULL; + } + + ESP_ERROR_CHECK(uart_driver_delete(s_hci_driver_uart_dma_env.hci_uart_params->hci_uart_port)); + hci_driver_uart_dma_memory_deinit(); + if (!s_hci_driver_uart_dma_env.process_sem) { + vSemaphoreDelete(s_hci_driver_uart_dma_env.process_sem); + } + + hci_driver_util_deinit(); + memset(&s_hci_driver_uart_dma_env, 0, sizeof(hci_driver_uart_dma_env_t)); +} + + +static int +hci_driver_uart_dma_init(hci_driver_forward_fn *cb) +{ + int rc; + + memset(&s_hci_driver_uart_dma_env, 0, sizeof(hci_driver_uart_dma_env_t)); + + s_hci_driver_uart_dma_env.h4_sm = &s_hci_driver_uart_h4_sm; + hci_h4_sm_init(s_hci_driver_uart_dma_env.h4_sm, &s_hci_driver_mem_alloc, hci_driver_uart_dma_h4_frame_cb); + + rc = hci_driver_util_init(); + if (rc) { + goto error; + } + + s_hci_driver_uart_dma_env.process_sem = xSemaphoreCreateBinary(); + if (!s_hci_driver_uart_dma_env.process_sem) { + goto error; + } + + rc = hci_driver_uart_dma_memory_init(); + if (rc) { + goto error; + } + + s_hci_driver_uart_dma_env.forward_cb = cb; + s_hci_driver_uart_dma_env.hci_uart_params = &hci_driver_uart_dma_params; + hci_driver_uart_config(&hci_driver_uart_dma_params); + + ESP_LOGI(TAG, "uart attach uhci!"); + hci_driver_uart_dma_install(); + + STAILQ_INIT(&g_hci_rxinfo_head); + + rc = hci_driver_uart_dma_task_create(); + if (rc) { + goto error; + } + + s_hci_driver_uart_dma_env.hci_tx_state = HCI_TRANS_TX_IDLE; + s_hci_driver_uart_dma_env.rxinfo_mem_exhausted = false; + s_hci_driver_uart_dma_env.is_continue_rx = false; + hci_driver_uart_dma_rx_start(os_memblock_get(s_hci_driver_uart_dma_env.hci_rx_data_pool), + HCI_RX_DATA_BLOCK_SIZE); + return 0; + +error: + hci_driver_uart_dma_deinit(); + return rc; +} + +int +hci_driver_uart_dma_reconfig_pin(int tx_pin, int rx_pin, int cts_pin, int rts_pin) +{ + hci_driver_uart_params_config_t *uart_param = s_hci_driver_uart_dma_env.hci_uart_params; + uart_param->hci_uart_tx_pin = tx_pin; + uart_param->hci_uart_rx_pin = rx_pin; + uart_param->hci_uart_rts_pin = rts_pin; + uart_param->hci_uart_cts_pin = cts_pin; + return hci_driver_uart_config(uart_param); +} + + +hci_driver_ops_t hci_driver_uart_dma_ops = { + .hci_driver_tx = hci_driver_uart_dma_tx, + .hci_driver_init = hci_driver_uart_dma_init, + .hci_driver_deinit = hci_driver_uart_dma_deinit, +}; diff --git a/components/bt/porting/transport/driver/vhci/hci_driver_nimble.c b/components/bt/porting/transport/driver/vhci/hci_driver_nimble.c new file mode 100644 index 00000000000..9a117eb88a5 --- /dev/null +++ b/components/bt/porting/transport/driver/vhci/hci_driver_nimble.c @@ -0,0 +1,61 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "esp_hci_internal.h" +#include "esp_hci_driver.h" + +typedef struct { + hci_driver_forward_fn *forward_cb; +} hci_driver_vhci_env_t; + +static hci_driver_vhci_env_t s_hci_driver_vhci_env; + +static int +hci_driver_vhci_controller_tx(hci_driver_data_type_t data_type, uint8_t *data) +{ + /* The length is contained in the data. */ + return s_hci_driver_vhci_env.forward_cb(data_type, data, 0, HCI_DRIVER_DIR_C2H); +} + +static int +hci_driver_vhci_host_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length) +{ + return s_hci_driver_vhci_env.forward_cb(data_type, data, length, HCI_DRIVER_DIR_H2C); +} + +static int +hci_driver_vhci_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, + hci_driver_direction_t dir) +{ + int rc; + + if (dir == HCI_DRIVER_DIR_C2H) { + rc = hci_driver_vhci_controller_tx(data_type, data); + } else { + rc = hci_driver_vhci_host_tx(data_type, data, length); + } + return rc; +} + +static int +hci_driver_vhci_init(hci_driver_forward_fn *cb) +{ + s_hci_driver_vhci_env.forward_cb = cb; + return 0; +} + +static void +hci_driver_vhci_deinit(void) +{ + memset(&s_hci_driver_vhci_env, 0, sizeof(hci_driver_vhci_env_t)); +} + +hci_driver_ops_t hci_driver_vhci_ops = { + .hci_driver_tx = hci_driver_vhci_tx, + .hci_driver_init = hci_driver_vhci_init, + .hci_driver_deinit = hci_driver_vhci_deinit, +}; diff --git a/components/bt/porting/transport/driver/vhci/hci_driver_standard.c b/components/bt/porting/transport/driver/vhci/hci_driver_standard.c new file mode 100644 index 00000000000..2cdab4359e5 --- /dev/null +++ b/components/bt/porting/transport/driver/vhci/hci_driver_standard.c @@ -0,0 +1,149 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "os/os_mbuf.h" +#include "esp_hci_transport.h" +#include "esp_hci_internal.h" +#include "esp_hci_driver.h" +#include "esp_bt.h" + +typedef struct { + hci_driver_forward_fn *forward_cb; + const esp_vhci_host_callback_t *host_recv_cb; +} hci_driver_vhci_env_t; + +static hci_driver_vhci_env_t s_hci_driver_vhci_env; + +static int +hci_driver_vhci_controller_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length) +{ + int rc; + uint16_t buf_len = 0; + uint8_t *buf = NULL; + struct os_mbuf *om; + + if (data_type == HCI_DRIVER_TYPE_ACL) { + om = (struct os_mbuf *)data; + buf_len = length + 1; + buf = malloc(buf_len); + /* TODO: If there is no memory, should handle it in the controller. */ + assert(buf); + buf[0] = HCI_DRIVER_TYPE_ACL; + os_mbuf_copydata(om, 0, length, &buf[1]); + os_mbuf_free_chain(om); + } else if (data_type == HCI_DRIVER_TYPE_EVT) { + buf_len = length + 1; + buf = malloc(buf_len); + /* TODO: If there is no memory, should handle it in the controller. */ + assert(buf != NULL); + buf[0] = HCI_DRIVER_TYPE_EVT; + memcpy(&buf[1], data, length); + r_ble_hci_trans_buf_free(data); + } + + rc = s_hci_driver_vhci_env.forward_cb(data_type, buf, buf_len, HCI_DRIVER_DIR_C2H); + free(buf); + + return rc; +} + +static int +hci_driver_vhci_host_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length) +{ + uint8_t *cmd; + struct os_mbuf *om; + + if (data_type == HCI_DRIVER_TYPE_ACL) { + om = os_msys_get_pkthdr(length, ESP_HCI_INTERNAL_ACL_MBUF_LEADINGSPCAE); + assert(om); + assert(os_mbuf_append(om, &data[1], length - 1) == 0); + data = (uint8_t *)om; + } else if (data_type == HCI_DRIVER_TYPE_CMD) { + cmd = r_ble_hci_trans_buf_alloc(ESP_HCI_INTERNAL_BUF_CMD); + assert(cmd); + memcpy(cmd, data + 1, length - 1); + data = cmd; + } + + return s_hci_driver_vhci_env.forward_cb(data_type, data, length, HCI_DRIVER_DIR_H2C); +} + +static int +hci_driver_vhci_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, + hci_driver_direction_t dir) +{ + int rc; + + if (dir == HCI_DRIVER_DIR_C2H) { + rc = hci_driver_vhci_controller_tx(data_type, data, length); + } else { + rc = hci_driver_vhci_host_tx(data_type, data, length); + } + return rc; +} + +static int +hci_driver_vhci_init(hci_driver_forward_fn *cb) +{ + memset(&s_hci_driver_vhci_env, 0, sizeof(hci_driver_vhci_env_t)); + s_hci_driver_vhci_env.forward_cb = cb; + return 0; +} + +static void +hci_driver_vhci_deinit(void) +{ + memset(&s_hci_driver_vhci_env, 0, sizeof(hci_driver_vhci_env_t)); +} + +hci_driver_ops_t hci_driver_vhci_ops = { + .hci_driver_tx = hci_driver_vhci_tx, + .hci_driver_init = hci_driver_vhci_init, + .hci_driver_deinit = hci_driver_vhci_deinit, +}; + +/* Special APIs declared in the `esp_bt.h'. */ +static int +hci_driver_vhci_host_recv_cb(hci_trans_pkt_ind_t type, uint8_t *data, uint16_t len) +{ + static const esp_vhci_host_callback_t *host_recv_cb; + + host_recv_cb = s_hci_driver_vhci_env.host_recv_cb; + if (host_recv_cb) { + return host_recv_cb->notify_host_recv(data, len); + } + + return -1; +} + +esp_err_t +esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callback) +{ + if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { + return ESP_FAIL; + } + + s_hci_driver_vhci_env.host_recv_cb = callback; + if(hci_transport_host_callback_register(hci_driver_vhci_host_recv_cb)) { + s_hci_driver_vhci_env.host_recv_cb = NULL; + return ESP_FAIL; + } + + return ESP_OK; +} + +void +esp_vhci_host_send_packet(uint8_t *data, uint16_t len) +{ + hci_driver_vhci_tx(data[0], data, len, HCI_DRIVER_DIR_H2C); +} + +bool +esp_vhci_host_check_send_available(void) +{ + return true; +} diff --git a/components/bt/porting/transport/driver/vhci/hci_driver_tamplete.c b/components/bt/porting/transport/driver/vhci/hci_driver_tamplete.c new file mode 100644 index 00000000000..63feb934dad --- /dev/null +++ b/components/bt/porting/transport/driver/vhci/hci_driver_tamplete.c @@ -0,0 +1,133 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "os/os_mbuf.h" +#include "esp_hci_transport.h" +#include "esp_hci_internal.h" +#include "esp_hci_driver.h" + +typedef struct { + hci_driver_forward_fn *forward_cb; +} hci_driver_vhci_env_t; + +static hci_driver_vhci_env_t s_hci_driver_vhci_env; + +static int +hci_driver_vhci_controller_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length) +{ + int rc; + uint16_t len = 0; + uint8_t *buf = NULL; + struct os_mbuf *om; + + if (data_type == HCI_DRIVER_TYPE_ACL) { + /* The ACL data will be packaged as structure of `os_mbuf`. + * 1. Allocate a buffer suitable for the host. Use the following method to copy the data + * from the os_mbuf to the newly allocated memory. + * ```c + * buf = malloc(length); + * os_mbuf_copydata(om, 0, length, buf); + * ``` + * 2. Free the controller's os_mbuf + * ```c + * os_mbuf_free_chain(om); + * ``` + */ + } else if (data_type == HCI_DRIVER_TYPE_EVT) { + /* The event data will be packaged as an array. + * 1. Allocate a buffer suitable for the host. Use the following method to copy the data + * from the controller buffer to the newly allocated memory. + * ```c + * buf = malloc(length); + * memcpy(buf, data, length); + * ``` + * 2. Free the controller's buffer. + * ```c + * r_ble_hci_trans_buf_free(data); + * ``` + */ + } else { + assert(0); + } + + rc = s_hci_driver_vhci_env.forward_cb(data_type, buf, len, HCI_DRIVER_DIR_C2H); + free(buf); + + return rc; +} + +static int +hci_driver_vhci_host_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length) +{ + uint8_t *hci_data; + struct os_mbuf *om; + + if (data_type == HCI_DRIVER_TYPE_ACL) { + /* The ACL data needs to be packaged as structure of `os_mbuf`. + * 1. Get an os_mbuf in the following way. + * ```c + * om = os_msys_get_pkthdr(length, ESP_HCI_INTERNAL_ACL_MBUF_LEADINGSPCAE); + * ``` + * 2. Copy the host's data into this os_mbuf using the following method. + * ```c + * assert(os_mbuf_append(om, data, length) == 0); + * hci_data = (uint8_t *)om; + * ``` + * 3. Free the host's buffer if needed. + */ + } else if (data_type == HCI_DRIVER_TYPE_CMD) { + /* The COMMAND data needs to be packaged as an array. + * 1. Get a command buffer from the controller. + * ```c + * hci_data = r_ble_hci_trans_buf_alloc(ESP_HCI_INTERNAL_BUF_CMD); + * ``` + * 2. Copy the host's data into this buffer. + * ```c + * memcpy(hci_data, data, length); + * ``` + * 3. Free the host's buffer if needed. + */ + } else { + assert(0); + } + + return s_hci_driver_vhci_env.forward_cb(data_type, hci_data, length, HCI_DRIVER_DIR_H2C); +} + +static int +hci_driver_vhci_tx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, + hci_driver_direction_t dir) +{ + int rc; + + if (dir == HCI_DRIVER_DIR_C2H) { + rc = hci_driver_vhci_controller_tx(data_type, data, length); + } else { + rc = hci_driver_vhci_host_tx(data_type, data, length); + } + return rc; +} + +static int +hci_driver_vhci_init(hci_driver_forward_fn *cb) +{ + memset(&s_hci_driver_vhci_env, 0, sizeof(hci_driver_vhci_env_t)); + s_hci_driver_vhci_env.forward_cb = cb; + return 0; +} + +static void +hci_driver_vhci_deinit(void) +{ + memset(&s_hci_driver_vhci_env, 0, sizeof(hci_driver_vhci_env_t)); +} + +hci_driver_ops_t hci_driver_vhci_ops = { + .hci_driver_tx = hci_driver_vhci_tx, + .hci_driver_init = hci_driver_vhci_init, + .hci_driver_deinit = hci_driver_vhci_deinit, +}; diff --git a/components/bt/porting/transport/include/common/hci_driver_h4.h b/components/bt/porting/transport/include/common/hci_driver_h4.h new file mode 100644 index 00000000000..32d2dd8ba6c --- /dev/null +++ b/components/bt/porting/transport/include/common/hci_driver_h4.h @@ -0,0 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _HCI_H4_H_ +#define _HCI_H4_H_ + +#include + +#define HCI_H4_NONE 0x00 +#define HCI_H4_CMD 0x01 +#define HCI_H4_ACL 0x02 +#define HCI_H4_EVT 0x04 +#define HCI_H4_ISO 0x05 + +typedef void *(hci_h4_alloc_cmd)(void); +typedef void *(hci_h4_alloc_evt)(int); +typedef struct os_mbuf *(hci_h4_alloc_acl)(void); +typedef struct os_mbuf *(hci_h4_alloc_iso)(void); + +struct hci_h4_allocators { + hci_h4_alloc_cmd *cmd; + hci_h4_alloc_acl *acl; + hci_h4_alloc_evt *evt; + hci_h4_alloc_iso *iso; +}; + +extern const struct hci_h4_allocators hci_h4_allocs_from_ll; +extern const struct hci_h4_allocators hci_h4_allocs_from_hs; + +typedef int (hci_h4_frame_cb)(uint8_t pkt_type, void *data); + +struct hci_h4_sm { + uint8_t state; + uint8_t pkt_type; + uint8_t min_len; + uint16_t len; + uint16_t exp_len; + uint8_t hdr[4]; + union { + uint8_t *buf; + struct os_mbuf *om; + }; + + const struct hci_h4_allocators *allocs; + hci_h4_frame_cb *frame_cb; +}; + +void hci_h4_sm_init(struct hci_h4_sm *h4sm, + const struct hci_h4_allocators *allocs, + hci_h4_frame_cb *frame_cb); + +int hci_h4_sm_rx(struct hci_h4_sm *h4sm, const uint8_t *buf, uint16_t len); + +#endif /* _HCI_H4_H_ */ diff --git a/components/bt/porting/transport/include/common/hci_driver_mem.h b/components/bt/porting/transport/include/common/hci_driver_mem.h new file mode 100644 index 00000000000..769b18369eb --- /dev/null +++ b/components/bt/porting/transport/include/common/hci_driver_mem.h @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef _H_HCI_DRIVER_MEM_ +#define _H_HCI_DRIVER_MEM_ +#include +#include "os/os_mbuf.h" + +void *hci_driver_mem_cmd_alloc(void); + +void *hci_driver_mem_evt_alloc(int discardable); + +struct os_mbuf *hci_driver_mem_acl_alloc(void); + +struct os_mbuf *hci_driver_mem_acl_len_alloc(uint32_t len); + +struct os_mbuf *hci_driver_mem_iso_alloc(void); + +struct os_mbuf *hci_driver_mem_iso_len_alloc(uint32_t len); + +extern const struct hci_h4_allocators s_hci_driver_mem_alloc; + +#endif // _H_HCI_DRIVER_MEM_ diff --git a/components/bt/porting/transport/include/common/hci_driver_util.h b/components/bt/porting/transport/include/common/hci_driver_util.h new file mode 100644 index 00000000000..05b7abd5023 --- /dev/null +++ b/components/bt/porting/transport/include/common/hci_driver_util.h @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef _H_HCI_DRIVER_UTIL_ +#define _H_HCI_DRIVER_UTIL_ +#include + +int hci_driver_util_init(void); + +void hci_driver_util_deinit(void); + +void hci_driver_util_tx_list_enqueue(hci_driver_data_type_t type, uint8_t *data, uint32_t len); + +uint32_t hci_driver_util_tx_list_dequeue(uint32_t max_tx_len, void **tx_data, bool *last_frame); + +#endif // _H_HCI_DRIVER_UTIL_ diff --git a/components/bt/porting/transport/include/esp_hci_driver.h b/components/bt/porting/transport/include/esp_hci_driver.h new file mode 100644 index 00000000000..09102edff83 --- /dev/null +++ b/components/bt/porting/transport/include/esp_hci_driver.h @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef H_ESP_HCI_DRIVER_ +#define H_ESP_HCI_DRIVER_ +#include + +/** + * @brief Enumeration of HCI transport direction. + */ +typedef enum { + HCI_DRIVER_DIR_C2H = 0x00, ///< From controller to host. + HCI_DRIVER_DIR_H2C, ///< From host to controller. +} hci_driver_direction_t; + +typedef enum { + HCI_DRIVER_TYPE_CMD = 0x01, ///< HCI Command Indicator. + HCI_DRIVER_TYPE_ACL, ///< HCI ACL Data Indicator. + HCI_DRIVER_TYPE_SYNC, ///< HCI Synchronous Data Indicator. + HCI_DRIVER_TYPE_EVT, ///< HCI Event Indicator. + HCI_DRIVER_TYPE_ISO, ///< HCI Isochronous Data Indicator. + HCI_DRIVER_TYPE_VENDOR, ///< HCI Vendor data Indicator. +} hci_driver_data_type_t; + +typedef int hci_driver_forward_fn(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, + hci_driver_direction_t dir); + +/** + * @brief Structure of HCI driver operations. + */ +typedef struct hci_driver_ops { + int (*hci_driver_tx)(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, + hci_driver_direction_t dir); + int (*hci_driver_init)(hci_driver_forward_fn *cb); + void (*hci_driver_deinit)(void); +} hci_driver_ops_t; + + +#if CONFIG_BT_LE_HCI_INTERFACE_USE_RAM +extern hci_driver_ops_t hci_driver_vhci_ops; +#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + +#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART +extern hci_driver_ops_t hci_driver_uart_ops; +#if CONFIG_BT_LE_UART_HCI_DMA_MODE +extern hci_driver_ops_t hci_driver_uart_dma_ops; +#endif // CONFIG_BT_LE_UART_HCI_DMA_MODE +#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_UART + +#endif // H_ESP_HCI_DRIVER_ diff --git a/components/bt/porting/transport/include/esp_hci_internal.h b/components/bt/porting/transport/include/esp_hci_internal.h new file mode 100644 index 00000000000..2b1c3353082 --- /dev/null +++ b/components/bt/porting/transport/include/esp_hci_internal.h @@ -0,0 +1,121 @@ +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef H_ESP_HCI_INTERNAL_ +#define H_ESP_HCI_INTERNAL_ + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include "os/os_mbuf.h" + + +/* The leadingspace in user info header for ACL data */ +#define ESP_HCI_INTERNAL_ACL_MBUF_LEADINGSPCAE (4) + +#define ESP_HCI_INTERNAL_BUF_CMD (3) + +/** + * @brief Define the HCI hardware error code for synchronization loss. + * This error code is used to indicate a loss of synchronization between the controller and the host. + */ +#define ESP_HCI_SYNC_LOSS_ERR (0x1) +/** Callback function types; executed when HCI packets are received. */ +typedef int esp_hci_internal_rx_cmd_fn(uint8_t *cmd, void *arg); +typedef int esp_hci_internal_rx_acl_fn(struct os_mbuf *om, void *arg); + +/** + * Configures the HCI transport to operate with a host. The transport will + * execute specified callbacks upon receiving HCI packets from the controller. + * + * @param evt_cb The callback to execute upon receiving an HCI + * event. + * @param evt_arg Optional argument to pass to the event + * callback. + * @param acl_cb The callback to execute upon receiving ACL + * data. + * @param acl_arg Optional argument to pass to the ACL + * callback. + */ +void r_ble_hci_trans_cfg_hs(esp_hci_internal_rx_cmd_fn *evt_cb, void *evt_arg, + esp_hci_internal_rx_acl_fn *acl_cb, void *acl_arg); +/** + * Sends ACL data from host to controller. + * + * @param om The ACL data packet to send. + * + * @return 0 on success; + * A BLE_ERR_[...] error code on failure. + */ +int r_ble_hci_trans_hs_acl_tx(struct os_mbuf *om); + +/** + * Sends an HCI command from the host to the controller. + * + * @param cmd The HCI command to send. This buffer must be + * allocated via ble_hci_trans_buf_alloc(). + * + * @return 0 on success; + * A BLE_ERR_[...] error code on failure. + */ +int r_ble_hci_trans_hs_cmd_tx(uint8_t *cmd); + +/** + * Allocates a flat buffer of the specified type. + * + * @param type The type of buffer to allocate; one of the + * BLE_HCI_TRANS_BUF_[...] constants. + * + * @return The allocated buffer on success; + * NULL on buffer exhaustion. + */ +uint8_t * r_ble_hci_trans_buf_alloc(int type); + +/** + * Frees the specified flat buffer. The buffer must have been allocated via + * ble_hci_trans_buf_alloc(). + * + * @param buf The buffer to free. + */ +void r_ble_hci_trans_buf_free(uint8_t *buf); + +/** + * Configures a callback to get executed whenever an ACL data packet is freed. + * The function is called immediately before the free occurs. + * + * @param cb The callback to configure. + * @param arg An optional argument to pass to the callback. + * + * @return 0 on success; + * BLE_ERR_UNSUPPORTED if the transport does not + * support this operation. + */ +int r_ble_hci_trans_set_acl_free_cb(os_mempool_put_fn *cb, void *arg); + +/** + * @brief Handle an HCI hardware error event. + * This function processes a hardware error code and generates the appropriate HCI hardware error event. + * + * @param hw_err The hardware error code that needs to be processed. The specific meaning of the error code + * depends on the implementation and the hardware. + * + * @return int Returns 0 on success, or a non-zero error code on failure. + * + * @note This function should be called whenever a hardware error is detected in the HCI Layer. + */ +int r_ble_ll_hci_ev_hw_err(uint8_t hw_err); + +//!TODO: Check what this API is used for +int r_ble_hci_trans_reset(void); + +//!TODO: Should we initialize the hci layer in IDF ? +void esp_ble_hci_trans_init(uint8_t); + +#ifdef __cplusplus +} +#endif +#endif /* H_ESP_HCI_INTERNAL_ */ diff --git a/components/bt/porting/transport/include/esp_hci_transport.h b/components/bt/porting/transport/include/esp_hci_transport.h new file mode 100644 index 00000000000..044ebfdfb80 --- /dev/null +++ b/components/bt/porting/transport/include/esp_hci_transport.h @@ -0,0 +1,83 @@ +/* + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef H_ESP_HCI_TRANSPORT_ +#define H_ESP_HCI_TRANSPORT_ + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include "os/os_mbuf.h" +#include "esp_hci_driver.h" + +/** + * @brief Enumeration of HCI packet indicators + */ +typedef enum { + HCI_CMD_IND = 0x01, /*!< HCI Command Indicator */ + HCI_ACL_IND, /*!< HCI ACL Data Indicator */ + HCI_SYNC_IND, /*!< HCI Synchronous Data Indicator */ + HCI_EVT_IND, /*!< HCI Event Indicator */ + HCI_ISO_IND, /*!< HCI Isochronous Data Indicator */ + HCI_VENDOR_IND, /*!< HCI Vendor data Indicator */ +} hci_trans_pkt_ind_t; + +/** + * @brief Enumeration of HCI Transport Mode + */ +typedef enum { + HCI_TRANSPORT_VHCI, /*!< VHCI Transport Mode */ + HCI_TRANSPORT_UART_NO_DMA, /*!< UART_NO_DMA Transport Mode */ + HCI_TRANSPORT_UART_UHCI, /*!< UART_UHCI Transport Mode */ + HCI_TRANSPORT_SDIO, /*!< SDIO Transport Mode */ + HCI_TRANSPORT_USB, /*!< USB Transport Mode */ +} hci_trans_mode_t; + +typedef int hci_transport_host_recv_fn(hci_trans_pkt_ind_t type, uint8_t *data, uint16_t len); + +/** + * @brief Initialize the HCI transport layer. + * It should be called before using any other functions in the transport layer. + * + * @param hci_transport_mode The mode in which the HCI transport should operate. + * + * @return int Returns 0 on success, or a non-zero error code on failure. + */ +int hci_transport_init(uint8_t hci_transport_mode); + +/** + * @brief Deinitialize the HCI transport layer for releasing any allocated resources. + */ +void hci_transport_deinit(void); + +/** + * @brief Set the host's HCI callback which will be invoked when receiving ACL/Events from controller. + * @param callback hci_transport_host_recv_fn type variable + * @return int 0 on success, non-zero error code on failure. + */ +int hci_transport_host_callback_register(hci_transport_host_recv_fn *callback); + +/** + * @brief Called to send HCI commands form host to controller. + * @param data Point to the commands data + * @param length Length of data + * @return int 0 on success, non-zero error code on failure. + */ +int hci_transport_host_cmd_tx(uint8_t *data, uint32_t length); + +/** + * @brief Called to send HCI ACL form host to controller. + * @param data Point to the ACL data + * @param length Length of data + * @return int 0 on success, non-zero error code on failure. + */ +int hci_transport_host_acl_tx(uint8_t *data, uint32_t length); + +#ifdef __cplusplus +} +#endif +#endif /* H_ESP_HCI_TRANSPORT_ */ diff --git a/components/bt/porting/transport/include/hci_uart.h b/components/bt/porting/transport/include/hci_uart.h deleted file mode 100644 index 02bc91b4033..00000000000 --- a/components/bt/porting/transport/include/hci_uart.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "driver/uart.h" - -/** - * Function prototype for UART driver to ask for more data to send. - * Returns -1 if no more data is available for TX. - * Driver must call this with interrupts disabled. - */ -typedef int (*hci_uart_tx_char)(void *arg); - -/** - * Function prototype for UART driver to report that transmission is - * complete. This should be called when transmission of last byte is - * finished. - * Driver must call this with interrupts disabled. - */ -typedef void (*hci_uart_tx_done)(void *arg); - -/** - * Function prototype for UART driver to report incoming byte of data. - * Returns -1 if data was dropped. - * Driver must call this with interrupts disabled. - */ -typedef int (*hci_uart_rx_char)(void *arg, uint8_t byte); - - -/** - * Initializes given uart. Mapping of logical UART number to physical - * UART/GPIO pins is in BSP. - */ -int hci_uart_init_cbs(int uart, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg); - - -/** - * Applies given configuration to UART. - * - * @param port_num The UART number to configure - * @param speed The baudrate in bps to configure - * @param databits The number of databits to send per byte - * @param stopbits The number of stop bits to send - * @param parity The UART parity - * @param flow_ctl Flow control settings on the UART - * - * @return 0 on success, non-zero error code on failure - */ -int hci_uart_config(int port_num, int32_t baud_rate, uint8_t data_bits, uint8_t stop_bits, - uart_parity_t parity, uart_hw_flowcontrol_t flow_ctl); - -/** - * Close UART port. Can call hal_uart_config() with different settings after - * calling this. - * - * @param port_num The UART number to close - */ -int hci_uart_close(int port_num); - -/** - * More data queued for transmission. UART driver will start asking for that - * data. - * - * @param port_num The UART number to start TX on - */ -void hci_uart_start_tx(int port_num); - -/** - * Upper layers have consumed some data, and are now ready to receive more. - * This is meaningful after uart_rx_char callback has returned -1 telling - * that no more data can be accepted. - * - * @param port_num The UART number to begin RX on - */ -void hci_uart_start_rx(int port_num); - -/** - * @brief reconfig hci uart pin - * - * @param tx_pin The Tx pin - * @param rx_pin The Rx pin - * @param cts_pin The CTS pin - * @param rts_pin The RTS pin - * @return int 0 on success, non-zero error code on failure - */ -int hci_uart_reconfig_pin(int tx_pin, int rx_pin, int cts_pin, int rts_pin); - -#ifdef __cplusplus -} -#endif diff --git a/components/bt/porting/transport/src/hci_transport.c b/components/bt/porting/transport/src/hci_transport.c new file mode 100644 index 00000000000..df8b5db009c --- /dev/null +++ b/components/bt/porting/transport/src/hci_transport.c @@ -0,0 +1,175 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "esp_log.h" +#include "esp_hci_transport.h" +#include "esp_hci_internal.h" +#include "esp_bt.h" + +typedef struct hci_transport_env +{ + hci_transport_host_recv_fn *host_recv_cb; + hci_driver_ops_t *driver_ops; +} hci_transport_env_t; + +static hci_transport_env_t s_hci_transport_env; + +/* Functions for packets Rx. */ +static int +hci_transport_controller_packet_rx(hci_driver_data_type_t data_type, uint8_t *data) +{ + if (data_type == HCI_DRIVER_TYPE_CMD) { + r_ble_hci_trans_hs_cmd_tx(data); + } + + if (data_type == HCI_DRIVER_TYPE_ACL) { + r_ble_hci_trans_hs_acl_tx((struct os_mbuf *) data); + } + return 0; +} + +static int +hci_transport_host_packet_rx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length) +{ + if (!s_hci_transport_env.host_recv_cb) { + return -1; + } + return s_hci_transport_env.host_recv_cb((hci_trans_pkt_ind_t)data_type, data, length); +} + +static int +hci_transport_packet_rx(hci_driver_data_type_t data_type, uint8_t *data, uint32_t length, + hci_driver_direction_t dir) +{ + int rc; + if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { + return -1; + } + + if (dir == HCI_DRIVER_DIR_C2H) { + rc = hci_transport_host_packet_rx(data_type, data, length); + } else { + rc = hci_transport_controller_packet_rx(data_type, data); + } + + return rc; +} + +/* Functions for controller Tx. */ +static int +hci_transport_controller_tx_dummy(void *data, void *arg) +{ + return -1; +} + +static int +hci_transport_controller_evt_tx(uint8_t *hci_ev, void *arg) +{ + uint32_t len; + + if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { + return -1; + } + + len = hci_ev[1] + 2; + return s_hci_transport_env.driver_ops->hci_driver_tx(HCI_DRIVER_TYPE_EVT, hci_ev, len, + HCI_DRIVER_DIR_C2H); +} + +static int +hci_transport_controller_acl_tx(struct os_mbuf *om, void *arg) +{ + uint16_t len; + if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { + return -1; + } + + len = OS_MBUF_PKTHDR(om)->omp_len; + return s_hci_transport_env.driver_ops->hci_driver_tx(HCI_DRIVER_TYPE_ACL, (uint8_t *)om, len, + HCI_DRIVER_DIR_C2H); +} + +/* Functions for host Tx. */ +int +hci_transport_host_cmd_tx(uint8_t *data, uint32_t length) +{ + return s_hci_transport_env.driver_ops->hci_driver_tx(HCI_DRIVER_TYPE_CMD, data, length, + HCI_DRIVER_DIR_H2C); +} + +int +hci_transport_host_acl_tx(uint8_t *data, uint32_t length) +{ + return s_hci_transport_env.driver_ops->hci_driver_tx(HCI_DRIVER_TYPE_ACL, data, length, + HCI_DRIVER_DIR_H2C); +} + +int +hci_transport_host_callback_register(hci_transport_host_recv_fn *callback) +{ + s_hci_transport_env.host_recv_cb = callback; + return 0; +} + +int +hci_transport_init(uint8_t hci_transport_mode) +{ + int rc; + hci_driver_ops_t *ops; + + memset(&s_hci_transport_env, 0, sizeof(hci_transport_env_t)); + + switch(hci_transport_mode) { +#if CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + case HCI_TRANSPORT_VHCI: + ops = &hci_driver_vhci_ops; + break; +#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_RAM +#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART +#if CONFIG_BT_LE_UART_HCI_DMA_MODE + case HCI_TRANSPORT_UART_UHCI: + ops = &hci_driver_uart_dma_ops; + break; +#else + case HCI_TRANSPORT_UART_NO_DMA: + ops = &hci_driver_uart_ops; + break; +#endif // CONFIG_BT_LE_UART_HCI_DMA_MODE +#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_UART + default: + assert(0); + } + + rc = ops->hci_driver_init(hci_transport_packet_rx); + if (rc) { + goto error; + } + + s_hci_transport_env.driver_ops = ops; + r_ble_hci_trans_cfg_hs(hci_transport_controller_evt_tx, NULL, hci_transport_controller_acl_tx, NULL); + + return 0; + +error: + hci_transport_deinit(); + return rc; +} + +void +hci_transport_deinit(void) +{ + hci_driver_ops_t *ops; + + r_ble_hci_trans_cfg_hs((esp_hci_internal_rx_cmd_fn *)hci_transport_controller_tx_dummy, NULL, + (esp_hci_internal_rx_acl_fn *)hci_transport_controller_tx_dummy, NULL); + + ops = s_hci_transport_env.driver_ops; + if (ops) { + ops->hci_driver_deinit(); + } + memset(&s_hci_transport_env, 0, sizeof(hci_transport_env_t)); +} diff --git a/components/bt/porting/transport/uart/hci_uart.c b/components/bt/porting/transport/uart/hci_uart.c deleted file mode 100644 index c202e0a5041..00000000000 --- a/components/bt/porting/transport/uart/hci_uart.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/queue.h" -#include "driver/uart.h" -#include "hci_uart.h" -#include "esp_log.h" -#include "esp_attr.h" - -#ifdef CONFIG_BT_LE_HCI_INTERFACE_USE_UART - -static const char *TAG = "hci_uart"; - -#define BUF_SIZE (1024) -#define RD_BUF_SIZE (BUF_SIZE) - -#define HCI_UART_TX_PIN CONFIG_BT_LE_HCI_UART_TX_PIN -#define HCI_UART_RX_PIN CONFIG_BT_LE_HCI_UART_RX_PIN - - -#ifdef CONFIG_BT_LE_HCI_UART_FLOWCTRL -#define HCI_UART_FLOWCTRL UART_HW_FLOWCTRL_CTS_RTS -#define HCI_UART_RTS_PIN CONFIG_BT_LE_HCI_UART_RTS_PIN -#define HCI_UART_CTS_PIN CONFIG_BT_LE_HCI_UART_CTS_PIN -#else -#define HCI_UART_FLOWCTRL UART_HW_FLOWCTRL_DISABLE -#define HCI_UART_RTS_PIN (-1) -#define HCI_UART_CTS_PIN (-1) -#endif - - -typedef struct { - bool uart_opened; - uart_port_t port; - uart_config_t cfg; - QueueHandle_t evt_queue; - TaskHandle_t rx_task_handler; - hci_uart_tx_char tx_char; - hci_uart_tx_done tx_done; - hci_uart_rx_char rx_char; - void *u_func_arg; - -} hci_uart_t; - -static hci_uart_t hci_uart; - -static void IRAM_ATTR hci_uart_rx_task(void *pvParameters) -{ - uart_event_t event; - uint8_t *dtmp = (uint8_t *) malloc(RD_BUF_SIZE); - while (hci_uart.uart_opened) { - //Waiting for UART event. - if (xQueueReceive(hci_uart.evt_queue, (void * )&event, (TickType_t)portMAX_DELAY)) { - bzero(dtmp, RD_BUF_SIZE); - ESP_LOGD(TAG, "uart[%d] event:", hci_uart.port); - switch (event.type) { - //Event of UART receving data - /*We'd better handler data event fast, there would be much more data events than - other types of events. If we take too much time on data event, the queue might - be full.*/ - case UART_DATA: - // ESP_LOGI(TAG, "[UART DATA]: %d", event.size); - uart_read_bytes(hci_uart.port, dtmp, event.size, portMAX_DELAY); - for (int i = 0 ; i < event.size; i++) { - hci_uart.rx_char(hci_uart.u_func_arg, dtmp[i]); - } - break; - //Event of HW FIFO overflow detected - case UART_FIFO_OVF: - ESP_LOGI(TAG, "hw fifo overflow"); - // If fifo overflow happened, you should consider adding flow control for your application. - // The ISR has already reset the rx FIFO, - uart_flush_input(hci_uart.port); - xQueueReset(hci_uart.evt_queue); - break; - //Event of UART ring buffer full - case UART_BUFFER_FULL: - ESP_LOGI(TAG, "ring buffer full"); - // If buffer full happened, you should consider encreasing your buffer size - uart_flush_input(hci_uart.port); - xQueueReset(hci_uart.evt_queue); - break; - //Event of UART RX break detected - case UART_BREAK: - ESP_LOGI(TAG, "uart rx break"); - break; - //Event of UART parity check error - case UART_PARITY_ERR: - ESP_LOGI(TAG, "uart parity error"); - break; - //Event of UART frame error - case UART_FRAME_ERR: - ESP_LOGI(TAG, "uart frame error"); - break; - //Others - default: - ESP_LOGI(TAG, "uart event type: %d", event.type); - break; - } - } - } - free(dtmp); - dtmp = NULL; - hci_uart.rx_task_handler = NULL; - vTaskDelete(NULL); -} - -int hci_uart_config(int port_num, int32_t baud_rate, uint8_t data_bits, uint8_t stop_bits, - uart_parity_t parity, uart_hw_flowcontrol_t flow_ctl) -{ - uart_config_t uart_cfg = { - .baud_rate = baud_rate, - .data_bits = data_bits, - .parity = parity, - .stop_bits = stop_bits, - .flow_ctrl = HCI_UART_FLOWCTRL, - .source_clk = UART_SCLK_DEFAULT, - .rx_flow_ctrl_thresh = UART_HW_FIFO_LEN(port_num) - 1, - }; - hci_uart.port = port_num; - hci_uart.cfg = uart_cfg; - - int intr_alloc_flags = 0; - intr_alloc_flags = ESP_INTR_FLAG_IRAM; - - printf("set uart pin tx:%d, rx:%d.\n", HCI_UART_TX_PIN, HCI_UART_RX_PIN); - printf("set rts:%d, cts:%d.\n", HCI_UART_RTS_PIN, HCI_UART_CTS_PIN); - printf("set baud_rate:%d.\n", baud_rate); - - ESP_ERROR_CHECK(uart_driver_delete(port_num)); - ESP_ERROR_CHECK(uart_driver_install(port_num, BUF_SIZE * 2, BUF_SIZE * 2, 20, &hci_uart.evt_queue, intr_alloc_flags)); - ESP_ERROR_CHECK(uart_param_config(port_num, &hci_uart.cfg)); - ESP_ERROR_CHECK(uart_set_pin(port_num, HCI_UART_TX_PIN, HCI_UART_RX_PIN, HCI_UART_RTS_PIN, HCI_UART_CTS_PIN)); - - hci_uart.uart_opened = true; - - //Create a task to handler UART event from ISR - xTaskCreate(hci_uart_rx_task, "hci_uart_rx_task", 2048, NULL, 12, &hci_uart.rx_task_handler); - return 0; -} - -void IRAM_ATTR hci_uart_start_tx(int port_num) -{ - int data; - uint8_t u8_data = 0; - while (1) { - data = hci_uart.tx_char(hci_uart.u_func_arg); - if (data >= 0) { - u8_data = data; - uart_write_bytes(port_num, (char *)&u8_data, 1); - } else { - break; - } - } - if (hci_uart.tx_done) { - hci_uart.tx_done(hci_uart.u_func_arg); - } -} - -int hci_uart_init_cbs(int port_num, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg) -{ - hci_uart.tx_char = tx_func; - hci_uart.rx_char = rx_func; - hci_uart.tx_done = tx_done; - hci_uart.u_func_arg = arg; - return 0; -} - -int hci_uart_close(int port_num) -{ - uart_event_t uart_event; - uart_event.type = UART_BREAK; - hci_uart.uart_opened = false; - // Stop uart rx task - if (hci_uart.rx_task_handler != NULL) { - xQueueSend(hci_uart.evt_queue, (void *)&uart_event, 1000); - ESP_LOGW(TAG, "Waiting for uart task finish..."); - } - while (hci_uart.rx_task_handler != NULL); - - uart_driver_delete(port_num); - ESP_LOGI(TAG, "hci uart close success."); - return 0; -} - -int hci_uart_reconfig_pin(int tx_pin, int rx_pin, int cts_pin, int rts_pin) -{ - int port_num = hci_uart.port; - int32_t baud_rate = hci_uart.cfg.baud_rate; - uint8_t data_bits = hci_uart.cfg.data_bits; - uint8_t stop_bits = hci_uart.cfg.stop_bits; - uart_parity_t parity = hci_uart.cfg.parity; - uart_hw_flowcontrol_t flow_ctl = hci_uart.cfg.flow_ctrl; - hci_uart_close(port_num); - hci_uart_config(port_num, baud_rate, data_bits, stop_bits, parity, flow_ctl); - ESP_ERROR_CHECK(uart_set_pin(port_num, tx_pin, rx_pin, rts_pin, cts_pin)); - return 0; -} -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART From 8504040869e2235deaee9c3fb61108d1757f7c47 Mon Sep 17 00:00:00 2001 From: zwl Date: Thu, 4 Jul 2024 21:12:38 +0800 Subject: [PATCH 005/113] feat(bluetooth/controller): adopting new HCI layer code on ESP32-C2 --- components/bt/controller/esp32c2/Kconfig.in | 30 ++- components/bt/controller/esp32c2/bt.c | 188 ++---------------- components/bt/controller/esp32c2/esp_bt_cfg.h | 19 +- .../bt/controller/lib_esp32c2/esp32c2-bt-lib | 2 +- .../bt/include/esp32c2/include/esp_bt.h | 9 +- components/esp_rom/esp32c2/ld/esp32c2.rom.ld | 1 - 6 files changed, 59 insertions(+), 190 deletions(-) diff --git a/components/bt/controller/esp32c2/Kconfig.in b/components/bt/controller/esp32c2/Kconfig.in index 9a04ae6394c..8699b6b56c5 100644 --- a/components/bt/controller/esp32c2/Kconfig.in +++ b/components/bt/controller/esp32c2/Kconfig.in @@ -2,15 +2,15 @@ menu "HCI Config" choice BT_LE_HCI_INTERFACE - prompt "Select HCI interface" + prompt "HCI mode" default BT_LE_HCI_INTERFACE_USE_RAM config BT_LE_HCI_INTERFACE_USE_RAM - bool "ram" + bool "VHCI" help Use RAM as HCI interface config BT_LE_HCI_INTERFACE_USE_UART - bool "uart" + bool "UART(H4)" help Use UART as HCI interface endchoice @@ -73,12 +73,26 @@ menu "HCI Config" UART_PARITY_ODD endchoice - config BT_LE_HCI_UART_TASK_STACK_SIZE - int "HCI uart task stack size" - depends on BT_LE_HCI_INTERFACE_USE_UART - default 1000 + config BT_LE_HCI_UART_RX_BUFFER_SIZE + int "The size of rx ring buffer memory" + depends on !BT_LE_HCI_INTERFACE_USE_RAM + default 512 + help + The size of rx ring buffer memory + + config BT_LE_HCI_UART_TX_BUFFER_SIZE + int "The size of tx ring buffer memory" + depends on !BT_LE_HCI_INTERFACE_USE_RAM + default 256 + help + The size of tx ring buffer memory + + config BT_LE_HCI_TRANS_TASK_STACK_SIZE + int "HCI transport task stack size" + depends on !BT_LE_HCI_INTERFACE_USE_RAM + default 1024 help - Set the size of uart task stack + This configures stack size of hci transport task endmenu config BT_LE_CONTROLLER_NPL_OS_PORTING_SUPPORT diff --git a/components/bt/controller/esp32c2/bt.c b/components/bt/controller/esp32c2/bt.c index 29c3332604b..8333a8a2b11 100644 --- a/components/bt/controller/esp32c2/bt.c +++ b/components/bt/controller/esp32c2/bt.c @@ -31,7 +31,7 @@ #endif #include "nimble/nimble_npl_os.h" -#include "ble_hci_trans.h" +#include "esp_hci_transport.h" #include "os/endian.h" #include "esp_bt.h" @@ -44,13 +44,8 @@ #include "soc/syscon_reg.h" #include "soc/modem_clkrst_reg.h" #include "esp_private/periph_ctrl.h" -#include "hci_uart.h" #include "bt_osi_mem.h" -#ifdef CONFIG_BT_BLUEDROID_ENABLED -#include "hci/hci_hal.h" -#endif - #if CONFIG_FREERTOS_USE_TICKLESS_IDLE #include "esp_private/sleep_modem.h" #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE @@ -67,6 +62,7 @@ #include "hal/efuse_ll.h" #include "soc/rtc.h" + /* Macro definition ************************************************************************ */ @@ -79,12 +75,6 @@ #define EXT_FUNC_MAGIC_VALUE 0xA5A5A5A5 #define BT_ASSERT_PRINT ets_printf - -#ifdef CONFIG_BT_BLUEDROID_ENABLED -/* ACL_DATA_MBUF_LEADINGSPCAE: The leadingspace in user info header for ACL data */ -#define ACL_DATA_MBUF_LEADINGSPCAE 4 -#endif // CONFIG_BT_BLUEDROID_ENABLED - typedef enum ble_rtc_slow_clk_src { BT_SLOW_CLK_SRC_MAIN_XTAL, BT_SLOW_CLK_SRC_32K_XTAL_ON_PIN0, @@ -108,12 +98,12 @@ struct ext_funcs_t { int (*_esp_intr_free)(void **ret_handle); void *(* _malloc)(size_t size); void (*_free)(void *p); - void (*_hal_uart_start_tx)(int); - int (*_hal_uart_init_cbs)(int, hci_uart_tx_char, hci_uart_tx_done, hci_uart_rx_char, void *); - int (*_hal_uart_config)(int, int32_t, uint8_t, uint8_t, uart_parity_t, uart_hw_flowcontrol_t); - int (*_hal_uart_close)(int); - void (*_hal_uart_blocking_tx)(int, uint8_t); - int (*_hal_uart_init)(int, void *); + void (*_rsv1)(int); + int (*_rsv2)(int, int (*)(void *arg), int (*)(void *arg, uint8_t byte), int (*)(void *arg, uint8_t byte), void *); + int (*_rsv3)(int, int32_t, uint8_t, uint8_t, int, int); + int (*_rsv4)(int); + void (*_rsv5)(int, uint8_t); + int (*_rsv6)(int, void *); int (* _task_create)(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); void (* _task_delete)(void *task_handle); void (*_osi_assert)(const uint32_t ln, const char *fn, uint32_t param1, uint32_t param2); @@ -191,16 +181,6 @@ static void coex_schm_status_bit_set_wrapper(uint32_t type, uint32_t status); static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status); static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); static void task_delete_wrapper(void *task_handle); -#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART -static void hci_uart_start_tx_wrapper(int uart_no); -static int hci_uart_init_cbs_wrapper(int uart_no, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg); -static int hci_uart_config_wrapper(int uart_no, int32_t speed, uint8_t databits, uint8_t stopbits, - uart_parity_t parity, uart_hw_flowcontrol_t flow_ctl); -static int hci_uart_close_wrapper(int uart_no); -static void hci_uart_blocking_tx_wrapper(int port, uint8_t data); -static int hci_uart_init_wrapper(int uart_no, void *cfg); -#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_UART static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in); static int esp_intr_free_wrapper(void **ret_handle); @@ -218,7 +198,6 @@ static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, b */ /* Static variable declare */ static DRAM_ATTR esp_bt_controller_status_t ble_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; - #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED const static uint32_t log_bufs_size[] = {CONFIG_BT_LE_LOG_CTRL_BUF1_SIZE, CONFIG_BT_LE_LOG_HCI_BUF_SIZE, CONFIG_BT_LE_LOG_CTRL_BUF2_SIZE}; #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED @@ -232,7 +211,6 @@ static DRAM_ATTR esp_pm_lock_handle_t s_pm_lock = NULL; #define BLE_RTC_DELAY_US (1800) - static const struct osi_coex_funcs_t s_osi_coex_funcs_ro = { ._magic = OSI_COEX_MAGIC_VALUE, ._version = OSI_COEX_VERSION, @@ -248,14 +226,6 @@ struct ext_funcs_t ext_funcs_ro = { ._esp_intr_free = esp_intr_free_wrapper, ._malloc = bt_osi_mem_malloc_internal, ._free = bt_osi_mem_free, -#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART - ._hal_uart_start_tx = hci_uart_start_tx_wrapper, - ._hal_uart_init_cbs = hci_uart_init_cbs_wrapper, - ._hal_uart_config = hci_uart_config_wrapper, - ._hal_uart_close = hci_uart_close_wrapper, - ._hal_uart_blocking_tx = hci_uart_blocking_tx_wrapper, - ._hal_uart_init = hci_uart_init_wrapper, -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART ._task_create = task_create_wrapper, ._task_delete = task_delete_wrapper, ._osi_assert = osi_assert_wrapper, @@ -302,83 +272,6 @@ static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status) #endif // CONFIG_SW_COEXIST_ENABLE } -#ifdef CONFIG_BT_BLUEDROID_ENABLED -bool esp_vhci_host_check_send_available(void) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return false; - } - return true; -} - -/** - * Allocates an mbuf for use by the nimble host. - */ -static struct os_mbuf *ble_hs_mbuf_gen_pkt(uint16_t leading_space) -{ - struct os_mbuf *om; - int rc; - - om = os_msys_get_pkthdr(0, 0); - if (om == NULL) { - return NULL; - } - - if (om->om_omp->omp_databuf_len < leading_space) { - rc = os_mbuf_free_chain(om); - assert(rc == 0); - return NULL; - } - - om->om_data += leading_space; - - return om; -} - -/** - * Allocates an mbuf suitable for an HCI ACL data packet. - * - * @return An empty mbuf on success; null on memory - * exhaustion. - */ -struct os_mbuf *ble_hs_mbuf_acl_pkt(void) -{ - return ble_hs_mbuf_gen_pkt(4 + 1); -} - -void esp_vhci_host_send_packet(uint8_t *data, uint16_t len) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return; - } - - if (*(data) == DATA_TYPE_COMMAND) { - struct ble_hci_cmd *cmd = NULL; - cmd = (struct ble_hci_cmd *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD); - assert(cmd); - memcpy((uint8_t *)cmd, data + 1, len - 1); - ble_hci_trans_hs_cmd_tx((uint8_t *)cmd); - } - - if (*(data) == DATA_TYPE_ACL) { - struct os_mbuf *om = os_msys_get_pkthdr(len, ACL_DATA_MBUF_LEADINGSPCAE); - assert(om); - assert(os_mbuf_append(om, &data[1], len - 1) == 0); - ble_hci_trans_hs_acl_tx(om); - } -} - -esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callback) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return ESP_FAIL; - } - - ble_hci_trans_cfg_hs(ble_hs_hci_rx_evt, NULL, ble_hs_rx_data, NULL); - - return ESP_OK; -} -#endif // CONFIG_BT_BLUEDROID_ENABLED static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id) { return (uint32_t)xTaskCreatePinnedToCore(task_func, name, stack_depth, param, prio, task_handle, (core_id < CONFIG_FREERTOS_NUMBER_OF_CORES ? core_id : tskNO_AFFINITY)); @@ -408,56 +301,6 @@ static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer return rc; } -#ifdef CONFIG_BT_LE_HCI_INTERFACE_USE_UART -static void hci_uart_start_tx_wrapper(int uart_no) -{ - hci_uart_start_tx(uart_no); -} - -static int hci_uart_init_cbs_wrapper(int uart_no, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg) -{ - int rc = -1; - rc = hci_uart_init_cbs(uart_no, tx_func, tx_done, rx_func, arg); - return rc; -} - - -static int hci_uart_config_wrapper(int port_num, int32_t baud_rate, uint8_t data_bits, - uint8_t stop_bits,uart_parity_t parity, - uart_hw_flowcontrol_t flow_ctl) -{ - int rc = -1; - rc = hci_uart_config(port_num, baud_rate, data_bits, stop_bits, parity, flow_ctl); - return rc; -} - -static int hci_uart_close_wrapper(int uart_no) -{ - int rc = -1; - rc = hci_uart_close(uart_no); - return rc; -} - -static void hci_uart_blocking_tx_wrapper(int port, uint8_t data) -{ - //This function is nowhere to use. -} - -static int hci_uart_init_wrapper(int uart_no, void *cfg) -{ - //This function is nowhere to use. - return 0; -} - -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART - -static int ble_hci_unregistered_hook(void*, void*) -{ - ESP_LOGD(NIMBLE_PORT_LOG_TAG,"%s ble hci rx_evt is not registered.",__func__); - return 0; -} - static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in) { int rc = esp_intr_alloc(source, flags | ESP_INTR_FLAG_IRAM, handler, arg, (intr_handle_t *)ret_handle_in); @@ -635,6 +478,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) esp_err_t ret = ESP_OK; ble_npl_count_info_t npl_info; ble_rtc_slow_clk_src_t rtc_clk_src; + uint8_t hci_transport_mode; memset(&npl_info, 0, sizeof(ble_npl_count_info_t)); if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_IDLE) { @@ -757,10 +601,19 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; - ble_hci_trans_cfg_hs((ble_hci_trans_rx_cmd_fn *)ble_hci_unregistered_hook,NULL, - (ble_hci_trans_rx_acl_fn *)ble_hci_unregistered_hook,NULL); +#if CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + hci_transport_mode = HCI_TRANSPORT_VHCI; +#elif CONFIG_BT_LE_HCI_INTERFACE_USE_UART + hci_transport_mode = HCI_TRANSPORT_UART_NO_DMA; +#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + ret = hci_transport_init(hci_transport_mode); + if (ret) { + ESP_LOGW(NIMBLE_PORT_LOG_TAG, "hci transport init failed %d", ret); + goto free_controller; + } return ESP_OK; free_controller: + hci_transport_deinit(); controller_sleep_deinit(); #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED controller_init_err: @@ -789,6 +642,7 @@ esp_err_t esp_bt_controller_deinit(void) return ESP_FAIL; } + hci_transport_deinit(); controller_sleep_deinit(); #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED diff --git a/components/bt/controller/esp32c2/esp_bt_cfg.h b/components/bt/controller/esp32c2/esp_bt_cfg.h index 0cb4168e030..ff0db7c8919 100644 --- a/components/bt/controller/esp32c2/esp_bt_cfg.h +++ b/components/bt/controller/esp32c2/esp_bt_cfg.h @@ -28,7 +28,6 @@ extern "C" { #else #define BLE_LL_SCAN_PHY_NUMBER_N (1) #endif - #define DEFAULT_BT_LE_MAX_PERIODIC_ADVERTISER_LIST MYNEWT_VAL(BLE_MAX_PERIODIC_ADVERTISER_LIST) #define DEFAULT_BT_LE_MAX_PERIODIC_SYNCS MYNEWT_VAL(BLE_MAX_PERIODIC_SYNCS) #define DEFAULT_BT_LE_MAX_CONNECTIONS MYNEWT_VAL(BLE_MAX_CONNECTIONS) @@ -152,6 +151,20 @@ extern "C" { #else #define DEFAULT_BT_LE_ROLE_OBSERVER (0) #endif + #if defined (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #if DEFAULT_BT_LE_HCI_UART_FLOW_CTRL + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (CONFIG_BT_LE_HCI_UART_CTS_PIN) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (CONFIG_BT_LE_HCI_UART_RTS_PIN) + #else + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif + #else + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif #endif #define DEFAULT_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF CONFIG_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF @@ -192,8 +205,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (UART_DATA_8_BITS) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (UART_STOP_BITS_1) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (CONFIG_BT_LE_HCI_UART_TASK_STACK_SIZE) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #else #define DEFAULT_BT_LE_HCI_UART_TX_PIN (0) #define DEFAULT_BT_LE_HCI_UART_RX_PIN (0) @@ -202,8 +213,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (0) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (0) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (0) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #endif /* Unchanged configuration */ diff --git a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib index e597ae52976..fc65dbee209 160000 --- a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib +++ b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib @@ -1 +1 @@ -Subproject commit e597ae529761d270f10d0616c375faa0e4b7ca13 +Subproject commit fc65dbee2093051bdf8dd45fd4346811a39a4ff8 diff --git a/components/bt/include/esp32c2/include/esp_bt.h b/components/bt/include/esp32c2/include/esp_bt.h index ee1bede7e4d..c73d4cb9243 100644 --- a/components/bt/include/esp32c2/include/esp_bt.h +++ b/components/bt/include/esp32c2/include/esp_bt.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -262,13 +262,6 @@ typedef struct { .controller_run_cpu = 0, \ .enable_qa_test = RUN_QA_TEST, \ .enable_bqb_test = RUN_BQB_TEST, \ - .enable_uart_hci = HCI_UART_EN, \ - .ble_hci_uart_port = DEFAULT_BT_LE_HCI_UART_PORT, \ - .ble_hci_uart_baud = DEFAULT_BT_LE_HCI_UART_BAUD, \ - .ble_hci_uart_data_bits = DEFAULT_BT_LE_HCI_UART_DATA_BITS, \ - .ble_hci_uart_stop_bits = DEFAULT_BT_LE_HCI_UART_STOP_BITS, \ - .ble_hci_uart_flow_ctrl = DEFAULT_BT_LE_HCI_UART_FLOW_CTRL, \ - .ble_hci_uart_uart_parity = DEFAULT_BT_LE_HCI_UART_PARITY, \ .enable_tx_cca = DEFAULT_BT_LE_TX_CCA_ENABLED, \ .cca_rssi_thresh = 256 - DEFAULT_BT_LE_CCA_RSSI_THRESH, \ .sleep_en = NIMBLE_SLEEP_ENABLE, \ diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ld index e876d872fbd..336246649c2 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ld @@ -753,7 +753,6 @@ r_ble_ll_hci_ev_send_adv_set_terminated = 0x40000ff4; r_ble_ll_hci_ev_send_scan_req_recv = 0x40000ff8; r_ble_ll_hci_ev_send_scan_timeout = 0x40000ffc; r_ble_ll_hci_ev_send_vendor_err = 0x40001000; -r_ble_ll_hci_event_send = 0x40001004; r_ble_ll_hci_ext_scan_set_enable = 0x40001008; r_ble_ll_hci_get_num_cmd_pkts = 0x4000100c; r_ble_ll_hci_info_params_cmd_proc = 0x40001010; From e154fa0af2d9cee814062d804b2d72f783300899 Mon Sep 17 00:00:00 2001 From: zwl Date: Thu, 4 Jul 2024 21:14:14 +0800 Subject: [PATCH 006/113] feat(bluetooth/controller): adopting new HCI layer code and support UHCI function on ESP32-C6 and ESP32-H2 --- components/bt/controller/esp32c6/Kconfig.in | 62 +++++- components/bt/controller/esp32c6/bt.c | 178 ++---------------- components/bt/controller/esp32c6/esp_bt_cfg.h | 21 ++- components/bt/controller/esp32h2/Kconfig.in | 62 +++++- components/bt/controller/esp32h2/bt.c | 178 ++---------------- components/bt/controller/esp32h2/esp_bt_cfg.h | 22 ++- .../bt/controller/lib_esp32c6/esp32c6-bt-lib | 2 +- .../bt/controller/lib_esp32h2/esp32h2-bt-lib | 2 +- .../bt/include/esp32c6/include/esp_bt.h | 18 +- .../bt/include/esp32h2/include/esp_bt.h | 18 +- components/hal/esp32c6/include/hal/uhci_ll.h | 133 +++++++++++++ components/hal/esp32h2/include/hal/uhci_ll.h | 133 +++++++++++++ 12 files changed, 450 insertions(+), 379 deletions(-) create mode 100644 components/hal/esp32c6/include/hal/uhci_ll.h create mode 100644 components/hal/esp32h2/include/hal/uhci_ll.h diff --git a/components/bt/controller/esp32c6/Kconfig.in b/components/bt/controller/esp32c6/Kconfig.in index 0dcc8996bf6..665e34366a1 100644 --- a/components/bt/controller/esp32c6/Kconfig.in +++ b/components/bt/controller/esp32c6/Kconfig.in @@ -2,19 +2,37 @@ menu "HCI Config" choice BT_LE_HCI_INTERFACE - prompt "Select HCI interface" + prompt "HCI mode" default BT_LE_HCI_INTERFACE_USE_RAM config BT_LE_HCI_INTERFACE_USE_RAM - bool "ram" + bool "VHCI" help Use RAM as HCI interface config BT_LE_HCI_INTERFACE_USE_UART - bool "uart" + bool "UART(H4)" help Use UART as HCI interface endchoice + choice BT_LE_UART_HCI_MODE_CHOICE + prompt "UART HCI mode" + depends on BT_LE_HCI_INTERFACE_USE_UART + default BT_LE_UART_HCI_NO_DMA_MODE + help + Specify UART HCI mode: DMA or No DMA + + config BT_LE_UART_HCI_DMA_MODE + bool "UHCI(UART with DMA)(EXPERIMENTAL)" + help + UART HCI Mode with DMA functionality. + + config BT_LE_UART_HCI_NO_DMA_MODE + bool "UART(NO DMA)" + help + UART HCI Mode without DMA functionality. + endchoice + config BT_LE_HCI_UART_PORT int "HCI UART port" depends on BT_LE_HCI_INTERFACE_USE_UART @@ -73,12 +91,40 @@ menu "HCI Config" UART_PARITY_ODD endchoice - config BT_LE_HCI_UART_TASK_STACK_SIZE - int "HCI uart task stack size" - depends on BT_LE_HCI_INTERFACE_USE_UART - default 1000 + config BT_LE_HCI_UART_RX_BUFFER_SIZE + int "The size of rx ring buffer memory" + depends on BT_LE_UART_HCI_NO_DMA_MODE + default 512 + help + The size of rx ring buffer memory + + config BT_LE_HCI_UART_TX_BUFFER_SIZE + int "The size of tx ring buffer memory" + depends on BT_LE_UART_HCI_NO_DMA_MODE + default 256 + help + The size of tx ring buffer memory + + config BT_LE_HCI_TRANS_TASK_STACK_SIZE + int "HCI transport task stack size" + depends on !BT_LE_HCI_INTERFACE_USE_RAM + default 1024 + help + This configures stack size of hci transport task + + config BT_LE_HCI_TRANS_RX_MEM_NUM + int "The amount of rx memory received at the same time" + depends on BT_LE_UART_HCI_DMA_MODE + default 3 + help + The amount of rx memory received at the same time + + config BT_LE_HCI_LLDESCS_POOL_NUM + int "The amount of lldecs memory for driver dma mode" + depends on BT_LE_UART_HCI_DMA_MODE + default 20 help - Set the size of uart task stack + The amount of lldecs memory for driver dma mode endmenu config BT_LE_CONTROLLER_NPL_OS_PORTING_SUPPORT diff --git a/components/bt/controller/esp32c6/bt.c b/components/bt/controller/esp32c6/bt.c index 489327f0281..10d15761568 100644 --- a/components/bt/controller/esp32c6/bt.c +++ b/components/bt/controller/esp32c6/bt.c @@ -30,7 +30,7 @@ #endif // CONFIG_ESP_COEX_ENABLED #include "nimble/nimble_npl_os.h" -#include "ble_hci_trans.h" +#include "esp_hci_transport.h" #include "os/endian.h" #include "esp_bt.h" @@ -41,7 +41,6 @@ #include "esp_phy_init.h" #endif #include "esp_private/periph_ctrl.h" -#include "hci_uart.h" #include "bt_osi_mem.h" #if SOC_PM_RETENTION_HAS_CLOCK_BUG @@ -52,10 +51,6 @@ #include "esp_private/sleep_modem.h" #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE -#ifdef CONFIG_BT_BLUEDROID_ENABLED -#include "hci/hci_hal.h" -#endif // CONFIG_BT_BLUEDROID_ENABLED - #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -71,16 +66,11 @@ #define OSI_COEX_VERSION 0x00010006 #define OSI_COEX_MAGIC_VALUE 0xFADEBEAD -#define EXT_FUNC_VERSION 0x20221122 +#define EXT_FUNC_VERSION 0x20240422 #define EXT_FUNC_MAGIC_VALUE 0xA5A5A5A5 #define BT_ASSERT_PRINT ets_printf -#ifdef CONFIG_BT_BLUEDROID_ENABLED -/* ACL_DATA_MBUF_LEADINGSPCAE: The leadingspace in user info header for ACL data */ -#define ACL_DATA_MBUF_LEADINGSPCAE 4 -#endif // CONFIG_BT_BLUEDROID_ENABLED - /* Types definition ************************************************************************ */ @@ -99,12 +89,6 @@ struct ext_funcs_t { int (*_esp_intr_free)(void **ret_handle); void *(* _malloc)(size_t size); void (*_free)(void *p); - void (*_hal_uart_start_tx)(int); - int (*_hal_uart_init_cbs)(int, hci_uart_tx_char, hci_uart_tx_done, hci_uart_rx_char, void *); - int (*_hal_uart_config)(int, int32_t, uint8_t, uint8_t, uart_parity_t, uart_hw_flowcontrol_t); - int (*_hal_uart_close)(int); - void (*_hal_uart_blocking_tx)(int, uint8_t); - int (*_hal_uart_init)(int, void *); int (* _task_create)(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); void (* _task_delete)(void *task_handle); @@ -181,16 +165,6 @@ static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status); static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); static void task_delete_wrapper(void *task_handle); -#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART -static void hci_uart_start_tx_wrapper(int uart_no); -static int hci_uart_init_cbs_wrapper(int uart_no, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg); -static int hci_uart_config_wrapper(int uart_no, int32_t speed, uint8_t databits, uint8_t stopbits, - uart_parity_t parity, uart_hw_flowcontrol_t flow_ctl); -static int hci_uart_close_wrapper(int uart_no); -static void hci_uart_blocking_tx_wrapper(int port, uint8_t data); -static int hci_uart_init_wrapper(int uart_no, void *cfg); -#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_UART static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in); static int esp_intr_free_wrapper(void **ret_handle); @@ -208,7 +182,6 @@ static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, b */ /* Static variable declare */ static DRAM_ATTR esp_bt_controller_status_t ble_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; - #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED const static uint32_t log_bufs_size[] = {CONFIG_BT_LE_LOG_CTRL_BUF1_SIZE, CONFIG_BT_LE_LOG_HCI_BUF_SIZE, CONFIG_BT_LE_LOG_CTRL_BUF2_SIZE}; #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED @@ -238,14 +211,6 @@ struct ext_funcs_t ext_funcs_ro = { ._esp_intr_free = esp_intr_free_wrapper, ._malloc = bt_osi_mem_malloc_internal, ._free = bt_osi_mem_free, -#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART - ._hal_uart_start_tx = hci_uart_start_tx_wrapper, - ._hal_uart_init_cbs = hci_uart_init_cbs_wrapper, - ._hal_uart_config = hci_uart_config_wrapper, - ._hal_uart_close = hci_uart_close_wrapper, - ._hal_uart_blocking_tx = hci_uart_blocking_tx_wrapper, - ._hal_uart_init = hci_uart_init_wrapper, -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART ._task_create = task_create_wrapper, ._task_delete = task_delete_wrapper, ._osi_assert = osi_assert_wrapper, @@ -290,75 +255,6 @@ static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status) #endif // CONFIG_SW_COEXIST_ENABLE } -#ifdef CONFIG_BT_BLUEDROID_ENABLED -bool esp_vhci_host_check_send_available(void) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return false; - } - return true; -} - -static struct os_mbuf *ble_hs_mbuf_gen_pkt(uint16_t leading_space) -{ - struct os_mbuf *om; - int rc; - - om = os_msys_get_pkthdr(0, 0); - if (om == NULL) { - return NULL; - } - - if (om->om_omp->omp_databuf_len < leading_space) { - rc = os_mbuf_free_chain(om); - assert(rc == 0); - return NULL; - } - - om->om_data += leading_space; - - return om; -} - -struct os_mbuf *ble_hs_mbuf_acl_pkt(void) -{ - return ble_hs_mbuf_gen_pkt(4 + 1); -} - -void esp_vhci_host_send_packet(uint8_t *data, uint16_t len) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return; - } - - if (*(data) == DATA_TYPE_COMMAND) { - struct ble_hci_cmd *cmd = NULL; - cmd = (struct ble_hci_cmd *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD); - assert(cmd); - memcpy((uint8_t *)cmd, data + 1, len - 1); - ble_hci_trans_hs_cmd_tx((uint8_t *)cmd); - } - - if (*(data) == DATA_TYPE_ACL) { - struct os_mbuf *om = os_msys_get_pkthdr(len, ACL_DATA_MBUF_LEADINGSPCAE); - assert(om); - assert(os_mbuf_append(om, &data[1], len - 1) == 0); - ble_hci_trans_hs_acl_tx(om); - } -} - -esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callback) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return ESP_FAIL; - } - - ble_hci_trans_cfg_hs(ble_hs_hci_rx_evt, NULL, ble_hs_rx_data, NULL); - - return ESP_OK; -} -#endif // CONFIG_BT_BLUEDROID_ENABLED - static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id) { @@ -390,56 +286,6 @@ static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer return rc; } -#ifdef CONFIG_BT_LE_HCI_INTERFACE_USE_UART -static void hci_uart_start_tx_wrapper(int uart_no) -{ - hci_uart_start_tx(uart_no); -} - -static int hci_uart_init_cbs_wrapper(int uart_no, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg) -{ - int rc = -1; - rc = hci_uart_init_cbs(uart_no, tx_func, tx_done, rx_func, arg); - return rc; -} - - -static int hci_uart_config_wrapper(int port_num, int32_t baud_rate, uint8_t data_bits, - uint8_t stop_bits, uart_parity_t parity, - uart_hw_flowcontrol_t flow_ctl) -{ - int rc = -1; - rc = hci_uart_config(port_num, baud_rate, data_bits, stop_bits, parity, flow_ctl); - return rc; -} - -static int hci_uart_close_wrapper(int uart_no) -{ - int rc = -1; - rc = hci_uart_close(uart_no); - return rc; -} - -static void hci_uart_blocking_tx_wrapper(int port, uint8_t data) -{ - //This function is nowhere to use. -} - -static int hci_uart_init_wrapper(int uart_no, void *cfg) -{ - //This function is nowhere to use. - return 0; -} - -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART - -static int ble_hci_unregistered_hook(void*, void*) -{ - ESP_LOGD(NIMBLE_PORT_LOG_TAG,"%s ble hci rx_evt is not registered.",__func__); - return 0; -} - static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in) { @@ -718,6 +564,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) esp_err_t ret = ESP_OK; ble_npl_count_info_t npl_info; uint32_t slow_clk_freq = 0; + uint8_t hci_transport_mode; memset(&npl_info, 0, sizeof(ble_npl_count_info_t)); @@ -862,11 +709,23 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; - ble_hci_trans_cfg_hs((ble_hci_trans_rx_cmd_fn *)ble_hci_unregistered_hook,NULL, - (ble_hci_trans_rx_acl_fn *)ble_hci_unregistered_hook,NULL); - return ESP_OK; +#if CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + hci_transport_mode = HCI_TRANSPORT_VHCI; +#elif CONFIG_BT_LE_HCI_INTERFACE_USE_UART + hci_transport_mode = HCI_TRANSPORT_UART_NO_DMA; +#if CONFIG_BT_LE_UART_HCI_DMA_MODE + hci_transport_mode = HCI_TRANSPORT_UART_UHCI; +#endif // CONFIG_BT_LE_UART_HCI_DMA_MODE +#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + ret = hci_transport_init(hci_transport_mode); + if (ret) { + ESP_LOGW(NIMBLE_PORT_LOG_TAG, "hci transport init failed %d", ret); + goto free_controller; + } + return ESP_OK; free_controller: + hci_transport_deinit(); controller_sleep_deinit(); os_msys_deinit(); r_ble_controller_deinit(); @@ -897,6 +756,7 @@ esp_err_t esp_bt_controller_deinit(void) return ESP_FAIL; } + hci_transport_deinit(); controller_sleep_deinit(); os_msys_deinit(); diff --git a/components/bt/controller/esp32c6/esp_bt_cfg.h b/components/bt/controller/esp32c6/esp_bt_cfg.h index 9e341e32290..b8bbfd3d4b7 100644 --- a/components/bt/controller/esp32c6/esp_bt_cfg.h +++ b/components/bt/controller/esp32c6/esp_bt_cfg.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -129,6 +129,21 @@ extern "C" { #else #define DEFAULT_BT_LE_50_FEATURE_SUPPORT (0) #endif + + #if defined (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #if DEFAULT_BT_LE_HCI_UART_FLOW_CTRL + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (CONFIG_BT_LE_HCI_UART_CTS_PIN) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (CONFIG_BT_LE_HCI_UART_RTS_PIN) + #else + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif + #else + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif #endif #define DEFAULT_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF CONFIG_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF @@ -169,8 +184,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (UART_DATA_8_BITS) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (UART_STOP_BITS_1) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (CONFIG_BT_LE_HCI_UART_TASK_STACK_SIZE) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #else #define DEFAULT_BT_LE_HCI_UART_TX_PIN (0) #define DEFAULT_BT_LE_HCI_UART_RX_PIN (0) @@ -179,8 +192,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (0) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (0) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (0) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #endif /* Unchanged configuration */ diff --git a/components/bt/controller/esp32h2/Kconfig.in b/components/bt/controller/esp32h2/Kconfig.in index e0c4936156e..e45aa2030ae 100644 --- a/components/bt/controller/esp32h2/Kconfig.in +++ b/components/bt/controller/esp32h2/Kconfig.in @@ -2,19 +2,37 @@ menu "HCI Config" choice BT_LE_HCI_INTERFACE - prompt "Select HCI interface" + prompt "HCI mode" default BT_LE_HCI_INTERFACE_USE_RAM config BT_LE_HCI_INTERFACE_USE_RAM - bool "ram" + bool "VHCI" help Use RAM as HCI interface config BT_LE_HCI_INTERFACE_USE_UART - bool "uart" + bool "UART(H4)" help Use UART as HCI interface endchoice + choice BT_LE_UART_HCI_MODE_CHOICE + prompt "UART HCI mode" + depends on BT_LE_HCI_INTERFACE_USE_UART + default BT_LE_UART_HCI_NO_DMA_MODE + help + Specify UART HCI mode: DMA or No DMA + + config BT_LE_UART_HCI_DMA_MODE + bool "UHCI(UART with DMA)(EXPERIMENTAL)" + help + UART HCI Mode with DMA functionality. + + config BT_LE_UART_HCI_NO_DMA_MODE + bool "UART(NO DMA)" + help + UART HCI Mode without DMA functionality. + endchoice + config BT_LE_HCI_UART_PORT int "HCI UART port" depends on BT_LE_HCI_INTERFACE_USE_UART @@ -73,12 +91,40 @@ menu "HCI Config" UART_PARITY_ODD endchoice - config BT_LE_HCI_UART_TASK_STACK_SIZE - int "HCI uart task stack size" - depends on BT_LE_HCI_INTERFACE_USE_UART - default 1000 + config BT_LE_HCI_UART_RX_BUFFER_SIZE + int "The size of rx ring buffer memory" + depends on BT_LE_UART_HCI_NO_DMA_MODE + default 512 + help + The size of rx ring buffer memory + + config BT_LE_HCI_UART_TX_BUFFER_SIZE + int "The size of tx ring buffer memory" + depends on BT_LE_UART_HCI_NO_DMA_MODE + default 256 + help + The size of tx ring buffer memory + + config BT_LE_HCI_TRANS_TASK_STACK_SIZE + int "HCI transport task stack size" + depends on !BT_LE_HCI_INTERFACE_USE_RAM + default 1024 + help + This configures stack size of hci transport task + + config BT_LE_HCI_TRANS_RX_MEM_NUM + int "The amount of rx memory received at the same time" + depends on BT_LE_UART_HCI_DMA_MODE + default 3 + help + The amount of rx memory received at the same time + + config BT_LE_HCI_LLDESCS_POOL_NUM + int "The amount of lldecs memory for driver dma mode" + depends on BT_LE_UART_HCI_DMA_MODE + default 20 help - Set the size of uart task stack + The amount of lldecs memory for driver dma mode endmenu config BT_LE_CONTROLLER_NPL_OS_PORTING_SUPPORT diff --git a/components/bt/controller/esp32h2/bt.c b/components/bt/controller/esp32h2/bt.c index adb10d4981f..5e2b1fb66b7 100644 --- a/components/bt/controller/esp32h2/bt.c +++ b/components/bt/controller/esp32h2/bt.c @@ -30,7 +30,7 @@ #endif // CONFIG_ESP_COEX_ENABLED #include "nimble/nimble_npl_os.h" -#include "ble_hci_trans.h" +#include "esp_hci_transport.h" #include "os/endian.h" #include "esp_bt.h" @@ -39,7 +39,6 @@ #include "esp_pm.h" #include "esp_phy_init.h" #include "esp_private/periph_ctrl.h" -#include "hci_uart.h" #include "bt_osi_mem.h" #if CONFIG_FREERTOS_USE_TICKLESS_IDLE @@ -47,10 +46,6 @@ #include "esp_private/sleep_retention.h" #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE -#ifdef CONFIG_BT_BLUEDROID_ENABLED -#include "hci/hci_hal.h" -#endif // CONFIG_BT_BLUEDROID_ENABLED - #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -64,16 +59,11 @@ #define OSI_COEX_VERSION 0x00010006 #define OSI_COEX_MAGIC_VALUE 0xFADEBEAD -#define EXT_FUNC_VERSION 0x20221122 +#define EXT_FUNC_VERSION 0x20240422 #define EXT_FUNC_MAGIC_VALUE 0xA5A5A5A5 #define BT_ASSERT_PRINT ets_printf -#ifdef CONFIG_BT_BLUEDROID_ENABLED -/* ACL_DATA_MBUF_LEADINGSPCAE: The leadingspace in user info header for ACL data */ -#define ACL_DATA_MBUF_LEADINGSPCAE 4 -#endif // CONFIG_BT_BLUEDROID_ENABLED - /* Types definition ************************************************************************ */ @@ -92,12 +82,6 @@ struct ext_funcs_t { int (*_esp_intr_free)(void **ret_handle); void *(* _malloc)(size_t size); void (*_free)(void *p); - void (*_hal_uart_start_tx)(int); - int (*_hal_uart_init_cbs)(int, hci_uart_tx_char, hci_uart_tx_done, hci_uart_rx_char, void *); - int (*_hal_uart_config)(int, int32_t, uint8_t, uint8_t, uart_parity_t, uart_hw_flowcontrol_t); - int (*_hal_uart_close)(int); - void (*_hal_uart_blocking_tx)(int, uint8_t); - int (*_hal_uart_init)(int, void *); int (* _task_create)(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); void (* _task_delete)(void *task_handle); @@ -173,16 +157,6 @@ static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status); static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); static void task_delete_wrapper(void *task_handle); -#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART -static void hci_uart_start_tx_wrapper(int uart_no); -static int hci_uart_init_cbs_wrapper(int uart_no, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg); -static int hci_uart_config_wrapper(int uart_no, int32_t speed, uint8_t databits, uint8_t stopbits, - uart_parity_t parity, uart_hw_flowcontrol_t flow_ctl); -static int hci_uart_close_wrapper(int uart_no); -static void hci_uart_blocking_tx_wrapper(int port, uint8_t data); -static int hci_uart_init_wrapper(int uart_no, void *cfg); -#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_UART static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in); static int esp_intr_free_wrapper(void **ret_handle); @@ -200,7 +174,6 @@ static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, b */ /* Static variable declare */ static DRAM_ATTR esp_bt_controller_status_t ble_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; - #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED const static uint32_t log_bufs_size[] = {CONFIG_BT_LE_LOG_CTRL_BUF1_SIZE, CONFIG_BT_LE_LOG_HCI_BUF_SIZE, CONFIG_BT_LE_LOG_CTRL_BUF2_SIZE}; #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED @@ -230,14 +203,6 @@ struct ext_funcs_t ext_funcs_ro = { ._esp_intr_free = esp_intr_free_wrapper, ._malloc = bt_osi_mem_malloc_internal, ._free = bt_osi_mem_free, -#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART - ._hal_uart_start_tx = hci_uart_start_tx_wrapper, - ._hal_uart_init_cbs = hci_uart_init_cbs_wrapper, - ._hal_uart_config = hci_uart_config_wrapper, - ._hal_uart_close = hci_uart_close_wrapper, - ._hal_uart_blocking_tx = hci_uart_blocking_tx_wrapper, - ._hal_uart_init = hci_uart_init_wrapper, -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART ._task_create = task_create_wrapper, ._task_delete = task_delete_wrapper, ._osi_assert = osi_assert_wrapper, @@ -282,75 +247,6 @@ static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status) #endif // CONFIG_SW_COEXIST_ENABLE } -#ifdef CONFIG_BT_BLUEDROID_ENABLED -bool esp_vhci_host_check_send_available(void) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return false; - } - return true; -} - -static struct os_mbuf *ble_hs_mbuf_gen_pkt(uint16_t leading_space) -{ - struct os_mbuf *om; - int rc; - - om = os_msys_get_pkthdr(0, 0); - if (om == NULL) { - return NULL; - } - - if (om->om_omp->omp_databuf_len < leading_space) { - rc = os_mbuf_free_chain(om); - assert(rc == 0); - return NULL; - } - - om->om_data += leading_space; - - return om; -} - -struct os_mbuf *ble_hs_mbuf_acl_pkt(void) -{ - return ble_hs_mbuf_gen_pkt(4 + 1); -} - -void esp_vhci_host_send_packet(uint8_t *data, uint16_t len) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return; - } - - if (*(data) == DATA_TYPE_COMMAND) { - struct ble_hci_cmd *cmd = NULL; - cmd = (struct ble_hci_cmd *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD); - assert(cmd); - memcpy((uint8_t *)cmd, data + 1, len - 1); - ble_hci_trans_hs_cmd_tx((uint8_t *)cmd); - } - - if (*(data) == DATA_TYPE_ACL) { - struct os_mbuf *om = os_msys_get_pkthdr(len, ACL_DATA_MBUF_LEADINGSPCAE); - assert(om); - assert(os_mbuf_append(om, &data[1], len - 1) == 0); - ble_hci_trans_hs_acl_tx(om); - } -} - -esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callback) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return ESP_FAIL; - } - - ble_hci_trans_cfg_hs(ble_hs_hci_rx_evt, NULL, ble_hs_rx_data, NULL); - - return ESP_OK; -} -#endif // CONFIG_BT_BLUEDROID_ENABLED - static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id) { @@ -382,56 +278,6 @@ static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer return rc; } -#ifdef CONFIG_BT_LE_HCI_INTERFACE_USE_UART -static void hci_uart_start_tx_wrapper(int uart_no) -{ - hci_uart_start_tx(uart_no); -} - -static int hci_uart_init_cbs_wrapper(int uart_no, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg) -{ - int rc = -1; - rc = hci_uart_init_cbs(uart_no, tx_func, tx_done, rx_func, arg); - return rc; -} - - -static int hci_uart_config_wrapper(int port_num, int32_t baud_rate, uint8_t data_bits, - uint8_t stop_bits, uart_parity_t parity, - uart_hw_flowcontrol_t flow_ctl) -{ - int rc = -1; - rc = hci_uart_config(port_num, baud_rate, data_bits, stop_bits, parity, flow_ctl); - return rc; -} - -static int hci_uart_close_wrapper(int uart_no) -{ - int rc = -1; - rc = hci_uart_close(uart_no); - return rc; -} - -static void hci_uart_blocking_tx_wrapper(int port, uint8_t data) -{ - //This function is nowhere to use. -} - -static int hci_uart_init_wrapper(int uart_no, void *cfg) -{ - //This function is nowhere to use. - return 0; -} - -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART - -static int ble_hci_unregistered_hook(void*, void*) -{ - ESP_LOGD(NIMBLE_PORT_LOG_TAG,"%s ble hci rx_evt is not registered.",__func__); - return 0; -} - static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in) { @@ -689,6 +535,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) esp_err_t ret = ESP_OK; ble_npl_count_info_t npl_info; uint32_t slow_clk_freq = 0; + uint8_t hci_transport_mode; memset(&npl_info, 0, sizeof(ble_npl_count_info_t)); if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_IDLE) { @@ -831,11 +678,23 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; - ble_hci_trans_cfg_hs((ble_hci_trans_rx_cmd_fn *)ble_hci_unregistered_hook,NULL, - (ble_hci_trans_rx_acl_fn *)ble_hci_unregistered_hook,NULL); - return ESP_OK; +#if CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + hci_transport_mode = HCI_TRANSPORT_VHCI; +#elif CONFIG_BT_LE_HCI_INTERFACE_USE_UART + hci_transport_mode = HCI_TRANSPORT_UART_NO_DMA; +#if CONFIG_BT_LE_UART_HCI_DMA_MODE + hci_transport_mode = HCI_TRANSPORT_UART_UHCI; +#endif // CONFIG_BT_LE_UART_HCI_DMA_MODE +#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + ret = hci_transport_init(hci_transport_mode); + if (ret) { + ESP_LOGW(NIMBLE_PORT_LOG_TAG, "hci transport init failed %d", ret); + goto free_controller; + } + return ESP_OK; free_controller: + hci_transport_deinit(); controller_sleep_deinit(); os_msys_deinit(); r_ble_controller_deinit(); @@ -865,6 +724,7 @@ esp_err_t esp_bt_controller_deinit(void) return ESP_FAIL; } + hci_transport_deinit(); controller_sleep_deinit(); os_msys_deinit(); diff --git a/components/bt/controller/esp32h2/esp_bt_cfg.h b/components/bt/controller/esp32h2/esp_bt_cfg.h index c0c5801af14..b8bbfd3d4b7 100644 --- a/components/bt/controller/esp32h2/esp_bt_cfg.h +++ b/components/bt/controller/esp32h2/esp_bt_cfg.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -124,12 +124,26 @@ extern "C" { #else #define DEFAULT_BT_LE_POWER_CONTROL_ENABLED (0) #endif - #if defined(CONFIG_BT_LE_50_FEATURE_SUPPORT) #define DEFAULT_BT_LE_50_FEATURE_SUPPORT (1) #else #define DEFAULT_BT_LE_50_FEATURE_SUPPORT (0) #endif + + #if defined (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #if DEFAULT_BT_LE_HCI_UART_FLOW_CTRL + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (CONFIG_BT_LE_HCI_UART_CTS_PIN) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (CONFIG_BT_LE_HCI_UART_RTS_PIN) + #else + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif + #else + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif #endif #define DEFAULT_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF CONFIG_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF @@ -170,8 +184,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (UART_DATA_8_BITS) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (UART_STOP_BITS_1) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (CONFIG_BT_LE_HCI_UART_TASK_STACK_SIZE) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #else #define DEFAULT_BT_LE_HCI_UART_TX_PIN (0) #define DEFAULT_BT_LE_HCI_UART_RX_PIN (0) @@ -180,8 +192,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (0) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (0) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (0) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #endif /* Unchanged configuration */ diff --git a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib index 4a63b2963a8..2085541b6e9 160000 --- a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib +++ b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib @@ -1 +1 @@ -Subproject commit 4a63b2963a8a75958db680df4ace64bbd3d6c618 +Subproject commit 2085541b6e9963640e4090401faaf2061758d847 diff --git a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib index 96b48749e24..9e29a8b39fe 160000 --- a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib +++ b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib @@ -1 +1 @@ -Subproject commit 96b48749e249d0752f196007b008212cb8b28e07 +Subproject commit 9e29a8b39fe81ac82064dc4525e56e0faa9e1b8a diff --git a/components/bt/include/esp32c6/include/esp_bt.h b/components/bt/include/esp32c6/include/esp_bt.h index 210ead42da9..ea272287228 100644 --- a/components/bt/include/esp32c6/include/esp_bt.h +++ b/components/bt/include/esp32c6/include/esp_bt.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -155,7 +155,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20231124 +#define CONFIG_VERSION 0x20240422 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -196,13 +196,6 @@ typedef struct { uint8_t controller_run_cpu; /*!< CPU core on which the controller runs */ uint8_t enable_qa_test; /*!< Enable quality assurance (QA) testing */ uint8_t enable_bqb_test; /*!< Enable Bluetooth Qualification Test (BQB) testing */ - uint8_t enable_uart_hci; /*!< Enable UART HCI (Host Controller Interface) */ - uint8_t ble_hci_uart_port; /*!< UART port number for Bluetooth HCI */ - uint32_t ble_hci_uart_baud; /*!< Baud rate for Bluetooth HCI UART */ - uint8_t ble_hci_uart_data_bits; /*!< Number of data bits for Bluetooth HCI UART */ - uint8_t ble_hci_uart_stop_bits; /*!< Number of stop bits for Bluetooth HCI UART */ - uint8_t ble_hci_uart_flow_ctrl; /*!< Flow control settings for Bluetooth HCI UART */ - uint8_t ble_hci_uart_uart_parity; /*!< Parity settings for Bluetooth HCI UART */ uint8_t enable_tx_cca; /*!< Enable Transmit Clear Channel Assessment (TX CCA) */ uint8_t cca_rssi_thresh; /*!< RSSI threshold for Transmit Clear Channel Assessment (CCA) */ uint8_t sleep_en; /*!< Enable sleep mode */ @@ -253,13 +246,6 @@ typedef struct { .controller_run_cpu = 0, \ .enable_qa_test = RUN_QA_TEST, \ .enable_bqb_test = RUN_BQB_TEST, \ - .enable_uart_hci = HCI_UART_EN, \ - .ble_hci_uart_port = DEFAULT_BT_LE_HCI_UART_PORT, \ - .ble_hci_uart_baud = DEFAULT_BT_LE_HCI_UART_BAUD, \ - .ble_hci_uart_data_bits = DEFAULT_BT_LE_HCI_UART_DATA_BITS, \ - .ble_hci_uart_stop_bits = DEFAULT_BT_LE_HCI_UART_STOP_BITS, \ - .ble_hci_uart_flow_ctrl = DEFAULT_BT_LE_HCI_UART_FLOW_CTRL, \ - .ble_hci_uart_uart_parity = DEFAULT_BT_LE_HCI_UART_PARITY, \ .enable_tx_cca = DEFAULT_BT_LE_TX_CCA_ENABLED, \ .cca_rssi_thresh = 256 - DEFAULT_BT_LE_CCA_RSSI_THRESH, \ .sleep_en = NIMBLE_SLEEP_ENABLE, \ diff --git a/components/bt/include/esp32h2/include/esp_bt.h b/components/bt/include/esp32h2/include/esp_bt.h index a1c7aed8ee2..bbecb64072f 100644 --- a/components/bt/include/esp32h2/include/esp_bt.h +++ b/components/bt/include/esp32h2/include/esp_bt.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -160,7 +160,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20231124 +#define CONFIG_VERSION 0x20240422 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -201,13 +201,6 @@ typedef struct { uint8_t controller_run_cpu; /*!< CPU number on which the Bluetooth controller task runs */ uint8_t enable_qa_test; /*!< Enable for QA test */ uint8_t enable_bqb_test; /*!< Enable for BQB test */ - uint8_t enable_uart_hci; /*!< Enable UART for HCI (Host Controller Interface) */ - uint8_t ble_hci_uart_port; /*!< Port of UART for HCI */ - uint32_t ble_hci_uart_baud; /*!< Baudrate of UART for HCI */ - uint8_t ble_hci_uart_data_bits; /*!< Data bits of UART for HCI */ - uint8_t ble_hci_uart_stop_bits; /*!< Stop bits of UART for HCI */ - uint8_t ble_hci_uart_flow_ctrl; /*!< Flow control of UART for HCI */ - uint8_t ble_hci_uart_uart_parity; /*!< UART parity */ uint8_t enable_tx_cca; /*!< Enable Clear Channel Assessment (CCA) when transmitting */ uint8_t cca_rssi_thresh; /*!< RSSI threshold for CCA */ uint8_t sleep_en; /*!< Enable sleep functionality */ @@ -258,13 +251,6 @@ typedef struct { .controller_run_cpu = 0, \ .enable_qa_test = RUN_QA_TEST, \ .enable_bqb_test = RUN_BQB_TEST, \ - .enable_uart_hci = HCI_UART_EN, \ - .ble_hci_uart_port = DEFAULT_BT_LE_HCI_UART_PORT, \ - .ble_hci_uart_baud = DEFAULT_BT_LE_HCI_UART_BAUD, \ - .ble_hci_uart_data_bits = DEFAULT_BT_LE_HCI_UART_DATA_BITS, \ - .ble_hci_uart_stop_bits = DEFAULT_BT_LE_HCI_UART_STOP_BITS, \ - .ble_hci_uart_flow_ctrl = DEFAULT_BT_LE_HCI_UART_FLOW_CTRL, \ - .ble_hci_uart_uart_parity = DEFAULT_BT_LE_HCI_UART_PARITY, \ .enable_tx_cca = DEFAULT_BT_LE_TX_CCA_ENABLED, \ .cca_rssi_thresh = 256 - DEFAULT_BT_LE_CCA_RSSI_THRESH, \ .sleep_en = NIMBLE_SLEEP_ENABLE, \ diff --git a/components/hal/esp32c6/include/hal/uhci_ll.h b/components/hal/esp32c6/include/hal/uhci_ll.h new file mode 100644 index 00000000000..07d4a40a683 --- /dev/null +++ b/components/hal/esp32c6/include/hal/uhci_ll.h @@ -0,0 +1,133 @@ +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once +#include +#include "hal/uhci_types.h" +#include "soc/uhci_struct.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define UHCI_LL_GET_HW(num) (((num) == 0) ? (&UHCI0) : (NULL)) + +typedef enum { + UHCI_RX_BREAK_CHR_EOF = 0x1, + UHCI_RX_IDLE_EOF = 0x2, + UHCI_RX_LEN_EOF = 0x4, + UHCI_RX_EOF_MAX = 0x7, +} uhci_rxeof_cfg_t; + +static inline void uhci_ll_init(uhci_dev_t *hw) +{ + typeof(hw->conf0) conf0_reg; + hw->conf0.clk_en = 1; + conf0_reg.val = 0; + conf0_reg.clk_en = 1; + hw->conf0.val = conf0_reg.val; + hw->conf1.val = 0; +} + +static inline void uhci_ll_attach_uart_port(uhci_dev_t *hw, int uart_num) +{ + hw->conf0.uart0_ce = (uart_num == 0)? 1: 0; + hw->conf0.uart1_ce = (uart_num == 1)? 1: 0; +} + +static inline void uhci_ll_set_seper_chr(uhci_dev_t *hw, uhci_seper_chr_t *seper_char) +{ + if (seper_char->sub_chr_en) { + typeof(hw->esc_conf0) esc_conf0_reg; + esc_conf0_reg.val = hw->esc_conf0.val; + + esc_conf0_reg.seper_char = seper_char->seper_chr; + esc_conf0_reg.seper_esc_char0 = seper_char->sub_chr1; + esc_conf0_reg.seper_esc_char1 = seper_char->sub_chr2; + hw->esc_conf0.val = esc_conf0_reg.val; + hw->escape_conf.tx_c0_esc_en = 1; + hw->escape_conf.rx_c0_esc_en = 1; + } else { + hw->escape_conf.tx_c0_esc_en = 0; + hw->escape_conf.rx_c0_esc_en = 0; + } +} + +static inline void uhci_ll_get_seper_chr(uhci_dev_t *hw, uhci_seper_chr_t *seper_chr) +{ + (void)hw; + (void)seper_chr; +} + +static inline void uhci_ll_set_swflow_ctrl_sub_chr(uhci_dev_t *hw, uhci_swflow_ctrl_sub_chr_t *sub_ctr) +{ + typeof(hw->escape_conf) escape_conf_reg; + escape_conf_reg.val = hw->escape_conf.val; + + if (sub_ctr->flow_en == 1) { + typeof(hw->esc_conf2) esc_conf2_reg; + esc_conf2_reg.val = hw->esc_conf2.val; + typeof(hw->esc_conf3) esc_conf3_reg; + esc_conf3_reg.val = hw->esc_conf3.val; + + esc_conf2_reg.esc_seq1 = sub_ctr->xon_chr; + esc_conf2_reg.esc_seq1_char0 = sub_ctr->xon_sub1; + esc_conf2_reg.esc_seq1_char1 = sub_ctr->xon_sub2; + esc_conf3_reg.esc_seq2 = sub_ctr->xoff_chr; + esc_conf3_reg.esc_seq2_char0 = sub_ctr->xoff_sub1; + esc_conf3_reg.esc_seq2_char1 = sub_ctr->xoff_sub2; + escape_conf_reg.tx_11_esc_en = 1; + escape_conf_reg.tx_13_esc_en = 1; + escape_conf_reg.rx_11_esc_en = 1; + escape_conf_reg.rx_13_esc_en = 1; + hw->esc_conf2.val = esc_conf2_reg.val; + hw->esc_conf3.val = esc_conf3_reg.val; + } else { + escape_conf_reg.tx_11_esc_en = 0; + escape_conf_reg.tx_13_esc_en = 0; + escape_conf_reg.rx_11_esc_en = 0; + escape_conf_reg.rx_13_esc_en = 0; + } + hw->escape_conf.val = escape_conf_reg.val; +} + +static inline void uhci_ll_enable_intr(uhci_dev_t *hw, uint32_t intr_mask) +{ + hw->int_ena.val |= intr_mask; +} + +static inline void uhci_ll_disable_intr(uhci_dev_t *hw, uint32_t intr_mask) +{ + hw->int_ena.val &= (~intr_mask); +} + +static inline void uhci_ll_clear_intr(uhci_dev_t *hw, uint32_t intr_mask) +{ + hw->int_clr.val = intr_mask; +} + +static inline uint32_t uhci_ll_get_intr(uhci_dev_t *hw) +{ + return hw->int_st.val; +} + + +static inline void uhci_ll_set_eof_mode(uhci_dev_t *hw, uint32_t eof_mode) +{ + if (eof_mode & UHCI_RX_BREAK_CHR_EOF) { + hw->conf0.uart_rx_brk_eof_en = 1; + } + if (eof_mode & UHCI_RX_IDLE_EOF) { + hw->conf0.uart_idle_eof_en = 1; + } + if (eof_mode & UHCI_RX_LEN_EOF) { + hw->conf0.len_eof_en = 1; + } +} + +#ifdef __cplusplus +} +#endif diff --git a/components/hal/esp32h2/include/hal/uhci_ll.h b/components/hal/esp32h2/include/hal/uhci_ll.h new file mode 100644 index 00000000000..07d4a40a683 --- /dev/null +++ b/components/hal/esp32h2/include/hal/uhci_ll.h @@ -0,0 +1,133 @@ +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once +#include +#include "hal/uhci_types.h" +#include "soc/uhci_struct.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define UHCI_LL_GET_HW(num) (((num) == 0) ? (&UHCI0) : (NULL)) + +typedef enum { + UHCI_RX_BREAK_CHR_EOF = 0x1, + UHCI_RX_IDLE_EOF = 0x2, + UHCI_RX_LEN_EOF = 0x4, + UHCI_RX_EOF_MAX = 0x7, +} uhci_rxeof_cfg_t; + +static inline void uhci_ll_init(uhci_dev_t *hw) +{ + typeof(hw->conf0) conf0_reg; + hw->conf0.clk_en = 1; + conf0_reg.val = 0; + conf0_reg.clk_en = 1; + hw->conf0.val = conf0_reg.val; + hw->conf1.val = 0; +} + +static inline void uhci_ll_attach_uart_port(uhci_dev_t *hw, int uart_num) +{ + hw->conf0.uart0_ce = (uart_num == 0)? 1: 0; + hw->conf0.uart1_ce = (uart_num == 1)? 1: 0; +} + +static inline void uhci_ll_set_seper_chr(uhci_dev_t *hw, uhci_seper_chr_t *seper_char) +{ + if (seper_char->sub_chr_en) { + typeof(hw->esc_conf0) esc_conf0_reg; + esc_conf0_reg.val = hw->esc_conf0.val; + + esc_conf0_reg.seper_char = seper_char->seper_chr; + esc_conf0_reg.seper_esc_char0 = seper_char->sub_chr1; + esc_conf0_reg.seper_esc_char1 = seper_char->sub_chr2; + hw->esc_conf0.val = esc_conf0_reg.val; + hw->escape_conf.tx_c0_esc_en = 1; + hw->escape_conf.rx_c0_esc_en = 1; + } else { + hw->escape_conf.tx_c0_esc_en = 0; + hw->escape_conf.rx_c0_esc_en = 0; + } +} + +static inline void uhci_ll_get_seper_chr(uhci_dev_t *hw, uhci_seper_chr_t *seper_chr) +{ + (void)hw; + (void)seper_chr; +} + +static inline void uhci_ll_set_swflow_ctrl_sub_chr(uhci_dev_t *hw, uhci_swflow_ctrl_sub_chr_t *sub_ctr) +{ + typeof(hw->escape_conf) escape_conf_reg; + escape_conf_reg.val = hw->escape_conf.val; + + if (sub_ctr->flow_en == 1) { + typeof(hw->esc_conf2) esc_conf2_reg; + esc_conf2_reg.val = hw->esc_conf2.val; + typeof(hw->esc_conf3) esc_conf3_reg; + esc_conf3_reg.val = hw->esc_conf3.val; + + esc_conf2_reg.esc_seq1 = sub_ctr->xon_chr; + esc_conf2_reg.esc_seq1_char0 = sub_ctr->xon_sub1; + esc_conf2_reg.esc_seq1_char1 = sub_ctr->xon_sub2; + esc_conf3_reg.esc_seq2 = sub_ctr->xoff_chr; + esc_conf3_reg.esc_seq2_char0 = sub_ctr->xoff_sub1; + esc_conf3_reg.esc_seq2_char1 = sub_ctr->xoff_sub2; + escape_conf_reg.tx_11_esc_en = 1; + escape_conf_reg.tx_13_esc_en = 1; + escape_conf_reg.rx_11_esc_en = 1; + escape_conf_reg.rx_13_esc_en = 1; + hw->esc_conf2.val = esc_conf2_reg.val; + hw->esc_conf3.val = esc_conf3_reg.val; + } else { + escape_conf_reg.tx_11_esc_en = 0; + escape_conf_reg.tx_13_esc_en = 0; + escape_conf_reg.rx_11_esc_en = 0; + escape_conf_reg.rx_13_esc_en = 0; + } + hw->escape_conf.val = escape_conf_reg.val; +} + +static inline void uhci_ll_enable_intr(uhci_dev_t *hw, uint32_t intr_mask) +{ + hw->int_ena.val |= intr_mask; +} + +static inline void uhci_ll_disable_intr(uhci_dev_t *hw, uint32_t intr_mask) +{ + hw->int_ena.val &= (~intr_mask); +} + +static inline void uhci_ll_clear_intr(uhci_dev_t *hw, uint32_t intr_mask) +{ + hw->int_clr.val = intr_mask; +} + +static inline uint32_t uhci_ll_get_intr(uhci_dev_t *hw) +{ + return hw->int_st.val; +} + + +static inline void uhci_ll_set_eof_mode(uhci_dev_t *hw, uint32_t eof_mode) +{ + if (eof_mode & UHCI_RX_BREAK_CHR_EOF) { + hw->conf0.uart_rx_brk_eof_en = 1; + } + if (eof_mode & UHCI_RX_IDLE_EOF) { + hw->conf0.uart_idle_eof_en = 1; + } + if (eof_mode & UHCI_RX_LEN_EOF) { + hw->conf0.len_eof_en = 1; + } +} + +#ifdef __cplusplus +} +#endif From 113c8923da6bde580c31780ab9dfd46b22ca5d8e Mon Sep 17 00:00:00 2001 From: zwl Date: Thu, 4 Jul 2024 21:15:18 +0800 Subject: [PATCH 007/113] feat(bluetooth/controller): adopting new HCI layer code on ESP32-C5 --- components/bt/controller/esp32c5/Kconfig.in | 30 ++- components/bt/controller/esp32c5/bt.c | 175 ++---------------- components/bt/controller/esp32c5/esp_bt_cfg.h | 19 +- .../bt/controller/lib_esp32c5/esp32c5-bt-lib | 2 +- .../bt/include/esp32c5/include/esp_bt.h | 16 +- 5 files changed, 55 insertions(+), 187 deletions(-) diff --git a/components/bt/controller/esp32c5/Kconfig.in b/components/bt/controller/esp32c5/Kconfig.in index 02ac4995d27..6ad2a9ce8c0 100644 --- a/components/bt/controller/esp32c5/Kconfig.in +++ b/components/bt/controller/esp32c5/Kconfig.in @@ -2,15 +2,15 @@ menu "HCI Config" choice BT_LE_HCI_INTERFACE - prompt "Select HCI interface" + prompt "HCI mode" default BT_LE_HCI_INTERFACE_USE_RAM config BT_LE_HCI_INTERFACE_USE_RAM - bool "ram" + bool "VHCI" help Use RAM as HCI interface config BT_LE_HCI_INTERFACE_USE_UART - bool "uart" + bool "UART(H4)" help Use UART as HCI interface endchoice @@ -73,12 +73,26 @@ menu "HCI Config" UART_PARITY_ODD endchoice - config BT_LE_HCI_UART_TASK_STACK_SIZE - int "HCI uart task stack size" - depends on BT_LE_HCI_INTERFACE_USE_UART - default 1000 + config BT_LE_HCI_UART_RX_BUFFER_SIZE + int "The size of rx ring buffer memory" + depends on !BT_LE_HCI_INTERFACE_USE_RAM + default 512 + help + The size of rx ring buffer memory + + config BT_LE_HCI_UART_TX_BUFFER_SIZE + int "The size of tx ring buffer memory" + depends on !BT_LE_HCI_INTERFACE_USE_RAM + default 256 + help + The size of tx ring buffer memory + + config BT_LE_HCI_TRANS_TASK_STACK_SIZE + int "HCI transport task stack size" + depends on !BT_LE_HCI_INTERFACE_USE_RAM + default 1024 help - Set the size of uart task stack + This configures stack size of hci transport task endmenu config BT_LE_CONTROLLER_NPL_OS_PORTING_SUPPORT diff --git a/components/bt/controller/esp32c5/bt.c b/components/bt/controller/esp32c5/bt.c index 17794564355..3d558b357d1 100644 --- a/components/bt/controller/esp32c5/bt.c +++ b/components/bt/controller/esp32c5/bt.c @@ -30,7 +30,7 @@ #endif // CONFIG_SW_COEXIST_ENABLE #include "nimble/nimble_npl_os.h" -#include "ble_hci_trans.h" +#include "esp_hci_transport.h" #include "os/endian.h" #include "esp_bt.h" @@ -39,7 +39,6 @@ #include "esp_pm.h" #include "esp_phy_init.h" #include "esp_private/periph_ctrl.h" -#include "hci_uart.h" #include "bt_osi_mem.h" #if SOC_PM_RETENTION_HAS_CLOCK_BUG @@ -50,10 +49,6 @@ #include "esp_private/sleep_modem.h" #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE -#ifdef CONFIG_BT_BLUEDROID_ENABLED -#include "hci/hci_hal.h" -#endif // CONFIG_BT_BLUEDROID_ENABLED - #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -69,16 +64,11 @@ #define OSI_COEX_VERSION 0x00010006 #define OSI_COEX_MAGIC_VALUE 0xFADEBEAD -#define EXT_FUNC_VERSION 0x20221122 +#define EXT_FUNC_VERSION 0x20240422 #define EXT_FUNC_MAGIC_VALUE 0xA5A5A5A5 #define BT_ASSERT_PRINT ets_printf -#ifdef CONFIG_BT_BLUEDROID_ENABLED -/* ACL_DATA_MBUF_LEADINGSPCAE: The leadingspace in user info header for ACL data */ -#define ACL_DATA_MBUF_LEADINGSPCAE 4 -#endif // CONFIG_BT_BLUEDROID_ENABLED - /* Types definition ************************************************************************ */ @@ -97,12 +87,6 @@ struct ext_funcs_t { int (*_esp_intr_free)(void **ret_handle); void *(* _malloc)(size_t size); void (*_free)(void *p); - void (*_hal_uart_start_tx)(int); - int (*_hal_uart_init_cbs)(int, hci_uart_tx_char, hci_uart_tx_done, hci_uart_rx_char, void *); - int (*_hal_uart_config)(int, int32_t, uint8_t, uint8_t, uart_parity_t, uart_hw_flowcontrol_t); - int (*_hal_uart_close)(int); - void (*_hal_uart_blocking_tx)(int, uint8_t); - int (*_hal_uart_init)(int, void *); int (* _task_create)(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); void (* _task_delete)(void *task_handle); @@ -179,16 +163,6 @@ static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status); static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); static void task_delete_wrapper(void *task_handle); -#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART -static void hci_uart_start_tx_wrapper(int uart_no); -static int hci_uart_init_cbs_wrapper(int uart_no, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg); -static int hci_uart_config_wrapper(int uart_no, int32_t speed, uint8_t databits, uint8_t stopbits, - uart_parity_t parity, uart_hw_flowcontrol_t flow_ctl); -static int hci_uart_close_wrapper(int uart_no); -static void hci_uart_blocking_tx_wrapper(int port, uint8_t data); -static int hci_uart_init_wrapper(int uart_no, void *cfg); -#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_UART static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in); static int esp_intr_free_wrapper(void **ret_handle); @@ -206,7 +180,6 @@ static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, b */ /* Static variable declare */ static DRAM_ATTR esp_bt_controller_status_t ble_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; - #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED const static uint32_t log_bufs_size[] = {CONFIG_BT_LE_LOG_CTRL_BUF1_SIZE, CONFIG_BT_LE_LOG_HCI_BUF_SIZE, CONFIG_BT_LE_LOG_CTRL_BUF2_SIZE}; #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED @@ -236,14 +209,6 @@ struct ext_funcs_t ext_funcs_ro = { ._esp_intr_free = esp_intr_free_wrapper, ._malloc = bt_osi_mem_malloc_internal, ._free = bt_osi_mem_free, -#if CONFIG_BT_LE_HCI_INTERFACE_USE_UART - ._hal_uart_start_tx = hci_uart_start_tx_wrapper, - ._hal_uart_init_cbs = hci_uart_init_cbs_wrapper, - ._hal_uart_config = hci_uart_config_wrapper, - ._hal_uart_close = hci_uart_close_wrapper, - ._hal_uart_blocking_tx = hci_uart_blocking_tx_wrapper, - ._hal_uart_init = hci_uart_init_wrapper, -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART ._task_create = task_create_wrapper, ._task_delete = task_delete_wrapper, ._osi_assert = osi_assert_wrapper, @@ -288,75 +253,6 @@ static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status) #endif // CONFIG_SW_COEXIST_ENABLE } -#ifdef CONFIG_BT_BLUEDROID_ENABLED -bool esp_vhci_host_check_send_available(void) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return false; - } - return true; -} - -static struct os_mbuf *ble_hs_mbuf_gen_pkt(uint16_t leading_space) -{ - struct os_mbuf *om; - int rc; - - om = os_msys_get_pkthdr(0, 0); - if (om == NULL) { - return NULL; - } - - if (om->om_omp->omp_databuf_len < leading_space) { - rc = os_mbuf_free_chain(om); - assert(rc == 0); - return NULL; - } - - om->om_data += leading_space; - - return om; -} - -struct os_mbuf *ble_hs_mbuf_acl_pkt(void) -{ - return ble_hs_mbuf_gen_pkt(4 + 1); -} - -void esp_vhci_host_send_packet(uint8_t *data, uint16_t len) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return; - } - - if (*(data) == DATA_TYPE_COMMAND) { - struct ble_hci_cmd *cmd = NULL; - cmd = (struct ble_hci_cmd *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD); - assert(cmd); - memcpy((uint8_t *)cmd, data + 1, len - 1); - ble_hci_trans_hs_cmd_tx((uint8_t *)cmd); - } - - if (*(data) == DATA_TYPE_ACL) { - struct os_mbuf *om = os_msys_get_pkthdr(len, ACL_DATA_MBUF_LEADINGSPCAE); - assert(om); - assert(os_mbuf_append(om, &data[1], len - 1) == 0); - ble_hci_trans_hs_acl_tx(om); - } -} - -esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callback) -{ - if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { - return ESP_FAIL; - } - - ble_hci_trans_cfg_hs(ble_hs_hci_rx_evt, NULL, ble_hs_rx_data, NULL); - - return ESP_OK; -} -#endif // CONFIG_BT_BLUEDROID_ENABLED - static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id) { @@ -388,56 +284,6 @@ static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer return rc; } -#ifdef CONFIG_BT_LE_HCI_INTERFACE_USE_UART -static void hci_uart_start_tx_wrapper(int uart_no) -{ - hci_uart_start_tx(uart_no); -} - -static int hci_uart_init_cbs_wrapper(int uart_no, hci_uart_tx_char tx_func, - hci_uart_tx_done tx_done, hci_uart_rx_char rx_func, void *arg) -{ - int rc = -1; - rc = hci_uart_init_cbs(uart_no, tx_func, tx_done, rx_func, arg); - return rc; -} - - -static int hci_uart_config_wrapper(int port_num, int32_t baud_rate, uint8_t data_bits, - uint8_t stop_bits, uart_parity_t parity, - uart_hw_flowcontrol_t flow_ctl) -{ - int rc = -1; - rc = hci_uart_config(port_num, baud_rate, data_bits, stop_bits, parity, flow_ctl); - return rc; -} - -static int hci_uart_close_wrapper(int uart_no) -{ - int rc = -1; - rc = hci_uart_close(uart_no); - return rc; -} - -static void hci_uart_blocking_tx_wrapper(int port, uint8_t data) -{ - //This function is nowhere to use. -} - -static int hci_uart_init_wrapper(int uart_no, void *cfg) -{ - //This function is nowhere to use. - return 0; -} - -#endif //CONFIG_BT_LE_HCI_INTERFACE_USE_UART - -static int ble_hci_unregistered_hook(void*, void*) -{ - ESP_LOGD(NIMBLE_PORT_LOG_TAG,"%s ble hci rx_evt is not registered.",__func__); - return 0; -} - static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in) { @@ -694,6 +540,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) esp_err_t ret = ESP_OK; ble_npl_count_info_t npl_info; uint32_t slow_clk_freq = 0; + uint8_t hci_transport_mode; memset(&npl_info, 0, sizeof(ble_npl_count_info_t)); @@ -838,11 +685,20 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; - ble_hci_trans_cfg_hs((ble_hci_trans_rx_cmd_fn *)ble_hci_unregistered_hook,NULL, - (ble_hci_trans_rx_acl_fn *)ble_hci_unregistered_hook,NULL); - return ESP_OK; +#if CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + hci_transport_mode = HCI_TRANSPORT_VHCI; +#elif CONFIG_BT_LE_HCI_INTERFACE_USE_UART + hci_transport_mode = HCI_TRANSPORT_UART_NO_DMA; +#endif // CONFIG_BT_LE_HCI_INTERFACE_USE_RAM + ret = hci_transport_init(hci_transport_mode); + if (ret) { + ESP_LOGW(NIMBLE_PORT_LOG_TAG, "hci transport init failed %d", ret); + goto free_controller; + } + return ESP_OK; free_controller: + hci_transport_deinit(); controller_sleep_deinit(); os_msys_deinit(); r_ble_controller_deinit(); @@ -873,6 +729,7 @@ esp_err_t esp_bt_controller_deinit(void) return ESP_FAIL; } + hci_transport_deinit(); controller_sleep_deinit(); os_msys_deinit(); diff --git a/components/bt/controller/esp32c5/esp_bt_cfg.h b/components/bt/controller/esp32c5/esp_bt_cfg.h index b9597034fc6..b8bbfd3d4b7 100644 --- a/components/bt/controller/esp32c5/esp_bt_cfg.h +++ b/components/bt/controller/esp32c5/esp_bt_cfg.h @@ -129,6 +129,21 @@ extern "C" { #else #define DEFAULT_BT_LE_50_FEATURE_SUPPORT (0) #endif + + #if defined (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #if DEFAULT_BT_LE_HCI_UART_FLOW_CTRL + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (CONFIG_BT_LE_HCI_UART_CTS_PIN) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (CONFIG_BT_LE_HCI_UART_RTS_PIN) + #else + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif + #else + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif #endif #define DEFAULT_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF CONFIG_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF @@ -169,8 +184,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (UART_DATA_8_BITS) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (UART_STOP_BITS_1) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (CONFIG_BT_LE_HCI_UART_TASK_STACK_SIZE) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #else #define DEFAULT_BT_LE_HCI_UART_TX_PIN (0) #define DEFAULT_BT_LE_HCI_UART_RX_PIN (0) @@ -179,8 +192,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (0) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (0) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (0) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #endif /* Unchanged configuration */ diff --git a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib index 2e05c001042..77c67a4d06c 160000 --- a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib +++ b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib @@ -1 +1 @@ -Subproject commit 2e05c001042650bca426b672febd23c9ff45754e +Subproject commit 77c67a4d06c95113a2d1766892cde59f5af744af diff --git a/components/bt/include/esp32c5/include/esp_bt.h b/components/bt/include/esp32c5/include/esp_bt.h index 1a7cd646851..37a70c2a40f 100644 --- a/components/bt/include/esp32c5/include/esp_bt.h +++ b/components/bt/include/esp32c5/include/esp_bt.h @@ -155,7 +155,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20231124 +#define CONFIG_VERSION 0x20240422 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -196,13 +196,6 @@ typedef struct { uint8_t controller_run_cpu; /*!< CPU core on which the controller runs */ uint8_t enable_qa_test; /*!< Enable quality assurance (QA) testing */ uint8_t enable_bqb_test; /*!< Enable Bluetooth Qualification Test (BQB) testing */ - uint8_t enable_uart_hci; /*!< Enable UART HCI (Host Controller Interface) */ - uint8_t ble_hci_uart_port; /*!< UART port number for Bluetooth HCI */ - uint32_t ble_hci_uart_baud; /*!< Baud rate for Bluetooth HCI UART */ - uint8_t ble_hci_uart_data_bits; /*!< Number of data bits for Bluetooth HCI UART */ - uint8_t ble_hci_uart_stop_bits; /*!< Number of stop bits for Bluetooth HCI UART */ - uint8_t ble_hci_uart_flow_ctrl; /*!< Flow control settings for Bluetooth HCI UART */ - uint8_t ble_hci_uart_uart_parity; /*!< Parity settings for Bluetooth HCI UART */ uint8_t enable_tx_cca; /*!< Enable Transmit Clear Channel Assessment (TX CCA) */ uint8_t cca_rssi_thresh; /*!< RSSI threshold for Transmit Clear Channel Assessment (CCA) */ uint8_t sleep_en; /*!< Enable sleep mode */ @@ -252,13 +245,6 @@ typedef struct { .controller_run_cpu = 0, \ .enable_qa_test = RUN_QA_TEST, \ .enable_bqb_test = RUN_BQB_TEST, \ - .enable_uart_hci = HCI_UART_EN, \ - .ble_hci_uart_port = DEFAULT_BT_LE_HCI_UART_PORT, \ - .ble_hci_uart_baud = DEFAULT_BT_LE_HCI_UART_BAUD, \ - .ble_hci_uart_data_bits = DEFAULT_BT_LE_HCI_UART_DATA_BITS, \ - .ble_hci_uart_stop_bits = DEFAULT_BT_LE_HCI_UART_STOP_BITS, \ - .ble_hci_uart_flow_ctrl = DEFAULT_BT_LE_HCI_UART_FLOW_CTRL, \ - .ble_hci_uart_uart_parity = DEFAULT_BT_LE_HCI_UART_PARITY, \ .enable_tx_cca = DEFAULT_BT_LE_TX_CCA_ENABLED, \ .cca_rssi_thresh = 256 - DEFAULT_BT_LE_CCA_RSSI_THRESH, \ .sleep_en = NIMBLE_SLEEP_ENABLE, \ From e94e7b7ab269a0affa91f487f8523441edeee89b Mon Sep 17 00:00:00 2001 From: zwl Date: Thu, 4 Jul 2024 21:18:15 +0800 Subject: [PATCH 008/113] feat(bluetooth/controller): add default cts and rts macro definition --- .../bt/include/esp32h4/include/esp_bt_cfg.h | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/components/bt/include/esp32h4/include/esp_bt_cfg.h b/components/bt/include/esp32h4/include/esp_bt_cfg.h index 768a0c6ccec..1f8caaeca8b 100644 --- a/components/bt/include/esp32h4/include/esp_bt_cfg.h +++ b/components/bt/include/esp32h4/include/esp_bt_cfg.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -116,6 +116,20 @@ extern "C" { #define DEFAULT_BT_LE_HCI_EVT_LO_BUF_COUNT (8) #endif + #if defined (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (CONFIG_BT_LE_HCI_UART_FLOWCTRL) + #if DEFAULT_BT_LE_HCI_UART_FLOW_CTRL + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (CONFIG_BT_LE_HCI_UART_CTS_PIN) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (CONFIG_BT_LE_HCI_UART_RTS_PIN) + #else + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif + #else + #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) + #define DEFAULT_BT_LE_HCI_UART_CTS_PIN (-1) + #define DEFAULT_BT_LE_HCI_UART_RTS_PIN (-1) + #endif #endif #define DEFAULT_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF CONFIG_BT_LE_COEX_PHY_CODED_TX_RX_TLIM_EFF @@ -156,8 +170,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (UART_DATA_8_BITS) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (UART_STOP_BITS_1) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (CONFIG_BT_LE_HCI_UART_TASK_STACK_SIZE) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #else #define DEFAULT_BT_LE_HCI_UART_TX_PIN (0) #define DEFAULT_BT_LE_HCI_UART_RX_PIN (0) @@ -166,8 +178,6 @@ extern "C" { #define DEFAULT_BT_LE_HCI_UART_DATA_BITS (0) #define DEFAULT_BT_LE_HCI_UART_STOP_BITS (0) #define DEFAULT_BT_LE_HCI_UART_PARITY (0) - #define DEFAULT_BT_LE_HCI_UART_TASK_STACK_SIZE (0) - #define DEFAULT_BT_LE_HCI_UART_FLOW_CTRL (0) #endif /* Unchanged configuration */ From 9610e3999eb13bb6092b8237b659ecde34c498cb Mon Sep 17 00:00:00 2001 From: zwl Date: Thu, 4 Jul 2024 21:16:59 +0800 Subject: [PATCH 009/113] feat(bluetooth/controller): update nimble host to adapt hci layer --- components/bt/host/nimble/nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 9e10a234abe..ec9f21253ae 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 9e10a234abeb468d524e427c8c408b86a042bffc +Subproject commit ec9f21253ae539b44855fed223bee52979a9d251 From 37485738172e35196c32ab18b01ddde2d9d46032 Mon Sep 17 00:00:00 2001 From: zwl Date: Tue, 9 Jul 2024 20:42:11 +0800 Subject: [PATCH 010/113] fix(ble): fixed nimble host only build error --- .../bluetooth/nimble/bleprph_host_only/main/uart_driver.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/bluetooth/nimble/bleprph_host_only/main/uart_driver.c b/examples/bluetooth/nimble/bleprph_host_only/main/uart_driver.c index 07e82387f51..cd3916724a6 100644 --- a/examples/bluetooth/nimble/bleprph_host_only/main/uart_driver.c +++ b/examples/bluetooth/nimble/bleprph_host_only/main/uart_driver.c @@ -170,6 +170,13 @@ void hci_uart_send(uint8_t *buf, uint16_t len) } } + +void +ble_transport_ll_init(void) +{ + +} + int ble_transport_to_ll_acl_impl(struct os_mbuf *om) { From 075bb4831dc7dfd42c81d04da740764602dc9338 Mon Sep 17 00:00:00 2001 From: Yuhan Wei Date: Wed, 10 Jul 2024 09:31:44 +0800 Subject: [PATCH 011/113] docs(ble): Added more explanations for memory release related API --- components/bt/include/esp32/include/esp_bt.h | 46 ++++++++++---------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 379cb00eac7..9793b683977 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -272,22 +272,22 @@ typedef enum { /** * @brief BLE TX power type * @note - * 1. The connection TX power can only be set after the connection is established. + * 1. Please use `ESP_BLE_PWR_TYPE_DEFAULT` to set connection TX power before establishing the connection. * After disconnecting, the corresponding TX power will not be affected. * 2. `ESP_BLE_PWR_TYPE_DEFAULT` can be used to set the TX power for power types that have not been set before. - * It will not affect the TX power values which have been set for the following CONN0-8/ADV/SCAN power types. - * 3. If none of power type is set, the system will use `ESP_PWR_LVL_P3` as default for ADV/SCAN/CONN0-8. + * It will not affect the TX power values which have been set for the ADV/SCAN power types. + * 3. If none of power type is set, the system will use `ESP_PWR_LVL_P3` as default for all power types. */ typedef enum { - ESP_BLE_PWR_TYPE_CONN_HDL0 = 0, /*!< TX power for connection handle 0 */ - ESP_BLE_PWR_TYPE_CONN_HDL1 = 1, /*!< TX power for connection handle 1 */ - ESP_BLE_PWR_TYPE_CONN_HDL2 = 2, /*!< TX power for connection handle 2 */ - ESP_BLE_PWR_TYPE_CONN_HDL3 = 3, /*!< TX power for connection handle 3 */ - ESP_BLE_PWR_TYPE_CONN_HDL4 = 4, /*!< TX power for connection handle 4 */ - ESP_BLE_PWR_TYPE_CONN_HDL5 = 5, /*!< TX power for connection handle 5 */ - ESP_BLE_PWR_TYPE_CONN_HDL6 = 6, /*!< TX power for connection handle 6 */ - ESP_BLE_PWR_TYPE_CONN_HDL7 = 7, /*!< TX power for connection handle 7 */ - ESP_BLE_PWR_TYPE_CONN_HDL8 = 8, /*!< TX power for connection handle 8 */ + ESP_BLE_PWR_TYPE_CONN_HDL0 = 0, /*!< TX power for connection handle 0. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL1 = 1, /*!< TX power for connection handle 1. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL2 = 2, /*!< TX power for connection handle 2. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL3 = 3, /*!< TX power for connection handle 3. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL4 = 4, /*!< TX power for connection handle 4. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL5 = 5, /*!< TX power for connection handle 5. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL6 = 6, /*!< TX power for connection handle 6. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL7 = 7, /*!< TX power for connection handle 7. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL8 = 8, /*!< TX power for connection handle 8. Currently not effective */ ESP_BLE_PWR_TYPE_ADV = 9, /*!< TX power for advertising */ ESP_BLE_PWR_TYPE_SCAN = 10, /*!< TX power for scan */ ESP_BLE_PWR_TYPE_DEFAULT = 11, /*!< Default TX power type, which can be used to set the TX power for power types that have not been set before.*/ @@ -514,6 +514,12 @@ esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callba * * This function releases the BSS, data and other sections of the Controller to heap. The total size is about 70 KB. * + * @note + * 1. This function is optional and should be called only if you want to free up memory for other components. + * 2. This function should be called only before `esp_bt_controller_init()` or after `esp_bt_controller_deinit()`. + * 3. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. + * 4. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. + * * If the app calls `esp_bt_controller_enable(ESP_BT_MODE_BLE)` to use BLE only, * then it is safe to call `esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT)` at initialization time to free unused Classic Bluetooth memory. * @@ -521,11 +527,6 @@ esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callba * which internally calls `esp_bt_controller_mem_release(ESP_BT_MODE_BTDM)` and additionally releases the BSS and data * consumed by the Classic Bluetooth/BLE Host stack to heap. For more details about usage please refer to the documentation of `esp_bt_mem_release()` function. * - * @note - * 1. This function should be called only before `esp_bt_controller_init()` or after `esp_bt_controller_deinit()`. - * 2. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. - * 3. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. - * * @param[in] mode The Bluetooth Controller mode * * @return @@ -536,6 +537,12 @@ esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callba esp_err_t esp_bt_controller_mem_release(esp_bt_mode_t mode); /** @brief Release the Controller memory, BSS and data section of the Classic Bluetooth/BLE Host stack as per the mode + * + * @note + * 1. This function is optional and should be called only if you want to free up memory for other components. + * 2. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. + * 3. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. + * 4. In case of NimBLE Host, to release BSS and data memory to heap, the mode needs to be set to `ESP_BT_MODE_BTDM` as the Controller is in Dual mode. * * This function first releases Controller memory by internally calling `esp_bt_controller_mem_release()`. * Additionally, if the mode is set to `ESP_BT_MODE_BTDM`, it also releases the BSS and data consumed by the Classic Bluetooth and BLE Host stack to heap. @@ -553,11 +560,6 @@ esp_err_t esp_bt_controller_mem_release(esp_bt_mode_t mode); * esp_bt_controller_deinit(); * esp_bt_mem_release(ESP_BT_MODE_BTDM); * - * @note - * 1. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. - * 2. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. - * 3. In case of NimBLE Host, to release BSS and data memory to heap, the mode needs to be set to `ESP_BT_MODE_BTDM` as the Controller is in Dual mode. - * * @param[in] mode The Bluetooth Controller mode * * @return From 40c454bb40792d8b5e164bee1f7875986e379606 Mon Sep 17 00:00:00 2001 From: Yuhan Wei Date: Wed, 10 Jul 2024 09:55:55 +0800 Subject: [PATCH 012/113] docs(ble): Removed a period --- components/bt/include/esp32/include/esp_bt.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 9793b683977..62c18ca8968 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -53,7 +53,7 @@ extern "C" { /** * @brief Internal use only * -* @note Please do not modify this value. +* @note Please do not modify this value */ #define ESP_BT_CONTROLLER_CONFIG_MAGIC_VAL 0x20240315 @@ -539,7 +539,7 @@ esp_err_t esp_bt_controller_mem_release(esp_bt_mode_t mode); /** @brief Release the Controller memory, BSS and data section of the Classic Bluetooth/BLE Host stack as per the mode * * @note - * 1. This function is optional and should be called only if you want to free up memory for other components. + * 1. This function is optional and should be called only if you want to free up memory for other components. * 2. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. * 3. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. * 4. In case of NimBLE Host, to release BSS and data memory to heap, the mode needs to be set to `ESP_BT_MODE_BTDM` as the Controller is in Dual mode. From e9f0ca3631a7076241a50765eb11e75907eb685f Mon Sep 17 00:00:00 2001 From: Yuhan Wei Date: Wed, 10 Jul 2024 10:01:01 +0800 Subject: [PATCH 013/113] docs(ble): Reformat the code --- components/bt/include/esp32/include/esp_bt.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 62c18ca8968..92bbf42fd87 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -477,11 +477,11 @@ typedef struct esp_vhci_host_callback { /** * @brief Check whether the Controller is ready to receive the packet * - * If the return value is True, the Host can send the packet to the Controller. + * If the return value is True, the Host can send the packet to the Controller. * - * @note This function should be called before each `esp_vhci_host_send_packet()`. + * @note This function should be called before each `esp_vhci_host_send_packet()`. * - * @return + * @return * True if the Controller is ready to receive packets; false otherwise */ bool esp_vhci_host_check_send_available(void); From 28da1bc4bca9357cc2f1db9a049dcb096a68b3dc Mon Sep 17 00:00:00 2001 From: Yuhan Wei Date: Wed, 10 Jul 2024 16:29:00 +0800 Subject: [PATCH 014/113] docs(ble): Revised the explanations for memory release related APIs --- components/bt/include/esp32/include/esp_bt.h | 45 +++++++++++--------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 92bbf42fd87..101a46f64fa 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -272,8 +272,8 @@ typedef enum { /** * @brief BLE TX power type * @note - * 1. Please use `ESP_BLE_PWR_TYPE_DEFAULT` to set connection TX power before establishing the connection. - * After disconnecting, the corresponding TX power will not be affected. + * 1. `ESP_BLE_PWR_CONN_HDL0` - `ESP_BLE_PWR_CONN_HDL8` are not effective currently. Please use `ESP_BLE_PWR_TYPE_DEFAULT` + * to set / get BLE TX power for all connection handles. * 2. `ESP_BLE_PWR_TYPE_DEFAULT` can be used to set the TX power for power types that have not been set before. * It will not affect the TX power values which have been set for the ADV/SCAN power types. * 3. If none of power type is set, the system will use `ESP_PWR_LVL_P3` as default for all power types. @@ -327,7 +327,9 @@ typedef enum { /** * @brief Set BLE TX power * - * @note Connection TX power should only be set after the connection is established. + * @note + * 1. Please use `ESP_BLE_PWR_TYPE_DEFAULT` to set BLE TX power for all connection handles. + * 2. Connection TX power should only be set after the connection is established. * * @param[in] power_type The type of TX power. It could be Advertising, Connection, Default, etc. * @param[in] power_level Power level (index) corresponding to the absolute value (dBm) @@ -341,7 +343,9 @@ esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_ /** * @brief Get BLE TX power * - * @note Connection TX power should only be retrieved after the connection is established. + * @note + * 1. Please use `ESP_BLE_PWR_TYPE_DEFAULT` to get BLE TX power for all connection handles. + * 2. Connection TX power should only be retrieved after the connection is established. * * @param[in] power_type The type of TX power. It could be Advertising/Connection/Default and etc. * @@ -516,16 +520,17 @@ esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callba * * @note * 1. This function is optional and should be called only if you want to free up memory for other components. - * 2. This function should be called only before `esp_bt_controller_init()` or after `esp_bt_controller_deinit()`. - * 3. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. - * 4. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. + * 2. This function should only be called when the controller is in `ESP_BT_CONTROLLER_STATUS_IDLE` status. + * 3. This function should be called only before `esp_bt_controller_init()` or after `esp_bt_controller_deinit()`. + * 4. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. + * 5. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. + * + * If you never intend to use Bluetooth in a current boot-up cycle, calling `esp_bt_controller_mem_release(ESP_BT_MODE_BTDM)` could release the BSS and data consumed by both Classic Bluetooth and BLE Controller to heap. * - * If the app calls `esp_bt_controller_enable(ESP_BT_MODE_BLE)` to use BLE only, - * then it is safe to call `esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT)` at initialization time to free unused Classic Bluetooth memory. + * If you intend to use BLE only, calling `esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT)` could release the BSS and data consumed by Classic Bluetooth Controller. You can then continue using BLE. + * + * If you intend to use Classic Bluetooth only, calling `esp_bt_controller_mem_release(ESP_BT_MODE_BLE)` could release the BSS and data consumed by BLE Controller. You can then continue using Classic Bluetooth. * - * If the mode is `ESP_BT_MODE_BTDM`, then it may be useful to call API `esp_bt_mem_release(ESP_BT_MODE_BTDM)` instead, - * which internally calls `esp_bt_controller_mem_release(ESP_BT_MODE_BTDM)` and additionally releases the BSS and data - * consumed by the Classic Bluetooth/BLE Host stack to heap. For more details about usage please refer to the documentation of `esp_bt_mem_release()` function. * * @param[in] mode The Bluetooth Controller mode * @@ -540,15 +545,17 @@ esp_err_t esp_bt_controller_mem_release(esp_bt_mode_t mode); * * @note * 1. This function is optional and should be called only if you want to free up memory for other components. - * 2. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. - * 3. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. - * 4. In case of NimBLE Host, to release BSS and data memory to heap, the mode needs to be set to `ESP_BT_MODE_BTDM` as the Controller is in Dual mode. + * 2. This function should only be called when the controller is in `ESP_BT_CONTROLLER_STATUS_IDLE` status. + * 3. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. + * 4. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. + * + * This function first releases Controller memory by internally calling `esp_bt_controller_mem_release()`, then release Host memory. + * + * If you never intend to use Bluetooth in a current boot-up cycle, calling `esp_bt_mem_release(ESP_BT_MODE_BTDM)` could release the BSS and data consumed by both Classic Bluetooth and BLE stack to heap. * - * This function first releases Controller memory by internally calling `esp_bt_controller_mem_release()`. - * Additionally, if the mode is set to `ESP_BT_MODE_BTDM`, it also releases the BSS and data consumed by the Classic Bluetooth and BLE Host stack to heap. + * If you intend to use BLE only, calling `esp_bt_mem_release(ESP_BT_MODE_CLASSIC_BT)` could release the BSS and data consumed by Classic Bluetooth. You can then continue using BLE. * - * If you never intend to use Bluetooth in a current boot-up cycle, you can call `esp_bt_mem_release(ESP_BT_MODE_BTDM)` - * before `esp_bt_controller_init()` or after `esp_bt_controller_deinit()`. + * If you intend to use Classic Bluetooth only, calling `esp_bt_mem_release(ESP_BT_MODE_BLE)` could release the BSS and data consumed by BLE. You can then continue using Classic Bluetooth. * * For example, if you only use Bluetooth for setting the Wi-Fi configuration, and do not use Bluetooth in the rest of the product operation, * after receiving the Wi-Fi configuration, you can disable/de-init Bluetooth and release its memory. From 4bfdf5ecb3a8b6eedc5dc4c5aa0fa7ff357eb033 Mon Sep 17 00:00:00 2001 From: Wei Yu Han Date: Wed, 10 Jul 2024 17:53:04 +0800 Subject: [PATCH 015/113] docs(ble): Remove one note in esp_bt_controller_mem_release --- components/bt/include/esp32/include/esp_bt.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 101a46f64fa..9355772140e 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -521,9 +521,8 @@ esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callba * @note * 1. This function is optional and should be called only if you want to free up memory for other components. * 2. This function should only be called when the controller is in `ESP_BT_CONTROLLER_STATUS_IDLE` status. - * 3. This function should be called only before `esp_bt_controller_init()` or after `esp_bt_controller_deinit()`. - * 4. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. - * 5. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. + * 3. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. + * 4. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. * * If you never intend to use Bluetooth in a current boot-up cycle, calling `esp_bt_controller_mem_release(ESP_BT_MODE_BTDM)` could release the BSS and data consumed by both Classic Bluetooth and BLE Controller to heap. * From 213c05db4b2f4d4ea8b1e413b7922b6b8fa58ea0 Mon Sep 17 00:00:00 2001 From: Wei Yu Han Date: Thu, 11 Jul 2024 10:10:37 +0800 Subject: [PATCH 016/113] docs(ble): Fixed a typo in esp_bt_mem_release comment --- components/bt/include/esp32/include/esp_bt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 9355772140e..ce731e2ca76 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -548,7 +548,7 @@ esp_err_t esp_bt_controller_mem_release(esp_bt_mode_t mode); * 3. Once Bluetooth Controller memory is released, the process cannot be reversed. This means you cannot use the Bluetooth Controller mode that you have released using this function. * 4. If your firmware will upgrade the Bluetooth Controller mode later (such as switching from BLE to Classic Bluetooth or from disabled to enabled), then do not call this function. * - * This function first releases Controller memory by internally calling `esp_bt_controller_mem_release()`, then release Host memory. + * This function first releases Controller memory by internally calling `esp_bt_controller_mem_release()`, then releases Host memory. * * If you never intend to use Bluetooth in a current boot-up cycle, calling `esp_bt_mem_release(ESP_BT_MODE_BTDM)` could release the BSS and data consumed by both Classic Bluetooth and BLE stack to heap. * From c880f697da14ef0a6927fbf865432cbed823735e Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 11 Jul 2024 15:23:29 +0800 Subject: [PATCH 017/113] feat(panic): supported more cache error cactch --- components/esp_system/port/arch/riscv/panic_arch.c | 4 +--- components/riscv/include/esp_private/panic_reason.h | 4 +++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/esp_system/port/arch/riscv/panic_arch.c b/components/esp_system/port/arch/riscv/panic_arch.c index 718a01116b8..b2278dacb7d 100644 --- a/components/esp_system/port/arch/riscv/panic_arch.c +++ b/components/esp_system/port/arch/riscv/panic_arch.c @@ -39,7 +39,6 @@ */ static inline void print_cache_err_details(const void *frame) { -#if !CONFIG_IDF_TARGET_ESP32P4 const char* cache_err_msg = esp_cache_err_panic_string(); if (cache_err_msg) { panic_print_str(cache_err_msg); @@ -47,7 +46,6 @@ static inline void print_cache_err_details(const void *frame) panic_print_str("Cache error active, but failed to find a corresponding error message"); } panic_print_str("\r\n"); -#endif } #if CONFIG_ESP_SYSTEM_HW_STACK_GUARD @@ -195,7 +193,7 @@ bool panic_soc_check_pseudo_cause(void *f, panic_info_t *info) /* Cache errors when reading instructions will result in an illegal instructions, before any cache error interrupts trigger. We override the exception cause if any cache errors are active to more accurately report the actual reason */ - if (esp_cache_err_has_active_err() && (frame->mcause == MCAUSE_ILLEGAL_INSTRUCTION)) { + if (esp_cache_err_has_active_err() && ((frame->mcause == MCAUSE_ILLEGAL_INSTRUCTION) || (frame->mcause == MCAUSE_ILLIGAL_INSTRUCTION_ACCESS) || (frame->mcause == MCAUSE_LOAD_ACCESS_FAULT))) { pseudo_cause = true; frame->mcause = ETS_CACHEERR_INUM; } diff --git a/components/riscv/include/esp_private/panic_reason.h b/components/riscv/include/esp_private/panic_reason.h index 252f6de9c0b..fdbee96fa30 100644 --- a/components/riscv/include/esp_private/panic_reason.h +++ b/components/riscv/include/esp_private/panic_reason.h @@ -19,4 +19,6 @@ #define PANIC_RSN_CACHEERR 3 -#define MCAUSE_ILLEGAL_INSTRUCTION 2 +#define MCAUSE_ILLIGAL_INSTRUCTION_ACCESS 1 +#define MCAUSE_ILLEGAL_INSTRUCTION 2 +#define MCAUSE_LOAD_ACCESS_FAULT 5 From 73b647f2928abc2270792078dce9f87fe7e9c1a9 Mon Sep 17 00:00:00 2001 From: Wei Yu Han Date: Thu, 11 Jul 2024 18:35:42 +0800 Subject: [PATCH 018/113] docs(ble): Removed the 'not effective' for CONN_HDL0 - CONN_HDL8 --- components/bt/include/esp32/include/esp_bt.h | 28 +++++++++----------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index ce731e2ca76..61f65232d4e 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -272,22 +272,22 @@ typedef enum { /** * @brief BLE TX power type * @note - * 1. `ESP_BLE_PWR_CONN_HDL0` - `ESP_BLE_PWR_CONN_HDL8` are not effective currently. Please use `ESP_BLE_PWR_TYPE_DEFAULT` - * to set / get BLE TX power for all connection handles. + * 1. The connection TX power can only be set after the connection is established. + * After disconnecting, the corresponding TX power will not be affected. * 2. `ESP_BLE_PWR_TYPE_DEFAULT` can be used to set the TX power for power types that have not been set before. * It will not affect the TX power values which have been set for the ADV/SCAN power types. * 3. If none of power type is set, the system will use `ESP_PWR_LVL_P3` as default for all power types. */ typedef enum { - ESP_BLE_PWR_TYPE_CONN_HDL0 = 0, /*!< TX power for connection handle 0. Currently not effective */ - ESP_BLE_PWR_TYPE_CONN_HDL1 = 1, /*!< TX power for connection handle 1. Currently not effective */ - ESP_BLE_PWR_TYPE_CONN_HDL2 = 2, /*!< TX power for connection handle 2. Currently not effective */ - ESP_BLE_PWR_TYPE_CONN_HDL3 = 3, /*!< TX power for connection handle 3. Currently not effective */ - ESP_BLE_PWR_TYPE_CONN_HDL4 = 4, /*!< TX power for connection handle 4. Currently not effective */ - ESP_BLE_PWR_TYPE_CONN_HDL5 = 5, /*!< TX power for connection handle 5. Currently not effective */ - ESP_BLE_PWR_TYPE_CONN_HDL6 = 6, /*!< TX power for connection handle 6. Currently not effective */ - ESP_BLE_PWR_TYPE_CONN_HDL7 = 7, /*!< TX power for connection handle 7. Currently not effective */ - ESP_BLE_PWR_TYPE_CONN_HDL8 = 8, /*!< TX power for connection handle 8. Currently not effective */ + ESP_BLE_PWR_TYPE_CONN_HDL0 = 0, /*!< TX power for connection handle 0 */ + ESP_BLE_PWR_TYPE_CONN_HDL1 = 1, /*!< TX power for connection handle 1 */ + ESP_BLE_PWR_TYPE_CONN_HDL2 = 2, /*!< TX power for connection handle 2 */ + ESP_BLE_PWR_TYPE_CONN_HDL3 = 3, /*!< TX power for connection handle 3 */ + ESP_BLE_PWR_TYPE_CONN_HDL4 = 4, /*!< TX power for connection handle 4 */ + ESP_BLE_PWR_TYPE_CONN_HDL5 = 5, /*!< TX power for connection handle 5 */ + ESP_BLE_PWR_TYPE_CONN_HDL6 = 6, /*!< TX power for connection handle 6 */ + ESP_BLE_PWR_TYPE_CONN_HDL7 = 7, /*!< TX power for connection handle 7 */ + ESP_BLE_PWR_TYPE_CONN_HDL8 = 8, /*!< TX power for connection handle 8 */ ESP_BLE_PWR_TYPE_ADV = 9, /*!< TX power for advertising */ ESP_BLE_PWR_TYPE_SCAN = 10, /*!< TX power for scan */ ESP_BLE_PWR_TYPE_DEFAULT = 11, /*!< Default TX power type, which can be used to set the TX power for power types that have not been set before.*/ @@ -328,8 +328,7 @@ typedef enum { * @brief Set BLE TX power * * @note - * 1. Please use `ESP_BLE_PWR_TYPE_DEFAULT` to set BLE TX power for all connection handles. - * 2. Connection TX power should only be set after the connection is established. + * 1. Connection TX power should only be set after the connection is established. * * @param[in] power_type The type of TX power. It could be Advertising, Connection, Default, etc. * @param[in] power_level Power level (index) corresponding to the absolute value (dBm) @@ -344,8 +343,7 @@ esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_ * @brief Get BLE TX power * * @note - * 1. Please use `ESP_BLE_PWR_TYPE_DEFAULT` to get BLE TX power for all connection handles. - * 2. Connection TX power should only be retrieved after the connection is established. + * 1. Connection TX power should only be retrieved after the connection is established. * * @param[in] power_type The type of TX power. It could be Advertising/Connection/Default and etc. * From 945a593de28275f8ab92a6ace690a379c744f8c8 Mon Sep 17 00:00:00 2001 From: Sudeep Mohanty Date: Thu, 11 Jul 2024 11:18:28 +0200 Subject: [PATCH 019/113] fix(lp-i2c): Fixed the generation of spurious I2C start with lp-i2c This commit fixes an issue with LP I2C and RTC I2C where in the peripherals generated a spurious I2C start condition when initialized. This caused some sensors to not respond properly to the following read or write request. Closes https://github.com/espressif/esp-idf/issues/14043 Closes https://github.com/espressif/esp-idf/issues/11608 --- components/ulp/lp_core/lp_core_i2c.c | 16 +++++++++++---- components/ulp/ulp_riscv/ulp_riscv_i2c.c | 25 ++++++++++++++++-------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/components/ulp/lp_core/lp_core_i2c.c b/components/ulp/lp_core/lp_core_i2c.c index 0d41f7fba1d..0b5db5add8b 100644 --- a/components/ulp/lp_core/lp_core_i2c.c +++ b/components/ulp/lp_core/lp_core_i2c.c @@ -53,9 +53,10 @@ static esp_err_t lp_i2c_gpio_is_cfg_valid(gpio_num_t sda_io_num, gpio_num_t scl_ static esp_err_t lp_i2c_configure_io(gpio_num_t io_num, bool pullup_en) { + /* Set the IO pin to high to avoid them from toggling from Low to High state during initialization. This can register a spurious I2C start condition. */ + ESP_RETURN_ON_ERROR(rtc_gpio_set_level(io_num, 1), LPI2C_TAG, "LP GPIO failed to set level to high for %d", io_num); /* Initialize IO Pin */ ESP_RETURN_ON_ERROR(rtc_gpio_init(io_num), LPI2C_TAG, "LP GPIO Init failed for GPIO %d", io_num); - /* Set direction to input+output open-drain mode */ ESP_RETURN_ON_ERROR(rtc_gpio_set_direction(io_num, RTC_GPIO_MODE_INPUT_OUTPUT_OD), LPI2C_TAG, "LP GPIO Set direction failed for %d", io_num); /* Disable pulldown on the io pin */ @@ -82,12 +83,16 @@ static esp_err_t lp_i2c_set_pin(const lp_core_i2c_cfg_t *cfg) /* Verify that the LP I2C GPIOs are valid */ ESP_RETURN_ON_ERROR(lp_i2c_gpio_is_cfg_valid(sda_io_num, scl_io_num), LPI2C_TAG, "LP I2C GPIO config invalid"); - /* Initialize SDA Pin */ - ESP_RETURN_ON_ERROR(lp_i2c_configure_io(sda_io_num, sda_pullup_en), LPI2C_TAG, "LP I2C SDA pin config failed"); + // NOTE: We always initialize the SCL pin first, then the SDA pin. + // This order of initialization is important to avoid any spurious + // I2C start conditions on the bus. /* Initialize SCL Pin */ ESP_RETURN_ON_ERROR(lp_i2c_configure_io(scl_io_num, scl_pullup_en), LPI2C_TAG, "LP I2C SCL pin config failed"); + /* Initialize SDA Pin */ + ESP_RETURN_ON_ERROR(lp_i2c_configure_io(sda_io_num, sda_pullup_en), LPI2C_TAG, "LP I2C SDA pin config failed"); + #if !SOC_LP_GPIO_MATRIX_SUPPORTED /* Select LP I2C function for the SDA Pin */ lp_io_dev->gpio[sda_io_num].mcu_sel = 1; @@ -123,7 +128,7 @@ static esp_err_t lp_i2c_config_clk(const lp_core_i2c_cfg_t *cfg) } } - /* Fetch the clock source fequency */ + /* Fetch the clock source frequency */ ESP_RETURN_ON_ERROR(esp_clk_tree_src_get_freq_hz(source_clk, ESP_CLK_TREE_SRC_FREQ_PRECISION_APPROX, &source_freq), LPI2C_TAG, "Invalid LP I2C source clock selected"); /* Verify that the I2C_SCLK operates at a frequency 20 times larger than the requested SCL bus frequency */ @@ -162,6 +167,9 @@ esp_err_t lp_core_i2c_master_init(i2c_port_t lp_i2c_num, const lp_core_i2c_cfg_t i2c_hal_init(&i2c_hal, lp_i2c_num); } + /* Clear any pending interrupts */ + i2c_ll_clear_intr_mask(i2c_hal.dev, UINT32_MAX); + /* Initialize LP I2C Master mode */ i2c_hal_master_init(&i2c_hal); diff --git a/components/ulp/ulp_riscv/ulp_riscv_i2c.c b/components/ulp/ulp_riscv/ulp_riscv_i2c.c index 3d73b22e376..138d479642a 100644 --- a/components/ulp/ulp_riscv/ulp_riscv_i2c.c +++ b/components/ulp/ulp_riscv/ulp_riscv_i2c.c @@ -72,6 +72,8 @@ static esp_err_t i2c_gpio_is_cfg_valid(gpio_num_t sda_io_num, gpio_num_t scl_io_ static esp_err_t i2c_configure_io(gpio_num_t io_num, bool pullup_en) { + /* Set the IO pin to high to avoid them from toggling from Low to High state during initialization. This can register a spurious I2C start condition. */ + ESP_RETURN_ON_ERROR(rtc_gpio_set_level(io_num, 1), RTCI2C_TAG, "RTC GPIO failed to set level to high for %d", io_num); /* Initialize IO Pin */ ESP_RETURN_ON_ERROR(rtc_gpio_init(io_num), RTCI2C_TAG, "RTC GPIO Init failed for GPIO %d", io_num); /* Set direction to input+output */ @@ -98,12 +100,16 @@ static esp_err_t i2c_set_pin(const ulp_riscv_i2c_cfg_t *cfg) /* Verify that the I2C GPIOs are valid */ ESP_RETURN_ON_ERROR(i2c_gpio_is_cfg_valid(sda_io_num, scl_io_num), RTCI2C_TAG, "RTC I2C GPIO config invalid"); - /* Initialize SDA Pin */ - ESP_RETURN_ON_ERROR(i2c_configure_io(sda_io_num, sda_pullup_en), RTCI2C_TAG, "RTC I2C SDA pin config failed"); + // NOTE: We always initialize the SCL pin first, then the SDA pin. + // This order of initialization is important to avoid any spurious + // I2C start conditions on the bus. /* Initialize SCL Pin */ ESP_RETURN_ON_ERROR(i2c_configure_io(scl_io_num, scl_pullup_en), RTCI2C_TAG, "RTC I2C SCL pin config failed"); + /* Initialize SDA Pin */ + ESP_RETURN_ON_ERROR(i2c_configure_io(sda_io_num, sda_pullup_en), RTCI2C_TAG, "RTC I2C SDA pin config failed"); + /* Route SDA IO signal to the RTC subsystem */ rtc_io_dev->touch_pad[sda_io_num].mux_sel = 1; @@ -471,6 +477,12 @@ esp_err_t ulp_riscv_i2c_master_init(const ulp_riscv_i2c_cfg_t *cfg) WRITE_PERI_REG(RTC_I2C_CTRL_REG, 0); WRITE_PERI_REG(SENS_SAR_I2C_CTRL_REG, 0); + /* Verify that the input cfg param is valid */ + ESP_RETURN_ON_FALSE(cfg, ESP_ERR_INVALID_ARG, RTCI2C_TAG, "RTC I2C configuration is NULL"); + + /* Configure RTC I2C GPIOs */ + ESP_RETURN_ON_ERROR(i2c_set_pin(cfg), RTCI2C_TAG, "Failed to configure RTC I2C GPIOs"); + /* Reset RTC I2C */ #if CONFIG_IDF_TARGET_ESP32S2 i2c_dev->ctrl.i2c_reset = 1; @@ -484,12 +496,6 @@ esp_err_t ulp_riscv_i2c_master_init(const ulp_riscv_i2c_cfg_t *cfg) CLEAR_PERI_REG_MASK(SENS_SAR_PERI_RESET_CONF_REG, SENS_RTC_I2C_RESET); #endif // CONFIG_IDF_TARGET_ESP32S2 - /* Verify that the input cfg param is valid */ - ESP_RETURN_ON_FALSE(cfg, ESP_ERR_INVALID_ARG, RTCI2C_TAG, "RTC I2C configuration is NULL"); - - /* Configure RTC I2C GPIOs */ - ESP_RETURN_ON_ERROR(i2c_set_pin(cfg), RTCI2C_TAG, "Failed to configure RTC I2C GPIOs"); - /* Enable internal open-drain mode for SDA and SCL lines */ #if CONFIG_IDF_TARGET_ESP32S2 i2c_dev->ctrl.sda_force_out = 0; @@ -519,6 +525,9 @@ esp_err_t ulp_riscv_i2c_master_init(const ulp_riscv_i2c_cfg_t *cfg) /* Configure RTC I2C timing parameters */ ESP_RETURN_ON_ERROR(i2c_set_timing(cfg), RTCI2C_TAG, "Failed to configure RTC I2C timing"); + /* Clear any pending interrupts */ + WRITE_PERI_REG(RTC_I2C_INT_CLR_REG, UINT32_MAX); + /* Enable RTC I2C interrupts */ SET_PERI_REG_MASK(RTC_I2C_INT_ENA_REG, RTC_I2C_RX_DATA_INT_ENA | RTC_I2C_TX_DATA_INT_ENA | From e8e66a84ededc60178260e799ec656ef99103441 Mon Sep 17 00:00:00 2001 From: Wei Yu Han Date: Thu, 11 Jul 2024 18:38:15 +0800 Subject: [PATCH 020/113] docs(ble): added CONN0-8 back to the second note of esp_power_level_t --- components/bt/include/esp32/include/esp_bt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 61f65232d4e..b0779ce8838 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -275,7 +275,7 @@ typedef enum { * 1. The connection TX power can only be set after the connection is established. * After disconnecting, the corresponding TX power will not be affected. * 2. `ESP_BLE_PWR_TYPE_DEFAULT` can be used to set the TX power for power types that have not been set before. - * It will not affect the TX power values which have been set for the ADV/SCAN power types. + * It will not affect the TX power values which have been set for the ADV/SCAN/CONN0-8 power types. * 3. If none of power type is set, the system will use `ESP_PWR_LVL_P3` as default for all power types. */ typedef enum { From bddc1e95ef42fa735e3584d3820f8013601e7d6a Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Thu, 1 Feb 2024 09:19:46 +0800 Subject: [PATCH 021/113] feat(rt/posix): Added FreeRTOS-Plus-POSIX message queues implementation Note: The current mq_open() implementation is changed to match the POSIX standard. --- .gitlab/CODEOWNERS | 1 + components/rt/CMakeLists.txt | 13 + components/rt/FreeRTOS_POSIX_mqueue.c | 924 ++++++++++++++++++ components/rt/FreeRTOS_POSIX_utils.c | 249 +++++ components/rt/idf_changes.md | 46 + components/rt/include/mqueue.h | 155 +++ .../rt/private_include/FreeRTOS_POSIX.h | 56 ++ .../rt/private_include/FreeRTOS_POSIX/utils.h | 149 +++ .../private_include/FreeRTOS_POSIX_internal.h | 101 ++ .../private_include/FreeRTOS_POSIX_portable.h | 59 ++ .../private_include/aws_doubly_linked_list.h | 249 +++++ .../FreeRTOS_POSIX_portable_default.h | 144 +++ components/rt/sbom.yml | 5 + .../posix_rt_test/.build-test-rules.yml | 9 + .../rt/test_apps/posix_rt_test/CMakeLists.txt | 7 + .../rt/test_apps/posix_rt_test/README.md | 2 + .../posix_rt_test/main/CMakeLists.txt | 4 + .../rt/test_apps/posix_rt_test/main/main.c | 36 + .../posix_rt_test/main/mqueue_test.cpp | 288 ++++++ .../posix_rt_test/pytest_rt_mqueue_tests.py | 13 + .../posix_rt_test/sdkconfig.defaults | 2 + docs/en/api-reference/system/pthread.rst | 65 +- examples/system/.build-test-rules.yml | 7 + examples/system/rt_mqueue/CMakeLists.txt | 8 + examples/system/rt_mqueue/README.md | 37 + examples/system/rt_mqueue/main/CMakeLists.txt | 3 + .../main/posix_mqueue_example_main.c | 101 ++ examples/system/rt_mqueue/pytest_rt_mqueue.py | 13 + tools/ci/astyle-rules.yml | 2 + tools/ci/check_copyright_config.yaml | 16 + 30 files changed, 2760 insertions(+), 4 deletions(-) create mode 100644 components/rt/CMakeLists.txt create mode 100644 components/rt/FreeRTOS_POSIX_mqueue.c create mode 100644 components/rt/FreeRTOS_POSIX_utils.c create mode 100644 components/rt/idf_changes.md create mode 100644 components/rt/include/mqueue.h create mode 100644 components/rt/private_include/FreeRTOS_POSIX.h create mode 100644 components/rt/private_include/FreeRTOS_POSIX/utils.h create mode 100644 components/rt/private_include/FreeRTOS_POSIX_internal.h create mode 100644 components/rt/private_include/FreeRTOS_POSIX_portable.h create mode 100644 components/rt/private_include/aws_doubly_linked_list.h create mode 100644 components/rt/private_include/portable/FreeRTOS_POSIX_portable_default.h create mode 100644 components/rt/sbom.yml create mode 100644 components/rt/test_apps/posix_rt_test/.build-test-rules.yml create mode 100644 components/rt/test_apps/posix_rt_test/CMakeLists.txt create mode 100644 components/rt/test_apps/posix_rt_test/README.md create mode 100644 components/rt/test_apps/posix_rt_test/main/CMakeLists.txt create mode 100644 components/rt/test_apps/posix_rt_test/main/main.c create mode 100644 components/rt/test_apps/posix_rt_test/main/mqueue_test.cpp create mode 100644 components/rt/test_apps/posix_rt_test/pytest_rt_mqueue_tests.py create mode 100644 components/rt/test_apps/posix_rt_test/sdkconfig.defaults create mode 100644 examples/system/rt_mqueue/CMakeLists.txt create mode 100644 examples/system/rt_mqueue/README.md create mode 100644 examples/system/rt_mqueue/main/CMakeLists.txt create mode 100644 examples/system/rt_mqueue/main/posix_mqueue_example_main.c create mode 100644 examples/system/rt_mqueue/pytest_rt_mqueue.py diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index 0d61759339c..fb20a1a36b9 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -140,6 +140,7 @@ /components/protocomm/ @esp-idf-codeowners/app-utilities/provisioning /components/pthread/ @esp-idf-codeowners/system /components/riscv/ @esp-idf-codeowners/system +/components/rt/ @esp-idf-codeowners/system /components/sdmmc/ @esp-idf-codeowners/storage /components/soc/ @esp-idf-codeowners/peripherals @esp-idf-codeowners/system /components/spi_flash/ @esp-idf-codeowners/peripherals diff --git a/components/rt/CMakeLists.txt b/components/rt/CMakeLists.txt new file mode 100644 index 00000000000..87fc2e90ed7 --- /dev/null +++ b/components/rt/CMakeLists.txt @@ -0,0 +1,13 @@ +idf_build_get_property(target IDF_TARGET) +if(${target} STREQUAL "linux") + idf_component_register() + if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") + find_library(LIBRT rt) + target_link_libraries(${COMPONENT_LIB} INTERFACE ${LIBRT}) + endif() + return() +endif() + +idf_component_register(SRCS "FreeRTOS_POSIX_mqueue.c" "FreeRTOS_POSIX_utils.c" + PRIV_INCLUDE_DIRS "private_include" + INCLUDE_DIRS "include") diff --git a/components/rt/FreeRTOS_POSIX_mqueue.c b/components/rt/FreeRTOS_POSIX_mqueue.c new file mode 100644 index 00000000000..22ebf4e0add --- /dev/null +++ b/components/rt/FreeRTOS_POSIX_mqueue.c @@ -0,0 +1,924 @@ +/* + * Amazon FreeRTOS+POSIX V1.0.0 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/** + * @file FreeRTOS_POSIX_mqueue.c + * @brief Implementation of message queue functions in mqueue.h + */ + +/* C standard library includes. */ +#include + +#include +#include +#include +#include + +/* FreeRTOS+POSIX includes. */ +#include "FreeRTOS_POSIX.h" +#include "FreeRTOS_POSIX/utils.h" + +#include "aws_doubly_linked_list.h" +#include "esp_private/critical_section.h" + +/** + * @brief Element of the FreeRTOS queues that store mq data. + */ +typedef struct QueueElement +{ + char * pcData; /**< Data in queue. Type char* to match msg_ptr. */ + size_t xDataSize; /**< Size of data pointed by pcData. */ +} QueueElement_t; + +/** + * @brief Data structure of an mq. + * + * FreeRTOS isn't guaranteed to have a file-like abstraction, so message + * queues in this implementation are stored as a linked list (in RAM). + */ +typedef struct QueueListElement +{ + Link_t xLink; /**< Pointer to the next element in the list. */ + QueueHandle_t xQueue; /**< FreeRTOS queue handle. */ + size_t xOpenDescriptors; /**< Number of threads that have opened this queue. */ + char * pcName; /**< Null-terminated queue name. */ + struct mq_attr xAttr; /**< Queue attributes. */ + BaseType_t xPendingUnlink; /**< If pdTRUE, this queue will be unlinked once all descriptors close. */ +} QueueListElement_t; + +/*-----------------------------------------------------------*/ + +/** + * @brief Convert an absolute timespec into a tick timeout, taking into account + * queue flags. + * + * @param[in] lMessageQueueFlags Message queue flags to consider. + * @param[in] pxAbsoluteTimeout The absolute timespec to convert. + * @param[out] pxTimeoutTicks Output parameter of the timeout in ticks. + * + * @return 0 if successful; EINVAL if pxAbsoluteTimeout is invalid, or ETIMEDOUT + * if pxAbsoluteTimeout is in the past. + */ +static int prvCalculateTickTimeout( long lMessageQueueFlags, + const struct timespec * const pxAbsoluteTimeout, + TickType_t * pxTimeoutTicks ); + +/** + * @brief Add a new queue to the queue list. + * + * @param[out] ppxMessageQueue Pointer to new queue. + * @param[in] pxAttr mq_attr of the new queue. + * @param[in] pcName Name of new queue. + * @param[in] xNameLength Length of pcName. + * + * @return pdTRUE if the queue is found; pdFALSE otherwise. + */ +static BaseType_t prvCreateNewMessageQueue( QueueListElement_t ** ppxMessageQueue, + const struct mq_attr * const pxAttr, + const char * const pcName, + size_t xNameLength ); + +/** + * @brief Free all the resources used by a message queue. + * + * @param[out] pxMessageQueue Pointer to queue to free. + * + * @return nothing + */ +static void prvDeleteMessageQueue( const QueueListElement_t * const pxMessageQueue ); + +/** + * @brief Attempt to find the queue identified by pcName or xMqId in the queue list. + * + * Matches queues by pcName first; if pcName is NULL, matches by xMqId. + * @param[out] ppxQueueListElement Output parameter set when queue is found. + * @param[in] pcName A queue name to match. + * @param[in] xMessageQueueDescriptor A queue descriptor to match. + * + * @return pdTRUE if the queue is found; pdFALSE otherwise. + */ +static BaseType_t prvFindQueueInList( QueueListElement_t ** const ppxQueueListElement, + const char * const pcName, + mqd_t xMessageQueueDescriptor ); + +/** + * @brief Initialize the queue list. + * + * Performs initialization of the queue list mutex and queue list head. + * + * @return nothing + */ +static void prvInitializeQueueList( void ); + +/** + * @brief Checks that pcName is a valid name for a message queue. + * + * Also outputs the length of pcName. + * @param[in] pcName The name to check. + * @param[out] pxNameLength Output parameter for name length. + * + * @return pdTRUE if the name is valid; pdFALSE otherwise. + */ +static BaseType_t prvValidateQueueName( const char * const pcName, + size_t * pxNameLength ); + +/** + * @brief Guards access to the list of message queues. + */ +static StaticSemaphore_t xQueueListMutex = { { 0 }, .u = { 0 } }; + +/** + * @brief Head of the linked list of queues. + */ +static Link_t xQueueListHead = { 0 }; + +DEFINE_CRIT_SECTION_LOCK_STATIC( critical_section_lock ); + +/*-----------------------------------------------------------*/ + +static int prvCalculateTickTimeout( long lMessageQueueFlags, + const struct timespec * const pxAbsoluteTimeout, + TickType_t * pxTimeoutTicks ) +{ + int iStatus = 0; + + /* Check for nonblocking queue. */ + if( lMessageQueueFlags & O_NONBLOCK ) + { + /* No additional checks are done for nonblocking queues. Timeout is 0. */ + *pxTimeoutTicks = 0; + } + else + { + /* No absolute timeout given. Block forever. */ + if( pxAbsoluteTimeout == NULL ) + { + *pxTimeoutTicks = portMAX_DELAY; + } + else + { + /* Check that the given timespec is valid. */ + if( UTILS_ValidateTimespec( pxAbsoluteTimeout ) == false ) + { + iStatus = EINVAL; + } + + /* Convert absolute timespec to ticks. */ + if( ( iStatus == 0 ) && + ( UTILS_AbsoluteTimespecToTicks( pxAbsoluteTimeout, pxTimeoutTicks ) != 0 ) ) + { + iStatus = ETIMEDOUT; + } + } + } + + return iStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvCreateNewMessageQueue( QueueListElement_t ** ppxMessageQueue, + const struct mq_attr * const pxAttr, + const char * const pcName, + size_t xNameLength ) +{ + BaseType_t xStatus = pdTRUE; + + /* Allocate space for a new queue element. */ + *ppxMessageQueue = pvPortMalloc( sizeof( QueueListElement_t ) ); + + /* Check that memory allocation succeeded. */ + if( *ppxMessageQueue == NULL ) + { + xStatus = pdFALSE; + } + + /* Create the FreeRTOS queue. */ + if( xStatus == pdTRUE ) + { + ( *ppxMessageQueue )->xQueue = + xQueueCreate( pxAttr->mq_maxmsg, sizeof( QueueElement_t ) ); + + /* Check that queue creation succeeded. */ + if( ( *ppxMessageQueue )->xQueue == NULL ) + { + vPortFree( *ppxMessageQueue ); + xStatus = pdFALSE; + } + } + + if( xStatus == pdTRUE ) + { + /* Allocate space for the queue name plus null-terminator. */ + ( *ppxMessageQueue )->pcName = pvPortMalloc( xNameLength + 1 ); + + /* Check that memory was successfully allocated for queue name. */ + if( ( *ppxMessageQueue )->pcName == NULL ) + { + vQueueDelete( ( *ppxMessageQueue )->xQueue ); + vPortFree( *ppxMessageQueue ); + xStatus = pdFALSE; + } + else + { + /* Copy queue name. Copying xNameLength+1 will cause strncpy to add + * the null-terminator. */ + ( void ) strncpy( ( *ppxMessageQueue )->pcName, pcName, xNameLength + 1 ); + } + } + + if( xStatus == pdTRUE ) + { + /* Copy attributes. */ + ( *ppxMessageQueue )->xAttr = *pxAttr; + + /* A newly-created queue will have 1 open descriptor for it. */ + ( *ppxMessageQueue )->xOpenDescriptors = 1; + + /* A newly-created queue will not be pending unlink. */ + ( *ppxMessageQueue )->xPendingUnlink = pdFALSE; + + /* Add the new queue to the list. */ + listADD( &xQueueListHead, &( *ppxMessageQueue )->xLink ); + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static void prvDeleteMessageQueue( const QueueListElement_t * const pxMessageQueue ) +{ + QueueElement_t xQueueElement = { 0 }; + + /* Free all data in the queue. It's assumed that no more data will be added + * to the queue, so xQueueReceive does not block. */ + while( xQueueReceive( pxMessageQueue->xQueue, + ( void * ) &xQueueElement, + 0 ) == pdTRUE ) + { + vPortFree( xQueueElement.pcData ); + } + + /* Free memory used by this message queue. */ + vQueueDelete( pxMessageQueue->xQueue ); + vPortFree( ( void * ) pxMessageQueue->pcName ); + vPortFree( ( void * ) pxMessageQueue ); +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvFindQueueInList( QueueListElement_t ** const ppxQueueListElement, + const char * const pcName, + mqd_t xMessageQueueDescriptor ) +{ + Link_t * pxQueueListLink = NULL; + QueueListElement_t * pxMessageQueue = NULL; + BaseType_t xQueueFound = pdFALSE; + + /* Iterate through the list of queues. */ + listFOR_EACH( pxQueueListLink, &xQueueListHead ) + { + pxMessageQueue = listCONTAINER( pxQueueListLink, QueueListElement_t, xLink ); + + /* Match by name first if provided. */ + if( ( pcName != NULL ) && ( strcmp( pxMessageQueue->pcName, pcName ) == 0 ) ) + { + xQueueFound = pdTRUE; + break; + } + /* If name doesn't match, match by descriptor. */ + else + { + if( ( mqd_t ) pxMessageQueue == xMessageQueueDescriptor ) + { + xQueueFound = pdTRUE; + break; + } + } + } + + /* If the queue was found, set the output parameter. */ + if( ( xQueueFound == pdTRUE ) && ( ppxQueueListElement != NULL ) ) + { + *ppxQueueListElement = pxMessageQueue; + } + + return xQueueFound; +} + +/*-----------------------------------------------------------*/ + +static void prvInitializeQueueList( void ) +{ + /* Keep track of whether the queue list has been initialized. */ + static BaseType_t xQueueListInitialized = pdFALSE; + + /* Check if queue list needs to be initialized. */ + if( xQueueListInitialized == pdFALSE ) + { + /* Initialization must be in a critical section to prevent two threads + * from initializing at the same time. */ + esp_os_enter_critical( &critical_section_lock ); + + /* Check again that queue list is still uninitialized, i.e. it wasn't + * initialized while this function was waiting to enter the critical + * section. */ + if( xQueueListInitialized == pdFALSE ) + { + /* Initialize the queue list mutex and list head. */ + ( void ) xSemaphoreCreateMutexStatic( &xQueueListMutex ); + listINIT_HEAD( &xQueueListHead ); + xQueueListInitialized = pdTRUE; + } + + /* Exit the critical section. */ + esp_os_exit_critical( &critical_section_lock ); + } +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvValidateQueueName( const char * const pcName, + size_t * pxNameLength ) +{ + BaseType_t xStatus = pdTRUE; + size_t xNameLength = 0; + + /* All message queue names must start with '/'. */ + if( pcName[ 0 ] != '/' ) + { + xStatus = pdFALSE; + } + else + { + /* Get the length of pcName, excluding the first '/' and null-terminator. */ + xNameLength = UTILS_strnlen( pcName, NAME_MAX + 2 ); + + if( xNameLength == NAME_MAX + 2 ) + { + /* Name too long. */ + xStatus = pdFALSE; + } + else + { + /* Name length passes, set output parameter. */ + *pxNameLength = xNameLength; + } + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +int mq_close( mqd_t mqdes ) +{ + int iStatus = 0; + QueueListElement_t * pxMessageQueue = ( QueueListElement_t * ) mqdes; + BaseType_t xQueueRemoved = pdFALSE; + + /* Initialize the queue list, if needed. */ + prvInitializeQueueList(); + + /* Lock the mutex that guards access to the queue list. This call will + * never fail because it blocks forever. */ + ( void ) xSemaphoreTake( ( SemaphoreHandle_t ) &xQueueListMutex, portMAX_DELAY ); + + /* Attempt to find the message queue based on the given descriptor. */ + if( prvFindQueueInList( NULL, NULL, mqdes ) == pdTRUE ) + { + /* Decrement the number of open descriptors. */ + if( pxMessageQueue->xOpenDescriptors > 0 ) + { + pxMessageQueue->xOpenDescriptors--; + } + + /* Check if the queue has any more open descriptors. */ + if( pxMessageQueue->xOpenDescriptors == 0 ) + { + /* If no open descriptors remain and mq_unlink has already been called, + * remove the queue. */ + if( pxMessageQueue->xPendingUnlink == pdTRUE ) + { + listREMOVE( &pxMessageQueue->xLink ); + + /* Set the flag to delete the queue. Deleting the queue is deferred + * until xQueueListMutex is released. */ + xQueueRemoved = pdTRUE; + } + /* Otherwise, wait for the call to mq_unlink. */ + else + { + pxMessageQueue->xPendingUnlink = pdTRUE; + } + } + } + else + { + /* Queue not found; bad descriptor. */ + errno = EBADF; + iStatus = -1; + } + + /* Release the mutex protecting the queue list. */ + ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &xQueueListMutex ); + + /* Delete all resources used by the queue if needed. */ + if( xQueueRemoved == pdTRUE ) + { + prvDeleteMessageQueue( pxMessageQueue ); + } + + return iStatus; +} + +/*-----------------------------------------------------------*/ + +int mq_getattr( mqd_t mqdes, + struct mq_attr * mqstat ) +{ + int iStatus = 0; + QueueListElement_t * pxMessageQueue = ( QueueListElement_t * ) mqdes; + + /* Lock the mutex that guards access to the queue list. This call will + * never fail because it blocks forever. */ + ( void ) xSemaphoreTake( ( SemaphoreHandle_t ) &xQueueListMutex, portMAX_DELAY ); + + /* Find the mq referenced by mqdes. */ + if( prvFindQueueInList( NULL, NULL, mqdes ) == pdTRUE ) + { + /* Update the number of messages in the queue and copy the attributes + * into mqstat. */ + pxMessageQueue->xAttr.mq_curmsgs = ( long ) uxQueueMessagesWaiting( pxMessageQueue->xQueue ); + *mqstat = pxMessageQueue->xAttr; + } + else + { + /* Queue not found; bad descriptor. */ + errno = EBADF; + iStatus = -1; + } + + /* Release the mutex protecting the queue list. */ + ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &xQueueListMutex ); + + return iStatus; +} + +/*-----------------------------------------------------------*/ + +/* Changed function signature and argument processing to match the POSIX standard */ +mqd_t mq_open( const char * name, + int oflag, + ... ) +{ + mode_t mode = 0; + struct mq_attr * attr = NULL; + + if( oflag & O_CREAT ) + { + va_list args; + va_start( args, oflag ); + mode = va_arg( args, mode_t ); + attr = va_arg( args, struct mq_attr * ); + va_end( args ); + } + + mqd_t xMessageQueue = NULL; + size_t xNameLength = 0; + + /* Default mq_attr. */ + struct mq_attr xQueueCreationAttr = + { + .mq_flags = 0, + .mq_maxmsg = posixconfigMQ_MAX_MESSAGES, + .mq_msgsize = posixconfigMQ_MAX_SIZE, + .mq_curmsgs = 0 + }; + + /* Silence warnings about unused parameters. */ + ( void ) mode; + + /* Initialize the queue list, if needed. */ + prvInitializeQueueList(); + + /* Check queue name. */ + if( prvValidateQueueName( name, &xNameLength ) == pdFALSE ) + { + /* Invalid name. */ + errno = EINVAL; + xMessageQueue = ( mqd_t ) -1; + } + + /* Check attributes, if O_CREATE is specified and attr is given. */ + if( xMessageQueue == NULL ) + { + if( ( oflag & O_CREAT ) && ( attr != NULL ) && ( ( attr->mq_maxmsg <= 0 ) || ( attr->mq_msgsize <= 0 ) ) ) + { + /* Invalid mq_attr.mq_maxmsg or mq_attr.mq_msgsize. */ + errno = EINVAL; + xMessageQueue = ( mqd_t ) -1; + } + } + + if( xMessageQueue == NULL ) + { + /* Lock the mutex that guards access to the queue list. This call will + * never fail because it blocks forever. */ + ( void ) xSemaphoreTake( ( SemaphoreHandle_t ) &xQueueListMutex, portMAX_DELAY ); + + /* Search the queue list to check if the queue exists. */ + if( prvFindQueueInList( ( QueueListElement_t ** ) &xMessageQueue, + name, + ( mqd_t ) NULL ) == pdTRUE ) + { + /* If the mq exists, check that this function wasn't called with + * O_CREAT and O_EXCL. */ + if( ( oflag & O_EXCL ) && ( oflag & O_CREAT ) ) + { + errno = EEXIST; + xMessageQueue = ( mqd_t ) -1; + } + else + { + /* Check if the mq has been unlinked and is pending removal. */ + if( ( ( QueueListElement_t * ) xMessageQueue )->xPendingUnlink == pdTRUE ) + { + /* Queue pending deletion. Don't allow it to be re-opened. */ + errno = EINVAL; + xMessageQueue = ( mqd_t ) -1; + } + else + { + /* Increase count of open file descriptors for queue. */ + ( ( QueueListElement_t * ) xMessageQueue )->xOpenDescriptors++; + } + } + } + /* Queue does not exist. */ + else + { + /* Only create the new queue if O_CREAT was specified. */ + if( oflag & O_CREAT ) + { + /* Copy attributes if provided. */ + if( attr != NULL ) + { + xQueueCreationAttr = *attr; + } + + /* Copy oflags. */ + xQueueCreationAttr.mq_flags = ( long ) oflag; + + /* Create the new message queue. */ + if( prvCreateNewMessageQueue( ( QueueListElement_t ** ) &xMessageQueue, + &xQueueCreationAttr, + name, + xNameLength ) == pdFALSE ) + { + errno = ENOSPC; + xMessageQueue = ( mqd_t ) -1; + } + } + else + { + errno = ENOENT; + xMessageQueue = ( mqd_t ) -1; + } + } + + /* Release the mutex protecting the queue list. */ + ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &xQueueListMutex ); + } + + return xMessageQueue; +} + +/*-----------------------------------------------------------*/ + +ssize_t mq_receive( mqd_t mqdes, + char * msg_ptr, + size_t msg_len, + unsigned int * msg_prio ) +{ + return mq_timedreceive( mqdes, msg_ptr, msg_len, msg_prio, NULL ); +} + +/*-----------------------------------------------------------*/ + +int mq_send( mqd_t mqdes, + const char * msg_ptr, + size_t msg_len, + unsigned msg_prio ) +{ + return mq_timedsend( mqdes, msg_ptr, msg_len, msg_prio, NULL ); +} + +/*-----------------------------------------------------------*/ + +ssize_t mq_timedreceive( mqd_t mqdes, + char * msg_ptr, + size_t msg_len, + unsigned * msg_prio, + const struct timespec * abstime ) +{ + ssize_t xStatus = 0; + int iCalculateTimeoutReturn = 0; + TickType_t xTimeoutTicks = 0; + QueueListElement_t * pxMessageQueue = ( QueueListElement_t * ) mqdes; + QueueElement_t xReceiveData = { 0 }; + + /* Silence warnings about unused parameters. */ + ( void ) msg_prio; + + /* Lock the mutex that guards access to the queue list. This call will + * never fail because it blocks forever. */ + ( void ) xSemaphoreTake( ( SemaphoreHandle_t ) &xQueueListMutex, portMAX_DELAY ); + + /* Find the mq referenced by mqdes. */ + if( prvFindQueueInList( NULL, NULL, mqdes ) == pdFALSE ) + { + /* Queue not found; bad descriptor. */ + errno = EBADF; + xStatus = -1; + } + + /* Verify that msg_len is large enough. */ + if( xStatus == 0 ) + { + if( msg_len < ( size_t ) pxMessageQueue->xAttr.mq_msgsize ) + { + /* msg_len too small. */ + errno = EMSGSIZE; + xStatus = -1; + } + } + + if( xStatus == 0 ) + { + /* Convert abstime to a tick timeout. */ + iCalculateTimeoutReturn = prvCalculateTickTimeout( pxMessageQueue->xAttr.mq_flags, + abstime, + &xTimeoutTicks ); + + if( iCalculateTimeoutReturn != 0 ) + { + errno = iCalculateTimeoutReturn; + xStatus = -1; + } + } + + /* Release the mutex protecting the queue list. */ + ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &xQueueListMutex ); + + if( xStatus == 0 ) + { + /* Receive data from the FreeRTOS queue. */ + if( xQueueReceive( pxMessageQueue->xQueue, + &xReceiveData, + xTimeoutTicks ) == pdFALSE ) + { + /* If queue receive fails, set the appropriate errno. */ + if( pxMessageQueue->xAttr.mq_flags & O_NONBLOCK ) + { + /* Set errno to EAGAIN for nonblocking mq. */ + errno = EAGAIN; + } + else + { + /* Otherwise, set errno to ETIMEDOUT. */ + errno = ETIMEDOUT; + } + + xStatus = -1; + } + } + + if( xStatus == 0 ) + { + /* Get the length of data for return value. */ + xStatus = ( ssize_t ) xReceiveData.xDataSize; + + /* Copy received data into given buffer, then free it. */ + ( void ) memcpy( msg_ptr, xReceiveData.pcData, xReceiveData.xDataSize ); + vPortFree( xReceiveData.pcData ); + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +int mq_timedsend( mqd_t mqdes, + const char * msg_ptr, + size_t msg_len, + unsigned int msg_prio, + const struct timespec * abstime ) +{ + int iStatus = 0, iCalculateTimeoutReturn = 0; + TickType_t xTimeoutTicks = 0; + QueueListElement_t * pxMessageQueue = ( QueueListElement_t * ) mqdes; + QueueElement_t xSendData = { 0 }; + + /* Silence warnings about unused parameters. */ + ( void ) msg_prio; + + /* Lock the mutex that guards access to the queue list. This call will + * never fail because it blocks forever. */ + ( void ) xSemaphoreTake( ( SemaphoreHandle_t ) &xQueueListMutex, portMAX_DELAY ); + + /* Find the mq referenced by mqdes. */ + if( prvFindQueueInList( NULL, NULL, mqdes ) == pdFALSE ) + { + /* Queue not found; bad descriptor. */ + errno = EBADF; + iStatus = -1; + } + + /* Verify that mq_msgsize is large enough. */ + if( iStatus == 0 ) + { + if( msg_len > ( size_t ) pxMessageQueue->xAttr.mq_msgsize ) + { + /* msg_len too large. */ + errno = EMSGSIZE; + iStatus = -1; + } + } + + if( iStatus == 0 ) + { + /* Convert abstime to a tick timeout. */ + iCalculateTimeoutReturn = prvCalculateTickTimeout( pxMessageQueue->xAttr.mq_flags, + abstime, + &xTimeoutTicks ); + + if( iCalculateTimeoutReturn != 0 ) + { + errno = iCalculateTimeoutReturn; + iStatus = -1; + } + } + + /* Release the mutex protecting the queue list. */ + ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &xQueueListMutex ); + + /* Allocate memory for the message. */ + if( iStatus == 0 ) + { + xSendData.xDataSize = msg_len; + xSendData.pcData = pvPortMalloc( msg_len ); + + /* Check that memory allocation succeeded. */ + if( xSendData.pcData == NULL ) + { + /* msg_len too large. */ + errno = EMSGSIZE; + iStatus = -1; + } + else + { + /* Copy the data to send. */ + ( void ) memcpy( xSendData.pcData, msg_ptr, msg_len ); + } + } + + if( iStatus == 0 ) + { + /* Send data to the FreeRTOS queue. */ + if( xQueueSend( pxMessageQueue->xQueue, + &xSendData, + xTimeoutTicks ) == pdFALSE ) + { + /* If queue send fails, set the appropriate errno. */ + if( pxMessageQueue->xAttr.mq_flags & O_NONBLOCK ) + { + /* Set errno to EAGAIN for nonblocking mq. */ + errno = EAGAIN; + } + else + { + /* Otherwise, set errno to ETIMEDOUT. */ + errno = ETIMEDOUT; + } + + /* Free the allocated queue data. */ + vPortFree( xSendData.pcData ); + + iStatus = -1; + } + } + + return iStatus; +} + +/*-----------------------------------------------------------*/ + +int mq_unlink( const char * name ) +{ + int iStatus = 0; + size_t xNameSize = 0; + BaseType_t xQueueRemoved = pdFALSE; + QueueListElement_t * pxMessageQueue = NULL; + + /* Initialize the queue list, if needed. */ + prvInitializeQueueList(); + + /* Check queue name. */ + if( prvValidateQueueName( name, &xNameSize ) == pdFALSE ) + { + /* Error with mq name. */ + errno = EINVAL; + iStatus = -1; + } + + if( iStatus == 0 ) + { + /* Lock the mutex that guards access to the queue list. This call will + * never fail because it blocks forever. */ + ( void ) xSemaphoreTake( ( SemaphoreHandle_t ) &xQueueListMutex, portMAX_DELAY ); + + /* Check if the named queue exists. */ + if( prvFindQueueInList( &pxMessageQueue, name, ( mqd_t ) NULL ) == pdTRUE ) + { + /* If the queue exists and there are no open descriptors to it, + * remove it from the list. */ + if( pxMessageQueue->xOpenDescriptors == 0 ) + { + listREMOVE( &pxMessageQueue->xLink ); + + /* Set the flag to delete the queue. Deleting the queue is deferred + * until xQueueListMutex is released. */ + xQueueRemoved = pdTRUE; + } + else + { + /* If the queue has open descriptors, set the pending unlink flag + * so that mq_close will free its resources. */ + pxMessageQueue->xPendingUnlink = pdTRUE; + } + } + else + { + /* The named message queue doesn't exist. */ + errno = ENOENT; + iStatus = -1; + } + + /* Release the mutex protecting the queue list. */ + ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &xQueueListMutex ); + } + + /* Delete all resources used by the queue if needed. */ + if( xQueueRemoved == pdTRUE ) + { + prvDeleteMessageQueue( pxMessageQueue ); + } + + return iStatus; +} + +/* specified but not implemented functions, return ENOSYS */ +int mq_notify( mqd_t, + const struct sigevent * ) +{ + return ENOSYS; +} + +int mq_setattr( mqd_t, + const struct mq_attr * restrict, + struct mq_attr * restrict ) +{ + return ENOSYS; +} + +/*-----------------------------------------------------------*/ diff --git a/components/rt/FreeRTOS_POSIX_utils.c b/components/rt/FreeRTOS_POSIX_utils.c new file mode 100644 index 00000000000..d9d30fa409f --- /dev/null +++ b/components/rt/FreeRTOS_POSIX_utils.c @@ -0,0 +1,249 @@ +/* + * Amazon FreeRTOS+POSIX V1.0.0 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/** + * @file FreeRTOS_POSIX_utils.c + * @brief Implementation of utility functions in utils.h + */ + +/* C standard library includes. */ +#include + +#include /* Added by Espressif */ +#include +#include + +/* FreeRTOS+POSIX includes. */ +#include "FreeRTOS_POSIX.h" +#include "FreeRTOS_POSIX/utils.h" + +/*-----------------------------------------------------------*/ + +/* This function has been modified from the original by Espressif */ +size_t UTILS_strnlen( const char * const pcString, + size_t xMaxLength ) +{ + return strnlen( pcString, xMaxLength ); +} + +/*-----------------------------------------------------------*/ + +int UTILS_AbsoluteTimespecToTicks( const struct timespec * const pxAbsoluteTime, + TickType_t * const pxResult ) +{ + int iStatus = 0; + struct timespec xCurrentTime = { 0 }, xDifference = { 0 }; + + /* Check parameters. */ + if( ( pxAbsoluteTime == NULL ) || ( pxResult == NULL ) ) + { + iStatus = EINVAL; + } + + /* Get the current time. */ + if( iStatus == 0 ) + { + if( clock_gettime( CLOCK_REALTIME, &xCurrentTime ) != 0 ) + { + iStatus = errno; + } + } + + /* Calculate the difference between the current time and pxAbsoluteTime. */ + if( iStatus == 0 ) + { + if( UTILS_TimespecSubtract( &xDifference, pxAbsoluteTime, &xCurrentTime ) != 0 ) + { + /* pxAbsoluteTime was in the past. */ + iStatus = ETIMEDOUT; + } + } + + /* Convert the time difference to ticks. */ + if( iStatus == 0 ) + { + iStatus = UTILS_TimespecToTicks( &xDifference, pxResult ); + } + + return iStatus; +} + +/*-----------------------------------------------------------*/ + +int UTILS_TimespecToTicks( const struct timespec * const pxTimespec, + TickType_t * const pxResult ) +{ + int iStatus = 0; + uint64_t ullTotalTicks = 0; + long lNanoseconds = 0; + + /* Check parameters. */ + if( ( pxTimespec == NULL ) || ( pxResult == NULL ) ) + { + iStatus = EINVAL; + } + else if( ( pxTimespec != NULL ) && ( UTILS_ValidateTimespec( pxTimespec ) == false ) ) + { + iStatus = EINVAL; + } + + if( iStatus == 0 ) + { + /* Convert timespec.tv_sec to ticks. */ + ullTotalTicks = ( uint64_t ) configTICK_RATE_HZ * ( uint64_t ) ( pxTimespec->tv_sec ); + + /* Convert timespec.tv_nsec to ticks. This value does not have to be checked + * for overflow because a valid timespec has 0 <= tv_nsec < 1000000000 and + * NANOSECONDS_PER_TICK > 1. */ + lNanoseconds = pxTimespec->tv_nsec / ( long ) NANOSECONDS_PER_TICK + /* Whole nanoseconds. */ + ( long ) ( pxTimespec->tv_nsec % ( long ) NANOSECONDS_PER_TICK != 0 ); /* Add 1 to round up if needed. */ + + /* Add the nanoseconds to the total ticks. */ + ullTotalTicks += ( uint64_t ) lNanoseconds; + + /* Write result. */ + *pxResult = ( TickType_t ) ullTotalTicks; + } + + return iStatus; +} + +/*-----------------------------------------------------------*/ + +void UTILS_NanosecondsToTimespec( int64_t llSource, + struct timespec * const pxDestination ) +{ + long lCarrySec = 0; + + /* Convert to timespec. */ + pxDestination->tv_sec = ( time_t ) ( llSource / NANOSECONDS_PER_SECOND ); + pxDestination->tv_nsec = ( long ) ( llSource % NANOSECONDS_PER_SECOND ); + + /* Subtract from tv_sec if tv_nsec < 0. */ + if( pxDestination->tv_nsec < 0L ) + { + /* Compute the number of seconds to carry. */ + lCarrySec = ( pxDestination->tv_nsec / ( long ) NANOSECONDS_PER_SECOND ) + 1L; + + pxDestination->tv_sec -= ( time_t ) ( lCarrySec ); + pxDestination->tv_nsec += lCarrySec * ( long ) NANOSECONDS_PER_SECOND; + } +} + +/*-----------------------------------------------------------*/ + +int UTILS_TimespecAdd( struct timespec * const pxResult, + const struct timespec * const x, + const struct timespec * const y ) +{ + int64_t llResult64 = 0; + + /* Check parameters. */ + if( ( pxResult == NULL ) || ( x == NULL ) || ( y == NULL ) ) + { + return -1; + } + + /* Perform addition. */ + llResult64 = ( ( ( int64_t ) ( x->tv_sec ) * NANOSECONDS_PER_SECOND ) + ( int64_t ) ( x->tv_nsec ) ) + + ( ( ( int64_t ) ( y->tv_sec ) * NANOSECONDS_PER_SECOND ) + ( int64_t ) ( y->tv_nsec ) ); + + /* Convert result to timespec. */ + UTILS_NanosecondsToTimespec( llResult64, pxResult ); + + return ( int ) ( llResult64 < 0LL ); +} + +/*-----------------------------------------------------------*/ + +int UTILS_TimespecAddNanoseconds( struct timespec * const pxResult, + const struct timespec * const x, + int64_t llNanoseconds ) +{ + struct timespec y = { .tv_sec = ( time_t ) 0, .tv_nsec = 0L }; + + /* Check parameters. */ + if( ( pxResult == NULL ) || ( x == NULL ) ) + { + return -1; + } + + /* Convert llNanoseconds to a timespec. */ + UTILS_NanosecondsToTimespec( llNanoseconds, &y ); + + /* Perform addition. */ + return UTILS_TimespecAdd( pxResult, x, &y ); +} + +/*-----------------------------------------------------------*/ + +int UTILS_TimespecSubtract( struct timespec * const pxResult, + const struct timespec * const x, + const struct timespec * const y ) +{ + int64_t llResult64 = 0; + + /* Check parameters. */ + if( ( pxResult == NULL ) || ( x == NULL ) || ( y == NULL ) ) + { + return -1; + } + + /* Perform addition. */ + llResult64 = ( ( ( int64_t ) ( x->tv_sec ) * NANOSECONDS_PER_SECOND ) + ( int64_t ) ( x->tv_nsec ) ) + - ( ( ( int64_t ) ( y->tv_sec ) * NANOSECONDS_PER_SECOND ) + ( int64_t ) ( y->tv_nsec ) ); + + /* Convert result to timespec. */ + UTILS_NanosecondsToTimespec( llResult64, pxResult ); + + return ( int ) ( llResult64 < 0LL ); +} + +/*-----------------------------------------------------------*/ + +bool UTILS_ValidateTimespec( const struct timespec * const pxTimespec ) +{ + bool xReturn = false; + + if( pxTimespec != NULL ) + { + /* Verify 0 <= tv_nsec < 1000000000. */ + if( ( pxTimespec->tv_nsec >= 0 ) && + ( pxTimespec->tv_nsec < NANOSECONDS_PER_SECOND ) ) + { + xReturn = true; + } + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ diff --git a/components/rt/idf_changes.md b/components/rt/idf_changes.md new file mode 100644 index 00000000000..06bdf14f5d6 --- /dev/null +++ b/components/rt/idf_changes.md @@ -0,0 +1,46 @@ +# ESP-IDF Changes + +This document is used to track all changes made to the FreeRTOS-Plus-POSIX V1.0.0 source code used in ESP-IDF. + +## License Headers + +- Added `SPDX-FileCopyrightText` and `SPDX-FileContributor` tags to all files to pass ESP-IDF pre-commit checks. + +## POSIX errno + +Instead of relying on the FreeRTOS `errno` scheme by enabling `configUSE_POSIX_ERRNO`, the `errno` provided by newlib is used. `configUSE_POSIX_ERRNO` should stay disabled. + +## API Changes + +`mq_open()` has been changed to make the arguments `mode` and `attr` optional, as specified by [POSIX](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_open.html). + +The following functions are stubs and always return `ENOSYS`: +* `mq_notify()` +* `mq_setattr()` + +## Header File Organization + +In the original FreeRTOS-Plus-POSIX project, the POSIX header files are provided in the sub directory `FreeRTOS-Plus-POSIX`. In ESP-IDF, however, the POSIX header files do not need any prefix. This increases compatibility with applications originally written for other platforms. All files originating from the FreeRTOS-Plus-POSIX project have been modified to reflect the different include path. + +Wherever possible, ESP-IDF is using header files from newlib instead of the header files from FreeRTOS-Plus-POSIX. + +In some cases, additional includes have been added to files from FreeRTOS-Plus-POSIX to simplify building. + +## Critical Sections + +The critical sections have been changed according to the ESP-IDF critical section API. + +## Definitions + +The following definitions have been added to the private include `utils.h`: +``` +MICROSECONDS_PER_SECOND +NANOSECONDS_PER_SECOND +NANOSECONDS_PER_TICK +``` + +In FreeRTOS-Plus-POSIX, they are located in the custom `time.h`, but ESP-IDF uses newlib's `time.h`, where these definitions are not present. + +## Code Format + +- Files have been formatted by [`uncrustify`](https://github.com/uncrustify/uncrustify), using [FreeRTOS' `uncrustify.cfc`](../freertos/FreeRTOS-Kernel/uncrustify.cfg). diff --git a/components/rt/include/mqueue.h b/components/rt/include/mqueue.h new file mode 100644 index 00000000000..c0927cc6a9b --- /dev/null +++ b/components/rt/include/mqueue.h @@ -0,0 +1,155 @@ +/* + * Amazon FreeRTOS+POSIX V1.0.0 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/** + * @file mqueue.h + * @brief Message queues. + * + * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/mqueue.h.html + */ + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Message queue descriptor. + */ +typedef void * mqd_t; + +/** + * @brief Message queue attributes. + */ +struct mq_attr +{ + long mq_flags; /**< Message queue flags. */ + long mq_maxmsg; /**< Maximum number of messages. */ + long mq_msgsize; /**< Maximum message size. */ + long mq_curmsgs; /**< Number of messages currently queued. */ +}; + +/** + * @brief Close a message queue. + * + * Please refer to http://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_close.html for more details. + */ +int mq_close( mqd_t mqdes ); + +/** + * @brief Get message queue attributes. + * + * Please refer to http://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_getattr.html for more details. + */ +int mq_getattr( mqd_t mqdes, + struct mq_attr * mqstat ); + +/** + * @brief Open a message queue. + * + * Please refer to http://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_open.html for more details. + * + * @note Supported name pattern: leading <slash> character in name is always required; + * the maximum length (excluding null-terminator) of the name argument can be NAME_MAX + 2. + * @note mode argument is not supported. + * @note Supported oflags: O_RDWR, O_CREAT, O_EXCL, and O_NONBLOCK. + */ +mqd_t mq_open( const char * name, + int oflag, + ... ); + +/** + * @brief Receive a message from a message queue. + * + * Please refer to http://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_receive.html for more details. + * + * @note msg_prio argument is not supported. Messages are not checked for corruption. + */ +ssize_t mq_receive( mqd_t mqdes, + char * msg_ptr, + size_t msg_len, + unsigned int * msg_prio ); + +/** + * @brief Send a message to a message queue. + * + * Please refer to http://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_send.html for more details. + * + * @note msg_prio argument is not supported. + */ +int mq_send( mqd_t mqdes, + const char * msg_ptr, + size_t msg_len, + unsigned msg_prio ); + +/** + * @brief Receive a message from a message queue with timeout. + * + * Please refer to http://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_timedreceive.html for more details. + * + * @note msg_prio argument is not supported. Messages are not checked for corruption. + */ +ssize_t mq_timedreceive( mqd_t mqdes, + char * msg_ptr, + size_t msg_len, + unsigned * msg_prio, + const struct timespec * abstime ); + +/** + * @brief Send a message to a message queue with timeout. + * + * Please refer to http://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_timedsend.html for more details. + * + * @note msg_prio argument is not supported. + */ +int mq_timedsend( mqd_t mqdes, + const char * msg_ptr, + size_t msg_len, + unsigned msg_prio, + const struct timespec * abstime ); + +/** + * @brief Remove a message queue. + * + * Please refer to http://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_unlink.html for more details. + */ +int mq_unlink( const char * name ); + +/* Added by Espressif - specified but not implemented functions, return ENOSYS */ +int mq_notify( mqd_t, const struct sigevent * ); +int mq_setattr( mqd_t, const struct mq_attr *, struct mq_attr * ); + +#ifdef __cplusplus +} +#endif diff --git a/components/rt/private_include/FreeRTOS_POSIX.h b/components/rt/private_include/FreeRTOS_POSIX.h new file mode 100644 index 00000000000..87d2e9b1e5b --- /dev/null +++ b/components/rt/private_include/FreeRTOS_POSIX.h @@ -0,0 +1,56 @@ +/* + * Amazon FreeRTOS+POSIX V1.0.0 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/** + * @file FreeRTOS_POSIX.h + * @brief FreeRTOS+POSIX header. + * + * This file must be included before all other FreeRTOS+POSIX includes. + */ + +#ifndef _FREERTOS_POSIX_H_ +#define _FREERTOS_POSIX_H_ + +/* FreeRTOS+POSIX platform-specific configuration headers. */ +#include "FreeRTOS_POSIX_portable.h" +#include "portable/FreeRTOS_POSIX_portable_default.h" + +/* FreeRTOS includes. */ +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "freertos/semphr.h" +#include "freertos/task.h" + +/* FreeRTOS+POSIX data types and internal structs. */ +#include +#include "FreeRTOS_POSIX_internal.h" + +#endif /* _FREERTOS_POSIX_H_ */ diff --git a/components/rt/private_include/FreeRTOS_POSIX/utils.h b/components/rt/private_include/FreeRTOS_POSIX/utils.h new file mode 100644 index 00000000000..8f748eaee41 --- /dev/null +++ b/components/rt/private_include/FreeRTOS_POSIX/utils.h @@ -0,0 +1,149 @@ +/* + * Amazon FreeRTOS+POSIX V1.0.0 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/** + * @file utils.h + * @brief Utility functions used by FreeRTOS+POSIX. + */ + +#ifndef _FREERTOS_POSIX_UTILS_ +#define _FREERTOS_POSIX_UTILS_ + +/* C standard library includes. */ +#include +#include + +#include + +#define MICROSECONDS_PER_SECOND ( 1000000LL ) /**< Microseconds per second. */ +#define NANOSECONDS_PER_SECOND ( 1000000000LL ) /**< Nanoseconds per second. */ +#define NANOSECONDS_PER_TICK ( NANOSECONDS_PER_SECOND / configTICK_RATE_HZ ) + +/** + * @brief Calculates the length of pcString, up to xMaxLength. + * + * @param[in] pcString The string to find the length of. + * @param[in] xMaxLength The limit when searching for the end of pcString. + * + * @return 0 if pcString is NULL; otherwise, the length of pcString or xMaxLength, + * whichever is smaller. + */ +size_t UTILS_strnlen( const char * const pcString, + size_t xMaxLength ); + +/** + * @brief Calculates the number of ticks between now and a given timespec. + * + * @param[in] pxAbsoluteTime A time in the future, specified as seconds and + * nanoseconds since CLOCK_REALTIME's 0. + * @param[out] pxResult Where the result of the conversion is stored. The result + * is rounded up for fractional ticks. + * + * @return 0 on success. Otherwise, ETIMEDOUT if pxAbsoluteTime is in the past, + * or EINVAL for invalid parameters. + */ +int UTILS_AbsoluteTimespecToTicks( const struct timespec * const pxAbsoluteTime, + TickType_t * const pxResult ); + +/** + * @brief Converts a struct timespec to FreeRTOS ticks. + * + * @param[in] pxTimespec The timespec to convert. + * @param[out] pxResult Where the result of the conversion is stored. The result is rounded + * up for fractional ticks. + * + * @return 0 on success. Otherwise, EINVAL for invalid parameters. + */ +int UTILS_TimespecToTicks( const struct timespec * const pxTimespec, + TickType_t * const pxResult ); + +/** + * @brief Converts an integer value to a timespec. + * + * @param[in] llSource The value to convert. + * @param[out] pxDestination Where to store the converted value. + * + * @return No return value. + */ +void UTILS_NanosecondsToTimespec( int64_t llSource, + struct timespec * const pxDestination ); + +/** + * @brief Calculates pxResult = x + y. + * + * @param[out] pxResult Where the result of the calculation is stored. + * @param[in] x The first argument for addition. + * @param[in] y The second argument for addition. + * + * @return -1 if any argument was NULL; 1 if result is negative; otherwise, 0. + */ +int UTILS_TimespecAdd( struct timespec * const pxResult, + const struct timespec * const x, + const struct timespec * const y ); + +/** + * @brief Calculates pxResult = x + ( struct timespec ) nanosec. + * + * @param[out] pxResult Where the result of the calculation is stored. + * @param[in] x The first argument for addition. + * @param[in] llNanoseconds The second argument for addition. + * + * @return -1 if pxResult or x was NULL; 1 if result is negative; otherwise, 0. + */ +int UTILS_TimespecAddNanoseconds( struct timespec * const pxResult, + const struct timespec * const x, + int64_t llNanoseconds ); + +/** + * @brief Calculates pxResult = x - y. + * + * @param[out] pxResult Where the result of the calculation is stored. + * @param[in] x The first argument for subtraction. + * @param[in] y The second argument for subtraction. + * + * @return -1 if any argument was NULL; 1 if result is negative; otherwise, 0. + */ +int UTILS_TimespecSubtract( struct timespec * const pxResult, + const struct timespec * const x, + const struct timespec * const y ); + +/** + * @brief Checks that a timespec conforms to POSIX. + * + * A valid timespec must have 0 <= tv_nsec < 1000000000. + * + * @param[in] pxTimespec The timespec to validate. + * + * @return true if the pxTimespec is valid, false otherwise. + */ +bool UTILS_ValidateTimespec( const struct timespec * const pxTimespec ); + +#endif /* ifndef _FREERTOS_POSIX_UTILS_ */ diff --git a/components/rt/private_include/FreeRTOS_POSIX_internal.h b/components/rt/private_include/FreeRTOS_POSIX_internal.h new file mode 100644 index 00000000000..ecabbfc9944 --- /dev/null +++ b/components/rt/private_include/FreeRTOS_POSIX_internal.h @@ -0,0 +1,101 @@ +/* + * Amazon FreeRTOS+POSIX V1.0.0 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +#ifndef _FREERTOS_POSIX_INTERNAL_H_ +#define _FREERTOS_POSIX_INTERNAL_H_ + +/** + * @file FreeRTOS_POSIX_internal.h + * @brief Internal structs and initializers for FreeRTOS+POSIX. + */ + +/* Amazon FreeRTOS includes. */ +#include "aws_doubly_linked_list.h" + +/** + * @brief Mutex attribute object. + */ +typedef struct pthread_mutexattr_internal +{ + int iType; /**< Mutex type. */ +} pthread_mutexattr_internal_t; + +/** + * @brief Mutex. + */ +typedef struct pthread_mutex_internal +{ + BaseType_t xIsInitialized; /**< Set to pdTRUE if this mutex is initialized, pdFALSE otherwise. */ + StaticSemaphore_t xMutex; /**< FreeRTOS mutex. */ + TaskHandle_t xTaskOwner; /**< Owner; used for deadlock detection and permission checks. */ + pthread_mutexattr_internal_t xAttr; /**< Mutex attributes. */ +} pthread_mutex_internal_t; + +/** + * @brief Compile-time initializer of pthread_mutex_internal_t. + */ +#define FREERTOS_POSIX_MUTEX_INITIALIZER \ + ( &( ( pthread_mutex_internal_t ) \ + { \ + .xIsInitialized = pdFALSE, \ + .xMutex = { { 0 } }, \ + .xTaskOwner = NULL, \ + .xAttr = { .iType = 0 } \ + } \ + ) \ + ) + +/** + * @brief Condition variable. + */ +typedef struct pthread_cond_internal +{ + BaseType_t xIsInitialized; /**< Set to pdTRUE if this condition variable is initialized, pdFALSE otherwise. */ + StaticSemaphore_t xCondMutex; /**< Prevents concurrent accesses to iWaitingThreads. */ + StaticSemaphore_t xCondWaitSemaphore; /**< Threads block on this semaphore in pthread_cond_wait. */ + int iWaitingThreads; /**< The number of threads currently waiting on this condition variable. */ +} pthread_cond_internal_t; + +/** + * @brief Compile-time initializer of pthread_cond_internal_t. + */ +#define FREERTOS_POSIX_COND_INITIALIZER \ + ( &( ( pthread_cond_internal_t ) \ + { \ + .xIsInitialized = pdFALSE, \ + .xCondMutex = { { 0 } }, \ + .xCondWaitSemaphore = { { 0 } }, \ + .iWaitingThreads = 0 \ + } \ + ) \ + ) + +#endif /* _FREERTOS_POSIX_INTERNAL_H_ */ diff --git a/components/rt/private_include/FreeRTOS_POSIX_portable.h b/components/rt/private_include/FreeRTOS_POSIX_portable.h new file mode 100644 index 00000000000..291f72f5716 --- /dev/null +++ b/components/rt/private_include/FreeRTOS_POSIX_portable.h @@ -0,0 +1,59 @@ +/* + * Amazon FreeRTOS+POSIX V1.0.0 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/** + * @file FreeRTOS_POSIX_portable.h + * @brief Port-specific configuration of FreeRTOS+POSIX. + */ + +#ifndef _FREERTOS_POSIX_PORTABLE_H_ +#define _FREERTOS_POSIX_PORTABLE_H_ + +/* ESP-IDF already defines the following types. */ +#define posixconfigENABLE_CLOCK_T 0 +#define posixconfigENABLE_CLOCKID_T 0 +#define posixconfigENABLE_MODE_T 0 +#define posixconfigENABLE_PTHREAD_ATTR_T 0 +#define posixconfigENABLE_PTHREAD_COND_T 0 +#define posixconfigENABLE_PTHREAD_CONDATTR_T 0 +#define posixconfigENABLE_PTHREAD_MUTEX_T 0 +#define posixconfigENABLE_PTHREAD_MUTEXATTR_T 0 +#define posixconfigENABLE_PTHREAD_T 0 +#define posixconfigENABLE_TIME_T 0 +#define posixconfigENABLE_TIMER_T 0 +#define posixconfigENABLE_TIMESPEC 0 +#define posixconfigENABLE_ITIMERSPEC 0 + +/* ESP-IDF already provides the header sched.h. Exclude them by + * activating the double inclusion guards. */ +#define _FREERTOS_POSIX_SCHED_H_ + +#endif /* _FREERTOS_POSIX_PORTABLE_H_ */ diff --git a/components/rt/private_include/aws_doubly_linked_list.h b/components/rt/private_include/aws_doubly_linked_list.h new file mode 100644 index 00000000000..9e5a0b347be --- /dev/null +++ b/components/rt/private_include/aws_doubly_linked_list.h @@ -0,0 +1,249 @@ +/* + * Amazon FreeRTOS + * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + + +/** + * @file aws_doubly_linked_list.h + * @brief Doubly Linked List implementation. + * + * A generic implementation of circular Doubly Linked List which consists of a + * list head and some list entries (zero in case of an empty list). + * + * To start with, a structure of type Link_t should be embedded in the structure + * which is to be organized as doubly linked list. + * @code + * typedef struct UserStruct + * { + * uint32_t ulField1; + * uint32_t ulField2; + * Link_t xLink; + * } UserStruct_t; + * @endcode + * + * A List head should then be defined and initialized. + * @code + * Link_t xListHead; + * listINIT_HEAD( &xListHead ); + * @endcode + * + * listADD can then be used to add nodes to the list. + * @code + * listADD( &( xListHead ), &( pxUserStruct->xLink ) ); + * @endcode + * + * listFOR_EACH can be used for traversing the list. + * @code + * Link_t *pxLink; + * UserStruct_t *pxUserStruct; + * listFOR_EACH( pxLink, &( xListHead ) ) + * { + * pxUserStruct = listCONTAINER( pxLink, UserStruct_t, xLink ); + * } + * @endcode + * + * listFOR_EACH_SAFE should be used if you want to perform destructive operations + * (like free) on nodes while traversing the list. + * @code + * Link_t *pxLink, *pxTempLink; + * UserStruct_t *pxUserStruct; + * listFOR_EACH( pxLink, pxTempLink, &( xListHead ) ) + * { + * pxUserStruct = listCONTAINER( pxLink, UserStruct_t, xLink ); + * free( pxUserStruct ); + * } + * @endcode + */ + +#ifndef _AWS_DOUBLY_LINKED_LIST_H_ +#define _AWS_DOUBLY_LINKED_LIST_H_ + +#include +#include + +/** + * @brief Struct embedded in any struct to make it a doubly linked + * list. + * + * pxNext in the head points to the first node in the list and pxPrev + * in the head points to the last node in the list. In case of empty + * list, both pxPrev and pxNext in the head point to the head node itself. + */ +typedef struct Link +{ + struct Link * pxPrev; /**< Pointer to the previous node. */ + struct Link * pxNext; /**< Pointer to the next node. */ +} Link_t; + +/** + * @brief Initializes the given list head to an empty list. + * + * @param[in] pxHead The given list head to initialize. + */ +#define listINIT_HEAD( pxHead ) \ + { \ + ( pxHead )->pxPrev = ( pxHead ); \ + ( pxHead )->pxNext = ( pxHead ); \ + } + +/** + * @brief Adds the given new node to the given list. + * + * @param[in] pxHead The head of the given list. + * @param[in] pxLink The given new node to be added to the given + * list. + */ +#define listADD( pxHead, pxLink ) \ + { \ + Link_t * pxPrevLink = ( pxHead ); \ + Link_t * pxNextLink = ( ( pxHead )->pxNext ); \ + \ + ( pxLink )->pxNext = pxNextLink; \ + pxNextLink->pxPrev = ( pxLink ); \ + pxPrevLink->pxNext = ( pxLink ); \ + ( pxLink )->pxPrev = ( pxPrevLink ); \ + } + +/** + * @brief Removes the given node from the list it is part of. + * + * If the given node is not a part of any list (i.e. next and previous + * nodes are NULL), nothing happens. + * + * @param[in] pxLink The given node to remove from the list. + */ +#define listREMOVE( pxLink ) \ + { \ + /* If the link is part of a list, remove it from the list. */ \ + if( ( pxLink )->pxNext != NULL && ( pxLink )->pxPrev != NULL ) \ + { \ + ( pxLink )->pxPrev->pxNext = ( pxLink )->pxNext; \ + ( pxLink )->pxNext->pxPrev = ( pxLink )->pxPrev; \ + } \ + \ + /* Make sure that this link is not part of any list anymore. */ \ + ( pxLink )->pxPrev = NULL; \ + ( pxLink )->pxNext = NULL; \ + } + +/** + * @brief Given the head of a list, checks if the list is empty. + * + * @param[in] pxHead The head of the given list. + */ +#define listIS_EMPTY( pxHead ) ( ( ( pxHead ) == NULL ) || ( ( pxHead )->pxNext == ( pxHead ) ) ) + +/** + * @brief Removes the first node from the given list and returns it. + * + * Removes the first node from the given list and assigns it to the + * pxLink parameter. If the list is empty, it assigns NULL to the + * pxLink. + * + * @param[in] pxHead The head of the list from which to remove the + * first node. + * @param[out] pxLink The output parameter to receive the removed + * node. + */ +#define listPOP( pxHead, pxLink ) \ + { \ + if( listIS_EMPTY( ( pxHead ) ) ) \ + { \ + ( pxLink ) = NULL; \ + } \ + else \ + { \ + ( pxLink ) = ( pxHead )->pxNext; \ + /* If the link is part of a list, remove it from the list. */ \ + if( ( pxLink )->pxNext != NULL && ( pxLink )->pxPrev != NULL ) \ + { \ + ( pxLink )->pxPrev->pxNext = ( pxLink )->pxNext; \ + ( pxLink )->pxNext->pxPrev = ( pxLink )->pxPrev; \ + } \ + \ + /* Make sure that this link is not part of any list anymore. */ \ + ( pxLink )->pxPrev = NULL; \ + ( pxLink )->pxNext = NULL; \ + } \ + } + +/** + * @brief Merges a list into a given list. + * + * @param[in] pxHeadResultList The head of the given list into which the + * other list should be merged. + * @param[in] pxHeadListToMerge The head of the list to be merged into the + * given list. + */ +#define listMERGE( pxHeadResultList, pxHeadListToMerge ) \ + { \ + if( !listIS_EMPTY( ( pxHeadListToMerge ) ) ) \ + { \ + /* Setup links between last node of listToMerge and first node of resultList. */ \ + ( pxHeadListToMerge )->pxPrev->pxNext = ( pxHeadResultList )->pxNext; \ + ( pxHeadResultList )->pxNext->pxPrev = ( pxHeadListToMerge )->pxPrev; \ + \ + /* Setup links between first node of listToMerge and the head of resultList. */ \ + ( pxHeadListToMerge )->pxNext->pxPrev = ( pxHeadResultList ); \ + ( pxHeadResultList )->pxNext = ( pxHeadListToMerge )->pxNext; \ + /* Empty the merged list. */ \ + listINIT_HEAD( ( pxHeadListToMerge ) ); \ + } \ + } + +/** + * @brief Helper macro to iterate over a list. pxLink contains the link node + * in each iteration. + */ +#define listFOR_EACH( pxLink, pxHead ) \ + for( ( pxLink ) = ( pxHead )->pxNext; \ + ( pxLink ) != ( pxHead ); \ + ( pxLink ) = ( pxLink )->pxNext ) + +/** + * @brief Helper macro to iterate over a list. It is safe to destroy/free the + * nodes while iterating. pxLink contains the link node in each iteration. + */ +#define listFOR_EACH_SAFE( pxLink, pxTempLink, pxHead ) \ + for( ( pxLink ) = ( pxHead )->pxNext, ( pxTempLink ) = ( pxLink )->pxNext; \ + ( pxLink ) != ( pxHead ); \ + ( pxLink ) = ( pxTempLink ), ( pxTempLink ) = ( pxLink )->pxNext ) + +/** + * @brief Given the pointer to the link member (of type Link_t) in a struct, + * extracts the pointer to the containing struct. + * + * @param[in] pxLink The pointer to the link member. + * @param[in] type The type of the containing struct. + * @param[in] member Name of the link member in the containing struct. + */ +#define listCONTAINER( pxLink, type, member ) ( ( type * ) ( ( uint8_t * ) ( pxLink ) - ( uint8_t * ) ( &( ( type * ) 0 )->member ) ) ) + +#endif /* _AWS_DOUBLY_LINKED_LIST_H_ */ diff --git a/components/rt/private_include/portable/FreeRTOS_POSIX_portable_default.h b/components/rt/private_include/portable/FreeRTOS_POSIX_portable_default.h new file mode 100644 index 00000000000..9cc2ba0fdff --- /dev/null +++ b/components/rt/private_include/portable/FreeRTOS_POSIX_portable_default.h @@ -0,0 +1,144 @@ +/* + * Amazon FreeRTOS+POSIX V1.0.0 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/** + * @file FreeRTOS_POSIX_portable_default.h + * @brief Defaults for port-specific configuration of FreeRTOS+POSIX. + */ + +#ifndef _FREERTOS_POSIX_PORTABLE_DEFAULT_H_ +#define _FREERTOS_POSIX_PORTABLE_DEFAULT_H_ + +/** + * @brief The FreeRTOS task name given to pthreads. + */ +#ifndef posixconfigPTHREAD_TASK_NAME + #define posixconfigPTHREAD_TASK_NAME "pthread" +#endif + +/** + * @brief the FreeRTOS timer name given to POSIX timers. + */ +#ifndef posixconfigTIMER_NAME + #define posixconfigTIMER_NAME "timer" +#endif + +/** + * @defgroup Defaults for POSIX message queue implementation. + */ +/**@{ */ +#ifndef posixconfigMQ_MAX_MESSAGES + #define posixconfigMQ_MAX_MESSAGES 10 /**< Maximum number of messages in an mq at one time. */ +#endif + +#ifndef posixconfigMQ_MAX_SIZE + #define posixconfigMQ_MAX_SIZE 128 /**< Maximum size (in bytes) of each message. */ +#endif +/**@} */ + +/** + * @defgroup POSIX implementation-dependent constants usually defined in limits.h. + * + * They are defined here to provide portability between platforms. + */ +/**@{ */ +#ifndef PTHREAD_STACK_MIN + #define PTHREAD_STACK_MIN configMINIMAL_STACK_SIZE * sizeof( StackType_t ) /**< Minimum size in bytes of thread stack storage. */ +#endif +#ifndef NAME_MAX + #define NAME_MAX 64 /**< Maximum number of bytes in a filename (not including terminating null). */ +#endif +#ifndef SEM_VALUE_MAX + #define SEM_VALUE_MAX 0xFFFFU /**< Maximum value of a sem_t. */ +#endif +/**@} */ + +/** + * @defgroup Enable typedefs of POSIX types. + * + * Set these values to 1 or 0 to enable or disable the typedefs, respectively. + * These typedefs should only be disabled if they conflict with system typedefs. + */ +/**@{ */ +#ifndef posixconfigENABLE_CLOCK_T + #define posixconfigENABLE_CLOCK_T 1 /**< clock_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_CLOCKID_T + #define posixconfigENABLE_CLOCKID_T 1 /**< clockid_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_MODE_T + #define posixconfigENABLE_MODE_T 1 /**< mode_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_PID_T + #define posixconfigENABLE_PID_T 1 /**< pid_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_PTHREAD_ATTR_T + #define posixconfigENABLE_PTHREAD_ATTR_T 1 /**< pthread_attr_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_PTHREAD_COND_T + #define posixconfigENABLE_PTHREAD_COND_T 1 /**< pthread_cond_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_PTHREAD_CONDATTR_T + #define posixconfigENABLE_PTHREAD_CONDATTR_T 1 /**< pthread_condattr_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_PTHREAD_MUTEX_T + #define posixconfigENABLE_PTHREAD_MUTEX_T 1 /**< pthread_mutex_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_PTHREAD_MUTEXATTR_T + #define posixconfigENABLE_PTHREAD_MUTEXATTR_T 1 /**< pthread_mutexattr_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_PTHREAD_T + #define posixconfigENABLE_PTHREAD_T 1 /**< pthread_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_SSIZE_T + #define posixconfigENABLE_SSIZE_T 1 /**< ssize_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_TIME_T + #define posixconfigENABLE_TIME_T 1 /**< time_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_TIMER_T + #define posixconfigENABLE_TIMER_T 1 /**< timer_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_USECONDS_T + #define posixconfigENABLE_USECONDS_T 1 /**< useconds_t in sys/types.h */ +#endif +#ifndef posixconfigENABLE_TIMESPEC + #define posixconfigENABLE_TIMESPEC 1 /**< struct timespec in time.h */ +#endif +#ifndef posixconfigENABLE_ITIMERSPEC + #define posixconfigENABLE_ITIMERSPEC 1 /**< struct itimerspec in time.h */ +#endif +#ifndef posixconfigENABLE_TM + #define posixconfigENABLE_TM 1 /**< struct tm in time.h */ +#endif +/**@} */ + +#endif /* ifndef _FREERTOS_POSIX_PORTABLE_DEFAULT_H_ */ diff --git a/components/rt/sbom.yml b/components/rt/sbom.yml new file mode 100644 index 00000000000..4fc6e88bb85 --- /dev/null +++ b/components/rt/sbom.yml @@ -0,0 +1,5 @@ +name: 'FreeRTOS-Plus-POSIX' +version: '1.0.0' +supplier: 'Organization: Espressif Systems (Shanghai) CO LTD' +originator: 'Organization: Amazon Web Services' +description: Portable Operating System Interface for FreeRTOS diff --git a/components/rt/test_apps/posix_rt_test/.build-test-rules.yml b/components/rt/test_apps/posix_rt_test/.build-test-rules.yml new file mode 100644 index 00000000000..102749b1988 --- /dev/null +++ b/components/rt/test_apps/posix_rt_test/.build-test-rules.yml @@ -0,0 +1,9 @@ +# Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps + +components/rt/test_apps/posix_rt_test: + enable: + - if: IDF_TARGET in ["esp32", "esp32s2", "esp32c3", "esp32p4"] + reason: covers all major arch types, xtensa vs riscv, single vs dual-core + depends_components: + - rt + - freertos diff --git a/components/rt/test_apps/posix_rt_test/CMakeLists.txt b/components/rt/test_apps/posix_rt_test/CMakeLists.txt new file mode 100644 index 00000000000..99869dce0ae --- /dev/null +++ b/components/rt/test_apps/posix_rt_test/CMakeLists.txt @@ -0,0 +1,7 @@ +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +set(COMPONENTS main) +project(posix_test) diff --git a/components/rt/test_apps/posix_rt_test/README.md b/components/rt/test_apps/posix_rt_test/README.md new file mode 100644 index 00000000000..487019d7244 --- /dev/null +++ b/components/rt/test_apps/posix_rt_test/README.md @@ -0,0 +1,2 @@ +| Supported Targets | ESP32 | ESP32-C3 | ESP32-P4 | ESP32-S2 | +| ----------------- | ----- | -------- | -------- | -------- | diff --git a/components/rt/test_apps/posix_rt_test/main/CMakeLists.txt b/components/rt/test_apps/posix_rt_test/main/CMakeLists.txt new file mode 100644 index 00000000000..acc04d35e58 --- /dev/null +++ b/components/rt/test_apps/posix_rt_test/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" "mqueue_test.cpp" + INCLUDE_DIRS "." + PRIV_REQUIRES rt unity + WHOLE_ARCHIVE) diff --git a/components/rt/test_apps/posix_rt_test/main/main.c b/components/rt/test_apps/posix_rt_test/main/main.c new file mode 100644 index 00000000000..88bb7130651 --- /dev/null +++ b/components/rt/test_apps/posix_rt_test/main/main.c @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ + +#include +#include +#include "unity.h" +#include "unity_test_runner.h" +#include "unity_test_utils_memory.h" +#include "esp_log.h" + +static const char *TAG = "Linux_sim"; + +void setUp(void) +{ + unity_utils_set_leak_level(0); + unity_utils_record_free_mem(); +} + +void tearDown(void) +{ + unity_utils_evaluate_leaks(); +} + +void app_main(void) +{ + // The following code avoids memory leaks from initializing libc structures in clock_gettime() calls. + struct timespec tp; + clock_gettime(CLOCK_REALTIME, &tp); + (void) tp; + + ESP_LOGI(TAG, "Running FreeRTOS Linux test app"); + unity_run_menu(); +} diff --git a/components/rt/test_apps/posix_rt_test/main/mqueue_test.cpp b/components/rt/test_apps/posix_rt_test/main/mqueue_test.cpp new file mode 100644 index 00000000000..a9876d78f77 --- /dev/null +++ b/components/rt/test_apps/posix_rt_test/main/mqueue_test.cpp @@ -0,0 +1,288 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ + +#include +#include +#include +#include +#include "unity.h" +#include "mqueue.h" + +// Note: implementation does not support mode argument +// Note: implementation does not support message priorities (msg_prio arguments) + +struct MessageQueueFixture { + MessageQueueFixture(const char *name = "/test_queue", + long int maxmsg = 10, + long int msgsize = sizeof(int), + int oflag = O_CREAT | O_WRONLY) + : name(name) { + struct mq_attr conf = { + .mq_flags = 0, // ignored by mq_open + .mq_maxmsg = maxmsg, + .mq_msgsize = msgsize, + .mq_curmsgs = 0 // ignored by mq_open + }; + mq = mq_open(name, oflag, S_IRUSR, &conf); + TEST_ASSERT_NOT_EQUAL((mqd_t) -1, mq); + } + ~MessageQueueFixture() { + TEST_ASSERT_EQUAL(0, mq_close(mq)); + TEST_ASSERT_EQUAL(0, mq_unlink(name)); + } + const char *name; + mqd_t mq; +}; + +TEST_CASE("open with invalid message queue name fails", "[mqueue]") +{ + struct mq_attr conf = { + .mq_flags = 0, // ignored by mq_open + .mq_maxmsg = 10, + .mq_msgsize = sizeof(int), + .mq_curmsgs = 0 // ignored by mq_open + }; + +// 255 + 2 characters, excl. '\0' +#define TOO_LONG_NAME "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \ + + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open("", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR , &conf)); + TEST_ASSERT_EQUAL(EINVAL, errno); + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open("my_queue", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR , &conf)); + TEST_ASSERT_EQUAL(EINVAL, errno); + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open(TOO_LONG_NAME, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR , &conf)); + TEST_ASSERT_EQUAL(EINVAL, errno); +} + +TEST_CASE("name / is valid", "[mqueue]") +{ + mqd_t mq = mq_open("/", O_CREAT | O_WRONLY, S_IRUSR, NULL); + + TEST_ASSERT_NOT_EQUAL((mqd_t) -1, mq); + + TEST_ASSERT_EQUAL(0, mq_close(mq)); + TEST_ASSERT_EQUAL(0, mq_unlink("/")); +} + +TEST_CASE("open without create flag fails", "[mqueue]") +{ + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open("/my_queue", O_WRONLY)); + TEST_ASSERT_EQUAL(ENOENT, errno); +} + +TEST_CASE("open mq_maxmsg <= 0", "[mqueue]") +{ + struct mq_attr conf = { + .mq_flags = 0, // ignored by mq_open + .mq_maxmsg = 0, + .mq_msgsize = sizeof(int), + .mq_curmsgs = 0 // ignored by mq_open + }; + + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open("/my_queue", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR , &conf)); + TEST_ASSERT_EQUAL(EINVAL, errno); + + conf.mq_maxmsg = -1; + + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open("/my_queue", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR , &conf)); + TEST_ASSERT_EQUAL(EINVAL, errno); +} + +TEST_CASE("open mq_msgsize <= 0", "[mqueue]") +{ + struct mq_attr conf = { + .mq_flags = 0, // ignored by mq_open + .mq_maxmsg = 10, + .mq_msgsize = 0, + .mq_curmsgs = 0 // ignored by mq_open + }; + + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open("/my_queue", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR , &conf)); + TEST_ASSERT_EQUAL(EINVAL, errno); + + conf.mq_msgsize = -1; + + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open("/my_queue", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR , &conf)); + TEST_ASSERT_EQUAL(EINVAL, errno); +} + +TEST_CASE("creating already existing message queue fails", "[mqueue]") +{ + MessageQueueFixture mq_fix; + + TEST_ASSERT_EQUAL((mqd_t) -1, mq_open(mq_fix.name, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR | S_IWUSR , NULL)); + TEST_ASSERT_EQUAL(EEXIST, errno); +} + +TEST_CASE("open with default flags", "[mqueue]") +{ + mqd_t mq = mq_open("/my_queue", O_CREAT | O_WRONLY, S_IRUSR, NULL); + TEST_ASSERT_NOT_EQUAL((mqd_t) -1, mq); + + struct mq_attr default_conf; + TEST_ASSERT_EQUAL(0, mq_getattr(mq, &default_conf)); + TEST_ASSERT_EQUAL(10, default_conf.mq_maxmsg); + TEST_ASSERT_EQUAL(128, default_conf.mq_msgsize); + + TEST_ASSERT_EQUAL(0, mq_close(mq)); + TEST_ASSERT_EQUAL(0, mq_unlink("/my_queue")); +} + +TEST_CASE("open propagates attributes correctly", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 4, 8); + + struct mq_attr conf; + TEST_ASSERT_EQUAL(0, mq_getattr(mq_fix.mq, &conf)); + TEST_ASSERT_EQUAL(4, conf.mq_maxmsg); + TEST_ASSERT_EQUAL(8, conf.mq_msgsize); +} + +TEST_CASE("message queue does not exceed queue size", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int)); + int to_send = 47; + TEST_ASSERT_EQUAL(0, mq_send(mq_fix.mq, (const char*) &to_send, sizeof(to_send), 0)); + int to_send_2 = 48; + int received = 0; + + const struct timespec zero_time = {0, 0}; + TEST_ASSERT_EQUAL(-1, mq_timedsend(mq_fix.mq, (const char*) &to_send_2, sizeof(to_send_2), 0, &zero_time)); + TEST_ASSERT_EQUAL(ETIMEDOUT, errno); + + TEST_ASSERT_EQUAL(4, mq_receive(mq_fix.mq, (char*) &received, sizeof(received), nullptr)); + TEST_ASSERT_EQUAL(47, received); +} + +TEST_CASE("sending on invalid mq descriptor fails", "[mqueue]") +{ + int to_send = 47; + TEST_ASSERT_EQUAL(-1, mq_send(nullptr, (char*) &to_send, sizeof(to_send), 0)); + TEST_ASSERT_EQUAL(EBADF, errno); +} + +TEST_CASE("sending with invalid timeout fails", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int)); + int to_send = 47; + struct timespec invalid_time = {0, 1'000'000'000}; + TEST_ASSERT_EQUAL(-1, mq_timedsend(mq_fix.mq, (char*) &to_send, sizeof(to_send), 0, &invalid_time)); + TEST_ASSERT_EQUAL(EINVAL, errno); + invalid_time.tv_nsec = -1; + TEST_ASSERT_EQUAL(-1, mq_timedsend(mq_fix.mq, (char*) &to_send, sizeof(to_send), 0, &invalid_time)); + TEST_ASSERT_EQUAL(EINVAL, errno); +} + +TEST_CASE("sending with invalid message size fails", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int)); + int to_send = 47; + TEST_ASSERT_EQUAL(-1, mq_send(mq_fix.mq, (char*) &to_send, sizeof(to_send) + 1, 0)); + TEST_ASSERT_EQUAL(EMSGSIZE, errno); +} + +TEST_CASE("sending does not exceed queue size", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int)); + int to_send = 47; + TEST_ASSERT_EQUAL(0, mq_send(mq_fix.mq, (const char*) &to_send, sizeof(to_send), 0)); + int to_send_2 = 48; + int received = 0; + + const struct timespec zero_time = {0, 0}; + TEST_ASSERT_EQUAL(-1, mq_timedsend(mq_fix.mq, (const char*) &to_send_2, sizeof(to_send_2), 0, &zero_time)); + TEST_ASSERT_EQUAL(ETIMEDOUT, errno); + + TEST_ASSERT_EQUAL(4, mq_receive(mq_fix.mq, (char*) &received, sizeof(received), nullptr)); + TEST_ASSERT_EQUAL(47, received); +} + +TEST_CASE("nonblocking send works", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int), O_CREAT | O_WRONLY | O_NONBLOCK); + int to_send = 47; + int received = 0; + TEST_ASSERT_EQUAL(0, mq_send(mq_fix.mq, (char*) &to_send, sizeof(to_send), 0)); + int to_send_2 = 48; + const struct timespec zero_time = {0, 0}; + + TEST_ASSERT_EQUAL(-1, mq_timedsend(mq_fix.mq, (char*) &to_send_2, sizeof(to_send_2), 0, &zero_time)); + TEST_ASSERT_EQUAL(EAGAIN, errno); + TEST_ASSERT_EQUAL(-1, mq_send(mq_fix.mq, (char*) &to_send_2, sizeof(to_send_2), 0)); + TEST_ASSERT_EQUAL(EAGAIN, errno); + + TEST_ASSERT_EQUAL(4, mq_receive(mq_fix.mq, (char*) &received, sizeof(received), nullptr)); + TEST_ASSERT_EQUAL(47, received); +} + +TEST_CASE("receiving on invalid mq descriptor fails", "[mqueue]") +{ + int received; + TEST_ASSERT_EQUAL(-1, mq_receive(nullptr, (char*) &received, sizeof(received), nullptr)); + TEST_ASSERT_EQUAL(EBADF, errno); +} + +TEST_CASE("receiving with invalid timeout fails", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int)); + int received; + struct timespec invalid_time = {0, 1'000'000'000}; + TEST_ASSERT_EQUAL(-1, mq_timedreceive(mq_fix.mq, (char*) &received, sizeof(received), 0, &invalid_time)); + TEST_ASSERT_EQUAL(EINVAL, errno); + invalid_time.tv_nsec = -1; + TEST_ASSERT_EQUAL(-1, mq_timedreceive(mq_fix.mq, (char*) &received, sizeof(received), 0, &invalid_time)); + TEST_ASSERT_EQUAL(EINVAL, errno); +} + +TEST_CASE("receiving with invalid message size fails", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int)); + int received; + TEST_ASSERT_EQUAL(-1, mq_send(mq_fix.mq, (char*) &received, sizeof(received) + 1, 0)); + TEST_ASSERT_EQUAL(EMSGSIZE, errno); +} + +TEST_CASE("receive on empty message queue times out", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int)); + int received; + const struct timespec zero_time = {0, 0}; + + TEST_ASSERT_EQUAL(-1, mq_timedreceive(mq_fix.mq, (char*) &received, sizeof(received), 0, &zero_time)); + TEST_ASSERT_EQUAL(ETIMEDOUT, errno); +} + +TEST_CASE("nonblocking receive works", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 1, sizeof(int), O_CREAT | O_WRONLY | O_NONBLOCK); + int received; + const struct timespec zero_time = {0, 0}; + + TEST_ASSERT_EQUAL(-1, mq_timedreceive(mq_fix.mq, (char*) &received, sizeof(received), 0, &zero_time)); + TEST_ASSERT_EQUAL(EAGAIN, errno); + TEST_ASSERT_EQUAL(-1, mq_receive(mq_fix.mq, (char*) &received, sizeof(received), nullptr)); + TEST_ASSERT_EQUAL(EAGAIN, errno); +} + +TEST_CASE("queue sends and receives multiple messages", "[mqueue]") +{ + MessageQueueFixture mq_fix("/test", 2, sizeof(int), O_CREAT | O_WRONLY | O_NONBLOCK); + int received; + int to_send = 47; + + TEST_ASSERT_EQUAL(0, mq_send(mq_fix.mq, (char*) &to_send, sizeof(to_send), 0)); + to_send = 48; + TEST_ASSERT_EQUAL(0, mq_send(mq_fix.mq, (char*) &to_send, sizeof(to_send), 0)); + + TEST_ASSERT_EQUAL(4, mq_receive(mq_fix.mq, (char*) &received, sizeof(received), nullptr)); + TEST_ASSERT_EQUAL(47, received); + TEST_ASSERT_EQUAL(4, mq_receive(mq_fix.mq, (char*) &received, sizeof(received), nullptr)); + TEST_ASSERT_EQUAL(48, received); + +} diff --git a/components/rt/test_apps/posix_rt_test/pytest_rt_mqueue_tests.py b/components/rt/test_apps/posix_rt_test/pytest_rt_mqueue_tests.py new file mode 100644 index 00000000000..f43f8abc22a --- /dev/null +++ b/components/rt/test_apps/posix_rt_test/pytest_rt_mqueue_tests.py @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded import Dut + + +@pytest.mark.generic +@pytest.mark.esp32 +@pytest.mark.esp32c3 +@pytest.mark.esp32p4 +@pytest.mark.esp32s2 +def test_rt_mqueue(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/components/rt/test_apps/posix_rt_test/sdkconfig.defaults b/components/rt/test_apps/posix_rt_test/sdkconfig.defaults new file mode 100644 index 00000000000..e510020a061 --- /dev/null +++ b/components/rt/test_apps/posix_rt_test/sdkconfig.defaults @@ -0,0 +1,2 @@ +# This "default" configuration is appended to all other configurations +CONFIG_ESP_TASK_WDT_INIT=n diff --git a/docs/en/api-reference/system/pthread.rst b/docs/en/api-reference/system/pthread.rst index 544fb1ff940..f6314ebbd86 100644 --- a/docs/en/api-reference/system/pthread.rst +++ b/docs/en/api-reference/system/pthread.rst @@ -1,5 +1,5 @@ -POSIX Threads Support -===================== +POSIX Support (Including POSIX Threads Support) +=============================================== :link_to_translation:`zh_CN:[中文]` @@ -12,7 +12,11 @@ POSIX Threads are implemented in ESP-IDF as wrappers around equivalent FreeRTOS Pthreads can be used in ESP-IDF by including standard ``pthread.h`` header, which is included in the toolchain libc. An additional ESP-IDF specific header, ``esp_pthread.h``, provides additional non-POSIX APIs for using some ESP-IDF features with pthreads. -C++ Standard Library implementations for ``std::thread``, ``std::mutex``, ``std::condition_variable``, etc., are realized using pthreads (via GCC libstdc++). Therefore, restrictions mentioned here also apply to the equivalent C++ standard library functionality. +Besides POSIX Threads, ESP-IDF also supports :ref:`POSIX message queues `. + +C++ Standard Library implementations for ``std::thread``, ``std::mutex``, ``std::condition_variable``, etc., are realized using pthreads and other POSIX APIs (via GCC libstdc++). Therefore, restrictions mentioned here also apply to the equivalent C++ standard library functionality. + +If you identify a useful API that you would like to see implemented in ESP-IDF, please open a `feature request on GitHub `_ with the details. RTOS Integration ---------------- @@ -23,6 +27,10 @@ Unlike many operating systems using POSIX Threads, ESP-IDF is a real-time operat When calling a standard libc or C++ sleep function, such as ``usleep`` defined in ``unistd.h``, the task will only block and yield the core if the sleep time is longer than :ref:`one FreeRTOS tick period `. If the time is shorter, the thread will busy-wait instead of yielding to another RTOS task. +.. note:: + + The POSIX ``errno`` is provided by newlib in ESP-IDF. Thus the configuration ``configUSE_POSIX_ERRNO`` is not used and should stay disabled. + By default, all POSIX Threads have the same RTOS priority, but it is possible to change this by calling a :ref:`custom API `. Standard Features @@ -169,6 +177,53 @@ Thread-Specific Data There are other options for thread local storage in ESP-IDF, including options with higher performance. See :doc:`/api-guides/thread-local-storage`. +.. _posix_message_queues: + +Message Queues +^^^^^^^^^^^^^^ + +The message queue implementation is based on the `FreeRTOS-Plus-POSIX `_ project. Message queues are not made available in any filesystem on ESP-IDF. Message priorities are not supported. +The following API functions of the POSIX message queue specification are implemented: + +* `mq_open() `_ + + - The ``name`` argument has, besides the POSIX specification, the following additional restrictions: + - It has to begin with a leading slash. + - It has to be no more than 255 + 2 characters long (including the leading slash, excluding the terminating null byte). However, memory for ``name`` is dynamically allocated internally, so the shorter it is, the fewer memory it will consume. + - The ``mode`` argument is not implemented and is ignored. + - Supported ``oflags``: ``O_RDWR``, ``O_CREAT``, ``O_EXCL``, and ``O_NONBLOCK`` + +* `mq_close() `_ +* `mq_unlink() `_ +* `mq_receive() `_ + + - Since message priorities are not supported, ``msg_prio`` is unused. + +* `mq_timedreceive() `_ + + - Since message priorities are not supported, ``msg_prio`` is unused. + +* `mq_send() `_ + + - Since message priorities are not supported, ``msg_prio`` has no effect. + +* `mq_timedsend() `_ + + - Since message priorities are not supported, ``msg_prio`` has no effect. + +* `mq_getattr() `_ + +`mq_notify() `_ and `mq_setattr() `_ are not implemented. + +Building +........ + +To use the POSIX message queue API, please add ``rt`` as a requirement in your component's ``CMakeLists.txt`` + +.. note:: + + If you have used `FreeRTOS-Plus-POSIX `_ in another FreeRTOS project before, please note that the include paths in IDF are POSIX-like. Hence, applications include ``mqueue.h`` directly instead of using the subdirectory include ``FreeRTOS_POSIX/mqueue.h``. + Not Implemented --------------- @@ -176,8 +231,10 @@ The ``pthread.h`` header is a standard header and includes additional APIs and f * ``pthread_cancel()`` returns ``ENOSYS`` if called. * ``pthread_condattr_init()`` returns ``ENOSYS`` if called. +* `mq_notify() `_ returns ``ENOSYS`` if called. +* `mq_setattr() `_ returns ``ENOSYS`` if called. -Other POSIX Threads functions (not listed here) are not implemented and will produce either a compiler or a linker error if referenced from an ESP-IDF application. If you identify a useful API that you would like to see implemented in ESP-IDF, please open a `feature request on GitHub `_ with the details. +Other POSIX Threads functions (not listed here) are not implemented and will produce either a compiler or a linker error if referenced from an ESP-IDF application. .. _esp-pthread: diff --git a/examples/system/.build-test-rules.yml b/examples/system/.build-test-rules.yml index 25030dccbfa..4c7dfc8f392 100644 --- a/examples/system/.build-test-rules.yml +++ b/examples/system/.build-test-rules.yml @@ -236,6 +236,13 @@ examples/system/pthread: depends_components: - pthread +examples/system/rt_mqueue: + disable_test: + - if: IDF_TARGET != "esp32" and (NIGHTLY_RUN != "1" or IDF_TARGET == "linux") + reason: no target specific functionality, testing on a single target is sufficient + depends_components: + - rt + examples/system/select: disable: - if: IDF_TARGET != "esp32c3" and (NIGHTLY_RUN != "1" or IDF_TARGET == "linux") diff --git a/examples/system/rt_mqueue/CMakeLists.txt b/examples/system/rt_mqueue/CMakeLists.txt new file mode 100644 index 00000000000..f02d51120a2 --- /dev/null +++ b/examples/system/rt_mqueue/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(posix_mqueue) diff --git a/examples/system/rt_mqueue/README.md b/examples/system/rt_mqueue/README.md new file mode 100644 index 00000000000..f5400e96742 --- /dev/null +++ b/examples/system/rt_mqueue/README.md @@ -0,0 +1,37 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | + +# POSIX Message Queue Example + +A simple example using a POSIX message queue. Two tasks are reading from and writing to a POSIX message queue. + +## How to use example + +### Hardware Required + +This example should be able to run on any supported Espressif SoC development board. + +### Build and Flash + +Enter `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + + +## Example Output + +If you see the following infinite console output, your example should be running correctly: + +``` +sending: 0 +received: 0 +sending: 1 +received: 1 +sending: 2 +received: 2 +sending: 3 +received: 3 +... +``` diff --git a/examples/system/rt_mqueue/main/CMakeLists.txt b/examples/system/rt_mqueue/main/CMakeLists.txt new file mode 100644 index 00000000000..fb0d84fa9c8 --- /dev/null +++ b/examples/system/rt_mqueue/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "posix_mqueue_example_main.c" + INCLUDE_DIRS "." + PRIV_REQUIRES rt) diff --git a/examples/system/rt_mqueue/main/posix_mqueue_example_main.c b/examples/system/rt_mqueue/main/posix_mqueue_example_main.c new file mode 100644 index 00000000000..235fbc48e48 --- /dev/null +++ b/examples/system/rt_mqueue/main/posix_mqueue_example_main.c @@ -0,0 +1,101 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int s_counter = 0; + +const unsigned int MSG_PRIO = 0; + +static void *sender_function(void * arg) +{ + mqd_t *write_descr = (mqd_t*) arg; + + while (true) { + printf("sending: %d\n", s_counter); + int result = mq_send(*write_descr, (const char*) &s_counter, sizeof(s_counter), MSG_PRIO); + if (result != 0) { + perror("Sending failed"); + abort(); + } + + s_counter++; + sleep(1); + } + + return NULL; +} + +static void *receiver_function(void * arg) +{ + mqd_t *read_descr = (mqd_t*) arg; + + while (true) { + int msg; + int result = mq_receive(*read_descr, (char*) &msg, sizeof(msg), NULL); + if (result == -1) { + perror("Sending failed"); + abort(); + } + + printf("received: %d\n", msg); + } + + return NULL; +} + +void app_main(void) +{ + mqd_t write_descr; + mqd_t read_descr; + pthread_t sender; + pthread_t receiver; + + struct mq_attr configuration = { + .mq_flags = 0, // ignored by mq_open + .mq_maxmsg = 10, + .mq_msgsize = sizeof(int), + .mq_curmsgs = 0 // ignored by mq_open + }; + + write_descr = mq_open("/my_queue", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR , &configuration); + if (write_descr == (mqd_t) -1) { + perror("Creating message queue failed"); + abort(); + } + + read_descr = mq_open("/my_queue", O_RDONLY); + if (read_descr == (mqd_t) -1) { + perror("Opening message queue for reading failed"); + abort(); + } + + int result; + result = pthread_create(&sender, NULL, sender_function, &write_descr); + if (result != 0) { + printf("Creating sender thread failed: %s", strerror(errno)); + abort(); + } + + result = pthread_create(&receiver, NULL, receiver_function, &read_descr); + if (result != 0) { + printf("Creating receiver thread failed: %s", strerror(errno)); + abort(); + } + + while (true) { + sleep(1000); + } +} diff --git a/examples/system/rt_mqueue/pytest_rt_mqueue.py b/examples/system/rt_mqueue/pytest_rt_mqueue.py new file mode 100644 index 00000000000..893553de854 --- /dev/null +++ b/examples/system/rt_mqueue/pytest_rt_mqueue.py @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded import Dut + + +@pytest.mark.supported_targets +@pytest.mark.generic +def test_rt_mqueue_example(dut: Dut) -> None: + dut.expect_exact('sending: 0') + dut.expect_exact('received: 0') + dut.expect_exact('sending: 1') + dut.expect_exact('received: 1') diff --git a/tools/ci/astyle-rules.yml b/tools/ci/astyle-rules.yml index e7b761b8b9c..e74f913eb54 100644 --- a/tools/ci/astyle-rules.yml +++ b/tools/ci/astyle-rules.yml @@ -152,6 +152,8 @@ components_not_formatted_permanent: - "/components/app_trace/sys_view/Config/" - "/components/app_trace/sys_view/Sample/" - "/components/app_trace/sys_view/SEGGER/" + # FreeRTOS-Plux-POSIX files (upstream source code) + - "/components/rt/" # SoC header files (generated) - "/components/soc/*/include/soc/" # Example resource files (generated) diff --git a/tools/ci/check_copyright_config.yaml b/tools/ci/check_copyright_config.yaml index 9850f85dd9c..aadfcc5d55e 100644 --- a/tools/ci/check_copyright_config.yaml +++ b/tools/ci/check_copyright_config.yaml @@ -111,6 +111,22 @@ linux_component: - Apache-2.0 - BSD-4-Clause-UC +rt_component: + include: + - 'components/rt/**' + allowed_licenses: + - Apache-2.0 + - MIT #FreeRTOS-Plux-POSIX sources and port files + +rt_component_tests: + include: + - 'components/rt/test_apps/**' + allowed_licenses: + - Apache-2.0 + - Unlicense + - CC0-1.0 + license_for_new_files: Unlicense OR CC0-1.0 + systemview: include: - 'components/app_trace/sys_view' From 3df1e43d09119770108edc83994fc92a0b7fe246 Mon Sep 17 00:00:00 2001 From: Wei Yu Han Date: Fri, 12 Jul 2024 08:01:40 +0800 Subject: [PATCH 022/113] docs(ble): Removed a trailing whitespace --- components/bt/include/esp32/include/esp_bt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index b0779ce8838..5d32f2adc38 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -272,7 +272,7 @@ typedef enum { /** * @brief BLE TX power type * @note - * 1. The connection TX power can only be set after the connection is established. + * 1. The connection TX power can only be set after the connection is established. * After disconnecting, the corresponding TX power will not be affected. * 2. `ESP_BLE_PWR_TYPE_DEFAULT` can be used to set the TX power for power types that have not been set before. * It will not affect the TX power values which have been set for the ADV/SCAN/CONN0-8 power types. From ae3f27bafdce5711967d1ace759d6bc22d52d469 Mon Sep 17 00:00:00 2001 From: Wei Yu Han Date: Fri, 12 Jul 2024 08:22:16 +0800 Subject: [PATCH 023/113] docs(ble): Removed the index of the note for esp_ble_power_type_set/get --- components/bt/include/esp32/include/esp_bt.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 5d32f2adc38..eb7b16cb259 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -327,8 +327,7 @@ typedef enum { /** * @brief Set BLE TX power * - * @note - * 1. Connection TX power should only be set after the connection is established. + * @note Connection TX power should only be set after the connection is established. * * @param[in] power_type The type of TX power. It could be Advertising, Connection, Default, etc. * @param[in] power_level Power level (index) corresponding to the absolute value (dBm) @@ -342,8 +341,7 @@ esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_ /** * @brief Get BLE TX power * - * @note - * 1. Connection TX power should only be retrieved after the connection is established. + * @note Connection TX power should only be retrieved after the connection is established. * * @param[in] power_type The type of TX power. It could be Advertising/Connection/Default and etc. * From 863344f7695402b2c3e45df56fd98a932b8e81d8 Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 8 Jul 2024 18:55:00 +0800 Subject: [PATCH 024/113] feat(etm): support etm driver on esp32c5 --- .../analog_comparator/main/CMakeLists.txt | 7 +- .../main/test_ana_cmpr_etm.c | 0 .../gpio_extensions/main/CMakeLists.txt | 4 + .../gpio_extensions}/main/test_gpio_etm.c | 4 +- .../test_apps/gptimer/main/CMakeLists.txt | 6 +- .../gptimer}/main/test_gptimer_etm.c | 23 +- .../test_apps/.build-test-rules.yml | 14 - .../esp_hw_support_unity_tests/CMakeLists.txt | 5 + .../main/CMakeLists.txt | 4 + .../main/test_etm_core.c | 0 .../test_apps/etm/CMakeLists.txt | 15 - .../esp_hw_support/test_apps/etm/README.md | 2 - .../test_apps/etm/main/CMakeLists.txt | 26 - .../test_apps/etm/main/test_app_main.c | 60 -- .../test_apps/etm/pytest_etm.py | 19 - .../test_apps/etm/sdkconfig.ci.release | 5 - .../test_apps/etm/sdkconfig.defaults | 2 - .../esp32c5/ld/esp32c5.rom.systimer.ld | 5 +- .../main/CMakeLists.txt | 4 + .../main/test_systick_etm.c | 63 ++ .../esp_timer/test_apps/main/CMakeLists.txt | 14 +- .../test_apps/main/test_esp_timer_etm.c} | 50 +- .../main/test_esp_timer_light_sleep.c | 4 - components/hal/esp32c5/include/hal/etm_ll.h | 117 ++++ .../hal/esp32c5/include/hal/gpio_etm_ll.h | 136 ++++ components/hal/esp32c5/include/hal/timer_ll.h | 44 +- .../esp32c5/include/soc/Kconfig.soc_caps.in | 36 + .../soc/esp32c5/include/soc/gpio_ext_struct.h | 649 +----------------- components/soc/esp32c5/include/soc/soc_caps.h | 18 +- .../soc/esp32c5/include/soc/soc_etm_struct.h | 106 +-- .../soc/esp32c5/ld/esp32c5.peripherals.ld | 1 + docs/docs_not_updated/esp32c5.txt | 1 - .../gptimer_capture_hc_sr04/README.md | 4 +- .../pytest_gptimer_capture_example.py | 2 +- 34 files changed, 465 insertions(+), 985 deletions(-) rename components/{esp_hw_support/test_apps/etm => esp_driver_ana_cmpr/test_apps/analog_comparator}/main/test_ana_cmpr_etm.c (100%) rename components/{esp_hw_support/test_apps/etm => esp_driver_gpio/test_apps/gpio_extensions}/main/test_gpio_etm.c (98%) rename components/{esp_hw_support/test_apps/etm => esp_driver_gptimer/test_apps/gptimer}/main/test_gptimer_etm.c (96%) rename components/esp_hw_support/test_apps/{etm => esp_hw_support_unity_tests}/main/test_etm_core.c (100%) delete mode 100644 components/esp_hw_support/test_apps/etm/CMakeLists.txt delete mode 100644 components/esp_hw_support/test_apps/etm/README.md delete mode 100644 components/esp_hw_support/test_apps/etm/main/CMakeLists.txt delete mode 100644 components/esp_hw_support/test_apps/etm/main/test_app_main.c delete mode 100644 components/esp_hw_support/test_apps/etm/pytest_etm.py delete mode 100644 components/esp_hw_support/test_apps/etm/sdkconfig.ci.release delete mode 100644 components/esp_hw_support/test_apps/etm/sdkconfig.defaults create mode 100644 components/esp_system/test_apps/esp_system_unity_tests/main/test_systick_etm.c rename components/{esp_hw_support/test_apps/etm/main/test_systimer_etm.c => esp_timer/test_apps/main/test_esp_timer_etm.c} (60%) create mode 100644 components/hal/esp32c5/include/hal/etm_ll.h create mode 100644 components/hal/esp32c5/include/hal/gpio_etm_ll.h diff --git a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/CMakeLists.txt b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/CMakeLists.txt index b4687d1c66e..e0307f04831 100644 --- a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/CMakeLists.txt +++ b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/CMakeLists.txt @@ -6,7 +6,12 @@ if(CONFIG_ANA_CMPR_ISR_IRAM_SAFE) list(APPEND srcs "test_ana_cmpr_iram.c") endif() +if(CONFIG_SOC_ANA_CMPR_SUPPORT_ETM AND CONFIG_SOC_TIMER_SUPPORT_ETM) + # Analog Comparator event test relies on GPTIMER task + list(APPEND srcs "test_ana_cmpr_etm.c") +endif() + idf_component_register(SRCS ${srcs} INCLUDE_DIRS "." - PRIV_REQUIRES unity esp_driver_gpio esp_driver_ana_cmpr + PRIV_REQUIRES unity esp_driver_gpio esp_driver_ana_cmpr esp_driver_gptimer WHOLE_ARCHIVE) diff --git a/components/esp_hw_support/test_apps/etm/main/test_ana_cmpr_etm.c b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_etm.c similarity index 100% rename from components/esp_hw_support/test_apps/etm/main/test_ana_cmpr_etm.c rename to components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_etm.c diff --git a/components/esp_driver_gpio/test_apps/gpio_extensions/main/CMakeLists.txt b/components/esp_driver_gpio/test_apps/gpio_extensions/main/CMakeLists.txt index 3b4bd6d6204..c61fee0bb56 100644 --- a/components/esp_driver_gpio/test_apps/gpio_extensions/main/CMakeLists.txt +++ b/components/esp_driver_gpio/test_apps/gpio_extensions/main/CMakeLists.txt @@ -12,6 +12,10 @@ if(CONFIG_SOC_GPIO_SUPPORT_PIN_HYS_FILTER) list(APPEND srcs "test_hysteresis.c") endif() +if(CONFIG_SOC_GPIO_SUPPORT_ETM) + list(APPEND srcs "test_gpio_etm.c") +endif() + # In order for the cases defined by `TEST_CASE` to be linked into the final elf, # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} diff --git a/components/esp_hw_support/test_apps/etm/main/test_gpio_etm.c b/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_gpio_etm.c similarity index 98% rename from components/esp_hw_support/test_apps/etm/main/test_gpio_etm.c rename to components/esp_driver_gpio/test_apps/gpio_extensions/main/test_gpio_etm.c index cd2c0d1bcb6..9d13f09b367 100644 --- a/components/esp_hw_support/test_apps/etm/main/test_gpio_etm.c +++ b/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_gpio_etm.c @@ -94,10 +94,10 @@ TEST_CASE("gpio_etm_self_trigger", "[etm]") TEST_CASE("gpio_etm_self_trigger_multi_action", "[etm]") { // GPIO 0 pos edge event ---> GPIO 1 set level task - // GPIO 22 pos edge event ---> GPIO 1 clear level task + // GPIO 2 pos edge event ---> GPIO 1 clear level task const uint32_t input_gpio1 = 0; - const uint32_t input_gpio2 = 22; + const uint32_t input_gpio2 = 2; const uint32_t output_gpio = 1; printf("allocate etm channels\r\n"); esp_etm_channel_config_t etm_config = {}; diff --git a/components/esp_driver_gptimer/test_apps/gptimer/main/CMakeLists.txt b/components/esp_driver_gptimer/test_apps/gptimer/main/CMakeLists.txt index 39337b4ce69..3fb34ea479a 100644 --- a/components/esp_driver_gptimer/test_apps/gptimer/main/CMakeLists.txt +++ b/components/esp_driver_gptimer/test_apps/gptimer/main/CMakeLists.txt @@ -5,6 +5,10 @@ if(CONFIG_GPTIMER_ISR_IRAM_SAFE) list(APPEND srcs "test_gptimer_iram.c") endif() +if(CONFIG_SOC_TIMER_SUPPORT_ETM) + list(APPEND srcs "test_gptimer_etm.c") +endif() + if(CONFIG_SOC_LIGHT_SLEEP_SUPPORTED AND CONFIG_PM_ENABLE) list(APPEND srcs "test_gptimer_sleep.c") endif() @@ -12,5 +16,5 @@ endif() # In order for the cases defined by `TEST_CASE` to be linked into the final elf, # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} - PRIV_REQUIRES unity esp_driver_gptimer + PRIV_REQUIRES unity esp_driver_gptimer esp_driver_gpio WHOLE_ARCHIVE) diff --git a/components/esp_hw_support/test_apps/etm/main/test_gptimer_etm.c b/components/esp_driver_gptimer/test_apps/gptimer/main/test_gptimer_etm.c similarity index 96% rename from components/esp_hw_support/test_apps/etm/main/test_gptimer_etm.c rename to components/esp_driver_gptimer/test_apps/gptimer/main/test_gptimer_etm.c index 536a6e18ad2..f9057f8d7ef 100644 --- a/components/esp_hw_support/test_apps/etm/main/test_gptimer_etm.c +++ b/components/esp_driver_gptimer/test_apps/gptimer/main/test_gptimer_etm.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -13,12 +13,19 @@ #include "driver/gpio_etm.h" #include "driver/gpio.h" +#if CONFIG_GPTIMER_ISR_IRAM_SAFE +#define TEST_ALARM_CALLBACK_ATTR IRAM_ATTR +#else +#define TEST_ALARM_CALLBACK_ATTR +#endif // CONFIG_GPTIMER_ISR_IRAM_SAFE + +TEST_ALARM_CALLBACK_ATTR static bool on_gptimer_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_ctx) { return false; } -TEST_CASE("gptimer_etm_alarm_event_with_interrupt_enabled", "[etm]") +TEST_CASE("gptimer_etm_alarm_event_with_interrupt_enabled", "[gptimer][etm]") { const uint32_t output_gpio = 1; // GPTimer alarm ---> ETM channel A ---> GPIO toggle @@ -100,11 +107,11 @@ TEST_CASE("gptimer_etm_alarm_event_with_interrupt_enabled", "[etm]") TEST_ESP_OK(esp_etm_del_channel(etm_channel_a)); } -TEST_CASE("gptimer_etm_alarm_event_without_interrupt", "[etm]") +TEST_CASE("gptimer_etm_alarm_event_without_interrupt", "[gptimer][etm]") { const uint32_t output_gpio = 1; // GPTimer alarm ---> ETM channel A ---> GPIO toggle - // GPTimer alarm ---> ETM channel B ---> GPTimer alarm reenable + // GPTimer alarm ---> ETM channel B ---> GPTimer alarm re-enable printf("allocate etm channel\r\n"); esp_etm_channel_config_t etm_config = {}; esp_etm_channel_handle_t etm_channel_a, etm_channel_b; @@ -188,11 +195,11 @@ TEST_CASE("gptimer_etm_alarm_event_without_interrupt", "[etm]") TEST_ESP_OK(esp_etm_del_channel(etm_channel_b)); } -TEST_CASE("gptimer_auto_reload_by_etm", "[etm]") +TEST_CASE("gptimer_auto_reload_by_etm", "[gptimer][etm]") { const uint32_t output_gpio = 1; // GPTimer alarm ---> ETM channel A ---> GPIO toggle - // GPTimer alarm ---> ETM channel B ---> GPTimer alarm reenable + // GPTimer alarm ---> ETM channel B ---> GPTimer alarm re-enable // GPTimer alarm ---> ETM channel C ---> GPTimer reload printf("allocate etm channel\r\n"); esp_etm_channel_config_t etm_config = {}; @@ -289,7 +296,7 @@ TEST_CASE("gptimer_auto_reload_by_etm", "[etm]") TEST_ESP_OK(esp_etm_del_channel(etm_channel_c)); } -TEST_CASE("gptimer_etm_task_capture", "[etm]") +TEST_CASE("gptimer_etm_task_capture", "[gptimer][etm]") { const uint32_t input_gpio = 0; // GPIO Posedge ---> ETM channel A ---> GPTimer capture @@ -366,7 +373,7 @@ TEST_CASE("gptimer_etm_task_capture", "[etm]") TEST_ESP_OK(esp_etm_del_channel(etm_channel_a)); } -TEST_CASE("gptimer_start_stop_by_etm_task", "[etm]") +TEST_CASE("gptimer_start_stop_by_etm_task", "[gptimer][etm]") { const uint32_t input_gpio = 0; // GPIO pos edge ---> ETM channel A ---> GPTimer start diff --git a/components/esp_hw_support/test_apps/.build-test-rules.yml b/components/esp_hw_support/test_apps/.build-test-rules.yml index b7e85dae37c..09fb7029314 100644 --- a/components/esp_hw_support/test_apps/.build-test-rules.yml +++ b/components/esp_hw_support/test_apps/.build-test-rules.yml @@ -14,20 +14,6 @@ components/esp_hw_support/test_apps/dma2d: depends_filepatterns: - components/esp_hw_support/dma/**/* -components/esp_hw_support/test_apps/esp_hw_support_unity_tests: - disable: - - if: SOC_GPSPI_SUPPORTED != 1 - -components/esp_hw_support/test_apps/etm: - disable: - - if: SOC_ETM_SUPPORTED != 1 - depends_components: - - esp_driver_gptimer - - esp_driver_gpio - - esp_driver_mcpwm - - esp_timer - - esp_driver_ana_cmpr - components/esp_hw_support/test_apps/host_test_linux: enable: - if: IDF_TARGET == "linux" diff --git a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/CMakeLists.txt b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/CMakeLists.txt index fb724b12bba..c6bda239bd0 100644 --- a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/CMakeLists.txt +++ b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/CMakeLists.txt @@ -8,3 +8,8 @@ list(PREPEND SDKCONFIG_DEFAULTS "$ENV{IDF_PATH}/tools/test_apps/configs/sdkconfi include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(esp_hw_support_unity) + +message(STATUS "Checking etm registers are not read-write by half-word") +include($ENV{IDF_PATH}/tools/ci/check_register_rw_half_word.cmake) +check_register_rw_half_word(SOC_MODULES "*etm" "pcr" "hp_sys_clkrst" + HAL_MODULES "etm") diff --git a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/CMakeLists.txt b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/CMakeLists.txt index daa7c071a1c..26c3f712a80 100644 --- a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/CMakeLists.txt +++ b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/CMakeLists.txt @@ -17,6 +17,10 @@ if(CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX OR CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX list(APPEND srcs "test_esp_clock_output.c") endif() +if(CONFIG_SOC_ETM_SUPPORTED) + list(APPEND srcs "test_etm_core.c") +endif() + # In order for the cases defined by `TEST_CASE` to be linked into the final elf, # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} diff --git a/components/esp_hw_support/test_apps/etm/main/test_etm_core.c b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/test_etm_core.c similarity index 100% rename from components/esp_hw_support/test_apps/etm/main/test_etm_core.c rename to components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/test_etm_core.c diff --git a/components/esp_hw_support/test_apps/etm/CMakeLists.txt b/components/esp_hw_support/test_apps/etm/CMakeLists.txt deleted file mode 100644 index 4505a9f1a0c..00000000000 --- a/components/esp_hw_support/test_apps/etm/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -# This is the project CMakeLists.txt file for the test subproject -cmake_minimum_required(VERSION 3.16) - -include($ENV{IDF_PATH}/tools/cmake/project.cmake) - -# "Trim" the build. Include the minimal set of components, main, and anything it depends on. We also depend on esp_pm -# as we set CONFIG_PM_... options. -set(COMPONENTS main esp_pm) - -project(etm_test) - -message(STATUS "Checking etm registers are not read-write by half-word") -include($ENV{IDF_PATH}/tools/ci/check_register_rw_half_word.cmake) -check_register_rw_half_word(SOC_MODULES "*etm" "pcr" "hp_sys_clkrst" - HAL_MODULES "etm") diff --git a/components/esp_hw_support/test_apps/etm/README.md b/components/esp_hw_support/test_apps/etm/README.md deleted file mode 100644 index 7b822bdb0ef..00000000000 --- a/components/esp_hw_support/test_apps/etm/README.md +++ /dev/null @@ -1,2 +0,0 @@ -| Supported Targets | ESP32-C6 | ESP32-H2 | ESP32-P4 | -| ----------------- | -------- | -------- | -------- | diff --git a/components/esp_hw_support/test_apps/etm/main/CMakeLists.txt b/components/esp_hw_support/test_apps/etm/main/CMakeLists.txt deleted file mode 100644 index 3e09a613525..00000000000 --- a/components/esp_hw_support/test_apps/etm/main/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -set(srcs "test_app_main.c" - "test_etm_core.c") - -if(CONFIG_SOC_GPIO_SUPPORT_ETM) - list(APPEND srcs "test_gpio_etm.c") -endif() - -if(CONFIG_SOC_TIMER_SUPPORT_ETM) - list(APPEND srcs "test_gptimer_etm.c") -endif() - -if(CONFIG_SOC_SYSTIMER_SUPPORT_ETM) - list(APPEND srcs "test_systimer_etm.c") -endif() - -if(CONFIG_SOC_ANA_CMPR_SUPPORT_ETM AND CONFIG_SOC_TIMER_SUPPORT_ETM) - # Analog Comparator event test relies on GPTIMER task - list(APPEND srcs "test_ana_cmpr_etm.c") -endif() - -# In order for the cases defined by `TEST_CASE` to be linked into the final elf, -# the component can be registered as WHOLE_ARCHIVE -idf_component_register(SRCS ${srcs} - PRIV_REQUIRES unity esp_timer esp_driver_gptimer esp_driver_gpio - esp_driver_mcpwm esp_driver_ana_cmpr - WHOLE_ARCHIVE) diff --git a/components/esp_hw_support/test_apps/etm/main/test_app_main.c b/components/esp_hw_support/test_apps/etm/main/test_app_main.c deleted file mode 100644 index be7beff893c..00000000000 --- a/components/esp_hw_support/test_apps/etm/main/test_app_main.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "unity.h" -#include "unity_test_runner.h" -#include "esp_heap_caps.h" -#include "esp_newlib.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" - -// Some resources are lazy allocated in pulse_cnt driver, the threshold is left for that case -#define TEST_MEMORY_LEAK_THRESHOLD (-300) - -static size_t before_free_8bit; -static size_t before_free_32bit; - -static void check_leak(size_t before_free, size_t after_free, const char *type) -{ - ssize_t delta = after_free - before_free; - printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); - TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); -} - -void setUp(void) -{ - before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); - before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); -} - -void tearDown(void) -{ - /* some FreeRTOS stuff is cleaned up by idle task */ - vTaskDelay(5); - - /* clean up some of the newlib's lazy allocations */ - esp_reent_cleanup(); - - size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); - size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); - check_leak(before_free_8bit, after_free_8bit, "8BIT"); - check_leak(before_free_32bit, after_free_32bit, "32BIT"); -} - -void app_main(void) -{ - // _____ _____ __ __ _____ _ - // | ____|_ _| \/ | |_ _|__ ___| |_ - // | _| | | | |\/| | | |/ _ \/ __| __| - // | |___ | | | | | | | | __/\__ \ |_ - // |_____| |_| |_| |_| |_|\___||___/\__| - printf(" _____ _____ __ __ _____ _\r\n"); - printf("| ____|_ _| \\/ | |_ _|__ ___| |_\r\n"); - printf("| _| | | | |\\/| | | |/ _ \\/ __| __|\r\n"); - printf("| |___ | | | | | | | | __/\\__ \\ |_\r\n"); - printf("|_____| |_| |_| |_| |_|\\___||___/\\__|\r\n"); - unity_run_menu(); -} diff --git a/components/esp_hw_support/test_apps/etm/pytest_etm.py b/components/esp_hw_support/test_apps/etm/pytest_etm.py deleted file mode 100644 index c209342a4c5..00000000000 --- a/components/esp_hw_support/test_apps/etm/pytest_etm.py +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD -# SPDX-License-Identifier: CC0-1.0 -import pytest -from pytest_embedded import Dut - - -@pytest.mark.esp32c6 -@pytest.mark.esp32h2 -@pytest.mark.esp32p4 -@pytest.mark.generic -@pytest.mark.parametrize( - 'config', - [ - 'release', - ], - indirect=True, -) -def test_etm(dut: Dut) -> None: - dut.run_all_single_board_cases() diff --git a/components/esp_hw_support/test_apps/etm/sdkconfig.ci.release b/components/esp_hw_support/test_apps/etm/sdkconfig.ci.release deleted file mode 100644 index 91d93f163e6..00000000000 --- a/components/esp_hw_support/test_apps/etm/sdkconfig.ci.release +++ /dev/null @@ -1,5 +0,0 @@ -CONFIG_PM_ENABLE=y -CONFIG_FREERTOS_USE_TICKLESS_IDLE=y -CONFIG_COMPILER_OPTIMIZATION_SIZE=y -CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y -CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y diff --git a/components/esp_hw_support/test_apps/etm/sdkconfig.defaults b/components/esp_hw_support/test_apps/etm/sdkconfig.defaults deleted file mode 100644 index b308cb2ddda..00000000000 --- a/components/esp_hw_support/test_apps/etm/sdkconfig.defaults +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_FREERTOS_HZ=1000 -CONFIG_ESP_TASK_WDT=n diff --git a/components/esp_rom/esp32c5/ld/esp32c5.rom.systimer.ld b/components/esp_rom/esp32c5/ld/esp32c5.rom.systimer.ld index 7be47b11105..9f260f5ecd4 100644 --- a/components/esp_rom/esp32c5/ld/esp32c5.rom.systimer.ld +++ b/components/esp_rom/esp32c5/ld/esp32c5.rom.systimer.ld @@ -9,8 +9,9 @@ ***************************************/ /* Functions */ -systimer_hal_init = 0x400003d0; -systimer_hal_deinit = 0x400003d4; +/* The following ROM functions are commented out because they're patched in the esp_rom_systimer.c */ +/* systimer_hal_init = 0x400003d0; */ +/* systimer_hal_deinit = 0x400003d4; */ systimer_hal_set_tick_rate_ops = 0x400003d8; systimer_hal_get_counter_value = 0x400003dc; systimer_hal_get_time = 0x400003e0; diff --git a/components/esp_system/test_apps/esp_system_unity_tests/main/CMakeLists.txt b/components/esp_system/test_apps/esp_system_unity_tests/main/CMakeLists.txt index 7bccda3753b..0e7335e2f42 100644 --- a/components/esp_system/test_apps/esp_system_unity_tests/main/CMakeLists.txt +++ b/components/esp_system/test_apps/esp_system_unity_tests/main/CMakeLists.txt @@ -17,6 +17,10 @@ set(SRC "test_app_main.c" "test_system_time.c" "test_task_wdt.c") +if(CONFIG_SOC_SYSTIMER_SUPPORT_ETM) + list(APPEND SRC "test_systick_etm.c") +endif() + if(CONFIG_ESP_IPC_ISR_ENABLE) list(APPEND SRC "test_ipc_isr.c") if(CONFIG_IDF_TARGET_ARCH_XTENSA) diff --git a/components/esp_system/test_apps/esp_system_unity_tests/main/test_systick_etm.c b/components/esp_system/test_apps/esp_system_unity_tests/main/test_systick_etm.c new file mode 100644 index 00000000000..d82cf13d625 --- /dev/null +++ b/components/esp_system/test_apps/esp_system_unity_tests/main/test_systick_etm.c @@ -0,0 +1,63 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "unity.h" +#include "unity_test_utils.h" +#include "freertos/FreeRTOS.h" +#include "esp_attr.h" +#include "esp_etm.h" +#include "esp_systick_etm.h" +#include "driver/gpio_etm.h" +#include "driver/gpio.h" + +TEST_CASE("rtos_systick_etm_event", "[etm]") +{ + // systimer alarm ---> EMT channel ---> GPIO toggle + const uint32_t output_gpio = 1; + printf("allocate etm channels\r\n"); + esp_etm_channel_config_t etm_config = {}; + esp_etm_channel_handle_t etm_channel_a = NULL; + TEST_ESP_OK(esp_etm_new_channel(&etm_config, &etm_channel_a)); + + printf("allocate GPIO etm task\r\n"); + esp_etm_task_handle_t gpio_task = NULL; + gpio_etm_task_config_t gpio_task_config = { + .action = GPIO_ETM_TASK_ACTION_TOG, + }; + TEST_ESP_OK(gpio_new_etm_task(&gpio_task_config, &gpio_task)); + + // bind GPIO to the task + TEST_ESP_OK(gpio_etm_task_add_gpio(gpio_task, output_gpio)); + + printf("initialize gpio\r\n"); + gpio_config_t task_gpio_config = { + .intr_type = GPIO_INTR_DISABLE, + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << output_gpio, + }; + TEST_ESP_OK(gpio_config(&task_gpio_config)); + + printf("acquire systick etm event\r\n"); + esp_etm_event_handle_t systick_event = NULL; + TEST_ESP_OK(esp_systick_new_etm_alarm_event(0, &systick_event)); + + printf("connect event and task to the channel\r\n"); + TEST_ESP_OK(esp_etm_channel_connect(etm_channel_a, systick_event, gpio_task)); + + TEST_ESP_OK(esp_etm_channel_enable(etm_channel_a)); + + // should see a 500Hz square wave on the GPIO (if RTOS systick is set to 1000Hz) + vTaskDelay(pdMS_TO_TICKS(1000)); + + // delete etm primitives + TEST_ESP_OK(gpio_etm_task_rm_gpio(gpio_task, output_gpio)); + TEST_ESP_OK(esp_etm_del_task(gpio_task)); + TEST_ESP_OK(esp_etm_del_event(systick_event)); + TEST_ESP_OK(esp_etm_channel_disable(etm_channel_a)); + TEST_ESP_OK(esp_etm_del_channel(etm_channel_a)); +} diff --git a/components/esp_timer/test_apps/main/CMakeLists.txt b/components/esp_timer/test_apps/main/CMakeLists.txt index 041c23bb57c..15fc56ac952 100644 --- a/components/esp_timer/test_apps/main/CMakeLists.txt +++ b/components/esp_timer/test_apps/main/CMakeLists.txt @@ -1,4 +1,14 @@ -idf_component_register(SRC_DIRS "." +set(srcs "test_app_main.c" "test_esp_timer.c" "test_ets_timer.c") + +if(CONFIG_SOC_LIGHT_SLEEP_SUPPORTED) + list(APPEND srcs "test_esp_timer_light_sleep.c") +endif() + +if(CONFIG_SOC_SYSTIMER_SUPPORT_ETM) + list(APPEND srcs "test_esp_timer_etm.c") +endif() + +idf_component_register(SRCS ${srcs} PRIV_INCLUDE_DIRS "../../private_include" - PRIV_REQUIRES cmock test_utils esp_timer spi_flash esp_psram + PRIV_REQUIRES cmock test_utils esp_timer spi_flash esp_psram esp_driver_gpio WHOLE_ARCHIVE) diff --git a/components/esp_hw_support/test_apps/etm/main/test_systimer_etm.c b/components/esp_timer/test_apps/main/test_esp_timer_etm.c similarity index 60% rename from components/esp_hw_support/test_apps/etm/main/test_systimer_etm.c rename to components/esp_timer/test_apps/main/test_esp_timer_etm.c index 23b0cba9606..10f8f68bcff 100644 --- a/components/esp_hw_support/test_apps/etm/main/test_systimer_etm.c +++ b/components/esp_timer/test_apps/main/test_esp_timer_etm.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -14,54 +14,6 @@ #include "driver/gpio_etm.h" #include "driver/gpio.h" #include "esp_timer.h" -#include "esp_systick_etm.h" - -TEST_CASE("rtos_systick_etm_event", "[etm]") -{ - // systimer alarm ---> EMT channel ---> GPIO toggle - const uint32_t output_gpio = 1; - printf("allocate etm channels\r\n"); - esp_etm_channel_config_t etm_config = {}; - esp_etm_channel_handle_t etm_channel_a = NULL; - TEST_ESP_OK(esp_etm_new_channel(&etm_config, &etm_channel_a)); - - printf("allocate GPIO etm task\r\n"); - esp_etm_task_handle_t gpio_task = NULL; - gpio_etm_task_config_t gpio_task_config = { - .action = GPIO_ETM_TASK_ACTION_TOG, - }; - TEST_ESP_OK(gpio_new_etm_task(&gpio_task_config, &gpio_task)); - - // bind GPIO to the task - TEST_ESP_OK(gpio_etm_task_add_gpio(gpio_task, output_gpio)); - - printf("initialize gpio\r\n"); - gpio_config_t task_gpio_config = { - .intr_type = GPIO_INTR_DISABLE, - .mode = GPIO_MODE_OUTPUT, - .pin_bit_mask = 1ULL << output_gpio, - }; - TEST_ESP_OK(gpio_config(&task_gpio_config)); - - printf("acquire systick etm event\r\n"); - esp_etm_event_handle_t systick_event = NULL; - TEST_ESP_OK(esp_systick_new_etm_alarm_event(0, &systick_event)); - - printf("connect event and task to the channel\r\n"); - TEST_ESP_OK(esp_etm_channel_connect(etm_channel_a, systick_event, gpio_task)); - - TEST_ESP_OK(esp_etm_channel_enable(etm_channel_a)); - - // should see a 500Hz square wave on the GPIO (if RTOS systick is set to 1000Hz) - vTaskDelay(pdMS_TO_TICKS(1000)); - - // delete etm primitives - TEST_ESP_OK(gpio_etm_task_rm_gpio(gpio_task, output_gpio)); - TEST_ESP_OK(esp_etm_del_task(gpio_task)); - TEST_ESP_OK(esp_etm_del_event(systick_event)); - TEST_ESP_OK(esp_etm_channel_disable(etm_channel_a)); - TEST_ESP_OK(esp_etm_del_channel(etm_channel_a)); -} static void periodic_timer_callback(void *arg) { diff --git a/components/esp_timer/test_apps/main/test_esp_timer_light_sleep.c b/components/esp_timer/test_apps/main/test_esp_timer_light_sleep.c index b7dd0bc2e8e..6aa8ca9a788 100644 --- a/components/esp_timer/test_apps/main/test_esp_timer_light_sleep.c +++ b/components/esp_timer/test_apps/main/test_esp_timer_light_sleep.c @@ -16,8 +16,6 @@ #include "esp_sleep.h" #include "soc/soc_caps.h" -#if SOC_LIGHT_SLEEP_SUPPORTED - static void timer_cb1(void *arg) { ++*((int*) arg); @@ -58,5 +56,3 @@ TEST_CASE("Test the periodic timer does not handle lost events during light slee TEST_ESP_OK(esp_timer_delete(periodic_timer)); vTaskDelay(3); // wait for the esp_timer task to delete all timers } - -#endif // SOC_LIGHT_SLEEP_SUPPORTED diff --git a/components/hal/esp32c5/include/hal/etm_ll.h b/components/hal/esp32c5/include/hal/etm_ll.h new file mode 100644 index 00000000000..6708cd7f17e --- /dev/null +++ b/components/hal/esp32c5/include/hal/etm_ll.h @@ -0,0 +1,117 @@ +/* + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// Note that most of the register operations in this layer are non-atomic operations. + +#pragma once + +#include +#include "hal/assert.h" +#include "hal/misc.h" +#include "soc/soc_etm_struct.h" +#include "soc/pcr_struct.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Enable the clock for ETM register + * + * @param group_id Group ID + * @param enable true to enable, false to disable + */ +static inline void etm_ll_enable_bus_clock(int group_id, bool enable) +{ + (void)group_id; + PCR.etm_conf.etm_clk_en = enable; +} + +/** + * @brief Reset the ETM register + * + * @param group_id Group ID + */ +static inline void etm_ll_reset_register(int group_id) +{ + (void)group_id; + PCR.etm_conf.etm_rst_en = 1; + PCR.etm_conf.etm_rst_en = 0; +} + +/** + * @brief Enable ETM channel + * + * @param hw ETM register base address + * @param chan Channel ID + */ +static inline void etm_ll_enable_channel(soc_etm_dev_t *hw, uint32_t chan) +{ + if (chan < 32) { + hw->ch_ena_ad0_set.val = 1 << chan; + } else { + hw->ch_ena_ad1_set.val = 1 << (chan - 32); + } +} + +/** + * @brief Disable ETM channel + * + * @param hw ETM register base address + * @param chan Channel ID + */ +static inline void etm_ll_disable_channel(soc_etm_dev_t *hw, uint32_t chan) +{ + if (chan < 32) { + hw->ch_ena_ad0_clr.val = 1 << chan; + } else { + hw->ch_ena_ad1_clr.val = 1 << (chan - 32); + } +} + +/** + * @brief Check whether the ETM channel is enabled or not + * + * @param hw ETM register base address + * @param chan Channel ID + * @return true if the channel is enabled, false otherwise + */ +static inline bool etm_ll_is_channel_enabled(soc_etm_dev_t *hw, uint32_t chan) +{ + if (chan < 32) { + return hw->ch_ena_ad0.val & (1 << chan); + } else { + return hw->ch_ena_ad1.val & (1 << (chan - 32)); + } +} + +/** + * @brief Set the input event for the ETM channel + * + * @param hw ETM register base address + * @param chan Channel ID + * @param event Event ID + */ +static inline void etm_ll_channel_set_event(soc_etm_dev_t *hw, uint32_t chan, uint32_t event) +{ + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->channel[chan].eid, chn_evt_id, event); +} + +/** + * @brief Set the output task for the ETM channel + * + * @param hw ETM register base address + * @param chan Channel ID + * @param task Task ID + */ +static inline void etm_ll_channel_set_task(soc_etm_dev_t *hw, uint32_t chan, uint32_t task) +{ + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->channel[chan].tid, chn_task_id, task); +} + +#ifdef __cplusplus +} +#endif diff --git a/components/hal/esp32c5/include/hal/gpio_etm_ll.h b/components/hal/esp32c5/include/hal/gpio_etm_ll.h new file mode 100644 index 00000000000..52a06e7fc3e --- /dev/null +++ b/components/hal/esp32c5/include/hal/gpio_etm_ll.h @@ -0,0 +1,136 @@ +/* + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// Note that most of the register operations in this layer are non-atomic operations. + +#pragma once + +#include +#include "hal/assert.h" +#include "hal/misc.h" +#include "soc/gpio_ext_struct.h" +#include "soc/soc_etm_source.h" + +#define GPIO_LL_ETM_EVENT_ID_POS_EDGE(ch) (GPIO_EVT_CH0_RISE_EDGE + (ch)) +#define GPIO_LL_ETM_EVENT_ID_NEG_EDGE(ch) (GPIO_EVT_CH0_FALL_EDGE + (ch)) +#define GPIO_LL_ETM_EVENT_ID_ANY_EDGE(ch) (GPIO_EVT_CH0_ANY_EDGE + (ch)) + +#define GPIO_LL_ETM_TASK_ID_SET(ch) (GPIO_TASK_CH0_SET + (ch)) +#define GPIO_LL_ETM_TASK_ID_CLR(ch) (GPIO_TASK_CH0_CLEAR + (ch)) +#define GPIO_LL_ETM_TASK_ID_TOG(ch) (GPIO_TASK_CH0_TOGGLE + (ch)) + +#define GPIO_LL_ETM_EVENT_CHANNELS_PER_GROUP 8 +#define GPIO_LL_ETM_TASK_CHANNELS_PER_GROUP 8 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set which GPIO to be bound to the event channel + * + * @note Different channels can be bound to one GPIO + * + * @param dev Register base address + * @param chan GPIO ETM Event channel number + * @param gpio_num GPIO number + */ +static inline void gpio_ll_etm_event_channel_set_gpio(gpio_etm_dev_t *dev, uint32_t chan, uint32_t gpio_num) +{ + dev->etm_event_chn_cfg[chan].etm_chn_event_sel = gpio_num; +} + +/** + * @brief Whether to enable the event channel + * + * @param dev Register base address + * @param chan GPIO ETM Event channel number + * @param enable True to enable, false to disable + */ +static inline void gpio_ll_etm_enable_event_channel(gpio_etm_dev_t *dev, uint32_t chan, bool enable) +{ + dev->etm_event_chn_cfg[chan].etm_chn_event_en = enable; +} + +/** + * @brief Get which GPIO is bound to the event channel + * + * @param dev Register base address + * @param chan GPIO ETM Event channel number + * @return GPIO number + */ +static inline uint32_t gpio_ll_etm_event_channel_get_gpio(gpio_etm_dev_t *dev, uint32_t chan) +{ + return dev->etm_event_chn_cfg[chan].etm_chn_event_sel; +} + +/** + * @brief Set which GPIO to be bound to the task channel + * + * @note One channel can be bound to multiple different GPIOs + * + * @param dev Register base address + * @param chan GPIO ETM Task channel number + * @param gpio_num GPIO number + */ +static inline void gpio_ll_etm_gpio_set_task_channel(gpio_etm_dev_t *dev, uint32_t gpio_num, uint32_t chan) +{ + int g_p = gpio_num / 5; + int g_idx = gpio_num % 5; + uint32_t reg_val = dev->etm_task_pn_cfg[g_p].val; + reg_val &= ~(0x07 << (g_idx * 6)); + reg_val |= ((chan & 0x07) << (g_idx * 6)); + dev->etm_task_pn_cfg[g_p].val = reg_val; +} + +/** + * @brief Whether to enable the GPIO to be managed by the task channel + * + * @param dev Register base address + * @param gpio_num GPIO number + * @param enable True to enable, false to disable + */ +static inline void gpio_ll_etm_enable_task_gpio(gpio_etm_dev_t *dev, uint32_t gpio_num, bool enable) +{ + int g_p = gpio_num / 5; + int g_idx = gpio_num % 5; + uint32_t reg_val = dev->etm_task_pn_cfg[g_p].val; + reg_val &= ~(0x01 << (g_idx * 6 + 5)); + reg_val |= ((enable & 0x01) << (g_idx * 6 + 5)); + dev->etm_task_pn_cfg[g_p].val = reg_val; +} + +/** + * @brief Check whether a GPIO has been enabled and managed by a task channel + * + * @param dev Register base address + * @param gpio_num GPIO number + * @return True if enabled, false otherwise + */ +static inline bool gpio_ll_etm_is_task_gpio_enabled(gpio_etm_dev_t *dev, uint32_t gpio_num) +{ + int g_p = gpio_num / 5; + int g_idx = gpio_num % 5; + return dev->etm_task_pn_cfg[g_p].val & (0x01 << (g_idx * 6 + 5)); +} + +/** + * @brief Get the channel number that the GPIO is bound to + * + * @param dev Register base address + * @param gpio_num GPIO number + * @return GPIO ETM Task channel number + */ +static inline uint32_t gpio_ll_etm_gpio_get_task_channel(gpio_etm_dev_t *dev, uint32_t gpio_num) +{ + int g_p = gpio_num / 5; + int g_idx = gpio_num % 5; + return (dev->etm_task_pn_cfg[g_p].val >> (g_idx * 6)) & 0x07; +} + +#ifdef __cplusplus +} +#endif diff --git a/components/hal/esp32c5/include/hal/timer_ll.h b/components/hal/esp32c5/include/hal/timer_ll.h index 9915ddbce27..7798f6c7ba3 100644 --- a/components/hal/esp32c5/include/hal/timer_ll.h +++ b/components/hal/esp32c5/include/hal/timer_ll.h @@ -25,30 +25,30 @@ extern "C" { #define TIMER_LL_GET_HW(group_id) ((group_id == 0) ? (&TIMERG0) : (&TIMERG1)) #define TIMER_LL_EVENT_ALARM(timer_id) (1 << (timer_id)) -#define TIMER_LL_ETM_TASK_TABLE(group, timer, task) \ - (uint32_t [2][1][GPTIMER_ETM_TASK_MAX]){{{ \ - [GPTIMER_ETM_TASK_START_COUNT] = TIMER0_TASK_CNT_START_TIMER0, \ - [GPTIMER_ETM_TASK_STOP_COUNT] = TIMER0_TASK_CNT_STOP_TIMER0, \ - [GPTIMER_ETM_TASK_EN_ALARM] = TIMER0_TASK_ALARM_START_TIMER0, \ - [GPTIMER_ETM_TASK_RELOAD] = TIMER0_TASK_CNT_RELOAD_TIMER0, \ - [GPTIMER_ETM_TASK_CAPTURE] = TIMER0_TASK_CNT_CAP_TIMER0, \ - }}, \ - {{ \ - [GPTIMER_ETM_TASK_START_COUNT] = TIMER1_TASK_CNT_START_TIMER0, \ - [GPTIMER_ETM_TASK_STOP_COUNT] = TIMER1_TASK_CNT_STOP_TIMER0, \ - [GPTIMER_ETM_TASK_EN_ALARM] = TIMER1_TASK_ALARM_START_TIMER0, \ - [GPTIMER_ETM_TASK_RELOAD] = TIMER1_TASK_CNT_RELOAD_TIMER0, \ - [GPTIMER_ETM_TASK_CAPTURE] = TIMER1_TASK_CNT_CAP_TIMER0, \ - }}, \ +#define TIMER_LL_ETM_TASK_TABLE(group, timer, task) \ + (uint32_t [2][1][GPTIMER_ETM_TASK_MAX]){{{ \ + [GPTIMER_ETM_TASK_START_COUNT] = TG0_TASK_CNT_START_TIMER0, \ + [GPTIMER_ETM_TASK_STOP_COUNT] = TG0_TASK_CNT_STOP_TIMER0, \ + [GPTIMER_ETM_TASK_EN_ALARM] = TG0_TASK_ALARM_START_TIMER0, \ + [GPTIMER_ETM_TASK_RELOAD] = TG0_TASK_CNT_RELOAD_TIMER0, \ + [GPTIMER_ETM_TASK_CAPTURE] = TG0_TASK_CNT_CAP_TIMER0, \ + }}, \ + {{ \ + [GPTIMER_ETM_TASK_START_COUNT] = TG1_TASK_CNT_START_TIMER0, \ + [GPTIMER_ETM_TASK_STOP_COUNT] = TG1_TASK_CNT_STOP_TIMER0, \ + [GPTIMER_ETM_TASK_EN_ALARM] = TG1_TASK_ALARM_START_TIMER0, \ + [GPTIMER_ETM_TASK_RELOAD] = TG1_TASK_CNT_RELOAD_TIMER0, \ + [GPTIMER_ETM_TASK_CAPTURE] = TG1_TASK_CNT_CAP_TIMER0, \ + }}, \ }[group][timer][task] -#define TIMER_LL_ETM_EVENT_TABLE(group, timer, event) \ - (uint32_t [2][1][GPTIMER_ETM_EVENT_MAX]){{{ \ - [GPTIMER_ETM_EVENT_ALARM_MATCH] = TIMER0_EVT_CNT_CMP_TIMER0, \ - }}, \ - {{ \ - [GPTIMER_ETM_EVENT_ALARM_MATCH] = TIMER1_EVT_CNT_CMP_TIMER0, \ - }}, \ +#define TIMER_LL_ETM_EVENT_TABLE(group, timer, event) \ + (uint32_t [2][1][GPTIMER_ETM_EVENT_MAX]){{{ \ + [GPTIMER_ETM_EVENT_ALARM_MATCH] = TG0_EVT_CNT_CMP_TIMER0, \ + }}, \ + {{ \ + [GPTIMER_ETM_EVENT_ALARM_MATCH] = TG1_EVT_CNT_CMP_TIMER0, \ + }}, \ }[group][timer][event] /** diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index d9435e8d6fa..469f92cb8bf 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -27,6 +27,10 @@ config SOC_MCPWM_SUPPORTED bool default y +config SOC_ETM_SUPPORTED + bool + default y + config SOC_PARLIO_SUPPORTED bool default y @@ -295,6 +299,18 @@ config SOC_GDMA_PAIRS_PER_GROUP_MAX int default 3 +config SOC_GDMA_SUPPORT_ETM + bool + default y + +config SOC_ETM_GROUPS + int + default 1 + +config SOC_ETM_CHANNELS_PER_GROUP + int + default 50 + config SOC_GPIO_PORT int default 1 @@ -307,6 +323,10 @@ config SOC_GPIO_SUPPORT_PIN_HYS_FILTER bool default y +config SOC_GPIO_SUPPORT_ETM + bool + default y + config SOC_GPIO_SUPPORT_RTC_INDEPENDENT bool default y @@ -635,6 +655,10 @@ config SOC_MCPWM_SWSYNC_CAN_PROPAGATE bool default y +config SOC_MCPWM_SUPPORT_ETM + bool + default y + config SOC_MCPWM_SUPPORT_EVENT_COMPARATOR bool default y @@ -831,6 +855,10 @@ config SOC_SYSTIMER_ALARM_MISS_COMPENSATE bool default y +config SOC_SYSTIMER_SUPPORT_ETM + bool + default y + config SOC_LP_TIMER_BIT_WIDTH_LO int default 32 @@ -855,10 +883,18 @@ config SOC_TIMER_GROUP_SUPPORT_XTAL bool default y +config SOC_TIMER_GROUP_SUPPORT_RC_FAST + bool + default y + config SOC_TIMER_GROUP_TOTAL_TIMERS int default 2 +config SOC_TIMER_SUPPORT_ETM + bool + default y + config SOC_EFUSE_ECDSA_KEY bool default y diff --git a/components/soc/esp32c5/include/soc/gpio_ext_struct.h b/components/soc/esp32c5/include/soc/gpio_ext_struct.h index d8004b7325e..56aa2ecdd9d 100644 --- a/components/soc/esp32c5/include/soc/gpio_ext_struct.h +++ b/components/soc/esp32c5/include/soc/gpio_ext_struct.h @@ -192,20 +192,20 @@ typedef union { * 28: Select GPIO28\\ * 29 ~ 63: Reserved\\ */ - uint32_t etm_ch0_event_sel:6; + uint32_t etm_chn_event_sel:6; uint32_t reserved_6:1; /** etm_ch0_event_en : R/W; bitpos: [7]; default: 0; * Configures whether or not to enable ETM event send.\\ * 0: Not enable\\ * 1: Enable\\ */ - uint32_t etm_ch0_event_en:1; + uint32_t etm_chn_event_en:1; uint32_t reserved_8:24; }; uint32_t val; } gpio_ext_etm_event_chn_cfg_reg_t; -/** Type of etm_task_p0_cfg register +/** Type of etm_task_pn_cfg register * GPIO selection register 0 for ETM */ typedef union { @@ -333,633 +333,8 @@ typedef union { uint32_t reserved_30:2; }; uint32_t val; -} gpio_ext_etm_task_p0_cfg_reg_t; +} gpio_ext_etm_task_pn_cfg_reg_t; -/** Type of etm_task_p1_cfg register - * GPIO selection register 1 for ETM - */ -typedef union { - struct { - /** etm_task_gpio5_sel : R/W; bitpos: [2:0]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio5_sel:3; - uint32_t reserved_3:2; - /** etm_task_gpio5_en : R/W; bitpos: [5]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio5_en:1; - /** etm_task_gpio6_sel : R/W; bitpos: [8:6]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio6_sel:3; - uint32_t reserved_9:2; - /** etm_task_gpio6_en : R/W; bitpos: [11]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio6_en:1; - /** etm_task_gpio7_sel : R/W; bitpos: [14:12]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio7_sel:3; - uint32_t reserved_15:2; - /** etm_task_gpio7_en : R/W; bitpos: [17]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio7_en:1; - /** etm_task_gpio8_sel : R/W; bitpos: [20:18]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio8_sel:3; - uint32_t reserved_21:2; - /** etm_task_gpio8_en : R/W; bitpos: [23]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio8_en:1; - /** etm_task_gpio9_sel : R/W; bitpos: [26:24]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio9_sel:3; - uint32_t reserved_27:2; - /** etm_task_gpio9_en : R/W; bitpos: [29]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio9_en:1; - uint32_t reserved_30:2; - }; - uint32_t val; -} gpio_ext_etm_task_p1_cfg_reg_t; - -/** Type of etm_task_p2_cfg register - * GPIO selection register 2 for ETM - */ -typedef union { - struct { - /** etm_task_gpio10_sel : R/W; bitpos: [2:0]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio10_sel:3; - uint32_t reserved_3:2; - /** etm_task_gpio10_en : R/W; bitpos: [5]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio10_en:1; - /** etm_task_gpio11_sel : R/W; bitpos: [8:6]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio11_sel:3; - uint32_t reserved_9:2; - /** etm_task_gpio11_en : R/W; bitpos: [11]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio11_en:1; - /** etm_task_gpio12_sel : R/W; bitpos: [14:12]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio12_sel:3; - uint32_t reserved_15:2; - /** etm_task_gpio12_en : R/W; bitpos: [17]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio12_en:1; - /** etm_task_gpio13_sel : R/W; bitpos: [20:18]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio13_sel:3; - uint32_t reserved_21:2; - /** etm_task_gpio13_en : R/W; bitpos: [23]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio13_en:1; - /** etm_task_gpio14_sel : R/W; bitpos: [26:24]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio14_sel:3; - uint32_t reserved_27:2; - /** etm_task_gpio14_en : R/W; bitpos: [29]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio14_en:1; - uint32_t reserved_30:2; - }; - uint32_t val; -} gpio_ext_etm_task_p2_cfg_reg_t; - -/** Type of etm_task_p3_cfg register - * GPIO selection register 3 for ETM - */ -typedef union { - struct { - /** etm_task_gpio15_sel : R/W; bitpos: [2:0]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio15_sel:3; - uint32_t reserved_3:2; - /** etm_task_gpio15_en : R/W; bitpos: [5]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio15_en:1; - /** etm_task_gpio16_sel : R/W; bitpos: [8:6]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio16_sel:3; - uint32_t reserved_9:2; - /** etm_task_gpio16_en : R/W; bitpos: [11]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio16_en:1; - /** etm_task_gpio17_sel : R/W; bitpos: [14:12]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio17_sel:3; - uint32_t reserved_15:2; - /** etm_task_gpio17_en : R/W; bitpos: [17]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio17_en:1; - /** etm_task_gpio18_sel : R/W; bitpos: [20:18]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio18_sel:3; - uint32_t reserved_21:2; - /** etm_task_gpio18_en : R/W; bitpos: [23]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio18_en:1; - /** etm_task_gpio19_sel : R/W; bitpos: [26:24]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio19_sel:3; - uint32_t reserved_27:2; - /** etm_task_gpio19_en : R/W; bitpos: [29]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio19_en:1; - uint32_t reserved_30:2; - }; - uint32_t val; -} gpio_ext_etm_task_p3_cfg_reg_t; - -/** Type of etm_task_p4_cfg register - * GPIO selection register 4 for ETM - */ -typedef union { - struct { - /** etm_task_gpio20_sel : R/W; bitpos: [2:0]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio20_sel:3; - uint32_t reserved_3:2; - /** etm_task_gpio20_en : R/W; bitpos: [5]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio20_en:1; - /** etm_task_gpio21_sel : R/W; bitpos: [8:6]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio21_sel:3; - uint32_t reserved_9:2; - /** etm_task_gpio21_en : R/W; bitpos: [11]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio21_en:1; - /** etm_task_gpio22_sel : R/W; bitpos: [14:12]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio22_sel:3; - uint32_t reserved_15:2; - /** etm_task_gpio22_en : R/W; bitpos: [17]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio22_en:1; - /** etm_task_gpio23_sel : R/W; bitpos: [20:18]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio23_sel:3; - uint32_t reserved_21:2; - /** etm_task_gpio23_en : R/W; bitpos: [23]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio23_en:1; - /** etm_task_gpio24_sel : R/W; bitpos: [26:24]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio24_sel:3; - uint32_t reserved_27:2; - /** etm_task_gpio24_en : R/W; bitpos: [29]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio24_en:1; - uint32_t reserved_30:2; - }; - uint32_t val; -} gpio_ext_etm_task_p4_cfg_reg_t; - -/** Type of etm_task_p5_cfg register - * GPIO selection register 5 for ETM - */ -typedef union { - struct { - /** etm_task_gpio25_sel : R/W; bitpos: [2:0]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio25_sel:3; - uint32_t reserved_3:2; - /** etm_task_gpio25_en : R/W; bitpos: [5]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio25_en:1; - /** etm_task_gpio26_sel : R/W; bitpos: [8:6]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio26_sel:3; - uint32_t reserved_9:2; - /** etm_task_gpio26_en : R/W; bitpos: [11]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio26_en:1; - /** etm_task_gpio27_sel : R/W; bitpos: [14:12]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio27_sel:3; - uint32_t reserved_15:2; - /** etm_task_gpio27_en : R/W; bitpos: [17]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio27_en:1; - /** etm_task_gpio28_sel : R/W; bitpos: [20:18]; default: 0; - * Configures to select an ETM task channel for GPIO$n.\\ - * 0: Select channel 0\\ - * 1: Select channel 1\\ - * ......\\ - * 7: Select channel 7\\%\label{fielddesc:GPIOSDETMTASKGPIO1EN}- - * [GPIOSD_ETM_TASK_GPIO1_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO1SEL}- [GPIOSD_ETM_TASK_GPIO1_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO2EN}- - * [GPIOSD_ETM_TASK_GPIO2_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO2SEL}- [GPIOSD_ETM_TASK_GPIO2_SEL] GPIO choose a - * etm task channel. %\label{fielddesc:GPIOSDETMTASKGPIO3EN}\item - * [GPIOSD_ETM_TASK_GPIO3_EN] Enable bit of GPIO response etm task. - * %\label{fielddesc:GPIOSDETMTASKGPIO3SEL}\item [GPIOSD_ETM_TASK_GPIO3_SEL] GPIO - * choose a etm task channel. - */ - uint32_t etm_task_gpio28_sel:3; - uint32_t reserved_21:2; - /** etm_task_gpio28_en : R/W; bitpos: [23]; default: 0; - * Configures whether or not to enable GPIO$n to response ETM task.\\ - * 0: Not enable\\ - * 1: Enable\\ - */ - uint32_t etm_task_gpio28_en:1; - uint32_t reserved_24:8; - }; - uint32_t val; -} gpio_ext_etm_task_p5_cfg_reg_t; /** Group: Interrupt Registers */ @@ -1073,6 +448,12 @@ typedef struct gpio_sd_dev_t { volatile gpio_ext_sigmadeltan_reg_t channel[4]; } gpio_sd_dev_t; +typedef struct gpio_etm_dev_t { + volatile gpio_ext_etm_event_chn_cfg_reg_t etm_event_chn_cfg[8]; + uint32_t reserved_080[8]; + volatile gpio_ext_etm_task_pn_cfg_reg_t etm_task_pn_cfg[6]; +} gpio_etm_dev_t; + typedef struct { volatile gpio_sd_dev_t sigma_delta; uint32_t reserved_018[16]; @@ -1081,14 +462,7 @@ typedef struct { uint32_t reserved_060[30]; volatile gpio_ext_glitch_filter_chn_reg_t glitch_filter_chn[8]; uint32_t reserved_0f8[8]; - volatile gpio_ext_etm_event_chn_cfg_reg_t etm_event_chn_cfg[8]; - uint32_t reserved_138[8]; - volatile gpio_ext_etm_task_p0_cfg_reg_t etm_task_p0_cfg; - volatile gpio_ext_etm_task_p1_cfg_reg_t etm_task_p1_cfg; - volatile gpio_ext_etm_task_p2_cfg_reg_t etm_task_p2_cfg; - volatile gpio_ext_etm_task_p3_cfg_reg_t etm_task_p3_cfg; - volatile gpio_ext_etm_task_p4_cfg_reg_t etm_task_p4_cfg; - volatile gpio_ext_etm_task_p5_cfg_reg_t etm_task_p5_cfg; + volatile gpio_etm_dev_t etm; uint32_t reserved_170[24]; volatile gpio_ext_int_raw_reg_t int_raw; volatile gpio_ext_int_st_reg_t int_st; @@ -1100,6 +474,7 @@ typedef struct { } gpio_ext_dev_t; extern gpio_sd_dev_t SDM; +extern gpio_etm_dev_t GPIO_ETM; extern gpio_ext_dev_t GPIO_EXT; #ifndef __cplusplus diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index b63ac4b9035..35aa0bd9a44 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -26,7 +26,7 @@ #define SOC_PCNT_SUPPORTED 1 #define SOC_MCPWM_SUPPORTED 1 // #define SOC_TWAI_SUPPORTED 1 // TODO: [ESP32C5] IDF-8691 -// #define SOC_ETM_SUPPORTED 1 // TODO: [ESP32C5] IDF-8693 +#define SOC_ETM_SUPPORTED 1 #define SOC_PARLIO_SUPPORTED 1 #define SOC_ASYNC_MEMCPY_SUPPORTED 1 #define SOC_USB_SERIAL_JTAG_SUPPORTED 1 @@ -177,12 +177,12 @@ #define SOC_AHB_GDMA_VERSION 2 #define SOC_GDMA_NUM_GROUPS_MAX 1U #define SOC_GDMA_PAIRS_PER_GROUP_MAX 3 -// #define SOC_GDMA_SUPPORT_ETM 1 // Support ETM submodule TODO: IDF-9224 +#define SOC_GDMA_SUPPORT_ETM 1 // #define SOC_GDMA_SUPPORT_SLEEP_RETENTION 1 // TODO: IDF-9225 /*-------------------------- ETM CAPS --------------------------------------*/ -// #define SOC_ETM_GROUPS 1U // Number of ETM groups -// #define SOC_ETM_CHANNELS_PER_GROUP 50 // Number of ETM channels in the group +#define SOC_ETM_GROUPS 1U // Number of ETM groups +#define SOC_ETM_CHANNELS_PER_GROUP 50 // Number of ETM channels in the group /*-------------------------- GPIO CAPS ---------------------------------------*/ // ESP32-C5 has 1 GPIO peripheral @@ -193,7 +193,7 @@ #define SOC_GPIO_SUPPORT_PIN_HYS_FILTER 1 // GPIO peripheral has the ETM extension -// #define SOC_GPIO_SUPPORT_ETM 1 +#define SOC_GPIO_SUPPORT_ETM 1 // Target has the full LP IO subsystem // On ESP32-C5, Digital IOs have their own registers to control pullup/down capability, independent of LP registers. @@ -338,7 +338,7 @@ #define SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER 3 ///< The number of capture channels that each capture timer has #define SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP 3 ///< The number of GPIO synchros that each group has #define SOC_MCPWM_SWSYNC_CAN_PROPAGATE 1 ///< Software sync event can be routed to its output -// #define SOC_MCPWM_SUPPORT_ETM 1 ///< Support ETM (Event Task Matrix) +#define SOC_MCPWM_SUPPORT_ETM 1 ///< Support ETM (Event Task Matrix) #define SOC_MCPWM_SUPPORT_EVENT_COMPARATOR 1 ///< Support event comparator (based on ETM) #define SOC_MCPWM_CAPTURE_CLK_FROM_GROUP 1 ///< Capture timer shares clock with other PWM timers @@ -438,7 +438,7 @@ #define SOC_SYSTIMER_SUPPORT_RC_FAST 1 // Systimer can use RC_FAST clock source #define SOC_SYSTIMER_INT_LEVEL 1 // Systimer peripheral uses level interrupt #define SOC_SYSTIMER_ALARM_MISS_COMPENSATE 1 // Systimer peripheral can generate interrupt immediately if t(target) > t(current) -// #define SOC_SYSTIMER_SUPPORT_ETM 1 // Systimer comparator can generate ETM event +#define SOC_SYSTIMER_SUPPORT_ETM 1 // Systimer comparator can generate ETM event /*-------------------------- LP_TIMER CAPS ----------------------------------*/ #define SOC_LP_TIMER_BIT_WIDTH_LO 32 // Bit width of lp_timer low part @@ -449,9 +449,9 @@ #define SOC_TIMER_GROUP_TIMERS_PER_GROUP (1U) #define SOC_TIMER_GROUP_COUNTER_BIT_WIDTH (54) #define SOC_TIMER_GROUP_SUPPORT_XTAL (1) -// #define SOC_TIMER_GROUP_SUPPORT_RC_FAST (1) +#define SOC_TIMER_GROUP_SUPPORT_RC_FAST (1) #define SOC_TIMER_GROUP_TOTAL_TIMERS (2) -// #define SOC_TIMER_SUPPORT_ETM (1) +#define SOC_TIMER_SUPPORT_ETM (1) // #define SOC_TIMER_SUPPORT_SLEEP_RETENTION (1) /*--------------------------- WATCHDOG CAPS ---------------------------------------*/ diff --git a/components/soc/esp32c5/include/soc/soc_etm_struct.h b/components/soc/esp32c5/include/soc/soc_etm_struct.h index e3d65f06c1d..01ece71a0ad 100644 --- a/components/soc/esp32c5/include/soc/soc_etm_struct.h +++ b/components/soc/esp32c5/include/soc/soc_etm_struct.h @@ -3602,113 +3602,17 @@ typedef union { } soc_etm_date_reg_t; -typedef struct { +typedef struct soc_etm_dev_t { volatile soc_etm_ch_ena_ad0_reg_t ch_ena_ad0; volatile soc_etm_ch_ena_ad0_set_reg_t ch_ena_ad0_set; volatile soc_etm_ch_ena_ad0_clr_reg_t ch_ena_ad0_clr; volatile soc_etm_ch_ena_ad1_reg_t ch_ena_ad1; volatile soc_etm_ch_ena_ad1_set_reg_t ch_ena_ad1_set; volatile soc_etm_ch_ena_ad1_clr_reg_t ch_ena_ad1_clr; - volatile soc_etm_chn_evt_id_reg_t ch0_evt_id; - volatile soc_etm_chn_task_id_reg_t ch0_task_id; - volatile soc_etm_chn_evt_id_reg_t ch1_evt_id; - volatile soc_etm_chn_task_id_reg_t ch1_task_id; - volatile soc_etm_chn_evt_id_reg_t ch2_evt_id; - volatile soc_etm_chn_task_id_reg_t ch2_task_id; - volatile soc_etm_chn_evt_id_reg_t ch3_evt_id; - volatile soc_etm_chn_task_id_reg_t ch3_task_id; - volatile soc_etm_chn_evt_id_reg_t ch4_evt_id; - volatile soc_etm_chn_task_id_reg_t ch4_task_id; - volatile soc_etm_chn_evt_id_reg_t ch5_evt_id; - volatile soc_etm_chn_task_id_reg_t ch5_task_id; - volatile soc_etm_chn_evt_id_reg_t ch6_evt_id; - volatile soc_etm_chn_task_id_reg_t ch6_task_id; - volatile soc_etm_chn_evt_id_reg_t ch7_evt_id; - volatile soc_etm_chn_task_id_reg_t ch7_task_id; - volatile soc_etm_chn_evt_id_reg_t ch8_evt_id; - volatile soc_etm_chn_task_id_reg_t ch8_task_id; - volatile soc_etm_chn_evt_id_reg_t ch9_evt_id; - volatile soc_etm_chn_task_id_reg_t ch9_task_id; - volatile soc_etm_chn_evt_id_reg_t ch10_evt_id; - volatile soc_etm_chn_task_id_reg_t ch10_task_id; - volatile soc_etm_chn_evt_id_reg_t ch11_evt_id; - volatile soc_etm_chn_task_id_reg_t ch11_task_id; - volatile soc_etm_chn_evt_id_reg_t ch12_evt_id; - volatile soc_etm_chn_task_id_reg_t ch12_task_id; - volatile soc_etm_chn_evt_id_reg_t ch13_evt_id; - volatile soc_etm_chn_task_id_reg_t ch13_task_id; - volatile soc_etm_chn_evt_id_reg_t ch14_evt_id; - volatile soc_etm_chn_task_id_reg_t ch14_task_id; - volatile soc_etm_chn_evt_id_reg_t ch15_evt_id; - volatile soc_etm_chn_task_id_reg_t ch15_task_id; - volatile soc_etm_chn_evt_id_reg_t ch16_evt_id; - volatile soc_etm_chn_task_id_reg_t ch16_task_id; - volatile soc_etm_chn_evt_id_reg_t ch17_evt_id; - volatile soc_etm_chn_task_id_reg_t ch17_task_id; - volatile soc_etm_chn_evt_id_reg_t ch18_evt_id; - volatile soc_etm_chn_task_id_reg_t ch18_task_id; - volatile soc_etm_chn_evt_id_reg_t ch19_evt_id; - volatile soc_etm_chn_task_id_reg_t ch19_task_id; - volatile soc_etm_chn_evt_id_reg_t ch20_evt_id; - volatile soc_etm_chn_task_id_reg_t ch20_task_id; - volatile soc_etm_chn_evt_id_reg_t ch21_evt_id; - volatile soc_etm_chn_task_id_reg_t ch21_task_id; - volatile soc_etm_chn_evt_id_reg_t ch22_evt_id; - volatile soc_etm_chn_task_id_reg_t ch22_task_id; - volatile soc_etm_chn_evt_id_reg_t ch23_evt_id; - volatile soc_etm_chn_task_id_reg_t ch23_task_id; - volatile soc_etm_chn_evt_id_reg_t ch24_evt_id; - volatile soc_etm_chn_task_id_reg_t ch24_task_id; - volatile soc_etm_chn_evt_id_reg_t ch25_evt_id; - volatile soc_etm_chn_task_id_reg_t ch25_task_id; - volatile soc_etm_chn_evt_id_reg_t ch26_evt_id; - volatile soc_etm_chn_task_id_reg_t ch26_task_id; - volatile soc_etm_chn_evt_id_reg_t ch27_evt_id; - volatile soc_etm_chn_task_id_reg_t ch27_task_id; - volatile soc_etm_chn_evt_id_reg_t ch28_evt_id; - volatile soc_etm_chn_task_id_reg_t ch28_task_id; - volatile soc_etm_chn_evt_id_reg_t ch29_evt_id; - volatile soc_etm_chn_task_id_reg_t ch29_task_id; - volatile soc_etm_chn_evt_id_reg_t ch30_evt_id; - volatile soc_etm_chn_task_id_reg_t ch30_task_id; - volatile soc_etm_chn_evt_id_reg_t ch31_evt_id; - volatile soc_etm_chn_task_id_reg_t ch31_task_id; - volatile soc_etm_chn_evt_id_reg_t ch32_evt_id; - volatile soc_etm_chn_task_id_reg_t ch32_task_id; - volatile soc_etm_chn_evt_id_reg_t ch33_evt_id; - volatile soc_etm_chn_task_id_reg_t ch33_task_id; - volatile soc_etm_chn_evt_id_reg_t ch34_evt_id; - volatile soc_etm_chn_task_id_reg_t ch34_task_id; - volatile soc_etm_chn_evt_id_reg_t ch35_evt_id; - volatile soc_etm_chn_task_id_reg_t ch35_task_id; - volatile soc_etm_chn_evt_id_reg_t ch36_evt_id; - volatile soc_etm_chn_task_id_reg_t ch36_task_id; - volatile soc_etm_chn_evt_id_reg_t ch37_evt_id; - volatile soc_etm_chn_task_id_reg_t ch37_task_id; - volatile soc_etm_chn_evt_id_reg_t ch38_evt_id; - volatile soc_etm_chn_task_id_reg_t ch38_task_id; - volatile soc_etm_chn_evt_id_reg_t ch39_evt_id; - volatile soc_etm_chn_task_id_reg_t ch39_task_id; - volatile soc_etm_chn_evt_id_reg_t ch40_evt_id; - volatile soc_etm_chn_task_id_reg_t ch40_task_id; - volatile soc_etm_chn_evt_id_reg_t ch41_evt_id; - volatile soc_etm_chn_task_id_reg_t ch41_task_id; - volatile soc_etm_chn_evt_id_reg_t ch42_evt_id; - volatile soc_etm_chn_task_id_reg_t ch42_task_id; - volatile soc_etm_chn_evt_id_reg_t ch43_evt_id; - volatile soc_etm_chn_task_id_reg_t ch43_task_id; - volatile soc_etm_chn_evt_id_reg_t ch44_evt_id; - volatile soc_etm_chn_task_id_reg_t ch44_task_id; - volatile soc_etm_chn_evt_id_reg_t ch45_evt_id; - volatile soc_etm_chn_task_id_reg_t ch45_task_id; - volatile soc_etm_chn_evt_id_reg_t ch46_evt_id; - volatile soc_etm_chn_task_id_reg_t ch46_task_id; - volatile soc_etm_chn_evt_id_reg_t ch47_evt_id; - volatile soc_etm_chn_task_id_reg_t ch47_task_id; - volatile soc_etm_chn_evt_id_reg_t ch48_evt_id; - volatile soc_etm_chn_task_id_reg_t ch48_task_id; - volatile soc_etm_chn_evt_id_reg_t ch49_evt_id; - volatile soc_etm_chn_task_id_reg_t ch49_task_id; + volatile struct { + soc_etm_chn_evt_id_reg_t eid; + soc_etm_chn_task_id_reg_t tid; + } channel[50]; volatile soc_etm_evt_st0_reg_t evt_st0; volatile soc_etm_evt_st0_clr_reg_t evt_st0_clr; volatile soc_etm_evt_st1_reg_t evt_st1; diff --git a/components/soc/esp32c5/ld/esp32c5.peripherals.ld b/components/soc/esp32c5/ld/esp32c5.peripherals.ld index 7d78fd392a0..31097118a3f 100644 --- a/components/soc/esp32c5/ld/esp32c5.peripherals.ld +++ b/components/soc/esp32c5/ld/esp32c5.peripherals.ld @@ -44,6 +44,7 @@ PROVIDE ( IO_MUX = 0x60090000 ); PROVIDE ( GPIO = 0x60091000 ); PROVIDE ( GPIO_EXT = 0x60091e00 ); PROVIDE ( SDM = 0x60091e00 ); +PROVIDE ( GPIO_ETM = 0x60091f18 ); PROVIDE ( MEM_MONITOR = 0x60092000 ); PROVIDE ( PAU = 0x60093000 ); PROVIDE ( HP_SYSTEM = 0x60095000 ); diff --git a/docs/docs_not_updated/esp32c5.txt b/docs/docs_not_updated/esp32c5.txt index 10d49479d1f..132596763ef 100644 --- a/docs/docs_not_updated/esp32c5.txt +++ b/docs/docs_not_updated/esp32c5.txt @@ -90,7 +90,6 @@ api-reference/peripherals/usb_host/usb_host_notes_ext_hub.rst api-reference/peripherals/usb_device.rst api-reference/peripherals/sdspi_host.rst api-reference/peripherals/spi_slave.rst -api-reference/peripherals/etm.rst api-reference/peripherals/gptimer.rst api-reference/peripherals/touch_element.rst api-reference/peripherals/lcd.rst diff --git a/examples/peripherals/timer_group/gptimer_capture_hc_sr04/README.md b/examples/peripherals/timer_group/gptimer_capture_hc_sr04/README.md index 474d93d775f..26ed2f38b78 100644 --- a/examples/peripherals/timer_group/gptimer_capture_hc_sr04/README.md +++ b/examples/peripherals/timer_group/gptimer_capture_hc_sr04/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C6 | ESP32-H2 | ESP32-P4 | -| ----------------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | +| ----------------- | -------- | -------- | -------- | -------- | # HC-SR04 Example based on GPTimer Capture and ETM diff --git a/examples/peripherals/timer_group/gptimer_capture_hc_sr04/pytest_gptimer_capture_example.py b/examples/peripherals/timer_group/gptimer_capture_hc_sr04/pytest_gptimer_capture_example.py index 809c04f3361..0c668e45bb1 100644 --- a/examples/peripherals/timer_group/gptimer_capture_hc_sr04/pytest_gptimer_capture_example.py +++ b/examples/peripherals/timer_group/gptimer_capture_hc_sr04/pytest_gptimer_capture_example.py @@ -1,10 +1,10 @@ # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 From 564b74a9c045a2a2b6c0f85ca54ec4a1eec577fa Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 11 Jul 2024 15:25:18 +0800 Subject: [PATCH 025/113] feat(cache): supported cache panic on p4 --- .../port/soc/esp32p4/cache_err_int.c | 32 +++++++---- components/hal/esp32p4/include/hal/cache_ll.h | 54 ++++++++++++++++--- .../soc/esp32p4/include/soc/cache_struct.h | 13 ++--- .../soc/esp32p4/ld/esp32p4.peripherals.ld | 2 + tools/test_apps/system/panic/pytest_panic.py | 4 +- 5 files changed, 79 insertions(+), 26 deletions(-) diff --git a/components/esp_system/port/soc/esp32p4/cache_err_int.c b/components/esp_system/port/soc/esp32p4/cache_err_int.c index c1a20bbee16..24904c2d5a8 100644 --- a/components/esp_system/port/soc/esp32p4/cache_err_int.c +++ b/components/esp_system/port/soc/esp32p4/cache_err_int.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -20,19 +20,24 @@ static const char *TAG = "CACHE_ERR"; -//TODO: IDF-7515 +const char cache_error_msg[] = "Cache access error"; + const char *esp_cache_err_panic_string(void) { - return NULL; + uint32_t access_err_status = cache_ll_l1_get_access_error_intr_status(0, CACHE_LL_L1_ACCESS_EVENT_MASK) | cache_ll_l2_get_access_error_intr_status(0, CACHE_LL_L2_ACCESS_EVENT_MASK); + + /* Return the error string if a cache error is active */ + const char* err_str = access_err_status ? cache_error_msg : NULL; + + return err_str; } -//TODO: IDF-7515 bool esp_cache_err_has_active_err(void) { - return false; + bool has_active_err = cache_ll_l1_get_access_error_intr_status(0, CACHE_LL_L1_ACCESS_EVENT_MASK) | cache_ll_l2_get_access_error_intr_status(0, CACHE_LL_L2_ACCESS_EVENT_MASK); + return has_active_err; } -//TODO: IDF-7515 void esp_cache_err_int_init(void) { const uint32_t core_id = 0; @@ -56,10 +61,13 @@ void esp_cache_err_int_init(void) esprv_int_set_priority(ETS_CACHEERR_INUM, SOC_INTERRUPT_LEVEL_MEDIUM); ESP_DRAM_LOGV(TAG, "access error intr clr & ena mask is: 0x%x", CACHE_LL_L1_ACCESS_EVENT_MASK); - /* On the hardware side, start by clearing all the bits reponsible for cache access error */ + /* On the hardware side, start by clearing all the bits responsible for cache access error */ cache_ll_l1_clear_access_error_intr(0, CACHE_LL_L1_ACCESS_EVENT_MASK); + cache_ll_l2_clear_access_error_intr(0, CACHE_LL_L2_ACCESS_EVENT_MASK); + /* Then enable cache access error interrupts. */ cache_ll_l1_enable_access_error_intr(0, CACHE_LL_L1_ACCESS_EVENT_MASK); + cache_ll_l2_enable_access_error_intr(0, CACHE_LL_L2_ACCESS_EVENT_MASK); /* Enable the interrupts for cache error. */ ESP_INTR_ENABLE(ETS_CACHEERR_INUM); @@ -67,7 +75,11 @@ void esp_cache_err_int_init(void) int esp_cache_err_get_cpuid(void) { - //TODO: IDF-7515 - //Should return hart ID according to the cache error - return 0; + if (cache_ll_l1_get_access_error_intr_status(0, CACHE_LL_L1_CORE0_EVENT_MASK)) { + return 0; + } else if (cache_ll_l1_get_access_error_intr_status(0, CACHE_LL_L1_CORE1_EVENT_MASK)) { + return 1; + } else { + return -1; + } } diff --git a/components/hal/esp32p4/include/hal/cache_ll.h b/components/hal/esp32p4/include/hal/cache_ll.h index c2f4bbd2f0a..5e1a07130ee 100644 --- a/components/hal/esp32p4/include/hal/cache_ll.h +++ b/components/hal/esp32p4/include/hal/cache_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -10,6 +10,7 @@ #include #include "soc/cache_reg.h" +#include "soc/cache_struct.h" #include "soc/ext_mem_defs.h" #include "hal/cache_types.h" #include "hal/assert.h" @@ -47,8 +48,10 @@ extern "C" { #define CACHE_LL_DEFAULT_IBUS_MASK (CACHE_BUS_IBUS0 | CACHE_BUS_IBUS1 | CACHE_BUS_IBUS2) #define CACHE_LL_DEFAULT_DBUS_MASK (CACHE_BUS_DBUS0 | CACHE_BUS_DBUS1 | CACHE_BUS_DBUS2) -//TODO: IDF-7515 -#define CACHE_LL_L1_ACCESS_EVENT_MASK (0x3f) +#define CACHE_LL_L1_ACCESS_EVENT_MASK (0x1f) +#define CACHE_LL_L2_ACCESS_EVENT_MASK (1<<6) +#define CACHE_LL_L1_CORE0_EVENT_MASK (1<<0) +#define CACHE_LL_L1_CORE1_EVENT_MASK (1<<1) /*------------------------------------------------------------------------------ * Autoload @@ -1019,27 +1022,29 @@ static inline bool cache_ll_vaddr_to_cache_level_id(uint32_t vaddr_start, uint32 * Interrupt *----------------------------------------------------------------------------*/ /** - * @brief Enable Cache access error interrupt + * @brief Enable L1 Cache access error interrupt * * @param cache_id Cache ID * @param mask Interrupt mask */ static inline void cache_ll_l1_enable_access_error_intr(uint32_t cache_id, uint32_t mask) { + CACHE.l1_cache_acs_fail_int_ena.val |= mask; } /** - * @brief Clear Cache access error interrupt status + * @brief Clear L1 Cache access error interrupt status * * @param cache_id Cache ID * @param mask Interrupt mask */ static inline void cache_ll_l1_clear_access_error_intr(uint32_t cache_id, uint32_t mask) { + CACHE.l1_cache_acs_fail_int_clr.val = mask; } /** - * @brief Get Cache access error interrupt status + * @brief Get L1 Cache access error interrupt status * * @param cache_id Cache ID * @param mask Interrupt mask @@ -1048,7 +1053,42 @@ static inline void cache_ll_l1_clear_access_error_intr(uint32_t cache_id, uint32 */ static inline uint32_t cache_ll_l1_get_access_error_intr_status(uint32_t cache_id, uint32_t mask) { - return 0; + return CACHE.l1_cache_acs_fail_int_st.val & mask; +} + +/** + * @brief Enable L2 Cache access error interrupt + * + * @param cache_id Cache ID + * @param mask Interrupt mask + */ +static inline void cache_ll_l2_enable_access_error_intr(uint32_t cache_id, uint32_t mask) +{ + CACHE.l2_cache_acs_fail_int_ena.val |= mask; +} + +/** + * @brief Clear L2 Cache access error interrupt status + * + * @param cache_id Cache ID + * @param mask Interrupt mask + */ +static inline void cache_ll_l2_clear_access_error_intr(uint32_t cache_id, uint32_t mask) +{ + CACHE.l2_cache_acs_fail_int_clr.val = mask; +} + +/** + * @brief Get L2 Cache access error interrupt status + * + * @param cache_id Cache ID + * @param mask Interrupt mask + * + * @return Status mask + */ +static inline uint32_t cache_ll_l2_get_access_error_intr_status(uint32_t cache_id, uint32_t mask) +{ + return CACHE.l2_cache_acs_fail_int_st.val & mask; } #ifdef __cplusplus diff --git a/components/soc/esp32p4/include/soc/cache_struct.h b/components/soc/esp32p4/include/soc/cache_struct.h index 0c6fb056d52..67e57371b29 100644 --- a/components/soc/esp32p4/include/soc/cache_struct.h +++ b/components/soc/esp32p4/include/soc/cache_struct.h @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -5269,12 +5269,12 @@ typedef union { struct { /** l1_icache0_unalloc_clr : R/W; bitpos: [0]; default: 0; * The bit is used to clear the unallocate request buffer of l1 icache0 where the - * unallocate request is responsed but not completed. + * unallocate request is responded but not completed. */ uint32_t l1_icache0_unalloc_clr:1; /** l1_icache1_unalloc_clr : R/W; bitpos: [1]; default: 0; * The bit is used to clear the unallocate request buffer of l1 icache1 where the - * unallocate request is responsed but not completed. + * unallocate request is responded but not completed. */ uint32_t l1_icache1_unalloc_clr:1; /** l1_icache2_unalloc_clr : HRO; bitpos: [2]; default: 0; @@ -5287,7 +5287,7 @@ typedef union { uint32_t l1_icache3_unalloc_clr:1; /** l1_dcache_unalloc_clr : R/W; bitpos: [4]; default: 0; * The bit is used to clear the unallocate request buffer of l1 dcache where the - * unallocate request is responsed but not completed. + * unallocate request is responded but not completed. */ uint32_t l1_dcache_unalloc_clr:1; uint32_t reserved_5:27; @@ -5303,7 +5303,7 @@ typedef union { uint32_t reserved_0:5; /** l2_cache_unalloc_clr : R/W; bitpos: [5]; default: 0; * The bit is used to clear the unallocate request buffer of l2 icache where the - * unallocate request is responsed but not completed. + * unallocate request is responded but not completed. */ uint32_t l2_cache_unalloc_clr:1; uint32_t reserved_6:26; @@ -5548,7 +5548,7 @@ typedef union { } cache_date_reg_t; -typedef struct { +typedef struct cache_dev_t { volatile cache_l1_icache_ctrl_reg_t l1_icache_ctrl; volatile cache_l1_dcache_ctrl_reg_t l1_dcache_ctrl; volatile cache_l1_bypass_cache_conf_reg_t l1_bypass_cache_conf; @@ -5799,6 +5799,7 @@ typedef struct { volatile cache_date_reg_t date; } cache_dev_t; +extern cache_dev_t CACHE; #ifndef __cplusplus _Static_assert(sizeof(cache_dev_t) == 0x400, "Invalid size of cache_dev_t structure"); diff --git a/components/soc/esp32p4/ld/esp32p4.peripherals.ld b/components/soc/esp32p4/ld/esp32p4.peripherals.ld index f8aaaf3fefd..82b7bd46b78 100644 --- a/components/soc/esp32p4/ld/esp32p4.peripherals.ld +++ b/components/soc/esp32p4/ld/esp32p4.peripherals.ld @@ -117,3 +117,5 @@ PROVIDE ( USB_UTMI = 0x5009C000 ); PROVIDE ( EMAC_MAC = 0x50098000 ); PROVIDE ( EMAC_DMA = 0x50099000 ); + +PROVIDE ( CACHE = 0x3FF10000); diff --git a/tools/test_apps/system/panic/pytest_panic.py b/tools/test_apps/system/panic/pytest_panic.py index 3339147b202..c6b26f3c982 100644 --- a/tools/test_apps/system/panic/pytest_panic.py +++ b/tools/test_apps/system/panic/pytest_panic.py @@ -299,14 +299,12 @@ def test_cache_error(dut: PanicTestDut, config: str, test_func_name: str) -> Non if dut.target in ['esp32c3', 'esp32c2']: dut.expect_gme('Cache error') dut.expect_exact('Cached memory region accessed while ibus or cache is disabled') - elif dut.target in ['esp32c6', 'esp32h2']: + elif dut.target in ['esp32c6', 'esp32h2', 'esp32p4']: dut.expect_gme('Cache error') dut.expect_exact('Cache access error') elif dut.target in ['esp32s2']: # Cache error interrupt is not enabled, IDF-1558 dut.expect_gme('IllegalInstruction') - elif dut.target in ['esp32p4']: # TODO IDF-7515 - dut.expect_gme('Instruction access fault') else: dut.expect_gme('Cache disabled but cached memory region accessed') dut.expect_reg_dump(0) From 3aa448ee0df81afc844894bfe1e3a59205a72a8a Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Wed, 10 Jul 2024 12:01:46 +0530 Subject: [PATCH 026/113] fix: disable config for RSA during secure boot support for RSA secure boot is disabled for ESP32-ECO0 due to hardware issue. It will be re-enabled in future version ECO1. For ESP32C5- ECO0 , ECDSA secure boot is the recommended option. --- components/soc/esp32c5/include/soc/Kconfig.soc_caps.in | 4 ---- components/soc/esp32c5/include/soc/soc_caps.h | 1 - docs/en/security/secure-boot-v2.rst | 6 +++--- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index d9435e8d6fa..b59bbf060fe 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -863,10 +863,6 @@ config SOC_EFUSE_ECDSA_KEY bool default y -config SOC_SECURE_BOOT_V2_RSA - bool - default y - config SOC_SECURE_BOOT_V2_ECC bool default y diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index b63ac4b9035..751341a7e8e 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -474,7 +474,6 @@ #define SOC_EFUSE_ECDSA_KEY 1 /*-------------------------- Secure Boot CAPS----------------------------*/ -#define SOC_SECURE_BOOT_V2_RSA 1 #define SOC_SECURE_BOOT_V2_ECC 1 #define SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS 3 #define SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS 1 diff --git a/docs/en/security/secure-boot-v2.rst b/docs/en/security/secure-boot-v2.rst index 4b84a2780fa..f9cf3d374eb 100644 --- a/docs/en/security/secure-boot-v2.rst +++ b/docs/en/security/secure-boot-v2.rst @@ -7,9 +7,9 @@ Secure Boot v2 {IDF_TARGET_SBV2_SCHEME:default="RSA-PSS", esp32c2="ECDSA", esp32c6="RSA-PSS or ECDSA", esp32h2="RSA-PSS or ECDSA", esp32p4="RSA-PSS or ECDSA", esp32c5="RSA-PSS or ECDSA"} -{IDF_TARGET_SBV2_KEY:default="RSA-3072", esp32c2="ECDSA-256 or ECDSA-192", esp32c6="RSA-3072, ECDSA-256, or ECDSA-192", esp32h2="RSA-3072, ECDSA-256, or ECDSA-192", esp32p4="RSA-3072, ECDSA-256, or ECDSA-192", esp32c5="RSA-3072, ECDSA-256, or ECDSA-192"} +{IDF_TARGET_SBV2_KEY:default="RSA-3072", esp32c2="ECDSA-256 or ECDSA-192", esp32c6="RSA-3072, ECDSA-256, or ECDSA-192", esp32h2="RSA-3072, ECDSA-256, or ECDSA-192", esp32p4="RSA-3072, ECDSA-256, or ECDSA-192", esp32c5="ECDSA-256, or ECDSA-192"} -{IDF_TARGET_SECURE_BOOT_OPTION_TEXT:default="", esp32c6="RSA is recommended because of faster verification time. You can choose between RSA and ECDSA scheme from the menu.", esp32h2="RSA is recommended because of faster verification time. You can choose between RSA and ECDSA scheme from the menu.", esp32p4="RSA is recommended because of faster verification time. You can choose between RSA and ECDSA scheme from the menu.", esp32c5="RSA is recommended because of faster verification time. You can choose between RSA and ECDSA scheme from the menu."} +{IDF_TARGET_SECURE_BOOT_OPTION_TEXT:default="", esp32c6="RSA is recommended because of faster verification time. You can choose between RSA and ECDSA scheme from the menu.", esp32h2="RSA is recommended because of faster verification time. You can choose between RSA and ECDSA scheme from the menu.", esp32p4="RSA is recommended because of faster verification time. You can choose between RSA and ECDSA scheme from the menu."} {IDF_TARGET_ECO_VERSION:default="", esp32="(v3.0 onwards)", esp32c3="(v3.0 onwards)"} @@ -19,7 +19,7 @@ Secure Boot v2 {IDF_TARGET_CPU_FREQ:default="", esp32c6="160 MHz", esp32h2="96 MHz", esp32p4="360 MHz"} -{IDF_TARGET_SBV2_DEFAULT_SCHEME:default="RSA", esp32c2="ECDSA (v2)"} +{IDF_TARGET_SBV2_DEFAULT_SCHEME:default="RSA", esp32c2="ECDSA (v2), esp32c5="ECDSA (v2)"} .. important:: From f55ab6f17cdbb7cfe89be03f6432cfbef930eb4c Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Fri, 12 Jul 2024 15:40:36 +0800 Subject: [PATCH 027/113] fix(esp_hw_support): fix cpu_retention cache invalidate mask --- .../lowpower/cpu_retention/port/esp32p4/sleep_cpu_asm.S | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/esp_hw_support/lowpower/cpu_retention/port/esp32p4/sleep_cpu_asm.S b/components/esp_hw_support/lowpower/cpu_retention/port/esp32p4/sleep_cpu_asm.S index 046ef617776..f6d8a9d6dda 100644 --- a/components/esp_hw_support/lowpower/cpu_retention/port/esp32p4/sleep_cpu_asm.S +++ b/components/esp_hw_support/lowpower/cpu_retention/port/esp32p4/sleep_cpu_asm.S @@ -10,7 +10,8 @@ #include "sdkconfig.h" #include "soc/cache_reg.h" -#define MTVT (0x307) +#define CACHE_MAP_L1_CACHE_MASK (BIT(0) | BIT(1) | BIT(4)) +#define MTVT (0x307) .section .tcm.data,"aw" .global rv_core_critical_regs_frame @@ -154,7 +155,7 @@ rv_core_critical_regs_restore: /* Core 0 is wakeup core, Invalidate L1 Cache here */ /* Invalidate L1 cache is required here!!! */ la t0, CACHE_SYNC_MAP_REG - li t1, 0x7 /* map l1 i/dcache */ + li t1, CACHE_MAP_L1_CACHE_MASK /* map l1 i/dcache */ sw t1, 0x0(t0) /* set EXTMEM_CACHE_SYNC_MAP_REG bit 4 */ la t2, CACHE_SYNC_ADDR_REG sw zero, 0x0(t2) /* clear EXTMEM_CACHE_SYNC_ADDR_REG */ From 55fd3f10592bcb5e8e4dab2646b2f958b3e256cd Mon Sep 17 00:00:00 2001 From: linruihao Date: Fri, 12 Jul 2024 11:35:20 +0800 Subject: [PATCH 028/113] fix(coex): Update bt lib for ESP32-C3 and ESP32-S3(e4ba7f6) - Fixed coexist LoadProhibited issue --- components/bt/controller/lib_esp32c3_family | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c3_family b/components/bt/controller/lib_esp32c3_family index d53a6a695af..55485554203 160000 --- a/components/bt/controller/lib_esp32c3_family +++ b/components/bt/controller/lib_esp32c3_family @@ -1 +1 @@ -Subproject commit d53a6a695af1e78a6f36691e2cf525f9787abfdb +Subproject commit 55485554203a225ff09a8dfcf5284c46b70aa0bd From 1f14018c30347725397e8800caaede4b079746ae Mon Sep 17 00:00:00 2001 From: David Cermak Date: Fri, 24 May 2024 11:53:25 +0200 Subject: [PATCH 029/113] feat(lwip): Add support for PPP Auth using mbedTLS Closes https://github.com/espressif/esp-idf/issues/13597 --- components/lwip/CMakeLists.txt | 20 ++++++++++++++------ components/lwip/Kconfig | 11 +++++++++++ components/lwip/lwip | 2 +- components/lwip/port/include/lwipopts.h | 9 +++++++++ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/components/lwip/CMakeLists.txt b/components/lwip/CMakeLists.txt index f45eeab2ed1..8c55884277d 100644 --- a/components/lwip/CMakeLists.txt +++ b/components/lwip/CMakeLists.txt @@ -132,12 +132,7 @@ if(CONFIG_LWIP_ENABLE) "lwip/src/netif/ppp/pppos.c" "lwip/src/netif/ppp/upap.c" "lwip/src/netif/ppp/utils.c" - "lwip/src/netif/ppp/vj.c" - "lwip/src/netif/ppp/polarssl/arc4.c" - "lwip/src/netif/ppp/polarssl/des.c" - "lwip/src/netif/ppp/polarssl/md4.c" - "lwip/src/netif/ppp/polarssl/md5.c" - "lwip/src/netif/ppp/polarssl/sha1.c") + "lwip/src/netif/ppp/vj.c") endif() if(NOT ${target} STREQUAL "linux") @@ -160,6 +155,15 @@ if(CONFIG_LWIP_ENABLE) "apps/ping/ping_sock.c") endif() + if(NOT CONFIG_LWIP_USE_EXTERNAL_MBEDTLS) + list(APPEND srcs + "lwip/src/netif/ppp/polarssl/arc4.c" + "lwip/src/netif/ppp/polarssl/des.c" + "lwip/src/netif/ppp/polarssl/md4.c" + "lwip/src/netif/ppp/polarssl/md5.c" + "lwip/src/netif/ppp/polarssl/sha1.c") + endif() + if(CONFIG_LWIP_DHCPS) list(APPEND srcs "apps/dhcpserver/dhcpserver.c") endif() @@ -211,6 +215,10 @@ if(CONFIG_LWIP_ENABLE) idf_component_optional_requires(PRIVATE nvs_flash) endif() + if(CONFIG_LWIP_USE_EXTERNAL_MBEDTLS) + idf_component_optional_requires(PRIVATE mbedtls) + endif() + if(${target} STREQUAL "linux") set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) diff --git a/components/lwip/Kconfig b/components/lwip/Kconfig index 2ab55e35c22..90ee1262013 100644 --- a/components/lwip/Kconfig +++ b/components/lwip/Kconfig @@ -998,6 +998,17 @@ menu "LWIP" help Enable PPP debug log output + config LWIP_USE_EXTERNAL_MBEDTLS + bool "Use mbedTLS instead of internal polarSSL" + depends on LWIP_PPP_SUPPORT + depends on !LWIP_PPP_MPPE_SUPPORT && !LWIP_PPP_MSCHAP_SUPPORT + default n + help + This option uses mbedTLS crypto functions (instead of internal PolarSSL + implementation) for PPP authentication modes (PAP, CHAP, etc.). + You can use this option to address symbol duplication issues, since + the internal functions are not namespaced (e.g. md5_init()). + menuconfig LWIP_SLIP_SUPPORT bool "Enable SLIP support (new/experimental)" default n diff --git a/components/lwip/lwip b/components/lwip/lwip index 3a3d1fb3e3b..e8d0513898c 160000 --- a/components/lwip/lwip +++ b/components/lwip/lwip @@ -1 +1 @@ -Subproject commit 3a3d1fb3e3bc23cf86cf653ce5928eda47e2c15d +Subproject commit e8d0513898ce96d7851b41bc6acb7af3259a447b diff --git a/components/lwip/port/include/lwipopts.h b/components/lwip/port/include/lwipopts.h index b20b07479bd..c9a6d570229 100644 --- a/components/lwip/port/include/lwipopts.h +++ b/components/lwip/port/include/lwipopts.h @@ -1151,6 +1151,15 @@ static inline uint32_t timeout_from_offered(uint32_t lease, uint32_t min) #define PPP_SUPPORT 0 #endif /* CONFIG_LWIP_PPP_SUPPORT */ +/** + * LWIP_USE_EXTERNAL_MBEDTLS: Use external mbed TLS library for crypto implementation used in PPP AUTH + */ +#ifdef CONFIG_LWIP_USE_EXTERNAL_MBEDTLS +#define LWIP_USE_EXTERNAL_MBEDTLS 1 +#else +#define LWIP_USE_EXTERNAL_MBEDTLS 0 +#endif + /* -------------------------------------- ---------- Checksum options ---------- From 562abca17daaf8218d91ae8dad27b8c0da655364 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Fri, 24 May 2024 14:37:57 +0200 Subject: [PATCH 030/113] fix(esp_netif): Remove unused leftover pppapi_set_auth() call --- components/esp_netif/lwip/esp_netif_lwip.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index 5915a3a3cac..20ce5f5d7f3 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -2632,15 +2632,6 @@ esp_err_t esp_netif_ppp_set_auth(esp_netif_t *esp_netif, esp_netif_auth_type_t a { set_auth_msg_t msg = { .authtype = authtype, .user = user, .passwd = passwd }; return esp_netif_lwip_ipc_call(esp_netif_ppp_set_auth_api, esp_netif, &msg); -#if PPP_AUTH_SUPPORT - lwip_peer2peer_ctx_t *ppp_ctx = (lwip_peer2peer_ctx_t *)netif->related_data; - assert(ppp_ctx->base.netif_type == PPP_LWIP_NETIF); - pppapi_set_auth(ppp_ctx->ppp, authtype, user, passwd); - return ESP_OK; -#else - ESP_LOGE(TAG, "%s failed: No authorisation enabled in menuconfig", __func__); - return ESP_ERR_ESP_NETIF_IF_NOT_READY; -#endif } esp_err_t esp_netif_napt_disable(esp_netif_t *esp_netif) From 97d30e7c48bfedec59a03ccebb7bc203ba86e126 Mon Sep 17 00:00:00 2001 From: Roman Leonov Date: Wed, 10 Jul 2024 12:05:28 +0200 Subject: [PATCH 031/113] fix(usb_dwc_hal): Enabled precise detection of VBUS --- .../hal/esp32p4/include/hal/usb_wrap_ll.h | 9 +++++++ .../usb/test_apps/hcd/main/test_hcd_port.c | 25 ++++++++++++++++++- components/usb/usb_phy_p4.c | 16 ++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/components/hal/esp32p4/include/hal/usb_wrap_ll.h b/components/hal/esp32p4/include/hal/usb_wrap_ll.h index 5e6b9423668..113a56fe771 100644 --- a/components/hal/esp32p4/include/hal/usb_wrap_ll.h +++ b/components/hal/esp32p4/include/hal/usb_wrap_ll.h @@ -12,6 +12,7 @@ #include "soc/lp_system_struct.h" #include "soc/lp_clkrst_struct.h" #include "soc/hp_sys_clkrst_struct.h" +#include "soc/hp_system_struct.h" // For HP_SYSTEM domain #include "soc/usb_wrap_struct.h" #include "hal/usb_wrap_types.h" @@ -262,6 +263,14 @@ FORCE_INLINE_ATTR void usb_wrap_ll_reset_register(void) // P_AON_CLKRST.hp_usb_clkrst_ctrlx are shared registers, so this function must be used in an atomic way #define usb_wrap_ll_reset_register(...) (void)__DECLARE_RCC_ATOMIC_ENV; usb_wrap_ll_reset_register(__VA_ARGS__) +/* ------------------------------- HP System ------------------------------- */ + +FORCE_INLINE_ATTR void usb_wrap_ll_enable_precise_detection(void) +{ + // Enable VBUS precise detection + HP_SYSTEM.sys_usbotg20_ctrl.sys_otg_suspendm = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/usb/test_apps/hcd/main/test_hcd_port.c b/components/usb/test_apps/hcd/main/test_hcd_port.c index 67f502335b0..7ddb4a2cb2b 100644 --- a/components/usb/test_apps/hcd/main/test_hcd_port.c +++ b/components/usb/test_apps/hcd/main/test_hcd_port.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -18,6 +18,29 @@ #define URB_DATA_BUFF_SIZE (sizeof(usb_setup_packet_t) + TRANSFER_MAX_BYTES) // 256 is worst case size for configuration descriptors #define POST_ENQUEUE_DELAY_US 10 +/* +Test a port for a disconnect event, when port is in ENABLED state + +Purpose: This test is essential on HS HCD ports, when device is detaching during the action. + When the HS port is ENABLED, the port operates in HS mode and device disconnection is detected by HS logic. + When the HS port is DISABLED (without issuing a reset), the port operates in FS mode and device disconnection differs for HS mode disconnection logic. + +Procedure: + - Setup the HCD and a port + - Trigger the port connection event + - Trigger the port disconnection event + - Teardown port and HCD +*/ +TEST_CASE("Test HCD port disconnect event, port enabled", "[port][low_speed][full_speed]") +{ + usb_speed_t port_speed = test_hcd_wait_for_conn(port_hdl); // Trigger a connection + printf("Connected %s speed device \n", (char*[]) { + "Low", "Full", "High" + }[port_speed]); + vTaskDelay(pdMS_TO_TICKS(100)); // Short delay send of SOF (for FS) or EOPs (for LS) + test_hcd_wait_for_disconn(port_hdl, true); +} + /* Test a port sudden disconnect and port recovery diff --git a/components/usb/usb_phy_p4.c b/components/usb/usb_phy_p4.c index cff6420e082..a541fafe4c4 100644 --- a/components/usb/usb_phy_p4.c +++ b/components/usb/usb_phy_p4.c @@ -6,11 +6,27 @@ // This is only a dummy USB PHY file for successful linking of ESP32-P4 target // The internal HS PHY is enabled by default, therefore it needs no configuration + +// TODO: Refactor during the IDF-9198 +#include "sdkconfig.h" +#include "soc/usb_dwc_cfg.h" +#include "hal/usb_wrap_hal.h" // TODO: Remove this file when proper support of P4 PHYs is implemented IDF-7323 #include "esp_private/usb_phy.h" esp_err_t usb_new_phy(const usb_phy_config_t *config, usb_phy_handle_t *handle_ret) { +#if (OTG_HSPHY_INTERFACE != 0) +#if CONFIG_IDF_TARGET_ESP32P4 + /* + Additional setting to solve missing DCONN event on ESP32P4 (IDF-9953). + + Note: On ESP32P4, the HP_SYSTEM_OTG_SUSPENDM is not connected to 1 by hardware. + For correct detection of the device detaching, internal signal should be set to 1 by the software. + */ + usb_wrap_ll_enable_precise_detection(); +#endif // CONFIG_IDF_TARGET_ESP32P4 +#endif // (OTG_HSPHY_INTERFACE != 0) return ESP_OK; } From 55bbd9c95aae07059a6e668d2b55ca1152207622 Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Fri, 5 Jul 2024 15:10:41 +0530 Subject: [PATCH 032/113] feat: add config option under partition menu to support large size ota This commit adds one more config option under partition table menu to support large size image during ota This also updates the default config for simple ota example. --- components/partition_table/Kconfig.projbuild | 18 ++++++++++ .../partitions_two_ota_large.csv | 7 ++++ .../simple_ota_example/pytest_simple_ota.py | 34 +++++++++++-------- .../ota/simple_ota_example/sdkconfig.defaults | 3 ++ 4 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 components/partition_table/partitions_two_ota_large.csv diff --git a/components/partition_table/Kconfig.projbuild b/components/partition_table/Kconfig.projbuild index d4d7bd9b369..e3740d9dade 100644 --- a/components/partition_table/Kconfig.projbuild +++ b/components/partition_table/Kconfig.projbuild @@ -25,6 +25,7 @@ menu "Partition Table" This partition table is not suitable for an app that needs OTA (over the air update) capability. + config PARTITION_TABLE_SINGLE_APP_LARGE bool "Single factory app (large), no OTA" help @@ -36,6 +37,7 @@ menu "Partition Table" This partition table is not suitable for an app that needs OTA (over the air update) capability. + config PARTITION_TABLE_TWO_OTA bool "Factory app, two OTA definitions" help @@ -45,6 +47,17 @@ menu "Partition Table" The corresponding CSV file in the IDF directory is components/partition_table/partitions_two_ota.csv + + config PARTITION_TABLE_TWO_OTA_LARGE + bool "Two large size OTA partitions" + help + This is a basic OTA-enabled partition table with + two OTA app partitions. Both app partition sizes are 1700K, + so this partition table requires 4MB or larger flash size. + + The corresponding CSV file in the IDF directory is + components/partition_table/partitions_two_ota_large.csv + config PARTITION_TABLE_CUSTOM bool "Custom partition table CSV" help @@ -52,6 +65,7 @@ menu "Partition Table" Consult the Partition Table section in the ESP-IDF Programmers Guide for more information. + config PARTITION_TABLE_SINGLE_APP_ENCRYPTED_NVS bool "Single factory app, no OTA, encrypted NVS" depends on !ESP32_COREDUMP_ENABLE_TO_FLASH && NVS_SEC_KEY_PROTECT_USING_FLASH_ENC @@ -63,6 +77,7 @@ menu "Partition Table" The corresponding CSV file in the IDF directory is components/partition_table/partitions_singleapp_encr_nvs.csv + config PARTITION_TABLE_SINGLE_APP_LARGE_ENC_NVS bool "Single factory app (large), no OTA, encrypted NVS" depends on !ESP32_COREDUMP_ENABLE_TO_FLASH && NVS_SEC_KEY_PROTECT_USING_FLASH_ENC @@ -73,6 +88,7 @@ menu "Partition Table" The corresponding CSV file in the IDF directory is components/partition_table/partitions_singleapp_large_encr_nvs.csv + config PARTITION_TABLE_TWO_OTA_ENCRYPTED_NVS bool "Factory app, two OTA definitions, encrypted NVS" depends on !ESP_COREDUMP_ENABLE_TO_FLASH && NVS_SEC_KEY_PROTECT_USING_FLASH_ENC @@ -83,6 +99,7 @@ menu "Partition Table" The corresponding CSV file in the IDF directory is components/partition_table/partitions_two_ota_encr_nvs.csv + endchoice config PARTITION_TABLE_CUSTOM_FILENAME @@ -104,6 +121,7 @@ menu "Partition Table" default "partitions_two_ota.csv" if PARTITION_TABLE_TWO_OTA && !ESP_COREDUMP_ENABLE_TO_FLASH default "partitions_two_ota_coredump.csv" if PARTITION_TABLE_TWO_OTA && ESP_COREDUMP_ENABLE_TO_FLASH default "partitions_two_ota_encr_nvs.csv" if PARTITION_TABLE_TWO_OTA_ENCRYPTED_NVS + default "partitions_two_ota_large.csv" if PARTITION_TABLE_TWO_OTA_LARGE && !ESP_COREDUMP_ENABLE_TO_FLASH default PARTITION_TABLE_CUSTOM_FILENAME if PARTITION_TABLE_CUSTOM config PARTITION_TABLE_OFFSET diff --git a/components/partition_table/partitions_two_ota_large.csv b/components/partition_table/partitions_two_ota_large.csv new file mode 100644 index 00000000000..0e6dacd1fe5 --- /dev/null +++ b/components/partition_table/partitions_two_ota_large.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap +nvs, data, nvs, , 0x6000, +otadata, data, ota, , 0x2000, +phy_init, data, phy, , 0x1000, +ota_0, app, ota_0, , 1700K, +ota_1, app, ota_1, , 1700K, diff --git a/examples/system/ota/simple_ota_example/pytest_simple_ota.py b/examples/system/ota/simple_ota_example/pytest_simple_ota.py index 0595a9c2f76..8fffb24cc2a 100644 --- a/examples/system/ota/simple_ota_example/pytest_simple_ota.py +++ b/examples/system/ota/simple_ota_example/pytest_simple_ota.py @@ -6,6 +6,7 @@ import ssl import subprocess import sys +from typing import Optional from typing import Tuple import pexpect @@ -69,8 +70,11 @@ 'vSXnRLaxQhooWm+IuX9SuBQ=\n'\ '-----END PRIVATE KEY-----\n' +OTA1_ADDRESS = '0x20000' +OTA2_ADDRESS = '0x1d0000' -def start_https_server(ota_image_dir: str, server_ip: str, server_port: int, server_file: str = None, key_file: str = None) -> None: + +def start_https_server(ota_image_dir: str, server_ip: str, server_port: int, server_file: Optional[str] = None, key_file: Optional[str] = None) -> None: os.chdir(ota_image_dir) if server_file is None: @@ -147,7 +151,7 @@ def test_examples_protocol_simple_ota_example(dut: Dut) -> None: thread1.start() try: # start test - dut.expect('Loaded app from partition at offset 0x10000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA1_ADDRESS}', timeout=30) check_sha256(sha256_bootloader, str(dut.expect(r'SHA-256 for bootloader:\s+([a-f0-9]){64}')[0])) check_sha256(sha256_app, str(dut.expect(r'SHA-256 for current firmware:\s+([a-f0-9]){64}')[0])) # Parse IP address of STA @@ -169,7 +173,7 @@ def test_examples_protocol_simple_ota_example(dut: Dut) -> None: dut.write('https://' + host_ip + ':8000/simple_ota.bin') dut.expect('OTA Succeed, Rebooting...', timeout=60) # after reboot - dut.expect('Loaded app from partition at offset 0x110000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA2_ADDRESS}', timeout=30) dut.expect('OTA example app_main start', timeout=10) finally: thread1.terminate() @@ -191,7 +195,7 @@ def test_examples_protocol_simple_ota_example_ethernet_with_spiram_config(dut: D thread1.start() try: # start test - dut.expect('Loaded app from partition at offset 0x10000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA1_ADDRESS}', timeout=30) try: ip_address = dut.expect(r'IPv4 address: (\d+\.\d+\.\d+\.\d+)[^\d]', timeout=30)[1].decode() print('Connected to AP/Ethernet with IP: {}'.format(ip_address)) @@ -204,7 +208,7 @@ def test_examples_protocol_simple_ota_example_ethernet_with_spiram_config(dut: D dut.write('https://' + host_ip + ':8000/simple_ota.bin') dut.expect('OTA Succeed, Rebooting...', timeout=60) # after reboot - dut.expect('Loaded app from partition at offset 0x110000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA2_ADDRESS}', timeout=30) dut.expect('OTA example app_main start', timeout=10) finally: thread1.terminate() @@ -232,7 +236,7 @@ def test_examples_protocol_simple_ota_example_with_flash_encryption_wifi(dut: Du thread1.daemon = True thread1.start() try: - dut.expect('Loaded app from partition at offset 0x20000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA1_ADDRESS}', timeout=30) dut.expect('Flash encryption mode is DEVELOPMENT', timeout=10) # Parse IP address of STA if dut.app.sdkconfig.get('EXAMPLE_WIFI_SSID_PWD_FROM_STDIN') is True: @@ -253,7 +257,7 @@ def test_examples_protocol_simple_ota_example_with_flash_encryption_wifi(dut: Du dut.write('https://' + host_ip + ':8000/simple_ota.bin') dut.expect('OTA Succeed, Rebooting...', timeout=60) # after reboot - dut.expect('Loaded app from partition at offset 0x120000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA2_ADDRESS}', timeout=30) dut.expect('Flash encryption mode is DEVELOPMENT', timeout=10) dut.expect('OTA example app_main start', timeout=10) finally: @@ -277,7 +281,7 @@ def test_examples_protocol_simple_ota_example_with_verify_app_signature_on_updat thread1.start() try: # start test - dut.expect('Loaded app from partition at offset 0x20000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA1_ADDRESS}', timeout=30) check_sha256(sha256_bootloader, str(dut.expect(r'SHA-256 for bootloader:\s+([a-f0-9]){64}')[0])) check_sha256(sha256_app, str(dut.expect(r'SHA-256 for current firmware:\s+([a-f0-9]){64}')[0])) try: @@ -290,11 +294,11 @@ def test_examples_protocol_simple_ota_example_with_verify_app_signature_on_updat dut.expect('Starting OTA example task', timeout=30) print('writing to device: {}'.format('https://' + host_ip + ':8000/simple_ota.bin')) dut.write('https://' + host_ip + ':8000/simple_ota.bin') - dut.expect('Writing to partition subtype 16 at offset 0x120000', timeout=20) + dut.expect(f'Writing to partition subtype 17 at offset {OTA2_ADDRESS}', timeout=20) dut.expect('Verifying image signature...', timeout=60) dut.expect('OTA Succeed, Rebooting...', timeout=60) # after reboot - dut.expect('Loaded app from partition at offset 0x120000', timeout=20) + dut.expect(f'Loaded app from partition at offset {OTA2_ADDRESS}', timeout=20) dut.expect('OTA example app_main start', timeout=10) finally: thread1.terminate() @@ -317,7 +321,7 @@ def test_examples_protocol_simple_ota_example_with_verify_app_signature_on_updat thread1.start() try: # start test - dut.expect('Loaded app from partition at offset 0x20000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA1_ADDRESS}', timeout=30) check_sha256(sha256_bootloader, str(dut.expect(r'SHA-256 for bootloader:\s+([a-f0-9]){64}')[0])) check_sha256(sha256_app, str(dut.expect(r'SHA-256 for current firmware:\s+([a-f0-9]){64}')[0])) try: @@ -330,14 +334,14 @@ def test_examples_protocol_simple_ota_example_with_verify_app_signature_on_updat dut.expect('Starting OTA example task', timeout=30) print('writing to device: {}'.format('https://' + host_ip + ':8000/simple_ota.bin')) dut.write('https://' + host_ip + ':8000/simple_ota.bin') - dut.expect('Writing to partition subtype 16 at offset 0x120000', timeout=20) + dut.expect(f'Writing to partition subtype 17 at offset {OTA2_ADDRESS}', timeout=20) dut.expect('Verifying image signature...', timeout=60) dut.expect('#0 app key digest == #0 trusted key digest', timeout=10) dut.expect('Verifying with RSA-PSS...', timeout=10) dut.expect('Signature verified successfully!', timeout=10) dut.expect('OTA Succeed, Rebooting...', timeout=60) # after reboot - dut.expect('Loaded app from partition at offset 0x120000', timeout=20) + dut.expect(f'Loaded app from partition at offset {OTA2_ADDRESS}', timeout=20) dut.expect('OTA example app_main start', timeout=10) finally: thread1.terminate() @@ -358,7 +362,7 @@ def test_examples_protocol_simple_ota_example_tls1_3(dut: Dut) -> None: tls1_3_server = start_tls1_3_server(dut.app.binary_path, 8000) try: # start test - dut.expect('Loaded app from partition at offset 0x10000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA1_ADDRESS}', timeout=30) check_sha256(sha256_bootloader, str(dut.expect(r'SHA-256 for bootloader:\s+([a-f0-9]){64}')[0])) check_sha256(sha256_app, str(dut.expect(r'SHA-256 for current firmware:\s+([a-f0-9]){64}')[0])) # Parse IP address of STA @@ -380,7 +384,7 @@ def test_examples_protocol_simple_ota_example_tls1_3(dut: Dut) -> None: dut.write('https://' + host_ip + ':8000/simple_ota.bin') dut.expect('OTA Succeed, Rebooting...', timeout=120) # after reboot - dut.expect('Loaded app from partition at offset 0x110000', timeout=30) + dut.expect(f'Loaded app from partition at offset {OTA2_ADDRESS}', timeout=30) dut.expect('OTA example app_main start', timeout=10) finally: tls1_3_server.kill() diff --git a/examples/system/ota/simple_ota_example/sdkconfig.defaults b/examples/system/ota/simple_ota_example/sdkconfig.defaults index 748f1e2f653..6ac294ee701 100644 --- a/examples/system/ota/simple_ota_example/sdkconfig.defaults +++ b/examples/system/ota/simple_ota_example/sdkconfig.defaults @@ -7,3 +7,6 @@ CONFIG_PARTITION_TABLE_TWO_OTA=y CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN=y CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE=y CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE_PATH="server_certs/ca_cert.pem" + +# Default partition table config +CONFIG_PARTITION_TABLE_TWO_OTA_LARGE=y From c00b55e9e67360be2683ceb2d45208f010b5ffc8 Mon Sep 17 00:00:00 2001 From: Lou Tianhao Date: Mon, 8 Jul 2024 16:58:18 +0800 Subject: [PATCH 033/113] fix(soc): c61 update pmu_struct to v1.1.14 --- .../soc/esp32c61/include/soc/pmu_struct.h | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/components/soc/esp32c61/include/soc/pmu_struct.h b/components/soc/esp32c61/include/soc/pmu_struct.h index 2ca2ee6801a..3e2f9fb16f6 100644 --- a/components/soc/esp32c61/include/soc/pmu_struct.h +++ b/components/soc/esp32c61/include/soc/pmu_struct.h @@ -14,7 +14,6 @@ extern "C" { #include "soc.h" #include "soc/pmu_reg.h" -// TODO: [ESP32C61] This file comes from verification branch typedef union { struct { uint32_t reserved0 : 21; @@ -377,6 +376,16 @@ typedef union { uint32_t val; } pmu_power_wait_timer1_reg_t; +typedef union { + struct { + uint32_t lp_iso_wait_timer: 8; + uint32_t lp_rst_wait_timer: 8; + uint32_t hp_iso_wait_timer: 8; + uint32_t hp_rst_wait_timer: 8; + }; + uint32_t val; +} pmu_power_wait_timer2_reg_t; + typedef union { struct { uint32_t force_reset : 1; @@ -446,6 +455,7 @@ typedef union { typedef struct pmu_power_hw_regmap_t{ pmu_power_wait_timer0_reg_t wait_timer0; pmu_power_wait_timer1_reg_t wait_timer1; + pmu_power_wait_timer2_reg_t wait_timer2; pmu_power_domain_cntl_reg_t hp_pd[5]; pmu_power_domain_cntl_reg_t lp_peri; pmu_power_memory_cntl_reg_t mem_cntl; @@ -555,7 +565,9 @@ typedef union { typedef union { struct { - uint32_t reserved0 : 26; + uint32_t reserved0 : 24; + uint32_t xpd_tc5g_i2c : 1; + uint32_t xpd_rx5g_i2c : 1; uint32_t perif_i2c_rstb: 1; uint32_t xpd_perif_i2c : 1; uint32_t xpd_txrf_i2c : 1; @@ -732,7 +744,7 @@ typedef struct pmu_dev_t{ volatile uint32_t val; } vdd_spi_status; - uint32_t reserved[150]; + uint32_t reserved[0]; union { struct { @@ -746,9 +758,9 @@ typedef struct pmu_dev_t{ extern pmu_dev_t PMU; #ifndef __cplusplus -// _Static_assert(sizeof(pmu_dev_t) == 0x400, "Invalid size of pmu_dev_t structure"); +_Static_assert(sizeof(pmu_dev_t) == 0x1AC, "Invalid size of pmu_dev_t structure"); -// _Static_assert(offsetof(pmu_dev_t, reserved) == (PMU_VDD_SPI_STATUS_REG - DR_REG_PMU_BASE) + 4, "Invalid size of pmu_dev_t structure"); +_Static_assert(offsetof(pmu_dev_t, reserved) == (PMU_VDD_SPI_STATUS_REG - DR_REG_PMU_BASE) + 4, "Invalid size of pmu_dev_t structure"); #endif From 3da4ed5d3ecaff14d64583cffaab2ca69f93c27e Mon Sep 17 00:00:00 2001 From: muhaidong Date: Fri, 12 Jul 2024 17:51:35 +0800 Subject: [PATCH 034/113] fix(wifi): fix sta may join bad signal ap when set by signal Closes https://github.com/espressif/esp-idf/issues/13958 --- components/esp_wifi/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 74f99e08335..76bdd0b967a 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 74f99e08335671447b5eac243c8dd643c1405a63 +Subproject commit 76bdd0b967afa7d75c9466ab0ad05601418a074d From 728136a91d7c0536201bdc1f40dbfb0e4e0bf15e Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 12 Jul 2024 12:14:32 +0200 Subject: [PATCH 035/113] fix(esp_eth): fix variable declarations inside switch for clang --- components/esp_eth/src/mac/esp_eth_mac_esp.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/components/esp_eth/src/mac/esp_eth_mac_esp.c b/components/esp_eth/src/mac/esp_eth_mac_esp.c index dddf0d24b14..14bfec2f63f 100644 --- a/components/esp_eth/src/mac/esp_eth_mac_esp.c +++ b/components/esp_eth/src/mac/esp_eth_mac_esp.c @@ -260,8 +260,7 @@ esp_err_t emac_esp_custom_ioctl(esp_eth_mac_t *mac, int cmd, void *data) { emac_esp32_t *emac = __containerof(mac, emac_esp32_t, parent); - switch (cmd) - { + switch (cmd) { case ETH_MAC_ESP_CMD_PTP_ENABLE: return ESP_ERR_NOT_SUPPORTED; case ETH_MAC_ESP_CMD_SET_TDES0_CFG_BITS: @@ -282,7 +281,7 @@ static esp_err_t emac_esp32_transmit(esp_eth_mac_t *mac, uint8_t *buf, uint32_t { emac_esp32_t *emac = __containerof(mac, emac_esp32_t, parent); uint32_t sent_len = emac_esp_dma_transmit_frame(emac->emac_dma_hndl, buf, length); - if(sent_len != length) { + if (sent_len != length) { ESP_LOGD(TAG, "insufficient TX buffer size"); return ESP_ERR_NO_MEM; } @@ -583,7 +582,7 @@ static esp_err_t emac_esp_config_data_interface(const eth_esp32_emac_config_t *e { esp_err_t ret = ESP_OK; switch (esp32_emac_config->interface) { - case EMAC_DATA_INTERFACE_MII: + case EMAC_DATA_INTERFACE_MII: { /* MII interface GPIO initialization */ #if SOC_EMAC_MII_USE_GPIO_MATRIX ESP_GOTO_ON_ERROR(emac_esp_gpio_matrix_init_mii(&esp32_emac_config->emac_dataif_gpio.mii), err, TAG, "failed to initialize EMAC MII GPIO Matrix"); @@ -599,7 +598,8 @@ static esp_err_t emac_esp_config_data_interface(const eth_esp32_emac_config_t *e emac_hal_clock_enable_mii(&emac->hal); } break; - case EMAC_DATA_INTERFACE_RMII: + } + case EMAC_DATA_INTERFACE_RMII: { /* RMII interface GPIO initialization */ const eth_mac_rmii_gpio_config_t *rmii_data_gpio = NULL; #if SOC_EMAC_USE_MULTI_IO_MUX @@ -640,6 +640,7 @@ static esp_err_t emac_esp_config_data_interface(const eth_esp32_emac_config_t *e ESP_GOTO_ON_FALSE(false, ESP_ERR_INVALID_ARG, err, TAG, "invalid EMAC clock mode"); } break; + } default: ESP_GOTO_ON_FALSE(false, ESP_ERR_INVALID_ARG, err, TAG, "invalid EMAC Data Interface:%i", esp32_emac_config->interface); } From 3964fb1fa8c6f0e8345dc09552db7f7da3ea62b0 Mon Sep 17 00:00:00 2001 From: Jin Cheng Date: Fri, 12 Jul 2024 19:35:18 +0800 Subject: [PATCH 036/113] fix(bt/controller): Removed an improper assertion in ACL link driver - See more from jira BT-3591 --- components/bt/controller/lib_esp32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index 1d3d9bfd298..b814f26bbb3 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit 1d3d9bfd298ed3b6916d561dc54317041841ec9e +Subproject commit b814f26bbb3d726418c0f80f9f91153dfd978f85 From c921824230f70baaf686c8dcbcd253f98c1d84f4 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 12 Jul 2024 12:16:07 +0200 Subject: [PATCH 037/113] fix(wifi_provisioning): fix var declarations inside switch for clang --- components/wifi_provisioning/src/scheme_ble.c | 103 +++++++++--------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/components/wifi_provisioning/src/scheme_ble.c b/components/wifi_provisioning/src/scheme_ble.c index 6b594f22c46..16d64a12f2a 100644 --- a/components/wifi_provisioning/src/scheme_ble.c +++ b/components/wifi_provisioning/src/scheme_ble.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -41,7 +41,7 @@ static esp_err_t prov_start(protocomm_t *pc, void *config) protocomm_ble_config_t *ble_config = (protocomm_ble_config_t *) config; #if defined(CONFIG_WIFI_PROV_BLE_BONDING) - ble_config->ble_bonding = 1; + ble_config->ble_bonding = 1; #endif #if defined(CONFIG_WIFI_PROV_BLE_SEC_CONN) || defined(CONFIG_BT_BLUEDROID_ENABLED) @@ -183,7 +183,7 @@ static esp_err_t set_config_endpoint(void *config, const char *endpoint_name, ui } protocomm_ble_name_uuid_t *lookup_table = ( - realloc(ble_config->nu_lookup, (ble_config->nu_lookup_count + 1) * sizeof(protocomm_ble_name_uuid_t))); + realloc(ble_config->nu_lookup, (ble_config->nu_lookup_count + 1) * sizeof(protocomm_ble_name_uuid_t))); if (!lookup_table) { ESP_LOGE(TAG, "Error allocating memory for EP-UUID lookup table"); return ESP_ERR_NO_MEM; @@ -200,35 +200,34 @@ static esp_err_t set_config_endpoint(void *config, const char *endpoint_name, ui void wifi_prov_scheme_ble_event_cb_free_btdm(void *user_data, wifi_prov_cb_event_t event, void *event_data) { switch (event) { - case WIFI_PROV_INIT: + case WIFI_PROV_INIT: { #ifdef CONFIG_BT_CONTROLLER_ENABLED - esp_err_t err; - /* Release BT memory, as we need only BLE */ - err = esp_bt_mem_release(ESP_BT_MODE_CLASSIC_BT); - if (err != ESP_OK) { - ESP_LOGE(TAG, "bt_mem_release of classic BT failed %d", err); - } else { - ESP_LOGI(TAG, "BT memory released"); - } + /* Release BT memory, as we need only BLE */ + esp_err_t err = esp_bt_mem_release(ESP_BT_MODE_CLASSIC_BT); + if (err != ESP_OK) { + ESP_LOGE(TAG, "bt_mem_release of classic BT failed %d", err); + } else { + ESP_LOGI(TAG, "BT memory released"); + } #endif - break; - - case WIFI_PROV_DEINIT: + break; + } + case WIFI_PROV_DEINIT: { #ifndef CONFIG_WIFI_PROV_KEEP_BLE_ON_AFTER_PROV #ifdef CONFIG_BT_CONTROLLER_ENABLED - /* Release memory used by BLE and Bluedroid host stack */ - err = esp_bt_mem_release(ESP_BT_MODE_BTDM); - if (err != ESP_OK) { - ESP_LOGE(TAG, "bt_mem_release of BTDM failed %d", err); - } else { - ESP_LOGI(TAG, "BTDM memory released"); - } + /* Release memory used by BLE and Bluedroid host stack */ + esp_err_t err = esp_bt_mem_release(ESP_BT_MODE_BTDM); + if (err != ESP_OK) { + ESP_LOGE(TAG, "bt_mem_release of BTDM failed %d", err); + } else { + ESP_LOGI(TAG, "BTDM memory released"); + } #endif #endif - break; - - default: - break; + break; + } + default: + break; } } @@ -236,21 +235,21 @@ void wifi_prov_scheme_ble_event_cb_free_btdm(void *user_data, wifi_prov_cb_event void wifi_prov_scheme_ble_event_cb_free_bt(void *user_data, wifi_prov_cb_event_t event, void *event_data) { switch (event) { - case WIFI_PROV_INIT: + case WIFI_PROV_INIT: { #ifdef CONFIG_BT_CONTROLLER_ENABLED - esp_err_t err; - /* Release BT memory, as we need only BLE */ - err = esp_bt_mem_release(ESP_BT_MODE_CLASSIC_BT); - if (err != ESP_OK) { - ESP_LOGE(TAG, "bt_mem_release of classic BT failed %d", err); - } else { - ESP_LOGI(TAG, "BT memory released"); - } + esp_err_t err; + /* Release BT memory, as we need only BLE */ + err = esp_bt_mem_release(ESP_BT_MODE_CLASSIC_BT); + if (err != ESP_OK) { + ESP_LOGE(TAG, "bt_mem_release of classic BT failed %d", err); + } else { + ESP_LOGI(TAG, "BT memory released"); + } #endif - break; - - default: - break; + break; + } + default: + break; } } @@ -258,23 +257,23 @@ void wifi_prov_scheme_ble_event_cb_free_bt(void *user_data, wifi_prov_cb_event_t void wifi_prov_scheme_ble_event_cb_free_ble(void *user_data, wifi_prov_cb_event_t event, void *event_data) { switch (event) { - case WIFI_PROV_DEINIT: + case WIFI_PROV_DEINIT: { #ifndef CONFIG_WIFI_PROV_KEEP_BLE_ON_AFTER_PROV #ifdef CONFIG_BT_CONTROLLER_ENABLED - esp_err_t err; - /* Release memory used by BLE stack */ - err = esp_bt_mem_release(ESP_BT_MODE_BLE); - if (err != ESP_OK) { - ESP_LOGE(TAG, "bt_mem_release of BLE failed %d", err); - } else { - ESP_LOGI(TAG, "BLE memory released"); - } + esp_err_t err; + /* Release memory used by BLE stack */ + err = esp_bt_mem_release(ESP_BT_MODE_BLE); + if (err != ESP_OK) { + ESP_LOGE(TAG, "bt_mem_release of BLE failed %d", err); + } else { + ESP_LOGI(TAG, "BLE memory released"); + } #endif #endif - break; - - default: - break; + break; + } + default: + break; } } From df65b3829eb6d406df47a09372b93cb68af26dcc Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 12 Jul 2024 13:57:51 +0200 Subject: [PATCH 038/113] fix(usb): variable declaration after label for clang --- components/usb/hcd_dwc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/usb/hcd_dwc.c b/components/usb/hcd_dwc.c index 9911c624662..345cbe4707f 100644 --- a/components/usb/hcd_dwc.c +++ b/components/usb/hcd_dwc.c @@ -1263,6 +1263,7 @@ static esp_err_t _port_cmd_reset(port_t *port) ret = ESP_OK; bailout: // Reinitialize channel registers + (void) 0; // clang doesn't allow variable declarations after labels pipe_t *pipe; TAILQ_FOREACH(pipe, &port->pipes_idle_tailq, tailq_entry) { usb_dwc_hal_chan_set_ep_char(port->hal, pipe->chan_obj, &pipe->ep_char); From 6c2824bdaad77acc8923dfb723cb5f2d50df63e4 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 12 Jul 2024 12:17:01 +0200 Subject: [PATCH 039/113] ci(clang): include all components in clang_build_test --- tools/test_apps/system/clang_build_test/CMakeLists.txt | 4 ++-- tools/test_apps/system/clang_build_test/main/CMakeLists.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/test_apps/system/clang_build_test/CMakeLists.txt b/tools/test_apps/system/clang_build_test/CMakeLists.txt index cd85707a092..3d9f4142807 100644 --- a/tools/test_apps/system/clang_build_test/CMakeLists.txt +++ b/tools/test_apps/system/clang_build_test/CMakeLists.txt @@ -3,5 +3,5 @@ cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -set(COMPONENTS main) -project(cpp_pthread) +# Note: not setting set(COMPONENTS main) here, this app should build all the components +project(clang_build_test) diff --git a/tools/test_apps/system/clang_build_test/main/CMakeLists.txt b/tools/test_apps/system/clang_build_test/main/CMakeLists.txt index 7f0828d2a33..079bf9c6ab1 100644 --- a/tools/test_apps/system/clang_build_test/main/CMakeLists.txt +++ b/tools/test_apps/system/clang_build_test/main/CMakeLists.txt @@ -1,3 +1,3 @@ idf_component_register(SRCS "test_main.cpp" - INCLUDE_DIRS "." - PRIV_REQUIRES pthread bt) + INCLUDE_DIRS ".") +# Note: not setting PRIV_REQUIRES, this app should build all the components. From 3d0b50734652fad3ec6dce55070e05eddc2b5147 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 12 Jul 2024 14:18:56 +0200 Subject: [PATCH 040/113] fix(ieee802154): fix linker error due to static function being inlined When the compiler decides to inline a static function, linker script generator will complain about the missing function. --- components/ieee802154/driver/esp_ieee802154_dev.c | 2 +- components/ieee802154/driver/esp_ieee802154_frame.c | 8 ++++---- components/ieee802154/linker.lf | 1 + .../ieee802154/private_include/esp_ieee802154_dev.h | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/components/ieee802154/driver/esp_ieee802154_dev.c b/components/ieee802154/driver/esp_ieee802154_dev.c index c5371814796..d7f98198cc0 100644 --- a/components/ieee802154/driver/esp_ieee802154_dev.c +++ b/components/ieee802154/driver/esp_ieee802154_dev.c @@ -136,7 +136,7 @@ static IRAM_ATTR void receive_ack_timeout_timer_start(uint32_t duration) } #endif -static void ieee802154_rx_frame_info_update(void) +static IEEE802154_NOINLINE void ieee802154_rx_frame_info_update(void) { uint8_t len = s_rx_frame[s_rx_index][0]; int8_t rssi = s_rx_frame[s_rx_index][len - 1]; // crc is not written to rx buffer diff --git a/components/ieee802154/driver/esp_ieee802154_frame.c b/components/ieee802154/driver/esp_ieee802154_frame.c index e32e338ae0e..9bc23058066 100644 --- a/components/ieee802154/driver/esp_ieee802154_frame.c +++ b/components/ieee802154/driver/esp_ieee802154_frame.c @@ -49,7 +49,7 @@ IEEE802154_STATIC IEEE802154_INLINE bool is_suported_frame_type(uint8_t frame_ty frame_type == IEEE802154_FRAME_TYPE_ACK || frame_type == IEEE802154_FRAME_TYPE_COMMAND); } -IEEE802154_STATIC bool is_dst_panid_present(const uint8_t *frame) +IEEE802154_STATIC IEEE802154_NOINLINE bool is_dst_panid_present(const uint8_t *frame) { uint8_t dst_mode = dst_addr_mode(frame); bool dst_panid_present = false; @@ -79,7 +79,7 @@ IEEE802154_STATIC bool is_dst_panid_present(const uint8_t *frame) return dst_panid_present; } -IEEE802154_STATIC bool is_src_panid_present(const uint8_t *frame) +IEEE802154_STATIC IEEE802154_NOINLINE bool is_src_panid_present(const uint8_t *frame) { uint8_t src_mode = src_addr_mode(frame); bool panid_compression = is_panid_compression(frame); @@ -160,7 +160,7 @@ IEEE802154_STATIC IRAM_ATTR uint8_t ieee802154_frame_address_size(const uint8_t return address_size; } -IEEE802154_STATIC uint8_t ieee802154_frame_security_header_offset(const uint8_t *frame) +IEEE802154_STATIC IEEE802154_NOINLINE uint8_t ieee802154_frame_security_header_offset(const uint8_t *frame) { ESP_RETURN_ON_FALSE_ISR(is_suported_frame_type(ieee802154_frame_get_type(frame)), IEEE802154_FRAME_INVALID_ADDR_MODE, IEEE802154_TAG, "invalid frame type"); uint8_t offset = ieee802154_frame_address_offset(frame); @@ -174,7 +174,7 @@ IEEE802154_STATIC uint8_t ieee802154_frame_security_header_offset(const uint8_t return offset; } -IEEE802154_STATIC uint8_t ieee802154_frame_get_security_field_len(const uint8_t *frame) +IEEE802154_STATIC IEEE802154_NOINLINE uint8_t ieee802154_frame_get_security_field_len(const uint8_t *frame) { ESP_RETURN_ON_FALSE_ISR(is_suported_frame_type(ieee802154_frame_get_type(frame)), IEEE802154_FRAME_INVALID_OFFSET, IEEE802154_TAG, "invalid frame type"); diff --git a/components/ieee802154/linker.lf b/components/ieee802154/linker.lf index b0a01b70c08..e78d00a5dbc 100644 --- a/components/ieee802154/linker.lf +++ b/components/ieee802154/linker.lf @@ -2,6 +2,7 @@ archive: libieee802154.a entries: if IEEE802154_ENABLED = y: + # When adding static functions here, add IEEE802154_NOINLINE attribute to them esp_ieee802154_ack: ieee802154_ack_config_pending_bit (noflash) esp_ieee802154_dev: ieee802154_rx_frame_info_update (noflash) esp_ieee802154_dev: ieee802154_isr (noflash) diff --git a/components/ieee802154/private_include/esp_ieee802154_dev.h b/components/ieee802154/private_include/esp_ieee802154_dev.h index ace28cd5f78..76db12a2436 100644 --- a/components/ieee802154/private_include/esp_ieee802154_dev.h +++ b/components/ieee802154/private_include/esp_ieee802154_dev.h @@ -245,6 +245,7 @@ extern void esp_ieee802154_timer1_done(void); #define IEEE802154_STATIC static #define IEEE802154_INLINE inline #endif // CONFIG_IEEE802154_TEST +#define IEEE802154_NOINLINE __attribute__((noinline)) #ifdef __cplusplus } From 65820c07ac30245aa30b3f96cc667e575e54d55b Mon Sep 17 00:00:00 2001 From: gaoxu Date: Sat, 13 Jul 2024 14:03:23 +0800 Subject: [PATCH 041/113] feat(adc): support ADC oneshot and continuous mode on ESP32C5 and enable test --- .../test_apps/legacy_adc_driver/README.md | 4 +- .../legacy_adc_driver/main/test_legacy_adc.c | 7 + .../legacy_adc_driver/pytest_legacy_adc.py | 2 +- components/esp_adc/adc_oneshot.c | 4 +- components/esp_adc/test_apps/adc/README.md | 4 +- .../test_apps/adc/main/test_common_adc.h | 9 + .../esp_adc/test_apps/adc/pytest_adc.py | 2 + .../port/esp32c5/sar_periph_ctrl.c | 2 - components/hal/esp32c5/include/hal/adc_ll.h | 784 ++++++++++++++++++ components/hal/include/hal/adc_types.h | 2 +- .../include/esp32c5/idf_performance_target.h | 8 + components/soc/esp32c5/adc_periph.c | 20 + .../esp32c5/include/soc/Kconfig.soc_caps.in | 78 +- .../soc/esp32c5/include/soc/adc_channel.h | 28 +- .../soc/esp32c5/include/soc/clk_tree_defs.h | 2 +- .../soc/esp32c5/include/soc/regi2c_saradc.h | 55 ++ components/soc/esp32c5/include/soc/soc_caps.h | 46 +- docs/docs_not_updated/esp32c5.txt | 2 - .../peripherals/adc_continuous.rst | 2 +- .../api-reference/peripherals/adc_oneshot.rst | 2 +- .../peripherals/adc_continuous.rst | 2 +- .../api-reference/peripherals/adc_oneshot.rst | 2 +- .../peripherals/adc/continuous_read/README.md | 4 +- .../continuous_read/pytest_adc_continuous.py | 2 +- .../peripherals/adc/oneshot_read/README.md | 4 +- .../adc/oneshot_read/pytest_adc_oneshot.py | 1 + 26 files changed, 1016 insertions(+), 62 deletions(-) create mode 100644 components/hal/esp32c5/include/hal/adc_ll.h create mode 100644 components/soc/esp32c5/adc_periph.c create mode 100644 components/soc/esp32c5/include/soc/regi2c_saradc.h diff --git a/components/driver/test_apps/legacy_adc_driver/README.md b/components/driver/test_apps/legacy_adc_driver/README.md index bf47d80ec64..3a502b1f86f 100644 --- a/components/driver/test_apps/legacy_adc_driver/README.md +++ b/components/driver/test_apps/legacy_adc_driver/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/driver/test_apps/legacy_adc_driver/main/test_legacy_adc.c b/components/driver/test_apps/legacy_adc_driver/main/test_legacy_adc.c index e09a741b185..7a22fa26dce 100644 --- a/components/driver/test_apps/legacy_adc_driver/main/test_legacy_adc.c +++ b/components/driver/test_apps/legacy_adc_driver/main/test_legacy_adc.c @@ -74,6 +74,13 @@ #define ADC_TEST_HIGH_VAL 4095 #define ADC_TEST_HIGH_THRESH 200 +#elif CONFIG_IDF_TARGET_ESP32C5 +#define ADC_TEST_LOW_VAL 2195 +#define ADC_TEST_LOW_THRESH 200 + +#define ADC_TEST_HIGH_VAL 4095 +#define ADC_TEST_HIGH_THRESH 200 + #endif //ADC Channels diff --git a/components/driver/test_apps/legacy_adc_driver/pytest_legacy_adc.py b/components/driver/test_apps/legacy_adc_driver/pytest_legacy_adc.py index 6bc3b838d66..b311f7b3a80 100644 --- a/components/driver/test_apps/legacy_adc_driver/pytest_legacy_adc.py +++ b/components/driver/test_apps/legacy_adc_driver/pytest_legacy_adc.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -11,6 +10,7 @@ @pytest.mark.esp32c3 @pytest.mark.esp32c6 @pytest.mark.esp32h2 +@pytest.mark.esp32c5 @pytest.mark.adc @pytest.mark.parametrize( 'config', diff --git a/components/esp_adc/adc_oneshot.c b/components/esp_adc/adc_oneshot.c index 0691e22f1ad..15166a4f993 100644 --- a/components/esp_adc/adc_oneshot.c +++ b/components/esp_adc/adc_oneshot.c @@ -126,7 +126,7 @@ esp_err_t adc_oneshot_new_unit(const adc_oneshot_unit_init_cfg_t *init_config, a if (init_config->ulp_mode == ADC_ULP_MODE_DISABLE) { sar_periph_ctrl_adc_oneshot_power_acquire(); } else { -#if !CONFIG_IDF_TARGET_ESP32P4 // # TODO: IDF-7528, IDF-7529 +#if !CONFIG_IDF_TARGET_ESP32C5// # TODO: IDF-8638, IDF-8640 esp_sleep_enable_adc_tsens_monitor(true); #endif } @@ -229,7 +229,7 @@ esp_err_t adc_oneshot_del_unit(adc_oneshot_unit_handle_t handle) if (ulp_mode == ADC_ULP_MODE_DISABLE) { sar_periph_ctrl_adc_oneshot_power_release(); } else { -#if !CONFIG_IDF_TARGET_ESP32P4 // # TODO: IDF-7528, IDF-7529 +#if !CONFIG_IDF_TARGET_ESP32C5// # TODO: IDF-8638, IDF-8640 esp_sleep_enable_adc_tsens_monitor(false); #endif } diff --git a/components/esp_adc/test_apps/adc/README.md b/components/esp_adc/test_apps/adc/README.md index bf47d80ec64..3a502b1f86f 100644 --- a/components/esp_adc/test_apps/adc/README.md +++ b/components/esp_adc/test_apps/adc/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_adc/test_apps/adc/main/test_common_adc.h b/components/esp_adc/test_apps/adc/main/test_common_adc.h index 1d28c66e4ee..c2bd4cd1989 100644 --- a/components/esp_adc/test_apps/adc/main/test_common_adc.h +++ b/components/esp_adc/test_apps/adc/main/test_common_adc.h @@ -94,6 +94,15 @@ extern "C" { #define ADC_TEST_HIGH_VAL 4095 #define ADC_TEST_HIGH_VAL_DMA 4095 #define ADC_TEST_HIGH_THRESH 200 + +#elif CONFIG_IDF_TARGET_ESP32C5 +#define ADC_TEST_LOW_VAL 2169 +#define ADC_TEST_LOW_THRESH 200 + +#define ADC_TEST_HIGH_VAL 4095 +#define ADC_TEST_HIGH_VAL_DMA 4095 +#define ADC_TEST_HIGH_THRESH 200 + #endif /*--------------------------------------------------------------- diff --git a/components/esp_adc/test_apps/adc/pytest_adc.py b/components/esp_adc/test_apps/adc/pytest_adc.py index 5f61b66e596..780e910d308 100644 --- a/components/esp_adc/test_apps/adc/pytest_adc.py +++ b/components/esp_adc/test_apps/adc/pytest_adc.py @@ -10,6 +10,7 @@ @pytest.mark.esp32c3 @pytest.mark.esp32c6 @pytest.mark.esp32h2 +@pytest.mark.esp32c5 @pytest.mark.adc @pytest.mark.parametrize('config', [ 'iram_safe', @@ -40,6 +41,7 @@ def test_adc_esp32c2_xtal_26mhz(dut: Dut) -> None: @pytest.mark.esp32c3 @pytest.mark.esp32c6 @pytest.mark.esp32h2 +@pytest.mark.esp32c5 @pytest.mark.adc @pytest.mark.parametrize('config', [ 'gdma_iram_safe', diff --git a/components/esp_hw_support/port/esp32c5/sar_periph_ctrl.c b/components/esp_hw_support/port/esp32c5/sar_periph_ctrl.c index 484b89be1b6..c9ccaa662a7 100644 --- a/components/esp_hw_support/port/esp32c5/sar_periph_ctrl.c +++ b/components/esp_hw_support/port/esp32c5/sar_periph_ctrl.c @@ -24,8 +24,6 @@ static const char *TAG = "sar_periph_ctrl"; extern portMUX_TYPE rtc_spinlock; -// TODO: [ESP32C5] IDF-8701, IDF-8703, IDF-8727 - void sar_periph_ctrl_init(void) { sar_ctrl_ll_force_power_ctrl_from_pwdet(true); diff --git a/components/hal/esp32c5/include/hal/adc_ll.h b/components/hal/esp32c5/include/hal/adc_ll.h new file mode 100644 index 00000000000..616ea25e610 --- /dev/null +++ b/components/hal/esp32c5/include/hal/adc_ll.h @@ -0,0 +1,784 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include +#include "esp_attr.h" + +#include "soc/adc_periph.h" +#include "soc/apb_saradc_struct.h" +#include "soc/apb_saradc_reg.h" +#include "soc/pmu_reg.h" +#include "soc/clk_tree_defs.h" +#include "soc/pcr_struct.h" +#include "hal/misc.h" +#include "hal/assert.h" +#include "hal/adc_types.h" +#include "hal/adc_types_private.h" +#include "hal/regi2c_ctrl.h" +#include "hal/sar_ctrl_ll.h" + +#include "soc/regi2c_saradc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ADC_LL_EVENT_ADC1_ONESHOT_DONE BIT(31) +#define ADC_LL_EVENT_ADC2_ONESHOT_DONE BIT(30) + +#define ADC_LL_THRES_ALL_INTR_ST_M (APB_SARADC_APB_SARADC_THRES0_HIGH_INT_ST_M | \ + APB_SARADC_APB_SARADC_THRES1_HIGH_INT_ST_M | \ + APB_SARADC_APB_SARADC_THRES0_LOW_INT_ST_M | \ + APB_SARADC_APB_SARADC_THRES1_LOW_INT_ST_M) + +#define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_HIGH_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_HIGH_INT_ST_M) +#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_LOW_INT_ST_M) + +/*--------------------------------------------------------------- + Oneshot +---------------------------------------------------------------*/ +#define ADC_LL_DATA_INVERT_DEFAULT(PERIPH_NUM) (0) +#define ADC_LL_DELAY_CYCLE_AFTER_DONE_SIGNAL (0) + +/*--------------------------------------------------------------- + DMA +---------------------------------------------------------------*/ +#define ADC_LL_DIGI_DATA_INVERT_DEFAULT(PERIPH_NUM) (0) +#define ADC_LL_FSM_RSTB_WAIT_DEFAULT (8) +#define ADC_LL_FSM_START_WAIT_DEFAULT (5) +#define ADC_LL_FSM_STANDBY_WAIT_DEFAULT (100) +#define ADC_LL_SAMPLE_CYCLE_DEFAULT (2) +#define ADC_LL_DIGI_SAR_CLK_DIV_DEFAULT (1) +#define ADC_LL_CLKM_DIV_NUM_DEFAULT 15 +#define ADC_LL_CLKM_DIV_B_DEFAULT 1 +#define ADC_LL_CLKM_DIV_A_DEFAULT 0 +#define ADC_LL_DEFAULT_CONV_LIMIT_EN 0 +#define ADC_LL_DEFAULT_CONV_LIMIT_NUM 10 + +#define ADC_LL_POWER_MANAGE_SUPPORTED 1 //ESP32C5 supported to manage power mode +/*--------------------------------------------------------------- + PWDET (Power Detect) +---------------------------------------------------------------*/ +#define ADC_LL_PWDET_CCT_DEFAULT (4) + +typedef enum { + ADC_LL_POWER_BY_FSM = SAR_CTRL_LL_POWER_FSM, /*!< ADC XPD controlled by FSM. Used for polling mode */ + ADC_LL_POWER_SW_ON = SAR_CTRL_LL_POWER_ON, /*!< ADC XPD controlled by SW. power on. Used for DMA mode */ + ADC_LL_POWER_SW_OFF = SAR_CTRL_LL_POWER_OFF, /*!< ADC XPD controlled by SW. power off. */ +} adc_ll_power_t; + +typedef enum { + ADC_LL_CTRL_DIG = 0, ///< ADC digital controller +} adc_ll_controller_t; + +/** + * @brief ADC digital controller (DMA mode) work mode. + * + * @note The conversion mode affects the sampling frequency: + * ESP32C5 only support ONLY_ADC1 mode + * SINGLE_UNIT_1: When the measurement is triggered, only ADC1 is sampled once. + */ +typedef enum { + ADC_LL_DIGI_CONV_ONLY_ADC1 = 0, // Only use ADC1 for conversion +} adc_ll_digi_convert_mode_t; + +typedef struct { + union { + struct { + uint8_t atten: 2; + uint8_t channel: 3; + uint8_t unit: 1; + uint8_t reserved: 2; + }; + uint8_t val; + }; +} __attribute__((packed)) adc_ll_digi_pattern_table_t; + +/*--------------------------------------------------------------- + Digital controller setting +---------------------------------------------------------------*/ + +/** + * Set adc fsm interval parameter for digital controller. These values are fixed for same platforms. + * + * @param rst_wait cycles between DIG ADC controller reset ADC sensor and start ADC sensor. + * @param start_wait Delay time after open xpd. + * @param standby_wait Delay time to close xpd. + */ +static inline void adc_ll_digi_set_fsm_time(uint32_t rst_wait, uint32_t start_wait, uint32_t standby_wait) +{ + // Internal FSM reset wait time + HAL_FORCE_MODIFY_U32_REG_FIELD(APB_SARADC.saradc_fsm_wait, saradc_saradc_rstb_wait, rst_wait); + // Internal FSM start wait time + HAL_FORCE_MODIFY_U32_REG_FIELD(APB_SARADC.saradc_fsm_wait, saradc_saradc_xpd_wait, start_wait); + // Internal FSM standby wait time + HAL_FORCE_MODIFY_U32_REG_FIELD(APB_SARADC.saradc_fsm_wait, saradc_saradc_standby_wait, standby_wait); +} + +/** + * Set adc sample cycle for digital controller. + * + * @note Normally, please use default value. + * @param sample_cycle Cycles between DIG ADC controller start ADC sensor and beginning to receive data from sensor. + * Range: 2 ~ 0xFF. + */ +static inline void adc_ll_set_sample_cycle(uint32_t sample_cycle) +{ + /* Peripheral reg i2c has powered up in rtc_init, write directly */ + REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_SAMPLE_CYCLE_ADDR, sample_cycle); +} + +/** + * Set SAR ADC module clock division factor. + * SAR ADC clock divided from digital controller clock. + * + * @param div Division factor. + */ +static inline void adc_ll_digi_set_clk_div(uint32_t div) +{ + /* ADC clock divided from digital controller clock clk */ + HAL_FORCE_MODIFY_U32_REG_FIELD(APB_SARADC.saradc_ctrl, saradc_saradc_sar_clk_div, div); +} + +/** + * Set adc max conversion number for digital controller. + * If the number of ADC conversion is equal to the maximum, the conversion is stopped. + * + * @param meas_num Max conversion number. Range: 0 ~ 255. + */ +static inline void adc_ll_digi_set_convert_limit_num(uint32_t meas_num) +{ + HAL_FORCE_MODIFY_U32_REG_FIELD(APB_SARADC.saradc_ctrl2, saradc_saradc_max_meas_num, meas_num); +} + +/** + * Enable max conversion number detection for digital controller. + * If the number of ADC conversion is equal to the maximum, the conversion is stopped. + * + * @param enable true: enable; false: disable + */ +static inline void adc_ll_digi_convert_limit_enable(bool enable) +{ + APB_SARADC.saradc_ctrl2.saradc_saradc_meas_num_limit = enable; +} + +/** + * Set adc conversion mode for digital controller. + * + * @note ESP32C5 only support ADC1 single mode. + * + * @param mode Conversion mode select. + */ +static inline void adc_ll_digi_set_convert_mode(adc_ll_digi_convert_mode_t mode) +{ + //ESP32C5 only supports ADC_LL_DIGI_CONV_ONLY_ADC1 mode +} + +/** + * Set pattern table length for digital controller. + * The pattern table that defines the conversion rules for each SAR ADC. Each table has 4 items, in which channel selection, + * and attenuation are stored. When the conversion is started, the controller reads conversion rules from the + * pattern table one by one. For each controller the scan sequence has at most 8 different rules before repeating itself. + * + * @param adc_n ADC unit. + * @param patt_len Items range: 1 ~ 8. + */ +static inline void adc_ll_digi_set_pattern_table_len(adc_unit_t adc_n, uint32_t patt_len) +{ + APB_SARADC.saradc_ctrl.saradc_saradc_sar_patt_len = patt_len - 1; +} + +/** + * Set pattern table for digital controller. + * The pattern table that defines the conversion rules for each SAR ADC. Each table has 4 items, in which channel selection, + * resolution and attenuation are stored. When the conversion is started, the controller reads conversion rules from the + * pattern table one by one. For each controller the scan sequence has at most 8 different rules before repeating itself. + * + * @param adc_n ADC unit. + * @param pattern_index Items index. Range: 0 ~ 7. + * @param pattern Stored conversion rules. + */ +static inline void adc_ll_digi_set_pattern_table(adc_unit_t adc_n, uint32_t pattern_index, adc_digi_pattern_config_t table) +{ + uint32_t tab; + uint8_t index = pattern_index / 4; + uint8_t offset = (pattern_index % 4) * 6; + adc_ll_digi_pattern_table_t pattern = {0}; + + pattern.val = (table.atten & 0x3) | ((table.channel & 0x7) << 2) | ((table.unit & 0x1) << 5); + if (index == 0) { + tab = APB_SARADC.saradc_sar_patt_tab1.saradc_saradc_sar_patt_tab1; // Read old register value + tab &= (~(0xFC0000 >> offset)); // Clear old data + tab |= ((uint32_t)(pattern.val & 0x3F) << 18) >> offset; // Fill in the new data + APB_SARADC.saradc_sar_patt_tab1.saradc_saradc_sar_patt_tab1 = tab; // Write back + } else { + tab = APB_SARADC.saradc_sar_patt_tab2.saradc_saradc_sar_patt_tab2; // Read old register value + tab &= (~(0xFC0000 >> offset)); // Clear old data + tab |= ((uint32_t)(pattern.val & 0x3F) << 18) >> offset; // Fill in the new data + APB_SARADC.saradc_sar_patt_tab2.saradc_saradc_sar_patt_tab2 = tab; // Write back + } +} + +/** + * Reset the pattern table pointer, then take the measurement rule from table header in next measurement. + * + * @param adc_n ADC unit. + */ +static inline void adc_ll_digi_clear_pattern_table(adc_unit_t adc_n) +{ + APB_SARADC.saradc_ctrl.saradc_saradc_sar_patt_p_clear = 1; + APB_SARADC.saradc_ctrl.saradc_saradc_sar_patt_p_clear = 0; +} + +/** + * Sets the number of cycles required for the conversion to complete and wait for the arbiter to stabilize. + * + * @note Only ADC2 have arbiter function. + * @param cycle range: 0 ~ 4. + */ +static inline void adc_ll_digi_set_arbiter_stable_cycle(uint32_t cycle) +{ + APB_SARADC.saradc_ctrl.saradc_saradc_wait_arb_cycle = cycle; +} + +/** + * ADC Digital controller output data invert or not. + * + * @param adc_n ADC unit. + * @param inv_en data invert or not. + */ +static inline void adc_ll_digi_output_invert(adc_unit_t adc_n, bool inv_en) +{ + if (adc_n == ADC_UNIT_1) { + APB_SARADC.saradc_ctrl2.saradc_saradc_sar1_inv = inv_en; // Enable / Disable ADC data invert + } +} + +/** + * Set the interval clock cycle for the digital controller to trigger the measurement. + * Expression: `trigger_meas_freq` = `controller_clk` / 2 / interval. + * + * @note The trigger interval should not be smaller than the sampling time of the SAR ADC. + * @param cycle The clock cycle (trigger interval) of the measurement. Range: 30 ~ 4095. + */ +static inline void adc_ll_digi_set_trigger_interval(uint32_t cycle) +{ + APB_SARADC.saradc_ctrl2.saradc_saradc_timer_target = cycle; +} + +/** + * Enable digital controller timer to trigger the measurement. + */ +static inline void adc_ll_digi_trigger_enable(void) +{ + APB_SARADC.saradc_ctrl2.saradc_saradc_timer_en = 1; +} + +/** + * Disable digital controller timer to trigger the measurement. + */ +static inline void adc_ll_digi_trigger_disable(void) +{ + APB_SARADC.saradc_ctrl2.saradc_saradc_timer_en = 0; +} + +/** + * Set ADC digital controller clock division factor. The clock divided from `APLL` or `APB` clock. + * Expression: controller_clk = (APLL or APB) / (div_num + div_a / div_b + 1). + * + * @param div_num Division factor. Range: 0 ~ 255. + * @param div_b Division factor. Range: 1 ~ 63. + * @param div_a Division factor. Range: 0 ~ 63. + */ +static inline void adc_ll_digi_controller_clk_div(uint32_t div_num, uint32_t div_b, uint32_t div_a) +{ + HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.saradc_clkm_conf, saradc_clkm_div_num, div_num); + PCR.saradc_clkm_conf.saradc_clkm_div_b = div_b; + PCR.saradc_clkm_conf.saradc_clkm_div_a = div_a; +} + +/** + * Enable clock and select clock source for ADC digital controller. + * + * @param clk_src clock source for ADC digital controller. + */ +static inline void adc_ll_digi_clk_sel(adc_continuous_clk_src_t clk_src) +{ + switch (clk_src) { + case ADC_DIGI_CLK_SRC_XTAL: + PCR.saradc_clkm_conf.saradc_clkm_sel = 0; + break; + case ADC_DIGI_CLK_SRC_RC_FAST: + PCR.saradc_clkm_conf.saradc_clkm_sel = 1; + break; + case ADC_DIGI_CLK_SRC_PLL_F80M: + PCR.saradc_clkm_conf.saradc_clkm_sel = 2; + break; + default: + HAL_ASSERT(false && "unsupported clock"); + } + // Enable ADC_CTRL_CLK (i.e. digital domain clock) + APB_SARADC.saradc_ctrl.saradc_saradc_sar_clk_gated = 1; +} + +/** + * Disable clock for ADC digital controller. + */ +static inline void adc_ll_digi_controller_clk_disable(void) +{ + APB_SARADC.saradc_ctrl.saradc_saradc_sar_clk_gated = 0; +} + +/** + * Reset adc digital controller filter. + * + * @param idx Filter index + * @param adc_n ADC unit. + */ +static inline void adc_ll_digi_filter_reset(adc_digi_iir_filter_t idx, adc_unit_t adc_n) +{ + (void)adc_n; + APB_SARADC.saradc_filter_ctrl0.saradc_apb_saradc_filter_reset = 1; + APB_SARADC.saradc_filter_ctrl0.saradc_apb_saradc_filter_reset = 0; +} + +/** + * Set adc digital controller filter coeff. + * + * @param idx filter index + * @param adc_n adc unit + * @param channel adc channel + * @param coeff filter coeff + */ +static inline void adc_ll_digi_filter_set_factor(adc_digi_iir_filter_t idx, adc_unit_t adc_n, adc_channel_t channel, adc_digi_iir_filter_coeff_t coeff) +{ + uint32_t factor_reg_val = 0; + switch (coeff) { + case ADC_DIGI_IIR_FILTER_COEFF_2: + factor_reg_val = 1; + break; + case ADC_DIGI_IIR_FILTER_COEFF_4: + factor_reg_val = 2; + break; + case ADC_DIGI_IIR_FILTER_COEFF_8: + factor_reg_val = 3; + break; + case ADC_DIGI_IIR_FILTER_COEFF_16: + factor_reg_val = 4; + break; + case ADC_DIGI_IIR_FILTER_COEFF_64: + factor_reg_val = 6; + break; + default: + HAL_ASSERT(false); + } + + if (idx == ADC_DIGI_IIR_FILTER_0) { + APB_SARADC.saradc_filter_ctrl0.saradc_apb_saradc_filter_channel0 = ((adc_n + 1) << 3) | (channel & 0x7); + APB_SARADC.saradc_filter_ctrl1.saradc_apb_saradc_filter_factor0 = factor_reg_val; + } else if (idx == ADC_DIGI_IIR_FILTER_1) { + APB_SARADC.saradc_filter_ctrl0.saradc_apb_saradc_filter_channel1 = ((adc_n + 1) << 3) | (channel & 0x7); + APB_SARADC.saradc_filter_ctrl1.saradc_apb_saradc_filter_factor1 = factor_reg_val; + } +} + +/** + * Enable adc digital controller filter. + * Filtering the ADC data to obtain smooth data at higher sampling rates. + * + * @param idx filter index + * @param adc_n ADC unit + * @param enable Enable / Disable + */ +static inline void adc_ll_digi_filter_enable(adc_digi_iir_filter_t idx, adc_unit_t adc_n, bool enable) +{ + (void)adc_n; + if (!enable) { + if (idx == ADC_DIGI_IIR_FILTER_0) { + APB_SARADC.saradc_filter_ctrl0.saradc_apb_saradc_filter_channel0 = 0xF; + APB_SARADC.saradc_filter_ctrl1.saradc_apb_saradc_filter_factor0 = 0; + } else if (idx == ADC_DIGI_IIR_FILTER_1) { + APB_SARADC.saradc_filter_ctrl0.saradc_apb_saradc_filter_channel1 = 0xF; + APB_SARADC.saradc_filter_ctrl1.saradc_apb_saradc_filter_factor1 = 0; + } + } + //nothing to do to enable, after adc_ll_digi_filter_set_factor, it's enabled. +} + +/** + * Set monitor threshold of adc digital controller on specific channel. + * + * @param monitor_id ADC digi monitor unit index. + * @param adc_n Which adc unit the channel belong to. + * @param channel Which channel of adc want to be monitored. + * @param h_thresh High threshold of this monitor. + * @param l_thresh Low threshold of this monitor. + */ +static inline void adc_ll_digi_monitor_set_thres(adc_monitor_id_t monitor_id, adc_unit_t adc_n, uint8_t channel, int32_t h_thresh, int32_t l_thresh) +{ + if (monitor_id == ADC_MONITOR_0) { + APB_SARADC.saradc_thres0_ctrl.saradc_apb_saradc_thres0_channel = (adc_n << 3) | (channel & 0x7); + APB_SARADC.saradc_thres0_ctrl.saradc_apb_saradc_thres0_high = h_thresh; + APB_SARADC.saradc_thres0_ctrl.saradc_apb_saradc_thres0_low = l_thresh; + } else { // ADC_MONITOR_1 + APB_SARADC.saradc_thres1_ctrl.saradc_apb_saradc_thres1_channel = (adc_n << 3) | (channel & 0x7); + APB_SARADC.saradc_thres1_ctrl.saradc_apb_saradc_thres1_high = h_thresh; + APB_SARADC.saradc_thres1_ctrl.saradc_apb_saradc_thres1_low = l_thresh; + } +} + +/** + * Start/Stop monitor of adc digital controller. + * + * @param monitor_id ADC digi monitor unit index. + * @param start 1 for start, 0 for stop + */ +static inline void adc_ll_digi_monitor_user_start(adc_monitor_id_t monitor_id, bool start) +{ + if (monitor_id == ADC_MONITOR_0) { + APB_SARADC.saradc_thres_ctrl.saradc_apb_saradc_thres0_en = start; + } else { + APB_SARADC.saradc_thres_ctrl.saradc_apb_saradc_thres1_en = start; + } +} + +/** + * Enable/disable a intr of adc digital monitor. + * + * @param monitor_id ADC digi monitor unit index. + * @param mode monit mode to enable/disable intr. + * @param enable enable or disable. + */ +static inline void adc_ll_digi_monitor_enable_intr(adc_monitor_id_t monitor_id, adc_monitor_mode_t mode, bool enable) +{ + if (monitor_id == ADC_MONITOR_0) { + if (mode == ADC_MONITOR_MODE_HIGH) { + APB_SARADC.saradc_int_ena.saradc_apb_saradc_thres0_high_int_ena = enable; + } else { + APB_SARADC.saradc_int_ena.saradc_apb_saradc_thres0_low_int_ena = enable; + } + } + if (monitor_id == ADC_MONITOR_1) { + if (mode == ADC_MONITOR_MODE_HIGH) { + APB_SARADC.saradc_int_ena.saradc_apb_saradc_thres1_high_int_ena = enable; + } else { + APB_SARADC.saradc_int_ena.saradc_apb_saradc_thres1_low_int_ena = enable; + } + } +} + +/** + * Clear intr raw for adc digi monitors. + */ +__attribute__((always_inline)) +static inline void adc_ll_digi_monitor_clear_intr(void) +{ + APB_SARADC.saradc_int_clr.val |= ADC_LL_THRES_ALL_INTR_ST_M; +} + +/** + * Get the address of digi monitor intr statue register. + * + * @return address of register. + */ +__attribute__((always_inline)) +static inline volatile const void *adc_ll_digi_monitor_get_intr_status_addr(void) +{ + return &APB_SARADC.saradc_int_st.val; +} + +/** + * Set DMA eof num of adc digital controller. + * If the number of measurements reaches `dma_eof_num`, then `dma_in_suc_eof` signal is generated. + * + * @param num eof num of DMA. + */ +static inline void adc_ll_digi_dma_set_eof_num(uint32_t num) +{ + HAL_FORCE_MODIFY_U32_REG_FIELD(APB_SARADC.saradc_dma_conf, saradc_apb_adc_eof_num, num); +} + +/** + * Enable output data to DMA from adc digital controller. + */ +static inline void adc_ll_digi_dma_enable(void) +{ + APB_SARADC.saradc_dma_conf.saradc_apb_adc_trans = 1; +} + +/** + * Disable output data to DMA from adc digital controller. + */ +static inline void adc_ll_digi_dma_disable(void) +{ + APB_SARADC.saradc_dma_conf.saradc_apb_adc_trans = 0; +} + +/** + * Reset adc digital controller. + */ +static inline void adc_ll_digi_reset(void) +{ + APB_SARADC.saradc_dma_conf.saradc_apb_adc_reset_fsm = 1; + APB_SARADC.saradc_dma_conf.saradc_apb_adc_reset_fsm = 0; +} + +/*--------------------------------------------------------------- + PWDET(Power detect) controller setting +---------------------------------------------------------------*/ +/** + * Set adc cct for PWDET controller. + * + * @note Capacitor tuning of the PA power monitor. cct set to the same value with PHY. + * @param cct Range: 0 ~ 7. + */ +static inline void adc_ll_pwdet_set_cct(uint32_t cct) +{ + (void)cct; +} + +/** + * Get adc cct for PWDET controller. + * + * @note Capacitor tuning of the PA power monitor. cct set to the same value with PHY. + * @return cct Range: 0 ~ 7. + */ +static inline uint32_t adc_ll_pwdet_get_cct(void) +{ + return 0; +} + +/*--------------------------------------------------------------- + Common setting +---------------------------------------------------------------*/ + +/** + * @brief Enable the ADC APB clock + * @param enable true to enable, false to disable + */ +static inline void adc_ll_enable_bus_clock(bool enable) +{ + PCR.saradc_conf.saradc_reg_clk_en = enable; +} + +/** + * @brief Reset ADC module + */ +static inline void adc_ll_reset_register(void) +{ + PCR.saradc_conf.saradc_reg_rst_en = 1; + PCR.saradc_conf.saradc_reg_rst_en = 0; +} + +/** + * Set ADC module power management. + * + * @param manage Set ADC power status. + */ +static inline void adc_ll_set_power_manage(adc_unit_t adc_n, adc_ll_power_t manage) +{ + (void) adc_n; + /* Bit1 0:Fsm 1: SW mode + Bit0 0:SW mode power down 1: SW mode power on */ + if (manage == ADC_LL_POWER_SW_ON) { + APB_SARADC.saradc_ctrl.saradc_saradc_sar_clk_gated = 1; + APB_SARADC.saradc_ctrl.saradc_saradc_xpd_sar_force = 3; + } else if (manage == ADC_LL_POWER_BY_FSM) { + APB_SARADC.saradc_ctrl.saradc_saradc_sar_clk_gated = 1; + APB_SARADC.saradc_ctrl.saradc_saradc_xpd_sar_force = 0; + } else if (manage == ADC_LL_POWER_SW_OFF) { + APB_SARADC.saradc_ctrl.saradc_saradc_sar_clk_gated = 0; + APB_SARADC.saradc_ctrl.saradc_saradc_xpd_sar_force = 2; + } +} + +__attribute__((always_inline)) +static inline void adc_ll_set_controller(adc_unit_t adc_n, adc_ll_controller_t ctrl) +{ + //Not used on ESP32C5 +} + +/*--------------------------------------------------------------- + Oneshot Read +---------------------------------------------------------------*/ +/** + * Set adc output data format for oneshot mode + * + * @note ESP32C5 Oneshot mode only supports 12bit. + * @param adc_n ADC unit. + * @param bits Output data bits width option. + */ +static inline void adc_oneshot_ll_set_output_bits(adc_unit_t adc_n, adc_bitwidth_t bits) +{ + //ESP32C5 only supports 12bit, leave here for compatibility + HAL_ASSERT(bits == ADC_BITWIDTH_12 || bits == ADC_BITWIDTH_DEFAULT); +} + +/** + * Enable adc channel to start convert. + * + * @note Only one channel can be selected for measurement. + * + * @param adc_n ADC unit. + * @param channel ADC channel number for each ADCn. + */ +static inline void adc_oneshot_ll_set_channel(adc_unit_t adc_n, adc_channel_t channel) +{ + HAL_ASSERT(adc_n == ADC_UNIT_1); + APB_SARADC.saradc_onetime_sample.saradc_saradc_onetime_channel = ((adc_n << 3) | channel); +} + +/** + * Disable adc channel to start convert. + * + * @note Only one channel can be selected in once measurement. + * + * @param adc_n ADC unit. + */ +static inline void adc_oneshot_ll_disable_channel(adc_unit_t adc_n) +{ + HAL_ASSERT(adc_n == ADC_UNIT_1); + APB_SARADC.saradc_onetime_sample.saradc_saradc_onetime_channel = ((adc_n << 3) | 0xF); +} + +/** + * Start oneshot conversion by software + * + * @param val Usage: set to 1 to start the ADC conversion. The step signal should at least keep 3 ADC digital controller clock cycle, + * otherwise the step signal may not be captured by the ADC digital controller when its frequency is slow. + * This hardware limitation will be removed in future versions. + */ +static inline void adc_oneshot_ll_start(bool val) +{ + APB_SARADC.saradc_onetime_sample.saradc_saradc_onetime_start = val; +} + +/** + * Clear the event for each ADCn for Oneshot mode + * + * @param event ADC event + */ +static inline void adc_oneshot_ll_clear_event(uint32_t event_mask) +{ + APB_SARADC.saradc_int_clr.val |= event_mask; +} + +/** + * Check the event for each ADCn for Oneshot mode + * + * @param event ADC event + * + * @return + * -true : The conversion process is finish. + * -false : The conversion process is not finish. + */ +static inline bool adc_oneshot_ll_get_event(uint32_t event_mask) +{ + return (APB_SARADC.saradc_int_raw.val & event_mask); +} + +/** + * Get the converted value for each ADCn for controller. + * + * @param adc_n ADC unit. + * @return + * - Converted value. + */ +static inline uint32_t adc_oneshot_ll_get_raw_result(adc_unit_t adc_n) +{ + HAL_ASSERT(adc_n == ADC_UNIT_1); + uint32_t ret_val = 0; + ret_val = APB_SARADC.saradc_sar1data_status.saradc_apb_saradc1_data & 0xfff; + return ret_val; +} + + +/** + * Analyze whether the obtained raw data is correct. + * ADC2 can use arbiter. The arbitration result is stored in the channel information of the returned data. + * + * @param adc_n ADC unit. + * @param raw_data ADC raw data input (convert value). + * @return + * - 1: The data is correct to use. + * - 0: The data is invalid. + */ +static inline bool adc_oneshot_ll_raw_check_valid(adc_unit_t adc_n, uint32_t raw_data) +{ + HAL_ASSERT(adc_n == ADC_UNIT_1); + return true; +} + +/** + * ADC module RTC output data invert or not. + * + * @param adc_n ADC unit. + * @param inv_en data invert or not. + */ +static inline void adc_oneshot_ll_output_invert(adc_unit_t adc_n, bool inv_en) +{ + HAL_ASSERT(adc_n == ADC_UNIT_1); + (void)inv_en; + //For compatibility +} + +/** + * Enable oneshot conversion trigger + * + * @param adc_n ADC unit + */ +static inline void adc_oneshot_ll_enable(adc_unit_t adc_n) +{ + HAL_ASSERT(adc_n == ADC_UNIT_1); + APB_SARADC.saradc_onetime_sample.saradc_saradc1_onetime_sample = 1; +} + +/** + * Disable oneshot conversion trigger for all the ADC units + */ +static inline void adc_oneshot_ll_disable_all_unit(void) +{ + APB_SARADC.saradc_onetime_sample.saradc_saradc1_onetime_sample = 0; + APB_SARADC.saradc_onetime_sample.saradc_saradc2_onetime_sample = 0; +} + +/** + * Set attenuation + * + * @note Attenuation is for all channels + * + * @param adc_n ADC unit + * @param channel ADC channel + * @param atten ADC attenuation + */ +static inline void adc_oneshot_ll_set_atten(adc_unit_t adc_n, adc_channel_t channel, adc_atten_t atten) +{ + HAL_ASSERT(adc_n == ADC_UNIT_1); + (void)channel; + // Attenuation is for all channels, unit and channel are for compatibility + APB_SARADC.saradc_onetime_sample.saradc_saradc_onetime_atten = atten; +} + +/** + * Get the attenuation of a particular channel on ADCn. + * + * @param adc_n ADC unit. + * @param channel ADCn channel number. + * @return atten The attenuation option. + */ +__attribute__((always_inline)) +static inline adc_atten_t adc_ll_get_atten(adc_unit_t adc_n, adc_channel_t channel) +{ + HAL_ASSERT(adc_n == ADC_UNIT_1); + (void)channel; + return (adc_atten_t)APB_SARADC.saradc_onetime_sample.saradc_saradc_onetime_atten; +} + +#ifdef __cplusplus +} +#endif diff --git a/components/hal/include/hal/adc_types.h b/components/hal/include/hal/adc_types.h index b37689afe88..34445ee3d58 100644 --- a/components/hal/include/hal/adc_types.h +++ b/components/hal/include/hal/adc_types.h @@ -211,7 +211,7 @@ typedef struct { }; } adc_digi_output_data_t; -#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 +#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C5 /** * @brief ADC digital controller (DMA mode) output data format. * Used to analyze the acquired ADC (DMA) data. diff --git a/components/idf_test/include/esp32c5/idf_performance_target.h b/components/idf_test/include/esp32c5/idf_performance_target.h index dd3f635e549..7f0986535d8 100644 --- a/components/idf_test/include/esp32c5/idf_performance_target.h +++ b/components/idf_test/include/esp32c5/idf_performance_target.h @@ -5,3 +5,11 @@ */ #pragma once + +#define IDF_PERFORMANCE_MAX_ADC_CONTINUOUS_STD_ATTEN3_NO_FILTER 5 +#define IDF_PERFORMANCE_MAX_ADC_CONTINUOUS_STD_ATTEN3_FILTER_2 5 +#define IDF_PERFORMANCE_MAX_ADC_CONTINUOUS_STD_ATTEN3_FILTER_4 5 +#define IDF_PERFORMANCE_MAX_ADC_CONTINUOUS_STD_ATTEN3_FILTER_8 5 +#define IDF_PERFORMANCE_MAX_ADC_CONTINUOUS_STD_ATTEN3_FILTER_16 5 +#define IDF_PERFORMANCE_MAX_ADC_CONTINUOUS_STD_ATTEN3_FILTER_64 5 +#define IDF_PERFORMANCE_MAX_ADC_ONESHOT_STD_ATTEN3 5 diff --git a/components/soc/esp32c5/adc_periph.c b/components/soc/esp32c5/adc_periph.c new file mode 100644 index 00000000000..9f9bd96cfb3 --- /dev/null +++ b/components/soc/esp32c5/adc_periph.c @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/adc_periph.h" + +/* Store IO number corresponding to the ADC channel number. */ +const int adc_channel_io_map[SOC_ADC_PERIPH_NUM][SOC_ADC_MAX_CHANNEL_NUM] = { + /* ADC1 */ + { + ADC1_CHANNEL_0_GPIO_NUM, + ADC1_CHANNEL_1_GPIO_NUM, + ADC1_CHANNEL_2_GPIO_NUM, + ADC1_CHANNEL_3_GPIO_NUM, + ADC1_CHANNEL_4_GPIO_NUM, + ADC1_CHANNEL_5_GPIO_NUM, + }, +}; diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index ad5ad1da435..14dd3a6e48f 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -3,6 +3,10 @@ # using gen_soc_caps_kconfig.py, do not edit manually ##################################################### +config SOC_ADC_SUPPORTED + bool + default y + config SOC_UART_SUPPORTED bool default y @@ -191,13 +195,85 @@ config SOC_AES_SUPPORT_AES_256 bool default y +config SOC_ADC_DIG_CTRL_SUPPORTED + bool + default y + +config SOC_ADC_DIG_IIR_FILTER_SUPPORTED + bool + default y + +config SOC_ADC_MONITOR_SUPPORTED + bool + default y + +config SOC_ADC_DMA_SUPPORTED + bool + default y + config SOC_ADC_PERIPH_NUM int default 1 config SOC_ADC_MAX_CHANNEL_NUM int - default 7 + default 6 + +config SOC_ADC_ATTEN_NUM + int + default 4 + +config SOC_ADC_DIGI_CONTROLLER_NUM + int + default 1 + +config SOC_ADC_PATT_LEN_MAX + int + default 8 + +config SOC_ADC_DIGI_MAX_BITWIDTH + int + default 12 + +config SOC_ADC_DIGI_MIN_BITWIDTH + int + default 12 + +config SOC_ADC_DIGI_IIR_FILTER_NUM + int + default 2 + +config SOC_ADC_DIGI_MONITOR_NUM + int + default 2 + +config SOC_ADC_DIGI_RESULT_BYTES + int + default 4 + +config SOC_ADC_DIGI_DATA_BYTES_PER_CONV + int + default 4 + +config SOC_ADC_SAMPLE_FREQ_THRES_HIGH + int + default 83333 + +config SOC_ADC_SAMPLE_FREQ_THRES_LOW + int + default 611 + +config SOC_ADC_RTC_MIN_BITWIDTH + int + default 12 + +config SOC_ADC_RTC_MAX_BITWIDTH + int + default 12 + +config SOC_ADC_SHARED_POWER + bool + default y config SOC_SHARED_IDCACHE_SUPPORTED bool diff --git a/components/soc/esp32c5/include/soc/adc_channel.h b/components/soc/esp32c5/include/soc/adc_channel.h index 0f7c05d9296..a540b82758f 100644 --- a/components/soc/esp32c5/include/soc/adc_channel.h +++ b/components/soc/esp32c5/include/soc/adc_channel.h @@ -6,24 +6,20 @@ #pragma once -// TODO: [ESP32-C5] IDF-8701 Check the channel -#define ADC1_GPIO0_CHANNEL 0 -#define ADC1_CHANNEL_0_GPIO_NUM 0 +#define ADC1_GPIO1_CHANNEL 0 +#define ADC1_CHANNEL_0_GPIO_NUM 1 -#define ADC1_GPIO1_CHANNEL 1 -#define ADC1_CHANNEL_1_GPIO_NUM 1 +#define ADC1_GPIO2_CHANNEL 1 +#define ADC1_CHANNEL_1_GPIO_NUM 2 -#define ADC1_GPIO2_CHANNEL 2 -#define ADC1_CHANNEL_2_GPIO_NUM 2 +#define ADC1_GPIO3_CHANNEL 2 +#define ADC1_CHANNEL_2_GPIO_NUM 3 -#define ADC1_GPIO3_CHANNEL 3 -#define ADC1_CHANNEL_3_GPIO_NUM 3 +#define ADC1_GPIO4_CHANNEL 3 +#define ADC1_CHANNEL_3_GPIO_NUM 4 -#define ADC1_GPIO4_CHANNEL 4 -#define ADC1_CHANNEL_4_GPIO_NUM 4 +#define ADC1_GPIO5_CHANNEL 4 +#define ADC1_CHANNEL_4_GPIO_NUM 5 -#define ADC1_GPIO5_CHANNEL 5 -#define ADC1_CHANNEL_5_GPIO_NUM 5 - -#define ADC1_GPIO6_CHANNEL 6 -#define ADC1_CHANNEL_6_GPIO_NUM 6 +#define ADC1_GPIO6_CHANNEL 5 +#define ADC1_CHANNEL_5_GPIO_NUM 6 diff --git a/components/soc/esp32c5/include/soc/clk_tree_defs.h b/components/soc/esp32c5/include/soc/clk_tree_defs.h index 1629252d8e0..18d8dc5bfac 100644 --- a/components/soc/esp32c5/include/soc/clk_tree_defs.h +++ b/components/soc/esp32c5/include/soc/clk_tree_defs.h @@ -433,7 +433,7 @@ typedef enum { // TODO: [ESP32C5] IDF-8691, IDF-8692 (inherit from C6) /** * @brief ADC digital controller clock source */ -typedef enum { // TODO: [ESP32C5] IDF-8701, IDF-8702, IDF-8703 (inherit from C6) +typedef enum { ADC_DIGI_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ ADC_DIGI_CLK_SRC_PLL_F80M = SOC_MOD_CLK_PLL_F80M, /*!< Select PLL_F80M as the source clock */ ADC_DIGI_CLK_SRC_RC_FAST = SOC_MOD_CLK_RC_FAST, /*!< Select RC_FAST as the source clock */ diff --git a/components/soc/esp32c5/include/soc/regi2c_saradc.h b/components/soc/esp32c5/include/soc/regi2c_saradc.h new file mode 100644 index 00000000000..a5f8fbf611d --- /dev/null +++ b/components/soc/esp32c5/include/soc/regi2c_saradc.h @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +/** + * @file regi2c_saradc.h + * @brief Register definitions for analog to calibrate initial code for getting a more precise voltage of SAR ADC. + * + * This file lists register fields of SAR, located on an internal configuration + * bus. These definitions are used via macros defined in regi2c_ctrl.h, by + * function in adc_ll.h. + */ + +#define I2C_SAR_ADC 0X69 +#define I2C_SAR_ADC_HOSTID 0 + +#define I2C_SAR_ADC_SAR1_INIT_CODE_LSB 0x0 +#define I2C_SAR_ADC_SAR1_INIT_CODE_LSB_MSB 0x7 +#define I2C_SAR_ADC_SAR1_INIT_CODE_LSB_LSB 0x0 + +#define I2C_SAR_ADC_SAR1_INIT_CODE_MSB 0x1 +#define I2C_SAR_ADC_SAR1_INIT_CODE_MSB_MSB 0x3 +#define I2C_SAR_ADC_SAR1_INIT_CODE_MSB_LSB 0x0 + +#define ADC_SAR1_SAMPLE_CYCLE_ADDR 0x2 +#define ADC_SAR1_SAMPLE_CYCLE_ADDR_MSB 0x2 +#define ADC_SAR1_SAMPLE_CYCLE_ADDR_LSB 0x0 + +#define ADC_SAR1_DREF_ADDR 0x2 +#define ADC_SAR1_DREF_ADDR_MSB 0x6 +#define ADC_SAR1_DREF_ADDR_LSB 0x4 + +#define ADC_SAR2_INITIAL_CODE_LOW_ADDR 0x3 +#define ADC_SAR2_INITIAL_CODE_LOW_ADDR_MSB 0x7 +#define ADC_SAR2_INITIAL_CODE_LOW_ADDR_LSB 0x0 + +#define ADC_SAR2_INITIAL_CODE_HIGH_ADDR 0x4 +#define ADC_SAR2_INITIAL_CODE_HIGH_ADDR_MSB 0x3 +#define ADC_SAR2_INITIAL_CODE_HIGH_ADDR_LSB 0x0 + +#define ADC_SAR2_SAMPLE_CYCLE_ADDR 0x5 +#define ADC_SAR2_SAMPLE_CYCLE_ADDR_MSB 0x2 +#define ADC_SAR2_SAMPLE_CYCLE_ADDR_LSB 0x0 + +#define ADC_SAR2_DREF_ADDR 0x5 +#define ADC_SAR2_DREF_ADDR_MSB 0x6 +#define ADC_SAR2_DREF_ADDR_LSB 0x4 + +#define I2C_SARADC_TSENS_DAC 0x6 +#define I2C_SARADC_TSENS_DAC_MSB 0x3 +#define I2C_SARADC_TSENS_DAC_LSB 0x0 diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 25d312c41c6..34d9b540253 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -17,7 +17,7 @@ #pragma once /*-------------------------- COMMON CAPS ---------------------------------------*/ -// #define SOC_ADC_SUPPORTED 1 // TODO: [ESP32C5] IDF-8701 +#define SOC_ADC_SUPPORTED 1 // #define SOC_DEDICATED_GPIO_SUPPORTED 1 // TODO: [ESP32C5] IDF-8725 #define SOC_UART_SUPPORTED 1 #define SOC_GDMA_SUPPORTED 1 @@ -94,32 +94,32 @@ /*-------------------------- ADC CAPS -------------------------------*/ /*!< SAR ADC Module*/ -// #define SOC_ADC_DIG_CTRL_SUPPORTED 1 -// #define SOC_ADC_DIG_IIR_FILTER_SUPPORTED 1 -// #define SOC_ADC_MONITOR_SUPPORTED 1 -// #define SOC_ADC_DIG_SUPPORTED_UNIT(UNIT) 1 //Digital controller supported ADC unit -// #define SOC_ADC_DMA_SUPPORTED 1 +#define SOC_ADC_DIG_CTRL_SUPPORTED 1 +#define SOC_ADC_DIG_IIR_FILTER_SUPPORTED 1 +#define SOC_ADC_MONITOR_SUPPORTED 1 +#define SOC_ADC_DIG_SUPPORTED_UNIT(UNIT) 1 //Digital controller supported ADC unit +#define SOC_ADC_DMA_SUPPORTED 1 #define SOC_ADC_PERIPH_NUM (1U) -// #define SOC_ADC_CHANNEL_NUM(PERIPH_NUM) (7) -#define SOC_ADC_MAX_CHANNEL_NUM (7) -// #define SOC_ADC_ATTEN_NUM (4) +#define SOC_ADC_CHANNEL_NUM(PERIPH_NUM) (6) +#define SOC_ADC_MAX_CHANNEL_NUM (6) +#define SOC_ADC_ATTEN_NUM (4) /*!< Digital */ -// #define SOC_ADC_DIGI_CONTROLLER_NUM (1U) -// #define SOC_ADC_PATT_LEN_MAX (8) /*!< Two pattern tables, each contains 4 items. Each item takes 1 byte */ -// #define SOC_ADC_DIGI_MAX_BITWIDTH (12) -// #define SOC_ADC_DIGI_MIN_BITWIDTH (12) -// #define SOC_ADC_DIGI_IIR_FILTER_NUM (2) -// #define SOC_ADC_DIGI_MONITOR_NUM (2) -// #define SOC_ADC_DIGI_RESULT_BYTES (4) -// #define SOC_ADC_DIGI_DATA_BYTES_PER_CONV (4) +#define SOC_ADC_DIGI_CONTROLLER_NUM (1U) +#define SOC_ADC_PATT_LEN_MAX (8) /*!< Two pattern tables, each contains 4 items. Each item takes 1 byte */ +#define SOC_ADC_DIGI_MAX_BITWIDTH (12) +#define SOC_ADC_DIGI_MIN_BITWIDTH (12) +#define SOC_ADC_DIGI_IIR_FILTER_NUM (2) +#define SOC_ADC_DIGI_MONITOR_NUM (2) +#define SOC_ADC_DIGI_RESULT_BYTES (4) +#define SOC_ADC_DIGI_DATA_BYTES_PER_CONV (4) /*!< F_sample = F_digi_con / 2 / interval. F_digi_con = 5M for now. 30 <= interval <= 4095 */ -// #define SOC_ADC_SAMPLE_FREQ_THRES_HIGH 83333 -// #define SOC_ADC_SAMPLE_FREQ_THRES_LOW 611 +#define SOC_ADC_SAMPLE_FREQ_THRES_HIGH 83333 +#define SOC_ADC_SAMPLE_FREQ_THRES_LOW 611 /*!< RTC */ -// #define SOC_ADC_RTC_MIN_BITWIDTH (12) -// #define SOC_ADC_RTC_MAX_BITWIDTH (12) +#define SOC_ADC_RTC_MIN_BITWIDTH (12) +#define SOC_ADC_RTC_MAX_BITWIDTH (12) /*!< Calibration */ // #define SOC_ADC_CALIBRATION_V1_SUPPORTED (1) /*!< support HW offset calibration version 1*/ @@ -127,10 +127,10 @@ // #define SOC_ADC_CALIB_CHAN_COMPENS_SUPPORTED (1) /*!< support channel compensation to the HW offset calibration */ /*!< Interrupt */ -// #define SOC_ADC_TEMPERATURE_SHARE_INTR (1) +// #define SOC_ADC_TEMPERATURE_SHARE_INTR (1) // TODO: [ESP32C5] IDF-8727 /*!< ADC power control is shared by PWDET */ -// #define SOC_ADC_SHARED_POWER 1 +#define SOC_ADC_SHARED_POWER 1 // ESP32C5-TODO: Copy from esp32C5, need check /*-------------------------- APB BACKUP DMA CAPS -------------------------------*/ diff --git a/docs/docs_not_updated/esp32c5.txt b/docs/docs_not_updated/esp32c5.txt index 10d49479d1f..c01cdc9ce57 100644 --- a/docs/docs_not_updated/esp32c5.txt +++ b/docs/docs_not_updated/esp32c5.txt @@ -76,8 +76,6 @@ api-reference/storage/fatfsgen.rst api-reference/storage/index.rst api-reference/storage/nvs_partition_parse.rst api-reference/peripherals/sdspi_share.rst -api-reference/peripherals/adc_continuous.rst -api-reference/peripherals/adc_oneshot.rst api-reference/peripherals/usb_host.rst api-reference/peripherals/twai.rst api-reference/peripherals/usb_host/usb_host_notes_arch.rst diff --git a/docs/en/api-reference/peripherals/adc_continuous.rst b/docs/en/api-reference/peripherals/adc_continuous.rst index a22c733430b..0b8ff393993 100644 --- a/docs/en/api-reference/peripherals/adc_continuous.rst +++ b/docs/en/api-reference/peripherals/adc_continuous.rst @@ -3,7 +3,7 @@ Analog to Digital Converter (ADC) Continuous Mode Driver :link_to_translation:`zh_CN:[中文]` -{IDF_TARGET_ADC_NUM:default="two", esp32c2="one", esp32c6="one", esp32h2="one"} +{IDF_TARGET_ADC_NUM:default="two", esp32c2="one", esp32c6="one", esp32h2="one", esp32c5="one"} Introduction ------------ diff --git a/docs/en/api-reference/peripherals/adc_oneshot.rst b/docs/en/api-reference/peripherals/adc_oneshot.rst index bec0bee1862..0f07197216c 100644 --- a/docs/en/api-reference/peripherals/adc_oneshot.rst +++ b/docs/en/api-reference/peripherals/adc_oneshot.rst @@ -3,7 +3,7 @@ Analog to Digital Converter (ADC) Oneshot Mode Driver :link_to_translation:`zh_CN:[中文]` -{IDF_TARGET_ADC_NUM:default="two", esp32c2="one", esp32c6="one", esp32h2="one"} +{IDF_TARGET_ADC_NUM:default="two", esp32c2="one", esp32c6="one", esp32h2="one", esp32c5="one"} Introduction ------------ diff --git a/docs/zh_CN/api-reference/peripherals/adc_continuous.rst b/docs/zh_CN/api-reference/peripherals/adc_continuous.rst index 3e3ccdcc714..b9158a9cf37 100644 --- a/docs/zh_CN/api-reference/peripherals/adc_continuous.rst +++ b/docs/zh_CN/api-reference/peripherals/adc_continuous.rst @@ -3,7 +3,7 @@ :link_to_translation:`en:[English]` -{IDF_TARGET_ADC_NUM:default="两", esp32c2="一", esp32c6="一", esp32h2="一"} +{IDF_TARGET_ADC_NUM:default="两", esp32c2="一", esp32c6="一", esp32h2="一", esp32c5="一"} 简介 ------------ diff --git a/docs/zh_CN/api-reference/peripherals/adc_oneshot.rst b/docs/zh_CN/api-reference/peripherals/adc_oneshot.rst index 7c8687b480e..093adfde30e 100644 --- a/docs/zh_CN/api-reference/peripherals/adc_oneshot.rst +++ b/docs/zh_CN/api-reference/peripherals/adc_oneshot.rst @@ -3,7 +3,7 @@ :link_to_translation:`en:[English]` -{IDF_TARGET_ADC_NUM:default="两", esp32c2="一", esp32c6="一", esp32h2="一"} +{IDF_TARGET_ADC_NUM:default="两", esp32c2="一", esp32c6="一", esp32h2="一", esp32c5="一"} 简介 ---- diff --git a/examples/peripherals/adc/continuous_read/README.md b/examples/peripherals/adc/continuous_read/README.md index e02022f3c10..614dedffb6a 100644 --- a/examples/peripherals/adc/continuous_read/README.md +++ b/examples/peripherals/adc/continuous_read/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | # ADC DMA Example diff --git a/examples/peripherals/adc/continuous_read/pytest_adc_continuous.py b/examples/peripherals/adc/continuous_read/pytest_adc_continuous.py index 7c820be545e..c891db39e8b 100644 --- a/examples/peripherals/adc/continuous_read/pytest_adc_continuous.py +++ b/examples/peripherals/adc/continuous_read/pytest_adc_continuous.py @@ -1,6 +1,5 @@ # SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded.dut import Dut @@ -11,6 +10,7 @@ @pytest.mark.esp32c3 @pytest.mark.esp32c6 @pytest.mark.esp32h2 +@pytest.mark.esp32c5 @pytest.mark.adc def test_adc_continuous(dut: Dut) -> None: res = dut.expect(r'TASK: ret is 0, ret_num is (\d+) bytes') diff --git a/examples/peripherals/adc/oneshot_read/README.md b/examples/peripherals/adc/oneshot_read/README.md index 15404c47ee1..431ae899044 100644 --- a/examples/peripherals/adc/oneshot_read/README.md +++ b/examples/peripherals/adc/oneshot_read/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | # ADC Single Read Example diff --git a/examples/peripherals/adc/oneshot_read/pytest_adc_oneshot.py b/examples/peripherals/adc/oneshot_read/pytest_adc_oneshot.py index 8bb86e3c00b..4fb24a6d3c7 100644 --- a/examples/peripherals/adc/oneshot_read/pytest_adc_oneshot.py +++ b/examples/peripherals/adc/oneshot_read/pytest_adc_oneshot.py @@ -10,6 +10,7 @@ @pytest.mark.esp32c3 @pytest.mark.esp32c6 @pytest.mark.esp32h2 +@pytest.mark.esp32c5 @pytest.mark.adc def test_adc_oneshot(dut: Dut) -> None: dut.expect(r'EXAMPLE: ADC1 Channel\[(\d+)\] Raw Data: (\d+)', timeout=5) From 2f49a2e9c842dcdd582ce186755afa1cf3af6c38 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Sat, 13 Jul 2024 14:06:57 +0800 Subject: [PATCH 042/113] feat(adc): add ADC func clock enable function on C5,C6,H2 --- components/esp_hw_support/adc_share_hw_ctrl.c | 6 ++++++ components/hal/esp32c5/include/hal/adc_ll.h | 11 +++++++++++ components/hal/esp32c6/include/hal/adc_ll.h | 11 +++++++++++ components/hal/esp32h2/include/hal/adc_ll.h | 11 +++++++++++ 4 files changed, 39 insertions(+) diff --git a/components/esp_hw_support/adc_share_hw_ctrl.c b/components/esp_hw_support/adc_share_hw_ctrl.c index 32f3c67b79b..a9054d47a13 100644 --- a/components/esp_hw_support/adc_share_hw_ctrl.c +++ b/components/esp_hw_support/adc_share_hw_ctrl.c @@ -207,6 +207,9 @@ void adc_apb_periph_claim(void) if (s_adc_digi_ctrlr_cnt == 1) { ADC_BUS_CLK_ATOMIC() { adc_ll_enable_bus_clock(true); +#if SOC_RCC_IS_INDEPENDENT + adc_ll_enable_func_clock(true); +#endif adc_ll_reset_register(); } } @@ -221,6 +224,9 @@ void adc_apb_periph_free(void) if (s_adc_digi_ctrlr_cnt == 0) { ADC_BUS_CLK_ATOMIC() { adc_ll_enable_bus_clock(false); +#if SOC_RCC_IS_INDEPENDENT + adc_ll_enable_func_clock(false); +#endif } } else if (s_adc_digi_ctrlr_cnt < 0) { portEXIT_CRITICAL(&s_spinlock); diff --git a/components/hal/esp32c5/include/hal/adc_ll.h b/components/hal/esp32c5/include/hal/adc_ll.h index 616ea25e610..7c491440b42 100644 --- a/components/hal/esp32c5/include/hal/adc_ll.h +++ b/components/hal/esp32c5/include/hal/adc_ll.h @@ -566,6 +566,17 @@ static inline void adc_ll_enable_bus_clock(bool enable) PCR.saradc_conf.saradc_reg_clk_en = enable; } +#if SOC_RCC_IS_INDEPENDENT +/** + * @brief Enable the ADC function clock + * @param enable true to enable, false to disable + */ +static inline void adc_ll_enable_func_clock(bool enable) +{ + PCR.saradc_clkm_conf.saradc_clkm_en = enable; +} +#endif + /** * @brief Reset ADC module */ diff --git a/components/hal/esp32c6/include/hal/adc_ll.h b/components/hal/esp32c6/include/hal/adc_ll.h index db51a869daa..439f4c0514b 100644 --- a/components/hal/esp32c6/include/hal/adc_ll.h +++ b/components/hal/esp32c6/include/hal/adc_ll.h @@ -565,6 +565,17 @@ static inline void adc_ll_enable_bus_clock(bool enable) PCR.saradc_conf.saradc_reg_clk_en = enable; } +#if SOC_RCC_IS_INDEPENDENT +/** + * @brief Enable the ADC function clock + * @param enable true to enable, false to disable + */ +static inline void adc_ll_enable_func_clock(bool enable) +{ + PCR.saradc_clkm_conf.saradc_clkm_en = enable; +} +#endif + /** * @brief Reset ADC module */ diff --git a/components/hal/esp32h2/include/hal/adc_ll.h b/components/hal/esp32h2/include/hal/adc_ll.h index 8c02ddd191d..ab7f8fa58f6 100644 --- a/components/hal/esp32h2/include/hal/adc_ll.h +++ b/components/hal/esp32h2/include/hal/adc_ll.h @@ -566,6 +566,17 @@ static inline void adc_ll_enable_bus_clock(bool enable) PCR.saradc_conf.saradc_reg_clk_en = enable; } +#if SOC_RCC_IS_INDEPENDENT +/** + * @brief Enable the ADC function clock + * @param enable true to enable, false to disable + */ +static inline void adc_ll_enable_func_clock(bool enable) +{ + PCR.saradc_clkm_conf.saradc_clkm_en = enable; +} +#endif + /** * @brief Reset ADC module */ From 8c22cb6c6a2b0ac41bc04458b46ddb23b5eb6052 Mon Sep 17 00:00:00 2001 From: Armando Date: Wed, 10 Jul 2024 10:01:22 +0800 Subject: [PATCH 043/113] feat(psram): support bss on psram on p4 --- components/esp_psram/esp_psram.c | 9 ++++++++ .../include/esp_private/esp_psram_extram.h | 7 +++++- components/esp_system/ld/esp32p4/memory.ld.in | 9 ++++++++ .../esp_system/ld/esp32p4/sections.ld.in | 22 +++++++++++++++++++ components/esp_system/port/cpu_start.c | 7 +----- 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/components/esp_psram/esp_psram.c b/components/esp_psram/esp_psram.c index 23cd5f1b59f..debbf9de31b 100644 --- a/components/esp_psram/esp_psram.c +++ b/components/esp_psram/esp_psram.c @@ -11,6 +11,7 @@ * When we add more types of external RAM memory, this can be made into a more intelligent dispatcher. *----------------------------------------------------------------------------------------------------*/ #include +#include #include "sdkconfig.h" #include "esp_attr.h" #include "esp_err.h" @@ -521,3 +522,11 @@ bool esp_psram_extram_test(void) return true; } + +void esp_psram_bss_init(void) +{ +#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY + size_t size = (&_ext_ram_bss_end - &_ext_ram_bss_start) * sizeof(_ext_ram_bss_start); + memset(&_ext_ram_bss_start, 0, size); +#endif +} diff --git a/components/esp_psram/include/esp_private/esp_psram_extram.h b/components/esp_psram/include/esp_private/esp_psram_extram.h index 5cd7e52a153..0b44e1bfd87 100644 --- a/components/esp_psram/include/esp_private/esp_psram_extram.h +++ b/components/esp_psram/include/esp_private/esp_psram_extram.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -55,6 +55,11 @@ esp_err_t esp_psram_extram_reserve_dma_pool(size_t size); */ bool esp_psram_extram_test(void); +/** + * @brief Init .bss on psram + */ +void esp_psram_bss_init(void); + #if CONFIG_IDF_TARGET_ESP32 /** * @brief Force a writeback of the data in the PSRAM cache. This is to be called whenever diff --git a/components/esp_system/ld/esp32p4/memory.ld.in b/components/esp_system/ld/esp32p4/memory.ld.in index 8c76daee195..226803c2933 100644 --- a/components/esp_system/ld/esp32p4/memory.ld.in +++ b/components/esp_system/ld/esp32p4/memory.ld.in @@ -103,6 +103,9 @@ MEMORY This segment is placed at the beginning of LP RAM, as the end of LP RAM is occupied by LP ROM stack/data */ lp_reserved_seg(RW) : org = 0x50108000, len = RESERVE_RTC_MEM + + /* PSRAM seg */ + extern_ram_seg(RWX) : org = 0x48000000, len = IDROM_SEG_SIZE } /* Heap ends at top of dram0_0_seg */ @@ -135,6 +138,12 @@ REGION_ALIAS("rtc_reserved_seg", lp_reserved_seg ); REGION_ALIAS("rodata_seg_high", sram_high); #endif // CONFIG_APP_BUILD_USE_FLASH_SECTIONS +#if CONFIG_SPIRAM_XIP_FROM_PSRAM + REGION_ALIAS("ext_ram_seg", drom_seg); +#else + REGION_ALIAS("ext_ram_seg", extern_ram_seg); +#endif //#if CONFIG_SPIRAM_XIP_FROM_PSRAM + /** * If rodata default segment is placed in `drom_seg`, then flash's first rodata section must * also be first in the segment. diff --git a/components/esp_system/ld/esp32p4/sections.ld.in b/components/esp_system/ld/esp32p4/sections.ld.in index 38d844c4bd1..ef288b49a95 100644 --- a/components/esp_system/ld/esp32p4/sections.ld.in +++ b/components/esp_system/ld/esp32p4/sections.ld.in @@ -475,6 +475,28 @@ SECTIONS mapping[rodata_noload] } > rodata_seg_low +#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY +#if CONFIG_SPIRAM_XIP_FROM_PSRAM + /** + * This section is required to skip flash sections, because `extern_ram_seg` + * and `drom_seg` / `irom_seg` are on the same bus when xip on psram + */ + .ext_ram.dummy (NOLOAD): + { + . = ORIGIN(ext_ram_seg) + (_rodata_reserved_end - _flash_rodata_dummy_start); + . = ALIGN (0x10000); + } > ext_ram_seg +#endif //CONFIG_SPIRAM_XIP_FROM_PSRAM + + /* This section holds .ext_ram.bss data, and will be put in PSRAM */ + .ext_ram.bss (NOLOAD) : + { + _ext_ram_bss_start = ABSOLUTE(.); + mapping[extern_ram] + ALIGNED_SYMBOL(4, _ext_ram_bss_end) + } > ext_ram_seg +#endif //CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY + .dram0.bss (NOLOAD) : { ALIGNED_SYMBOL(4, _bss_start_low) diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index ca0c15209c7..649007cdfaa 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -148,11 +148,6 @@ extern int _mtvt_table; static const char *TAG = "cpu_start"; -#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY -extern int _ext_ram_bss_start; -extern int _ext_ram_bss_end; -#endif - #ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY extern int _iram_bss_start; extern int _iram_bss_end; @@ -683,7 +678,7 @@ void IRAM_ATTR call_start_cpu0(void) #endif // !CONFIG_APP_BUILD_TYPE_PURE_RAM_APP #if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY - memset(&_ext_ram_bss_start, 0, (&_ext_ram_bss_end - &_ext_ram_bss_start) * sizeof(_ext_ram_bss_start)); + esp_psram_bss_init(); #endif //Enable trace memory and immediately start trace. From b7b09bf57b5ea94354e0a42bc7b0325a7062f8b1 Mon Sep 17 00:00:00 2001 From: Armando Date: Wed, 10 Jul 2024 10:02:47 +0800 Subject: [PATCH 044/113] test(psram): enable bss psram test --- .../esp_common/test_apps/.build-test-rules.yml | 4 ++-- .../test_apps/esp_common/pytest_esp_common.py | 18 ++++++++++++++++-- .../esp_common/sdkconfig.xip_psram_esp32p4 | 6 ++++++ 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 components/esp_common/test_apps/esp_common/sdkconfig.xip_psram_esp32p4 diff --git a/components/esp_common/test_apps/.build-test-rules.yml b/components/esp_common/test_apps/.build-test-rules.yml index 2c33d11d12e..19d922b73cf 100644 --- a/components/esp_common/test_apps/.build-test-rules.yml +++ b/components/esp_common/test_apps/.build-test-rules.yml @@ -3,6 +3,6 @@ components/esp_common/test_apps/esp_common: disable: - if: CONFIG_NAME == "psram" and SOC_SPIRAM_SUPPORTED != 1 - - if: CONFIG_NAME == "psram" and IDF_TARGET in ["esp32p4", "esp32c5"] + - if: CONFIG_NAME == "psram" and IDF_TARGET in ["esp32c5"] temporary: true - reason: esp32p4/c5 is not supported yet # TODO: IDF-7557 + reason: esp32c5 is not supported yet # TODO: IDF-8689 diff --git a/components/esp_common/test_apps/esp_common/pytest_esp_common.py b/components/esp_common/test_apps/esp_common/pytest_esp_common.py index 983220995f6..1a31480cc2f 100644 --- a/components/esp_common/test_apps/esp_common/pytest_esp_common.py +++ b/components/esp_common/test_apps/esp_common/pytest_esp_common.py @@ -1,6 +1,5 @@ -# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @@ -51,6 +50,7 @@ def run_multiple_stages(dut: Dut, test_case_num: int, stages: int) -> None: @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32s3 +@pytest.mark.esp32p4 @pytest.mark.generic @pytest.mark.parametrize( 'config', @@ -89,3 +89,17 @@ def test_esp_attr_xip_psram_esp32s2(dut: Dut) -> None: ) def test_esp_attr_xip_psram_esp32s3(dut: Dut) -> None: dut.run_all_single_board_cases() + + +# psram attr tests with xip_psram +@pytest.mark.esp32p4 +@pytest.mark.generic +@pytest.mark.parametrize( + 'config', + [ + 'xip_psram_esp32p4' + ], + indirect=True, +) +def test_esp_attr_xip_psram_esp32p4(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/components/esp_common/test_apps/esp_common/sdkconfig.xip_psram_esp32p4 b/components/esp_common/test_apps/esp_common/sdkconfig.xip_psram_esp32p4 new file mode 100644 index 00000000000..706f080ca94 --- /dev/null +++ b/components/esp_common/test_apps/esp_common/sdkconfig.xip_psram_esp32p4 @@ -0,0 +1,6 @@ +# For XiP PSRAM EXT_RAM_BSS_ATTR + +CONFIG_IDF_TARGET="esp32p4" +CONFIG_SPIRAM=y +CONFIG_SPIRAM_XIP_FROM_PSRAM=y +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y From 3dc80527ab3dc0d7cc0960cb197cf06ae9634754 Mon Sep 17 00:00:00 2001 From: Mahavir Jain Date: Fri, 12 Jul 2024 11:50:17 +0530 Subject: [PATCH 045/113] feat: add compiler config for not merging const sections Probably GCC-13.x and on-wards uses "-fmerge-constants" to merge the const section (string/floating-point) across compilation units. This makes it difficult to properly analyze the size output of rodata section across libraries, the merged section (big in size) is showed across a single library. The config option added here can help to disable this compiler behavior and help to provide better size analysis. It can be used during development phase only as it increases rodata section size. --- CMakeLists.txt | 4 ++++ Kconfig | 9 +++++++++ docs/en/api-guides/tools/idf-size.rst | 2 +- .../system/build_test/sdkconfig.ci.no_merge_constants | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 tools/test_apps/system/build_test/sdkconfig.ci.no_merge_constants diff --git a/CMakeLists.txt b/CMakeLists.txt index b381db84844..6cedae7de38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,6 +136,10 @@ if(CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE) list(APPEND compile_definitions "-DNDEBUG") endif() +if(CONFIG_COMPILER_NO_MERGE_CONSTANTS) + list(APPEND compile_options "-fno-merge-constants") +endif() + if(CONFIG_COMPILER_STACK_CHECK_MODE_NORM) list(APPEND compile_options "-fstack-protector") elseif(CONFIG_COMPILER_STACK_CHECK_MODE_STRONG) diff --git a/Kconfig b/Kconfig index b5c529cbebb..244a1f9e5ec 100644 --- a/Kconfig +++ b/Kconfig @@ -514,6 +514,15 @@ mainmenu "Espressif IoT Development Framework Configuration" help Stack smashing protection. + config COMPILER_NO_MERGE_CONSTANTS + bool "Disable merging const sections" + depends on IDF_TOOLCHAIN_GCC + help + Disable merging identical constants (string/floating-point) across compilation units. + This helps in better size analysis of the application binary as the rodata section + distribution is more uniform across libraries. On downside, it may increase + the binary size and hence should be used during development phase only. + config COMPILER_WARN_WRITE_STRINGS bool "Enable -Wwrite-strings warning flag" default "n" diff --git a/docs/en/api-guides/tools/idf-size.rst b/docs/en/api-guides/tools/idf-size.rst index d456f5392e0..0d5741621f1 100644 --- a/docs/en/api-guides/tools/idf-size.rst +++ b/docs/en/api-guides/tools/idf-size.rst @@ -136,7 +136,7 @@ The table is sorted in descending order of the total contribution of the static .. note:: - The size of the ``.rodata`` section in the ``Flash Data`` memory type may appear very large for a single archive. This occurs due to linker relaxations. The linker may attempt to combine object file sections with ``MERGE`` and ``STRINGS`` flags from all archives into one to perform tail string optimization. Consequently, one archive may end up with a very large ``.rodata`` section, containing string literals from other archives. This is evident in the ``.rodata`` section of the ``libesp_app_format.a`` archive. + The size of the ``.rodata`` section in the ``Flash Data`` memory type may appear very large for a single archive. This occurs due to linker relaxations. The linker may attempt to combine object file sections with ``MERGE`` and ``STRINGS`` flags from all archives into one to perform tail string optimization. Consequently, one archive may end up with a very large ``.rodata`` section, containing string literals from other archives. This is evident in the ``.rodata`` section of the ``libesp_app_format.a`` archive. The specific compiler behavior here can be turned off by enabling :ref:`CONFIG_COMPILER_NO_MERGE_CONSTANTS` option (only for GCC toolchain), please read help for more details. Source File Usage Summary ``idf.py size-files`` diff --git a/tools/test_apps/system/build_test/sdkconfig.ci.no_merge_constants b/tools/test_apps/system/build_test/sdkconfig.ci.no_merge_constants new file mode 100644 index 00000000000..d30e4da72b6 --- /dev/null +++ b/tools/test_apps/system/build_test/sdkconfig.ci.no_merge_constants @@ -0,0 +1 @@ +CONFIG_COMPILER_NO_MERGE_CONSTANTS=y From 9d2b2d4d912e2a57989c088bfb36051dffd2f3f8 Mon Sep 17 00:00:00 2001 From: linruihao Date: Fri, 12 Jul 2024 15:00:09 +0800 Subject: [PATCH 046/113] fix(coex): Fixed coexist scheme phase index overflow issue --- components/esp_coex/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_coex/lib b/components/esp_coex/lib index 56d324c3fe3..d99dfd1883a 160000 --- a/components/esp_coex/lib +++ b/components/esp_coex/lib @@ -1 +1 @@ -Subproject commit 56d324c3fe3fb7649f8736bbb3b9f00b7f612449 +Subproject commit d99dfd1883a1468b8986362a1382a4f46e918b60 From 0ff10095980ee26abf07bc3e53af968f3211e7ca Mon Sep 17 00:00:00 2001 From: Jakub Kocka Date: Mon, 8 Jul 2024 14:20:35 +0200 Subject: [PATCH 047/113] docs(tools): Changed USB Drivers (Windows Only) section of DFU New driver was created for ESP32-S2, so there is no need to manually install it using tools --- docs/en/api-guides/dfu.rst | 17 ++++++++++++++--- docs/zh_CN/api-guides/dfu.rst | 19 +++++++++++++++---- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/docs/en/api-guides/dfu.rst b/docs/en/api-guides/dfu.rst index 4e5a293fc92..2ad2befb48f 100644 --- a/docs/en/api-guides/dfu.rst +++ b/docs/en/api-guides/dfu.rst @@ -116,11 +116,22 @@ Restart your computer so the previous setting could take into affect or run ``su USB Drivers (Windows Only) -------------------------- -``dfu-util`` uses `libusb` to access the device. You have to register on Windows the device with the `WinUSB` driver. +``dfu-util`` uses `libusb` to access the device. On Windows, the `WinUSB` driver is the recommended driver which has to be installed for the device to work properly. For more details please see the `libusb wiki `_. -Please see the `libusb wiki `_ for more details. +.. only:: esp32s2 -The drivers can be installed by the `Zadig tool `_. Please make sure that the device is in download mode before you run the tool and that it detects the {IDF_TARGET_NAME} device before you install the drivers. The Zadig tool might detect several USB interfaces of {IDF_TARGET_NAME}. Please install the WinUSB driver only for the interface where there is no driver installed (probably it is Interface 2) and do not re-install the driver for the other interface. + The development board driver can be downloaded from https://github.com/espressif/esp-win-usb-drivers/releases. The files need to be extracted and `installed `_. This should change or install the WinUSB driver for the right interface of the device. + +.. note:: + + If the feature is not working please proceed with the manual driver assignment. Otherwise, the following section can be skipped. + +USB Drivers (Windows Only) - manual driver assignment +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Manual driver assignment can be performed with the `Zadig tool `_. Please make sure that the device is in download mode before running the tool and that the {IDF_TARGET_NAME} device is detected before the driver installation. + +The Zadig tool might detect several USB interfaces of {IDF_TARGET_NAME}. Please install the `WinUSB` driver **only** for the interface where there is no driver installed (probably it is Interface 2) and do not re-install the driver for the other interface. .. warning:: diff --git a/docs/zh_CN/api-guides/dfu.rst b/docs/zh_CN/api-guides/dfu.rst index c38ecb2abbd..cc0f476ef55 100644 --- a/docs/zh_CN/api-guides/dfu.rst +++ b/docs/zh_CN/api-guides/dfu.rst @@ -114,13 +114,24 @@ Udev 是 Linux 内核的设备管理器,允许用户在没有 ``sudo`` 的情 .. _api_guide_dfu_flash_win: USB 驱动(仅限 Windows) -------------------------------- +------------------------ -``dfu-util`` 使用 `libusb` 来访问设备。你需要在 Windows 上使用 `WinUSB` 驱动程序注册设备。 +``dfu-util`` 使用 `libusb` 访问设备。在 Windows 上,必须先安装 `WinUSB` 驱动程序才能使设备正常工作。详情请参阅 `libusb wiki `_。 -更多详细信息,请参考 `libusb wiki `_。 +.. only:: esp32s2 -可以通过 `Zadig 工具 `_ 安装驱动程序。请确保在运行该工具之前设备处于下载模式,并确保在安装驱动程序之前检测到 {IDF_TARGET_NAME} 设备。Zadig 工具可能会检测到 {IDF_TARGET_NAME} 的多个 USB 接口。请只为没有安装驱动的接口(可能是接口 2)安装 WinUSB 驱动,不要重新安装其他接口驱动。 + 开发板驱动程序可以从 https://github.com/espressif/esp-win-usb-drivers/releases 下载。文件需要解压并 `安装 `_。进行以上操作,可以为正确的设备接口更改或安装 WinUSB 驱动程序。 + +.. note:: + + 如果该功能无法正常运作,请手动分配驱动程序;若设备正常工作,请跳过以下章节。 + +USB 驱动(仅限 Windows)- 手动分配驱动程序 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +可以使用 `Zadig 工具 `_ 手动分配驱动程序。在运行工具前,请确保设备处于下载模式,且在安装驱动程序之前已检测到 {IDF_TARGET_NAME} 设备。 + +Zadig 工具可能会检测到 {IDF_TARGET_NAME} 的多个 USB 接口。请 **仅为** 没有安装驱动程序的接口(可能是接口 2)安装 `WinUSB` 驱动程序,不要重新安装其他接口的驱动程序。 .. warning:: From b82e26593e98b0b7aca4d7a2aaba4b23b485b01c Mon Sep 17 00:00:00 2001 From: Sachin Billore Date: Sat, 1 Jun 2024 12:33:40 +0530 Subject: [PATCH 048/113] fix(apm): minor fixes for apm api --- components/hal/esp32c5/include/hal/apm_ll.h | 70 +++++------ components/hal/esp32c6/include/hal/apm_ll.h | 129 +++++++------------- components/hal/esp32h2/include/hal/apm_ll.h | 101 +++++---------- components/hal/include/hal/apm_hal.h | 8 +- 4 files changed, 116 insertions(+), 192 deletions(-) diff --git a/components/hal/esp32c5/include/hal/apm_ll.h b/components/hal/esp32c5/include/hal/apm_ll.h index fdde15988d1..d735bb922ad 100644 --- a/components/hal/esp32c5/include/hal/apm_ll.h +++ b/components/hal/esp32c5/include/hal/apm_ll.h @@ -36,73 +36,73 @@ extern "C" { #define APM_LL_MASTER_MAX 32 #define LP_APM0_MAX_ACCESS_PATH 0x1 -#define HP_APM_MAX_ACCESS_PATH 0x4 +#define HP_APM_MAX_ACCESS_PATH 0x5 #define LP_APM_MAX_ACCESS_PATH 0x2 #define APM_CTRL_REGION_FILTER_EN_REG(apm_ctrl) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION_FILTER_EN_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION_FILTER_EN_REG) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION_FILTER_EN_REG) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION_FILTER_EN_REG) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION_FILTER_EN_REG) : \ + (LP_APM_REGION_FILTER_EN_REG)); \ }) #define TEE_LL_MODE_CTRL_REG(master_id) (TEE_M0_MODE_CTRL_REG + 4 * (master_id)) #define APM_LL_REGION_ADDR_START_REG(apm_ctrl, regn_num) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ + (LP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num))); \ }) #define APM_LL_REGION_ADDR_END_REG(apm_ctrl, regn_num) \ ({\ (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ADDR_END_REG + 0xC * (regn_num)) : \ ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)) : 0)); \ + (LP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num))); \ }) #define APM_LL_REGION_ADDR_ATTR_REG(apm_ctrl, regn_num) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ATTR_REG + 0xC * (regn_num)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ATTR_REG + 0xC * (regn_num)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ATTR_REG + 0xC * (regn_num)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ATTR_REG + 0xC * (regn_num)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ATTR_REG + 0xC * (regn_num)) : \ + (LP_APM_REGION0_ATTR_REG + 0xC * (regn_num))); \ }) #define APM_LL_APM_CTRL_EXCP_STATUS_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path))); \ }) #define APM_CTRL_M_REGION_STATUS_CLR (BIT(0)) #define APM_LL_APM_CTRL_EXCP_CLR_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path))); \ }) #define APM_LL_TEE_EXCP_INFO0_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path))); \ }) #define APM_LL_APM_CTRL_EXCP_STATUS_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path))); \ }) #define APM_LL_TEE_EXCP_INFO1_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path))); \ }) #define APM_LL_SEC_MODE_REGION_ATTR(sec_mode, regn_pms) ((regn_pms) << (4 * (sec_mode - 1))) @@ -111,24 +111,24 @@ extern "C" { #define APM_LL_APM_CTRL_INT_EN_REG(apm_ctrl) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_INT_EN_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_INT_EN_REG) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_INT_EN_REG) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_INT_EN_REG) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_INT_EN_REG) : \ + (LP_APM_INT_EN_REG)); \ }) #define APM_CTRL_CLK_EN (BIT(0)) #define APM_LL_APM_CTRL_CLOCK_GATE_REG(apm_ctrl) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_CLOCK_GATE_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_CLOCK_GATE_REG) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_CLOCK_GATE_REG) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_CLOCK_GATE_REG) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_CLOCK_GATE_REG) : \ + (LP_APM_CLOCK_GATE_REG)); \ }) #define APM_LL_APM_CTRL_FUNC_CTRL_REG(apm_ctrl) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_FUNC_CTRL_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_FUNC_CTRL_REG) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_FUNC_CTRL_REG) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_FUNC_CTRL_REG) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_FUNC_CTRL_REG) : \ + (LP_APM_FUNC_CTRL_REG)); \ }) /** diff --git a/components/hal/esp32c6/include/hal/apm_ll.h b/components/hal/esp32c6/include/hal/apm_ll.h index fc7b3fa4ce5..0288568707c 100644 --- a/components/hal/esp32c6/include/hal/apm_ll.h +++ b/components/hal/esp32c6/include/hal/apm_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -15,7 +15,6 @@ #include "soc/hp_apm_reg.h" #include "soc/lp_apm_reg.h" #include "soc/interrupts.h" -#include "hal/assert.h" #ifdef __cplusplus extern "C" { @@ -41,68 +40,68 @@ extern "C" { #define APM_CTRL_REGION_FILTER_EN_REG(apm_ctrl) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION_FILTER_EN_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION_FILTER_EN_REG) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION_FILTER_EN_REG) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION_FILTER_EN_REG) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION_FILTER_EN_REG) : \ + (LP_APM_REGION_FILTER_EN_REG)); \ }) #define TEE_LL_MODE_CTRL_REG(master_id) (TEE_M0_MODE_CTRL_REG + 4 * (master_id)) #define APM_LL_REGION_ADDR_START_REG(apm_ctrl, regn_num) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ + (LP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num))); \ }) #define APM_LL_REGION_ADDR_END_REG(apm_ctrl, regn_num) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ADDR_END_REG + 0xC * (regn_num)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_ADDR_END_REG + 0xC * (regn_num)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)) : \ + (LP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num))); \ }) #define APM_LL_REGION_ADDR_ATTR_REG(apm_ctrl, regn_num) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_PMS_ATTR_REG + 0xC * (regn_num)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_PMS_ATTR_REG + 0xC * (regn_num)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_PMS_ATTR_REG + 0xC * (regn_num)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_REGION0_PMS_ATTR_REG + 0xC * (regn_num)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_PMS_ATTR_REG + 0xC * (regn_num)) : \ + (LP_APM_REGION0_PMS_ATTR_REG + 0xC * (regn_num))); \ }) #define APM_LL_APM_CTRL_EXCP_STATUS_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path))); \ }) #define APM_CTRL_M_REGION_STATUS_CLR (BIT(0)) #define APM_LL_APM_CTRL_EXCP_CLR_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path))); \ }) #define APM_LL_TEE_EXCP_INFO0_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path))); \ }) #define APM_LL_APM_CTRL_EXCP_STATUS_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path))); \ }) #define APM_LL_TEE_EXCP_INFO1_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ + (LP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path))); \ }) #define APM_LL_SEC_MODE_REGION_ATTR(sec_mode, regn_pms) ((regn_pms) << (4 * (sec_mode - 1))) @@ -111,24 +110,24 @@ extern "C" { #define APM_LL_APM_CTRL_INT_EN_REG(apm_ctrl) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_INT_EN_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_INT_EN_REG) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_INT_EN_REG) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_INT_EN_REG) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_INT_EN_REG) : \ + (LP_APM_INT_EN_REG)); \ }) #define APM_CTRL_CLK_EN (BIT(0)) #define APM_LL_APM_CTRL_CLOCK_GATE_REG(apm_ctrl) \ ({\ - (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_CLOCK_GATE_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_CLOCK_GATE_REG) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_CLOCK_GATE_REG) : 0)); \ + (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_CLOCK_GATE_REG) : \ + ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_CLOCK_GATE_REG) : \ + (LP_APM_CLOCK_GATE_REG)); \ }) #define APM_LL_APM_CTRL_FUNC_CTRL_REG(apm_ctrl) \ ({\ (LP_APM0_CTRL == apm_ctrl) ? (LP_APM0_FUNC_CTRL_REG) : \ ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_FUNC_CTRL_REG) : \ - ((LP_APM_CTRL == apm_ctrl) ? (LP_APM_FUNC_CTRL_REG) : 0)); \ + (LP_APM_FUNC_CTRL_REG)); \ }) /** @@ -259,11 +258,6 @@ static inline void apm_ll_apm_ctrl_region_filter_enable(apm_ll_apm_ctrl_t apm_ct static inline void apm_ll_apm_ctrl_filter_enable(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path, bool enable) { - HAL_ASSERT(((apm_ctrl == LP_APM0_CTRL) && (apm_m_path < LP_APM0_MAX_ACCESS_PATH)) || - ((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - if (enable) { REG_SET_BIT(APM_LL_APM_CTRL_FUNC_CTRL_REG(apm_ctrl), BIT(apm_m_path)); } else { @@ -281,10 +275,6 @@ static inline void apm_ll_apm_ctrl_filter_enable(apm_ll_apm_ctrl_t apm_ctrl, static inline void apm_ll_apm_ctrl_set_region_start_address(apm_ll_apm_ctrl_t apm_ctrl, uint32_t regn_num, uint32_t addr) { - HAL_ASSERT((((apm_ctrl == LP_APM0_CTRL) || (apm_ctrl == LP_APM_CTRL)) && (regn_num <= APM_LL_LP_MAX_REGION_NUM)) || - ((apm_ctrl == HP_APM_CTRL) && (regn_num <= APM_LL_HP_MAX_REGION_NUM)) - ); - REG_WRITE(APM_LL_REGION_ADDR_START_REG(apm_ctrl, regn_num), addr); } @@ -298,10 +288,6 @@ static inline void apm_ll_apm_ctrl_set_region_start_address(apm_ll_apm_ctrl_t ap static inline void apm_ll_apm_ctrl_set_region_end_address(apm_ll_apm_ctrl_t apm_ctrl, uint32_t regn_num, uint32_t addr) { - HAL_ASSERT((((apm_ctrl == LP_APM0_CTRL) || (apm_ctrl == LP_APM_CTRL)) && (regn_num <= APM_LL_LP_MAX_REGION_NUM)) || - ((apm_ctrl == HP_APM_CTRL) && (regn_num <= APM_LL_HP_MAX_REGION_NUM)) - ); - REG_WRITE(APM_LL_REGION_ADDR_END_REG(apm_ctrl, regn_num), addr); } @@ -316,10 +302,6 @@ static inline void apm_ll_apm_ctrl_set_region_end_address(apm_ll_apm_ctrl_t apm_ static inline void apm_ll_apm_ctrl_sec_mode_region_attr_config(apm_ll_apm_ctrl_t apm_ctrl, uint32_t regn_num, apm_ll_secure_mode_t sec_mode, uint32_t regn_pms) { - HAL_ASSERT((((apm_ctrl == LP_APM0_CTRL) || (apm_ctrl == LP_APM_CTRL)) && (regn_num <= APM_LL_LP_MAX_REGION_NUM)) || - ((apm_ctrl == HP_APM_CTRL) && (regn_num <= APM_LL_HP_MAX_REGION_NUM)) - ); - uint32_t val = 0; val = REG_READ(APM_LL_REGION_ADDR_ATTR_REG(apm_ctrl, regn_num)); val &= ~APM_LL_SEC_MODE_REGION_ATTR_M(sec_mode); @@ -336,11 +318,6 @@ static inline void apm_ll_apm_ctrl_sec_mode_region_attr_config(apm_ll_apm_ctrl_t static inline uint8_t apm_ll_apm_ctrl_exception_status(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path) { - HAL_ASSERT(((apm_ctrl == LP_APM0_CTRL) && (apm_m_path < LP_APM0_MAX_ACCESS_PATH)) || - ((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - return REG_READ(APM_LL_APM_CTRL_EXCP_STATUS_REG(apm_ctrl, apm_m_path)); } @@ -353,11 +330,6 @@ static inline uint8_t apm_ll_apm_ctrl_exception_status(apm_ll_apm_ctrl_t apm_ctr static inline void apm_ll_apm_ctrl_exception_clear(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path) { - HAL_ASSERT(((apm_ctrl == LP_APM0_CTRL) && (apm_m_path < LP_APM0_MAX_ACCESS_PATH)) || - ((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - REG_SET_BIT(APM_LL_APM_CTRL_EXCP_CLR_REG(apm_ctrl, apm_m_path), APM_CTRL_M_REGION_STATUS_CLR); } @@ -370,11 +342,6 @@ static inline void apm_ll_apm_ctrl_exception_clear(apm_ll_apm_ctrl_t apm_ctrl, */ static inline void apm_ll_apm_ctrl_get_exception_info(apm_ctrl_exception_info_t *excp_info) { - HAL_ASSERT(((excp_info->apm_path.apm_ctrl == LP_APM0_CTRL) && (excp_info->apm_path.apm_m_path < LP_APM0_MAX_ACCESS_PATH)) || - ((excp_info->apm_path.apm_ctrl == HP_APM_CTRL) && (excp_info->apm_path.apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((excp_info->apm_path.apm_ctrl == LP_APM_CTRL) && (excp_info->apm_path.apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - excp_info->excp_id = REG_GET_FIELD(APM_LL_TEE_EXCP_INFO0_REG(excp_info->apm_path.apm_ctrl, excp_info->apm_path.apm_m_path), APM_LL_CTRL_EXCEPTION_ID); excp_info->excp_mode = REG_GET_FIELD(APM_LL_TEE_EXCP_INFO0_REG(excp_info->apm_path.apm_ctrl, excp_info->apm_path.apm_m_path), @@ -395,11 +362,6 @@ static inline void apm_ll_apm_ctrl_get_exception_info(apm_ctrl_exception_info_t static inline void apm_ll_apm_ctrl_interrupt_enable(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path, bool enable) { - HAL_ASSERT(((apm_ctrl == LP_APM0_CTRL) && (apm_m_path < LP_APM0_MAX_ACCESS_PATH)) || - ((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - if (enable) { REG_SET_BIT(APM_LL_APM_CTRL_INT_EN_REG(apm_ctrl), BIT(apm_m_path)); } else { @@ -442,25 +404,20 @@ static inline void apm_ll_apm_ctrl_reset_event_enable(bool enable) } /** - * @brief Return APM Ctrl interrupt source number. + * @brief Fetch the APM Ctrl interrupt source number. * * @param apm_ctrl APM Ctrl (LP_APM0/HP_APM/LP_APM) * @param apm_m_path APM Ctrl access patch(M[0:n]) */ -static inline esp_err_t apm_ll_apm_ctrl_get_int_src_num(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path) +static inline int apm_ll_apm_ctrl_get_int_src_num(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path) { - HAL_ASSERT(((apm_ctrl == LP_APM0_CTRL) && (apm_m_path < LP_APM0_MAX_ACCESS_PATH)) || - ((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - switch (apm_ctrl) { - case LP_APM0_CTRL : - return (ETS_LP_APM0_INTR_SOURCE); - case HP_APM_CTRL : - return (ETS_HP_APM_M0_INTR_SOURCE + apm_m_path); - case LP_APM_CTRL : - return (ETS_LP_APM_M0_INTR_SOURCE + apm_m_path); + case LP_APM0_CTRL : + return (ETS_LP_APM0_INTR_SOURCE); + case HP_APM_CTRL : + return (ETS_HP_APM_M0_INTR_SOURCE + apm_m_path); + case LP_APM_CTRL : + return (ETS_LP_APM_M0_INTR_SOURCE + apm_m_path); } return -1; diff --git a/components/hal/esp32h2/include/hal/apm_ll.h b/components/hal/esp32h2/include/hal/apm_ll.h index b95effad697..cc0046ce274 100644 --- a/components/hal/esp32h2/include/hal/apm_ll.h +++ b/components/hal/esp32h2/include/hal/apm_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -14,7 +14,6 @@ #include "soc/hp_apm_reg.h" #include "soc/lp_apm_reg.h" #include "soc/interrupts.h" -#include "hal/assert.h" #ifdef __cplusplus extern "C" { @@ -39,59 +38,59 @@ extern "C" { #define APM_CTRL_REGION_FILTER_EN_REG(apm_ctrl) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION_FILTER_EN_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION_FILTER_EN_REG) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION_FILTER_EN_REG) : \ + (HP_APM_REGION_FILTER_EN_REG); \ }) #define TEE_LL_MODE_CTRL_REG(master_id) (TEE_M0_MODE_CTRL_REG + 4 * (master_id)) #define APM_LL_REGION_ADDR_START_REG(apm_ctrl, regn_num) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)) : \ + (HP_APM_REGION0_ADDR_START_REG + 0xC * (regn_num)); \ }) #define APM_LL_REGION_ADDR_END_REG(apm_ctrl, regn_num) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)) : \ + (HP_APM_REGION0_ADDR_END_REG + 0xC * (regn_num)); \ }) #define APM_LL_REGION_ADDR_ATTR_REG(apm_ctrl, regn_num) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_PMS_ATTR_REG + 0xC * (regn_num)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_REGION0_PMS_ATTR_REG + 0xC * (regn_num)) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_REGION0_PMS_ATTR_REG + 0xC * (regn_num)) : \ + (HP_APM_REGION0_PMS_ATTR_REG + 0xC * (regn_num)); \ }) #define APM_LL_APM_CTRL_EXCP_STATUS_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)); \ }) #define APM_CTRL_M_REGION_STATUS_CLR (BIT(0)) #define APM_LL_APM_CTRL_EXCP_CLR_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)) : \ + (HP_APM_M0_STATUS_CLR_REG + 0x10 * (apm_m_path)); \ }) #define APM_LL_TEE_EXCP_INFO0_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)) : \ + (HP_APM_M0_EXCEPTION_INFO0_REG + 0x10 * (apm_m_path)); \ }) #define APM_LL_APM_CTRL_EXCP_STATUS_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)) : \ + (HP_APM_M0_STATUS_REG + 0x10 * (apm_m_path)); \ }) #define APM_LL_TEE_EXCP_INFO1_REG(apm_ctrl, apm_m_path) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)) : \ + (HP_APM_M0_EXCEPTION_INFO1_REG + 0x10 * (apm_m_path)); \ }) #define APM_LL_SEC_MODE_REGION_ATTR(sec_mode, regn_pms) ((regn_pms) << (4 * (sec_mode - 1))) @@ -100,21 +99,21 @@ extern "C" { #define APM_LL_APM_CTRL_INT_EN_REG(apm_ctrl) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_INT_EN_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_INT_EN_REG) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_INT_EN_REG) : \ + (HP_APM_INT_EN_REG); \ }) #define APM_CTRL_CLK_EN (BIT(0)) #define APM_LL_APM_CTRL_CLOCK_GATE_REG(apm_ctrl) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_CLOCK_GATE_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_CLOCK_GATE_REG) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_CLOCK_GATE_REG) : \ + (HP_APM_CLOCK_GATE_REG); \ }) #define APM_LL_APM_CTRL_FUNC_CTRL_REG(apm_ctrl) \ ({\ - (LP_APM_CTRL == apm_ctrl) ? (LP_APM_FUNC_CTRL_REG) : \ - ((HP_APM_CTRL == apm_ctrl) ? (HP_APM_FUNC_CTRL_REG) : 0); \ + (LP_APM_CTRL == apm_ctrl) ? (LP_APM_FUNC_CTRL_REG) : \ + (HP_APM_FUNC_CTRL_REG); \ }) /** @@ -242,10 +241,6 @@ static inline void apm_ll_apm_ctrl_region_filter_enable(apm_ll_apm_ctrl_t apm_ct static inline void apm_ll_apm_ctrl_filter_enable(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path, bool enable) { - HAL_ASSERT(((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - if (enable) { REG_SET_BIT(APM_LL_APM_CTRL_FUNC_CTRL_REG(apm_ctrl), BIT(apm_m_path)); } else { @@ -263,10 +258,6 @@ static inline void apm_ll_apm_ctrl_filter_enable(apm_ll_apm_ctrl_t apm_ctrl, static inline void apm_ll_apm_ctrl_set_region_start_address(apm_ll_apm_ctrl_t apm_ctrl, uint32_t regn_num, uint32_t addr) { - HAL_ASSERT(((apm_ctrl == LP_APM_CTRL) && (regn_num <= APM_LL_LP_MAX_REGION_NUM)) || - ((apm_ctrl == HP_APM_CTRL) && (regn_num <= APM_LL_HP_MAX_REGION_NUM)) - ); - REG_WRITE(APM_LL_REGION_ADDR_START_REG(apm_ctrl, regn_num), addr); } @@ -280,10 +271,6 @@ static inline void apm_ll_apm_ctrl_set_region_start_address(apm_ll_apm_ctrl_t ap static inline void apm_ll_apm_ctrl_set_region_end_address(apm_ll_apm_ctrl_t apm_ctrl, uint32_t regn_num, uint32_t addr) { - HAL_ASSERT(((apm_ctrl == LP_APM_CTRL) && (regn_num <= APM_LL_LP_MAX_REGION_NUM)) || - ((apm_ctrl == HP_APM_CTRL) && (regn_num <= APM_LL_HP_MAX_REGION_NUM)) - ); - REG_WRITE(APM_LL_REGION_ADDR_END_REG(apm_ctrl, regn_num), addr); } @@ -298,10 +285,6 @@ static inline void apm_ll_apm_ctrl_set_region_end_address(apm_ll_apm_ctrl_t apm_ static inline void apm_ll_apm_ctrl_sec_mode_region_attr_config(apm_ll_apm_ctrl_t apm_ctrl, uint32_t regn_num, apm_ll_secure_mode_t sec_mode, uint32_t regn_pms) { - HAL_ASSERT(((apm_ctrl == LP_APM_CTRL) && (regn_num <= APM_LL_LP_MAX_REGION_NUM)) || - ((apm_ctrl == HP_APM_CTRL) && (regn_num <= APM_LL_HP_MAX_REGION_NUM)) - ); - uint32_t val = 0; val = REG_READ(APM_LL_REGION_ADDR_ATTR_REG(apm_ctrl, regn_num)); val &= ~APM_LL_SEC_MODE_REGION_ATTR_M(sec_mode); @@ -318,10 +301,6 @@ static inline void apm_ll_apm_ctrl_sec_mode_region_attr_config(apm_ll_apm_ctrl_t static inline uint8_t apm_ll_apm_ctrl_exception_status(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path) { - HAL_ASSERT(((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - return REG_READ(APM_LL_APM_CTRL_EXCP_STATUS_REG(apm_ctrl, apm_m_path)); } @@ -334,10 +313,6 @@ static inline uint8_t apm_ll_apm_ctrl_exception_status(apm_ll_apm_ctrl_t apm_ctr static inline void apm_ll_apm_ctrl_exception_clear(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path) { - HAL_ASSERT(((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - REG_SET_BIT(APM_LL_APM_CTRL_EXCP_CLR_REG(apm_ctrl, apm_m_path), APM_CTRL_M_REGION_STATUS_CLR); } @@ -350,10 +325,6 @@ static inline void apm_ll_apm_ctrl_exception_clear(apm_ll_apm_ctrl_t apm_ctrl, */ static inline void apm_ll_apm_ctrl_get_exception_info(apm_ctrl_exception_info_t *excp_info) { - HAL_ASSERT(((excp_info->apm_path.apm_ctrl == HP_APM_CTRL) && (excp_info->apm_path.apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((excp_info->apm_path.apm_ctrl == LP_APM_CTRL) && (excp_info->apm_path.apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - excp_info->excp_id = REG_GET_FIELD(APM_LL_TEE_EXCP_INFO0_REG(excp_info->apm_path.apm_ctrl, excp_info->apm_path.apm_m_path), APM_LL_CTRL_EXCEPTION_ID); excp_info->excp_mode = REG_GET_FIELD(APM_LL_TEE_EXCP_INFO0_REG(excp_info->apm_path.apm_ctrl, excp_info->apm_path.apm_m_path), @@ -374,10 +345,6 @@ static inline void apm_ll_apm_ctrl_get_exception_info(apm_ctrl_exception_info_t static inline void apm_ll_apm_ctrl_interrupt_enable(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path, bool enable) { - HAL_ASSERT(((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - if (enable) { REG_SET_BIT(APM_LL_APM_CTRL_INT_EN_REG(apm_ctrl), BIT(apm_m_path)); } else { @@ -420,22 +387,18 @@ static inline void apm_ll_apm_ctrl_reset_event_enable(bool enable) } /** - * @brief Return APM Ctrl interrupt source number. + * @brief Fetch the APM Ctrl interrupt source number. * - * @param apm_ctrl APM Ctrl (LP_APM/HP_APM) + * @param apm_ctrl APM Ctrl (LP_APM0/HP_APM/LP_APM) * @param apm_m_path APM Ctrl access patch(M[0:n]) */ -static inline esp_err_t apm_ll_apm_ctrl_get_int_src_num(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path) +static inline int apm_ll_apm_ctrl_get_int_src_num(apm_ll_apm_ctrl_t apm_ctrl, apm_ll_ctrl_access_path_t apm_m_path) { - HAL_ASSERT(((apm_ctrl == HP_APM_CTRL) && (apm_m_path < HP_APM_MAX_ACCESS_PATH)) || - ((apm_ctrl == LP_APM_CTRL) && (apm_m_path < LP_APM_MAX_ACCESS_PATH)) - ); - switch (apm_ctrl) { - case HP_APM_CTRL : - return (ETS_HP_APM_M0_INTR_SOURCE + apm_m_path); - case LP_APM_CTRL : - return (ETS_LP_APM_M0_INTR_SOURCE); + case HP_APM_CTRL : + return (ETS_HP_APM_M0_INTR_SOURCE + apm_m_path); + case LP_APM_CTRL : + return (ETS_LP_APM_M0_INTR_SOURCE + apm_m_path); } return -1; diff --git a/components/hal/include/hal/apm_hal.h b/components/hal/include/hal/apm_hal.h index 6f8b6eb5e93..94898df37c9 100644 --- a/components/hal/include/hal/apm_hal.h +++ b/components/hal/include/hal/apm_hal.h @@ -238,11 +238,15 @@ void apm_hal_apm_ctrl_master_sec_mode_config(apm_ctrl_secure_mode_config_t *sec_ void apm_hal_apm_ctrl_reset_event_enable(bool enable); /** - * @brief Returns APM Ctrl access path interrupt source number. + * @brief Fetch the APM Ctrl access path interrupt source number. * * @param apm_path APM controller and access path to be configured + * + * @return + * - valid interrupt source number on success + * - -1: invalid interrupt source */ -esp_err_t apm_hal_apm_ctrl_get_int_src_num(apm_ctrl_path_t *apm_path); +int apm_hal_apm_ctrl_get_int_src_num(apm_ctrl_path_t *apm_path); #endif //CONFIG_IDF_TARGET_ESP32P4 From 4ec9a8412d6b110d41e666422ba9f679469a0fcb Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 15 Jul 2024 16:02:56 +0800 Subject: [PATCH 049/113] feat(ulp): include sdkconfig macros in cmake build --- components/ulp/cmake/CMakeLists.txt | 19 ++++++++++--------- components/ulp/project_include.cmake | 11 ++--------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/components/ulp/cmake/CMakeLists.txt b/components/ulp/cmake/CMakeLists.txt index 99f10c6bd1a..0664238e4cc 100644 --- a/components/ulp/cmake/CMakeLists.txt +++ b/components/ulp/cmake/CMakeLists.txt @@ -5,8 +5,8 @@ project(${ULP_APP_NAME} ASM C) add_executable(${ULP_APP_NAME}) set(CMAKE_EXECUTABLE_SUFFIX ".elf") -option(ULP_COCPU_IS_RISCV "Use RISC-V based ULP" OFF) -option(ULP_COCPU_IS_LP_CORE "Use RISC-V based LP Core" OFF) +# Import all sdkconfig variables into the cmake build +include(${SDKCONFIG_CMAKE}) function(create_arg_file arguments output_file) # Escape all spaces @@ -20,7 +20,7 @@ endfunction() message(STATUS "Building ULP app ${ULP_APP_NAME}") # Check the supported assembler version -if(NOT (ULP_COCPU_IS_RISCV OR ULP_COCPU_IS_LP_CORE)) +if(CONFIG_ULP_COPROC_TYPE_FSM) check_expected_tool_version("esp32ulp-elf" ${CMAKE_ASM_COMPILER}) endif() @@ -28,6 +28,8 @@ endif() set(ULP_MAP_GEN ${PYTHON} ${IDF_PATH}/components/ulp/esp32ulp_mapgen.py) get_filename_component(sdkconfig_dir ${SDKCONFIG_HEADER} DIRECTORY) + + foreach(include ${COMPONENT_INCLUDES}) list(APPEND component_includes -I${include}) endforeach() @@ -41,9 +43,9 @@ list(APPEND ULP_PREPROCESSOR_ARGS -I${IDF_PATH}/components/esp_system/ld) target_include_directories(${ULP_APP_NAME} PRIVATE ${COMPONENT_INCLUDES}) # Pre-process the linker script -if(ULP_COCPU_IS_RISCV) +if(CONFIG_ULP_COPROC_TYPE_RISCV) set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_riscv.ld) -elseif(ULP_COCPU_IS_LP_CORE) +elseif(CONFIG_ULP_COPROC_TYPE_LP_CORE) set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/lp_core_riscv.ld) else() set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_fsm.ld) @@ -69,8 +71,7 @@ target_link_options(${ULP_APP_NAME} PRIVATE SHELL:-T ${CMAKE_CURRENT_BINARY_DIR} # To avoid warning "Manually-specified variables were not used by the project" set(bypassWarning "${IDF_TARGET}") -set(bypassWarning "${CONFIG_ESP_ROM_HAS_LP_ROM}") -if(ULP_COCPU_IS_RISCV) +if(CONFIG_ULP_COPROC_TYPE_RISCV) #risc-v ulp uses extra files for building: list(APPEND ULP_S_SOURCES "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_vectors.S" @@ -98,7 +99,7 @@ if(ULP_COCPU_IS_RISCV) target_compile_definitions(${ULP_APP_NAME} PRIVATE IS_ULP_COCPU) target_compile_definitions(${ULP_APP_NAME} PRIVATE ULP_RISCV_REGISTER_OPS) -elseif(ULP_COCPU_IS_LP_CORE) +elseif(CONFIG_ULP_COPROC_TYPE_LP_CORE) list(APPEND ULP_S_SOURCES "${IDF_PATH}/components/ulp/lp_core/lp_core/start.S" "${IDF_PATH}/components/ulp/lp_core/lp_core/vector.S" @@ -168,7 +169,7 @@ else() endif() -if(ULP_COCPU_IS_LP_CORE) +if(CONFIG_ULP_COPROC_TYPE_LP_CORE) set(ULP_BASE_ADDR "0x0") else() set(ULP_BASE_ADDR "0x50000000") diff --git a/components/ulp/project_include.cmake b/components/ulp/project_include.cmake index b6134042ff4..7585854d028 100644 --- a/components/ulp/project_include.cmake +++ b/components/ulp/project_include.cmake @@ -30,6 +30,7 @@ function(ulp_embed_binary app_name s_sources exp_dep_srcs) string(REPLACE ";" "|" ulp_s_sources "${ulp_s_sources}") idf_build_get_property(sdkconfig_header SDKCONFIG_HEADER) + idf_build_get_property(sdkconfig_cmake SDKCONFIG_CMAKE) idf_build_get_property(idf_path IDF_PATH) idf_build_get_property(idf_target IDF_TARGET) idf_build_get_property(python PYTHON) @@ -41,17 +42,11 @@ function(ulp_embed_binary app_name s_sources exp_dep_srcs) elseif(IDF_TARGET STREQUAL "esp32s2" OR IDF_TARGET STREQUAL "esp32s3") if(CONFIG_ULP_COPROC_TYPE_RISCV STREQUAL "y") set(TOOLCHAIN_FLAG ${idf_path}/components/ulp/cmake/toolchain-ulp-riscv.cmake) - set(ULP_IS_RISCV ON) else() set(TOOLCHAIN_FLAG ${idf_path}/components/ulp/cmake/toolchain-${idf_target}-ulp.cmake) - set(ULP_IS_RISCV OFF) endif() elseif(CONFIG_ULP_COPROC_TYPE_LP_CORE) set(TOOLCHAIN_FLAG ${idf_path}/components/ulp/cmake/toolchain-lp-core-riscv.cmake) - set(ULP_IS_LP_CORE_RISCV ON) - if(CONFIG_ESP_ROM_HAS_LP_ROM) - set(CONFIG_ESP_ROM_HAS_LP_ROM ON) - endif() endif() externalproject_add(${app_name} @@ -68,10 +63,8 @@ function(ulp_embed_binary app_name s_sources exp_dep_srcs) -DIDF_TARGET=${idf_target} -DIDF_PATH=${idf_path} -DSDKCONFIG_HEADER=${SDKCONFIG_HEADER} + -DSDKCONFIG_CMAKE=${SDKCONFIG_CMAKE} -DPYTHON=${python} - -DULP_COCPU_IS_RISCV=${ULP_IS_RISCV} - -DULP_COCPU_IS_LP_CORE=${ULP_IS_LP_CORE_RISCV} - -DCONFIG_ESP_ROM_HAS_LP_ROM=${CONFIG_ESP_ROM_HAS_LP_ROM} ${extra_cmake_args} BUILD_COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/${app_name} --target build BUILD_BYPRODUCTS ${ulp_artifacts} ${ulp_artifacts_extras} ${ulp_ps_sources} From 3111f47fb8802fa943b8bb3be89ca92464e93ac5 Mon Sep 17 00:00:00 2001 From: sibeibei Date: Mon, 15 Jul 2024 16:20:01 +0800 Subject: [PATCH 050/113] fix(pm): ssn update failed when dut wakeup from lightsleep --- components/esp_wifi/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 76bdd0b967a..eff8552fc2c 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 76bdd0b967afa7d75c9466ab0ad05601418a074d +Subproject commit eff8552fc2c890de9304250192e542d7a38c3480 From c2d0ac06471f9f2115b6407fc5cd9dcabcd57e7d Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 15 Jul 2024 16:48:48 +0800 Subject: [PATCH 051/113] fix(isp): fixed isp doc title issue --- docs/en/api-reference/peripherals/isp.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/en/api-reference/peripherals/isp.rst b/docs/en/api-reference/peripherals/isp.rst index d5cce70e3fd..242602a0b24 100644 --- a/docs/en/api-reference/peripherals/isp.rst +++ b/docs/en/api-reference/peripherals/isp.rst @@ -153,7 +153,8 @@ Enable and Disable ISP ^^^^^^^^^^^^^^^^^^^^^^ ISP ---------- +~~~ + Before doing ISP pipeline, you need to enable the ISP processor first, by calling :cpp:func:`esp_isp_enable`. This function: * Switches the driver state from **init** to **enable**. @@ -161,7 +162,7 @@ Before doing ISP pipeline, you need to enable the ISP processor first, by callin Calling :cpp:func:`esp_isp_disable` does the opposite, that is, put the driver back to the **init** state. ISP AF Processor ----------------- +~~~~~~~~~~~~~~~~ Before doing ISP AF, you need to enable the ISP AF processor first, by calling :cpp:func:`esp_isp_af_controller_enable`. This function: @@ -231,7 +232,7 @@ Calling :cpp:func:`esp_isp_af_env_detector_set_threshold` to set the threshold o ESP_ERROR_CHECK(esp_isp_af_env_detector_set_threshold(env_detector, definition_thresh, luminance_thresh)); ISP AWB Processor ------------------ +~~~~~~~~~~~~~~~~~ Before doing ISP AWB, you need to enable the ISP AWB processor first, by calling :cpp:func:`esp_isp_awb_controller_enable`. This function: @@ -244,7 +245,7 @@ Calling :cpp:func:`esp_isp_awb_controller_disable` does the opposite, that is, p AWB One-shot and Continuous Statistics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Calling :cpp:func:`esp_isp_awb_controller_get_oneshot_result` to get oneshot AWB statistics result of white patches. You can take following code as reference. +Calling :cpp:func:`esp_isp_awb_controller_get_oneshot_statistics` to get oneshot AWB statistics result of white patches. You can take following code as reference. Aside from the above oneshot API, the ISP AWB driver also provides a way to start AWB statistics continuously. Calling :cpp:func:`esp_isp_awb_controller_start_continuous_statistics` starts the continuous statistics and :cpp:func:`esp_isp_awb_controller_stop_continuous_statistics` stops it. @@ -292,7 +293,7 @@ Note that if you want to use the continuous statistics, you need to register the .. _isp_bf: ISP BF Processor ----------------- +~~~~~~~~~~~~~~~~ This pipeline is used for doing image input denoising under bayer mode. From 0f57d6cf3489eced64fea2aca90752fe96664e18 Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Tue, 14 May 2024 15:58:17 +0530 Subject: [PATCH 052/113] fix(nimble): Fixed BLE security vulnerability when using fixed IRK --- components/bt/host/nimble/Kconfig.in | 10 ++++++++++ components/bt/host/nimble/nimble | 2 +- .../bt/host/nimble/port/include/esp_nimble_cfg.h | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/components/bt/host/nimble/Kconfig.in b/components/bt/host/nimble/Kconfig.in index d02293a87a3..5bb08e5ac70 100644 --- a/components/bt/host/nimble/Kconfig.in +++ b/components/bt/host/nimble/Kconfig.in @@ -164,6 +164,16 @@ config BT_NIMBLE_NVS_PERSIST help Enable this flag to make bonding persistent across device reboots +config BT_NIMBLE_SMP_ID_RESET + bool "Reset device identity when all bonding records are deleted" + default n + help + There are tracking risks associated with using a fixed or static IRK. + If enabled this option, Bluedroid will assign a new randomly-generated IRK + when all pairing and bonding records are deleted. This would decrease the ability + of a previously paired peer to be used to determine whether a device + with which it previously shared an IRK is within range. + menuconfig BT_NIMBLE_SECURITY_ENABLE bool "Enable BLE SM feature" depends on BT_NIMBLE_ENABLED diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index ec9f21253ae..46ae5865554 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit ec9f21253ae539b44855fed223bee52979a9d251 +Subproject commit 46ae5865554f2fd7df829b6b9b5ca24522b9ad76 diff --git a/components/bt/host/nimble/port/include/esp_nimble_cfg.h b/components/bt/host/nimble/port/include/esp_nimble_cfg.h index d2fa3338866..fc77f592f98 100644 --- a/components/bt/host/nimble/port/include/esp_nimble_cfg.h +++ b/components/bt/host/nimble/port/include/esp_nimble_cfg.h @@ -892,6 +892,14 @@ #define MYNEWT_VAL_BLE_SM_THEIR_KEY_DIST (0) #endif +#ifndef MYNEWT_VAL_BLE_SMP_ID_RESET +#ifdef CONFIG_BT_NIMBLE_SMP_ID_RESET +#define MYNEWT_VAL_BLE_SMP_ID_RESET CONFIG_BT_NIMBLE_SMP_ID_RESET +#else +#define MYNEWT_VAL_BLE_SMP_ID_RESET (0) +#endif +#endif + #ifndef MYNEWT_VAL_BLE_CRYPTO_STACK_MBEDTLS #define MYNEWT_VAL_BLE_CRYPTO_STACK_MBEDTLS (CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS) #endif From 3c7a83303a1d2f0d57eb5b72c9db3df8775de7ff Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 24 Jun 2024 18:14:13 +0800 Subject: [PATCH 053/113] feat(ppa): added ppa dsi example --- docs/en/api-reference/peripherals/ppa.rst | 5 + examples/peripherals/.build-test-rules.yml | 7 + .../components/dsi_init/example_dsi_init.c | 22 +- .../dsi_init/include/example_dsi_init.h | 14 +- .../camera/camera_dsi/main/camera_dsi_main.c | 4 +- .../isp/auto_focus/main/isp_af_dsi_main.c | 4 +- .../peripherals/ppa/ppa_dsi/CMakeLists.txt | 6 + examples/peripherals/ppa/ppa_dsi/README.md | 123 ++++++ .../ppa/ppa_dsi/main/CMakeLists.txt | 17 + .../ppa/ppa_dsi/main/Kconfig.projbuild | 28 ++ .../ppa/ppa_dsi/main/idf_component.yml | 7 + examples/peripherals/ppa/ppa_dsi/main/image.c | 250 +++++++++++ examples/peripherals/ppa/ppa_dsi/main/image.h | 9 + .../peripherals/ppa/ppa_dsi/main/image.jpg | Bin 0 -> 43700 bytes .../ppa/ppa_dsi/main/ppa_dsi_main.c | 404 ++++++++++++++++++ .../peripherals/ppa/ppa_dsi/pytest_ppa_dsi.py | 10 + .../ppa/ppa_dsi/sdkconfig.defaults | 3 + 17 files changed, 902 insertions(+), 11 deletions(-) create mode 100644 examples/peripherals/ppa/ppa_dsi/CMakeLists.txt create mode 100644 examples/peripherals/ppa/ppa_dsi/README.md create mode 100644 examples/peripherals/ppa/ppa_dsi/main/CMakeLists.txt create mode 100644 examples/peripherals/ppa/ppa_dsi/main/Kconfig.projbuild create mode 100644 examples/peripherals/ppa/ppa_dsi/main/idf_component.yml create mode 100644 examples/peripherals/ppa/ppa_dsi/main/image.c create mode 100644 examples/peripherals/ppa/ppa_dsi/main/image.h create mode 100644 examples/peripherals/ppa/ppa_dsi/main/image.jpg create mode 100644 examples/peripherals/ppa/ppa_dsi/main/ppa_dsi_main.c create mode 100644 examples/peripherals/ppa/ppa_dsi/pytest_ppa_dsi.py create mode 100644 examples/peripherals/ppa/ppa_dsi/sdkconfig.defaults diff --git a/docs/en/api-reference/peripherals/ppa.rst b/docs/en/api-reference/peripherals/ppa.rst index e108558839c..ae34ff7ac98 100644 --- a/docs/en/api-reference/peripherals/ppa.rst +++ b/docs/en/api-reference/peripherals/ppa.rst @@ -142,6 +142,11 @@ Performance Overview The PPA operations are acted on the target block of an input picture. Therefore, the time it takes to complete a PPA transaction is proportional to the amount of the data in the block. The size of the entire picture has no influence on the performance. More importantly, the PPA performance highly relies on the PSRAM bandwidth if the pictures are located in the PSRAM section. When there are quite a few peripherals reading and writing to the PSRAM at the same time, the performance of PPA operation will be greatly reduced. +Application Examples +^^^^^^^^^^^^^^^^^^^^ + +* PPA with DSI display example: :example:`peripherals/ppa/ppa_dsi`. This example used image will be first scaled up, rotated at counter-clockwise direction and rotated back, mirrored and mirror back, and scaled down. Then the image will be blended with a whole red image with less transparency. Next the `ESP32` word will be color-keyed out. Lastly a frame will be filled around the `ESP32`. + API Reference ------------- diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 6949eafd206..cdfc182f291 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -281,6 +281,13 @@ examples/peripherals/pcnt: depends_components: - esp_driver_pcnt +examples/peripherals/ppa/ppa_dsi: + disable: + - if: SOC_PPA_SUPPORTED != 1 or SOC_MIPI_DSI_SUPPORTED != 1 + depends_components: + - esp_driver_ppa + - esp_lcd + examples/peripherals/rmt: disable: - if: SOC_RMT_SUPPORTED != 1 diff --git a/examples/peripherals/camera/camera_dsi/components/dsi_init/example_dsi_init.c b/examples/peripherals/camera/camera_dsi/components/dsi_init/example_dsi_init.c index 15790143194..d660820791f 100644 --- a/examples/peripherals/camera/camera_dsi/components/dsi_init/example_dsi_init.c +++ b/examples/peripherals/camera/camera_dsi/components/dsi_init/example_dsi_init.c @@ -8,15 +8,13 @@ #include "esp_log.h" #include "esp_lcd_mipi_dsi.h" #include "esp_lcd_panel_ops.h" +#include "esp_lcd_panel_io.h" #include "esp_lcd_ili9881c.h" #include "example_dsi_init.h" #include "example_dsi_init_config.h" -void example_dsi_resource_alloc(esp_lcd_panel_handle_t *ili9881c_ctrl_panel, esp_lcd_panel_handle_t *mipi_dpi_panel, void **frame_buffer) +void example_dsi_resource_alloc(esp_lcd_panel_handle_t *ili9881c_ctrl_panel, esp_lcd_dsi_bus_handle_t *mipi_dsi_bus, esp_lcd_panel_io_handle_t *mipi_dbi_io, esp_lcd_panel_handle_t *mipi_dpi_panel, void **frame_buffer) { - esp_lcd_dsi_bus_handle_t mipi_dsi_bus = NULL; - esp_lcd_panel_io_handle_t mipi_dbi_io = NULL; - //---------------DSI resource allocation------------------// esp_lcd_dsi_bus_config_t bus_config = { .bus_id = 0, @@ -24,21 +22,21 @@ void example_dsi_resource_alloc(esp_lcd_panel_handle_t *ili9881c_ctrl_panel, esp .phy_clk_src = MIPI_DSI_PHY_CLK_SRC_DEFAULT, .lane_bit_rate_mbps = 1000, // 1000 Mbps }; - ESP_ERROR_CHECK(esp_lcd_new_dsi_bus(&bus_config, &mipi_dsi_bus)); + ESP_ERROR_CHECK(esp_lcd_new_dsi_bus(&bus_config, mipi_dsi_bus)); esp_lcd_dbi_io_config_t dbi_config = { .virtual_channel = 0, .lcd_cmd_bits = 8, .lcd_param_bits = 8, }; - ESP_ERROR_CHECK(esp_lcd_new_panel_io_dbi(mipi_dsi_bus, &dbi_config, &mipi_dbi_io)); + ESP_ERROR_CHECK(esp_lcd_new_panel_io_dbi(*mipi_dsi_bus, &dbi_config, mipi_dbi_io)); esp_lcd_panel_dev_config_t lcd_dev_config = { .bits_per_pixel = 16, .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, .reset_gpio_num = -1, }; - ESP_ERROR_CHECK(esp_lcd_new_panel_ili9881c(mipi_dbi_io, &lcd_dev_config, ili9881c_ctrl_panel)); + ESP_ERROR_CHECK(esp_lcd_new_panel_ili9881c(*mipi_dbi_io, &lcd_dev_config, ili9881c_ctrl_panel)); esp_lcd_dpi_panel_config_t dpi_config = { .dpi_clk_src = MIPI_DSI_DPI_CLK_SRC_DEFAULT, @@ -56,7 +54,7 @@ void example_dsi_resource_alloc(esp_lcd_panel_handle_t *ili9881c_ctrl_panel, esp .vsync_front_porch = EXAMPLE_MIPI_DSI_IMAGE_VFP, }, }; - ESP_ERROR_CHECK(esp_lcd_new_panel_dpi(mipi_dsi_bus, &dpi_config, mipi_dpi_panel)); + ESP_ERROR_CHECK(esp_lcd_new_panel_dpi(*mipi_dsi_bus, &dpi_config, mipi_dpi_panel)); ESP_ERROR_CHECK(esp_lcd_dpi_panel_get_frame_buffer(*mipi_dpi_panel, 1, frame_buffer)); } @@ -74,3 +72,11 @@ void example_dpi_panel_init(esp_lcd_panel_handle_t mipi_dpi_panel) //---------------DPI Panel Init------------------// ESP_ERROR_CHECK(esp_lcd_panel_init(mipi_dpi_panel)); } + +void example_dsi_resource_destroy(esp_lcd_panel_handle_t ili9881c_ctrl_panel, esp_lcd_dsi_bus_handle_t mipi_dsi_bus, esp_lcd_panel_io_handle_t mipi_dbi_io, esp_lcd_panel_handle_t mipi_dpi_panel) +{ + ESP_ERROR_CHECK(esp_lcd_panel_del(mipi_dpi_panel)); + ESP_ERROR_CHECK(esp_lcd_panel_del(ili9881c_ctrl_panel)); + ESP_ERROR_CHECK(esp_lcd_panel_io_del(mipi_dbi_io)); + ESP_ERROR_CHECK(esp_lcd_del_dsi_bus(mipi_dsi_bus)); +} diff --git a/examples/peripherals/camera/camera_dsi/components/dsi_init/include/example_dsi_init.h b/examples/peripherals/camera/camera_dsi/components/dsi_init/include/example_dsi_init.h index df04c79eb15..d495e5d6ced 100644 --- a/examples/peripherals/camera/camera_dsi/components/dsi_init/include/example_dsi_init.h +++ b/examples/peripherals/camera/camera_dsi/components/dsi_init/include/example_dsi_init.h @@ -18,10 +18,12 @@ extern "C" { * @brief DSI init function * * @param[out] ili9881c_ctrl_panel ILI9881C panel handle + * @param[out] mipi_dsi_bus MIPI DSI bus handle + * @param[out] mipi_dbi_io MIPI DBI io handle * @param[out] mipi_dpi_panel MIPI DPI panel handle * @param[out] frame_buffer frame buffer */ -void example_dsi_resource_alloc(esp_lcd_panel_handle_t *ili9881c_ctrl_panel, esp_lcd_panel_handle_t *mipi_dpi_panel, void **frame_buffer); +void example_dsi_resource_alloc(esp_lcd_panel_handle_t *ili9881c_ctrl_panel, esp_lcd_dsi_bus_handle_t *mipi_dsi_bus, esp_lcd_panel_io_handle_t *mipi_dbi_io, esp_lcd_panel_handle_t *mipi_dpi_panel, void **frame_buffer); /** * @brief DSI ILI9881C panel init function @@ -37,6 +39,16 @@ void example_dsi_ili9881c_panel_init(esp_lcd_panel_handle_t ili9881c_ctrl_panel) */ void example_dpi_panel_init(esp_lcd_panel_handle_t mipi_dpi_panel); +/** + * @brief Destroy DSI related resources + * + * @param[in] ili9881c_ctrl_panel ILI9881C panel handle + * @param[in] mipi_dsi_bus MIPI DSI bus handle + * @param[in] mipi_dbi_io MIPI DBI io handle + * @param[in] mipi_dpi_panel MIPI DPI panel handle + */ +void example_dsi_resource_destroy(esp_lcd_panel_handle_t ili9881c_ctrl_panel, esp_lcd_dsi_bus_handle_t mipi_dsi_bus, esp_lcd_panel_io_handle_t mipi_dbi_io, esp_lcd_panel_handle_t mipi_dpi_panel); + #ifdef __cplusplus } #endif diff --git a/examples/peripherals/camera/camera_dsi/main/camera_dsi_main.c b/examples/peripherals/camera/camera_dsi/main/camera_dsi_main.c index a5c5c2dcb70..fa17cffaa07 100644 --- a/examples/peripherals/camera/camera_dsi/main/camera_dsi_main.c +++ b/examples/peripherals/camera/camera_dsi/main/camera_dsi_main.c @@ -34,6 +34,8 @@ static bool s_camera_get_finished_trans(esp_cam_ctlr_handle_t handle, esp_cam_ct void app_main(void) { esp_err_t ret = ESP_FAIL; + esp_lcd_dsi_bus_handle_t mipi_dsi_bus = NULL; + esp_lcd_panel_io_handle_t mipi_dbi_io = NULL; esp_lcd_panel_handle_t ili9881c_ctrl_panel = NULL; esp_lcd_panel_handle_t mipi_dpi_panel = NULL; void *frame_buffer = NULL; @@ -53,7 +55,7 @@ void app_main(void) * ISP convert to RGB565 */ //---------------DSI Init------------------// - example_dsi_resource_alloc(&ili9881c_ctrl_panel, &mipi_dpi_panel, &frame_buffer); + example_dsi_resource_alloc(&ili9881c_ctrl_panel, &mipi_dsi_bus, &mipi_dbi_io, &mipi_dpi_panel, &frame_buffer); //---------------Necessary variable config------------------// frame_buffer_size = CONFIG_EXAMPLE_MIPI_CSI_DISP_HRES * CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; diff --git a/examples/peripherals/isp/auto_focus/main/isp_af_dsi_main.c b/examples/peripherals/isp/auto_focus/main/isp_af_dsi_main.c index 2e60bac2551..8f167c66c13 100644 --- a/examples/peripherals/isp/auto_focus/main/isp_af_dsi_main.c +++ b/examples/peripherals/isp/auto_focus/main/isp_af_dsi_main.c @@ -176,6 +176,8 @@ static void af_task(void *arg) void app_main(void) { esp_err_t ret = ESP_FAIL; + esp_lcd_dsi_bus_handle_t mipi_dsi_bus = NULL; + esp_lcd_panel_io_handle_t mipi_dbi_io = NULL; esp_lcd_panel_handle_t ili9881c_ctrl_panel = NULL; esp_lcd_panel_handle_t mipi_dpi_panel = NULL; void *frame_buffer = NULL; @@ -195,7 +197,7 @@ void app_main(void) * ISP convert to RGB565 */ //---------------DSI Init------------------// - example_dsi_resource_alloc(&ili9881c_ctrl_panel, &mipi_dpi_panel, &frame_buffer); + example_dsi_resource_alloc(&ili9881c_ctrl_panel, &mipi_dsi_bus, &mipi_dbi_io, &mipi_dpi_panel, &frame_buffer); //---------------Necessary variable config------------------// frame_buffer_size = CONFIG_EXAMPLE_MIPI_CSI_DISP_HRES * CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; diff --git a/examples/peripherals/ppa/ppa_dsi/CMakeLists.txt b/examples/peripherals/ppa/ppa_dsi/CMakeLists.txt new file mode 100644 index 00000000000..41d2d696acf --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(ppa_dsi) diff --git a/examples/peripherals/ppa/ppa_dsi/README.md b/examples/peripherals/ppa/ppa_dsi/README.md new file mode 100644 index 00000000000..da5cf56e880 --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/README.md @@ -0,0 +1,123 @@ +| Supported Targets | ESP32-P4 | +| ----------------- | -------- | + + +# PPA DSI example + +## Overview + +This example demonstrates how to use the esp_driver_ppa component to process a given image and display it via DSI interface. + +The example used image will be first scaled up, rotated at counter-clockwise direction and rotated back, mirrored and mirror back, and scaled down. Then the image will be blended with a whole red image with less transparency. Next the `ESP32` word will be color-keyed out. Lastly a frame will be filled around the `ESP32`. + +## Usage + +The subsections below give only absolutely necessary information. For full steps to configure ESP-IDF and use it to build and run projects, see [ESP-IDF Getting Started](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#get-started). + + +### Hardware Required + +This example requires: + +- ILI9881C LCD screen +- ESP32P4 devkit + + + GND + ┌─────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ┌───────────────-─────────────┴──────────────────┐ │ + │ │ ┌──────────┴───────────┐ + │ │ DSI DATA 1P │ │ + │ ├───────────────────────────┤ │ + │ │ │ │ + │ │ DSI DATA 1N │ │ + │ ├───────────────────────────┤ │ + │ ESP32-P4 │ │ │ + │ │ DSI CLK N │ ILI9881C │ + │ ├───────────────────────────┤ │ + │ │ │ │ + │ │ DSI CLK P │ │ + │ ├───────────────────────────┤ │ + │ │ │ │ + │ │ DSI DATA 0P │ │ + │ ├───────────────────────────┤ │ + │ │ │ │ + │ │ DSI DATA 0N │ │ + │ ├───────────────────────────┤ │ + │ │ │ │ + │ │ └──────────────────────┘ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + └────────────────────────────────────────────────┘ + + +### Set Chip Target + +First of all, your target must be supported by both: + +- **By your ESP-IDF version**: For the full list of supported targets, run: + ``` + idf.py --list-targets + ``` +- **By this example**: For the full list of supported targets, refer to the supported targets table at the top of this README. + +After you make sure that your target is supported, go to your example project directory and [set the chip target](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/tools/idf-py.html#select-the-target-chip-set-target): + +``` +idf.py set-target +``` + +For example, to set esp32-P4 as the chip target, run: + +``` +idf.py set-target esp32p4 +``` + + +### Build and Flash + +Execute the following command to build the project, flash it to your development board, and run the monitor tool to view the serial output: + +``` +idf.py build flash monitor +``` + +This command can be reduced to `idf.py flash monitor`. + +If the above command fails, check the log on the serial monitor which usually provides information on the possible cause of the issue. + +To exit the serial monitor, use `Ctrl` + `]`. + + +## Example Output + +If you see the following console output, your example should be running correctly: + +``` +I (1555) main_task: Calling app_main() +I (1555) ili9881c: ID1: 0x98, ID2: 0x81, ID3: 0x5c +I (1795) ppa_dsi: JPEG image decoded! Size of the decoded image is: 320px x 240px +start srm operations +start blend operations +start fill operations +I (10085) main_task: Returned from app_main() +``` + + +## Reference + +- Link to the ESP-IDF feature's API reference, for example [ESP-IDF: Pixel-Processing Accelerator](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/ppa.html) +- [ESP-IDF Getting Started](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#get-started) +- [Project Configuration](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/kconfig.html) (Kconfig Options) diff --git a/examples/peripherals/ppa/ppa_dsi/main/CMakeLists.txt b/examples/peripherals/ppa/ppa_dsi/main/CMakeLists.txt new file mode 100644 index 00000000000..61a29afb082 --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/main/CMakeLists.txt @@ -0,0 +1,17 @@ +set(srcs "ppa_dsi_main.c") + +if(CONFIG_EXAMPLE_SOURCE_IMAGE_FORMAT_RGB565) + list(APPEND srcs "image.c") +endif() + +set(embed_files) + +if(CONFIG_EXAMPLE_SOURCE_IMAGE_FORMAT_JPEG) + list(APPEND embed_files "image.jpg") +endif() + +idf_component_register(SRCS ${srcs} + INCLUDE_DIRS "." + REQUIRES esp_mm esp_driver_ppa dsi_init + EMBED_FILES ${embed_files} + ) diff --git a/examples/peripherals/ppa/ppa_dsi/main/Kconfig.projbuild b/examples/peripherals/ppa/ppa_dsi/main/Kconfig.projbuild new file mode 100644 index 00000000000..2a9eb651d1e --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/main/Kconfig.projbuild @@ -0,0 +1,28 @@ +menu "Example Configuration" + config EXAMPLE_USED_LDO_CHAN_ID + int "example used LDO channel ID" + default 3 + help + Example used LDO channel ID, you may check datasheet to know more details. + + config EXAMPLE_USED_LDO_VOLTAGE_MV + int "example used LDO voltage in mV" + default 2500 + range 0 3300 + help + Example used LDO voltage, in mV + + choice EXAMPLE_SOURCE_IMAGE_FORMAT + prompt "Select source image format" + default EXAMPLE_SOURCE_IMAGE_FORMAT_JPEG + help + Select the source image format + + config EXAMPLE_SOURCE_IMAGE_FORMAT_JPEG + bool "JPEG" + + config EXAMPLE_SOURCE_IMAGE_FORMAT_RGB565 + bool "RGB565" + endchoice + +endmenu diff --git a/examples/peripherals/ppa/ppa_dsi/main/idf_component.yml b/examples/peripherals/ppa/ppa_dsi/main/idf_component.yml new file mode 100644 index 00000000000..b001ac9e048 --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/main/idf_component.yml @@ -0,0 +1,7 @@ +dependencies: + espressif/esp_lcd_ili9881c: "*" + idf: + version: ">=5.3.0" + dsi_init: + path: ${IDF_PATH}/examples/peripherals/camera/camera_dsi/components/dsi_init + esp_jpeg: ">=1.0.2" diff --git a/examples/peripherals/ppa/ppa_dsi/main/image.c b/examples/peripherals/ppa/ppa_dsi/main/image.c new file mode 100644 index 00000000000..33c0f8b13e4 --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/main/image.c @@ -0,0 +1,250 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +const uint8_t image_map[] = { + 0x5a, 0x0b, 0x3a, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x38, 0x03, 0x17, 0x0b, 0xd6, 0x12, 0xb7, 0x4b, 0xff, 0xd6, 0x3d, 0xef, 0x5d, 0xef, 0x5f, 0xd7, 0x34, 0x1b, 0x99, 0x03, 0xba, 0x03, 0x9a, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0x59, 0x03, 0x9b, 0x0b, 0x59, 0x03, 0x39, 0x03, 0x59, 0x03, 0x38, 0x03, 0x38, 0x03, 0x59, 0x03, 0x38, 0x03, 0x79, 0x0b, 0x38, 0x03, 0x79, 0x0b, 0x58, 0x0b, 0x5c, 0x34, 0xf6, 0x0a, 0x16, 0x13, 0x34, 0x2b, 0xbd, 0xc6, 0x1c, 0xe7, 0x3c, 0xe7, 0x3f, 0xcf, 0x35, 0x2b, 0x96, 0x0a, 0x98, 0x0a, 0x58, 0x02, 0x58, 0x02, 0x58, 0x02, 0x58, 0x02, 0x58, 0x0a, 0x57, 0x02, 0x57, 0x02, 0x37, 0x02, 0x37, 0x02, 0x57, 0x0a, 0x37, 0x02, 0x37, 0x02, 0x37, 0x02, 0x37, 0x02, 0x37, 0x0a, 0x57, 0x0a, 0x58, 0x0a, 0x17, 0x02, 0x17, 0x02, 0x36, 0x02, 0xf1, 0x09, 0x1c, 0xb6, 0xfc, 0xde, 0xfb, 0xe6, 0x1d, 0xdf, 0x3f, 0xd7, 0xf6, 0x5b, 0x34, 0x12, 0x37, 0x0a, 0x16, 0x02, 0x17, 0x0a, 0x38, 0x0a, 0x38, 0x0a, 0x38, 0x02, 0x38, 0x02, 0x18, 0x0a, 0x18, 0x0a, 0x38, 0x02, 0x38, 0x02, 0x39, 0x0a, 0x59, 0x0a, 0x38, 0x02, 0x38, 0x02, 0x59, 0x0a, 0x99, 0x12, 0x98, 0x12, 0x56, 0x02, 0x15, 0x0a, 0x13, 0x1a, 0x16, 0x74, 0xbd, 0xd6, 0xdc, 0xe6, 0x1d, 0xdf, 0x5f, 0xc7, 0xb4, 0x33, 0xf8, 0x1b, 0xf9, 0x0b, 0x3b, 0x14, 0xfa, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb8, 0x0b, 0x57, 0x03, 0x14, 0x1b, 0x9a, 0x9d, 0xdc, 0xde, 0xdb, 0xde, 0x3e, 0xdf, 0xdf, 0xa6, 0x95, 0x23, 0xd7, 0x13, 0xd8, 0x0b, 0xf9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xfa, 0x0b, 0xda, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x77, 0x03, 0x13, 0x13, 0xda, 0xa5, 0x9b, 0xde, 0xbb, 0xe6, 0xdd, 0xd6, 0x3f, 0xa6, 0x34, 0x0a, 0x76, 0x0a, 0x57, 0x0a, 0x57, 0x0a, 0x16, 0x0a, 0x37, 0x0a, 0x57, 0x0a, 0x36, 0x02, 0xf6, 0x01, 0xf6, 0x01, 0xf7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0x95, 0x09, 0x53, 0x01, 0x51, 0x01, 0x10, 0x2a, 0x7c, 0xd6, 0xba, 0xe6, 0xbb, 0xe6, 0x1f, 0xd7, 0x58, 0x44, 0x97, 0x13, 0x97, 0x0b, 0xb9, 0x13, 0x98, 0x13, 0x78, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0xf5, 0x0a, 0xb2, 0x22, 0x7a, 0x95, 0x7c, 0xce, 0x7a, 0xde, 0xbb, 0xe6, 0x1e, 0xd7, 0xfa, 0x64, 0x56, 0x13, 0x98, 0x13, 0x98, 0x0b, 0x77, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x55, 0x13, 0xf1, 0x22, 0x3d, 0xb6, 0x7b, 0xd6, 0x9b, 0xde, 0x7c, 0xc6, 0x1d, 0x9e, 0x34, 0x1b, 0x77, 0x13, 0x57, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0x77, 0x0b, 0x34, 0x13, 0xf1, 0x2a, 0x3c, 0xb6, 0x9b, 0xd6, 0x7a, 0xd6, 0xbd, 0xce, 0x1d, 0xa6, 0xd3, 0x12, 0xf5, 0x02, 0x15, 0x03, 0x35, 0x13, 0xd4, 0x0a, 0xb4, 0x0a, 0x15, 0x1b, 0xb7, 0x2b, 0x96, 0x23, 0x55, 0x23, 0xf8, 0x3b, 0xf8, 0x43, 0x19, 0x5c, 0xd8, 0x5b, 0xd8, 0x5b, 0xf8, 0x5b, 0x38, 0x5c, 0x18, 0x5c, 0x18, 0x5c, 0x58, 0x5c, 0x99, 0x64, 0x77, 0x6c, 0x9c, 0xd6, 0x1f, 0xd7, 0xd6, 0x3b, 0x35, 0x0b, 0x76, 0x0b, 0x56, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x03, 0x36, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x76, 0x0b, 0x76, 0x0b, 0x77, 0x0b, 0x77, 0x0b, + 0x5a, 0x0b, 0x3a, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x38, 0x03, 0x37, 0x0b, 0xf6, 0x12, 0xd7, 0x4b, 0xff, 0xd6, 0x3d, 0xef, 0x5c, 0xef, 0x7f, 0xd7, 0x75, 0x23, 0x78, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0xba, 0x13, 0xba, 0x13, 0xba, 0x0b, 0x7a, 0x0b, 0x18, 0x03, 0xfc, 0x1b, 0xfb, 0x1b, 0x38, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x79, 0x0b, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0xba, 0x1b, 0xda, 0x23, 0xf6, 0x0a, 0xd5, 0x0a, 0x34, 0x33, 0xbd, 0xce, 0xdc, 0xe6, 0x5c, 0xef, 0x3f, 0xd7, 0x96, 0x3b, 0x76, 0x0a, 0x78, 0x0a, 0x58, 0x02, 0x37, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x37, 0x02, 0x37, 0x02, 0x37, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x37, 0x02, 0x37, 0x02, 0x17, 0x02, 0x17, 0x02, 0x16, 0x02, 0xf1, 0x09, 0x3c, 0xb6, 0xfc, 0xe6, 0xfc, 0xe6, 0x1d, 0xe7, 0xdf, 0xe7, 0x37, 0x5c, 0x96, 0x1a, 0x78, 0x12, 0x37, 0x0a, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x38, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x18, 0x0a, 0x16, 0x02, 0x15, 0x02, 0xf5, 0x01, 0x13, 0x1a, 0x37, 0x74, 0xbd, 0xd6, 0xdc, 0xde, 0xfd, 0xd6, 0x3f, 0xc7, 0xb4, 0x2b, 0xd7, 0x13, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb8, 0x0b, 0x57, 0x0b, 0x14, 0x1b, 0xba, 0x9d, 0xdc, 0xde, 0xdb, 0xe6, 0x3e, 0xdf, 0x9f, 0x9e, 0x75, 0x1b, 0xb7, 0x0b, 0xb8, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x03, 0x78, 0x03, 0x57, 0x03, 0xf4, 0x12, 0xba, 0xa5, 0xbc, 0xde, 0x9b, 0xde, 0x5f, 0xe7, 0x79, 0x64, 0x55, 0x0a, 0x76, 0x0a, 0x37, 0x02, 0x37, 0x02, 0x17, 0x02, 0x38, 0x0a, 0x79, 0x0a, 0x78, 0x02, 0x37, 0x02, 0xf6, 0x01, 0xf7, 0x01, 0x18, 0x0a, 0xf7, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0x95, 0x09, 0x53, 0x01, 0x52, 0x01, 0x31, 0x2a, 0x9c, 0xd6, 0xba, 0xe6, 0xdb, 0xe6, 0x3f, 0xd7, 0xf6, 0x33, 0x97, 0x0b, 0xd8, 0x13, 0x3a, 0x1c, 0xfa, 0x1b, 0xb9, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x15, 0x0b, 0xd2, 0x22, 0x7a, 0x95, 0x9c, 0xce, 0x7a, 0xde, 0x9a, 0xde, 0x1e, 0xd7, 0xd9, 0x5c, 0x56, 0x0b, 0x97, 0x0b, 0xb8, 0x0b, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x97, 0x0b, 0x55, 0x13, 0xf2, 0x22, 0xbb, 0x9d, 0x5a, 0xce, 0x9b, 0xde, 0xdd, 0xce, 0xbb, 0x8d, 0x55, 0x1b, 0x77, 0x0b, 0x98, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0x56, 0x03, 0x14, 0x13, 0xd1, 0x22, 0xfb, 0xa5, 0x7b, 0xd6, 0x7a, 0xd6, 0xbd, 0xce, 0x9b, 0x95, 0xf3, 0x12, 0x36, 0x0b, 0x36, 0x0b, 0x35, 0x0b, 0x36, 0x0b, 0xf6, 0x0a, 0x16, 0x0b, 0x77, 0x1b, 0x35, 0x0b, 0xf5, 0x02, 0x36, 0x13, 0x16, 0x0b, 0x55, 0x03, 0x35, 0x03, 0x35, 0x03, 0x55, 0x03, 0x54, 0x03, 0x34, 0x03, 0x34, 0x0b, 0x34, 0x0b, 0x13, 0x0b, 0xf1, 0x22, 0xf6, 0x8c, 0x9d, 0xbe, 0x13, 0x23, 0x36, 0x0b, 0x56, 0x13, 0x98, 0x1b, 0x16, 0x0b, 0x16, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x3a, 0x0b, 0x3a, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x58, 0x03, 0x37, 0x0b, 0xf5, 0x0a, 0x17, 0x54, 0xfe, 0xd6, 0x3d, 0xef, 0x5c, 0xef, 0x7f, 0xdf, 0x95, 0x2b, 0x58, 0x0b, 0x79, 0x0b, 0x79, 0x13, 0xfa, 0x23, 0xba, 0x1b, 0x9a, 0x1b, 0x79, 0x13, 0x79, 0x0b, 0xfb, 0x1b, 0x5c, 0x2c, 0x1b, 0x24, 0x78, 0x0b, 0x37, 0x03, 0x58, 0x03, 0x79, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x17, 0x03, 0x58, 0x0b, 0x17, 0x0b, 0x16, 0x0b, 0xd5, 0x0a, 0x75, 0x3b, 0xbe, 0xce, 0xbb, 0xe6, 0x5d, 0xef, 0x5f, 0xdf, 0xd7, 0x4b, 0x55, 0x0a, 0x58, 0x0a, 0x58, 0x0a, 0x18, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x16, 0x02, 0xd2, 0x11, 0x1c, 0xb6, 0xfc, 0xe6, 0x1c, 0xe7, 0x3e, 0xe7, 0x5f, 0xd7, 0x75, 0x43, 0x55, 0x12, 0x37, 0x02, 0x17, 0x02, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xf8, 0x01, 0x17, 0x02, 0x17, 0x02, 0xf8, 0x01, 0x18, 0x0a, 0x37, 0x02, 0x36, 0x02, 0x15, 0x0a, 0x13, 0x1a, 0xf6, 0x6b, 0x9d, 0xd6, 0xdc, 0xde, 0x3e, 0xdf, 0x9f, 0xcf, 0xf5, 0x33, 0x18, 0x1c, 0xf9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x57, 0x0b, 0x14, 0x1b, 0xba, 0x9d, 0xdc, 0xde, 0xdb, 0xe6, 0x3e, 0xdf, 0x7e, 0x9e, 0x75, 0x1b, 0xb7, 0x13, 0xb8, 0x03, 0xb8, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x14, 0x13, 0xdb, 0xa5, 0x9b, 0xd6, 0xfc, 0xe6, 0x3f, 0xdf, 0xb7, 0x4b, 0x14, 0x02, 0x97, 0x0a, 0x16, 0x02, 0x37, 0x02, 0x17, 0x02, 0x58, 0x0a, 0x99, 0x0a, 0x99, 0x02, 0x58, 0x02, 0x37, 0x02, 0xf7, 0x01, 0x18, 0x0a, 0xf8, 0x09, 0xf7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0x95, 0x09, 0x74, 0x09, 0x93, 0x09, 0x52, 0x32, 0xbd, 0xd6, 0x9a, 0xde, 0xbb, 0xe6, 0x1f, 0xcf, 0x17, 0x34, 0xb8, 0x0b, 0xb8, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x15, 0x0b, 0xd2, 0x22, 0x7a, 0x95, 0x5b, 0xc6, 0x7a, 0xd6, 0x99, 0xd6, 0x1e, 0xcf, 0x98, 0x4c, 0x96, 0x13, 0xd8, 0x13, 0x19, 0x14, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x56, 0x13, 0xf2, 0x22, 0x7a, 0x95, 0x9b, 0xce, 0xbb, 0xd6, 0x1e, 0xc7, 0xb7, 0x5c, 0x75, 0x13, 0x97, 0x0b, 0xf9, 0x13, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x97, 0x03, 0x98, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x57, 0x03, 0x15, 0x13, 0xb1, 0x22, 0x9a, 0x9d, 0x7a, 0xd6, 0x9a, 0xde, 0xdd, 0xce, 0x5a, 0x85, 0x34, 0x1b, 0x77, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0x15, 0x03, 0xd2, 0x12, 0xb6, 0x7c, 0xdf, 0xc6, 0x34, 0x1b, 0x77, 0x0b, 0x56, 0x0b, 0xb8, 0x1b, 0x36, 0x03, 0x37, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x36, 0x03, + 0x3a, 0x0b, 0x3a, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x5a, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x38, 0x03, 0x37, 0x0b, 0xd5, 0x0a, 0x18, 0x54, 0xfe, 0xd6, 0x3d, 0xef, 0x3c, 0xef, 0x9f, 0xdf, 0xb5, 0x2b, 0x58, 0x0b, 0x79, 0x13, 0x99, 0x13, 0x1b, 0x2c, 0x99, 0x1b, 0x79, 0x13, 0x38, 0x0b, 0x18, 0x03, 0x38, 0x03, 0x1b, 0x24, 0xde, 0x3c, 0x7c, 0x2c, 0xda, 0x1b, 0xb9, 0x13, 0x99, 0x13, 0xbe, 0x34, 0x3c, 0x24, 0xba, 0x13, 0x58, 0x0b, 0x17, 0x0b, 0xf6, 0x0a, 0xf6, 0x12, 0x75, 0x3b, 0xbd, 0xce, 0xbb, 0xe6, 0x3c, 0xef, 0x5f, 0xdf, 0xb7, 0x4b, 0x55, 0x0a, 0x57, 0x0a, 0x58, 0x0a, 0x38, 0x02, 0x18, 0x02, 0x18, 0x0a, 0xf8, 0x09, 0x18, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0x18, 0x0a, 0xf7, 0x01, 0x17, 0x02, 0x38, 0x02, 0x18, 0x02, 0x18, 0x02, 0x17, 0x02, 0x17, 0x02, 0x37, 0x02, 0x17, 0x02, 0x17, 0x02, 0x16, 0x02, 0xd1, 0x09, 0x1c, 0xb6, 0xfc, 0xde, 0x1c, 0xe7, 0x3e, 0xe7, 0x5f, 0xd7, 0x34, 0x3b, 0x55, 0x12, 0x57, 0x02, 0x37, 0x02, 0x17, 0x02, 0x18, 0x02, 0x18, 0x0a, 0x18, 0x02, 0x18, 0x02, 0xf8, 0x01, 0xf7, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x09, 0x18, 0x0a, 0x37, 0x02, 0x36, 0x02, 0xf5, 0x01, 0xd2, 0x11, 0xb4, 0x63, 0x7c, 0xce, 0xdc, 0xde, 0x3d, 0xdf, 0x7f, 0xc7, 0xd5, 0x33, 0x18, 0x14, 0x19, 0x0c, 0xf9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x14, 0x1b, 0xdb, 0xa5, 0xdc, 0xde, 0xdb, 0xe6, 0x3e, 0xdf, 0x5e, 0x9e, 0x75, 0x1b, 0xd7, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x14, 0x1b, 0xfb, 0xad, 0xbc, 0xde, 0xbb, 0xde, 0x3f, 0xdf, 0x18, 0x5c, 0x14, 0x0a, 0x15, 0x02, 0x37, 0x02, 0x37, 0x02, 0x17, 0x02, 0x38, 0x02, 0x59, 0x0a, 0x78, 0x02, 0x58, 0x02, 0x38, 0x0a, 0x18, 0x0a, 0xf7, 0x09, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0x95, 0x09, 0x74, 0x09, 0x93, 0x09, 0x52, 0x32, 0xbd, 0xd6, 0x9a, 0xde, 0xbb, 0xde, 0xff, 0xce, 0xd6, 0x2b, 0xb8, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x16, 0x0b, 0xd2, 0x1a, 0x5a, 0x8d, 0x7b, 0xc6, 0xbb, 0xde, 0xba, 0xde, 0x3e, 0xcf, 0x57, 0x44, 0x97, 0x13, 0xb7, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x56, 0x13, 0xf3, 0x22, 0x7a, 0x8d, 0xbc, 0xce, 0xbb, 0xd6, 0x1e, 0xbf, 0xb3, 0x3b, 0x96, 0x13, 0xb8, 0x03, 0x3b, 0x1c, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x98, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0x77, 0x03, 0x57, 0x03, 0x38, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x17, 0x03, 0x57, 0x03, 0x36, 0x13, 0x91, 0x22, 0x7a, 0x95, 0x9b, 0xce, 0x9a, 0xd6, 0xfd, 0xce, 0x19, 0x7d, 0x75, 0x1b, 0x56, 0x03, 0x97, 0x0b, 0xd8, 0x13, 0x57, 0x03, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x38, 0x03, 0xf8, 0x0a, 0x18, 0x13, 0x18, 0x13, 0x18, 0x0b, 0x18, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x17, 0x0b, 0x37, 0x0b, 0xb2, 0x12, 0xd7, 0x7c, 0xbf, 0xb6, 0x55, 0x1b, 0x36, 0x03, 0x56, 0x03, 0x57, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, + 0x3a, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x5a, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x38, 0x03, 0x18, 0x0b, 0xb5, 0x0a, 0x18, 0x54, 0xff, 0xd6, 0x3d, 0xef, 0x3c, 0xef, 0x9f, 0xdf, 0xb6, 0x2b, 0x78, 0x0b, 0xb9, 0x0b, 0xba, 0x13, 0x1b, 0x1c, 0x79, 0x0b, 0x79, 0x0b, 0x38, 0x03, 0x59, 0x0b, 0x79, 0x0b, 0x38, 0x03, 0x58, 0x0b, 0xb9, 0x1b, 0xda, 0x23, 0xda, 0x1b, 0x1b, 0x24, 0x58, 0x0b, 0x58, 0x03, 0x79, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0xd6, 0x02, 0x16, 0x13, 0xd7, 0x43, 0xbd, 0xce, 0xdb, 0xe6, 0x1c, 0xe7, 0x7f, 0xd7, 0x96, 0x3b, 0x76, 0x0a, 0x57, 0x02, 0x58, 0x02, 0x38, 0x02, 0x38, 0x02, 0x18, 0x02, 0x18, 0x0a, 0x18, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0x18, 0x02, 0x18, 0x02, 0x38, 0x02, 0x38, 0x02, 0x18, 0x02, 0x18, 0x0a, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x17, 0x02, 0x16, 0x02, 0xd1, 0x09, 0x1c, 0xb6, 0xfc, 0xde, 0xfc, 0xe6, 0x3e, 0xdf, 0x7f, 0xd7, 0x75, 0x43, 0x76, 0x12, 0x58, 0x0a, 0x58, 0x0a, 0x17, 0x02, 0x17, 0x02, 0x18, 0x02, 0x38, 0x02, 0x18, 0x02, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x09, 0xf8, 0x09, 0xf7, 0x09, 0x16, 0x02, 0x36, 0x02, 0x15, 0x0a, 0xf2, 0x11, 0xf5, 0x6b, 0xbd, 0xd6, 0xfc, 0xde, 0xfd, 0xd6, 0x3f, 0xbf, 0x94, 0x23, 0xd7, 0x13, 0x1a, 0x0c, 0xd9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x34, 0x1b, 0xfb, 0xa5, 0xdd, 0xde, 0xfc, 0xe6, 0x3e, 0xdf, 0x3e, 0x96, 0x75, 0x1b, 0xd8, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0xb9, 0x0b, 0xd9, 0x03, 0xda, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0xf4, 0x12, 0xfb, 0xa5, 0x9b, 0xde, 0xdb, 0xe6, 0xfe, 0xde, 0xdb, 0x74, 0x13, 0x0a, 0xf5, 0x01, 0x37, 0x0a, 0x17, 0x02, 0xd6, 0x01, 0xd6, 0x01, 0x17, 0x02, 0x37, 0x02, 0x37, 0x02, 0x17, 0x0a, 0xf7, 0x09, 0xd7, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0x95, 0x09, 0x54, 0x01, 0x93, 0x09, 0x31, 0x2a, 0xbd, 0xd6, 0xba, 0xde, 0xdc, 0xe6, 0x1f, 0xcf, 0x95, 0x23, 0x98, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x99, 0x0b, 0xb9, 0x0b, 0x79, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x16, 0x0b, 0xb2, 0x1a, 0x39, 0x85, 0x5b, 0xc6, 0xbb, 0xde, 0xbb, 0xd6, 0xfe, 0xc6, 0xd5, 0x33, 0x97, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x13, 0xd2, 0x1a, 0x5a, 0x85, 0x7b, 0xc6, 0xbb, 0xce, 0x1e, 0xbf, 0x93, 0x33, 0xb6, 0x0b, 0xb8, 0x03, 0x5b, 0x1c, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x98, 0x0b, 0xd9, 0x0b, 0xb8, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x38, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x17, 0x03, 0x57, 0x0b, 0x36, 0x13, 0xb1, 0x1a, 0x7a, 0x95, 0x9b, 0xce, 0x9a, 0xce, 0xde, 0xce, 0xb7, 0x64, 0x55, 0x13, 0x56, 0x03, 0x97, 0x03, 0xb8, 0x13, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x58, 0x03, 0x37, 0x03, 0x36, 0x03, 0xd2, 0x0a, 0x18, 0x85, 0x9f, 0xb6, 0x55, 0x1b, 0x56, 0x03, 0x77, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, + 0x3a, 0x0b, 0x3a, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x0b, 0xd6, 0x12, 0x18, 0x54, 0xff, 0xd6, 0x5d, 0xef, 0x5c, 0xef, 0x9f, 0xd7, 0x95, 0x23, 0x78, 0x0b, 0x9a, 0x0b, 0x79, 0x0b, 0x9a, 0x0b, 0x58, 0x03, 0x59, 0x03, 0x59, 0x03, 0x39, 0x03, 0x39, 0x0b, 0x38, 0x03, 0x17, 0x03, 0x38, 0x0b, 0x58, 0x13, 0x38, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0x18, 0x03, 0x38, 0x03, 0x38, 0x0b, 0xf7, 0x02, 0x17, 0x0b, 0x16, 0x13, 0xd7, 0x43, 0xdd, 0xce, 0xfb, 0xe6, 0x1b, 0xe7, 0x7f, 0xd7, 0x76, 0x3b, 0x96, 0x0a, 0x77, 0x02, 0x58, 0x02, 0x38, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xf8, 0x01, 0x17, 0x02, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x0a, 0x18, 0x0a, 0x18, 0x02, 0x17, 0x02, 0x18, 0x02, 0x17, 0x0a, 0x16, 0x02, 0xd1, 0x09, 0x1c, 0xb6, 0xdc, 0xde, 0xfc, 0xe6, 0x1d, 0xe7, 0x3f, 0xcf, 0x54, 0x43, 0x35, 0x0a, 0x58, 0x0a, 0x38, 0x02, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0x18, 0x02, 0x18, 0x0a, 0xf8, 0x09, 0xf7, 0x09, 0x16, 0x02, 0x16, 0x02, 0x16, 0x0a, 0x13, 0x12, 0xf6, 0x6b, 0xbd, 0xd6, 0xfd, 0xe6, 0x1d, 0xd7, 0x3f, 0xbf, 0x94, 0x2b, 0xf8, 0x13, 0x1a, 0x0c, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x14, 0x1b, 0xfb, 0xa5, 0xdc, 0xde, 0xdc, 0xe6, 0x3e, 0xdf, 0x1d, 0x96, 0x55, 0x1b, 0xd8, 0x13, 0xb9, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x03, 0xf4, 0x12, 0xdb, 0xa5, 0x7a, 0xd6, 0xfc, 0xee, 0xde, 0xd6, 0x1c, 0x7d, 0xd3, 0x01, 0x36, 0x0a, 0x17, 0x0a, 0xf6, 0x09, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd6, 0x09, 0xd7, 0x09, 0xd7, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x95, 0x09, 0x74, 0x01, 0x93, 0x09, 0x11, 0x22, 0xbd, 0xd6, 0xbb, 0xde, 0xfc, 0xe6, 0xff, 0xce, 0xb6, 0x23, 0xb8, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x16, 0x0b, 0xb2, 0x1a, 0x19, 0x85, 0x1b, 0xbe, 0x9b, 0xd6, 0x9b, 0xd6, 0xbe, 0xc6, 0x95, 0x2b, 0x98, 0x13, 0xb8, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x13, 0xd2, 0x1a, 0x5a, 0x85, 0x5b, 0xc6, 0x9b, 0xce, 0xfe, 0xbe, 0x93, 0x33, 0xb6, 0x13, 0xb8, 0x03, 0x1a, 0x14, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x77, 0x03, 0x37, 0x03, 0x17, 0x03, 0x38, 0x0b, 0x38, 0x03, 0x58, 0x03, 0x38, 0x03, 0x17, 0x03, 0x57, 0x03, 0x36, 0x13, 0xb1, 0x1a, 0x7a, 0x95, 0x9c, 0xc6, 0x9b, 0xce, 0xde, 0xc6, 0x36, 0x54, 0x35, 0x0b, 0x77, 0x03, 0x97, 0x0b, 0x56, 0x03, 0x57, 0x0b, 0x17, 0x03, 0x37, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x78, 0x13, 0x56, 0x03, 0x76, 0x03, 0x76, 0x03, 0x56, 0x03, 0x55, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x15, 0x03, 0x13, 0x1b, 0x38, 0x85, 0x7e, 0xb6, 0x14, 0x13, 0x36, 0x03, 0x56, 0x03, 0x16, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x03, + 0x3a, 0x0b, 0x3a, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x38, 0x03, 0x17, 0x0b, 0xf6, 0x12, 0xf7, 0x4b, 0xff, 0xd6, 0x3d, 0xef, 0x5c, 0xef, 0x7f, 0xd7, 0x55, 0x1b, 0x79, 0x0b, 0x79, 0x0b, 0x59, 0x03, 0x38, 0x03, 0x38, 0x03, 0x39, 0x0b, 0x39, 0x03, 0x5a, 0x0b, 0x18, 0x03, 0x39, 0x03, 0x59, 0x0b, 0x17, 0x03, 0x18, 0x0b, 0x59, 0x0b, 0x18, 0x03, 0x39, 0x0b, 0x39, 0x03, 0x38, 0x03, 0x38, 0x03, 0x17, 0x0b, 0x38, 0x13, 0xf6, 0x0a, 0xd7, 0x43, 0xde, 0xce, 0xfb, 0xe6, 0x3c, 0xe7, 0x7f, 0xdf, 0xb7, 0x43, 0x96, 0x0a, 0x77, 0x0a, 0x58, 0x02, 0x38, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x0a, 0x18, 0x0a, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x0a, 0x16, 0x0a, 0xd1, 0x11, 0x1c, 0xb6, 0xfc, 0xe6, 0xfc, 0xe6, 0x3e, 0xe7, 0x5f, 0xd7, 0xb6, 0x4b, 0x35, 0x0a, 0x58, 0x0a, 0x58, 0x0a, 0x17, 0x02, 0x18, 0x02, 0xf8, 0x01, 0x18, 0x02, 0x18, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xf8, 0x01, 0x16, 0x02, 0xf5, 0x01, 0xf5, 0x01, 0xf2, 0x11, 0xd5, 0x63, 0x9d, 0xce, 0xdc, 0xde, 0x1d, 0xd7, 0x5f, 0xc7, 0xd5, 0x33, 0xd8, 0x13, 0xd9, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0x9a, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0x9a, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x78, 0x03, 0x58, 0x0b, 0xf4, 0x12, 0xfc, 0xa5, 0xbc, 0xde, 0xdc, 0xe6, 0x3e, 0xdf, 0x1d, 0x8e, 0x55, 0x1b, 0xf8, 0x1b, 0xb9, 0x0b, 0xb8, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0xf4, 0x12, 0xdb, 0xa5, 0xbb, 0xd6, 0x9b, 0xde, 0x3f, 0xe7, 0x1c, 0x7d, 0x14, 0x0a, 0x15, 0x0a, 0x17, 0x0a, 0xf7, 0x09, 0xd7, 0x09, 0xd7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xb7, 0x09, 0xd7, 0x09, 0xd7, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0x96, 0x01, 0x96, 0x01, 0xb6, 0x09, 0x94, 0x09, 0x93, 0x09, 0xf0, 0x21, 0xbd, 0xce, 0xbb, 0xde, 0xfc, 0xde, 0xbe, 0xbe, 0x75, 0x1b, 0x98, 0x03, 0xb8, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x58, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x16, 0x0b, 0xb2, 0x1a, 0x39, 0x85, 0x7c, 0xc6, 0xbb, 0xde, 0xbb, 0xde, 0xfe, 0xce, 0xb5, 0x2b, 0x97, 0x13, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x56, 0x13, 0xf3, 0x22, 0x3a, 0x85, 0x7c, 0xce, 0x9c, 0xce, 0xde, 0xbe, 0x93, 0x33, 0x96, 0x13, 0xb8, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x38, 0x0b, 0x38, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x15, 0x0b, 0xb1, 0x1a, 0x9b, 0x95, 0x9c, 0xc6, 0xbb, 0xce, 0xde, 0xc6, 0x16, 0x54, 0x35, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x36, 0x03, 0x78, 0x0b, 0x38, 0x0b, 0x58, 0x0b, 0x38, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x17, 0x03, 0x37, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0x16, 0x0b, 0xf5, 0x0a, 0x54, 0x2b, 0x79, 0x95, 0xbf, 0xbe, 0x34, 0x1b, 0x77, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, + 0x3a, 0x0b, 0x3a, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x38, 0x03, 0x17, 0x0b, 0xf5, 0x12, 0xd6, 0x4b, 0xfe, 0xd6, 0x3d, 0xef, 0x5c, 0xef, 0x3e, 0xcf, 0x34, 0x1b, 0x99, 0x0b, 0x99, 0x0b, 0x59, 0x0b, 0x18, 0x0b, 0x38, 0x0b, 0x39, 0x0b, 0x19, 0x0b, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0xf8, 0x02, 0x18, 0x03, 0x18, 0x0b, 0x18, 0x03, 0x39, 0x0b, 0x18, 0x03, 0x39, 0x03, 0x79, 0x0b, 0x38, 0x03, 0x58, 0x0b, 0x17, 0x0b, 0xf6, 0x0a, 0xf7, 0x43, 0xde, 0xce, 0xdb, 0xe6, 0x5c, 0xef, 0x7f, 0xdf, 0xf8, 0x4b, 0x76, 0x0a, 0x77, 0x0a, 0x58, 0x02, 0x38, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0x18, 0x0a, 0x18, 0x02, 0x17, 0x02, 0x18, 0x02, 0x18, 0x0a, 0x38, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x0a, 0x16, 0x0a, 0xd1, 0x11, 0x3c, 0xb6, 0x1c, 0xe7, 0x1c, 0xef, 0x3e, 0xe7, 0x7f, 0xdf, 0xf7, 0x5b, 0x35, 0x0a, 0x58, 0x0a, 0x38, 0x0a, 0x17, 0x02, 0x18, 0x02, 0xf8, 0x01, 0x18, 0x02, 0x18, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0x18, 0x02, 0xf8, 0x01, 0xf8, 0x09, 0xf8, 0x09, 0x16, 0x02, 0x16, 0x02, 0x16, 0x0a, 0x33, 0x1a, 0x57, 0x74, 0xde, 0xd6, 0xfc, 0xde, 0x1d, 0xd7, 0x7f, 0xc7, 0xd6, 0x33, 0xf8, 0x13, 0x98, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x79, 0x03, 0xb9, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x14, 0x1b, 0xfc, 0xa5, 0xbc, 0xde, 0xfc, 0xe6, 0x3e, 0xdf, 0xfd, 0x8d, 0x55, 0x1b, 0xd8, 0x13, 0xb9, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xba, 0x03, 0xba, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x14, 0x13, 0xfb, 0xa5, 0xbc, 0xd6, 0x9b, 0xd6, 0x1f, 0xd7, 0xff, 0x95, 0x14, 0x0a, 0xf6, 0x01, 0x17, 0x0a, 0xf8, 0x09, 0xd7, 0x09, 0xb7, 0x01, 0xb8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd8, 0x09, 0xb7, 0x09, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x96, 0x01, 0x95, 0x01, 0x74, 0x01, 0x93, 0x01, 0xb0, 0x19, 0xbd, 0xce, 0xdb, 0xde, 0xfc, 0xe6, 0xbd, 0xbe, 0x75, 0x1b, 0xb8, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0xb9, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x0b, 0xd2, 0x1a, 0x39, 0x85, 0x5b, 0xc6, 0x7a, 0xd6, 0xdb, 0xde, 0x1f, 0xcf, 0xf6, 0x3b, 0xb8, 0x13, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x36, 0x0b, 0xf3, 0x22, 0xf9, 0x84, 0x7c, 0xce, 0x9c, 0xce, 0xfe, 0xc6, 0xb4, 0x3b, 0xb6, 0x1b, 0xb8, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x77, 0x03, 0x98, 0x0b, 0x58, 0x0b, 0x18, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0x57, 0x03, 0x15, 0x0b, 0xb2, 0x1a, 0xbb, 0x9d, 0x9c, 0xc6, 0x9b, 0xce, 0xfe, 0xce, 0x36, 0x5c, 0x15, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x38, 0x03, 0x18, 0x03, 0x38, 0x0b, 0x17, 0x03, 0x58, 0x03, 0x78, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x37, 0x03, 0x36, 0x03, 0x37, 0x0b, 0x16, 0x13, 0x15, 0x0b, 0x74, 0x2b, 0xba, 0x9d, 0xbf, 0xbe, 0x75, 0x1b, 0x56, 0x03, 0x77, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x16, 0x03, + 0x7a, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x59, 0x03, 0x19, 0x03, 0x39, 0x03, 0x5a, 0x0b, 0x19, 0x03, 0x5a, 0x0b, 0x3a, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x18, 0x03, 0xf6, 0x0a, 0xd4, 0x12, 0x37, 0x5c, 0x1f, 0xdf, 0x1d, 0xef, 0x5d, 0xef, 0x9f, 0xdf, 0xb6, 0x2b, 0x78, 0x0b, 0x9a, 0x0b, 0x59, 0x0b, 0x5a, 0x0b, 0x5a, 0x0b, 0x59, 0x0b, 0x39, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x59, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x38, 0x03, 0x59, 0x03, 0x18, 0x03, 0x18, 0x0b, 0x95, 0x0a, 0xf7, 0x53, 0xdd, 0xce, 0x1b, 0xe7, 0x3c, 0xef, 0x3f, 0xdf, 0xda, 0x6c, 0x95, 0x0a, 0x77, 0x02, 0x58, 0x02, 0x18, 0x02, 0x18, 0x02, 0x37, 0x02, 0x37, 0x02, 0x38, 0x02, 0x17, 0x02, 0x17, 0x0a, 0x37, 0x0a, 0x17, 0x02, 0x18, 0x02, 0x38, 0x02, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x37, 0x02, 0x17, 0x02, 0x17, 0x0a, 0x16, 0x0a, 0x15, 0x0a, 0xd1, 0x11, 0x7d, 0xc6, 0x1d, 0xe7, 0x1c, 0xe7, 0x1e, 0xe7, 0x7f, 0xdf, 0x34, 0x43, 0x75, 0x0a, 0x58, 0x0a, 0x58, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xf8, 0x01, 0x18, 0x02, 0xf7, 0x01, 0x38, 0x02, 0x79, 0x0a, 0x98, 0x0a, 0x37, 0x02, 0xf7, 0x01, 0x18, 0x0a, 0x17, 0x02, 0x17, 0x02, 0x38, 0x0a, 0x38, 0x0a, 0x17, 0x02, 0xf6, 0x01, 0x15, 0x02, 0x12, 0x12, 0xf5, 0x63, 0xde, 0xd6, 0xdb, 0xde, 0xdc, 0xd6, 0x7f, 0xc7, 0xd6, 0x33, 0x97, 0x13, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x14, 0x1b, 0xfb, 0x9d, 0xfd, 0xde, 0xfb, 0xde, 0x3e, 0xd7, 0x3d, 0x8e, 0x75, 0x1b, 0xd8, 0x13, 0xb8, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x14, 0x13, 0xda, 0x9d, 0xbb, 0xd6, 0xbb, 0xde, 0x1f, 0xdf, 0x39, 0x64, 0xf3, 0x09, 0x15, 0x02, 0x57, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x97, 0x01, 0x97, 0x01, 0x96, 0x01, 0x96, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x94, 0x01, 0x94, 0x01, 0x73, 0x09, 0x70, 0x19, 0x7d, 0xce, 0xbb, 0xe6, 0xfc, 0xe6, 0xbd, 0xbe, 0x75, 0x1b, 0xd9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x16, 0x0b, 0xb3, 0x1a, 0x1a, 0x85, 0x5c, 0xce, 0x9b, 0xde, 0x9c, 0xde, 0xff, 0xc6, 0xb5, 0x2b, 0x97, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x77, 0x03, 0x56, 0x13, 0xf3, 0x1a, 0xf9, 0x7c, 0x9b, 0xce, 0x7a, 0xce, 0x9e, 0xb6, 0x36, 0x4c, 0xb6, 0x13, 0x97, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x37, 0x0b, 0x15, 0x13, 0x91, 0x1a, 0x9a, 0x9d, 0x7b, 0xce, 0x9b, 0xce, 0x1f, 0xb7, 0x15, 0x3c, 0x54, 0x0b, 0x77, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x17, 0x03, 0x58, 0x03, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x0b, 0x15, 0x13, 0x70, 0x1a, 0xda, 0xa5, 0x7d, 0xb6, 0x95, 0x23, 0x36, 0x03, 0x56, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x9a, 0x13, 0x39, 0x03, 0x39, 0x03, 0x5a, 0x0b, 0x39, 0x03, 0x5a, 0x0b, 0x7a, 0x0b, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, 0x58, 0x13, 0xb4, 0x12, 0x38, 0x5c, 0x9d, 0xc6, 0x3d, 0xef, 0x3c, 0xef, 0xbf, 0xdf, 0x95, 0x23, 0x58, 0x0b, 0x99, 0x0b, 0x59, 0x03, 0x59, 0x0b, 0x39, 0x0b, 0x59, 0x0b, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x59, 0x0b, 0x39, 0x03, 0xf8, 0x02, 0x18, 0x0b, 0xd6, 0x12, 0x75, 0x43, 0xdd, 0xce, 0xfb, 0xe6, 0x1c, 0xe7, 0x5f, 0xdf, 0x79, 0x5c, 0x95, 0x0a, 0x98, 0x0a, 0x78, 0x02, 0x17, 0x02, 0x17, 0x02, 0x37, 0x02, 0x38, 0x02, 0x38, 0x02, 0x18, 0x02, 0x17, 0x02, 0x17, 0x0a, 0xf7, 0x01, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x0a, 0xf6, 0x09, 0xf5, 0x09, 0xd1, 0x11, 0x5c, 0xbe, 0xfc, 0xe6, 0x1c, 0xe7, 0x3e, 0xe7, 0x7f, 0xdf, 0x34, 0x43, 0x55, 0x0a, 0x37, 0x02, 0x37, 0x02, 0x17, 0x02, 0xf7, 0x09, 0x18, 0x0a, 0x18, 0x02, 0x18, 0x02, 0x59, 0x0a, 0xda, 0x12, 0xda, 0x12, 0x98, 0x0a, 0x38, 0x0a, 0x18, 0x0a, 0x17, 0x02, 0x17, 0x02, 0x38, 0x0a, 0x38, 0x0a, 0x17, 0x02, 0xf6, 0x01, 0x15, 0x02, 0xf2, 0x09, 0xf6, 0x6b, 0xde, 0xd6, 0xfc, 0xe6, 0xfd, 0xde, 0x7f, 0xc7, 0xd6, 0x33, 0x97, 0x13, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x57, 0x03, 0x14, 0x1b, 0xdb, 0x9d, 0xdd, 0xde, 0xfb, 0xde, 0x3e, 0xd7, 0x5e, 0x96, 0x75, 0x1b, 0xd8, 0x13, 0xb9, 0x03, 0xb8, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0xf4, 0x12, 0xba, 0x9d, 0xbb, 0xd6, 0xdb, 0xe6, 0xff, 0xde, 0x18, 0x5c, 0xf4, 0x09, 0x15, 0x02, 0x37, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x97, 0x01, 0x97, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb5, 0x01, 0xb5, 0x09, 0x74, 0x09, 0x71, 0x19, 0x5d, 0xce, 0x9b, 0xde, 0xdc, 0xde, 0x9d, 0xbe, 0x75, 0x1b, 0xd9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x36, 0x13, 0xf3, 0x1a, 0x5b, 0x8d, 0x7c, 0xce, 0x9b, 0xde, 0x9b, 0xde, 0x1f, 0xcf, 0xf6, 0x33, 0xd8, 0x13, 0xb8, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x35, 0x0b, 0xd3, 0x1a, 0xf9, 0x7c, 0xbc, 0xd6, 0xdc, 0xde, 0x5c, 0xae, 0xd5, 0x3b, 0xb6, 0x13, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x79, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0x15, 0x13, 0x91, 0x22, 0xbb, 0x9d, 0x9b, 0xce, 0x9b, 0xce, 0x1f, 0xbf, 0xf5, 0x3b, 0x55, 0x0b, 0x77, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x0b, 0xf4, 0x0a, 0xb9, 0x5c, 0x7c, 0xb6, 0x5c, 0xae, 0x95, 0x23, 0x77, 0x0b, 0x76, 0x03, 0x36, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x9a, 0x13, 0x59, 0x03, 0x39, 0x03, 0x59, 0x0b, 0x39, 0x03, 0x5a, 0x0b, 0x5a, 0x0b, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x38, 0x0b, 0xb5, 0x02, 0xb4, 0x12, 0x79, 0x64, 0x1f, 0xdf, 0xfc, 0xe6, 0x1c, 0xe7, 0x3f, 0xcf, 0x74, 0x23, 0x58, 0x0b, 0x99, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x1a, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x0b, 0x38, 0x03, 0x39, 0x03, 0x59, 0x03, 0x18, 0x03, 0xd7, 0x02, 0xb5, 0x12, 0x75, 0x43, 0xbd, 0xce, 0xdb, 0xde, 0x1c, 0xe7, 0x9f, 0xe7, 0xf7, 0x4b, 0x75, 0x0a, 0x98, 0x0a, 0x58, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x38, 0x02, 0x39, 0x02, 0x38, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x01, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x16, 0x02, 0xf6, 0x01, 0xd6, 0x01, 0xf5, 0x09, 0x12, 0x1a, 0x9d, 0xc6, 0xfc, 0xe6, 0xfc, 0xe6, 0x1d, 0xe7, 0x9f, 0xdf, 0x54, 0x43, 0x55, 0x12, 0x37, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0x18, 0x02, 0x58, 0x0a, 0x78, 0x0a, 0x58, 0x0a, 0xf8, 0x01, 0xd7, 0x01, 0x18, 0x02, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x17, 0x02, 0xf6, 0x01, 0x15, 0x02, 0xd2, 0x09, 0xd5, 0x63, 0xbd, 0xd6, 0xfc, 0xe6, 0x1d, 0xdf, 0x5f, 0xbf, 0x94, 0x2b, 0x97, 0x13, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x14, 0x1b, 0xfb, 0xa5, 0xdd, 0xde, 0xfc, 0xde, 0x3e, 0xd7, 0x5e, 0x96, 0x95, 0x1b, 0xd8, 0x13, 0xb8, 0x03, 0xb8, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x78, 0x03, 0xf4, 0x12, 0x9a, 0x95, 0xbc, 0xde, 0xdc, 0xe6, 0xff, 0xde, 0xf8, 0x5b, 0x14, 0x0a, 0x36, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd5, 0x09, 0x94, 0x09, 0x91, 0x19, 0x5d, 0xce, 0x9b, 0xde, 0xdc, 0xde, 0x9d, 0xb6, 0x75, 0x1b, 0xd9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x36, 0x0b, 0xd3, 0x1a, 0x3a, 0x85, 0x7b, 0xce, 0x9a, 0xde, 0x9b, 0xde, 0x1f, 0xcf, 0xf6, 0x2b, 0xd8, 0x13, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x77, 0x03, 0x35, 0x0b, 0x14, 0x1b, 0xf9, 0x7c, 0x5a, 0xc6, 0xbb, 0xd6, 0x3c, 0xa6, 0x36, 0x44, 0xb6, 0x13, 0x98, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x38, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x36, 0x03, 0x15, 0x13, 0x91, 0x22, 0xbb, 0xa5, 0x7b, 0xce, 0x5b, 0xce, 0xde, 0xb6, 0x73, 0x33, 0x34, 0x0b, 0x56, 0x03, 0x57, 0x03, 0x38, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x0b, 0x35, 0x13, 0xf6, 0x43, 0xfa, 0xa5, 0xde, 0xbe, 0x95, 0x23, 0x15, 0x03, 0x97, 0x0b, 0x56, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x59, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x5a, 0x0b, 0x39, 0x0b, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x0b, 0x38, 0x0b, 0xd6, 0x0a, 0xd5, 0x1a, 0x1f, 0x9e, 0xbd, 0xd6, 0x7e, 0xff, 0x5d, 0xef, 0x9f, 0xdf, 0x95, 0x23, 0x78, 0x0b, 0x99, 0x0b, 0x59, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x0b, 0x18, 0x03, 0x19, 0x03, 0x59, 0x0b, 0x18, 0x03, 0xd7, 0x02, 0x95, 0x0a, 0x17, 0x54, 0xbd, 0xce, 0xdb, 0xde, 0x1c, 0xe7, 0x7f, 0xe7, 0xd7, 0x4b, 0x75, 0x0a, 0x98, 0x0a, 0x38, 0x02, 0x38, 0x02, 0x18, 0x02, 0x17, 0x02, 0x38, 0x02, 0x39, 0x02, 0x38, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0x18, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x16, 0x02, 0xf6, 0x01, 0xd5, 0x01, 0x15, 0x0a, 0x73, 0x2a, 0xbd, 0xce, 0xfb, 0xe6, 0xfb, 0xe6, 0x1d, 0xe7, 0x7f, 0xdf, 0x54, 0x43, 0x55, 0x12, 0x37, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xd7, 0x01, 0x18, 0x0a, 0x18, 0x02, 0xf8, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0xf8, 0x01, 0xd8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x18, 0x02, 0x18, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf5, 0x01, 0xd2, 0x09, 0xd6, 0x63, 0xbe, 0xd6, 0xfc, 0xe6, 0x1d, 0xdf, 0x5f, 0xbf, 0x94, 0x2b, 0xb8, 0x13, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x14, 0x13, 0xfb, 0xa5, 0xdc, 0xde, 0xfc, 0xe6, 0x3e, 0xdf, 0x3d, 0x8e, 0x75, 0x1b, 0xd8, 0x13, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x14, 0x13, 0x9a, 0x95, 0xbc, 0xd6, 0xdc, 0xe6, 0xff, 0xde, 0xd8, 0x53, 0x14, 0x0a, 0x36, 0x0a, 0x37, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xb5, 0x09, 0x95, 0x09, 0x71, 0x11, 0x5d, 0xc6, 0xbb, 0xde, 0xdc, 0xde, 0xde, 0xbe, 0x75, 0x1b, 0xb8, 0x0b, 0xb8, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x98, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x37, 0x03, 0x16, 0x0b, 0xb2, 0x1a, 0x1a, 0x85, 0x3a, 0xc6, 0x9a, 0xde, 0xbb, 0xde, 0x1e, 0xcf, 0xd5, 0x2b, 0xb7, 0x0b, 0xb8, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x0b, 0x34, 0x23, 0x19, 0x7d, 0x3a, 0xbe, 0x7a, 0xce, 0x5d, 0xae, 0x98, 0x54, 0xb6, 0x13, 0xb8, 0x03, 0x98, 0x03, 0x79, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x38, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x16, 0x03, 0xf4, 0x0a, 0x91, 0x22, 0xdb, 0xa5, 0x7b, 0xd6, 0x5b, 0xce, 0xff, 0xbe, 0x53, 0x2b, 0x55, 0x13, 0x57, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x16, 0x0b, 0x15, 0x13, 0x33, 0x33, 0x1b, 0xae, 0x7c, 0xb6, 0x95, 0x2b, 0x56, 0x0b, 0x56, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x3a, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xd7, 0x02, 0x17, 0x13, 0xb4, 0x12, 0xf7, 0x5b, 0x3f, 0xe7, 0x1d, 0xf7, 0x1c, 0xe7, 0x9f, 0xdf, 0x95, 0x2b, 0x78, 0x0b, 0x99, 0x0b, 0x59, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x39, 0x03, 0xf8, 0x02, 0x38, 0x13, 0x94, 0x0a, 0x58, 0x64, 0xdd, 0xce, 0xfc, 0xe6, 0x1d, 0xe7, 0x5f, 0xdf, 0x58, 0x54, 0x95, 0x0a, 0x98, 0x0a, 0x59, 0x02, 0x38, 0x02, 0x18, 0x02, 0x17, 0x02, 0x38, 0x02, 0x38, 0x02, 0x38, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x16, 0x02, 0x16, 0x0a, 0xd5, 0x09, 0xf4, 0x09, 0x73, 0x2a, 0x9d, 0xc6, 0xdb, 0xde, 0xfb, 0xe6, 0x3d, 0xe7, 0x5f, 0xd7, 0x14, 0x3b, 0x35, 0x0a, 0x37, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x09, 0xf7, 0x01, 0x18, 0x0a, 0x18, 0x0a, 0x18, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf8, 0x09, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x18, 0x02, 0x18, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf5, 0x01, 0xd2, 0x09, 0xd6, 0x63, 0xbe, 0xd6, 0xdc, 0xde, 0x1d, 0xdf, 0x5f, 0xbf, 0x94, 0x2b, 0xb7, 0x13, 0x98, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x0b, 0xf4, 0x12, 0xfb, 0xa5, 0xbc, 0xd6, 0xfc, 0xe6, 0x3e, 0xd7, 0xfd, 0x85, 0x75, 0x1b, 0xf9, 0x13, 0xb8, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x14, 0x13, 0x9a, 0x95, 0x9c, 0xd6, 0xbb, 0xde, 0x1f, 0xdf, 0xd7, 0x53, 0xf4, 0x09, 0x36, 0x02, 0x37, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xd7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xb5, 0x01, 0x95, 0x09, 0x71, 0x11, 0x5d, 0xc6, 0xbb, 0xde, 0xfc, 0xde, 0xfe, 0xbe, 0x95, 0x1b, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x36, 0x0b, 0xd3, 0x1a, 0x1a, 0x85, 0x5b, 0xc6, 0xbb, 0xde, 0xdc, 0xde, 0x1f, 0xcf, 0xd5, 0x2b, 0xb7, 0x0b, 0xb7, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x56, 0x0b, 0xf3, 0x1a, 0x19, 0x7d, 0x9b, 0xce, 0xbb, 0xd6, 0x9e, 0xb6, 0x36, 0x44, 0xb7, 0x13, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x38, 0x03, 0x37, 0x03, 0x38, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0xf4, 0x0a, 0x91, 0x22, 0xfc, 0xa5, 0x7b, 0xce, 0x7b, 0xce, 0x1f, 0xc7, 0x73, 0x33, 0x75, 0x13, 0x57, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x37, 0x0b, 0x17, 0x03, 0x16, 0x0b, 0x15, 0x13, 0x33, 0x33, 0x7c, 0xb6, 0x5c, 0xae, 0x75, 0x23, 0x97, 0x13, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x3a, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x58, 0x13, 0xf6, 0x0a, 0x93, 0x12, 0x99, 0x6c, 0xfe, 0xde, 0x5e, 0xf7, 0x5d, 0xf7, 0x7f, 0xdf, 0x95, 0x2b, 0x78, 0x0b, 0x99, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x18, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x18, 0x0b, 0x39, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x38, 0x0b, 0x17, 0x13, 0x93, 0x12, 0x98, 0x64, 0xdd, 0xce, 0x1c, 0xe7, 0x3d, 0xef, 0x5f, 0xdf, 0xba, 0x64, 0xb6, 0x12, 0xb8, 0x0a, 0x99, 0x0a, 0x38, 0x02, 0x18, 0x02, 0x17, 0x02, 0x18, 0x02, 0x38, 0x02, 0x18, 0x02, 0x18, 0x02, 0xf7, 0x09, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x17, 0x0a, 0xf6, 0x09, 0xf5, 0x09, 0x94, 0x32, 0x9d, 0xce, 0xdb, 0xe6, 0x1c, 0xe7, 0x3d, 0xe7, 0x7f, 0xdf, 0x34, 0x43, 0x55, 0x0a, 0x37, 0x02, 0x37, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x09, 0xd7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x38, 0x0a, 0x18, 0x0a, 0xf7, 0x01, 0xf7, 0x01, 0xf5, 0x01, 0xd2, 0x09, 0x94, 0x5b, 0xbe, 0xd6, 0xdc, 0xde, 0xfd, 0xd6, 0x3f, 0xbf, 0x74, 0x23, 0xb7, 0x13, 0x78, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x0b, 0xf4, 0x12, 0x1c, 0xa6, 0xbc, 0xd6, 0xfc, 0xe6, 0x3e, 0xdf, 0xdc, 0x85, 0x75, 0x1b, 0x19, 0x1c, 0xd9, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x14, 0x13, 0x79, 0x95, 0x9b, 0xce, 0xbb, 0xde, 0x1f, 0xdf, 0xb7, 0x53, 0xf4, 0x09, 0x36, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xd7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0x95, 0x01, 0x95, 0x09, 0x71, 0x11, 0x3d, 0xc6, 0xbb, 0xde, 0xdc, 0xde, 0xfe, 0xc6, 0x95, 0x1b, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x59, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x57, 0x03, 0x36, 0x0b, 0xd3, 0x1a, 0x1a, 0x85, 0x5b, 0xc6, 0xbb, 0xde, 0xbb, 0xde, 0x1f, 0xcf, 0xd5, 0x2b, 0xd7, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x13, 0xd3, 0x1a, 0xd8, 0x74, 0x9c, 0xce, 0xbb, 0xd6, 0xbe, 0xb6, 0xd5, 0x3b, 0xb6, 0x13, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x38, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0xf4, 0x12, 0xb1, 0x22, 0x1c, 0xae, 0x5b, 0xce, 0x7b, 0xce, 0x1f, 0xbf, 0x53, 0x2b, 0x55, 0x13, 0x57, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0x16, 0x0b, 0xf4, 0x12, 0x74, 0x33, 0x5c, 0xb6, 0xbe, 0xbe, 0x54, 0x23, 0x56, 0x0b, 0x16, 0x03, 0x57, 0x0b, 0x36, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x5a, 0x0b, 0x5a, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf7, 0x02, 0xf6, 0x0a, 0xd4, 0x1a, 0xde, 0x95, 0xbd, 0xd6, 0x3d, 0xf7, 0xfb, 0xe6, 0xff, 0xe7, 0x95, 0x2b, 0x78, 0x0b, 0x79, 0x0b, 0x38, 0x03, 0x39, 0x03, 0x19, 0x03, 0x38, 0x03, 0x18, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x0b, 0xf8, 0x02, 0xf8, 0x02, 0x39, 0x0b, 0x59, 0x13, 0xd5, 0x0a, 0x55, 0x2b, 0xb8, 0x6c, 0xfd, 0xd6, 0x1c, 0xe7, 0x3c, 0xef, 0x5f, 0xdf, 0x99, 0x64, 0x95, 0x0a, 0xb8, 0x0a, 0x99, 0x0a, 0x38, 0x02, 0x18, 0x02, 0x37, 0x02, 0x37, 0x02, 0x38, 0x02, 0x18, 0x02, 0x17, 0x02, 0x17, 0x0a, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x17, 0x02, 0x37, 0x02, 0x37, 0x02, 0x17, 0x02, 0xf6, 0x09, 0xf5, 0x09, 0xd5, 0x32, 0xbe, 0xce, 0xfc, 0xe6, 0x1c, 0xe7, 0xfd, 0xde, 0x7f, 0xdf, 0x34, 0x43, 0x55, 0x0a, 0x58, 0x0a, 0x58, 0x0a, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x09, 0x17, 0x0a, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0xf8, 0x09, 0xf8, 0x09, 0x17, 0x02, 0x37, 0x02, 0x38, 0x0a, 0x38, 0x0a, 0x17, 0x02, 0x17, 0x0a, 0x15, 0x02, 0xd2, 0x09, 0x53, 0x53, 0xde, 0xd6, 0xfc, 0xe6, 0x1d, 0xdf, 0x5f, 0xc7, 0x94, 0x2b, 0xd8, 0x1b, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x14, 0x1b, 0x3c, 0xa6, 0xdc, 0xd6, 0xfc, 0xe6, 0x3e, 0xd7, 0xdc, 0x85, 0x75, 0x1b, 0x19, 0x1c, 0xb8, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x14, 0x13, 0x59, 0x8d, 0x9c, 0xd6, 0xbc, 0xde, 0x1f, 0xdf, 0x97, 0x4b, 0x14, 0x0a, 0x57, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0x96, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb5, 0x01, 0x95, 0x09, 0x50, 0x11, 0x1c, 0xc6, 0xbb, 0xde, 0xdb, 0xde, 0xfe, 0xc6, 0xb5, 0x23, 0xd8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0x59, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x37, 0x03, 0x16, 0x0b, 0xb3, 0x1a, 0xf9, 0x7c, 0x5b, 0xc6, 0x9b, 0xde, 0x9b, 0xd6, 0xde, 0xc6, 0xb5, 0x23, 0xb7, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x03, 0x77, 0x03, 0x56, 0x13, 0x14, 0x1b, 0x77, 0x6c, 0x5a, 0xc6, 0x7a, 0xce, 0x7d, 0xae, 0xd5, 0x3b, 0xd7, 0x13, 0xd8, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x97, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x57, 0x0b, 0x36, 0x03, 0x14, 0x13, 0xb1, 0x22, 0x1c, 0xae, 0x7b, 0xce, 0xbc, 0xce, 0x1f, 0xbf, 0x53, 0x2b, 0x75, 0x13, 0x97, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x16, 0x0b, 0xd4, 0x12, 0x58, 0x54, 0x9d, 0xbe, 0x9d, 0xbe, 0x95, 0x2b, 0x57, 0x13, 0xf5, 0x02, 0x57, 0x0b, 0x36, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x19, 0x03, 0x39, 0x0b, 0x3a, 0x0b, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x5a, 0x0b, 0x5a, 0x0b, 0x59, 0x0b, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x0b, 0xd6, 0x0a, 0xb4, 0x12, 0x5c, 0x85, 0xde, 0xd6, 0x3d, 0xf7, 0x3c, 0xef, 0x9f, 0xdf, 0x95, 0x2b, 0x78, 0x0b, 0x79, 0x0b, 0x38, 0x03, 0x19, 0x03, 0x19, 0x03, 0x38, 0x03, 0x18, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x38, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x0b, 0x19, 0x0b, 0x19, 0x0b, 0x18, 0x03, 0x58, 0x13, 0x16, 0x13, 0x79, 0x54, 0xd8, 0x74, 0x1d, 0xd7, 0xfb, 0xe6, 0x1c, 0xe7, 0x7f, 0xe7, 0x58, 0x5c, 0x74, 0x0a, 0x97, 0x0a, 0x99, 0x0a, 0x18, 0x02, 0x18, 0x02, 0x37, 0x02, 0x37, 0x02, 0x38, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x0a, 0x17, 0x02, 0x18, 0x02, 0x38, 0x02, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0x37, 0x02, 0x17, 0x02, 0x17, 0x0a, 0x16, 0x0a, 0xf5, 0x09, 0x94, 0x2a, 0x7d, 0xc6, 0xdc, 0xde, 0x1c, 0xe7, 0x1e, 0xdf, 0x3f, 0xd7, 0xf3, 0x32, 0x35, 0x0a, 0x78, 0x0a, 0x58, 0x0a, 0x17, 0x02, 0xd7, 0x01, 0xf7, 0x09, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x37, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x37, 0x0a, 0x17, 0x02, 0x17, 0x02, 0x37, 0x0a, 0x36, 0x0a, 0xd2, 0x09, 0xf2, 0x4a, 0xbe, 0xd6, 0xfc, 0xe6, 0xfd, 0xd6, 0x5f, 0xbf, 0x94, 0x2b, 0xb8, 0x13, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x03, 0x98, 0x0b, 0x14, 0x1b, 0x3c, 0xae, 0xbc, 0xd6, 0xfc, 0xde, 0x1e, 0xd7, 0xdd, 0x85, 0x75, 0x1b, 0xf9, 0x1b, 0xb8, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xd9, 0x0b, 0xda, 0x0b, 0xb9, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x14, 0x13, 0x59, 0x8d, 0x9c, 0xd6, 0x9b, 0xde, 0xdf, 0xd6, 0x36, 0x43, 0xf4, 0x09, 0x57, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x09, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb5, 0x01, 0x94, 0x01, 0x94, 0x09, 0x50, 0x11, 0x1c, 0xc6, 0xba, 0xde, 0xdb, 0xde, 0x1e, 0xc7, 0xd6, 0x23, 0xd9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x59, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x58, 0x03, 0x36, 0x13, 0xd3, 0x1a, 0x1a, 0x85, 0x5b, 0xc6, 0x9b, 0xde, 0x9b, 0xd6, 0xbe, 0xbe, 0x74, 0x1b, 0x97, 0x0b, 0xfa, 0x13, 0x3b, 0x1c, 0xb9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x16, 0x0b, 0x14, 0x23, 0x36, 0x64, 0x3a, 0xc6, 0x7a, 0xce, 0x5c, 0xae, 0xb4, 0x33, 0x17, 0x1c, 0x19, 0x14, 0xd9, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x97, 0x0b, 0x98, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x36, 0x03, 0xf4, 0x12, 0xb1, 0x22, 0xfc, 0xa5, 0x7b, 0xce, 0x9c, 0xce, 0xde, 0xb6, 0x32, 0x23, 0x55, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0xf6, 0x0a, 0x35, 0x1b, 0x54, 0x3b, 0xbd, 0xc6, 0x9d, 0xbe, 0x54, 0x23, 0x56, 0x0b, 0x77, 0x0b, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x36, 0x0b, 0x36, 0x0b, + 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x18, 0x0b, 0x59, 0x0b, 0x19, 0x0b, 0x19, 0x0b, 0xf8, 0x0a, 0xf8, 0x0a, 0xb7, 0x02, 0xf7, 0x0a, 0x16, 0x0b, 0x15, 0x13, 0xb2, 0x12, 0xdc, 0x8d, 0xfd, 0xce, 0x5d, 0xe7, 0x3d, 0xef, 0xbf, 0xef, 0xf6, 0x43, 0x36, 0x13, 0x38, 0x03, 0x7a, 0x0b, 0x18, 0x03, 0x38, 0x0b, 0x5a, 0x0b, 0x38, 0x03, 0x77, 0x0b, 0x37, 0x03, 0x38, 0x0b, 0xf9, 0x0a, 0x19, 0x0b, 0xf8, 0x0a, 0x38, 0x0b, 0x17, 0x0b, 0x18, 0x0b, 0x18, 0x0b, 0x19, 0x03, 0x18, 0x0b, 0x37, 0x0b, 0x55, 0x1b, 0xf5, 0x43, 0x96, 0x6c, 0x1d, 0xcf, 0xfb, 0xd6, 0x5c, 0xe7, 0x5e, 0xdf, 0xfa, 0x6c, 0x54, 0x02, 0xb8, 0x12, 0x78, 0x12, 0xf6, 0x11, 0xf6, 0x11, 0x38, 0x0a, 0x18, 0x02, 0x16, 0x02, 0x16, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x38, 0x0a, 0x17, 0x02, 0x18, 0x02, 0x18, 0x02, 0x37, 0x02, 0xf6, 0x01, 0xf6, 0x09, 0x16, 0x12, 0x36, 0x12, 0xd4, 0x01, 0x35, 0x0a, 0x32, 0x22, 0x7d, 0xd6, 0x7a, 0xe6, 0xfc, 0xee, 0x3f, 0xe7, 0x3f, 0xd7, 0xb3, 0x2a, 0x95, 0x12, 0x77, 0x02, 0x58, 0x02, 0x59, 0x0a, 0xd7, 0x09, 0x18, 0x12, 0x37, 0x0a, 0x16, 0x02, 0x17, 0x0a, 0xb7, 0x09, 0xb8, 0x09, 0xd8, 0x11, 0xf7, 0x01, 0x37, 0x02, 0x37, 0x02, 0x18, 0x0a, 0xf7, 0x09, 0xf7, 0x11, 0x17, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xf4, 0x09, 0x71, 0x3a, 0xde, 0xd6, 0xfb, 0xde, 0x3c, 0xd7, 0x5f, 0xbf, 0xb5, 0x23, 0xd7, 0x0b, 0xf8, 0x03, 0xb8, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x98, 0x03, 0x98, 0x0b, 0x97, 0x03, 0x77, 0x0b, 0x79, 0x13, 0xd4, 0x22, 0x3c, 0xbe, 0x9b, 0xde, 0xdc, 0xde, 0x7f, 0xd7, 0xdd, 0x7d, 0xb6, 0x1b, 0x18, 0x1c, 0x97, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x77, 0x03, 0x34, 0x13, 0x5a, 0x8d, 0xbd, 0xde, 0xbb, 0xe6, 0xff, 0xde, 0xf5, 0x32, 0x36, 0x02, 0x36, 0x02, 0x37, 0x0a, 0xb7, 0x01, 0xb8, 0x09, 0xd8, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb8, 0x09, 0xb8, 0x09, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0xb6, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0xb6, 0x09, 0xb6, 0x11, 0xb6, 0x11, 0x96, 0x09, 0xb6, 0x01, 0x92, 0x09, 0xfc, 0xbd, 0x9a, 0xde, 0x1c, 0xe7, 0xfe, 0xc6, 0xb5, 0x23, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x38, 0x13, 0x37, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x36, 0x0b, 0xd2, 0x12, 0x18, 0x7d, 0x39, 0xce, 0xba, 0xe6, 0x9b, 0xd6, 0x7e, 0xb6, 0x76, 0x23, 0xb9, 0x13, 0x98, 0x13, 0xbc, 0x34, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x57, 0x03, 0x36, 0x13, 0x14, 0x1b, 0x77, 0x6c, 0xf8, 0xc5, 0x5a, 0xd6, 0x5d, 0xae, 0xb5, 0x33, 0xb8, 0x13, 0xd9, 0x0b, 0xfc, 0x34, 0xb7, 0x0b, 0x78, 0x03, 0x9a, 0x03, 0x9a, 0x0b, 0x59, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x77, 0x03, 0x35, 0x13, 0x90, 0x1a, 0x3d, 0xae, 0x9c, 0xce, 0x9c, 0xc6, 0xff, 0xbe, 0x34, 0x2b, 0x36, 0x13, 0x98, 0x0b, 0x99, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x39, 0x0b, 0x59, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x79, 0x03, 0x59, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x17, 0x0b, 0x17, 0x13, 0xf6, 0x0a, 0x36, 0x0b, 0x15, 0x03, 0x15, 0x0b, 0xf4, 0x12, 0xb5, 0x43, 0x9d, 0xbe, 0xbe, 0xbe, 0x95, 0x23, 0x97, 0x0b, 0x15, 0x03, 0x36, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x03, 0x17, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, + 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x17, 0x03, 0x38, 0x03, 0x17, 0x03, 0x17, 0x03, 0x18, 0x03, 0x17, 0x03, 0xf7, 0x02, 0x18, 0x0b, 0x39, 0x0b, 0x18, 0x13, 0x73, 0x0a, 0xf9, 0x74, 0xdd, 0xce, 0x3c, 0xef, 0x3c, 0xf7, 0x7f, 0xef, 0xf4, 0x43, 0x75, 0x1b, 0x77, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x19, 0x1c, 0xd8, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x38, 0x03, 0x37, 0x03, 0x78, 0x03, 0x97, 0x03, 0x77, 0x03, 0x98, 0x0b, 0x99, 0x0b, 0xba, 0x0b, 0x7a, 0x03, 0x59, 0x03, 0x17, 0x0b, 0xf5, 0x12, 0x57, 0x5c, 0xdd, 0xd6, 0xfb, 0xe6, 0xfb, 0xee, 0x3f, 0xe7, 0xfb, 0x74, 0xb6, 0x12, 0x98, 0x0a, 0x38, 0x02, 0x16, 0x0a, 0x17, 0x0a, 0x37, 0x02, 0x37, 0x02, 0x36, 0x02, 0x36, 0x0a, 0x36, 0x0a, 0x36, 0x0a, 0x36, 0x0a, 0x16, 0x0a, 0xf6, 0x01, 0xf6, 0x01, 0x16, 0x02, 0x17, 0x0a, 0x17, 0x12, 0xf7, 0x09, 0x16, 0x0a, 0x16, 0x0a, 0x36, 0x0a, 0x12, 0x1a, 0x7e, 0xd6, 0xbb, 0xe6, 0xfc, 0xe6, 0xdd, 0xd6, 0xff, 0xc6, 0x92, 0x22, 0xb5, 0x0a, 0xd8, 0x02, 0x77, 0x02, 0x78, 0x02, 0x37, 0x02, 0x37, 0x0a, 0x16, 0x02, 0xf5, 0x01, 0x16, 0x02, 0x17, 0x02, 0x38, 0x0a, 0x58, 0x12, 0x36, 0x02, 0x36, 0x02, 0x77, 0x02, 0x37, 0x02, 0x16, 0x02, 0xf5, 0x01, 0xf6, 0x01, 0x16, 0x0a, 0xd6, 0x11, 0xb3, 0x11, 0x13, 0x43, 0xff, 0xce, 0xfc, 0xd6, 0x3e, 0xd7, 0xff, 0xc6, 0x75, 0x33, 0x39, 0x2c, 0x98, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x36, 0x1b, 0xbb, 0xa5, 0xdd, 0xe6, 0xfc, 0xe6, 0x3f, 0xd7, 0x1e, 0x86, 0x75, 0x13, 0xb7, 0x13, 0x97, 0x0b, 0xd9, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0xb8, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x98, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x98, 0x0b, 0xb8, 0x13, 0x77, 0x0b, 0x77, 0x0b, 0x74, 0x23, 0xb9, 0x95, 0xbb, 0xd6, 0x9a, 0xd6, 0x3f, 0xdf, 0xf5, 0x2a, 0x15, 0x02, 0x36, 0x02, 0x57, 0x0a, 0xf6, 0x01, 0xd6, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0xb6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xf5, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd7, 0x09, 0x96, 0x01, 0x72, 0x09, 0x3d, 0xc6, 0xdc, 0xe6, 0x7a, 0xde, 0x1f, 0xcf, 0x95, 0x1b, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x39, 0x03, 0x18, 0x0b, 0xd4, 0x1a, 0xd9, 0x74, 0x3a, 0xc6, 0xba, 0xde, 0xdb, 0xce, 0x7c, 0xa6, 0x95, 0x13, 0xf8, 0x03, 0xd7, 0x03, 0x5a, 0x1c, 0x98, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x13, 0x35, 0x1b, 0x37, 0x5c, 0x3b, 0xc6, 0x5b, 0xce, 0x9e, 0xae, 0xb5, 0x33, 0x96, 0x0b, 0xd7, 0x0b, 0xb9, 0x3c, 0xd6, 0x1b, 0xb6, 0x0b, 0x97, 0x03, 0x97, 0x0b, 0x98, 0x13, 0x58, 0x0b, 0x38, 0x0b, 0x58, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x38, 0x0b, 0x39, 0x0b, 0x39, 0x0b, 0x18, 0x0b, 0x18, 0x0b, 0x17, 0x03, 0x17, 0x0b, 0x16, 0x1b, 0x92, 0x2a, 0x1d, 0xb6, 0x9c, 0xce, 0xbd, 0xce, 0xdf, 0xb6, 0x33, 0x2b, 0x54, 0x13, 0xb7, 0x0b, 0x76, 0x03, 0x56, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x03, 0x56, 0x03, 0x56, 0x0b, 0x36, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0x18, 0x03, 0xf8, 0x02, 0x18, 0x03, 0xf7, 0x02, 0x16, 0x03, 0x16, 0x03, 0x15, 0x0b, 0xd4, 0x12, 0xd6, 0x4b, 0xbd, 0xc6, 0x7c, 0xb6, 0x74, 0x23, 0x97, 0x13, 0x77, 0x13, 0x16, 0x03, 0x56, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x57, 0x13, 0x37, 0x0b, 0xf6, 0x02, 0xf6, 0x02, 0x36, 0x0b, 0x36, 0x0b, 0xd5, 0x02, + 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0xb9, 0x03, 0x56, 0x0b, 0xf2, 0x12, 0x18, 0x75, 0x5d, 0xd7, 0x3b, 0xe7, 0x3b, 0xef, 0x9f, 0xe7, 0xb7, 0x5c, 0x75, 0x13, 0xb9, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x97, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x38, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x56, 0x03, 0x57, 0x0b, 0x78, 0x0b, 0x9a, 0x0b, 0x39, 0x03, 0x38, 0x0b, 0x17, 0x0b, 0x53, 0x0a, 0x99, 0x6c, 0xdd, 0xce, 0x1c, 0xe7, 0x1c, 0xe7, 0x3f, 0xdf, 0x3b, 0x6d, 0x95, 0x02, 0xf8, 0x02, 0xfa, 0x02, 0xb9, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0xd7, 0x0a, 0xd9, 0x0a, 0x98, 0x02, 0x98, 0x02, 0x99, 0x02, 0x79, 0x0a, 0x38, 0x02, 0x57, 0x02, 0x77, 0x02, 0x35, 0x02, 0x73, 0x1a, 0xde, 0xce, 0x1c, 0xe7, 0x7d, 0xe7, 0x3d, 0xd7, 0x1f, 0xbf, 0xd3, 0x22, 0xb5, 0x0a, 0xb8, 0x02, 0x97, 0x02, 0xd8, 0x0a, 0xb8, 0x0a, 0x77, 0x02, 0xb8, 0x02, 0x98, 0x02, 0xb8, 0x0a, 0x98, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x97, 0x02, 0x76, 0x02, 0x56, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x14, 0x02, 0x90, 0x01, 0x73, 0x53, 0x9c, 0xce, 0x3b, 0xdf, 0x3c, 0xd7, 0xde, 0xb6, 0xb4, 0x3b, 0xd7, 0x23, 0xd8, 0x1b, 0x19, 0x1c, 0xf9, 0x13, 0xd8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0xb8, 0x0b, 0xb7, 0x03, 0xb6, 0x03, 0x95, 0x03, 0x96, 0x0b, 0xd1, 0x12, 0xf9, 0xad, 0xba, 0xde, 0x3b, 0xe7, 0x5e, 0xd7, 0x7d, 0x86, 0x94, 0x13, 0xf8, 0x13, 0x98, 0x0b, 0x58, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x9a, 0x13, 0x99, 0x0b, 0x99, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0xf4, 0x12, 0x39, 0x8d, 0xdd, 0xde, 0x7a, 0xde, 0xfe, 0xd6, 0x55, 0x3b, 0x54, 0x0a, 0x15, 0x02, 0x57, 0x12, 0xf8, 0x09, 0xb8, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xb6, 0x09, 0xb5, 0x09, 0xb4, 0x09, 0xd5, 0x09, 0xb6, 0x09, 0xb6, 0x09, 0xb6, 0x09, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x95, 0x01, 0x95, 0x01, 0xd4, 0x09, 0x6f, 0x09, 0xfb, 0xbd, 0xba, 0xe6, 0x99, 0xde, 0xfc, 0xce, 0xb4, 0x23, 0xd8, 0x0b, 0xb7, 0x0b, 0x97, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x77, 0x03, 0x37, 0x03, 0x58, 0x03, 0x79, 0x0b, 0x18, 0x0b, 0xd6, 0x12, 0xf5, 0x22, 0x1a, 0x85, 0x3b, 0xc6, 0x9b, 0xd6, 0xdc, 0xce, 0x7d, 0xa6, 0x94, 0x13, 0xd8, 0x0b, 0xf7, 0x03, 0xd7, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x36, 0x13, 0x15, 0x23, 0xd5, 0x53, 0x5c, 0xce, 0x3b, 0xce, 0x5d, 0xae, 0xd6, 0x43, 0x97, 0x1b, 0x77, 0x13, 0xb7, 0x1b, 0x56, 0x13, 0x77, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x56, 0x03, 0x76, 0x03, 0x96, 0x03, 0x97, 0x03, 0x96, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x17, 0x03, 0x37, 0x03, 0x78, 0x0b, 0x37, 0x0b, 0xf4, 0x12, 0x70, 0x22, 0xdb, 0xa5, 0x5b, 0xce, 0xbd, 0xd6, 0xdf, 0xb6, 0x73, 0x2b, 0x33, 0x0b, 0x55, 0x0b, 0x55, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x37, 0x03, 0x38, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0xf6, 0x02, 0xf6, 0x02, 0xf5, 0x12, 0xf4, 0x1a, 0x94, 0x4b, 0x7c, 0xc6, 0xde, 0xc6, 0xb5, 0x2b, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x15, 0x03, 0x15, 0x03, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0x16, 0x0b, 0x15, 0x0b, 0x15, 0x03, 0x15, 0x0b, 0x56, 0x13, 0xb4, 0x02, 0x56, 0x13, 0x56, 0x13, 0xb4, 0x02, 0x56, 0x13, 0x15, 0x0b, + 0x38, 0x13, 0x38, 0x0b, 0x18, 0x0b, 0x18, 0x0b, 0x18, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x17, 0x03, 0x38, 0x0b, 0xf7, 0x02, 0x38, 0x0b, 0xf7, 0x02, 0xf7, 0x02, 0xd6, 0x02, 0x37, 0x1b, 0x94, 0x12, 0x72, 0x1a, 0x98, 0x74, 0x1f, 0xd7, 0x5f, 0xef, 0x5f, 0xef, 0x7f, 0xe7, 0xfa, 0x6c, 0x15, 0x1b, 0x78, 0x1b, 0x58, 0x13, 0x37, 0x0b, 0x17, 0x0b, 0x58, 0x13, 0x17, 0x0b, 0x36, 0x03, 0xf5, 0x02, 0x37, 0x0b, 0x18, 0x0b, 0xba, 0x1b, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x0a, 0xf7, 0x0a, 0xf6, 0x02, 0xd5, 0x02, 0xf5, 0x02, 0x14, 0x13, 0x91, 0x12, 0xf8, 0x74, 0xbc, 0xd6, 0xfb, 0xee, 0x3c, 0xf7, 0x3e, 0xdf, 0x9b, 0x8d, 0x31, 0x12, 0x74, 0x0a, 0x76, 0x0a, 0x55, 0x0a, 0x35, 0x02, 0x56, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x76, 0x0a, 0x77, 0x0a, 0x77, 0x12, 0x96, 0x0a, 0x35, 0x02, 0x15, 0x02, 0x56, 0x02, 0x77, 0x0a, 0x56, 0x02, 0x36, 0x0a, 0x77, 0x12, 0x76, 0x12, 0x75, 0x12, 0x33, 0x12, 0x14, 0x43, 0x7d, 0xce, 0x7a, 0xde, 0xdb, 0xe6, 0xfc, 0xde, 0x1f, 0xc7, 0x34, 0x33, 0x74, 0x0a, 0x97, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0xb7, 0x0a, 0x97, 0x0a, 0x77, 0x02, 0x76, 0x02, 0x55, 0x02, 0x54, 0x02, 0x75, 0x0a, 0x75, 0x0a, 0x97, 0x0a, 0x78, 0x02, 0x7a, 0x0a, 0x79, 0x12, 0x78, 0x0a, 0x78, 0x02, 0x77, 0x02, 0x55, 0x02, 0xf2, 0x09, 0xb6, 0x6b, 0xdf, 0xe6, 0xde, 0xe6, 0xff, 0xde, 0x9e, 0xae, 0x74, 0x2b, 0xb6, 0x1b, 0xbb, 0x34, 0x39, 0x24, 0x19, 0x1c, 0xf9, 0x1b, 0xf9, 0x1b, 0xf9, 0x1b, 0xd9, 0x13, 0xf9, 0x13, 0xf9, 0x1b, 0xd9, 0x13, 0xf9, 0x13, 0x98, 0x0b, 0xd9, 0x13, 0xd8, 0x13, 0x97, 0x0b, 0xf9, 0x13, 0xd8, 0x13, 0xb8, 0x03, 0xf9, 0x13, 0x76, 0x0b, 0xf2, 0x1a, 0x1b, 0xb6, 0xbc, 0xe6, 0xbb, 0xe6, 0x3e, 0xdf, 0xfc, 0x8d, 0x53, 0x13, 0xb7, 0x13, 0xb8, 0x0b, 0x98, 0x03, 0xb8, 0x0b, 0xd8, 0x03, 0xb7, 0x03, 0x19, 0x1c, 0xd8, 0x1b, 0x98, 0x13, 0x77, 0x0b, 0x77, 0x03, 0x97, 0x03, 0x98, 0x03, 0x97, 0x03, 0xb8, 0x03, 0x97, 0x03, 0x98, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x34, 0x1b, 0x79, 0x95, 0x5b, 0xd6, 0x9c, 0xd6, 0xff, 0xd6, 0x15, 0x3b, 0xf3, 0x01, 0x77, 0x12, 0x37, 0x0a, 0x37, 0x0a, 0x37, 0x0a, 0x35, 0x02, 0x34, 0x02, 0x34, 0x02, 0x14, 0x02, 0x13, 0x0a, 0xf3, 0x09, 0xf4, 0x11, 0xd4, 0x11, 0xd5, 0x09, 0xf5, 0x09, 0xf5, 0x09, 0xf6, 0x09, 0xf6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0x95, 0x01, 0xf5, 0x09, 0x50, 0x09, 0xfd, 0xbd, 0x7c, 0xde, 0xdc, 0xe6, 0x7d, 0xbe, 0x95, 0x23, 0xd8, 0x0b, 0xd8, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x13, 0x37, 0x13, 0x57, 0x0b, 0x37, 0x0b, 0x36, 0x13, 0xf4, 0x12, 0xd2, 0x1a, 0xb8, 0x74, 0x1a, 0xc6, 0x5b, 0xd6, 0x9d, 0xd6, 0x5e, 0xb6, 0x55, 0x23, 0x98, 0x1b, 0x98, 0x13, 0x57, 0x03, 0x98, 0x03, 0x98, 0x03, 0x97, 0x03, 0x97, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x97, 0x03, 0x97, 0x03, 0x56, 0x03, 0x76, 0x0b, 0xf6, 0x2b, 0x14, 0x4c, 0x7a, 0xbe, 0xfc, 0xd6, 0x7c, 0xae, 0xb4, 0x33, 0xd7, 0x1b, 0xd8, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x17, 0x03, 0x17, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0xf5, 0x1a, 0x91, 0x2a, 0xfc, 0xad, 0x7b, 0xce, 0xbc, 0xce, 0x7e, 0xa6, 0x54, 0x23, 0x56, 0x0b, 0x77, 0x0b, 0x58, 0x0b, 0x38, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0x37, 0x0b, 0x77, 0x0b, 0x97, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x17, 0x03, 0x17, 0x0b, 0x16, 0x0b, 0x16, 0x13, 0xb2, 0x1a, 0xd4, 0x5b, 0x7b, 0xce, 0xbd, 0xce, 0x73, 0x3b, 0x14, 0x13, 0x14, 0x03, 0x36, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x16, 0x03, 0x16, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x37, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x37, 0x0b, 0x16, 0x03, 0xf6, 0x02, + 0xdc, 0xde, 0xbb, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0xdc, 0xd6, 0xdc, 0xd6, 0xdc, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0xbb, 0xce, 0xbb, 0xd6, 0xbb, 0xce, 0xdc, 0xd6, 0xbb, 0xce, 0xdb, 0xd6, 0xbb, 0xce, 0x79, 0xc6, 0x99, 0xce, 0x99, 0xd6, 0xfa, 0xde, 0x1a, 0xe7, 0x3a, 0xef, 0x5c, 0xf7, 0x7d, 0xf7, 0x1d, 0xd7, 0xf7, 0x84, 0x15, 0x6c, 0xb4, 0x5b, 0xb8, 0x74, 0x19, 0x85, 0x1a, 0x85, 0x5b, 0x8d, 0xf8, 0x74, 0x96, 0x64, 0xd8, 0x6c, 0x98, 0x64, 0x5a, 0x75, 0x98, 0x5c, 0xb8, 0x64, 0xb8, 0x64, 0xf8, 0x74, 0xf9, 0x74, 0xb7, 0x64, 0xd7, 0x64, 0xd6, 0x64, 0xf6, 0x6c, 0xb4, 0x74, 0x19, 0xb6, 0xfc, 0xd6, 0x1b, 0xdf, 0x3c, 0xe7, 0x3d, 0xdf, 0xdd, 0xbe, 0x96, 0x6c, 0x97, 0x6c, 0x57, 0x64, 0xf6, 0x53, 0xb5, 0x4b, 0xb5, 0x43, 0xb5, 0x43, 0x95, 0x43, 0x55, 0x3b, 0x14, 0x33, 0x15, 0x33, 0xf3, 0x2a, 0x17, 0x54, 0x99, 0x64, 0xf7, 0x4b, 0x54, 0x33, 0x33, 0x2b, 0x13, 0x33, 0xb1, 0x2a, 0xf2, 0x2a, 0x32, 0x3b, 0x93, 0x4b, 0x38, 0x8d, 0xdc, 0xd6, 0xdb, 0xde, 0x1b, 0xe7, 0x1d, 0xe7, 0x1f, 0xcf, 0x3a, 0x85, 0xf8, 0x4b, 0xb5, 0x22, 0xf4, 0x22, 0x96, 0x33, 0xd4, 0x22, 0xb0, 0x01, 0xd2, 0x01, 0x33, 0x12, 0x56, 0x2b, 0x39, 0x4c, 0xda, 0x5c, 0x9a, 0x5c, 0xb7, 0x43, 0x35, 0x33, 0xd3, 0x32, 0x72, 0x2a, 0x32, 0x12, 0xf3, 0x09, 0xf5, 0x09, 0x36, 0x1a, 0xd6, 0x32, 0x35, 0x53, 0x79, 0xa5, 0xdb, 0xde, 0x1a, 0xe7, 0x3c, 0xe7, 0x1d, 0xcf, 0x7a, 0x85, 0xd3, 0x1a, 0xf5, 0x12, 0x35, 0x0b, 0x35, 0x0b, 0x55, 0x0b, 0x56, 0x13, 0x56, 0x0b, 0x35, 0x0b, 0x35, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x76, 0x13, 0x56, 0x0b, 0xd8, 0x1b, 0xf8, 0x1b, 0x76, 0x0b, 0x76, 0x13, 0x56, 0x0b, 0x76, 0x13, 0x55, 0x0b, 0x55, 0x13, 0xd2, 0x1a, 0x9d, 0xb6, 0x9c, 0xce, 0x1d, 0xd7, 0x5e, 0xcf, 0xbf, 0x96, 0x94, 0x1b, 0x95, 0x13, 0xd8, 0x23, 0xd9, 0x2b, 0xb8, 0x2b, 0xb8, 0x23, 0xf8, 0x2b, 0xd8, 0x2b, 0xb7, 0x23, 0x97, 0x1b, 0x96, 0x13, 0xb7, 0x1b, 0xf8, 0x1b, 0x18, 0x1c, 0x18, 0x1c, 0xd8, 0x13, 0x39, 0x24, 0x39, 0x24, 0xb7, 0x13, 0x97, 0x13, 0xb7, 0x1b, 0x97, 0x13, 0xf2, 0x1a, 0xb9, 0x9d, 0x9b, 0xd6, 0x1c, 0xdf, 0xfe, 0xce, 0x16, 0x54, 0x31, 0x0a, 0x34, 0x0a, 0x15, 0x0a, 0x36, 0x02, 0x15, 0x02, 0x15, 0x02, 0x15, 0x02, 0x15, 0x02, 0xf5, 0x01, 0x16, 0x02, 0x37, 0x02, 0x35, 0x02, 0x36, 0x02, 0x76, 0x02, 0x56, 0x02, 0x56, 0x02, 0x36, 0x02, 0x56, 0x02, 0x56, 0x02, 0x56, 0x0a, 0x54, 0x12, 0xb1, 0x01, 0x8e, 0x11, 0x5d, 0xc6, 0x9b, 0xde, 0xdb, 0xe6, 0xbc, 0xc6, 0xf6, 0x2b, 0xd8, 0x0b, 0x97, 0x03, 0x77, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x37, 0x03, 0x58, 0x03, 0x57, 0x03, 0x16, 0x03, 0x77, 0x0b, 0x56, 0x13, 0xf3, 0x1a, 0x97, 0x6c, 0x3b, 0xbe, 0x9b, 0xde, 0x9c, 0xde, 0x9e, 0xc6, 0x95, 0x33, 0xb8, 0x1b, 0xb9, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x16, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x36, 0x03, 0x56, 0x0b, 0x57, 0x0b, 0x77, 0x0b, 0x15, 0x03, 0x33, 0x1b, 0x34, 0x54, 0x39, 0xbe, 0xdb, 0xd6, 0xbc, 0xb6, 0xf4, 0x43, 0x75, 0x0b, 0xb8, 0x0b, 0x97, 0x03, 0x98, 0x03, 0x77, 0x03, 0x57, 0x03, 0x36, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x57, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x57, 0x03, 0x58, 0x03, 0x38, 0x03, 0x37, 0x03, 0x78, 0x0b, 0x36, 0x03, 0x16, 0x03, 0x56, 0x0b, 0x35, 0x1b, 0x90, 0x22, 0xda, 0xa5, 0x9b, 0xce, 0x9c, 0xc6, 0x5e, 0x9e, 0x34, 0x1b, 0x57, 0x03, 0x58, 0x03, 0x79, 0x03, 0x38, 0x03, 0x17, 0x0b, 0xf6, 0x0a, 0x15, 0x0b, 0x35, 0x13, 0x55, 0x0b, 0x35, 0x0b, 0x15, 0x0b, 0x16, 0x0b, 0x15, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x36, 0x03, 0xf6, 0x02, 0x37, 0x0b, 0x17, 0x03, 0xf6, 0x12, 0xd3, 0x1a, 0x16, 0x5c, 0xbd, 0xc6, 0xbe, 0xc6, 0x16, 0x54, 0x14, 0x1b, 0x35, 0x0b, 0x56, 0x0b, 0x35, 0x0b, 0x36, 0x0b, 0x35, 0x0b, 0xf5, 0x0a, 0xf4, 0x0a, 0x15, 0x0b, 0x35, 0x0b, 0x35, 0x0b, 0x14, 0x0b, 0x14, 0x0b, 0x15, 0x0b, 0x76, 0x1b, 0x97, 0x1b, 0x35, 0x13, 0x56, 0x1b, 0x76, 0x1b, + 0x1c, 0xef, 0x1b, 0xef, 0x1b, 0xef, 0x1c, 0xf7, 0x5c, 0xf7, 0x5c, 0xf7, 0x3c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0xfb, 0xe6, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x3c, 0xef, 0xfb, 0xee, 0xfc, 0xf6, 0xdc, 0xf6, 0xbc, 0xee, 0xdc, 0xee, 0xdb, 0xe6, 0x3d, 0xef, 0x3d, 0xf7, 0x1c, 0xef, 0x3c, 0xe7, 0xbb, 0xd6, 0x1c, 0xe7, 0x1c, 0xef, 0x5c, 0xe7, 0xfb, 0xde, 0x3b, 0xe7, 0x3c, 0xe7, 0x3c, 0xef, 0x3c, 0xef, 0x1b, 0xef, 0x1b, 0xe7, 0x5c, 0xef, 0x3c, 0xef, 0x3b, 0xe7, 0x1b, 0xe7, 0xfb, 0xee, 0x1c, 0xef, 0xdb, 0xde, 0x3c, 0xe7, 0xfc, 0xde, 0xdc, 0xe6, 0x9b, 0xe6, 0xdd, 0xf6, 0xbc, 0xee, 0xfc, 0xf6, 0xdb, 0xee, 0xfb, 0xee, 0x3c, 0xf7, 0xfc, 0xee, 0xfd, 0xee, 0xdd, 0xe6, 0xbc, 0xe6, 0xbc, 0xe6, 0xbc, 0xe6, 0xfc, 0xe6, 0xfc, 0xe6, 0xdc, 0xde, 0xdd, 0xde, 0xdd, 0xde, 0xdd, 0xe6, 0xbc, 0xe6, 0x9c, 0xe6, 0xbc, 0xe6, 0xdc, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbc, 0xde, 0x1d, 0xdf, 0xdc, 0xd6, 0x5b, 0xce, 0xbc, 0xde, 0x9b, 0xde, 0x9a, 0xde, 0xdb, 0xee, 0xfb, 0xee, 0xfa, 0xee, 0xfa, 0xee, 0xfc, 0xe6, 0xbc, 0xde, 0xbb, 0xd6, 0xbb, 0xd6, 0xdb, 0xde, 0x1d, 0xe7, 0xbc, 0xde, 0x7b, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xdb, 0xde, 0xfb, 0xe6, 0xdb, 0xde, 0xdc, 0xde, 0xfc, 0xd6, 0xdc, 0xce, 0xbb, 0xce, 0xdb, 0xd6, 0xdc, 0xd6, 0x9a, 0xce, 0x79, 0xc6, 0x79, 0xce, 0x99, 0xde, 0x1b, 0xef, 0xdb, 0xe6, 0xfb, 0xe6, 0xfb, 0xd6, 0x3c, 0xd7, 0xfc, 0xc6, 0xfc, 0xce, 0x9b, 0xc6, 0x9b, 0xce, 0xdc, 0xce, 0xdc, 0xce, 0xbc, 0xce, 0x7b, 0xc6, 0x5a, 0xbe, 0x5a, 0xbe, 0xb8, 0xad, 0xb8, 0xad, 0x97, 0xa5, 0x1a, 0xb6, 0x3a, 0xbe, 0xd8, 0xad, 0xd8, 0xad, 0xd9, 0xad, 0xb9, 0xa5, 0x99, 0x9d, 0x59, 0x9d, 0xba, 0xb5, 0x7b, 0xde, 0xdc, 0xf6, 0xdb, 0xf6, 0x1d, 0xef, 0x3e, 0xdf, 0x17, 0x85, 0xb7, 0x64, 0x97, 0x5c, 0x97, 0x54, 0x56, 0x44, 0x35, 0x3c, 0x56, 0x3c, 0x17, 0x34, 0xf7, 0x33, 0xb7, 0x23, 0x96, 0x23, 0x96, 0x1b, 0x96, 0x1b, 0x76, 0x13, 0x35, 0x0b, 0x35, 0x0b, 0x14, 0x03, 0x15, 0x0b, 0x55, 0x13, 0x55, 0x13, 0x15, 0x0b, 0x14, 0x0b, 0x12, 0x2b, 0x7c, 0xc6, 0x9a, 0xde, 0x78, 0xd6, 0xfb, 0xe6, 0xdc, 0xc6, 0x33, 0x6c, 0x32, 0x53, 0x79, 0x74, 0xf4, 0x3a, 0x74, 0x2a, 0x12, 0x22, 0x13, 0x22, 0xd1, 0x19, 0x4f, 0x09, 0x50, 0x09, 0xd2, 0x19, 0x72, 0x09, 0x93, 0x09, 0xd3, 0x01, 0xd3, 0x01, 0xb3, 0x09, 0x93, 0x09, 0xb2, 0x09, 0xb2, 0x09, 0x91, 0x09, 0xf1, 0x19, 0x10, 0x22, 0x74, 0x5b, 0x9e, 0xd6, 0x9d, 0xde, 0xdc, 0xde, 0x1f, 0xcf, 0x94, 0x23, 0xf8, 0x13, 0x19, 0x1c, 0x3a, 0x24, 0xd9, 0x1b, 0x77, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0xb8, 0x0b, 0xd8, 0x0b, 0xd9, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0xf5, 0x0a, 0xd3, 0x1a, 0x19, 0x7d, 0x1a, 0xbe, 0x7a, 0xce, 0x78, 0xce, 0x7a, 0xbe, 0x13, 0x44, 0xf5, 0x23, 0xf6, 0x13, 0xd7, 0x0b, 0xf8, 0x1b, 0xd7, 0x23, 0xd7, 0x23, 0xd7, 0x23, 0xb7, 0x1b, 0xb7, 0x1b, 0xb7, 0x23, 0xd7, 0x23, 0xd8, 0x23, 0xf8, 0x23, 0xf8, 0x2b, 0xd8, 0x23, 0xb7, 0x23, 0xb6, 0x23, 0xb7, 0x23, 0xb7, 0x2b, 0x97, 0x33, 0x35, 0x33, 0xb1, 0x32, 0x96, 0x84, 0x3a, 0xce, 0x5a, 0xce, 0x7c, 0xbe, 0xd4, 0x4b, 0x76, 0x1b, 0x98, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x98, 0x03, 0x77, 0x03, 0x77, 0x03, 0x56, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x0b, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x0b, 0x38, 0x13, 0x16, 0x03, 0x36, 0x0b, 0x36, 0x0b, 0xf4, 0x12, 0x90, 0x22, 0x1c, 0xae, 0x7a, 0xce, 0x7a, 0xc6, 0xfb, 0x9d, 0x94, 0x2b, 0x96, 0x13, 0x97, 0x03, 0xd8, 0x03, 0x97, 0x03, 0x98, 0x03, 0x77, 0x03, 0x77, 0x03, 0x56, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x36, 0x03, 0x56, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x15, 0x03, 0x37, 0x0b, 0x17, 0x03, 0x16, 0x0b, 0xd2, 0x12, 0x16, 0x54, 0x9d, 0xbe, 0x7d, 0xbe, 0x39, 0x85, 0x73, 0x43, 0x74, 0x33, 0x95, 0x33, 0x33, 0x23, 0x34, 0x23, 0x33, 0x23, 0x33, 0x23, 0x33, 0x2b, 0x54, 0x2b, 0x94, 0x33, 0x95, 0x33, 0x94, 0x33, 0xb5, 0x3b, 0x37, 0x4c, 0x33, 0x2b, 0xf2, 0x22, 0xb5, 0x3b, 0xf2, 0x22, 0xb1, 0x1a, + 0x7c, 0xf7, 0x5c, 0xf7, 0x5c, 0xef, 0x5c, 0xef, 0x5c, 0xef, 0x5c, 0xef, 0x5c, 0xef, 0x3c, 0xe7, 0x5c, 0xef, 0x3c, 0xef, 0x5c, 0xef, 0x7d, 0xef, 0x3c, 0xe7, 0x5c, 0xef, 0x3c, 0xef, 0x1c, 0xe7, 0xfb, 0xe6, 0xdb, 0xe6, 0xfb, 0xe6, 0x1b, 0xef, 0x1b, 0xe7, 0x5c, 0xe7, 0x3c, 0xef, 0x7d, 0xf7, 0x5c, 0xe7, 0x1b, 0xe7, 0x3c, 0xef, 0x7d, 0xf7, 0x3c, 0xe7, 0x1b, 0xe7, 0x7c, 0xf7, 0x1b, 0xef, 0xfc, 0xee, 0xfc, 0xee, 0xfc, 0xee, 0x3d, 0xef, 0x1c, 0xe7, 0x5d, 0xef, 0x3c, 0xef, 0xfc, 0xe6, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x5d, 0xef, 0x3d, 0xe7, 0x1d, 0xe7, 0xbd, 0xe6, 0x9d, 0xe6, 0xbc, 0xe6, 0x1c, 0xef, 0x3c, 0xef, 0x1c, 0xef, 0x1b, 0xef, 0x5c, 0xf7, 0xfb, 0xee, 0xdb, 0xe6, 0xfb, 0xee, 0xfb, 0xee, 0xfa, 0xee, 0xf9, 0xee, 0x19, 0xe7, 0xf9, 0xe6, 0x1a, 0xe7, 0x1a, 0xe7, 0xfa, 0xee, 0xfa, 0xee, 0xfa, 0xee, 0xfa, 0xee, 0x1a, 0xe7, 0xfa, 0xe6, 0xfa, 0xe6, 0xda, 0xe6, 0xda, 0xde, 0xda, 0xde, 0xdb, 0xde, 0xfc, 0xe6, 0xfb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1b, 0xe7, 0x1b, 0xe7, 0x3c, 0xe7, 0x1c, 0xdf, 0x1c, 0xdf, 0x3c, 0xdf, 0x3c, 0xe7, 0xdb, 0xde, 0x9b, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0x1b, 0xe7, 0x1b, 0xdf, 0x1b, 0xdf, 0xfb, 0xde, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xda, 0xde, 0x99, 0xe6, 0x99, 0xee, 0xda, 0xe6, 0xda, 0xe6, 0xfa, 0xde, 0xda, 0xe6, 0xbb, 0xee, 0x9b, 0xee, 0xfe, 0xee, 0xfd, 0xe6, 0xfb, 0xd6, 0x3c, 0xe7, 0xbb, 0xde, 0x9a, 0xe6, 0x9a, 0xde, 0xba, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xba, 0xde, 0xba, 0xde, 0x9a, 0xde, 0xdb, 0xe6, 0xba, 0xde, 0x9a, 0xde, 0xbb, 0xde, 0xbb, 0xe6, 0xba, 0xde, 0xba, 0xe6, 0xdb, 0xe6, 0xfb, 0xde, 0xbb, 0xd6, 0xfc, 0xde, 0xdc, 0xde, 0xbb, 0xde, 0x9a, 0xde, 0x1a, 0xef, 0x1a, 0xef, 0x1b, 0xe7, 0xda, 0xe6, 0xfb, 0xe6, 0xbb, 0xde, 0xba, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0x9a, 0xde, 0xba, 0xde, 0xda, 0xde, 0xbb, 0xde, 0xba, 0xde, 0xbb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xbb, 0xd6, 0xdb, 0xde, 0xfc, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0xbb, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0x9a, 0xd6, 0x9a, 0xe6, 0xba, 0xee, 0xbb, 0xee, 0x7a, 0xde, 0xdb, 0xe6, 0x1d, 0xef, 0xfd, 0xe6, 0xbc, 0xde, 0x1c, 0xdf, 0xda, 0xd6, 0xb8, 0xd6, 0xb9, 0xd6, 0xb8, 0xd6, 0x78, 0xce, 0x9a, 0xce, 0xdb, 0xde, 0x59, 0xd6, 0x79, 0xd6, 0xb9, 0xce, 0xba, 0xce, 0x7a, 0xd6, 0x5a, 0xce, 0x7b, 0xce, 0x7b, 0xce, 0xbc, 0xd6, 0x5b, 0xc6, 0x39, 0xbe, 0x9b, 0xce, 0xfc, 0xe6, 0x9b, 0xde, 0xdb, 0xde, 0xfd, 0xce, 0xd7, 0x64, 0xf6, 0x33, 0x33, 0x1b, 0x54, 0x23, 0xb6, 0x33, 0xd7, 0x33, 0xd7, 0x33, 0xb6, 0x33, 0x96, 0x2b, 0x95, 0x2b, 0xb5, 0x2b, 0xb5, 0x2b, 0x95, 0x2b, 0x74, 0x23, 0x54, 0x23, 0x74, 0x23, 0x93, 0x2b, 0x52, 0x2b, 0xb4, 0x33, 0x94, 0x3b, 0x73, 0x43, 0x32, 0x43, 0x72, 0x4b, 0x79, 0x95, 0x7b, 0xc6, 0xba, 0xde, 0xb9, 0xd6, 0xba, 0xce, 0x77, 0x95, 0x78, 0x7d, 0x58, 0x7d, 0x38, 0x75, 0x75, 0x5c, 0x55, 0x5c, 0x55, 0x5c, 0x55, 0x5c, 0x55, 0x5c, 0x55, 0x5c, 0x35, 0x54, 0x34, 0x54, 0x35, 0x5c, 0x35, 0x54, 0x14, 0x54, 0x14, 0x54, 0x14, 0x5c, 0x75, 0x64, 0xf7, 0x74, 0x38, 0x85, 0xb6, 0x7c, 0x18, 0x95, 0xf7, 0x8c, 0xb9, 0xad, 0x9a, 0xd6, 0xdb, 0xd6, 0x9b, 0xbe, 0x13, 0x54, 0x93, 0x2b, 0x33, 0x13, 0x34, 0x0b, 0x14, 0x03, 0x14, 0x03, 0x14, 0x03, 0x34, 0x0b, 0x14, 0x03, 0x14, 0x03, 0x15, 0x03, 0x14, 0x03, 0xf4, 0x02, 0xf3, 0x02, 0x13, 0x0b, 0xf4, 0x0a, 0xd4, 0x0a, 0x14, 0x0b, 0x14, 0x0b, 0xf4, 0x02, 0x34, 0x03, 0xf4, 0x02, 0xd2, 0x0a, 0xf1, 0x22, 0x1b, 0xa6, 0x59, 0xc6, 0xba, 0xde, 0xbc, 0xce, 0xf7, 0x84, 0xb2, 0x4b, 0x31, 0x2b, 0xb2, 0x2b, 0x15, 0x34, 0x32, 0x13, 0x33, 0x1b, 0x14, 0x1b, 0xd3, 0x1a, 0xf3, 0x12, 0xf4, 0x12, 0xf4, 0x12, 0xd4, 0x0a, 0x15, 0x13, 0xf4, 0x0a, 0x34, 0x13, 0x34, 0x13, 0x54, 0x1b, 0xf4, 0x12, 0xf4, 0x12, 0xb2, 0x12, 0x6f, 0x1a, 0x95, 0x7c, 0x9a, 0xd6, 0x38, 0xd6, 0x79, 0xe6, 0x39, 0xd6, 0x7a, 0xd6, 0x39, 0xce, 0x79, 0xd6, 0x59, 0xd6, 0x58, 0xce, 0x58, 0xce, 0x38, 0xce, 0x38, 0xce, 0x58, 0xce, 0x58, 0xd6, 0x38, 0xce, 0x38, 0xd6, 0x59, 0xd6, 0x38, 0xce, 0x18, 0xce, 0x39, 0xd6, 0x19, 0xce, 0xf8, 0xcd, + 0x9b, 0xd6, 0x9c, 0xd6, 0xbc, 0xde, 0xbc, 0xde, 0xdd, 0xde, 0x1d, 0xe7, 0x3e, 0xef, 0x5f, 0xef, 0x5e, 0xef, 0x3e, 0xef, 0x3e, 0xef, 0x7f, 0xf7, 0x3e, 0xef, 0x5f, 0xef, 0x3f, 0xef, 0x3e, 0xef, 0x3e, 0xe7, 0x3e, 0xe7, 0x1d, 0xef, 0xdb, 0xe6, 0x1c, 0xef, 0x5d, 0xf7, 0xfc, 0xee, 0x1c, 0xf7, 0x3d, 0xef, 0x9f, 0xff, 0xfd, 0xee, 0x1d, 0xef, 0x7f, 0xf7, 0x5e, 0xf7, 0x5e, 0xff, 0x1d, 0xf7, 0x9e, 0xff, 0x3c, 0xf7, 0x5d, 0xf7, 0x5d, 0xf7, 0x7e, 0xef, 0x3d, 0xef, 0x7e, 0xef, 0x3e, 0xef, 0x3e, 0xf7, 0x3d, 0xef, 0x3c, 0xe7, 0x3b, 0xe7, 0x5b, 0xdf, 0x3a, 0xdf, 0xfa, 0xe6, 0xfa, 0xe6, 0x1b, 0xe7, 0xfb, 0xde, 0x5c, 0xe7, 0x1b, 0xdf, 0x5c, 0xe7, 0x5c, 0xef, 0x1d, 0xe7, 0x1e, 0xe7, 0x3e, 0xe7, 0x3e, 0xe7, 0x1c, 0xe7, 0xfb, 0xe6, 0xfb, 0xe6, 0xfb, 0xe6, 0xfc, 0xe6, 0x1c, 0xe7, 0x1c, 0xdf, 0x3d, 0xdf, 0x3c, 0xe7, 0x3c, 0xe7, 0x1c, 0xdf, 0xfb, 0xde, 0xdc, 0xe6, 0xdc, 0xe6, 0xfc, 0xde, 0xbb, 0xde, 0xdb, 0xe6, 0xbb, 0xe6, 0x1c, 0xe7, 0xfb, 0xde, 0xfa, 0xde, 0x1b, 0xef, 0x3c, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0x3d, 0xe7, 0x1b, 0xe7, 0xfb, 0xe6, 0x1c, 0xef, 0xfc, 0xee, 0xdc, 0xee, 0xbb, 0xee, 0xfa, 0xee, 0x3b, 0xef, 0x3c, 0xef, 0x1c, 0xef, 0xdb, 0xe6, 0xdb, 0xee, 0xdb, 0xe6, 0xfc, 0xe6, 0xfc, 0xe6, 0xdc, 0xde, 0xbd, 0xde, 0xbd, 0xde, 0xdc, 0xde, 0xdb, 0xde, 0xdb, 0xe6, 0xfc, 0xe6, 0xdc, 0xde, 0xfc, 0xe6, 0x5c, 0xef, 0xd9, 0xde, 0xfb, 0xe6, 0x1c, 0xef, 0xdb, 0xe6, 0xdb, 0xe6, 0xfb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xfb, 0xe6, 0xfb, 0xe6, 0xdb, 0xe6, 0xfb, 0xe6, 0xdb, 0xe6, 0xfb, 0xee, 0xbb, 0xe6, 0xbb, 0xe6, 0xdb, 0xe6, 0xbb, 0xe6, 0xda, 0xee, 0xf9, 0xe6, 0xd9, 0xe6, 0xba, 0xe6, 0xbb, 0xe6, 0xfc, 0xe6, 0xfc, 0xde, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xe6, 0x1c, 0xef, 0xfc, 0xe6, 0xbb, 0xde, 0xdb, 0xde, 0xba, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xda, 0xde, 0xfb, 0xe6, 0xfb, 0xee, 0xdb, 0xe6, 0xba, 0xe6, 0xbb, 0xe6, 0xbb, 0xe6, 0xba, 0xe6, 0xba, 0xde, 0x9a, 0xde, 0xba, 0xde, 0xdb, 0xe6, 0xdb, 0xde, 0x9a, 0xde, 0x9a, 0xd6, 0xba, 0xde, 0xdc, 0xde, 0x9b, 0xd6, 0x1c, 0xdf, 0xfb, 0xde, 0xd9, 0xd6, 0xfa, 0xde, 0xdb, 0xe6, 0x1c, 0xe7, 0xdb, 0xd6, 0xfb, 0xde, 0xdb, 0xe6, 0x9a, 0xde, 0xba, 0xde, 0xdb, 0xde, 0xdc, 0xde, 0x9b, 0xde, 0xbb, 0xe6, 0xbb, 0xe6, 0xfb, 0xde, 0xdb, 0xde, 0xba, 0xe6, 0x9a, 0xe6, 0x9a, 0xe6, 0x9a, 0xde, 0x79, 0xde, 0x99, 0xde, 0x99, 0xd6, 0x78, 0xd6, 0xfb, 0xee, 0xbb, 0xe6, 0xb9, 0xde, 0xb9, 0xde, 0xfa, 0xe6, 0x79, 0xd6, 0x58, 0xce, 0x79, 0xd6, 0x9a, 0xde, 0x59, 0xd6, 0x59, 0xd6, 0x9a, 0xde, 0x79, 0xd6, 0x79, 0xd6, 0x9a, 0xde, 0xba, 0xde, 0xba, 0xde, 0xba, 0xde, 0xba, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0x7a, 0xd6, 0xdb, 0xe6, 0x79, 0xde, 0x78, 0xde, 0xd9, 0xe6, 0x58, 0xce, 0x79, 0xce, 0x39, 0xce, 0x7a, 0xde, 0x7a, 0xe6, 0x9a, 0xe6, 0x7a, 0xe6, 0x7a, 0xe6, 0xba, 0xf6, 0x58, 0xe6, 0x7a, 0xe6, 0x7a, 0xde, 0x7a, 0xde, 0x9a, 0xe6, 0x9b, 0xe6, 0x7a, 0xde, 0x59, 0xd6, 0x18, 0xce, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x79, 0xde, 0x79, 0xde, 0x59, 0xd6, 0xd7, 0xc5, 0xf8, 0xc5, 0xf7, 0xcd, 0x78, 0xde, 0x78, 0xde, 0x79, 0xde, 0x39, 0xce, 0x7b, 0xce, 0xfa, 0xbd, 0x3b, 0xc6, 0x3b, 0xc6, 0xda, 0xbd, 0xb9, 0xb5, 0xba, 0xbd, 0xdb, 0xbd, 0xda, 0xb5, 0xd9, 0xb5, 0xf9, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xbd, 0xd9, 0xbd, 0xb9, 0xbd, 0x57, 0xad, 0xb9, 0xb5, 0xda, 0xb5, 0xda, 0xad, 0x79, 0xa5, 0xb9, 0xb5, 0xf4, 0xb4, 0x38, 0xe6, 0x99, 0xd6, 0x7a, 0xce, 0x3a, 0xd6, 0x5a, 0xe6, 0x5a, 0xe6, 0xba, 0xee, 0x99, 0xe6, 0x78, 0xde, 0x39, 0xd6, 0x5b, 0xd6, 0x5b, 0xde, 0x1b, 0xde, 0x1a, 0xd6, 0x3a, 0xd6, 0x39, 0xce, 0xf8, 0xbd, 0x5a, 0xce, 0xf9, 0xbd, 0x5a, 0xc6, 0x39, 0xbe, 0x5a, 0xbe, 0x37, 0x95, 0x18, 0x85, 0xb7, 0x74, 0xb5, 0x7c, 0x7a, 0xc6, 0xba, 0xde, 0x18, 0xd6, 0x39, 0xde, 0x9b, 0xee, 0x9a, 0xde, 0xbb, 0xde, 0x9a, 0xde, 0x59, 0xd6, 0x59, 0xd6, 0x79, 0xd6, 0x79, 0xde, 0x79, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x59, 0xd6, 0x5a, 0xd6, 0x39, 0xce, 0x3a, 0xd6, + 0xf8, 0x03, 0x19, 0x04, 0x19, 0x04, 0xf9, 0x03, 0xf9, 0x03, 0x1a, 0x0c, 0x1a, 0x0c, 0xd9, 0x03, 0xfa, 0x0b, 0xd9, 0x0b, 0xf9, 0x0b, 0xfa, 0x13, 0xf9, 0x13, 0xd9, 0x13, 0xf9, 0x13, 0x19, 0x1c, 0x39, 0x1c, 0x79, 0x34, 0x59, 0x44, 0x7b, 0x85, 0x3d, 0xe7, 0xfa, 0xf6, 0x5b, 0xef, 0xdf, 0xef, 0xbb, 0x64, 0xba, 0x33, 0x37, 0x1b, 0x78, 0x1b, 0x78, 0x1b, 0x78, 0x1b, 0x99, 0x2b, 0xfa, 0x3b, 0x97, 0x2b, 0xb7, 0x2b, 0xf8, 0x33, 0xf8, 0x3b, 0xf7, 0x3b, 0x38, 0x4c, 0x99, 0x5c, 0xda, 0x64, 0xda, 0x6c, 0x5c, 0x7d, 0x3b, 0x7d, 0x5b, 0x85, 0xbb, 0x95, 0xbb, 0x9d, 0x1c, 0xb6, 0xbe, 0xce, 0xdc, 0xd6, 0x3c, 0xef, 0x3a, 0xef, 0x3b, 0xef, 0x3e, 0xdf, 0xff, 0xd6, 0xfe, 0xd6, 0xfd, 0xde, 0xdb, 0xd6, 0xfc, 0xd6, 0xdc, 0xd6, 0xfc, 0xd6, 0x1c, 0xd7, 0xfc, 0xce, 0x1c, 0xd7, 0xfc, 0xd6, 0xbb, 0xde, 0xdc, 0xde, 0xfe, 0xd6, 0xbd, 0xce, 0xdc, 0xde, 0x9b, 0xd6, 0x7b, 0xc6, 0x3a, 0xb6, 0x7c, 0xc6, 0x1c, 0xb6, 0x5d, 0xbe, 0xbd, 0xce, 0x1c, 0xe7, 0x1b, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfa, 0xee, 0x7d, 0xf7, 0x1e, 0xdf, 0x9f, 0xe7, 0x1e, 0xdf, 0x1e, 0xef, 0x3e, 0xf7, 0x1d, 0xef, 0x3d, 0xef, 0x3c, 0xe7, 0x1d, 0xdf, 0x3d, 0xdf, 0x3d, 0xe7, 0x1d, 0xe7, 0xdc, 0xee, 0xdc, 0xee, 0xfc, 0xe6, 0xfc, 0xde, 0xdb, 0xe6, 0xfb, 0xe6, 0xfc, 0xd6, 0x3d, 0xdf, 0xfa, 0xd6, 0xfa, 0xde, 0xfb, 0xe6, 0xfc, 0xe6, 0xfc, 0xe6, 0xfc, 0xde, 0x3c, 0xef, 0xfb, 0xe6, 0xdb, 0xe6, 0x5d, 0xef, 0xfc, 0xe6, 0xfc, 0xde, 0xfc, 0xde, 0xfc, 0xde, 0xfc, 0xe6, 0x3d, 0xe7, 0x1d, 0xe7, 0xdc, 0xde, 0x1c, 0xe7, 0xfc, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xfc, 0xde, 0xdd, 0xde, 0xbc, 0xde, 0xdd, 0xe6, 0xbd, 0xde, 0xfd, 0xe6, 0xfd, 0xee, 0xdc, 0xe6, 0xfb, 0xe6, 0x3c, 0xe7, 0xfc, 0xd6, 0xfc, 0xde, 0xfd, 0xde, 0xfd, 0xe6, 0x7a, 0xe6, 0xdc, 0xf6, 0xfc, 0xee, 0xfc, 0xe6, 0xdc, 0xe6, 0xfc, 0xe6, 0xfc, 0xe6, 0xdc, 0xe6, 0xdc, 0xe6, 0xdc, 0xe6, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xe6, 0x1c, 0xef, 0xdb, 0xe6, 0xbb, 0xe6, 0xfb, 0xee, 0x99, 0xe6, 0x78, 0xde, 0xfa, 0xee, 0xfb, 0xe6, 0xdb, 0xe6, 0xfa, 0xee, 0xda, 0xee, 0x1d, 0xef, 0xdc, 0xe6, 0xfb, 0xe6, 0xba, 0xe6, 0xbb, 0xde, 0xdb, 0xe6, 0xba, 0xe6, 0xbb, 0xe6, 0xdc, 0xe6, 0x9b, 0xde, 0xfd, 0xde, 0xfd, 0xde, 0xdc, 0xe6, 0xdc, 0xe6, 0xbb, 0xee, 0xbb, 0xee, 0xdb, 0xe6, 0xda, 0xde, 0xdb, 0xe6, 0xdb, 0xe6, 0x79, 0xde, 0x79, 0xe6, 0xdb, 0xee, 0xdb, 0xe6, 0xda, 0xee, 0xb9, 0xe6, 0xba, 0xe6, 0xbb, 0xe6, 0x19, 0xc6, 0xfc, 0xde, 0x9b, 0xd6, 0x9a, 0xde, 0x99, 0xe6, 0xba, 0xee, 0x99, 0xde, 0x9a, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xde, 0xba, 0xde, 0xba, 0xde, 0xdb, 0xe6, 0xba, 0xe6, 0x9a, 0xee, 0x9b, 0xee, 0x59, 0xe6, 0x9a, 0xde, 0x99, 0xd6, 0xb9, 0xde, 0x38, 0xce, 0x7a, 0xd6, 0x7a, 0xd6, 0x7b, 0xde, 0x9b, 0xe6, 0xdb, 0xe6, 0xba, 0xde, 0xba, 0xe6, 0x79, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0xbb, 0xe6, 0x7a, 0xde, 0x9b, 0xe6, 0x7a, 0xde, 0x9b, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0xba, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xba, 0xde, 0xda, 0xde, 0x9a, 0xd6, 0x38, 0xce, 0x39, 0xd6, 0xf7, 0xcd, 0x38, 0xd6, 0xda, 0xde, 0x79, 0xd6, 0x79, 0xd6, 0xba, 0xde, 0x58, 0xd6, 0xfb, 0xe6, 0x58, 0xce, 0x79, 0xd6, 0x58, 0xd6, 0x58, 0xd6, 0x77, 0xd6, 0x99, 0xde, 0x99, 0xd6, 0x9a, 0xd6, 0x59, 0xd6, 0x79, 0xde, 0x59, 0xd6, 0x7a, 0xde, 0x7a, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x7b, 0xde, 0x5a, 0xde, 0x5a, 0xde, 0x59, 0xd6, 0xf8, 0xcd, 0x19, 0xde, 0xf8, 0xd5, 0x38, 0xd6, 0x59, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x7a, 0xd6, 0x99, 0xd6, 0xba, 0xd6, 0x79, 0xce, 0x79, 0xce, 0x99, 0xd6, 0x78, 0xde, 0x57, 0xde, 0x78, 0xe6, 0x59, 0xde, 0x79, 0xde, 0x57, 0xd6, 0x77, 0xd6, 0x77, 0xd6, 0x57, 0xce, 0x38, 0xd6, 0x19, 0xd6, 0x39, 0xd6, 0x79, 0xde, 0x57, 0xce, 0xb8, 0xde, 0x98, 0xd6, 0x58, 0xce, 0xb9, 0xde, 0xb9, 0xde, 0x99, 0xde, 0xda, 0xe6, 0xba, 0xde, 0x7a, 0xd6, 0x7a, 0xd6, 0x5a, 0xce, 0x9a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0x7a, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x5a, 0xd6, 0x5a, 0xd6, 0x5b, 0xd6, + 0x19, 0x04, 0x3a, 0x04, 0x3a, 0x04, 0x19, 0x04, 0xf9, 0x03, 0x19, 0x04, 0x3a, 0x0c, 0x5a, 0x0c, 0x19, 0x0c, 0x19, 0x0c, 0x19, 0x0c, 0x39, 0x0c, 0x3a, 0x0c, 0x19, 0x0c, 0x19, 0x04, 0xf9, 0x03, 0x39, 0x0c, 0x19, 0x14, 0xb7, 0x1b, 0x36, 0x4c, 0xdc, 0xce, 0x3b, 0xef, 0x7d, 0xe7, 0xfe, 0xc6, 0x36, 0x23, 0x39, 0x13, 0x58, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x39, 0x0b, 0x7a, 0x0b, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0x38, 0x0b, 0xf7, 0x02, 0xd6, 0x0a, 0xd6, 0x0a, 0x94, 0x0a, 0xb5, 0x12, 0xd3, 0x2a, 0x1f, 0xd7, 0xdc, 0xe6, 0x5d, 0xef, 0x3e, 0xd7, 0xd9, 0x6c, 0x14, 0x23, 0x35, 0x1b, 0x14, 0x0b, 0x55, 0x0b, 0x56, 0x0b, 0x16, 0x03, 0x38, 0x0b, 0xf7, 0x02, 0x17, 0x0b, 0xd6, 0x0a, 0x17, 0x13, 0xf6, 0x12, 0xf6, 0x0a, 0x18, 0x03, 0xf7, 0x02, 0xf7, 0x0a, 0xd6, 0x0a, 0x16, 0x0b, 0x16, 0x0b, 0x16, 0x1b, 0x94, 0x12, 0xd4, 0x22, 0x37, 0x64, 0xbd, 0xc6, 0x1d, 0xe7, 0x1d, 0xe7, 0x3e, 0xef, 0x7f, 0xef, 0xba, 0xa5, 0xf6, 0x43, 0xd6, 0x2b, 0x16, 0x2c, 0xf6, 0x2b, 0xb6, 0x2b, 0x17, 0x3c, 0xd6, 0x33, 0xd6, 0x3b, 0xf8, 0x43, 0x59, 0x54, 0xb9, 0x5c, 0xb9, 0x5c, 0x98, 0x54, 0x77, 0x54, 0xd8, 0x5c, 0xf9, 0x6c, 0x3a, 0x7d, 0xdc, 0x8d, 0x9c, 0x7d, 0xd8, 0x64, 0xd7, 0x7c, 0xde, 0xce, 0x1f, 0xef, 0x9c, 0xe6, 0xdd, 0xe6, 0x1e, 0xe7, 0xbf, 0xe7, 0x1a, 0xa6, 0xf8, 0x6c, 0xf9, 0x6c, 0xf9, 0x74, 0xd9, 0x74, 0xf9, 0x74, 0xf9, 0x74, 0xd9, 0x74, 0xf9, 0x74, 0xf9, 0x74, 0xd9, 0x74, 0xf9, 0x7c, 0x9c, 0x8d, 0xfd, 0x9d, 0x9c, 0x8d, 0x1a, 0x85, 0x5a, 0x8d, 0xbc, 0x95, 0xdc, 0x9d, 0xbb, 0xa5, 0xfa, 0xad, 0x1a, 0xb6, 0x3a, 0xbe, 0x3c, 0xdf, 0xf9, 0xde, 0xf9, 0xe6, 0x3a, 0xef, 0x7c, 0xef, 0xdc, 0xd6, 0x5b, 0xbe, 0x3b, 0xb6, 0xbd, 0xbe, 0xfe, 0xc6, 0x9b, 0xb6, 0xbc, 0xbe, 0xdd, 0xc6, 0xdd, 0xce, 0xdd, 0xce, 0xfe, 0xd6, 0xfe, 0xd6, 0xfe, 0xd6, 0x1e, 0xdf, 0x1e, 0xdf, 0xfd, 0xd6, 0x3e, 0xdf, 0x1d, 0xdf, 0x1d, 0xdf, 0x1d, 0xe7, 0xdc, 0xde, 0xdb, 0xe6, 0x1c, 0xe7, 0xfb, 0xde, 0xfb, 0xde, 0xfc, 0xde, 0x3e, 0xdf, 0x5e, 0xe7, 0xfd, 0xde, 0x3f, 0xdf, 0xfe, 0xd6, 0x7f, 0xef, 0x3e, 0xe7, 0x1e, 0xef, 0x1e, 0xef, 0xdc, 0xee, 0xdb, 0xee, 0xfc, 0xf6, 0x1d, 0xef, 0xdc, 0xde, 0xfd, 0xe6, 0x1d, 0xef, 0x1e, 0xef, 0x1e, 0xef, 0x1e, 0xef, 0x3e, 0xe7, 0x1e, 0xdf, 0xfd, 0xd6, 0x1e, 0xdf, 0xbc, 0xd6, 0xdd, 0xde, 0xfd, 0xe6, 0xbc, 0xde, 0xbb, 0xde, 0xfc, 0xee, 0xb9, 0xe6, 0xda, 0xee, 0xbb, 0xde, 0xfc, 0xe6, 0x9b, 0xde, 0xdb, 0xe6, 0xba, 0xe6, 0x58, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0xdb, 0xe6, 0xdb, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0x9a, 0xde, 0xbb, 0xde, 0xfc, 0xde, 0xbc, 0xde, 0x9c, 0xde, 0x5b, 0xde, 0xbc, 0xe6, 0xbb, 0xde, 0x5a, 0xde, 0x59, 0xde, 0xba, 0xde, 0x9a, 0xde, 0xba, 0xe6, 0xdb, 0xe6, 0xda, 0xde, 0xbb, 0xde, 0xfd, 0xe6, 0xdd, 0xe6, 0xbb, 0xde, 0xdb, 0xd6, 0xdc, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0xbb, 0xde, 0x9b, 0xd6, 0x5a, 0xd6, 0x9b, 0xde, 0x9b, 0xde, 0xbb, 0xe6, 0x7b, 0xde, 0x7a, 0xde, 0x9b, 0xe6, 0xbb, 0xe6, 0x7a, 0xde, 0x5a, 0xd6, 0x5b, 0xde, 0x3a, 0xd6, 0x3a, 0xd6, 0x7b, 0xd6, 0xbc, 0xde, 0x7a, 0xd6, 0x9b, 0xde, 0xbb, 0xe6, 0xdc, 0xe6, 0xbb, 0xde, 0xdc, 0xde, 0xbb, 0xd6, 0x9b, 0xd6, 0x7b, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0x9a, 0xe6, 0x7a, 0xe6, 0x7a, 0xee, 0x59, 0xe6, 0x7a, 0xe6, 0x59, 0xde, 0x7a, 0xe6, 0x9a, 0xe6, 0x9a, 0xe6, 0x9a, 0xde, 0x99, 0xce, 0x98, 0xc6, 0xb9, 0xce, 0xd9, 0xce, 0x58, 0xce, 0x79, 0xde, 0x39, 0xde, 0x7a, 0xe6, 0x9a, 0xe6, 0xbb, 0xee, 0x59, 0xe6, 0x59, 0xe6, 0x3a, 0xe6, 0x9c, 0xe6, 0x7c, 0xde, 0x7c, 0xde, 0x7c, 0xde, 0x9c, 0xde, 0xbd, 0xd6, 0x9d, 0xce, 0x9d, 0xce, 0x9d, 0xd6, 0x9d, 0xd6, 0x9c, 0xd6, 0x7c, 0xd6, 0x5c, 0xd6, 0x3c, 0xde, 0x3c, 0xd6, 0x5b, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x7a, 0xde, 0xbc, 0xe6, 0x5b, 0xd6, 0xde, 0xe6, 0x7d, 0xde, 0x5c, 0xde, 0x7c, 0xde, 0x3a, 0xd6, 0x5a, 0xd6, 0x5b, 0xd6, 0x9b, 0xde, 0x5a, 0xde, 0x9a, 0xde, 0x9b, 0xe6, 0x59, 0xd6, 0x79, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0x99, 0xd6, 0x79, 0xd6, 0x59, 0xd6, + 0x1a, 0x14, 0xfa, 0x0b, 0x1a, 0x14, 0x9c, 0x24, 0x3e, 0x3d, 0x7f, 0x45, 0xfd, 0x34, 0x9b, 0x24, 0xf9, 0x13, 0x19, 0x14, 0xf9, 0x0b, 0xd9, 0x0b, 0x1a, 0x0c, 0x3a, 0x14, 0x3a, 0x0c, 0x5b, 0x14, 0x3a, 0x0c, 0x1a, 0x0c, 0xb8, 0x13, 0x95, 0x2b, 0xdd, 0xc6, 0x3d, 0xe7, 0x9e, 0xe7, 0xdf, 0xb6, 0xb5, 0x12, 0x3a, 0x0b, 0x7a, 0x0b, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x3a, 0x0b, 0x3a, 0x0b, 0xf9, 0x0a, 0xf9, 0x0a, 0x1a, 0x0b, 0xfa, 0x02, 0xfa, 0x02, 0xfa, 0x0a, 0xd9, 0x02, 0xf9, 0x0a, 0xd9, 0x0a, 0x98, 0x02, 0xb8, 0x0a, 0x94, 0x1a, 0x5d, 0xc6, 0x9a, 0xde, 0x3c, 0xef, 0x7f, 0xe7, 0x1b, 0x75, 0xb5, 0x12, 0x17, 0x13, 0x38, 0x13, 0x38, 0x03, 0x39, 0x03, 0x5a, 0x03, 0x3a, 0x03, 0xf9, 0x02, 0x19, 0x03, 0xf8, 0x02, 0x59, 0x13, 0x38, 0x03, 0x17, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x39, 0x03, 0x79, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x0b, 0xf5, 0x0a, 0x74, 0x33, 0xdd, 0xc6, 0x3c, 0xe7, 0xfb, 0xe6, 0x1d, 0xdf, 0x7f, 0xd7, 0x36, 0x4c, 0x76, 0x13, 0xd9, 0x0b, 0xf9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xfb, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0xb9, 0x13, 0x98, 0x13, 0x78, 0x0b, 0xb8, 0x0b, 0x97, 0x13, 0x34, 0x1b, 0xd5, 0x4b, 0xdb, 0xad, 0xfe, 0xde, 0x1d, 0xdf, 0x7f, 0xdf, 0x1f, 0xbf, 0x12, 0x2b, 0x36, 0x13, 0x78, 0x0b, 0xd8, 0x0b, 0xb7, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0x98, 0x03, 0x97, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x97, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0x97, 0x03, 0x78, 0x03, 0x37, 0x0b, 0x35, 0x0b, 0x54, 0x2b, 0xbe, 0xbe, 0xdd, 0xd6, 0xfc, 0xde, 0x1e, 0xdf, 0x3f, 0xbf, 0xd6, 0x33, 0x35, 0x0b, 0x98, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x56, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x56, 0x13, 0x76, 0x1b, 0x56, 0x1b, 0x96, 0x1b, 0x96, 0x23, 0x18, 0x3c, 0x17, 0x3c, 0x75, 0x2b, 0xd6, 0x3b, 0xb8, 0x6c, 0xbc, 0xce, 0x9a, 0xd6, 0xfd, 0xde, 0xfe, 0xce, 0xbe, 0xae, 0x93, 0x3b, 0x13, 0x1b, 0x76, 0x23, 0x75, 0x13, 0x54, 0x0b, 0x56, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x96, 0x0b, 0xd8, 0x13, 0x18, 0x1c, 0xb5, 0x13, 0xd5, 0x1b, 0x16, 0x24, 0x16, 0x2c, 0xf6, 0x2b, 0xf6, 0x2b, 0xf6, 0x2b, 0xf6, 0x2b, 0x16, 0x3c, 0x73, 0x33, 0x97, 0x6c, 0x1c, 0xae, 0xbd, 0xce, 0xdd, 0xe6, 0x5d, 0xf7, 0x7a, 0xd6, 0x3e, 0xdf, 0x79, 0x9d, 0xf8, 0x7c, 0xf8, 0x74, 0xd8, 0x74, 0xf8, 0x7c, 0x18, 0x85, 0x18, 0x85, 0x39, 0x7d, 0x39, 0x7d, 0x9b, 0x85, 0x9b, 0x8d, 0xbb, 0x95, 0xdb, 0x9d, 0xdb, 0x9d, 0xfb, 0x9d, 0x1b, 0x9e, 0x5b, 0xa6, 0x5c, 0xb6, 0x3b, 0xae, 0x9d, 0xb6, 0xbc, 0xbe, 0xf8, 0xb5, 0x79, 0xce, 0x57, 0xce, 0xd9, 0xe6, 0x98, 0xde, 0xd9, 0xde, 0x3b, 0xd7, 0xfc, 0xc6, 0x9c, 0xbe, 0xde, 0xc6, 0xbd, 0xce, 0xbc, 0xd6, 0x9c, 0xce, 0x9c, 0xce, 0x9c, 0xce, 0xbd, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0x9c, 0xce, 0x9c, 0xce, 0xbc, 0xd6, 0x9c, 0xce, 0x9b, 0xd6, 0xdc, 0xde, 0xfd, 0xde, 0xfd, 0xde, 0xfd, 0xd6, 0xbc, 0xce, 0x39, 0xc6, 0x59, 0xd6, 0x79, 0xde, 0x78, 0xe6, 0x99, 0xe6, 0xfb, 0xf6, 0xfc, 0xee, 0x9b, 0xde, 0xdd, 0xe6, 0xde, 0xe6, 0xbd, 0xe6, 0x9d, 0xe6, 0x7c, 0xde, 0x7c, 0xde, 0x7b, 0xd6, 0x7b, 0xd6, 0x5b, 0xde, 0x9c, 0xde, 0x9b, 0xde, 0x9b, 0xd6, 0x9b, 0xd6, 0xdc, 0xd6, 0x9b, 0xd6, 0x9b, 0xd6, 0xfc, 0xde, 0xfc, 0xde, 0xbb, 0xde, 0x9a, 0xde, 0x18, 0xde, 0x18, 0xde, 0x79, 0xde, 0xdb, 0xe6, 0x79, 0xd6, 0xfb, 0xde, 0xb9, 0xde, 0x78, 0xde, 0x98, 0xe6, 0x79, 0xe6, 0x9a, 0xe6, 0x5a, 0xde, 0x7b, 0xe6, 0x9b, 0xe6, 0xba, 0xe6, 0xda, 0xe6, 0xba, 0xd6, 0xba, 0xd6, 0x9b, 0xd6, 0x7a, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x59, 0xd6, 0x7a, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x79, 0xce, 0xda, 0xd6, 0xfc, 0xd6, 0x1e, 0xd7, 0x7a, 0x8d, 0x16, 0x54, 0x17, 0x54, 0x17, 0x54, 0x16, 0x54, 0xb4, 0x53, 0xf4, 0x5b, 0x97, 0x74, 0x9a, 0x95, 0xdb, 0x9d, 0x1c, 0xae, 0x3c, 0xb6, 0x3c, 0xbe, 0x5d, 0xc6, 0x9d, 0xce, 0xbe, 0xd6, 0xde, 0xd6, 0xde, 0xde, 0xbd, 0xd6, 0x9d, 0xd6, + 0x1a, 0x14, 0x1a, 0x14, 0x1a, 0x14, 0xfa, 0x13, 0xd9, 0x13, 0xf9, 0x1b, 0x7b, 0x2c, 0xfd, 0x3c, 0x19, 0x1c, 0x7b, 0x2c, 0x7b, 0x24, 0x5b, 0x1c, 0x7c, 0x24, 0x5c, 0x1c, 0xda, 0x0b, 0xba, 0x03, 0xfa, 0x03, 0xd9, 0x0b, 0xb8, 0x13, 0x96, 0x33, 0xbe, 0xce, 0xfc, 0xe6, 0x5e, 0xe7, 0xff, 0xc6, 0x16, 0x1b, 0x3a, 0x13, 0x39, 0x0b, 0x39, 0x0b, 0x5a, 0x0b, 0x3a, 0x0b, 0x1a, 0x0b, 0x5a, 0x0b, 0x79, 0x03, 0xb9, 0x03, 0xfa, 0x13, 0xfa, 0x13, 0x99, 0x03, 0x79, 0x03, 0xb9, 0x0b, 0xba, 0x0b, 0xda, 0x0b, 0xba, 0x0b, 0x9a, 0x0b, 0x99, 0x0b, 0x58, 0x03, 0xf7, 0x02, 0xf6, 0x02, 0x92, 0x02, 0xbd, 0xae, 0x5d, 0xd7, 0x9d, 0xdf, 0xbf, 0xcf, 0x3b, 0x5d, 0x36, 0x0b, 0x58, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x1b, 0x14, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x98, 0x0b, 0xf9, 0x23, 0xd8, 0x2b, 0x36, 0x13, 0x37, 0x0b, 0x17, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x99, 0x13, 0x78, 0x0b, 0xf7, 0x02, 0x38, 0x13, 0xf6, 0x12, 0xd3, 0x22, 0xbd, 0xc6, 0xfc, 0xe6, 0xfc, 0xe6, 0x1e, 0xdf, 0xbf, 0xcf, 0xd5, 0x2b, 0x39, 0x24, 0x3b, 0x14, 0xd8, 0x0b, 0xb8, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0xd8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0x1b, 0x04, 0xfb, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfb, 0x0b, 0xfb, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x96, 0x13, 0x33, 0x1b, 0x58, 0x85, 0x5d, 0xcf, 0xda, 0xc6, 0x7d, 0xd7, 0x9f, 0xbf, 0x53, 0x23, 0xf9, 0x23, 0x9a, 0x0b, 0xba, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xda, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xba, 0x0b, 0x9a, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x59, 0x0b, 0x79, 0x0b, 0x78, 0x13, 0x36, 0x0b, 0xd2, 0x12, 0x9d, 0xb6, 0xfc, 0xde, 0xfb, 0xee, 0x1d, 0xe7, 0x3f, 0xc7, 0x55, 0x2b, 0x57, 0x1b, 0x99, 0x1b, 0x37, 0x0b, 0x57, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x77, 0x13, 0x36, 0x13, 0x56, 0x1b, 0xb7, 0x23, 0x33, 0x2b, 0xdd, 0xce, 0xdb, 0xde, 0x3d, 0xdf, 0x7f, 0xd7, 0x97, 0x54, 0x55, 0x13, 0x97, 0x13, 0x98, 0x13, 0xd9, 0x13, 0x99, 0x0b, 0x99, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x97, 0x0b, 0x96, 0x13, 0x34, 0x23, 0x73, 0x43, 0xfd, 0xce, 0xdb, 0xde, 0x99, 0xde, 0x1c, 0xdf, 0xff, 0xb6, 0xb5, 0x2b, 0x35, 0x0b, 0x56, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x57, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0xf5, 0x02, 0x16, 0x0b, 0xf6, 0x12, 0xd6, 0x12, 0xf7, 0x1a, 0x37, 0x1b, 0x15, 0x13, 0xd3, 0x12, 0x14, 0x33, 0x3f, 0xae, 0x9e, 0xd6, 0x7d, 0xde, 0xfe, 0xee, 0xdf, 0xde, 0x36, 0x5c, 0x13, 0x23, 0x15, 0x13, 0xf6, 0x12, 0x16, 0x13, 0x36, 0x13, 0x16, 0x0b, 0x36, 0x13, 0xf6, 0x02, 0x16, 0x0b, 0x16, 0x0b, 0x36, 0x0b, 0x57, 0x0b, 0x16, 0x03, 0x35, 0x0b, 0x56, 0x0b, 0x35, 0x0b, 0x35, 0x0b, 0x55, 0x0b, 0x76, 0x13, 0x56, 0x1b, 0x15, 0x23, 0xd2, 0x2a, 0xd8, 0x7c, 0xfe, 0xd6, 0xdd, 0xde, 0xfd, 0xce, 0x99, 0x8d, 0x94, 0x33, 0x96, 0x1b, 0xb6, 0x13, 0xb7, 0x13, 0xb6, 0x13, 0xb6, 0x1b, 0x95, 0x1b, 0x95, 0x23, 0x75, 0x13, 0x76, 0x13, 0x76, 0x1b, 0xb8, 0x23, 0xb7, 0x1b, 0xb6, 0x1b, 0xb6, 0x1b, 0xd7, 0x23, 0xb7, 0x23, 0x55, 0x23, 0x76, 0x2b, 0x96, 0x33, 0xb7, 0x43, 0xf7, 0x5b, 0x38, 0x7c, 0x5f, 0xce, 0x5c, 0xde, 0x9b, 0xde, 0xfe, 0xd6, 0x99, 0xa5, 0x16, 0x85, 0x1a, 0xae, 0x77, 0x9d, 0x5b, 0xbe, 0xf9, 0xad, 0x1a, 0xb6, 0x7c, 0xce, 0xbc, 0xde, 0x9b, 0xe6, 0x9a, 0xee, 0x7a, 0xe6, 0xba, 0xee, 0x9a, 0xe6, 0x79, 0xe6, 0xba, 0xe6, 0xda, 0xee, 0x7a, 0xe6, 0x7a, 0xe6, 0xbb, 0xde, 0x9b, 0xd6, 0xbb, 0xd6, 0x5a, 0xc6, 0x9c, 0xd6, 0xdf, 0xce, 0x91, 0x1a, 0xb4, 0x12, 0x95, 0x02, 0xf7, 0x0a, 0xf7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0x55, 0x02, 0x95, 0x02, 0xb6, 0x02, 0x75, 0x02, 0x94, 0x02, 0x94, 0x0a, 0xb5, 0x0a, 0xb4, 0x0a, 0x94, 0x0a, 0x93, 0x02, 0x93, 0x02, + 0x7b, 0x0c, 0x5b, 0x04, 0x3a, 0x04, 0x3a, 0x0c, 0x19, 0x0c, 0xf9, 0x0b, 0xf9, 0x0b, 0x19, 0x14, 0x5a, 0x1c, 0xbc, 0x24, 0x7b, 0x1c, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd8, 0x03, 0x97, 0x0b, 0xb5, 0x33, 0xdd, 0xce, 0x1c, 0xef, 0x3d, 0xe7, 0xff, 0xc6, 0x16, 0x1b, 0x19, 0x0b, 0x19, 0x0b, 0x39, 0x0b, 0x5a, 0x13, 0x19, 0x0b, 0xf9, 0x02, 0x1a, 0x0b, 0x19, 0x0b, 0x19, 0x0b, 0x39, 0x13, 0x39, 0x13, 0xf8, 0x0a, 0xf8, 0x0a, 0xf8, 0x0a, 0xf8, 0x0a, 0xd8, 0x0a, 0xd8, 0x02, 0xd8, 0x0a, 0xf8, 0x0a, 0xb7, 0x0a, 0x97, 0x0a, 0xb7, 0x12, 0x52, 0x1a, 0x5d, 0xc6, 0xdc, 0xee, 0x5d, 0xef, 0x7f, 0xdf, 0x79, 0x54, 0xd5, 0x0a, 0x77, 0x13, 0x37, 0x03, 0x98, 0x03, 0x57, 0x03, 0xfa, 0x13, 0x58, 0x03, 0x59, 0x03, 0x18, 0x03, 0x38, 0x0b, 0x79, 0x13, 0x79, 0x13, 0x17, 0x03, 0x38, 0x03, 0x18, 0x03, 0x59, 0x0b, 0xba, 0x1b, 0x3b, 0x24, 0xfa, 0x23, 0x17, 0x0b, 0xf6, 0x0a, 0xd6, 0x12, 0xd3, 0x2a, 0x1e, 0xd7, 0xfc, 0xe6, 0xfc, 0xe6, 0x1e, 0xdf, 0xbf, 0xcf, 0xb5, 0x2b, 0xd8, 0x13, 0x99, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xd9, 0x0b, 0x3a, 0x14, 0xf9, 0x0b, 0xd8, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0x1a, 0x0c, 0xfa, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0xf9, 0x0b, 0xd8, 0x03, 0xf8, 0x03, 0x18, 0x0c, 0xf8, 0x0b, 0xb8, 0x0b, 0x76, 0x13, 0xd2, 0x1a, 0x18, 0x85, 0x1d, 0xd7, 0x3c, 0xe7, 0x5d, 0xdf, 0x3f, 0xb7, 0x73, 0x23, 0x75, 0x03, 0xd9, 0x03, 0x7a, 0x14, 0x19, 0x0c, 0xd9, 0x03, 0xf9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x78, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x57, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x14, 0x13, 0x5c, 0xa6, 0xdc, 0xd6, 0xfb, 0xe6, 0x3e, 0xdf, 0xbf, 0xa6, 0x14, 0x13, 0x96, 0x13, 0x9b, 0x2c, 0xdc, 0x34, 0x19, 0x1c, 0x97, 0x03, 0x19, 0x14, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x57, 0x03, 0x16, 0x03, 0x36, 0x03, 0xd2, 0x12, 0x7c, 0xbe, 0x9a, 0xde, 0xdb, 0xde, 0x7f, 0xd7, 0xf5, 0x3b, 0xd7, 0x13, 0xf8, 0x13, 0xd8, 0x0b, 0xd8, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd8, 0x0b, 0xd7, 0x0b, 0xd7, 0x0b, 0xb6, 0x0b, 0x96, 0x0b, 0x97, 0x13, 0x78, 0x13, 0x58, 0x13, 0x38, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x97, 0x03, 0x76, 0x0b, 0x35, 0x13, 0xf2, 0x2a, 0xbd, 0xc6, 0xba, 0xde, 0xda, 0xde, 0x1d, 0xd7, 0xbf, 0x9e, 0x54, 0x13, 0x97, 0x0b, 0x98, 0x03, 0xd9, 0x03, 0xda, 0x03, 0x98, 0x03, 0x78, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x96, 0x03, 0x95, 0x0b, 0xf2, 0x12, 0x39, 0x7d, 0xbc, 0xce, 0x79, 0xd6, 0xdb, 0xe6, 0x3d, 0xd7, 0x55, 0x44, 0x74, 0x0b, 0x96, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x79, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x57, 0x13, 0x14, 0x1b, 0x15, 0x5c, 0x7b, 0xc6, 0x5a, 0xce, 0x9c, 0xbe, 0x14, 0x54, 0x75, 0x13, 0x19, 0x14, 0x77, 0x03, 0x97, 0x03, 0x76, 0x03, 0x76, 0x03, 0x76, 0x03, 0x96, 0x03, 0x96, 0x03, 0x97, 0x03, 0x77, 0x03, 0xb8, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x56, 0x03, 0x76, 0x0b, 0x56, 0x0b, 0x36, 0x0b, 0x56, 0x03, 0x36, 0x03, 0x75, 0x13, 0x13, 0x13, 0xf1, 0x22, 0xfc, 0x9d, 0x9c, 0xc6, 0xbd, 0xce, 0x3d, 0x9e, 0x74, 0x2b, 0x35, 0x13, 0x15, 0x0b, 0x56, 0x0b, 0x55, 0x0b, 0x76, 0x0b, 0x56, 0x13, 0x76, 0x1b, 0x55, 0x1b, 0x75, 0x2b, 0xd7, 0x3b, 0x59, 0x54, 0x1b, 0x6d, 0x9c, 0x85, 0x7a, 0x85, 0xbb, 0x8d, 0x9b, 0x8d, 0xfa, 0x84, 0xb9, 0x7c, 0x78, 0x74, 0x16, 0x64, 0x36, 0x6c, 0x7a, 0xa5, 0x3c, 0xce, 0x1f, 0xdf, 0x13, 0x2b, 0xd5, 0x12, 0xb5, 0x0a, 0x96, 0x0a, 0xd7, 0x12, 0xd7, 0x12, 0xd7, 0x12, 0x96, 0x0a, 0x96, 0x0a, 0x55, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x95, 0x0a, 0x95, 0x0a, 0x95, 0x02, 0x95, 0x02, 0x95, 0x02, 0x95, 0x02, + 0x3b, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x0c, 0xf9, 0x0b, 0xf9, 0x0b, 0xfa, 0x0b, 0x98, 0x03, 0xf9, 0x0b, 0xfa, 0x13, 0xb9, 0x0b, 0xd9, 0x0b, 0xda, 0x0b, 0xba, 0x03, 0xda, 0x03, 0xf9, 0x03, 0x19, 0x04, 0xd7, 0x03, 0xd5, 0x2b, 0xdc, 0xbe, 0x5c, 0xef, 0x5d, 0xe7, 0x3f, 0xc7, 0xf5, 0x12, 0x59, 0x0b, 0x79, 0x0b, 0x59, 0x0b, 0x39, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x3a, 0x03, 0xfa, 0x02, 0xda, 0x02, 0xda, 0x02, 0xfa, 0x02, 0xd9, 0x02, 0xfa, 0x02, 0xfa, 0x02, 0xd9, 0x02, 0xfa, 0x02, 0xfa, 0x0a, 0xf9, 0x0a, 0xf9, 0x0a, 0xb8, 0x0a, 0x97, 0x0a, 0xb7, 0x0a, 0x52, 0x12, 0x5d, 0xc6, 0xfc, 0xee, 0x3c, 0xef, 0x7f, 0xdf, 0x58, 0x54, 0x16, 0x13, 0x16, 0x13, 0x57, 0x13, 0x77, 0x0b, 0x57, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x79, 0x03, 0x18, 0x03, 0x38, 0x03, 0x59, 0x03, 0x58, 0x03, 0x79, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x57, 0x0b, 0x16, 0x03, 0x16, 0x0b, 0xd6, 0x0a, 0xf6, 0x0a, 0xd2, 0x1a, 0xfd, 0xc6, 0xfb, 0xde, 0x3c, 0xe7, 0x3d, 0xdf, 0x9f, 0xd7, 0x93, 0x33, 0x96, 0x1b, 0xb8, 0x13, 0xd9, 0x13, 0xda, 0x13, 0xda, 0x0b, 0xfb, 0x0b, 0xfa, 0x03, 0x1a, 0x04, 0x1a, 0x0c, 0xfa, 0x0b, 0x19, 0x14, 0x59, 0x2c, 0xbb, 0x44, 0x1c, 0x55, 0x5b, 0x3c, 0xdd, 0x4c, 0xbc, 0x34, 0x19, 0x1c, 0xf9, 0x0b, 0xb8, 0x03, 0xb7, 0x13, 0x75, 0x23, 0x18, 0x85, 0xdd, 0xd6, 0x9b, 0xe6, 0xfe, 0xe6, 0x3f, 0xc7, 0x95, 0x33, 0x96, 0x0b, 0x19, 0x0c, 0x3a, 0x14, 0xd9, 0x0b, 0xb8, 0x03, 0xd8, 0x0b, 0xd9, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0xb7, 0x0b, 0x77, 0x03, 0x37, 0x0b, 0x35, 0x23, 0x1c, 0xb6, 0xdd, 0xee, 0xdc, 0xe6, 0x1e, 0xdf, 0x1f, 0xaf, 0xb5, 0x23, 0x75, 0x13, 0xb6, 0x13, 0x59, 0x2c, 0xfc, 0x44, 0xdc, 0x4c, 0x5b, 0x34, 0xd8, 0x13, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0xb8, 0x0b, 0xdd, 0x34, 0xfd, 0x34, 0x1a, 0x1c, 0x98, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0xd3, 0x1a, 0x9c, 0xc6, 0xba, 0xe6, 0xba, 0xe6, 0xfd, 0xce, 0x98, 0x44, 0x76, 0x03, 0x77, 0x03, 0x1a, 0x14, 0x1a, 0x14, 0x3b, 0x1c, 0x1c, 0x1c, 0xdb, 0x13, 0xba, 0x0b, 0x9a, 0x0b, 0x79, 0x0b, 0x98, 0x0b, 0xd8, 0x03, 0xd7, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb8, 0x0b, 0x37, 0x13, 0xf4, 0x2a, 0x5c, 0xbe, 0xbc, 0xe6, 0x9c, 0xe6, 0xfe, 0xde, 0x9e, 0xa6, 0x32, 0x1b, 0x96, 0x13, 0x76, 0x0b, 0x77, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x77, 0x03, 0x56, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x77, 0x0b, 0x35, 0x13, 0xb3, 0x1a, 0x1a, 0x85, 0x1a, 0xbe, 0xdb, 0xe6, 0xfb, 0xde, 0x1d, 0xc7, 0x56, 0x3c, 0x95, 0x0b, 0x77, 0x0b, 0x9c, 0x34, 0x7b, 0x2c, 0x39, 0x24, 0xd8, 0x1b, 0xd8, 0x1b, 0xd8, 0x13, 0xd8, 0x13, 0xb8, 0x13, 0x97, 0x0b, 0x56, 0x03, 0x97, 0x0b, 0xd8, 0x13, 0xf8, 0x1b, 0x19, 0x24, 0x5a, 0x2c, 0x9a, 0x34, 0x7a, 0x2c, 0xb8, 0x0b, 0x76, 0x03, 0x75, 0x13, 0xb4, 0x3b, 0x9c, 0xbe, 0xdd, 0xd6, 0x7c, 0xb6, 0xf5, 0x4b, 0x76, 0x1b, 0x5b, 0x2c, 0x77, 0x0b, 0x77, 0x13, 0x57, 0x0b, 0x78, 0x13, 0x58, 0x13, 0x58, 0x0b, 0x77, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x56, 0x03, 0x77, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x03, 0x96, 0x0b, 0x54, 0x13, 0xf1, 0x1a, 0x1b, 0x9e, 0xdb, 0xd6, 0xbb, 0xce, 0xbb, 0x8d, 0x14, 0x23, 0x57, 0x13, 0x58, 0x0b, 0x58, 0x0b, 0x17, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x36, 0x03, 0x17, 0x03, 0x17, 0x03, 0x57, 0x03, 0x15, 0x03, 0x35, 0x03, 0x76, 0x0b, 0x76, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0xf4, 0x12, 0xf3, 0x1a, 0x12, 0x3b, 0x7d, 0xc6, 0xff, 0xce, 0x74, 0x2b, 0xd3, 0x02, 0x15, 0x03, 0xf6, 0x02, 0x17, 0x0b, 0xd6, 0x02, 0x96, 0x02, 0x76, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0x56, 0x02, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x0a, 0x77, 0x0a, 0x77, 0x0a, 0x97, 0x0a, + 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xfa, 0x13, 0xfa, 0x13, 0xda, 0x0b, 0xb9, 0x0b, 0x99, 0x0b, 0xba, 0x0b, 0xda, 0x13, 0xfa, 0x13, 0xf9, 0x03, 0x19, 0x04, 0xd7, 0x03, 0xb4, 0x23, 0xbc, 0xbe, 0x3c, 0xe7, 0x5d, 0xe7, 0x5f, 0xcf, 0xf5, 0x12, 0x39, 0x03, 0x59, 0x0b, 0x39, 0x03, 0xf8, 0x02, 0xf9, 0x02, 0x1a, 0x03, 0x1a, 0x03, 0x1a, 0x03, 0x1a, 0x03, 0x1a, 0x03, 0x1a, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x1a, 0x03, 0x1a, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0x73, 0x12, 0x9e, 0xbe, 0x5e, 0xe7, 0x3e, 0xdf, 0x7f, 0xd7, 0x19, 0x4c, 0x39, 0x1b, 0xd8, 0x0a, 0x39, 0x13, 0x38, 0x0b, 0x18, 0x0b, 0xd8, 0x02, 0x19, 0x0b, 0x19, 0x03, 0x5a, 0x0b, 0x18, 0x03, 0xf8, 0x02, 0xf9, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xd8, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x39, 0x0b, 0x39, 0x13, 0xf8, 0x0a, 0x19, 0x0b, 0xf9, 0x0a, 0x73, 0x12, 0x9d, 0xbe, 0xbb, 0xd6, 0x1d, 0xe7, 0x1d, 0xdf, 0x9f, 0xd7, 0xd3, 0x43, 0x96, 0x23, 0xf9, 0x1b, 0x98, 0x13, 0xb9, 0x13, 0xb9, 0x13, 0xda, 0x0b, 0xf9, 0x03, 0x19, 0x04, 0x19, 0x04, 0xd9, 0x03, 0xb7, 0x0b, 0xf8, 0x1b, 0x9a, 0x44, 0x3d, 0x5d, 0xbc, 0x4c, 0x5b, 0x3c, 0xb9, 0x1b, 0x98, 0x0b, 0xfa, 0x13, 0xb9, 0x03, 0x97, 0x03, 0x54, 0x13, 0x38, 0x75, 0x3e, 0xd7, 0xbb, 0xde, 0x1f, 0xe7, 0x1f, 0xc7, 0x15, 0x23, 0x97, 0x13, 0xb8, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x79, 0x03, 0x99, 0x03, 0xba, 0x0b, 0x99, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x78, 0x13, 0x58, 0x13, 0x58, 0x0b, 0x15, 0x1b, 0xfb, 0xa5, 0xdc, 0xd6, 0xdc, 0xd6, 0x5f, 0xdf, 0xdf, 0xae, 0x34, 0x23, 0x76, 0x23, 0x19, 0x2c, 0x98, 0x13, 0xd9, 0x13, 0x3a, 0x24, 0x98, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0xfa, 0x13, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x37, 0x03, 0x16, 0x03, 0xd3, 0x12, 0x5c, 0xbe, 0x9b, 0xe6, 0xdb, 0xe6, 0x7f, 0xd7, 0x95, 0x1b, 0xd8, 0x0b, 0xf9, 0x0b, 0xb8, 0x03, 0x97, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x78, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x9a, 0x0b, 0x9a, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x37, 0x0b, 0xf4, 0x22, 0x7c, 0xc6, 0xdc, 0xe6, 0x9b, 0xd6, 0xdd, 0xce, 0xff, 0xb6, 0x33, 0x1b, 0x76, 0x13, 0x98, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x38, 0x03, 0x36, 0x03, 0x57, 0x1b, 0xf5, 0x2a, 0x58, 0x6c, 0x5d, 0xce, 0x7b, 0xde, 0xbb, 0xde, 0xfe, 0xc6, 0xd5, 0x23, 0x97, 0x03, 0x78, 0x13, 0x58, 0x13, 0xbc, 0x44, 0x3a, 0x3c, 0xd8, 0x2b, 0x98, 0x23, 0x98, 0x1b, 0x77, 0x13, 0x77, 0x0b, 0x77, 0x0b, 0x97, 0x0b, 0xb8, 0x0b, 0xd8, 0x13, 0xb8, 0x0b, 0x96, 0x0b, 0xb7, 0x0b, 0xb7, 0x13, 0x76, 0x0b, 0x77, 0x13, 0x35, 0x13, 0x56, 0x23, 0x74, 0x43, 0x3b, 0xc6, 0x7b, 0xd6, 0x5c, 0xb6, 0x97, 0x64, 0x76, 0x1b, 0xf9, 0x13, 0x76, 0x0b, 0x96, 0x0b, 0x77, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x99, 0x03, 0x78, 0x03, 0x99, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x79, 0x0b, 0x79, 0x03, 0x58, 0x03, 0x57, 0x0b, 0xf5, 0x1a, 0x91, 0x2a, 0x9a, 0x9d, 0x9a, 0xc6, 0xfc, 0xc6, 0x38, 0x6d, 0x94, 0x1b, 0x96, 0x0b, 0xb7, 0x0b, 0xd8, 0x13, 0x76, 0x0b, 0x35, 0x03, 0x56, 0x0b, 0xb7, 0x0b, 0x96, 0x0b, 0x76, 0x03, 0x76, 0x0b, 0x55, 0x03, 0x35, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x36, 0x0b, 0x16, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x15, 0x0b, 0xb3, 0x12, 0xb1, 0x32, 0x99, 0xb5, 0xbe, 0xce, 0xf6, 0x3b, 0xf4, 0x02, 0xd5, 0x02, 0xf6, 0x12, 0x95, 0x0a, 0x75, 0x12, 0x96, 0x12, 0x75, 0x0a, 0x76, 0x0a, 0x55, 0x0a, 0x76, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x95, 0x02, 0x75, 0x02, + 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1b, 0x04, 0x1b, 0x04, 0xfb, 0x03, 0xfa, 0x03, 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0x3b, 0x0c, 0xd9, 0x0b, 0xb8, 0x0b, 0x95, 0x23, 0xde, 0xce, 0x1d, 0xef, 0x3e, 0xef, 0x5f, 0xdf, 0xf6, 0x1a, 0xf9, 0x02, 0x19, 0x0b, 0x19, 0x0b, 0xd9, 0x0a, 0xd9, 0x0a, 0xfa, 0x0a, 0xda, 0x02, 0xda, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x0a, 0x1a, 0x0b, 0xf9, 0x0a, 0x1a, 0x0b, 0x3a, 0x0b, 0x1a, 0x03, 0x19, 0x0b, 0x19, 0x0b, 0xf8, 0x0a, 0xf8, 0x0a, 0x73, 0x12, 0x7c, 0xc6, 0xda, 0xe6, 0x5c, 0xef, 0x9f, 0xdf, 0x55, 0x23, 0x38, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x0b, 0xf9, 0x0a, 0xf8, 0x0a, 0xf8, 0x0a, 0x19, 0x0b, 0x18, 0x03, 0x18, 0x0b, 0xf8, 0x02, 0x5a, 0x0b, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xd7, 0x02, 0xb3, 0x12, 0xfd, 0xce, 0xd9, 0xe6, 0xda, 0xee, 0x3d, 0xef, 0x7f, 0xd7, 0xb9, 0x5c, 0xd8, 0x1b, 0xfa, 0x0b, 0x19, 0x04, 0x1a, 0x04, 0xb9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xda, 0x0b, 0xfb, 0x0b, 0xfb, 0x0b, 0x1a, 0x0c, 0x19, 0x0c, 0x39, 0x0c, 0xf7, 0x03, 0xb7, 0x03, 0xd9, 0x03, 0xba, 0x0b, 0x9a, 0x0b, 0x59, 0x0b, 0xb9, 0x1b, 0xf3, 0x12, 0xf5, 0x6c, 0x1b, 0xcf, 0x3c, 0xe7, 0x1e, 0xdf, 0x1f, 0xb7, 0x76, 0x23, 0x97, 0x0b, 0xd8, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x79, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x13, 0x13, 0x1a, 0xa6, 0x3c, 0xdf, 0xfb, 0xd6, 0x3e, 0xcf, 0x5d, 0x8e, 0x54, 0x1b, 0x96, 0x13, 0x3a, 0x1c, 0xd9, 0x03, 0xda, 0x03, 0x19, 0x0c, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x5b, 0x24, 0xd9, 0x1b, 0x98, 0x0b, 0x97, 0x13, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x13, 0xb2, 0x12, 0xdf, 0xce, 0x9c, 0xde, 0xbb, 0xde, 0x3f, 0xcf, 0x95, 0x1b, 0x97, 0x03, 0xf9, 0x0b, 0x98, 0x03, 0x97, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0xba, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x98, 0x03, 0x97, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0xb6, 0x03, 0x96, 0x03, 0x77, 0x13, 0xf3, 0x22, 0x9b, 0xc6, 0xb9, 0xde, 0xda, 0xde, 0x1e, 0xd7, 0xff, 0xae, 0x54, 0x23, 0x77, 0x13, 0x98, 0x03, 0x78, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x79, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x97, 0x03, 0xb7, 0x03, 0x75, 0x03, 0x54, 0x0b, 0x34, 0x23, 0x98, 0x6c, 0x5b, 0xc6, 0x9b, 0xde, 0xdb, 0xe6, 0x1d, 0xc7, 0xb3, 0x1b, 0xb6, 0x03, 0xb7, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0xba, 0x03, 0x99, 0x03, 0x99, 0x03, 0xba, 0x03, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x97, 0x13, 0x14, 0x13, 0x32, 0x3b, 0x39, 0xc6, 0x9a, 0xde, 0x7c, 0xbe, 0x15, 0x54, 0xb7, 0x13, 0x98, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0x97, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x03, 0x96, 0x03, 0xb7, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x56, 0x0b, 0x57, 0x13, 0x37, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x56, 0x03, 0x34, 0x0b, 0x32, 0x23, 0xdc, 0x9d, 0x7d, 0xc6, 0xbe, 0xce, 0xbd, 0x85, 0x55, 0x1b, 0x76, 0x0b, 0xb8, 0x0b, 0xb7, 0x0b, 0xd7, 0x13, 0x36, 0x03, 0x77, 0x0b, 0xb9, 0x13, 0x59, 0x0b, 0x38, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x15, 0x03, 0x14, 0x13, 0xf2, 0x32, 0x9d, 0xce, 0x9d, 0xce, 0x95, 0x33, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0x56, 0x02, 0x96, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xd8, 0x0b, 0xd6, 0x23, 0xdd, 0xc6, 0x3c, 0xef, 0x3d, 0xef, 0x9f, 0xdf, 0x14, 0x1b, 0x39, 0x0b, 0x19, 0x03, 0x3a, 0x03, 0x19, 0x03, 0xb8, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x0b, 0xf8, 0x0a, 0xd7, 0x02, 0x93, 0x12, 0x9d, 0xbe, 0x1c, 0xe7, 0x1c, 0xe7, 0x7f, 0xdf, 0x75, 0x2b, 0x58, 0x0b, 0x38, 0x03, 0x39, 0x0b, 0x38, 0x0b, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf7, 0x02, 0xd3, 0x12, 0x9d, 0xbe, 0x1c, 0xe7, 0x1b, 0xe7, 0x3d, 0xdf, 0x7f, 0xd7, 0xf5, 0x43, 0xb7, 0x13, 0x3a, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xf9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xdb, 0x0b, 0xda, 0x0b, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x03, 0x14, 0x13, 0xb6, 0x6c, 0xfd, 0xce, 0xfd, 0xde, 0x3e, 0xd7, 0x5f, 0xc7, 0x53, 0x2b, 0xb8, 0x13, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x97, 0x03, 0x98, 0x03, 0x78, 0x03, 0xf5, 0x12, 0xfb, 0xa5, 0xdc, 0xde, 0xfb, 0xde, 0x3e, 0xd7, 0xfd, 0x8d, 0x55, 0x1b, 0x97, 0x13, 0x5a, 0x24, 0xb8, 0x0b, 0xd9, 0x0b, 0xd9, 0x13, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x79, 0x03, 0xb9, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0xd2, 0x12, 0x9d, 0xc6, 0x9a, 0xde, 0xba, 0xde, 0x3f, 0xcf, 0x33, 0x1b, 0x77, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0x77, 0x03, 0x78, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0xf2, 0x1a, 0x9c, 0xc6, 0x9a, 0xde, 0xba, 0xe6, 0xdd, 0xd6, 0xbf, 0xa6, 0x54, 0x1b, 0x76, 0x0b, 0x97, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x57, 0x13, 0xf3, 0x1a, 0xb8, 0x6c, 0x7b, 0xc6, 0x7a, 0xd6, 0xdb, 0xe6, 0xde, 0xce, 0x95, 0x23, 0x98, 0x03, 0xb8, 0x0b, 0xb8, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x36, 0x13, 0x32, 0x33, 0x39, 0xbe, 0xba, 0xde, 0x7c, 0xbe, 0x36, 0x54, 0x95, 0x13, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x35, 0x13, 0xb1, 0x22, 0xdc, 0xa5, 0x7b, 0xd6, 0xbc, 0xd6, 0x7e, 0x96, 0x95, 0x1b, 0x76, 0x0b, 0x97, 0x0b, 0x98, 0x0b, 0xfa, 0x1b, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0xd5, 0x0a, 0xd3, 0x12, 0x33, 0x33, 0x9d, 0xbe, 0x7d, 0xb6, 0x76, 0x33, 0xb5, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xd8, 0x0b, 0xd6, 0x2b, 0xdd, 0xc6, 0x1c, 0xef, 0x3d, 0xef, 0x7f, 0xdf, 0xf4, 0x1a, 0x59, 0x0b, 0x39, 0x03, 0x1a, 0x03, 0xf9, 0x02, 0xd9, 0x02, 0xfa, 0x0a, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0x19, 0x0b, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x19, 0x0b, 0xf8, 0x0a, 0xd7, 0x02, 0x93, 0x12, 0x9d, 0xbe, 0x1c, 0xe7, 0x1c, 0xe7, 0x7f, 0xdf, 0x75, 0x2b, 0x37, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xf9, 0x0a, 0x19, 0x03, 0xf9, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xf8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb3, 0x12, 0x7c, 0xb6, 0xfb, 0xde, 0xfb, 0xe6, 0x3d, 0xdf, 0x7f, 0xcf, 0xd4, 0x3b, 0x96, 0x13, 0xd9, 0x03, 0xf9, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0xba, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x03, 0x14, 0x13, 0x96, 0x6c, 0xdd, 0xce, 0xfd, 0xde, 0x1e, 0xdf, 0x5f, 0xc7, 0x33, 0x23, 0x97, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x15, 0x13, 0x1c, 0xae, 0xfc, 0xde, 0xfb, 0xde, 0x3e, 0xd7, 0xdd, 0x85, 0xb7, 0x23, 0x97, 0x13, 0x3a, 0x1c, 0xd8, 0x0b, 0x3a, 0x14, 0xb9, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x36, 0x03, 0xd2, 0x12, 0xbd, 0xc6, 0x9a, 0xde, 0xdb, 0xde, 0x3f, 0xcf, 0x37, 0x3c, 0x97, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xd9, 0x0b, 0x99, 0x03, 0x98, 0x03, 0x99, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x36, 0x03, 0x14, 0x1b, 0x5c, 0xbe, 0xdb, 0xe6, 0x9a, 0xde, 0xfd, 0xd6, 0x7e, 0x9e, 0x54, 0x1b, 0x96, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x58, 0x0b, 0x37, 0x13, 0xf3, 0x1a, 0xb7, 0x6c, 0x5b, 0xc6, 0x9a, 0xde, 0xbb, 0xe6, 0xfe, 0xce, 0x95, 0x23, 0x98, 0x03, 0xb8, 0x0b, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x0b, 0x36, 0x13, 0x73, 0x3b, 0x5a, 0xbe, 0x9a, 0xd6, 0x7c, 0xbe, 0x77, 0x64, 0xd6, 0x1b, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x35, 0x13, 0xb1, 0x22, 0xfc, 0xa5, 0x7b, 0xd6, 0xfd, 0xd6, 0xfc, 0x85, 0x75, 0x13, 0x76, 0x03, 0xb8, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x0b, 0xf5, 0x0a, 0xd3, 0x0a, 0x54, 0x33, 0x5c, 0xb6, 0x7d, 0xb6, 0x35, 0x2b, 0x95, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd8, 0x0b, 0xb5, 0x2b, 0xdd, 0xc6, 0xfb, 0xee, 0x3d, 0xef, 0x7f, 0xdf, 0xd4, 0x1a, 0x39, 0x0b, 0x3a, 0x03, 0x1a, 0x03, 0xd9, 0x02, 0xf9, 0x02, 0xfa, 0x0a, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xd7, 0x02, 0x93, 0x12, 0x9d, 0xbe, 0xfc, 0xe6, 0x1c, 0xe7, 0x5f, 0xdf, 0x96, 0x2b, 0x17, 0x03, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0x93, 0x12, 0x5c, 0xb6, 0xfb, 0xde, 0x1b, 0xe7, 0x3d, 0xdf, 0x9f, 0xd7, 0xd5, 0x3b, 0xb7, 0x13, 0xd9, 0x0b, 0x1a, 0x0c, 0xd9, 0x03, 0xda, 0x0b, 0x99, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x03, 0x14, 0x13, 0x96, 0x6c, 0xfd, 0xce, 0xfd, 0xde, 0x3f, 0xdf, 0x5f, 0xc7, 0x53, 0x2b, 0xb7, 0x13, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x15, 0x13, 0x1c, 0xae, 0xdc, 0xde, 0xfc, 0xe6, 0x3e, 0xd7, 0x5b, 0x75, 0xd8, 0x2b, 0x97, 0x13, 0x19, 0x14, 0xd8, 0x0b, 0x5b, 0x1c, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0xba, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x57, 0x03, 0xd2, 0x12, 0xbd, 0xc6, 0xba, 0xde, 0xdb, 0xde, 0x3f, 0xcf, 0x58, 0x44, 0x98, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x79, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0xf3, 0x1a, 0x9d, 0xbe, 0xbb, 0xde, 0xdb, 0xe6, 0xfe, 0xd6, 0x3d, 0x96, 0x54, 0x1b, 0x96, 0x0b, 0x98, 0x03, 0x58, 0x03, 0x79, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x57, 0x03, 0x58, 0x0b, 0x36, 0x13, 0xf3, 0x1a, 0xd8, 0x6c, 0x5b, 0xc6, 0x9a, 0xde, 0xbb, 0xe6, 0xfe, 0xce, 0x74, 0x1b, 0x97, 0x03, 0xb8, 0x0b, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x0b, 0x36, 0x13, 0x74, 0x3b, 0x5a, 0xc6, 0x79, 0xd6, 0x5b, 0xbe, 0x97, 0x64, 0xf7, 0x23, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x78, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x35, 0x13, 0xb1, 0x22, 0xfc, 0xa5, 0x7b, 0xce, 0xdd, 0xce, 0x5a, 0x6d, 0x55, 0x0b, 0x76, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x0b, 0xf5, 0x0a, 0xf4, 0x12, 0xb5, 0x43, 0x7d, 0xbe, 0x9e, 0xbe, 0xf4, 0x2a, 0x95, 0x0a, 0xd6, 0x0a, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xb8, 0x0b, 0xb5, 0x2b, 0xdd, 0xce, 0xfb, 0xee, 0x5d, 0xf7, 0x7f, 0xe7, 0xf4, 0x1a, 0x39, 0x0b, 0x19, 0x03, 0xfa, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x1a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xd7, 0x02, 0xb3, 0x1a, 0xbe, 0xc6, 0xfc, 0xe6, 0x1d, 0xe7, 0x7f, 0xdf, 0xd7, 0x33, 0x17, 0x03, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x02, 0x98, 0x02, 0xd8, 0x02, 0xf9, 0x0a, 0xd8, 0x02, 0xd8, 0x0a, 0xd7, 0x0a, 0x92, 0x12, 0x7c, 0xbe, 0xfc, 0xe6, 0x1c, 0xef, 0x1d, 0xdf, 0x7f, 0xd7, 0xd5, 0x43, 0xb7, 0x1b, 0xfa, 0x0b, 0x3a, 0x0c, 0xf9, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x03, 0x14, 0x13, 0x96, 0x6c, 0xdd, 0xd6, 0x1d, 0xdf, 0x5f, 0xdf, 0x7f, 0xcf, 0x53, 0x2b, 0xd8, 0x13, 0xda, 0x0b, 0xda, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0xf5, 0x12, 0x1c, 0xae, 0xdc, 0xde, 0xfb, 0xde, 0x3e, 0xd7, 0xf9, 0x64, 0xb7, 0x23, 0xb7, 0x13, 0xf9, 0x13, 0xb8, 0x03, 0xfa, 0x0b, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0x9a, 0x0b, 0x79, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x57, 0x0b, 0xb2, 0x12, 0xdd, 0xc6, 0xdb, 0xde, 0xdb, 0xde, 0x5f, 0xd7, 0x74, 0x23, 0x97, 0x0b, 0xf9, 0x0b, 0xd9, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x77, 0x0b, 0xd2, 0x12, 0x9d, 0xbe, 0xba, 0xde, 0xdc, 0xe6, 0xfe, 0xd6, 0x3d, 0x96, 0x75, 0x1b, 0x97, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x36, 0x13, 0x13, 0x1b, 0xf8, 0x74, 0x5b, 0xc6, 0x9b, 0xde, 0xbb, 0xe6, 0xff, 0xce, 0x74, 0x23, 0x97, 0x03, 0xb8, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x0b, 0x35, 0x13, 0x73, 0x3b, 0x5a, 0xbe, 0x59, 0xce, 0x3b, 0xb6, 0x97, 0x64, 0xd6, 0x1b, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x77, 0x03, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x35, 0x13, 0xb1, 0x22, 0x1d, 0xae, 0x7b, 0xd6, 0x9c, 0xce, 0x3a, 0x6d, 0x55, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x16, 0x0b, 0xf6, 0x0a, 0xf4, 0x12, 0xd6, 0x43, 0x7d, 0xb6, 0x9e, 0xbe, 0xb3, 0x1a, 0x95, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xb8, 0x03, 0xb8, 0x0b, 0xd6, 0x33, 0xdd, 0xce, 0xfb, 0xee, 0x5d, 0xf7, 0x9f, 0xe7, 0x35, 0x2b, 0x39, 0x0b, 0x19, 0x03, 0x1a, 0x03, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x0a, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x3a, 0x03, 0x3a, 0x0b, 0x3a, 0x03, 0x3a, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x19, 0x0b, 0xd7, 0x02, 0xd7, 0x0a, 0xb4, 0x1a, 0xde, 0xce, 0xfc, 0xe6, 0x3d, 0xe7, 0x7f, 0xdf, 0x18, 0x3c, 0x37, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x78, 0x02, 0x98, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xf9, 0x0a, 0xd8, 0x02, 0xd8, 0x0a, 0xb7, 0x02, 0x92, 0x12, 0x7c, 0xbe, 0x1c, 0xe7, 0x1c, 0xe7, 0x1d, 0xdf, 0x3f, 0xcf, 0xd5, 0x3b, 0x97, 0x13, 0x1a, 0x0c, 0xf9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x14, 0x13, 0xb6, 0x6c, 0xdd, 0xd6, 0xfd, 0xde, 0x3f, 0xdf, 0x7f, 0xcf, 0x53, 0x23, 0xb8, 0x13, 0xda, 0x03, 0xd9, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x78, 0x0b, 0xf5, 0x12, 0x3c, 0xae, 0xbc, 0xde, 0xfb, 0xde, 0x3e, 0xd7, 0x1a, 0x65, 0x76, 0x13, 0xd8, 0x13, 0xf9, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0xb2, 0x12, 0xbd, 0xc6, 0xdb, 0xe6, 0xba, 0xde, 0x5f, 0xd7, 0x74, 0x23, 0x97, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x98, 0x13, 0x78, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x98, 0x0b, 0x57, 0x03, 0x77, 0x0b, 0x16, 0x03, 0xf3, 0x1a, 0x3b, 0xb6, 0xbb, 0xde, 0x9a, 0xde, 0xfd, 0xd6, 0x3d, 0x96, 0x75, 0x1b, 0x97, 0x0b, 0x98, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x37, 0x13, 0x14, 0x1b, 0x19, 0x7d, 0x5b, 0xc6, 0xbb, 0xde, 0xbb, 0xe6, 0x1f, 0xd7, 0x95, 0x2b, 0x97, 0x0b, 0xd8, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x59, 0x03, 0x38, 0x03, 0x37, 0x0b, 0x15, 0x13, 0x73, 0x3b, 0x5a, 0xc6, 0x7a, 0xd6, 0x5c, 0xbe, 0xb8, 0x64, 0x95, 0x13, 0x97, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x77, 0x03, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x35, 0x13, 0xb1, 0x22, 0x1d, 0xae, 0x7c, 0xd6, 0xbd, 0xce, 0x9b, 0x75, 0x75, 0x13, 0x77, 0x0b, 0x37, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0xf6, 0x0a, 0xf4, 0x12, 0xb6, 0x43, 0x7d, 0xb6, 0x9e, 0xbe, 0x93, 0x1a, 0x95, 0x0a, 0xb6, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xb8, 0x0b, 0xd8, 0x0b, 0x37, 0x3c, 0xfd, 0xce, 0x1c, 0xef, 0x3d, 0xf7, 0x7f, 0xdf, 0x55, 0x2b, 0x38, 0x0b, 0x39, 0x03, 0x3a, 0x03, 0x19, 0x0b, 0xf9, 0x0a, 0xd9, 0x02, 0xf9, 0x0a, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x3a, 0x0b, 0x5a, 0x0b, 0x5a, 0x0b, 0x3a, 0x0b, 0x3a, 0x0b, 0x39, 0x0b, 0xf9, 0x0a, 0xd7, 0x02, 0xd7, 0x0a, 0xb4, 0x1a, 0xde, 0xc6, 0xfc, 0xde, 0x3d, 0xe7, 0x7f, 0xdf, 0x18, 0x3c, 0x58, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0x19, 0x03, 0x19, 0x0b, 0xf9, 0x0a, 0xf9, 0x0a, 0xd8, 0x02, 0xd7, 0x02, 0x93, 0x12, 0x7d, 0xbe, 0x1c, 0xe7, 0x1c, 0xe7, 0x1d, 0xdf, 0x7f, 0xd7, 0x15, 0x44, 0xb7, 0x13, 0x1a, 0x0c, 0xd9, 0x03, 0xd9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x14, 0x13, 0xb7, 0x74, 0xdd, 0xd6, 0xfd, 0xde, 0x3e, 0xdf, 0x5f, 0xc7, 0x53, 0x23, 0xb7, 0x13, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x79, 0x0b, 0xf5, 0x12, 0x3c, 0xae, 0xbc, 0xd6, 0xfb, 0xde, 0x3e, 0xd7, 0xbc, 0x75, 0x56, 0x13, 0xd8, 0x13, 0xf9, 0x13, 0xd9, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0xd3, 0x12, 0xbd, 0xc6, 0xdb, 0xe6, 0xdb, 0xde, 0x3f, 0xd7, 0x58, 0x44, 0xb8, 0x0b, 0x98, 0x03, 0xd9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x17, 0x03, 0xb9, 0x13, 0x7c, 0x2c, 0x9c, 0x2c, 0x1a, 0x1c, 0x98, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x77, 0x03, 0x57, 0x0b, 0x36, 0x0b, 0xd2, 0x1a, 0x5b, 0xbe, 0xba, 0xde, 0xba, 0xde, 0xfd, 0xd6, 0xfd, 0x85, 0x96, 0x1b, 0x97, 0x0b, 0x98, 0x03, 0x79, 0x03, 0x59, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x36, 0x13, 0x14, 0x23, 0x39, 0x7d, 0x7b, 0xc6, 0x9b, 0xe6, 0xbb, 0xe6, 0x1f, 0xd7, 0xf6, 0x33, 0x97, 0x0b, 0xd9, 0x13, 0x98, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x0b, 0x36, 0x13, 0x53, 0x3b, 0x3a, 0xbe, 0x7a, 0xd6, 0x7c, 0xbe, 0xb8, 0x6c, 0x75, 0x13, 0x97, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x35, 0x13, 0xb1, 0x22, 0x1d, 0xae, 0x5b, 0xce, 0xdd, 0xd6, 0x9c, 0x75, 0x76, 0x13, 0x57, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x17, 0x0b, 0x38, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0xf6, 0x0a, 0xd4, 0x12, 0x95, 0x3b, 0x7d, 0xbe, 0x7e, 0xbe, 0x93, 0x1a, 0xb6, 0x0a, 0xb7, 0x0a, 0xb7, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x58, 0x3c, 0xfd, 0xce, 0x3c, 0xf7, 0x3d, 0xef, 0x7f, 0xdf, 0x15, 0x23, 0x18, 0x03, 0x5a, 0x0b, 0x3a, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xd9, 0x02, 0xf9, 0x0a, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x3a, 0x0b, 0x1a, 0x03, 0x1a, 0x03, 0x19, 0x0b, 0x19, 0x0b, 0xf8, 0x0a, 0xb7, 0x02, 0xb7, 0x0a, 0xb4, 0x1a, 0xbe, 0xc6, 0xfc, 0xe6, 0x3d, 0xe7, 0x7f, 0xdf, 0xd7, 0x33, 0x58, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x0a, 0xf9, 0x0a, 0x19, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x18, 0x0b, 0xf9, 0x0a, 0xf8, 0x0a, 0xd7, 0x02, 0xb3, 0x12, 0x7d, 0xbe, 0xfc, 0xde, 0x1c, 0xe7, 0x3d, 0xe7, 0x9f, 0xd7, 0x16, 0x44, 0xd7, 0x1b, 0xfa, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0x77, 0x0b, 0x14, 0x13, 0xf8, 0x7c, 0xfe, 0xd6, 0xdd, 0xde, 0x1e, 0xdf, 0x5f, 0xc7, 0x53, 0x23, 0xb8, 0x13, 0xd9, 0x03, 0x5b, 0x1c, 0x19, 0x14, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xda, 0x0b, 0x99, 0x03, 0x79, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x57, 0x0b, 0x79, 0x0b, 0xf5, 0x12, 0x5c, 0xae, 0xbc, 0xd6, 0xfc, 0xde, 0x3e, 0xd7, 0xdd, 0x7d, 0x96, 0x13, 0xd8, 0x13, 0x1a, 0x14, 0xf9, 0x03, 0xd9, 0x03, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xda, 0x0b, 0x78, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0xf3, 0x1a, 0xbd, 0xc6, 0xbb, 0xde, 0xdb, 0xe6, 0x1e, 0xcf, 0xb9, 0x4c, 0xb8, 0x0b, 0xb8, 0x03, 0xb9, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x99, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x78, 0x03, 0x58, 0x03, 0x77, 0x0b, 0xd2, 0x12, 0xbd, 0xc6, 0xba, 0xde, 0xdb, 0xe6, 0xfd, 0xce, 0x7b, 0x75, 0x76, 0x13, 0xb8, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x58, 0x03, 0x16, 0x0b, 0x13, 0x1b, 0x19, 0x7d, 0x7b, 0xce, 0x9a, 0xde, 0xbb, 0xe6, 0x1f, 0xd7, 0x17, 0x3c, 0x77, 0x0b, 0xf9, 0x13, 0x78, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x0b, 0x36, 0x13, 0x53, 0x33, 0x19, 0xbe, 0x59, 0xce, 0x5c, 0xbe, 0xb8, 0x6c, 0x75, 0x13, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x77, 0x03, 0x36, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x35, 0x0b, 0xb1, 0x22, 0x3d, 0xae, 0x7b, 0xce, 0xbd, 0xce, 0xd8, 0x5c, 0x96, 0x13, 0x56, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x0b, 0xd4, 0x0a, 0x34, 0x2b, 0x7d, 0xb6, 0x5d, 0xb6, 0x73, 0x1a, 0xb6, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xb8, 0x0b, 0x97, 0x0b, 0x37, 0x3c, 0xbc, 0xc6, 0x3c, 0xf7, 0x3c, 0xef, 0x7f, 0xe7, 0xd3, 0x1a, 0xf8, 0x02, 0x5a, 0x0b, 0x3a, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xf9, 0x0a, 0xd8, 0x0a, 0xb7, 0x02, 0xb7, 0x0a, 0xb4, 0x22, 0xbe, 0xc6, 0x1c, 0xe7, 0x3d, 0xe7, 0x7f, 0xdf, 0xb6, 0x33, 0x37, 0x0b, 0x58, 0x03, 0x59, 0x0b, 0x59, 0x0b, 0x38, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x39, 0x0b, 0x38, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x19, 0x0b, 0x18, 0x03, 0x19, 0x03, 0x38, 0x03, 0x19, 0x0b, 0xf9, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb3, 0x12, 0x5c, 0xb6, 0xbb, 0xde, 0xfc, 0xe6, 0x3e, 0xe7, 0x5f, 0xcf, 0xd4, 0x3b, 0xd7, 0x13, 0xd9, 0x03, 0xf9, 0x03, 0xb8, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0x97, 0x0b, 0x14, 0x13, 0xf8, 0x7c, 0xfe, 0xd6, 0xdc, 0xde, 0xfe, 0xd6, 0x5f, 0xc7, 0x53, 0x23, 0xb8, 0x13, 0xd9, 0x0b, 0xbc, 0x24, 0x7b, 0x24, 0xf9, 0x13, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0x7c, 0x1c, 0xfa, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x79, 0x0b, 0xf4, 0x12, 0x5c, 0xae, 0xbb, 0xd6, 0xfb, 0xde, 0x3e, 0xd7, 0xbc, 0x75, 0xb7, 0x1b, 0xd8, 0x13, 0x1a, 0x14, 0xd9, 0x03, 0xd9, 0x03, 0x99, 0x03, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x9d, 0x24, 0xba, 0x0b, 0x99, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x98, 0x0b, 0x56, 0x03, 0xb2, 0x12, 0xfe, 0xce, 0xbb, 0xde, 0xfb, 0xe6, 0x1e, 0xcf, 0x17, 0x3c, 0x97, 0x0b, 0xf9, 0x13, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x98, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x14, 0x1b, 0x7c, 0xbe, 0xfc, 0xe6, 0xdb, 0xde, 0xfe, 0xce, 0xf9, 0x64, 0x76, 0x13, 0xd8, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x99, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x79, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x16, 0x0b, 0xf3, 0x1a, 0x19, 0x7d, 0x7b, 0xce, 0x79, 0xde, 0x9b, 0xe6, 0x1f, 0xd7, 0x37, 0x3c, 0x56, 0x03, 0xd9, 0x13, 0x77, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x0b, 0x35, 0x13, 0x53, 0x3b, 0x19, 0xbe, 0x39, 0xce, 0x5c, 0xbe, 0xf9, 0x74, 0x96, 0x13, 0x98, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x77, 0x03, 0x36, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x15, 0x0b, 0xb1, 0x22, 0x3d, 0xae, 0x9c, 0xce, 0x9c, 0xc6, 0xf4, 0x33, 0x96, 0x13, 0x76, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x0b, 0xf5, 0x12, 0x33, 0x2b, 0xbe, 0xbe, 0x7e, 0xb6, 0x93, 0x1a, 0xd7, 0x12, 0x96, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x0b, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfb, 0x0b, 0xfb, 0x03, 0xdb, 0x03, 0xfb, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x0b, 0xd9, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0xb9, 0x0b, 0x97, 0x13, 0x38, 0x4c, 0xfe, 0xce, 0x5d, 0xe7, 0x5d, 0xef, 0x9f, 0xd7, 0xf4, 0x12, 0x18, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xfa, 0x0a, 0xd9, 0x02, 0xfa, 0x0a, 0xd8, 0x0a, 0xd8, 0x0a, 0xb6, 0x02, 0xb3, 0x22, 0x9e, 0xce, 0x1d, 0xef, 0x1d, 0xe7, 0x7f, 0xdf, 0xd6, 0x3b, 0x16, 0x0b, 0x38, 0x0b, 0x39, 0x0b, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x0b, 0x18, 0x0b, 0x18, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x59, 0x0b, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf8, 0x0a, 0xd8, 0x0a, 0xf7, 0x0a, 0xb4, 0x1a, 0x1c, 0xb6, 0xfc, 0xe6, 0x3d, 0xef, 0x3d, 0xe7, 0xbf, 0xcf, 0x35, 0x3c, 0xf7, 0x13, 0xf9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xba, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xda, 0x0b, 0xfa, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb7, 0x03, 0x54, 0x13, 0x38, 0x85, 0xdd, 0xd6, 0xdc, 0xe6, 0x1e, 0xdf, 0x5f, 0xbf, 0x34, 0x1b, 0x18, 0x14, 0xf8, 0x03, 0xf9, 0x0b, 0x7c, 0x24, 0xd9, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0xd4, 0x12, 0x5d, 0xb6, 0xbc, 0xde, 0xfc, 0xde, 0x3f, 0xd7, 0x5a, 0x6d, 0xb6, 0x1b, 0x97, 0x13, 0x1a, 0x1c, 0xba, 0x0b, 0xdb, 0x0b, 0x79, 0x03, 0xba, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xfa, 0x13, 0xd9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x03, 0xd3, 0x12, 0xbd, 0xc6, 0xdb, 0xde, 0xba, 0xde, 0x3f, 0xd7, 0x17, 0x44, 0x98, 0x1b, 0x98, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x03, 0x98, 0x03, 0xd9, 0x0b, 0x1a, 0x14, 0x98, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x0b, 0xf3, 0x1a, 0x9c, 0xc6, 0xdb, 0xe6, 0xdb, 0xe6, 0x1e, 0xcf, 0x77, 0x44, 0xb7, 0x13, 0xb8, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x56, 0x13, 0xd2, 0x22, 0xf8, 0x7c, 0x7b, 0xce, 0x9b, 0xde, 0x9a, 0xd6, 0x1e, 0xcf, 0xb9, 0x54, 0x77, 0x13, 0x78, 0x0b, 0x98, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x36, 0x03, 0x15, 0x13, 0x33, 0x33, 0xda, 0xbd, 0xb7, 0xc5, 0x3a, 0xbe, 0xf7, 0x74, 0x95, 0x13, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x03, 0x35, 0x0b, 0xd1, 0x22, 0x3d, 0xb6, 0x9c, 0xce, 0x7d, 0xbe, 0x16, 0x34, 0x76, 0x0b, 0x77, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x37, 0x03, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x77, 0x0b, 0x5b, 0x24, 0x98, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x78, 0x13, 0xf5, 0x0a, 0x33, 0x2b, 0xfc, 0xad, 0x9e, 0xc6, 0x93, 0x12, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, + 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xda, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x0b, 0xda, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x0b, 0x97, 0x13, 0x78, 0x54, 0xde, 0xc6, 0x3d, 0xe7, 0x1c, 0xe7, 0x7f, 0xdf, 0xf4, 0x1a, 0x38, 0x0b, 0x19, 0x03, 0xf9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xfa, 0x0a, 0xfa, 0x0a, 0xd9, 0x02, 0xd9, 0x0a, 0xd8, 0x02, 0xd7, 0x0a, 0xb6, 0x0a, 0xd4, 0x22, 0xbd, 0xce, 0x1c, 0xef, 0x1c, 0xe7, 0x7f, 0xd7, 0x57, 0x4c, 0x36, 0x13, 0x37, 0x0b, 0xf8, 0x02, 0x19, 0x03, 0x19, 0x03, 0x18, 0x0b, 0x18, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb3, 0x1a, 0x1c, 0xae, 0xdc, 0xde, 0x3c, 0xef, 0x1d, 0xe7, 0x5f, 0xcf, 0xd4, 0x43, 0x96, 0x1b, 0xb8, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x97, 0x03, 0x34, 0x13, 0x18, 0x85, 0xbc, 0xd6, 0xdc, 0xe6, 0xfe, 0xde, 0x1f, 0xbf, 0x34, 0x1b, 0xd8, 0x13, 0xd8, 0x03, 0xb8, 0x03, 0x1a, 0x14, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x78, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x0b, 0xf4, 0x12, 0x5d, 0xbe, 0xdc, 0xde, 0xfc, 0xde, 0x3f, 0xd7, 0x19, 0x65, 0x96, 0x1b, 0xd8, 0x1b, 0x1a, 0x1c, 0x99, 0x03, 0xba, 0x0b, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0xd3, 0x12, 0xde, 0xc6, 0x9a, 0xd6, 0xdb, 0xe6, 0x3f, 0xdf, 0xba, 0x5c, 0x57, 0x13, 0xb8, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x59, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x0b, 0xf3, 0x1a, 0x9c, 0xbe, 0xbb, 0xde, 0xbb, 0xde, 0xfd, 0xce, 0x16, 0x3c, 0x96, 0x0b, 0xb8, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x56, 0x13, 0xd2, 0x22, 0x39, 0x85, 0x7b, 0xc6, 0x9a, 0xde, 0xfc, 0xe6, 0x5f, 0xd7, 0xb9, 0x54, 0x97, 0x13, 0xd9, 0x13, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x36, 0x03, 0x36, 0x13, 0x54, 0x3b, 0xda, 0xbd, 0xb7, 0xc5, 0xf9, 0xb5, 0x79, 0x85, 0x95, 0x13, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x03, 0x35, 0x0b, 0xd1, 0x22, 0x5d, 0xb6, 0x5b, 0xce, 0x9d, 0xc6, 0xd5, 0x2b, 0x76, 0x0b, 0x77, 0x0b, 0x58, 0x0b, 0x77, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x78, 0x0b, 0x1a, 0x1c, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0x17, 0x03, 0x37, 0x0b, 0xf4, 0x0a, 0x13, 0x23, 0xfc, 0xad, 0x7e, 0xbe, 0x93, 0x12, 0xb6, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, + 0x1a, 0x0c, 0x1a, 0x0c, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x0b, 0x76, 0x1b, 0xb9, 0x5c, 0xfe, 0xce, 0x5d, 0xef, 0x3c, 0xef, 0x9f, 0xdf, 0xf4, 0x1a, 0x18, 0x0b, 0x19, 0x03, 0xf9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xfa, 0x02, 0xfa, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd7, 0x0a, 0x96, 0x0a, 0xf4, 0x2a, 0x9c, 0xce, 0xdb, 0xe6, 0xfb, 0xde, 0x3e, 0xcf, 0xd9, 0x5c, 0x35, 0x13, 0x37, 0x13, 0xf8, 0x02, 0x18, 0x03, 0x19, 0x03, 0x18, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf8, 0x0a, 0xd8, 0x02, 0xf7, 0x02, 0xb4, 0x1a, 0x1c, 0xae, 0xdc, 0xde, 0x3c, 0xe7, 0x1d, 0xe7, 0x5f, 0xd7, 0xd4, 0x4b, 0xb6, 0x23, 0xf9, 0x1b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x96, 0x03, 0x33, 0x13, 0x18, 0x85, 0xbc, 0xd6, 0xdc, 0xe6, 0xfe, 0xde, 0xff, 0xb6, 0x35, 0x23, 0xb7, 0x13, 0xd9, 0x0b, 0xb8, 0x03, 0xd9, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0xf4, 0x1a, 0x7d, 0xbe, 0xdc, 0xde, 0xfc, 0xe6, 0x5f, 0xd7, 0x7b, 0x6d, 0x95, 0x1b, 0xd8, 0x1b, 0x1a, 0x1c, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x58, 0x03, 0x57, 0x03, 0xd3, 0x12, 0x9d, 0xc6, 0x9b, 0xde, 0xbb, 0xde, 0x3f, 0xd7, 0x58, 0x4c, 0x77, 0x13, 0xd8, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x78, 0x03, 0x59, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x0b, 0xf3, 0x1a, 0x9c, 0xbe, 0xbb, 0xde, 0xbb, 0xde, 0xfd, 0xce, 0x36, 0x44, 0x76, 0x0b, 0xb8, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x36, 0x13, 0xd2, 0x22, 0x9a, 0x95, 0x7b, 0xc6, 0x9a, 0xde, 0x79, 0xd6, 0x1f, 0xd7, 0x33, 0x23, 0x56, 0x0b, 0xb8, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x56, 0x0b, 0x36, 0x13, 0x34, 0x33, 0xda, 0xbd, 0x5a, 0xd6, 0x3a, 0xbe, 0x79, 0x85, 0x95, 0x13, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x03, 0x35, 0x13, 0xd1, 0x22, 0x5d, 0xb6, 0x7b, 0xc6, 0xfd, 0xc6, 0xb4, 0x23, 0x96, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x03, 0x98, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x57, 0x03, 0x98, 0x0b, 0x37, 0x03, 0x38, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x16, 0x0b, 0xf5, 0x0a, 0x13, 0x23, 0x1c, 0xb6, 0x9e, 0xc6, 0xb3, 0x12, 0xd6, 0x0a, 0xd6, 0x0a, 0xb6, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x0b, 0xb8, 0x13, 0x56, 0x13, 0x78, 0x5c, 0xde, 0xce, 0x5d, 0xef, 0x5c, 0xef, 0x7f, 0xd7, 0xf4, 0x1a, 0x38, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd7, 0x0a, 0x95, 0x02, 0x14, 0x2b, 0x9c, 0xce, 0xdb, 0xe6, 0x1c, 0xe7, 0x1e, 0xcf, 0x3a, 0x6d, 0x15, 0x13, 0x37, 0x13, 0x18, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf8, 0x02, 0x18, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xd4, 0x12, 0x1c, 0xae, 0xdc, 0xde, 0x3c, 0xe7, 0x3d, 0xdf, 0x5f, 0xcf, 0xd4, 0x3b, 0x96, 0x13, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x96, 0x03, 0x53, 0x13, 0x38, 0x85, 0xbc, 0xd6, 0xfc, 0xde, 0x1e, 0xdf, 0xff, 0xb6, 0x55, 0x23, 0xb8, 0x13, 0xfa, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0xf4, 0x1a, 0x7d, 0xbe, 0xdc, 0xde, 0x1c, 0xdf, 0x5e, 0xd7, 0x3d, 0x86, 0x95, 0x1b, 0xb7, 0x13, 0x19, 0x1c, 0xfa, 0x13, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0xf3, 0x12, 0x3b, 0xb6, 0xbb, 0xe6, 0xba, 0xde, 0x1e, 0xd7, 0x17, 0x44, 0x97, 0x13, 0xf9, 0x0b, 0xb8, 0x03, 0xd8, 0x03, 0x98, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x56, 0x03, 0xf3, 0x1a, 0x9c, 0xbe, 0xdb, 0xde, 0xdb, 0xde, 0x1e, 0xcf, 0xd9, 0x54, 0x96, 0x13, 0x97, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x16, 0x13, 0xd2, 0x22, 0xdc, 0x9d, 0x9c, 0xce, 0x9a, 0xde, 0xdb, 0xde, 0x1e, 0xd7, 0xb5, 0x33, 0x97, 0x13, 0x19, 0x14, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x36, 0x13, 0x13, 0x33, 0x3b, 0xc6, 0xdc, 0xe6, 0x7b, 0xc6, 0x59, 0x85, 0x95, 0x13, 0xb8, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x03, 0x15, 0x13, 0xd1, 0x22, 0x5d, 0xb6, 0x9b, 0xce, 0x1e, 0xcf, 0xf5, 0x2b, 0x96, 0x0b, 0x97, 0x0b, 0x98, 0x0b, 0xd8, 0x0b, 0x98, 0x03, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x16, 0x0b, 0xf4, 0x02, 0xd2, 0x1a, 0x1c, 0xae, 0x7e, 0xbe, 0x92, 0x12, 0xb5, 0x02, 0xb5, 0x02, 0x95, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x96, 0x0a, + 0xf9, 0x03, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xf9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xb8, 0x13, 0x77, 0x1b, 0x78, 0x54, 0xde, 0xce, 0x3d, 0xe7, 0x5d, 0xef, 0x3f, 0xcf, 0x14, 0x1b, 0x38, 0x03, 0x39, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0x75, 0x02, 0x35, 0x33, 0xfe, 0xd6, 0x1c, 0xef, 0x3d, 0xef, 0x3f, 0xd7, 0xbd, 0x7d, 0xf5, 0x12, 0x17, 0x13, 0xf7, 0x0a, 0xf8, 0x02, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xf8, 0x02, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0x18, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xb3, 0x12, 0x1c, 0xae, 0xdc, 0xde, 0x1c, 0xe7, 0x1d, 0xdf, 0x5f, 0xcf, 0xd4, 0x3b, 0x96, 0x13, 0xd9, 0x0b, 0x98, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xfa, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x96, 0x03, 0x53, 0x13, 0x37, 0x85, 0xbc, 0xce, 0xfc, 0xde, 0x1e, 0xd7, 0xff, 0xb6, 0x75, 0x23, 0xb7, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x0b, 0xf4, 0x1a, 0x7d, 0xbe, 0xdc, 0xde, 0xfc, 0xde, 0x5e, 0xd7, 0x5e, 0x86, 0x75, 0x13, 0xb7, 0x13, 0x19, 0x1c, 0x3a, 0x1c, 0xb9, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0xf4, 0x1a, 0x3b, 0xb6, 0x9b, 0xde, 0xfb, 0xe6, 0x3e, 0xd7, 0xb9, 0x54, 0x76, 0x13, 0xf8, 0x0b, 0xd8, 0x03, 0xb7, 0x03, 0x98, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x56, 0x03, 0xf2, 0x12, 0x7c, 0xbe, 0xdb, 0xde, 0xfb, 0xde, 0x3e, 0xd7, 0x3a, 0x65, 0xb6, 0x13, 0x97, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x37, 0x03, 0x15, 0x13, 0xd2, 0x22, 0x1c, 0xa6, 0x5b, 0xc6, 0x7a, 0xd6, 0xbb, 0xde, 0xfe, 0xce, 0x37, 0x3c, 0x97, 0x0b, 0xb8, 0x0b, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x35, 0x13, 0x54, 0x3b, 0x9c, 0xce, 0x5a, 0xd6, 0x7b, 0xc6, 0x59, 0x7d, 0x95, 0x13, 0xb8, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x03, 0x15, 0x13, 0xd1, 0x22, 0x5d, 0xb6, 0x9c, 0xce, 0xfe, 0xc6, 0x36, 0x34, 0xb6, 0x0b, 0x77, 0x03, 0x98, 0x0b, 0x3a, 0x1c, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x17, 0x03, 0x37, 0x0b, 0xf6, 0x0a, 0xf4, 0x0a, 0xd1, 0x1a, 0x3c, 0xb6, 0x9e, 0xc6, 0xb2, 0x12, 0xb5, 0x02, 0xb5, 0x0a, 0x96, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0x19, 0x14, 0x39, 0x14, 0x3a, 0x14, 0x3a, 0x14, 0x1a, 0x14, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb8, 0x0b, 0xb8, 0x13, 0x97, 0x23, 0x99, 0x5c, 0xfe, 0xce, 0x1c, 0xe7, 0x7d, 0xef, 0x3f, 0xcf, 0xf4, 0x12, 0x38, 0x03, 0x39, 0x03, 0x19, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xd6, 0x0a, 0x94, 0x0a, 0x96, 0x43, 0x1f, 0xdf, 0xfc, 0xe6, 0x3d, 0xe7, 0x3f, 0xd7, 0x1e, 0x8e, 0xf5, 0x1a, 0x16, 0x13, 0xd6, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf7, 0x0a, 0xf7, 0x0a, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0x18, 0x0b, 0xf7, 0x0a, 0xf7, 0x0a, 0xb3, 0x12, 0x1c, 0xae, 0xbc, 0xd6, 0x1c, 0xe7, 0xfd, 0xde, 0x3f, 0xd7, 0x15, 0x54, 0xd7, 0x2b, 0x3a, 0x2c, 0x98, 0x0b, 0x77, 0x03, 0x77, 0x03, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x56, 0x03, 0x13, 0x13, 0x17, 0x7d, 0xbc, 0xce, 0xfb, 0xde, 0x3e, 0xd7, 0x1f, 0xb7, 0x54, 0x1b, 0xb7, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0x79, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x37, 0x0b, 0xf3, 0x1a, 0x7d, 0xbe, 0xdc, 0xde, 0xfc, 0xde, 0x5e, 0xd7, 0xdc, 0x7d, 0x95, 0x13, 0xd7, 0x13, 0xd8, 0x13, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0xf3, 0x1a, 0x3b, 0xb6, 0xdb, 0xe6, 0xda, 0xde, 0xfe, 0xce, 0x99, 0x54, 0x56, 0x13, 0xd8, 0x0b, 0xd8, 0x03, 0xb7, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x36, 0x03, 0xd2, 0x12, 0x7b, 0xbe, 0xba, 0xde, 0xdb, 0xe6, 0x1e, 0xd7, 0x5a, 0x65, 0x96, 0x13, 0xb7, 0x13, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x77, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x37, 0x03, 0x15, 0x13, 0xb1, 0x22, 0x3d, 0xae, 0x9c, 0xd6, 0xba, 0xde, 0x9a, 0xd6, 0xfe, 0xce, 0x16, 0x3c, 0xb7, 0x13, 0x97, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x15, 0x13, 0x34, 0x33, 0x7c, 0xce, 0x3a, 0xd6, 0x7b, 0xc6, 0xd7, 0x74, 0x95, 0x13, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x03, 0x14, 0x13, 0xd1, 0x22, 0x5d, 0xb6, 0x7b, 0xce, 0xbd, 0xbe, 0x36, 0x34, 0x96, 0x0b, 0x57, 0x03, 0x98, 0x0b, 0x5a, 0x24, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x0b, 0x15, 0x0b, 0xd1, 0x1a, 0x5d, 0xbe, 0xbf, 0xc6, 0xb3, 0x1a, 0xd5, 0x0a, 0xd6, 0x0a, 0xb6, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x75, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, + 0x39, 0x24, 0x39, 0x24, 0x7a, 0x24, 0xbb, 0x2c, 0xbb, 0x2c, 0x5a, 0x1c, 0xf9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb8, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0xd8, 0x13, 0x19, 0x1c, 0xf8, 0x1b, 0x18, 0x1c, 0xd8, 0x13, 0x97, 0x13, 0x76, 0x1b, 0xb9, 0x64, 0xdd, 0xce, 0xfb, 0xe6, 0x5c, 0xef, 0x3e, 0xcf, 0xf3, 0x1a, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xf8, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xf8, 0x0a, 0xf8, 0x0a, 0x17, 0x03, 0xf8, 0x02, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x0a, 0xd7, 0x02, 0xd6, 0x0a, 0xd6, 0x0a, 0x94, 0x0a, 0xd6, 0x4b, 0x1e, 0xd7, 0xdb, 0xe6, 0x1c, 0xe7, 0x5f, 0xdf, 0x1e, 0x96, 0xd4, 0x12, 0xf6, 0x12, 0xb6, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x16, 0x03, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x0a, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x18, 0x0b, 0x17, 0x0b, 0xf7, 0x0a, 0xf7, 0x0a, 0xd3, 0x1a, 0x1c, 0xae, 0xdc, 0xd6, 0x1c, 0xe7, 0xfd, 0xde, 0x1f, 0xd7, 0xf5, 0x53, 0xd6, 0x33, 0x7a, 0x34, 0xf8, 0x23, 0xd7, 0x1b, 0x96, 0x13, 0xb7, 0x1b, 0xb7, 0x13, 0x97, 0x13, 0x96, 0x0b, 0x97, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb7, 0x03, 0xb7, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x78, 0x13, 0x77, 0x13, 0x56, 0x0b, 0x13, 0x13, 0x38, 0x85, 0xdc, 0xd6, 0xdb, 0xde, 0x1d, 0xd7, 0x3f, 0xbf, 0x33, 0x1b, 0xd7, 0x1b, 0xd8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x77, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0xf4, 0x1a, 0x9d, 0xbe, 0xdc, 0xde, 0xfc, 0xde, 0x5e, 0xd7, 0x9b, 0x6d, 0xb6, 0x1b, 0xd8, 0x13, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0xf3, 0x12, 0x5b, 0xb6, 0xfb, 0xe6, 0xba, 0xde, 0xdd, 0xce, 0xd9, 0x5c, 0x76, 0x13, 0xb7, 0x0b, 0xb7, 0x03, 0xb7, 0x03, 0x97, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0xd2, 0x1a, 0x5b, 0xbe, 0xba, 0xde, 0xba, 0xe6, 0x1d, 0xd7, 0x7b, 0x6d, 0x75, 0x13, 0x97, 0x0b, 0xb8, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x15, 0x13, 0xb1, 0x1a, 0x3d, 0xae, 0x9b, 0xce, 0x79, 0xd6, 0xdb, 0xe6, 0xbd, 0xc6, 0x57, 0x44, 0x76, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x36, 0x13, 0x34, 0x33, 0x3b, 0xc6, 0x7b, 0xde, 0x7b, 0xc6, 0xf7, 0x74, 0x95, 0x13, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x36, 0x03, 0x14, 0x13, 0xd1, 0x2a, 0x5d, 0xb6, 0x7b, 0xce, 0x7d, 0xbe, 0xf6, 0x33, 0x96, 0x0b, 0x77, 0x0b, 0xb8, 0x13, 0xf9, 0x13, 0x77, 0x03, 0x37, 0x03, 0x38, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x38, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x58, 0x0b, 0x17, 0x03, 0x57, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x0b, 0xd4, 0x02, 0x91, 0x12, 0x5d, 0xbe, 0x9e, 0xc6, 0x92, 0x12, 0x95, 0x02, 0xb5, 0x02, 0x95, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x95, 0x02, 0x95, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, + 0x18, 0x2c, 0xb6, 0x1b, 0x75, 0x13, 0x96, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0xb8, 0x0b, 0xf9, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x13, 0x18, 0x1c, 0x59, 0x2c, 0x39, 0x2c, 0x59, 0x2c, 0x9a, 0x34, 0x18, 0x2c, 0x96, 0x23, 0x1a, 0x75, 0x1d, 0xdf, 0x1b, 0xef, 0x5c, 0xf7, 0x5f, 0xdf, 0x13, 0x1b, 0x37, 0x0b, 0x18, 0x03, 0xf7, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x18, 0x03, 0xf8, 0x0a, 0x18, 0x0b, 0xf7, 0x0a, 0xd6, 0x0a, 0xd6, 0x12, 0x94, 0x0a, 0xf7, 0x4b, 0x1e, 0xdf, 0xfb, 0xe6, 0x3c, 0xef, 0x5f, 0xdf, 0x1d, 0x8e, 0x92, 0x0a, 0xf5, 0x12, 0xd6, 0x0a, 0x17, 0x0b, 0x17, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x56, 0x03, 0x57, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0xf7, 0x02, 0xf7, 0x02, 0xf6, 0x0a, 0xf6, 0x0a, 0xd6, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0x17, 0x0b, 0xf7, 0x02, 0xd6, 0x02, 0xf6, 0x0a, 0xb3, 0x12, 0xfc, 0xad, 0xbc, 0xde, 0x1c, 0xe7, 0x1d, 0xdf, 0x3e, 0xcf, 0xd3, 0x43, 0x95, 0x23, 0x79, 0x34, 0x59, 0x2c, 0xba, 0x3c, 0x79, 0x34, 0x99, 0x3c, 0x79, 0x3c, 0x59, 0x34, 0x18, 0x34, 0xf8, 0x2b, 0xf9, 0x23, 0xf9, 0x23, 0xf9, 0x23, 0xd8, 0x1b, 0xf8, 0x1b, 0xf8, 0x13, 0xd8, 0x1b, 0xd8, 0x1b, 0x99, 0x1b, 0x78, 0x1b, 0x57, 0x13, 0x13, 0x1b, 0x59, 0x95, 0xfd, 0xde, 0xdc, 0xde, 0xfd, 0xd6, 0x3f, 0xbf, 0x13, 0x1b, 0x18, 0x24, 0x18, 0x14, 0xf8, 0x13, 0xd8, 0x0b, 0x19, 0x14, 0x97, 0x0b, 0xd8, 0x0b, 0xf8, 0x13, 0xd8, 0x0b, 0xb8, 0x0b, 0x97, 0x0b, 0xb8, 0x0b, 0xd8, 0x13, 0xf9, 0x13, 0xd8, 0x13, 0xb8, 0x13, 0x97, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0xf3, 0x1a, 0x9d, 0xbe, 0xdc, 0xde, 0xfc, 0xde, 0x5f, 0xd7, 0x7a, 0x6d, 0x96, 0x1b, 0xb7, 0x13, 0xd9, 0x13, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x77, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x14, 0x1b, 0x7c, 0xbe, 0xba, 0xd6, 0xfb, 0xde, 0x1e, 0xd7, 0x1e, 0x86, 0x56, 0x0b, 0xb7, 0x0b, 0xb7, 0x03, 0x97, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0xd2, 0x1a, 0x5b, 0xc6, 0xba, 0xe6, 0xda, 0xe6, 0x1d, 0xd7, 0xdc, 0x7d, 0x96, 0x13, 0x76, 0x0b, 0x97, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x77, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x03, 0x77, 0x0b, 0x56, 0x03, 0x36, 0x03, 0x15, 0x13, 0x91, 0x1a, 0x3d, 0xae, 0x9b, 0xce, 0x9a, 0xde, 0xdb, 0xde, 0xfe, 0xce, 0xd5, 0x33, 0x97, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x36, 0x03, 0x76, 0x1b, 0x95, 0x43, 0x1a, 0xbe, 0x5a, 0xd6, 0x5a, 0xbe, 0x9a, 0x8d, 0x95, 0x13, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x36, 0x03, 0x14, 0x13, 0xd1, 0x2a, 0x5d, 0xb6, 0x9c, 0xd6, 0x9d, 0xc6, 0xd5, 0x2b, 0x76, 0x0b, 0x77, 0x0b, 0xb9, 0x13, 0x97, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x17, 0x03, 0x57, 0x03, 0x37, 0x03, 0x17, 0x03, 0xf6, 0x02, 0xf4, 0x0a, 0x91, 0x12, 0x7d, 0xbe, 0xbf, 0xc6, 0x93, 0x12, 0xb5, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x02, 0xb5, 0x02, 0x96, 0x02, 0x95, 0x02, 0x95, 0x02, 0x95, 0x02, 0x76, 0x02, 0x75, 0x02, 0x96, 0x02, 0x96, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x95, 0x02, 0x95, 0x0a, + 0xdc, 0xee, 0xbc, 0xe6, 0xdc, 0xe6, 0xdd, 0xee, 0x9b, 0xde, 0x5b, 0xd6, 0x7b, 0xd6, 0xbd, 0xd6, 0x7c, 0xc6, 0x7c, 0xbe, 0x1b, 0xae, 0x1b, 0xa6, 0xba, 0x95, 0xf7, 0x74, 0xd7, 0x6c, 0xf8, 0x6c, 0x77, 0x5c, 0x35, 0x5c, 0x95, 0x74, 0x1a, 0xae, 0x3e, 0xe7, 0x3e, 0xe7, 0x3d, 0xe7, 0x3d, 0xe7, 0x9b, 0xc6, 0x16, 0x8d, 0x7a, 0xa5, 0xbb, 0xad, 0x5d, 0xbe, 0xbe, 0xce, 0x3c, 0xae, 0xba, 0x9d, 0x7a, 0x95, 0xbb, 0x9d, 0xfc, 0xad, 0xdb, 0xb5, 0x5d, 0xce, 0x5e, 0xc6, 0x7a, 0x95, 0x15, 0x5c, 0x57, 0x54, 0x17, 0x54, 0x99, 0x64, 0x17, 0x5c, 0xf6, 0x4b, 0xd5, 0x4b, 0xb8, 0x6c, 0x3c, 0xae, 0x1e, 0xd7, 0x1d, 0xe7, 0xfc, 0xde, 0x3e, 0xe7, 0x7d, 0xbe, 0x12, 0x3b, 0x34, 0x33, 0x55, 0x2b, 0x34, 0x23, 0x14, 0x1b, 0x34, 0x23, 0x14, 0x1b, 0x56, 0x1b, 0x56, 0x13, 0x15, 0x0b, 0x35, 0x13, 0x15, 0x0b, 0x36, 0x13, 0x37, 0x13, 0x37, 0x0b, 0x36, 0x03, 0x16, 0x0b, 0x15, 0x13, 0x16, 0x13, 0x17, 0x03, 0x58, 0x0b, 0xf5, 0x0a, 0x71, 0x1a, 0x5d, 0xc6, 0xdd, 0xee, 0xfc, 0xee, 0x3d, 0xef, 0x3d, 0xdf, 0xde, 0xc6, 0x39, 0x7d, 0x74, 0x33, 0x34, 0x13, 0x14, 0x0b, 0x35, 0x13, 0x15, 0x0b, 0x15, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x35, 0x1b, 0x55, 0x1b, 0x35, 0x13, 0x14, 0x0b, 0xf5, 0x12, 0xd5, 0x0a, 0x35, 0x13, 0x14, 0x0b, 0x55, 0x0b, 0x14, 0x0b, 0xf2, 0x12, 0xf5, 0x4b, 0x3c, 0xbe, 0xbc, 0xde, 0xfc, 0xe6, 0xdd, 0xd6, 0x5f, 0xcf, 0x93, 0x3b, 0x33, 0x23, 0x35, 0x13, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x36, 0x0b, 0x15, 0x0b, 0x15, 0x0b, 0xf5, 0x0a, 0x16, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x54, 0x0b, 0x74, 0x13, 0x13, 0x13, 0xf3, 0x2a, 0x9f, 0xc6, 0xdd, 0xd6, 0xdb, 0xd6, 0x9d, 0xd7, 0x3a, 0x86, 0x92, 0x1b, 0xd6, 0x1b, 0xf7, 0x1b, 0x17, 0x1c, 0x17, 0x1c, 0xf6, 0x13, 0xb5, 0x0b, 0x96, 0x13, 0x97, 0x1b, 0x97, 0x1b, 0xd8, 0x23, 0x19, 0x2c, 0x3a, 0x2c, 0xf9, 0x23, 0x97, 0x13, 0x19, 0x24, 0x3a, 0x24, 0x39, 0x24, 0xf8, 0x1b, 0xf7, 0x1b, 0xd6, 0x1b, 0x95, 0x13, 0xd0, 0x12, 0x9c, 0xbe, 0x9b, 0xd6, 0xbb, 0xde, 0x1d, 0xe7, 0x78, 0x8d, 0xf5, 0x43, 0x18, 0x2c, 0xf9, 0x23, 0x1a, 0x2c, 0xb8, 0x23, 0xb7, 0x23, 0xd7, 0x2b, 0x18, 0x24, 0x18, 0x2c, 0xd7, 0x2b, 0x97, 0x2b, 0xf7, 0x2b, 0xf8, 0x2b, 0xf8, 0x1b, 0xd8, 0x13, 0xd8, 0x13, 0xf8, 0x13, 0xf8, 0x13, 0xd7, 0x13, 0xb8, 0x13, 0xb8, 0x23, 0xf5, 0x1a, 0xf2, 0x32, 0xdc, 0xc6, 0x98, 0xce, 0xba, 0xd6, 0x9b, 0xc6, 0xdf, 0xae, 0x53, 0x1b, 0x96, 0x1b, 0xb7, 0x13, 0xd8, 0x0b, 0xd8, 0x0b, 0xd8, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0xb8, 0x13, 0x78, 0x0b, 0x79, 0x0b, 0x58, 0x03, 0x98, 0x0b, 0x56, 0x03, 0x55, 0x03, 0x96, 0x0b, 0x35, 0x03, 0x98, 0x1b, 0x78, 0x1b, 0x57, 0x0b, 0x35, 0x13, 0x4e, 0x1a, 0x7d, 0xbe, 0x9b, 0xce, 0x99, 0xd6, 0xda, 0xd6, 0xfd, 0xc6, 0x37, 0x44, 0x76, 0x13, 0x98, 0x1b, 0x58, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x77, 0x13, 0x14, 0x13, 0x53, 0x3b, 0x3b, 0xce, 0x19, 0xde, 0x7c, 0xce, 0xbb, 0x95, 0x95, 0x13, 0xb8, 0x03, 0x97, 0x03, 0x77, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x77, 0x03, 0x78, 0x0b, 0x38, 0x0b, 0x59, 0x13, 0x38, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x56, 0x03, 0x76, 0x0b, 0x56, 0x0b, 0x16, 0x0b, 0x5a, 0x13, 0x1a, 0x0b, 0xf8, 0x12, 0xf6, 0x22, 0xd0, 0x32, 0x3b, 0xb6, 0xbb, 0xd6, 0xdc, 0xc6, 0x57, 0x34, 0xd8, 0x0b, 0x99, 0x03, 0x58, 0x0b, 0x97, 0x13, 0x35, 0x0b, 0x56, 0x03, 0x57, 0x03, 0x17, 0x0b, 0x58, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x16, 0x03, 0x37, 0x03, 0x56, 0x03, 0x56, 0x03, 0x55, 0x03, 0x55, 0x03, 0x35, 0x0b, 0x15, 0x0b, 0xf4, 0x12, 0xd4, 0x12, 0xf5, 0x12, 0x92, 0x22, 0x7d, 0xd6, 0x5d, 0xce, 0x92, 0x12, 0x16, 0x0b, 0xd5, 0x02, 0xf6, 0x12, 0xb6, 0x0a, 0xb6, 0x0a, 0x95, 0x02, 0x95, 0x02, 0x75, 0x02, 0xb6, 0x0a, 0x94, 0x02, 0xb5, 0x02, 0xb5, 0x0a, 0xb5, 0x02, 0xd5, 0x0a, 0xb5, 0x02, 0x94, 0x02, 0xb5, 0x02, 0xb5, 0x02, 0x94, 0x02, + 0x3a, 0xf7, 0x1a, 0xf7, 0x19, 0xef, 0x1a, 0xf7, 0x1a, 0xf7, 0xd9, 0xee, 0xf9, 0xee, 0x3b, 0xf7, 0xfa, 0xee, 0x1b, 0xf7, 0xda, 0xe6, 0xfb, 0xee, 0xfb, 0xee, 0xdb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xbb, 0xe6, 0x99, 0xe6, 0x1b, 0xf7, 0xfb, 0xf6, 0xba, 0xee, 0xfa, 0xee, 0x3a, 0xef, 0x1a, 0xef, 0xfa, 0xe6, 0x3c, 0xef, 0x1b, 0xef, 0xd9, 0xde, 0x1a, 0xe7, 0x3a, 0xdf, 0x3a, 0xdf, 0x3a, 0xdf, 0x39, 0xe7, 0x19, 0xe7, 0xd8, 0xe6, 0xd8, 0xee, 0xf9, 0xf6, 0x3a, 0xef, 0x1a, 0xe7, 0xfa, 0xde, 0xda, 0xde, 0x3c, 0xef, 0xda, 0xe6, 0x1b, 0xef, 0x1b, 0xef, 0xb9, 0xe6, 0xb9, 0xe6, 0xda, 0xee, 0xdb, 0xee, 0xb9, 0xee, 0xb9, 0xee, 0xfa, 0xee, 0x1a, 0xef, 0x1a, 0xdf, 0x3b, 0xe7, 0x3c, 0xe7, 0x1c, 0xef, 0xfc, 0xee, 0xdc, 0xee, 0xdd, 0xee, 0xbc, 0xe6, 0x9b, 0xe6, 0xbc, 0xde, 0xbc, 0xde, 0xbc, 0xd6, 0x9c, 0xd6, 0x7c, 0xce, 0x9c, 0xc6, 0x7b, 0xc6, 0x5a, 0xc6, 0x3a, 0xbe, 0x7c, 0xb6, 0xfb, 0xa5, 0x5c, 0xae, 0x5b, 0xb6, 0xba, 0xde, 0xb9, 0xe6, 0x1a, 0xef, 0xd9, 0xe6, 0xd8, 0xee, 0xfa, 0xf6, 0x1b, 0xf7, 0x9a, 0xde, 0xdb, 0xd6, 0xfc, 0xd6, 0xdb, 0xd6, 0x9b, 0xd6, 0x9c, 0xd6, 0x9c, 0xd6, 0xbc, 0xd6, 0x9b, 0xd6, 0x9b, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x7b, 0xd6, 0xdd, 0xde, 0xbc, 0xd6, 0x7a, 0xce, 0x59, 0xc6, 0x79, 0xc6, 0x58, 0xbe, 0x38, 0xbe, 0xda, 0xce, 0xba, 0xd6, 0xb9, 0xde, 0xb9, 0xd6, 0xfa, 0xe6, 0xfc, 0xe6, 0x1d, 0xe7, 0x5b, 0xce, 0xbd, 0xd6, 0x5b, 0xbe, 0x5a, 0xbe, 0x5a, 0xbe, 0x7a, 0xbe, 0x7a, 0xb6, 0x3a, 0xb6, 0x19, 0xae, 0xf9, 0xad, 0x7b, 0xbe, 0x7b, 0xbe, 0x7b, 0xbe, 0x5b, 0xbe, 0x3a, 0xb6, 0xfa, 0xad, 0xd9, 0xa5, 0xda, 0xa5, 0xdb, 0x9d, 0x7a, 0x95, 0x9b, 0x9d, 0xfb, 0xad, 0xbc, 0xde, 0x9a, 0xe6, 0x1a, 0xe7, 0x1c, 0xd7, 0x1f, 0xbf, 0xf5, 0x43, 0x56, 0x2b, 0x38, 0x23, 0x16, 0x13, 0x37, 0x13, 0x78, 0x1b, 0x37, 0x13, 0x55, 0x0b, 0x34, 0x0b, 0x55, 0x0b, 0x96, 0x13, 0x96, 0x1b, 0x35, 0x13, 0x35, 0x0b, 0x35, 0x13, 0x56, 0x13, 0x35, 0x13, 0x15, 0x0b, 0x14, 0x0b, 0xf4, 0x12, 0x34, 0x1b, 0xd2, 0x12, 0x35, 0x4c, 0xfd, 0xce, 0xba, 0xde, 0x1b, 0xdf, 0xdb, 0xce, 0xbb, 0xb6, 0x12, 0x4c, 0x93, 0x23, 0x33, 0x13, 0xb6, 0x23, 0x34, 0x13, 0xf3, 0x02, 0xf2, 0x02, 0x13, 0x03, 0x14, 0x03, 0x35, 0x03, 0x55, 0x0b, 0xf3, 0x0a, 0xf2, 0x0a, 0x13, 0x03, 0x54, 0x0b, 0x34, 0x0b, 0xd3, 0x02, 0xd2, 0x0a, 0xf3, 0x12, 0xb2, 0x0a, 0x71, 0x12, 0xb2, 0x2a, 0x56, 0x74, 0xdc, 0xd6, 0xba, 0xde, 0x9a, 0xe6, 0xbc, 0xde, 0xff, 0xbe, 0xd5, 0x43, 0x13, 0x23, 0x14, 0x23, 0xd4, 0x12, 0xf4, 0x12, 0xf2, 0x02, 0x13, 0x03, 0x53, 0x03, 0x53, 0x03, 0x54, 0x03, 0x75, 0x0b, 0x35, 0x03, 0x14, 0x0b, 0x54, 0x1b, 0xb6, 0x2b, 0x76, 0x1b, 0xd8, 0x2b, 0x98, 0x23, 0x37, 0x1b, 0x76, 0x13, 0x33, 0x1b, 0xaf, 0x2a, 0x5c, 0xbe, 0x9b, 0xce, 0x9b, 0xd6, 0xbb, 0xd6, 0x3e, 0xd7, 0xb8, 0x5c, 0x95, 0x1b, 0xb7, 0x1b, 0xd8, 0x1b, 0xb7, 0x0b, 0xb7, 0x0b, 0xb7, 0x0b, 0xb7, 0x0b, 0xd8, 0x13, 0xf8, 0x13, 0xf8, 0x13, 0xf8, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xd8, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0x97, 0x0b, 0x77, 0x03, 0x97, 0x0b, 0x35, 0x0b, 0x35, 0x13, 0xd5, 0x4b, 0xfa, 0xc5, 0x5a, 0xde, 0xfd, 0xde, 0xda, 0x95, 0x94, 0x1b, 0xb7, 0x0b, 0xb7, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x77, 0x03, 0x76, 0x03, 0x76, 0x03, 0x55, 0x03, 0x56, 0x03, 0x56, 0x03, 0x76, 0x03, 0x76, 0x03, 0x96, 0x0b, 0x95, 0x0b, 0x95, 0x0b, 0x76, 0x03, 0x76, 0x03, 0x76, 0x03, 0xb5, 0x0b, 0x52, 0x13, 0x0e, 0x23, 0xbc, 0xbe, 0x79, 0xce, 0xbc, 0xce, 0x36, 0x44, 0x97, 0x13, 0x78, 0x0b, 0x59, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x77, 0x03, 0x57, 0x03, 0x17, 0x0b, 0x17, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x18, 0x0b, 0x18, 0x13, 0x17, 0x13, 0xf7, 0x0a, 0xf8, 0x0a, 0x18, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf5, 0x02, 0x14, 0x1b, 0x5c, 0xae, 0x7d, 0xb6, 0x34, 0x2b, 0x73, 0x02, 0x52, 0x0a, 0x53, 0x12, 0x34, 0x0a, 0x55, 0x0a, 0x75, 0x0a, 0x34, 0x02, 0x33, 0x02, 0x33, 0x02, 0x33, 0x02, 0xf2, 0x01, 0x94, 0x12, 0xf2, 0x01, 0x53, 0x0a, 0x74, 0x0a, 0x74, 0x0a, 0x33, 0x02, 0x33, 0x02, 0x33, 0x02, + 0x5c, 0xe7, 0x5c, 0xe7, 0x3c, 0xe7, 0x3c, 0xef, 0x5c, 0xef, 0x3c, 0xef, 0x3c, 0xef, 0x5d, 0xf7, 0x1c, 0xef, 0x3c, 0xf7, 0xfb, 0xee, 0xdb, 0xee, 0x1c, 0xef, 0x3c, 0xf7, 0x3c, 0xf7, 0xfb, 0xee, 0x1b, 0xef, 0x5c, 0xf7, 0x3b, 0xe7, 0x5c, 0xef, 0x3d, 0xe7, 0x1c, 0xdf, 0x7e, 0xef, 0x9e, 0xf7, 0x1c, 0xef, 0x3d, 0xff, 0x1c, 0xf7, 0x3c, 0xff, 0x1b, 0xff, 0x3b, 0xff, 0xdb, 0xfe, 0xdb, 0xf6, 0xfb, 0xde, 0x5c, 0xe7, 0x3c, 0xef, 0x1c, 0xef, 0x1c, 0xe7, 0x3c, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0x1b, 0xe7, 0x1b, 0xe7, 0x3c, 0xef, 0xfb, 0xe6, 0xfb, 0xee, 0xdb, 0xee, 0xba, 0xe6, 0xfb, 0xe6, 0xfb, 0xe6, 0x3c, 0xef, 0x1c, 0xef, 0xfa, 0xee, 0x1a, 0xef, 0xd8, 0xde, 0xf9, 0xde, 0xf9, 0xde, 0xda, 0xe6, 0xfc, 0xf6, 0xbb, 0xee, 0xdc, 0xf6, 0xfb, 0xee, 0x99, 0xe6, 0xd9, 0xe6, 0xda, 0xe6, 0xba, 0xe6, 0xfb, 0xee, 0x1b, 0xef, 0xfb, 0xee, 0xda, 0xe6, 0xba, 0xe6, 0xd9, 0xee, 0xf9, 0xee, 0xd9, 0xe6, 0x1b, 0xe7, 0xda, 0xde, 0x99, 0xd6, 0xb9, 0xde, 0x1a, 0xef, 0x1b, 0xe7, 0x3c, 0xe7, 0xdb, 0xde, 0xdc, 0xe6, 0x1d, 0xf7, 0xfc, 0xee, 0xdb, 0xe6, 0x3c, 0xef, 0x1a, 0xe7, 0xfb, 0xe6, 0xfb, 0xee, 0xfc, 0xee, 0xfb, 0xe6, 0xfa, 0xe6, 0xfa, 0xe6, 0xfb, 0xe6, 0xfb, 0xde, 0xdb, 0xde, 0xda, 0xe6, 0xda, 0xe6, 0xba, 0xe6, 0xdb, 0xe6, 0x1c, 0xef, 0xdc, 0xe6, 0x9b, 0xe6, 0x7b, 0xde, 0x5a, 0xd6, 0xfc, 0xe6, 0xfb, 0xe6, 0x1b, 0xef, 0xfa, 0xee, 0x79, 0xde, 0x1d, 0xf7, 0xbc, 0xe6, 0xbc, 0xe6, 0xbb, 0xde, 0xbb, 0xde, 0xdb, 0xde, 0xdc, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbc, 0xde, 0xdc, 0xde, 0xbc, 0xde, 0xdc, 0xde, 0xdd, 0xde, 0xfd, 0xde, 0xfc, 0xde, 0xfa, 0xde, 0xfa, 0xde, 0x79, 0xce, 0xfc, 0xe6, 0x5a, 0xde, 0x9b, 0xee, 0xbb, 0xee, 0xdb, 0xee, 0xdb, 0xe6, 0xfc, 0xe6, 0xfc, 0xe6, 0xbb, 0xde, 0xfb, 0xde, 0xfc, 0xde, 0xdb, 0xde, 0xdc, 0xe6, 0xbb, 0xde, 0xdc, 0xde, 0xfc, 0xe6, 0xdb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xe6, 0x9b, 0xde, 0xdc, 0xe6, 0xbc, 0xde, 0xfd, 0xee, 0x5a, 0xde, 0x7b, 0xe6, 0x9b, 0xee, 0x39, 0xde, 0x5a, 0xd6, 0xfc, 0xe6, 0xbb, 0xde, 0xbb, 0xde, 0x1c, 0xdf, 0xfc, 0xde, 0xbb, 0xd6, 0x7a, 0xce, 0xbb, 0xde, 0x7b, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0x99, 0xde, 0x78, 0xde, 0x79, 0xde, 0x59, 0xde, 0x59, 0xde, 0x7a, 0xde, 0x9b, 0xde, 0x7b, 0xd6, 0x5a, 0xd6, 0x5a, 0xd6, 0x5b, 0xce, 0x5b, 0xce, 0x5a, 0xc6, 0x5a, 0xbe, 0x7b, 0xc6, 0xbc, 0xce, 0xda, 0xde, 0x99, 0xd6, 0xdb, 0xde, 0x3c, 0xef, 0xb9, 0xd6, 0xda, 0xde, 0xba, 0xde, 0x5a, 0xce, 0x3a, 0xce, 0x9b, 0xd6, 0x3a, 0xc6, 0x1a, 0xbe, 0x1a, 0xb6, 0xda, 0xb5, 0xba, 0xad, 0x7a, 0xa5, 0x7a, 0x95, 0x39, 0x85, 0xf8, 0x74, 0x96, 0x64, 0x35, 0x5c, 0xf4, 0x53, 0x53, 0x43, 0x74, 0x43, 0x92, 0x43, 0x13, 0x5c, 0x15, 0x95, 0x9b, 0xde, 0x59, 0xd6, 0x9b, 0xe6, 0xba, 0xee, 0xfc, 0xe6, 0x37, 0x8d, 0x76, 0x64, 0x56, 0x54, 0x74, 0x2b, 0x95, 0x23, 0xb6, 0x1b, 0x75, 0x13, 0x54, 0x13, 0x34, 0x0b, 0x34, 0x0b, 0x14, 0x0b, 0x14, 0x0b, 0x35, 0x0b, 0x14, 0x0b, 0x14, 0x03, 0x14, 0x03, 0x14, 0x03, 0x14, 0x03, 0x14, 0x03, 0xf3, 0x02, 0x13, 0x0b, 0x91, 0x0a, 0x13, 0x23, 0xf9, 0x7c, 0x19, 0xc6, 0x7a, 0xde, 0x79, 0xce, 0x3a, 0xa6, 0x52, 0x2b, 0x54, 0x13, 0x34, 0x03, 0x35, 0x03, 0x35, 0x03, 0x35, 0x03, 0x13, 0x0b, 0x13, 0x0b, 0x74, 0x0b, 0x34, 0x03, 0x35, 0x0b, 0x16, 0x0b, 0xd5, 0x02, 0xd5, 0x0a, 0xd5, 0x12, 0x93, 0x0a, 0xb4, 0x0a, 0xf5, 0x0a, 0x35, 0x0b, 0x14, 0x0b, 0xf2, 0x12, 0xf2, 0x22, 0x52, 0x4b, 0xfc, 0xbd, 0x9b, 0xd6, 0xbc, 0xc6, 0x76, 0x4c, 0x95, 0x1b, 0xd8, 0x1b, 0xb8, 0x13, 0x97, 0x03, 0x97, 0x03, 0x97, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x76, 0x03, 0x78, 0x03, 0x58, 0x03, 0x36, 0x03, 0x57, 0x13, 0xb8, 0x23, 0xd9, 0x23, 0xd9, 0x23, 0x98, 0x1b, 0x56, 0x0b, 0xf3, 0x02, 0xf1, 0x12, 0xee, 0x2a, 0x99, 0xbe, 0x78, 0xce, 0x7a, 0xce, 0x7b, 0xd6, 0x5b, 0xde, 0x5b, 0xde, 0x7b, 0xce, 0x5b, 0xc6, 0xd8, 0xb5, 0x19, 0xbe, 0x3a, 0xbe, 0x3a, 0xc6, 0x5a, 0xc6, 0xf9, 0xbd, 0x5a, 0xc6, 0xd8, 0xb5, 0x19, 0xbe, 0x97, 0xad, 0x97, 0xad, 0x77, 0xa5, 0xb8, 0xad, 0x97, 0xad, + 0x3d, 0xef, 0x7e, 0xf7, 0x5e, 0xf7, 0x1d, 0xef, 0x3d, 0xf7, 0x3d, 0xf7, 0x1d, 0xef, 0x3d, 0xf7, 0x3d, 0xef, 0x5d, 0xf7, 0xfc, 0xe6, 0xdc, 0xe6, 0x1d, 0xef, 0x5d, 0xef, 0x3d, 0xef, 0xfc, 0xee, 0xfb, 0xee, 0x1c, 0xf7, 0xfc, 0xee, 0x1c, 0xef, 0x5d, 0xf7, 0xfc, 0xe6, 0x5d, 0xf7, 0x1d, 0xef, 0x5e, 0xf7, 0x1e, 0xef, 0xfd, 0xde, 0x7e, 0xe7, 0x7e, 0xe7, 0x5d, 0xe7, 0x1d, 0xef, 0x5e, 0xf7, 0x1c, 0xef, 0x3d, 0xf7, 0xfd, 0xee, 0x1d, 0xf7, 0x1d, 0xef, 0x7e, 0xf7, 0x1c, 0xef, 0xbb, 0xe6, 0xba, 0xe6, 0xb9, 0xde, 0xd9, 0xde, 0xfa, 0xe6, 0x3b, 0xf7, 0xfb, 0xee, 0xfa, 0xe6, 0x1b, 0xe7, 0x3c, 0xef, 0x1c, 0xef, 0xbd, 0xee, 0x9d, 0xee, 0x3e, 0xf7, 0xfc, 0xee, 0x3c, 0xef, 0xfc, 0xe6, 0xfd, 0xee, 0x1e, 0xf7, 0xfe, 0xee, 0xfd, 0xee, 0xfc, 0xe6, 0xdb, 0xde, 0x1c, 0xdf, 0x3d, 0xe7, 0x1c, 0xdf, 0x1c, 0xdf, 0x1b, 0xdf, 0x1b, 0xdf, 0x1c, 0xdf, 0x3c, 0xe7, 0x1b, 0xe7, 0xfa, 0xde, 0x1b, 0xef, 0xda, 0xe6, 0x9a, 0xde, 0xfc, 0xee, 0x3c, 0xef, 0xfc, 0xe6, 0xdc, 0xde, 0xdc, 0xde, 0xfd, 0xde, 0x3e, 0xe7, 0x1d, 0xef, 0x1d, 0xef, 0xda, 0xe6, 0x1b, 0xe7, 0x1a, 0xe7, 0x1b, 0xe7, 0xfb, 0xde, 0xdb, 0xe6, 0xfb, 0xde, 0xfa, 0xde, 0x1a, 0xdf, 0x1a, 0xdf, 0x1b, 0xdf, 0x1b, 0xdf, 0x3b, 0xe7, 0x1b, 0xe7, 0xfb, 0xd6, 0xfb, 0xde, 0xfb, 0xe6, 0xfc, 0xe6, 0xbb, 0xe6, 0x9b, 0xde, 0xdc, 0xde, 0xbb, 0xd6, 0x1b, 0xe7, 0xfa, 0xe6, 0xd9, 0xe6, 0x3b, 0xef, 0x1b, 0xe7, 0xfc, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xda, 0xd6, 0xda, 0xd6, 0xda, 0xd6, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xe6, 0xfb, 0xe6, 0xdb, 0xde, 0xba, 0xde, 0xda, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xbb, 0xd6, 0x7a, 0xd6, 0xbc, 0xe6, 0xbb, 0xde, 0x9a, 0xd6, 0xbb, 0xde, 0xdc, 0xe6, 0xfc, 0xe6, 0x1c, 0xe7, 0xdb, 0xe6, 0xda, 0xe6, 0x99, 0xe6, 0xb9, 0xe6, 0xd9, 0xe6, 0xd9, 0xe6, 0xd9, 0xe6, 0x99, 0xe6, 0x9a, 0xde, 0xba, 0xe6, 0xba, 0xe6, 0x99, 0xde, 0xb9, 0xde, 0xda, 0xde, 0xda, 0xde, 0xda, 0xd6, 0xda, 0xd6, 0xfb, 0xde, 0x1b, 0xdf, 0x9a, 0xce, 0xba, 0xd6, 0xdb, 0xde, 0x99, 0xd6, 0xdb, 0xde, 0x9a, 0xde, 0x9b, 0xde, 0xdc, 0xde, 0xfd, 0xde, 0x1c, 0xdf, 0xfb, 0xe6, 0xfb, 0xee, 0xba, 0xe6, 0x9b, 0xe6, 0x9b, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0xbc, 0xde, 0xbc, 0xde, 0xbb, 0xde, 0xda, 0xe6, 0xba, 0xde, 0x9a, 0xde, 0x9a, 0xe6, 0xbb, 0xee, 0x9b, 0xee, 0x7a, 0xe6, 0x78, 0xde, 0xb8, 0xde, 0xb9, 0xde, 0x38, 0xd6, 0x9a, 0xe6, 0xdb, 0xee, 0xdc, 0xe6, 0xbb, 0xde, 0xbb, 0xe6, 0xdb, 0xee, 0xbb, 0xe6, 0x9a, 0xde, 0xdb, 0xe6, 0x9a, 0xd6, 0xba, 0xd6, 0xdb, 0xde, 0x7a, 0xd6, 0x7a, 0xe6, 0x7b, 0xee, 0x1a, 0xe6, 0x3b, 0xe6, 0x5b, 0xde, 0x9c, 0xde, 0x7b, 0xce, 0x9a, 0xce, 0xfb, 0xde, 0x9b, 0xce, 0xbc, 0xce, 0xfc, 0xd6, 0x9a, 0xce, 0x78, 0xde, 0x99, 0xe6, 0x7a, 0xde, 0xbb, 0xee, 0x59, 0xe6, 0x9a, 0xee, 0xdc, 0xe6, 0xbd, 0xde, 0x7c, 0xce, 0xdd, 0xde, 0x9b, 0xde, 0xba, 0xe6, 0x9a, 0xde, 0x9a, 0xde, 0xbb, 0xe6, 0xbb, 0xe6, 0xdb, 0xe6, 0xdc, 0xe6, 0xbb, 0xde, 0x9b, 0xde, 0x9a, 0xd6, 0x7a, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x9a, 0xce, 0x9b, 0xce, 0x1b, 0xbe, 0xfa, 0xbd, 0x97, 0xbd, 0xf8, 0xcd, 0x17, 0xce, 0x9a, 0xde, 0x7a, 0xd6, 0x3a, 0xd6, 0x1a, 0xce, 0x1b, 0xc6, 0x1b, 0xbe, 0x1c, 0xbe, 0x1c, 0xbe, 0x1b, 0xc6, 0xf9, 0xbd, 0xb8, 0xb5, 0xda, 0xbd, 0xfb, 0xc5, 0xda, 0xc5, 0xfa, 0xcd, 0xfa, 0xcd, 0xfa, 0xc5, 0x99, 0xbd, 0xd9, 0xbd, 0x19, 0xb6, 0x39, 0xb6, 0x17, 0xb6, 0x17, 0xc6, 0xb8, 0xcd, 0x7b, 0xee, 0x19, 0xd6, 0x9c, 0xde, 0xba, 0x9d, 0xb7, 0x74, 0xb8, 0x74, 0xd5, 0x53, 0xf5, 0x4b, 0xf5, 0x43, 0xb4, 0x33, 0x74, 0x33, 0x74, 0x3b, 0x53, 0x3b, 0x32, 0x33, 0x12, 0x2b, 0xf3, 0x2a, 0xf3, 0x1a, 0x34, 0x1b, 0x14, 0x1b, 0xd2, 0x1a, 0xb2, 0x1a, 0xd3, 0x1a, 0xd4, 0x22, 0xf4, 0x22, 0xf3, 0x22, 0xf1, 0x32, 0x54, 0x6c, 0x9b, 0xce, 0x9a, 0xd6, 0xda, 0xde, 0x38, 0xce, 0x99, 0xde, 0x79, 0xde, 0x18, 0xd6, 0x18, 0xd6, 0x75, 0xc5, 0x79, 0xe6, 0x58, 0xde, 0x38, 0xde, 0x37, 0xd6, 0x58, 0xde, 0x38, 0xde, 0xd7, 0xcd, 0x58, 0xde, 0x59, 0xde, 0x38, 0xde, 0xf7, 0xd5, 0xf7, 0xd5, 0xf7, 0xd5, + 0xbd, 0xce, 0x1e, 0xdf, 0xfe, 0xd6, 0x9c, 0xc6, 0x9d, 0xc6, 0xbd, 0xce, 0xbd, 0xc6, 0xdd, 0xc6, 0x1e, 0xcf, 0xfe, 0xce, 0x9d, 0xbe, 0x5c, 0xb6, 0x7c, 0xbe, 0x5c, 0xb6, 0x3b, 0xb6, 0x3b, 0xae, 0x9c, 0xae, 0x9d, 0xae, 0x3a, 0xae, 0x1d, 0xcf, 0x3c, 0xe7, 0x3b, 0xe7, 0x9d, 0xf7, 0x9f, 0xef, 0xfb, 0xad, 0xf8, 0x7c, 0xf8, 0x64, 0xf8, 0x5c, 0x38, 0x65, 0x59, 0x75, 0xfc, 0x95, 0x9e, 0xbe, 0x1f, 0xd7, 0xde, 0xd6, 0xbd, 0xd6, 0x1f, 0xdf, 0x1f, 0xd7, 0x3f, 0xd7, 0x1f, 0xdf, 0x5f, 0xef, 0x5e, 0xef, 0x7e, 0xef, 0x7e, 0xef, 0x5d, 0xe7, 0x5d, 0xf7, 0x3d, 0xef, 0xdb, 0xde, 0x5d, 0xef, 0x1b, 0xe7, 0x3c, 0xef, 0x3d, 0xff, 0x9c, 0xee, 0xbb, 0xe6, 0x5d, 0xf7, 0x1a, 0xe7, 0x5b, 0xef, 0x5b, 0xf7, 0xfb, 0xee, 0xfa, 0xee, 0xda, 0xee, 0x1a, 0xef, 0x1b, 0xe7, 0xdc, 0xde, 0xdd, 0xe6, 0xdc, 0xe6, 0xfc, 0xee, 0x1c, 0xef, 0x1d, 0xe7, 0x1e, 0xe7, 0x1e, 0xe7, 0x1e, 0xe7, 0x1d, 0xdf, 0xdc, 0xde, 0xfd, 0xe6, 0x9c, 0xde, 0xbc, 0xe6, 0xdc, 0xe6, 0xfc, 0xee, 0x1d, 0xef, 0xfc, 0xee, 0x3b, 0xef, 0x7c, 0xf7, 0x1b, 0xdf, 0x3c, 0xe7, 0x5c, 0xe7, 0x3c, 0xe7, 0x3b, 0xdf, 0x1c, 0xdf, 0x1c, 0xe7, 0xfd, 0xe6, 0xfc, 0xee, 0xfc, 0xee, 0xfb, 0xee, 0xdb, 0xee, 0xba, 0xee, 0x9b, 0xee, 0xbc, 0xee, 0x9c, 0xe6, 0x1d, 0xef, 0xfd, 0xee, 0xfb, 0xee, 0xda, 0xee, 0x99, 0xe6, 0xfb, 0xee, 0xfc, 0xde, 0xfd, 0xde, 0x3e, 0xe7, 0xbb, 0xde, 0x3d, 0xef, 0x5e, 0xf7, 0x1e, 0xe7, 0x3f, 0xef, 0x1e, 0xef, 0x1d, 0xef, 0xfc, 0xe6, 0xbc, 0xe6, 0xdc, 0xe6, 0x1d, 0xef, 0xfc, 0xee, 0x9a, 0xe6, 0x9a, 0xe6, 0xbb, 0xee, 0xdb, 0xf6, 0xdb, 0xf6, 0xfb, 0xf6, 0xfb, 0xf6, 0xda, 0xee, 0x9a, 0xe6, 0xfc, 0xf6, 0xbc, 0xe6, 0xbb, 0xe6, 0xda, 0xde, 0x79, 0xde, 0x3c, 0xef, 0x1c, 0xe7, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdc, 0xde, 0xfc, 0xe6, 0xdb, 0xd6, 0xdb, 0xd6, 0xfc, 0xde, 0xfc, 0xe6, 0xfc, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xdb, 0xee, 0xfb, 0xee, 0xda, 0xee, 0xba, 0xe6, 0xdb, 0xe6, 0xfb, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0xfc, 0xe6, 0x1c, 0xef, 0x9a, 0xde, 0xba, 0xe6, 0x9a, 0xe6, 0x9a, 0xe6, 0xdc, 0xde, 0xfc, 0xde, 0xfc, 0xe6, 0xdb, 0xe6, 0xdb, 0xee, 0xba, 0xee, 0xbc, 0xee, 0x9b, 0xe6, 0xbc, 0xde, 0xbc, 0xde, 0xbb, 0xde, 0xdb, 0xde, 0xdc, 0xde, 0xdd, 0xde, 0xfc, 0xde, 0xdb, 0xd6, 0xdb, 0xd6, 0xfc, 0xde, 0xdb, 0xe6, 0x9a, 0xde, 0x5b, 0xde, 0x7a, 0xde, 0x99, 0xde, 0xd9, 0xde, 0xfb, 0xde, 0xbb, 0xde, 0xdb, 0xe6, 0xdc, 0xe6, 0xfd, 0xde, 0x1d, 0xe7, 0xfb, 0xe6, 0xda, 0xe6, 0xfb, 0xee, 0xda, 0xee, 0xba, 0xee, 0xba, 0xee, 0xfb, 0xee, 0x58, 0xd6, 0xfa, 0xe6, 0xd9, 0xde, 0xd9, 0xe6, 0xb8, 0xe6, 0xd9, 0xe6, 0x98, 0xe6, 0xb9, 0xe6, 0xd9, 0xde, 0xb9, 0xde, 0xfb, 0xde, 0xdc, 0xde, 0x9c, 0xde, 0xbb, 0xde, 0x7a, 0xd6, 0x9a, 0xde, 0x9b, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0xda, 0xde, 0xda, 0xe6, 0xba, 0xe6, 0xbb, 0xe6, 0x5a, 0xe6, 0x7a, 0xe6, 0x9a, 0xe6, 0xba, 0xee, 0x9a, 0xe6, 0x7a, 0xe6, 0x9a, 0xe6, 0x7a, 0xe6, 0x7a, 0xde, 0x7a, 0xe6, 0x9a, 0xe6, 0x9b, 0xe6, 0xbb, 0xe6, 0xbb, 0xe6, 0xbb, 0xe6, 0x9a, 0xde, 0x7a, 0xde, 0x79, 0xde, 0x99, 0xe6, 0x17, 0xde, 0x39, 0xde, 0x3a, 0xde, 0x7a, 0xe6, 0x38, 0xd6, 0x37, 0xd6, 0xb9, 0xde, 0x99, 0xde, 0x9a, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0x9a, 0xd6, 0x79, 0xde, 0x58, 0xde, 0x38, 0xde, 0x79, 0xde, 0x59, 0xde, 0x7a, 0xde, 0x7b, 0xde, 0x9a, 0xde, 0x79, 0xd6, 0x58, 0xce, 0xba, 0xde, 0x39, 0xce, 0xbb, 0xde, 0x99, 0xd6, 0x99, 0xce, 0xd9, 0xd6, 0x79, 0xce, 0xd8, 0xbd, 0x7c, 0xde, 0x9a, 0xde, 0x99, 0xde, 0x58, 0xd6, 0x17, 0xce, 0x98, 0xe6, 0xb9, 0xe6, 0xd9, 0xe6, 0x98, 0xd6, 0x99, 0xce, 0x79, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0xbb, 0xd6, 0xdb, 0xd6, 0xda, 0xce, 0xb8, 0xce, 0x97, 0xd6, 0x97, 0xd6, 0x99, 0xde, 0x9a, 0xd6, 0x7b, 0xce, 0x3b, 0xce, 0x19, 0xd6, 0x5b, 0xde, 0x1a, 0xd6, 0x9c, 0xe6, 0x9b, 0xde, 0x9a, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0x7a, 0xde, 0x5a, 0xd6, 0x97, 0xbd, 0x9b, 0xe6, 0x7a, 0xde, 0x7b, 0xde, 0x7a, 0xde, 0x9b, 0xde, 0x19, 0xce, 0x3a, 0xd6, 0x7b, 0xde, 0x7b, 0xde, 0x5a, 0xd6, 0xbc, 0xe6, 0x7a, 0xde, 0xf9, 0xcd, + 0x18, 0x0c, 0x5a, 0x14, 0x39, 0x0c, 0xf8, 0x03, 0xf8, 0x03, 0x19, 0x0c, 0x19, 0x0c, 0x3a, 0x0c, 0x1a, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xd9, 0x0b, 0xf9, 0x13, 0xd8, 0x1b, 0x18, 0x2c, 0xf6, 0x43, 0x7e, 0xa6, 0x3e, 0xdf, 0x7e, 0xf7, 0x1d, 0xdf, 0xfe, 0xc6, 0x58, 0x4c, 0xb7, 0x13, 0x3a, 0x0c, 0x1a, 0x04, 0x3a, 0x04, 0x19, 0x0c, 0xf8, 0x0b, 0xb7, 0x13, 0x97, 0x13, 0x96, 0x1b, 0x97, 0x1b, 0xd7, 0x23, 0xd8, 0x1b, 0xd8, 0x23, 0xb8, 0x2b, 0xd8, 0x33, 0xf8, 0x3b, 0x18, 0x44, 0x58, 0x44, 0x17, 0x44, 0xf6, 0x43, 0xd6, 0x4b, 0x17, 0x5c, 0x1d, 0xa6, 0x5c, 0xd7, 0x1a, 0xdf, 0x1b, 0xdf, 0x3d, 0xdf, 0x5f, 0xdf, 0x79, 0x95, 0xb7, 0x74, 0x76, 0x6c, 0x16, 0x64, 0x39, 0x8d, 0xbe, 0xbe, 0xff, 0xc6, 0x3d, 0xae, 0x1a, 0x8d, 0xd7, 0x63, 0xb7, 0x63, 0x96, 0x63, 0x17, 0x74, 0x79, 0x7c, 0x59, 0x7c, 0x18, 0x6c, 0x18, 0x64, 0x59, 0x6c, 0xba, 0x74, 0x17, 0x64, 0x74, 0x53, 0xf5, 0x63, 0xfb, 0xad, 0xdc, 0xd6, 0xfb, 0xe6, 0x1c, 0xef, 0x1c, 0xe7, 0x5f, 0xe7, 0x3b, 0xae, 0xb7, 0x64, 0x36, 0x4c, 0x37, 0x44, 0x58, 0x4c, 0xd9, 0x5c, 0x5b, 0x6d, 0x79, 0x4c, 0x79, 0x54, 0x9a, 0x5c, 0xba, 0x64, 0xda, 0x6c, 0xfa, 0x74, 0xfa, 0x7c, 0xfa, 0x7c, 0x9b, 0x8d, 0x3a, 0x85, 0x9a, 0x85, 0x38, 0x7d, 0x37, 0x7d, 0x58, 0x8d, 0x97, 0x9d, 0x9b, 0xce, 0x1c, 0xe7, 0xda, 0xe6, 0xb9, 0xde, 0xfb, 0xe6, 0x5e, 0xe7, 0x1a, 0xb6, 0xf4, 0x5b, 0xf5, 0x5b, 0xb4, 0x53, 0x97, 0x74, 0x3a, 0x8d, 0x19, 0x85, 0xb8, 0x7c, 0xd8, 0x84, 0x5a, 0x95, 0x9a, 0x9d, 0xdb, 0xad, 0x1c, 0xb6, 0x7d, 0xc6, 0x9d, 0xc6, 0xbd, 0xce, 0xde, 0xce, 0xfe, 0xd6, 0x1e, 0xd7, 0xdc, 0xce, 0xfd, 0xce, 0x1d, 0xd7, 0xfd, 0xd6, 0xbc, 0xde, 0x9b, 0xde, 0xbb, 0xe6, 0x3d, 0xef, 0x5e, 0xef, 0xdd, 0xde, 0xfe, 0xde, 0xbd, 0xde, 0xde, 0xde, 0xfe, 0xde, 0xbe, 0xde, 0xfe, 0xde, 0xfd, 0xd6, 0x1d, 0xd7, 0x1d, 0xdf, 0x3e, 0xdf, 0x1d, 0xdf, 0xfd, 0xd6, 0xfd, 0xd6, 0x1d, 0xdf, 0xdc, 0xd6, 0xfd, 0xde, 0xdd, 0xd6, 0x5f, 0xef, 0xdd, 0xde, 0xfd, 0xe6, 0xdd, 0xe6, 0x7b, 0xde, 0x59, 0xde, 0xda, 0xee, 0xba, 0xe6, 0xdb, 0xde, 0x5d, 0xef, 0x5d, 0xe7, 0x1c, 0xdf, 0xfd, 0xde, 0xfd, 0xe6, 0xdd, 0xe6, 0x1c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xef, 0x3c, 0xef, 0xfc, 0xee, 0xfc, 0xe6, 0xfc, 0xe6, 0x1d, 0xe7, 0xfd, 0xe6, 0xdc, 0xde, 0xdc, 0xe6, 0xfd, 0xe6, 0x1d, 0xe7, 0x5c, 0xe7, 0xdb, 0xd6, 0x9a, 0xce, 0xdb, 0xd6, 0xba, 0xd6, 0xfa, 0xde, 0x1b, 0xe7, 0xfb, 0xde, 0x5c, 0xe7, 0xfb, 0xd6, 0xfc, 0xde, 0x1d, 0xe7, 0xdd, 0xde, 0xbd, 0xde, 0x9c, 0xd6, 0x1e, 0xe7, 0xdd, 0xde, 0xbc, 0xde, 0xbc, 0xd6, 0x9b, 0xd6, 0xdc, 0xde, 0xfc, 0xd6, 0xfb, 0xd6, 0xdb, 0xd6, 0x1c, 0xe7, 0x9b, 0xde, 0xbc, 0xe6, 0x9c, 0xee, 0x3a, 0xde, 0x9b, 0xde, 0xdc, 0xe6, 0xbc, 0xde, 0xbc, 0xd6, 0x7a, 0xce, 0xfa, 0xde, 0xf9, 0xde, 0xb9, 0xde, 0xdb, 0xe6, 0x1c, 0xf7, 0xfb, 0xee, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0x9b, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0x5a, 0xde, 0x5a, 0xde, 0x39, 0xde, 0x39, 0xde, 0xfb, 0xee, 0x1b, 0xe7, 0x9a, 0xd6, 0xfb, 0xd6, 0xfb, 0xd6, 0xdb, 0xd6, 0xbb, 0xd6, 0x9a, 0xce, 0x99, 0xd6, 0x98, 0xd6, 0x98, 0xde, 0x99, 0xde, 0x5a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0xba, 0xde, 0xb9, 0xd6, 0x57, 0xce, 0xda, 0xde, 0x79, 0xde, 0xdb, 0xee, 0x9a, 0xe6, 0x59, 0xde, 0x79, 0xde, 0x5a, 0xde, 0x3b, 0xde, 0x9d, 0xee, 0x9c, 0xde, 0x9c, 0xde, 0x9b, 0xde, 0x59, 0xde, 0xf7, 0xd5, 0x99, 0xee, 0x99, 0xee, 0x9a, 0xe6, 0x7a, 0xde, 0x7a, 0xde, 0x5a, 0xd6, 0x9b, 0xde, 0x9a, 0xde, 0x7a, 0xde, 0x19, 0xd6, 0x3a, 0xd6, 0x9c, 0xd6, 0x7b, 0xd6, 0x5a, 0xd6, 0x59, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x59, 0xce, 0x18, 0xce, 0x78, 0xde, 0x58, 0xde, 0x99, 0xde, 0xdb, 0xe6, 0xba, 0xd6, 0x1b, 0xdf, 0xb9, 0xd6, 0x78, 0xce, 0xba, 0xd6, 0xdb, 0xde, 0x9a, 0xd6, 0xba, 0xd6, 0xbb, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xce, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x18, 0xc6, 0x9a, 0xd6, 0x59, 0xce, 0x59, 0xce, + 0x38, 0x0c, 0x38, 0x0c, 0x39, 0x0c, 0x39, 0x0c, 0x39, 0x0c, 0x19, 0x04, 0x39, 0x04, 0x39, 0x0c, 0x39, 0x0c, 0x39, 0x04, 0x3a, 0x0c, 0x19, 0x04, 0x19, 0x0c, 0x19, 0x0c, 0xf8, 0x03, 0x19, 0x0c, 0x9b, 0x14, 0x39, 0x14, 0x95, 0x13, 0xfc, 0x85, 0x1d, 0xd7, 0x9e, 0xf7, 0x5d, 0xef, 0xff, 0xc6, 0xb5, 0x2b, 0xf9, 0x13, 0x1b, 0x0c, 0xfb, 0x03, 0xdb, 0x13, 0xda, 0x1b, 0xfa, 0x23, 0x3a, 0x24, 0x19, 0x0c, 0x39, 0x04, 0x59, 0x04, 0xf8, 0x03, 0xf8, 0x03, 0x19, 0x04, 0x19, 0x0c, 0xd9, 0x03, 0xf9, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x96, 0x0b, 0x34, 0x13, 0x13, 0x1b, 0x9b, 0x85, 0x1d, 0xd7, 0xfb, 0xe6, 0x1c, 0xe7, 0x3f, 0xe7, 0xff, 0xce, 0xd0, 0x19, 0xd4, 0x11, 0xf7, 0x09, 0xf8, 0x09, 0xd7, 0x01, 0xd5, 0x01, 0xf5, 0x01, 0x15, 0x02, 0x36, 0x0a, 0xf7, 0x01, 0x38, 0x0a, 0x17, 0x02, 0x37, 0x02, 0x38, 0x02, 0x38, 0x02, 0x58, 0x02, 0x58, 0x02, 0x36, 0x0a, 0x16, 0x02, 0x36, 0x02, 0x96, 0x0a, 0xf2, 0x01, 0x54, 0x3b, 0xbd, 0xc6, 0x1d, 0xe7, 0xfc, 0xde, 0x3d, 0xdf, 0xff, 0xd6, 0xb8, 0x6c, 0xf7, 0x23, 0xf9, 0x0b, 0xda, 0x0b, 0xdb, 0x0b, 0xd9, 0x13, 0x1a, 0x1c, 0xf9, 0x0b, 0xf9, 0x03, 0xda, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x78, 0x0b, 0x56, 0x23, 0x17, 0x54, 0x3d, 0xbe, 0xdd, 0xe6, 0xbb, 0xe6, 0x1e, 0xef, 0x7f, 0xdf, 0x71, 0x2a, 0x95, 0x1a, 0xf5, 0x01, 0x16, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x37, 0x02, 0xf6, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xf5, 0x01, 0xd5, 0x01, 0xf4, 0x01, 0x14, 0x02, 0x35, 0x02, 0x55, 0x0a, 0xb4, 0x01, 0x14, 0x12, 0x33, 0x1a, 0x71, 0x2a, 0xbf, 0xd6, 0x9b, 0xd6, 0x1c, 0xe7, 0xfc, 0xd6, 0x1f, 0xc7, 0x92, 0x2a, 0xd3, 0x11, 0xd5, 0x11, 0xb4, 0x01, 0xf5, 0x11, 0x15, 0x12, 0xd4, 0x01, 0x34, 0x02, 0x76, 0x0a, 0x96, 0x0a, 0x75, 0x0a, 0x55, 0x02, 0x75, 0x0a, 0x76, 0x0a, 0x75, 0x0a, 0x76, 0x12, 0x76, 0x12, 0x96, 0x12, 0x96, 0x1a, 0x55, 0x12, 0x74, 0x1a, 0x34, 0x1a, 0x18, 0x64, 0xdc, 0xd6, 0xb9, 0xde, 0x1a, 0xe7, 0x1b, 0xd7, 0x1d, 0xbf, 0x95, 0x54, 0x36, 0x34, 0xf7, 0x23, 0xb7, 0x13, 0x97, 0x13, 0xb7, 0x0b, 0xd7, 0x0b, 0xf7, 0x03, 0x18, 0x0c, 0x39, 0x14, 0x18, 0x1c, 0x58, 0x34, 0x79, 0x44, 0xb9, 0x44, 0x78, 0x3c, 0x78, 0x44, 0xb9, 0x54, 0xf9, 0x64, 0x19, 0x6d, 0xd8, 0x6c, 0x19, 0x7d, 0x5a, 0x95, 0xfc, 0xbd, 0xdb, 0xe6, 0xb9, 0xf6, 0xda, 0xfe, 0xdc, 0xf6, 0x3f, 0xef, 0xbb, 0xad, 0x7b, 0x95, 0x1a, 0x85, 0x3b, 0x7d, 0x7b, 0x7d, 0xb8, 0x6c, 0x97, 0x74, 0xb7, 0x7c, 0x9a, 0xa5, 0x3d, 0xce, 0x5e, 0xd6, 0x5c, 0xde, 0x9c, 0xe6, 0x9b, 0xee, 0xba, 0xe6, 0xdc, 0xde, 0xfd, 0xe6, 0x9b, 0xe6, 0x5a, 0xe6, 0xbb, 0xee, 0xdb, 0xe6, 0x79, 0xd6, 0xba, 0xde, 0x9a, 0xde, 0xdb, 0xee, 0xb9, 0xde, 0x1b, 0xe7, 0x1e, 0xd7, 0x38, 0x8d, 0xb6, 0x7c, 0x79, 0x95, 0x7d, 0xbe, 0x5c, 0xbe, 0x3c, 0xbe, 0x5c, 0xbe, 0x7d, 0xc6, 0x5c, 0xc6, 0x5c, 0xbe, 0x7c, 0xc6, 0xde, 0xd6, 0xbe, 0xce, 0xbd, 0xce, 0x9d, 0xce, 0xbd, 0xce, 0xbd, 0xd6, 0xfd, 0xd6, 0xfe, 0xd6, 0xfd, 0xd6, 0xbc, 0xd6, 0x7a, 0xce, 0x5a, 0xd6, 0x7b, 0xde, 0x9b, 0xde, 0xbb, 0xde, 0xbc, 0xe6, 0xdc, 0xe6, 0xdc, 0xee, 0x9c, 0xee, 0x5b, 0xee, 0x5b, 0xee, 0x5c, 0xe6, 0xbd, 0xde, 0xbd, 0xde, 0x9c, 0xd6, 0x7b, 0xd6, 0xbc, 0xe6, 0x9b, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0x7a, 0xc6, 0x9a, 0xce, 0xdb, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0xbb, 0xd6, 0xdb, 0xd6, 0xdb, 0xde, 0xba, 0xd6, 0x79, 0xde, 0x99, 0xde, 0x9a, 0xde, 0xfb, 0xee, 0x9a, 0xde, 0xbb, 0xd6, 0xfc, 0xde, 0xdc, 0xde, 0xbb, 0xde, 0x7a, 0xd6, 0xbb, 0xe6, 0x39, 0xce, 0x79, 0xd6, 0x7a, 0xde, 0xdb, 0xe6, 0x79, 0xde, 0x9a, 0xe6, 0x7b, 0xde, 0x5b, 0xde, 0x5a, 0xde, 0x5a, 0xde, 0x7b, 0xde, 0x7b, 0xde, 0x5a, 0xde, 0x59, 0xd6, 0x39, 0xde, 0x9b, 0xe6, 0x7b, 0xde, 0x9e, 0xd6, 0xf9, 0x8c, 0x79, 0x74, 0x1c, 0x8d, 0x59, 0x74, 0x38, 0x6c, 0x58, 0x6c, 0x18, 0x64, 0x55, 0x4b, 0xf3, 0x42, 0x14, 0x43, 0xf7, 0x63, 0x79, 0x74, 0x38, 0x6c, 0xb2, 0x3a, 0x50, 0x32, 0x17, 0x64, 0x3b, 0x8d, 0x7d, 0x95, 0xda, 0x7c, 0x79, 0x74, + 0x3b, 0x1c, 0xfa, 0x13, 0x3a, 0x14, 0x9c, 0x1c, 0x9c, 0x1c, 0x5a, 0x0c, 0x1a, 0x04, 0x3a, 0x04, 0x1a, 0x04, 0x3a, 0x04, 0x5a, 0x04, 0x3a, 0x04, 0x5a, 0x04, 0x7a, 0x0c, 0x39, 0x04, 0x5a, 0x04, 0x9a, 0x1c, 0xf8, 0x13, 0x96, 0x23, 0x9b, 0x7d, 0x3d, 0xdf, 0x3c, 0xef, 0x9e, 0xef, 0x5f, 0xc7, 0xb4, 0x13, 0x79, 0x0c, 0x39, 0x04, 0x5a, 0x04, 0x3a, 0x0c, 0xf8, 0x0b, 0x38, 0x04, 0x79, 0x14, 0x1a, 0x14, 0xf9, 0x13, 0x39, 0x0c, 0xf8, 0x03, 0xd8, 0x0b, 0x77, 0x03, 0xb9, 0x0b, 0xda, 0x0b, 0xda, 0x03, 0xfb, 0x03, 0x3b, 0x14, 0xb9, 0x03, 0xd8, 0x0b, 0x96, 0x13, 0xf3, 0x1a, 0x3b, 0x85, 0xde, 0xd6, 0xdc, 0xee, 0x1b, 0xef, 0xfc, 0xde, 0xbd, 0xc6, 0x30, 0x22, 0x14, 0x0a, 0x78, 0x12, 0x38, 0x02, 0x58, 0x0a, 0x36, 0x02, 0x56, 0x0a, 0x56, 0x02, 0xf5, 0x01, 0x17, 0x02, 0x17, 0x02, 0x57, 0x02, 0x37, 0x02, 0x38, 0x02, 0x38, 0x02, 0x78, 0x02, 0x58, 0x0a, 0x36, 0x12, 0xf6, 0x09, 0x37, 0x02, 0x98, 0x0a, 0x54, 0x02, 0xb2, 0x2a, 0x9e, 0xd6, 0xbc, 0xe6, 0x1c, 0xef, 0x3d, 0xe7, 0x7f, 0xdf, 0x13, 0x4c, 0x36, 0x0c, 0x59, 0x04, 0x1a, 0x04, 0x5b, 0x0c, 0x39, 0x14, 0x79, 0x24, 0x57, 0x0c, 0x38, 0x0c, 0xf8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x19, 0x04, 0x39, 0x0c, 0xf8, 0x0b, 0x39, 0x14, 0xf8, 0x13, 0xf8, 0x0b, 0xf9, 0x13, 0x77, 0x0b, 0x55, 0x13, 0xb4, 0x33, 0x1a, 0x9e, 0xfc, 0xce, 0x3d, 0xdf, 0x3f, 0xdf, 0x1f, 0xcf, 0xf1, 0x21, 0x35, 0x22, 0xf7, 0x11, 0x17, 0x12, 0xf7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x18, 0x0a, 0x38, 0x12, 0x38, 0x12, 0xf7, 0x09, 0xf6, 0x01, 0xf7, 0x09, 0x17, 0x0a, 0x37, 0x0a, 0x36, 0x02, 0x36, 0x02, 0xd8, 0x12, 0xdc, 0x3b, 0xf4, 0x01, 0xf2, 0x19, 0xfe, 0xbd, 0x9d, 0xde, 0xfc, 0xe6, 0x1d, 0xdf, 0x1c, 0x96, 0x31, 0x0a, 0x96, 0x0a, 0xb8, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x56, 0x02, 0x77, 0x02, 0x57, 0x0a, 0x17, 0x0a, 0x17, 0x0a, 0x37, 0x0a, 0x37, 0x0a, 0x17, 0x0a, 0x17, 0x02, 0x38, 0x0a, 0x38, 0x02, 0x37, 0x02, 0x37, 0x02, 0x57, 0x0a, 0x76, 0x0a, 0x76, 0x12, 0x75, 0x12, 0x32, 0x1a, 0xde, 0xce, 0xdb, 0xde, 0xdb, 0xde, 0x3e, 0xdf, 0x79, 0x85, 0xd6, 0x33, 0x1a, 0x1c, 0x1c, 0x14, 0x9a, 0x03, 0x9a, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0x98, 0x13, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x37, 0x13, 0xb6, 0x1a, 0xd7, 0x53, 0x1e, 0xcf, 0xdb, 0xd6, 0xfd, 0xde, 0x1f, 0xdf, 0x1f, 0xbf, 0x71, 0x1a, 0x93, 0x12, 0xb6, 0x12, 0x96, 0x0a, 0x96, 0x0a, 0xd7, 0x12, 0xd6, 0x12, 0xb5, 0x0a, 0xd5, 0x0a, 0xb5, 0x02, 0xb5, 0x02, 0xd4, 0x0a, 0xb6, 0x33, 0x98, 0x54, 0x7a, 0x7d, 0x5b, 0xae, 0xbb, 0xc6, 0xfc, 0xde, 0x1c, 0xef, 0xfb, 0xde, 0xfb, 0xd6, 0x9a, 0xc6, 0x59, 0xc6, 0x9b, 0xde, 0x7b, 0xde, 0xdc, 0xde, 0x1f, 0xd7, 0x3c, 0x7d, 0x94, 0x12, 0x37, 0x13, 0xf7, 0x0a, 0xf7, 0x0a, 0xd6, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0xb6, 0x0a, 0x95, 0x0a, 0x95, 0x0a, 0x74, 0x0a, 0x74, 0x0a, 0x74, 0x0a, 0x95, 0x0a, 0x94, 0x0a, 0x95, 0x0a, 0xd6, 0x02, 0xd4, 0x12, 0x32, 0x3b, 0x70, 0x5b, 0xfd, 0xde, 0xdc, 0xde, 0xfd, 0xce, 0x5c, 0xa6, 0x51, 0x23, 0x95, 0x1b, 0xb6, 0x13, 0xb7, 0x1b, 0x95, 0x1b, 0x94, 0x1b, 0x93, 0x1b, 0x92, 0x1b, 0x93, 0x23, 0x53, 0x2b, 0x16, 0x4c, 0x16, 0x54, 0x37, 0x5c, 0xb9, 0x6c, 0x79, 0x5c, 0x58, 0x54, 0x16, 0x54, 0x57, 0x64, 0x99, 0x6c, 0x99, 0x74, 0xd9, 0x7c, 0x97, 0x7c, 0x17, 0x95, 0xbc, 0xd6, 0xbc, 0xde, 0x9b, 0xd6, 0xde, 0xce, 0xd8, 0x84, 0xb9, 0x6c, 0xf6, 0x4b, 0x16, 0x54, 0x57, 0x64, 0x19, 0x8d, 0x7a, 0x9d, 0x96, 0x7c, 0x96, 0x7c, 0xb7, 0x84, 0xba, 0xa5, 0x79, 0x9d, 0xda, 0xad, 0x1a, 0xb6, 0xfa, 0xbd, 0xfa, 0xbd, 0xfb, 0xbd, 0xfb, 0xbd, 0x1b, 0xc6, 0x1a, 0xc6, 0x19, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xbc, 0xde, 0xdf, 0xce, 0x73, 0x22, 0xf3, 0x01, 0x94, 0x01, 0xf5, 0x01, 0xb4, 0x01, 0x94, 0x01, 0x94, 0x01, 0xb5, 0x09, 0x94, 0x01, 0xb5, 0x09, 0x74, 0x01, 0x74, 0x01, 0xb4, 0x09, 0x74, 0x01, 0xb5, 0x09, 0xb4, 0x09, 0x93, 0x01, 0x94, 0x09, 0xb4, 0x09, 0x94, 0x09, + 0x3a, 0x04, 0x1a, 0x04, 0x3a, 0x0c, 0x3a, 0x0c, 0x1a, 0x0c, 0x3b, 0x0c, 0x3b, 0x0c, 0xfa, 0x03, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x04, 0x1a, 0x0c, 0x1a, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0xd7, 0x0b, 0xb5, 0x1b, 0x5a, 0x75, 0xfd, 0xd6, 0x7e, 0xf7, 0x5f, 0xef, 0xbe, 0xb6, 0xb5, 0x1b, 0x19, 0x0c, 0x1a, 0x0c, 0xfa, 0x0b, 0xf9, 0x0b, 0xfa, 0x0b, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x19, 0x04, 0x19, 0x04, 0xf8, 0x0b, 0x96, 0x13, 0x34, 0x1b, 0xf9, 0x74, 0xfd, 0xd6, 0x3c, 0xef, 0xda, 0xe6, 0xfd, 0xde, 0x3f, 0xb6, 0x34, 0x22, 0x36, 0x0a, 0x38, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0x18, 0x02, 0x18, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0xf7, 0x01, 0x18, 0x02, 0x18, 0x02, 0xf8, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd5, 0x09, 0x73, 0x2a, 0x9c, 0xc6, 0x1b, 0xe7, 0x3c, 0xef, 0x1d, 0xdf, 0x9f, 0xcf, 0xf4, 0x3b, 0xd7, 0x1b, 0xf9, 0x0b, 0x1a, 0x0c, 0x3b, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xf9, 0x0b, 0xd9, 0x0b, 0x19, 0x0c, 0xf9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0xb7, 0x13, 0xb5, 0x2b, 0xdb, 0x9d, 0xdd, 0xd6, 0xfb, 0xde, 0x3d, 0xdf, 0xff, 0xc6, 0xf0, 0x11, 0x15, 0x0a, 0x78, 0x12, 0x98, 0x12, 0x37, 0x02, 0x16, 0x02, 0x57, 0x0a, 0x78, 0x0a, 0x99, 0x12, 0xb9, 0x12, 0x78, 0x0a, 0x58, 0x0a, 0x57, 0x0a, 0x57, 0x0a, 0x58, 0x0a, 0x57, 0x0a, 0x37, 0x02, 0x37, 0x02, 0x37, 0x0a, 0xf6, 0x01, 0xf6, 0x01, 0x16, 0x0a, 0xd2, 0x11, 0xbb, 0xa5, 0xbb, 0xd6, 0x3c, 0xe7, 0x1d, 0xd7, 0xff, 0x9d, 0x33, 0x0a, 0x97, 0x0a, 0x57, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xd9, 0x0a, 0xb9, 0x12, 0x78, 0x0a, 0x78, 0x0a, 0x57, 0x0a, 0x57, 0x0a, 0x37, 0x02, 0x36, 0x02, 0x37, 0x02, 0x37, 0x02, 0x57, 0x0a, 0x37, 0x0a, 0x57, 0x0a, 0x57, 0x0a, 0x56, 0x0a, 0x15, 0x0a, 0xf4, 0x09, 0xf0, 0x11, 0x9d, 0xce, 0xba, 0xde, 0x1c, 0xe7, 0x5f, 0xdf, 0x59, 0x65, 0x16, 0x24, 0x18, 0x14, 0xd8, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x35, 0x13, 0xd5, 0x4b, 0xbc, 0xce, 0xbb, 0xe6, 0xfc, 0xe6, 0x1e, 0xd7, 0xdf, 0xae, 0xf3, 0x12, 0xf5, 0x12, 0xb5, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xb6, 0x02, 0x96, 0x02, 0xd6, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0xf7, 0x02, 0xd6, 0x02, 0x94, 0x02, 0x73, 0x0a, 0xf5, 0x22, 0x19, 0x4c, 0x79, 0x4c, 0x75, 0x33, 0x50, 0x1a, 0x77, 0x74, 0x7c, 0xce, 0x9b, 0xde, 0xdc, 0xe6, 0xde, 0xd6, 0x98, 0x5c, 0x15, 0x13, 0x38, 0x0b, 0x19, 0x0b, 0xd7, 0x02, 0xd7, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0xf6, 0x02, 0x16, 0x0b, 0xb4, 0x0a, 0xb1, 0x2a, 0x9c, 0xce, 0xdc, 0xde, 0x1e, 0xcf, 0xdb, 0x8d, 0x13, 0x13, 0x56, 0x0b, 0x76, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x77, 0x03, 0x76, 0x03, 0x56, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x15, 0x03, 0x16, 0x03, 0x56, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x15, 0x03, 0xd3, 0x0a, 0xb1, 0x2a, 0xfc, 0xad, 0x9b, 0xce, 0xde, 0xce, 0xd6, 0x43, 0x94, 0x02, 0xb5, 0x02, 0xf7, 0x0a, 0xd6, 0x0a, 0xd6, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x95, 0x02, 0x95, 0x02, 0x74, 0x02, 0x74, 0x02, 0x74, 0x02, 0x75, 0x02, 0x74, 0x02, 0x74, 0x02, 0x54, 0x0a, 0x53, 0x0a, 0x72, 0x1a, 0xfa, 0x74, 0xdd, 0xce, 0xbe, 0xc6, 0x92, 0x22, 0xd3, 0x01, 0xd4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x09, 0xd5, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xb5, 0x01, + 0x1a, 0x0c, 0xf9, 0x03, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x0b, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0x19, 0x0c, 0xd7, 0x0b, 0xb6, 0x1b, 0x9b, 0x7d, 0x1d, 0xd7, 0x3d, 0xef, 0x3e, 0xdf, 0x9d, 0xae, 0xd5, 0x1b, 0x18, 0x04, 0xf9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xd9, 0x03, 0x19, 0x04, 0xf9, 0x03, 0xf8, 0x0b, 0x96, 0x0b, 0x55, 0x1b, 0xd9, 0x6c, 0xfd, 0xd6, 0xda, 0xe6, 0xda, 0xe6, 0xbc, 0xd6, 0x7f, 0xbe, 0xb1, 0x11, 0xf5, 0x01, 0x38, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf8, 0x01, 0xd8, 0x01, 0xf8, 0x01, 0x18, 0x02, 0x17, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf8, 0x01, 0xf8, 0x09, 0xd8, 0x09, 0xb7, 0x01, 0xd7, 0x01, 0xf7, 0x09, 0xb4, 0x09, 0xf4, 0x3a, 0x9d, 0xce, 0xfb, 0xe6, 0x1c, 0xef, 0x3e, 0xe7, 0x7f, 0xcf, 0xf4, 0x3b, 0xd7, 0x1b, 0xf9, 0x0b, 0xf9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0x97, 0x03, 0xb7, 0x0b, 0x95, 0x23, 0x59, 0x8d, 0xdd, 0xd6, 0xfb, 0xde, 0x3e, 0xdf, 0xff, 0xc6, 0xf1, 0x19, 0x15, 0x0a, 0x17, 0x0a, 0x37, 0x0a, 0xd6, 0x01, 0xd6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd5, 0x09, 0x91, 0x09, 0x9a, 0xa5, 0x7b, 0xd6, 0xfb, 0xe6, 0x1e, 0xdf, 0xde, 0x95, 0x13, 0x0a, 0x56, 0x02, 0x36, 0x02, 0x56, 0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x38, 0x02, 0x38, 0x02, 0x37, 0x02, 0x17, 0x02, 0x16, 0x02, 0x16, 0x02, 0x16, 0x02, 0x17, 0x02, 0x37, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x16, 0x0a, 0xf5, 0x09, 0xf4, 0x09, 0xd1, 0x11, 0xde, 0xd6, 0xdb, 0xe6, 0xdb, 0xe6, 0xfe, 0xd6, 0x39, 0x6d, 0x58, 0x2c, 0x19, 0x1c, 0x19, 0x0c, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x99, 0x03, 0x98, 0x03, 0xb8, 0x03, 0x99, 0x03, 0x99, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x35, 0x13, 0xf5, 0x4b, 0xbc, 0xce, 0xbb, 0xe6, 0xfc, 0xe6, 0x1e, 0xd7, 0x7b, 0x7d, 0xb3, 0x0a, 0xf5, 0x0a, 0xf6, 0x0a, 0x18, 0x0b, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x0b, 0x17, 0x0b, 0xf7, 0x0a, 0xb6, 0x02, 0xb6, 0x0a, 0x95, 0x0a, 0x74, 0x0a, 0x94, 0x0a, 0xd4, 0x1a, 0x72, 0x1a, 0x57, 0x6c, 0x7c, 0xce, 0x3a, 0xd6, 0xdc, 0xe6, 0x1f, 0xd7, 0xfa, 0x5c, 0x15, 0x0b, 0xf7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xd6, 0x0a, 0x93, 0x0a, 0x91, 0x2a, 0x7c, 0xce, 0x9b, 0xd6, 0xfd, 0xce, 0xdb, 0x95, 0x34, 0x1b, 0xd8, 0x1b, 0x39, 0x2c, 0xf9, 0x23, 0x98, 0x13, 0x77, 0x0b, 0x97, 0x0b, 0xb8, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x97, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x37, 0x03, 0x57, 0x0b, 0x36, 0x0b, 0x56, 0x03, 0x35, 0x03, 0x36, 0x03, 0xf4, 0x0a, 0xb1, 0x22, 0xdb, 0xa5, 0xbc, 0xd6, 0xfe, 0xd6, 0xb5, 0x43, 0xb4, 0x0a, 0xb5, 0x02, 0xb5, 0x02, 0xd6, 0x0a, 0xb7, 0x0a, 0x96, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x75, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x96, 0x02, 0x96, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x95, 0x02, 0x75, 0x02, 0x75, 0x0a, 0x54, 0x0a, 0x73, 0x12, 0x30, 0x22, 0x3c, 0xb6, 0x9e, 0xc6, 0xf5, 0x32, 0xb3, 0x01, 0xd4, 0x09, 0xf6, 0x09, 0xb5, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x94, 0x01, 0x94, 0x01, + 0x3a, 0x14, 0xf9, 0x0b, 0xf9, 0x0b, 0xfa, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd8, 0x13, 0x75, 0x1b, 0x19, 0x75, 0xfd, 0xd6, 0x7e, 0xf7, 0x5e, 0xe7, 0x9a, 0x8d, 0xf6, 0x1b, 0x39, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0x1a, 0x04, 0xf9, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x55, 0x1b, 0x98, 0x64, 0x9b, 0xc6, 0x17, 0xce, 0xda, 0xe6, 0x1e, 0xdf, 0x9f, 0xbe, 0xb1, 0x11, 0x56, 0x12, 0x37, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xf8, 0x01, 0xf7, 0x09, 0xf7, 0x09, 0xd7, 0x01, 0xb8, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd8, 0x01, 0xd8, 0x09, 0xb7, 0x09, 0xb7, 0x01, 0xb7, 0x09, 0xd6, 0x09, 0x94, 0x09, 0x77, 0x53, 0xbd, 0xce, 0xdb, 0xe6, 0xfb, 0xee, 0x3e, 0xe7, 0x3f, 0xc7, 0xd4, 0x3b, 0xd7, 0x1b, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xd9, 0x03, 0xb8, 0x03, 0x97, 0x0b, 0x75, 0x23, 0xf8, 0x7c, 0xbd, 0xd6, 0xfc, 0xde, 0x1e, 0xdf, 0xdf, 0xc6, 0xf1, 0x19, 0xf5, 0x09, 0xd6, 0x01, 0xf7, 0x09, 0xd7, 0x01, 0xd7, 0x09, 0xf8, 0x09, 0xd8, 0x01, 0xd8, 0x09, 0xf8, 0x09, 0xd8, 0x09, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xb6, 0x01, 0xb5, 0x01, 0x92, 0x11, 0x9b, 0xad, 0x7b, 0xd6, 0xfc, 0xe6, 0x1e, 0xdf, 0x9e, 0x95, 0x34, 0x1a, 0x16, 0x0a, 0x37, 0x02, 0x36, 0x02, 0xf6, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x18, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x38, 0x0a, 0x18, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf6, 0x09, 0xf6, 0x09, 0xf5, 0x09, 0xf1, 0x19, 0x7d, 0xce, 0xbb, 0xe6, 0xdc, 0xee, 0x3f, 0xe7, 0x7a, 0x75, 0x99, 0x3c, 0xd8, 0x13, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x0b, 0xb8, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x35, 0x13, 0xf5, 0x4b, 0xbc, 0xce, 0xba, 0xe6, 0xfc, 0xe6, 0x1e, 0xd7, 0xb9, 0x64, 0xf4, 0x12, 0xd5, 0x0a, 0x17, 0x0b, 0x18, 0x0b, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x96, 0x02, 0xb5, 0x0a, 0x52, 0x1a, 0xf6, 0x63, 0x7c, 0xce, 0xbc, 0xde, 0x9b, 0xd6, 0xff, 0xc6, 0x95, 0x2b, 0x77, 0x13, 0xf7, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb6, 0x02, 0xb5, 0x0a, 0x73, 0x0a, 0x92, 0x2a, 0x7d, 0xce, 0x7b, 0xd6, 0xfe, 0xd6, 0xdb, 0x95, 0x13, 0x13, 0x97, 0x13, 0xd8, 0x1b, 0xb8, 0x1b, 0x78, 0x0b, 0x77, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x57, 0x03, 0x78, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x97, 0x03, 0x97, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x57, 0x03, 0x36, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0xf4, 0x0a, 0x90, 0x22, 0xbb, 0xa5, 0x7b, 0xce, 0xbd, 0xd6, 0x1b, 0x75, 0x73, 0x0a, 0xb5, 0x0a, 0x95, 0x0a, 0x95, 0x0a, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x55, 0x0a, 0x75, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x0a, 0x75, 0x12, 0x33, 0x0a, 0x30, 0x1a, 0x5d, 0xbe, 0xfd, 0xad, 0x12, 0x12, 0x36, 0x0a, 0xb5, 0x01, 0x74, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x09, 0xb5, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x7b, 0x24, 0x1a, 0x14, 0xf9, 0x0b, 0x1a, 0x0c, 0xfa, 0x0b, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0x19, 0x0c, 0xd8, 0x0b, 0x75, 0x1b, 0x7b, 0x7d, 0x3e, 0xd7, 0x3d, 0xe7, 0x5e, 0xdf, 0xfb, 0x95, 0x16, 0x1c, 0x19, 0x04, 0x19, 0x04, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x75, 0x13, 0x56, 0x54, 0x7b, 0xbe, 0xba, 0xde, 0x1b, 0xe7, 0x1d, 0xdf, 0x7f, 0xb6, 0xd2, 0x11, 0xf5, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xd8, 0x01, 0xb8, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xf8, 0x09, 0xd7, 0x09, 0xd8, 0x09, 0xd8, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x09, 0xb7, 0x09, 0xd7, 0x09, 0xf6, 0x09, 0x93, 0x09, 0x97, 0x5b, 0xbd, 0xce, 0xda, 0xde, 0x1b, 0xef, 0x3d, 0xe7, 0x5f, 0xcf, 0xf5, 0x3b, 0xd7, 0x1b, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xb8, 0x03, 0x97, 0x0b, 0x75, 0x23, 0xd8, 0x7c, 0xbd, 0xd6, 0xfc, 0xde, 0x1e, 0xdf, 0xbf, 0xc6, 0xb1, 0x11, 0xf5, 0x09, 0xb6, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd8, 0x09, 0xf8, 0x09, 0xd8, 0x01, 0xd8, 0x01, 0xd8, 0x09, 0xf8, 0x09, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xd6, 0x09, 0xd2, 0x11, 0xdc, 0xb5, 0x9c, 0xd6, 0xfb, 0xe6, 0x1e, 0xdf, 0x1c, 0x8d, 0x55, 0x1a, 0x36, 0x0a, 0x58, 0x0a, 0x37, 0x02, 0x16, 0x02, 0x17, 0x0a, 0x18, 0x0a, 0x18, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x18, 0x0a, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf6, 0x09, 0xf6, 0x09, 0xf5, 0x11, 0xf1, 0x21, 0x9d, 0xce, 0x9a, 0xe6, 0xfc, 0xee, 0x1e, 0xdf, 0xd8, 0x64, 0x17, 0x2c, 0xb8, 0x13, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x35, 0x13, 0xf5, 0x4b, 0xbc, 0xce, 0xba, 0xe6, 0xfb, 0xe6, 0x1e, 0xd7, 0xfa, 0x6c, 0x15, 0x13, 0xf6, 0x0a, 0xf7, 0x02, 0x18, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xd7, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xd8, 0x0a, 0x97, 0x02, 0xb8, 0x02, 0xf9, 0x0a, 0xd8, 0x02, 0xb6, 0x0a, 0x32, 0x12, 0x16, 0x6c, 0x7c, 0xd6, 0x5a, 0xde, 0xbc, 0xd6, 0xff, 0xc6, 0x95, 0x2b, 0xf6, 0x02, 0xd6, 0x0a, 0xd8, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x96, 0x0a, 0x74, 0x0a, 0xb2, 0x2a, 0x9d, 0xce, 0x9c, 0xd6, 0xfe, 0xce, 0x59, 0x7d, 0x34, 0x13, 0x56, 0x0b, 0x56, 0x0b, 0x57, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0x36, 0x0b, 0xf4, 0x12, 0x91, 0x22, 0x9b, 0x9d, 0x5b, 0xce, 0x9c, 0xce, 0x7c, 0x7d, 0x53, 0x02, 0xd5, 0x0a, 0x95, 0x0a, 0x75, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0x55, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x74, 0x12, 0x31, 0x1a, 0xbb, 0xa5, 0x9f, 0xc6, 0x33, 0x1a, 0xb4, 0x01, 0x54, 0x01, 0xd6, 0x11, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, + 0xbd, 0x2c, 0x3a, 0x1c, 0xfa, 0x0b, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0xfa, 0x0b, 0xfa, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xd8, 0x0b, 0x75, 0x1b, 0x3a, 0x75, 0x1e, 0xd7, 0x1d, 0xe7, 0x5e, 0xdf, 0x1c, 0x96, 0xf6, 0x13, 0x19, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xda, 0x0b, 0xfa, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb8, 0x0b, 0x56, 0x13, 0xf5, 0x43, 0xfd, 0xce, 0xda, 0xde, 0x1b, 0xe7, 0x3e, 0xe7, 0xdd, 0xa5, 0xd2, 0x11, 0x56, 0x12, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xf8, 0x01, 0xf8, 0x09, 0xd8, 0x01, 0xf8, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xf6, 0x09, 0xb3, 0x09, 0x76, 0x4b, 0xbd, 0xce, 0xda, 0xde, 0x3c, 0xef, 0x3d, 0xdf, 0x9f, 0xd7, 0x16, 0x44, 0xd7, 0x1b, 0xf9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0x97, 0x0b, 0x75, 0x1b, 0xf8, 0x7c, 0xdd, 0xd6, 0xfc, 0xde, 0x1e, 0xdf, 0xbf, 0xc6, 0xb1, 0x11, 0xf6, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd3, 0x11, 0xfd, 0xb5, 0xbc, 0xd6, 0xdb, 0xde, 0x1e, 0xdf, 0xbb, 0x74, 0x34, 0x12, 0x36, 0x0a, 0x37, 0x02, 0xf6, 0x01, 0xf6, 0x01, 0xf7, 0x09, 0xf8, 0x09, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd6, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xd4, 0x09, 0xd1, 0x19, 0xbe, 0xd6, 0x9a, 0xde, 0xfc, 0xee, 0xfe, 0xd6, 0x56, 0x4c, 0x95, 0x13, 0xd8, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x35, 0x13, 0xf5, 0x4b, 0xbc, 0xce, 0xdb, 0xe6, 0xfc, 0xe6, 0x3f, 0xd7, 0x1b, 0x6d, 0xd5, 0x0a, 0x17, 0x0b, 0xd7, 0x02, 0x19, 0x03, 0x19, 0x0b, 0xd8, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xd8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xb7, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x76, 0x02, 0xb5, 0x0a, 0x72, 0x1a, 0x16, 0x6c, 0x3b, 0xce, 0x5a, 0xde, 0xbc, 0xde, 0x3f, 0xd7, 0xf7, 0x3b, 0xf6, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0x74, 0x0a, 0x92, 0x22, 0x9d, 0xce, 0xbc, 0xd6, 0xfe, 0xce, 0x96, 0x5c, 0x75, 0x13, 0x97, 0x0b, 0x77, 0x0b, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x77, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x16, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x36, 0x0b, 0xf4, 0x12, 0x91, 0x22, 0x9b, 0xa5, 0x9c, 0xd6, 0xbd, 0xce, 0xf6, 0x4b, 0x94, 0x0a, 0xd6, 0x0a, 0x75, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x53, 0x0a, 0xf0, 0x11, 0xfc, 0xad, 0x5e, 0xbe, 0x33, 0x1a, 0x94, 0x01, 0xf6, 0x11, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x09, 0x95, 0x09, 0x75, 0x01, 0x75, 0x01, + 0xbc, 0x2c, 0x5a, 0x1c, 0x19, 0x0c, 0x1a, 0x0c, 0x3a, 0x0c, 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x04, 0xf9, 0x03, 0xf8, 0x0b, 0x75, 0x13, 0xd8, 0x64, 0xfd, 0xce, 0x5d, 0xef, 0x7f, 0xe7, 0x1c, 0x9e, 0xb5, 0x1b, 0x18, 0x04, 0x1a, 0x0c, 0xfa, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x0b, 0xfa, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb8, 0x0b, 0x76, 0x13, 0xd5, 0x3b, 0xfd, 0xce, 0x1b, 0xe7, 0x1b, 0xe7, 0xfe, 0xde, 0x5f, 0xb6, 0xd2, 0x11, 0x15, 0x02, 0x78, 0x0a, 0x37, 0x02, 0x38, 0x0a, 0x18, 0x0a, 0xf8, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xb4, 0x09, 0x15, 0x43, 0xbd, 0xce, 0xda, 0xde, 0x3c, 0xef, 0x3d, 0xdf, 0x9f, 0xcf, 0x16, 0x44, 0xb7, 0x1b, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0x97, 0x0b, 0x75, 0x23, 0x18, 0x85, 0xfe, 0xd6, 0xfc, 0xde, 0x3e, 0xdf, 0xbf, 0xc6, 0x91, 0x11, 0x16, 0x0a, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd5, 0x01, 0xb2, 0x09, 0xfd, 0xad, 0xbc, 0xd6, 0xfc, 0xde, 0x3f, 0xdf, 0xdb, 0x7c, 0x14, 0x0a, 0x57, 0x0a, 0x37, 0x02, 0xf6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x16, 0x02, 0x17, 0x02, 0xf6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x0a, 0xf7, 0x09, 0xd5, 0x09, 0xd5, 0x09, 0xd4, 0x09, 0xf1, 0x19, 0x9d, 0xce, 0x9a, 0xde, 0x1d, 0xef, 0x5f, 0xdf, 0xd8, 0x5c, 0xb6, 0x1b, 0xf9, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x35, 0x13, 0xf6, 0x4b, 0xbc, 0xce, 0xbb, 0xe6, 0xfc, 0xe6, 0x3f, 0xd7, 0xda, 0x64, 0xd5, 0x0a, 0x38, 0x0b, 0xd7, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xb8, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xd6, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xb6, 0x02, 0xb5, 0x0a, 0x72, 0x1a, 0x57, 0x74, 0x5b, 0xd6, 0xbb, 0xee, 0x9a, 0xde, 0x1e, 0xd7, 0x17, 0x4c, 0x57, 0x1b, 0xd8, 0x12, 0x97, 0x0a, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x96, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0x94, 0x0a, 0x92, 0x22, 0x9d, 0xc6, 0xdc, 0xd6, 0x1e, 0xc7, 0xf4, 0x43, 0x75, 0x13, 0x97, 0x03, 0x77, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x16, 0x0b, 0x16, 0x03, 0x15, 0x03, 0x16, 0x0b, 0xd4, 0x12, 0x91, 0x2a, 0xbb, 0xa5, 0xbc, 0xd6, 0xde, 0xce, 0xf6, 0x43, 0xb4, 0x0a, 0xf6, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x74, 0x0a, 0x30, 0x12, 0x3c, 0xb6, 0xbc, 0xa5, 0x33, 0x1a, 0xb4, 0x01, 0x94, 0x01, 0x75, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, + 0x9c, 0x2c, 0x3a, 0x1c, 0x19, 0x0c, 0x1a, 0x0c, 0x3a, 0x04, 0x3a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0x3a, 0x04, 0x18, 0x0c, 0xb6, 0x1b, 0x39, 0x6d, 0x3e, 0xd7, 0xfc, 0xe6, 0x3e, 0xe7, 0xff, 0xbe, 0xb5, 0x1b, 0xf8, 0x0b, 0x1a, 0x0c, 0xd9, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xfa, 0x0b, 0xfa, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb8, 0x0b, 0x76, 0x13, 0xd6, 0x3b, 0x3f, 0xd7, 0xfc, 0xe6, 0x5d, 0xef, 0x5f, 0xe7, 0x9f, 0xbe, 0xd2, 0x09, 0x36, 0x0a, 0x37, 0x02, 0x78, 0x0a, 0x79, 0x0a, 0x39, 0x0a, 0x18, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0x18, 0x02, 0x18, 0x02, 0x18, 0x0a, 0xf8, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xb4, 0x09, 0xf4, 0x3a, 0xbd, 0xce, 0xfb, 0xde, 0x1c, 0xe7, 0x1d, 0xdf, 0x7f, 0xcf, 0x16, 0x44, 0xb7, 0x1b, 0xfa, 0x0b, 0xda, 0x03, 0xb9, 0x03, 0xfa, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0xb7, 0x0b, 0x95, 0x23, 0x18, 0x85, 0x1e, 0xdf, 0xfc, 0xde, 0x3e, 0xdf, 0xbf, 0xbe, 0xb1, 0x09, 0x36, 0x12, 0xf7, 0x01, 0xd7, 0x01, 0xf7, 0x09, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xf8, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x09, 0xd5, 0x01, 0x92, 0x09, 0xfc, 0xad, 0xbc, 0xd6, 0xfb, 0xde, 0x3f, 0xdf, 0x5d, 0x8d, 0x14, 0x12, 0x78, 0x12, 0x37, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf8, 0x09, 0xf8, 0x09, 0xf7, 0x01, 0xf8, 0x01, 0x17, 0x02, 0x18, 0x0a, 0x17, 0x0a, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0x17, 0x0a, 0xf7, 0x09, 0xf6, 0x09, 0xd6, 0x09, 0xf5, 0x11, 0x12, 0x22, 0xbe, 0xce, 0xdb, 0xde, 0xfc, 0xe6, 0x3f, 0xd7, 0x5a, 0x6d, 0xb6, 0x1b, 0xf9, 0x13, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x35, 0x13, 0xf5, 0x4b, 0xbc, 0xce, 0xbb, 0xe6, 0xfc, 0xe6, 0x1f, 0xd7, 0x38, 0x4c, 0x16, 0x13, 0x38, 0x0b, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xd8, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0xd8, 0x0a, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xf8, 0x0a, 0xf8, 0x02, 0xd7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xb6, 0x0a, 0x95, 0x0a, 0x52, 0x12, 0xb9, 0x7c, 0x9c, 0xce, 0x79, 0xde, 0xba, 0xe6, 0x1d, 0xd7, 0x7b, 0x75, 0xb4, 0x0a, 0xd7, 0x0a, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd6, 0x02, 0x94, 0x0a, 0x92, 0x22, 0x7d, 0xc6, 0xbc, 0xd6, 0x1e, 0xc7, 0xd3, 0x43, 0x75, 0x13, 0x77, 0x03, 0x56, 0x03, 0x77, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x78, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x0b, 0x36, 0x03, 0x15, 0x03, 0x15, 0x0b, 0xd3, 0x12, 0x90, 0x22, 0xdb, 0xa5, 0xbc, 0xce, 0xde, 0xce, 0x99, 0x5c, 0x94, 0x02, 0xd6, 0x0a, 0xb6, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x02, 0x76, 0x02, 0x55, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x56, 0x02, 0x56, 0x02, 0x76, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x33, 0x02, 0x72, 0x1a, 0x1c, 0xb6, 0x5b, 0x9d, 0xf2, 0x11, 0x15, 0x12, 0x74, 0x01, 0xb6, 0x11, 0x95, 0x09, 0x95, 0x09, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, + 0x5b, 0x24, 0x3a, 0x14, 0x1a, 0x0c, 0x1a, 0x0c, 0x3a, 0x04, 0x3a, 0x04, 0x3a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x0c, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0x39, 0x04, 0x18, 0x04, 0xb6, 0x13, 0xb8, 0x5c, 0xfd, 0xd6, 0x3d, 0xef, 0x3e, 0xef, 0xdf, 0xbe, 0xf6, 0x23, 0x5a, 0x1c, 0x5b, 0x1c, 0x1a, 0x14, 0xf9, 0x0b, 0xfa, 0x0b, 0x3a, 0x0c, 0x3a, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0x19, 0x04, 0xf9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb8, 0x0b, 0x97, 0x13, 0xf6, 0x43, 0xde, 0xce, 0xfc, 0xe6, 0x1c, 0xe7, 0x1e, 0xd7, 0x9f, 0xb6, 0x12, 0x12, 0x36, 0x0a, 0x78, 0x02, 0x78, 0x0a, 0x58, 0x0a, 0x39, 0x0a, 0x18, 0x02, 0x18, 0x02, 0x38, 0x02, 0x79, 0x0a, 0x99, 0x12, 0x59, 0x12, 0x18, 0x0a, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xd7, 0x09, 0xd7, 0x09, 0xb4, 0x09, 0xf5, 0x3a, 0x9d, 0xce, 0xfb, 0xe6, 0xdb, 0xe6, 0x1d, 0xdf, 0x5f, 0xcf, 0x16, 0x44, 0xb7, 0x1b, 0xfa, 0x13, 0xfa, 0x03, 0xb9, 0x03, 0xfa, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x97, 0x0b, 0x95, 0x23, 0x18, 0x85, 0x1e, 0xdf, 0xfc, 0xde, 0x1d, 0xd7, 0xbf, 0xbe, 0xb1, 0x11, 0x56, 0x12, 0xf7, 0x01, 0xd7, 0x01, 0xf8, 0x09, 0xd7, 0x09, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf8, 0x09, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xb6, 0x01, 0xd6, 0x09, 0xb5, 0x01, 0x91, 0x09, 0xdc, 0xb5, 0x9c, 0xde, 0xdb, 0xde, 0x1e, 0xdf, 0xbe, 0x95, 0xd3, 0x09, 0x57, 0x12, 0x17, 0x02, 0x17, 0x02, 0xf6, 0x01, 0xf7, 0x09, 0xf8, 0x09, 0xd7, 0x01, 0xf8, 0x01, 0x18, 0x02, 0x18, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x09, 0xd6, 0x09, 0xf6, 0x09, 0xf2, 0x19, 0x7d, 0xc6, 0xfb, 0xe6, 0xdc, 0xe6, 0xfe, 0xd6, 0x9b, 0x75, 0x75, 0x13, 0xd9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0x9a, 0x0b, 0x99, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x56, 0x13, 0xf6, 0x4b, 0xbd, 0xce, 0xbb, 0xe6, 0xfc, 0xe6, 0x3f, 0xd7, 0x75, 0x33, 0x37, 0x1b, 0xf7, 0x02, 0xd7, 0x02, 0xf8, 0x02, 0xf9, 0x0a, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0xd8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xb7, 0x0a, 0x97, 0x0a, 0xb6, 0x0a, 0x95, 0x0a, 0x73, 0x12, 0xda, 0x7c, 0x5b, 0xc6, 0xdb, 0xde, 0xb9, 0xe6, 0xfc, 0xd6, 0x5a, 0x75, 0xb3, 0x0a, 0xd7, 0x0a, 0xb8, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb8, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0x94, 0x0a, 0x92, 0x22, 0x5c, 0xbe, 0x9b, 0xce, 0x1e, 0xcf, 0xf3, 0x43, 0x75, 0x13, 0x97, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x77, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x98, 0x03, 0x98, 0x03, 0x77, 0x03, 0x77, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x56, 0x03, 0x35, 0x03, 0x15, 0x03, 0xd3, 0x0a, 0x90, 0x22, 0xdb, 0xa5, 0xbd, 0xd6, 0xde, 0xce, 0xd7, 0x43, 0xb5, 0x0a, 0xb5, 0x02, 0x96, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x77, 0x02, 0x76, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x57, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x56, 0x0a, 0x33, 0x02, 0x31, 0x12, 0x3d, 0xb6, 0xfd, 0xad, 0xf2, 0x11, 0xb4, 0x01, 0xb5, 0x09, 0x75, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x94, 0x01, + 0x3b, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1b, 0x04, 0x1b, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x04, 0x1a, 0x04, 0x1b, 0x0c, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0xf9, 0x03, 0xf9, 0x13, 0xb6, 0x13, 0xb8, 0x54, 0xde, 0xc6, 0x3e, 0xe7, 0x7f, 0xe7, 0x5d, 0xae, 0xf7, 0x23, 0x3b, 0x14, 0x3a, 0x1c, 0xd9, 0x0b, 0xf8, 0x0b, 0x19, 0x0c, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0xfa, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x0b, 0xb8, 0x0b, 0x56, 0x13, 0x16, 0x44, 0xfd, 0xd6, 0xba, 0xe6, 0x1c, 0xef, 0x3f, 0xdf, 0x7f, 0xb6, 0x12, 0x12, 0x15, 0x0a, 0x38, 0x12, 0xf7, 0x09, 0xd7, 0x01, 0xf8, 0x01, 0x59, 0x0a, 0x99, 0x12, 0x59, 0x0a, 0x38, 0x02, 0x18, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xb6, 0x01, 0xd5, 0x09, 0x53, 0x22, 0x9e, 0xc6, 0xfc, 0xe6, 0xdb, 0xe6, 0x3d, 0xdf, 0x5f, 0xbf, 0x98, 0x44, 0xd8, 0x13, 0x1a, 0x0c, 0xb8, 0x03, 0xf9, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0xba, 0x03, 0xfa, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0x1a, 0x0c, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0x98, 0x03, 0x97, 0x13, 0x96, 0x2b, 0x9a, 0x95, 0xdc, 0xd6, 0xfc, 0xe6, 0x3f, 0xe7, 0x5f, 0xa6, 0xd1, 0x01, 0x36, 0x12, 0xf7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xd6, 0x09, 0x91, 0x11, 0xdc, 0xb5, 0xbc, 0xde, 0xdb, 0xde, 0x3f, 0xdf, 0xbe, 0x8d, 0x34, 0x0a, 0x37, 0x0a, 0x38, 0x02, 0x37, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0x18, 0x0a, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x0a, 0x17, 0x0a, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0x17, 0x0a, 0x37, 0x0a, 0x16, 0x0a, 0xd2, 0x11, 0xbe, 0xce, 0xbb, 0xde, 0xbc, 0xe6, 0x1f, 0xd7, 0x3a, 0x65, 0x96, 0x13, 0xf8, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x35, 0x13, 0xf6, 0x4b, 0xdd, 0xd6, 0xdb, 0xe6, 0xfb, 0xe6, 0x3f, 0xd7, 0x37, 0x44, 0xf5, 0x0a, 0x17, 0x0b, 0xd7, 0x0a, 0xb8, 0x02, 0xd9, 0x0a, 0xd8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd8, 0x0a, 0xd7, 0x02, 0xb7, 0x02, 0xd6, 0x02, 0xb5, 0x0a, 0x73, 0x1a, 0x1b, 0x85, 0x7d, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x3f, 0xdf, 0x99, 0x5c, 0xd5, 0x0a, 0xd7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x76, 0x02, 0xb6, 0x0a, 0x94, 0x02, 0xb2, 0x1a, 0x7c, 0xbe, 0xbc, 0xd6, 0xff, 0xce, 0xf4, 0x4b, 0x95, 0x13, 0x97, 0x03, 0x77, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x97, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x57, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x36, 0x0b, 0x16, 0x0b, 0x15, 0x03, 0xf4, 0x12, 0x70, 0x22, 0xfb, 0xad, 0x9b, 0xd6, 0xde, 0xce, 0x75, 0x33, 0xb5, 0x02, 0xb7, 0x0a, 0x76, 0x02, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x56, 0x02, 0x55, 0x0a, 0x54, 0x0a, 0x31, 0x1a, 0x5e, 0xbe, 0x7b, 0x9d, 0x54, 0x1a, 0xd5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x3a, 0x0c, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0xf9, 0x0b, 0xf9, 0x0b, 0xb7, 0x0b, 0x77, 0x4c, 0xbd, 0xce, 0xfc, 0xee, 0x7e, 0xf7, 0xfe, 0xc6, 0xfe, 0x7d, 0xb7, 0x13, 0xb8, 0x0b, 0xd9, 0x0b, 0xf8, 0x0b, 0xf9, 0x0b, 0xf9, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xd9, 0x0b, 0xfa, 0x0b, 0xd9, 0x03, 0xf9, 0x0b, 0x7c, 0x1c, 0xbc, 0x24, 0x3a, 0x14, 0xf9, 0x0b, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0x76, 0x13, 0x37, 0x4c, 0x1e, 0xd7, 0xfc, 0xee, 0xfc, 0xe6, 0x5f, 0xe7, 0xbf, 0xb6, 0x94, 0x22, 0x35, 0x0a, 0x17, 0x0a, 0xf7, 0x09, 0xd8, 0x01, 0xf8, 0x01, 0x19, 0x02, 0x58, 0x0a, 0x38, 0x0a, 0x18, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xd5, 0x01, 0x33, 0x22, 0x9d, 0xc6, 0xdb, 0xde, 0xba, 0xde, 0x1d, 0xdf, 0x3f, 0xb7, 0x58, 0x3c, 0xf8, 0x13, 0x1a, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0x99, 0x03, 0x9a, 0x03, 0xba, 0x03, 0xfa, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x95, 0x2b, 0xda, 0x9d, 0xfd, 0xd6, 0xdb, 0xde, 0x1e, 0xdf, 0x1f, 0xa6, 0xf2, 0x09, 0x36, 0x12, 0xf6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xd6, 0x09, 0x91, 0x11, 0xdc, 0xb5, 0xbc, 0xde, 0xdb, 0xde, 0x3f, 0xdf, 0x7d, 0x85, 0x14, 0x0a, 0x17, 0x0a, 0xf7, 0x01, 0x37, 0x02, 0x37, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x0a, 0x17, 0x0a, 0xf6, 0x09, 0xd1, 0x11, 0xbe, 0xce, 0xbb, 0xde, 0xdc, 0xe6, 0x1f, 0xdf, 0x5b, 0x6d, 0x96, 0x13, 0xf8, 0x13, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x35, 0x13, 0x16, 0x4c, 0xbc, 0xce, 0xba, 0xe6, 0xfb, 0xe6, 0x3f, 0xd7, 0x78, 0x4c, 0x16, 0x0b, 0x17, 0x0b, 0xf8, 0x0a, 0xd8, 0x02, 0xd9, 0x0a, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xd7, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xd6, 0x0a, 0x52, 0x1a, 0xb9, 0x7c, 0x9d, 0xce, 0x9b, 0xde, 0xbb, 0xde, 0xfe, 0xd6, 0x99, 0x5c, 0x94, 0x02, 0xf7, 0x0a, 0xd8, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x96, 0x0a, 0x94, 0x0a, 0xb2, 0x22, 0x9c, 0xc6, 0xbb, 0xce, 0xfe, 0xce, 0xf5, 0x4b, 0x95, 0x13, 0x97, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0xf6, 0x02, 0x15, 0x03, 0xf4, 0x12, 0x90, 0x22, 0x1c, 0xae, 0x9b, 0xd6, 0xdd, 0xce, 0x74, 0x33, 0xd5, 0x0a, 0x96, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x55, 0x02, 0x35, 0x0a, 0x53, 0x0a, 0x72, 0x22, 0x3d, 0xbe, 0x9c, 0xa5, 0x33, 0x12, 0xd4, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x1a, 0x0c, 0x19, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xf9, 0x03, 0xd9, 0x0b, 0xb8, 0x0b, 0x37, 0x3c, 0xdd, 0xd6, 0xfb, 0xf6, 0x7d, 0xff, 0x5e, 0xe7, 0xdf, 0xcf, 0x74, 0x23, 0xb7, 0x13, 0xfa, 0x0b, 0x19, 0x0c, 0xd9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xf9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0x7b, 0x1c, 0x9c, 0x24, 0x3a, 0x14, 0x19, 0x0c, 0xf9, 0x0b, 0xf9, 0x03, 0xf9, 0x03, 0xb8, 0x03, 0xb7, 0x0b, 0x96, 0x13, 0x77, 0x4c, 0x9c, 0xc6, 0x1c, 0xef, 0x3d, 0xef, 0xfe, 0xd6, 0x5f, 0xae, 0xf2, 0x11, 0xf5, 0x01, 0x59, 0x12, 0xd7, 0x09, 0xf8, 0x09, 0xf8, 0x01, 0xf8, 0x01, 0x18, 0x02, 0x18, 0x0a, 0x18, 0x02, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xd6, 0x01, 0xd5, 0x01, 0x53, 0x22, 0x9e, 0xc6, 0xbb, 0xde, 0xda, 0xde, 0x1d, 0xd7, 0x9e, 0xa6, 0xd6, 0x23, 0xd8, 0x0b, 0xfa, 0x03, 0x1a, 0x0c, 0xd9, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xba, 0x03, 0xfa, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xfa, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x75, 0x2b, 0x9a, 0x95, 0x1d, 0xdf, 0xdc, 0xde, 0xfe, 0xde, 0xde, 0x95, 0xf2, 0x09, 0x16, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xd6, 0x09, 0x91, 0x11, 0xdc, 0xb5, 0xbc, 0xde, 0xfb, 0xde, 0x5f, 0xdf, 0x1c, 0x7d, 0x34, 0x12, 0x78, 0x12, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x0a, 0x16, 0x0a, 0xf6, 0x09, 0xd1, 0x11, 0x7d, 0xc6, 0x7a, 0xd6, 0xbb, 0xe6, 0x1f, 0xd7, 0x5b, 0x6d, 0x76, 0x13, 0xd8, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x99, 0x03, 0x57, 0x0b, 0x35, 0x13, 0x37, 0x54, 0x9c, 0xce, 0xba, 0xe6, 0xfb, 0xe6, 0x5f, 0xd7, 0x78, 0x4c, 0x16, 0x0b, 0xf7, 0x0a, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xb7, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xb5, 0x0a, 0x52, 0x12, 0x99, 0x7c, 0x9c, 0xce, 0x9a, 0xde, 0xbb, 0xde, 0xfe, 0xd6, 0xfa, 0x6c, 0x93, 0x02, 0xf7, 0x12, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x76, 0x0a, 0xb5, 0x0a, 0xb2, 0x22, 0xbd, 0xc6, 0xbc, 0xd6, 0xff, 0xce, 0x15, 0x54, 0x75, 0x13, 0x97, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0xf5, 0x02, 0x15, 0x03, 0xf4, 0x12, 0x90, 0x22, 0x1c, 0xb6, 0x9b, 0xce, 0xbd, 0xc6, 0x54, 0x2b, 0xd5, 0x02, 0x96, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0xb6, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x54, 0x0a, 0x12, 0x0a, 0x92, 0x2a, 0x5d, 0xbe, 0x1d, 0xb6, 0x33, 0x1a, 0xd5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0xfa, 0x0b, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0x17, 0x34, 0x1e, 0xd7, 0x1c, 0xf7, 0x5c, 0xf7, 0x3d, 0xdf, 0x1f, 0xb7, 0x95, 0x23, 0xf9, 0x1b, 0x1a, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0x1a, 0x0c, 0xd9, 0x03, 0xf9, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xb9, 0x0b, 0xf9, 0x0b, 0xf9, 0x0b, 0xd9, 0x0b, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd8, 0x0b, 0xb7, 0x0b, 0x96, 0x13, 0x77, 0x4c, 0x1e, 0xd7, 0xdb, 0xe6, 0xdc, 0xde, 0x5f, 0xe7, 0x1b, 0x7d, 0xf2, 0x09, 0x77, 0x12, 0x59, 0x12, 0xd7, 0x09, 0xf8, 0x09, 0xf8, 0x01, 0xd8, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf8, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x09, 0xd7, 0x09, 0xf5, 0x09, 0x53, 0x22, 0xbe, 0xce, 0xdb, 0xde, 0xfb, 0xe6, 0x1d, 0xd7, 0x7d, 0x96, 0xd5, 0x23, 0x19, 0x0c, 0x1a, 0x04, 0x19, 0x04, 0xd9, 0x03, 0xda, 0x03, 0xba, 0x03, 0xba, 0x03, 0xfa, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x77, 0x13, 0x75, 0x2b, 0x58, 0x8d, 0xfd, 0xd6, 0xfc, 0xe6, 0x1f, 0xdf, 0xdf, 0x95, 0xf3, 0x09, 0x16, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb5, 0x09, 0x91, 0x11, 0xdc, 0xb5, 0xbc, 0xde, 0xfb, 0xde, 0x5f, 0xdf, 0xdb, 0x74, 0x34, 0x0a, 0x57, 0x0a, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x17, 0x02, 0x18, 0x0a, 0xd7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x18, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf6, 0x01, 0x16, 0x0a, 0xf6, 0x09, 0xd2, 0x11, 0x7d, 0xc6, 0xbb, 0xde, 0xdc, 0xe6, 0x3f, 0xdf, 0x3a, 0x6d, 0x96, 0x13, 0xd8, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x98, 0x03, 0x57, 0x0b, 0x35, 0x13, 0x98, 0x5c, 0xbc, 0xce, 0xdb, 0xe6, 0xdb, 0xe6, 0x3f, 0xd7, 0x99, 0x54, 0x16, 0x0b, 0xf7, 0x0a, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0x95, 0x0a, 0x52, 0x12, 0xfa, 0x84, 0x9c, 0xd6, 0x9a, 0xde, 0xbb, 0xe6, 0x1e, 0xdf, 0x7b, 0x7d, 0xb3, 0x0a, 0xf7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x96, 0x0a, 0xb5, 0x0a, 0x71, 0x1a, 0xbd, 0xc6, 0xbc, 0xd6, 0xff, 0xce, 0x15, 0x54, 0x75, 0x13, 0x97, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x56, 0x03, 0x37, 0x03, 0x17, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0xf5, 0x02, 0x15, 0x03, 0xf4, 0x12, 0x90, 0x22, 0x1c, 0xb6, 0x9b, 0xce, 0xbd, 0xc6, 0x54, 0x2b, 0xd5, 0x02, 0x96, 0x02, 0x97, 0x02, 0x75, 0x02, 0xb6, 0x0a, 0x76, 0x0a, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x96, 0x0a, 0x95, 0x02, 0x74, 0x0a, 0x12, 0x0a, 0xb2, 0x2a, 0x9e, 0xbe, 0x1d, 0xae, 0x33, 0x1a, 0xf5, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x04, 0x1b, 0x04, 0x1b, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0xd8, 0x03, 0xf8, 0x0b, 0xd8, 0x13, 0xf6, 0x2b, 0x3f, 0xcf, 0x5d, 0xe7, 0x3d, 0xef, 0xbc, 0xc6, 0xb9, 0x54, 0x97, 0x13, 0x19, 0x14, 0xf9, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xf9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xba, 0x03, 0xfb, 0x0b, 0xfa, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xfa, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0x96, 0x13, 0x77, 0x4c, 0xbd, 0xce, 0xfb, 0xe6, 0x3d, 0xef, 0x1f, 0xdf, 0xbe, 0x95, 0xf2, 0x09, 0x36, 0x0a, 0x38, 0x0a, 0xf8, 0x09, 0xd8, 0x09, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x09, 0xf8, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd5, 0x09, 0x53, 0x22, 0xbe, 0xce, 0xba, 0xde, 0xdb, 0xe6, 0xfd, 0xd6, 0x5d, 0x96, 0xd6, 0x23, 0x39, 0x14, 0x3b, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0xda, 0x0b, 0xba, 0x03, 0xba, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x13, 0x75, 0x2b, 0x79, 0x8d, 0xdc, 0xd6, 0xfc, 0xde, 0x1f, 0xdf, 0xff, 0x9d, 0x14, 0x12, 0x37, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb5, 0x09, 0x91, 0x11, 0xbc, 0xb5, 0xbc, 0xde, 0xfb, 0xde, 0x5f, 0xdf, 0x1c, 0x7d, 0x55, 0x12, 0x16, 0x02, 0xf7, 0x01, 0x38, 0x0a, 0x37, 0x0a, 0x18, 0x0a, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0x17, 0x0a, 0x17, 0x0a, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xf6, 0x09, 0xf6, 0x09, 0xd2, 0x11, 0x7d, 0xc6, 0xdc, 0xde, 0xdc, 0xe6, 0x5f, 0xdf, 0xf9, 0x64, 0x96, 0x13, 0xd8, 0x0b, 0xd9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x55, 0x13, 0x98, 0x5c, 0xdc, 0xce, 0xdb, 0xe6, 0xdb, 0xe6, 0x3f, 0xd7, 0xb9, 0x54, 0x36, 0x13, 0x17, 0x0b, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xb8, 0x0a, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0x95, 0x0a, 0x52, 0x1a, 0xfa, 0x84, 0xbd, 0xd6, 0x9a, 0xde, 0xba, 0xe6, 0xfe, 0xd6, 0x3a, 0x75, 0x93, 0x0a, 0xf7, 0x0a, 0xd7, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x95, 0x0a, 0x30, 0x12, 0x9d, 0xc6, 0xbc, 0xd6, 0xff, 0xce, 0x15, 0x54, 0x75, 0x13, 0x97, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x56, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x36, 0x0b, 0x16, 0x03, 0x15, 0x03, 0xf4, 0x12, 0x90, 0x22, 0x3c, 0xb6, 0xbc, 0xce, 0xbd, 0xc6, 0x75, 0x2b, 0xd5, 0x02, 0x96, 0x02, 0x97, 0x02, 0x75, 0x02, 0xb6, 0x0a, 0x76, 0x0a, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x75, 0x0a, 0x53, 0x12, 0xb2, 0x32, 0x9d, 0xbe, 0x9b, 0x9d, 0x12, 0x12, 0xf5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1b, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xda, 0x03, 0x1a, 0x0c, 0xfa, 0x0b, 0xd9, 0x03, 0xd9, 0x0b, 0xf8, 0x0b, 0xf8, 0x13, 0xd8, 0x13, 0xd6, 0x2b, 0x1f, 0xc7, 0x5e, 0xe7, 0x3e, 0xe7, 0x3c, 0xae, 0x76, 0x23, 0x1a, 0x14, 0x1a, 0x14, 0xf9, 0x0b, 0xda, 0x03, 0xfb, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0xd9, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xd9, 0x0b, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xb9, 0x0b, 0xb8, 0x13, 0x97, 0x13, 0x77, 0x4c, 0xfd, 0xce, 0x1c, 0xef, 0xdc, 0xde, 0x3f, 0xdf, 0x3b, 0x85, 0xf2, 0x09, 0x36, 0x0a, 0x79, 0x12, 0xf8, 0x09, 0xd8, 0x01, 0xd8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf8, 0x09, 0x18, 0x0a, 0xf8, 0x09, 0xf8, 0x01, 0xf8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd5, 0x01, 0x33, 0x22, 0xbe, 0xce, 0x9a, 0xd6, 0xdb, 0xe6, 0xdc, 0xd6, 0x5d, 0x96, 0xb5, 0x23, 0x19, 0x14, 0x1a, 0x04, 0xd8, 0x03, 0x19, 0x0c, 0xda, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0xda, 0x0b, 0xb9, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x13, 0x75, 0x2b, 0x58, 0x8d, 0xdc, 0xd6, 0xfc, 0xde, 0x1f, 0xdf, 0x5d, 0x85, 0xf3, 0x09, 0x17, 0x0a, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x09, 0x71, 0x11, 0xbc, 0xb5, 0xbc, 0xde, 0xfb, 0xde, 0x3f, 0xd7, 0x1c, 0x75, 0x76, 0x12, 0x57, 0x0a, 0x17, 0x02, 0x58, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0xf8, 0x09, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x18, 0x0a, 0xf8, 0x09, 0xf7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xf6, 0x09, 0xf6, 0x09, 0xd2, 0x11, 0x5d, 0xbe, 0xbb, 0xde, 0xbc, 0xe6, 0x3f, 0xdf, 0xf9, 0x5c, 0x76, 0x13, 0xb7, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x57, 0x0b, 0x35, 0x13, 0x57, 0x54, 0xbc, 0xce, 0xba, 0xde, 0xdb, 0xe6, 0x3f, 0xd7, 0x98, 0x54, 0x16, 0x0b, 0x17, 0x0b, 0xf8, 0x0a, 0xd8, 0x02, 0xf9, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xd8, 0x02, 0xb7, 0x02, 0xd6, 0x02, 0xd5, 0x12, 0x32, 0x1a, 0x78, 0x74, 0x9d, 0xd6, 0x9a, 0xde, 0x9b, 0xde, 0xfe, 0xd6, 0xb9, 0x64, 0xb4, 0x0a, 0xf7, 0x0a, 0xf8, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x56, 0x02, 0x76, 0x0a, 0x95, 0x0a, 0x51, 0x1a, 0x9c, 0xc6, 0xdc, 0xd6, 0xfe, 0xce, 0x56, 0x5c, 0x95, 0x13, 0x97, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x56, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x37, 0x03, 0x36, 0x0b, 0x16, 0x0b, 0x15, 0x03, 0x14, 0x13, 0x90, 0x22, 0x3c, 0xb6, 0xbc, 0xce, 0xbd, 0xc6, 0xb5, 0x33, 0xd5, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x75, 0x02, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x95, 0x02, 0x75, 0x02, 0x53, 0x12, 0x14, 0x3b, 0x9d, 0xbe, 0x9a, 0x95, 0x33, 0x12, 0xf5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, + 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x04, 0x1a, 0x04, 0xf9, 0x03, 0x1a, 0x0c, 0xf9, 0x03, 0xf9, 0x0b, 0x5b, 0x1c, 0x3a, 0x1c, 0xd8, 0x0b, 0xf9, 0x0b, 0xf8, 0x03, 0x19, 0x0c, 0xd8, 0x13, 0x17, 0x34, 0xdd, 0xc6, 0x3c, 0xe7, 0x7f, 0xe7, 0xfc, 0x9d, 0x96, 0x23, 0x5b, 0x24, 0x5a, 0x1c, 0x19, 0x0c, 0xd9, 0x03, 0xfa, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb8, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xd9, 0x0b, 0xb8, 0x13, 0x76, 0x13, 0x36, 0x44, 0xbc, 0xc6, 0xfc, 0xe6, 0xfc, 0xe6, 0x3f, 0xdf, 0x7f, 0xae, 0x74, 0x1a, 0x15, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xf7, 0x01, 0xf7, 0x09, 0x18, 0x0a, 0xf8, 0x01, 0xf8, 0x09, 0xf8, 0x01, 0xf8, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xf5, 0x09, 0x53, 0x22, 0xdf, 0xce, 0x9a, 0xd6, 0xfb, 0xe6, 0xfc, 0xd6, 0xdf, 0xae, 0xb5, 0x23, 0x19, 0x14, 0xf9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xb9, 0x03, 0x79, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x77, 0x13, 0x75, 0x2b, 0x17, 0x85, 0xfd, 0xd6, 0xfc, 0xde, 0x1f, 0xdf, 0x9a, 0x6c, 0xf3, 0x09, 0x17, 0x0a, 0x18, 0x0a, 0xf7, 0x01, 0xf7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x09, 0x71, 0x11, 0xbc, 0xb5, 0x9c, 0xde, 0xdb, 0xde, 0x3f, 0xd7, 0x79, 0x64, 0x55, 0x12, 0x78, 0x0a, 0xf7, 0x01, 0x17, 0x02, 0xd6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xf6, 0x01, 0xd5, 0x09, 0xb1, 0x11, 0x7d, 0xc6, 0x9b, 0xd6, 0xdc, 0xe6, 0x3f, 0xdf, 0x5b, 0x6d, 0x76, 0x13, 0xd8, 0x13, 0xd9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x0b, 0x35, 0x13, 0x16, 0x4c, 0xbc, 0xce, 0xba, 0xde, 0xfb, 0xe6, 0x3f, 0xd7, 0x58, 0x4c, 0xf5, 0x0a, 0x17, 0x0b, 0xd7, 0x0a, 0xd8, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0xb6, 0x02, 0xb6, 0x0a, 0x52, 0x12, 0x99, 0x74, 0x7c, 0xce, 0x9b, 0xd6, 0xbb, 0xde, 0x1e, 0xd7, 0x58, 0x54, 0xf5, 0x0a, 0xd6, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x56, 0x0a, 0x76, 0x0a, 0x95, 0x0a, 0x71, 0x1a, 0x7c, 0xc6, 0xbc, 0xd6, 0xfe, 0xce, 0xd8, 0x6c, 0x74, 0x13, 0xb7, 0x03, 0x97, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x56, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x36, 0x0b, 0x16, 0x0b, 0x36, 0x03, 0x14, 0x13, 0x90, 0x22, 0x3c, 0xb6, 0x9c, 0xd6, 0xbd, 0xce, 0xf7, 0x43, 0xb5, 0x02, 0xb7, 0x0a, 0x76, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x75, 0x0a, 0x75, 0x02, 0x74, 0x0a, 0x32, 0x12, 0x96, 0x53, 0x7d, 0xbe, 0xdb, 0xa5, 0x73, 0x22, 0xd5, 0x09, 0xd5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, + 0xfa, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x0b, 0xf9, 0x03, 0x3a, 0x14, 0x19, 0x14, 0x3a, 0x1c, 0xdc, 0x2c, 0x9b, 0x2c, 0x19, 0x1c, 0x19, 0x1c, 0xf9, 0x03, 0x19, 0x0c, 0xd9, 0x0b, 0x58, 0x44, 0xdc, 0xce, 0x1b, 0xef, 0x9f, 0xef, 0xfc, 0x9d, 0x95, 0x2b, 0x19, 0x24, 0x5a, 0x1c, 0xd8, 0x0b, 0x98, 0x03, 0xfa, 0x0b, 0xfa, 0x03, 0xda, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x0b, 0xb8, 0x13, 0x55, 0x0b, 0xf5, 0x3b, 0xfd, 0xce, 0xdb, 0xe6, 0xfc, 0xe6, 0x3f, 0xdf, 0x9d, 0x95, 0x12, 0x12, 0x57, 0x12, 0x58, 0x12, 0xd7, 0x01, 0xd8, 0x09, 0xd8, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0x17, 0x0a, 0x18, 0x0a, 0xf7, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xd8, 0x09, 0xd7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xf5, 0x09, 0x53, 0x22, 0xff, 0xd6, 0x9a, 0xd6, 0x1b, 0xef, 0xfc, 0xd6, 0x1f, 0xb7, 0x94, 0x23, 0x19, 0x14, 0xf9, 0x03, 0x19, 0x0c, 0xd8, 0x03, 0xda, 0x0b, 0xb9, 0x0b, 0xda, 0x0b, 0xfa, 0x0b, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x54, 0x2b, 0x17, 0x85, 0x1d, 0xdf, 0xdc, 0xde, 0x1f, 0xdf, 0x59, 0x64, 0x55, 0x12, 0x37, 0x0a, 0xf8, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xf7, 0x09, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x09, 0x71, 0x11, 0x9c, 0xb5, 0x9c, 0xd6, 0xdb, 0xde, 0x3f, 0xd7, 0x18, 0x54, 0x55, 0x0a, 0x78, 0x12, 0xf7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0x18, 0x0a, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd5, 0x01, 0xb1, 0x09, 0x7d, 0xc6, 0x5a, 0xce, 0xdc, 0xe6, 0x3f, 0xdf, 0x9c, 0x75, 0x55, 0x0b, 0xd8, 0x0b, 0xd9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x55, 0x13, 0xf5, 0x4b, 0xdd, 0xce, 0xda, 0xde, 0xfb, 0xe6, 0x3f, 0xd7, 0x78, 0x4c, 0x36, 0x13, 0x37, 0x13, 0xf8, 0x0a, 0xd8, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xd6, 0x02, 0x95, 0x0a, 0x52, 0x12, 0xfa, 0x84, 0x9d, 0xce, 0x9b, 0xd6, 0xdb, 0xde, 0xfe, 0xce, 0xf6, 0x43, 0xf5, 0x0a, 0xb6, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x76, 0x0a, 0x55, 0x0a, 0x54, 0x0a, 0x71, 0x1a, 0x5c, 0xbe, 0x9b, 0xd6, 0xfe, 0xce, 0x5a, 0x7d, 0x74, 0x13, 0xb7, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x56, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x36, 0x0b, 0x16, 0x0b, 0x36, 0x03, 0x14, 0x13, 0x90, 0x22, 0x1c, 0xae, 0x9c, 0xd6, 0xdd, 0xce, 0x17, 0x44, 0xb5, 0x02, 0xb7, 0x0a, 0x76, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x55, 0x0a, 0x75, 0x02, 0x54, 0x0a, 0x12, 0x12, 0xf7, 0x63, 0x3b, 0xb6, 0xfb, 0xa5, 0x32, 0x22, 0xb4, 0x09, 0xd5, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, + 0x1a, 0x04, 0xf9, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x04, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x0b, 0xfa, 0x1b, 0x5b, 0x24, 0xfd, 0x3c, 0x7b, 0x24, 0xf8, 0x13, 0xf8, 0x0b, 0x18, 0x0c, 0x19, 0x0c, 0x97, 0x03, 0x79, 0x44, 0x9c, 0xc6, 0xdb, 0xe6, 0x7e, 0xf7, 0x1b, 0xae, 0xb5, 0x2b, 0x19, 0x24, 0x3a, 0x1c, 0x1a, 0x14, 0xd9, 0x0b, 0xb9, 0x0b, 0xfa, 0x13, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0x78, 0x0b, 0xd9, 0x13, 0xb9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd8, 0x0b, 0xb7, 0x0b, 0x55, 0x03, 0xb6, 0x13, 0x57, 0x3c, 0x1f, 0xd7, 0x9b, 0xde, 0x3b, 0xef, 0x5d, 0xdf, 0x9c, 0x8d, 0x13, 0x0a, 0x36, 0x02, 0x59, 0x0a, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0x17, 0x02, 0xf7, 0x01, 0xd8, 0x01, 0xd9, 0x09, 0xd8, 0x09, 0xf8, 0x09, 0xd8, 0x09, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x09, 0xd7, 0x09, 0x16, 0x0a, 0xf5, 0x01, 0xf5, 0x01, 0xd5, 0x2a, 0x7d, 0xd6, 0xdb, 0xee, 0x1d, 0xef, 0xfe, 0xd6, 0xdf, 0xb6, 0xf5, 0x3b, 0xf8, 0x23, 0xd9, 0x0b, 0x1b, 0x0c, 0xfa, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0xd8, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0xb8, 0x0b, 0xb9, 0x13, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x75, 0x23, 0x16, 0x85, 0xfb, 0xde, 0xfb, 0xe6, 0x1e, 0xdf, 0xbb, 0x6c, 0x15, 0x02, 0x57, 0x0a, 0xf6, 0x01, 0xd6, 0x01, 0xf7, 0x01, 0x17, 0x0a, 0xf7, 0x01, 0xd6, 0x01, 0xf7, 0x01, 0xd6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xb8, 0x09, 0xb8, 0x09, 0xb7, 0x01, 0xd3, 0x09, 0x7b, 0xad, 0x7b, 0xde, 0xdc, 0xe6, 0x1f, 0xd7, 0x7a, 0x64, 0x54, 0x12, 0x56, 0x12, 0xf6, 0x09, 0xf8, 0x09, 0x19, 0x12, 0x1a, 0x0a, 0xd9, 0x01, 0x18, 0x0a, 0x17, 0x0a, 0xf7, 0x01, 0x17, 0x0a, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x18, 0x0a, 0x18, 0x02, 0x18, 0x0a, 0xd7, 0x01, 0xf7, 0x09, 0xd6, 0x01, 0xf6, 0x01, 0xb5, 0x01, 0x91, 0x11, 0xdd, 0xbd, 0x9c, 0xe6, 0x9a, 0xe6, 0x5e, 0xdf, 0xd9, 0x54, 0x96, 0x0b, 0xb7, 0x03, 0xd8, 0x0b, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x79, 0x0b, 0x58, 0x0b, 0x96, 0x0b, 0x36, 0x3c, 0xbd, 0xce, 0x9b, 0xee, 0xfb, 0xee, 0x3f, 0xdf, 0x79, 0x54, 0xf6, 0x0a, 0x17, 0x0b, 0xf7, 0x0a, 0xf7, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf8, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf8, 0x0a, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0x96, 0x02, 0xd7, 0x0a, 0xb6, 0x0a, 0x95, 0x12, 0x53, 0x22, 0xb9, 0x84, 0xbc, 0xd6, 0x99, 0xde, 0xba, 0xde, 0xdd, 0xce, 0xd6, 0x43, 0xd6, 0x0a, 0xd7, 0x0a, 0xd8, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x0a, 0x56, 0x0a, 0x76, 0x0a, 0xb6, 0x02, 0x71, 0x0a, 0xbd, 0xce, 0xda, 0xe6, 0xdb, 0xe6, 0x1b, 0xb6, 0x35, 0x23, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x99, 0x03, 0xba, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x17, 0x03, 0x17, 0x0b, 0x37, 0x0b, 0x77, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x35, 0x0b, 0x13, 0x1b, 0xb0, 0x32, 0x3c, 0xb6, 0x9b, 0xce, 0xbd, 0xc6, 0xf6, 0x43, 0xf5, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x77, 0x02, 0x78, 0x0a, 0x77, 0x12, 0x56, 0x12, 0x75, 0x0a, 0x75, 0x0a, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, 0x75, 0x0a, 0x56, 0x0a, 0x56, 0x02, 0x57, 0x02, 0x77, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x35, 0x0a, 0x14, 0x1a, 0x12, 0x1a, 0xf7, 0x63, 0x5c, 0xc6, 0x9a, 0x9d, 0x15, 0x2b, 0xf4, 0x01, 0xd4, 0x09, 0x74, 0x09, 0x95, 0x09, 0x96, 0x01, 0x95, 0x01, 0x95, 0x01, 0x96, 0x01, 0x96, 0x09, 0x96, 0x09, 0x96, 0x09, 0x75, 0x01, 0x96, 0x09, 0x95, 0x09, 0x95, 0x09, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, + 0x1a, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0x3a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x0b, 0xf9, 0x13, 0xf9, 0x13, 0x5b, 0x24, 0xf9, 0x13, 0xd8, 0x03, 0xf8, 0x0b, 0x18, 0x14, 0xf8, 0x13, 0xb7, 0x0b, 0x57, 0x3c, 0x1e, 0xcf, 0xfb, 0xde, 0x9d, 0xe7, 0x5b, 0xa6, 0x93, 0x13, 0x98, 0x14, 0x17, 0x04, 0x17, 0x04, 0x59, 0x04, 0xf8, 0x03, 0xd7, 0x03, 0xf8, 0x0b, 0xb8, 0x03, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0xb9, 0x13, 0x98, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x13, 0xb9, 0x13, 0x78, 0x13, 0x57, 0x1b, 0x57, 0x1b, 0x17, 0x4c, 0xdd, 0xce, 0xfa, 0xde, 0x3a, 0xe7, 0x7d, 0xdf, 0xfd, 0x95, 0x53, 0x12, 0x77, 0x0a, 0x38, 0x02, 0xf7, 0x09, 0xd7, 0x09, 0xd7, 0x09, 0xf7, 0x09, 0x16, 0x02, 0x16, 0x02, 0xf6, 0x09, 0xf6, 0x09, 0xf5, 0x01, 0xf5, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd5, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xf5, 0x01, 0x35, 0x02, 0x15, 0x02, 0xd5, 0x2a, 0xdf, 0xd6, 0xdc, 0xe6, 0x1d, 0xdf, 0xfd, 0xce, 0xbf, 0xb6, 0x53, 0x2b, 0x18, 0x2c, 0xd8, 0x0b, 0xfa, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xf8, 0x0b, 0x97, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0x1a, 0x0c, 0xda, 0x03, 0x9a, 0x03, 0xba, 0x0b, 0xb9, 0x03, 0x98, 0x0b, 0x57, 0x0b, 0xb6, 0x33, 0x79, 0x8d, 0xfd, 0xd6, 0xdc, 0xd6, 0x1f, 0xd7, 0x9c, 0x64, 0x35, 0x0a, 0x36, 0x0a, 0x16, 0x0a, 0xd7, 0x09, 0xd7, 0x09, 0xf8, 0x09, 0xb7, 0x09, 0xb7, 0x01, 0xd7, 0x09, 0xb7, 0x09, 0xd8, 0x09, 0xd8, 0x09, 0xd8, 0x09, 0xd7, 0x09, 0xd8, 0x09, 0xd8, 0x09, 0xd8, 0x09, 0xd8, 0x09, 0xd8, 0x09, 0xd6, 0x09, 0xf6, 0x01, 0x35, 0x02, 0xb0, 0x01, 0xd9, 0xad, 0xba, 0xd6, 0xdb, 0xd6, 0x3f, 0xcf, 0x3a, 0x4c, 0x57, 0x0a, 0x78, 0x0a, 0x37, 0x02, 0x37, 0x0a, 0x16, 0x02, 0xf4, 0x01, 0x36, 0x0a, 0x16, 0x02, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0x17, 0x0a, 0xf7, 0x01, 0xf6, 0x09, 0xf6, 0x09, 0x17, 0x0a, 0xf5, 0x09, 0xd5, 0x09, 0xd1, 0x11, 0x3d, 0xb6, 0xdc, 0xd6, 0xfb, 0xd6, 0x5f, 0xcf, 0x1a, 0x55, 0x97, 0x0b, 0xd8, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x99, 0x03, 0x9a, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x98, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb7, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0xb5, 0x0b, 0x15, 0x34, 0xbc, 0xc6, 0x9a, 0xde, 0xfb, 0xde, 0x3e, 0xd7, 0xf7, 0x3b, 0x37, 0x13, 0x78, 0x13, 0xd7, 0x02, 0xd7, 0x02, 0x18, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xb7, 0x02, 0xf7, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0x97, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xf7, 0x0a, 0x95, 0x02, 0x53, 0x12, 0xdb, 0x7c, 0x9c, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0x1f, 0xd7, 0x96, 0x33, 0xd6, 0x02, 0xf8, 0x0a, 0x98, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0x96, 0x02, 0xb6, 0x02, 0x75, 0x02, 0xd6, 0x12, 0x92, 0x22, 0x3c, 0xce, 0x5b, 0xde, 0x9c, 0xd6, 0x3d, 0xa6, 0x95, 0x23, 0x97, 0x03, 0x77, 0x03, 0x97, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x98, 0x03, 0x78, 0x03, 0x77, 0x03, 0x97, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x98, 0x03, 0x57, 0x03, 0x36, 0x03, 0x56, 0x03, 0x56, 0x03, 0x34, 0x13, 0xb0, 0x22, 0x3c, 0xb6, 0xbc, 0xde, 0x9d, 0xce, 0xf6, 0x4b, 0xb4, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x97, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x75, 0x02, 0x96, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x57, 0x02, 0x97, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x95, 0x02, 0x54, 0x02, 0x34, 0x0a, 0x33, 0x1a, 0xf2, 0x19, 0xf7, 0x63, 0x3c, 0xbe, 0x7a, 0x9d, 0x15, 0x33, 0x15, 0x02, 0x93, 0x01, 0xb4, 0x09, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x09, 0xb6, 0x09, 0x95, 0x09, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, + 0xf9, 0x0b, 0xd9, 0x0b, 0xf9, 0x0b, 0x1a, 0x0c, 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xf9, 0x03, 0xb9, 0x03, 0x19, 0x0c, 0xd8, 0x03, 0xd8, 0x03, 0xf9, 0x0b, 0xb8, 0x0b, 0x97, 0x13, 0x76, 0x1b, 0x57, 0x54, 0x3e, 0xdf, 0x9a, 0xde, 0xdc, 0xde, 0xfb, 0xa5, 0xb6, 0x2b, 0x3b, 0x24, 0xb9, 0x03, 0xfb, 0x03, 0x7d, 0x1c, 0x1b, 0x14, 0xfa, 0x13, 0x1b, 0x14, 0x1a, 0x14, 0xb8, 0x03, 0xd9, 0x03, 0x1a, 0x0c, 0xd8, 0x03, 0x19, 0x0c, 0xf8, 0x03, 0xf8, 0x03, 0x19, 0x0c, 0x18, 0x04, 0xf7, 0x03, 0xf7, 0x03, 0xd6, 0x0b, 0xd6, 0x13, 0x74, 0x13, 0x36, 0x4c, 0xbc, 0xce, 0xfb, 0xf6, 0x1b, 0xef, 0x3e, 0xe7, 0xbd, 0xa5, 0xd2, 0x11, 0x37, 0x0a, 0x18, 0x0a, 0xd8, 0x09, 0xb8, 0x09, 0xd8, 0x09, 0xf7, 0x09, 0x16, 0x02, 0x16, 0x02, 0xf6, 0x09, 0xf6, 0x09, 0x17, 0x0a, 0xf8, 0x09, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x09, 0xf7, 0x09, 0x16, 0x0a, 0x35, 0x0a, 0x14, 0x0a, 0xf4, 0x3a, 0xde, 0xde, 0x59, 0xde, 0xfb, 0xe6, 0x5e, 0xe7, 0x9f, 0xc7, 0xb4, 0x2b, 0xd7, 0x1b, 0xf9, 0x0b, 0xd8, 0x03, 0x1a, 0x0c, 0xd8, 0x03, 0xd8, 0x0b, 0xf9, 0x13, 0xd9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x13, 0xba, 0x13, 0x99, 0x03, 0xda, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0xb8, 0x0b, 0x56, 0x0b, 0xb5, 0x33, 0x58, 0x95, 0xfc, 0xde, 0xfc, 0xde, 0x1f, 0xd7, 0x7a, 0x64, 0x75, 0x12, 0x35, 0x0a, 0xf6, 0x01, 0xf6, 0x01, 0x16, 0x0a, 0x37, 0x12, 0xf6, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xf6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xf6, 0x01, 0xd6, 0x09, 0xd7, 0x09, 0x96, 0x01, 0xb5, 0x09, 0x91, 0x09, 0x79, 0xad, 0xfc, 0xe6, 0xdb, 0xde, 0x1f, 0xcf, 0xf8, 0x4b, 0x96, 0x12, 0x97, 0x0a, 0xf6, 0x01, 0x17, 0x02, 0x17, 0x0a, 0xf7, 0x09, 0xf8, 0x09, 0x18, 0x0a, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0x17, 0x02, 0xd7, 0x01, 0x17, 0x0a, 0xd6, 0x01, 0xd6, 0x09, 0xb1, 0x09, 0x1b, 0xbe, 0x99, 0xd6, 0xfb, 0xde, 0x5f, 0xdf, 0xba, 0x5c, 0x57, 0x13, 0x98, 0x13, 0xd9, 0x1b, 0x77, 0x0b, 0x98, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x98, 0x03, 0x98, 0x03, 0x97, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x77, 0x13, 0x56, 0x13, 0x55, 0x13, 0xd4, 0x3b, 0xdd, 0xce, 0xfc, 0xe6, 0x1c, 0xef, 0x3f, 0xd7, 0xf7, 0x43, 0x16, 0x13, 0x16, 0x0b, 0xd6, 0x0a, 0xf7, 0x0a, 0xf8, 0x0a, 0x97, 0x02, 0x97, 0x02, 0xd7, 0x0a, 0xf8, 0x0a, 0xf8, 0x12, 0xb7, 0x0a, 0xb7, 0x0a, 0xd7, 0x0a, 0xf8, 0x0a, 0xb7, 0x02, 0xb6, 0x02, 0x96, 0x02, 0xd6, 0x0a, 0xd7, 0x0a, 0x38, 0x0b, 0xb6, 0x02, 0x53, 0x0a, 0x99, 0x6c, 0x7c, 0xce, 0xbb, 0xe6, 0xbb, 0xde, 0xbe, 0xce, 0x17, 0x44, 0xd6, 0x0a, 0xd8, 0x0a, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0xb7, 0x0a, 0x55, 0x0a, 0x32, 0x0a, 0xb0, 0x2a, 0xdc, 0xce, 0xdb, 0xce, 0x7e, 0xcf, 0xba, 0x7d, 0x74, 0x13, 0x97, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x56, 0x03, 0x55, 0x03, 0x75, 0x03, 0x75, 0x0b, 0x76, 0x0b, 0x56, 0x0b, 0x77, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x76, 0x0b, 0x36, 0x0b, 0x37, 0x0b, 0x77, 0x0b, 0x15, 0x03, 0x56, 0x0b, 0x76, 0x0b, 0x35, 0x03, 0x13, 0x13, 0xd0, 0x2a, 0x5c, 0xbe, 0x7b, 0xd6, 0x7c, 0xd6, 0xf5, 0x53, 0x72, 0x12, 0xb4, 0x0a, 0xb5, 0x0a, 0x74, 0x02, 0x75, 0x0a, 0x95, 0x0a, 0x95, 0x0a, 0x95, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x77, 0x02, 0x56, 0x0a, 0x35, 0x0a, 0x35, 0x0a, 0x55, 0x0a, 0x74, 0x0a, 0x73, 0x02, 0x73, 0x0a, 0x54, 0x12, 0x12, 0x0a, 0xf1, 0x11, 0x18, 0x64, 0x9e, 0xc6, 0x7a, 0x9d, 0x53, 0x1a, 0xd4, 0x01, 0xb4, 0x01, 0xd6, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xb4, 0x01, + 0xf8, 0x23, 0xf8, 0x23, 0x59, 0x24, 0x7a, 0x24, 0x9a, 0x24, 0x7a, 0x24, 0x5a, 0x24, 0x19, 0x1c, 0xf9, 0x1b, 0x3a, 0x1c, 0x39, 0x14, 0x19, 0x14, 0x39, 0x14, 0x39, 0x14, 0x39, 0x1c, 0x3a, 0x1c, 0x9b, 0x24, 0x19, 0x1c, 0x75, 0x13, 0xd8, 0x64, 0xdb, 0xce, 0xda, 0xe6, 0x9a, 0xe6, 0x1a, 0xbe, 0xb5, 0x4b, 0x19, 0x44, 0x7b, 0x44, 0x3a, 0x34, 0xf9, 0x2b, 0x59, 0x34, 0x78, 0x3c, 0xf6, 0x33, 0x39, 0x44, 0x19, 0x44, 0xf8, 0x33, 0x18, 0x34, 0x39, 0x34, 0x39, 0x2c, 0xb7, 0x23, 0x19, 0x2c, 0xf8, 0x23, 0xf9, 0x1b, 0x39, 0x1c, 0x5a, 0x24, 0x19, 0x1c, 0x19, 0x24, 0x56, 0x1b, 0x78, 0x54, 0xdd, 0xce, 0x1d, 0xe7, 0x1c, 0xe7, 0x5f, 0xdf, 0x3e, 0xa6, 0x73, 0x1a, 0x76, 0x0a, 0x98, 0x0a, 0x78, 0x0a, 0x58, 0x02, 0x58, 0x02, 0x78, 0x02, 0x98, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x75, 0x02, 0x75, 0x02, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x0a, 0x97, 0x0a, 0x76, 0x0a, 0x75, 0x0a, 0x12, 0x0a, 0x34, 0x43, 0xdd, 0xd6, 0xfc, 0xe6, 0x5c, 0xef, 0x1c, 0xdf, 0xfe, 0xb6, 0xf3, 0x43, 0x77, 0x3c, 0x79, 0x3c, 0x79, 0x3c, 0x39, 0x34, 0x39, 0x44, 0x39, 0x44, 0x5a, 0x44, 0x5a, 0x3c, 0x3b, 0x3c, 0x3a, 0x2c, 0x19, 0x24, 0xd8, 0x13, 0x97, 0x03, 0x97, 0x03, 0xf8, 0x13, 0x3a, 0x1c, 0xf9, 0x1b, 0xfa, 0x13, 0xb9, 0x0b, 0xb8, 0x0b, 0x35, 0x0b, 0xd5, 0x3b, 0x98, 0xa5, 0xfc, 0xe6, 0xdb, 0xe6, 0xdd, 0xd6, 0x79, 0x6c, 0x54, 0x0a, 0x57, 0x02, 0x58, 0x02, 0x37, 0x0a, 0xd6, 0x01, 0xb5, 0x01, 0xd6, 0x01, 0x37, 0x12, 0x78, 0x12, 0x17, 0x0a, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd5, 0x01, 0xd4, 0x01, 0xf4, 0x09, 0xf4, 0x09, 0x90, 0x19, 0xdc, 0xbd, 0x9c, 0xe6, 0x9b, 0xde, 0x1f, 0xdf, 0xb7, 0x4b, 0x75, 0x12, 0x97, 0x12, 0x56, 0x0a, 0x35, 0x02, 0x15, 0x02, 0xf6, 0x01, 0xf7, 0x09, 0xf6, 0x01, 0xd6, 0x09, 0xf6, 0x01, 0xf6, 0x09, 0xf6, 0x09, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xd6, 0x01, 0xf6, 0x09, 0x16, 0x0a, 0xd5, 0x09, 0xd5, 0x09, 0xf5, 0x09, 0xf5, 0x11, 0xd1, 0x19, 0x3a, 0xb6, 0x1b, 0xdf, 0xfb, 0xd6, 0x1e, 0xc7, 0x58, 0x44, 0xb8, 0x1b, 0xb9, 0x13, 0x57, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x59, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x58, 0x0b, 0x57, 0x0b, 0x96, 0x13, 0x16, 0x3c, 0xbd, 0xbe, 0xbb, 0xce, 0xfc, 0xd6, 0x3f, 0xcf, 0xb9, 0x5c, 0x16, 0x13, 0xd5, 0x02, 0xb6, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x0a, 0xd8, 0x0a, 0xb7, 0x02, 0xb6, 0x02, 0xb7, 0x0a, 0xb6, 0x0a, 0x96, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xb7, 0x02, 0xd7, 0x0a, 0x95, 0x02, 0xb6, 0x0a, 0x96, 0x0a, 0xb6, 0x02, 0xb5, 0x0a, 0x93, 0x12, 0x78, 0x6c, 0x7c, 0xce, 0x7a, 0xe6, 0x59, 0xde, 0x1e, 0xd7, 0x74, 0x33, 0xd5, 0x02, 0x18, 0x0b, 0xd8, 0x0a, 0xb7, 0x02, 0xb6, 0x0a, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x0a, 0xb7, 0x0a, 0xb6, 0x0a, 0xb7, 0x0a, 0xb6, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x56, 0x0a, 0x95, 0x22, 0x51, 0x32, 0x5c, 0xc6, 0xbc, 0xd6, 0xfe, 0xce, 0x7a, 0x7d, 0x75, 0x13, 0x77, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x98, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0x35, 0x13, 0xd1, 0x2a, 0x5e, 0xb6, 0x9d, 0xce, 0xdf, 0xc6, 0xf8, 0x43, 0x94, 0x02, 0xb6, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x77, 0x02, 0x76, 0x02, 0x75, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x54, 0x0a, 0x31, 0x12, 0x36, 0x6c, 0x7c, 0xc6, 0x99, 0xad, 0x71, 0x2a, 0xf2, 0x11, 0xf4, 0x11, 0x94, 0x01, 0x94, 0x09, 0x94, 0x09, 0x94, 0x09, 0x94, 0x09, 0x94, 0x09, 0x94, 0x09, 0xb4, 0x09, 0xb4, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0xb4, 0x09, 0xb5, 0x09, 0x94, 0x01, 0x74, 0x01, + 0x5b, 0x75, 0x1a, 0x6d, 0x19, 0x65, 0xf9, 0x5c, 0xd8, 0x54, 0xb8, 0x54, 0x98, 0x54, 0x57, 0x4c, 0x98, 0x4c, 0x98, 0x4c, 0x97, 0x44, 0x77, 0x3c, 0x77, 0x3c, 0x98, 0x44, 0x78, 0x44, 0x57, 0x4c, 0x36, 0x4c, 0x96, 0x5c, 0xf7, 0x6c, 0x7c, 0xb6, 0xdb, 0xde, 0xba, 0xe6, 0xdb, 0xe6, 0x1d, 0xdf, 0x9a, 0x8d, 0x94, 0x33, 0x54, 0x1b, 0x95, 0x13, 0x53, 0x0b, 0x94, 0x0b, 0x94, 0x0b, 0xb5, 0x13, 0xf8, 0x1b, 0x76, 0x0b, 0x96, 0x0b, 0xd7, 0x0b, 0x75, 0x03, 0x96, 0x03, 0x55, 0x03, 0x35, 0x0b, 0x96, 0x13, 0x75, 0x13, 0x75, 0x13, 0x95, 0x1b, 0x54, 0x1b, 0x74, 0x2b, 0x54, 0x33, 0x19, 0x7d, 0xfc, 0xd6, 0x3a, 0xef, 0x3b, 0xe7, 0x3c, 0xdf, 0xbc, 0xbe, 0xd3, 0x5b, 0x12, 0x33, 0xb2, 0x22, 0xb3, 0x22, 0x93, 0x22, 0x94, 0x22, 0x74, 0x1a, 0x74, 0x1a, 0x54, 0x1a, 0x54, 0x1a, 0x55, 0x1a, 0x35, 0x12, 0x35, 0x12, 0x16, 0x12, 0x16, 0x12, 0xf5, 0x09, 0xf5, 0x09, 0xd5, 0x11, 0xf4, 0x11, 0x13, 0x12, 0x90, 0x09, 0xd0, 0x19, 0x78, 0x7c, 0xff, 0xde, 0xbb, 0xde, 0xdb, 0xe6, 0x1e, 0xe7, 0x3f, 0xe7, 0x1b, 0x95, 0xb6, 0x4b, 0x19, 0x4c, 0x96, 0x2b, 0xd7, 0x23, 0x54, 0x13, 0x54, 0x03, 0x55, 0x03, 0x76, 0x03, 0x96, 0x03, 0x97, 0x03, 0x97, 0x0b, 0x77, 0x0b, 0x77, 0x03, 0x57, 0x0b, 0x75, 0x13, 0x54, 0x1b, 0x14, 0x13, 0x96, 0x23, 0x76, 0x13, 0x35, 0x0b, 0x13, 0x1b, 0x97, 0x64, 0x3b, 0xb6, 0xdc, 0xd6, 0xbb, 0xd6, 0x1f, 0xd7, 0x3c, 0x85, 0x33, 0x12, 0x75, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x36, 0x0a, 0x57, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x36, 0x02, 0x36, 0x0a, 0x36, 0x0a, 0x56, 0x0a, 0x57, 0x0a, 0x57, 0x0a, 0x36, 0x02, 0x36, 0x02, 0x36, 0x02, 0x36, 0x02, 0x36, 0x02, 0x56, 0x0a, 0xb2, 0x01, 0x8e, 0x09, 0x7e, 0xc6, 0x9c, 0xd6, 0xbc, 0xde, 0x5f, 0xdf, 0xba, 0x74, 0x74, 0x1a, 0x55, 0x0a, 0xd8, 0x12, 0xd7, 0x12, 0x97, 0x0a, 0x96, 0x02, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x75, 0x0a, 0x75, 0x0a, 0x75, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x75, 0x0a, 0x96, 0x12, 0x95, 0x12, 0x95, 0x12, 0x33, 0x02, 0xcf, 0x11, 0x3b, 0xc6, 0x9a, 0xde, 0xdc, 0xde, 0x3f, 0xd7, 0x99, 0x5c, 0x76, 0x1b, 0x76, 0x0b, 0xb8, 0x0b, 0x97, 0x03, 0xb7, 0x03, 0x97, 0x03, 0x97, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x97, 0x0b, 0xb7, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x35, 0x0b, 0x34, 0x1b, 0x15, 0x4c, 0xbc, 0xc6, 0xba, 0xe6, 0xba, 0xee, 0xfe, 0xde, 0x79, 0x54, 0x16, 0x0b, 0x16, 0x0b, 0xf7, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xf8, 0x02, 0x97, 0x02, 0xf7, 0x02, 0x96, 0x02, 0x96, 0x02, 0xf7, 0x0a, 0xd7, 0x02, 0x96, 0x02, 0x97, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x95, 0x02, 0x94, 0x0a, 0x51, 0x12, 0x98, 0x7c, 0x7c, 0xce, 0xbb, 0xe6, 0xbb, 0xde, 0xdd, 0xc6, 0xd9, 0x54, 0x35, 0x0b, 0xf6, 0x02, 0xd7, 0x02, 0xd6, 0x0a, 0xd6, 0x0a, 0xb6, 0x0a, 0x96, 0x02, 0x95, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x02, 0x96, 0x02, 0x75, 0x02, 0x96, 0x12, 0x33, 0x1a, 0x72, 0x3a, 0xbe, 0xde, 0x9c, 0xde, 0xdd, 0xd6, 0xb6, 0x74, 0x54, 0x1b, 0x96, 0x0b, 0x76, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x59, 0x0b, 0x79, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x76, 0x13, 0x15, 0x0b, 0x56, 0x0b, 0x13, 0x1b, 0xb0, 0x32, 0x7d, 0xbe, 0x9c, 0xc6, 0xde, 0xc6, 0xd6, 0x43, 0xb4, 0x0a, 0xb5, 0x02, 0x96, 0x02, 0x96, 0x02, 0x56, 0x02, 0x97, 0x02, 0x76, 0x02, 0x55, 0x02, 0x95, 0x0a, 0x96, 0x0a, 0x95, 0x0a, 0x54, 0x02, 0x53, 0x02, 0x95, 0x02, 0x54, 0x02, 0x55, 0x02, 0x97, 0x0a, 0x97, 0x02, 0x56, 0x02, 0x35, 0x02, 0x54, 0x0a, 0x31, 0x1a, 0xb8, 0x74, 0x5b, 0xb6, 0xda, 0xa5, 0xf3, 0x3a, 0xb2, 0x09, 0xd4, 0x01, 0xb5, 0x01, 0xf4, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xd3, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xf4, 0x01, 0xd4, 0x01, 0xf4, 0x09, 0xd4, 0x01, 0xd4, 0x01, 0xf5, 0x09, 0xb4, 0x01, 0xb4, 0x01, + 0x1a, 0xf7, 0xfa, 0xee, 0xf9, 0xee, 0xf9, 0xee, 0xd9, 0xee, 0xfa, 0xee, 0x1b, 0xf7, 0x1a, 0xef, 0xfa, 0xee, 0x1b, 0xef, 0xfa, 0xe6, 0x1a, 0xe7, 0xfa, 0xe6, 0x1b, 0xef, 0xda, 0xe6, 0x99, 0xde, 0xfb, 0xe6, 0x9b, 0xd6, 0x7b, 0xd6, 0xfc, 0xee, 0xdb, 0xf6, 0xba, 0xf6, 0xfa, 0xfe, 0xfa, 0xf6, 0x1b, 0xe7, 0x98, 0xce, 0xda, 0xd6, 0x99, 0xce, 0x79, 0xce, 0xbb, 0xde, 0x7b, 0xd6, 0xbd, 0xde, 0x9b, 0xde, 0xbb, 0xde, 0x9a, 0xce, 0x9a, 0xce, 0xba, 0xce, 0xbb, 0xce, 0x59, 0xc6, 0xbb, 0xce, 0xbb, 0xce, 0x9b, 0xc6, 0x9b, 0xc6, 0x9b, 0xc6, 0x7a, 0xc6, 0x3a, 0xbe, 0xb7, 0xad, 0x9b, 0xd6, 0x9c, 0xe6, 0xdd, 0xf6, 0xdc, 0xee, 0xbc, 0xe6, 0xfd, 0xee, 0xbc, 0xde, 0xdc, 0xde, 0xfd, 0xe6, 0xfc, 0xde, 0xdc, 0xe6, 0xbb, 0xde, 0xbb, 0xe6, 0xba, 0xe6, 0x9a, 0xe6, 0xba, 0xe6, 0xbb, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9b, 0xd6, 0x7b, 0xd6, 0x5b, 0xc6, 0x3b, 0xc6, 0x3b, 0xc6, 0x3c, 0xc6, 0x3c, 0xbe, 0x7c, 0xc6, 0x3b, 0xc6, 0x7c, 0xd6, 0xbb, 0xde, 0xdb, 0xe6, 0x1c, 0xef, 0x1b, 0xf7, 0xd9, 0xf6, 0xb9, 0xee, 0x78, 0xde, 0xda, 0xde, 0xba, 0xe6, 0x79, 0xde, 0xba, 0xe6, 0xba, 0xe6, 0xbb, 0xde, 0x9b, 0xd6, 0x7a, 0xce, 0x5a, 0xce, 0x59, 0xc6, 0x59, 0xc6, 0x7a, 0xbe, 0x9b, 0xbe, 0x3b, 0xa6, 0x1b, 0xa6, 0xfa, 0xa5, 0x1b, 0xae, 0xda, 0x9d, 0x78, 0x95, 0x57, 0x9d, 0x7b, 0xc6, 0x7a, 0xd6, 0xba, 0xde, 0xdb, 0xde, 0x5e, 0xe7, 0x5d, 0xbe, 0x36, 0x6c, 0x36, 0x6c, 0xf6, 0x5b, 0x56, 0x43, 0xf5, 0x3a, 0xd5, 0x32, 0xb4, 0x32, 0xb4, 0x32, 0xb4, 0x32, 0x73, 0x2a, 0x73, 0x2a, 0x94, 0x2a, 0xb4, 0x2a, 0x94, 0x2a, 0x73, 0x22, 0x73, 0x22, 0x73, 0x22, 0x94, 0x2a, 0x94, 0x2a, 0x74, 0x1a, 0x74, 0x22, 0x51, 0x22, 0xb4, 0x5b, 0x7c, 0xce, 0xdc, 0xe6, 0xbb, 0xde, 0x7a, 0xce, 0xfe, 0xce, 0x55, 0x6c, 0x12, 0x3b, 0xd2, 0x32, 0x72, 0x22, 0x52, 0x1a, 0x73, 0x1a, 0x73, 0x1a, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0x13, 0x12, 0xf2, 0x09, 0xf3, 0x09, 0xf3, 0x09, 0xf3, 0x09, 0xf3, 0x09, 0xf3, 0x09, 0x13, 0x12, 0x91, 0x01, 0x90, 0x01, 0x33, 0x12, 0x35, 0x4b, 0xdf, 0xde, 0x7c, 0xde, 0xde, 0xde, 0x1f, 0xcf, 0x3b, 0x7d, 0x13, 0x1b, 0x13, 0x13, 0x96, 0x13, 0xd7, 0x0b, 0xd7, 0x0b, 0xb6, 0x0b, 0x96, 0x0b, 0x96, 0x03, 0x77, 0x03, 0x76, 0x0b, 0x76, 0x0b, 0x75, 0x03, 0x75, 0x0b, 0x96, 0x0b, 0x96, 0x0b, 0x76, 0x03, 0x76, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x56, 0x13, 0xf4, 0x12, 0xf4, 0x22, 0x16, 0x5c, 0x7c, 0xbe, 0xbc, 0xde, 0xdd, 0xee, 0xff, 0xde, 0x79, 0x5c, 0x14, 0x1b, 0xd4, 0x0a, 0x15, 0x13, 0x16, 0x13, 0xf6, 0x0a, 0x17, 0x13, 0xd6, 0x0a, 0xb5, 0x0a, 0xd5, 0x12, 0xd5, 0x0a, 0xb4, 0x0a, 0x94, 0x0a, 0xd5, 0x12, 0xd5, 0x0a, 0x95, 0x02, 0x95, 0x02, 0x17, 0x13, 0x95, 0x0a, 0xd5, 0x12, 0xd4, 0x12, 0x92, 0x12, 0x2f, 0x1a, 0x19, 0x8d, 0x9d, 0xce, 0xbc, 0xd6, 0xbc, 0xd6, 0xfe, 0xc6, 0x35, 0x44, 0xf3, 0x0a, 0xd4, 0x0a, 0x16, 0x13, 0xd5, 0x02, 0xd6, 0x02, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd6, 0x02, 0x74, 0x02, 0x73, 0x0a, 0xb1, 0x2a, 0x7a, 0xbe, 0xb9, 0xce, 0xba, 0xc6, 0xb9, 0x8d, 0x74, 0x1b, 0xb7, 0x0b, 0xd8, 0x03, 0xb8, 0x03, 0x57, 0x03, 0x57, 0x03, 0x97, 0x03, 0xb7, 0x03, 0xb7, 0x0b, 0xb8, 0x13, 0x97, 0x0b, 0xb7, 0x0b, 0xb6, 0x0b, 0x76, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x76, 0x0b, 0x76, 0x0b, 0x75, 0x0b, 0x35, 0x03, 0x55, 0x0b, 0xd2, 0x0a, 0xf0, 0x32, 0xbe, 0xc6, 0xbb, 0xce, 0x9b, 0xc6, 0x93, 0x4b, 0x72, 0x12, 0x73, 0x12, 0x95, 0x12, 0xb6, 0x12, 0x75, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x96, 0x02, 0x95, 0x02, 0xb5, 0x02, 0xd5, 0x0a, 0xb4, 0x0a, 0xb4, 0x12, 0x74, 0x0a, 0x55, 0x0a, 0x75, 0x02, 0x75, 0x0a, 0x54, 0x0a, 0x32, 0x12, 0xad, 0x11, 0x59, 0x9d, 0x7c, 0xc6, 0xda, 0xad, 0x16, 0x64, 0x72, 0x2a, 0xf1, 0x11, 0xd2, 0x11, 0xd2, 0x11, 0xb2, 0x11, 0x91, 0x09, 0x91, 0x09, 0x71, 0x01, 0x71, 0x01, 0x71, 0x01, 0x71, 0x01, 0x71, 0x09, 0x51, 0x01, 0x92, 0x09, 0x51, 0x01, 0x51, 0x01, 0x72, 0x09, 0x51, 0x01, 0x72, 0x09, + 0x3c, 0xef, 0x3b, 0xef, 0x3c, 0xf7, 0x3c, 0xf7, 0x1b, 0xf7, 0x3c, 0xf7, 0x3c, 0xf7, 0x3c, 0xf7, 0x1b, 0xef, 0x3b, 0xef, 0x1b, 0xef, 0x3c, 0xf7, 0x1b, 0xef, 0x3c, 0xf7, 0xfb, 0xee, 0xba, 0xe6, 0xfa, 0xf6, 0xfa, 0xee, 0x1b, 0xef, 0xfb, 0xe6, 0x1b, 0xe7, 0xfa, 0xe6, 0x1b, 0xef, 0x3b, 0xef, 0x5b, 0xef, 0x3b, 0xe7, 0x1b, 0xe7, 0xfb, 0xe6, 0xfb, 0xee, 0xdc, 0xee, 0xbc, 0xe6, 0xdd, 0xee, 0x1d, 0xef, 0xdc, 0xee, 0xfb, 0xee, 0xfc, 0xf6, 0xdb, 0xe6, 0x1c, 0xef, 0xfb, 0xee, 0x1b, 0xe7, 0x1c, 0xef, 0xfb, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0xfb, 0xee, 0xfa, 0xee, 0xb9, 0xde, 0xf9, 0xde, 0xd9, 0xde, 0x5a, 0xef, 0x5b, 0xef, 0x3a, 0xe7, 0x19, 0xe7, 0x3a, 0xe7, 0xf9, 0xe6, 0x1a, 0xe7, 0xfa, 0xe6, 0xda, 0xe6, 0xda, 0xe6, 0xdb, 0xe6, 0xdb, 0xee, 0xdb, 0xee, 0xfb, 0xee, 0x1b, 0xef, 0xfa, 0xe6, 0xfa, 0xe6, 0xfa, 0xe6, 0xfa, 0xe6, 0xfa, 0xde, 0xd9, 0xde, 0xda, 0xe6, 0xfb, 0xe6, 0xda, 0xd6, 0x1a, 0xdf, 0xfa, 0xde, 0xfa, 0xde, 0x1a, 0xdf, 0x5b, 0xe7, 0x1a, 0xdf, 0xd9, 0xde, 0x1a, 0xe7, 0x5c, 0xe7, 0xda, 0xd6, 0x3c, 0xdf, 0xfb, 0xde, 0x1b, 0xe7, 0xda, 0xde, 0xba, 0xde, 0xdb, 0xde, 0xdc, 0xe6, 0xdb, 0xe6, 0xdb, 0xee, 0xbb, 0xee, 0x9a, 0xe6, 0x7a, 0xde, 0x7b, 0xd6, 0xbb, 0xd6, 0xdb, 0xde, 0xdb, 0xee, 0xba, 0xee, 0xb9, 0xde, 0xb9, 0xde, 0x79, 0xde, 0xb9, 0xe6, 0xb9, 0xe6, 0xd9, 0xee, 0xfb, 0xe6, 0xfb, 0xe6, 0xbb, 0xe6, 0x9b, 0xe6, 0xdb, 0xe6, 0x9a, 0xde, 0xba, 0xe6, 0xba, 0xde, 0xdb, 0xe6, 0xba, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0xba, 0xde, 0xfb, 0xe6, 0xdb, 0xe6, 0xfb, 0xe6, 0xdb, 0xe6, 0xba, 0xde, 0xba, 0xde, 0xba, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x1b, 0xdf, 0xda, 0xd6, 0x78, 0xc6, 0x3b, 0xe7, 0x59, 0xd6, 0xdc, 0xee, 0xfc, 0xee, 0x1c, 0xf7, 0x1b, 0xe7, 0xd9, 0xd6, 0x3b, 0xdf, 0x1b, 0xdf, 0xdb, 0xd6, 0xdc, 0xde, 0xfb, 0xd6, 0xfc, 0xd6, 0xdc, 0xde, 0xbb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0xbb, 0xd6, 0xbb, 0xd6, 0xdc, 0xde, 0x9b, 0xd6, 0x9b, 0xce, 0xdc, 0xd6, 0xdb, 0xd6, 0x9a, 0xce, 0x59, 0xce, 0x79, 0xd6, 0x78, 0xde, 0x98, 0xe6, 0xfa, 0xee, 0x1a, 0xe7, 0x3c, 0xe7, 0xfb, 0xd6, 0x1b, 0xdf, 0x59, 0xbe, 0x7b, 0xbe, 0x5b, 0xbe, 0x3a, 0xbe, 0x19, 0xbe, 0xfa, 0xbd, 0xfa, 0xbd, 0xf9, 0xbd, 0xd9, 0xbd, 0xfa, 0xc5, 0xfb, 0xcd, 0x1b, 0xce, 0x1b, 0xce, 0x1a, 0xc6, 0x1a, 0xc6, 0x1b, 0xc6, 0x1b, 0xbe, 0xfa, 0xb5, 0x1a, 0xbe, 0x1a, 0xbe, 0x5a, 0xc6, 0xd9, 0xd6, 0xb8, 0xde, 0xda, 0xe6, 0xfd, 0xe6, 0xde, 0xc6, 0x79, 0x8d, 0x76, 0x6c, 0x35, 0x64, 0x36, 0x64, 0xb4, 0x53, 0xd4, 0x53, 0x15, 0x5c, 0x36, 0x64, 0x97, 0x74, 0x97, 0x74, 0x56, 0x6c, 0x15, 0x64, 0xb7, 0x74, 0x97, 0x74, 0x16, 0x64, 0x36, 0x64, 0x57, 0x64, 0xd4, 0x4b, 0xf4, 0x53, 0xf3, 0x5b, 0xb2, 0x5b, 0xd3, 0x73, 0xda, 0xbd, 0xbc, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x9b, 0xce, 0x7c, 0xb6, 0x39, 0x85, 0x14, 0x64, 0x73, 0x4b, 0xd5, 0x4b, 0xb5, 0x43, 0x74, 0x3b, 0x33, 0x33, 0xf2, 0x2a, 0x91, 0x22, 0x70, 0x1a, 0x50, 0x12, 0x51, 0x12, 0x51, 0x12, 0x51, 0x12, 0x51, 0x12, 0x51, 0x0a, 0x51, 0x0a, 0x30, 0x0a, 0x31, 0x02, 0x52, 0x02, 0x32, 0x0a, 0x50, 0x1a, 0xb3, 0x5b, 0x9a, 0xce, 0xdb, 0xd6, 0xbc, 0xce, 0xba, 0x9d, 0x34, 0x33, 0x15, 0x13, 0x14, 0x03, 0xf4, 0x02, 0xf4, 0x0a, 0xd4, 0x12, 0xd2, 0x12, 0xd2, 0x12, 0xd3, 0x12, 0xf4, 0x12, 0xf3, 0x0a, 0x14, 0x13, 0x33, 0x13, 0x13, 0x0b, 0x35, 0x13, 0x35, 0x13, 0x55, 0x13, 0x75, 0x13, 0x75, 0x13, 0x55, 0x0b, 0x34, 0x0b, 0xd2, 0x12, 0x52, 0x43, 0x5c, 0xb6, 0xdc, 0xce, 0x5b, 0xbe, 0x36, 0x5c, 0x92, 0x1a, 0x52, 0x12, 0x52, 0x0a, 0x72, 0x0a, 0x72, 0x0a, 0x52, 0x02, 0x93, 0x0a, 0x73, 0x0a, 0x53, 0x0a, 0x54, 0x02, 0x95, 0x02, 0x95, 0x02, 0x74, 0x02, 0x73, 0x02, 0xd5, 0x0a, 0xd6, 0x02, 0xb6, 0x02, 0xf6, 0x0a, 0x94, 0x0a, 0x31, 0x0a, 0x4f, 0x2a, 0xf3, 0x7b, 0x3a, 0xd6, 0x59, 0xde, 0xf8, 0xd5, 0x39, 0xd6, 0x3a, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x9b, 0xd6, 0x7b, 0xd6, 0x5b, 0xce, 0x3b, 0xce, 0x3a, 0xce, 0x3a, 0xce, 0x3b, 0xce, 0x3b, 0xce, 0xd9, 0xbd, 0xb9, 0xbd, 0xda, 0xbd, 0x99, 0xb5, 0x78, 0xb5, 0x78, 0xb5, 0x37, 0xad, 0x78, 0xb5, + 0x5c, 0xe7, 0x3c, 0xe7, 0x1c, 0xef, 0xfc, 0xf6, 0xdb, 0xee, 0xfb, 0xee, 0x1c, 0xef, 0x1b, 0xe7, 0x5c, 0xef, 0x5c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0xba, 0xe6, 0xdb, 0xee, 0xdb, 0xee, 0xdc, 0xee, 0x9b, 0xee, 0xdc, 0xee, 0xfc, 0xee, 0xdb, 0xde, 0x3c, 0xe7, 0x5b, 0xe7, 0x3b, 0xe7, 0x3b, 0xef, 0x1c, 0xe7, 0x1c, 0xef, 0xdb, 0xe6, 0xdb, 0xee, 0xda, 0xe6, 0xd9, 0xe6, 0x5b, 0xe7, 0x5b, 0xe7, 0x5b, 0xe7, 0x3c, 0xef, 0x3b, 0xef, 0x1b, 0xef, 0xfb, 0xe6, 0x3c, 0xef, 0x1b, 0xe7, 0x3c, 0xef, 0xfb, 0xe6, 0x1d, 0xef, 0x1d, 0xf7, 0xbc, 0xee, 0xdc, 0xee, 0xdc, 0xee, 0xfb, 0xe6, 0xfb, 0xde, 0xfc, 0xe6, 0x1d, 0xe7, 0xdc, 0xde, 0x3e, 0xef, 0x3d, 0xe7, 0x3d, 0xef, 0x1c, 0xe7, 0x3d, 0xef, 0x1d, 0xe7, 0x1d, 0xe7, 0x1c, 0xdf, 0x1c, 0xe7, 0x1c, 0xdf, 0x1c, 0xdf, 0x3b, 0xdf, 0x3b, 0xdf, 0x1c, 0xdf, 0xfd, 0xe6, 0x1d, 0xe7, 0x1d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0xba, 0xe6, 0xdb, 0xe6, 0x1c, 0xef, 0x1c, 0xef, 0xda, 0xee, 0x7a, 0xe6, 0xfd, 0xe6, 0x1e, 0xef, 0xdc, 0xe6, 0x1d, 0xf7, 0xdc, 0xee, 0xdc, 0xee, 0x1d, 0xef, 0xfc, 0xe6, 0x1c, 0xef, 0xfb, 0xe6, 0x3c, 0xe7, 0x1b, 0xe7, 0x1c, 0xdf, 0xfc, 0xde, 0xfb, 0xde, 0x1b, 0xe7, 0x1b, 0xef, 0xfb, 0xe6, 0x1b, 0xdf, 0x1c, 0xdf, 0x1c, 0xe7, 0xdb, 0xde, 0xdb, 0xe6, 0xdb, 0xe6, 0x1c, 0xdf, 0x1c, 0xd7, 0xdb, 0xd6, 0xdb, 0xde, 0xdb, 0xe6, 0xda, 0xde, 0x3c, 0xe7, 0xfb, 0xde, 0xba, 0xde, 0x5d, 0xf7, 0xfb, 0xde, 0xfb, 0xe6, 0xdb, 0xe6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xdb, 0xe6, 0xdb, 0xe6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xe6, 0xfc, 0xe6, 0xdb, 0xde, 0xbb, 0xde, 0xdb, 0xde, 0xdb, 0xe6, 0xbb, 0xe6, 0xbc, 0xe6, 0xbc, 0xee, 0xba, 0xe6, 0x99, 0xde, 0xdb, 0xde, 0xbc, 0xde, 0x9c, 0xde, 0x1d, 0xef, 0xfb, 0xe6, 0x1b, 0xe7, 0xfb, 0xe6, 0xbb, 0xde, 0x9c, 0xe6, 0xbb, 0xee, 0x99, 0xde, 0xda, 0xee, 0xba, 0xe6, 0x9a, 0xe6, 0x9a, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0xbb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0x7a, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0xba, 0xde, 0x79, 0xd6, 0xba, 0xde, 0xbb, 0xde, 0xda, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xda, 0xe6, 0xfa, 0xee, 0x99, 0xde, 0xbc, 0xe6, 0xbb, 0xde, 0x9a, 0xe6, 0x7a, 0xde, 0x9a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xda, 0xd6, 0xba, 0xd6, 0xdb, 0xde, 0xda, 0xde, 0xb9, 0xde, 0xb9, 0xde, 0xb8, 0xe6, 0x99, 0xe6, 0x99, 0xe6, 0x99, 0xde, 0xba, 0xe6, 0x5a, 0xde, 0x7a, 0xde, 0xb9, 0xd6, 0xda, 0xde, 0xdc, 0xe6, 0xbc, 0xe6, 0xda, 0xe6, 0xda, 0xe6, 0xba, 0xde, 0x79, 0xd6, 0xdc, 0xe6, 0x9b, 0xde, 0x7b, 0xde, 0xdb, 0xe6, 0x7a, 0xde, 0x79, 0xde, 0x79, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x59, 0xd6, 0x99, 0xce, 0xdb, 0xd6, 0x79, 0xce, 0x59, 0xd6, 0x39, 0xde, 0x5a, 0xde, 0x9a, 0xde, 0x99, 0xde, 0xb9, 0xee, 0x99, 0xe6, 0xbb, 0xe6, 0xbb, 0xe6, 0x79, 0xde, 0x79, 0xe6, 0x99, 0xe6, 0x78, 0xde, 0x58, 0xde, 0x59, 0xde, 0x79, 0xde, 0x59, 0xde, 0x7a, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x7b, 0xd6, 0x7b, 0xd6, 0x7b, 0xd6, 0x5a, 0xd6, 0x5a, 0xce, 0x3a, 0xce, 0x19, 0xce, 0xf9, 0xcd, 0xd8, 0xcd, 0xf8, 0xcd, 0x78, 0xce, 0xda, 0xde, 0x9b, 0xd6, 0x5b, 0xd6, 0x5b, 0xd6, 0x39, 0xce, 0x37, 0xc6, 0x38, 0xbe, 0x1a, 0xb6, 0xda, 0xad, 0xfa, 0xad, 0x3b, 0xb6, 0xba, 0xb5, 0xda, 0xbd, 0x99, 0xad, 0x99, 0xa5, 0x77, 0xa5, 0x37, 0x95, 0x38, 0x9d, 0xf8, 0x94, 0xf7, 0x84, 0xd7, 0x7c, 0xb6, 0x7c, 0x76, 0x74, 0x76, 0x6c, 0x96, 0x7c, 0xd5, 0xac, 0x7a, 0xee, 0x37, 0xe6, 0x7a, 0xde, 0x9d, 0xce, 0x9a, 0xa5, 0xfc, 0xb5, 0xba, 0xad, 0x99, 0xa5, 0xb9, 0xa5, 0x99, 0x9d, 0x79, 0x9d, 0x17, 0x95, 0xb7, 0x8c, 0xd8, 0x8c, 0xf9, 0x8c, 0x36, 0x74, 0x32, 0x4b, 0x12, 0x3b, 0xf2, 0x2a, 0xb2, 0x22, 0xd2, 0x22, 0xf1, 0x1a, 0x8f, 0x1a, 0xb3, 0x53, 0xfb, 0xb5, 0xd9, 0xc5, 0xf9, 0xdd, 0x19, 0xde, 0x5a, 0xde, 0x9b, 0xde, 0x7a, 0xd6, 0xb8, 0xd6, 0x97, 0xd6, 0x99, 0xd6, 0x79, 0xd6, 0x59, 0xd6, 0x38, 0xce, 0x58, 0xce, 0x59, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x18, 0xce, 0x18, 0xce, 0x9a, 0xde, 0x59, 0xd6, 0x39, 0xce, 0x79, 0xd6, 0x18, 0xce, 0x59, 0xd6, + 0xbb, 0x95, 0xdc, 0x9d, 0xfc, 0x9d, 0xdc, 0x9d, 0xdc, 0x9d, 0x1d, 0xae, 0x5d, 0xb6, 0x5d, 0xbe, 0x3c, 0xc6, 0x5b, 0xce, 0x1e, 0xe7, 0x1d, 0xef, 0xfc, 0xe6, 0x3d, 0xf7, 0x1c, 0xef, 0x3c, 0xef, 0x1d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfa, 0xe6, 0xfa, 0xee, 0x3c, 0xff, 0xdb, 0xe6, 0xbf, 0xef, 0x7e, 0xe7, 0x9d, 0xef, 0x7d, 0xf7, 0xfc, 0xee, 0xfd, 0xe6, 0x5e, 0xe7, 0x7e, 0xe7, 0x3e, 0xdf, 0x1e, 0xe7, 0x3e, 0xe7, 0x1e, 0xe7, 0xfe, 0xde, 0xfe, 0xe6, 0xfe, 0xe6, 0xde, 0xe6, 0xdd, 0xe6, 0x9c, 0xde, 0xbd, 0xde, 0x1f, 0xe7, 0x1e, 0xe7, 0xfd, 0xe6, 0xfb, 0xf6, 0xba, 0xee, 0xda, 0xe6, 0x7e, 0xf7, 0xfd, 0xee, 0xfd, 0xe6, 0x7f, 0xef, 0x3e, 0xe7, 0x5e, 0xe7, 0x3d, 0xe7, 0x1e, 0xe7, 0x1e, 0xe7, 0xfc, 0xee, 0xdb, 0xe6, 0xfc, 0xde, 0x1d, 0xdf, 0x1d, 0xe7, 0x1d, 0xe7, 0x1c, 0xdf, 0x3c, 0xe7, 0x3c, 0xdf, 0x1c, 0xdf, 0xdb, 0xe6, 0xbb, 0xe6, 0x1b, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xdc, 0xde, 0xfc, 0xde, 0xd9, 0xe6, 0x3a, 0xef, 0x1c, 0xef, 0xfc, 0xe6, 0xfb, 0xe6, 0x3d, 0xef, 0x5e, 0xe7, 0x3e, 0xdf, 0x3d, 0xe7, 0xfc, 0xe6, 0x5d, 0xf7, 0xfc, 0xe6, 0xdb, 0xde, 0xfc, 0xde, 0xfb, 0xe6, 0x1c, 0xef, 0x1b, 0xef, 0xfa, 0xe6, 0xd9, 0xe6, 0xb9, 0xe6, 0xfa, 0xee, 0xfb, 0xe6, 0x1b, 0xe7, 0x3c, 0xe7, 0xba, 0xde, 0xdb, 0xee, 0xfc, 0xee, 0xdb, 0xe6, 0xfb, 0xde, 0x3b, 0xe7, 0xd9, 0xde, 0x1b, 0xe7, 0xfb, 0xde, 0x5d, 0xef, 0x1b, 0xe7, 0x5c, 0xef, 0x1b, 0xef, 0xda, 0xe6, 0xda, 0xe6, 0xfb, 0xee, 0x1b, 0xef, 0xfb, 0xee, 0xfb, 0xee, 0xfc, 0xee, 0xfc, 0xee, 0x1c, 0xef, 0xfb, 0xee, 0xdb, 0xe6, 0xdb, 0xe6, 0xfb, 0xee, 0x1c, 0xef, 0xfc, 0xee, 0xfc, 0xee, 0xfc, 0xee, 0xdc, 0xde, 0xbb, 0xd6, 0xfb, 0xde, 0xda, 0xde, 0xfb, 0xde, 0xfb, 0xe6, 0x1c, 0xef, 0xdb, 0xee, 0xdb, 0xee, 0xfc, 0xe6, 0xdc, 0xde, 0xfc, 0xde, 0xfb, 0xee, 0xba, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xfb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xbb, 0xe6, 0xdb, 0xee, 0x9a, 0xde, 0xdc, 0xee, 0xdc, 0xe6, 0x9b, 0xde, 0xbc, 0xde, 0x9b, 0xde, 0x9b, 0xd6, 0x9a, 0xde, 0xba, 0xde, 0xda, 0xe6, 0x9a, 0xde, 0x1b, 0xef, 0x1a, 0xef, 0x1b, 0xef, 0xdc, 0xde, 0xdc, 0xe6, 0xdc, 0xee, 0xdb, 0xee, 0xbb, 0xee, 0x9a, 0xe6, 0xb9, 0xde, 0xba, 0xde, 0xdb, 0xe6, 0xdc, 0xe6, 0xdc, 0xd6, 0xfc, 0xde, 0xfc, 0xe6, 0xdb, 0xe6, 0xba, 0xe6, 0x9a, 0xde, 0xbc, 0xde, 0xdc, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0xdb, 0xe6, 0x3d, 0xdf, 0x1c, 0xdf, 0xfb, 0xde, 0xfb, 0xe6, 0xbb, 0xce, 0xfc, 0xd6, 0xfc, 0xde, 0xba, 0xd6, 0x99, 0xde, 0xfa, 0xee, 0xba, 0xde, 0xba, 0xde, 0xba, 0xd6, 0xda, 0xde, 0xba, 0xde, 0xba, 0xde, 0xba, 0xde, 0x9a, 0xde, 0xbb, 0xe6, 0x7a, 0xe6, 0x7a, 0xee, 0x9a, 0xee, 0x9b, 0xde, 0x9a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0xba, 0xde, 0x99, 0xde, 0xba, 0xde, 0x9a, 0xd6, 0xdb, 0xee, 0xfc, 0xee, 0x9b, 0xde, 0x7a, 0xd6, 0xbb, 0xde, 0xba, 0xde, 0x79, 0xd6, 0x9a, 0xde, 0x79, 0xde, 0x79, 0xde, 0xdb, 0xe6, 0x9a, 0xde, 0x9a, 0xde, 0x99, 0xde, 0x9a, 0xde, 0xba, 0xde, 0xba, 0xde, 0x9a, 0xde, 0x7a, 0xde, 0x59, 0xd6, 0x7a, 0xce, 0x9b, 0xd6, 0x59, 0xde, 0x18, 0xd6, 0x79, 0xd6, 0xda, 0xde, 0x99, 0xd6, 0xba, 0xde, 0xba, 0xd6, 0xbb, 0xd6, 0xba, 0xde, 0x9a, 0xe6, 0x79, 0xde, 0x59, 0xde, 0x5b, 0xde, 0x9c, 0xe6, 0x9b, 0xde, 0x9b, 0xde, 0x7b, 0xde, 0x7a, 0xde, 0x79, 0xd6, 0x79, 0xd6, 0x79, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x59, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x38, 0xd6, 0x59, 0xde, 0x39, 0xce, 0x9b, 0xd6, 0x7a, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0x58, 0xd6, 0x78, 0xd6, 0x99, 0xd6, 0x79, 0xd6, 0x7a, 0xd6, 0x39, 0xce, 0x7a, 0xde, 0x79, 0xde, 0x38, 0xde, 0x58, 0xde, 0x78, 0xde, 0x59, 0xd6, 0x79, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x9a, 0xe6, 0x58, 0xd6, 0x59, 0xde, 0x18, 0xd6, 0xf9, 0xd5, 0xd9, 0xcd, 0x3a, 0xde, 0x59, 0xe6, 0x79, 0xde, 0x9a, 0xd6, 0x9a, 0xd6, 0xda, 0xe6, 0x79, 0xde, 0x38, 0xd6, 0x79, 0xde, 0x59, 0xd6, 0x79, 0xde, 0x79, 0xd6, 0x79, 0xde, 0xba, 0xe6, 0x79, 0xd6, 0x38, 0xd6, 0x38, 0xce, 0x9a, 0xde, 0xba, 0xde, 0x99, 0xd6, 0x79, 0xd6, 0x38, 0xce, 0x99, 0xde, + 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0x19, 0x04, 0x1a, 0x04, 0x19, 0x04, 0xf8, 0x03, 0xf7, 0x0b, 0x75, 0x03, 0x95, 0x13, 0xda, 0x4c, 0x5b, 0x65, 0x98, 0x54, 0x77, 0x54, 0x98, 0x54, 0x95, 0x2b, 0x73, 0x33, 0xd3, 0x4b, 0xdd, 0xbe, 0x1c, 0xdf, 0xfc, 0xe6, 0xfd, 0xe6, 0x7f, 0xe7, 0xf6, 0x4b, 0x56, 0x2b, 0x15, 0x23, 0x36, 0x2b, 0x57, 0x33, 0x57, 0x3b, 0x56, 0x33, 0xf4, 0x1a, 0x56, 0x1b, 0x57, 0x13, 0x77, 0x1b, 0x77, 0x1b, 0x77, 0x1b, 0x57, 0x1b, 0x57, 0x1b, 0x16, 0x1b, 0x15, 0x1b, 0x77, 0x23, 0xb8, 0x2b, 0x19, 0x34, 0xf8, 0x33, 0xb7, 0x33, 0xf5, 0x4b, 0x9d, 0xb6, 0x3d, 0xdf, 0xfa, 0xde, 0x5d, 0xe7, 0x7f, 0xe7, 0x9e, 0xb6, 0x14, 0x54, 0xd4, 0x43, 0xf5, 0x4b, 0x38, 0x54, 0x79, 0x5c, 0xda, 0x74, 0x1b, 0x7d, 0x5c, 0x7d, 0x5c, 0x75, 0xfb, 0x74, 0xb9, 0x74, 0x1a, 0x7d, 0x7b, 0x85, 0xbc, 0x85, 0xdd, 0x8d, 0xbc, 0x8d, 0x7b, 0x8d, 0x9b, 0x85, 0x9b, 0x85, 0x39, 0x75, 0x7a, 0x85, 0xbc, 0x8d, 0x1c, 0xa6, 0x3d, 0xdf, 0xfb, 0xde, 0x1b, 0xdf, 0x5e, 0xe7, 0x5f, 0xd7, 0x18, 0x85, 0x57, 0x5c, 0x57, 0x5c, 0x97, 0x6c, 0x19, 0x7d, 0x7b, 0x8d, 0x9b, 0x8d, 0x5b, 0x85, 0x9b, 0x85, 0xdc, 0x95, 0x1d, 0x9e, 0x3e, 0xa6, 0x7e, 0xae, 0x7e, 0xb6, 0x7e, 0xb6, 0xff, 0xd6, 0x7f, 0xc6, 0x7f, 0xbe, 0xbf, 0xc6, 0x9e, 0xc6, 0x7e, 0xce, 0x3c, 0xc6, 0xff, 0xde, 0xdd, 0xe6, 0x7b, 0xde, 0xfd, 0xee, 0xfe, 0xe6, 0xff, 0xd6, 0x59, 0x8d, 0x59, 0x85, 0x59, 0x7d, 0x3a, 0x75, 0x1a, 0x6d, 0x1a, 0x6d, 0x1a, 0x6d, 0x1b, 0x6d, 0xfa, 0x6c, 0xfa, 0x6c, 0xfa, 0x6c, 0xda, 0x64, 0x1b, 0x6d, 0x1b, 0x6d, 0xba, 0x64, 0xba, 0x64, 0x1b, 0x6d, 0x1b, 0x6d, 0xfa, 0x64, 0x1a, 0x6d, 0x1a, 0x6d, 0x19, 0x75, 0x18, 0x7d, 0x9c, 0xc6, 0xfd, 0xde, 0xfb, 0xe6, 0xfc, 0xe6, 0x3d, 0xe7, 0xfc, 0xde, 0xfc, 0xd6, 0xfd, 0xd6, 0x1e, 0xd7, 0xdd, 0xd6, 0x9b, 0xd6, 0x1d, 0xdf, 0xfd, 0xd6, 0x1e, 0xd7, 0x1e, 0xd7, 0xbc, 0xc6, 0xdd, 0xce, 0xbd, 0xc6, 0xfe, 0xce, 0xbd, 0xc6, 0x1f, 0xd7, 0x3f, 0xdf, 0xde, 0xce, 0xbd, 0xce, 0x1e, 0xdf, 0xfd, 0xde, 0x9b, 0xce, 0xbc, 0xde, 0x9b, 0xd6, 0xfc, 0xe6, 0xdc, 0xde, 0xdc, 0xd6, 0x5d, 0xe7, 0x3e, 0xdf, 0xbf, 0xe7, 0xbe, 0xce, 0xdd, 0xde, 0xdd, 0xde, 0xfd, 0xe6, 0x3d, 0xef, 0x5d, 0xef, 0x1c, 0xef, 0xfc, 0xee, 0x1d, 0xef, 0xfc, 0xe6, 0xfd, 0xe6, 0xfd, 0xee, 0xfd, 0xf6, 0xfb, 0xee, 0xdb, 0xe6, 0xdd, 0xde, 0xbd, 0xde, 0xdc, 0xe6, 0xdc, 0xe6, 0xbb, 0xde, 0xbb, 0xde, 0x7a, 0xe6, 0x9a, 0xee, 0xdb, 0xe6, 0xfc, 0xee, 0xfb, 0xee, 0x1c, 0xef, 0x3d, 0xe7, 0xfd, 0xde, 0xdc, 0xde, 0xfc, 0xde, 0xdc, 0xe6, 0xbb, 0xe6, 0xdb, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xe6, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xce, 0xfd, 0xd6, 0xfc, 0xe6, 0xdc, 0xe6, 0xdc, 0xde, 0xfd, 0xde, 0x9b, 0xd6, 0x5a, 0xce, 0x9b, 0xd6, 0x9a, 0xd6, 0xdb, 0xd6, 0xfc, 0xd6, 0xfc, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0xfb, 0xde, 0x9b, 0xd6, 0xdc, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0x7a, 0xd6, 0x5a, 0xd6, 0xdb, 0xe6, 0xfc, 0xe6, 0xbb, 0xde, 0x9a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9b, 0xde, 0xba, 0xde, 0x9a, 0xd6, 0x99, 0xd6, 0x9a, 0xde, 0x38, 0xd6, 0xba, 0xde, 0x99, 0xd6, 0xba, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xe6, 0xba, 0xe6, 0xb9, 0xe6, 0xd9, 0xe6, 0xd9, 0xde, 0x9a, 0xd6, 0xdc, 0xde, 0x9b, 0xd6, 0xbb, 0xde, 0xbb, 0xe6, 0x9a, 0xe6, 0xda, 0xde, 0xba, 0xde, 0x79, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0xbb, 0xd6, 0x9a, 0xd6, 0x7a, 0xde, 0x7a, 0xde, 0x59, 0xd6, 0x7a, 0xd6, 0x9b, 0xce, 0xbb, 0xce, 0x79, 0xce, 0x99, 0xd6, 0xb9, 0xd6, 0xda, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xda, 0xde, 0xda, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x9b, 0xde, 0x7a, 0xd6, 0x7a, 0xde, 0x5a, 0xde, 0x59, 0xd6, 0x17, 0xce, 0x37, 0xce, 0x58, 0xd6, 0x78, 0xd6, 0x38, 0xd6, 0x58, 0xd6, 0x57, 0xde, 0xd9, 0xe6, 0xba, 0xde, 0xbc, 0xde, 0x1e, 0xef, 0x7c, 0xde, 0x7b, 0xd6, 0x3a, 0xce, 0x7a, 0xce, 0xbb, 0xde, 0xbc, 0xde, 0x9b, 0xd6, 0x7b, 0xd6, 0x9b, 0xde, 0x7b, 0xde, 0x5b, 0xd6, 0x5a, 0xd6, 0x7b, 0xde, 0x9b, 0xe6, 0x7b, 0xde, 0x7b, 0xde, 0x7a, 0xde, + 0x9a, 0x1c, 0x18, 0x0c, 0xd8, 0x03, 0x19, 0x0c, 0x1a, 0x0c, 0xf9, 0x0b, 0xd9, 0x0b, 0xfa, 0x13, 0xd9, 0x0b, 0x1b, 0x1c, 0x1a, 0x1c, 0x98, 0x0b, 0x78, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0xd9, 0x0b, 0x76, 0x0b, 0x13, 0x1b, 0xbe, 0xb6, 0x1c, 0xdf, 0xfb, 0xee, 0xdc, 0xe6, 0x5f, 0xdf, 0xf4, 0x22, 0xf7, 0x02, 0x19, 0x03, 0x3a, 0x03, 0xfa, 0x02, 0xda, 0x02, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x1a, 0x03, 0xf9, 0x02, 0xb8, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xb7, 0x02, 0xd7, 0x0a, 0xb6, 0x0a, 0x95, 0x12, 0x11, 0x12, 0xdd, 0xa5, 0x1c, 0xdf, 0x3b, 0xef, 0x7e, 0xe7, 0x5f, 0xd7, 0xf9, 0x64, 0x35, 0x1b, 0x56, 0x0b, 0x58, 0x03, 0x7a, 0x03, 0x5a, 0x03, 0x19, 0x03, 0xf8, 0x02, 0x18, 0x03, 0x18, 0x03, 0x18, 0x0b, 0x17, 0x13, 0xd7, 0x12, 0xf7, 0x12, 0xf7, 0x0a, 0xf7, 0x0a, 0xf6, 0x0a, 0xf7, 0x0a, 0x58, 0x0b, 0x78, 0x0b, 0x17, 0x0b, 0xf6, 0x0a, 0x16, 0x13, 0x75, 0x33, 0xfe, 0xc6, 0x1c, 0xdf, 0x3b, 0xe7, 0x5e, 0xd7, 0x3f, 0xaf, 0xb5, 0x23, 0x96, 0x0b, 0xf8, 0x0b, 0xf8, 0x13, 0xf8, 0x13, 0x97, 0x0b, 0x97, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x97, 0x0b, 0x76, 0x0b, 0xd7, 0x13, 0x96, 0x03, 0x96, 0x03, 0x96, 0x03, 0xb5, 0x0b, 0x94, 0x13, 0x72, 0x1b, 0x38, 0x6d, 0x9c, 0xbe, 0xbc, 0xd6, 0xfd, 0xde, 0x5f, 0xdf, 0xdd, 0x8d, 0x75, 0x23, 0x55, 0x13, 0xb7, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb7, 0x03, 0x97, 0x0b, 0x76, 0x0b, 0x34, 0x23, 0xbb, 0x9d, 0xbd, 0xd6, 0x9c, 0xd6, 0x1e, 0xdf, 0xff, 0xbe, 0x56, 0x4c, 0x74, 0x1b, 0x34, 0x0b, 0x96, 0x13, 0x97, 0x13, 0x56, 0x13, 0x15, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x98, 0x0b, 0x37, 0x03, 0xb9, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x56, 0x1b, 0xb3, 0x0a, 0x34, 0x1b, 0xd8, 0x64, 0xfd, 0xce, 0x7a, 0xd6, 0xbb, 0xce, 0x7f, 0xdf, 0x7c, 0x9e, 0xb3, 0x2b, 0x95, 0x1b, 0x55, 0x0b, 0x96, 0x13, 0x76, 0x13, 0x76, 0x0b, 0x96, 0x13, 0xb6, 0x0b, 0xb7, 0x0b, 0xb8, 0x13, 0xd8, 0x23, 0xd7, 0x2b, 0xd6, 0x3b, 0x16, 0x44, 0x37, 0x4c, 0x97, 0x54, 0x98, 0x54, 0xb8, 0x54, 0x98, 0x54, 0xd7, 0x64, 0xf7, 0x74, 0x16, 0x7d, 0x1a, 0xae, 0xfc, 0xde, 0xfb, 0xe6, 0xfb, 0xde, 0x1c, 0xe7, 0x3e, 0xdf, 0x79, 0x9d, 0x39, 0x8d, 0xd9, 0x7c, 0xd9, 0x7c, 0xfa, 0x84, 0x3a, 0x8d, 0x3a, 0x95, 0xbc, 0x9d, 0xbc, 0x95, 0xbc, 0x95, 0xbc, 0x95, 0xdc, 0x9d, 0xdc, 0x9d, 0xdc, 0x9d, 0xbb, 0x9d, 0x5c, 0xae, 0x1a, 0xae, 0xd9, 0xad, 0x1a, 0xbe, 0x3a, 0xbe, 0x3b, 0xbe, 0xf9, 0xc5, 0x9b, 0xe6, 0x38, 0xde, 0x78, 0xee, 0xd9, 0xee, 0xba, 0xe6, 0xdb, 0xde, 0xfd, 0xde, 0x1d, 0xdf, 0xb8, 0xb5, 0x19, 0xbe, 0x7c, 0xce, 0x9c, 0xd6, 0x9c, 0xd6, 0x9c, 0xd6, 0x5b, 0xd6, 0x9b, 0xde, 0xdc, 0xe6, 0xbb, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0x9b, 0xd6, 0xbb, 0xde, 0xdc, 0xde, 0xdc, 0xe6, 0xbb, 0xde, 0xfd, 0xde, 0xdd, 0xde, 0x5b, 0xde, 0xf9, 0xd5, 0x7a, 0xe6, 0x7a, 0xe6, 0xfd, 0xf6, 0x9c, 0xe6, 0x1f, 0xe7, 0x1f, 0xe7, 0xfe, 0xe6, 0xdd, 0xde, 0xfc, 0xde, 0xdb, 0xd6, 0x9b, 0xce, 0x7b, 0xce, 0xdc, 0xe6, 0xbb, 0xe6, 0xbb, 0xee, 0xbb, 0xe6, 0x79, 0xde, 0x9a, 0xde, 0xdb, 0xe6, 0x9b, 0xde, 0xbb, 0xde, 0x9b, 0xd6, 0xbb, 0xd6, 0xbc, 0xd6, 0x9b, 0xd6, 0x9b, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0xbb, 0xe6, 0x9a, 0xe6, 0xba, 0xe6, 0x7a, 0xe6, 0xbb, 0xee, 0xbc, 0xee, 0x5b, 0xe6, 0xdc, 0xee, 0xbb, 0xe6, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0x9b, 0xde, 0x7b, 0xe6, 0x5b, 0xd6, 0xbb, 0xce, 0xbb, 0xce, 0xdb, 0xd6, 0xbb, 0xd6, 0x7a, 0xce, 0x39, 0xce, 0x79, 0xce, 0x79, 0xce, 0x39, 0xc6, 0xbb, 0xde, 0x99, 0xd6, 0xba, 0xce, 0x7d, 0xa6, 0x36, 0x54, 0x75, 0x3b, 0xb7, 0x43, 0x76, 0x33, 0xd3, 0x1a, 0xb3, 0x1a, 0xb3, 0x1a, 0xb3, 0x1a, 0x93, 0x1a, 0x72, 0x1a, 0xb3, 0x22, 0x76, 0x43, 0x36, 0x3b, 0xb3, 0x2a, 0xd4, 0x32, 0x55, 0x43, 0xb7, 0x53, 0x7a, 0x6c, 0x9a, 0x6c, + 0x39, 0x2c, 0xdc, 0x3c, 0x1c, 0x3d, 0x59, 0x24, 0xd7, 0x0b, 0xf8, 0x0b, 0x39, 0x14, 0x39, 0x14, 0xd7, 0x0b, 0x39, 0x1c, 0xf8, 0x1b, 0xdb, 0x3c, 0x3d, 0x4d, 0x7a, 0x3c, 0x9b, 0x44, 0x7b, 0x3c, 0x97, 0x0b, 0x76, 0x13, 0x12, 0x1b, 0x1c, 0x9e, 0xfc, 0xd6, 0x1c, 0xef, 0x3c, 0xf7, 0x1f, 0xdf, 0xd2, 0x22, 0xf6, 0x0a, 0x37, 0x0b, 0x58, 0x0b, 0x18, 0x03, 0x19, 0x03, 0x59, 0x03, 0x59, 0x03, 0xfa, 0x02, 0xda, 0x0a, 0xfa, 0x0a, 0x1a, 0x0b, 0x1a, 0x0b, 0x1b, 0x0b, 0x1a, 0x0b, 0xd9, 0x02, 0xb8, 0x02, 0xb8, 0x0a, 0x19, 0x13, 0x19, 0x13, 0x97, 0x0a, 0x96, 0x1a, 0x12, 0x1a, 0x9d, 0x9d, 0xdd, 0xde, 0x1c, 0xef, 0x3e, 0xef, 0x9f, 0xdf, 0x9a, 0x54, 0x78, 0x1b, 0x99, 0x13, 0xbb, 0x0b, 0x7b, 0x03, 0x7b, 0x03, 0x7a, 0x03, 0x7a, 0x03, 0x7a, 0x03, 0x59, 0x03, 0x38, 0x03, 0xf7, 0x02, 0xf9, 0x0a, 0x19, 0x0b, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x5a, 0x03, 0x5a, 0x03, 0x7a, 0x0b, 0x5a, 0x13, 0x18, 0x13, 0xb3, 0x1a, 0x9e, 0xbe, 0xfc, 0xde, 0x1a, 0xe7, 0x1c, 0xdf, 0xdf, 0xae, 0x75, 0x1b, 0xb8, 0x13, 0xd9, 0x0b, 0xb8, 0x03, 0xd9, 0x0b, 0xb8, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0xb8, 0x13, 0xb7, 0x13, 0x13, 0x13, 0x15, 0x4c, 0xfa, 0xbd, 0xdc, 0xee, 0xfc, 0xee, 0x9f, 0xe7, 0x5b, 0x6d, 0x96, 0x13, 0xb8, 0x0b, 0xf9, 0x13, 0x3a, 0x14, 0x39, 0x14, 0x19, 0x0c, 0x19, 0x0c, 0x19, 0x0c, 0x19, 0x0c, 0xf9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xf9, 0x03, 0x5a, 0x0c, 0x3a, 0x0c, 0xd9, 0x0b, 0x14, 0x13, 0x59, 0x8d, 0x9c, 0xd6, 0x7a, 0xd6, 0x1e, 0xdf, 0xdc, 0x8d, 0x34, 0x1b, 0xd7, 0x13, 0xb8, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0xfa, 0x0b, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xfa, 0x13, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xfa, 0x0b, 0xfa, 0x13, 0xb8, 0x03, 0x77, 0x03, 0xb8, 0x13, 0x97, 0x13, 0x56, 0x0b, 0x53, 0x2b, 0x7c, 0xc6, 0xbb, 0xe6, 0xbc, 0xe6, 0xfe, 0xd6, 0xd8, 0x5c, 0x75, 0x13, 0xd9, 0x13, 0xda, 0x0b, 0x79, 0x03, 0xb9, 0x03, 0xba, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0x9a, 0x0b, 0x59, 0x03, 0x7a, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x56, 0x0b, 0x35, 0x1b, 0xf2, 0x1a, 0x56, 0x64, 0x9c, 0xce, 0xbb, 0xde, 0xdc, 0xde, 0x3e, 0xd7, 0x1f, 0xaf, 0x94, 0x23, 0x54, 0x0b, 0x56, 0x03, 0x97, 0x0b, 0x56, 0x03, 0x56, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x56, 0x03, 0x56, 0x03, 0x75, 0x03, 0x55, 0x03, 0x75, 0x03, 0x55, 0x03, 0x16, 0x0b, 0xf6, 0x12, 0xf6, 0x12, 0x57, 0x1b, 0x16, 0x0b, 0xb4, 0x02, 0xf3, 0x22, 0xf9, 0x7c, 0x9d, 0xce, 0x9b, 0xd6, 0xdc, 0xd6, 0x5f, 0xdf, 0x58, 0x64, 0x53, 0x12, 0x95, 0x0a, 0xf7, 0x12, 0xf5, 0x12, 0xb4, 0x12, 0x73, 0x02, 0xb4, 0x12, 0x77, 0x2b, 0x77, 0x2b, 0xf4, 0x1a, 0x93, 0x12, 0x15, 0x23, 0xd4, 0x1a, 0x76, 0x2b, 0x9a, 0x4c, 0x9a, 0x54, 0x96, 0x33, 0x14, 0x23, 0x34, 0x23, 0x75, 0x2b, 0xf6, 0x4b, 0xd4, 0x5b, 0x1c, 0xb6, 0x9b, 0xd6, 0xba, 0xe6, 0x7b, 0xd6, 0x1f, 0xd7, 0xf6, 0x53, 0x15, 0x2b, 0x35, 0x2b, 0x55, 0x33, 0x13, 0x23, 0xf5, 0x43, 0x19, 0x75, 0xf9, 0x6c, 0x35, 0x2b, 0x97, 0x33, 0x96, 0x33, 0x76, 0x3b, 0x38, 0x4c, 0x99, 0x64, 0xfa, 0x6c, 0x5b, 0x85, 0xf9, 0x7c, 0xd8, 0x7c, 0x7a, 0x8d, 0x39, 0x8d, 0x96, 0x84, 0x58, 0xa5, 0x5b, 0xd6, 0x5a, 0xd6, 0xbb, 0xde, 0x7b, 0xd6, 0xfd, 0xd6, 0x7c, 0xbe, 0xda, 0xa5, 0x39, 0x8d, 0x19, 0x85, 0x3a, 0x8d, 0xf9, 0x7c, 0xd8, 0x7c, 0xd8, 0x74, 0xf8, 0x7c, 0x5a, 0x85, 0x1d, 0xa6, 0x1e, 0xae, 0x9b, 0x9d, 0x79, 0x95, 0xdb, 0xa5, 0x5d, 0xbe, 0xfc, 0xb5, 0x79, 0xa5, 0xf7, 0x94, 0x58, 0xa5, 0x99, 0xad, 0xba, 0xad, 0x3b, 0xc6, 0xbb, 0xd6, 0xdd, 0xd6, 0x32, 0x33, 0x93, 0x0a, 0x14, 0x02, 0xf5, 0x01, 0x16, 0x0a, 0xd5, 0x01, 0xf6, 0x09, 0xd6, 0x01, 0xd6, 0x09, 0xf6, 0x09, 0xd5, 0x09, 0x95, 0x01, 0x95, 0x09, 0xb5, 0x11, 0xb5, 0x09, 0xb5, 0x11, 0xb4, 0x11, 0x74, 0x09, 0x94, 0x11, 0x53, 0x09, + 0xd9, 0x13, 0xb9, 0x0b, 0xb9, 0x0b, 0xfa, 0x13, 0x3b, 0x14, 0x3b, 0x0c, 0x1a, 0x04, 0xfa, 0x03, 0x3a, 0x0c, 0xb8, 0x03, 0xf9, 0x0b, 0x98, 0x03, 0xd9, 0x13, 0x1a, 0x24, 0x57, 0x0b, 0x98, 0x13, 0xb7, 0x0b, 0x76, 0x13, 0x13, 0x1b, 0x3d, 0x9e, 0x3e, 0xd7, 0xfc, 0xde, 0x3e, 0xe7, 0x3f, 0xd7, 0xf4, 0x22, 0xf7, 0x0a, 0x17, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x19, 0x03, 0x18, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x1a, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x7b, 0x0b, 0x3a, 0x0b, 0xd8, 0x02, 0x96, 0x0a, 0x54, 0x12, 0x1b, 0x7d, 0xdd, 0xd6, 0xfc, 0xe6, 0x5e, 0xef, 0x9f, 0xdf, 0xfb, 0x64, 0x37, 0x13, 0x38, 0x0b, 0x38, 0x0b, 0x59, 0x0b, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x0b, 0x58, 0x0b, 0x38, 0x0b, 0x18, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x59, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0x38, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0x18, 0x0b, 0x18, 0x13, 0xb4, 0x1a, 0x3d, 0xb6, 0xbc, 0xde, 0x3b, 0xef, 0x3d, 0xdf, 0x5d, 0xa6, 0x54, 0x23, 0x97, 0x13, 0xb9, 0x13, 0xf9, 0x13, 0x3a, 0x1c, 0xf9, 0x13, 0xf9, 0x0b, 0xb8, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xf9, 0x0b, 0x19, 0x0c, 0x3a, 0x14, 0x3a, 0x1c, 0x1a, 0x14, 0xd8, 0x03, 0x7b, 0x1c, 0x7b, 0x24, 0x3b, 0x1c, 0xd9, 0x0b, 0x97, 0x03, 0x76, 0x0b, 0x15, 0x3c, 0xf9, 0xa5, 0xdb, 0xd6, 0x1b, 0xdf, 0x7e, 0xcf, 0xdb, 0x65, 0xd6, 0x0b, 0x59, 0x14, 0xd8, 0x03, 0xf9, 0x0b, 0xf9, 0x13, 0xd9, 0x13, 0xb9, 0x0b, 0xb9, 0x0b, 0xd9, 0x13, 0xb9, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0xd9, 0x13, 0xb9, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0x97, 0x03, 0x97, 0x03, 0xb7, 0x0b, 0x54, 0x1b, 0xf7, 0x7c, 0xdc, 0xde, 0xbb, 0xde, 0x5f, 0xdf, 0xbc, 0x7d, 0x76, 0x13, 0x98, 0x0b, 0x98, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb8, 0x03, 0xd9, 0x03, 0x1a, 0x04, 0xd9, 0x03, 0xda, 0x0b, 0xd9, 0x0b, 0xd9, 0x13, 0x5b, 0x24, 0xf9, 0x1b, 0xf9, 0x1b, 0xb8, 0x0b, 0xd9, 0x0b, 0xf9, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x03, 0xf3, 0x12, 0x9d, 0xbe, 0xbb, 0xde, 0xdb, 0xde, 0x3e, 0xcf, 0x97, 0x44, 0xd6, 0x0b, 0xb7, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb7, 0x03, 0xd7, 0x03, 0x17, 0x14, 0xd7, 0x1b, 0x56, 0x13, 0x57, 0x0b, 0x58, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0xb8, 0x13, 0x77, 0x13, 0x14, 0x13, 0xd5, 0x43, 0xde, 0xce, 0xdc, 0xde, 0x3e, 0xe7, 0x5f, 0xdf, 0xdf, 0xae, 0x53, 0x23, 0x96, 0x1b, 0x57, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x98, 0x0b, 0x99, 0x13, 0xb9, 0x13, 0xb8, 0x13, 0x97, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x98, 0x0b, 0x79, 0x0b, 0x59, 0x0b, 0xf7, 0x02, 0x38, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x14, 0x13, 0x36, 0x5c, 0xd9, 0xb5, 0xfc, 0xee, 0xba, 0xd6, 0x3f, 0xd7, 0x13, 0x2b, 0xd6, 0x0a, 0xd7, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0x96, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x75, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0x95, 0x02, 0xb5, 0x02, 0xf6, 0x0a, 0xf6, 0x0a, 0xd5, 0x0a, 0xb5, 0x02, 0xd6, 0x0a, 0xd6, 0x02, 0xd5, 0x0a, 0x93, 0x12, 0x33, 0x43, 0xdc, 0xce, 0xdb, 0xde, 0x3e, 0xdf, 0x5d, 0xae, 0xd3, 0x12, 0x38, 0x0b, 0xd7, 0x02, 0x96, 0x02, 0xf7, 0x02, 0xb6, 0x02, 0x74, 0x02, 0xb6, 0x0a, 0xd6, 0x0a, 0xb6, 0x02, 0xd6, 0x0a, 0xb5, 0x0a, 0x54, 0x02, 0x96, 0x0a, 0xf6, 0x12, 0x95, 0x0a, 0x53, 0x0a, 0x94, 0x12, 0x54, 0x02, 0x74, 0x0a, 0xd5, 0x1a, 0x31, 0x0a, 0xf2, 0x42, 0xbf, 0xc6, 0xbd, 0xde, 0xbd, 0xd6, 0xdf, 0xbe, 0x32, 0x33, 0x51, 0x02, 0xd4, 0x0a, 0xd6, 0x0a, 0x75, 0x02, 0x96, 0x02, 0x95, 0x02, 0x95, 0x02, 0x95, 0x02, 0xd5, 0x0a, 0x57, 0x1b, 0x57, 0x1b, 0x95, 0x0a, 0xb7, 0x12, 0x56, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x96, 0x0a, 0x34, 0x02, 0x74, 0x0a, 0x52, 0x12, 0xdc, 0xa5, 0x9f, 0xc6, 0x33, 0x1a, 0xd5, 0x01, 0x59, 0x1a, 0x56, 0x01, 0xb5, 0x01, 0xf6, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xf6, 0x09, 0x16, 0x0a, 0x95, 0x01, 0xb5, 0x01, 0xd5, 0x09, 0xf5, 0x09, 0xb4, 0x01, 0x94, 0x01, 0xd4, 0x09, 0xb4, 0x01, 0xb4, 0x09, + 0x98, 0x0b, 0xd9, 0x13, 0xf9, 0x13, 0xd9, 0x0b, 0xb9, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xba, 0x0b, 0xda, 0x0b, 0xda, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0x76, 0x0b, 0xd2, 0x1a, 0x5e, 0xa6, 0x1d, 0xd7, 0xdb, 0xde, 0xdc, 0xe6, 0x7f, 0xdf, 0xb5, 0x1a, 0xf9, 0x0a, 0x3a, 0x0b, 0x1a, 0x0b, 0xda, 0x0a, 0xb9, 0x0a, 0xb9, 0x0a, 0xb9, 0x0a, 0xd8, 0x12, 0x97, 0x0a, 0x97, 0x0a, 0xb7, 0x0a, 0xb8, 0x02, 0xd8, 0x02, 0xf9, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd8, 0x02, 0xb8, 0x02, 0x97, 0x02, 0xf9, 0x0a, 0xb7, 0x0a, 0x74, 0x1a, 0x1b, 0x7d, 0xdd, 0xce, 0x5d, 0xe7, 0x7d, 0xe7, 0x7f, 0xcf, 0x99, 0x4c, 0x57, 0x13, 0x78, 0x13, 0x58, 0x13, 0x37, 0x0b, 0x38, 0x0b, 0x18, 0x0b, 0xf8, 0x0a, 0xf9, 0x0a, 0xf9, 0x0a, 0xf9, 0x0a, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0x17, 0x03, 0xf7, 0x02, 0x18, 0x0b, 0xf8, 0x0a, 0x18, 0x0b, 0xd7, 0x0a, 0xd6, 0x02, 0xf4, 0x1a, 0x5e, 0xb6, 0xfd, 0xde, 0x3d, 0xe7, 0x1d, 0xd7, 0xdf, 0xae, 0xb5, 0x2b, 0xb7, 0x13, 0xb8, 0x0b, 0xd9, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb7, 0x03, 0x97, 0x03, 0xf8, 0x03, 0xd9, 0x0b, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x79, 0x0b, 0x98, 0x1b, 0x17, 0x44, 0x1b, 0xb6, 0xdc, 0xde, 0x1c, 0xe7, 0x3e, 0xd7, 0xbc, 0x7d, 0x35, 0x13, 0xd8, 0x23, 0x57, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0x75, 0x1b, 0xd6, 0x74, 0xfd, 0xd6, 0xbc, 0xd6, 0x1e, 0xcf, 0x7c, 0x75, 0x97, 0x13, 0xb9, 0x0b, 0x3b, 0x1c, 0xf9, 0x0b, 0x5b, 0x1c, 0x1a, 0x14, 0x1a, 0x0c, 0xb9, 0x03, 0xb9, 0x03, 0xd8, 0x13, 0x97, 0x0b, 0xb7, 0x1b, 0x1d, 0x4d, 0xdb, 0x44, 0xfc, 0x44, 0xdb, 0x3c, 0xf8, 0x1b, 0xb7, 0x0b, 0xd8, 0x13, 0x98, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x14, 0x1b, 0x5c, 0xc6, 0x79, 0xe6, 0xda, 0xee, 0xdc, 0xd6, 0x97, 0x4c, 0x18, 0x1c, 0xf9, 0x13, 0xda, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0x1b, 0x14, 0x5b, 0x14, 0x1b, 0x0c, 0x99, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x56, 0x03, 0x55, 0x13, 0xb4, 0x3b, 0xfd, 0xce, 0xba, 0xd6, 0xfc, 0xde, 0xfd, 0xce, 0x9e, 0xa6, 0x33, 0x1b, 0x76, 0x13, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x77, 0x0b, 0xb9, 0x13, 0xd9, 0x13, 0xf9, 0x13, 0xf9, 0x13, 0xd8, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0xd9, 0x0b, 0x97, 0x03, 0xb8, 0x0b, 0xb8, 0x03, 0x77, 0x03, 0x55, 0x03, 0x75, 0x13, 0xf4, 0x1a, 0xf6, 0x53, 0xfa, 0xb5, 0xfc, 0xe6, 0x1c, 0xdf, 0x5f, 0xcf, 0x54, 0x23, 0xf5, 0x0a, 0x16, 0x0b, 0xf6, 0x0a, 0xf7, 0x0a, 0xd7, 0x0a, 0xd7, 0x02, 0x96, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x76, 0x02, 0x96, 0x0a, 0xd7, 0x0a, 0x96, 0x02, 0x95, 0x02, 0xb6, 0x02, 0xb6, 0x0a, 0x95, 0x02, 0xb6, 0x02, 0xf7, 0x12, 0x96, 0x0a, 0xb6, 0x12, 0x53, 0x12, 0xf3, 0x3a, 0x9c, 0xce, 0x9a, 0xd6, 0xdc, 0xd6, 0x3c, 0xae, 0xd3, 0x1a, 0xb5, 0x0a, 0xd7, 0x12, 0xf8, 0x12, 0xb7, 0x02, 0xb8, 0x02, 0xd9, 0x0a, 0x98, 0x0a, 0x97, 0x02, 0xd8, 0x0a, 0xb6, 0x02, 0x95, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xb6, 0x02, 0xd6, 0x0a, 0x95, 0x0a, 0x95, 0x12, 0xb6, 0x0a, 0x75, 0x0a, 0x74, 0x02, 0x31, 0x12, 0xd1, 0x42, 0x3d, 0xce, 0x9c, 0xee, 0x1b, 0xde, 0xdf, 0xce, 0x12, 0x3b, 0xd4, 0x12, 0x17, 0x0b, 0xd7, 0x02, 0xd8, 0x0a, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x0a, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0xb7, 0x0a, 0x97, 0x0a, 0x96, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xb6, 0x0a, 0x75, 0x02, 0x31, 0x12, 0x9b, 0xad, 0xbf, 0xd6, 0x15, 0x3b, 0x13, 0x12, 0x93, 0x09, 0xd6, 0x19, 0x17, 0x1a, 0x17, 0x12, 0xb5, 0x09, 0xb5, 0x09, 0x95, 0x01, 0x74, 0x01, 0xf6, 0x09, 0xb5, 0x09, 0x95, 0x01, 0x74, 0x01, 0xb5, 0x09, 0x94, 0x01, 0xb4, 0x09, 0xf5, 0x09, 0xb4, 0x01, 0xb4, 0x01, + 0xfa, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xf9, 0x03, 0x1a, 0x04, 0xf9, 0x03, 0xf9, 0x03, 0x1a, 0x04, 0x19, 0x04, 0xd8, 0x03, 0x18, 0x0c, 0xb7, 0x0b, 0x97, 0x0b, 0xd8, 0x13, 0x97, 0x0b, 0x77, 0x0b, 0x97, 0x0b, 0x96, 0x13, 0x13, 0x23, 0x7e, 0xae, 0x1d, 0xe7, 0xfa, 0xee, 0xba, 0xe6, 0x3f, 0xdf, 0xd4, 0x22, 0xf9, 0x0a, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xba, 0x12, 0x99, 0x0a, 0x99, 0x0a, 0xda, 0x0a, 0xb9, 0x0a, 0xb9, 0x0a, 0xb9, 0x0a, 0xb9, 0x02, 0xba, 0x02, 0xda, 0x0a, 0xda, 0x0a, 0xd9, 0x0a, 0xb9, 0x0a, 0xd9, 0x0a, 0xb9, 0x02, 0xd9, 0x0a, 0x76, 0x0a, 0x54, 0x12, 0x3c, 0x85, 0xfe, 0xd6, 0x3c, 0xe7, 0x3b, 0xe7, 0xbf, 0xdf, 0x79, 0x44, 0x58, 0x0b, 0x58, 0x0b, 0x99, 0x13, 0x17, 0x03, 0x38, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x0a, 0x3a, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x18, 0x03, 0x19, 0x03, 0xf8, 0x02, 0x19, 0x0b, 0xf8, 0x0a, 0xf6, 0x02, 0xf4, 0x1a, 0x5d, 0xb6, 0xdd, 0xde, 0x3d, 0xef, 0x5e, 0xdf, 0xdf, 0xae, 0x75, 0x2b, 0xd8, 0x1b, 0xd9, 0x13, 0xb9, 0x0b, 0x78, 0x0b, 0x79, 0x0b, 0x9a, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x58, 0x0b, 0x78, 0x13, 0x99, 0x13, 0xda, 0x1b, 0x99, 0x13, 0x38, 0x0b, 0x36, 0x13, 0x38, 0x54, 0xfb, 0xb5, 0xdc, 0xe6, 0xdb, 0xde, 0x3f, 0xd7, 0x7c, 0x6d, 0x56, 0x0b, 0xd8, 0x13, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x35, 0x1b, 0xb7, 0x74, 0xbd, 0xd6, 0xdc, 0xde, 0x1e, 0xd7, 0x59, 0x7d, 0x33, 0x1b, 0x75, 0x1b, 0x38, 0x2c, 0xb6, 0x1b, 0x79, 0x3c, 0x9a, 0x44, 0x39, 0x34, 0xb8, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0x98, 0x0b, 0xb8, 0x13, 0xbc, 0x3c, 0x7b, 0x34, 0x9b, 0x34, 0x5a, 0x24, 0xf9, 0x13, 0xd9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0xd3, 0x12, 0x7c, 0xb6, 0xdb, 0xde, 0xfb, 0xee, 0x3e, 0xd7, 0xd9, 0x4c, 0xd7, 0x0b, 0xd8, 0x0b, 0xb9, 0x0b, 0x1a, 0x14, 0xb8, 0x0b, 0x77, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x59, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x0b, 0x59, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x37, 0x0b, 0x36, 0x1b, 0x74, 0x43, 0xbc, 0xd6, 0x99, 0xe6, 0xdb, 0xee, 0x1e, 0xdf, 0x7f, 0xa6, 0x13, 0x1b, 0x36, 0x13, 0x79, 0x13, 0x99, 0x0b, 0x59, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x59, 0x0b, 0x79, 0x03, 0x98, 0x0b, 0x77, 0x03, 0x97, 0x03, 0x76, 0x03, 0x76, 0x0b, 0x55, 0x13, 0xf4, 0x1a, 0xf7, 0x5b, 0xdb, 0xbd, 0x7b, 0xd6, 0xfc, 0xd6, 0x1e, 0xbf, 0x95, 0x2b, 0xb5, 0x02, 0xf5, 0x12, 0x95, 0x0a, 0x95, 0x02, 0x95, 0x02, 0xd6, 0x0a, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x0a, 0x55, 0x02, 0x96, 0x0a, 0x55, 0x02, 0xb7, 0x0a, 0xd7, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0x75, 0x02, 0x75, 0x02, 0xb6, 0x12, 0xb5, 0x12, 0xd2, 0x2a, 0x9c, 0xbe, 0xfb, 0xd6, 0x3d, 0xd7, 0x1b, 0x9e, 0xf3, 0x12, 0xf6, 0x0a, 0xd6, 0x0a, 0xb6, 0x0a, 0xb6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xb6, 0x0a, 0xb5, 0x0a, 0xb6, 0x0a, 0x76, 0x02, 0x97, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x97, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xd6, 0x0a, 0x92, 0x2a, 0x5e, 0xc6, 0x9c, 0xde, 0x7b, 0xd6, 0xff, 0xc6, 0x12, 0x33, 0xd4, 0x12, 0xf6, 0x0a, 0xb5, 0x02, 0xb6, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xd7, 0x0a, 0xd6, 0x02, 0xb5, 0x02, 0xb5, 0x02, 0xd6, 0x0a, 0xb5, 0x02, 0xd5, 0x0a, 0xb5, 0x0a, 0x75, 0x02, 0xb6, 0x0a, 0x32, 0x12, 0xfc, 0xb5, 0x3d, 0xbe, 0xb7, 0x3b, 0x54, 0x02, 0x56, 0x02, 0xf5, 0x01, 0xf5, 0x01, 0xd5, 0x01, 0xf5, 0x01, 0xf5, 0x09, 0xf5, 0x09, 0xd4, 0x01, 0xd5, 0x01, 0xb4, 0x01, 0xd5, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x94, 0x01, 0x93, 0x01, + 0xb8, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xda, 0x0b, 0xba, 0x0b, 0x79, 0x03, 0x9a, 0x0b, 0x9a, 0x0b, 0x79, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0x9a, 0x03, 0xfb, 0x0b, 0x9a, 0x03, 0xb9, 0x03, 0x77, 0x0b, 0x15, 0x1b, 0x3e, 0x9e, 0x1d, 0xd7, 0xda, 0xde, 0xda, 0xde, 0x7f, 0xe7, 0xf3, 0x22, 0x38, 0x13, 0x18, 0x0b, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xfa, 0x02, 0xd9, 0x02, 0xb9, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xd8, 0x0a, 0x97, 0x02, 0x19, 0x0b, 0xf9, 0x0a, 0xb7, 0x0a, 0x96, 0x0a, 0x53, 0x12, 0xda, 0x7c, 0xfe, 0xde, 0xdb, 0xee, 0x5c, 0xef, 0x5f, 0xd7, 0x59, 0x4c, 0x38, 0x0b, 0xba, 0x1b, 0x59, 0x0b, 0x37, 0x03, 0x38, 0x03, 0x58, 0x03, 0x19, 0x03, 0x18, 0x03, 0x19, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x39, 0x0b, 0xf9, 0x0a, 0xf9, 0x0a, 0x19, 0x03, 0xd9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xf8, 0x02, 0x38, 0x0b, 0x16, 0x0b, 0xb1, 0x12, 0x3c, 0xbe, 0xdc, 0xe6, 0xfb, 0xf6, 0xdb, 0xd6, 0x3f, 0xb7, 0x73, 0x1b, 0xf8, 0x13, 0xd9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xba, 0x0b, 0x79, 0x03, 0xba, 0x03, 0x9a, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x18, 0x04, 0xf8, 0x03, 0xf8, 0x03, 0x97, 0x03, 0x34, 0x0b, 0x77, 0x54, 0x3a, 0xb6, 0xdb, 0xe6, 0xbb, 0xe6, 0x1e, 0xdf, 0x7d, 0x7d, 0x97, 0x1b, 0xf9, 0x13, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0xda, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xd9, 0x0b, 0x77, 0x0b, 0xf4, 0x1a, 0xd8, 0x84, 0x9c, 0xd6, 0xbc, 0xde, 0x1e, 0xd7, 0x3a, 0x6d, 0xb5, 0x1b, 0xf8, 0x0b, 0xd9, 0x03, 0xda, 0x03, 0x99, 0x03, 0xba, 0x0b, 0x9a, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x13, 0xb9, 0x13, 0x98, 0x0b, 0x78, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x57, 0x13, 0xf3, 0x1a, 0x5c, 0xae, 0xdc, 0xd6, 0x9a, 0xde, 0x1e, 0xcf, 0x98, 0x44, 0xb8, 0x03, 0xd9, 0x13, 0x99, 0x0b, 0x98, 0x13, 0x98, 0x13, 0x78, 0x0b, 0x78, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x37, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x78, 0x03, 0x16, 0x03, 0x16, 0x13, 0x74, 0x3b, 0xbc, 0xc6, 0xdb, 0xde, 0xdc, 0xde, 0x3f, 0xd7, 0xbf, 0xa6, 0x74, 0x23, 0x76, 0x0b, 0x98, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x59, 0x03, 0x99, 0x13, 0x38, 0x0b, 0x99, 0x0b, 0x58, 0x03, 0x77, 0x03, 0x36, 0x0b, 0xf5, 0x12, 0xf7, 0x53, 0xba, 0xb5, 0x9b, 0xe6, 0xbb, 0xde, 0xde, 0xc6, 0xd4, 0x1a, 0xf8, 0x0a, 0xd8, 0x0a, 0x98, 0x0a, 0xf7, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0x55, 0x02, 0x75, 0x12, 0xf4, 0x3a, 0x5b, 0xce, 0x79, 0xde, 0xbc, 0xde, 0x1d, 0xae, 0x93, 0x0a, 0xf7, 0x0a, 0xd7, 0x0a, 0xb6, 0x0a, 0x17, 0x0b, 0xf6, 0x02, 0x95, 0x02, 0xb6, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd6, 0x0a, 0xb5, 0x0a, 0x95, 0x12, 0x96, 0x0a, 0x95, 0x02, 0x94, 0x02, 0x72, 0x1a, 0x2d, 0x32, 0x7c, 0xd6, 0x9c, 0xd6, 0xbe, 0xce, 0xff, 0xbe, 0x34, 0x2b, 0xb5, 0x12, 0x96, 0x0a, 0x76, 0x02, 0x96, 0x0a, 0x75, 0x0a, 0xb6, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0x97, 0x02, 0x77, 0x02, 0x98, 0x0a, 0x77, 0x02, 0x56, 0x02, 0x96, 0x0a, 0x75, 0x02, 0xb6, 0x0a, 0x95, 0x0a, 0x75, 0x02, 0x76, 0x0a, 0x12, 0x12, 0x5a, 0xb5, 0x5e, 0xd6, 0x56, 0x43, 0xd3, 0x01, 0xb3, 0x01, 0x94, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xf6, 0x01, 0xb5, 0x01, 0x95, 0x01, 0xd6, 0x09, 0x96, 0x01, 0x95, 0x01, 0x75, 0x01, 0xb6, 0x09, 0x75, 0x01, 0x96, 0x09, 0x95, 0x09, 0x55, 0x01, 0x95, 0x09, 0x75, 0x09, + 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x0b, 0x76, 0x13, 0x13, 0x1b, 0xbf, 0xae, 0xfc, 0xde, 0xfa, 0xee, 0xfb, 0xee, 0x5f, 0xdf, 0x56, 0x33, 0xd7, 0x0a, 0xf8, 0x0a, 0xd9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xda, 0x02, 0xfa, 0x0a, 0xd9, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xb8, 0x0a, 0x76, 0x0a, 0x32, 0x12, 0x9c, 0x95, 0xfd, 0xd6, 0xfb, 0xde, 0x3c, 0xe7, 0xbf, 0xdf, 0x57, 0x54, 0x36, 0x1b, 0x78, 0x13, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x16, 0x0b, 0xf6, 0x0a, 0xf7, 0x0a, 0xf7, 0x0a, 0x17, 0x03, 0x38, 0x03, 0x18, 0x0b, 0x19, 0x0b, 0x19, 0x0b, 0x19, 0x03, 0x18, 0x03, 0xf7, 0x02, 0xf7, 0x0a, 0xf8, 0x0a, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0xd4, 0x1a, 0x3b, 0xb6, 0xfb, 0xe6, 0x1b, 0xe7, 0x1d, 0xcf, 0x1f, 0xa7, 0xb5, 0x23, 0x95, 0x13, 0x96, 0x0b, 0xd8, 0x0b, 0x97, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0x97, 0x13, 0x97, 0x13, 0xb9, 0x0b, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0x79, 0x13, 0x99, 0x13, 0xb8, 0x03, 0xf9, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0xb8, 0x03, 0x97, 0x03, 0x94, 0x13, 0x96, 0x54, 0x3a, 0xbe, 0xbb, 0xe6, 0xdc, 0xde, 0x3f, 0xcf, 0x3a, 0x55, 0x76, 0x0b, 0xd8, 0x13, 0xb8, 0x03, 0xf7, 0x03, 0xd7, 0x03, 0xb8, 0x03, 0x79, 0x0b, 0x7a, 0x0b, 0x7a, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x9a, 0x0b, 0x9a, 0x0b, 0x99, 0x0b, 0xb9, 0x0b, 0xd7, 0x03, 0xd6, 0x03, 0x97, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x36, 0x23, 0x99, 0x7c, 0x9f, 0xde, 0x9c, 0xd6, 0x1e, 0xcf, 0x7a, 0x65, 0x75, 0x13, 0xd7, 0x23, 0x77, 0x13, 0x98, 0x0b, 0xb9, 0x03, 0xbb, 0x03, 0x9a, 0x03, 0xb9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x99, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x59, 0x03, 0xf4, 0x1a, 0x3b, 0xb6, 0xba, 0xde, 0xbb, 0xe6, 0xfe, 0xd6, 0x78, 0x44, 0xb8, 0x13, 0xb9, 0x13, 0xb9, 0x0b, 0xb7, 0x03, 0xb7, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x59, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x17, 0x0b, 0x16, 0x13, 0x74, 0x33, 0xdd, 0xc6, 0x9a, 0xde, 0xbb, 0xe6, 0xff, 0xde, 0x3f, 0x96, 0x36, 0x13, 0x98, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0x78, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x79, 0x03, 0x77, 0x03, 0x77, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x59, 0x13, 0x39, 0x13, 0x59, 0x13, 0x59, 0x13, 0x78, 0x0b, 0x77, 0x0b, 0x55, 0x0b, 0x34, 0x0b, 0x34, 0x13, 0x36, 0x54, 0xfa, 0xbd, 0x9b, 0xe6, 0xbc, 0xee, 0xbe, 0xd6, 0xd4, 0x1a, 0x38, 0x0b, 0xd6, 0x02, 0xb6, 0x02, 0x77, 0x12, 0x77, 0x12, 0xb6, 0x02, 0xb5, 0x02, 0x95, 0x02, 0x95, 0x0a, 0xb5, 0x02, 0xb5, 0x02, 0x95, 0x0a, 0xb6, 0x12, 0xb8, 0x0a, 0x97, 0x0a, 0xb7, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0x76, 0x0a, 0x76, 0x12, 0x74, 0x0a, 0xd4, 0x32, 0x7d, 0xce, 0x9c, 0xe6, 0x9c, 0xd6, 0xfb, 0xad, 0xb1, 0x12, 0x15, 0x0b, 0xf6, 0x02, 0xb7, 0x02, 0xb9, 0x02, 0xb9, 0x0a, 0x98, 0x02, 0xd9, 0x0a, 0xd9, 0x02, 0xb8, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x96, 0x02, 0xb6, 0x02, 0xb5, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x95, 0x0a, 0x72, 0x1a, 0x2d, 0x2a, 0x7b, 0xce, 0x7b, 0xde, 0x7c, 0xd6, 0x9f, 0xb6, 0xd3, 0x1a, 0xb4, 0x02, 0x94, 0x02, 0x94, 0x0a, 0x75, 0x0a, 0x77, 0x02, 0x78, 0x02, 0x97, 0x02, 0x97, 0x0a, 0xb8, 0x02, 0xb8, 0x02, 0xd6, 0x02, 0xb5, 0x02, 0x96, 0x02, 0x97, 0x02, 0x77, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x95, 0x02, 0x75, 0x02, 0x55, 0x0a, 0xf2, 0x11, 0x9a, 0xa5, 0x7e, 0xc6, 0xf4, 0x2a, 0x14, 0x02, 0xf5, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x97, 0x03, 0x76, 0x0b, 0x13, 0x1b, 0x7e, 0xa6, 0xbb, 0xce, 0xb9, 0xe6, 0xfb, 0xe6, 0x7f, 0xdf, 0xb7, 0x3b, 0x18, 0x13, 0xf9, 0x0a, 0xd9, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0x99, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xd9, 0x0a, 0xd9, 0x02, 0xd8, 0x02, 0xf9, 0x0a, 0xd8, 0x0a, 0x97, 0x0a, 0x33, 0x12, 0x7d, 0x95, 0xbe, 0xde, 0xbb, 0xee, 0x1c, 0xef, 0x5f, 0xe7, 0x17, 0x54, 0xf5, 0x1a, 0x39, 0x13, 0xf9, 0x02, 0x1a, 0x03, 0x1a, 0x03, 0xda, 0x0a, 0xda, 0x0a, 0xdb, 0x0a, 0xfb, 0x02, 0x1b, 0x03, 0x3a, 0x03, 0x19, 0x03, 0x19, 0x0b, 0x19, 0x0b, 0x19, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xd9, 0x0a, 0xf9, 0x0a, 0xd8, 0x02, 0xf8, 0x0a, 0xd8, 0x0a, 0x73, 0x12, 0x5b, 0xbe, 0xda, 0xe6, 0x1b, 0xe7, 0x3d, 0xdf, 0xff, 0xb6, 0x55, 0x2b, 0xd9, 0x23, 0x79, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x7b, 0x0b, 0x7b, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x0b, 0xb8, 0x13, 0xb8, 0x0b, 0xd8, 0x0b, 0x98, 0x13, 0x79, 0x13, 0x79, 0x0b, 0x78, 0x0b, 0x56, 0x0b, 0x37, 0x44, 0x1b, 0xae, 0xdc, 0xde, 0x1d, 0xef, 0x1e, 0xdf, 0x19, 0x6d, 0x76, 0x1b, 0x97, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x98, 0x03, 0x96, 0x03, 0x53, 0x0b, 0xd6, 0x7c, 0xdc, 0xde, 0xfa, 0xd6, 0x5d, 0xcf, 0x9b, 0x6d, 0x76, 0x13, 0xf9, 0x13, 0x98, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0xb7, 0x0b, 0x98, 0x03, 0x7b, 0x13, 0x7b, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0x78, 0x0b, 0x78, 0x13, 0x97, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x98, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x37, 0x0b, 0x13, 0x1b, 0x9c, 0xb6, 0xda, 0xce, 0xfb, 0xde, 0x1e, 0xcf, 0x57, 0x44, 0x98, 0x13, 0x9a, 0x1b, 0x5a, 0x13, 0x79, 0x0b, 0x59, 0x0b, 0x5b, 0x0b, 0x5b, 0x0b, 0x7a, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x58, 0x0b, 0x59, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0x76, 0x0b, 0x76, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x16, 0x13, 0x35, 0x3b, 0x9d, 0xce, 0xbb, 0xe6, 0xfc, 0xe6, 0x1e, 0xd7, 0xdc, 0x95, 0x13, 0x1b, 0x95, 0x0b, 0x96, 0x03, 0x96, 0x0b, 0x76, 0x0b, 0x98, 0x0b, 0x79, 0x03, 0x59, 0x0b, 0x59, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x56, 0x0b, 0x55, 0x13, 0x34, 0x1b, 0x57, 0x54, 0x3b, 0xb6, 0x9b, 0xd6, 0xdc, 0xde, 0xbe, 0xc6, 0xd3, 0x12, 0xf7, 0x0a, 0xd7, 0x12, 0x96, 0x0a, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x57, 0x0a, 0x77, 0x0a, 0xb8, 0x0a, 0x97, 0x0a, 0x56, 0x12, 0x56, 0x1a, 0x76, 0x12, 0x75, 0x0a, 0x94, 0x02, 0xb4, 0x02, 0x74, 0x0a, 0x14, 0x33, 0x9d, 0xce, 0xbc, 0xde, 0x9b, 0xc6, 0xba, 0x95, 0xb3, 0x12, 0xf8, 0x0a, 0xd8, 0x0a, 0xb8, 0x02, 0xd8, 0x02, 0xd7, 0x0a, 0xb5, 0x0a, 0xd6, 0x12, 0x97, 0x12, 0x97, 0x12, 0x96, 0x12, 0x96, 0x12, 0xb7, 0x0a, 0xb7, 0x0a, 0xb6, 0x02, 0x96, 0x02, 0xb6, 0x02, 0x76, 0x02, 0x98, 0x02, 0xb9, 0x0a, 0x36, 0x0a, 0x55, 0x1a, 0x10, 0x2a, 0x5e, 0xc6, 0x9c, 0xd6, 0x7c, 0xc6, 0x1f, 0xa6, 0x52, 0x12, 0xd4, 0x22, 0xd5, 0x12, 0xb7, 0x02, 0x97, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x0a, 0x78, 0x12, 0x58, 0x12, 0x77, 0x0a, 0x76, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x95, 0x02, 0x75, 0x02, 0x75, 0x0a, 0x12, 0x12, 0x39, 0x9d, 0x7e, 0xc6, 0x15, 0x33, 0x14, 0x02, 0x36, 0x0a, 0xf6, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x56, 0x0b, 0x13, 0x1b, 0x5e, 0xa6, 0x9b, 0xce, 0xb9, 0xe6, 0x1c, 0xef, 0x7f, 0xe7, 0x96, 0x33, 0x18, 0x0b, 0xf9, 0x0a, 0xb8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xf9, 0x0a, 0xd8, 0x0a, 0x97, 0x0a, 0x33, 0x12, 0x9d, 0x95, 0xfe, 0xde, 0xfc, 0xe6, 0x5d, 0xef, 0x7f, 0xdf, 0x58, 0x54, 0x16, 0x13, 0x79, 0x13, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x18, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0x3a, 0x0b, 0x3a, 0x0b, 0xf9, 0x0a, 0x54, 0x12, 0x7e, 0xbe, 0xdc, 0xde, 0x1c, 0xe7, 0x3e, 0xdf, 0xff, 0xbe, 0x11, 0x23, 0x17, 0x24, 0xb7, 0x03, 0xb7, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd7, 0x03, 0x97, 0x0b, 0x77, 0x13, 0x36, 0x13, 0xb6, 0x3b, 0x7b, 0x9d, 0xbe, 0xd6, 0xbd, 0xde, 0xff, 0xce, 0x7b, 0x6d, 0x75, 0x13, 0xb8, 0x1b, 0x99, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xdb, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x7a, 0x0b, 0x38, 0x0b, 0x99, 0x13, 0xb8, 0x0b, 0x14, 0x0b, 0xd7, 0x74, 0xbd, 0xd6, 0x9b, 0xe6, 0xbc, 0xd6, 0xfc, 0x85, 0x75, 0x13, 0x17, 0x1c, 0xb7, 0x03, 0xb7, 0x03, 0xd8, 0x03, 0x98, 0x03, 0x98, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0x79, 0x0b, 0x99, 0x0b, 0x9a, 0x0b, 0x9a, 0x03, 0x9a, 0x03, 0xba, 0x03, 0x99, 0x03, 0x98, 0x03, 0x97, 0x03, 0x76, 0x0b, 0x12, 0x1b, 0x1b, 0xb6, 0x3a, 0xd6, 0xdd, 0xde, 0x1f, 0xc7, 0x78, 0x3c, 0xb8, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x5a, 0x0b, 0x39, 0x0b, 0x58, 0x03, 0x77, 0x03, 0x76, 0x03, 0x56, 0x03, 0x15, 0x13, 0x33, 0x33, 0x9c, 0xc6, 0xbb, 0xe6, 0xdc, 0xee, 0xde, 0xde, 0x9b, 0x85, 0x53, 0x13, 0x96, 0x0b, 0x97, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x97, 0x03, 0x98, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x37, 0x03, 0xf6, 0x0a, 0xd4, 0x0a, 0x38, 0x54, 0x1b, 0xae, 0x7b, 0xc6, 0xfc, 0xce, 0xff, 0xbe, 0xb3, 0x0a, 0xf7, 0x02, 0xf8, 0x0a, 0xd7, 0x0a, 0xd6, 0x02, 0xb5, 0x02, 0x95, 0x0a, 0x76, 0x0a, 0xb6, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0x97, 0x02, 0xb8, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0x77, 0x0a, 0x77, 0x12, 0x76, 0x12, 0x55, 0x12, 0x74, 0x12, 0x73, 0x12, 0x53, 0x12, 0x14, 0x3b, 0x9c, 0xc6, 0x9b, 0xd6, 0x9c, 0xce, 0x7b, 0x9d, 0x95, 0x1a, 0xb8, 0x12, 0xf8, 0x0a, 0xf7, 0x02, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xf7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd8, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x95, 0x02, 0xd4, 0x12, 0x4e, 0x0a, 0x9d, 0xa6, 0x9d, 0xc6, 0xff, 0xc6, 0xbf, 0x9e, 0x91, 0x02, 0xd5, 0x0a, 0x95, 0x02, 0x75, 0x0a, 0x76, 0x0a, 0x77, 0x0a, 0x77, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x97, 0x02, 0x98, 0x0a, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x55, 0x0a, 0x12, 0x12, 0xf8, 0x94, 0x9e, 0xc6, 0x35, 0x3b, 0xf3, 0x01, 0x36, 0x0a, 0x16, 0x0a, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x0b, 0x56, 0x0b, 0x13, 0x1b, 0x3d, 0x9e, 0xdc, 0xd6, 0x1b, 0xef, 0x3c, 0xef, 0x5f, 0xdf, 0x15, 0x23, 0xd7, 0x0a, 0xf8, 0x0a, 0xb8, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0x96, 0x0a, 0x32, 0x12, 0x9c, 0x8d, 0xfc, 0xce, 0x1a, 0xdf, 0x5b, 0xe7, 0x9f, 0xd7, 0x58, 0x4c, 0x37, 0x0b, 0x59, 0x0b, 0xf8, 0x02, 0xf7, 0x0a, 0xf7, 0x0a, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xf9, 0x0a, 0xd9, 0x0a, 0xd9, 0x0a, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xd9, 0x0a, 0xd8, 0x0a, 0xd7, 0x0a, 0xd5, 0x12, 0x92, 0x1a, 0x5c, 0xb6, 0xfc, 0xd6, 0x3c, 0xdf, 0x5e, 0xdf, 0xff, 0xae, 0x75, 0x23, 0x19, 0x14, 0xd9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xb8, 0x0b, 0xb8, 0x13, 0x97, 0x13, 0x77, 0x13, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x0b, 0x79, 0x0b, 0x9a, 0x13, 0x7a, 0x0b, 0x9a, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x77, 0x03, 0xd5, 0x2b, 0xf9, 0x95, 0xfb, 0xce, 0x3b, 0xe7, 0x5d, 0xe7, 0xdc, 0x9d, 0x34, 0x23, 0xd7, 0x03, 0x19, 0x04, 0xb8, 0x03, 0x98, 0x0b, 0x78, 0x13, 0x58, 0x1b, 0x57, 0x23, 0x36, 0x2b, 0x34, 0x2b, 0x33, 0x2b, 0x33, 0x23, 0x34, 0x23, 0x35, 0x1b, 0x57, 0x13, 0x78, 0x0b, 0x79, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x96, 0x03, 0x53, 0x13, 0x58, 0x85, 0xbb, 0xd6, 0xba, 0xde, 0x1d, 0xd7, 0x1e, 0x86, 0x56, 0x13, 0xda, 0x1b, 0x7a, 0x0b, 0x7a, 0x0b, 0x9b, 0x0b, 0xba, 0x03, 0xda, 0x03, 0xb9, 0x0b, 0x78, 0x13, 0x5a, 0x13, 0x7b, 0x13, 0xba, 0x0b, 0x99, 0x03, 0x5a, 0x0b, 0x7a, 0x13, 0x79, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x97, 0x03, 0x77, 0x03, 0x78, 0x03, 0x38, 0x03, 0xd4, 0x22, 0x9a, 0xc5, 0xb7, 0xe5, 0xf8, 0xed, 0xf9, 0xd5, 0xf3, 0x63, 0x32, 0x3b, 0x34, 0x33, 0xf5, 0x22, 0x35, 0x1b, 0x37, 0x1b, 0x38, 0x13, 0x39, 0x13, 0x59, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x7a, 0x03, 0x59, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x37, 0x0b, 0x56, 0x0b, 0x35, 0x0b, 0x53, 0x2b, 0x7c, 0xc6, 0x9a, 0xde, 0xfc, 0xd6, 0x1e, 0xc7, 0x7b, 0x75, 0x76, 0x13, 0x98, 0x0b, 0x59, 0x03, 0x7a, 0x03, 0x5a, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x59, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x58, 0x13, 0x77, 0x0b, 0x36, 0x03, 0x57, 0x0b, 0x58, 0x0b, 0x18, 0x13, 0xd7, 0x12, 0xb6, 0x22, 0xbb, 0x7c, 0x3d, 0xc6, 0xbd, 0xe6, 0xdc, 0xde, 0xde, 0xce, 0xb3, 0x22, 0xf6, 0x12, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x77, 0x0a, 0x57, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x96, 0x02, 0xb6, 0x0a, 0xd6, 0x12, 0xf5, 0x0a, 0xd5, 0x0a, 0xb7, 0x02, 0xb8, 0x0a, 0x97, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x56, 0x0a, 0x73, 0x0a, 0x53, 0x3b, 0x9a, 0xc6, 0x98, 0xd6, 0xdc, 0xce, 0x9b, 0x8d, 0xd5, 0x12, 0xf9, 0x02, 0x18, 0x03, 0xf8, 0x02, 0xd7, 0x02, 0xb8, 0x0a, 0x99, 0x12, 0x59, 0x12, 0x78, 0x0a, 0x98, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x96, 0x0a, 0xb6, 0x0a, 0xd5, 0x0a, 0xd5, 0x12, 0xb4, 0x12, 0x74, 0x1a, 0x33, 0x1a, 0x34, 0x2a, 0x13, 0x32, 0xb0, 0x31, 0xae, 0x41, 0xfc, 0xdd, 0x39, 0xe6, 0x9b, 0xe6, 0xdd, 0xa5, 0x52, 0x12, 0xb5, 0x0a, 0xb6, 0x0a, 0x76, 0x12, 0x56, 0x12, 0x57, 0x0a, 0x98, 0x0a, 0xb7, 0x02, 0xd6, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x55, 0x0a, 0x12, 0x12, 0xf8, 0x94, 0x7e, 0xc6, 0x56, 0x3b, 0xf3, 0x01, 0x15, 0x02, 0xd5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x57, 0x0b, 0x14, 0x1b, 0xfc, 0x95, 0xfd, 0xd6, 0x3c, 0xef, 0x5c, 0xef, 0x5f, 0xd7, 0xf4, 0x22, 0xf8, 0x0a, 0x19, 0x0b, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xb9, 0x02, 0x99, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0x76, 0x0a, 0x32, 0x0a, 0x7b, 0x8d, 0xdc, 0xd6, 0xfa, 0xe6, 0xfa, 0xe6, 0x5f, 0xdf, 0xf8, 0x43, 0x18, 0x23, 0xf7, 0x2a, 0x53, 0x3a, 0xcf, 0x61, 0xad, 0x71, 0xcd, 0x69, 0xcd, 0x69, 0xce, 0x69, 0xae, 0x71, 0xae, 0x71, 0xaf, 0x71, 0xaf, 0x71, 0xaf, 0x69, 0xcf, 0x69, 0xce, 0x69, 0xce, 0x69, 0xce, 0x69, 0xcd, 0x69, 0xcd, 0x69, 0x0d, 0x6a, 0xec, 0x61, 0xeb, 0x71, 0xea, 0x79, 0xef, 0xcb, 0x4f, 0xe4, 0x70, 0xec, 0x71, 0xec, 0x13, 0xcc, 0x2d, 0x7a, 0x2f, 0x72, 0x50, 0x6a, 0x4e, 0x62, 0x4e, 0x62, 0x2e, 0x6a, 0x2f, 0x72, 0x2f, 0x72, 0x2f, 0x6a, 0x70, 0x5a, 0xd2, 0x42, 0x77, 0x13, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0xb7, 0x0b, 0x96, 0x0b, 0xb7, 0x0b, 0x97, 0x0b, 0x57, 0x0b, 0x57, 0x13, 0x34, 0x1b, 0x94, 0x43, 0xba, 0xb5, 0xfd, 0xee, 0x7b, 0xd6, 0xdd, 0xce, 0x5e, 0x8e, 0x34, 0x1b, 0x96, 0x2b, 0xb2, 0x42, 0xcc, 0x81, 0x28, 0xb1, 0xa5, 0xd8, 0x62, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x83, 0xe0, 0xe6, 0xc8, 0x69, 0xa1, 0xcd, 0x71, 0x92, 0x42, 0x36, 0x2b, 0x96, 0x13, 0x54, 0x1b, 0x38, 0x85, 0x9d, 0xce, 0x7c, 0xde, 0x7d, 0xce, 0x9d, 0x7d, 0x55, 0x13, 0xf8, 0x13, 0xb7, 0x03, 0x77, 0x0b, 0x77, 0x13, 0x97, 0x0b, 0xb7, 0x0b, 0xd8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x98, 0x13, 0x74, 0x1b, 0x11, 0x2b, 0x70, 0x52, 0x2e, 0x72, 0xcb, 0x81, 0x69, 0xa1, 0x07, 0xb9, 0xc5, 0xd0, 0x83, 0xd8, 0x62, 0xe8, 0x22, 0xf0, 0x22, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x61, 0xf8, 0x40, 0xe8, 0x41, 0xe8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x43, 0xf0, 0x85, 0xd8, 0x08, 0xb1, 0x8b, 0x91, 0xed, 0x79, 0x90, 0x52, 0x34, 0x2b, 0x76, 0x0b, 0x97, 0x03, 0x98, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x57, 0x0b, 0x56, 0x03, 0x76, 0x03, 0x56, 0x0b, 0x16, 0x13, 0x55, 0x3b, 0x9e, 0xce, 0x5b, 0xe6, 0x9b, 0xee, 0xfe, 0xde, 0x3a, 0x65, 0x96, 0x0b, 0x98, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x16, 0x1b, 0x91, 0x42, 0x4f, 0x5a, 0x2e, 0x5a, 0x2e, 0x62, 0x2d, 0x62, 0x2d, 0x62, 0xee, 0x61, 0xee, 0x69, 0xee, 0x71, 0xee, 0x71, 0x0d, 0x72, 0xec, 0x69, 0x0d, 0x72, 0x0d, 0x72, 0x0d, 0x6a, 0xed, 0x71, 0xcc, 0x79, 0x50, 0xbb, 0x8f, 0xdb, 0xef, 0xeb, 0xef, 0xeb, 0x10, 0xdc, 0xca, 0x79, 0xcc, 0x71, 0x8c, 0x61, 0xae, 0x69, 0xae, 0x69, 0x8e, 0x69, 0x6e, 0x69, 0x6e, 0x69, 0x8d, 0x69, 0x8d, 0x69, 0x8d, 0x69, 0x8d, 0x69, 0xad, 0x69, 0xad, 0x69, 0xcc, 0x69, 0x0f, 0x4a, 0x74, 0x1a, 0xb7, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x95, 0x02, 0x75, 0x02, 0x74, 0x12, 0x75, 0x4b, 0x9d, 0xce, 0x7b, 0xd6, 0xbd, 0xc6, 0xf8, 0x74, 0xd4, 0x12, 0xf7, 0x0a, 0x17, 0x0b, 0xf7, 0x0a, 0xd8, 0x02, 0xb8, 0x02, 0x99, 0x0a, 0x78, 0x12, 0x97, 0x12, 0x76, 0x22, 0x13, 0x42, 0xb0, 0x61, 0x2c, 0x89, 0xc9, 0xa8, 0x86, 0xc8, 0x63, 0xe0, 0x21, 0xf0, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x82, 0xf0, 0xc8, 0xe9, 0x0e, 0xc3, 0x0d, 0x62, 0x31, 0x3a, 0x54, 0x1a, 0x56, 0x12, 0x77, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0x97, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x0a, 0xf1, 0x11, 0x18, 0x9d, 0x7d, 0xc6, 0x56, 0x3b, 0x14, 0x02, 0xd4, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x34, 0x1b, 0x9b, 0x85, 0xfc, 0xd6, 0x3c, 0xef, 0x3c, 0xef, 0x7f, 0xdf, 0xf4, 0x1a, 0x18, 0x0b, 0x39, 0x0b, 0xd8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xb9, 0x02, 0xb9, 0x0a, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x0a, 0xb9, 0x0a, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xf9, 0x02, 0xb8, 0x02, 0x96, 0x0a, 0x32, 0x12, 0x7c, 0x8d, 0xfd, 0xde, 0x1c, 0xef, 0xfb, 0xe6, 0x5f, 0xdf, 0xd7, 0x3b, 0xf6, 0x2a, 0x93, 0x52, 0xad, 0x81, 0xa6, 0xc0, 0x42, 0xf0, 0x41, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x42, 0xf0, 0x22, 0xf0, 0x22, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x02, 0xf8, 0x03, 0xf8, 0x44, 0xe8, 0xc6, 0xc8, 0xac, 0x91, 0xd4, 0x42, 0x79, 0x1b, 0x9a, 0x13, 0x9a, 0x0b, 0x9b, 0x03, 0xbb, 0x03, 0xfb, 0x03, 0xd9, 0x03, 0x97, 0x03, 0x96, 0x03, 0x54, 0x13, 0xf5, 0x43, 0xdb, 0xa5, 0xde, 0xde, 0xbc, 0xe6, 0xdc, 0xf6, 0x78, 0xdd, 0x89, 0x99, 0x85, 0xe0, 0x03, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf0, 0x20, 0xf0, 0x21, 0xf0, 0x21, 0xf0, 0x41, 0xf0, 0x40, 0xe8, 0x41, 0xe8, 0x23, 0xf0, 0x65, 0xd8, 0xe7, 0xb0, 0x89, 0x91, 0xf0, 0xb3, 0x59, 0xe6, 0xfb, 0xe6, 0x3f, 0xcf, 0x3b, 0x65, 0x56, 0x13, 0xf8, 0x0b, 0xb8, 0x03, 0xd8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x98, 0x0b, 0xf3, 0x42, 0xaa, 0x99, 0xa5, 0xd0, 0x43, 0xe8, 0x21, 0xf8, 0x40, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x62, 0xf8, 0x62, 0xf8, 0x00, 0xf0, 0x00, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x63, 0xf0, 0xa5, 0xe0, 0x2a, 0xa9, 0x30, 0x5a, 0xd5, 0x2a, 0x37, 0x13, 0x58, 0x0b, 0x56, 0x0b, 0x57, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x17, 0x0b, 0x96, 0x33, 0xdc, 0xc6, 0xb9, 0xd6, 0xfa, 0xde, 0x5f, 0xd7, 0xb9, 0x54, 0x57, 0x13, 0x57, 0x13, 0x38, 0x13, 0x57, 0x1b, 0xb2, 0x4a, 0x6a, 0x91, 0xc5, 0xd0, 0x43, 0xe8, 0x22, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x02, 0xf8, 0x23, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x61, 0xf8, 0x00, 0xe8, 0x61, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x61, 0xf8, 0x41, 0xf8, 0x22, 0xf0, 0x22, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x03, 0xf8, 0x03, 0xf0, 0x23, 0xe8, 0xc8, 0xb0, 0xd1, 0x49, 0x56, 0x1a, 0x76, 0x12, 0x75, 0x0a, 0xb5, 0x0a, 0x94, 0x0a, 0x53, 0x1a, 0x76, 0x53, 0x7e, 0xd6, 0x7c, 0xd6, 0x9e, 0xc6, 0xf5, 0x5b, 0xd4, 0x1a, 0xf7, 0x12, 0x17, 0x0b, 0x16, 0x03, 0xf5, 0x0a, 0xb3, 0x1a, 0x50, 0x3a, 0xab, 0x71, 0x04, 0xb1, 0x81, 0xd8, 0x60, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0x20, 0xf0, 0x61, 0xf0, 0x60, 0xf0, 0x20, 0xe0, 0x60, 0xf0, 0x60, 0xf8, 0x40, 0xf8, 0x00, 0xf0, 0x21, 0xf8, 0x23, 0xf0, 0x26, 0xe0, 0xca, 0xa8, 0xcf, 0x51, 0x73, 0x1a, 0x74, 0x0a, 0x96, 0x02, 0x98, 0x02, 0x78, 0x02, 0x77, 0x0a, 0x57, 0x12, 0x37, 0x12, 0x37, 0x0a, 0x56, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x0a, 0xf1, 0x11, 0xf8, 0x94, 0x5d, 0xc6, 0x56, 0x3b, 0x14, 0x02, 0xd4, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x94, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, + 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x13, 0x35, 0x1b, 0x5a, 0x7d, 0xfd, 0xce, 0x3c, 0xef, 0x3c, 0xe7, 0x9f, 0xdf, 0xf5, 0x1a, 0x18, 0x0b, 0x39, 0x0b, 0xb8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xb9, 0x0a, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x0a, 0xb9, 0x0a, 0xb9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xd8, 0x02, 0xf9, 0x02, 0xd8, 0x02, 0x97, 0x0a, 0x53, 0x12, 0x7c, 0x8d, 0xdd, 0xd6, 0x1c, 0xe7, 0x1b, 0xdf, 0x7f, 0xcf, 0xd7, 0x33, 0xf5, 0x22, 0x72, 0x4a, 0x6b, 0x81, 0x85, 0xd8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf0, 0x61, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf0, 0xa3, 0xd0, 0xaa, 0x91, 0xf4, 0x3a, 0xb9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0x99, 0x0b, 0xb9, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x03, 0x16, 0x13, 0xf7, 0x4b, 0xfb, 0xa5, 0xba, 0xe6, 0x16, 0xfe, 0x0b, 0xe3, 0xa4, 0xe0, 0x43, 0xf8, 0x00, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x80, 0xf8, 0x40, 0xf0, 0x01, 0xf8, 0x22, 0xf8, 0x61, 0xf0, 0x44, 0xe9, 0xea, 0xe2, 0x56, 0xe5, 0x38, 0x7c, 0x37, 0x23, 0xda, 0x1b, 0x99, 0x03, 0xba, 0x0b, 0x79, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x7a, 0x0b, 0x9a, 0x0b, 0xd8, 0x03, 0x33, 0x33, 0x89, 0x99, 0x83, 0xd8, 0x42, 0xe8, 0x21, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf0, 0x41, 0xf0, 0x20, 0xf0, 0x40, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0x43, 0xe8, 0xc8, 0xc8, 0xae, 0x81, 0x74, 0x4a, 0x17, 0x1b, 0x78, 0x03, 0x56, 0x03, 0x35, 0x0b, 0x15, 0x0b, 0x54, 0x33, 0x7e, 0xce, 0x7b, 0xde, 0xf9, 0xde, 0x7d, 0xcf, 0xf8, 0x4c, 0xb6, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xf3, 0x2a, 0x69, 0x91, 0xa4, 0xd8, 0x43, 0xf0, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x61, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x01, 0xf0, 0x62, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0xe6, 0xb8, 0x10, 0x42, 0xb6, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0xb7, 0x0a, 0x95, 0x0a, 0x53, 0x12, 0x94, 0x53, 0x9b, 0xce, 0x99, 0xce, 0xdc, 0xbe, 0xf4, 0x43, 0x16, 0x0b, 0x18, 0x0b, 0xb6, 0x1a, 0x52, 0x3a, 0xcd, 0x71, 0x28, 0xa1, 0x84, 0xd0, 0x42, 0xf0, 0x42, 0xe8, 0x22, 0xf0, 0x22, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf0, 0x40, 0xf0, 0x40, 0xf8, 0x61, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x61, 0xf8, 0x61, 0xf8, 0x20, 0xe8, 0x41, 0xe8, 0xe7, 0xc0, 0x8f, 0x61, 0x15, 0x32, 0x57, 0x1a, 0x57, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x56, 0x0a, 0x36, 0x0a, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x0a, 0xf1, 0x11, 0xb7, 0x94, 0x7e, 0xc6, 0x96, 0x43, 0x13, 0x02, 0xf4, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x74, 0x01, 0x94, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, + 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x98, 0x13, 0x14, 0x1b, 0x1a, 0x75, 0x1d, 0xd7, 0x5c, 0xef, 0x1c, 0xe7, 0x7f, 0xd7, 0xf5, 0x1a, 0x18, 0x0b, 0x39, 0x0b, 0xb8, 0x02, 0xf9, 0x02, 0xf9, 0x0a, 0xb9, 0x02, 0x99, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x0a, 0xb9, 0x0a, 0xb9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xf9, 0x02, 0xd8, 0x02, 0xb7, 0x0a, 0x53, 0x12, 0x9d, 0x8d, 0xbe, 0xce, 0x1d, 0xe7, 0x5c, 0xe7, 0x9f, 0xdf, 0x18, 0x44, 0xd5, 0x2a, 0x91, 0x52, 0x6b, 0x81, 0x84, 0xd8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x41, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf0, 0x41, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x61, 0xe8, 0xc3, 0xc8, 0xaa, 0x91, 0xd5, 0x3a, 0x9a, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xd7, 0x03, 0xb7, 0x03, 0x78, 0x13, 0x57, 0x13, 0x36, 0x0b, 0x17, 0x4c, 0xda, 0xc5, 0x15, 0xf5, 0x04, 0xc9, 0xa2, 0xf0, 0x21, 0xe8, 0x01, 0xf0, 0xa2, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x61, 0xf8, 0x01, 0xf8, 0xc6, 0xc0, 0xf3, 0x6b, 0xd5, 0x13, 0x18, 0x14, 0x98, 0x03, 0xd9, 0x03, 0x78, 0x03, 0xb9, 0x0b, 0x78, 0x0b, 0x79, 0x0b, 0x79, 0x13, 0x99, 0x13, 0xd3, 0x42, 0x49, 0xa9, 0x83, 0xe0, 0x42, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x63, 0xe8, 0x06, 0xb9, 0x0b, 0x72, 0xd1, 0x3a, 0x36, 0x13, 0x38, 0x03, 0xd7, 0x12, 0xf4, 0x3a, 0x7b, 0xce, 0x99, 0xde, 0xfc, 0xde, 0x1f, 0xcf, 0xd9, 0x64, 0x96, 0x23, 0x77, 0x0b, 0x98, 0x03, 0xd8, 0x03, 0xf3, 0x32, 0x49, 0x91, 0x84, 0xd8, 0x22, 0xf0, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x00, 0xf0, 0x60, 0xf8, 0x21, 0xf0, 0x01, 0xf0, 0x02, 0xf8, 0x02, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf0, 0x41, 0xf0, 0xe6, 0xb0, 0x12, 0x42, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x54, 0x0a, 0x73, 0x12, 0x93, 0x12, 0xd6, 0x53, 0x7d, 0xce, 0x7c, 0xce, 0xdf, 0xbe, 0xd6, 0x4b, 0xd5, 0x12, 0xb4, 0x3a, 0xad, 0x71, 0xe7, 0xb0, 0x83, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf0, 0x81, 0xf0, 0x60, 0xf0, 0x40, 0xf8, 0x20, 0xf0, 0x83, 0xd0, 0x29, 0x99, 0x11, 0x3a, 0x75, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x55, 0x02, 0x35, 0x02, 0xf1, 0x11, 0x96, 0x8c, 0x9e, 0xce, 0xb7, 0x4b, 0xd3, 0x01, 0xd4, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x74, 0x01, 0x94, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0x9a, 0x0b, 0xba, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0xb8, 0x0b, 0x14, 0x13, 0x1a, 0x75, 0x3e, 0xd7, 0x1c, 0xe7, 0x3d, 0xe7, 0x5f, 0xd7, 0x15, 0x23, 0x18, 0x0b, 0xf8, 0x0a, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xba, 0x02, 0xba, 0x0a, 0x99, 0x0a, 0x99, 0x0a, 0x99, 0x0a, 0x99, 0x0a, 0xb9, 0x0a, 0xda, 0x0a, 0xba, 0x0a, 0x99, 0x02, 0xb9, 0x0a, 0x99, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb8, 0x02, 0xb7, 0x0a, 0x53, 0x0a, 0x1c, 0x7d, 0xde, 0xd6, 0x1d, 0xe7, 0x3d, 0xe7, 0xbf, 0xdf, 0xd5, 0x3b, 0xf3, 0x2a, 0xd2, 0x5a, 0x6b, 0x81, 0x84, 0xd0, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x61, 0xf0, 0x40, 0xf0, 0x60, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x01, 0xf0, 0x22, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf0, 0x60, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x42, 0xf0, 0xa4, 0xd0, 0x6b, 0x91, 0xf4, 0x3a, 0xb9, 0x03, 0xd8, 0x03, 0x18, 0x04, 0xb8, 0x03, 0xf9, 0x0b, 0xd8, 0x0b, 0x97, 0x03, 0x78, 0x0b, 0x58, 0x13, 0xf6, 0x12, 0xd7, 0x73, 0xb1, 0xe3, 0x24, 0xe1, 0x40, 0xe8, 0x40, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf0, 0x41, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0xc5, 0xc0, 0xb3, 0x73, 0xd6, 0x1b, 0x18, 0x14, 0x97, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x97, 0x03, 0xd3, 0x3a, 0x6b, 0xa1, 0x65, 0xe0, 0x22, 0xf0, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf0, 0x60, 0xf0, 0x40, 0xf0, 0x20, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x60, 0xf0, 0x40, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x40, 0xf0, 0x40, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf0, 0x63, 0xe8, 0x28, 0xa9, 0x72, 0x42, 0x58, 0x1b, 0xd6, 0x12, 0xf3, 0x2a, 0xbc, 0xc6, 0x99, 0xde, 0x99, 0xee, 0x1e, 0xdf, 0x3a, 0x5d, 0xb7, 0x0b, 0xb7, 0x03, 0xb7, 0x03, 0x99, 0x03, 0xf5, 0x32, 0x6b, 0x91, 0x84, 0xd0, 0x42, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x00, 0xf0, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x60, 0xf0, 0x60, 0xf0, 0x41, 0xf0, 0xc7, 0xc0, 0x11, 0x4a, 0xb6, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x95, 0x0a, 0x94, 0x0a, 0x53, 0x12, 0x38, 0x6c, 0x9c, 0xd6, 0x9a, 0xde, 0x1d, 0xd7, 0x59, 0x85, 0xf4, 0x12, 0x94, 0x32, 0x6c, 0x71, 0xe8, 0xb8, 0x42, 0xe8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x83, 0xe0, 0x29, 0xa1, 0x8e, 0x59, 0x13, 0x1a, 0x76, 0x02, 0x56, 0x02, 0x36, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0x34, 0x02, 0x32, 0x12, 0x77, 0x7c, 0x7e, 0xc6, 0x18, 0x5c, 0xd2, 0x01, 0xf4, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0x94, 0x01, 0x95, 0x01, 0x74, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb4, 0x01, + 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x97, 0x0b, 0x35, 0x13, 0x3a, 0x75, 0x3e, 0xd7, 0x1c, 0xe7, 0x3d, 0xef, 0x3f, 0xd7, 0xf5, 0x22, 0xf8, 0x0a, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xba, 0x02, 0xba, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xda, 0x02, 0xda, 0x02, 0xb9, 0x02, 0xb9, 0x0a, 0xb9, 0x02, 0xd9, 0x0a, 0xb9, 0x02, 0xd8, 0x02, 0x96, 0x0a, 0x33, 0x0a, 0x1b, 0x7d, 0xde, 0xd6, 0x1d, 0xef, 0x3d, 0xe7, 0x3a, 0xb6, 0x11, 0x33, 0x2f, 0x22, 0xed, 0x49, 0x4a, 0x81, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x20, 0xf0, 0x40, 0xf0, 0x60, 0xf0, 0x40, 0xf0, 0x20, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x43, 0xe8, 0xa6, 0xd0, 0x8c, 0x91, 0xf6, 0x3a, 0x9a, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0xf9, 0x13, 0x77, 0x03, 0x99, 0x0b, 0x37, 0x13, 0x14, 0x33, 0xb0, 0x7a, 0x27, 0xc1, 0x20, 0xe0, 0x40, 0xf0, 0x40, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x22, 0xf8, 0x23, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x20, 0xf0, 0x01, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0xe6, 0xc0, 0xf6, 0x8b, 0x75, 0x1b, 0xd8, 0x13, 0xb8, 0x0b, 0x99, 0x0b, 0x58, 0x03, 0x99, 0x03, 0x79, 0x0b, 0x77, 0x13, 0x35, 0x13, 0xd3, 0x02, 0x2f, 0x3a, 0x08, 0xa1, 0x63, 0xe0, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x20, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0xa4, 0xd0, 0x49, 0x99, 0x0e, 0x62, 0xf3, 0x22, 0x53, 0x1b, 0xbd, 0xbe, 0xdb, 0xde, 0xdb, 0xd6, 0x3f, 0xcf, 0xb9, 0x54, 0x76, 0x13, 0x13, 0x0b, 0xb2, 0x02, 0x92, 0x02, 0xee, 0x31, 0x07, 0xa1, 0x62, 0xe0, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0x42, 0xf0, 0x21, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0xc8, 0xb8, 0x11, 0x42, 0xb7, 0x02, 0xb7, 0x02, 0xd6, 0x02, 0x75, 0x02, 0x95, 0x0a, 0x53, 0x1a, 0x9a, 0x7c, 0x7c, 0xd6, 0xbb, 0xde, 0x3e, 0xdf, 0xfc, 0x95, 0x93, 0x0a, 0x52, 0x2a, 0x4b, 0x71, 0x08, 0xb9, 0x63, 0xe0, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x23, 0xf8, 0x45, 0xe8, 0xc9, 0xa8, 0xd1, 0x41, 0x75, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0x55, 0x02, 0x54, 0x02, 0x32, 0x12, 0x35, 0x74, 0x9f, 0xc6, 0xf8, 0x5b, 0xf2, 0x09, 0xd4, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0x95, 0x01, 0x74, 0x01, 0x94, 0x01, 0x95, 0x01, 0x94, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x94, 0x01, + 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x35, 0x1b, 0x5b, 0x7d, 0x1d, 0xd7, 0x1c, 0xe7, 0x5d, 0xef, 0x1f, 0xd7, 0xf5, 0x22, 0xf8, 0x0a, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xba, 0x0a, 0xb9, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xb8, 0x02, 0xd9, 0x02, 0xfa, 0x02, 0xd9, 0x02, 0xb9, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xd9, 0x0a, 0xb8, 0x02, 0xd8, 0x0a, 0x96, 0x0a, 0x32, 0x12, 0x3b, 0x85, 0xbd, 0xd6, 0xfc, 0xee, 0x1c, 0xef, 0x72, 0x8c, 0x4c, 0x32, 0x29, 0x19, 0xc7, 0x38, 0xe7, 0x88, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x60, 0xf8, 0x60, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x61, 0xe8, 0xc4, 0xd0, 0x8a, 0x99, 0x14, 0x3b, 0x99, 0x0b, 0x57, 0x0b, 0x77, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x78, 0x03, 0x35, 0x23, 0x6f, 0x62, 0x48, 0x99, 0x83, 0xd8, 0x20, 0xf8, 0x61, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x20, 0xf0, 0x00, 0xf0, 0x41, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0x41, 0xf8, 0x22, 0xf8, 0x86, 0xb8, 0x78, 0x9c, 0x75, 0x1b, 0xd7, 0x0b, 0xd8, 0x03, 0x97, 0x03, 0x78, 0x03, 0x79, 0x13, 0x17, 0x13, 0x10, 0x02, 0x8d, 0x01, 0x6b, 0x01, 0x08, 0x31, 0x84, 0xa0, 0x41, 0xe0, 0x40, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x40, 0xf0, 0x20, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x61, 0xf8, 0x20, 0xf0, 0x00, 0xf0, 0x00, 0xf8, 0x40, 0xf8, 0x60, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x42, 0xe8, 0xc6, 0xb0, 0x90, 0x5a, 0xd1, 0x2a, 0x5c, 0xc6, 0xbc, 0xde, 0xbb, 0xce, 0x1f, 0xc7, 0x77, 0x44, 0x74, 0x1b, 0x8f, 0x0a, 0xab, 0x01, 0x6b, 0x01, 0xe8, 0x30, 0x84, 0xa8, 0x62, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x42, 0xf0, 0xe7, 0xb0, 0x12, 0x3a, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0x96, 0x0a, 0x75, 0x12, 0x12, 0x1a, 0xda, 0x84, 0x9c, 0xd6, 0xbc, 0xde, 0xdd, 0xce, 0x39, 0x85, 0xb2, 0x1a, 0x30, 0x32, 0x2a, 0x79, 0xe7, 0xc0, 0x63, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x65, 0xd8, 0x2c, 0x81, 0xd1, 0x41, 0x33, 0x1a, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0x55, 0x02, 0x75, 0x0a, 0x11, 0x12, 0x15, 0x74, 0xbf, 0xce, 0xf8, 0x5b, 0xd2, 0x09, 0xd4, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, + 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x97, 0x0b, 0x34, 0x1b, 0x5a, 0x7d, 0xdd, 0xce, 0x1c, 0xe7, 0x5d, 0xef, 0x1f, 0xcf, 0xf5, 0x22, 0x18, 0x0b, 0xf9, 0x0a, 0xf9, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xb9, 0x0a, 0xba, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xd9, 0x02, 0xd9, 0x02, 0xb8, 0x0a, 0xd8, 0x0a, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x0a, 0x96, 0x0a, 0x73, 0x12, 0x7c, 0x8d, 0xdd, 0xd6, 0x1c, 0xef, 0x1c, 0xef, 0xf0, 0x83, 0x4b, 0x3a, 0xe6, 0x20, 0x64, 0x38, 0xe5, 0x90, 0x82, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf0, 0x40, 0xf8, 0x60, 0xe8, 0xc3, 0xd8, 0x8a, 0x99, 0x14, 0x3b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xda, 0x13, 0x79, 0x0b, 0x99, 0x13, 0x97, 0x03, 0x12, 0x33, 0x69, 0x99, 0x83, 0xd8, 0x82, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf0, 0x40, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf0, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x61, 0xf8, 0x60, 0xf0, 0x40, 0xf0, 0x40, 0xf8, 0x21, 0xf8, 0xa6, 0xc8, 0x58, 0x9c, 0x36, 0x1b, 0x98, 0x13, 0x99, 0x0b, 0x57, 0x03, 0x97, 0x03, 0xf7, 0x03, 0xd5, 0x0b, 0x2e, 0x02, 0x6a, 0x09, 0x29, 0x09, 0xc7, 0x38, 0xa4, 0xa8, 0x82, 0xe8, 0x60, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x60, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf0, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x40, 0xf0, 0x41, 0xf8, 0x44, 0xd8, 0x6b, 0xa1, 0x8b, 0x69, 0x19, 0xde, 0x99, 0xde, 0x9a, 0xd6, 0xfe, 0xc6, 0x15, 0x34, 0x94, 0x13, 0x8f, 0x02, 0xcb, 0x01, 0x69, 0x01, 0xc6, 0x30, 0x64, 0x98, 0x43, 0xe0, 0x22, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0xe6, 0xb0, 0x11, 0x3a, 0x96, 0x02, 0x96, 0x0a, 0x97, 0x12, 0x76, 0x0a, 0x76, 0x1a, 0x32, 0x22, 0xfa, 0x8c, 0x9c, 0xce, 0xdc, 0xd6, 0x3e, 0xcf, 0x59, 0x8d, 0xee, 0x19, 0x4b, 0x31, 0x66, 0x78, 0xa5, 0xc8, 0x63, 0xe8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x60, 0xf0, 0x80, 0xf0, 0x60, 0xf0, 0x60, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x20, 0xf0, 0x02, 0xf8, 0x02, 0xf8, 0x20, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x41, 0xf8, 0x41, 0xf8, 0x63, 0xe8, 0x86, 0xc8, 0x0a, 0x89, 0xd2, 0x31, 0x56, 0x0a, 0x76, 0x0a, 0x96, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0x75, 0x0a, 0x11, 0x0a, 0x35, 0x74, 0x9f, 0xc6, 0x38, 0x64, 0xb1, 0x01, 0x14, 0x0a, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xda, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x77, 0x0b, 0x34, 0x1b, 0x7a, 0x7d, 0xdd, 0xce, 0x3c, 0xe7, 0x5d, 0xef, 0xff, 0xce, 0x15, 0x23, 0x39, 0x13, 0x19, 0x0b, 0x19, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xb9, 0x0a, 0xb9, 0x02, 0xb9, 0x0a, 0xb9, 0x0a, 0xb9, 0x0a, 0xb9, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xd9, 0x0a, 0xb8, 0x0a, 0xb8, 0x0a, 0xb8, 0x02, 0xb9, 0x02, 0xd8, 0x0a, 0xb6, 0x0a, 0x74, 0x12, 0x5c, 0x85, 0xfd, 0xce, 0x1c, 0xe7, 0x1d, 0xef, 0x11, 0x8c, 0x6b, 0x4a, 0xe6, 0x28, 0x84, 0x40, 0xe5, 0x90, 0x82, 0xe0, 0x00, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x42, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x43, 0xe8, 0xa6, 0xd0, 0x8b, 0x99, 0xd4, 0x42, 0x78, 0x13, 0x99, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xba, 0x13, 0x78, 0x13, 0x75, 0x1b, 0x0d, 0x4a, 0xc5, 0xc8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf0, 0x21, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x03, 0xe8, 0x23, 0xc8, 0xa4, 0xa0, 0xc3, 0x90, 0xc3, 0x98, 0xa3, 0xa0, 0xa2, 0xb0, 0x81, 0xc8, 0x41, 0xe0, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x00, 0xe8, 0x80, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0xc6, 0xc0, 0xf5, 0x83, 0x55, 0x0b, 0xd7, 0x0b, 0xf8, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x98, 0x03, 0xf8, 0x1b, 0x4f, 0x02, 0x8a, 0x01, 0x29, 0x01, 0x86, 0x30, 0x83, 0xa0, 0x61, 0xe0, 0x21, 0xf0, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x62, 0xe8, 0x41, 0xd0, 0xc2, 0xd0, 0xe3, 0xc8, 0xe4, 0xc0, 0x05, 0xb9, 0xe5, 0xa0, 0xa4, 0x88, 0xe4, 0x88, 0xa4, 0x88, 0x84, 0xa8, 0x44, 0xc0, 0x03, 0xe8, 0x03, 0xf8, 0x23, 0xf8, 0x42, 0xf8, 0x22, 0xf8, 0x42, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x22, 0xf8, 0x23, 0xe8, 0xa5, 0xd0, 0xe6, 0xa0, 0xf8, 0xfd, 0x99, 0xe6, 0xba, 0xde, 0xfd, 0xc6, 0x36, 0x34, 0xb5, 0x13, 0x90, 0x02, 0xab, 0x01, 0x69, 0x01, 0xe7, 0x30, 0xc5, 0x90, 0x85, 0xd8, 0x42, 0xf0, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x42, 0xf0, 0xe7, 0xb8, 0x10, 0x42, 0x95, 0x0a, 0x96, 0x12, 0x96, 0x12, 0xb6, 0x02, 0x94, 0x0a, 0x30, 0x22, 0x39, 0x95, 0xdd, 0xde, 0x9b, 0xd6, 0xb8, 0xad, 0x4c, 0x3a, 0x09, 0x09, 0x87, 0x20, 0x23, 0x70, 0xa4, 0xc8, 0x62, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x20, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x42, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf0, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x21, 0xf0, 0x42, 0xf0, 0x61, 0xe8, 0xc6, 0xb0, 0xd0, 0x41, 0x35, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x74, 0x0a, 0x31, 0x12, 0x35, 0x74, 0x7e, 0xc6, 0x38, 0x5c, 0xb1, 0x01, 0x15, 0x0a, 0xd5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xf9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x97, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xd8, 0x0b, 0xb8, 0x03, 0xd8, 0x03, 0xf9, 0x0b, 0xf9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xb8, 0x03, 0x76, 0x0b, 0x34, 0x13, 0x9b, 0x85, 0xfd, 0xd6, 0x3c, 0xef, 0x5d, 0xef, 0x1f, 0xcf, 0x15, 0x23, 0x58, 0x0b, 0x39, 0x0b, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf9, 0x02, 0xd9, 0x0a, 0xb9, 0x0a, 0xb9, 0x0a, 0xb8, 0x0a, 0xb8, 0x02, 0xb9, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0x98, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0x96, 0x0a, 0x54, 0x0a, 0xda, 0x74, 0xfd, 0xce, 0xfc, 0xde, 0xfc, 0xe6, 0x32, 0x8c, 0x4b, 0x42, 0xe5, 0x20, 0x84, 0x40, 0xc5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x60, 0xf0, 0x62, 0xc8, 0x43, 0xa8, 0x84, 0xa0, 0x85, 0x98, 0x44, 0xa0, 0x44, 0xa8, 0x44, 0xa8, 0x64, 0xb0, 0x63, 0xa8, 0x43, 0xa8, 0xe4, 0xc0, 0xe4, 0xc8, 0xe4, 0xc8, 0xe4, 0xc8, 0xe3, 0xb0, 0xc2, 0xa8, 0xa3, 0xa8, 0x63, 0xa8, 0x43, 0xb0, 0x64, 0xb0, 0x85, 0xa0, 0xc7, 0xa0, 0x6a, 0x99, 0x8c, 0x89, 0xcd, 0x79, 0x4f, 0x5a, 0x34, 0x2b, 0x77, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x57, 0x03, 0xb9, 0x0b, 0x35, 0x1b, 0x0e, 0x32, 0x48, 0x71, 0xa4, 0xd8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x43, 0xe0, 0x84, 0xa8, 0xa6, 0x70, 0x08, 0x39, 0x09, 0x21, 0x0a, 0x11, 0x2b, 0x11, 0x4a, 0x01, 0x4a, 0x01, 0x2a, 0x11, 0x29, 0x19, 0x28, 0x21, 0x27, 0x39, 0xe7, 0x58, 0x85, 0x80, 0x84, 0xc0, 0x21, 0xd8, 0x42, 0xe8, 0x62, 0xf8, 0x40, 0xf0, 0x41, 0xf0, 0x61, 0xf8, 0xe6, 0xb8, 0xd4, 0x83, 0x54, 0x1b, 0xb7, 0x1b, 0x77, 0x0b, 0x58, 0x0b, 0xdb, 0x13, 0x79, 0x03, 0x57, 0x0b, 0x2f, 0x02, 0x8a, 0x01, 0x6a, 0x01, 0xc7, 0x30, 0xc4, 0xa0, 0x82, 0xe8, 0x42, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0x82, 0xd8, 0x62, 0x90, 0xc7, 0x69, 0x6b, 0x5a, 0x8b, 0x5a, 0x8c, 0x52, 0x09, 0x2a, 0x67, 0x09, 0xa9, 0x01, 0x89, 0x01, 0x89, 0x09, 0x47, 0x09, 0x45, 0x09, 0x24, 0x31, 0xa3, 0x80, 0x82, 0xb8, 0x61, 0xe0, 0x41, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x61, 0xe8, 0xe3, 0xc0, 0x36, 0xfd, 0x7b, 0xe6, 0xda, 0xd6, 0xfc, 0xbe, 0x57, 0x3c, 0x76, 0x1b, 0x50, 0x0a, 0x2b, 0x01, 0x49, 0x01, 0x28, 0x21, 0x08, 0x59, 0xe7, 0x88, 0x85, 0x98, 0x64, 0xa0, 0x83, 0xa0, 0x82, 0xa0, 0x82, 0xa0, 0x83, 0xa0, 0x84, 0xa0, 0x84, 0xa0, 0xa3, 0xa0, 0x83, 0xa0, 0x84, 0xa0, 0x64, 0xa8, 0x63, 0xa8, 0x63, 0xa0, 0xa2, 0xa0, 0xa2, 0xa8, 0xc4, 0xc0, 0xc4, 0xc8, 0xc5, 0xc8, 0xc5, 0xc0, 0x61, 0xa0, 0x61, 0xb8, 0x20, 0xe8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x61, 0xe8, 0x85, 0xd0, 0x0a, 0x99, 0x11, 0x3a, 0x95, 0x0a, 0x96, 0x0a, 0xb6, 0x02, 0xd6, 0x02, 0xb4, 0x0a, 0x50, 0x22, 0x39, 0x9d, 0x7c, 0xde, 0x5a, 0xde, 0x77, 0xbd, 0x2a, 0x42, 0x27, 0x09, 0xc6, 0x20, 0x84, 0x70, 0xe4, 0xc0, 0x41, 0xe8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x22, 0xf0, 0x43, 0xd8, 0x63, 0xb0, 0x84, 0x78, 0xa4, 0x50, 0xc5, 0x30, 0xc6, 0x20, 0x07, 0x21, 0xe7, 0x28, 0xe5, 0x40, 0xc4, 0x68, 0x62, 0x98, 0xa4, 0xd0, 0x43, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0xa4, 0xc8, 0x8d, 0x61, 0x13, 0x22, 0x55, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x54, 0x02, 0x52, 0x12, 0xd4, 0x63, 0x5e, 0xbe, 0xf7, 0x53, 0xd1, 0x01, 0xf4, 0x09, 0xd5, 0x01, 0xb4, 0x01, 0x94, 0x01, 0xb5, 0x01, 0xb5, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x94, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0xd8, 0x13, 0xb7, 0x13, 0xb7, 0x13, 0xb7, 0x13, 0xf7, 0x1b, 0x18, 0x24, 0x39, 0x2c, 0x59, 0x2c, 0x39, 0x24, 0x59, 0x2c, 0x59, 0x24, 0x39, 0x24, 0x18, 0x1c, 0xd8, 0x13, 0xd7, 0x0b, 0xb7, 0x0b, 0x97, 0x03, 0x76, 0x0b, 0x34, 0x1b, 0xbb, 0x85, 0xfd, 0xd6, 0x3c, 0xe7, 0x3c, 0xe7, 0x3f, 0xcf, 0x14, 0x23, 0x38, 0x0b, 0x58, 0x0b, 0x59, 0x0b, 0x79, 0x03, 0x59, 0x03, 0x38, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xf8, 0x02, 0xb6, 0x0a, 0x73, 0x12, 0x58, 0x64, 0x1d, 0xd7, 0x1b, 0xe7, 0x1e, 0xe7, 0x33, 0x84, 0x4b, 0x42, 0x06, 0x29, 0xa5, 0x40, 0xe6, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xe8, 0xa4, 0xc0, 0xc6, 0x70, 0xa6, 0x30, 0x08, 0x11, 0x49, 0x09, 0x08, 0x09, 0x08, 0x09, 0xe8, 0x08, 0x08, 0x09, 0x28, 0x09, 0x07, 0x09, 0x8c, 0x42, 0xcc, 0x4a, 0xeb, 0x52, 0xeb, 0x4a, 0x69, 0x2a, 0xa8, 0x09, 0xaa, 0x09, 0x6a, 0x09, 0x6a, 0x09, 0x8a, 0x09, 0x8a, 0x01, 0x6f, 0x0a, 0x76, 0x1b, 0x97, 0x13, 0x76, 0x13, 0x96, 0x0b, 0xd7, 0x03, 0xd8, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x03, 0xb7, 0x0b, 0x76, 0x13, 0x71, 0x22, 0xc6, 0x50, 0xe5, 0xa8, 0x83, 0xe0, 0x01, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf0, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xe8, 0xa3, 0xc8, 0x03, 0x81, 0x84, 0x29, 0xc6, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xa8, 0x09, 0x88, 0x09, 0x68, 0x09, 0x68, 0x01, 0x6a, 0x01, 0x4b, 0x01, 0x0b, 0x11, 0x0b, 0x11, 0x6a, 0x09, 0x89, 0x09, 0x47, 0x11, 0x05, 0x39, 0xa4, 0x78, 0xa3, 0xb8, 0x61, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0xa5, 0xc0, 0x57, 0x94, 0x56, 0x1b, 0x99, 0x13, 0x99, 0x0b, 0x58, 0x0b, 0x1a, 0x24, 0xd7, 0x13, 0x54, 0x13, 0x2e, 0x02, 0x6a, 0x01, 0x8a, 0x09, 0xc6, 0x30, 0xc4, 0xa8, 0x62, 0xe0, 0x01, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x42, 0xe8, 0xa3, 0xc8, 0x42, 0x80, 0xc7, 0x69, 0x8b, 0x5a, 0x8b, 0x5a, 0xac, 0x5a, 0xca, 0x31, 0x07, 0x11, 0x49, 0x09, 0x4a, 0x01, 0x4b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0x69, 0x01, 0x47, 0x09, 0x06, 0x31, 0xa6, 0x78, 0x86, 0xb8, 0x63, 0xd8, 0x21, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0xc3, 0xd8, 0x6f, 0xe3, 0x19, 0xf6, 0xba, 0xde, 0xfc, 0xbe, 0x36, 0x44, 0x34, 0x23, 0x50, 0x1a, 0x6b, 0x09, 0xa9, 0x01, 0x89, 0x09, 0x48, 0x11, 0x28, 0x11, 0x28, 0x19, 0x28, 0x11, 0x48, 0x09, 0x67, 0x09, 0x68, 0x01, 0x88, 0x01, 0x89, 0x01, 0x89, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0x89, 0x01, 0x6a, 0x01, 0x49, 0x09, 0x48, 0x01, 0xa7, 0x09, 0xc7, 0x19, 0x6a, 0x42, 0x8b, 0x52, 0x8b, 0x52, 0x6a, 0x52, 0x03, 0x39, 0x03, 0x71, 0x83, 0xc8, 0x22, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0xa4, 0xc8, 0x4b, 0x89, 0xd0, 0x51, 0x34, 0x22, 0x96, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0x95, 0x02, 0x73, 0x0a, 0x0f, 0x12, 0x7a, 0x9d, 0xdd, 0xde, 0xbc, 0xe6, 0x97, 0xbd, 0xe9, 0x39, 0x48, 0x09, 0xc6, 0x20, 0x84, 0x70, 0xc4, 0xc0, 0x41, 0xe8, 0x21, 0xf8, 0x63, 0xf0, 0x43, 0xe8, 0x43, 0xe0, 0x44, 0xb8, 0x85, 0x70, 0xc6, 0x38, 0xc8, 0x10, 0xea, 0x08, 0x0a, 0x09, 0x0a, 0x09, 0x49, 0x01, 0x28, 0x01, 0x48, 0x01, 0x07, 0x01, 0x28, 0x09, 0xe8, 0x08, 0xc8, 0x10, 0x8a, 0x59, 0x47, 0xa9, 0xc4, 0xd0, 0x43, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x84, 0xd8, 0x2a, 0x91, 0x8f, 0x51, 0x13, 0x1a, 0x76, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x54, 0x02, 0x52, 0x12, 0xb3, 0x63, 0x7e, 0xc6, 0x38, 0x64, 0xd2, 0x09, 0xd3, 0x01, 0xd4, 0x01, 0xb4, 0x01, 0x94, 0x01, 0xb4, 0x01, 0xb5, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x94, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, + 0x18, 0x34, 0x38, 0x3c, 0x59, 0x44, 0x7a, 0x4c, 0x9a, 0x4c, 0x79, 0x4c, 0x38, 0x44, 0x38, 0x44, 0x17, 0x3c, 0x38, 0x44, 0x59, 0x44, 0x59, 0x44, 0x59, 0x3c, 0x39, 0x3c, 0x18, 0x2c, 0xf8, 0x2b, 0xb7, 0x0b, 0x97, 0x13, 0x34, 0x1b, 0x9b, 0x85, 0xfc, 0xd6, 0x1b, 0xe7, 0x3c, 0xe7, 0x7f, 0xd7, 0x34, 0x1b, 0x58, 0x0b, 0x58, 0x03, 0x99, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x79, 0x0b, 0x58, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x59, 0x03, 0x59, 0x0b, 0x38, 0x0b, 0x18, 0x0b, 0x18, 0x03, 0x39, 0x0b, 0x18, 0x0b, 0xf7, 0x12, 0xb4, 0x1a, 0x78, 0x64, 0x1c, 0xd7, 0xfb, 0xe6, 0x3e, 0xe7, 0xf3, 0x7b, 0x2b, 0x3a, 0x07, 0x21, 0xa5, 0x38, 0x06, 0x89, 0x63, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0xa3, 0xe0, 0xa5, 0x78, 0x86, 0x30, 0x09, 0x09, 0x6b, 0x01, 0x49, 0x09, 0x49, 0x09, 0x49, 0x01, 0x49, 0x01, 0x48, 0x01, 0x07, 0x01, 0xad, 0x4a, 0xac, 0x5a, 0xcb, 0x62, 0xaa, 0x52, 0x8b, 0x42, 0x68, 0x11, 0x8a, 0x11, 0x8b, 0x09, 0xaa, 0x09, 0xaa, 0x01, 0xaa, 0x01, 0xf1, 0x12, 0xd9, 0x23, 0xda, 0x1b, 0xd9, 0x1b, 0xd8, 0x1b, 0xf8, 0x1b, 0xf8, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0xf8, 0x0b, 0x39, 0x24, 0xb6, 0x2b, 0x4b, 0x21, 0x83, 0x68, 0xe3, 0xc0, 0x83, 0xe8, 0x42, 0xf0, 0x21, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x60, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x83, 0xe0, 0x84, 0x98, 0xc7, 0x58, 0x09, 0x29, 0x6b, 0x11, 0xad, 0x11, 0xad, 0x11, 0x8a, 0x19, 0x68, 0x11, 0x87, 0x09, 0xa8, 0x09, 0x8a, 0x09, 0x8b, 0x09, 0x8a, 0x01, 0x6a, 0x01, 0x88, 0x01, 0x68, 0x01, 0x69, 0x01, 0x69, 0x09, 0x47, 0x11, 0xe4, 0x28, 0x51, 0xcc, 0xab, 0xda, 0xe5, 0xe0, 0xe6, 0xc0, 0xb8, 0xac, 0xf1, 0x1a, 0xb4, 0x13, 0x57, 0x24, 0xb5, 0x13, 0xd7, 0x23, 0xd7, 0x2b, 0x59, 0x44, 0x2e, 0x12, 0x6a, 0x01, 0x6a, 0x09, 0xa5, 0x28, 0xa3, 0xa0, 0x81, 0xe0, 0x21, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x40, 0xf0, 0x40, 0xf8, 0x01, 0xf8, 0x43, 0xe8, 0xe5, 0xc8, 0x62, 0x70, 0x28, 0x5a, 0xca, 0x4a, 0x8b, 0x52, 0xab, 0x4a, 0x2a, 0x2a, 0x88, 0x09, 0xc9, 0x09, 0x89, 0x01, 0x28, 0x01, 0x29, 0x09, 0x49, 0x01, 0x4a, 0x01, 0x49, 0x01, 0x29, 0x01, 0x29, 0x09, 0xc6, 0x38, 0xe4, 0xb0, 0x60, 0xe0, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x02, 0xf0, 0x02, 0xf8, 0x43, 0xe8, 0xe8, 0xd1, 0xd7, 0xfd, 0x9a, 0xf6, 0x1e, 0xd7, 0xb8, 0x44, 0x74, 0x13, 0x6f, 0x12, 0x69, 0x01, 0x87, 0x01, 0xc7, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x4a, 0x09, 0x4a, 0x01, 0x29, 0x09, 0x0a, 0x11, 0x0b, 0x11, 0x2a, 0x09, 0x29, 0x01, 0x68, 0x11, 0xc8, 0x21, 0xab, 0x42, 0xab, 0x4a, 0x6a, 0x5a, 0x2a, 0x8a, 0x43, 0xa0, 0x84, 0xe0, 0x82, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x62, 0xe8, 0x06, 0xb1, 0xef, 0x49, 0x94, 0x12, 0x77, 0x0a, 0x77, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x55, 0x12, 0x54, 0x1a, 0xef, 0x19, 0xdc, 0x9d, 0x9c, 0xc6, 0x9b, 0xce, 0x76, 0xad, 0x2a, 0x3a, 0x27, 0x09, 0x86, 0x20, 0x24, 0x70, 0xa4, 0xc8, 0x42, 0xf0, 0x41, 0xf0, 0x42, 0xd0, 0x43, 0x88, 0xa5, 0x30, 0x08, 0x11, 0x08, 0x01, 0x08, 0x01, 0x08, 0x09, 0x28, 0x09, 0x28, 0x01, 0x08, 0x01, 0x08, 0x01, 0xe9, 0x00, 0x0a, 0x09, 0xea, 0x00, 0x49, 0x01, 0x07, 0x01, 0xe5, 0x10, 0x29, 0x4a, 0x69, 0x62, 0xe6, 0x89, 0xc3, 0xc8, 0x42, 0xf0, 0x22, 0xf0, 0x21, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x83, 0xe0, 0xe9, 0xa8, 0x6d, 0x69, 0x13, 0x22, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x74, 0x0a, 0x52, 0x12, 0xd4, 0x63, 0x7e, 0xc6, 0xdb, 0x74, 0xf2, 0x09, 0xf4, 0x01, 0xd4, 0x01, 0xb4, 0x01, 0x94, 0x01, 0xb4, 0x01, 0xb4, 0x09, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, + 0x77, 0x0b, 0x57, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x36, 0x03, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x35, 0x03, 0x36, 0x03, 0x76, 0x0b, 0x56, 0x0b, 0x97, 0x13, 0x56, 0x0b, 0x35, 0x0b, 0x55, 0x1b, 0x33, 0x23, 0x92, 0x3b, 0x7c, 0xae, 0x1e, 0xe7, 0xdc, 0xe6, 0x3d, 0xef, 0x5f, 0xdf, 0x11, 0x2b, 0x34, 0x13, 0x17, 0x03, 0xf8, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd6, 0x02, 0xf7, 0x02, 0x18, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0xd5, 0x02, 0xd5, 0x0a, 0xb6, 0x02, 0xd7, 0x0a, 0x97, 0x0a, 0x95, 0x0a, 0xb4, 0x1a, 0x5a, 0x7d, 0xdc, 0xd6, 0xda, 0xe6, 0x1b, 0xe7, 0x51, 0x84, 0xcd, 0x4a, 0x07, 0x21, 0x84, 0x38, 0xe4, 0x88, 0x82, 0xd8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x84, 0xd0, 0xc6, 0x70, 0xe7, 0x30, 0x28, 0x09, 0x49, 0x01, 0x2a, 0x11, 0x0a, 0x11, 0x4a, 0x09, 0x29, 0x01, 0x49, 0x01, 0x49, 0x09, 0x6b, 0x42, 0x8a, 0x5a, 0xcb, 0x62, 0xab, 0x5a, 0xac, 0x4a, 0x48, 0x11, 0x8a, 0x11, 0xab, 0x19, 0x68, 0x09, 0xa9, 0x09, 0xea, 0x01, 0x8f, 0x0a, 0xb6, 0x1b, 0xb7, 0x13, 0xf7, 0x13, 0x17, 0x14, 0xf6, 0x13, 0x17, 0x1c, 0x37, 0x1c, 0xf7, 0x13, 0x17, 0x24, 0xf6, 0x33, 0x6f, 0x1a, 0x28, 0x31, 0x63, 0x80, 0xc3, 0xd8, 0x21, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0xa3, 0xc8, 0xc4, 0x48, 0x69, 0x19, 0x49, 0x11, 0x4a, 0x11, 0x6a, 0x09, 0x6a, 0x09, 0x8a, 0x09, 0x48, 0x01, 0x68, 0x09, 0x68, 0x09, 0x48, 0x01, 0x69, 0x09, 0xaa, 0x09, 0x89, 0x01, 0x88, 0x01, 0xa8, 0x01, 0x89, 0x01, 0x8a, 0x09, 0x8b, 0x09, 0xe7, 0x00, 0xd8, 0xbd, 0x38, 0xee, 0x56, 0xfd, 0xd2, 0xbb, 0x9b, 0x9d, 0x52, 0x23, 0xf3, 0x33, 0xdb, 0x85, 0x1d, 0xb6, 0xdd, 0xbd, 0xdc, 0x9d, 0x55, 0x64, 0x0c, 0x1a, 0x8a, 0x11, 0x69, 0x11, 0xc6, 0x38, 0xa4, 0xa0, 0x83, 0xe8, 0x21, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x62, 0xe8, 0xe4, 0xc8, 0x42, 0x78, 0x08, 0x62, 0xeb, 0x52, 0xa9, 0x4a, 0xaa, 0x4a, 0x4b, 0x3a, 0x48, 0x11, 0x6a, 0x09, 0x49, 0x09, 0x48, 0x09, 0x47, 0x01, 0x48, 0x01, 0x6a, 0x09, 0x4b, 0x01, 0x2b, 0x01, 0x29, 0x01, 0x29, 0x21, 0xc7, 0x48, 0xe6, 0x98, 0x83, 0xe0, 0x00, 0xf8, 0x41, 0xf8, 0x61, 0xf8, 0x40, 0xf0, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x60, 0xe8, 0x04, 0xc9, 0xd3, 0xfc, 0x59, 0xfe, 0xfd, 0xde, 0xf9, 0x74, 0x54, 0x33, 0x6f, 0x1a, 0x6b, 0x01, 0x8b, 0x09, 0x4a, 0x09, 0x6a, 0x09, 0x49, 0x09, 0x49, 0x01, 0x49, 0x01, 0x49, 0x01, 0x4a, 0x01, 0x6a, 0x01, 0x49, 0x01, 0x49, 0x01, 0x6a, 0x09, 0x49, 0x01, 0x49, 0x01, 0xa9, 0x09, 0x68, 0x01, 0x69, 0x01, 0x49, 0x09, 0x27, 0x09, 0xe9, 0x29, 0x6c, 0x42, 0x6c, 0x62, 0xe9, 0x91, 0x25, 0xb9, 0x61, 0xe0, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x20, 0xf0, 0x60, 0xf0, 0x60, 0xf8, 0x41, 0xf8, 0x22, 0xf0, 0x85, 0xd0, 0x6a, 0x89, 0x0e, 0x4a, 0x73, 0x1a, 0xb5, 0x02, 0xb4, 0x02, 0x95, 0x0a, 0x76, 0x0a, 0x76, 0x12, 0x95, 0x0a, 0x32, 0x0a, 0x0f, 0x22, 0xfc, 0xb5, 0x5c, 0xc6, 0xbd, 0xd6, 0x38, 0xad, 0x89, 0x29, 0x45, 0x09, 0x25, 0x21, 0x43, 0x68, 0x07, 0xa9, 0xe7, 0xa0, 0x45, 0x68, 0xc7, 0x28, 0xe8, 0x08, 0x28, 0x01, 0x29, 0x01, 0x29, 0x01, 0x08, 0x01, 0x4a, 0x09, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x2a, 0x09, 0xe8, 0x00, 0x29, 0x09, 0xe8, 0x00, 0x28, 0x11, 0xe7, 0x10, 0xc6, 0x10, 0x0a, 0x3a, 0xab, 0x52, 0x4a, 0x6a, 0xe5, 0x78, 0xe6, 0xb8, 0x42, 0xe8, 0x01, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x42, 0xe8, 0xe7, 0xc0, 0x0a, 0x79, 0xb2, 0x31, 0x35, 0x0a, 0x75, 0x0a, 0x74, 0x0a, 0x95, 0x0a, 0x95, 0x02, 0x76, 0x02, 0x55, 0x02, 0x35, 0x02, 0x12, 0x12, 0xf4, 0x7b, 0x5c, 0xce, 0x1a, 0x85, 0xf1, 0x09, 0xf4, 0x09, 0xb4, 0x01, 0xf4, 0x09, 0xb4, 0x01, 0xf5, 0x01, 0x36, 0x0a, 0x15, 0x02, 0xf5, 0x01, 0x15, 0x02, 0xf5, 0x01, 0xf5, 0x01, 0xd4, 0x01, 0xd4, 0x09, 0xb3, 0x09, 0x93, 0x09, 0xb3, 0x11, 0xb3, 0x11, 0x93, 0x11, + 0x99, 0xd6, 0x9a, 0xd6, 0xba, 0xde, 0xda, 0xde, 0xda, 0xde, 0xba, 0xde, 0xba, 0xd6, 0xba, 0xde, 0xda, 0xde, 0xba, 0xde, 0xda, 0xde, 0xda, 0xde, 0xda, 0xde, 0x1b, 0xe7, 0xda, 0xe6, 0xba, 0xde, 0x9a, 0xd6, 0xbb, 0xd6, 0x79, 0xce, 0xfb, 0xde, 0x1c, 0xef, 0xfd, 0xf6, 0x1c, 0xf7, 0xfc, 0xee, 0xfd, 0xd6, 0x1b, 0xb6, 0x5a, 0x95, 0x3a, 0x95, 0x7b, 0x9d, 0x5b, 0x95, 0x3c, 0x8d, 0x7c, 0x95, 0x39, 0x9d, 0x17, 0x9d, 0x58, 0x9d, 0x79, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, 0xb9, 0xb5, 0xb9, 0xb5, 0xb9, 0xb5, 0xda, 0xb5, 0xda, 0xb5, 0xdb, 0xb5, 0xda, 0xb5, 0x99, 0xb5, 0x56, 0xad, 0xbb, 0xde, 0xdb, 0xe6, 0xfb, 0xe6, 0x5c, 0xef, 0x30, 0x84, 0xcd, 0x52, 0xea, 0x49, 0x87, 0x61, 0xe4, 0x90, 0x82, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x43, 0xf8, 0x84, 0xd8, 0xe5, 0x80, 0x26, 0x51, 0x66, 0x31, 0xc8, 0x39, 0xc9, 0x41, 0xa9, 0x41, 0xc9, 0x39, 0xe9, 0x39, 0xc9, 0x31, 0x4a, 0x42, 0x8b, 0x52, 0xab, 0x5a, 0x6a, 0x52, 0xcc, 0x5a, 0xcc, 0x52, 0x09, 0x32, 0xa9, 0x21, 0x89, 0x19, 0xa8, 0x21, 0x67, 0x19, 0x68, 0x11, 0xaf, 0x32, 0x37, 0x5c, 0xf8, 0x4b, 0xf7, 0x43, 0xd7, 0x4b, 0xb6, 0x43, 0xb7, 0x4b, 0xd7, 0x4b, 0xd7, 0x43, 0xf6, 0x3b, 0x93, 0x3b, 0xac, 0x11, 0x28, 0x41, 0xc5, 0x98, 0x83, 0xd8, 0x02, 0xf0, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0xe4, 0xc8, 0xc7, 0x61, 0xac, 0x3a, 0xed, 0x42, 0x4f, 0x4b, 0x4f, 0x4b, 0x0e, 0x43, 0xad, 0x3a, 0x4b, 0x2a, 0x47, 0x09, 0x89, 0x19, 0xca, 0x21, 0xca, 0x21, 0xca, 0x21, 0x89, 0x19, 0x68, 0x19, 0xa9, 0x19, 0x68, 0x19, 0xa9, 0x21, 0x88, 0x19, 0xa7, 0x21, 0x99, 0xc6, 0xda, 0xde, 0x3a, 0xe6, 0x7d, 0xee, 0xbe, 0xd6, 0x14, 0x74, 0xf5, 0x6b, 0x56, 0x6c, 0x98, 0x74, 0x77, 0x64, 0x53, 0x33, 0x31, 0x2b, 0x0b, 0x12, 0x27, 0x01, 0x26, 0x09, 0xc5, 0x38, 0xa3, 0xa0, 0x82, 0xe0, 0x41, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x42, 0xf0, 0x63, 0xc8, 0xc4, 0x98, 0xaf, 0xa3, 0x72, 0x94, 0x93, 0x94, 0x53, 0x8c, 0x70, 0x63, 0xaa, 0x21, 0x49, 0x11, 0x29, 0x09, 0x48, 0x09, 0x27, 0x01, 0x27, 0x01, 0x48, 0x01, 0x07, 0x01, 0x28, 0x01, 0x88, 0x11, 0x06, 0x11, 0xc4, 0x18, 0xe4, 0x68, 0x83, 0xc8, 0x21, 0xf0, 0x21, 0xf0, 0x01, 0xf0, 0x20, 0xf8, 0x61, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0xa3, 0xd0, 0xf0, 0xfb, 0x39, 0xfe, 0xdc, 0xde, 0x3b, 0x9e, 0x10, 0x23, 0x2c, 0x0a, 0x89, 0x01, 0x48, 0x01, 0x68, 0x09, 0x48, 0x09, 0x48, 0x09, 0x69, 0x09, 0x69, 0x09, 0x48, 0x09, 0x28, 0x01, 0x49, 0x09, 0x69, 0x09, 0x69, 0x11, 0x69, 0x11, 0xa9, 0x11, 0xa9, 0x11, 0x68, 0x01, 0x89, 0x01, 0xca, 0x09, 0x27, 0x09, 0x06, 0x11, 0xe8, 0x39, 0x88, 0x5a, 0xe5, 0x79, 0xc3, 0xc0, 0x61, 0xe8, 0x80, 0xf0, 0x80, 0xf0, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x42, 0xf8, 0x85, 0xe8, 0x88, 0x98, 0x31, 0x4a, 0xd5, 0x12, 0xf6, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x37, 0x03, 0xb3, 0x0a, 0xee, 0x21, 0xfb, 0xc5, 0x7a, 0xce, 0x79, 0xce, 0xd8, 0xbd, 0x47, 0x21, 0x27, 0x11, 0xe7, 0x10, 0x08, 0x29, 0x48, 0x39, 0xe6, 0x10, 0x27, 0x09, 0xe7, 0x00, 0x28, 0x09, 0xe8, 0x08, 0xe8, 0x08, 0xe8, 0x08, 0x08, 0x01, 0x29, 0x09, 0x28, 0x01, 0x29, 0x01, 0x49, 0x01, 0x28, 0x01, 0x49, 0x01, 0x28, 0x01, 0x49, 0x01, 0x07, 0x01, 0x28, 0x09, 0xc7, 0x08, 0x0a, 0x32, 0xab, 0x52, 0x6a, 0x62, 0x25, 0x59, 0xa4, 0x88, 0x82, 0xe0, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x42, 0xf0, 0xc6, 0xd0, 0x0a, 0x89, 0xd2, 0x31, 0x56, 0x0a, 0x55, 0x02, 0x54, 0x02, 0x74, 0x02, 0x74, 0x02, 0x94, 0x02, 0x94, 0x02, 0xb4, 0x0a, 0x50, 0x12, 0xd1, 0x63, 0x5b, 0xbe, 0xba, 0x95, 0xd1, 0x22, 0x92, 0x1a, 0x31, 0x12, 0xb0, 0x09, 0x12, 0x1a, 0xd1, 0x09, 0xb1, 0x01, 0x12, 0x12, 0xf2, 0x09, 0xb1, 0x01, 0x13, 0x12, 0xd2, 0x01, 0xd2, 0x01, 0xd2, 0x01, 0xf4, 0x09, 0xf4, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xf5, 0x01, + 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x1b, 0xe7, 0x1b, 0xe7, 0x1b, 0xe7, 0x3c, 0xef, 0x3c, 0xef, 0x1b, 0xe7, 0x3c, 0xef, 0xfb, 0xee, 0xfb, 0xee, 0x1c, 0xef, 0xfb, 0xee, 0xdb, 0xe6, 0xdb, 0xe6, 0x1c, 0xef, 0x1b, 0xef, 0xba, 0xde, 0x1d, 0xef, 0x1d, 0xef, 0xfc, 0xe6, 0x5d, 0xf7, 0x1b, 0xe7, 0x3b, 0xe7, 0x1b, 0xef, 0xfb, 0xe6, 0xfa, 0xee, 0xfa, 0xee, 0xfa, 0xee, 0xda, 0xe6, 0x1b, 0xef, 0xfb, 0xe6, 0xfc, 0xe6, 0xfb, 0xde, 0xfb, 0xde, 0xfa, 0xde, 0xfa, 0xe6, 0xfa, 0xe6, 0xfb, 0xe6, 0xfb, 0xde, 0x1b, 0xdf, 0x1b, 0xdf, 0xfa, 0xd6, 0xd9, 0xd6, 0x98, 0xd6, 0x3b, 0xef, 0xdb, 0xe6, 0xbb, 0xe6, 0x3c, 0xef, 0x30, 0x8c, 0xac, 0x5a, 0x4b, 0x62, 0x29, 0x82, 0x45, 0xa9, 0x81, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0xa1, 0xd8, 0x68, 0xba, 0xcd, 0xab, 0xee, 0x93, 0x50, 0x8c, 0xef, 0x83, 0xef, 0x83, 0x2f, 0x84, 0xee, 0x7b, 0x0f, 0x84, 0x0f, 0x84, 0x90, 0x94, 0x4f, 0x84, 0x4f, 0x8c, 0x0f, 0x8c, 0x4f, 0x94, 0xee, 0x8b, 0x0f, 0x84, 0x10, 0x8c, 0x0e, 0x8c, 0x0e, 0x8c, 0x50, 0x94, 0x33, 0xad, 0xba, 0xd6, 0x99, 0xce, 0xb9, 0xd6, 0xda, 0xde, 0xda, 0xde, 0xda, 0xe6, 0xd9, 0xde, 0x98, 0xd6, 0x98, 0xce, 0x50, 0x84, 0x89, 0x52, 0x06, 0x7a, 0x23, 0xc9, 0x60, 0xe8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x40, 0xf0, 0x20, 0xf8, 0x62, 0xf0, 0x82, 0xd8, 0x08, 0xd2, 0x58, 0xf6, 0xda, 0xd6, 0xb9, 0xd6, 0xd9, 0xde, 0xd9, 0xde, 0xb9, 0xde, 0xba, 0xde, 0xba, 0xde, 0xbb, 0xd6, 0x7a, 0xce, 0x96, 0xb5, 0x72, 0x8c, 0x6e, 0x6b, 0xab, 0x5a, 0x8b, 0x52, 0xab, 0x5a, 0xab, 0x5a, 0xab, 0x5a, 0x28, 0x52, 0x89, 0x5a, 0xb9, 0xde, 0xfa, 0xde, 0x7a, 0xc6, 0x3c, 0xdf, 0xfa, 0xde, 0xfa, 0xde, 0x3c, 0xef, 0xbb, 0xde, 0xda, 0xd6, 0xfc, 0xde, 0x7d, 0xd6, 0x9e, 0xde, 0xd2, 0x83, 0xac, 0x5a, 0xab, 0x52, 0x08, 0x72, 0x03, 0xc1, 0x61, 0xe8, 0x21, 0xf0, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x41, 0xe8, 0xe4, 0xd0, 0x8e, 0xeb, 0x38, 0xf6, 0xba, 0xde, 0xda, 0xe6, 0x7a, 0xde, 0xbb, 0xd6, 0xbc, 0xd6, 0x7b, 0xc6, 0x1a, 0xbe, 0x94, 0x94, 0x2e, 0x63, 0x6b, 0x4a, 0x6a, 0x4a, 0xab, 0x52, 0x8b, 0x52, 0x29, 0x4a, 0x6a, 0x52, 0x69, 0x42, 0x08, 0x6a, 0x04, 0xb9, 0x62, 0xe8, 0x42, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x83, 0xd8, 0xec, 0xea, 0x59, 0xfe, 0xdb, 0xde, 0xdc, 0xd6, 0x9c, 0xc6, 0xf5, 0x94, 0x6f, 0x6b, 0xaf, 0x6b, 0xd0, 0x73, 0x8f, 0x6b, 0x2d, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x2e, 0x4b, 0xed, 0x42, 0xcd, 0x3a, 0xcd, 0x3a, 0xcd, 0x32, 0x8c, 0x32, 0x4c, 0x2a, 0x6e, 0x32, 0x6f, 0x2a, 0x2e, 0x22, 0x0c, 0x2a, 0xca, 0x21, 0x2b, 0x42, 0x90, 0x93, 0xaa, 0xb2, 0x65, 0xd1, 0x41, 0xe8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x00, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0xa3, 0xd8, 0xc5, 0x70, 0xc8, 0x20, 0x10, 0x22, 0x33, 0x12, 0x53, 0x12, 0x53, 0x0a, 0x72, 0x02, 0x52, 0x02, 0x32, 0x0a, 0x11, 0x12, 0xcf, 0x11, 0xb1, 0x3a, 0x56, 0x84, 0x5c, 0xce, 0x9b, 0xd6, 0xbb, 0xde, 0x16, 0xad, 0xc9, 0x41, 0xc6, 0x18, 0x86, 0x08, 0xc8, 0x10, 0xe8, 0x10, 0xa6, 0x00, 0x4a, 0x09, 0xc9, 0x08, 0xc9, 0x08, 0x0a, 0x09, 0x4a, 0x09, 0x8c, 0x11, 0xee, 0x19, 0x0f, 0x1a, 0x10, 0x1a, 0xf0, 0x11, 0xf0, 0x09, 0xf0, 0x11, 0xce, 0x11, 0x4b, 0x09, 0x09, 0x09, 0xe7, 0x08, 0xa4, 0x08, 0xc4, 0x10, 0x6a, 0x4a, 0x8a, 0x52, 0xaa, 0x5a, 0xc7, 0x41, 0xa3, 0x60, 0xa2, 0xd8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf0, 0x84, 0xd8, 0x29, 0x99, 0x10, 0x2a, 0xd4, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x0a, 0xb5, 0x0a, 0xb6, 0x12, 0x95, 0x12, 0x33, 0x12, 0x30, 0x2a, 0x34, 0x94, 0x19, 0xde, 0x1a, 0xd6, 0x3a, 0xce, 0x97, 0xc5, 0x97, 0xc5, 0x1b, 0xce, 0xfb, 0xc5, 0x1b, 0xc6, 0xfb, 0xc5, 0x99, 0xb5, 0x99, 0xb5, 0x99, 0xad, 0x38, 0xa5, 0xf7, 0x94, 0xf8, 0x94, 0x97, 0x84, 0x97, 0x84, 0x57, 0x74, 0xf6, 0x63, 0x94, 0x53, 0xb5, 0x5b, + 0x5d, 0xef, 0x5d, 0xef, 0x3c, 0xef, 0x3c, 0xef, 0x1c, 0xe7, 0x1c, 0xe7, 0x1c, 0xef, 0x3c, 0xef, 0x3c, 0xef, 0xfb, 0xe6, 0x3c, 0xf7, 0x1c, 0xef, 0x1c, 0xef, 0xfc, 0xee, 0xfc, 0xee, 0xfb, 0xee, 0xdb, 0xe6, 0xfb, 0xee, 0x1b, 0xf7, 0xfb, 0xee, 0x3c, 0xf7, 0xfb, 0xee, 0xba, 0xde, 0x3c, 0xef, 0x7c, 0xef, 0x3b, 0xe7, 0x3b, 0xe7, 0x7c, 0xef, 0x7b, 0xef, 0x5b, 0xef, 0x3a, 0xef, 0x3a, 0xef, 0xfb, 0xee, 0xfc, 0xee, 0xdc, 0xe6, 0xdc, 0xe6, 0xfb, 0xee, 0xfb, 0xee, 0xfb, 0xee, 0xfc, 0xee, 0x1d, 0xef, 0x1d, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0x1b, 0xdf, 0x1b, 0xe7, 0xdb, 0xe6, 0xbc, 0xe6, 0x1d, 0xef, 0xfc, 0xe6, 0x5c, 0xef, 0x30, 0x8c, 0xab, 0x62, 0x2a, 0x6a, 0x29, 0x8a, 0x65, 0xb1, 0x81, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0xa3, 0xe0, 0x8e, 0xeb, 0x79, 0xfe, 0xba, 0xf6, 0x1c, 0xe7, 0xdc, 0xd6, 0x3e, 0xe7, 0xdb, 0xd6, 0x3c, 0xef, 0x9a, 0xde, 0x7a, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0x7a, 0xd6, 0xdb, 0xe6, 0x9a, 0xe6, 0xdb, 0xee, 0x3c, 0xef, 0x1c, 0xe7, 0xda, 0xde, 0xba, 0xe6, 0xdb, 0xee, 0xdb, 0xee, 0x1b, 0xef, 0xfb, 0xe6, 0xfa, 0xe6, 0xfb, 0xe6, 0xdb, 0xee, 0xdb, 0xee, 0xfa, 0xe6, 0xd9, 0xe6, 0xb9, 0xe6, 0xea, 0x62, 0x89, 0x5a, 0x48, 0x82, 0xe3, 0xc0, 0x41, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x21, 0xf0, 0xa2, 0xe0, 0x2c, 0xf3, 0xbb, 0xfe, 0xfc, 0xee, 0xda, 0xe6, 0xd9, 0xee, 0xd9, 0xee, 0xb9, 0xe6, 0xfb, 0xee, 0xfc, 0xee, 0xdc, 0xe6, 0xdc, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0x58, 0xce, 0xd2, 0x9c, 0xaf, 0x73, 0xcb, 0x4a, 0xab, 0x4a, 0xaa, 0x5a, 0xaa, 0x62, 0x17, 0xd6, 0x9a, 0xe6, 0xda, 0xd6, 0x1c, 0xdf, 0xfb, 0xde, 0xfc, 0xe6, 0xdb, 0xe6, 0xda, 0xe6, 0xd8, 0xe6, 0xd8, 0xee, 0xda, 0xee, 0x9a, 0xe6, 0xef, 0x83, 0xaa, 0x52, 0xca, 0x5a, 0x48, 0x7a, 0x03, 0xb9, 0x60, 0xe0, 0x61, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x83, 0xd0, 0x31, 0xfc, 0x78, 0xfe, 0x98, 0xde, 0xb9, 0xe6, 0xba, 0xe6, 0x99, 0xde, 0xda, 0xe6, 0x99, 0xde, 0xdb, 0xe6, 0x39, 0xd6, 0x9a, 0xe6, 0x35, 0xb5, 0x0c, 0x6b, 0x8a, 0x52, 0xab, 0x5a, 0x6a, 0x52, 0xab, 0x5a, 0xab, 0x52, 0x29, 0x6a, 0x44, 0xa9, 0x82, 0xd0, 0x41, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x62, 0xe0, 0x29, 0xda, 0x99, 0xfe, 0xfa, 0xde, 0xda, 0xe6, 0xfb, 0xee, 0x79, 0xde, 0xba, 0xe6, 0xda, 0xee, 0x58, 0xde, 0x9a, 0xe6, 0xda, 0xee, 0x99, 0xe6, 0x9a, 0xe6, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0xbb, 0xe6, 0xbb, 0xe6, 0xbb, 0xde, 0xba, 0xde, 0x9a, 0xd6, 0xbb, 0xd6, 0x7a, 0xce, 0x79, 0xde, 0xda, 0xee, 0x16, 0xde, 0xb1, 0xe4, 0x44, 0xd9, 0x62, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x63, 0xf0, 0x22, 0xe8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x61, 0xf8, 0x82, 0xd8, 0x25, 0xa9, 0xcd, 0x82, 0x1b, 0xc6, 0x7b, 0xd6, 0x7b, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x1a, 0xde, 0x1a, 0xe6, 0x3a, 0xe6, 0x3a, 0xde, 0x3a, 0xe6, 0x19, 0xd6, 0xf8, 0xc5, 0x79, 0xce, 0xda, 0xde, 0x99, 0xd6, 0x75, 0xb5, 0xcb, 0x5a, 0x8a, 0x4a, 0x8b, 0x52, 0x4a, 0x4a, 0x4b, 0x52, 0x4c, 0x5a, 0x2f, 0x73, 0x73, 0x8c, 0x36, 0xa5, 0xd9, 0xbd, 0xd9, 0xc5, 0x3b, 0xce, 0x7c, 0xd6, 0x5b, 0xce, 0xda, 0xb5, 0x99, 0xad, 0x17, 0x9d, 0x99, 0xa5, 0x9a, 0xa5, 0x99, 0xad, 0xba, 0xb5, 0x53, 0x8c, 0x2b, 0x4a, 0xea, 0x49, 0x4b, 0x52, 0x8a, 0x52, 0xcb, 0x5a, 0x6a, 0x4a, 0x65, 0x61, 0xc3, 0xd0, 0x00, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf0, 0x42, 0xe0, 0x48, 0xb9, 0x4e, 0x52, 0xf2, 0x2a, 0xf3, 0x2a, 0xd3, 0x2a, 0xb3, 0x22, 0x73, 0x22, 0x32, 0x1a, 0x11, 0x1a, 0x32, 0x1a, 0xb2, 0x3a, 0xba, 0xb5, 0xb9, 0xc5, 0x3a, 0xce, 0x5a, 0xce, 0x78, 0xd6, 0x78, 0xde, 0x58, 0xde, 0x38, 0xde, 0x58, 0xe6, 0x78, 0xe6, 0x58, 0xe6, 0x58, 0xe6, 0x58, 0xe6, 0x37, 0xde, 0x17, 0xd6, 0x58, 0xde, 0x17, 0xd6, 0x18, 0xd6, 0x18, 0xd6, 0x38, 0xde, 0xd6, 0xcd, 0x17, 0xd6, + 0xfc, 0xde, 0x1c, 0xdf, 0x3d, 0xe7, 0x5d, 0xe7, 0x3d, 0xe7, 0x1d, 0xe7, 0xfc, 0xe6, 0xfc, 0xe6, 0x1d, 0xe7, 0xbb, 0xde, 0x1d, 0xe7, 0x1d, 0xe7, 0x1d, 0xef, 0xfc, 0xe6, 0xfc, 0xe6, 0x1d, 0xe7, 0x5e, 0xe7, 0x1e, 0xd7, 0xbc, 0xce, 0xfd, 0xe6, 0x1d, 0xef, 0xfb, 0xee, 0x1c, 0xef, 0x5d, 0xff, 0x1c, 0xf7, 0x3c, 0xf7, 0x3c, 0xf7, 0xfb, 0xee, 0x9b, 0xde, 0xdd, 0xe6, 0x1e, 0xef, 0x1d, 0xef, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0x1c, 0xe7, 0x3b, 0xe7, 0x3b, 0xef, 0x1a, 0xef, 0x1b, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x3c, 0xe7, 0x1b, 0xdf, 0x3b, 0xe7, 0x3b, 0xef, 0xdb, 0xee, 0x7a, 0xde, 0xfd, 0xe6, 0x3d, 0xe7, 0x5c, 0xef, 0x10, 0x84, 0xec, 0x62, 0x8b, 0x72, 0x29, 0x8a, 0x65, 0xa9, 0x61, 0xe0, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x83, 0xd8, 0x8f, 0xe3, 0x7b, 0xfe, 0xdc, 0xf6, 0x1d, 0xef, 0xdc, 0xde, 0x3d, 0xe7, 0x1c, 0xef, 0xba, 0xe6, 0xdc, 0xf6, 0xbb, 0xee, 0x1c, 0xef, 0xda, 0xde, 0x1d, 0xe7, 0xfd, 0xe6, 0xbb, 0xe6, 0x3e, 0xf7, 0x1e, 0xe7, 0x1f, 0xd7, 0x7f, 0xe7, 0x3f, 0xe7, 0xbd, 0xde, 0xfe, 0xe6, 0xdc, 0xe6, 0xdc, 0xe6, 0xfc, 0xde, 0xfd, 0xe6, 0xdd, 0xee, 0xdd, 0xe6, 0xdb, 0xe6, 0xfb, 0xee, 0x18, 0xce, 0x6a, 0x52, 0xcb, 0x5a, 0x6a, 0x82, 0xe4, 0xb8, 0x62, 0xe8, 0x22, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x21, 0xf0, 0x61, 0xe0, 0x0c, 0xfb, 0x7a, 0xfe, 0xdd, 0xe6, 0xdb, 0xde, 0xfb, 0xe6, 0xfb, 0xe6, 0xba, 0xde, 0xdc, 0xde, 0xdc, 0xde, 0xbc, 0xde, 0xfd, 0xe6, 0x1c, 0xdf, 0x1b, 0xe7, 0x1b, 0xe7, 0xfb, 0xe6, 0xdb, 0xde, 0xba, 0xde, 0x17, 0xce, 0xee, 0x8b, 0xe9, 0x62, 0x89, 0x5a, 0x5a, 0xde, 0xdd, 0xe6, 0xfc, 0xd6, 0xdb, 0xd6, 0xfd, 0xe6, 0xdc, 0xee, 0x3c, 0xef, 0xfa, 0xe6, 0xb9, 0xee, 0xfa, 0xee, 0xfb, 0xde, 0xfc, 0xde, 0x31, 0x84, 0xaa, 0x5a, 0xaa, 0x5a, 0x28, 0x7a, 0x03, 0xc1, 0x60, 0xe8, 0x41, 0xf0, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x62, 0xf8, 0x63, 0xd0, 0xb0, 0xfb, 0x19, 0xf6, 0xdb, 0xe6, 0xdc, 0xee, 0xdc, 0xee, 0x9a, 0xe6, 0xdb, 0xe6, 0xba, 0xde, 0xfb, 0xee, 0xdb, 0xee, 0x9a, 0xe6, 0xdb, 0xe6, 0x9a, 0xd6, 0x8d, 0x63, 0xeb, 0x52, 0xeb, 0x52, 0x8a, 0x4a, 0xab, 0x5a, 0x69, 0x72, 0xe6, 0x99, 0x23, 0xc1, 0x81, 0xe0, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x41, 0xf0, 0x66, 0xd9, 0x59, 0xfe, 0xba, 0xe6, 0xdb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0xdc, 0xde, 0x1c, 0xe7, 0xbb, 0xd6, 0xdc, 0xde, 0xbb, 0xde, 0x9b, 0xde, 0xbb, 0xde, 0xdc, 0xe6, 0xbb, 0xde, 0x9b, 0xde, 0xbb, 0xde, 0x9b, 0xde, 0xfc, 0xee, 0xbb, 0xe6, 0x79, 0xde, 0xda, 0xe6, 0x79, 0xd6, 0x17, 0xe6, 0xb2, 0xfc, 0x03, 0xc9, 0x41, 0xe8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x40, 0xf8, 0x61, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x62, 0xd0, 0x08, 0x92, 0x6e, 0x8b, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0xba, 0xde, 0xda, 0xd6, 0xda, 0xce, 0xba, 0xc6, 0xba, 0xce, 0xba, 0xce, 0xba, 0xd6, 0x9a, 0xd6, 0x58, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xba, 0xde, 0xbb, 0xde, 0x95, 0xad, 0xaa, 0x4a, 0xcb, 0x52, 0xac, 0x52, 0x2e, 0x63, 0xd4, 0x9c, 0x7a, 0xd6, 0x79, 0xce, 0x98, 0xce, 0xd9, 0xce, 0xba, 0xd6, 0x5a, 0xd6, 0x7a, 0xd6, 0x59, 0xd6, 0x79, 0xde, 0x58, 0xd6, 0x99, 0xde, 0x78, 0xd6, 0x78, 0xd6, 0x78, 0xce, 0x99, 0xd6, 0x78, 0xce, 0x98, 0xd6, 0x16, 0xc6, 0xc9, 0x5a, 0x68, 0x52, 0x8a, 0x52, 0xab, 0x5a, 0xab, 0x5a, 0xe9, 0x79, 0xe3, 0xc8, 0x20, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x41, 0xf0, 0x62, 0xe8, 0xc8, 0xe1, 0x96, 0xf5, 0x39, 0xde, 0x59, 0xde, 0x59, 0xde, 0x59, 0xd6, 0x79, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x79, 0xce, 0x59, 0xce, 0x17, 0xce, 0xd9, 0xe6, 0x79, 0xde, 0x7a, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xce, 0x9b, 0xd6, 0x7a, 0xce, 0x9b, 0xd6, 0x5a, 0xce, 0x7a, 0xd6, 0x79, 0xde, 0x58, 0xde, 0xf6, 0xd5, 0x37, 0xde, + 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x37, 0x03, 0x78, 0x0b, 0x79, 0x0b, 0x99, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x76, 0x13, 0x55, 0x1b, 0x95, 0x3b, 0xdc, 0x9d, 0x1e, 0xd7, 0xfc, 0xe6, 0x3c, 0xef, 0x5e, 0xe7, 0x3f, 0xd7, 0xfb, 0x9d, 0x7a, 0x7d, 0xfd, 0x8d, 0x1d, 0x8e, 0x9b, 0x85, 0x3a, 0x7d, 0x3a, 0x7d, 0x9a, 0x8d, 0xbb, 0x95, 0xbc, 0x8d, 0xbc, 0x95, 0x1d, 0x9e, 0x1d, 0xa6, 0x1c, 0xa6, 0x3d, 0xa6, 0xdc, 0x95, 0x9b, 0x8d, 0x9b, 0x8d, 0xbb, 0x95, 0x9a, 0x95, 0x59, 0x95, 0x5a, 0xa5, 0x7e, 0xce, 0xdd, 0xde, 0xfc, 0xe6, 0x5c, 0xe7, 0x30, 0x84, 0xed, 0x5a, 0xc9, 0x49, 0x66, 0x61, 0x45, 0xa1, 0x82, 0xe0, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0xa3, 0xd8, 0xae, 0xba, 0xb7, 0xb4, 0x39, 0x9d, 0xdc, 0x95, 0x7a, 0x8d, 0x7a, 0x8d, 0x5d, 0xae, 0xba, 0x9d, 0x7a, 0xa5, 0x9d, 0xce, 0xdb, 0xd6, 0x3c, 0xe7, 0xfb, 0xde, 0xfc, 0xde, 0x9f, 0xef, 0x1a, 0xae, 0xf8, 0x74, 0xb7, 0x5c, 0xd7, 0x5c, 0xd7, 0x64, 0xf7, 0x74, 0x79, 0x8d, 0x3b, 0xa6, 0x7c, 0xae, 0xbc, 0xb6, 0xfd, 0xbe, 0x1e, 0xcf, 0xfe, 0xce, 0xfc, 0xce, 0x1d, 0xd7, 0x15, 0x9d, 0xec, 0x5a, 0xab, 0x4a, 0x69, 0x72, 0x64, 0xb1, 0xa2, 0xe0, 0x62, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xe8, 0xe7, 0xd9, 0xdc, 0xfe, 0x5e, 0xef, 0x1d, 0xe7, 0x1d, 0xdf, 0xfd, 0xd6, 0xdd, 0xd6, 0x1e, 0xdf, 0x3f, 0xdf, 0xbd, 0xd6, 0xdd, 0xde, 0xbc, 0xde, 0xbb, 0xde, 0xdc, 0xe6, 0xfc, 0xee, 0xdc, 0xe6, 0xdd, 0xe6, 0xdd, 0xde, 0xfe, 0xde, 0x7b, 0xd6, 0x73, 0x94, 0x5c, 0xce, 0xbd, 0xd6, 0xfc, 0xd6, 0x3d, 0xdf, 0xdc, 0xde, 0xdc, 0xe6, 0x1c, 0xe7, 0xfc, 0xde, 0x1e, 0xef, 0xde, 0xe6, 0xfd, 0xe6, 0xfd, 0xde, 0xd1, 0x83, 0xac, 0x5a, 0x8c, 0x5a, 0xe9, 0x79, 0x04, 0xc1, 0x61, 0xe8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x62, 0xe8, 0x05, 0xd1, 0x32, 0xfc, 0x39, 0xee, 0x3d, 0xe7, 0xbb, 0xde, 0x9a, 0xd6, 0xdb, 0xde, 0x3d, 0xef, 0x3d, 0xe7, 0xdc, 0xde, 0xdb, 0xe6, 0xdc, 0xe6, 0x7a, 0xde, 0xdb, 0xe6, 0xfb, 0xe6, 0x0b, 0x63, 0x89, 0x5a, 0xa9, 0x62, 0x6b, 0x62, 0x2a, 0x72, 0xc7, 0x91, 0x44, 0xb1, 0x81, 0xd8, 0x41, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x24, 0xd9, 0x59, 0xfe, 0x9a, 0xe6, 0x3c, 0xef, 0xfc, 0xe6, 0x3d, 0xef, 0xdc, 0xde, 0x9b, 0xd6, 0xdc, 0xde, 0x1d, 0xdf, 0xdc, 0xd6, 0xfc, 0xde, 0xbb, 0xd6, 0xdb, 0xd6, 0xfc, 0xde, 0xfb, 0xd6, 0xfb, 0xd6, 0x1c, 0xdf, 0xfc, 0xde, 0x7c, 0xd6, 0x7c, 0xde, 0xbb, 0xee, 0x9a, 0xe6, 0x9b, 0xf6, 0x94, 0xe4, 0xc5, 0xc8, 0x22, 0xf0, 0x42, 0xf8, 0x41, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0xc2, 0xe8, 0x04, 0xb9, 0xe7, 0x91, 0xce, 0x8b, 0xda, 0xd6, 0x98, 0xde, 0x58, 0xde, 0x9a, 0xde, 0xbc, 0xde, 0xbd, 0xde, 0xbd, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x9c, 0xd6, 0x9b, 0xce, 0x59, 0xce, 0xdb, 0xde, 0x7a, 0xd6, 0x5b, 0xd6, 0x5b, 0xde, 0x9c, 0xde, 0x77, 0xb5, 0x8b, 0x5a, 0xaf, 0x83, 0x56, 0xb5, 0xbb, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xe6, 0x79, 0xe6, 0x79, 0xe6, 0xb8, 0xd6, 0xd8, 0xce, 0xf9, 0xd6, 0xd9, 0xde, 0xd9, 0xde, 0x99, 0xde, 0xba, 0xde, 0x9a, 0xde, 0x5a, 0xd6, 0x7b, 0xde, 0x3a, 0xd6, 0x9b, 0xde, 0x3a, 0xd6, 0x5a, 0xd6, 0xb7, 0xc5, 0x8b, 0x5a, 0x8b, 0x5a, 0x6a, 0x52, 0x6b, 0x5a, 0x09, 0x8a, 0xc3, 0xc8, 0x40, 0xf0, 0x20, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x62, 0xe8, 0x49, 0xea, 0xf8, 0xfd, 0x7a, 0xd6, 0x79, 0xd6, 0x59, 0xce, 0x58, 0xce, 0x58, 0xce, 0x59, 0xce, 0x58, 0xd6, 0x17, 0xce, 0x99, 0xde, 0x58, 0xde, 0x79, 0xde, 0x7a, 0xde, 0x7b, 0xde, 0x9d, 0xde, 0x5c, 0xd6, 0xbc, 0xde, 0xdc, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xde, 0x7a, 0xd6, 0x7b, 0xd6, 0x9b, 0xd6, 0x7b, 0xce, 0x5b, 0xc6, 0x5a, 0xc6, 0x7b, 0xce, 0x9b, 0xd6, 0x39, 0xce, 0xf7, 0xcd, 0xf7, 0xcd, + 0x99, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x79, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x9a, 0x0b, 0x79, 0x03, 0x58, 0x03, 0x99, 0x0b, 0x16, 0x03, 0x15, 0x1b, 0x3b, 0x7d, 0x3e, 0xdf, 0x1b, 0xe7, 0x5c, 0xe7, 0xdf, 0xdf, 0x78, 0x4c, 0x18, 0x1c, 0x19, 0x04, 0x3a, 0x04, 0x1a, 0x04, 0x19, 0x04, 0x3a, 0x04, 0x19, 0x04, 0xf9, 0x0b, 0x3a, 0x14, 0xf9, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xf9, 0x0b, 0x5a, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0x3a, 0x0c, 0xf9, 0x0b, 0x77, 0x13, 0xd7, 0x23, 0x1e, 0x8e, 0x3f, 0xd7, 0xfc, 0xe6, 0x5d, 0xe7, 0x72, 0x84, 0x6c, 0x42, 0xa6, 0x20, 0x64, 0x38, 0xc5, 0x88, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x85, 0xd0, 0x4d, 0x79, 0xf3, 0x41, 0x75, 0x12, 0xf7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x12, 0x75, 0x12, 0xf4, 0x32, 0xbf, 0xc6, 0xfd, 0xde, 0x9b, 0xde, 0x5e, 0xe7, 0x7f, 0xbf, 0x96, 0x4c, 0xb6, 0x13, 0xd9, 0x0b, 0xd8, 0x03, 0xf9, 0x03, 0xd8, 0x0b, 0xb8, 0x13, 0x98, 0x0b, 0x98, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x98, 0x13, 0x78, 0x13, 0x78, 0x13, 0x98, 0x2b, 0x30, 0x12, 0x6b, 0x01, 0x6a, 0x01, 0x48, 0x31, 0x06, 0x89, 0xa3, 0xc8, 0x43, 0xe8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0xc5, 0xc8, 0x90, 0x6a, 0x35, 0x2b, 0x16, 0x23, 0x16, 0x13, 0x17, 0x0b, 0x17, 0x03, 0x38, 0x0b, 0x17, 0x0b, 0xf6, 0x02, 0x16, 0x13, 0x16, 0x1b, 0x36, 0x1b, 0x37, 0x1b, 0x36, 0x1b, 0x57, 0x1b, 0x78, 0x1b, 0x17, 0x13, 0x17, 0x13, 0x56, 0x23, 0xb5, 0x43, 0x1b, 0xae, 0xfd, 0xde, 0x9a, 0xce, 0x1e, 0xdf, 0x1f, 0xdf, 0xb6, 0x63, 0x12, 0x2a, 0x75, 0x2a, 0x98, 0x4b, 0xb7, 0x4b, 0x98, 0x6c, 0x97, 0x74, 0xaf, 0x3a, 0x0c, 0x2a, 0x0b, 0x32, 0x88, 0x51, 0xe4, 0xa8, 0x82, 0xe0, 0x21, 0xf0, 0x41, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x01, 0xe8, 0x84, 0xd0, 0xac, 0xd2, 0x39, 0xf6, 0xfb, 0xde, 0xda, 0xd6, 0x1c, 0xdf, 0x3e, 0xd7, 0x38, 0x8d, 0x5a, 0x8d, 0x9b, 0x95, 0x7b, 0x95, 0xbf, 0xc6, 0x3f, 0xd7, 0x7e, 0xc6, 0x5d, 0xc6, 0x3b, 0xc6, 0x29, 0x4a, 0x8a, 0x5a, 0x6c, 0x5a, 0x4b, 0x6a, 0x09, 0x92, 0x66, 0xb9, 0x42, 0xe0, 0x00, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x41, 0xf0, 0x45, 0xd1, 0x59, 0xfe, 0xdc, 0xde, 0x1c, 0xdf, 0x1c, 0xd7, 0x9b, 0xc6, 0x3a, 0xb6, 0x9c, 0xbe, 0x3b, 0xb6, 0x7c, 0xbe, 0x9d, 0xc6, 0xbd, 0xce, 0x5c, 0xc6, 0x5b, 0xc6, 0x7c, 0xce, 0x5b, 0xce, 0x7c, 0xce, 0x9c, 0xd6, 0x5c, 0xce, 0xfe, 0xde, 0x1d, 0xe7, 0xba, 0xde, 0x99, 0xfe, 0x8e, 0xfb, 0x62, 0xd0, 0x61, 0xe8, 0x60, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x61, 0xf0, 0x62, 0xf0, 0x43, 0xe8, 0x23, 0xe8, 0x42, 0xf0, 0x84, 0xc8, 0xaa, 0x89, 0x13, 0xa4, 0x5d, 0xf6, 0x3c, 0xe6, 0x3e, 0xef, 0xdc, 0xde, 0x9c, 0xe6, 0xbc, 0xee, 0xfd, 0xd6, 0xdc, 0xd6, 0xda, 0xde, 0xba, 0xe6, 0x9b, 0xee, 0x7b, 0xe6, 0x3d, 0xe7, 0xba, 0xce, 0x9b, 0xd6, 0x9b, 0xde, 0x9b, 0xde, 0xdc, 0xe6, 0xb7, 0xc5, 0xd6, 0xc5, 0xda, 0xe6, 0xd9, 0xe6, 0xb8, 0xe6, 0xfa, 0xee, 0xba, 0xe6, 0x9b, 0xde, 0x7c, 0xe6, 0x7d, 0xe6, 0x3c, 0xe6, 0x7c, 0xee, 0x5c, 0xe6, 0x7b, 0xe6, 0x39, 0xde, 0x39, 0xde, 0x39, 0xde, 0x9a, 0xe6, 0x79, 0xde, 0xba, 0xde, 0xba, 0xde, 0x9a, 0xd6, 0xdb, 0xde, 0x7a, 0xd6, 0x9b, 0xde, 0xaf, 0x7b, 0x8b, 0x5a, 0x8a, 0x5a, 0x8a, 0x52, 0x09, 0x7a, 0xc4, 0xc8, 0x42, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x61, 0xe8, 0x6a, 0xf2, 0xd8, 0xfd, 0x5a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7b, 0xde, 0x7b, 0xde, 0x7c, 0xde, 0x5c, 0xde, 0x3a, 0xde, 0x9b, 0xee, 0x9b, 0xe6, 0xbb, 0xde, 0xbb, 0xd6, 0xdc, 0xce, 0x3c, 0xb6, 0x3c, 0xb6, 0xda, 0xad, 0xbd, 0xce, 0xdd, 0xd6, 0x9c, 0xd6, 0x9b, 0xd6, 0x7b, 0xde, 0x5a, 0xd6, 0x9b, 0xde, 0xbc, 0xde, 0xbc, 0xd6, 0xbd, 0xd6, 0x7c, 0xce, 0xdd, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0x3a, 0xc6, + 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x59, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0xda, 0x13, 0xba, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x36, 0x0b, 0x16, 0x13, 0x59, 0x5c, 0x1f, 0xcf, 0x5d, 0xe7, 0x5d, 0xe7, 0x3f, 0xd7, 0xd5, 0x3b, 0xd7, 0x23, 0x39, 0x1c, 0x5a, 0x14, 0xf8, 0x0b, 0xf9, 0x0b, 0x3a, 0x0c, 0x1a, 0x0c, 0xf8, 0x0b, 0x39, 0x14, 0x19, 0x0c, 0xd9, 0x03, 0xfb, 0x0b, 0xfb, 0x0b, 0xd9, 0x03, 0x19, 0x0c, 0x18, 0x04, 0x38, 0x04, 0x19, 0x04, 0x1a, 0x04, 0xfa, 0x0b, 0xf8, 0x1b, 0x94, 0x1b, 0x39, 0x75, 0x1e, 0xdf, 0xdb, 0xe6, 0x5d, 0xe7, 0x32, 0x84, 0x2c, 0x3a, 0xc7, 0x20, 0xa6, 0x40, 0xe6, 0x88, 0x63, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0xc5, 0xd0, 0x8e, 0x79, 0x35, 0x3a, 0xf8, 0x12, 0x18, 0x03, 0x17, 0x0b, 0x18, 0x13, 0xd7, 0x02, 0x96, 0x02, 0x95, 0x0a, 0x51, 0x12, 0x7c, 0xbe, 0xdb, 0xd6, 0x5d, 0xef, 0x1c, 0xdf, 0x9f, 0xd7, 0x97, 0x5c, 0x77, 0x1b, 0x9a, 0x0b, 0x3c, 0x0c, 0xbd, 0x1c, 0x5b, 0x14, 0x5b, 0x1c, 0xfa, 0x0b, 0x1b, 0x0c, 0x1a, 0x04, 0x19, 0x04, 0x3a, 0x0c, 0xf8, 0x03, 0xb8, 0x03, 0xb7, 0x13, 0x70, 0x0a, 0x4a, 0x01, 0x8a, 0x01, 0x06, 0x21, 0xa1, 0x70, 0xe2, 0xc0, 0x40, 0xe8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf0, 0x61, 0xf8, 0x41, 0xf0, 0x20, 0xf0, 0x41, 0xf8, 0xa4, 0xd0, 0xcc, 0x69, 0x92, 0x3a, 0x94, 0x2a, 0xb6, 0x22, 0xd8, 0x12, 0xf8, 0x0a, 0x38, 0x0b, 0xf7, 0x02, 0x37, 0x0b, 0x16, 0x0b, 0xd6, 0x02, 0xf6, 0x0a, 0x37, 0x0b, 0x37, 0x03, 0x16, 0x03, 0x16, 0x03, 0xd5, 0x02, 0xf6, 0x0a, 0xd7, 0x0a, 0xb5, 0x1a, 0xd4, 0x6b, 0x9c, 0xde, 0xfb, 0xe6, 0x1c, 0xd7, 0x3c, 0x9e, 0x0f, 0x0a, 0x54, 0x12, 0x56, 0x0a, 0x56, 0x02, 0x36, 0x02, 0x17, 0x0a, 0xb4, 0x09, 0x2d, 0x09, 0xa8, 0x00, 0xa8, 0x08, 0x45, 0x30, 0x64, 0xa0, 0x62, 0xe0, 0x21, 0xf0, 0x01, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0x21, 0xf8, 0x83, 0xf0, 0xc4, 0xc8, 0xe5, 0x90, 0xd8, 0xf5, 0x9b, 0xe6, 0xbb, 0xde, 0xdd, 0xd6, 0xbf, 0xb6, 0xd3, 0x22, 0xf5, 0x12, 0x17, 0x0b, 0xf6, 0x02, 0x17, 0x0b, 0xb5, 0x02, 0xd6, 0x0a, 0xd5, 0x12, 0xb7, 0x3b, 0x4f, 0x12, 0xeb, 0x11, 0xa8, 0x09, 0x06, 0x19, 0xc4, 0x48, 0xc4, 0x98, 0x63, 0xe0, 0x42, 0xf8, 0x61, 0xf8, 0x40, 0xf0, 0x20, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x25, 0xd9, 0x3a, 0xfe, 0xff, 0xde, 0xbe, 0x8d, 0xd5, 0x22, 0xb4, 0x12, 0xb5, 0x12, 0xd6, 0x0a, 0x96, 0x0a, 0xb6, 0x02, 0xd7, 0x0a, 0xf7, 0x12, 0xb6, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0xb5, 0x02, 0xf6, 0x0a, 0xf7, 0x0a, 0x94, 0x02, 0xf5, 0x02, 0xd3, 0x12, 0x71, 0x42, 0x8c, 0x81, 0x85, 0xd8, 0x22, 0xf8, 0x21, 0xf0, 0x20, 0xf0, 0x41, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x63, 0xe8, 0xa3, 0xb0, 0xc5, 0x60, 0x6d, 0x2a, 0xb4, 0x1b, 0xd6, 0x13, 0xf7, 0x13, 0x54, 0x03, 0xb6, 0x1b, 0x18, 0x2c, 0x17, 0x2c, 0xf5, 0x2b, 0xd4, 0x33, 0xb6, 0x33, 0xd7, 0x3b, 0xf8, 0x3b, 0xf7, 0x33, 0x95, 0x2b, 0x94, 0x3b, 0x15, 0x74, 0x7d, 0xd6, 0x7b, 0xd6, 0x7a, 0xd6, 0xbb, 0xde, 0x9b, 0xd6, 0x1a, 0xbe, 0xff, 0xd6, 0x7d, 0xbe, 0xbe, 0xb6, 0x17, 0x65, 0xb6, 0x4c, 0x19, 0x5d, 0x15, 0x4c, 0x99, 0x95, 0x5c, 0xbe, 0xbd, 0xc6, 0x5f, 0xdf, 0x9e, 0xbe, 0x5d, 0xb6, 0x7a, 0x95, 0x9b, 0x9d, 0xfd, 0xa5, 0x1d, 0xa6, 0xbb, 0x9d, 0x38, 0x8d, 0x79, 0x9d, 0x37, 0x95, 0x57, 0xa5, 0x98, 0xb5, 0x8b, 0x52, 0xab, 0x5a, 0xca, 0x4a, 0x28, 0x6a, 0xe5, 0xc8, 0x42, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x41, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x61, 0xe0, 0xcb, 0xf2, 0x39, 0xfe, 0x9b, 0xde, 0xb9, 0xd6, 0x99, 0xce, 0x99, 0xce, 0xba, 0xd6, 0x9b, 0xd6, 0x7b, 0xd6, 0x9b, 0xde, 0x5a, 0xce, 0x9b, 0xce, 0xfd, 0xce, 0x9d, 0xb6, 0xf1, 0x32, 0x72, 0x12, 0x94, 0x12, 0xf4, 0x12, 0x55, 0x23, 0xba, 0x64, 0x1a, 0x75, 0x56, 0x6c, 0x39, 0x95, 0x5d, 0xbe, 0xba, 0xa5, 0x59, 0x9d, 0x7a, 0x9d, 0x7a, 0x95, 0x77, 0x6c, 0xd8, 0x74, 0x19, 0x7d, 0x3a, 0x85, 0x36, 0x64, + 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x37, 0x03, 0x56, 0x13, 0x16, 0x44, 0x1d, 0xcf, 0x3c, 0xef, 0x3d, 0xe7, 0x3f, 0xcf, 0xd6, 0x23, 0x5a, 0x1c, 0xf8, 0x0b, 0x5a, 0x14, 0x19, 0x04, 0x19, 0x0c, 0x9c, 0x24, 0xbc, 0x2c, 0x9b, 0x2c, 0x9b, 0x2c, 0x39, 0x14, 0xf8, 0x0b, 0x5a, 0x1c, 0x1a, 0x14, 0xb8, 0x03, 0xf9, 0x0b, 0x7b, 0x1c, 0x1a, 0x14, 0xd9, 0x0b, 0xfa, 0x13, 0xf9, 0x0b, 0x97, 0x03, 0x96, 0x1b, 0x19, 0x65, 0x1d, 0xcf, 0x1c, 0xe7, 0x1d, 0xef, 0x32, 0x8c, 0x2b, 0x32, 0xe7, 0x18, 0x65, 0x38, 0xc6, 0x88, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0xa4, 0xc8, 0x8f, 0x71, 0x35, 0x3a, 0xf7, 0x1a, 0x59, 0x0b, 0x38, 0x03, 0xf8, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0xb7, 0x12, 0x33, 0x12, 0x9e, 0xbe, 0xdc, 0xd6, 0x1d, 0xdf, 0x3f, 0xdf, 0x5f, 0xd7, 0x17, 0x54, 0x96, 0x23, 0xb7, 0x0b, 0x18, 0x04, 0xd8, 0x03, 0x9a, 0x0b, 0x9b, 0x0b, 0xb9, 0x0b, 0x98, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0xb8, 0x03, 0xb7, 0x03, 0xb8, 0x0b, 0x96, 0x13, 0x4f, 0x02, 0x8b, 0x01, 0x69, 0x09, 0xe7, 0x28, 0x84, 0x58, 0x06, 0xb1, 0x82, 0xe8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x42, 0xf0, 0xa8, 0xd0, 0xce, 0x99, 0x74, 0x43, 0x58, 0x1c, 0xfa, 0x13, 0x99, 0x03, 0x56, 0x03, 0x56, 0x0b, 0x77, 0x03, 0x1b, 0x1c, 0x99, 0x0b, 0x78, 0x0b, 0x37, 0x0b, 0xf7, 0x02, 0x7a, 0x0b, 0xd7, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0x74, 0x0a, 0xd4, 0x63, 0x9c, 0xce, 0xbb, 0xde, 0xfe, 0xde, 0xff, 0x9d, 0xf3, 0x09, 0x56, 0x0a, 0x17, 0x02, 0x77, 0x0a, 0x98, 0x0a, 0x58, 0x0a, 0x56, 0x12, 0x4e, 0x01, 0xca, 0x00, 0xc9, 0x00, 0x46, 0x28, 0x84, 0xa8, 0x62, 0xe0, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x43, 0xf0, 0x86, 0xc8, 0xa6, 0x88, 0xd8, 0xe5, 0xdb, 0xde, 0xda, 0xd6, 0x1d, 0xcf, 0x5f, 0x8e, 0xf5, 0x0a, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x18, 0x03, 0xd7, 0x0a, 0x97, 0x12, 0xb7, 0x12, 0x95, 0x12, 0x72, 0x12, 0x4c, 0x01, 0x2a, 0x01, 0xe8, 0x20, 0x05, 0x50, 0x08, 0xb9, 0x83, 0xe0, 0x41, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x00, 0xf0, 0x42, 0xf8, 0x21, 0xf8, 0x60, 0xf8, 0x85, 0xe1, 0x39, 0xfe, 0xff, 0xd6, 0x96, 0x33, 0x17, 0x0b, 0x37, 0x03, 0x58, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0x19, 0x0b, 0xb7, 0x02, 0xd7, 0x0a, 0xb7, 0x0a, 0xd7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0x57, 0x0b, 0xf6, 0x02, 0xb6, 0x0a, 0x12, 0x3a, 0x09, 0x99, 0x64, 0xd8, 0x42, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf0, 0x83, 0xe0, 0xc5, 0xa0, 0x29, 0x39, 0x8f, 0x12, 0x94, 0x0b, 0xf6, 0x03, 0x97, 0x0b, 0x57, 0x0b, 0x96, 0x03, 0x96, 0x03, 0x97, 0x0b, 0x37, 0x03, 0x58, 0x0b, 0x79, 0x13, 0x58, 0x0b, 0x77, 0x0b, 0x97, 0x0b, 0x76, 0x03, 0x97, 0x0b, 0x76, 0x13, 0xd2, 0x1a, 0x9b, 0x8d, 0x9c, 0xd6, 0xbb, 0xde, 0xdb, 0xd6, 0x1e, 0xc7, 0x54, 0x23, 0x97, 0x0b, 0x76, 0x0b, 0x56, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x58, 0x13, 0x58, 0x13, 0x57, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x36, 0x03, 0x36, 0x0b, 0x16, 0x03, 0x36, 0x0b, 0x16, 0x03, 0x14, 0x13, 0x12, 0x43, 0x3c, 0xbe, 0xab, 0x52, 0xaa, 0x52, 0xac, 0x5a, 0xe4, 0x60, 0xc3, 0xd8, 0x20, 0xf8, 0x41, 0xf0, 0x62, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0xa3, 0xd0, 0x8e, 0xc2, 0x58, 0x8c, 0x37, 0x2b, 0x13, 0x0a, 0xd3, 0x09, 0xd3, 0x01, 0xd3, 0x01, 0x13, 0x0a, 0x13, 0x0a, 0xf3, 0x01, 0x31, 0x22, 0x9e, 0xce, 0x9d, 0xd6, 0x3c, 0x9e, 0xf1, 0x1a, 0x13, 0x0b, 0x35, 0x0b, 0x35, 0x03, 0x15, 0x03, 0x16, 0x03, 0xf5, 0x02, 0x36, 0x0b, 0xf9, 0x2b, 0x77, 0x1b, 0x77, 0x13, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0x16, 0x03, 0x36, 0x0b, 0x16, 0x0b, 0xf5, 0x02, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x17, 0x0b, 0x36, 0x13, 0x37, 0x4c, 0x1d, 0xd7, 0x1b, 0xef, 0x3d, 0xe7, 0x3f, 0xcf, 0x95, 0x23, 0x5a, 0x1c, 0xd8, 0x03, 0x3a, 0x0c, 0x19, 0x04, 0xf9, 0x03, 0x1a, 0x14, 0xfa, 0x13, 0xf9, 0x13, 0x1a, 0x14, 0xd8, 0x03, 0xd8, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xb9, 0x03, 0xfa, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0x99, 0x03, 0xd9, 0x0b, 0xf9, 0x0b, 0xb8, 0x0b, 0xb6, 0x1b, 0x19, 0x65, 0x1d, 0xcf, 0x1c, 0xe7, 0x1d, 0xef, 0x32, 0x8c, 0x2b, 0x32, 0xe7, 0x18, 0x65, 0x38, 0xc6, 0x90, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0xa4, 0xd0, 0x8e, 0x71, 0x34, 0x3a, 0xb6, 0x1a, 0xf8, 0x0a, 0xf8, 0x0a, 0xb7, 0x02, 0xd8, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x93, 0x12, 0x5d, 0xb6, 0xfc, 0xe6, 0x1c, 0xe7, 0xfd, 0xd6, 0x5f, 0xc7, 0x36, 0x3c, 0xd6, 0x1b, 0xb6, 0x03, 0xd8, 0x03, 0xf9, 0x0b, 0x9a, 0x13, 0x59, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0xd8, 0x03, 0xf9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xdb, 0x03, 0xba, 0x13, 0x10, 0x02, 0x8b, 0x01, 0x69, 0x09, 0x48, 0x19, 0xe6, 0x30, 0x06, 0x81, 0xa3, 0xd8, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0xc5, 0xd0, 0x0f, 0x7a, 0xd6, 0x42, 0x19, 0x1b, 0xfa, 0x02, 0x9a, 0x12, 0xb9, 0x12, 0x56, 0x03, 0xb7, 0x13, 0x36, 0x0b, 0x17, 0x0b, 0xf8, 0x0a, 0xd8, 0x0a, 0x18, 0x1b, 0x96, 0x0a, 0xd6, 0x0a, 0xb7, 0x02, 0xd7, 0x0a, 0x94, 0x12, 0x15, 0x64, 0x9c, 0xd6, 0xbb, 0xde, 0xfe, 0xde, 0xde, 0x9d, 0x13, 0x12, 0x36, 0x0a, 0xf6, 0x01, 0x36, 0x0a, 0x37, 0x0a, 0x17, 0x02, 0x15, 0x0a, 0x2e, 0x01, 0xca, 0x00, 0xc9, 0x00, 0x46, 0x28, 0x84, 0xa0, 0x62, 0xe0, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x43, 0xf0, 0xa6, 0xc8, 0xa6, 0x90, 0xb8, 0xe5, 0xbb, 0xde, 0x9b, 0xe6, 0xde, 0xde, 0xbe, 0x95, 0xd5, 0x1a, 0x18, 0x13, 0x18, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x17, 0x0b, 0x17, 0x0b, 0xd6, 0x0a, 0xb2, 0x12, 0x6c, 0x01, 0x4a, 0x01, 0xa7, 0x18, 0x03, 0x58, 0xe6, 0xb8, 0x62, 0xe0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x42, 0xf8, 0x21, 0xf0, 0x81, 0xe8, 0x07, 0xe2, 0x59, 0xfe, 0xff, 0xd6, 0x95, 0x33, 0x15, 0x0b, 0x15, 0x0b, 0x16, 0x0b, 0xd7, 0x0a, 0xb7, 0x0a, 0x97, 0x0a, 0xd8, 0x12, 0xd7, 0x02, 0xf8, 0x02, 0x18, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0x18, 0x03, 0x19, 0x0b, 0x96, 0x1a, 0xf0, 0x51, 0x4b, 0x89, 0x85, 0xd0, 0x22, 0xf0, 0x22, 0xf0, 0x21, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x82, 0xe0, 0xc5, 0x98, 0xc8, 0x40, 0x51, 0x1a, 0x16, 0x03, 0x76, 0x13, 0x76, 0x13, 0x57, 0x13, 0x58, 0x13, 0x79, 0x0b, 0x99, 0x0b, 0x98, 0x03, 0x96, 0x03, 0xd6, 0x0b, 0xb6, 0x13, 0x35, 0x0b, 0x35, 0x0b, 0xb6, 0x03, 0xb6, 0x03, 0x97, 0x03, 0x76, 0x13, 0xf3, 0x1a, 0x7a, 0x8d, 0x9c, 0xce, 0x9a, 0xde, 0xdc, 0xde, 0xfe, 0xc6, 0x33, 0x1b, 0x77, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x38, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x0b, 0x36, 0x03, 0x14, 0x13, 0xf1, 0x3a, 0x5d, 0xbe, 0xed, 0x5a, 0x8a, 0x5a, 0x8a, 0x62, 0xe4, 0x68, 0xa2, 0xd8, 0x20, 0xf8, 0x21, 0xf0, 0x41, 0xf0, 0x00, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x63, 0xe8, 0xa6, 0xc0, 0x0a, 0x79, 0x11, 0x3a, 0xd2, 0x01, 0x92, 0x01, 0xb4, 0x09, 0xb4, 0x01, 0xb4, 0x01, 0xf4, 0x09, 0xf4, 0x09, 0xb3, 0x01, 0x90, 0x11, 0x1d, 0xbe, 0x7d, 0xce, 0x5e, 0xa6, 0xf2, 0x12, 0x34, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x16, 0x03, 0xf5, 0x02, 0xf5, 0x02, 0x77, 0x13, 0x16, 0x0b, 0x15, 0x0b, 0x15, 0x03, 0x15, 0x03, 0x15, 0x03, 0x15, 0x03, 0x16, 0x03, 0x36, 0x03, 0x16, 0x03, 0xf5, 0x02, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0xf7, 0x02, 0x16, 0x13, 0x37, 0x4c, 0x1d, 0xd7, 0x1b, 0xe7, 0x3d, 0xef, 0x5f, 0xd7, 0x95, 0x23, 0x5a, 0x1c, 0xd8, 0x03, 0x19, 0x0c, 0x1a, 0x04, 0xf9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xfa, 0x0b, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x0b, 0xfa, 0x03, 0xda, 0x03, 0x1a, 0x04, 0xd9, 0x03, 0xfa, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xfa, 0x0b, 0xd9, 0x0b, 0xb6, 0x1b, 0xd9, 0x64, 0x1d, 0xcf, 0x1c, 0xe7, 0x1c, 0xef, 0x32, 0x84, 0x0b, 0x32, 0xe7, 0x18, 0x85, 0x38, 0xc6, 0x90, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x86, 0xd0, 0x8e, 0x71, 0x33, 0x32, 0x95, 0x12, 0xd7, 0x02, 0xb7, 0x02, 0x77, 0x02, 0x77, 0x02, 0x76, 0x0a, 0x96, 0x0a, 0x32, 0x12, 0x7e, 0xc6, 0xbc, 0xde, 0xdb, 0xde, 0x1d, 0xdf, 0x3f, 0xcf, 0xd5, 0x43, 0xf6, 0x1b, 0x17, 0x04, 0xd9, 0x03, 0xba, 0x03, 0x79, 0x0b, 0x99, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0xb9, 0x13, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x1b, 0x30, 0x0a, 0x8c, 0x01, 0x69, 0x01, 0x89, 0x09, 0x29, 0x11, 0xe7, 0x50, 0xa4, 0xc8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x42, 0xe8, 0xe8, 0xb0, 0x12, 0x52, 0x97, 0x12, 0xd8, 0x02, 0xd9, 0x02, 0xd9, 0x12, 0xd8, 0x12, 0xd7, 0x0a, 0xf6, 0x0a, 0x16, 0x0b, 0x16, 0x0b, 0x17, 0x0b, 0xd7, 0x0a, 0xd7, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0x95, 0x12, 0x36, 0x6c, 0xbc, 0xd6, 0xbb, 0xde, 0xfe, 0xde, 0x5c, 0x8d, 0x13, 0x12, 0x36, 0x0a, 0xf6, 0x01, 0xd6, 0x09, 0xf6, 0x09, 0xd6, 0x01, 0xd4, 0x09, 0x2d, 0x01, 0xaa, 0x00, 0xc9, 0x00, 0x46, 0x28, 0x64, 0xa0, 0x62, 0xe0, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x43, 0xf0, 0xa6, 0xc8, 0x86, 0x90, 0x99, 0xe5, 0x7b, 0xe6, 0xbb, 0xe6, 0xde, 0xde, 0x3c, 0x7d, 0xf6, 0x1a, 0x38, 0x0b, 0x18, 0x03, 0x38, 0x0b, 0x17, 0x03, 0x17, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0xf6, 0x0a, 0xf3, 0x12, 0x8c, 0x01, 0x6b, 0x01, 0xa6, 0x18, 0x43, 0x70, 0xc3, 0xc8, 0x60, 0xe8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xe8, 0xa2, 0xe0, 0xca, 0xe2, 0x7a, 0xfe, 0xfe, 0xce, 0x55, 0x33, 0xf5, 0x12, 0x16, 0x13, 0xf6, 0x02, 0x17, 0x03, 0xf7, 0x02, 0xb6, 0x02, 0xd7, 0x0a, 0xb6, 0x12, 0x96, 0x0a, 0xb7, 0x02, 0xd8, 0x02, 0x59, 0x1b, 0x7a, 0x23, 0xf8, 0x1a, 0x12, 0x4a, 0x09, 0xa9, 0x64, 0xe0, 0x41, 0xf0, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0x20, 0xf0, 0x83, 0xf8, 0x02, 0xf0, 0x42, 0xd8, 0xa5, 0x90, 0x4a, 0x21, 0x33, 0x0b, 0xb7, 0x03, 0xb8, 0x03, 0x5a, 0x0b, 0x39, 0x0b, 0x59, 0x03, 0x98, 0x03, 0xd7, 0x03, 0xd7, 0x03, 0x96, 0x03, 0xb8, 0x03, 0x3b, 0x1c, 0x5c, 0x2c, 0xfa, 0x23, 0x98, 0x1b, 0x98, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x56, 0x0b, 0xf3, 0x1a, 0x5a, 0x85, 0x9c, 0xce, 0x7a, 0xd6, 0xdc, 0xde, 0xde, 0xbe, 0x33, 0x13, 0x77, 0x0b, 0x97, 0x0b, 0x77, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x35, 0x0b, 0xd1, 0x2a, 0x5c, 0xbe, 0x2e, 0x63, 0x8a, 0x62, 0x49, 0x72, 0xe3, 0x80, 0x82, 0xd8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x63, 0xe0, 0x0b, 0xa9, 0x8c, 0x50, 0x51, 0x21, 0xb4, 0x01, 0xd5, 0x09, 0xd6, 0x09, 0xb5, 0x01, 0xb4, 0x01, 0xd5, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x70, 0x09, 0xbc, 0xb5, 0x5d, 0xc6, 0x3e, 0x9e, 0xd2, 0x12, 0x35, 0x0b, 0x56, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0x16, 0x03, 0x16, 0x03, 0xf5, 0x02, 0x36, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x16, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x0b, 0x38, 0x0b, 0xf7, 0x0a, 0xd5, 0x0a, 0x37, 0x54, 0xdd, 0xd6, 0xfb, 0xee, 0x5d, 0xef, 0x5f, 0xd7, 0xd6, 0x2b, 0x9b, 0x24, 0xf9, 0x0b, 0xf9, 0x03, 0x19, 0x04, 0x19, 0x04, 0xf9, 0x0b, 0xfa, 0x0b, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xb7, 0x0b, 0x55, 0x13, 0xb8, 0x64, 0x1d, 0xcf, 0x1c, 0xe7, 0x1c, 0xef, 0x32, 0x84, 0x0a, 0x2a, 0xe7, 0x18, 0x85, 0x38, 0xc6, 0x90, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x66, 0xd8, 0x2c, 0x89, 0xd1, 0x51, 0x53, 0x2a, 0xb5, 0x12, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0x75, 0x0a, 0x74, 0x0a, 0x51, 0x22, 0x3c, 0xc6, 0x7b, 0xde, 0x79, 0xe6, 0x7b, 0xde, 0xdf, 0xc6, 0xf7, 0x4b, 0x55, 0x1b, 0x56, 0x0b, 0x77, 0x0b, 0x98, 0x0b, 0x77, 0x0b, 0x97, 0x0b, 0x95, 0x0b, 0x96, 0x0b, 0x99, 0x0b, 0xbb, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x97, 0x13, 0xd2, 0x0a, 0xac, 0x01, 0xaa, 0x01, 0x89, 0x09, 0x0a, 0x11, 0x87, 0x38, 0xa5, 0xa8, 0x62, 0xe0, 0x61, 0xe8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0x42, 0xe8, 0x43, 0xe8, 0xc7, 0xc0, 0xce, 0x69, 0x73, 0x32, 0xb7, 0x1a, 0xb7, 0x02, 0xf7, 0x02, 0x18, 0x03, 0xf9, 0x02, 0xf9, 0x0a, 0x17, 0x03, 0x17, 0x0b, 0xd6, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0x95, 0x12, 0x57, 0x6c, 0xbd, 0xd6, 0xdc, 0xde, 0xfe, 0xde, 0xba, 0x74, 0xf3, 0x11, 0x16, 0x12, 0x17, 0x0a, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd5, 0x11, 0x0d, 0x01, 0xaa, 0x00, 0xa9, 0x00, 0x26, 0x28, 0x64, 0xa0, 0x62, 0xe0, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x43, 0xf0, 0xa6, 0xc8, 0xa6, 0x90, 0x78, 0xdd, 0x7b, 0xd6, 0xdc, 0xde, 0xdd, 0xce, 0xd9, 0x5c, 0x36, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0x18, 0x0b, 0xf7, 0x0a, 0xf8, 0x12, 0xd8, 0x12, 0xd7, 0x0a, 0xd7, 0x0a, 0xf5, 0x1a, 0x8d, 0x01, 0x4b, 0x01, 0xa6, 0x28, 0x84, 0x98, 0x82, 0xe0, 0x40, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0xc3, 0xd8, 0x6d, 0xf3, 0x99, 0xfe, 0x3f, 0xcf, 0x96, 0x2b, 0x17, 0x03, 0x18, 0x0b, 0xd8, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0x97, 0x02, 0x97, 0x0a, 0xb6, 0x0a, 0xf7, 0x0a, 0x38, 0x0b, 0x39, 0x0b, 0x19, 0x13, 0xb6, 0x32, 0xcf, 0x59, 0x4a, 0x99, 0x84, 0xd8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0xa3, 0xd8, 0x69, 0xa1, 0x0a, 0x39, 0x34, 0x1b, 0xd7, 0x03, 0xf7, 0x03, 0xd7, 0x03, 0x97, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x0b, 0x5b, 0x13, 0x5a, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0xb7, 0x03, 0x97, 0x03, 0x77, 0x03, 0x78, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x03, 0x35, 0x0b, 0x13, 0x23, 0x3a, 0x85, 0x9c, 0xce, 0x7a, 0xd6, 0xfd, 0xd6, 0x9d, 0xae, 0x54, 0x1b, 0x77, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x14, 0x0b, 0xd1, 0x2a, 0x3c, 0xb6, 0x2e, 0x6b, 0x6a, 0x6a, 0x08, 0x8a, 0xe3, 0xa0, 0x82, 0xe8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x64, 0xd0, 0x4d, 0x91, 0x10, 0x41, 0x93, 0x19, 0xb5, 0x01, 0xb6, 0x09, 0xb6, 0x09, 0x95, 0x01, 0xb5, 0x01, 0xd5, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb1, 0x11, 0xbc, 0xb5, 0x9e, 0xce, 0xbc, 0x85, 0xf3, 0x12, 0x35, 0x0b, 0x56, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x16, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x36, 0x03, 0x57, 0x0b, 0x36, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x56, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x0b, 0x18, 0x03, 0xf7, 0x0a, 0xd5, 0x0a, 0x17, 0x54, 0xdc, 0xce, 0x1b, 0xef, 0x3d, 0xef, 0x1f, 0xcf, 0xd6, 0x2b, 0x9b, 0x24, 0x1a, 0x0c, 0xd9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xd9, 0x0b, 0xda, 0x0b, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0x77, 0x0b, 0x55, 0x1b, 0x3a, 0x75, 0xfd, 0xce, 0x1c, 0xe7, 0x1c, 0xef, 0x12, 0x84, 0x0a, 0x2a, 0xe7, 0x18, 0x65, 0x38, 0xc6, 0x90, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x42, 0xe8, 0x43, 0xe8, 0x22, 0xf0, 0x22, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x01, 0xf0, 0x20, 0xf8, 0x40, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x62, 0xf8, 0x62, 0xf0, 0x41, 0xf8, 0x01, 0xf0, 0x03, 0xf8, 0x04, 0xf8, 0x04, 0xf8, 0xe8, 0xb8, 0xb2, 0x42, 0xb8, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x13, 0x14, 0x1b, 0x8c, 0x01, 0x8a, 0x01, 0x8a, 0x09, 0x2a, 0x11, 0xa8, 0x28, 0xc6, 0x68, 0xc4, 0xa8, 0x61, 0xe8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x84, 0xd8, 0x49, 0x99, 0xae, 0x59, 0x55, 0x2a, 0xb8, 0x12, 0x17, 0x03, 0xf7, 0x02, 0x98, 0x02, 0xb9, 0x12, 0xd8, 0x0a, 0xd8, 0x0a, 0xb8, 0x02, 0x75, 0x12, 0x77, 0x74, 0x9d, 0xce, 0xdc, 0xde, 0x1f, 0xdf, 0xdb, 0x7c, 0xf3, 0x09, 0x16, 0x0a, 0xf8, 0x09, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb5, 0x09, 0x0d, 0x01, 0xaa, 0x00, 0xa9, 0x00, 0x26, 0x28, 0x84, 0xa0, 0x62, 0xe0, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x43, 0xf0, 0xa6, 0xc8, 0xa6, 0x88, 0x98, 0xcd, 0xbb, 0xce, 0xdb, 0xde, 0xbd, 0xce, 0x37, 0x4c, 0x16, 0x13, 0x38, 0x0b, 0xf8, 0x02, 0x18, 0x0b, 0xf8, 0x02, 0x19, 0x03, 0x19, 0x03, 0xd8, 0x02, 0xd8, 0x0a, 0xb6, 0x22, 0x2e, 0x09, 0xe9, 0x08, 0xa6, 0x48, 0xa5, 0xc0, 0x22, 0xf0, 0x20, 0xf0, 0x41, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x62, 0xf8, 0xa3, 0xd0, 0x72, 0xfc, 0xb9, 0xf6, 0x5f, 0xcf, 0xd6, 0x33, 0xd7, 0x02, 0x19, 0x0b, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x98, 0x02, 0xb8, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xf8, 0x0a, 0xf9, 0x02, 0xb8, 0x02, 0x13, 0x32, 0x08, 0x99, 0xa2, 0xd8, 0x80, 0xe8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x60, 0xf8, 0xa1, 0xe8, 0x61, 0xb0, 0x0b, 0x9a, 0x0d, 0x5a, 0x70, 0x3a, 0x14, 0x2b, 0x36, 0x1b, 0x57, 0x13, 0x37, 0x13, 0x57, 0x13, 0x77, 0x0b, 0x97, 0x0b, 0x96, 0x0b, 0x96, 0x0b, 0xd6, 0x03, 0xb7, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0x9a, 0x13, 0x7a, 0x13, 0x38, 0x1b, 0x37, 0x13, 0x57, 0x0b, 0x15, 0x0b, 0xf3, 0x1a, 0x1a, 0x85, 0x9d, 0xce, 0x7b, 0xd6, 0xdc, 0xd6, 0x3c, 0xa6, 0x54, 0x13, 0x77, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x56, 0x03, 0xf3, 0x12, 0x73, 0x4b, 0x3b, 0xbe, 0x0d, 0x5b, 0x29, 0x6a, 0x86, 0xa9, 0xc3, 0xc8, 0x62, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x85, 0xd0, 0xed, 0x60, 0x52, 0x29, 0x94, 0x11, 0x75, 0x01, 0x75, 0x01, 0x96, 0x01, 0x96, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb4, 0x01, 0x94, 0x01, 0x91, 0x11, 0x7b, 0xad, 0x9e, 0xce, 0xbc, 0x8d, 0x13, 0x13, 0x35, 0x0b, 0x56, 0x03, 0x56, 0x03, 0x57, 0x03, 0x16, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x16, 0x03, 0x57, 0x03, 0x16, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0x36, 0x03, + 0x39, 0x0b, 0x39, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x0b, 0x18, 0x03, 0x17, 0x0b, 0xf6, 0x12, 0x58, 0x54, 0xdd, 0xce, 0xfb, 0xee, 0x3d, 0xef, 0xde, 0xc6, 0x95, 0x23, 0x5a, 0x1c, 0x1a, 0x0c, 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0xf9, 0x0b, 0x97, 0x0b, 0x75, 0x23, 0xbc, 0x85, 0xfd, 0xd6, 0xfb, 0xe6, 0x1c, 0xef, 0x12, 0x84, 0x0a, 0x2a, 0xe7, 0x18, 0x65, 0x38, 0xc6, 0x90, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x62, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0xc6, 0xb8, 0xb3, 0x3a, 0xda, 0x03, 0xda, 0x03, 0xba, 0x0b, 0xb9, 0x0b, 0x78, 0x0b, 0x35, 0x1b, 0x8d, 0x01, 0x6a, 0x01, 0x69, 0x09, 0x69, 0x01, 0x48, 0x11, 0x07, 0x21, 0xe6, 0x68, 0x84, 0xd0, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x21, 0xe8, 0xc4, 0xc0, 0x6a, 0x89, 0x13, 0x42, 0x77, 0x1a, 0x97, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xb7, 0x02, 0x74, 0x12, 0x98, 0x74, 0x9d, 0xce, 0xfc, 0xde, 0x1f, 0xdf, 0xbe, 0x95, 0x14, 0x0a, 0xf6, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb7, 0x09, 0xb7, 0x01, 0x94, 0x09, 0x0e, 0x01, 0xaa, 0x00, 0xa9, 0x00, 0x26, 0x28, 0x64, 0xa8, 0x62, 0xe8, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x42, 0xf0, 0xa6, 0xc8, 0xa6, 0x88, 0x77, 0xdd, 0x9b, 0xde, 0xbb, 0xe6, 0x9d, 0xce, 0xf6, 0x43, 0x16, 0x0b, 0x38, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x0a, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xd7, 0x0a, 0xb5, 0x1a, 0x0d, 0x11, 0xa7, 0x38, 0xa5, 0x80, 0x84, 0xe0, 0x01, 0xf8, 0x01, 0xf0, 0x22, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x62, 0xf0, 0x04, 0xc1, 0x96, 0xfd, 0xba, 0xf6, 0x3e, 0xd7, 0x17, 0x54, 0x94, 0x0a, 0xf7, 0x0a, 0xb7, 0x02, 0x96, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xb7, 0x0a, 0x97, 0x0a, 0x97, 0x02, 0xd9, 0x0a, 0xd9, 0x02, 0x12, 0x3a, 0x06, 0xb9, 0x41, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x22, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x20, 0xf0, 0x60, 0xf0, 0x80, 0xf8, 0x60, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x43, 0xf0, 0x84, 0xd8, 0x08, 0xb9, 0xad, 0x81, 0x72, 0x4a, 0x36, 0x1b, 0x98, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x97, 0x03, 0x97, 0x03, 0xb7, 0x03, 0x77, 0x03, 0x15, 0x0b, 0xf3, 0x1a, 0x1a, 0x85, 0x9c, 0xce, 0x7b, 0xd6, 0xdc, 0xd6, 0xda, 0x95, 0x54, 0x13, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0x36, 0x0b, 0x13, 0x1b, 0x97, 0x74, 0x1a, 0xbe, 0xab, 0x52, 0xe8, 0x79, 0x05, 0xc1, 0x62, 0xf0, 0x22, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0xc8, 0xc0, 0x0d, 0x41, 0x93, 0x09, 0xd5, 0x09, 0xb5, 0x01, 0x96, 0x09, 0xb6, 0x09, 0xb6, 0x01, 0x95, 0x01, 0x94, 0x01, 0xb4, 0x01, 0xd4, 0x09, 0x50, 0x09, 0x3a, 0xad, 0x7e, 0xce, 0x5e, 0x9e, 0xf3, 0x1a, 0x35, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x16, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x16, 0x03, 0x37, 0x03, 0x16, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, + 0x39, 0x0b, 0x39, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x39, 0x0b, 0x18, 0x03, 0x18, 0x0b, 0xf6, 0x0a, 0x99, 0x5c, 0xdd, 0xce, 0xfb, 0xe6, 0x3d, 0xef, 0xff, 0xc6, 0x75, 0x1b, 0x19, 0x14, 0xfa, 0x0b, 0x1a, 0x0c, 0x1a, 0x04, 0x1a, 0x04, 0xda, 0x03, 0xba, 0x0b, 0xd9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xba, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0x77, 0x0b, 0x35, 0x1b, 0x9b, 0x85, 0xfd, 0xce, 0xfb, 0xe6, 0xfc, 0xe6, 0x12, 0x84, 0x0a, 0x2a, 0xe7, 0x18, 0x65, 0x38, 0xc6, 0x90, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x42, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0x21, 0xf8, 0xe6, 0xc0, 0x93, 0x52, 0x99, 0x13, 0xb9, 0x0b, 0x98, 0x03, 0x97, 0x0b, 0x56, 0x13, 0x57, 0x1b, 0x31, 0x02, 0x8b, 0x01, 0x69, 0x01, 0xa9, 0x01, 0xa9, 0x01, 0x28, 0x01, 0xe7, 0x30, 0xe7, 0x98, 0x64, 0xd0, 0x42, 0xf0, 0x21, 0xf8, 0x40, 0xf0, 0x40, 0xf0, 0x20, 0xf8, 0x01, 0xf8, 0x61, 0xf0, 0x41, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x41, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0x62, 0xd8, 0xe7, 0xa8, 0xef, 0x59, 0x74, 0x2a, 0x95, 0x1a, 0xb6, 0x12, 0x97, 0x0a, 0x94, 0x12, 0xb8, 0x84, 0x9c, 0xd6, 0xdb, 0xde, 0xfe, 0xde, 0x3f, 0xa6, 0xf3, 0x09, 0xf6, 0x09, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x09, 0xd7, 0x09, 0x94, 0x09, 0x0e, 0x01, 0xaa, 0x00, 0xa9, 0x00, 0x26, 0x28, 0x64, 0xa8, 0x62, 0xe8, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x42, 0xf0, 0xa6, 0xc8, 0xa6, 0x90, 0x37, 0xdd, 0x9b, 0xe6, 0x9b, 0xe6, 0xbd, 0xc6, 0x17, 0x3c, 0x36, 0x03, 0x79, 0x03, 0xf8, 0x02, 0xd8, 0x0a, 0xb8, 0x12, 0xd8, 0x12, 0xd8, 0x12, 0xf7, 0x0a, 0xb5, 0x0a, 0x73, 0x22, 0xca, 0x28, 0xa5, 0x88, 0x83, 0xc8, 0x62, 0xf0, 0x01, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf0, 0x41, 0xf8, 0x00, 0xf8, 0x62, 0xe0, 0xca, 0xca, 0x37, 0xfe, 0xbb, 0xee, 0xfe, 0xd6, 0xd9, 0x64, 0xb3, 0x0a, 0xd5, 0x0a, 0xb6, 0x02, 0x76, 0x02, 0x77, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0xb7, 0x02, 0xf7, 0x02, 0xf8, 0x0a, 0x18, 0x13, 0x53, 0x02, 0x2c, 0x31, 0x85, 0xb8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x22, 0xf8, 0x21, 0xf0, 0x41, 0xf0, 0x81, 0xf8, 0x00, 0xf0, 0x41, 0xf8, 0x20, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x84, 0xe0, 0x69, 0x99, 0x2e, 0x5a, 0x35, 0x23, 0xb8, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x03, 0x78, 0x03, 0x58, 0x03, 0x59, 0x0b, 0x57, 0x0b, 0x15, 0x0b, 0xf3, 0x22, 0x1a, 0x85, 0x7c, 0xce, 0x9b, 0xde, 0xdc, 0xd6, 0xda, 0x95, 0x75, 0x1b, 0x97, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x59, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x38, 0x0b, 0x37, 0x0b, 0x36, 0x0b, 0xf3, 0x1a, 0x5a, 0x95, 0x37, 0xad, 0x49, 0x62, 0xa6, 0x91, 0xa2, 0xd8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x22, 0xf0, 0x65, 0xd8, 0xcb, 0x98, 0x50, 0x31, 0xb4, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x96, 0x01, 0x76, 0x01, 0x75, 0x01, 0x95, 0x01, 0x94, 0x01, 0xd5, 0x09, 0xd4, 0x09, 0x50, 0x11, 0x3a, 0xad, 0x7d, 0xce, 0x7f, 0xa6, 0xf3, 0x1a, 0x15, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x17, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, + 0x19, 0x0b, 0x19, 0x0b, 0x19, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x0b, 0x38, 0x03, 0x17, 0x0b, 0xf6, 0x0a, 0xb9, 0x5c, 0xdd, 0xce, 0xdb, 0xe6, 0x5e, 0xef, 0x5f, 0xcf, 0xb6, 0x23, 0x19, 0x14, 0xf9, 0x0b, 0x1a, 0x04, 0xd9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xba, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xba, 0x0b, 0xba, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xfa, 0x0b, 0x98, 0x0b, 0x35, 0x1b, 0x9c, 0x85, 0xfd, 0xce, 0xfb, 0xe6, 0xfc, 0xe6, 0x12, 0x84, 0x0a, 0x2a, 0xe7, 0x18, 0x85, 0x38, 0xc6, 0x90, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x20, 0xf0, 0x20, 0xf0, 0x41, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf0, 0x60, 0xf0, 0x60, 0xf0, 0x20, 0xf0, 0x01, 0xf8, 0x22, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0xe6, 0xb8, 0xf2, 0x3a, 0xda, 0x03, 0x9b, 0x03, 0x7b, 0x03, 0x9b, 0x03, 0x9a, 0x03, 0xb9, 0x0b, 0xf4, 0x02, 0xac, 0x01, 0x69, 0x01, 0x69, 0x01, 0x8a, 0x01, 0x4a, 0x01, 0xe8, 0x18, 0x69, 0x61, 0x06, 0xa1, 0x83, 0xe0, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x02, 0xf8, 0x23, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x63, 0xe8, 0xc8, 0xa8, 0xf0, 0x41, 0xb6, 0x12, 0x96, 0x0a, 0x93, 0x1a, 0xd7, 0x84, 0x9b, 0xd6, 0xdb, 0xe6, 0xfd, 0xde, 0x3f, 0xa6, 0x91, 0x01, 0xf5, 0x09, 0xd6, 0x01, 0xb5, 0x01, 0x95, 0x01, 0xb6, 0x09, 0xb5, 0x09, 0xed, 0x00, 0x8a, 0x00, 0xa9, 0x00, 0x26, 0x28, 0x64, 0xa8, 0x42, 0xe8, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x42, 0xf0, 0xa6, 0xc8, 0xa6, 0x88, 0x36, 0xcd, 0xbb, 0xd6, 0xbb, 0xde, 0xbd, 0xc6, 0x37, 0x44, 0x37, 0x0b, 0x7a, 0x0b, 0xf9, 0x02, 0xd8, 0x0a, 0xd7, 0x12, 0xd7, 0x0a, 0xd6, 0x0a, 0xd6, 0x12, 0x74, 0x22, 0x31, 0x3a, 0x88, 0x58, 0x84, 0xc8, 0x81, 0xf8, 0x40, 0xf0, 0x20, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x20, 0xf0, 0x41, 0xf0, 0x21, 0xf8, 0x82, 0xd8, 0xb1, 0xec, 0x58, 0xe6, 0xdc, 0xf6, 0xbf, 0xd6, 0x5c, 0x75, 0xd4, 0x0a, 0xf6, 0x02, 0xf7, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x0a, 0xb7, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0x55, 0x0a, 0x74, 0x22, 0x8c, 0x09, 0x86, 0x30, 0xa6, 0xb0, 0x23, 0xe8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x20, 0xf0, 0x81, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x85, 0xd0, 0xab, 0x89, 0x91, 0x52, 0x57, 0x23, 0x99, 0x0b, 0x79, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x15, 0x13, 0xf3, 0x22, 0x3a, 0x85, 0x7c, 0xce, 0x9b, 0xde, 0xfc, 0xd6, 0xda, 0x95, 0x75, 0x1b, 0x77, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x79, 0x0b, 0x38, 0x03, 0x38, 0x0b, 0x58, 0x0b, 0x16, 0x0b, 0xb2, 0x12, 0x7a, 0x95, 0xf2, 0x93, 0xe8, 0x79, 0x65, 0xa9, 0x81, 0xd8, 0x20, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x84, 0xe8, 0xc8, 0xb8, 0x8b, 0x68, 0x72, 0x29, 0x95, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x96, 0x01, 0x76, 0x01, 0x96, 0x01, 0xb6, 0x09, 0x95, 0x01, 0x94, 0x01, 0x93, 0x01, 0x91, 0x19, 0x1a, 0xad, 0x5d, 0xce, 0x1e, 0x9e, 0xf3, 0x1a, 0x15, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x0b, 0x17, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x0b, 0xd6, 0x02, 0xf5, 0x1a, 0x58, 0x5c, 0xdd, 0xce, 0xfc, 0xe6, 0x3d, 0xe7, 0x7f, 0xcf, 0xd5, 0x23, 0xf8, 0x0b, 0x3a, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x76, 0x03, 0x75, 0x1b, 0x5a, 0x75, 0xdc, 0xce, 0xfb, 0xde, 0x1c, 0xe7, 0x31, 0x84, 0x89, 0x19, 0x08, 0x19, 0xa5, 0x38, 0xc5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x21, 0xf0, 0x07, 0xb9, 0xf4, 0x42, 0xba, 0x03, 0xba, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0xd8, 0x0b, 0x96, 0x13, 0x30, 0x12, 0x2c, 0x09, 0x4b, 0x11, 0x4a, 0x09, 0x2a, 0x01, 0x49, 0x09, 0x08, 0x32, 0x49, 0x6a, 0x47, 0xa9, 0xa5, 0xd8, 0x22, 0xe8, 0x41, 0xf8, 0x40, 0xf8, 0x60, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x60, 0xf8, 0x61, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x22, 0xe0, 0x28, 0xb9, 0xd0, 0x51, 0x52, 0x2a, 0x19, 0x95, 0x7c, 0xc6, 0xbc, 0xde, 0x1f, 0xdf, 0xdf, 0xa5, 0xb1, 0x11, 0xf5, 0x11, 0xb5, 0x09, 0x76, 0x01, 0xb7, 0x09, 0x76, 0x09, 0xb4, 0x11, 0x0d, 0x01, 0xaa, 0x00, 0xaa, 0x08, 0x06, 0x30, 0x44, 0xa8, 0x62, 0xe8, 0x60, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x43, 0xf8, 0x64, 0xe8, 0x85, 0xc8, 0xc6, 0x98, 0xb5, 0xc4, 0xbc, 0xd6, 0xbb, 0xce, 0x3f, 0xcf, 0xb4, 0x3b, 0x76, 0x1b, 0x77, 0x03, 0x18, 0x03, 0x98, 0x12, 0x79, 0x1a, 0x7a, 0x12, 0x78, 0x12, 0x73, 0x22, 0xed, 0x59, 0xe6, 0xb0, 0x42, 0xe8, 0x41, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x40, 0xf8, 0x22, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x22, 0xf8, 0xa4, 0xc8, 0xf7, 0xfd, 0x99, 0xde, 0xbb, 0xee, 0xff, 0xe6, 0x1b, 0x75, 0xd4, 0x0a, 0x17, 0x0b, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x98, 0x02, 0x97, 0x0a, 0x94, 0x12, 0x6d, 0x01, 0x2a, 0x01, 0xe7, 0x38, 0x84, 0xb8, 0x22, 0xf8, 0x40, 0xf0, 0x41, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x40, 0xf0, 0x60, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x21, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0xc7, 0xc0, 0x91, 0x52, 0x57, 0x1b, 0x78, 0x13, 0x78, 0x0b, 0x96, 0x03, 0x96, 0x03, 0x78, 0x0b, 0x38, 0x0b, 0x57, 0x0b, 0x15, 0x13, 0x13, 0x23, 0xfc, 0x9d, 0x9b, 0xce, 0xfc, 0xde, 0xfe, 0xd6, 0x9b, 0x8d, 0x75, 0x1b, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0x57, 0x0b, 0x15, 0x0b, 0x13, 0x33, 0x6e, 0x72, 0x06, 0xb1, 0x62, 0xe0, 0x40, 0xf0, 0x40, 0xf8, 0x40, 0xf0, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0xa4, 0xd8, 0x0a, 0x79, 0x4f, 0x39, 0x94, 0x11, 0xb6, 0x01, 0xb6, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x75, 0x09, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0x71, 0x11, 0x1a, 0xad, 0x5d, 0xce, 0x1d, 0x96, 0x13, 0x13, 0xf5, 0x02, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x59, 0x0b, 0x17, 0x0b, 0xf6, 0x1a, 0x38, 0x5c, 0xfe, 0xd6, 0xfc, 0xe6, 0x3d, 0xe7, 0x5f, 0xcf, 0xd5, 0x23, 0xf8, 0x0b, 0x3a, 0x14, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xf9, 0x0b, 0xb7, 0x0b, 0x96, 0x23, 0x7b, 0x7d, 0xdd, 0xce, 0xdb, 0xde, 0xfb, 0xe6, 0x32, 0x84, 0x68, 0x19, 0x07, 0x19, 0xa5, 0x38, 0xc5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x60, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x07, 0xc1, 0xf3, 0x42, 0xb9, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x0b, 0x99, 0x13, 0xf4, 0x0a, 0x0e, 0x02, 0x89, 0x01, 0x47, 0x01, 0x28, 0x01, 0x48, 0x11, 0xe9, 0x31, 0xab, 0x5a, 0x69, 0x62, 0xe8, 0x89, 0xe6, 0xc8, 0x44, 0xf0, 0x61, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf0, 0x40, 0xf0, 0x20, 0xf0, 0x84, 0xf0, 0x67, 0xc0, 0xe9, 0x90, 0xf5, 0xbc, 0x9b, 0xce, 0xfd, 0xf6, 0x9e, 0xde, 0xfe, 0x8d, 0x53, 0x02, 0xf6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb5, 0x01, 0x0e, 0x01, 0xa9, 0x00, 0xaa, 0x08, 0x06, 0x30, 0x44, 0xa8, 0x42, 0xe8, 0x41, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x43, 0xf0, 0x64, 0xd8, 0xa5, 0xb0, 0x34, 0xdc, 0xda, 0xed, 0x39, 0xde, 0x5b, 0xc6, 0x93, 0x33, 0xf5, 0x0a, 0x19, 0x03, 0x1a, 0x03, 0xd7, 0x0a, 0x93, 0x2a, 0x0f, 0x52, 0x6a, 0x89, 0xa6, 0xc8, 0x23, 0xe8, 0x22, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x01, 0xf8, 0x63, 0xe8, 0xe6, 0xc0, 0x87, 0x99, 0x39, 0xf6, 0x9a, 0xde, 0x9b, 0xde, 0xbe, 0xce, 0x9d, 0x85, 0xd5, 0x12, 0xf6, 0x0a, 0xb6, 0x02, 0xb7, 0x02, 0x76, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x75, 0x12, 0x8f, 0x01, 0x0b, 0x01, 0x09, 0x01, 0xa6, 0x30, 0xa4, 0xb0, 0x21, 0xe8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x60, 0xf8, 0x60, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x84, 0xd0, 0xaa, 0x89, 0x90, 0x52, 0x56, 0x23, 0x78, 0x03, 0x97, 0x03, 0x97, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x15, 0x0b, 0x13, 0x23, 0xdc, 0x95, 0x7b, 0xc6, 0xbb, 0xde, 0xfd, 0xd6, 0x9b, 0x8d, 0x75, 0x1b, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x59, 0x0b, 0x79, 0x03, 0x58, 0x03, 0x57, 0x13, 0x16, 0x0b, 0x78, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x14, 0x23, 0xac, 0x21, 0xcb, 0x79, 0xc4, 0xc0, 0x41, 0xf0, 0x40, 0xf0, 0x40, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x42, 0xf0, 0xa6, 0xb8, 0x2e, 0x59, 0x73, 0x21, 0x95, 0x11, 0x96, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x75, 0x09, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0x91, 0x11, 0x1a, 0xa5, 0x5d, 0xce, 0x1d, 0x96, 0x13, 0x1b, 0x16, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x38, 0x03, 0xf7, 0x02, 0xf5, 0x12, 0xf6, 0x4b, 0x1e, 0xd7, 0xfc, 0xe6, 0x1d, 0xe7, 0x3f, 0xcf, 0xb5, 0x23, 0xf8, 0x0b, 0x5b, 0x14, 0xfa, 0x0b, 0xf9, 0x0b, 0xd9, 0x0b, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb8, 0x0b, 0x76, 0x1b, 0x3a, 0x75, 0xfd, 0xce, 0xdb, 0xde, 0xfb, 0xe6, 0x32, 0x84, 0x48, 0x11, 0xe7, 0x18, 0xa5, 0x38, 0xc5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0xe7, 0xc0, 0xd1, 0x4a, 0xb8, 0x0b, 0x78, 0x0b, 0x79, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0x59, 0x03, 0x9a, 0x0b, 0x98, 0x0b, 0xd2, 0x02, 0xeb, 0x01, 0x67, 0x01, 0x67, 0x01, 0x87, 0x01, 0x0a, 0x32, 0xac, 0x52, 0x89, 0x4a, 0xaa, 0x62, 0x4b, 0x62, 0xa5, 0x68, 0x84, 0xb8, 0x42, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x41, 0xf0, 0x41, 0xf0, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x00, 0xf0, 0x41, 0xf8, 0x82, 0xe0, 0x07, 0xba, 0x39, 0xfe, 0x7b, 0xe6, 0xff, 0xd6, 0x39, 0x54, 0xd3, 0x01, 0x17, 0x02, 0xd7, 0x01, 0xd6, 0x09, 0x75, 0x01, 0x96, 0x01, 0xb5, 0x09, 0x0d, 0x01, 0xa9, 0x00, 0xa9, 0x08, 0x06, 0x30, 0x44, 0xa8, 0x42, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x43, 0xf0, 0x22, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x63, 0xf8, 0x23, 0xe8, 0x64, 0xe8, 0xa3, 0xe8, 0x20, 0xe0, 0x40, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x41, 0xf0, 0xa4, 0xd0, 0x6a, 0x89, 0xec, 0x59, 0x7a, 0xd6, 0xba, 0xd6, 0xbc, 0xde, 0xdf, 0xd6, 0x9e, 0x7d, 0xd5, 0x0a, 0x16, 0x0b, 0x17, 0x03, 0x18, 0x0b, 0xb7, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0x96, 0x0a, 0x74, 0x12, 0x2c, 0x01, 0xea, 0x08, 0xc9, 0x10, 0x25, 0x38, 0xa5, 0xc0, 0x62, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x42, 0xf0, 0x82, 0xd8, 0x88, 0xa1, 0xd3, 0x3a, 0x78, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0x58, 0x0b, 0x16, 0x0b, 0xd3, 0x1a, 0x5a, 0x85, 0x9b, 0xce, 0xdb, 0xde, 0xfe, 0xd6, 0x7a, 0x8d, 0x75, 0x1b, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x13, 0x16, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x56, 0x03, 0xf3, 0x2a, 0xe7, 0x40, 0x26, 0xa1, 0x62, 0xd8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf0, 0x84, 0xe8, 0x86, 0xd0, 0xaa, 0x88, 0x31, 0x29, 0xb5, 0x01, 0x96, 0x09, 0xb7, 0x09, 0x96, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x75, 0x09, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0x91, 0x11, 0x1a, 0xa5, 0x5d, 0xce, 0x5e, 0x9e, 0xf2, 0x12, 0x35, 0x13, 0x37, 0x0b, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x0b, 0x16, 0x13, 0xd6, 0x4b, 0x3e, 0xd7, 0x1c, 0xe7, 0x3d, 0xe7, 0x7f, 0xcf, 0xb4, 0x23, 0xf8, 0x0b, 0x5b, 0x1c, 0xfa, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xd9, 0x03, 0x98, 0x0b, 0x56, 0x1b, 0xf9, 0x6c, 0xfd, 0xce, 0xdb, 0xde, 0xfb, 0xe6, 0x32, 0x84, 0x28, 0x11, 0xe7, 0x18, 0x85, 0x38, 0xc5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x60, 0xf8, 0x40, 0xf0, 0x21, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0x60, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x01, 0xf0, 0x43, 0xf8, 0x24, 0xf0, 0x25, 0xe8, 0xea, 0xb0, 0xb2, 0x42, 0x98, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xba, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x13, 0x77, 0x13, 0xb2, 0x02, 0xac, 0x01, 0x29, 0x01, 0x27, 0x11, 0xe9, 0x29, 0xaa, 0x4a, 0xaa, 0x52, 0xeb, 0x5a, 0xad, 0x42, 0xa6, 0x10, 0xc5, 0x40, 0xa4, 0x80, 0xa3, 0xd0, 0x21, 0xf0, 0x21, 0xf0, 0x21, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x00, 0xf0, 0x41, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x20, 0xf0, 0x41, 0xf8, 0x40, 0xf8, 0x00, 0xf0, 0xa2, 0xe8, 0x08, 0xda, 0x39, 0xfe, 0x3f, 0xdf, 0x1a, 0x6c, 0x94, 0x11, 0xf5, 0x11, 0x94, 0x09, 0x95, 0x11, 0x95, 0x11, 0xb5, 0x09, 0x93, 0x09, 0x0d, 0x01, 0xa9, 0x00, 0xc9, 0x00, 0x26, 0x28, 0x44, 0xa8, 0x42, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x41, 0xf8, 0x60, 0xf8, 0x40, 0xf0, 0x21, 0xf0, 0x22, 0xf8, 0x21, 0xf0, 0xc5, 0xb8, 0xee, 0x49, 0x50, 0x22, 0x5c, 0xce, 0x7b, 0xe6, 0xdd, 0xee, 0x1f, 0xdf, 0x5c, 0x75, 0xb4, 0x0a, 0xf6, 0x0a, 0xf7, 0x02, 0x18, 0x0b, 0xf8, 0x0a, 0xf8, 0x02, 0x97, 0x02, 0xb6, 0x02, 0xd5, 0x0a, 0x6d, 0x01, 0x2a, 0x09, 0xc9, 0x10, 0x26, 0x38, 0xa6, 0xa8, 0x64, 0xe0, 0x42, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x61, 0xf8, 0x40, 0xf8, 0x60, 0xf0, 0x40, 0xf0, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0xe4, 0xc8, 0x2f, 0x62, 0x15, 0x2b, 0x77, 0x13, 0x98, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0x78, 0x0b, 0x36, 0x0b, 0xd3, 0x1a, 0xf9, 0x74, 0xbc, 0xce, 0xdc, 0xde, 0xfe, 0xd6, 0x7a, 0x85, 0x75, 0x1b, 0x77, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x77, 0x03, 0x59, 0x03, 0x39, 0x0b, 0x38, 0x13, 0x16, 0x0b, 0x76, 0x13, 0x2f, 0x32, 0xc6, 0x90, 0x82, 0xe0, 0x41, 0xf0, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x85, 0xe0, 0xcb, 0x90, 0xef, 0x40, 0x53, 0x11, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x09, 0xb6, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x94, 0x01, 0x91, 0x11, 0xf9, 0x9c, 0x5c, 0xc6, 0x7e, 0xa6, 0xd2, 0x12, 0x35, 0x0b, 0x17, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x59, 0x03, 0x59, 0x0b, 0x36, 0x1b, 0xd6, 0x4b, 0x3e, 0xd7, 0xfc, 0xe6, 0x1d, 0xe7, 0x5f, 0xd7, 0xd5, 0x23, 0xf8, 0x13, 0x3a, 0x1c, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x0b, 0xb8, 0x0b, 0x76, 0x1b, 0xf9, 0x6c, 0xfd, 0xce, 0xfb, 0xde, 0xfb, 0xe6, 0x32, 0x84, 0x48, 0x11, 0xe7, 0x18, 0x85, 0x38, 0xe5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x42, 0xf0, 0x23, 0xc0, 0x04, 0xa0, 0x45, 0x90, 0x66, 0x88, 0x45, 0x80, 0x65, 0x80, 0x85, 0x80, 0xa5, 0x80, 0xa4, 0x78, 0xa4, 0x80, 0x66, 0xa1, 0x65, 0xa9, 0x45, 0xa9, 0x66, 0xa9, 0xc4, 0x98, 0xa4, 0x88, 0xe4, 0x88, 0xe5, 0x80, 0xc5, 0x80, 0xc7, 0x80, 0xcc, 0x89, 0xee, 0x81, 0xce, 0x79, 0x51, 0x62, 0x36, 0x2b, 0xb9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0xda, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0xda, 0x13, 0x58, 0x03, 0x72, 0x02, 0x8c, 0x01, 0xe7, 0x08, 0xe9, 0x39, 0xab, 0x5a, 0xeb, 0x5a, 0xab, 0x52, 0x4d, 0x52, 0xe9, 0x18, 0x49, 0x01, 0x48, 0x09, 0xe6, 0x30, 0xc6, 0x70, 0x84, 0xc0, 0x43, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x20, 0xf0, 0x21, 0xf8, 0x42, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x20, 0xf8, 0x81, 0xe0, 0xab, 0xda, 0x7d, 0xfe, 0xbc, 0x8c, 0xb4, 0x09, 0xf5, 0x11, 0x94, 0x01, 0x95, 0x09, 0xb6, 0x09, 0xd6, 0x01, 0xd4, 0x01, 0x2d, 0x01, 0xa9, 0x00, 0xc9, 0x00, 0x26, 0x28, 0x64, 0xa0, 0x42, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x61, 0xf8, 0x21, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x22, 0xf0, 0x22, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x84, 0xe8, 0xe8, 0xa8, 0x8d, 0x69, 0x12, 0x32, 0x51, 0x22, 0x7d, 0xc6, 0x9b, 0xde, 0xbb, 0xe6, 0xbd, 0xd6, 0x9d, 0x95, 0xb4, 0x1a, 0xd7, 0x12, 0xb8, 0x0a, 0xd8, 0x0a, 0xf8, 0x0a, 0x18, 0x03, 0xd7, 0x02, 0xd8, 0x02, 0xb6, 0x0a, 0x6d, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0xe8, 0x18, 0xe7, 0x50, 0xc6, 0x58, 0xe5, 0x50, 0xe5, 0x48, 0xc5, 0x58, 0x66, 0x60, 0x47, 0x78, 0x26, 0x80, 0x45, 0x80, 0xe6, 0xa0, 0x05, 0xb9, 0xa3, 0xd0, 0x22, 0xe8, 0x02, 0xf8, 0x42, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x83, 0xd8, 0x6b, 0x99, 0x51, 0x5a, 0x34, 0x23, 0x97, 0x0b, 0x77, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x36, 0x13, 0x14, 0x23, 0xf9, 0x74, 0xbc, 0xce, 0x9b, 0xd6, 0xfe, 0xd6, 0x7a, 0x85, 0x75, 0x13, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x77, 0x03, 0x97, 0x03, 0x97, 0x03, 0x78, 0x03, 0x79, 0x03, 0x59, 0x03, 0xf6, 0x1a, 0x71, 0x42, 0x29, 0x71, 0xc4, 0xd0, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x02, 0xf8, 0x67, 0xc8, 0x0f, 0x51, 0x53, 0x11, 0x93, 0x09, 0xb4, 0x09, 0xb5, 0x01, 0xd6, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb4, 0x01, 0x91, 0x11, 0xf8, 0x9c, 0x7c, 0xce, 0xbf, 0xae, 0xd2, 0x1a, 0x14, 0x0b, 0x36, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x18, 0x03, 0x38, 0x0b, 0x16, 0x13, 0xd6, 0x4b, 0xfe, 0xd6, 0xdb, 0xe6, 0xfc, 0xe6, 0x7f, 0xd7, 0x16, 0x34, 0xf8, 0x13, 0x1a, 0x14, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb8, 0x0b, 0x76, 0x1b, 0xf9, 0x6c, 0x1d, 0xd7, 0xfb, 0xe6, 0xfc, 0xe6, 0x11, 0x84, 0x89, 0x19, 0xe7, 0x18, 0x85, 0x38, 0xe5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x02, 0xf8, 0x45, 0xd8, 0x46, 0x80, 0x47, 0x40, 0xe9, 0x20, 0x0a, 0x09, 0x09, 0x01, 0x0a, 0x09, 0xc9, 0x00, 0xc9, 0x08, 0xc8, 0x10, 0xe7, 0x18, 0x6b, 0x4a, 0xab, 0x52, 0xaa, 0x52, 0xec, 0x4a, 0xca, 0x19, 0x89, 0x09, 0x89, 0x09, 0x69, 0x09, 0x6a, 0x09, 0xac, 0x01, 0x75, 0x13, 0xb7, 0x0b, 0xb7, 0x0b, 0x98, 0x0b, 0x9a, 0x13, 0xbb, 0x13, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x13, 0x98, 0x13, 0xba, 0x0b, 0x99, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x78, 0x03, 0x36, 0x0b, 0xb1, 0x02, 0xab, 0x01, 0xa9, 0x31, 0x4b, 0x5a, 0x8b, 0x5a, 0x6b, 0x52, 0x8d, 0x4a, 0x29, 0x19, 0x29, 0x09, 0x6a, 0x09, 0x29, 0x01, 0x08, 0x09, 0xe6, 0x18, 0xe5, 0x50, 0x84, 0xa0, 0x43, 0xe0, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x60, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x41, 0xf8, 0x61, 0xf0, 0x81, 0xd8, 0xb0, 0xf3, 0xfa, 0x9c, 0xd2, 0x01, 0xd6, 0x09, 0xb7, 0x09, 0xd7, 0x01, 0xb7, 0x01, 0x98, 0x01, 0xd6, 0x09, 0x0e, 0x01, 0xaa, 0x00, 0xc9, 0x00, 0x26, 0x28, 0x64, 0xa0, 0x42, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x60, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf0, 0x21, 0xf0, 0x41, 0xf0, 0x42, 0xf0, 0x22, 0xf0, 0x42, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x62, 0xf8, 0x42, 0xf0, 0xa6, 0xb0, 0xd0, 0x51, 0x75, 0x1a, 0x76, 0x12, 0x53, 0x22, 0x7c, 0xce, 0x9a, 0xde, 0xda, 0xd6, 0xfc, 0xc6, 0x3d, 0x9e, 0xb4, 0x1a, 0xd7, 0x0a, 0x19, 0x03, 0x18, 0x0b, 0xf7, 0x02, 0x17, 0x03, 0xd7, 0x0a, 0x98, 0x12, 0x36, 0x1a, 0x0d, 0x09, 0xca, 0x00, 0x2a, 0x01, 0x4a, 0x01, 0x28, 0x09, 0xe7, 0x00, 0x09, 0x09, 0x08, 0x01, 0x27, 0x01, 0x07, 0x01, 0x27, 0x01, 0x07, 0x09, 0x06, 0x11, 0x09, 0x42, 0x89, 0x5a, 0x88, 0x62, 0x69, 0x6a, 0x08, 0x8a, 0x85, 0xa8, 0x23, 0xd0, 0x40, 0xe8, 0x60, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x22, 0xf8, 0x44, 0xe0, 0xc7, 0xc8, 0xac, 0x89, 0x13, 0x33, 0x97, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x36, 0x13, 0x14, 0x23, 0xd8, 0x74, 0x9c, 0xce, 0xbb, 0xd6, 0xfe, 0xd6, 0x59, 0x85, 0x75, 0x13, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x38, 0x03, 0x38, 0x03, 0x39, 0x03, 0x59, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x03, 0x57, 0x03, 0x38, 0x0b, 0xb4, 0x42, 0x08, 0x89, 0x83, 0xd0, 0x42, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x43, 0xf0, 0x87, 0xc0, 0xcc, 0x80, 0x11, 0x29, 0x54, 0x01, 0xb4, 0x01, 0xd4, 0x01, 0xb5, 0x09, 0xb5, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x96, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x09, 0x91, 0x11, 0xf8, 0x9c, 0x9c, 0xce, 0xdf, 0xb6, 0x13, 0x23, 0x14, 0x0b, 0x36, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0xf9, 0x02, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x38, 0x0b, 0x15, 0x13, 0x17, 0x54, 0x1e, 0xdf, 0x1c, 0xef, 0x1c, 0xef, 0x9f, 0xdf, 0x57, 0x3c, 0xf8, 0x1b, 0xf9, 0x13, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0x97, 0x0b, 0x55, 0x1b, 0xf9, 0x6c, 0x1d, 0xd7, 0xfb, 0xe6, 0x1c, 0xe7, 0xf1, 0x7b, 0xca, 0x21, 0xe7, 0x18, 0x85, 0x38, 0xe5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x61, 0xf0, 0xc3, 0xc8, 0xc5, 0x70, 0xa6, 0x28, 0x48, 0x01, 0x89, 0x01, 0x48, 0x01, 0x49, 0x01, 0x09, 0x09, 0x09, 0x11, 0xe7, 0x10, 0xc6, 0x18, 0x8b, 0x5a, 0x8a, 0x5a, 0x8a, 0x52, 0xcc, 0x52, 0xec, 0x21, 0x6b, 0x11, 0x6a, 0x11, 0x4b, 0x09, 0x2b, 0x09, 0x8f, 0x01, 0xb8, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0xba, 0x03, 0x9a, 0x0b, 0x9a, 0x13, 0x99, 0x0b, 0x99, 0x0b, 0xb8, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x97, 0x03, 0xb7, 0x0b, 0x55, 0x13, 0x91, 0x12, 0x4d, 0x2a, 0xee, 0x52, 0x8b, 0x52, 0xcc, 0x5a, 0xcd, 0x4a, 0x07, 0x09, 0xc7, 0x08, 0xe8, 0x08, 0x08, 0x09, 0x4a, 0x09, 0x4b, 0x09, 0x0a, 0x09, 0xe8, 0x08, 0xc6, 0x28, 0xa5, 0x70, 0xa4, 0xb0, 0x42, 0xd8, 0x21, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x40, 0xf0, 0x61, 0xf8, 0x21, 0xf8, 0x62, 0xf8, 0x40, 0xf0, 0x26, 0xc9, 0x99, 0xb4, 0xf3, 0x19, 0xb5, 0x09, 0x76, 0x01, 0xf6, 0x09, 0xd7, 0x09, 0x98, 0x11, 0x76, 0x11, 0xee, 0x08, 0x8a, 0x00, 0xaa, 0x00, 0x26, 0x28, 0x64, 0xa0, 0x42, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x23, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x64, 0xd0, 0x08, 0x81, 0x8d, 0x41, 0x95, 0x22, 0xd7, 0x0a, 0xb6, 0x0a, 0x72, 0x1a, 0x9c, 0xc6, 0xba, 0xde, 0xdb, 0xe6, 0xfd, 0xd6, 0xfd, 0x8d, 0xb3, 0x0a, 0xd6, 0x02, 0x19, 0x03, 0x18, 0x03, 0xd7, 0x02, 0xf7, 0x02, 0x97, 0x02, 0x77, 0x0a, 0x35, 0x1a, 0x2d, 0x09, 0xca, 0x08, 0xea, 0x00, 0x0a, 0x01, 0x09, 0x01, 0x09, 0x01, 0xea, 0x08, 0xca, 0x08, 0xc9, 0x10, 0xa8, 0x08, 0xe9, 0x08, 0xc8, 0x00, 0xe7, 0x00, 0x2b, 0x32, 0x6b, 0x4a, 0x8b, 0x5a, 0x8d, 0x5a, 0xae, 0x52, 0x68, 0x11, 0x07, 0x31, 0x65, 0x90, 0x65, 0xd8, 0x21, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x42, 0xf0, 0x63, 0xe8, 0x49, 0xb1, 0xd3, 0x3a, 0x98, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x16, 0x13, 0xf3, 0x1a, 0xb8, 0x74, 0x9b, 0xce, 0xdb, 0xde, 0xfe, 0xd6, 0xf8, 0x74, 0x55, 0x13, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x59, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0xf6, 0x1a, 0x93, 0x42, 0xcd, 0x81, 0x82, 0xc8, 0x40, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x61, 0xf0, 0x41, 0xf8, 0x85, 0xc8, 0x0d, 0x71, 0x52, 0x31, 0x54, 0x11, 0x75, 0x09, 0x95, 0x01, 0xb6, 0x01, 0xb5, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x96, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb4, 0x09, 0x91, 0x11, 0xf8, 0x9c, 0x7c, 0xce, 0xdf, 0xb6, 0x74, 0x33, 0x14, 0x13, 0x36, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x0b, 0x19, 0x0b, 0x19, 0x03, 0xf9, 0x02, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x18, 0x03, 0x59, 0x0b, 0x38, 0x0b, 0xf5, 0x12, 0x37, 0x5c, 0xfd, 0xde, 0xfb, 0xee, 0xfc, 0xee, 0x7f, 0xdf, 0x98, 0x4c, 0x18, 0x1c, 0xf9, 0x13, 0xd9, 0x0b, 0xf9, 0x0b, 0xd9, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb7, 0x0b, 0x75, 0x1b, 0x39, 0x6d, 0xfd, 0xce, 0x1c, 0xe7, 0x1c, 0xef, 0xf0, 0x7b, 0xea, 0x29, 0xe7, 0x18, 0x84, 0x38, 0xe5, 0x88, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x63, 0xe0, 0x46, 0x88, 0x27, 0x38, 0xc9, 0x18, 0x0a, 0x09, 0xc8, 0x00, 0xe9, 0x08, 0xe9, 0x00, 0x09, 0x09, 0x08, 0x09, 0xe6, 0x08, 0xac, 0x4a, 0xab, 0x52, 0x8b, 0x52, 0xcd, 0x52, 0x0a, 0x22, 0xa8, 0x09, 0xc8, 0x09, 0xc8, 0x09, 0x89, 0x09, 0xcc, 0x01, 0x97, 0x13, 0xb9, 0x0b, 0x99, 0x13, 0x79, 0x13, 0x99, 0x0b, 0xb9, 0x0b, 0x99, 0x0b, 0xb9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x7a, 0x13, 0x59, 0x13, 0x77, 0x0b, 0x77, 0x0b, 0x58, 0x13, 0x35, 0x23, 0xb7, 0x74, 0xf5, 0x94, 0x4c, 0x63, 0xea, 0x4a, 0xec, 0x32, 0x67, 0x01, 0x69, 0x11, 0x09, 0x09, 0xea, 0x08, 0xea, 0x08, 0x0a, 0x09, 0x0a, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x29, 0x01, 0xe7, 0x18, 0xc6, 0x50, 0xa5, 0x90, 0x83, 0xd8, 0x41, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x84, 0xd0, 0x51, 0x9a, 0x91, 0x31, 0x14, 0x12, 0xd4, 0x01, 0xf5, 0x01, 0xb5, 0x01, 0xf6, 0x09, 0xb4, 0x09, 0xee, 0x08, 0x8a, 0x00, 0xaa, 0x08, 0x06, 0x30, 0x44, 0xa8, 0x42, 0xe8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x81, 0xf0, 0x83, 0xb8, 0x66, 0x68, 0x6e, 0x21, 0x96, 0x12, 0xb7, 0x0a, 0xd6, 0x0a, 0xd3, 0x12, 0x90, 0x1a, 0xbd, 0xbe, 0x9c, 0xd6, 0x7c, 0xee, 0x5e, 0xde, 0xde, 0x9d, 0xb4, 0x1a, 0xd7, 0x12, 0xd8, 0x12, 0xb8, 0x12, 0xb8, 0x12, 0x19, 0x0b, 0xb7, 0x02, 0xd7, 0x02, 0xd4, 0x0a, 0x8c, 0x01, 0x4a, 0x01, 0x0b, 0x01, 0xea, 0x00, 0x09, 0x09, 0x09, 0x09, 0x29, 0x01, 0x08, 0x01, 0x28, 0x01, 0x08, 0x01, 0x29, 0x01, 0x08, 0x01, 0xe6, 0x08, 0x29, 0x3a, 0x89, 0x5a, 0x68, 0x62, 0x8a, 0x52, 0xed, 0x52, 0x68, 0x11, 0x47, 0x11, 0x46, 0x19, 0x03, 0x59, 0xa2, 0xd0, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x08, 0xb9, 0xb4, 0x42, 0x79, 0x0b, 0x77, 0x0b, 0x56, 0x0b, 0x36, 0x0b, 0x16, 0x13, 0xf3, 0x22, 0xb8, 0x74, 0x7b, 0xc6, 0xbb, 0xd6, 0xfd, 0xce, 0xf8, 0x74, 0x55, 0x13, 0x77, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x37, 0x0b, 0x77, 0x03, 0x98, 0x03, 0x99, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x57, 0x03, 0x38, 0x03, 0x3a, 0x0b, 0xb6, 0x32, 0x8c, 0x89, 0xc4, 0xb8, 0xc1, 0xe0, 0x40, 0xe8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x61, 0xe0, 0xc7, 0xa0, 0x30, 0x39, 0x96, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x56, 0x09, 0x77, 0x11, 0xb6, 0x09, 0x95, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x09, 0x96, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0x91, 0x11, 0x18, 0x9d, 0x7c, 0xc6, 0xbe, 0xb6, 0xb5, 0x3b, 0x13, 0x13, 0x15, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, + 0x37, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x39, 0x03, 0x39, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x18, 0x13, 0xf5, 0x1a, 0xb9, 0x6c, 0xdd, 0xce, 0x3c, 0xe7, 0x1b, 0xe7, 0x9f, 0xdf, 0x98, 0x54, 0xd9, 0x1b, 0xfb, 0x0b, 0xfb, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0x1a, 0x14, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xd8, 0x1b, 0x56, 0x13, 0x55, 0x1b, 0xfa, 0x64, 0xfe, 0xd6, 0xdb, 0xe6, 0x5b, 0xef, 0x30, 0x7c, 0xaa, 0x21, 0x09, 0x19, 0x66, 0x38, 0xe6, 0x88, 0xa2, 0xd8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x83, 0xd8, 0xa5, 0x70, 0x66, 0x28, 0xe9, 0x18, 0xe9, 0x08, 0x2a, 0x01, 0xe9, 0x00, 0xe9, 0x00, 0x2a, 0x09, 0xc9, 0x00, 0xe8, 0x08, 0xcc, 0x4a, 0xcb, 0x52, 0xaa, 0x5a, 0xaa, 0x52, 0x0b, 0x2a, 0x6a, 0x09, 0x8a, 0x09, 0x6b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0xb7, 0x1b, 0xb8, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xba, 0x03, 0xba, 0x03, 0x9a, 0x03, 0x79, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x77, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x35, 0x23, 0xf9, 0x7c, 0xdd, 0xce, 0xba, 0xd6, 0x14, 0x9d, 0x2f, 0x53, 0x08, 0x09, 0x28, 0x19, 0x28, 0x19, 0x09, 0x09, 0x2a, 0x09, 0x09, 0x01, 0x4a, 0x09, 0xea, 0x08, 0xea, 0x10, 0xe9, 0x08, 0x09, 0x01, 0x69, 0x01, 0x28, 0x11, 0x65, 0x58, 0xa4, 0xa8, 0x82, 0xe8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x44, 0xe0, 0xc9, 0xb0, 0xed, 0x68, 0x93, 0x29, 0xf6, 0x09, 0xd5, 0x01, 0xf6, 0x09, 0xb5, 0x01, 0xd4, 0x09, 0x0e, 0x09, 0xaa, 0x00, 0xc9, 0x00, 0x66, 0x28, 0x64, 0xa0, 0x83, 0xe8, 0x41, 0xf0, 0x01, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x00, 0xf0, 0x61, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x83, 0xe8, 0xa2, 0xa8, 0x83, 0x68, 0xa7, 0x20, 0x4d, 0x01, 0x75, 0x0a, 0xf8, 0x0a, 0xb7, 0x02, 0xf7, 0x0a, 0xf6, 0x0a, 0x72, 0x12, 0x7e, 0xbe, 0xdd, 0xde, 0x9b, 0xd6, 0xbe, 0xd6, 0xde, 0x95, 0x53, 0x0a, 0xd7, 0x0a, 0x39, 0x0b, 0x39, 0x03, 0x5a, 0x0b, 0xd7, 0x0a, 0x76, 0x0a, 0x77, 0x12, 0x55, 0x12, 0x6f, 0x01, 0x4c, 0x01, 0x08, 0x01, 0x48, 0x01, 0x09, 0x01, 0x4a, 0x01, 0x29, 0x01, 0x09, 0x01, 0xe9, 0x00, 0xe9, 0x00, 0x09, 0x01, 0x08, 0x09, 0xe6, 0x10, 0x09, 0x42, 0x69, 0x52, 0x48, 0x4a, 0xcc, 0x5a, 0xcc, 0x52, 0x89, 0x19, 0x49, 0x09, 0x6a, 0x11, 0xc7, 0x30, 0x65, 0x80, 0xa5, 0xd0, 0x43, 0xf0, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0xc6, 0xc8, 0x50, 0x62, 0x15, 0x23, 0x78, 0x0b, 0x78, 0x03, 0x56, 0x03, 0x15, 0x0b, 0xb2, 0x1a, 0x36, 0x74, 0x5b, 0xde, 0x7a, 0xe6, 0xfe, 0xce, 0xd8, 0x64, 0x95, 0x0b, 0x76, 0x03, 0x76, 0x03, 0x97, 0x03, 0x98, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x0b, 0x3a, 0x0b, 0x59, 0x0b, 0x77, 0x0b, 0x76, 0x0b, 0x76, 0x03, 0x77, 0x03, 0x77, 0x03, 0x16, 0x13, 0x94, 0x32, 0xce, 0x71, 0xa6, 0xd0, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0xa4, 0xe0, 0xea, 0x90, 0xce, 0x40, 0xb3, 0x19, 0xd5, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x96, 0x09, 0x76, 0x11, 0x75, 0x09, 0x95, 0x09, 0xb5, 0x01, 0xf6, 0x09, 0xd6, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x96, 0x01, 0x95, 0x01, 0x95, 0x09, 0x71, 0x11, 0xf9, 0x94, 0x5c, 0xbe, 0x9d, 0xa6, 0x93, 0x2b, 0x14, 0x0b, 0x36, 0x03, 0x56, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x77, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0x17, 0x03, + 0x59, 0x0b, 0x59, 0x0b, 0x5a, 0x0b, 0x39, 0x0b, 0x19, 0x0b, 0x19, 0x0b, 0x19, 0x0b, 0x19, 0x03, 0x19, 0x03, 0xf9, 0x02, 0x19, 0x03, 0x19, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x38, 0x0b, 0x18, 0x03, 0xf7, 0x02, 0xf7, 0x12, 0xd5, 0x1a, 0x59, 0x64, 0xdf, 0xd6, 0x1d, 0xef, 0x3c, 0xef, 0xbf, 0xe7, 0x76, 0x54, 0xf7, 0x23, 0xd8, 0x03, 0xd8, 0x03, 0x59, 0x14, 0x18, 0x0c, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xd8, 0x0b, 0xb8, 0x0b, 0xd8, 0x0b, 0xd8, 0x0b, 0xb8, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb8, 0x0b, 0xb7, 0x13, 0x96, 0x13, 0x75, 0x13, 0x97, 0x54, 0xfd, 0xce, 0xfb, 0xe6, 0x3b, 0xef, 0x10, 0x7c, 0x69, 0x11, 0xe8, 0x18, 0x65, 0x38, 0xe6, 0x90, 0x82, 0xd8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x84, 0xd0, 0xe9, 0x78, 0x2c, 0x31, 0x8f, 0x19, 0x8f, 0x09, 0xf0, 0x09, 0xaf, 0x01, 0xef, 0x01, 0xd0, 0x09, 0x8e, 0x09, 0xce, 0x21, 0x74, 0x7c, 0x72, 0x8c, 0x91, 0x94, 0xd3, 0x94, 0x0f, 0x33, 0xb0, 0x1a, 0x70, 0x12, 0x70, 0x0a, 0x91, 0x0a, 0x92, 0x02, 0x98, 0x1b, 0x78, 0x13, 0x99, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0xb8, 0x0b, 0xb8, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0xb8, 0x0b, 0xb7, 0x0b, 0xb6, 0x0b, 0xb6, 0x13, 0x55, 0x0b, 0x13, 0x1b, 0xd7, 0x7c, 0xbd, 0xce, 0x9a, 0xd6, 0x1d, 0xdf, 0xdf, 0xbe, 0xed, 0x19, 0x69, 0x01, 0x28, 0x01, 0x29, 0x09, 0x29, 0x09, 0x29, 0x11, 0xe8, 0x08, 0x69, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x09, 0xeb, 0x08, 0xca, 0x08, 0xe7, 0x00, 0x85, 0x30, 0x84, 0x98, 0xa4, 0xe0, 0x42, 0xe8, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x42, 0xe8, 0xc7, 0xc8, 0xcb, 0x78, 0x93, 0x39, 0xd6, 0x09, 0x75, 0x01, 0xb6, 0x01, 0x96, 0x01, 0xb5, 0x11, 0xed, 0x00, 0x89, 0x00, 0xa8, 0x00, 0x45, 0x28, 0x64, 0xa0, 0x63, 0xe8, 0x21, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x42, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf0, 0x41, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x42, 0xf0, 0x42, 0xf0, 0x22, 0xe0, 0x64, 0xb8, 0x85, 0x60, 0x08, 0x39, 0xe7, 0x18, 0x29, 0x09, 0xad, 0x01, 0x52, 0x02, 0xf6, 0x12, 0xb6, 0x12, 0xb6, 0x12, 0x75, 0x0a, 0xb5, 0x1a, 0x31, 0x1a, 0x7d, 0xd6, 0x5a, 0xe6, 0x59, 0xe6, 0x7c, 0xd6, 0xdc, 0x9d, 0x72, 0x12, 0xb5, 0x02, 0x17, 0x03, 0x38, 0x03, 0x17, 0x03, 0xf6, 0x02, 0xd6, 0x0a, 0x96, 0x0a, 0xb7, 0x12, 0x54, 0x0a, 0x12, 0x0a, 0x31, 0x0a, 0x72, 0x1a, 0x11, 0x0a, 0xd1, 0x01, 0xd1, 0x09, 0xf1, 0x11, 0xb0, 0x09, 0x8f, 0x09, 0xcf, 0x09, 0x4c, 0x01, 0x87, 0x00, 0x4c, 0x42, 0x8b, 0x52, 0xca, 0x62, 0x6a, 0x52, 0x8b, 0x4a, 0x0a, 0x22, 0x48, 0x09, 0x48, 0x09, 0x07, 0x21, 0x84, 0x58, 0xe5, 0xa8, 0x63, 0xe0, 0x21, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x84, 0xd0, 0xee, 0x71, 0xd4, 0x3a, 0x36, 0x1b, 0x16, 0x03, 0x56, 0x03, 0x97, 0x13, 0x15, 0x23, 0xf6, 0x5b, 0x5d, 0xce, 0x7c, 0xd6, 0xdf, 0xc6, 0x3c, 0x75, 0x38, 0x1b, 0x39, 0x0b, 0x18, 0x0b, 0xd7, 0x0a, 0xf7, 0x0a, 0x38, 0x13, 0x38, 0x13, 0x17, 0x03, 0x78, 0x03, 0x78, 0x03, 0x38, 0x13, 0x38, 0x13, 0x38, 0x0b, 0x38, 0x0b, 0x79, 0x03, 0xd4, 0x32, 0x6a, 0x91, 0xa4, 0xd0, 0x42, 0xf0, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x62, 0xf8, 0x41, 0xf0, 0x22, 0xf0, 0x23, 0xf0, 0x64, 0xe8, 0x87, 0xa8, 0xcd, 0x30, 0xd4, 0x09, 0xf5, 0x01, 0xd6, 0x01, 0x96, 0x01, 0x76, 0x01, 0x97, 0x09, 0x97, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0x96, 0x01, 0xb7, 0x09, 0x96, 0x09, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x09, 0x94, 0x09, 0xb1, 0x19, 0x97, 0x84, 0x9d, 0xc6, 0xbd, 0xa6, 0x11, 0x1b, 0x55, 0x13, 0xf5, 0x02, 0x16, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0x36, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0x16, 0x0b, 0x16, 0x0b, 0xf5, 0x02, + 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x78, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0x97, 0x03, 0x77, 0x03, 0x76, 0x03, 0x77, 0x03, 0x37, 0x03, 0x57, 0x0b, 0xf4, 0x1a, 0x78, 0x64, 0x1e, 0xdf, 0xfc, 0xe6, 0x1b, 0xe7, 0x3d, 0xd7, 0x5a, 0x6d, 0x18, 0x24, 0x19, 0x14, 0xf9, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0x1b, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0x98, 0x0b, 0x77, 0x0b, 0x97, 0x1b, 0x76, 0x1b, 0x98, 0x54, 0xfe, 0xce, 0x1c, 0xe7, 0x1b, 0xe7, 0xf0, 0x73, 0x48, 0x11, 0x08, 0x19, 0x85, 0x40, 0xe6, 0x90, 0x82, 0xd8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x60, 0xf8, 0xa4, 0xd0, 0x6d, 0x79, 0xf3, 0x39, 0x56, 0x12, 0x97, 0x02, 0xf8, 0x0a, 0xf8, 0x02, 0xd8, 0x02, 0x96, 0x02, 0x34, 0x02, 0x73, 0x22, 0x7e, 0xc6, 0x9c, 0xde, 0xfb, 0xe6, 0x3e, 0xcf, 0x76, 0x34, 0x58, 0x14, 0xf7, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xba, 0x13, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x78, 0x0b, 0x7a, 0x0b, 0x59, 0x03, 0x7a, 0x03, 0x7a, 0x0b, 0x18, 0x13, 0x36, 0x2b, 0xf9, 0x8c, 0xde, 0xde, 0xdb, 0xde, 0xbc, 0xce, 0xff, 0xbe, 0x32, 0x12, 0xd6, 0x1a, 0x95, 0x1a, 0xcf, 0x09, 0x0a, 0x01, 0x4a, 0x09, 0xe8, 0x00, 0x08, 0x09, 0x49, 0x11, 0x4a, 0x09, 0x09, 0x01, 0x2a, 0x09, 0x0a, 0x09, 0x2a, 0x09, 0xe8, 0x18, 0x85, 0x38, 0xa5, 0x80, 0x63, 0xd8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf0, 0x63, 0xd8, 0x88, 0x90, 0xb3, 0x41, 0xf7, 0x09, 0xb7, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xd5, 0x11, 0x0e, 0x09, 0xa9, 0x00, 0xa8, 0x00, 0x45, 0x28, 0x64, 0xa8, 0x62, 0xe8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf0, 0x63, 0xe0, 0x01, 0xb0, 0xc3, 0x98, 0x65, 0x99, 0x65, 0xa1, 0x66, 0xa9, 0xc3, 0x90, 0xa4, 0x98, 0xa5, 0x98, 0xa5, 0x98, 0x85, 0x88, 0xa6, 0x80, 0xc7, 0x68, 0xe7, 0x58, 0x07, 0x39, 0xe7, 0x20, 0x07, 0x11, 0x08, 0x09, 0x08, 0x09, 0xe9, 0x08, 0x0b, 0x01, 0x8e, 0x01, 0x33, 0x0a, 0xd6, 0x12, 0xf7, 0x12, 0x76, 0x0a, 0xb7, 0x12, 0x96, 0x0a, 0x96, 0x0a, 0x93, 0x1a, 0x7d, 0xbe, 0x9a, 0xd6, 0x99, 0xd6, 0xbc, 0xce, 0x1d, 0x9e, 0x93, 0x1a, 0xd6, 0x0a, 0x18, 0x0b, 0x79, 0x0b, 0x17, 0x03, 0x16, 0x03, 0xd5, 0x02, 0xf7, 0x0a, 0x97, 0x02, 0x96, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x98, 0x0a, 0x98, 0x12, 0x57, 0x0a, 0x56, 0x0a, 0x55, 0x0a, 0x54, 0x12, 0x31, 0x2a, 0x5b, 0x9d, 0x33, 0x8c, 0x2e, 0x73, 0x6a, 0x5a, 0xad, 0x5a, 0x89, 0x19, 0x6a, 0x09, 0x6b, 0x09, 0x29, 0x19, 0xa4, 0x40, 0x04, 0x91, 0x82, 0xd8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0xa5, 0xc8, 0xcd, 0x71, 0xb3, 0x3a, 0x57, 0x1b, 0xb9, 0x0b, 0x78, 0x03, 0x16, 0x03, 0xf4, 0x1a, 0x77, 0x64, 0x9a, 0xc6, 0x1a, 0xdf, 0x3c, 0xc7, 0x17, 0x6d, 0x34, 0x13, 0x57, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x77, 0x0b, 0x56, 0x03, 0x55, 0x03, 0x56, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x13, 0x59, 0x13, 0x5a, 0x13, 0xd7, 0x2a, 0x51, 0x4a, 0xaa, 0x89, 0xa3, 0xd8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x20, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x63, 0xe0, 0xa7, 0x98, 0xca, 0x50, 0x92, 0x21, 0xd5, 0x09, 0x94, 0x09, 0x94, 0x09, 0xb5, 0x11, 0xb5, 0x11, 0x75, 0x09, 0x74, 0x09, 0xb4, 0x09, 0xd5, 0x09, 0xb4, 0x01, 0xd5, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x94, 0x01, 0x94, 0x01, 0x95, 0x09, 0x75, 0x09, 0x74, 0x09, 0x50, 0x11, 0x57, 0x84, 0x7e, 0xc6, 0x3e, 0xa6, 0xd2, 0x22, 0xf5, 0x1a, 0x17, 0x0b, 0x16, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x35, 0x03, 0x35, 0x03, 0x36, 0x03, + 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x38, 0x03, 0x17, 0x03, 0x17, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0xb9, 0x13, 0xb9, 0x13, 0x98, 0x0b, 0x78, 0x03, 0xb9, 0x03, 0x78, 0x0b, 0xf4, 0x12, 0xd8, 0x64, 0x3d, 0xd7, 0x3b, 0xe7, 0x7b, 0xef, 0x5d, 0xdf, 0xd7, 0x74, 0xb5, 0x3b, 0x59, 0x3c, 0x7b, 0x3c, 0x9a, 0x44, 0x99, 0x44, 0x38, 0x44, 0x59, 0x44, 0x79, 0x3c, 0x18, 0x2c, 0xd8, 0x23, 0xf9, 0x2b, 0x5a, 0x34, 0x7b, 0x34, 0x3a, 0x2c, 0xd9, 0x13, 0xd9, 0x13, 0x1a, 0x1c, 0x7b, 0x24, 0x3a, 0x24, 0xf7, 0x1b, 0xb6, 0x1b, 0x74, 0x13, 0xb8, 0x54, 0x1e, 0xcf, 0x1c, 0xe7, 0x1c, 0xe7, 0xf0, 0x7b, 0x48, 0x19, 0xe7, 0x18, 0x64, 0x40, 0xc5, 0x90, 0x82, 0xd8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x84, 0xc8, 0x8e, 0x79, 0x35, 0x3a, 0x97, 0x12, 0x97, 0x02, 0x96, 0x02, 0x75, 0x02, 0x96, 0x0a, 0x95, 0x0a, 0x94, 0x1a, 0x31, 0x22, 0x9e, 0xd6, 0x5a, 0xde, 0xfc, 0xde, 0xfd, 0xc6, 0x15, 0x3c, 0xd7, 0x1b, 0xf8, 0x1b, 0xd9, 0x13, 0xd9, 0x13, 0xb9, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x97, 0x03, 0x76, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0xd7, 0x03, 0x18, 0x04, 0xd6, 0x03, 0x33, 0x03, 0x12, 0x23, 0x57, 0x8d, 0xbb, 0xce, 0xda, 0xd6, 0x1c, 0xd7, 0xbe, 0xae, 0xd2, 0x1a, 0x1c, 0x4d, 0xf5, 0x02, 0x37, 0x03, 0x37, 0x13, 0x52, 0x0a, 0x6d, 0x01, 0x4b, 0x01, 0x2a, 0x09, 0xc8, 0x00, 0x6a, 0x11, 0x48, 0x09, 0x48, 0x09, 0xc8, 0x08, 0x29, 0x19, 0x07, 0x11, 0x85, 0x40, 0xc5, 0xc0, 0x22, 0xf0, 0x02, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x61, 0xf0, 0xc7, 0xb0, 0x71, 0x39, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb4, 0x09, 0x2e, 0x01, 0xcb, 0x00, 0xc9, 0x00, 0x45, 0x30, 0x64, 0xa8, 0x62, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x42, 0xf0, 0xa4, 0xd8, 0x01, 0x80, 0x88, 0x61, 0x8c, 0x5a, 0xac, 0x52, 0xad, 0x4a, 0x47, 0x19, 0x06, 0x09, 0x27, 0x09, 0x27, 0x09, 0x27, 0x09, 0x07, 0x01, 0xe7, 0x00, 0xe8, 0x00, 0x09, 0x01, 0x09, 0x09, 0x09, 0x01, 0x09, 0x01, 0x28, 0x09, 0x29, 0x09, 0xaf, 0x09, 0x75, 0x12, 0xd7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0x75, 0x0a, 0x51, 0x1a, 0x3c, 0xbe, 0x9b, 0xde, 0xbb, 0xde, 0xdd, 0xd6, 0x1e, 0x9e, 0x72, 0x12, 0xb5, 0x0a, 0xf8, 0x0a, 0x39, 0x0b, 0x59, 0x0b, 0x57, 0x13, 0x36, 0x0b, 0x17, 0x0b, 0xb6, 0x02, 0xb6, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xf7, 0x0a, 0x17, 0x0b, 0x37, 0x0b, 0x17, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0x16, 0x0b, 0xb4, 0x02, 0x72, 0x0a, 0x4f, 0x22, 0xfb, 0xad, 0xbb, 0xd6, 0x99, 0xd6, 0x34, 0xad, 0x6a, 0x4a, 0x67, 0x11, 0x89, 0x09, 0x29, 0x01, 0x49, 0x11, 0xc6, 0x30, 0xe6, 0x80, 0x83, 0xd8, 0x01, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf0, 0x61, 0xf8, 0xc5, 0xd0, 0xcc, 0x79, 0x92, 0x42, 0x16, 0x1b, 0x57, 0x03, 0x79, 0x0b, 0x17, 0x0b, 0xf4, 0x22, 0x98, 0x74, 0x3a, 0xc6, 0xba, 0xd6, 0x1d, 0xcf, 0xb5, 0x64, 0x94, 0x1b, 0x76, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x56, 0x0b, 0xb1, 0x42, 0x67, 0xa9, 0x81, 0xe0, 0x41, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x83, 0xf0, 0x85, 0xa8, 0xec, 0x30, 0xf4, 0x09, 0xd5, 0x11, 0x95, 0x09, 0xb6, 0x09, 0x96, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0x95, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0x95, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x95, 0x01, 0xb6, 0x09, 0x95, 0x09, 0xb4, 0x11, 0x50, 0x09, 0x16, 0x74, 0xbf, 0xc6, 0xfc, 0x95, 0xd1, 0x1a, 0xd3, 0x0a, 0x36, 0x0b, 0x16, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf6, 0x02, 0x58, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x17, 0x03, 0x16, 0x03, 0x17, 0x0b, + 0x57, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x37, 0x0b, 0x57, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x13, 0xd5, 0x1a, 0xf3, 0x2a, 0x5a, 0x8d, 0xdd, 0xce, 0x3c, 0xe7, 0x7d, 0xe7, 0x3e, 0xd7, 0x5a, 0x7d, 0x75, 0x2b, 0xb8, 0x23, 0xb8, 0x13, 0x76, 0x0b, 0xb7, 0x13, 0xb7, 0x1b, 0x76, 0x0b, 0x75, 0x03, 0xb5, 0x03, 0xd6, 0x13, 0xd6, 0x13, 0x75, 0x0b, 0x55, 0x03, 0x76, 0x0b, 0x77, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x56, 0x0b, 0x55, 0x0b, 0x35, 0x13, 0x55, 0x1b, 0x5b, 0x75, 0xdd, 0xce, 0x1c, 0xe7, 0x1c, 0xef, 0x11, 0x84, 0x88, 0x21, 0xe6, 0x20, 0x84, 0x40, 0xe5, 0x90, 0x82, 0xd8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0xa4, 0xd0, 0xae, 0x79, 0x74, 0x42, 0xf7, 0x1a, 0x18, 0x03, 0x18, 0x03, 0x38, 0x0b, 0x18, 0x0b, 0xb6, 0x02, 0x74, 0x0a, 0x92, 0x2a, 0x9d, 0xd6, 0x9b, 0xe6, 0x1c, 0xe7, 0x5e, 0xd7, 0x76, 0x54, 0xb5, 0x2b, 0x18, 0x2c, 0xf8, 0x23, 0x18, 0x1c, 0x18, 0x1c, 0x59, 0x24, 0x59, 0x24, 0xd7, 0x13, 0xd8, 0x13, 0xf9, 0x13, 0xfa, 0x13, 0xfa, 0x1b, 0x1a, 0x24, 0xf9, 0x23, 0xd9, 0x23, 0x98, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x03, 0xd8, 0x03, 0x96, 0x03, 0x75, 0x1b, 0x36, 0x54, 0xfb, 0xad, 0x9c, 0xd6, 0xfb, 0xde, 0x1d, 0xdf, 0xbe, 0xbe, 0x70, 0x22, 0xd3, 0x12, 0x57, 0x13, 0x57, 0x03, 0x78, 0x0b, 0x15, 0x03, 0x55, 0x1b, 0x13, 0x13, 0xed, 0x01, 0x6b, 0x01, 0x29, 0x01, 0x06, 0x01, 0xc8, 0x19, 0x67, 0x01, 0x67, 0x01, 0x68, 0x09, 0x85, 0x28, 0x83, 0x90, 0xe4, 0xe0, 0x41, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0xe6, 0xc0, 0x0e, 0x39, 0xd6, 0x09, 0xf6, 0x09, 0xf7, 0x01, 0xd5, 0x01, 0xb3, 0x01, 0x0d, 0x01, 0xca, 0x00, 0xc9, 0x00, 0x26, 0x30, 0x44, 0xa8, 0x63, 0xe8, 0x21, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x62, 0xe8, 0xc4, 0xd0, 0x00, 0x78, 0x66, 0x59, 0x4a, 0x52, 0x8c, 0x52, 0xad, 0x52, 0x69, 0x21, 0x28, 0x11, 0x08, 0x11, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x29, 0x11, 0x29, 0x09, 0x29, 0x09, 0x28, 0x01, 0x49, 0x01, 0x8a, 0x01, 0xac, 0x01, 0x51, 0x02, 0xd7, 0x12, 0xf9, 0x0a, 0xf8, 0x02, 0x39, 0x03, 0x78, 0x03, 0x37, 0x03, 0x36, 0x03, 0xf5, 0x0a, 0xd3, 0x12, 0x2f, 0x12, 0xbd, 0xc6, 0x7a, 0xce, 0xbb, 0xd6, 0xbc, 0xc6, 0x7d, 0x9e, 0x70, 0x0a, 0x35, 0x13, 0x58, 0x0b, 0x18, 0x03, 0x18, 0x03, 0xf6, 0x02, 0xf5, 0x02, 0x16, 0x0b, 0x16, 0x03, 0x17, 0x03, 0x38, 0x0b, 0xd6, 0x02, 0x16, 0x0b, 0xd4, 0x02, 0x15, 0x03, 0x37, 0x0b, 0x18, 0x0b, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0x94, 0x0a, 0x51, 0x22, 0x5e, 0xb6, 0xbd, 0xd6, 0x3a, 0xce, 0x9b, 0xd6, 0xd9, 0xb5, 0xcb, 0x21, 0x6a, 0x09, 0x6b, 0x01, 0x4b, 0x11, 0xc8, 0x20, 0xe7, 0x68, 0x85, 0xd0, 0x22, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x63, 0xd0, 0x8a, 0x89, 0xb2, 0x5a, 0x15, 0x2b, 0x35, 0x0b, 0x33, 0x03, 0x74, 0x13, 0xd3, 0x1a, 0x58, 0x6c, 0x7e, 0xd6, 0x7e, 0xd6, 0xbf, 0xce, 0x98, 0x6c, 0x15, 0x1b, 0x77, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x18, 0x0b, 0x18, 0x13, 0x17, 0x13, 0x58, 0x13, 0x59, 0x03, 0xf6, 0x1a, 0x0f, 0x5a, 0x49, 0x99, 0xa3, 0xd8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x63, 0xe0, 0x06, 0xa1, 0xa9, 0x48, 0xd4, 0x21, 0xd6, 0x01, 0xf5, 0x01, 0xb4, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x96, 0x01, 0x96, 0x01, 0xb6, 0x01, 0xb5, 0x01, 0xb5, 0x09, 0x95, 0x09, 0x95, 0x09, 0xb6, 0x09, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x94, 0x01, 0xb4, 0x01, 0xd2, 0x11, 0x95, 0x5b, 0xbf, 0xbe, 0x9b, 0x7d, 0xb0, 0x12, 0x34, 0x13, 0x76, 0x13, 0x95, 0x1b, 0x75, 0x1b, 0x96, 0x1b, 0x96, 0x1b, 0x95, 0x13, 0x96, 0x13, 0x96, 0x13, 0x56, 0x13, 0x14, 0x03, 0x35, 0x0b, 0x76, 0x13, 0xb7, 0x1b, 0xd8, 0x1b, 0x97, 0x1b, 0x56, 0x13, 0x36, 0x0b, + 0xda, 0xa5, 0xba, 0xa5, 0x79, 0x9d, 0x39, 0x95, 0x18, 0x8d, 0xd8, 0x84, 0xd7, 0x84, 0xb8, 0x7c, 0x97, 0x7c, 0xd9, 0x84, 0x1a, 0x8d, 0xd9, 0x84, 0x77, 0x74, 0x56, 0x74, 0xb8, 0x7c, 0x19, 0x8d, 0xf7, 0x7c, 0xb6, 0x74, 0x17, 0x8d, 0xdd, 0xd6, 0xfc, 0xe6, 0x3c, 0xf7, 0x3c, 0xf7, 0x1b, 0xef, 0xfc, 0xde, 0x7b, 0xc6, 0x3a, 0xb6, 0xd9, 0xa5, 0x5a, 0xb6, 0x1a, 0xb6, 0x98, 0xa5, 0xda, 0xb5, 0x1a, 0xc6, 0xfa, 0xc5, 0xfa, 0xc5, 0x1b, 0xce, 0x1b, 0xc6, 0xfb, 0xc5, 0xfb, 0xbd, 0xda, 0xb5, 0xda, 0xb5, 0xfa, 0xb5, 0xd9, 0xad, 0xfa, 0xad, 0xfa, 0xb5, 0x78, 0xa5, 0x16, 0x9d, 0x7b, 0xce, 0xfb, 0xe6, 0xfb, 0xe6, 0xfc, 0xe6, 0x31, 0x8c, 0x4a, 0x42, 0xe9, 0x49, 0x46, 0x69, 0x26, 0xa1, 0x62, 0xe0, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x83, 0xd0, 0xcb, 0x89, 0xd2, 0x5a, 0xf3, 0x32, 0xf4, 0x22, 0xb3, 0x12, 0xd3, 0x12, 0xb3, 0x12, 0x93, 0x1a, 0x92, 0x22, 0x35, 0x64, 0xbc, 0xd6, 0xfb, 0xe6, 0x9a, 0xde, 0xbc, 0xde, 0xde, 0xde, 0xbb, 0xad, 0x9b, 0xa5, 0x19, 0x85, 0xd7, 0x74, 0x96, 0x64, 0x96, 0x5c, 0x76, 0x54, 0x55, 0x44, 0x36, 0x3c, 0x15, 0x34, 0xf5, 0x2b, 0xd5, 0x2b, 0xb5, 0x2b, 0x74, 0x2b, 0x53, 0x23, 0x74, 0x23, 0x75, 0x1b, 0x75, 0x1b, 0x55, 0x1b, 0x35, 0x13, 0x14, 0x13, 0x95, 0x3b, 0x98, 0x74, 0xfb, 0xad, 0xdd, 0xd6, 0xba, 0xd6, 0xfc, 0xde, 0x1e, 0xd7, 0x39, 0x8d, 0x5c, 0x85, 0x39, 0x54, 0x55, 0x3b, 0x55, 0x33, 0x96, 0x3b, 0x34, 0x33, 0xd4, 0x32, 0x35, 0x43, 0x38, 0x5c, 0xad, 0x11, 0x8a, 0x11, 0xaa, 0x19, 0xeb, 0x21, 0x6a, 0x19, 0x29, 0x11, 0xc7, 0x30, 0x44, 0x70, 0xa4, 0xc0, 0x60, 0xe8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x61, 0xf8, 0xc5, 0xc0, 0x2d, 0x51, 0xb2, 0x19, 0x93, 0x11, 0xb4, 0x11, 0xd3, 0x09, 0x12, 0x1a, 0x4c, 0x09, 0xc8, 0x08, 0xe8, 0x08, 0x46, 0x38, 0x24, 0xa8, 0x43, 0xe8, 0x41, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x61, 0xe8, 0xa3, 0xc8, 0x20, 0x78, 0x26, 0x62, 0xe8, 0x52, 0xe9, 0x4a, 0x0b, 0x4b, 0x49, 0x32, 0xc9, 0x21, 0x89, 0x19, 0x28, 0x11, 0xe8, 0x08, 0xe9, 0x08, 0xe9, 0x08, 0xe9, 0x08, 0x09, 0x01, 0x2a, 0x01, 0x6b, 0x09, 0xcd, 0x09, 0xd1, 0x0a, 0xd3, 0x02, 0xf5, 0x02, 0xf5, 0x0a, 0xd4, 0x0a, 0xd5, 0x12, 0xd5, 0x0a, 0xb5, 0x0a, 0xd4, 0x0a, 0x73, 0x0a, 0x32, 0x12, 0x91, 0x3a, 0x5d, 0xd6, 0x5b, 0xe6, 0x7a, 0xee, 0xbc, 0xde, 0x7d, 0xae, 0x90, 0x12, 0xb2, 0x0a, 0xd4, 0x0a, 0x95, 0x02, 0x96, 0x0a, 0x55, 0x02, 0x96, 0x0a, 0x75, 0x0a, 0x95, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x95, 0x0a, 0x99, 0x2b, 0x16, 0x13, 0xb4, 0x0a, 0x94, 0x12, 0x73, 0x0a, 0xd4, 0x22, 0x7b, 0x5c, 0xfc, 0x64, 0xb2, 0x22, 0x8c, 0x19, 0x1c, 0xbe, 0x9b, 0xce, 0xbb, 0xde, 0xba, 0xde, 0xbb, 0xd6, 0xcd, 0x42, 0x47, 0x09, 0x47, 0x09, 0x47, 0x11, 0x26, 0x21, 0x04, 0x61, 0xc2, 0xc8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x84, 0xd0, 0xcc, 0x81, 0xd2, 0x52, 0x35, 0x23, 0xd8, 0x1b, 0xf6, 0x23, 0x94, 0x2b, 0x90, 0x22, 0x19, 0x85, 0x5b, 0xc6, 0xbc, 0xd6, 0xdd, 0xce, 0xba, 0x8d, 0x94, 0x23, 0x56, 0x0b, 0x77, 0x03, 0x78, 0x03, 0x36, 0x03, 0x15, 0x03, 0x16, 0x03, 0x16, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x17, 0x2b, 0x31, 0x62, 0xc7, 0xc8, 0x02, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0x41, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0x41, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x60, 0xe0, 0x67, 0xc1, 0xd0, 0x8a, 0xf0, 0x29, 0xf3, 0x09, 0x35, 0x02, 0xb4, 0x01, 0xd5, 0x09, 0xb5, 0x01, 0xf6, 0x09, 0xf5, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xd6, 0x01, 0xb4, 0x01, 0xd5, 0x09, 0xf4, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xf6, 0x01, 0xd5, 0x01, 0xd4, 0x01, 0xf5, 0x09, 0xb3, 0x01, 0xd3, 0x09, 0x6f, 0x11, 0x52, 0x63, 0x9d, 0xce, 0x7d, 0xbe, 0xd7, 0x7c, 0xd4, 0x53, 0x32, 0x33, 0x12, 0x1b, 0x33, 0x13, 0x74, 0x1b, 0x54, 0x1b, 0x13, 0x0b, 0x13, 0x0b, 0x54, 0x13, 0x34, 0x0b, 0x14, 0x0b, 0x14, 0x0b, 0xf3, 0x02, 0xd3, 0x02, 0xd3, 0x02, 0xf4, 0x0a, 0x14, 0x0b, 0x14, 0x0b, + 0xf9, 0xee, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x3b, 0xef, 0x3b, 0xef, 0x3b, 0xef, 0x3b, 0xef, 0x1b, 0xef, 0x1a, 0xe7, 0xfa, 0xe6, 0xfa, 0xe6, 0xfa, 0xe6, 0xfa, 0xe6, 0x1a, 0xe7, 0xb9, 0xd6, 0xda, 0xde, 0x1c, 0xef, 0xba, 0xde, 0xfb, 0xee, 0x1b, 0xef, 0x1b, 0xef, 0x1b, 0xf7, 0xfb, 0xee, 0x3c, 0xf7, 0xfb, 0xee, 0x3c, 0xef, 0xfc, 0xee, 0xbc, 0xe6, 0xfc, 0xe6, 0xfb, 0xde, 0xfa, 0xde, 0x1b, 0xe7, 0x1b, 0xe7, 0xfb, 0xe6, 0xda, 0xe6, 0xfb, 0xe6, 0xfa, 0xde, 0x1a, 0xdf, 0x1a, 0xdf, 0xd9, 0xd6, 0xfa, 0xde, 0xda, 0xde, 0x99, 0xde, 0x59, 0xde, 0xdb, 0xe6, 0xfb, 0xee, 0xfb, 0xee, 0xdb, 0xee, 0x11, 0x8c, 0xec, 0x5a, 0xab, 0x6a, 0x29, 0x82, 0x46, 0xa9, 0x62, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0xa3, 0xe0, 0x8f, 0xdb, 0x19, 0xee, 0x9a, 0xe6, 0xdb, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0x79, 0xe6, 0x9a, 0xe6, 0x39, 0xd6, 0xba, 0xe6, 0xb9, 0xe6, 0x99, 0xde, 0x9a, 0xde, 0xfd, 0xee, 0xba, 0xe6, 0x99, 0xe6, 0xb9, 0xee, 0xda, 0xee, 0xda, 0xee, 0xda, 0xe6, 0xda, 0xde, 0xba, 0xde, 0xba, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0x7a, 0xd6, 0x7b, 0xd6, 0x9b, 0xd6, 0x5a, 0xce, 0x79, 0xce, 0x99, 0xd6, 0xd9, 0xd6, 0x99, 0xd6, 0x38, 0xd6, 0x59, 0xde, 0x7a, 0xee, 0x79, 0xee, 0x99, 0xee, 0xb9, 0xee, 0xb9, 0xf6, 0x99, 0xee, 0x78, 0xde, 0xba, 0xde, 0xda, 0xd6, 0xba, 0xd6, 0xba, 0xe6, 0x9a, 0xde, 0xfc, 0xd6, 0x3a, 0xb6, 0xdc, 0xd6, 0x79, 0xce, 0x90, 0x84, 0xa9, 0x4a, 0x8a, 0x52, 0x6a, 0x5a, 0x69, 0x52, 0x89, 0x7a, 0xc5, 0xa1, 0x03, 0xc9, 0x60, 0xe8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0xa4, 0xc8, 0xd3, 0xbb, 0xf9, 0xa4, 0x1a, 0x9d, 0x1b, 0x95, 0xd9, 0x8c, 0xd8, 0x8c, 0x8d, 0x42, 0xa9, 0x29, 0xa9, 0x31, 0x06, 0x59, 0x84, 0xb8, 0x42, 0xe8, 0x41, 0xf0, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf0, 0x82, 0xc8, 0x04, 0xa1, 0x08, 0x72, 0x8a, 0x5a, 0x8a, 0x52, 0xcb, 0x5a, 0xab, 0x52, 0x8a, 0x4a, 0x8a, 0x4a, 0x8a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0xab, 0x52, 0x8f, 0x73, 0xb3, 0x94, 0x97, 0xad, 0x19, 0xbe, 0x3a, 0xbe, 0x1b, 0xbe, 0xd7, 0x94, 0xd7, 0x94, 0x9a, 0xad, 0x7a, 0xad, 0xb7, 0x8c, 0x98, 0x7c, 0x7c, 0x8d, 0xd9, 0x7c, 0xd9, 0x7c, 0x56, 0x74, 0x19, 0x9d, 0x7c, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0xdb, 0xd6, 0x1f, 0xd7, 0x96, 0x7c, 0xf4, 0x5b, 0x73, 0x43, 0x34, 0x43, 0x55, 0x4b, 0x14, 0x4b, 0x55, 0x53, 0xf3, 0x42, 0x37, 0x64, 0x78, 0x6c, 0x13, 0x43, 0x92, 0x32, 0x96, 0x53, 0x76, 0x4b, 0x54, 0x4b, 0xf6, 0x63, 0xd5, 0x63, 0x12, 0x4b, 0x90, 0x42, 0xd1, 0x42, 0x11, 0x53, 0xb3, 0x73, 0x9d, 0xde, 0xbc, 0xde, 0x9b, 0xde, 0x9b, 0xd6, 0x9b, 0xd6, 0xf9, 0xb5, 0xea, 0x31, 0x87, 0x29, 0xa7, 0x39, 0x65, 0x51, 0x02, 0x81, 0xc0, 0xd8, 0x40, 0xf8, 0x20, 0xf0, 0x40, 0xf8, 0x20, 0xf0, 0x40, 0xf0, 0x41, 0xf0, 0x21, 0xf0, 0x21, 0xf0, 0x64, 0xc8, 0xeb, 0x89, 0xaf, 0x52, 0x8f, 0x22, 0x12, 0x23, 0xf2, 0x32, 0xf2, 0x42, 0x33, 0x5b, 0x1c, 0xbe, 0x5a, 0xce, 0xba, 0xd6, 0xda, 0xce, 0x9b, 0xb6, 0xb7, 0x64, 0x74, 0x2b, 0xf4, 0x0a, 0x56, 0x1b, 0x55, 0x1b, 0x55, 0x1b, 0x75, 0x13, 0x75, 0x0b, 0xd5, 0x0b, 0xf1, 0x2a, 0x8c, 0x79, 0xc8, 0xc0, 0x63, 0xe8, 0x20, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x61, 0xe0, 0x65, 0xb1, 0x8c, 0x8a, 0xfd, 0xb5, 0x51, 0x1a, 0x93, 0x0a, 0x33, 0x02, 0xf3, 0x11, 0xd3, 0x11, 0xf4, 0x09, 0x35, 0x12, 0x13, 0x02, 0xf3, 0x01, 0x54, 0x02, 0x34, 0x02, 0xd3, 0x01, 0xd4, 0x09, 0x35, 0x0a, 0xf4, 0x01, 0xd5, 0x01, 0x16, 0x0a, 0xf5, 0x09, 0xf4, 0x09, 0x34, 0x12, 0xf2, 0x11, 0xd0, 0x11, 0xce, 0x29, 0x74, 0x9c, 0x38, 0xde, 0x58, 0xd6, 0x78, 0xd6, 0x38, 0xce, 0x9a, 0xd6, 0x19, 0xce, 0xf9, 0xcd, 0x3a, 0xce, 0xfa, 0xc5, 0x78, 0xb5, 0x98, 0xb5, 0xb9, 0xbd, 0x98, 0xb5, 0x99, 0xb5, 0xb9, 0xbd, 0xd9, 0xbd, 0x99, 0xb5, 0x98, 0xb5, 0x78, 0xad, 0x17, 0xa5, 0xb5, 0x9c, + 0xba, 0xe6, 0xfb, 0xee, 0x3c, 0xf7, 0x3c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x3c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x3c, 0xef, 0x3c, 0xef, 0x3c, 0xef, 0x1b, 0xef, 0xfb, 0xee, 0xda, 0xe6, 0xba, 0xe6, 0x1c, 0xef, 0xfb, 0xe6, 0xfb, 0xe6, 0x7c, 0xef, 0x5c, 0xe7, 0x1b, 0xe7, 0x3c, 0xef, 0x1c, 0xef, 0x3c, 0xf7, 0x1b, 0xef, 0x3b, 0xef, 0x3b, 0xef, 0x5b, 0xef, 0x1b, 0xef, 0xfb, 0xe6, 0xfc, 0xee, 0x1d, 0xef, 0x1d, 0xf7, 0xdb, 0xee, 0xdb, 0xee, 0xfb, 0xee, 0x1c, 0xef, 0xfb, 0xe6, 0x1b, 0xe7, 0xfb, 0xde, 0xfb, 0xe6, 0x9a, 0xde, 0xbb, 0xe6, 0xdc, 0xee, 0x7a, 0xe6, 0xba, 0xe6, 0x1b, 0xef, 0x1c, 0xf7, 0xf0, 0x8b, 0xab, 0x5a, 0x6a, 0x62, 0x28, 0x8a, 0x45, 0xa9, 0x62, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x62, 0xd8, 0xae, 0xe3, 0xba, 0xfe, 0xb9, 0xee, 0xba, 0xe6, 0xdb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xe6, 0xdc, 0xde, 0xdb, 0xde, 0xda, 0xde, 0xfa, 0xe6, 0xfc, 0xee, 0x9b, 0xde, 0xdc, 0xde, 0x3d, 0xe7, 0xfc, 0xe6, 0xba, 0xe6, 0x99, 0xe6, 0xba, 0xe6, 0x9b, 0xde, 0xdc, 0xe6, 0xbb, 0xe6, 0x9a, 0xe6, 0xba, 0xe6, 0xba, 0xee, 0xda, 0xee, 0xba, 0xe6, 0xba, 0xde, 0xdb, 0xde, 0xba, 0xde, 0xb9, 0xde, 0xfa, 0xee, 0xfa, 0xee, 0xb9, 0xde, 0xba, 0xd6, 0x9a, 0xde, 0xdc, 0xe6, 0xdc, 0xde, 0xfc, 0xd6, 0xfb, 0xce, 0xfb, 0xd6, 0xba, 0xd6, 0xfb, 0xe6, 0x1c, 0xdf, 0xdc, 0xde, 0x9c, 0xe6, 0xbc, 0xee, 0xdb, 0xee, 0xba, 0xde, 0xdb, 0xd6, 0x9b, 0xd6, 0x9b, 0xe6, 0x5a, 0xe6, 0x38, 0xde, 0x8e, 0x8b, 0x4b, 0x62, 0x8b, 0x62, 0xca, 0x52, 0x69, 0x6a, 0x87, 0x99, 0xc5, 0xc8, 0x42, 0xe8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0xa1, 0xc8, 0x55, 0xfd, 0x79, 0xee, 0x9a, 0xe6, 0xba, 0xde, 0xb9, 0xd6, 0xd9, 0xde, 0xee, 0x7b, 0xaa, 0x52, 0x8a, 0x52, 0xe8, 0x79, 0xe4, 0xc8, 0x41, 0xf0, 0x40, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x41, 0xf0, 0xc3, 0xd8, 0x4a, 0xd2, 0xd0, 0xb3, 0x32, 0x94, 0x32, 0x94, 0x72, 0x94, 0x92, 0x94, 0x92, 0x94, 0x13, 0xa5, 0x74, 0xb5, 0xf6, 0xc5, 0x37, 0xd6, 0xb9, 0xe6, 0xdb, 0xe6, 0xbb, 0xe6, 0x7a, 0xd6, 0x7b, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xfb, 0xde, 0xd9, 0xd6, 0x98, 0xd6, 0xd9, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x78, 0xde, 0x78, 0xde, 0x78, 0xe6, 0x99, 0xee, 0x79, 0xe6, 0x9a, 0xde, 0x1c, 0xdf, 0xdb, 0xd6, 0x9a, 0xde, 0xba, 0xee, 0xdb, 0xe6, 0xba, 0xde, 0xba, 0xd6, 0xdb, 0xe6, 0x9b, 0xde, 0x7a, 0xde, 0xb9, 0xde, 0x78, 0xd6, 0xb8, 0xd6, 0x98, 0xd6, 0xd9, 0xde, 0xba, 0xde, 0x59, 0xce, 0xfc, 0xde, 0x9a, 0xce, 0x99, 0xce, 0xda, 0xde, 0xba, 0xde, 0x99, 0xce, 0xdb, 0xde, 0x79, 0xde, 0x59, 0xde, 0x98, 0xde, 0xb9, 0xde, 0x9a, 0xde, 0xfc, 0xde, 0xbb, 0xce, 0x10, 0x7c, 0x8a, 0x5a, 0x29, 0x6a, 0xa8, 0x81, 0xe6, 0xa8, 0x83, 0xe8, 0x01, 0xf8, 0x02, 0xf0, 0x22, 0xf8, 0x41, 0xf0, 0x61, 0xf0, 0x41, 0xf0, 0x61, 0xf8, 0x20, 0xf8, 0x62, 0xe0, 0x4e, 0xe3, 0xf8, 0xfd, 0x59, 0xe6, 0x59, 0xd6, 0x58, 0xd6, 0x58, 0xce, 0x19, 0xd6, 0xd9, 0xcd, 0x7b, 0xe6, 0x3a, 0xde, 0x79, 0xe6, 0x7a, 0xde, 0x5a, 0xc6, 0xb9, 0xad, 0xda, 0xad, 0x1b, 0xb6, 0x78, 0xa5, 0x38, 0x95, 0x7a, 0x95, 0x39, 0x9d, 0x96, 0xac, 0xae, 0xb2, 0xa4, 0xd8, 0x01, 0xf8, 0x42, 0xf0, 0x21, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0xa3, 0xd0, 0x26, 0xa9, 0x8a, 0x8a, 0x18, 0xce, 0x39, 0xc6, 0x95, 0x84, 0x75, 0x5b, 0x76, 0x53, 0xf5, 0x53, 0xb4, 0x4b, 0x95, 0x4b, 0x58, 0x6c, 0x38, 0x74, 0x74, 0x5b, 0x51, 0x4b, 0x11, 0x43, 0x55, 0x4b, 0x59, 0x6c, 0x73, 0x53, 0x32, 0x43, 0x13, 0x43, 0x35, 0x4b, 0x15, 0x43, 0x35, 0x43, 0x96, 0x4b, 0x55, 0x43, 0x55, 0x4b, 0xb5, 0x6b, 0xba, 0xc5, 0x5a, 0xde, 0x3a, 0xd6, 0x3a, 0xce, 0x7b, 0xd6, 0x5b, 0xd6, 0x5a, 0xd6, 0x38, 0xd6, 0x59, 0xde, 0x59, 0xd6, 0x18, 0xce, 0x59, 0xd6, 0xba, 0xde, 0x79, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0x79, 0xd6, 0x18, 0xce, 0x38, 0xce, 0x79, 0xd6, 0x79, 0xd6, 0x58, 0xce, + 0xfc, 0xe6, 0xfc, 0xe6, 0x1d, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xe7, 0x1d, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x1d, 0xe7, 0x1d, 0xe7, 0x1d, 0xe7, 0x1d, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0x1c, 0xe7, 0xfb, 0xde, 0xba, 0xde, 0x3c, 0xf7, 0xbb, 0xe6, 0x1c, 0xef, 0x3c, 0xef, 0x5b, 0xef, 0x5b, 0xe7, 0x5d, 0xe7, 0x1d, 0xe7, 0x5d, 0xf7, 0x3c, 0xf7, 0xfb, 0xe6, 0x1b, 0xe7, 0x3c, 0xef, 0x5c, 0xef, 0xfb, 0xde, 0x3c, 0xe7, 0x3b, 0xe7, 0x1b, 0xe7, 0x1b, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0xfb, 0xde, 0x3c, 0xe7, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0xdb, 0xe6, 0xfc, 0xee, 0xfb, 0xee, 0x9a, 0xde, 0xba, 0xe6, 0xfb, 0xee, 0x3b, 0xf7, 0xce, 0x8b, 0xcc, 0x5a, 0x8b, 0x6a, 0x49, 0x8a, 0x65, 0xa9, 0x81, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0xc2, 0xd8, 0xae, 0xe3, 0x7a, 0xfe, 0xbc, 0xf6, 0xbc, 0xe6, 0x1c, 0xe7, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xe6, 0x1c, 0xef, 0x9b, 0xde, 0xdc, 0xe6, 0xbc, 0xe6, 0xdc, 0xe6, 0xdb, 0xe6, 0xda, 0xee, 0x1a, 0xef, 0x3b, 0xdf, 0xfb, 0xd6, 0xfa, 0xd6, 0xfb, 0xde, 0xfb, 0xe6, 0xdb, 0xe6, 0xfa, 0xee, 0xda, 0xee, 0x9c, 0xf6, 0x9d, 0xee, 0xdc, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xbb, 0xde, 0xdb, 0xe6, 0xbb, 0xe6, 0xfc, 0xee, 0xdc, 0xe6, 0xdb, 0xe6, 0xdb, 0xde, 0xda, 0xd6, 0x3b, 0xdf, 0xfb, 0xd6, 0xbb, 0xde, 0x9a, 0xee, 0xdb, 0xf6, 0xdb, 0xde, 0xfb, 0xde, 0x1b, 0xdf, 0x1c, 0xdf, 0xfb, 0xde, 0xfc, 0xde, 0xda, 0xe6, 0xba, 0xe6, 0xba, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xda, 0xde, 0xba, 0xd6, 0x99, 0xd6, 0x6b, 0x62, 0x4a, 0x62, 0xab, 0x6a, 0x49, 0x7a, 0x65, 0xa1, 0x03, 0xc9, 0x42, 0xe8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x82, 0xf8, 0xa2, 0xc0, 0xf6, 0xfd, 0xb9, 0xde, 0xba, 0xe6, 0xdb, 0xde, 0xfa, 0xd6, 0xda, 0xd6, 0xf0, 0x83, 0x8b, 0x5a, 0xaa, 0x52, 0x28, 0x7a, 0xe3, 0xc0, 0x41, 0xf0, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0x82, 0xd0, 0xd0, 0xfb, 0x19, 0xfe, 0xbb, 0xe6, 0xda, 0xe6, 0x1b, 0xef, 0xfa, 0xe6, 0xfa, 0xde, 0x1b, 0xdf, 0x1c, 0xdf, 0xdb, 0xe6, 0xbb, 0xe6, 0xdc, 0xe6, 0xbc, 0xde, 0xfd, 0xde, 0xbc, 0xd6, 0xdb, 0xde, 0xfc, 0xde, 0xdd, 0xde, 0xdd, 0xde, 0xdc, 0xde, 0xdc, 0xde, 0xbb, 0xd6, 0xbb, 0xde, 0xbb, 0xe6, 0xbb, 0xe6, 0x9b, 0xde, 0xdc, 0xe6, 0x7b, 0xe6, 0x5a, 0xde, 0xbc, 0xde, 0xbc, 0xde, 0x9b, 0xd6, 0xbb, 0xde, 0xba, 0xde, 0xfb, 0xee, 0xdb, 0xe6, 0x9a, 0xde, 0xdc, 0xde, 0xbc, 0xd6, 0xdc, 0xde, 0xbb, 0xde, 0x9b, 0xde, 0x9c, 0xe6, 0x9c, 0xf6, 0x5a, 0xe6, 0xba, 0xd6, 0xb9, 0xce, 0xbb, 0xd6, 0x9b, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0x58, 0xce, 0xd9, 0xd6, 0x3c, 0xe7, 0x79, 0xd6, 0xbb, 0xd6, 0x7b, 0xd6, 0x7b, 0xde, 0x3b, 0xde, 0x9c, 0xee, 0x7c, 0xe6, 0x9d, 0xee, 0x53, 0xa4, 0x4a, 0x5a, 0x29, 0x6a, 0x87, 0x91, 0xe5, 0xb8, 0x62, 0xe8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x84, 0xe0, 0x72, 0xec, 0x19, 0xe6, 0x7a, 0xde, 0x7a, 0xce, 0x79, 0xd6, 0x7a, 0xd6, 0x5a, 0xde, 0x5a, 0xd6, 0x9a, 0xce, 0xda, 0xde, 0x9a, 0xde, 0x9b, 0xde, 0xfc, 0xde, 0xbb, 0xd6, 0x5a, 0xd6, 0x79, 0xde, 0x58, 0xd6, 0x78, 0xd6, 0x9a, 0xde, 0x96, 0xf5, 0x08, 0xea, 0xa2, 0xf8, 0x00, 0xf0, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xe8, 0xc3, 0xd0, 0x86, 0x99, 0xab, 0x8a, 0x18, 0xd6, 0x59, 0xd6, 0xbb, 0xde, 0x9a, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0x9a, 0xce, 0x7a, 0xd6, 0x99, 0xd6, 0x38, 0xd6, 0x17, 0xd6, 0xf6, 0xd5, 0x17, 0xd6, 0x37, 0xde, 0x37, 0xd6, 0x37, 0xd6, 0x17, 0xce, 0x18, 0xce, 0x37, 0xd6, 0x17, 0xde, 0xb6, 0xd5, 0xb6, 0xd5, 0xf6, 0xd5, 0x16, 0xd6, 0x58, 0xd6, 0x38, 0xce, 0x79, 0xce, 0x79, 0xd6, 0x7a, 0xde, 0x9b, 0xe6, 0x99, 0xde, 0x79, 0xde, 0x9b, 0xde, 0x5a, 0xd6, 0x39, 0xce, 0x39, 0xce, 0x5a, 0xd6, 0x7b, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x5a, 0xde, 0x7a, 0xde, 0x5a, 0xd6, 0x5a, 0xde, 0x7b, 0xde, 0x5b, 0xd6, 0x5b, 0xde, + 0x7a, 0x8d, 0x7a, 0x8d, 0x9a, 0x8d, 0xbb, 0x95, 0xbb, 0x95, 0xbb, 0x95, 0xbb, 0x95, 0xbb, 0x95, 0xbb, 0x95, 0xdc, 0x9d, 0x1c, 0xa6, 0x3d, 0xa6, 0x5d, 0xae, 0x1d, 0xa6, 0xdc, 0x9d, 0xbb, 0x95, 0xfb, 0x95, 0xfa, 0x95, 0xfa, 0xad, 0x1e, 0xe7, 0x3c, 0xef, 0x1b, 0xef, 0x3b, 0xef, 0x1c, 0xe7, 0xfe, 0xce, 0x7e, 0xb6, 0x5d, 0xbe, 0x5d, 0xbe, 0x5d, 0xb6, 0x5d, 0xb6, 0x3d, 0xb6, 0x3d, 0xb6, 0x3d, 0xae, 0x3c, 0xa6, 0xfc, 0xa5, 0xdb, 0x9d, 0xda, 0x9d, 0x1b, 0xa6, 0x3c, 0xa6, 0x1c, 0xa6, 0xdb, 0x9d, 0xba, 0x95, 0xba, 0x9d, 0xba, 0x9d, 0xda, 0x9d, 0xfb, 0xad, 0x3c, 0xb6, 0x9c, 0xc6, 0xdc, 0xd6, 0xdb, 0xde, 0x1b, 0xef, 0x10, 0x8c, 0xed, 0x5a, 0x8b, 0x5a, 0x29, 0x7a, 0x66, 0xa1, 0x82, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x83, 0xe0, 0x4f, 0xeb, 0xda, 0xfd, 0x7c, 0xf6, 0xdd, 0xde, 0x5e, 0xdf, 0x1c, 0xd7, 0xfc, 0xd6, 0xfd, 0xde, 0xbd, 0xde, 0xbd, 0xe6, 0xbb, 0xde, 0xda, 0xde, 0xfa, 0xde, 0x5b, 0xe7, 0x1b, 0xe7, 0xba, 0xd6, 0xfd, 0xe6, 0x3f, 0xef, 0x3f, 0xe7, 0x3e, 0xdf, 0x3e, 0xd7, 0x3e, 0xd7, 0xfd, 0xde, 0xdd, 0xd6, 0xde, 0xce, 0xdd, 0xc6, 0xfd, 0xc6, 0xfd, 0xce, 0xde, 0xde, 0xdf, 0xe6, 0x9e, 0xce, 0xbe, 0xce, 0x1e, 0xdf, 0x1e, 0xe7, 0xdd, 0xde, 0x7c, 0xd6, 0x7d, 0xc6, 0xff, 0xd6, 0xfc, 0xd6, 0xfb, 0xd6, 0xfa, 0xce, 0x1c, 0xdf, 0xdc, 0xee, 0xfe, 0xf6, 0xbd, 0xde, 0xdd, 0xde, 0xbc, 0xde, 0xdc, 0xe6, 0xfb, 0xde, 0xdb, 0xd6, 0xfc, 0xd6, 0xfd, 0xd6, 0xfe, 0xe6, 0xdd, 0xee, 0x7b, 0xde, 0xfc, 0xee, 0xb3, 0x94, 0x0c, 0x53, 0x8a, 0x4a, 0x8a, 0x7a, 0x87, 0xb1, 0x83, 0xd0, 0x42, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x04, 0xd9, 0xf7, 0xfd, 0xda, 0xde, 0x9b, 0xe6, 0xbc, 0xe6, 0xfc, 0xe6, 0xfc, 0xde, 0x11, 0x7c, 0xed, 0x52, 0xec, 0x52, 0x49, 0x72, 0x04, 0xc1, 0x41, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0xc4, 0xd8, 0x11, 0xfc, 0x7a, 0xfe, 0xbb, 0xe6, 0x5a, 0xd6, 0x3d, 0xef, 0xfc, 0xde, 0x3d, 0xdf, 0xfd, 0xd6, 0x5e, 0xdf, 0xfb, 0xde, 0xba, 0xde, 0xba, 0xde, 0x9a, 0xde, 0xfb, 0xe6, 0xda, 0xe6, 0xd9, 0xe6, 0xb9, 0xe6, 0xdb, 0xe6, 0xbb, 0xe6, 0xdb, 0xe6, 0xdb, 0xe6, 0xda, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0xfb, 0xd6, 0xbb, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xdb, 0xce, 0x1c, 0xd7, 0xfa, 0xd6, 0x99, 0xce, 0x1b, 0xd7, 0xfb, 0xce, 0x1b, 0xdf, 0xfb, 0xde, 0xfb, 0xde, 0x9b, 0xd6, 0xbc, 0xde, 0x9b, 0xde, 0xb9, 0xd6, 0xba, 0xd6, 0xdb, 0xd6, 0xbc, 0xd6, 0xdb, 0xde, 0xbb, 0xde, 0xbc, 0xee, 0x9c, 0xe6, 0xbb, 0xd6, 0xba, 0xd6, 0xbc, 0xe6, 0x7c, 0xe6, 0x3b, 0xde, 0x7c, 0xde, 0xdc, 0xde, 0x59, 0xce, 0x9a, 0xde, 0xba, 0xe6, 0xba, 0xe6, 0x1b, 0xef, 0xb9, 0xd6, 0xf2, 0x94, 0xea, 0x4a, 0x48, 0x62, 0x45, 0xa9, 0xa2, 0xd8, 0x40, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x83, 0xd8, 0x14, 0xf5, 0x17, 0xd6, 0x79, 0xde, 0xba, 0xde, 0xb9, 0xce, 0xb9, 0xd6, 0xbb, 0xe6, 0x7a, 0xde, 0x9a, 0xde, 0x59, 0xde, 0x7b, 0xde, 0x9b, 0xe6, 0x59, 0xde, 0x99, 0xe6, 0xb9, 0xde, 0xb9, 0xde, 0x99, 0xce, 0x79, 0xe6, 0x14, 0xfd, 0x08, 0xda, 0xa3, 0xe8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x21, 0xe0, 0xa3, 0xd8, 0x46, 0xb9, 0x8a, 0x92, 0xd7, 0xd5, 0x39, 0xde, 0x59, 0xde, 0x38, 0xde, 0xba, 0xe6, 0x99, 0xe6, 0x99, 0xe6, 0x79, 0xde, 0x9a, 0xe6, 0x7a, 0xde, 0x9b, 0xde, 0x5a, 0xd6, 0x7b, 0xd6, 0x7b, 0xd6, 0x5b, 0xce, 0x9c, 0xd6, 0x7b, 0xd6, 0x7a, 0xce, 0x7a, 0xd6, 0x38, 0xd6, 0xb7, 0xc5, 0x97, 0xc5, 0xf9, 0xd5, 0x9a, 0xde, 0xbb, 0xde, 0x7a, 0xd6, 0xbb, 0xde, 0x9a, 0xd6, 0xbb, 0xde, 0x9b, 0xd6, 0xbc, 0xde, 0x9b, 0xce, 0x9b, 0xd6, 0x9a, 0xd6, 0x9a, 0xde, 0x99, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x9a, 0xde, 0xba, 0xde, 0x9a, 0xde, 0x9a, 0xd6, 0xbb, 0xd6, 0x9b, 0xd6, 0x7a, 0xce, 0x9b, 0xce, 0x7b, 0xce, 0x9c, 0xd6, + 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x79, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x0b, 0x79, 0x0b, 0x37, 0x0b, 0x36, 0x23, 0x34, 0x3b, 0x7e, 0xbe, 0xdc, 0xde, 0xfb, 0xe6, 0x7d, 0xf7, 0xbf, 0xe7, 0x37, 0x4c, 0xd7, 0x23, 0x97, 0x13, 0xb7, 0x13, 0xb6, 0x13, 0xb7, 0x0b, 0x97, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb8, 0x0b, 0xd8, 0x0b, 0x97, 0x0b, 0xb7, 0x0b, 0x37, 0x3c, 0xfe, 0xc6, 0xdc, 0xde, 0x1c, 0xe7, 0x31, 0x84, 0x2b, 0x3a, 0x68, 0x29, 0x05, 0x49, 0xe4, 0x88, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x81, 0xf8, 0xc3, 0xc8, 0x6d, 0x6a, 0x73, 0x33, 0x75, 0x03, 0x97, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x96, 0x0b, 0xd6, 0x13, 0xf6, 0x2b, 0x5a, 0x75, 0xbd, 0xce, 0xfc, 0xee, 0xfc, 0xee, 0xfd, 0xde, 0xbe, 0xb6, 0x98, 0x54, 0xd7, 0x33, 0x77, 0x23, 0x97, 0x23, 0x57, 0x1b, 0x16, 0x0b, 0xd6, 0x02, 0x38, 0x13, 0x18, 0x13, 0x38, 0x03, 0x38, 0x03, 0x17, 0x03, 0xf6, 0x02, 0x17, 0x03, 0x17, 0x03, 0x58, 0x0b, 0x17, 0x0b, 0x57, 0x03, 0x16, 0x13, 0x74, 0x2a, 0x12, 0x4a, 0x70, 0x6a, 0x31, 0x93, 0xd8, 0xdd, 0x59, 0xee, 0xba, 0xf6, 0x9b, 0xe6, 0xff, 0xd6, 0x57, 0x5c, 0xf8, 0x23, 0x78, 0x03, 0xb8, 0x0b, 0xb8, 0x13, 0xb7, 0x13, 0x96, 0x13, 0x76, 0x13, 0x77, 0x23, 0x77, 0x2b, 0x97, 0x33, 0xb5, 0x23, 0xb4, 0x23, 0x33, 0x33, 0xcc, 0x19, 0xea, 0x19, 0xa8, 0x51, 0xe6, 0xb0, 0x84, 0xe8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x22, 0xf8, 0x68, 0xd1, 0x37, 0xbd, 0xfc, 0x95, 0x9c, 0x95, 0x7c, 0x8d, 0x5c, 0x7d, 0x3a, 0x7d, 0x30, 0x43, 0x4c, 0x32, 0x4b, 0x32, 0xa8, 0x51, 0xe4, 0xb0, 0x42, 0xe8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xe8, 0xc4, 0xd0, 0x2e, 0xe3, 0x59, 0xee, 0xba, 0xd6, 0x3d, 0xdf, 0xfd, 0xce, 0xde, 0xbe, 0x9a, 0x85, 0xdc, 0x85, 0xdc, 0x85, 0xbb, 0x8d, 0x9a, 0x8d, 0xba, 0x95, 0xdc, 0x9d, 0x7e, 0xae, 0x9f, 0xb6, 0xbf, 0xbe, 0xbe, 0xbe, 0x1b, 0xa6, 0x1b, 0xa6, 0x3b, 0xa6, 0x3b, 0xa6, 0x3b, 0x9e, 0x3c, 0x9e, 0x3c, 0xa6, 0xfb, 0x9d, 0xfb, 0x9d, 0xfb, 0x9d, 0x5c, 0xb6, 0x7c, 0xc6, 0x9b, 0xce, 0x79, 0xd6, 0xba, 0xde, 0x9a, 0xe6, 0x9c, 0xe6, 0xbd, 0xee, 0x1d, 0xff, 0x9a, 0xe6, 0x3d, 0xdf, 0x1c, 0xcf, 0xfb, 0xce, 0xfb, 0xce, 0xbc, 0xd6, 0xdd, 0xd6, 0xde, 0xce, 0xfe, 0xd6, 0xfd, 0xd6, 0x1c, 0xe7, 0x1a, 0xdf, 0xfa, 0xde, 0xfc, 0xde, 0x5c, 0xce, 0x7d, 0xde, 0xbe, 0xee, 0x7d, 0xe6, 0xbd, 0xe6, 0x9a, 0xc6, 0xda, 0xce, 0x78, 0xce, 0x99, 0xd6, 0x79, 0xc6, 0xdc, 0xce, 0x1d, 0xdf, 0x94, 0x94, 0x6c, 0x5a, 0x0a, 0x82, 0xe5, 0xc0, 0x43, 0xe8, 0x41, 0xf0, 0x21, 0xf8, 0x41, 0xf0, 0x41, 0xf0, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x24, 0xd9, 0x59, 0xfe, 0xfb, 0xde, 0x7a, 0xd6, 0x9b, 0xde, 0x9c, 0xde, 0xbd, 0xe6, 0x7b, 0xde, 0x9b, 0xd6, 0xba, 0xce, 0xdb, 0xce, 0x1c, 0xdf, 0xfc, 0xd6, 0x1c, 0xcf, 0xdc, 0xce, 0x9b, 0xde, 0x5a, 0xe6, 0x7a, 0xe6, 0xb3, 0xe4, 0x06, 0xe1, 0x02, 0xf0, 0x01, 0xf0, 0x21, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x02, 0xf8, 0x84, 0xe0, 0xa7, 0xa9, 0xca, 0x8a, 0x17, 0xde, 0xba, 0xd6, 0x9c, 0xce, 0xfe, 0xd6, 0xbc, 0xd6, 0x7a, 0xd6, 0x5d, 0xef, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0xbb, 0xe6, 0x5a, 0xd6, 0x3a, 0xce, 0x7b, 0xde, 0xbc, 0xe6, 0x9b, 0xde, 0x79, 0xde, 0x79, 0xde, 0x19, 0xce, 0x5a, 0xd6, 0x9a, 0xde, 0x7a, 0xde, 0x5a, 0xd6, 0x9c, 0xde, 0xbb, 0xde, 0x7a, 0xd6, 0xbc, 0xde, 0x5a, 0xde, 0x78, 0xe6, 0xd9, 0xf6, 0x99, 0xe6, 0x5a, 0xd6, 0xbc, 0xd6, 0x7d, 0xce, 0x5c, 0xce, 0x7d, 0xd6, 0x7d, 0xd6, 0x7d, 0xce, 0x7d, 0xce, 0x7d, 0xc6, 0x9d, 0xc6, 0x9d, 0xc6, 0xbd, 0xbe, 0x7d, 0xae, 0x5c, 0xa6, 0x1b, 0x9e, 0xba, 0x85, 0x18, 0x75, 0x76, 0x5c, 0x75, 0x54, + 0x9a, 0x13, 0x9a, 0x13, 0x99, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x58, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x59, 0x0b, 0x38, 0x0b, 0xf4, 0x1a, 0xdf, 0xb6, 0xfc, 0xd6, 0xfb, 0xe6, 0x3c, 0xef, 0x5f, 0xdf, 0x75, 0x2b, 0x98, 0x0b, 0xd9, 0x0b, 0x3a, 0x14, 0x7b, 0x24, 0x5b, 0x1c, 0xfb, 0x0b, 0xfb, 0x0b, 0xb9, 0x03, 0xd9, 0x0b, 0x3a, 0x14, 0x7b, 0x24, 0xbb, 0x24, 0x7b, 0x1c, 0x19, 0x14, 0xd8, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xf9, 0x0b, 0x19, 0x14, 0xf8, 0x13, 0x97, 0x0b, 0x76, 0x03, 0xd5, 0x2b, 0xde, 0xc6, 0xfc, 0xde, 0xfc, 0xe6, 0x32, 0x84, 0xc9, 0x21, 0x06, 0x19, 0xc4, 0x38, 0x25, 0x89, 0x82, 0xd8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0xa3, 0xc8, 0x0e, 0x72, 0x35, 0x43, 0x97, 0x1b, 0xb9, 0x0b, 0x9a, 0x13, 0x79, 0x0b, 0xb9, 0x13, 0x97, 0x13, 0x36, 0x13, 0xd6, 0x43, 0x9d, 0xc6, 0x9a, 0xd6, 0x3b, 0xe7, 0x3e, 0xdf, 0x19, 0x75, 0x15, 0x1b, 0x38, 0x13, 0x18, 0x0b, 0x37, 0x03, 0x16, 0x03, 0x57, 0x03, 0x98, 0x0b, 0xd7, 0x02, 0xd8, 0x0a, 0x38, 0x03, 0x38, 0x0b, 0x19, 0x13, 0xf9, 0x12, 0xf9, 0x12, 0xfa, 0x12, 0xd9, 0x0a, 0xf8, 0x02, 0x58, 0x03, 0x78, 0x13, 0x16, 0x2b, 0xf0, 0x59, 0xa8, 0xc0, 0xc6, 0xd8, 0x0d, 0xb3, 0x9a, 0xee, 0xfb, 0xde, 0x3e, 0xcf, 0x3f, 0xb7, 0x14, 0x1b, 0x16, 0x13, 0x59, 0x13, 0x17, 0x0b, 0x18, 0x13, 0xf8, 0x12, 0xd9, 0x12, 0xf9, 0x0a, 0x19, 0x0b, 0x3a, 0x13, 0x59, 0x0b, 0x99, 0x0b, 0x36, 0x0b, 0xf3, 0x22, 0x09, 0x01, 0x25, 0x11, 0x25, 0x61, 0x64, 0xd0, 0x02, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x22, 0xf0, 0x64, 0xe0, 0x29, 0x99, 0x12, 0x3b, 0xb7, 0x0b, 0x98, 0x13, 0x99, 0x13, 0xd9, 0x03, 0xd7, 0x13, 0x2e, 0x0a, 0x8a, 0x09, 0x89, 0x09, 0x06, 0x31, 0xa3, 0xa0, 0x62, 0xe8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x42, 0xe8, 0xa4, 0xc8, 0xc8, 0xa9, 0x79, 0xf6, 0xda, 0xd6, 0xfb, 0xd6, 0x5f, 0xcf, 0x33, 0x23, 0x96, 0x1b, 0xb7, 0x1b, 0x36, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x36, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0xf7, 0x0a, 0x17, 0x0b, 0x36, 0x0b, 0x35, 0x03, 0x36, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x56, 0x0b, 0x36, 0x13, 0x15, 0x13, 0x14, 0x13, 0xd3, 0x12, 0xb2, 0x22, 0x32, 0x4b, 0x9d, 0xce, 0xbc, 0xe6, 0x9b, 0xee, 0x7c, 0xde, 0xbf, 0xbe, 0x95, 0x33, 0x76, 0x1b, 0x76, 0x0b, 0x75, 0x13, 0xf3, 0x2a, 0x70, 0x7a, 0xce, 0x71, 0x51, 0x42, 0xf3, 0x2a, 0x35, 0x13, 0xb6, 0x1b, 0xb6, 0x23, 0xf7, 0x3b, 0xf7, 0x33, 0xf7, 0x33, 0xd6, 0x13, 0x75, 0x03, 0x34, 0x0b, 0x55, 0x13, 0x75, 0x1b, 0x94, 0x33, 0x92, 0x53, 0x5b, 0xbe, 0xfb, 0xde, 0xda, 0xde, 0xbb, 0xe6, 0x9b, 0xce, 0x97, 0x85, 0xc9, 0x19, 0x45, 0x38, 0xa6, 0x90, 0x63, 0xe0, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x22, 0xe8, 0x64, 0xd8, 0x08, 0xa1, 0x6f, 0x4a, 0x54, 0x2b, 0xf7, 0x43, 0x58, 0x4c, 0x75, 0x2b, 0x54, 0x33, 0x73, 0x53, 0x3c, 0xbe, 0xfd, 0xde, 0xbb, 0xde, 0x99, 0xd6, 0xfd, 0xde, 0xbc, 0xa5, 0x58, 0x6c, 0x3a, 0x7d, 0xda, 0xbd, 0x2d, 0xcb, 0xa2, 0xc8, 0x63, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x21, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xe0, 0xe6, 0xc0, 0x27, 0x79, 0xee, 0x6a, 0x3b, 0xae, 0x9c, 0xc6, 0x7c, 0xce, 0x7a, 0xce, 0xbb, 0xde, 0xdb, 0xde, 0xdc, 0xde, 0xd8, 0xb5, 0x9c, 0xce, 0xfe, 0xd6, 0x9d, 0xc6, 0x5c, 0xbe, 0x3c, 0xae, 0x1c, 0xae, 0xd7, 0x7c, 0xd8, 0x7c, 0xfc, 0xa5, 0x7a, 0x95, 0x19, 0x7d, 0x37, 0x54, 0xf7, 0x4b, 0xd6, 0x3b, 0xb5, 0x33, 0x75, 0x2b, 0x55, 0x23, 0x75, 0x2b, 0x75, 0x2b, 0x96, 0x3b, 0x78, 0x6c, 0x3c, 0xb6, 0xde, 0xce, 0x9d, 0xb6, 0x31, 0x3b, 0x72, 0x1a, 0x53, 0x0a, 0x73, 0x02, 0x73, 0x02, 0x73, 0x02, 0x74, 0x02, 0x94, 0x0a, 0x94, 0x0a, 0x74, 0x02, 0x53, 0x02, 0x78, 0x23, 0xd6, 0x12, 0x95, 0x0a, 0x95, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0x75, 0x02, 0x76, 0x02, + 0x9a, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0x79, 0x03, 0x9a, 0x03, 0x9a, 0x0b, 0x9a, 0x0b, 0x79, 0x03, 0x7a, 0x03, 0x7a, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x59, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x15, 0x13, 0xf2, 0x1a, 0xbe, 0xae, 0xfb, 0xce, 0x3b, 0xef, 0x5b, 0xef, 0x5f, 0xd7, 0x94, 0x23, 0xb7, 0x0b, 0xf8, 0x0b, 0x39, 0x14, 0x99, 0x2c, 0x9a, 0x2c, 0x1a, 0x14, 0xb9, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0x1a, 0x14, 0x5b, 0x1c, 0x7b, 0x24, 0x3b, 0x1c, 0xfa, 0x13, 0xd9, 0x0b, 0x1a, 0x14, 0xb9, 0x0b, 0xfa, 0x13, 0xfa, 0x13, 0xb9, 0x0b, 0x99, 0x0b, 0x98, 0x13, 0x75, 0x2b, 0xfe, 0xce, 0xfc, 0xe6, 0xdb, 0xde, 0x31, 0x84, 0xc9, 0x21, 0x68, 0x21, 0x05, 0x39, 0x25, 0x89, 0x82, 0xd8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0xc5, 0xd8, 0x2e, 0x82, 0x34, 0x43, 0xf6, 0x0b, 0x38, 0x04, 0x19, 0x04, 0x1a, 0x04, 0xb8, 0x03, 0xb8, 0x13, 0x36, 0x1b, 0x95, 0x43, 0xde, 0xd6, 0xbb, 0xde, 0x1c, 0xe7, 0x1d, 0xcf, 0x38, 0x6d, 0x13, 0x13, 0x16, 0x0b, 0x18, 0x13, 0x9a, 0x1b, 0x9a, 0x23, 0x7a, 0x13, 0x19, 0x0b, 0x9b, 0x1b, 0x9b, 0x13, 0xb9, 0x0b, 0xb9, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x38, 0x03, 0x9a, 0x0b, 0x59, 0x0b, 0x36, 0x0b, 0x15, 0x1b, 0xb4, 0x2a, 0xee, 0x61, 0xc4, 0xc8, 0x41, 0xf0, 0x42, 0xe0, 0xc8, 0xe1, 0x10, 0xdc, 0xfe, 0xf6, 0xbf, 0xb6, 0x95, 0x12, 0x38, 0x1b, 0xf7, 0x0a, 0x35, 0x03, 0x35, 0x03, 0x36, 0x03, 0x36, 0x03, 0x56, 0x03, 0x96, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xba, 0x03, 0x79, 0x0b, 0xf3, 0x12, 0x09, 0x19, 0x85, 0x70, 0xa4, 0xc0, 0x83, 0xf0, 0x21, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x62, 0xe8, 0xc6, 0xc8, 0xab, 0x89, 0x74, 0x33, 0x18, 0x04, 0x3a, 0x14, 0x1a, 0x14, 0xf9, 0x03, 0xd7, 0x13, 0x2f, 0x02, 0x8b, 0x01, 0x8a, 0x01, 0xe6, 0x28, 0xa4, 0xa0, 0x63, 0xe8, 0x21, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x63, 0xe8, 0xc5, 0xc8, 0x26, 0x99, 0xd8, 0xed, 0xdb, 0xe6, 0xdc, 0xde, 0xbf, 0xc6, 0x14, 0x23, 0x78, 0x13, 0x99, 0x13, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x97, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x79, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x16, 0x0b, 0xf3, 0x22, 0xde, 0xc6, 0x9b, 0xd6, 0x5a, 0xd6, 0xdc, 0xce, 0x5d, 0x96, 0x32, 0x0b, 0x96, 0x03, 0xf9, 0x0b, 0xb9, 0x0b, 0xb5, 0x2a, 0x11, 0x7a, 0xea, 0xa8, 0x85, 0xd8, 0xe6, 0xc8, 0xac, 0x79, 0x92, 0x42, 0xd5, 0x22, 0x38, 0x13, 0x38, 0x03, 0x58, 0x03, 0x59, 0x03, 0x7a, 0x03, 0x98, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x76, 0x1b, 0xf3, 0x1a, 0xdc, 0x95, 0xfe, 0xce, 0x1b, 0xc6, 0xbf, 0xe6, 0xdf, 0xde, 0x95, 0x6c, 0x69, 0x29, 0xc8, 0x98, 0x45, 0xd8, 0x22, 0xf0, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf0, 0x64, 0xe0, 0xc7, 0xb8, 0x8d, 0x89, 0x53, 0x2a, 0xf7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0x38, 0x0b, 0xb5, 0x02, 0x72, 0x12, 0x3a, 0x8d, 0xbd, 0xd6, 0x9b, 0xe6, 0xbb, 0xe6, 0x3f, 0xe7, 0xb7, 0x53, 0x52, 0x2a, 0x70, 0x52, 0xca, 0x89, 0xc3, 0xd0, 0x60, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x43, 0xe8, 0xa5, 0xb8, 0xa8, 0x48, 0xee, 0x21, 0xd5, 0x3b, 0xb4, 0x43, 0xd7, 0x94, 0x7c, 0xde, 0x7b, 0xd6, 0x7a, 0xce, 0x1e, 0xd7, 0x1b, 0xae, 0x97, 0x6c, 0x98, 0x5c, 0xfa, 0x64, 0x3c, 0x6d, 0xd7, 0x43, 0x38, 0x4c, 0xba, 0x5c, 0x96, 0x33, 0x55, 0x2b, 0x39, 0x44, 0x96, 0x23, 0x15, 0x13, 0x36, 0x13, 0x16, 0x0b, 0x36, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0xd4, 0x0a, 0xf3, 0x22, 0x7a, 0x95, 0x1f, 0xd7, 0xbe, 0xb6, 0x6e, 0x12, 0x93, 0x12, 0x54, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x95, 0x02, 0x95, 0x0a, 0x95, 0x0a, 0x75, 0x0a, 0x55, 0x0a, 0x58, 0x23, 0xb6, 0x12, 0x75, 0x0a, 0x55, 0x0a, 0x55, 0x0a, 0x55, 0x0a, 0x14, 0x0a, 0x34, 0x0a, + 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x9a, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x38, 0x0b, 0xf7, 0x12, 0xb5, 0x12, 0xf3, 0x22, 0x5e, 0xa6, 0xfd, 0xd6, 0x3d, 0xef, 0x5d, 0xef, 0x7f, 0xd7, 0x17, 0x2c, 0x19, 0x0c, 0xf8, 0x03, 0xb8, 0x03, 0xb7, 0x03, 0xf8, 0x0b, 0xd8, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xd8, 0x0b, 0xd8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0x1a, 0x14, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x34, 0x23, 0xbd, 0xc6, 0xfb, 0xe6, 0xdb, 0xde, 0x31, 0x7c, 0x89, 0x19, 0x48, 0x21, 0xe5, 0x38, 0xe5, 0x80, 0x82, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0xa5, 0xd0, 0xed, 0x81, 0xf3, 0x4a, 0x95, 0x1b, 0xb6, 0x0b, 0x97, 0x0b, 0x98, 0x13, 0x76, 0x13, 0x96, 0x23, 0x33, 0x23, 0xb4, 0x4b, 0x1b, 0xc6, 0x7b, 0xde, 0xbc, 0xde, 0xff, 0xce, 0x98, 0x64, 0x55, 0x1b, 0x57, 0x0b, 0xf6, 0x02, 0xd6, 0x02, 0xd7, 0x0a, 0xd7, 0x12, 0xb7, 0x12, 0xd7, 0x12, 0xd6, 0x12, 0xd5, 0x12, 0xd6, 0x12, 0xd8, 0x0a, 0xd9, 0x0a, 0x18, 0x03, 0x18, 0x0b, 0xd8, 0x0a, 0xb9, 0x0a, 0xb8, 0x02, 0xd7, 0x12, 0xb6, 0x22, 0xcf, 0x61, 0xa6, 0xc8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x61, 0xf8, 0x05, 0xd9, 0xef, 0xc2, 0x2d, 0x52, 0x54, 0x23, 0x76, 0x03, 0x37, 0x03, 0x18, 0x03, 0xfa, 0x02, 0xfa, 0x02, 0xf9, 0x0a, 0x19, 0x0b, 0x38, 0x03, 0x37, 0x03, 0xf6, 0x02, 0x94, 0x22, 0xce, 0x41, 0x09, 0x81, 0xa5, 0xd0, 0x21, 0xf0, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x62, 0xe0, 0x27, 0xa9, 0x4d, 0x72, 0xf6, 0x43, 0xb6, 0x03, 0x97, 0x03, 0xb8, 0x0b, 0xd8, 0x0b, 0xd7, 0x13, 0x50, 0x02, 0xac, 0x01, 0xaa, 0x01, 0x07, 0x29, 0xa4, 0xa0, 0x83, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x42, 0xe0, 0xc5, 0xc0, 0x88, 0xa1, 0xd8, 0xed, 0xbb, 0xe6, 0xfd, 0xe6, 0x1f, 0xcf, 0x75, 0x23, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x97, 0x0b, 0x77, 0x0b, 0x97, 0x0b, 0x77, 0x0b, 0x97, 0x0b, 0xf8, 0x13, 0xd8, 0x13, 0xd8, 0x13, 0xb8, 0x0b, 0xb7, 0x0b, 0xb8, 0x0b, 0xd9, 0x13, 0xd9, 0x13, 0x77, 0x03, 0x76, 0x03, 0xf5, 0x02, 0x13, 0x1b, 0x9c, 0xbe, 0xbb, 0xde, 0xba, 0xde, 0x1e, 0xd7, 0x5b, 0x7d, 0xb7, 0x23, 0x96, 0x13, 0x75, 0x03, 0x37, 0x1c, 0x94, 0x3b, 0x0d, 0x7a, 0xe8, 0xb0, 0x63, 0xd8, 0x22, 0xf0, 0x21, 0xf8, 0x43, 0xf0, 0xc6, 0xc8, 0x8b, 0x99, 0x91, 0x52, 0x35, 0x23, 0x77, 0x13, 0x57, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x37, 0x0b, 0x78, 0x1b, 0xd4, 0x1a, 0x78, 0x6c, 0x9d, 0xd6, 0xbc, 0xe6, 0x78, 0xd6, 0x58, 0xee, 0xc9, 0xa1, 0xc5, 0xc0, 0x61, 0xe8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x63, 0xd8, 0x6a, 0xa1, 0x0f, 0x72, 0x73, 0x2a, 0xf6, 0x1a, 0x17, 0x13, 0xb6, 0x0a, 0x96, 0x12, 0xb6, 0x1a, 0xd4, 0x1a, 0x16, 0x54, 0x7b, 0xc6, 0xbb, 0xd6, 0xfd, 0xde, 0x7d, 0xbe, 0x70, 0x1a, 0x4f, 0x52, 0xc7, 0xa8, 0x22, 0xe0, 0x20, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x82, 0xe0, 0x45, 0x91, 0xa4, 0x30, 0xac, 0x19, 0xd3, 0x1a, 0x52, 0x12, 0x71, 0x22, 0x8f, 0x3a, 0x1b, 0xbe, 0x19, 0xc6, 0x9b, 0xd6, 0x9d, 0xbe, 0x10, 0x3b, 0x12, 0x2b, 0xf3, 0x1a, 0x35, 0x1b, 0x15, 0x13, 0x56, 0x1b, 0x15, 0x13, 0xf5, 0x12, 0x36, 0x13, 0x56, 0x13, 0x36, 0x03, 0x57, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x79, 0x03, 0x78, 0x03, 0x36, 0x03, 0x16, 0x0b, 0xd3, 0x1a, 0xf5, 0x6b, 0x7d, 0xbe, 0x1f, 0xbf, 0xd0, 0x1a, 0x93, 0x0a, 0xd7, 0x12, 0x35, 0x02, 0x56, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x75, 0x02, 0xb6, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xb5, 0x02, 0xd6, 0x02, + 0x39, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x39, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x0a, 0xd7, 0x12, 0xd4, 0x22, 0x5f, 0xae, 0xff, 0xde, 0xfd, 0xee, 0x1e, 0xef, 0x5f, 0xdf, 0xb6, 0x33, 0x98, 0x13, 0xba, 0x13, 0x9b, 0x13, 0x5a, 0x13, 0x5a, 0x1b, 0x79, 0x13, 0x99, 0x13, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0x98, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x0b, 0x98, 0x0b, 0x75, 0x23, 0x9c, 0xbe, 0xfb, 0xe6, 0xfc, 0xe6, 0x32, 0x84, 0xa9, 0x19, 0x49, 0x21, 0x06, 0x41, 0x26, 0x89, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x21, 0xf0, 0x21, 0xf0, 0x41, 0xf0, 0x22, 0xf0, 0x02, 0xf8, 0x23, 0xf8, 0x22, 0xe8, 0x21, 0xf0, 0x41, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x42, 0xf8, 0x21, 0xf8, 0x00, 0xf0, 0x42, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x43, 0xe8, 0x86, 0xd0, 0x2b, 0x99, 0x33, 0x4a, 0xb7, 0x1a, 0xd7, 0x0a, 0xd7, 0x02, 0x17, 0x03, 0xf7, 0x02, 0x97, 0x02, 0xd7, 0x12, 0xf5, 0x22, 0x0e, 0x52, 0xc5, 0xc8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x00, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0x42, 0xc8, 0x08, 0xb9, 0x6d, 0x91, 0xb0, 0x71, 0x11, 0x52, 0x53, 0x3a, 0xb3, 0x2a, 0x93, 0x2a, 0x51, 0x42, 0xcf, 0x61, 0x4c, 0x99, 0xe9, 0xc8, 0x23, 0xe8, 0x00, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x83, 0xd8, 0x0b, 0x92, 0xd1, 0x52, 0xba, 0x54, 0xd8, 0x13, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x13, 0x0f, 0x02, 0x6a, 0x01, 0x8a, 0x01, 0x06, 0x29, 0xa4, 0xa0, 0x63, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf0, 0x42, 0xe0, 0xc5, 0xc0, 0xa8, 0xa1, 0xd8, 0xdd, 0xfc, 0xde, 0xdb, 0xd6, 0xfe, 0xbe, 0xb5, 0x23, 0x97, 0x03, 0x56, 0x03, 0xd8, 0x13, 0x99, 0x03, 0x79, 0x03, 0x58, 0x03, 0x79, 0x0b, 0x58, 0x03, 0x59, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x96, 0x03, 0x76, 0x03, 0x76, 0x03, 0x56, 0x03, 0x55, 0x03, 0x56, 0x03, 0x56, 0x0b, 0x56, 0x0b, 0x76, 0x03, 0x56, 0x03, 0x16, 0x03, 0x13, 0x23, 0x3b, 0xbe, 0x7a, 0xe6, 0x9b, 0xe6, 0xfe, 0xd6, 0x19, 0x5d, 0x75, 0x03, 0xd8, 0x03, 0xf9, 0x03, 0xb8, 0x03, 0xf3, 0x22, 0x2c, 0x7a, 0x26, 0xb9, 0x63, 0xe8, 0x01, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x23, 0xf0, 0xa6, 0xe0, 0xe8, 0xb8, 0xaa, 0x89, 0x4d, 0x72, 0x0e, 0x52, 0x2e, 0x52, 0x0d, 0x5a, 0xcf, 0x8a, 0xf1, 0xdb, 0x2c, 0xf3, 0x07, 0xfa, 0x82, 0xf0, 0x42, 0xf8, 0x00, 0xf0, 0x63, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0xe6, 0xc8, 0xce, 0x69, 0x32, 0x22, 0xf6, 0x1a, 0xf7, 0x0a, 0xd8, 0x02, 0xf8, 0x0a, 0xf7, 0x02, 0xd5, 0x02, 0xb4, 0x1a, 0x94, 0x53, 0xbd, 0xd6, 0x7a, 0xde, 0xbc, 0xe6, 0x5d, 0xde, 0xed, 0x41, 0x6b, 0x71, 0xc4, 0xd0, 0x41, 0xf8, 0x42, 0xf8, 0x41, 0xf8, 0x00, 0xf0, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0x61, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x82, 0xf8, 0x21, 0xf0, 0x42, 0xf0, 0x42, 0xf0, 0x22, 0xe8, 0x42, 0xf0, 0x21, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0xc5, 0xb0, 0x71, 0x3a, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x77, 0x03, 0x36, 0x03, 0x36, 0x0b, 0xd4, 0x1a, 0xd5, 0x6b, 0xdf, 0xd6, 0xdf, 0xb6, 0xb0, 0x1a, 0x52, 0x0a, 0x74, 0x02, 0x75, 0x02, 0x96, 0x02, 0xb6, 0x0a, 0x96, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x95, 0x02, 0xb5, 0x02, 0xb6, 0x0a, 0x95, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0x75, 0x02, 0x75, 0x0a, 0x75, 0x0a, 0xb6, 0x12, + 0x39, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x19, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x39, 0x0b, 0x39, 0x0b, 0x19, 0x03, 0x18, 0x03, 0x19, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x18, 0x03, 0x16, 0x13, 0xb1, 0x1a, 0x7d, 0xb6, 0x1d, 0xe7, 0xda, 0xe6, 0x3b, 0xef, 0x9e, 0xd7, 0x75, 0x3c, 0xf6, 0x0b, 0xf9, 0x03, 0xfa, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0xba, 0x0b, 0x9a, 0x0b, 0x99, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x37, 0x03, 0x75, 0x23, 0xdd, 0xc6, 0xfc, 0xe6, 0xfc, 0xde, 0x32, 0x7c, 0xca, 0x19, 0x69, 0x21, 0xe6, 0x38, 0x06, 0x89, 0x83, 0xd8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x60, 0xf8, 0x80, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0x63, 0xe0, 0xa5, 0xc8, 0x4b, 0x91, 0x54, 0x3a, 0xf9, 0x0a, 0xf8, 0x02, 0xf8, 0x0a, 0xd6, 0x0a, 0x74, 0x0a, 0x14, 0x02, 0x76, 0x1a, 0x96, 0x2a, 0xb0, 0x61, 0xa5, 0xc8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0xa5, 0xc8, 0x32, 0x93, 0x33, 0x3b, 0xdb, 0x4c, 0xb8, 0x13, 0xf9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x13, 0x0f, 0x02, 0x6a, 0x01, 0x8a, 0x01, 0x06, 0x31, 0x84, 0xa0, 0x42, 0xe8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x21, 0xf0, 0x83, 0xe8, 0xc5, 0xc0, 0x68, 0x99, 0xd9, 0xe5, 0x9b, 0xde, 0xfc, 0xe6, 0x5f, 0xd7, 0xd6, 0x2b, 0xd7, 0x13, 0x96, 0x13, 0x15, 0x03, 0x57, 0x03, 0x59, 0x03, 0x58, 0x03, 0x79, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x77, 0x03, 0x98, 0x03, 0x78, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x38, 0x0b, 0x57, 0x03, 0x77, 0x03, 0x37, 0x03, 0xd3, 0x12, 0x9d, 0xc6, 0x9a, 0xde, 0x9c, 0xde, 0xff, 0xd6, 0xda, 0x5c, 0x97, 0x13, 0x97, 0x13, 0x98, 0x13, 0x97, 0x0b, 0x35, 0x3b, 0x50, 0x7a, 0xe9, 0xa0, 0x64, 0xe0, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x61, 0xf8, 0x40, 0xf0, 0x41, 0xf0, 0x22, 0xf8, 0x23, 0xf8, 0x00, 0xe8, 0x61, 0xf0, 0x60, 0xf0, 0x60, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf0, 0x22, 0xf0, 0x02, 0xf8, 0x22, 0xf0, 0x63, 0xf0, 0xe7, 0xa8, 0x51, 0x42, 0x16, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0x18, 0x0b, 0xf8, 0x0a, 0xf8, 0x02, 0xb6, 0x0a, 0x73, 0x1a, 0x74, 0x4b, 0xfd, 0xbe, 0xfb, 0xce, 0xdb, 0xd6, 0x7b, 0xd6, 0xac, 0x49, 0x8c, 0x81, 0x85, 0xc8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x61, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x60, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x23, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x42, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x07, 0xb9, 0xb1, 0x4a, 0x16, 0x0b, 0x16, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0xf6, 0x02, 0x35, 0x03, 0x55, 0x0b, 0x15, 0x0b, 0xd4, 0x1a, 0x55, 0x63, 0x5f, 0xce, 0xbf, 0xb6, 0xd1, 0x22, 0x73, 0x12, 0x75, 0x0a, 0x75, 0x0a, 0x75, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x76, 0x0a, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x59, 0x0b, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x38, 0x03, 0x36, 0x0b, 0xd3, 0x1a, 0x1d, 0x9e, 0x1d, 0xdf, 0x1b, 0xe7, 0x5c, 0xef, 0x5f, 0xd7, 0x37, 0x44, 0x97, 0x0b, 0xf8, 0x0b, 0xd9, 0x0b, 0x99, 0x03, 0xba, 0x0b, 0xd9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x55, 0x23, 0xbe, 0xbe, 0xfd, 0xde, 0xfc, 0xde, 0x11, 0x7c, 0xc9, 0x19, 0x48, 0x19, 0xc5, 0x38, 0x06, 0x91, 0x63, 0xe0, 0x01, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x42, 0xf0, 0x84, 0xd0, 0x2a, 0x91, 0x53, 0x32, 0x18, 0x0b, 0xf9, 0x0a, 0xd8, 0x02, 0x16, 0x0b, 0x92, 0x0a, 0x2b, 0x01, 0x6c, 0x09, 0x30, 0x22, 0xcd, 0x61, 0xa5, 0xc0, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x01, 0xf0, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x42, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x42, 0xf8, 0x41, 0xe0, 0x4a, 0xd2, 0x77, 0x84, 0xb7, 0x1b, 0xd8, 0x0b, 0xd8, 0x03, 0xd8, 0x03, 0xf9, 0x03, 0xba, 0x03, 0x98, 0x0b, 0x70, 0x02, 0x8b, 0x01, 0xab, 0x01, 0xe8, 0x28, 0x84, 0xa8, 0x62, 0xe8, 0x80, 0xe8, 0x40, 0xe8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x21, 0xf8, 0x22, 0xf0, 0xa6, 0xd0, 0x8a, 0xa9, 0xf9, 0xed, 0xbb, 0xde, 0xdc, 0xde, 0x5f, 0xd7, 0x17, 0x3c, 0x57, 0x0b, 0xd9, 0x13, 0x98, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0xf6, 0x0a, 0xd3, 0x22, 0x3b, 0xbe, 0x9a, 0xde, 0xbb, 0xe6, 0xfd, 0xd6, 0x59, 0x7d, 0x54, 0x23, 0xf4, 0x12, 0x32, 0x02, 0xd4, 0x0a, 0xd3, 0x3a, 0xce, 0x79, 0xe8, 0xb0, 0x63, 0xe8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x01, 0xf8, 0x43, 0xe0, 0x07, 0xa9, 0xce, 0x71, 0x56, 0x32, 0xd9, 0x0a, 0x19, 0x03, 0x38, 0x03, 0xd7, 0x02, 0xd7, 0x0a, 0xd7, 0x02, 0xf7, 0x0a, 0x94, 0x22, 0x74, 0x53, 0xbe, 0xd6, 0x9c, 0xd6, 0xdc, 0xde, 0x5b, 0xd6, 0x28, 0x41, 0xe7, 0x78, 0x84, 0xd0, 0x22, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x60, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x61, 0xf0, 0x61, 0xf0, 0x41, 0xf0, 0xe7, 0xb0, 0x71, 0x42, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x15, 0x03, 0xf3, 0x1a, 0x93, 0x53, 0x9e, 0xbe, 0xdf, 0xb6, 0xb2, 0x1a, 0x94, 0x0a, 0x76, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x0a, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0x16, 0x0b, 0xb2, 0x1a, 0xfd, 0x9d, 0x1d, 0xdf, 0x1b, 0xe7, 0x1c, 0xe7, 0x3f, 0xd7, 0x16, 0x3c, 0x77, 0x0b, 0xf8, 0x13, 0xd9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x55, 0x23, 0x5c, 0xb6, 0xdc, 0xe6, 0xdc, 0xee, 0xf1, 0x83, 0xa9, 0x21, 0x27, 0x19, 0xe5, 0x40, 0x26, 0x91, 0x82, 0xd8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x61, 0xf8, 0x40, 0xf0, 0x20, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x42, 0xf0, 0xa6, 0xd8, 0x2b, 0x99, 0x33, 0x32, 0xd8, 0x02, 0xf9, 0x02, 0xf9, 0x0a, 0xd8, 0x0a, 0x54, 0x0a, 0x0c, 0x01, 0xc9, 0x10, 0xe9, 0x20, 0xe8, 0x68, 0x83, 0xc8, 0x40, 0xf8, 0x21, 0xf8, 0x02, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x41, 0xf8, 0x60, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x21, 0xf0, 0x60, 0xf0, 0x60, 0xf8, 0x21, 0xf8, 0x22, 0xe8, 0x47, 0xd9, 0x79, 0xfd, 0x5a, 0x85, 0xb6, 0x0b, 0x18, 0x14, 0xb8, 0x0b, 0x99, 0x0b, 0xba, 0x13, 0xb9, 0x0b, 0x96, 0x13, 0x4e, 0x02, 0x8a, 0x01, 0x89, 0x01, 0xe6, 0x38, 0x64, 0xa8, 0x24, 0xf0, 0x03, 0xf8, 0x03, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x42, 0xf8, 0x62, 0xe0, 0x04, 0xb9, 0xa6, 0x99, 0xf8, 0xe5, 0xdb, 0xe6, 0xfc, 0xe6, 0x3f, 0xd7, 0x99, 0x4c, 0x97, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x17, 0x0b, 0xf6, 0x0a, 0xf3, 0x22, 0x3b, 0xbe, 0x7a, 0xde, 0xbb, 0xde, 0xfd, 0xce, 0x7b, 0x6d, 0xd6, 0x1b, 0x33, 0x0b, 0xad, 0x01, 0x8c, 0x01, 0x6b, 0x29, 0x08, 0x71, 0x27, 0xb9, 0x63, 0xd8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0xa6, 0xc0, 0xee, 0x61, 0xb4, 0x22, 0xd6, 0x0a, 0xd7, 0x02, 0xd7, 0x0a, 0xd7, 0x12, 0xb7, 0x0a, 0xb7, 0x0a, 0x18, 0x03, 0xb5, 0x02, 0x73, 0x12, 0xf7, 0x63, 0x5c, 0xc6, 0x9b, 0xd6, 0xbb, 0xce, 0xaf, 0x73, 0xa4, 0x20, 0xc4, 0x68, 0xa3, 0xd0, 0x41, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x22, 0xf0, 0x22, 0xf0, 0xe8, 0xb8, 0x72, 0x42, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x15, 0x03, 0xf3, 0x1a, 0x72, 0x53, 0x7e, 0xbe, 0x7f, 0xa6, 0x92, 0x1a, 0x74, 0x0a, 0x55, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x17, 0x0b, 0x92, 0x1a, 0xdd, 0x9d, 0x1d, 0xdf, 0x1b, 0xe7, 0x1c, 0xe7, 0x3f, 0xd7, 0x78, 0x4c, 0xb8, 0x13, 0xd8, 0x0b, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x74, 0x23, 0x5b, 0xbe, 0xda, 0xe6, 0xfb, 0xee, 0x11, 0x84, 0xc9, 0x19, 0x68, 0x19, 0x26, 0x39, 0x46, 0x89, 0xa3, 0xd8, 0x21, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x22, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0x64, 0xd8, 0x49, 0x99, 0x92, 0x32, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x17, 0x0b, 0x74, 0x02, 0x4c, 0x01, 0x09, 0x09, 0xe8, 0x10, 0x27, 0x61, 0xc4, 0xd8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0xc3, 0xd0, 0x53, 0xe5, 0x3d, 0xcf, 0xfe, 0x75, 0x57, 0x13, 0xfa, 0x23, 0x98, 0x13, 0x98, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x96, 0x13, 0x4d, 0x02, 0xa9, 0x01, 0x89, 0x09, 0x06, 0x39, 0xa3, 0x98, 0x81, 0xd8, 0x40, 0xe8, 0x40, 0xf8, 0x20, 0xf0, 0x20, 0xf0, 0x20, 0xf0, 0x20, 0xf0, 0x21, 0xf0, 0x62, 0xe0, 0xe5, 0xc0, 0xa8, 0xa1, 0xd8, 0xe5, 0xdb, 0xde, 0xdb, 0xde, 0x3f, 0xcf, 0x58, 0x44, 0x77, 0x0b, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x16, 0x0b, 0xf3, 0x22, 0x5c, 0xbe, 0x9a, 0xde, 0xbb, 0xde, 0xfe, 0xce, 0x9a, 0x4c, 0x78, 0x1b, 0xf4, 0x22, 0x8c, 0x01, 0x69, 0x01, 0x46, 0x21, 0xa3, 0x58, 0x04, 0xb1, 0x61, 0xe8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x22, 0xf0, 0x22, 0xf0, 0x22, 0xf0, 0x22, 0xf0, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf0, 0x20, 0xf0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x40, 0xf0, 0x41, 0xf0, 0x20, 0xf8, 0x42, 0xe8, 0xc6, 0xb8, 0x4c, 0x81, 0x55, 0x32, 0xf9, 0x12, 0xf7, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xd7, 0x0a, 0xd6, 0x02, 0xd6, 0x02, 0x96, 0x02, 0xd6, 0x12, 0x93, 0x22, 0x17, 0x64, 0x9e, 0xce, 0x5b, 0xd6, 0x8f, 0x73, 0x29, 0x52, 0x84, 0x30, 0xe6, 0x80, 0x83, 0xd8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x03, 0xf8, 0x02, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x27, 0xb9, 0x71, 0x42, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x36, 0x03, 0xd3, 0x12, 0x32, 0x4b, 0x7e, 0xbe, 0xdd, 0x8d, 0x71, 0x12, 0x74, 0x0a, 0x55, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x35, 0x02, + 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x17, 0x13, 0x72, 0x12, 0xdd, 0x9d, 0xfd, 0xd6, 0xfc, 0xe6, 0x1c, 0xe7, 0x5f, 0xd7, 0x58, 0x44, 0xd8, 0x1b, 0xd8, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x75, 0x23, 0xbd, 0xbe, 0xfd, 0xde, 0xdd, 0xe6, 0xf3, 0x83, 0xac, 0x19, 0x4a, 0x19, 0xe8, 0x38, 0x07, 0x81, 0x64, 0xd8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf0, 0x40, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x21, 0xf0, 0x44, 0xd8, 0x2b, 0x99, 0x75, 0x32, 0x1a, 0x03, 0xda, 0x02, 0xb9, 0x0a, 0xd8, 0x12, 0x74, 0x12, 0x6b, 0x01, 0x48, 0x01, 0x28, 0x19, 0x27, 0x61, 0xc4, 0xc0, 0x41, 0xf0, 0x40, 0xf0, 0x40, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x22, 0xf8, 0x22, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x60, 0xf0, 0x40, 0xf0, 0x21, 0xf8, 0x00, 0xf8, 0x42, 0xf8, 0x83, 0xe8, 0xc3, 0xb8, 0x15, 0xfd, 0xfa, 0xfd, 0xdf, 0xe6, 0x9c, 0x75, 0x96, 0x0b, 0x59, 0x0c, 0xf9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0x97, 0x13, 0x10, 0x02, 0x4d, 0x01, 0x4c, 0x09, 0xea, 0x38, 0x85, 0xa0, 0x63, 0xe8, 0x40, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x42, 0xe8, 0xc6, 0xc0, 0x89, 0xa1, 0xd8, 0xe5, 0x9a, 0xd6, 0xda, 0xde, 0x5f, 0xd7, 0xd5, 0x2b, 0x56, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x0b, 0x16, 0x0b, 0x13, 0x23, 0x5c, 0xbe, 0x9a, 0xde, 0xbb, 0xde, 0xfd, 0xce, 0x56, 0x44, 0x95, 0x13, 0x52, 0x0b, 0xac, 0x01, 0x6a, 0x09, 0x08, 0x31, 0x84, 0x68, 0x25, 0xc1, 0x62, 0xd8, 0x20, 0xf0, 0x20, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf0, 0x20, 0xf8, 0x61, 0xf8, 0x21, 0xf0, 0x85, 0xb8, 0x8e, 0x59, 0x74, 0x22, 0xd6, 0x12, 0xf8, 0x0a, 0xf8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xd5, 0x0a, 0x93, 0x0a, 0x53, 0x3b, 0x9d, 0xbe, 0x32, 0x84, 0x8a, 0x52, 0x09, 0x52, 0x62, 0x30, 0xe4, 0x78, 0xc1, 0xd0, 0x60, 0xf0, 0x60, 0xf8, 0x60, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf0, 0x06, 0xb1, 0x71, 0x42, 0x37, 0x03, 0x37, 0x0b, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x15, 0x03, 0xd3, 0x12, 0x12, 0x43, 0x7e, 0xbe, 0x9c, 0x7d, 0x71, 0x0a, 0x95, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x55, 0x02, 0x35, 0x02, 0x35, 0x02, + 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x17, 0x13, 0x93, 0x1a, 0xfe, 0xa5, 0xfd, 0xd6, 0xfc, 0xe6, 0x3c, 0xef, 0x9f, 0xdf, 0xb5, 0x33, 0x97, 0x13, 0x19, 0x14, 0xd9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x75, 0x23, 0xfc, 0xbe, 0xfb, 0xd6, 0xdb, 0xe6, 0x11, 0x84, 0xaa, 0x21, 0x28, 0x21, 0xc6, 0x40, 0xe6, 0x90, 0x83, 0xe0, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x42, 0xe8, 0x85, 0xd0, 0x4b, 0x99, 0x53, 0x3a, 0xb7, 0x0a, 0xb8, 0x0a, 0xd8, 0x12, 0xb6, 0x0a, 0x73, 0x12, 0x2b, 0x01, 0xc9, 0x08, 0xc8, 0x18, 0xa7, 0x38, 0xa5, 0x70, 0xa4, 0xa8, 0x62, 0xd0, 0x62, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x60, 0xf8, 0x41, 0xe8, 0x65, 0xe0, 0x24, 0xa0, 0x92, 0xcc, 0xd9, 0xe6, 0x3b, 0xdf, 0x3e, 0xc7, 0x19, 0x5d, 0xb6, 0x1b, 0xd8, 0x13, 0xd9, 0x0b, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x97, 0x0b, 0x4f, 0x02, 0x8b, 0x01, 0x69, 0x01, 0x07, 0x31, 0x83, 0xa0, 0x82, 0xe8, 0x40, 0xe8, 0x40, 0xf0, 0x00, 0xf0, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x63, 0xe0, 0xa6, 0xc0, 0x68, 0xa1, 0xb7, 0xdd, 0x79, 0xd6, 0xfb, 0xde, 0x5f, 0xd7, 0x17, 0x3c, 0x97, 0x0b, 0xb8, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0xf6, 0x02, 0xf3, 0x22, 0x5c, 0xbe, 0x9a, 0xd6, 0xba, 0xde, 0x1d, 0xcf, 0x96, 0x3c, 0xd4, 0x13, 0x52, 0x13, 0x6b, 0x01, 0x49, 0x09, 0xc7, 0x30, 0x44, 0x68, 0xe6, 0xc0, 0x62, 0xe0, 0x41, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x63, 0xc8, 0xc5, 0x80, 0x4a, 0x49, 0x54, 0x12, 0x19, 0x03, 0xf5, 0x02, 0x16, 0x03, 0xd8, 0x02, 0xb9, 0x02, 0xd9, 0x0a, 0xb8, 0x0a, 0xb7, 0x0a, 0xd6, 0x0a, 0xf6, 0x02, 0xd5, 0x0a, 0x93, 0x12, 0x17, 0x5c, 0x5d, 0xbe, 0x74, 0x94, 0xad, 0x5a, 0x2b, 0x5a, 0x84, 0x30, 0xe5, 0x78, 0xa2, 0xd0, 0x40, 0xf0, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x40, 0xf8, 0x40, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x22, 0xf0, 0xe7, 0xb0, 0x72, 0x42, 0x37, 0x03, 0x37, 0x0b, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0xf5, 0x02, 0xd3, 0x12, 0x32, 0x43, 0x9f, 0xbe, 0x9c, 0x85, 0x72, 0x0a, 0xb5, 0x0a, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x0a, 0x76, 0x02, 0x56, 0x02, 0x56, 0x02, 0x55, 0x02, 0x55, 0x02, 0x55, 0x02, 0x55, 0x02, + 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0xf7, 0x02, 0x17, 0x13, 0xb3, 0x1a, 0x5f, 0xae, 0xfd, 0xde, 0x1c, 0xef, 0x3c, 0xef, 0x7f, 0xdf, 0xd6, 0x33, 0x97, 0x13, 0xf9, 0x13, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x75, 0x23, 0x9d, 0xc6, 0xbb, 0xe6, 0xfc, 0xee, 0x32, 0x84, 0xa9, 0x21, 0x28, 0x21, 0xe7, 0x40, 0x07, 0x91, 0x63, 0xe0, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x40, 0xf8, 0x20, 0xf0, 0x40, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x61, 0xf8, 0x40, 0xf0, 0x00, 0xf0, 0x20, 0xf8, 0x41, 0xf0, 0x83, 0xd8, 0x49, 0x99, 0x72, 0x32, 0xf7, 0x02, 0xd9, 0x02, 0xd9, 0x0a, 0xb7, 0x12, 0x53, 0x12, 0x2b, 0x01, 0x2a, 0x01, 0x4b, 0x01, 0x0a, 0x01, 0xe8, 0x08, 0xe7, 0x30, 0xe6, 0x80, 0x05, 0xc9, 0x63, 0xe8, 0x01, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x42, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x01, 0xf0, 0x61, 0xd8, 0x83, 0xa0, 0xc8, 0x50, 0x29, 0x29, 0x9b, 0xce, 0xfa, 0xd6, 0xd9, 0xce, 0x3d, 0xcf, 0xd9, 0x5c, 0x97, 0x23, 0xb8, 0x13, 0xb8, 0x0b, 0x98, 0x13, 0x99, 0x13, 0x7a, 0x0b, 0x78, 0x13, 0x4f, 0x0a, 0x8a, 0x01, 0x69, 0x01, 0x06, 0x31, 0x63, 0xa0, 0xa2, 0xe8, 0x40, 0xf0, 0x40, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x41, 0xf8, 0x63, 0xe0, 0xe6, 0xb8, 0xa9, 0x91, 0xd8, 0xdd, 0x9a, 0xd6, 0x1c, 0xe7, 0xdd, 0xbe, 0x78, 0x44, 0xb8, 0x13, 0xb8, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x17, 0x03, 0xf5, 0x02, 0x13, 0x23, 0x5c, 0xbe, 0x9a, 0xde, 0xba, 0xde, 0xff, 0xd6, 0x7a, 0x5c, 0x58, 0x2b, 0x14, 0x23, 0x8c, 0x01, 0xab, 0x01, 0x69, 0x09, 0x07, 0x19, 0x06, 0x51, 0xc5, 0x90, 0x43, 0xc0, 0x01, 0xe8, 0x21, 0xf8, 0x41, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf0, 0x02, 0xf0, 0x63, 0xd0, 0xa4, 0x90, 0xc5, 0x48, 0x6a, 0x11, 0x51, 0x02, 0xd6, 0x0a, 0xd8, 0x0a, 0xb6, 0x0a, 0xd7, 0x12, 0xd8, 0x0a, 0xd8, 0x0a, 0xd9, 0x0a, 0xd8, 0x0a, 0xd7, 0x02, 0xb7, 0x0a, 0xd8, 0x12, 0x55, 0x12, 0x53, 0x22, 0xb5, 0x63, 0x3c, 0xc6, 0x93, 0x94, 0xab, 0x4a, 0xac, 0x52, 0xa5, 0x28, 0xc6, 0x78, 0x83, 0xd8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x40, 0xf0, 0x60, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0x21, 0xf8, 0x01, 0xf8, 0x42, 0xf8, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x42, 0xf8, 0x62, 0xf8, 0x62, 0xf8, 0x41, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x08, 0xb9, 0x72, 0x42, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x17, 0x03, 0x15, 0x03, 0xd3, 0x12, 0x32, 0x4b, 0x5e, 0xb6, 0xdd, 0x8d, 0x71, 0x12, 0x94, 0x0a, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x56, 0x02, 0x55, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x75, 0x0a, + 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x18, 0x03, 0xf7, 0x02, 0xf6, 0x0a, 0xb3, 0x22, 0x7f, 0xb6, 0xdc, 0xd6, 0xfb, 0xee, 0x3c, 0xef, 0x7f, 0xdf, 0xb9, 0x54, 0xb8, 0x13, 0xb8, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x75, 0x2b, 0x9d, 0xbe, 0xfb, 0xe6, 0x3b, 0xdf, 0x50, 0x74, 0xa7, 0x11, 0x67, 0x19, 0x06, 0x41, 0xe5, 0x80, 0xa4, 0xc8, 0x42, 0xf0, 0x22, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x60, 0xf8, 0x20, 0xf8, 0x01, 0xf8, 0x01, 0xf8, 0x41, 0xf0, 0x61, 0xf0, 0x20, 0xf0, 0x20, 0xf8, 0x42, 0xf8, 0x44, 0xe8, 0x85, 0xc8, 0x2a, 0x89, 0x53, 0x3a, 0xf8, 0x12, 0xba, 0x0a, 0x9a, 0x02, 0xf9, 0x02, 0x74, 0x02, 0x2b, 0x01, 0x29, 0x11, 0x4a, 0x19, 0x29, 0x11, 0x08, 0x01, 0x07, 0x01, 0xc8, 0x21, 0x8a, 0x4a, 0x6a, 0x62, 0xe8, 0x89, 0x06, 0xb9, 0x43, 0xc8, 0x43, 0xe0, 0x43, 0xf0, 0x01, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x21, 0xf8, 0x42, 0xf0, 0x63, 0xe8, 0x84, 0xd8, 0x83, 0xc8, 0x63, 0xb0, 0xa4, 0x88, 0x05, 0x41, 0x07, 0x11, 0x4b, 0x01, 0xce, 0x19, 0x3b, 0xc6, 0xbc, 0xee, 0x7b, 0xee, 0xff, 0xe6, 0x3b, 0x75, 0x96, 0x1b, 0xf8, 0x13, 0xb8, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0x97, 0x13, 0x0e, 0x02, 0x6a, 0x09, 0x69, 0x09, 0x27, 0x39, 0xa3, 0x90, 0xa3, 0xd8, 0x21, 0xf0, 0x21, 0xf8, 0x61, 0xf8, 0x40, 0xe8, 0x20, 0xe8, 0x21, 0xf0, 0x42, 0xf8, 0x64, 0xe8, 0x05, 0xb1, 0xa8, 0x89, 0xf8, 0xdd, 0xbb, 0xde, 0xfc, 0xde, 0x9d, 0xb6, 0x17, 0x34, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0xf6, 0x0a, 0x13, 0x23, 0x7c, 0xc6, 0x9a, 0xde, 0xbb, 0xde, 0x1e, 0xcf, 0x7b, 0x5d, 0xb6, 0x13, 0x33, 0x1b, 0x4b, 0x01, 0x6c, 0x01, 0x4c, 0x09, 0x6c, 0x01, 0x6b, 0x09, 0x49, 0x09, 0x47, 0x19, 0x46, 0x41, 0x05, 0x69, 0xa4, 0xa0, 0x63, 0xd0, 0x22, 0xe8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x21, 0xf0, 0x22, 0xe8, 0x63, 0xc8, 0xa4, 0x80, 0x06, 0x49, 0x28, 0x19, 0x4b, 0x01, 0xb2, 0x09, 0x76, 0x1a, 0xd7, 0x1a, 0xb6, 0x0a, 0xb7, 0x0a, 0xf8, 0x0a, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xf7, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0x52, 0x0a, 0x7b, 0x85, 0x7b, 0xbe, 0x91, 0x94, 0xca, 0x5a, 0x29, 0x5a, 0x84, 0x38, 0x85, 0x78, 0x64, 0xd0, 0x43, 0xf8, 0x42, 0xf8, 0x42, 0xf8, 0x41, 0xf0, 0x20, 0xf0, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x41, 0xf8, 0x00, 0xf8, 0x21, 0xf8, 0x21, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x00, 0xf8, 0x20, 0xf8, 0x41, 0xf0, 0x42, 0xf0, 0x42, 0xe8, 0xe7, 0xb0, 0x71, 0x3a, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0x15, 0x03, 0xb2, 0x12, 0x11, 0x4b, 0x3d, 0xb6, 0x3e, 0x9e, 0x71, 0x12, 0x74, 0x0a, 0x75, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, + 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf6, 0x0a, 0xb2, 0x22, 0x7e, 0xb6, 0xbc, 0xd6, 0xfb, 0xe6, 0x3c, 0xef, 0x5f, 0xdf, 0xda, 0x54, 0xb7, 0x13, 0xb8, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x75, 0x2b, 0x9d, 0xc6, 0xdc, 0xe6, 0xfb, 0xde, 0xf0, 0x6b, 0x89, 0x09, 0xab, 0x01, 0x8a, 0x01, 0x8a, 0x11, 0x48, 0x11, 0x68, 0x11, 0x89, 0x01, 0xaa, 0x01, 0x8b, 0x01, 0x6b, 0x01, 0x6a, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x6a, 0x01, 0x69, 0x09, 0x48, 0x09, 0x48, 0x11, 0xa9, 0x21, 0x4b, 0x42, 0xcd, 0x52, 0xcd, 0x5a, 0xac, 0x52, 0x0b, 0x3a, 0x29, 0x11, 0x09, 0x01, 0x4a, 0x01, 0x49, 0x01, 0x09, 0x09, 0xea, 0x08, 0x8f, 0x19, 0xd6, 0x1a, 0xf8, 0x12, 0xf7, 0x12, 0xb7, 0x0a, 0xd9, 0x02, 0xf9, 0x02, 0xf6, 0x0a, 0xd5, 0x1a, 0x96, 0x1a, 0xf2, 0x11, 0x4a, 0x01, 0x89, 0x01, 0x28, 0x01, 0x08, 0x01, 0x4a, 0x09, 0x29, 0x09, 0xc9, 0x29, 0xab, 0x52, 0xab, 0x5a, 0x6a, 0x52, 0x28, 0x32, 0x26, 0x11, 0x07, 0x21, 0xe7, 0x40, 0xc6, 0x70, 0x85, 0x88, 0x84, 0x98, 0x64, 0xa8, 0x43, 0xc0, 0x23, 0xc8, 0x23, 0xc8, 0x43, 0xc8, 0x63, 0xb8, 0x84, 0xa0, 0x84, 0x80, 0xa6, 0x58, 0xe7, 0x40, 0x08, 0x21, 0x29, 0x11, 0x2a, 0x01, 0x0b, 0x01, 0x4e, 0x01, 0x94, 0x0a, 0x93, 0x1a, 0x5c, 0xbe, 0x79, 0xce, 0xfb, 0xce, 0x5f, 0xc7, 0x1f, 0x7e, 0x57, 0x13, 0xfa, 0x1b, 0x98, 0x0b, 0xb8, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x30, 0x02, 0xad, 0x01, 0x4b, 0x11, 0x49, 0x19, 0x48, 0x19, 0xaa, 0x19, 0x2b, 0x09, 0x4c, 0x09, 0x6a, 0x09, 0x6a, 0x01, 0xec, 0x01, 0xb2, 0x0a, 0x36, 0x23, 0x37, 0x1b, 0x56, 0x0b, 0x33, 0x1b, 0x5c, 0xb6, 0xbc, 0xd6, 0xfc, 0xde, 0xff, 0xc6, 0x55, 0x1b, 0x78, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x59, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x0b, 0xf6, 0x0a, 0x13, 0x23, 0x7c, 0xc6, 0x7a, 0xde, 0xba, 0xde, 0xfd, 0xce, 0x1a, 0x65, 0x95, 0x1b, 0x73, 0x2b, 0xab, 0x01, 0xaa, 0x01, 0x68, 0x01, 0xa8, 0x01, 0x68, 0x01, 0x69, 0x09, 0x69, 0x09, 0x4a, 0x09, 0x4b, 0x09, 0x4a, 0x09, 0x4a, 0x11, 0x48, 0x21, 0x06, 0x41, 0xe5, 0x68, 0xa4, 0x80, 0xa4, 0x90, 0x83, 0xa0, 0x83, 0xb0, 0x62, 0xc0, 0x41, 0xd0, 0x41, 0xd0, 0xa2, 0xd8, 0xe4, 0xd0, 0x46, 0xb9, 0x47, 0x91, 0x07, 0x61, 0xe7, 0x38, 0x08, 0x19, 0x29, 0x09, 0x49, 0x01, 0x4a, 0x01, 0x8d, 0x01, 0x32, 0x02, 0xb7, 0x0a, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd8, 0x0a, 0xf9, 0x0a, 0xf7, 0x02, 0xf7, 0x02, 0xf8, 0x0a, 0xd8, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xf7, 0x12, 0x92, 0x1a, 0xd8, 0x7c, 0x5a, 0xce, 0x72, 0xa4, 0x8b, 0x5a, 0x8c, 0x4a, 0x6a, 0x01, 0x49, 0x01, 0x07, 0x09, 0xe7, 0x10, 0xe8, 0x00, 0x09, 0x01, 0x0a, 0x11, 0xe9, 0x10, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x08, 0x01, 0x29, 0x01, 0x08, 0x01, 0x29, 0x01, 0x28, 0x01, 0xe7, 0x00, 0x29, 0x09, 0x2c, 0x2a, 0x8c, 0x42, 0xcd, 0x4a, 0x6b, 0x42, 0xa9, 0x29, 0x47, 0x11, 0x67, 0x09, 0x88, 0x09, 0x68, 0x01, 0x4a, 0x09, 0x4a, 0x01, 0x4b, 0x01, 0xce, 0x01, 0x93, 0x0a, 0x16, 0x13, 0xf7, 0x12, 0xf7, 0x0a, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0x16, 0x03, 0x35, 0x0b, 0xd2, 0x12, 0x11, 0x4b, 0x1c, 0xb6, 0x9f, 0xae, 0xb2, 0x1a, 0x94, 0x12, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, + 0x19, 0x03, 0x19, 0x03, 0x19, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x9a, 0x13, 0x59, 0x0b, 0x38, 0x03, 0x39, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf6, 0x12, 0x91, 0x1a, 0x5e, 0xb6, 0xbc, 0xce, 0xba, 0xde, 0xdb, 0xe6, 0x7f, 0xdf, 0xfa, 0x5c, 0xb7, 0x13, 0xb9, 0x0b, 0xda, 0x13, 0x98, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x98, 0x0b, 0x57, 0x0b, 0x95, 0x33, 0xdd, 0xce, 0xfb, 0xde, 0x1b, 0xdf, 0x31, 0x74, 0x69, 0x09, 0x8b, 0x09, 0xab, 0x01, 0xab, 0x01, 0xab, 0x01, 0x8b, 0x01, 0x6a, 0x01, 0x6a, 0x09, 0x8a, 0x01, 0x6a, 0x01, 0x69, 0x09, 0x69, 0x11, 0x49, 0x09, 0x69, 0x09, 0x6a, 0x09, 0x6a, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x49, 0x01, 0x8a, 0x09, 0x6a, 0x01, 0x89, 0x11, 0x8b, 0x4a, 0x8a, 0x5a, 0xca, 0x5a, 0xcc, 0x52, 0x4c, 0x3a, 0x09, 0x09, 0x29, 0x09, 0x6c, 0x11, 0xeb, 0x00, 0x0b, 0x01, 0x4c, 0x01, 0xef, 0x01, 0xf6, 0x0a, 0x18, 0x03, 0xd8, 0x0a, 0xd9, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb6, 0x0a, 0x96, 0x12, 0x33, 0x12, 0x4b, 0x01, 0x48, 0x01, 0x28, 0x01, 0x28, 0x01, 0x29, 0x09, 0x08, 0x09, 0xaa, 0x31, 0x8d, 0x52, 0xad, 0x52, 0xce, 0x4a, 0x0b, 0x22, 0x49, 0x01, 0x4a, 0x09, 0x2a, 0x09, 0x29, 0x09, 0x2a, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x0b, 0x01, 0x2b, 0x01, 0x2a, 0x01, 0x4a, 0x09, 0x09, 0x09, 0xe7, 0x00, 0x08, 0x01, 0x48, 0x09, 0x49, 0x01, 0x49, 0x01, 0x4b, 0x01, 0xcf, 0x01, 0x94, 0x0a, 0x94, 0x0a, 0x71, 0x1a, 0xfa, 0xb5, 0xda, 0xde, 0xba, 0xde, 0x3d, 0xd7, 0x9b, 0x75, 0x55, 0x0b, 0xf8, 0x13, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x97, 0x13, 0x2f, 0x02, 0x8b, 0x01, 0x4a, 0x09, 0x6a, 0x11, 0x4a, 0x09, 0x4a, 0x09, 0x8a, 0x01, 0x4a, 0x01, 0x6a, 0x01, 0x8b, 0x01, 0x6c, 0x01, 0xd2, 0x12, 0xb6, 0x0b, 0xd8, 0x03, 0x56, 0x03, 0x34, 0x23, 0x7c, 0xb6, 0xdb, 0xde, 0xfc, 0xde, 0x3f, 0xd7, 0xb5, 0x2b, 0xb8, 0x13, 0xb8, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0xf6, 0x0a, 0x14, 0x2b, 0x7c, 0xce, 0x9a, 0xde, 0xbb, 0xde, 0xfd, 0xce, 0x3a, 0x6d, 0x54, 0x23, 0x53, 0x2b, 0x6c, 0x01, 0x6b, 0x01, 0x6a, 0x01, 0x6a, 0x09, 0x8a, 0x11, 0x6a, 0x09, 0x6a, 0x09, 0x6a, 0x01, 0x6a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x89, 0x01, 0x69, 0x09, 0x4a, 0x01, 0x6b, 0x09, 0x4a, 0x09, 0x29, 0x09, 0x28, 0x09, 0xe9, 0x21, 0xab, 0x4a, 0x69, 0x4a, 0x8b, 0x52, 0xac, 0x52, 0x08, 0x11, 0x08, 0x01, 0x49, 0x01, 0x49, 0x01, 0x2b, 0x01, 0xcf, 0x01, 0x72, 0x12, 0xb5, 0x12, 0xb6, 0x0a, 0x96, 0x0a, 0xb7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0x96, 0x0a, 0xd4, 0x22, 0x57, 0x64, 0x7c, 0xce, 0x73, 0x94, 0x8b, 0x52, 0x6b, 0x42, 0x07, 0x09, 0x08, 0x01, 0x08, 0x01, 0x09, 0x01, 0x29, 0x01, 0x29, 0x01, 0x08, 0x01, 0x09, 0x01, 0xe9, 0x00, 0x0a, 0x01, 0x0a, 0x01, 0xea, 0x00, 0x0a, 0x01, 0x0b, 0x01, 0x0a, 0x01, 0x09, 0x01, 0xe9, 0x08, 0x08, 0x09, 0xe9, 0x08, 0xe9, 0x00, 0x2a, 0x01, 0x09, 0x09, 0xe7, 0x08, 0x2b, 0x3a, 0x8a, 0x4a, 0xab, 0x4a, 0x6c, 0x3a, 0x28, 0x09, 0x89, 0x11, 0x28, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x49, 0x09, 0x49, 0x09, 0x49, 0x01, 0x8c, 0x01, 0x16, 0x0b, 0xf8, 0x02, 0xd7, 0x0a, 0x17, 0x0b, 0x17, 0x0b, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf5, 0x02, 0xd3, 0x12, 0x53, 0x43, 0x9e, 0xbe, 0x9f, 0xb6, 0x71, 0x22, 0x73, 0x12, 0x76, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x0a, 0x97, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x59, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x17, 0x03, 0x16, 0x13, 0xb2, 0x1a, 0x7e, 0xae, 0xfd, 0xd6, 0x1c, 0xe7, 0x1c, 0xe7, 0x5f, 0xd7, 0xd5, 0x2b, 0xb7, 0x0b, 0xd9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb8, 0x0b, 0x98, 0x0b, 0x36, 0x0b, 0x75, 0x2b, 0xfe, 0xc6, 0xdb, 0xde, 0xfb, 0xde, 0x10, 0x74, 0x89, 0x11, 0x8a, 0x09, 0xaa, 0x09, 0x89, 0x09, 0x69, 0x01, 0x49, 0x01, 0x49, 0x09, 0x6a, 0x09, 0x8a, 0x01, 0x6a, 0x01, 0x49, 0x09, 0x6a, 0x09, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x69, 0x01, 0x69, 0x01, 0x69, 0x09, 0x49, 0x09, 0x49, 0x11, 0x49, 0x09, 0x69, 0x19, 0x8b, 0x52, 0x8a, 0x5a, 0x8b, 0x5a, 0x8c, 0x52, 0x4b, 0x3a, 0x27, 0x09, 0x48, 0x09, 0x49, 0x09, 0x09, 0x01, 0x2a, 0x01, 0x4a, 0x01, 0x0f, 0x02, 0x16, 0x0b, 0x38, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xf9, 0x0a, 0xd7, 0x12, 0x11, 0x02, 0xad, 0x01, 0x6b, 0x01, 0x0a, 0x01, 0x09, 0x01, 0xc7, 0x08, 0xa8, 0x39, 0x6a, 0x5a, 0xab, 0x5a, 0xac, 0x52, 0x0a, 0x22, 0x69, 0x09, 0x49, 0x09, 0x49, 0x09, 0x29, 0x01, 0x29, 0x01, 0x49, 0x01, 0x29, 0x01, 0x29, 0x01, 0x49, 0x01, 0x29, 0x01, 0x49, 0x09, 0x08, 0x01, 0x28, 0x09, 0x49, 0x11, 0x4a, 0x09, 0x2a, 0x01, 0x2b, 0x01, 0x4c, 0x01, 0xaf, 0x01, 0x74, 0x0a, 0xf6, 0x12, 0xd6, 0x0a, 0x92, 0x1a, 0x3c, 0xb6, 0xbb, 0xde, 0xbb, 0xde, 0x3e, 0xd7, 0x1a, 0x65, 0x35, 0x13, 0xf8, 0x13, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x97, 0x13, 0x2e, 0x02, 0x8a, 0x01, 0x48, 0x01, 0x89, 0x09, 0x68, 0x01, 0x89, 0x01, 0xa9, 0x01, 0x89, 0x01, 0xaa, 0x01, 0x8a, 0x01, 0x4b, 0x01, 0xb2, 0x12, 0x77, 0x13, 0x98, 0x13, 0x18, 0x13, 0x56, 0x33, 0x7d, 0xbe, 0xdb, 0xde, 0xfc, 0xe6, 0x5f, 0xd7, 0xd6, 0x33, 0x76, 0x0b, 0x76, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0xf5, 0x0a, 0x13, 0x2b, 0x5c, 0xc6, 0x7a, 0xde, 0xbb, 0xde, 0x1e, 0xcf, 0xd9, 0x4c, 0x55, 0x0b, 0x54, 0x1b, 0xee, 0x01, 0xab, 0x01, 0x6a, 0x01, 0x49, 0x01, 0x28, 0x09, 0x69, 0x11, 0x49, 0x11, 0x49, 0x09, 0x49, 0x09, 0x4a, 0x09, 0x4a, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x49, 0x01, 0x69, 0x01, 0x49, 0x01, 0x6a, 0x09, 0x49, 0x09, 0x49, 0x11, 0x28, 0x09, 0xc9, 0x29, 0x49, 0x42, 0x49, 0x52, 0x8a, 0x5a, 0xab, 0x52, 0x68, 0x19, 0x49, 0x09, 0x49, 0x01, 0x4a, 0x01, 0x10, 0x02, 0x93, 0x02, 0xd5, 0x0a, 0xf7, 0x0a, 0xd7, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0x95, 0x0a, 0xd3, 0x1a, 0xb8, 0x74, 0x9c, 0xce, 0x93, 0x9c, 0xcc, 0x5a, 0xac, 0x52, 0x49, 0x11, 0x0a, 0x09, 0xe9, 0x08, 0xea, 0x08, 0xea, 0x08, 0xea, 0x08, 0xea, 0x08, 0xe9, 0x08, 0xe8, 0x00, 0x08, 0x01, 0x08, 0x01, 0x08, 0x01, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x08, 0x01, 0x28, 0x11, 0xe7, 0x08, 0x08, 0x09, 0x29, 0x09, 0xe9, 0x00, 0xc7, 0x00, 0xc6, 0x08, 0x2a, 0x42, 0x69, 0x4a, 0xcb, 0x5a, 0xcd, 0x52, 0x48, 0x19, 0x48, 0x09, 0x28, 0x01, 0x6a, 0x09, 0x29, 0x01, 0x69, 0x09, 0x69, 0x01, 0x69, 0x01, 0x8c, 0x01, 0x15, 0x0b, 0x37, 0x03, 0x16, 0x0b, 0x37, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0xf3, 0x12, 0x53, 0x43, 0x7e, 0xbe, 0x9f, 0xb6, 0x91, 0x22, 0x74, 0x12, 0x96, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x39, 0x03, 0x39, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x38, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x17, 0x03, 0xf6, 0x0a, 0xb2, 0x1a, 0x5d, 0xae, 0xfd, 0xd6, 0x3c, 0xe7, 0x5d, 0xef, 0x5f, 0xd7, 0x74, 0x23, 0xb8, 0x0b, 0xfa, 0x13, 0xb9, 0x03, 0xb8, 0x03, 0xd9, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x97, 0x03, 0x77, 0x0b, 0x36, 0x0b, 0x75, 0x2b, 0xfe, 0xce, 0xbb, 0xde, 0xbb, 0xd6, 0xf1, 0x73, 0x89, 0x11, 0x49, 0x01, 0x69, 0x09, 0x89, 0x09, 0x89, 0x09, 0x89, 0x09, 0x69, 0x09, 0x6a, 0x09, 0x8a, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x8b, 0x09, 0x8b, 0x01, 0x6b, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x69, 0x01, 0x69, 0x09, 0x69, 0x09, 0x69, 0x09, 0x48, 0x09, 0x69, 0x09, 0x69, 0x09, 0x89, 0x19, 0xab, 0x52, 0x8a, 0x52, 0xab, 0x52, 0xcc, 0x52, 0xac, 0x4a, 0x27, 0x11, 0x28, 0x09, 0x08, 0x01, 0x0a, 0x01, 0x4b, 0x09, 0x2b, 0x01, 0xcf, 0x01, 0xf6, 0x12, 0xf8, 0x0a, 0xd8, 0x0a, 0xd8, 0x0a, 0xd9, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd8, 0x02, 0xd9, 0x02, 0xf9, 0x02, 0xd6, 0x0a, 0x95, 0x12, 0x74, 0x12, 0xb0, 0x09, 0x6d, 0x01, 0x09, 0x09, 0xe9, 0x39, 0xaa, 0x62, 0xca, 0x62, 0xaa, 0x52, 0x09, 0x2a, 0x89, 0x11, 0x28, 0x09, 0x08, 0x09, 0x29, 0x09, 0x29, 0x09, 0x28, 0x09, 0x28, 0x09, 0x28, 0x01, 0x28, 0x01, 0x28, 0x01, 0x48, 0x09, 0x89, 0x09, 0x69, 0x09, 0x4a, 0x01, 0x2b, 0x01, 0x4d, 0x01, 0xb0, 0x01, 0x53, 0x12, 0xd6, 0x1a, 0xf7, 0x12, 0xf8, 0x0a, 0xd7, 0x02, 0x93, 0x12, 0x5d, 0xb6, 0xbb, 0xd6, 0xbb, 0xd6, 0x3f, 0xd7, 0x5a, 0x6d, 0x75, 0x13, 0xb7, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0xd9, 0x13, 0xb9, 0x0b, 0x77, 0x13, 0x30, 0x02, 0x8d, 0x01, 0x4b, 0x01, 0x6a, 0x09, 0x4a, 0x09, 0x6a, 0x09, 0x69, 0x09, 0x49, 0x01, 0x69, 0x01, 0x69, 0x01, 0x6b, 0x01, 0xd1, 0x12, 0x95, 0x0b, 0xb7, 0x03, 0x56, 0x03, 0x95, 0x2b, 0x9c, 0xbe, 0xbb, 0xde, 0xfc, 0xe6, 0x7f, 0xdf, 0x37, 0x44, 0x97, 0x13, 0x97, 0x0b, 0x77, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0xf5, 0x0a, 0x13, 0x2b, 0x5c, 0xc6, 0x7a, 0xde, 0xba, 0xde, 0x1e, 0xc7, 0xda, 0x44, 0xb7, 0x0b, 0xb7, 0x13, 0xf3, 0x02, 0x70, 0x02, 0xee, 0x01, 0xac, 0x01, 0x4a, 0x01, 0x8a, 0x09, 0x6a, 0x09, 0x4a, 0x09, 0x49, 0x09, 0x49, 0x09, 0x69, 0x09, 0x49, 0x09, 0x49, 0x09, 0x49, 0x09, 0x69, 0x09, 0x49, 0x09, 0x48, 0x09, 0x48, 0x09, 0x48, 0x11, 0x07, 0x11, 0x88, 0x29, 0x4a, 0x52, 0x8a, 0x5a, 0x8a, 0x5a, 0x6b, 0x4a, 0x49, 0x01, 0x8c, 0x01, 0x0f, 0x0a, 0x93, 0x12, 0xf6, 0x0a, 0x17, 0x0b, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x0a, 0xf7, 0x02, 0xd7, 0x02, 0xb7, 0x0a, 0x97, 0x0a, 0x96, 0x12, 0xb4, 0x2a, 0x1a, 0x85, 0x5b, 0xce, 0x31, 0x94, 0xab, 0x5a, 0x8b, 0x4a, 0x48, 0x11, 0x29, 0x09, 0x28, 0x01, 0x08, 0x01, 0x28, 0x01, 0x28, 0x01, 0x27, 0x01, 0x27, 0x01, 0x08, 0x01, 0x08, 0x01, 0x08, 0x01, 0x08, 0x01, 0x09, 0x01, 0x09, 0x01, 0x09, 0x01, 0x08, 0x01, 0x08, 0x09, 0xc7, 0x00, 0x09, 0x09, 0x2a, 0x09, 0x09, 0x01, 0x29, 0x11, 0x07, 0x19, 0x0a, 0x42, 0xaa, 0x52, 0x8a, 0x52, 0x8c, 0x4a, 0x48, 0x19, 0x48, 0x01, 0x48, 0x01, 0x6a, 0x09, 0x6a, 0x09, 0x69, 0x01, 0x48, 0x01, 0x49, 0x01, 0xac, 0x01, 0x14, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0xf3, 0x12, 0x52, 0x43, 0x7e, 0xbe, 0xbf, 0xb6, 0xd2, 0x2a, 0x73, 0x12, 0x75, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x76, 0x02, + 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x38, 0x03, 0x39, 0x03, 0x39, 0x03, 0x18, 0x03, 0x38, 0x03, 0x39, 0x03, 0x18, 0x03, 0x38, 0x03, 0x39, 0x03, 0x38, 0x03, 0x18, 0x03, 0xf6, 0x0a, 0xb2, 0x22, 0x3d, 0xa6, 0xdd, 0xd6, 0x1c, 0xe7, 0x5d, 0xef, 0x7f, 0xd7, 0x57, 0x3c, 0xb8, 0x0b, 0xd9, 0x0b, 0xda, 0x0b, 0x98, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x99, 0x03, 0xb9, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0x97, 0x03, 0x77, 0x0b, 0x56, 0x0b, 0xb5, 0x3b, 0x9b, 0xce, 0xda, 0xee, 0xda, 0xe6, 0x51, 0x84, 0x68, 0x11, 0x8a, 0x01, 0xcb, 0x09, 0xab, 0x09, 0x8a, 0x01, 0x8a, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x4b, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x49, 0x01, 0x49, 0x01, 0x49, 0x01, 0x68, 0x11, 0xcb, 0x5a, 0x89, 0x5a, 0xa9, 0x5a, 0xcb, 0x5a, 0x8c, 0x4a, 0xc7, 0x00, 0x8b, 0x01, 0x6c, 0x01, 0x2c, 0x01, 0x0d, 0x01, 0x4d, 0x01, 0xd1, 0x01, 0xd6, 0x12, 0xd8, 0x0a, 0xd8, 0x0a, 0xb8, 0x0a, 0xb8, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xb8, 0x0a, 0xd7, 0x02, 0xf8, 0x02, 0xd8, 0x0a, 0xb8, 0x0a, 0xd8, 0x12, 0x76, 0x0a, 0x74, 0x0a, 0x71, 0x1a, 0x10, 0x4b, 0x0d, 0x5b, 0x6a, 0x4a, 0xab, 0x4a, 0x2b, 0x2a, 0x28, 0x01, 0x29, 0x09, 0x4a, 0x11, 0x2a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x2a, 0x01, 0x2a, 0x01, 0x4a, 0x01, 0x6b, 0x01, 0x2b, 0x01, 0x6c, 0x01, 0xce, 0x01, 0x71, 0x02, 0xf5, 0x0a, 0x38, 0x13, 0x38, 0x0b, 0x18, 0x03, 0xf8, 0x0a, 0xd7, 0x0a, 0xb7, 0x02, 0x73, 0x12, 0x3d, 0xb6, 0x9b, 0xd6, 0xbb, 0xd6, 0xfe, 0xd6, 0x9b, 0x75, 0x76, 0x1b, 0xb7, 0x0b, 0xd8, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x98, 0x03, 0xd7, 0x13, 0x2f, 0x02, 0xab, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x6a, 0x09, 0x6a, 0x09, 0x6a, 0x09, 0x4a, 0x01, 0x6a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0xb2, 0x12, 0x75, 0x13, 0x96, 0x0b, 0x56, 0x0b, 0x95, 0x2b, 0xdd, 0xc6, 0xdb, 0xde, 0xdb, 0xde, 0x5f, 0xd7, 0x37, 0x44, 0x76, 0x0b, 0x76, 0x03, 0x36, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x0b, 0xf5, 0x0a, 0x13, 0x2b, 0x7c, 0xc6, 0x7a, 0xde, 0xba, 0xde, 0x1e, 0xc7, 0x99, 0x44, 0x98, 0x13, 0x98, 0x13, 0x97, 0x13, 0x77, 0x0b, 0x36, 0x0b, 0xf5, 0x0a, 0x92, 0x02, 0xef, 0x01, 0xce, 0x01, 0xac, 0x01, 0x8b, 0x01, 0x8a, 0x01, 0x69, 0x09, 0x68, 0x09, 0x48, 0x09, 0x69, 0x09, 0x6a, 0x09, 0x69, 0x01, 0x68, 0x09, 0x68, 0x09, 0x48, 0x09, 0x08, 0x09, 0xcb, 0x31, 0x2a, 0x4a, 0x8b, 0x5a, 0xcc, 0x5a, 0x91, 0x5b, 0x2f, 0x0a, 0xf5, 0x12, 0x17, 0x0b, 0x18, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xd8, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xb5, 0x02, 0xb3, 0x12, 0xdc, 0x8d, 0xdc, 0xce, 0x71, 0x8c, 0xeb, 0x5a, 0xab, 0x42, 0x28, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x4a, 0x01, 0x29, 0x01, 0x29, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x09, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x09, 0x01, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x01, 0x0a, 0x01, 0xe9, 0x00, 0xe8, 0x08, 0xa6, 0x10, 0x2a, 0x42, 0x6a, 0x4a, 0x8a, 0x4a, 0xee, 0x52, 0x48, 0x11, 0x68, 0x11, 0x48, 0x09, 0x07, 0x09, 0x07, 0x09, 0x27, 0x09, 0x47, 0x09, 0x48, 0x01, 0xac, 0x01, 0xd3, 0x12, 0x16, 0x0b, 0x36, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x17, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf5, 0x02, 0xd3, 0x12, 0x52, 0x43, 0x7e, 0xbe, 0xdf, 0xbe, 0x13, 0x33, 0x73, 0x12, 0x75, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0x19, 0x03, 0x39, 0x0b, 0x39, 0x0b, 0x39, 0x0b, 0x19, 0x03, 0x19, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x59, 0x03, 0x39, 0x03, 0x39, 0x03, 0x59, 0x03, 0x39, 0x03, 0x18, 0x0b, 0xf6, 0x12, 0xd2, 0x2a, 0x5e, 0xb6, 0xdd, 0xd6, 0xdb, 0xde, 0x5d, 0xef, 0x7f, 0xdf, 0x78, 0x44, 0xb8, 0x13, 0x98, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x57, 0x13, 0xd6, 0x3b, 0x1f, 0xcf, 0xdc, 0xd6, 0xfd, 0xce, 0xdf, 0xb6, 0x17, 0x34, 0x97, 0x0b, 0xd8, 0x13, 0xfd, 0x34, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xd8, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb8, 0x0b, 0x77, 0x03, 0xb8, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0xb8, 0x13, 0x77, 0x13, 0x56, 0x1b, 0x17, 0x4c, 0x7d, 0xbe, 0xbc, 0xd6, 0xdc, 0xde, 0xde, 0xd6, 0xdf, 0xb6, 0x13, 0x2b, 0x14, 0x13, 0xf5, 0x0a, 0xd5, 0x0a, 0xf6, 0x12, 0xf6, 0x0a, 0xf7, 0x0a, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0x98, 0x02, 0xd9, 0x02, 0xb8, 0x02, 0xd7, 0x0a, 0xd4, 0x1a, 0x76, 0x6c, 0xdd, 0xce, 0xfc, 0xd6, 0xf9, 0xad, 0xb3, 0x4b, 0xee, 0x09, 0x0f, 0x0a, 0x8e, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xd0, 0x01, 0xd0, 0x01, 0xf1, 0x01, 0x12, 0x02, 0xd5, 0x12, 0xf6, 0x12, 0xf6, 0x0a, 0xf7, 0x02, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf7, 0x0a, 0xd7, 0x0a, 0xd6, 0x0a, 0x72, 0x12, 0x1b, 0xb6, 0x9a, 0xd6, 0xbb, 0xde, 0xfd, 0xd6, 0xbc, 0x7d, 0x55, 0x13, 0x96, 0x0b, 0xb8, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd8, 0x03, 0x97, 0x0b, 0x98, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x36, 0x0b, 0x54, 0x2b, 0xbd, 0xc6, 0xdb, 0xde, 0xdb, 0xde, 0x3f, 0xd7, 0x98, 0x4c, 0x97, 0x13, 0x97, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0xf5, 0x0a, 0x13, 0x2b, 0x7c, 0xc6, 0x79, 0xde, 0xba, 0xde, 0xfe, 0xc6, 0x78, 0x44, 0x97, 0x13, 0x97, 0x0b, 0xb8, 0x13, 0x98, 0x0b, 0x98, 0x0b, 0x99, 0x0b, 0x78, 0x0b, 0xb9, 0x13, 0x97, 0x13, 0x35, 0x0b, 0xf4, 0x0a, 0xb2, 0x0a, 0x90, 0x0a, 0x4f, 0x02, 0x2e, 0x02, 0x0f, 0x02, 0x0f, 0x02, 0x0d, 0x02, 0x0d, 0x02, 0x0d, 0x02, 0xcd, 0x01, 0xad, 0x09, 0xf1, 0x4a, 0xb5, 0x9c, 0x98, 0xbd, 0x9b, 0xce, 0xff, 0xbe, 0x75, 0x23, 0x58, 0x0b, 0x19, 0x03, 0x1a, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x02, 0xd7, 0x0a, 0xf7, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0x75, 0x02, 0xb4, 0x12, 0x52, 0x1a, 0x57, 0x74, 0x7c, 0xce, 0xdc, 0xde, 0xbc, 0xd6, 0x9a, 0x9d, 0x72, 0x1a, 0x94, 0x12, 0x96, 0x0a, 0x96, 0x0a, 0xb6, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0xb7, 0x0a, 0x97, 0x0a, 0x96, 0x0a, 0x96, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x75, 0x02, 0x95, 0x0a, 0x95, 0x02, 0xd6, 0x0a, 0xb5, 0x0a, 0x93, 0x12, 0x92, 0x22, 0x9b, 0x95, 0x5a, 0xc6, 0xdc, 0xd6, 0xbf, 0xb6, 0x33, 0x2b, 0x55, 0x0b, 0x56, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x37, 0x03, 0xf7, 0x02, 0x58, 0x0b, 0x17, 0x0b, 0xf6, 0x02, 0xf6, 0x02, 0x17, 0x03, 0x17, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0xf3, 0x12, 0x32, 0x43, 0x7e, 0xb6, 0xff, 0xbe, 0x54, 0x3b, 0x73, 0x12, 0x75, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, + 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x39, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x38, 0x03, 0x59, 0x03, 0x59, 0x03, 0x38, 0x03, 0x17, 0x03, 0xd5, 0x12, 0xd2, 0x2a, 0x9e, 0xbe, 0xdc, 0xd6, 0xbb, 0xde, 0x1c, 0xef, 0x5f, 0xd7, 0xd5, 0x2b, 0xf9, 0x1b, 0x98, 0x0b, 0x78, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x58, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x37, 0x0b, 0xb5, 0x3b, 0xbc, 0xce, 0xba, 0xde, 0xdb, 0xd6, 0xfe, 0xc6, 0xf6, 0x2b, 0xf8, 0x13, 0xd8, 0x0b, 0x1a, 0x0c, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xd8, 0x0b, 0xb8, 0x03, 0xb8, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x57, 0x0b, 0x36, 0x13, 0x17, 0x44, 0xbd, 0xc6, 0xbb, 0xde, 0xba, 0xe6, 0xdc, 0xde, 0x9f, 0xae, 0xb3, 0x12, 0x58, 0x0b, 0x59, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xd7, 0x0a, 0x95, 0x0a, 0x93, 0x22, 0x96, 0x7c, 0xbc, 0xd6, 0xdb, 0xd6, 0xfd, 0xce, 0x3a, 0x6d, 0xf5, 0x12, 0x78, 0x1b, 0x58, 0x13, 0x36, 0x0b, 0x36, 0x03, 0x16, 0x0b, 0xf7, 0x0a, 0x17, 0x0b, 0x18, 0x0b, 0x18, 0x13, 0x39, 0x13, 0x39, 0x0b, 0x19, 0x0b, 0x19, 0x0b, 0x18, 0x03, 0xf8, 0x02, 0x19, 0x03, 0x19, 0x0b, 0x18, 0x0b, 0xf6, 0x0a, 0xf6, 0x0a, 0xd6, 0x0a, 0x71, 0x12, 0xfa, 0xad, 0xba, 0xd6, 0xfb, 0xe6, 0x1d, 0xd7, 0xfc, 0x85, 0x54, 0x1b, 0xf8, 0x1b, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x97, 0x03, 0x97, 0x03, 0x96, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0x99, 0x03, 0x99, 0x03, 0xba, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xb9, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x78, 0x13, 0x36, 0x13, 0x54, 0x33, 0x9c, 0xc6, 0xba, 0xde, 0xbb, 0xde, 0x5f, 0xdf, 0xfa, 0x5c, 0xd7, 0x1b, 0xd8, 0x13, 0x77, 0x0b, 0x37, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf5, 0x0a, 0x13, 0x2b, 0x7c, 0xc6, 0x59, 0xde, 0x9a, 0xde, 0xfd, 0xc6, 0xb8, 0x44, 0xd7, 0x13, 0xb7, 0x0b, 0xb7, 0x0b, 0x76, 0x03, 0x57, 0x03, 0x77, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x79, 0x03, 0x79, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x78, 0x0b, 0x97, 0x0b, 0x76, 0x0b, 0x56, 0x0b, 0x15, 0x13, 0xf4, 0x22, 0x78, 0x74, 0x3c, 0xc6, 0x7b, 0xde, 0xdc, 0xd6, 0x1f, 0xc7, 0x33, 0x1b, 0x57, 0x0b, 0xf7, 0x0a, 0xb7, 0x02, 0xd7, 0x0a, 0xf7, 0x0a, 0xf7, 0x0a, 0xf7, 0x0a, 0xd7, 0x0a, 0xd6, 0x0a, 0xb6, 0x0a, 0xb7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xf6, 0x02, 0xf5, 0x0a, 0xb3, 0x12, 0x78, 0x6c, 0xbc, 0xc6, 0xbb, 0xce, 0xfd, 0xce, 0xfc, 0x9d, 0x93, 0x1a, 0x97, 0x0a, 0xb8, 0x0a, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x0a, 0x99, 0x0a, 0x99, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0x98, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x96, 0x0a, 0xd7, 0x0a, 0xb6, 0x02, 0xb6, 0x0a, 0xb5, 0x0a, 0x53, 0x0a, 0x30, 0x1a, 0x9b, 0x95, 0x3a, 0xbe, 0xdc, 0xce, 0xff, 0xbe, 0xf2, 0x22, 0x75, 0x13, 0x36, 0x03, 0x36, 0x03, 0x37, 0x0b, 0x57, 0x03, 0x58, 0x0b, 0x37, 0x0b, 0xf7, 0x0a, 0x17, 0x13, 0xf7, 0x0a, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0xd3, 0x12, 0xf1, 0x3a, 0x3d, 0xae, 0xbf, 0xb6, 0x74, 0x3b, 0x73, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, + 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0xd5, 0x12, 0xb2, 0x22, 0x9e, 0xb6, 0xbc, 0xce, 0xfb, 0xde, 0x1c, 0xe7, 0xfe, 0xce, 0x74, 0x23, 0xf9, 0x13, 0xd9, 0x0b, 0x98, 0x03, 0xd9, 0x0b, 0xb8, 0x0b, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x99, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x56, 0x0b, 0xb5, 0x3b, 0xbc, 0xce, 0x99, 0xd6, 0xbb, 0xd6, 0x1f, 0xc7, 0xf6, 0x2b, 0xd7, 0x0b, 0xd8, 0x0b, 0xd9, 0x0b, 0xd8, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x77, 0x0b, 0x76, 0x13, 0x37, 0x44, 0xdd, 0xbe, 0xbb, 0xce, 0xda, 0xde, 0xfd, 0xde, 0xff, 0xbe, 0xb3, 0x1a, 0x57, 0x13, 0x38, 0x03, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xb8, 0x0a, 0xb8, 0x0a, 0xb8, 0x0a, 0xb8, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd8, 0x0a, 0xb8, 0x0a, 0xf8, 0x0a, 0xf8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0xf6, 0x0a, 0x95, 0x12, 0xd4, 0x2a, 0xb7, 0x8c, 0xbc, 0xde, 0xfb, 0xde, 0x5e, 0xd7, 0x7b, 0x75, 0x36, 0x13, 0x58, 0x0b, 0x18, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0x39, 0x03, 0x39, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0x18, 0x0b, 0x18, 0x0b, 0xf7, 0x12, 0xd6, 0x0a, 0xd6, 0x0a, 0xb6, 0x02, 0x72, 0x12, 0xda, 0xad, 0xbb, 0xde, 0xdb, 0xe6, 0xfd, 0xd6, 0xfd, 0x8d, 0x54, 0x1b, 0x7a, 0x2c, 0xd8, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0xb8, 0x0b, 0x98, 0x03, 0x99, 0x0b, 0x98, 0x03, 0x98, 0x0b, 0x79, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x79, 0x0b, 0x98, 0x03, 0xb8, 0x03, 0xb8, 0x13, 0x97, 0x0b, 0xb7, 0x03, 0x96, 0x03, 0x75, 0x03, 0x93, 0x23, 0xbc, 0xc6, 0xba, 0xde, 0xba, 0xde, 0x5f, 0xd7, 0xda, 0x5c, 0x76, 0x0b, 0x76, 0x0b, 0x15, 0x03, 0x37, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x0b, 0xf5, 0x0a, 0x13, 0x33, 0x5c, 0xce, 0x59, 0xde, 0x9a, 0xde, 0xfd, 0xce, 0xb8, 0x4c, 0xb6, 0x0b, 0xb7, 0x0b, 0x97, 0x03, 0x97, 0x03, 0x78, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x79, 0x0b, 0x78, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x78, 0x03, 0x36, 0x03, 0x15, 0x1b, 0x98, 0x6c, 0x3b, 0xc6, 0x59, 0xde, 0xbb, 0xd6, 0xde, 0xc6, 0x34, 0x23, 0x36, 0x0b, 0x37, 0x13, 0x18, 0x13, 0xf7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xf7, 0x0a, 0xd6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x02, 0xb6, 0x02, 0x75, 0x02, 0x75, 0x0a, 0xb5, 0x22, 0xf7, 0x63, 0x7c, 0xce, 0x9b, 0xd6, 0x1d, 0xd7, 0x1c, 0x9e, 0xb3, 0x12, 0xd6, 0x0a, 0xd6, 0x02, 0xd6, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0xd5, 0x1a, 0x51, 0x22, 0x3a, 0x95, 0x7b, 0xc6, 0x9b, 0xce, 0xbf, 0xb6, 0x12, 0x23, 0x75, 0x13, 0x56, 0x03, 0x36, 0x03, 0x57, 0x0b, 0x37, 0x03, 0x58, 0x03, 0x37, 0x03, 0x16, 0x0b, 0x16, 0x0b, 0xf6, 0x0a, 0x16, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0xd3, 0x12, 0xd0, 0x32, 0xfc, 0xad, 0xbf, 0xb6, 0x74, 0x43, 0x73, 0x0a, 0x75, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, + 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0xd9, 0x13, 0xb9, 0x13, 0xd9, 0x13, 0xd9, 0x1b, 0xb9, 0x1b, 0xd9, 0x1b, 0xb8, 0x1b, 0x58, 0x13, 0x16, 0x03, 0x15, 0x13, 0xb1, 0x22, 0x9e, 0xb6, 0xbb, 0xce, 0x1b, 0xe7, 0x1c, 0xe7, 0xfd, 0xc6, 0xb4, 0x23, 0xd8, 0x0b, 0xd9, 0x0b, 0xfa, 0x0b, 0xd9, 0x0b, 0xb8, 0x0b, 0xd9, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xd8, 0x03, 0xd8, 0x03, 0xd8, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x56, 0x13, 0xd6, 0x3b, 0xdd, 0xce, 0xbb, 0xde, 0xfc, 0xde, 0x3f, 0xcf, 0xf6, 0x33, 0xd7, 0x1b, 0x59, 0x24, 0x39, 0x24, 0xb7, 0x13, 0xf9, 0x1b, 0x39, 0x1c, 0x39, 0x1c, 0xd9, 0x13, 0xb9, 0x13, 0xb9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb7, 0x03, 0xb7, 0x0b, 0xd8, 0x0b, 0xd8, 0x13, 0x97, 0x13, 0x35, 0x0b, 0x35, 0x13, 0xf6, 0x43, 0xde, 0xc6, 0xbc, 0xde, 0xbb, 0xe6, 0xfd, 0xde, 0xff, 0xbe, 0x11, 0x1b, 0xb6, 0x13, 0x56, 0x03, 0x37, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf8, 0x02, 0xb6, 0x0a, 0xb7, 0x0a, 0xd8, 0x02, 0xd7, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xb8, 0x0a, 0xb7, 0x0a, 0xb6, 0x0a, 0xd7, 0x0a, 0xf7, 0x0a, 0xf6, 0x02, 0x16, 0x0b, 0x95, 0x0a, 0xb4, 0x22, 0xd9, 0x8c, 0x9d, 0xd6, 0xfb, 0xde, 0x1c, 0xd7, 0x39, 0x75, 0x14, 0x13, 0x36, 0x0b, 0x38, 0x0b, 0x18, 0x03, 0x19, 0x03, 0x19, 0x0b, 0x18, 0x0b, 0x18, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x38, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x37, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0x18, 0x0b, 0xf8, 0x02, 0xb6, 0x02, 0xb4, 0x1a, 0xfb, 0xad, 0xbb, 0xde, 0xba, 0xde, 0xdc, 0xd6, 0xbf, 0xa6, 0xf3, 0x12, 0xd8, 0x23, 0x77, 0x0b, 0xb9, 0x13, 0xb9, 0x13, 0x98, 0x0b, 0x57, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x96, 0x03, 0x96, 0x03, 0xb7, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0xb8, 0x0b, 0xd7, 0x03, 0xb7, 0x03, 0x97, 0x13, 0x57, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0x37, 0x13, 0xb6, 0x3b, 0xbc, 0xc6, 0x9a, 0xde, 0x9a, 0xde, 0x3f, 0xd7, 0xfa, 0x5c, 0x35, 0x0b, 0x76, 0x0b, 0x56, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x0b, 0xf5, 0x0a, 0x34, 0x33, 0x7c, 0xce, 0x59, 0xde, 0x9a, 0xde, 0x1e, 0xcf, 0xfa, 0x5c, 0x97, 0x13, 0x97, 0x13, 0x77, 0x03, 0xb9, 0x0b, 0xba, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x76, 0x0b, 0x77, 0x0b, 0x56, 0x0b, 0x97, 0x0b, 0xb8, 0x0b, 0x77, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x15, 0x1b, 0x98, 0x6c, 0x5b, 0xce, 0x7a, 0xde, 0xbc, 0xd6, 0xbe, 0xb6, 0x96, 0x23, 0x37, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xd6, 0x0a, 0xd6, 0x0a, 0xf7, 0x0a, 0x95, 0x0a, 0xb5, 0x22, 0xb6, 0x53, 0xbd, 0xce, 0xbb, 0xd6, 0xdc, 0xce, 0x59, 0x8d, 0x73, 0x12, 0x97, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x02, 0x96, 0x02, 0x95, 0x02, 0x96, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x95, 0x02, 0x96, 0x02, 0xd6, 0x0a, 0x75, 0x02, 0x53, 0x12, 0x10, 0x1a, 0x19, 0x95, 0x3a, 0xce, 0xbb, 0xd6, 0x3f, 0xcf, 0x74, 0x3b, 0x55, 0x13, 0x96, 0x0b, 0x56, 0x0b, 0x36, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x37, 0x03, 0x16, 0x0b, 0x15, 0x0b, 0x36, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0xd3, 0x12, 0xd0, 0x32, 0x1c, 0xae, 0xdf, 0xb6, 0xb5, 0x4b, 0x93, 0x12, 0x75, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, 0x75, 0x02, 0x75, 0x02, 0x55, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0x55, 0x0b, 0x35, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x35, 0x03, 0x15, 0x03, 0x56, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x36, 0x03, 0x77, 0x03, 0x98, 0x0b, 0x77, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x77, 0x0b, 0x16, 0x0b, 0xf3, 0x1a, 0x31, 0x2b, 0x1e, 0xbf, 0xfc, 0xd6, 0x1c, 0xe7, 0x3c, 0xef, 0x1e, 0xd7, 0x95, 0x43, 0x96, 0x2b, 0x39, 0x2c, 0x39, 0x24, 0x5a, 0x2c, 0x19, 0x24, 0x39, 0x2c, 0xb7, 0x1b, 0xf8, 0x2b, 0xb7, 0x1b, 0xd8, 0x23, 0xf8, 0x2b, 0x19, 0x34, 0x59, 0x3c, 0x38, 0x3c, 0x18, 0x34, 0x18, 0x2c, 0x39, 0x24, 0x19, 0x1c, 0xd9, 0x0b, 0x97, 0x0b, 0xd8, 0x23, 0x14, 0x13, 0xf5, 0x4b, 0x9b, 0xc6, 0xba, 0xe6, 0x9b, 0xe6, 0x1f, 0xdf, 0x15, 0x4c, 0xd6, 0x2b, 0x39, 0x2c, 0xf9, 0x23, 0xf8, 0x23, 0x39, 0x2c, 0x59, 0x24, 0x39, 0x24, 0x59, 0x24, 0xd7, 0x13, 0x58, 0x24, 0x38, 0x24, 0xf6, 0x2b, 0xf7, 0x33, 0x18, 0x2c, 0x19, 0x2c, 0xf9, 0x2b, 0xd9, 0x2b, 0x19, 0x2c, 0x39, 0x2c, 0x38, 0x1c, 0xf6, 0x1b, 0x11, 0x13, 0x96, 0x64, 0xbc, 0xc6, 0xdb, 0xd6, 0x5c, 0xe7, 0x1c, 0xd7, 0xff, 0xbe, 0xd1, 0x22, 0x56, 0x1b, 0x79, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x38, 0x0b, 0x38, 0x13, 0x59, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x17, 0x0b, 0x59, 0x0b, 0x79, 0x0b, 0x98, 0x03, 0x56, 0x03, 0x77, 0x03, 0x57, 0x0b, 0xf5, 0x12, 0xd3, 0x2a, 0xd7, 0x84, 0xfd, 0xd6, 0xfc, 0xd6, 0xfd, 0xce, 0xfc, 0x95, 0xd3, 0x1a, 0x17, 0x0b, 0x39, 0x03, 0x17, 0x03, 0x16, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x77, 0x13, 0x57, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x16, 0x03, 0x16, 0x03, 0xb5, 0x0a, 0x31, 0x12, 0x5d, 0xbe, 0x7b, 0xd6, 0xfb, 0xe6, 0xbb, 0xce, 0x9e, 0x9e, 0x34, 0x1b, 0x77, 0x13, 0xf9, 0x1b, 0xf8, 0x1b, 0xf7, 0x1b, 0x18, 0x24, 0x19, 0x1c, 0x18, 0x14, 0xd7, 0x0b, 0xd7, 0x13, 0x76, 0x13, 0xf8, 0x2b, 0xb7, 0x2b, 0xd8, 0x33, 0x97, 0x2b, 0xd7, 0x2b, 0x39, 0x34, 0x7a, 0x34, 0xf8, 0x2b, 0x96, 0x1b, 0x35, 0x13, 0x14, 0x13, 0x73, 0x3b, 0x9b, 0xce, 0xdb, 0xe6, 0xdd, 0xd6, 0x3f, 0xd7, 0x1a, 0x6d, 0x13, 0x1b, 0x76, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x56, 0x03, 0x56, 0x03, 0x56, 0x0b, 0x35, 0x0b, 0x54, 0x0b, 0x34, 0x03, 0x76, 0x0b, 0x56, 0x03, 0x36, 0x03, 0x56, 0x0b, 0x55, 0x03, 0x35, 0x03, 0x16, 0x03, 0xf6, 0x0a, 0xf5, 0x22, 0x13, 0x3b, 0x7c, 0xbe, 0x9a, 0xde, 0x9b, 0xe6, 0xbd, 0xd6, 0xfc, 0x85, 0x54, 0x13, 0x99, 0x1b, 0x39, 0x03, 0x38, 0x03, 0x99, 0x0b, 0x56, 0x0b, 0x55, 0x0b, 0x97, 0x13, 0x56, 0x0b, 0x97, 0x0b, 0x97, 0x03, 0x96, 0x03, 0x97, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0xb7, 0x0b, 0x76, 0x03, 0x77, 0x03, 0x56, 0x13, 0xd3, 0x1a, 0x97, 0x74, 0x5a, 0xbe, 0x9a, 0xd6, 0xba, 0xce, 0xfe, 0xc6, 0xd4, 0x2b, 0x35, 0x03, 0x18, 0x0b, 0xd8, 0x02, 0xf9, 0x0a, 0x19, 0x0b, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0xd6, 0x02, 0xd5, 0x0a, 0xb5, 0x02, 0xb4, 0x0a, 0xb4, 0x12, 0x37, 0x5c, 0xdc, 0xce, 0x99, 0xde, 0xdb, 0xde, 0xba, 0xa5, 0xd2, 0x1a, 0xb4, 0x02, 0xd6, 0x02, 0xf7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0xb6, 0x0a, 0x95, 0x0a, 0xb5, 0x02, 0xb6, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x96, 0x02, 0x95, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0x76, 0x02, 0xb7, 0x0a, 0x76, 0x12, 0x33, 0x12, 0x30, 0x1a, 0xd7, 0x7c, 0x79, 0xbe, 0x9a, 0xc6, 0x1f, 0xc7, 0x95, 0x3b, 0x56, 0x13, 0x37, 0x03, 0x16, 0x03, 0x36, 0x03, 0x55, 0x03, 0x55, 0x03, 0x15, 0x0b, 0x16, 0x0b, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x0b, 0x17, 0x0b, 0x35, 0x0b, 0x15, 0x03, 0x15, 0x03, 0x36, 0x0b, 0xd5, 0x0a, 0xd4, 0x1a, 0x90, 0x22, 0xdb, 0x95, 0xbe, 0xae, 0x93, 0x43, 0x33, 0x12, 0x96, 0x12, 0x96, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x55, 0x02, 0x75, 0x02, 0x55, 0x02, 0x96, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0xb6, 0x0a, 0x95, 0x02, 0x75, 0x02, 0x75, 0x02, + 0xfa, 0x8c, 0x3b, 0x95, 0x3b, 0x95, 0x1a, 0x8d, 0xd9, 0x84, 0xd9, 0x84, 0xb9, 0x7c, 0x78, 0x74, 0x37, 0x6c, 0xd6, 0x5b, 0x95, 0x53, 0x74, 0x53, 0x13, 0x43, 0x54, 0x4b, 0x95, 0x53, 0x96, 0x53, 0x34, 0x43, 0x75, 0x53, 0x39, 0x9d, 0xbc, 0xd6, 0xba, 0xe6, 0x98, 0xe6, 0xb9, 0xe6, 0xbb, 0xd6, 0x19, 0x8d, 0x75, 0x43, 0x95, 0x33, 0xd7, 0x33, 0xb6, 0x23, 0x55, 0x1b, 0x74, 0x1b, 0x54, 0x13, 0x74, 0x0b, 0x54, 0x03, 0x76, 0x0b, 0x36, 0x0b, 0xf6, 0x0a, 0x17, 0x0b, 0xf6, 0x0a, 0x16, 0x0b, 0x36, 0x0b, 0x35, 0x03, 0x54, 0x03, 0x74, 0x03, 0x74, 0x0b, 0x53, 0x0b, 0x33, 0x13, 0xb7, 0x5c, 0xdb, 0xce, 0xda, 0xe6, 0xfb, 0xe6, 0x1d, 0xdf, 0x77, 0x7d, 0x34, 0x44, 0xf4, 0x3b, 0x15, 0x3c, 0xd4, 0x33, 0xb4, 0x33, 0x74, 0x2b, 0x75, 0x33, 0xf6, 0x43, 0xd6, 0x4b, 0xf7, 0x53, 0xb6, 0x43, 0xd6, 0x2b, 0xf7, 0x1b, 0xb7, 0x13, 0x77, 0x13, 0x56, 0x13, 0x36, 0x13, 0x35, 0x1b, 0x35, 0x1b, 0x34, 0x1b, 0x74, 0x2b, 0x31, 0x33, 0x9a, 0x9d, 0x7c, 0xd6, 0xbc, 0xee, 0x5a, 0xe6, 0xbd, 0xde, 0x7f, 0xd7, 0x53, 0x33, 0x92, 0x0a, 0xb4, 0x02, 0xf6, 0x02, 0x16, 0x03, 0xb4, 0x02, 0xb4, 0x02, 0xb4, 0x02, 0xb5, 0x0a, 0x94, 0x02, 0x94, 0x02, 0x93, 0x02, 0xb4, 0x02, 0xb4, 0x0a, 0x94, 0x12, 0x53, 0x1a, 0x52, 0x12, 0xb3, 0x12, 0xd4, 0x0a, 0xd4, 0x0a, 0x73, 0x02, 0x72, 0x1a, 0xb5, 0x53, 0xba, 0xad, 0x9b, 0xd6, 0xfb, 0xe6, 0xdc, 0xd6, 0xbe, 0xbe, 0xd1, 0x22, 0x93, 0x02, 0x58, 0x13, 0x58, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0x38, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x35, 0x0b, 0xf4, 0x0a, 0xb2, 0x12, 0xf2, 0x32, 0x3b, 0xbe, 0x7a, 0xd6, 0xda, 0xe6, 0x1b, 0xdf, 0xdd, 0xbe, 0x92, 0x43, 0x12, 0x23, 0x74, 0x23, 0x73, 0x1b, 0x32, 0x0b, 0x34, 0x13, 0x76, 0x13, 0x55, 0x03, 0x76, 0x0b, 0x75, 0x0b, 0x96, 0x13, 0x55, 0x13, 0x55, 0x13, 0x96, 0x1b, 0xd7, 0x23, 0x96, 0x13, 0x55, 0x0b, 0x75, 0x0b, 0x75, 0x13, 0x55, 0x13, 0xf4, 0x0a, 0x34, 0x13, 0xf5, 0x43, 0xdc, 0xd6, 0x79, 0xd6, 0xfc, 0xde, 0xde, 0xce, 0x3d, 0x9e, 0xd1, 0x1a, 0x33, 0x13, 0x55, 0x13, 0x97, 0x1b, 0x36, 0x0b, 0x56, 0x0b, 0x97, 0x13, 0x77, 0x0b, 0x36, 0x03, 0x36, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x38, 0x03, 0x59, 0x03, 0x39, 0x03, 0x59, 0x0b, 0x79, 0x13, 0x57, 0x0b, 0x76, 0x13, 0xb8, 0x1b, 0x36, 0x13, 0x92, 0x12, 0x93, 0x4b, 0x9b, 0xbe, 0xba, 0xd6, 0x9a, 0xde, 0x9c, 0xce, 0x1d, 0x96, 0x33, 0x1b, 0xd7, 0x23, 0x19, 0x24, 0xf8, 0x1b, 0x19, 0x1c, 0x38, 0x24, 0xf8, 0x23, 0x97, 0x13, 0xb9, 0x13, 0x98, 0x0b, 0x97, 0x03, 0xb7, 0x0b, 0xf7, 0x13, 0xb6, 0x1b, 0x55, 0x13, 0xb7, 0x1b, 0x97, 0x13, 0xb6, 0x13, 0x96, 0x0b, 0x97, 0x13, 0x55, 0x13, 0xd3, 0x22, 0xd9, 0x7c, 0x3b, 0xce, 0x5b, 0xde, 0x5b, 0xde, 0x7d, 0xc6, 0x56, 0x4c, 0x54, 0x13, 0x35, 0x0b, 0x15, 0x0b, 0xf4, 0x0a, 0xf4, 0x12, 0xd3, 0x0a, 0xf4, 0x0a, 0xb4, 0x0a, 0xd4, 0x0a, 0xf5, 0x0a, 0xd5, 0x0a, 0x16, 0x13, 0x17, 0x13, 0xd6, 0x0a, 0xb5, 0x02, 0xf6, 0x0a, 0xd6, 0x0a, 0xb6, 0x0a, 0x16, 0x13, 0xf5, 0x1a, 0xb4, 0x1a, 0x73, 0x12, 0x58, 0x64, 0x7c, 0xc6, 0x9b, 0xd6, 0xbc, 0xce, 0x1c, 0xa6, 0x71, 0x12, 0xf6, 0x0a, 0xf6, 0x02, 0xb6, 0x02, 0xf8, 0x02, 0xd7, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x95, 0x02, 0x95, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x95, 0x0a, 0xb5, 0x0a, 0x74, 0x02, 0xb5, 0x02, 0xd7, 0x12, 0x75, 0x0a, 0x54, 0x12, 0x73, 0x1a, 0x0f, 0x1a, 0xd7, 0x84, 0x7a, 0xce, 0xbb, 0xd6, 0xde, 0xc6, 0x54, 0x3b, 0xf4, 0x12, 0x57, 0x0b, 0x37, 0x0b, 0x15, 0x03, 0x55, 0x03, 0x35, 0x03, 0x16, 0x03, 0x16, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x35, 0x0b, 0x55, 0x0b, 0x14, 0x0b, 0xf4, 0x0a, 0xf4, 0x0a, 0x14, 0x0b, 0x14, 0x03, 0x14, 0x03, 0xf4, 0x02, 0xf5, 0x12, 0xd4, 0x1a, 0xb1, 0x2a, 0x3d, 0xa6, 0x3c, 0xa6, 0x56, 0x64, 0x31, 0x1a, 0x33, 0x0a, 0x74, 0x0a, 0x94, 0x02, 0x94, 0x02, 0x94, 0x02, 0x94, 0x0a, 0xb4, 0x0a, 0x94, 0x0a, 0x94, 0x02, 0x94, 0x02, 0x94, 0x02, 0x74, 0x02, 0x94, 0x02, 0xb4, 0x0a, 0xb4, 0x02, 0xb4, 0x02, 0xd4, 0x0a, + 0xfa, 0xe6, 0x1a, 0xef, 0x3b, 0xef, 0x1a, 0xef, 0xfa, 0xe6, 0x1b, 0xef, 0x1a, 0xe7, 0xda, 0xde, 0x1b, 0xe7, 0xfa, 0xe6, 0x1b, 0xe7, 0x1b, 0xe7, 0xda, 0xde, 0xda, 0xde, 0xfa, 0xde, 0xb9, 0xde, 0xf9, 0xde, 0x98, 0xd6, 0xfb, 0xe6, 0xdb, 0xe6, 0x9a, 0xde, 0x1c, 0xe7, 0x3b, 0xe7, 0x3b, 0xe7, 0x1b, 0xe7, 0xfb, 0xde, 0xfa, 0xde, 0x78, 0xce, 0xb9, 0xde, 0x99, 0xde, 0x37, 0xd6, 0xba, 0xe6, 0xdb, 0xd6, 0x7a, 0xce, 0x59, 0xc6, 0x19, 0xc6, 0x19, 0xc6, 0x3a, 0xc6, 0x3a, 0xc6, 0x3a, 0xc6, 0xd9, 0xb5, 0xd9, 0xb5, 0x98, 0xb5, 0x99, 0xb5, 0x99, 0xb5, 0x38, 0xad, 0x18, 0xad, 0x3c, 0xce, 0xdc, 0xde, 0xfb, 0xe6, 0xbb, 0xe6, 0x59, 0xd6, 0x7a, 0xd6, 0xbb, 0xd6, 0xbb, 0xde, 0x7b, 0xde, 0x9b, 0xd6, 0x9c, 0xd6, 0x9c, 0xd6, 0x9b, 0xd6, 0xda, 0xd6, 0x99, 0xce, 0xdb, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0x7b, 0xce, 0x5b, 0xc6, 0x7b, 0xce, 0x9b, 0xd6, 0xbb, 0xce, 0x9b, 0xce, 0xbb, 0xc6, 0x7a, 0xbe, 0x38, 0xb6, 0x99, 0xc6, 0xd9, 0xd6, 0xd9, 0xde, 0xd9, 0xe6, 0xfa, 0xe6, 0xda, 0xe6, 0x7a, 0xd6, 0xbc, 0xd6, 0x7c, 0xce, 0xf9, 0xbd, 0x1a, 0xbe, 0x5a, 0xc6, 0x7b, 0xce, 0x7b, 0xce, 0x5c, 0xce, 0x5b, 0xc6, 0x3b, 0xc6, 0x3a, 0xc6, 0x5a, 0xc6, 0x5b, 0xc6, 0x5b, 0xc6, 0x5c, 0xc6, 0x3b, 0xb6, 0x1a, 0xb6, 0xf9, 0xad, 0x3a, 0xb6, 0xf9, 0xb5, 0x77, 0xa5, 0x39, 0xc6, 0x99, 0xde, 0x98, 0xde, 0x77, 0xde, 0xb9, 0xde, 0xda, 0xd6, 0x19, 0xbe, 0x56, 0x95, 0xd6, 0x7c, 0x97, 0x74, 0x77, 0x6c, 0x56, 0x64, 0x57, 0x6c, 0x76, 0x6c, 0x76, 0x6c, 0x97, 0x74, 0xb7, 0x7c, 0x76, 0x6c, 0x97, 0x74, 0x97, 0x74, 0x76, 0x6c, 0x77, 0x6c, 0x97, 0x6c, 0x98, 0x6c, 0x77, 0x6c, 0xf7, 0x84, 0x17, 0x8d, 0xf7, 0x8c, 0xb9, 0xad, 0x9b, 0xde, 0x7a, 0xe6, 0x79, 0xde, 0xbb, 0xde, 0xdd, 0xde, 0x3b, 0xce, 0x1b, 0xce, 0xfa, 0xc5, 0x19, 0xbe, 0x5b, 0xc6, 0x3c, 0xce, 0xba, 0xbd, 0xda, 0xc5, 0xf9, 0xc5, 0xf9, 0xbd, 0x5a, 0xc6, 0x18, 0xbe, 0x39, 0xbe, 0x39, 0xbe, 0x7a, 0xc6, 0x3a, 0xbe, 0xf8, 0xb5, 0xf9, 0xb5, 0xd9, 0xbd, 0xb8, 0xbd, 0x98, 0xbd, 0xb7, 0xbd, 0x39, 0xce, 0x9a, 0xde, 0xba, 0xde, 0xfc, 0xde, 0xdc, 0xd6, 0xdd, 0xce, 0x95, 0x74, 0x34, 0x64, 0x55, 0x64, 0x14, 0x5c, 0xd3, 0x53, 0xf3, 0x53, 0x35, 0x5c, 0x55, 0x5c, 0x15, 0x5c, 0xf5, 0x5b, 0xf5, 0x5b, 0xf5, 0x53, 0xf5, 0x53, 0xd5, 0x4b, 0xb5, 0x43, 0xd5, 0x4b, 0xd4, 0x4b, 0x72, 0x43, 0x92, 0x43, 0x31, 0x33, 0x31, 0x33, 0x10, 0x3b, 0xb4, 0x7c, 0x99, 0xc6, 0xd9, 0xd6, 0xda, 0xde, 0xdb, 0xde, 0xbb, 0xce, 0xb5, 0x84, 0x35, 0x64, 0xd4, 0x53, 0xb5, 0x4b, 0xb6, 0x43, 0xb5, 0x4b, 0xb5, 0x4b, 0x57, 0x64, 0xd8, 0x6c, 0xb7, 0x64, 0xb6, 0x5c, 0x75, 0x5c, 0x35, 0x5c, 0xd9, 0x7c, 0x3b, 0x8d, 0x1a, 0x7d, 0x56, 0x5c, 0xb3, 0x4b, 0xf4, 0x53, 0x36, 0x5c, 0x73, 0x43, 0x72, 0x53, 0xda, 0xad, 0x5a, 0xce, 0x9a, 0xde, 0x59, 0xde, 0x3a, 0xce, 0xb9, 0x9d, 0x38, 0x85, 0xd8, 0x84, 0x76, 0x7c, 0x17, 0x95, 0x58, 0x9d, 0x58, 0x9d, 0x79, 0xa5, 0x18, 0x95, 0xb7, 0x84, 0x76, 0x7c, 0x36, 0x74, 0x16, 0x6c, 0x33, 0x53, 0x37, 0x6c, 0xfa, 0x84, 0x16, 0x64, 0x37, 0x6c, 0xb9, 0x7c, 0xd6, 0x63, 0x74, 0x53, 0x94, 0x53, 0x54, 0x4b, 0x3a, 0x95, 0x9c, 0xd6, 0xdc, 0xde, 0xbc, 0xd6, 0x5d, 0xbe, 0x2f, 0x12, 0x93, 0x12, 0xd3, 0x12, 0xb3, 0x12, 0xb4, 0x12, 0x94, 0x12, 0xb3, 0x12, 0xb3, 0x12, 0xb3, 0x02, 0xb4, 0x0a, 0xb5, 0x0a, 0x94, 0x0a, 0x74, 0x0a, 0x74, 0x02, 0x94, 0x0a, 0xd4, 0x0a, 0xd4, 0x0a, 0xb4, 0x02, 0xb4, 0x02, 0x74, 0x0a, 0x93, 0x12, 0x51, 0x12, 0x0e, 0x12, 0x39, 0x85, 0x3a, 0xc6, 0x9c, 0xd6, 0x9e, 0xbe, 0xd5, 0x53, 0x34, 0x1b, 0x36, 0x13, 0x56, 0x13, 0x36, 0x0b, 0x76, 0x0b, 0x76, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x57, 0x0b, 0x56, 0x0b, 0x35, 0x0b, 0x14, 0x0b, 0x35, 0x03, 0x36, 0x03, 0x37, 0x0b, 0x38, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x55, 0x03, 0x75, 0x0b, 0x34, 0x1b, 0xb0, 0x1a, 0xae, 0x32, 0x98, 0x9d, 0x79, 0xbe, 0x9a, 0xc6, 0x16, 0x95, 0x75, 0x7c, 0xd4, 0x63, 0xf5, 0x6b, 0x15, 0x6c, 0x15, 0x6c, 0x36, 0x74, 0x57, 0x74, 0x57, 0x7c, 0x36, 0x74, 0xf5, 0x6b, 0xd4, 0x63, 0xb4, 0x63, 0xd5, 0x6b, 0x15, 0x6c, 0xf5, 0x6b, 0xf5, 0x6b, 0x36, 0x6c, + 0x1b, 0xef, 0xfb, 0xee, 0xfb, 0xee, 0x1b, 0xef, 0x1b, 0xef, 0x1b, 0xef, 0x1b, 0xef, 0x1c, 0xef, 0xfb, 0xe6, 0xdb, 0xe6, 0x1b, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0xfb, 0xee, 0xfa, 0xe6, 0x1b, 0xef, 0xdc, 0xe6, 0xdd, 0xe6, 0x7b, 0xce, 0x3d, 0xdf, 0x5b, 0xdf, 0x5b, 0xe7, 0x1c, 0xef, 0xdc, 0xf6, 0xfc, 0xf6, 0xdc, 0xf6, 0xdb, 0xee, 0xfc, 0xee, 0xdc, 0xf6, 0xfc, 0xee, 0xfd, 0xe6, 0xdc, 0xe6, 0xdb, 0xe6, 0xfa, 0xe6, 0xfa, 0xe6, 0x1a, 0xe7, 0x1a, 0xdf, 0xd9, 0xd6, 0xfa, 0xde, 0xfa, 0xde, 0xda, 0xe6, 0xd9, 0xe6, 0xda, 0xee, 0xba, 0xe6, 0x9b, 0xde, 0xbc, 0xde, 0xbb, 0xde, 0x9b, 0xde, 0xdb, 0xe6, 0xfc, 0xee, 0xdb, 0xee, 0xfb, 0xee, 0xda, 0xee, 0xda, 0xe6, 0xfb, 0xde, 0xdb, 0xde, 0xbc, 0xde, 0xbb, 0xde, 0xda, 0xde, 0xda, 0xde, 0xbb, 0xe6, 0xbb, 0xe6, 0xfc, 0xe6, 0xdc, 0xde, 0xbc, 0xde, 0x9b, 0xd6, 0x9b, 0xd6, 0xbb, 0xde, 0x9a, 0xde, 0x59, 0xde, 0x9b, 0xe6, 0x7b, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xb9, 0xd6, 0xfb, 0xe6, 0x9a, 0xe6, 0x7a, 0xe6, 0xdb, 0xe6, 0xfc, 0xe6, 0x9a, 0xde, 0x9b, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0x79, 0xde, 0x9a, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x9a, 0xde, 0xba, 0xe6, 0xba, 0xe6, 0xba, 0xde, 0xbb, 0xde, 0x59, 0xce, 0x9b, 0xd6, 0xba, 0xde, 0x79, 0xde, 0x9a, 0xe6, 0xba, 0xe6, 0x79, 0xde, 0x59, 0xde, 0x79, 0xde, 0x7a, 0xde, 0xfd, 0xee, 0xbc, 0xe6, 0x5a, 0xde, 0x5a, 0xde, 0x7a, 0xe6, 0x59, 0xde, 0x99, 0xde, 0x9a, 0xde, 0xba, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0x99, 0xde, 0x99, 0xde, 0xb9, 0xe6, 0x99, 0xde, 0x99, 0xde, 0x99, 0xde, 0x99, 0xde, 0x99, 0xde, 0xba, 0xde, 0xda, 0xde, 0x9a, 0xe6, 0x18, 0xde, 0x7a, 0xe6, 0x59, 0xde, 0xba, 0xe6, 0x39, 0xde, 0x7b, 0xde, 0xdc, 0xde, 0xfd, 0xde, 0x9b, 0xd6, 0xfb, 0xde, 0xda, 0xe6, 0xfa, 0xe6, 0xd8, 0xd6, 0xb8, 0xd6, 0xb9, 0xde, 0x79, 0xde, 0x9a, 0xee, 0x5a, 0xe6, 0x7a, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0xda, 0xde, 0xba, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0x5a, 0xde, 0x7a, 0xe6, 0x7a, 0xe6, 0x59, 0xde, 0x59, 0xde, 0x59, 0xde, 0x79, 0xde, 0x99, 0xd6, 0x1c, 0xe7, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0x9b, 0xd6, 0x59, 0xce, 0x9a, 0xd6, 0x79, 0xd6, 0x79, 0xde, 0x79, 0xd6, 0x59, 0xd6, 0x79, 0xd6, 0x9a, 0xd6, 0x5a, 0xd6, 0x39, 0xd6, 0x79, 0xde, 0x79, 0xd6, 0x59, 0xd6, 0x79, 0xd6, 0x79, 0xde, 0x79, 0xde, 0x58, 0xd6, 0x59, 0xd6, 0x7b, 0xce, 0x9c, 0xd6, 0x5b, 0xce, 0x9b, 0xd6, 0x9a, 0xde, 0x79, 0xde, 0x9a, 0xde, 0x7a, 0xde, 0x9b, 0xe6, 0x7a, 0xe6, 0x7a, 0xde, 0x9a, 0xde, 0xbc, 0xde, 0xbc, 0xde, 0x7c, 0xd6, 0x5c, 0xd6, 0x5b, 0xd6, 0x7c, 0xd6, 0x7b, 0xd6, 0xbc, 0xde, 0xbc, 0xde, 0x5a, 0xd6, 0x9b, 0xd6, 0xdc, 0xe6, 0x9b, 0xd6, 0x7b, 0xd6, 0x5a, 0xd6, 0x7b, 0xde, 0xbc, 0xde, 0x5b, 0xce, 0x19, 0xc6, 0xbb, 0xd6, 0x99, 0xd6, 0xb9, 0xde, 0x58, 0xde, 0x79, 0xde, 0xdc, 0xde, 0xbb, 0xde, 0x7b, 0xde, 0x39, 0xd6, 0x39, 0xd6, 0x7a, 0xde, 0x5a, 0xd6, 0xbb, 0xde, 0x7a, 0xd6, 0x5a, 0xd6, 0x5a, 0xd6, 0x7a, 0xd6, 0x19, 0xc6, 0x19, 0xc6, 0x39, 0xc6, 0x5a, 0xce, 0x7a, 0xce, 0x59, 0xc6, 0x39, 0xc6, 0x39, 0xc6, 0x3a, 0xc6, 0x5b, 0xce, 0xb9, 0xbd, 0x5b, 0xce, 0x9a, 0xde, 0xba, 0xe6, 0xbb, 0xe6, 0x9c, 0xd6, 0xdb, 0xad, 0x9a, 0x9d, 0x96, 0x7c, 0x34, 0x6c, 0xb7, 0x84, 0x96, 0x7c, 0x55, 0x74, 0xd7, 0x84, 0x18, 0x95, 0x18, 0x95, 0xf8, 0x94, 0x97, 0x8c, 0x56, 0x84, 0x35, 0x7c, 0x35, 0x7c, 0x55, 0x7c, 0x14, 0x6c, 0x96, 0x7c, 0x56, 0x7c, 0x97, 0x84, 0xd8, 0x94, 0xb6, 0x94, 0xb5, 0x9c, 0xf9, 0xcd, 0x18, 0xde, 0x9a, 0xe6, 0x9b, 0xd6, 0x57, 0x9d, 0xd5, 0x7c, 0x54, 0x64, 0x54, 0x6c, 0x75, 0x6c, 0x35, 0x64, 0x15, 0x5c, 0xf5, 0x5b, 0xf5, 0x5b, 0xf4, 0x53, 0xf3, 0x53, 0xd2, 0x5b, 0xd2, 0x53, 0x92, 0x53, 0xb4, 0x5b, 0xd6, 0x63, 0xd7, 0x63, 0xd6, 0x5b, 0xb5, 0x53, 0xf4, 0x5b, 0x14, 0x64, 0xb5, 0x7c, 0xb5, 0x8c, 0x57, 0xad, 0xd8, 0xcd, 0xd6, 0xcd, 0xb6, 0xcd, 0x18, 0xce, 0x59, 0xd6, 0x39, 0xd6, 0x39, 0xd6, 0x39, 0xce, 0x19, 0xce, 0x39, 0xce, 0x39, 0xd6, 0x19, 0xce, 0x19, 0xce, 0x18, 0xce, 0x18, 0xce, 0x18, 0xce, 0x18, 0xce, 0x39, 0xd6, 0x19, 0xce, 0x18, 0xce, 0x18, 0xce, + 0x3c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x3c, 0xef, 0x3c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xef, 0xfc, 0xe6, 0xfc, 0xe6, 0xfc, 0xe6, 0xfb, 0xee, 0x9a, 0xe6, 0xdc, 0xee, 0xfe, 0xf6, 0xde, 0xee, 0xfd, 0xe6, 0x1d, 0xdf, 0x7d, 0xef, 0x5c, 0xe7, 0x1b, 0xe7, 0x1c, 0xef, 0x1d, 0xef, 0x1d, 0xef, 0x1c, 0xe7, 0x1d, 0xe7, 0x1d, 0xe7, 0xdc, 0xde, 0xfb, 0xe6, 0x1b, 0xe7, 0x1b, 0xef, 0xfc, 0xee, 0xbb, 0xe6, 0xdc, 0xe6, 0x1e, 0xe7, 0x1d, 0xe7, 0xfc, 0xde, 0xba, 0xde, 0xfa, 0xe6, 0xfa, 0xee, 0xd9, 0xe6, 0xba, 0xde, 0xdb, 0xde, 0xdc, 0xde, 0xfc, 0xe6, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xef, 0x3c, 0xf7, 0x1b, 0xef, 0xfa, 0xee, 0xda, 0xe6, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xdc, 0xe6, 0xda, 0xde, 0xfa, 0xe6, 0xfb, 0xe6, 0xfc, 0xee, 0xbc, 0xde, 0xbc, 0xde, 0xbc, 0xde, 0x9c, 0xd6, 0xdc, 0xde, 0xfc, 0xe6, 0xdb, 0xe6, 0x9b, 0xe6, 0xdc, 0xe6, 0x9c, 0xde, 0xbc, 0xd6, 0xfc, 0xd6, 0xfc, 0xd6, 0x1c, 0xdf, 0xdc, 0xde, 0xfd, 0xe6, 0xfc, 0xde, 0x5e, 0xef, 0xfd, 0xe6, 0xfc, 0xe6, 0xdb, 0xde, 0xda, 0xde, 0xba, 0xde, 0xfb, 0xe6, 0xfc, 0xe6, 0xdc, 0xde, 0xdc, 0xe6, 0xfb, 0xe6, 0xfb, 0xe6, 0xda, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xfa, 0xe6, 0xfb, 0xe6, 0xfb, 0xde, 0x1c, 0xe7, 0xdc, 0xde, 0xbb, 0xd6, 0xdc, 0xde, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbc, 0xde, 0x9c, 0xde, 0xfd, 0xe6, 0xbc, 0xde, 0x9c, 0xd6, 0x9c, 0xde, 0x9a, 0xde, 0x99, 0xe6, 0x99, 0xde, 0x99, 0xde, 0x99, 0xde, 0xba, 0xde, 0xda, 0xde, 0xba, 0xde, 0xdb, 0xde, 0xba, 0xde, 0x9a, 0xde, 0xba, 0xde, 0xba, 0xde, 0xba, 0xde, 0x99, 0xde, 0x9a, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0xba, 0xd6, 0xda, 0xde, 0x59, 0xd6, 0xbb, 0xde, 0x1d, 0xe7, 0xfc, 0xde, 0xdb, 0xe6, 0xda, 0xe6, 0x98, 0xde, 0xda, 0xe6, 0xfa, 0xde, 0xba, 0xce, 0xdc, 0xde, 0x1c, 0xe7, 0xbb, 0xde, 0xdb, 0xe6, 0xfb, 0xe6, 0xdb, 0xde, 0xda, 0xde, 0xda, 0xde, 0xda, 0xde, 0x9a, 0xde, 0xdb, 0xe6, 0x7a, 0xde, 0x9b, 0xe6, 0xdb, 0xe6, 0xba, 0xde, 0x9a, 0xd6, 0x99, 0xd6, 0xda, 0xde, 0xba, 0xde, 0xba, 0xde, 0xbb, 0xe6, 0x9a, 0xe6, 0xba, 0xe6, 0xba, 0xe6, 0xda, 0xe6, 0xba, 0xe6, 0x99, 0xe6, 0xda, 0xe6, 0xba, 0xe6, 0x99, 0xde, 0xba, 0xd6, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0x79, 0xd6, 0x9b, 0xd6, 0xbb, 0xde, 0x9a, 0xde, 0x9a, 0xe6, 0xbb, 0xe6, 0x9b, 0xe6, 0x7b, 0xde, 0x5a, 0xd6, 0x5a, 0xde, 0x1a, 0xd6, 0x1a, 0xde, 0x9c, 0xee, 0xbc, 0xee, 0xbc, 0xe6, 0xfc, 0xe6, 0xba, 0xd6, 0xba, 0xde, 0xfb, 0xe6, 0x78, 0xd6, 0x58, 0xd6, 0xba, 0xde, 0xda, 0xde, 0x99, 0xd6, 0x99, 0xde, 0xba, 0xe6, 0x9a, 0xde, 0xbb, 0xe6, 0xfb, 0xe6, 0xba, 0xd6, 0x79, 0xce, 0x9a, 0xde, 0x9a, 0xde, 0x99, 0xe6, 0x59, 0xd6, 0x79, 0xce, 0xbb, 0xd6, 0xbb, 0xde, 0x5a, 0xd6, 0x7a, 0xde, 0x7a, 0xe6, 0x7b, 0xe6, 0xbc, 0xee, 0xdc, 0xde, 0xbb, 0xd6, 0xba, 0xce, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0x7a, 0xd6, 0x9b, 0xd6, 0x7a, 0xd6, 0x9b, 0xde, 0x9a, 0xd6, 0x7a, 0xd6, 0xdb, 0xe6, 0x7a, 0xd6, 0x79, 0xd6, 0x9a, 0xde, 0x79, 0xd6, 0x79, 0xd6, 0xb9, 0xde, 0x99, 0xde, 0x79, 0xd6, 0x99, 0xde, 0x39, 0xd6, 0x59, 0xd6, 0x78, 0xde, 0x99, 0xe6, 0xda, 0xe6, 0xdb, 0xee, 0x9b, 0xde, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0x39, 0xd6, 0x19, 0xd6, 0x7a, 0xde, 0x79, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x3a, 0xd6, 0x5a, 0xd6, 0x79, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x7a, 0xce, 0x39, 0xce, 0x7a, 0xce, 0x59, 0xd6, 0x38, 0xd6, 0x17, 0xce, 0x17, 0xd6, 0x38, 0xde, 0x59, 0xde, 0x9a, 0xde, 0xba, 0xd6, 0xda, 0xd6, 0x99, 0xce, 0x79, 0xd6, 0x79, 0xde, 0x79, 0xde, 0x5a, 0xd6, 0x3a, 0xd6, 0x3a, 0xd6, 0x3a, 0xce, 0x39, 0xce, 0x59, 0xce, 0x79, 0xd6, 0x56, 0xce, 0x36, 0xd6, 0x38, 0xd6, 0x39, 0xd6, 0x59, 0xd6, 0x38, 0xd6, 0x37, 0xce, 0x17, 0xce, 0xd6, 0xcd, 0xd6, 0xcd, 0xb6, 0xd5, 0xf8, 0xdd, 0x39, 0xe6, 0xd8, 0xd5, 0x5a, 0xde, 0x5a, 0xde, 0x9b, 0xde, 0x5a, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x39, 0xd6, 0x38, 0xce, 0x39, 0xd6, 0x39, 0xd6, 0x7a, 0xde, 0x79, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x38, 0xd6, 0x38, 0xce, + 0x1e, 0xdf, 0x1e, 0xdf, 0x1e, 0xdf, 0xdd, 0xd6, 0xdd, 0xd6, 0x1e, 0xdf, 0x1e, 0xdf, 0x1e, 0xdf, 0xfe, 0xde, 0xfe, 0xde, 0x1e, 0xdf, 0x1e, 0xdf, 0x1e, 0xdf, 0xfe, 0xde, 0xdd, 0xd6, 0xdd, 0xd6, 0x5d, 0xdf, 0xfc, 0xd6, 0xdd, 0xde, 0xdd, 0xe6, 0x1d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfb, 0xde, 0x7d, 0xef, 0x5d, 0xe7, 0x3d, 0xdf, 0x1c, 0xdf, 0x7c, 0xe7, 0x5c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x5d, 0xe7, 0x5d, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0xfb, 0xe6, 0xfb, 0xe6, 0x3d, 0xe7, 0xfc, 0xde, 0x3d, 0xe7, 0x1d, 0xe7, 0x3d, 0xe7, 0x1c, 0xe7, 0xdb, 0xe6, 0xdc, 0xe6, 0xdc, 0xe6, 0xdc, 0xe6, 0x3c, 0xe7, 0x1b, 0xe7, 0xfb, 0xe6, 0xbb, 0xde, 0x5d, 0xe7, 0x3d, 0xe7, 0x3d, 0xef, 0xfc, 0xe6, 0xfd, 0xde, 0xfd, 0xde, 0xfd, 0xe6, 0x1d, 0xe7, 0x1c, 0xdf, 0x3c, 0xdf, 0xfb, 0xde, 0x1c, 0xe7, 0x1b, 0xe7, 0x1b, 0xe7, 0xfb, 0xde, 0xdb, 0xd6, 0xfa, 0xd6, 0xfb, 0xde, 0xfb, 0xe6, 0xdb, 0xe6, 0xba, 0xde, 0xdc, 0xe6, 0xbb, 0xde, 0xdb, 0xe6, 0xfb, 0xee, 0xda, 0xe6, 0x9a, 0xe6, 0xba, 0xe6, 0xda, 0xe6, 0xfb, 0xe6, 0x1d, 0xe7, 0xfd, 0xe6, 0xfc, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0xfb, 0xe6, 0xdc, 0xe6, 0xdc, 0xe6, 0xdb, 0xde, 0xfb, 0xe6, 0xfa, 0xe6, 0xfa, 0xe6, 0xfb, 0xe6, 0x1c, 0xef, 0x1b, 0xe7, 0xba, 0xde, 0x7a, 0xd6, 0xdb, 0xde, 0xdb, 0xde, 0xba, 0xde, 0xda, 0xe6, 0x99, 0xd6, 0xba, 0xde, 0xfb, 0xe6, 0xfb, 0xe6, 0xb9, 0xde, 0xda, 0xde, 0xfa, 0xd6, 0xdb, 0xd6, 0xdb, 0xd6, 0xfc, 0xe6, 0xbb, 0xe6, 0x9b, 0xde, 0x9b, 0xde, 0xbb, 0xde, 0xdc, 0xe6, 0xdc, 0xe6, 0xbc, 0xde, 0xdc, 0xde, 0xbb, 0xde, 0x9b, 0xde, 0xdc, 0xe6, 0xdb, 0xe6, 0xbb, 0xe6, 0xbb, 0xe6, 0xdb, 0xde, 0xdb, 0xd6, 0xda, 0xce, 0xfa, 0xce, 0x1a, 0xd7, 0xfa, 0xe6, 0xba, 0xe6, 0xdb, 0xee, 0xdb, 0xe6, 0xfb, 0xe6, 0xfb, 0xee, 0xfc, 0xee, 0x9b, 0xe6, 0x9b, 0xe6, 0xdd, 0xee, 0xbd, 0xee, 0x5b, 0xde, 0xbb, 0xd6, 0x1c, 0xdf, 0xdb, 0xd6, 0xfc, 0xde, 0xdb, 0xde, 0x1c, 0xe7, 0xdb, 0xde, 0xfc, 0xe6, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xe6, 0xdc, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xda, 0xd6, 0xda, 0xde, 0xba, 0xde, 0x9a, 0xde, 0xbb, 0xe6, 0xdb, 0xee, 0xbb, 0xe6, 0xdb, 0xe6, 0xfc, 0xe6, 0xbb, 0xde, 0xba, 0xde, 0xba, 0xde, 0xbb, 0xde, 0xba, 0xde, 0xba, 0xd6, 0xba, 0xde, 0xba, 0xde, 0x9a, 0xde, 0xba, 0xe6, 0xba, 0xde, 0xbb, 0xd6, 0xdb, 0xde, 0xba, 0xd6, 0x99, 0xde, 0xba, 0xde, 0x9a, 0xde, 0xdb, 0xde, 0x79, 0xce, 0xb9, 0xde, 0x78, 0xd6, 0x9a, 0xde, 0xdb, 0xee, 0xba, 0xde, 0xb9, 0xd6, 0x1b, 0xdf, 0x1c, 0xdf, 0xbb, 0xd6, 0xfd, 0xe6, 0xbc, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xda, 0xde, 0xda, 0xde, 0x99, 0xde, 0xda, 0xe6, 0xba, 0xe6, 0x99, 0xde, 0xbb, 0xe6, 0xbb, 0xde, 0xfc, 0xe6, 0xdb, 0xe6, 0x59, 0xde, 0x9a, 0xe6, 0xdb, 0xe6, 0xda, 0xd6, 0x9a, 0xce, 0x9a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0xdb, 0xe6, 0xbc, 0xe6, 0x9b, 0xde, 0x9b, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xba, 0xde, 0xba, 0xde, 0x79, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0xbb, 0xe6, 0x9a, 0xe6, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xe6, 0x7a, 0xe6, 0x9b, 0xe6, 0xbb, 0xee, 0x9b, 0xee, 0x7a, 0xe6, 0x9b, 0xe6, 0x7a, 0xd6, 0x59, 0xce, 0x59, 0xce, 0x9a, 0xd6, 0xda, 0xde, 0xb9, 0xd6, 0xba, 0xde, 0xba, 0xe6, 0xba, 0xde, 0xbb, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xe6, 0x7a, 0xe6, 0x79, 0xe6, 0x59, 0xde, 0x9a, 0xe6, 0x7a, 0xde, 0x7a, 0xde, 0x5a, 0xde, 0x5a, 0xde, 0x5a, 0xde, 0x5a, 0xd6, 0x5a, 0xde, 0x9b, 0xde, 0xf8, 0xcd, 0x39, 0xd6, 0x5a, 0xd6, 0x39, 0xd6, 0x59, 0xde, 0x39, 0xd6, 0x7a, 0xde, 0x7b, 0xce, 0x9c, 0xce, 0xbb, 0xce, 0xbb, 0xce, 0xbb, 0xce, 0x9a, 0xce, 0x59, 0xde, 0x39, 0xde, 0x59, 0xde, 0x59, 0xde, 0x39, 0xde, 0x3a, 0xd6, 0x39, 0xce, 0x39, 0xce, 0x3a, 0xd6, 0x5a, 0xde, 0x79, 0xd6, 0x78, 0xce, 0x59, 0xce, 0x59, 0xd6, 0x59, 0xd6, 0x38, 0xd6, 0x37, 0xce, 0x37, 0xd6, 0x17, 0xd6, 0xf6, 0xcd, 0xf3, 0xb4, 0x58, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x5b, 0xd6, 0xbc, 0xe6, 0x7b, 0xde, 0x3a, 0xd6, 0x39, 0xd6, 0x5a, 0xde, 0x7a, 0xde, 0x5a, 0xd6, 0x5a, 0xd6, 0x9b, 0xde, 0x3a, 0xd6, 0x7b, 0xde, 0x7a, 0xde, 0x19, 0xd6, 0x19, 0xce, 0x39, 0xd6, 0x39, 0xd6, 0x19, 0xd6, + 0x39, 0x24, 0x39, 0x24, 0x18, 0x24, 0xb7, 0x13, 0xb7, 0x13, 0xd8, 0x1b, 0xf8, 0x1b, 0xf8, 0x1b, 0xd8, 0x1b, 0xd8, 0x1b, 0xb7, 0x13, 0xb7, 0x13, 0xb8, 0x13, 0xd8, 0x1b, 0xd8, 0x1b, 0xd8, 0x1b, 0xd8, 0x23, 0xf7, 0x33, 0x36, 0x54, 0x9d, 0xb6, 0xfb, 0xde, 0x3b, 0xf7, 0x1c, 0xef, 0x3e, 0xe7, 0x7d, 0xb6, 0xd5, 0x4b, 0xf8, 0x3b, 0x5a, 0x3c, 0x39, 0x34, 0x39, 0x34, 0x5a, 0x3c, 0x1a, 0x3c, 0xfa, 0x43, 0x3b, 0x4c, 0x7a, 0x54, 0x1b, 0x6d, 0x9c, 0x85, 0xdc, 0x8d, 0xdc, 0x8d, 0x3a, 0x7d, 0x3a, 0x7d, 0x5b, 0x85, 0x5c, 0x85, 0x5c, 0x85, 0x7c, 0x8d, 0xdc, 0xa5, 0xba, 0xa5, 0xbc, 0xce, 0xda, 0xd6, 0xb9, 0xd6, 0x3c, 0xe7, 0x7f, 0xdf, 0x3c, 0x96, 0x76, 0x44, 0x57, 0x44, 0x78, 0x44, 0xda, 0x54, 0x99, 0x4c, 0x9a, 0x54, 0xfc, 0x5c, 0x3c, 0x6d, 0x7d, 0x7d, 0xdb, 0x6c, 0x7a, 0x6c, 0x9a, 0x6c, 0xba, 0x6c, 0xdb, 0x64, 0xdb, 0x64, 0xdb, 0x6c, 0x1b, 0x75, 0x3b, 0x7d, 0x7b, 0x85, 0xdc, 0x8d, 0xdf, 0xb6, 0xda, 0xa5, 0x9c, 0xce, 0xdc, 0xde, 0x3c, 0xef, 0xfa, 0xde, 0x3c, 0xdf, 0xdd, 0xbe, 0x55, 0x64, 0x16, 0x4c, 0x38, 0x44, 0x38, 0x3c, 0xd6, 0x33, 0xf6, 0x3b, 0x37, 0x4c, 0x98, 0x5c, 0x99, 0x5c, 0xd9, 0x5c, 0xf9, 0x64, 0x19, 0x65, 0x39, 0x6d, 0x7a, 0x7d, 0x9b, 0x85, 0x5e, 0xa6, 0x5e, 0xae, 0x7e, 0xae, 0x3c, 0xae, 0x3b, 0xb6, 0x3a, 0xbe, 0x3a, 0xc6, 0xbd, 0xd6, 0xdd, 0xe6, 0x5b, 0xd6, 0xfc, 0xe6, 0xdb, 0xde, 0x3c, 0xe7, 0xdc, 0xde, 0xfd, 0xd6, 0xff, 0xd6, 0xde, 0xd6, 0xbd, 0xce, 0xbd, 0xd6, 0xdd, 0xde, 0xfd, 0xe6, 0xdc, 0xde, 0xdc, 0xe6, 0xdc, 0xe6, 0xdc, 0xe6, 0xdc, 0xe6, 0xfc, 0xe6, 0xfd, 0xe6, 0xfd, 0xde, 0xdd, 0xd6, 0xdd, 0xd6, 0xdd, 0xd6, 0xfd, 0xd6, 0xdc, 0xce, 0xbb, 0xc6, 0x9a, 0xce, 0xfc, 0xee, 0x9a, 0xe6, 0xba, 0xe6, 0x1c, 0xdf, 0x5e, 0xcf, 0xf9, 0x95, 0x1b, 0x96, 0xdb, 0x8d, 0xda, 0x8d, 0xfb, 0x95, 0x1b, 0x96, 0x1a, 0x9e, 0x5c, 0xae, 0x5c, 0xb6, 0xfb, 0xad, 0x3c, 0xb6, 0x9d, 0xc6, 0x9d, 0xc6, 0x1b, 0xae, 0x3b, 0xb6, 0xba, 0xa5, 0x1b, 0xae, 0x5c, 0xb6, 0x3b, 0xb6, 0x7c, 0xbe, 0x9c, 0xce, 0x7c, 0xce, 0x9b, 0xce, 0xdb, 0xd6, 0xfc, 0xde, 0x9b, 0xde, 0xdc, 0xe6, 0xdc, 0xde, 0x3e, 0xe7, 0x7f, 0xe7, 0x3e, 0xdf, 0x3f, 0xdf, 0x1e, 0xdf, 0x3e, 0xdf, 0x1d, 0xd7, 0xdc, 0xce, 0xfc, 0xde, 0x1c, 0xe7, 0xfc, 0xee, 0xfb, 0xe6, 0x3c, 0xef, 0xfc, 0xde, 0x1c, 0xdf, 0x5c, 0xe7, 0x3c, 0xe7, 0x3d, 0xe7, 0x3d, 0xe7, 0xfb, 0xd6, 0xfb, 0xd6, 0x1a, 0xdf, 0xb9, 0xd6, 0x99, 0xd6, 0xba, 0xde, 0xb9, 0xd6, 0x1b, 0xdf, 0x1d, 0xdf, 0x9c, 0xce, 0x79, 0x9d, 0xda, 0xa5, 0x9c, 0xbe, 0x1d, 0xcf, 0x9a, 0xbe, 0xdc, 0xce, 0x1f, 0xd7, 0x1c, 0xbe, 0x1c, 0xbe, 0x9d, 0xce, 0xbd, 0xd6, 0xdc, 0xde, 0xfb, 0xe6, 0xdb, 0xe6, 0x1d, 0xef, 0x9c, 0xde, 0xbc, 0xde, 0x7b, 0xce, 0xdb, 0xce, 0xfb, 0xd6, 0xbb, 0xde, 0x9b, 0xde, 0x9a, 0xd6, 0xfc, 0xde, 0xfb, 0xd6, 0x9a, 0xce, 0xfc, 0xde, 0xfd, 0xee, 0xbc, 0xe6, 0x9b, 0xde, 0xdb, 0xd6, 0x1c, 0xd7, 0xba, 0xce, 0xba, 0xce, 0x9a, 0xce, 0xdb, 0xd6, 0xfc, 0xde, 0xfb, 0xde, 0xbb, 0xd6, 0xdc, 0xde, 0x9b, 0xd6, 0x9b, 0xd6, 0xfc, 0xde, 0xbb, 0xde, 0x7a, 0xd6, 0xdc, 0xde, 0xbc, 0xd6, 0x5b, 0xce, 0x5a, 0xd6, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xd6, 0xbb, 0xde, 0xdc, 0xe6, 0x9a, 0xd6, 0x9b, 0xd6, 0xdc, 0xde, 0xdd, 0xde, 0x7b, 0xde, 0x5a, 0xde, 0x7b, 0xde, 0x7a, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x9a, 0xde, 0x9b, 0xde, 0x59, 0xd6, 0x59, 0xd6, 0xba, 0xde, 0x99, 0xd6, 0x59, 0xd6, 0x9a, 0xd6, 0x79, 0xd6, 0x39, 0xce, 0x59, 0xd6, 0x7a, 0xd6, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x7a, 0xd6, 0x9b, 0xe6, 0x9b, 0xee, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x79, 0xd6, 0x5a, 0xd6, 0x5a, 0xde, 0x3a, 0xe6, 0x5b, 0xe6, 0x3b, 0xe6, 0x5b, 0xe6, 0x5b, 0xe6, 0x5b, 0xde, 0x3b, 0xde, 0x3b, 0xd6, 0x3b, 0xd6, 0x1a, 0xce, 0xf9, 0xcd, 0x36, 0xad, 0x5b, 0xd6, 0x7b, 0xd6, 0xbc, 0xde, 0x7c, 0xd6, 0x9c, 0xde, 0x9b, 0xd6, 0x7a, 0xd6, 0x7a, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0x7a, 0xce, 0x79, 0xce, 0x9a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x59, 0xce, 0x7a, 0xd6, 0x79, 0xd6, 0x79, 0xd6, + 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x19, 0x0c, 0x18, 0x0c, 0xf8, 0x03, 0xf8, 0x03, 0x19, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x0b, 0x97, 0x13, 0xf2, 0x1a, 0xbe, 0xae, 0x3d, 0xdf, 0xba, 0xde, 0x3e, 0xef, 0x5f, 0xdf, 0xbb, 0x7d, 0x94, 0x13, 0x38, 0x14, 0xf8, 0x03, 0x17, 0x04, 0x38, 0x0c, 0xd7, 0x03, 0xf8, 0x0b, 0x17, 0x04, 0x37, 0x04, 0xf7, 0x03, 0x38, 0x0c, 0x58, 0x14, 0x58, 0x24, 0x59, 0x2c, 0xd7, 0x1b, 0xd8, 0x1b, 0xf8, 0x1b, 0xf8, 0x1b, 0x18, 0x24, 0x38, 0x2c, 0x16, 0x34, 0x15, 0x44, 0xbd, 0xae, 0xfc, 0xce, 0xbb, 0xd6, 0xfe, 0xe6, 0x5f, 0xdf, 0x78, 0x4c, 0x36, 0x0b, 0x99, 0x13, 0x59, 0x13, 0x78, 0x13, 0x58, 0x0b, 0x78, 0x0b, 0x98, 0x0b, 0x77, 0x03, 0xb8, 0x13, 0x56, 0x03, 0x56, 0x03, 0x76, 0x03, 0x97, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x03, 0x56, 0x0b, 0x77, 0x13, 0xb7, 0x1b, 0xd7, 0x23, 0x99, 0x44, 0x16, 0x54, 0x39, 0x95, 0xff, 0xe6, 0x9c, 0xde, 0xfc, 0xde, 0x5e, 0xd7, 0x5d, 0xa6, 0x33, 0x2b, 0x77, 0x13, 0x78, 0x03, 0x9a, 0x03, 0x79, 0x03, 0x98, 0x03, 0x77, 0x0b, 0x57, 0x13, 0x57, 0x13, 0x77, 0x0b, 0x77, 0x0b, 0x76, 0x0b, 0x75, 0x13, 0x96, 0x1b, 0xb7, 0x23, 0xb6, 0x1b, 0xf7, 0x23, 0x38, 0x2c, 0xf6, 0x1b, 0x37, 0x2c, 0x36, 0x3c, 0xf5, 0x43, 0x9a, 0x8d, 0x9e, 0xc6, 0xfe, 0xe6, 0xba, 0xe6, 0xfa, 0xe6, 0x99, 0xce, 0x9c, 0xc6, 0x77, 0x74, 0xda, 0x74, 0xfa, 0x64, 0xb8, 0x5c, 0xb8, 0x5c, 0xf8, 0x74, 0x38, 0x85, 0x79, 0x95, 0x3b, 0xae, 0x1e, 0xcf, 0xdd, 0xce, 0xfe, 0xce, 0xbd, 0xbe, 0x3c, 0xa6, 0xbb, 0x8d, 0x5a, 0x75, 0x19, 0x6d, 0xd9, 0x64, 0xba, 0x64, 0xda, 0x74, 0xd9, 0x74, 0x39, 0x8d, 0x9d, 0xde, 0x9c, 0xe6, 0xbb, 0xe6, 0xdc, 0xd6, 0xfe, 0xb6, 0x15, 0x44, 0xf7, 0x33, 0xb8, 0x23, 0xd8, 0x1b, 0xd8, 0x1b, 0xb7, 0x13, 0xd7, 0x13, 0x18, 0x24, 0xd7, 0x23, 0xf7, 0x2b, 0xf7, 0x2b, 0xfb, 0x4c, 0x38, 0x34, 0xb6, 0x1b, 0xd6, 0x1b, 0xd6, 0x13, 0xb6, 0x13, 0xd6, 0x13, 0xf6, 0x23, 0x38, 0x3c, 0x17, 0x3c, 0xf7, 0x43, 0x77, 0x6c, 0xbb, 0xc6, 0xda, 0xde, 0xdb, 0xde, 0x1d, 0xdf, 0x3e, 0xdf, 0x7c, 0xbe, 0x1c, 0xa6, 0x7a, 0x85, 0x1a, 0x75, 0x3b, 0x7d, 0x5b, 0x7d, 0x3a, 0x75, 0x19, 0x6d, 0xbc, 0x8d, 0x3e, 0xa6, 0xfc, 0xa5, 0x7a, 0x95, 0x3d, 0xae, 0x9b, 0x95, 0x7b, 0x8d, 0x3d, 0xa6, 0xfc, 0xa5, 0x9c, 0x9d, 0xdd, 0xad, 0x7a, 0x9d, 0x5c, 0xbe, 0x7c, 0xc6, 0x7c, 0xd6, 0x5c, 0xd6, 0x7d, 0xe6, 0x7c, 0xde, 0xfd, 0xde, 0x1e, 0xcf, 0xf7, 0x74, 0x33, 0x23, 0xf7, 0x33, 0xb9, 0x3c, 0x3a, 0x55, 0xd8, 0x54, 0xf9, 0x64, 0x5c, 0x75, 0x79, 0x5c, 0x17, 0x44, 0x98, 0x54, 0x38, 0x6d, 0x1b, 0x9e, 0xbe, 0xc6, 0x3c, 0xbe, 0xbf, 0xc6, 0xbb, 0x9d, 0x39, 0x85, 0x38, 0x7d, 0x3b, 0x8e, 0x1a, 0x96, 0xb9, 0xad, 0x1c, 0xce, 0x5c, 0xde, 0x7c, 0xde, 0xbd, 0xd6, 0xdd, 0xd6, 0x3f, 0xdf, 0x3a, 0xb6, 0x98, 0x9d, 0x1b, 0xae, 0xfb, 0xad, 0x7d, 0xbe, 0x5c, 0xbe, 0x7d, 0xc6, 0x7c, 0xc6, 0xbd, 0xce, 0xbd, 0xce, 0xbd, 0xce, 0x7c, 0xc6, 0x5c, 0xc6, 0x7c, 0xc6, 0x9c, 0xce, 0xbd, 0xce, 0xdd, 0xce, 0xdd, 0xce, 0xdd, 0xd6, 0x7c, 0xce, 0x5c, 0xd6, 0x7b, 0xde, 0x7b, 0xe6, 0x59, 0xd6, 0xdb, 0xde, 0x9a, 0xde, 0xbb, 0xde, 0xdb, 0xde, 0xbb, 0xd6, 0x5a, 0xbe, 0x7b, 0xc6, 0xdd, 0xde, 0xbd, 0xde, 0x7b, 0xce, 0xdd, 0xde, 0xbc, 0xde, 0xbc, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0x9c, 0xd6, 0x9c, 0xd6, 0xbc, 0xd6, 0xdd, 0xde, 0x7b, 0xce, 0x9b, 0xd6, 0x5a, 0xc6, 0xbc, 0xd6, 0xbc, 0xd6, 0x1a, 0xc6, 0x5b, 0xce, 0x5b, 0xce, 0x5a, 0xd6, 0x59, 0xd6, 0x9b, 0xde, 0x9b, 0xd6, 0x7b, 0xce, 0x5b, 0xc6, 0x3c, 0xce, 0x3c, 0xce, 0x9c, 0xce, 0x9c, 0xce, 0xbc, 0xce, 0xbc, 0xce, 0xbb, 0xce, 0x9b, 0xce, 0x7b, 0xd6, 0x5b, 0xd6, 0x7b, 0xd6, 0x5a, 0xc6, 0x59, 0xc6, 0x7a, 0xc6, 0x9b, 0xc6, 0x7b, 0xc6, 0x3b, 0xbe, 0xda, 0xb5, 0xb8, 0xad, 0xd8, 0xb5, 0x79, 0xc6, 0xb9, 0xd6, 0xda, 0xde, 0x78, 0xd6, 0xba, 0xe6, 0x59, 0xde, 0x5a, 0xde, 0x5a, 0xd6, 0x5a, 0xd6, 0x5a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x5a, 0xce, 0x5a, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x5a, 0xd6, + 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x19, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x0b, 0x1a, 0x0c, 0xf9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x33, 0x1b, 0x1d, 0x9e, 0xfc, 0xd6, 0xdb, 0xe6, 0xfb, 0xde, 0x9f, 0xdf, 0xb8, 0x4c, 0x18, 0x1c, 0x38, 0x14, 0x19, 0x0c, 0x19, 0x04, 0x5a, 0x0c, 0xf9, 0x0b, 0xf8, 0x0b, 0x5a, 0x1c, 0xbb, 0x2c, 0xbc, 0x34, 0x39, 0x24, 0xd8, 0x13, 0xd8, 0x13, 0xd8, 0x0b, 0xb8, 0x0b, 0xf9, 0x0b, 0xd8, 0x0b, 0x19, 0x0c, 0xf9, 0x0b, 0xd9, 0x0b, 0xb8, 0x13, 0x54, 0x1b, 0x7a, 0x7d, 0x9b, 0xc6, 0xdb, 0xde, 0x1d, 0xe7, 0x7f, 0xd7, 0xd5, 0x2b, 0xf9, 0x13, 0xd8, 0x0b, 0xd8, 0x0b, 0xb8, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0xd8, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x97, 0x0b, 0x97, 0x0b, 0x76, 0x13, 0xf6, 0x43, 0xdd, 0xce, 0x9a, 0xde, 0xfb, 0xe6, 0x1e, 0xcf, 0x1d, 0x8e, 0x75, 0x1b, 0xb6, 0x0b, 0xb7, 0x0b, 0x97, 0x03, 0x77, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x77, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0x96, 0x03, 0xb7, 0x0b, 0xf8, 0x13, 0xf8, 0x13, 0x97, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x97, 0x03, 0x77, 0x0b, 0x56, 0x0b, 0x35, 0x13, 0x58, 0x54, 0x1b, 0xb6, 0xbb, 0xde, 0xdb, 0xe6, 0xbb, 0xd6, 0xde, 0xc6, 0x57, 0x5c, 0xb4, 0x12, 0xd7, 0x0a, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd6, 0x02, 0xf7, 0x02, 0x17, 0x0b, 0x17, 0x0b, 0x18, 0x0b, 0xf7, 0x0a, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x0a, 0xd6, 0x0a, 0x72, 0x12, 0x9d, 0xbe, 0xfc, 0xe6, 0xdb, 0xde, 0x5e, 0xd7, 0xbb, 0x7d, 0x75, 0x13, 0xb7, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x77, 0x03, 0x97, 0x03, 0x97, 0x03, 0x97, 0x03, 0x97, 0x03, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x0b, 0xb7, 0x0b, 0x97, 0x03, 0x76, 0x03, 0x56, 0x03, 0x36, 0x03, 0x15, 0x03, 0xd2, 0x1a, 0x7c, 0xbe, 0xbb, 0xde, 0xdb, 0xe6, 0xfd, 0xd6, 0xde, 0x8d, 0x53, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x75, 0x0a, 0x53, 0x12, 0xf6, 0x5b, 0x9c, 0xce, 0xba, 0xde, 0x9a, 0xde, 0xfd, 0xd6, 0x1f, 0xbf, 0xb4, 0x33, 0x55, 0x13, 0x36, 0x03, 0x98, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x37, 0x03, 0x58, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x37, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x17, 0x03, 0x36, 0x03, 0x57, 0x03, 0x77, 0x03, 0x56, 0x03, 0x36, 0x03, 0x15, 0x03, 0x15, 0x13, 0x95, 0x3b, 0x79, 0x9d, 0x7b, 0xce, 0xdb, 0xde, 0x1d, 0xd7, 0xbf, 0x9e, 0x55, 0x1b, 0x56, 0x13, 0x57, 0x03, 0x56, 0x03, 0x56, 0x03, 0x56, 0x03, 0x15, 0x03, 0x16, 0x03, 0xd8, 0x1b, 0x19, 0x24, 0x77, 0x0b, 0x36, 0x03, 0xb8, 0x13, 0x97, 0x0b, 0x35, 0x03, 0xb7, 0x13, 0xd8, 0x1b, 0x36, 0x0b, 0x15, 0x03, 0x55, 0x0b, 0x54, 0x1b, 0xf2, 0x22, 0x9b, 0x95, 0x5b, 0xd6, 0x9b, 0xe6, 0xfd, 0xde, 0xbe, 0xbe, 0x78, 0x4c, 0x96, 0x1b, 0x15, 0x0b, 0x76, 0x13, 0xb7, 0x23, 0x96, 0x1b, 0xb6, 0x1b, 0x17, 0x2c, 0xf6, 0x33, 0x3a, 0x6d, 0x1e, 0x8e, 0xdd, 0x85, 0xda, 0x5c, 0x9d, 0x75, 0xbe, 0x75, 0x17, 0x34, 0xb6, 0x1b, 0xb6, 0x13, 0xb6, 0x1b, 0x75, 0x13, 0xd7, 0x1b, 0x14, 0x1b, 0x52, 0x3b, 0x3c, 0xb6, 0x3a, 0xce, 0x5b, 0xd6, 0xff, 0xce, 0xd9, 0x74, 0x99, 0x4c, 0x55, 0x1b, 0x55, 0x13, 0xf4, 0x02, 0x75, 0x1b, 0x96, 0x23, 0xd7, 0x33, 0x17, 0x3c, 0x38, 0x3c, 0x38, 0x3c, 0x58, 0x3c, 0x79, 0x3c, 0x76, 0x0b, 0x36, 0x03, 0x15, 0x03, 0xf5, 0x02, 0x15, 0x0b, 0x36, 0x0b, 0x16, 0x03, 0xf5, 0x02, 0x15, 0x03, 0xd1, 0x1a, 0x76, 0x9d, 0xba, 0xde, 0xfc, 0xd6, 0xbc, 0xce, 0x9b, 0xce, 0x9b, 0xce, 0x9b, 0xce, 0x7b, 0xce, 0x5b, 0xc6, 0x5b, 0xce, 0x7b, 0xce, 0x7b, 0xce, 0x7b, 0xce, 0x7b, 0xce, 0x7b, 0xd6, 0x7b, 0xd6, 0x9c, 0xd6, 0x9c, 0xd6, 0x7b, 0xce, 0x3b, 0xc6, 0x3b, 0xc6, 0x5b, 0xc6, + 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x33, 0x1b, 0x1c, 0x96, 0xfc, 0xd6, 0xfb, 0xee, 0x1b, 0xe7, 0xbf, 0xdf, 0x57, 0x3c, 0xd7, 0x13, 0x18, 0x0c, 0x18, 0x0c, 0xd8, 0x03, 0x19, 0x04, 0xd9, 0x03, 0xf9, 0x0b, 0xd8, 0x0b, 0x19, 0x14, 0x5b, 0x24, 0x5a, 0x24, 0x3a, 0x1c, 0x5a, 0x1c, 0x3a, 0x1c, 0x3b, 0x14, 0xd9, 0x0b, 0xb8, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0x98, 0x13, 0x34, 0x1b, 0x7a, 0x7d, 0xbc, 0xce, 0xfb, 0xe6, 0x1d, 0xe7, 0x3f, 0xcf, 0x95, 0x23, 0xd8, 0x13, 0xd8, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x97, 0x03, 0x77, 0x03, 0x77, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x56, 0x13, 0xd5, 0x43, 0xbd, 0xce, 0x9a, 0xde, 0xfb, 0xe6, 0x1e, 0xcf, 0x3a, 0x75, 0x96, 0x23, 0xb7, 0x13, 0x97, 0x0b, 0x77, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x37, 0x03, 0x98, 0x0b, 0x1a, 0x14, 0x7b, 0x24, 0x5a, 0x1c, 0x19, 0x14, 0xd8, 0x13, 0xb8, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x97, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x56, 0x0b, 0x15, 0x13, 0x17, 0x4c, 0x1b, 0xb6, 0xbb, 0xde, 0x59, 0xd6, 0xfc, 0xde, 0x1f, 0xcf, 0xd9, 0x6c, 0x16, 0x1b, 0x17, 0x0b, 0x58, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0x18, 0x03, 0x38, 0x0b, 0x18, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x38, 0x0b, 0x38, 0x0b, 0xf8, 0x02, 0x18, 0x0b, 0xf7, 0x0a, 0xf6, 0x0a, 0x72, 0x12, 0x5c, 0xb6, 0xdc, 0xde, 0xba, 0xde, 0x1d, 0xd7, 0x9b, 0x7d, 0x95, 0x1b, 0xb7, 0x0b, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0xf3, 0x1a, 0x9d, 0xbe, 0x7a, 0xd6, 0xda, 0xde, 0x3e, 0xdf, 0x1b, 0x75, 0x74, 0x02, 0x95, 0x02, 0xd8, 0x0a, 0x18, 0x13, 0xf8, 0x12, 0xf8, 0x12, 0x18, 0x13, 0x39, 0x0b, 0x19, 0x0b, 0xf8, 0x0a, 0xd8, 0x0a, 0x18, 0x0b, 0x19, 0x0b, 0xf8, 0x0a, 0xf8, 0x0a, 0x17, 0x0b, 0xf7, 0x0a, 0xf7, 0x0a, 0xf8, 0x0a, 0x96, 0x02, 0x75, 0x0a, 0x53, 0x12, 0xb5, 0x53, 0x7c, 0xc6, 0xba, 0xde, 0xba, 0xde, 0xfd, 0xd6, 0x5f, 0xc7, 0xd5, 0x33, 0x96, 0x13, 0x77, 0x0b, 0xb8, 0x13, 0x98, 0x13, 0xb9, 0x13, 0xb9, 0x13, 0x58, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x98, 0x13, 0xb8, 0x13, 0x98, 0x0b, 0x97, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x36, 0x0b, 0xf4, 0x12, 0x34, 0x33, 0x18, 0x95, 0x3a, 0xce, 0x9a, 0xd6, 0x1d, 0xd7, 0xfd, 0x8d, 0x34, 0x13, 0x56, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x37, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x36, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x36, 0x03, 0x77, 0x0b, 0x78, 0x13, 0x16, 0x03, 0x36, 0x03, 0x35, 0x03, 0x34, 0x13, 0xf3, 0x1a, 0x19, 0x85, 0x5b, 0xce, 0x9b, 0xde, 0xbc, 0xce, 0xdb, 0x9d, 0x13, 0x1b, 0x35, 0x0b, 0x15, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x35, 0x0b, 0x35, 0x03, 0x55, 0x0b, 0x14, 0x0b, 0x34, 0x13, 0x96, 0x23, 0xb7, 0x2b, 0xf4, 0x12, 0x15, 0x1b, 0x97, 0x23, 0x15, 0x0b, 0x36, 0x03, 0x35, 0x03, 0x55, 0x0b, 0x14, 0x03, 0x56, 0x0b, 0xd3, 0x12, 0xd1, 0x2a, 0xdb, 0xad, 0x5a, 0xce, 0xbb, 0xd6, 0xde, 0xbe, 0xf5, 0x4b, 0x95, 0x2b, 0x35, 0x0b, 0x76, 0x0b, 0x35, 0x03, 0x15, 0x03, 0xf5, 0x0a, 0x14, 0x0b, 0xf4, 0x0a, 0x15, 0x0b, 0x15, 0x0b, 0x15, 0x0b, 0x15, 0x13, 0x14, 0x13, 0xf4, 0x12, 0xd3, 0x0a, 0xd3, 0x12, 0xf3, 0x12, 0x14, 0x13, 0x15, 0x0b, 0xf5, 0x0a, 0xf5, 0x02, 0x91, 0x0a, 0x9a, 0x9d, 0xbd, 0xc6, 0xbb, 0x8d, 0x94, 0x3b, 0x13, 0x2b, 0xf3, 0x1a, 0xf5, 0x0a, 0xf5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd4, 0x02, 0xd5, 0x0a, 0xd5, 0x0a, 0xd4, 0x0a, 0xd5, 0x0a, 0xf5, 0x0a, 0x16, 0x13, 0x36, 0x13, 0x36, 0x0b, 0xf5, 0x0a, 0xd5, 0x02, 0xf5, 0x02, + 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x33, 0x1b, 0xfc, 0x95, 0xfc, 0xd6, 0xfb, 0xee, 0x3c, 0xe7, 0xbf, 0xdf, 0x36, 0x3c, 0xd7, 0x13, 0x18, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x97, 0x13, 0x34, 0x13, 0x7a, 0x7d, 0xbc, 0xce, 0xfc, 0xe6, 0xfc, 0xe6, 0x1f, 0xcf, 0x95, 0x23, 0xf9, 0x13, 0xd9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x35, 0x13, 0xd5, 0x3b, 0x9d, 0xce, 0x9a, 0xde, 0xdb, 0xde, 0xfd, 0xce, 0x3b, 0x75, 0xf8, 0x33, 0x97, 0x13, 0x77, 0x0b, 0x78, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x59, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x56, 0x0b, 0x15, 0x13, 0xf7, 0x43, 0xda, 0xad, 0xbb, 0xde, 0xfc, 0xe6, 0xdc, 0xd6, 0x1f, 0xcf, 0x74, 0x3b, 0xd5, 0x12, 0xf8, 0x0a, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf7, 0x02, 0x18, 0x03, 0x59, 0x0b, 0x59, 0x13, 0x59, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x19, 0x0b, 0x39, 0x0b, 0x18, 0x03, 0xd8, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0xf7, 0x0a, 0x52, 0x12, 0xfc, 0xad, 0xbc, 0xde, 0xdb, 0xde, 0xfd, 0xd6, 0x5a, 0x75, 0x75, 0x13, 0x97, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0xf4, 0x1a, 0x5c, 0xb6, 0x7a, 0xd6, 0xdb, 0xde, 0x3e, 0xd7, 0x37, 0x54, 0xb5, 0x0a, 0xb6, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x76, 0x02, 0x77, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x02, 0x96, 0x0a, 0x53, 0x12, 0x54, 0x4b, 0x5b, 0xc6, 0x9a, 0xde, 0xdb, 0xe6, 0xfd, 0xd6, 0x5f, 0xc7, 0x74, 0x2b, 0x56, 0x13, 0x57, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x16, 0x0b, 0xd4, 0x12, 0x34, 0x3b, 0xf8, 0x94, 0x9c, 0xde, 0x59, 0xd6, 0xdd, 0xce, 0xb8, 0x5c, 0x75, 0x1b, 0x77, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x37, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x58, 0x0b, 0xb9, 0x13, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x17, 0x03, 0x58, 0x0b, 0x36, 0x03, 0xf5, 0x02, 0xf3, 0x1a, 0x98, 0x6c, 0x7c, 0xc6, 0x9b, 0xd6, 0xdd, 0xce, 0x3c, 0x9e, 0x13, 0x13, 0x76, 0x0b, 0x97, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x36, 0x03, 0x37, 0x0b, 0x78, 0x13, 0xf5, 0x02, 0xf6, 0x02, 0x57, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x56, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0xf4, 0x12, 0xb0, 0x2a, 0xfb, 0xad, 0x7a, 0xc6, 0xdc, 0xce, 0xde, 0xb6, 0xf4, 0x3b, 0x74, 0x1b, 0x55, 0x03, 0x97, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x16, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0x15, 0x03, 0x15, 0x0b, 0x15, 0x0b, 0x35, 0x0b, 0x35, 0x0b, 0x15, 0x13, 0xd3, 0x1a, 0x38, 0x8d, 0x9e, 0xbe, 0x98, 0x5c, 0xd4, 0x12, 0xf5, 0x0a, 0x36, 0x0b, 0x15, 0x0b, 0x15, 0x0b, 0xf5, 0x0a, 0xf5, 0x0a, 0xf5, 0x0a, 0xf5, 0x0a, 0xf5, 0x0a, 0xd5, 0x0a, 0xd4, 0x0a, 0xd5, 0x0a, 0xf5, 0x0a, 0x16, 0x13, 0x16, 0x0b, 0xf6, 0x0a, 0xf5, 0x02, 0x16, 0x0b, + 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x54, 0x1b, 0xdc, 0x8d, 0xdc, 0xd6, 0xfb, 0xe6, 0x1c, 0xe7, 0x9f, 0xd7, 0x37, 0x34, 0xf8, 0x13, 0xf8, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x1a, 0x0c, 0xfa, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xf9, 0x0b, 0xd9, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0x97, 0x13, 0x34, 0x1b, 0x7b, 0x85, 0xbc, 0xce, 0xfc, 0xe6, 0x1d, 0xe7, 0x3f, 0xcf, 0x95, 0x23, 0x19, 0x14, 0xf9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x98, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0x35, 0x0b, 0xd5, 0x3b, 0x7c, 0xc6, 0x7a, 0xde, 0xdb, 0xde, 0x1e, 0xcf, 0x3b, 0x75, 0x5a, 0x34, 0x97, 0x0b, 0x97, 0x03, 0xb8, 0x03, 0x99, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x15, 0x13, 0xf7, 0x4b, 0xfb, 0xad, 0xbc, 0xde, 0xba, 0xd6, 0xdc, 0xd6, 0x1f, 0xc7, 0x74, 0x3b, 0xf5, 0x12, 0x18, 0x03, 0xd7, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0x18, 0x0b, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0x52, 0x12, 0xbb, 0xa5, 0x9c, 0xd6, 0xdc, 0xe6, 0x1e, 0xd7, 0x3a, 0x6d, 0x55, 0x13, 0x97, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x99, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x79, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x37, 0x03, 0xf3, 0x1a, 0x1b, 0xae, 0x9b, 0xd6, 0xfb, 0xde, 0x3e, 0xd7, 0xf7, 0x4b, 0xb5, 0x0a, 0xd7, 0x0a, 0x97, 0x02, 0xb7, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0xb7, 0x02, 0xb8, 0x02, 0x97, 0x0a, 0x98, 0x0a, 0x97, 0x02, 0x98, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x76, 0x0a, 0x53, 0x12, 0x54, 0x4b, 0x5c, 0xc6, 0x9a, 0xde, 0xfc, 0xe6, 0x1e, 0xd7, 0x5f, 0xbf, 0x53, 0x23, 0x56, 0x13, 0x78, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x38, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x77, 0x03, 0x57, 0x0b, 0xf6, 0x0a, 0x16, 0x1b, 0xb6, 0x4b, 0x7a, 0xa5, 0x3a, 0xd6, 0xbb, 0xde, 0x1e, 0xd7, 0xfc, 0x85, 0x55, 0x13, 0x97, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x15, 0x0b, 0xf4, 0x1a, 0x37, 0x5c, 0x5c, 0xc6, 0xdc, 0xde, 0xfd, 0xce, 0x9a, 0x85, 0x74, 0x1b, 0x76, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x37, 0x03, 0x57, 0x03, 0x58, 0x03, 0x37, 0x03, 0x78, 0x03, 0x58, 0x03, 0x77, 0x0b, 0x56, 0x0b, 0x36, 0x0b, 0x35, 0x1b, 0x90, 0x22, 0x1c, 0xae, 0x5a, 0xc6, 0xbc, 0xce, 0xde, 0xb6, 0x36, 0x4c, 0xb6, 0x23, 0x76, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x39, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x03, 0x36, 0x03, 0x15, 0x0b, 0xb2, 0x22, 0x59, 0x9d, 0x9d, 0xce, 0x5a, 0x7d, 0xb2, 0x12, 0xf4, 0x0a, 0xb4, 0x02, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0xd9, 0x03, 0xf9, 0x03, 0x1a, 0x0c, 0xfa, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb7, 0x0b, 0x54, 0x1b, 0xdb, 0x8d, 0xdc, 0xd6, 0xdb, 0xe6, 0x1c, 0xe7, 0x7f, 0xd7, 0x16, 0x34, 0xf8, 0x13, 0xf8, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd9, 0x0b, 0x77, 0x13, 0x33, 0x13, 0xbb, 0x85, 0xdc, 0xce, 0xfc, 0xe6, 0x1d, 0xe7, 0x1f, 0xcf, 0x75, 0x23, 0xd9, 0x13, 0xb8, 0x0b, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x35, 0x13, 0xd6, 0x43, 0x7c, 0xc6, 0x7a, 0xde, 0xbb, 0xde, 0x1e, 0xcf, 0x77, 0x44, 0x59, 0x2c, 0x18, 0x0c, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x79, 0x03, 0x78, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x35, 0x13, 0xf7, 0x43, 0x1b, 0xae, 0xbb, 0xde, 0x79, 0xce, 0xdc, 0xd6, 0x5f, 0xcf, 0x95, 0x3b, 0x36, 0x13, 0xf8, 0x02, 0x18, 0x0b, 0xd8, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0x52, 0x12, 0x9a, 0x9d, 0x7b, 0xd6, 0xbb, 0xde, 0xfd, 0xce, 0x7a, 0x75, 0x76, 0x1b, 0x97, 0x0b, 0x77, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x79, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x57, 0x03, 0xf3, 0x12, 0x1b, 0xae, 0x9b, 0xd6, 0xdb, 0xde, 0x5f, 0xdf, 0x99, 0x5c, 0x74, 0x02, 0xd7, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x98, 0x0a, 0x78, 0x0a, 0x77, 0x02, 0x77, 0x0a, 0x78, 0x0a, 0x78, 0x0a, 0x97, 0x0a, 0x97, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x56, 0x02, 0x33, 0x12, 0x54, 0x4b, 0x7c, 0xc6, 0x9a, 0xd6, 0xfc, 0xe6, 0x1e, 0xdf, 0x3f, 0xbf, 0x33, 0x23, 0x76, 0x13, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x77, 0x0b, 0x37, 0x0b, 0xf5, 0x0a, 0xf5, 0x1a, 0xb6, 0x53, 0x59, 0xa5, 0x1a, 0xce, 0xbb, 0xde, 0xfd, 0xce, 0x1d, 0x86, 0x55, 0x13, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x77, 0x0b, 0xf5, 0x0a, 0xf4, 0x1a, 0xf9, 0x74, 0x3b, 0xc6, 0x39, 0xc6, 0x1d, 0xd7, 0x5f, 0xbf, 0x94, 0x1b, 0x76, 0x03, 0x57, 0x03, 0x98, 0x0b, 0x99, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0x16, 0x03, 0x35, 0x13, 0x90, 0x1a, 0xfb, 0xa5, 0x7b, 0xc6, 0x9c, 0xce, 0x9e, 0xb6, 0xf6, 0x43, 0x96, 0x23, 0x57, 0x0b, 0x36, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x37, 0x0b, 0x57, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x76, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0x36, 0x0b, 0xb2, 0x12, 0x39, 0x8d, 0x9e, 0xc6, 0xfe, 0x95, 0xf3, 0x12, 0x35, 0x0b, 0x56, 0x0b, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x0b, 0x16, 0x0b, 0xf6, 0x0a, 0xf6, 0x02, 0x16, 0x0b, 0xf6, 0x0a, 0xf6, 0x02, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x0b, + 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x97, 0x0b, 0x54, 0x1b, 0xdc, 0x8d, 0xfd, 0xd6, 0xfb, 0xe6, 0x1c, 0xe7, 0x7f, 0xd7, 0xd5, 0x2b, 0xf8, 0x13, 0x19, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0xda, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x0b, 0xd9, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xb9, 0x0b, 0x76, 0x13, 0x13, 0x1b, 0xdb, 0x8d, 0xdc, 0xce, 0xfc, 0xe6, 0xfd, 0xe6, 0x1f, 0xcf, 0x75, 0x1b, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x77, 0x0b, 0x36, 0x13, 0xf6, 0x4b, 0x7c, 0xce, 0x7a, 0xde, 0xba, 0xde, 0x3e, 0xcf, 0x56, 0x44, 0xf7, 0x13, 0xf7, 0x0b, 0xd7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x99, 0x0b, 0x99, 0x13, 0x59, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x15, 0x13, 0xf7, 0x43, 0xfa, 0xad, 0x9b, 0xd6, 0xdb, 0xde, 0xbc, 0xd6, 0x7f, 0xd7, 0x13, 0x2b, 0xf6, 0x12, 0xd7, 0x02, 0xdc, 0x23, 0x39, 0x13, 0xb7, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd6, 0x0a, 0x73, 0x12, 0x9a, 0x9d, 0x7b, 0xd6, 0xbb, 0xde, 0xfd, 0xce, 0x9b, 0x7d, 0x96, 0x1b, 0x97, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x79, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x57, 0x0b, 0x37, 0x03, 0xf3, 0x12, 0xda, 0xa5, 0xbb, 0xd6, 0xdb, 0xde, 0x1e, 0xd7, 0xba, 0x5c, 0x74, 0x02, 0xd7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0xb7, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x98, 0x0a, 0x77, 0x02, 0x77, 0x0a, 0x78, 0x0a, 0x78, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x56, 0x0a, 0x33, 0x12, 0x75, 0x4b, 0x7c, 0xc6, 0x9a, 0xd6, 0xfc, 0xde, 0x3e, 0xdf, 0x3f, 0xbf, 0x33, 0x23, 0x97, 0x13, 0x78, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x37, 0x03, 0xf6, 0x02, 0xf5, 0x12, 0x75, 0x43, 0x18, 0x95, 0x9c, 0xd6, 0x9b, 0xd6, 0x9c, 0xbe, 0x77, 0x54, 0x76, 0x13, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x16, 0x03, 0x36, 0x13, 0x14, 0x23, 0xd9, 0x74, 0x3b, 0xc6, 0xbb, 0xd6, 0xbc, 0xc6, 0xf7, 0x74, 0x33, 0x13, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x36, 0x03, 0x77, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x35, 0x13, 0xb0, 0x1a, 0x1c, 0xa6, 0x5b, 0xc6, 0x9c, 0xce, 0x9e, 0xb6, 0x74, 0x33, 0x55, 0x1b, 0x57, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x56, 0x0b, 0x36, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x37, 0x0b, 0x57, 0x0b, 0x36, 0x13, 0x35, 0x13, 0x35, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0xf6, 0x02, 0xf3, 0x1a, 0x18, 0x8d, 0x9d, 0xbe, 0x9c, 0x85, 0x14, 0x1b, 0xd4, 0x02, 0xf5, 0x02, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0x17, 0x03, 0xf7, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0xfa, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0x97, 0x0b, 0x54, 0x1b, 0xdc, 0x8d, 0x1d, 0xdf, 0xfb, 0xe6, 0x3d, 0xe7, 0x7f, 0xd7, 0xb5, 0x23, 0x18, 0x14, 0xf8, 0x0b, 0xf8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0x1a, 0x0c, 0xfa, 0x0b, 0xfa, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0x56, 0x13, 0x13, 0x1b, 0xfc, 0x95, 0xbc, 0xce, 0xfb, 0xe6, 0xfc, 0xe6, 0x3f, 0xcf, 0x75, 0x23, 0xb8, 0x0b, 0xb8, 0x03, 0xd9, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x77, 0x0b, 0x36, 0x13, 0x17, 0x4c, 0x7d, 0xce, 0x7a, 0xde, 0xba, 0xde, 0x1e, 0xcf, 0xb9, 0x54, 0x96, 0x13, 0xb7, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x59, 0x03, 0x79, 0x03, 0x98, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x56, 0x0b, 0x15, 0x13, 0xf7, 0x4b, 0xfa, 0xad, 0xbb, 0xde, 0x79, 0xd6, 0xfc, 0xde, 0x3f, 0xcf, 0x95, 0x3b, 0xf6, 0x12, 0xf8, 0x02, 0x18, 0x0b, 0xd7, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0x73, 0x12, 0x9b, 0xa5, 0x7b, 0xd6, 0x9b, 0xde, 0xfe, 0xd6, 0x5a, 0x75, 0x96, 0x1b, 0x97, 0x0b, 0x57, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x37, 0x03, 0xf4, 0x12, 0xba, 0x9d, 0xbb, 0xd6, 0xdb, 0xde, 0xdd, 0xce, 0x17, 0x4c, 0xb5, 0x0a, 0xd7, 0x0a, 0x76, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0xb7, 0x02, 0xb8, 0x02, 0x98, 0x0a, 0x98, 0x0a, 0x97, 0x0a, 0x78, 0x0a, 0x78, 0x0a, 0x78, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x97, 0x0a, 0x54, 0x12, 0x75, 0x4b, 0x5b, 0xc6, 0xdb, 0xde, 0xfb, 0xde, 0x1d, 0xd7, 0x1f, 0xb7, 0x53, 0x23, 0xb7, 0x1b, 0x78, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x37, 0x0b, 0x15, 0x13, 0x75, 0x3b, 0x59, 0x9d, 0x5b, 0xce, 0xbb, 0xd6, 0x1e, 0xcf, 0x77, 0x4c, 0x55, 0x0b, 0xb8, 0x0b, 0x79, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x36, 0x03, 0x35, 0x13, 0xf3, 0x1a, 0xd9, 0x74, 0x3b, 0xc6, 0x9b, 0xd6, 0xdd, 0xce, 0xb7, 0x6c, 0x54, 0x13, 0x77, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x78, 0x13, 0x16, 0x03, 0x57, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x38, 0x03, 0x58, 0x03, 0x16, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0xf4, 0x12, 0xd1, 0x22, 0xfb, 0xa5, 0x5b, 0xc6, 0xbc, 0xce, 0xbe, 0xb6, 0x53, 0x2b, 0x55, 0x13, 0x77, 0x0b, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x0b, 0xf3, 0x1a, 0x79, 0x95, 0x1b, 0xb6, 0x1a, 0x75, 0xd3, 0x1a, 0x15, 0x13, 0xd5, 0x02, 0x16, 0x0b, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf6, 0x0a, 0xf5, 0x0a, 0xf5, 0x0a, 0xf5, 0x0a, + 0x1a, 0x0c, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0x97, 0x0b, 0x54, 0x1b, 0xdc, 0x8d, 0x1d, 0xdf, 0xdb, 0xe6, 0x1c, 0xe7, 0x7f, 0xd7, 0xd5, 0x2b, 0x18, 0x14, 0xd8, 0x03, 0xd8, 0x03, 0x19, 0x04, 0x1a, 0x04, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x0b, 0x57, 0x13, 0x14, 0x1b, 0x1d, 0x96, 0xbc, 0xce, 0xfb, 0xe6, 0x1d, 0xe7, 0x5f, 0xd7, 0x95, 0x23, 0x97, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x98, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x0b, 0x35, 0x0b, 0x16, 0x4c, 0x9d, 0xce, 0x9a, 0xde, 0xba, 0xde, 0xfe, 0xd6, 0x99, 0x5c, 0x77, 0x1b, 0x19, 0x24, 0x98, 0x0b, 0x78, 0x03, 0x79, 0x03, 0x9a, 0x0b, 0x9a, 0x0b, 0xba, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x9a, 0x0b, 0x79, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x56, 0x0b, 0x15, 0x13, 0x17, 0x4c, 0x1b, 0xb6, 0xbb, 0xde, 0xba, 0xde, 0x9b, 0xd6, 0x3f, 0xcf, 0x33, 0x33, 0xf6, 0x12, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x72, 0x12, 0x9a, 0xa5, 0x5b, 0xd6, 0x7a, 0xd6, 0xfd, 0xd6, 0x3a, 0x6d, 0x76, 0x1b, 0x97, 0x0b, 0x57, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x03, 0x58, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0xf4, 0x1a, 0xfb, 0xa5, 0x9a, 0xd6, 0x9a, 0xd6, 0xfe, 0xce, 0xb6, 0x43, 0xb5, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x0a, 0x98, 0x0a, 0x98, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x98, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb8, 0x0a, 0xb8, 0x0a, 0x98, 0x02, 0xb7, 0x12, 0x74, 0x1a, 0x75, 0x4b, 0x3b, 0xbe, 0xdb, 0xde, 0xdb, 0xde, 0xfd, 0xce, 0xbe, 0xae, 0x12, 0x1b, 0x97, 0x13, 0x78, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x16, 0x03, 0xf5, 0x0a, 0x75, 0x33, 0x59, 0x95, 0x5b, 0xc6, 0x7a, 0xce, 0x3e, 0xcf, 0x94, 0x33, 0xb7, 0x1b, 0xfa, 0x13, 0x79, 0x03, 0x79, 0x03, 0x58, 0x03, 0x58, 0x03, 0x59, 0x03, 0x38, 0x03, 0x79, 0x0b, 0x99, 0x13, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x57, 0x0b, 0x15, 0x0b, 0xb2, 0x12, 0xb9, 0x6c, 0x3c, 0xc6, 0x5b, 0xce, 0xfe, 0xce, 0xd8, 0x6c, 0x35, 0x13, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x77, 0x03, 0x78, 0x03, 0x58, 0x03, 0x18, 0x03, 0x58, 0x0b, 0x17, 0x03, 0x58, 0x03, 0x38, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x59, 0x0b, 0x37, 0x0b, 0x36, 0x13, 0x37, 0x0b, 0xf4, 0x12, 0xf1, 0x2a, 0x1b, 0xa6, 0x7b, 0xc6, 0xbc, 0xc6, 0xbe, 0xae, 0x53, 0x23, 0x95, 0x13, 0x77, 0x03, 0x77, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0x16, 0x0b, 0xf5, 0x0a, 0xd2, 0x1a, 0x38, 0x8d, 0xbd, 0xbe, 0xd9, 0x64, 0x15, 0x1b, 0xf6, 0x0a, 0x17, 0x03, 0x17, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0xf9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xb8, 0x13, 0x75, 0x23, 0x7b, 0x85, 0x1e, 0xd7, 0xfc, 0xde, 0x3d, 0xe7, 0x9f, 0xd7, 0xf6, 0x2b, 0x19, 0x14, 0x19, 0x04, 0xf9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x56, 0x13, 0xd1, 0x1a, 0x5d, 0xae, 0xbb, 0xce, 0xba, 0xde, 0x3c, 0xe7, 0x5f, 0xd7, 0xb5, 0x2b, 0x1a, 0x1c, 0x3a, 0x14, 0xb9, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x17, 0x03, 0x15, 0x13, 0xf6, 0x4b, 0x9c, 0xc6, 0x7a, 0xd6, 0xbb, 0xde, 0x1e, 0xcf, 0x3f, 0x7e, 0x77, 0x0b, 0x97, 0x0b, 0x98, 0x0b, 0x58, 0x03, 0x99, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x14, 0x13, 0xf6, 0x53, 0xfa, 0xb5, 0x9b, 0xd6, 0x9a, 0xd6, 0xfd, 0xd6, 0xff, 0xbe, 0xf3, 0x22, 0x16, 0x13, 0xd8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xb7, 0x0a, 0x76, 0x02, 0x53, 0x12, 0xbb, 0xa5, 0x7b, 0xd6, 0xdb, 0xe6, 0x1d, 0xd7, 0x3a, 0x75, 0x35, 0x13, 0x77, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x03, 0xd3, 0x12, 0x1b, 0xae, 0x5a, 0xd6, 0xdd, 0xe6, 0x1f, 0xd7, 0xf5, 0x22, 0xf7, 0x02, 0xd7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x98, 0x02, 0xb8, 0x0a, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x99, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0x97, 0x0a, 0x96, 0x1a, 0xf4, 0x3a, 0x7c, 0xc6, 0x79, 0xd6, 0xdb, 0xe6, 0xfd, 0xce, 0x7b, 0x6d, 0x76, 0x13, 0x97, 0x13, 0x36, 0x03, 0x77, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0xf5, 0x1a, 0xf6, 0x53, 0x9a, 0xa5, 0x5a, 0xce, 0x7a, 0xd6, 0x1e, 0xcf, 0xf6, 0x33, 0xb8, 0x13, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x99, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x56, 0x0b, 0x15, 0x0b, 0x13, 0x1b, 0xb8, 0x6c, 0x3b, 0xbe, 0x7b, 0xce, 0xfd, 0xc6, 0xb7, 0x64, 0x74, 0x13, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0xb8, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x78, 0x03, 0x98, 0x03, 0x36, 0x03, 0x77, 0x0b, 0x56, 0x03, 0xf4, 0x0a, 0x73, 0x3b, 0xfb, 0xad, 0x5a, 0xce, 0xbc, 0xce, 0x1d, 0x96, 0x95, 0x2b, 0x56, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x36, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x15, 0x03, 0x13, 0x1b, 0x38, 0x95, 0x3c, 0xbe, 0x1a, 0x65, 0x14, 0x13, 0x15, 0x0b, 0x37, 0x0b, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0xd6, 0x02, 0x17, 0x0b, 0xf7, 0x02, 0xd6, 0x02, 0xf7, 0x0a, 0xf6, 0x02, 0xb6, 0x02, 0xf7, 0x0a, + 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x97, 0x0b, 0x34, 0x23, 0xdc, 0x8d, 0xfd, 0xd6, 0xfc, 0xe6, 0xfc, 0xde, 0x7f, 0xd7, 0x95, 0x23, 0xd8, 0x0b, 0xf9, 0x03, 0x19, 0x04, 0xfa, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x0b, 0x76, 0x13, 0xf2, 0x22, 0xbe, 0xb6, 0xbc, 0xce, 0xba, 0xde, 0x3c, 0xe7, 0x5f, 0xd7, 0xb5, 0x23, 0xd9, 0x13, 0xfa, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x37, 0x03, 0x15, 0x13, 0x37, 0x54, 0x9c, 0xc6, 0x9a, 0xde, 0xbb, 0xde, 0x1f, 0xcf, 0x58, 0x44, 0x77, 0x0b, 0xd8, 0x13, 0xb8, 0x0b, 0x78, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x14, 0x13, 0x16, 0x54, 0xfb, 0xb5, 0xbb, 0xd6, 0x9a, 0xd6, 0xdc, 0xd6, 0xdf, 0xbe, 0xf3, 0x22, 0x16, 0x13, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xb7, 0x02, 0xd7, 0x0a, 0xb7, 0x02, 0x73, 0x12, 0x9b, 0x9d, 0x5a, 0xce, 0xdb, 0xde, 0x1d, 0xd7, 0x9c, 0x7d, 0x55, 0x13, 0x77, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0xd3, 0x12, 0xfa, 0xad, 0x5a, 0xce, 0xbc, 0xde, 0x1f, 0xd7, 0x56, 0x2b, 0x17, 0x0b, 0x38, 0x0b, 0xf7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x78, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x96, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0x97, 0x02, 0xb8, 0x0a, 0x55, 0x12, 0x96, 0x4b, 0x7c, 0xc6, 0xdb, 0xde, 0xba, 0xde, 0xfd, 0xce, 0xf9, 0x5c, 0x76, 0x13, 0x97, 0x13, 0x56, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x37, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x37, 0x0b, 0xd4, 0x12, 0xb6, 0x4b, 0xba, 0xa5, 0x1a, 0xc6, 0xbb, 0xde, 0xfe, 0xc6, 0xd6, 0x2b, 0x77, 0x0b, 0xd9, 0x13, 0x77, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x36, 0x03, 0x15, 0x0b, 0xf3, 0x12, 0x98, 0x64, 0x3b, 0xbe, 0x7b, 0xce, 0xfe, 0xc6, 0xb7, 0x64, 0x54, 0x0b, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x77, 0x03, 0x98, 0x0b, 0xb9, 0x13, 0x78, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x37, 0x03, 0x38, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x56, 0x03, 0x14, 0x13, 0x33, 0x3b, 0xfb, 0xad, 0x5a, 0xce, 0xbc, 0xce, 0x5d, 0x9e, 0x95, 0x2b, 0x56, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0x36, 0x03, 0x34, 0x23, 0xd7, 0x84, 0x7d, 0xc6, 0xbd, 0x7d, 0x35, 0x13, 0x36, 0x0b, 0xf6, 0x02, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0x38, 0x0b, 0x17, 0x0b, 0xf6, 0x02, 0xf7, 0x0a, 0xf6, 0x02, 0xb6, 0x02, 0xf7, 0x02, + 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x77, 0x0b, 0x13, 0x1b, 0x3d, 0xa6, 0xdc, 0xd6, 0x1c, 0xe7, 0xfc, 0xe6, 0x5f, 0xd7, 0xb5, 0x23, 0xf8, 0x13, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xda, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x56, 0x13, 0x12, 0x23, 0xdf, 0xb6, 0xbc, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x5f, 0xcf, 0x75, 0x23, 0x98, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x15, 0x13, 0x78, 0x5c, 0x9c, 0xc6, 0xbb, 0xde, 0xdb, 0xde, 0x3f, 0xd7, 0xd6, 0x2b, 0x97, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x15, 0x1b, 0x16, 0x54, 0xfb, 0xb5, 0xbc, 0xde, 0x9a, 0xd6, 0xdc, 0xd6, 0xdf, 0xb6, 0xf3, 0x22, 0xf6, 0x12, 0x18, 0x0b, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xb7, 0x02, 0x94, 0x12, 0x7a, 0x9d, 0x7a, 0xce, 0xdb, 0xde, 0x1d, 0xd7, 0xdd, 0x85, 0x76, 0x1b, 0x57, 0x0b, 0x78, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0xd3, 0x12, 0x1a, 0xae, 0x9a, 0xd6, 0xbb, 0xd6, 0xff, 0xce, 0x55, 0x2b, 0xd6, 0x02, 0xf7, 0x0a, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x98, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x02, 0x77, 0x02, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x97, 0x0a, 0x54, 0x12, 0x76, 0x4b, 0x7c, 0xc6, 0xbb, 0xde, 0xba, 0xde, 0xfd, 0xce, 0x37, 0x44, 0x97, 0x13, 0x97, 0x13, 0x57, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x37, 0x0b, 0xd4, 0x12, 0xf6, 0x53, 0xba, 0xad, 0x1a, 0xc6, 0xbb, 0xde, 0xdd, 0xc6, 0x95, 0x23, 0x77, 0x03, 0xf9, 0x13, 0x57, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x36, 0x03, 0x15, 0x0b, 0xf3, 0x12, 0x98, 0x64, 0x3b, 0xbe, 0x5b, 0xce, 0x1e, 0xcf, 0x96, 0x5c, 0x55, 0x13, 0x77, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x38, 0x0b, 0x38, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0x14, 0x13, 0xf2, 0x32, 0xfb, 0xad, 0x7b, 0xce, 0x9c, 0xce, 0x3d, 0x9e, 0x54, 0x23, 0x56, 0x0b, 0x57, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x03, 0x57, 0x0b, 0xf3, 0x1a, 0xd7, 0x8c, 0x7e, 0xc6, 0x78, 0x54, 0x56, 0x1b, 0x36, 0x0b, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0x17, 0x0b, 0x38, 0x0b, 0x17, 0x0b, 0xf6, 0x02, 0xf7, 0x0a, 0xf6, 0x02, 0xd6, 0x02, 0xf6, 0x02, + 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb8, 0x03, 0x76, 0x0b, 0x13, 0x23, 0x7e, 0xae, 0xfc, 0xd6, 0x1b, 0xe7, 0x1c, 0xe7, 0x5f, 0xd7, 0xb5, 0x2b, 0x19, 0x14, 0x19, 0x04, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x56, 0x0b, 0xf2, 0x22, 0xbe, 0xb6, 0xbc, 0xce, 0xdb, 0xde, 0x1d, 0xe7, 0x3f, 0xcf, 0x75, 0x23, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x57, 0x0b, 0x35, 0x13, 0x98, 0x64, 0x9c, 0xc6, 0x9a, 0xde, 0xdb, 0xde, 0x5f, 0xd7, 0x17, 0x34, 0xd8, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0xd9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x15, 0x1b, 0x36, 0x54, 0xfb, 0xb5, 0xbc, 0xde, 0x9a, 0xd6, 0xdd, 0xd6, 0xff, 0xbe, 0x13, 0x23, 0x16, 0x13, 0xf8, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x93, 0x12, 0x39, 0x95, 0x9b, 0xce, 0xdb, 0xde, 0x1d, 0xd7, 0xdd, 0x85, 0x76, 0x1b, 0x97, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0xf3, 0x12, 0x1b, 0xae, 0xbb, 0xd6, 0xbc, 0xde, 0x1f, 0xd7, 0x14, 0x23, 0xf6, 0x0a, 0xf7, 0x0a, 0xb6, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x57, 0x02, 0x77, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb8, 0x0a, 0x97, 0x0a, 0x54, 0x12, 0x75, 0x4b, 0x7c, 0xce, 0x9a, 0xd6, 0xba, 0xde, 0xfe, 0xce, 0xb5, 0x2b, 0x97, 0x0b, 0x98, 0x0b, 0x77, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x78, 0x0b, 0x37, 0x03, 0x16, 0x0b, 0xf4, 0x1a, 0x79, 0x64, 0xba, 0xad, 0x3a, 0xce, 0x9a, 0xd6, 0x1e, 0xcf, 0x95, 0x23, 0x98, 0x0b, 0xb9, 0x13, 0x78, 0x0b, 0x58, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x0b, 0xf4, 0x12, 0x98, 0x64, 0x5c, 0xc6, 0x5b, 0xce, 0xfe, 0xce, 0x56, 0x5c, 0x75, 0x13, 0x77, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x0b, 0x38, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x36, 0x03, 0x56, 0x0b, 0x35, 0x13, 0xd1, 0x2a, 0xfb, 0xad, 0x9b, 0xce, 0x9b, 0xc6, 0x5d, 0x9e, 0x34, 0x1b, 0x76, 0x13, 0x57, 0x03, 0x77, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x03, 0x36, 0x03, 0xd2, 0x12, 0x18, 0x8d, 0x3d, 0xbe, 0xf6, 0x43, 0x35, 0x13, 0x16, 0x0b, 0x37, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0x17, 0x0b, 0xf7, 0x02, 0xd6, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xf6, 0x02, + 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb8, 0x0b, 0x76, 0x0b, 0x13, 0x23, 0x5e, 0xa6, 0xfc, 0xd6, 0xdb, 0xe6, 0x1c, 0xe7, 0x5f, 0xd7, 0xb5, 0x2b, 0x19, 0x14, 0x19, 0x0c, 0xf9, 0x03, 0xfa, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xd9, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x56, 0x0b, 0xf2, 0x22, 0xbe, 0xb6, 0xbc, 0xce, 0xdb, 0xde, 0x1d, 0xe7, 0x3f, 0xcf, 0x95, 0x23, 0x98, 0x0b, 0xb9, 0x0b, 0xda, 0x0b, 0x98, 0x03, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x37, 0x0b, 0x35, 0x13, 0x98, 0x5c, 0x9c, 0xce, 0x7a, 0xd6, 0xfc, 0xe6, 0x5f, 0xd7, 0x16, 0x34, 0xd8, 0x0b, 0x19, 0x14, 0x98, 0x03, 0x78, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x37, 0x0b, 0x14, 0x1b, 0x36, 0x54, 0x1b, 0xb6, 0x9b, 0xd6, 0x7a, 0xd6, 0xdc, 0xce, 0xff, 0xbe, 0x14, 0x23, 0x16, 0x13, 0xf8, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x73, 0x12, 0xf8, 0x84, 0x9b, 0xce, 0xdb, 0xde, 0x1d, 0xd7, 0x9b, 0x7d, 0x76, 0x1b, 0x98, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0xd3, 0x12, 0x1b, 0xa6, 0x9b, 0xd6, 0xbc, 0xde, 0x1f, 0xd7, 0xd4, 0x22, 0xd6, 0x0a, 0xd6, 0x0a, 0x96, 0x02, 0x97, 0x02, 0x77, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x77, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x02, 0x57, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x77, 0x02, 0x97, 0x02, 0x96, 0x12, 0x33, 0x12, 0xf7, 0x5b, 0x7c, 0xc6, 0xbb, 0xde, 0x9a, 0xde, 0xfe, 0xce, 0x54, 0x23, 0xb8, 0x0b, 0xb8, 0x0b, 0x77, 0x03, 0x98, 0x03, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x16, 0x0b, 0xf4, 0x1a, 0xda, 0x74, 0xda, 0xb5, 0x5b, 0xd6, 0x9a, 0xd6, 0x1e, 0xcf, 0xf6, 0x2b, 0xb8, 0x13, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x16, 0x03, 0x15, 0x0b, 0xf4, 0x12, 0x78, 0x64, 0x5c, 0xc6, 0x5b, 0xce, 0xfe, 0xce, 0x96, 0x64, 0x55, 0x13, 0x57, 0x03, 0x37, 0x03, 0x38, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x36, 0x03, 0x56, 0x0b, 0x35, 0x13, 0xd1, 0x2a, 0x1c, 0xae, 0x7a, 0xce, 0xbc, 0xce, 0xbf, 0xae, 0x54, 0x23, 0x56, 0x0b, 0x37, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x15, 0x03, 0x33, 0x1b, 0xf7, 0x8c, 0x1c, 0xb6, 0xbc, 0x7d, 0x14, 0x0b, 0x16, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0xf6, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xd6, 0x02, + 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb8, 0x0b, 0x76, 0x0b, 0x13, 0x1b, 0x5d, 0xa6, 0xfd, 0xd6, 0xdb, 0xe6, 0x3d, 0xef, 0x5f, 0xd7, 0xf6, 0x33, 0x59, 0x1c, 0x39, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x56, 0x0b, 0xf2, 0x1a, 0xbe, 0xb6, 0x9b, 0xce, 0xdb, 0xde, 0x3d, 0xe7, 0x3f, 0xcf, 0x95, 0x23, 0xb8, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x37, 0x0b, 0x35, 0x13, 0x98, 0x64, 0x9c, 0xce, 0x59, 0xd6, 0xfc, 0xe6, 0x3f, 0xcf, 0x57, 0x34, 0x97, 0x03, 0x19, 0x14, 0xb8, 0x0b, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x0b, 0x15, 0x1b, 0x37, 0x5c, 0x1b, 0xb6, 0x9b, 0xd6, 0x79, 0xce, 0xbc, 0xce, 0xbf, 0xb6, 0xf3, 0x22, 0x17, 0x13, 0xd8, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0x94, 0x12, 0x96, 0x7c, 0x5a, 0xce, 0xba, 0xde, 0x1d, 0xd7, 0x7b, 0x75, 0x55, 0x1b, 0x98, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x79, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0xd3, 0x12, 0x3b, 0xae, 0x9b, 0xd6, 0xdc, 0xde, 0x1f, 0xdf, 0xb6, 0x43, 0x95, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0x97, 0x0a, 0x78, 0x02, 0x98, 0x02, 0x99, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x77, 0x02, 0x97, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x02, 0x97, 0x02, 0xb8, 0x0a, 0x97, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x75, 0x0a, 0x33, 0x12, 0xf7, 0x63, 0x7c, 0xc6, 0x9a, 0xd6, 0xdb, 0xe6, 0x1f, 0xcf, 0x74, 0x23, 0xb8, 0x13, 0x97, 0x0b, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x59, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x0b, 0xb4, 0x12, 0xb9, 0x6c, 0xdb, 0xb5, 0x5a, 0xd6, 0x9a, 0xd6, 0xdd, 0xce, 0x37, 0x34, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x16, 0x03, 0x15, 0x0b, 0xf4, 0x12, 0x37, 0x5c, 0x7c, 0xc6, 0x9c, 0xd6, 0x1e, 0xcf, 0x39, 0x75, 0x34, 0x13, 0x56, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x0b, 0x58, 0x03, 0x16, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x14, 0x13, 0xd1, 0x2a, 0x1c, 0xae, 0x7a, 0xce, 0x9c, 0xce, 0xbf, 0xae, 0x34, 0x23, 0x56, 0x0b, 0x37, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x56, 0x03, 0x56, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x35, 0x03, 0x33, 0x1b, 0xd7, 0x84, 0xfb, 0xb5, 0xbc, 0x7d, 0x34, 0x13, 0x35, 0x0b, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xd6, 0x02, + 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xd8, 0x03, 0x97, 0x13, 0x14, 0x1b, 0x5e, 0xa6, 0x1d, 0xd7, 0xfb, 0xe6, 0x3d, 0xef, 0x5f, 0xcf, 0xf6, 0x33, 0x5a, 0x1c, 0x39, 0x0c, 0xf9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x56, 0x0b, 0xf2, 0x1a, 0xbe, 0xb6, 0x9b, 0xce, 0xfb, 0xde, 0x1c, 0xe7, 0x3e, 0xcf, 0xb5, 0x23, 0xb8, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x57, 0x0b, 0x15, 0x13, 0xd9, 0x64, 0x9c, 0xc6, 0x59, 0xd6, 0xdb, 0xde, 0x3f, 0xcf, 0x78, 0x3c, 0xb7, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x57, 0x0b, 0x15, 0x1b, 0x37, 0x5c, 0x1b, 0xb6, 0x7a, 0xd6, 0x7a, 0xd6, 0xdc, 0xce, 0x9f, 0xae, 0xd3, 0x1a, 0x37, 0x13, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0x94, 0x12, 0x56, 0x74, 0x5a, 0xce, 0xdb, 0xde, 0x1d, 0xd7, 0xbc, 0x85, 0x56, 0x1b, 0x77, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0xf3, 0x12, 0x3b, 0xae, 0x9a, 0xd6, 0xdc, 0xe6, 0xff, 0xde, 0x7d, 0x7d, 0x94, 0x12, 0x37, 0x23, 0xf7, 0x1a, 0x97, 0x0a, 0x77, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x78, 0x02, 0x78, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x34, 0x02, 0x53, 0x12, 0x17, 0x64, 0x7b, 0xc6, 0x59, 0xd6, 0xfc, 0xe6, 0x1f, 0xcf, 0xb5, 0x2b, 0x97, 0x0b, 0x97, 0x0b, 0x77, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x0b, 0xb3, 0x12, 0xb9, 0x6c, 0xdb, 0xb5, 0x3a, 0xce, 0x9a, 0xde, 0xdd, 0xc6, 0xf6, 0x33, 0x77, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x0b, 0x15, 0x0b, 0xf4, 0x1a, 0x16, 0x54, 0x7c, 0xc6, 0x9c, 0xd6, 0x1e, 0xcf, 0xba, 0x85, 0x54, 0x13, 0x56, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x38, 0x0b, 0x58, 0x03, 0x16, 0x03, 0x37, 0x03, 0x56, 0x0b, 0x36, 0x03, 0x14, 0x13, 0xf2, 0x32, 0xfb, 0xad, 0x7b, 0xce, 0x9b, 0xc6, 0x7e, 0xa6, 0x14, 0x1b, 0x36, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x36, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x13, 0x1b, 0xb6, 0x84, 0x1c, 0xb6, 0xd9, 0x5c, 0x35, 0x13, 0x15, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xd6, 0x02, + 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x13, 0x14, 0x1b, 0x7e, 0xa6, 0x1e, 0xd7, 0x1c, 0xe7, 0x3d, 0xe7, 0x3f, 0xcf, 0x74, 0x23, 0xf8, 0x13, 0x19, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x76, 0x13, 0x12, 0x23, 0xbe, 0xb6, 0xbb, 0xce, 0xfb, 0xe6, 0x1c, 0xe7, 0x1e, 0xc7, 0x95, 0x23, 0xd8, 0x0b, 0xd9, 0x0b, 0xb8, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x99, 0x0b, 0x58, 0x0b, 0x15, 0x13, 0xfa, 0x6c, 0x9c, 0xc6, 0x7a, 0xd6, 0xdb, 0xde, 0x1e, 0xcf, 0xd5, 0x2b, 0xf8, 0x13, 0xb8, 0x0b, 0xb8, 0x0b, 0xb9, 0x0b, 0x79, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x36, 0x03, 0x14, 0x13, 0x16, 0x54, 0x1b, 0xb6, 0x7a, 0xce, 0x9a, 0xd6, 0xfd, 0xd6, 0x9f, 0xae, 0xd3, 0x1a, 0x37, 0x13, 0xf8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0x94, 0x12, 0x76, 0x74, 0x9b, 0xd6, 0xdb, 0xde, 0x1d, 0xd7, 0x3e, 0x96, 0x96, 0x23, 0x57, 0x0b, 0x58, 0x03, 0x77, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x59, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0xd3, 0x12, 0x5b, 0xae, 0x9a, 0xd6, 0xbb, 0xe6, 0x9d, 0xd6, 0x9f, 0xa6, 0x11, 0x02, 0x16, 0x1b, 0x95, 0x0a, 0x96, 0x0a, 0x77, 0x0a, 0x97, 0x02, 0x98, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x55, 0x0a, 0x32, 0x12, 0xda, 0x7c, 0x5b, 0xc6, 0xbb, 0xde, 0xdc, 0xe6, 0xff, 0xce, 0xd6, 0x33, 0x76, 0x0b, 0x97, 0x0b, 0x97, 0x0b, 0x77, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x78, 0x03, 0x59, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x16, 0x0b, 0xb3, 0x12, 0xfa, 0x7c, 0xfb, 0xb5, 0x3a, 0xd6, 0x9a, 0xde, 0x1e, 0xcf, 0x75, 0x23, 0x98, 0x0b, 0xb9, 0x13, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0xf5, 0x0a, 0xf4, 0x1a, 0xf5, 0x53, 0x7c, 0xc6, 0x9b, 0xd6, 0xdd, 0xc6, 0xbb, 0x85, 0x33, 0x0b, 0x56, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x36, 0x03, 0x17, 0x03, 0x17, 0x0b, 0x17, 0x0b, 0x58, 0x0b, 0x16, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x36, 0x03, 0xf4, 0x12, 0xf2, 0x32, 0xdb, 0xad, 0x7a, 0xce, 0x9c, 0xce, 0x9f, 0xa6, 0x34, 0x1b, 0x35, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0x55, 0x23, 0x35, 0x74, 0x7e, 0xc6, 0x9c, 0x7d, 0xf4, 0x0a, 0x16, 0x03, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x0b, 0xf6, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xd6, 0x02, + 0x19, 0x0c, 0xf8, 0x03, 0xd8, 0x03, 0xb7, 0x03, 0x19, 0x0c, 0xd8, 0x03, 0xd8, 0x03, 0xf9, 0x0b, 0xb9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0xb7, 0x03, 0x74, 0x0b, 0x12, 0x23, 0x5e, 0xae, 0xfe, 0xd6, 0x3e, 0xe7, 0x3d, 0xdf, 0x7f, 0xcf, 0xf4, 0x23, 0xd6, 0x03, 0x38, 0x0c, 0xf9, 0x03, 0xda, 0x03, 0xdc, 0x0b, 0x7b, 0x03, 0xdc, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xba, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb9, 0x13, 0x98, 0x0b, 0x75, 0x13, 0x10, 0x23, 0xbc, 0xb6, 0xbb, 0xce, 0x1b, 0xe7, 0xfa, 0xee, 0x1e, 0xd7, 0x17, 0x2c, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x03, 0x7a, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x59, 0x03, 0x98, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x58, 0x13, 0x15, 0x1b, 0xda, 0x74, 0x7d, 0xbe, 0x9c, 0xd6, 0x9c, 0xde, 0xff, 0xd6, 0xd6, 0x3b, 0x18, 0x2c, 0x9a, 0x34, 0x97, 0x13, 0xf9, 0x1b, 0x98, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x97, 0x0b, 0x77, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0xf5, 0x1a, 0xf7, 0x53, 0xfa, 0xad, 0x5a, 0xd6, 0x5a, 0xde, 0xdd, 0xde, 0xff, 0xc6, 0xd2, 0x1a, 0x37, 0x0b, 0x18, 0x03, 0xd8, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xf8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xf8, 0x0a, 0xd7, 0x0a, 0xb7, 0x02, 0xd7, 0x0a, 0xf8, 0x12, 0xb8, 0x02, 0x95, 0x12, 0x99, 0x7c, 0x9d, 0xce, 0x9a, 0xd6, 0xfc, 0xd6, 0xdf, 0xb6, 0x74, 0x2b, 0x76, 0x13, 0x77, 0x03, 0x98, 0x03, 0xb9, 0x03, 0x79, 0x03, 0x7a, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x98, 0x03, 0x78, 0x03, 0x57, 0x03, 0x78, 0x03, 0x78, 0x03, 0x36, 0x03, 0xf3, 0x12, 0x3b, 0xae, 0xbb, 0xd6, 0x7a, 0xde, 0x1f, 0xd7, 0x59, 0x44, 0xd6, 0x02, 0x38, 0x0b, 0xd7, 0x0a, 0xb6, 0x02, 0xb6, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x77, 0x0a, 0xb7, 0x0a, 0x76, 0x02, 0xb7, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x78, 0x0a, 0x57, 0x02, 0x97, 0x02, 0x97, 0x02, 0x75, 0x0a, 0x11, 0x12, 0x5b, 0x95, 0x7b, 0xce, 0xba, 0xe6, 0xda, 0xee, 0xfd, 0xde, 0x37, 0x4c, 0x36, 0x0b, 0x77, 0x13, 0x36, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x78, 0x0b, 0x57, 0x03, 0x56, 0x03, 0x76, 0x03, 0xb8, 0x03, 0x77, 0x03, 0x35, 0x03, 0x35, 0x13, 0xd2, 0x12, 0xd8, 0x6c, 0x1a, 0xb6, 0x59, 0xd6, 0x9a, 0xe6, 0xfd, 0xde, 0x16, 0x44, 0x56, 0x0b, 0x99, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x58, 0x03, 0x79, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x17, 0x0b, 0x16, 0x0b, 0xd4, 0x12, 0xd3, 0x1a, 0x16, 0x54, 0x7c, 0xb6, 0x9c, 0xc6, 0x1f, 0xd7, 0xb8, 0x74, 0x55, 0x1b, 0x16, 0x03, 0x57, 0x03, 0xb8, 0x03, 0xb7, 0x03, 0x97, 0x03, 0x77, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x58, 0x03, 0x58, 0x03, 0x17, 0x03, 0x17, 0x03, 0x38, 0x0b, 0x18, 0x0b, 0x38, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x15, 0x03, 0xf4, 0x12, 0x12, 0x33, 0xfc, 0xa5, 0x7c, 0xbe, 0x9d, 0xbe, 0x9f, 0xa6, 0x33, 0x23, 0xf5, 0x0a, 0x57, 0x0b, 0x58, 0x03, 0x79, 0x03, 0x79, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x0b, 0x16, 0x03, 0x55, 0x23, 0x54, 0x6c, 0x9d, 0xb6, 0xb9, 0x4c, 0x55, 0x03, 0x35, 0x03, 0x55, 0x03, 0x16, 0x03, 0x17, 0x0b, 0x17, 0x0b, 0x16, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xd6, 0x02, + 0xb9, 0x0b, 0xb9, 0x0b, 0xfa, 0x13, 0xfa, 0x13, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xf9, 0x0b, 0x96, 0x13, 0x13, 0x23, 0x9e, 0xb6, 0xfd, 0xde, 0xdb, 0xe6, 0xfb, 0xe6, 0x7f, 0xe7, 0xd8, 0x6c, 0x17, 0x3c, 0x19, 0x2c, 0xb8, 0x13, 0x97, 0x0b, 0xf7, 0x13, 0x17, 0x0c, 0xf6, 0x03, 0xf7, 0x03, 0xd8, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x99, 0x13, 0x99, 0x13, 0x99, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xba, 0x0b, 0x9a, 0x0b, 0x79, 0x0b, 0x17, 0x13, 0xb2, 0x2a, 0x9f, 0xc6, 0xfd, 0xd6, 0xdb, 0xde, 0xda, 0xe6, 0x7f, 0xdf, 0xf7, 0x33, 0xb8, 0x0b, 0x97, 0x0b, 0x56, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x79, 0x03, 0x79, 0x03, 0x58, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x97, 0x0b, 0x97, 0x13, 0x56, 0x0b, 0x36, 0x03, 0x76, 0x0b, 0x77, 0x0b, 0x77, 0x0b, 0x97, 0x1b, 0xb2, 0x12, 0xf8, 0x74, 0x9b, 0xc6, 0x79, 0xce, 0xfb, 0xe6, 0xdc, 0xc6, 0xd5, 0x2b, 0xf8, 0x13, 0x7a, 0x24, 0xf8, 0x0b, 0xd8, 0x0b, 0x98, 0x03, 0xb8, 0x03, 0x78, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0xb9, 0x0b, 0x78, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x79, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0xf5, 0x12, 0xf6, 0x4b, 0xfa, 0xa5, 0x9a, 0xce, 0xbb, 0xde, 0xdd, 0xd6, 0x3f, 0xc7, 0xb1, 0x1a, 0x16, 0x1b, 0x96, 0x02, 0xd8, 0x02, 0xf9, 0x0a, 0x3a, 0x13, 0xb8, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xd7, 0x0a, 0xf7, 0x0a, 0xb5, 0x02, 0xf7, 0x0a, 0xb4, 0x12, 0xd8, 0x7c, 0xd9, 0xb5, 0xf7, 0xbd, 0x3d, 0xdf, 0x5d, 0x9e, 0x94, 0x23, 0x96, 0x13, 0x98, 0x03, 0xb8, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x78, 0x0b, 0x37, 0x03, 0x16, 0x03, 0xf3, 0x12, 0x3c, 0xae, 0x7a, 0xd6, 0x9b, 0xde, 0xdf, 0xd6, 0x75, 0x33, 0x95, 0x02, 0x96, 0x0a, 0xb7, 0x0a, 0xf7, 0x12, 0xb7, 0x0a, 0x57, 0x02, 0x58, 0x02, 0x78, 0x02, 0x58, 0x02, 0x58, 0x02, 0x37, 0x02, 0x36, 0x02, 0xb7, 0x0a, 0xb6, 0x0a, 0x35, 0x02, 0x56, 0x0a, 0x77, 0x0a, 0x56, 0x02, 0xb7, 0x12, 0x97, 0x0a, 0x55, 0x0a, 0xf1, 0x11, 0xda, 0x7c, 0x7d, 0xc6, 0xbc, 0xd6, 0x9c, 0xd6, 0x1f, 0xd7, 0x79, 0x54, 0xb7, 0x23, 0xd8, 0x23, 0x98, 0x1b, 0x36, 0x03, 0x37, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x59, 0x03, 0x79, 0x0b, 0x39, 0x0b, 0x19, 0x03, 0x39, 0x0b, 0x38, 0x13, 0xd6, 0x0a, 0xb4, 0x12, 0x59, 0x64, 0xfc, 0xb5, 0x5b, 0xd6, 0x9b, 0xde, 0xde, 0xd6, 0x58, 0x4c, 0x56, 0x0b, 0xd8, 0x1b, 0x36, 0x03, 0x77, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x36, 0x03, 0x36, 0x03, 0x56, 0x03, 0x57, 0x0b, 0x56, 0x03, 0x36, 0x03, 0x56, 0x03, 0x35, 0x13, 0xf3, 0x1a, 0x36, 0x5c, 0x9c, 0xc6, 0x39, 0xbe, 0xdc, 0xce, 0x75, 0x64, 0x34, 0x13, 0x56, 0x03, 0x97, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0xd7, 0x0b, 0x97, 0x13, 0x36, 0x0b, 0xf5, 0x02, 0x57, 0x0b, 0x36, 0x03, 0x16, 0x03, 0x56, 0x0b, 0x16, 0x0b, 0xf6, 0x02, 0x37, 0x0b, 0x37, 0x0b, 0x36, 0x0b, 0x16, 0x03, 0x56, 0x0b, 0x77, 0x13, 0x55, 0x23, 0x52, 0x3b, 0xdb, 0xa5, 0x7b, 0xce, 0xbc, 0xce, 0x7d, 0xb6, 0x12, 0x2b, 0x13, 0x13, 0x56, 0x13, 0x36, 0x0b, 0x16, 0x03, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x16, 0x0b, 0x16, 0x0b, 0xf6, 0x0a, 0xb3, 0x1a, 0x55, 0x7c, 0x1b, 0xbe, 0xda, 0x6c, 0xf5, 0x12, 0x36, 0x1b, 0xd5, 0x0a, 0x17, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf6, 0x02, + 0xf9, 0x03, 0xb8, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xb8, 0x03, 0xf9, 0x0b, 0x19, 0x14, 0xf9, 0x0b, 0x19, 0x14, 0xf9, 0x0b, 0xd8, 0x0b, 0xd8, 0x0b, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x0b, 0xd8, 0x0b, 0x96, 0x03, 0x95, 0x0b, 0x33, 0x23, 0x9e, 0xb6, 0xbd, 0xe6, 0xbc, 0xf6, 0xfd, 0xee, 0x5f, 0xdf, 0x39, 0x6d, 0x78, 0x34, 0x39, 0x14, 0xf9, 0x03, 0x1a, 0x0c, 0xfa, 0x0b, 0xb8, 0x03, 0xd9, 0x0b, 0xf9, 0x03, 0xf9, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0x19, 0x04, 0xd8, 0x03, 0xf8, 0x03, 0xd8, 0x0b, 0x97, 0x03, 0xd7, 0x0b, 0xd6, 0x13, 0x10, 0x1b, 0x9c, 0xa6, 0xdc, 0xce, 0x1c, 0xe7, 0xbb, 0xe6, 0x5f, 0xdf, 0x17, 0x3c, 0xd8, 0x1b, 0x97, 0x13, 0xd8, 0x1b, 0x77, 0x0b, 0x97, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0x5a, 0x03, 0x5a, 0x0b, 0x79, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x79, 0x0b, 0x99, 0x0b, 0x78, 0x0b, 0x77, 0x03, 0x76, 0x13, 0xf3, 0x1a, 0x7a, 0x85, 0x7a, 0xbe, 0xda, 0xde, 0xfa, 0xe6, 0x3d, 0xd7, 0xf5, 0x23, 0xd8, 0x03, 0x19, 0x0c, 0x98, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x57, 0x0b, 0x58, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x77, 0x0b, 0x76, 0x13, 0x14, 0x13, 0xb4, 0x3b, 0xd9, 0xa5, 0x9a, 0xce, 0x7b, 0xce, 0xfd, 0xd6, 0xdf, 0xbe, 0xd2, 0x22, 0x36, 0x1b, 0xd6, 0x02, 0xf7, 0x0a, 0x96, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0x18, 0x0b, 0xf7, 0x0a, 0xd7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xf8, 0x0a, 0xb7, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xb7, 0x02, 0xd8, 0x0a, 0xb7, 0x0a, 0xd8, 0x12, 0x97, 0x0a, 0x74, 0x02, 0x51, 0x12, 0xd6, 0x8c, 0xd7, 0xbd, 0xf3, 0xac, 0x5a, 0xce, 0x9f, 0xa6, 0x77, 0x2b, 0x38, 0x13, 0x18, 0x03, 0x58, 0x13, 0x57, 0x13, 0x76, 0x1b, 0x56, 0x13, 0x77, 0x0b, 0x58, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0xb2, 0x12, 0x1c, 0xae, 0x7b, 0xd6, 0xdd, 0xe6, 0x7d, 0xc6, 0xb3, 0x22, 0xd6, 0x12, 0x96, 0x0a, 0x96, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x77, 0x0a, 0x98, 0x0a, 0x98, 0x02, 0x98, 0x02, 0x77, 0x02, 0x78, 0x02, 0x98, 0x0a, 0x16, 0x02, 0x77, 0x0a, 0x98, 0x12, 0x37, 0x0a, 0x37, 0x12, 0x56, 0x12, 0x35, 0x0a, 0x75, 0x0a, 0x13, 0x0a, 0x52, 0x22, 0xfa, 0x84, 0x9c, 0xc6, 0xdc, 0xde, 0x1d, 0xe7, 0x3f, 0xcf, 0xb4, 0x2b, 0x75, 0x03, 0x96, 0x0b, 0x55, 0x03, 0x97, 0x03, 0xb8, 0x03, 0x97, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x38, 0x0b, 0x58, 0x0b, 0x78, 0x0b, 0x37, 0x03, 0x58, 0x0b, 0x37, 0x13, 0x57, 0x0b, 0x15, 0x0b, 0xd3, 0x12, 0xb8, 0x64, 0x3b, 0xae, 0x7a, 0xc6, 0xba, 0xd6, 0x1d, 0xcf, 0xb6, 0x44, 0x74, 0x03, 0xb5, 0x0b, 0x96, 0x0b, 0x36, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x58, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x56, 0x03, 0x36, 0x03, 0x37, 0x03, 0x16, 0x0b, 0xd4, 0x1a, 0xf6, 0x5b, 0x1b, 0xb6, 0xbc, 0xd6, 0x1f, 0xd7, 0x96, 0x6c, 0x55, 0x1b, 0x56, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x97, 0x0b, 0xd8, 0x13, 0xb8, 0x13, 0x16, 0x0b, 0x37, 0x0b, 0x16, 0x03, 0x37, 0x03, 0x78, 0x0b, 0x57, 0x0b, 0x16, 0x03, 0x37, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0xf4, 0x0a, 0x12, 0x33, 0xdb, 0xa5, 0x5b, 0xbe, 0x9c, 0xc6, 0x3d, 0xa6, 0xd1, 0x22, 0x14, 0x13, 0x56, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x16, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x36, 0x03, 0x36, 0x03, 0x56, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x16, 0x03, 0x14, 0x23, 0xd6, 0x8c, 0x5c, 0xc6, 0x7b, 0x85, 0x56, 0x23, 0x16, 0x13, 0x16, 0x0b, 0xf6, 0x0a, 0x16, 0x0b, 0xf6, 0x0a, 0xf6, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf7, 0x0a, 0xd6, 0x0a, 0xd6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd6, 0x02, + 0x3a, 0x44, 0x19, 0x44, 0x19, 0x3c, 0x3a, 0x44, 0x39, 0x3c, 0x7a, 0x44, 0x39, 0x3c, 0xd7, 0x2b, 0x39, 0x34, 0x19, 0x2c, 0x39, 0x2c, 0x59, 0x2c, 0x59, 0x2c, 0x18, 0x24, 0xd7, 0x13, 0xb7, 0x13, 0xd7, 0x0b, 0xb6, 0x13, 0x33, 0x1b, 0x7e, 0xa6, 0xdc, 0xd6, 0xdb, 0xe6, 0xfc, 0xde, 0xfd, 0xd6, 0x9c, 0xb6, 0x75, 0x5c, 0x37, 0x34, 0x9a, 0x3c, 0x39, 0x34, 0x7a, 0x3c, 0x7b, 0x44, 0x19, 0x34, 0xd8, 0x1b, 0xd8, 0x13, 0x97, 0x0b, 0xb8, 0x0b, 0xf8, 0x13, 0xd8, 0x13, 0xd8, 0x13, 0xf9, 0x1b, 0x3a, 0x24, 0x5a, 0x34, 0x5b, 0x44, 0xfa, 0x33, 0xb9, 0x23, 0x35, 0x1b, 0xb1, 0x22, 0x7e, 0xb6, 0xbc, 0xd6, 0x1c, 0xe7, 0xdc, 0xde, 0x3f, 0xd7, 0x37, 0x3c, 0x39, 0x2c, 0x97, 0x13, 0x77, 0x0b, 0xd9, 0x13, 0xd9, 0x13, 0xd8, 0x13, 0xd8, 0x13, 0xd9, 0x13, 0xb9, 0x13, 0xd8, 0x13, 0xb8, 0x13, 0xb7, 0x03, 0xd7, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xb7, 0x03, 0xd8, 0x03, 0xb7, 0x03, 0x97, 0x03, 0x14, 0x03, 0x13, 0x23, 0x3a, 0x7d, 0x7c, 0xbe, 0x9a, 0xd6, 0xdb, 0xde, 0x3f, 0xdf, 0xd6, 0x3b, 0x56, 0x13, 0x77, 0x13, 0x98, 0x1b, 0x98, 0x13, 0xb9, 0x1b, 0x58, 0x0b, 0x37, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x97, 0x03, 0x98, 0x03, 0xb7, 0x03, 0xb8, 0x0b, 0x56, 0x0b, 0x77, 0x13, 0x97, 0x0b, 0x77, 0x0b, 0x76, 0x03, 0x75, 0x0b, 0x34, 0x13, 0x15, 0x54, 0xfa, 0xb5, 0x9a, 0xde, 0x7a, 0xde, 0xfe, 0xde, 0x9f, 0xb6, 0xb1, 0x1a, 0x16, 0x0b, 0x17, 0x03, 0xd7, 0x02, 0x17, 0x0b, 0x18, 0x0b, 0xd7, 0x02, 0x96, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0x17, 0x03, 0xf6, 0x02, 0x36, 0x03, 0xd4, 0x12, 0x19, 0x85, 0x9d, 0xd6, 0x9c, 0xd6, 0xfe, 0xce, 0x1f, 0xa7, 0x94, 0x13, 0x95, 0x03, 0x76, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x78, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x57, 0x03, 0x36, 0x03, 0x36, 0x03, 0xd3, 0x12, 0x5c, 0xb6, 0x9c, 0xde, 0x9c, 0xde, 0x3d, 0xbe, 0x34, 0x33, 0xb5, 0x12, 0xd6, 0x0a, 0xd6, 0x0a, 0xf7, 0x0a, 0xd6, 0x02, 0xb6, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xd6, 0x02, 0xb5, 0x02, 0x96, 0x02, 0x77, 0x02, 0x98, 0x0a, 0x98, 0x0a, 0x77, 0x02, 0x57, 0x0a, 0x57, 0x0a, 0x76, 0x0a, 0x96, 0x0a, 0x75, 0x0a, 0xb5, 0x1a, 0x10, 0x1a, 0x76, 0x7c, 0x7b, 0xce, 0xba, 0xde, 0xba, 0xde, 0xdd, 0xce, 0xdd, 0x85, 0xf4, 0x12, 0x56, 0x1b, 0xb7, 0x23, 0xd8, 0x23, 0x56, 0x0b, 0x98, 0x13, 0x77, 0x0b, 0x77, 0x0b, 0x97, 0x0b, 0x76, 0x03, 0x76, 0x0b, 0x96, 0x03, 0x76, 0x03, 0xb7, 0x0b, 0x76, 0x03, 0x77, 0x0b, 0x57, 0x13, 0x16, 0x13, 0xf6, 0x12, 0xd5, 0x0a, 0xf4, 0x12, 0xb3, 0x1a, 0x78, 0x6c, 0x1b, 0xc6, 0x3a, 0xde, 0x7b, 0xe6, 0xde, 0xde, 0x78, 0x54, 0x97, 0x23, 0xf6, 0x0a, 0x38, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0xd5, 0x0a, 0xd4, 0x22, 0xd6, 0x5b, 0x7d, 0xc6, 0xde, 0xde, 0xde, 0xc6, 0xf8, 0x74, 0x74, 0x1b, 0x36, 0x0b, 0x16, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x57, 0x03, 0x77, 0x03, 0x57, 0x03, 0x57, 0x0b, 0xf6, 0x02, 0x37, 0x03, 0x78, 0x03, 0x36, 0x03, 0x36, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x37, 0x03, 0x57, 0x03, 0x56, 0x03, 0x56, 0x03, 0x35, 0x13, 0x53, 0x3b, 0xdb, 0xa5, 0xbc, 0xce, 0xdd, 0xc6, 0xdf, 0xae, 0x13, 0x1b, 0x56, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x36, 0x0b, 0x15, 0x0b, 0xf5, 0x02, 0x15, 0x03, 0x16, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x36, 0x0b, 0x35, 0x0b, 0x35, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x13, 0x1b, 0x77, 0x95, 0xd8, 0xad, 0x7e, 0xa6, 0x33, 0x1b, 0x35, 0x0b, 0x56, 0x0b, 0x15, 0x03, 0x15, 0x03, 0x16, 0x03, 0x15, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, + 0x58, 0x24, 0x38, 0x24, 0xb6, 0x13, 0xb6, 0x13, 0xf7, 0x1b, 0x38, 0x24, 0xf7, 0x23, 0xf7, 0x1b, 0xf7, 0x23, 0xd8, 0x23, 0xf8, 0x23, 0xd8, 0x23, 0xd8, 0x1b, 0xb8, 0x1b, 0xd9, 0x23, 0x3a, 0x24, 0x98, 0x13, 0x55, 0x13, 0x52, 0x2b, 0xdd, 0xb6, 0x5c, 0xe7, 0x1a, 0xef, 0xda, 0xe6, 0x3c, 0xef, 0x3e, 0xe7, 0x18, 0x8d, 0xd6, 0x43, 0x39, 0x3c, 0x18, 0x34, 0x79, 0x3c, 0x18, 0x34, 0xf7, 0x23, 0x59, 0x1c, 0x58, 0x14, 0x18, 0x14, 0x18, 0x1c, 0x38, 0x24, 0x18, 0x24, 0x19, 0x24, 0x39, 0x2c, 0x38, 0x24, 0xd6, 0x1b, 0xf6, 0x23, 0x38, 0x34, 0x58, 0x34, 0x95, 0x2b, 0x12, 0x33, 0x9d, 0xbe, 0xfc, 0xde, 0xba, 0xd6, 0x1c, 0xdf, 0x1f, 0xcf, 0x73, 0x2b, 0xd6, 0x23, 0x39, 0x34, 0x39, 0x2c, 0x5a, 0x34, 0x39, 0x2c, 0x18, 0x2c, 0x18, 0x34, 0x38, 0x44, 0x38, 0x4c, 0x17, 0x44, 0xd7, 0x3b, 0x77, 0x2b, 0xd8, 0x2b, 0xf9, 0x2b, 0x19, 0x2c, 0xf9, 0x2b, 0xd9, 0x23, 0x3a, 0x34, 0x5b, 0x34, 0xf9, 0x2b, 0xb7, 0x2b, 0xb2, 0x22, 0xdd, 0x9d, 0x7c, 0xbe, 0xbc, 0xd6, 0xdc, 0xde, 0xfe, 0xc6, 0x97, 0x44, 0xb5, 0x0b, 0x37, 0x1c, 0xd7, 0x13, 0x38, 0x1c, 0xf8, 0x13, 0x39, 0x1c, 0xd8, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0xb7, 0x03, 0xd8, 0x0b, 0x97, 0x03, 0xb8, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0x97, 0x03, 0x56, 0x03, 0xf5, 0x1a, 0x17, 0x54, 0x1b, 0xbe, 0x3a, 0xce, 0xdc, 0xe6, 0xbd, 0xd6, 0xdf, 0xbe, 0x70, 0x12, 0xf5, 0x12, 0x17, 0x0b, 0xd5, 0x0a, 0xd5, 0x0a, 0xd6, 0x0a, 0x57, 0x13, 0x17, 0x0b, 0x57, 0x13, 0xf6, 0x02, 0x17, 0x0b, 0x17, 0x0b, 0xf6, 0x02, 0x58, 0x13, 0xf7, 0x0a, 0xd7, 0x02, 0x18, 0x0b, 0xd6, 0x02, 0xb6, 0x02, 0xd7, 0x02, 0x17, 0x13, 0xd6, 0x0a, 0x31, 0x12, 0x9c, 0xa5, 0x5d, 0xd6, 0xde, 0xee, 0xde, 0xde, 0xff, 0xb6, 0x12, 0x1b, 0x54, 0x13, 0x55, 0x0b, 0x16, 0x03, 0x37, 0x03, 0x38, 0x03, 0x59, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x37, 0x03, 0x58, 0x0b, 0x17, 0x03, 0x38, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x13, 0x37, 0x0b, 0xf6, 0x02, 0x17, 0x0b, 0x16, 0x0b, 0x92, 0x12, 0x3b, 0xbe, 0x7a, 0xde, 0xbc, 0xde, 0x1f, 0xd7, 0x5c, 0x7d, 0xb4, 0x0a, 0xb5, 0x02, 0xd6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0x18, 0x03, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb5, 0x02, 0xd6, 0x0a, 0xb6, 0x0a, 0x95, 0x02, 0x94, 0x02, 0xd6, 0x02, 0xf7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0x96, 0x02, 0x75, 0x0a, 0x32, 0x1a, 0x1b, 0x8d, 0x5c, 0xce, 0x7b, 0xde, 0xfd, 0xee, 0xde, 0xde, 0x5b, 0x8d, 0xf4, 0x32, 0x97, 0x43, 0x97, 0x3b, 0xf9, 0x43, 0xd9, 0x3b, 0xd8, 0x33, 0x1a, 0x3c, 0x97, 0x23, 0x19, 0x34, 0x97, 0x23, 0xb8, 0x23, 0xb8, 0x1b, 0x97, 0x13, 0xf9, 0x23, 0x77, 0x0b, 0x97, 0x03, 0xd8, 0x0b, 0x77, 0x0b, 0xd8, 0x13, 0x97, 0x0b, 0x35, 0x03, 0xf3, 0x12, 0x76, 0x5c, 0xf9, 0xb5, 0xba, 0xde, 0xbb, 0xe6, 0xbd, 0xce, 0x57, 0x4c, 0x76, 0x13, 0x58, 0x0b, 0xba, 0x13, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, 0x36, 0x03, 0x57, 0x0b, 0x16, 0x0b, 0xf6, 0x02, 0x16, 0x03, 0x36, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0x16, 0x03, 0x15, 0x03, 0x15, 0x0b, 0xd2, 0x22, 0x52, 0x4b, 0xbc, 0xce, 0x9b, 0xce, 0xdd, 0xc6, 0x79, 0x7d, 0x94, 0x1b, 0x55, 0x03, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x03, 0x76, 0x03, 0x55, 0x03, 0xf5, 0x02, 0x57, 0x13, 0x36, 0x03, 0xf5, 0x02, 0x36, 0x0b, 0x56, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x35, 0x03, 0x35, 0x0b, 0x14, 0x03, 0x14, 0x0b, 0xf3, 0x1a, 0x32, 0x43, 0x99, 0xad, 0x5a, 0xce, 0x9b, 0xce, 0x3f, 0xc7, 0x12, 0x23, 0x35, 0x13, 0x36, 0x03, 0x57, 0x03, 0x58, 0x03, 0x57, 0x03, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x15, 0x0b, 0xf6, 0x02, 0x17, 0x03, 0x17, 0x03, 0x16, 0x0b, 0x16, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x37, 0x03, 0x16, 0x03, 0x57, 0x13, 0xd2, 0x1a, 0x17, 0x8d, 0xb9, 0xad, 0x5e, 0xa6, 0xd3, 0x1a, 0xd4, 0x0a, 0xf5, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x0a, 0xd6, 0x02, 0xd6, 0x02, 0xf6, 0x0a, 0xd6, 0x0a, 0xd6, 0x0a, 0xd6, 0x0a, 0xd6, 0x0a, 0xd6, 0x0a, 0xd6, 0x0a, 0xd5, 0x0a, 0xd5, 0x0a, + 0xb7, 0x74, 0x19, 0x85, 0xf8, 0x84, 0x39, 0x85, 0x9a, 0x95, 0x9b, 0x95, 0x39, 0x85, 0x5a, 0x85, 0x1d, 0x9e, 0x3a, 0x7d, 0x76, 0x64, 0x56, 0x5c, 0xb8, 0x64, 0xf9, 0x6c, 0xb9, 0x64, 0x78, 0x5c, 0x16, 0x4c, 0xf5, 0x53, 0x74, 0x74, 0xdd, 0xd6, 0x1c, 0xef, 0xda, 0xee, 0xba, 0xde, 0xfc, 0xe6, 0x5e, 0xdf, 0xbd, 0xb6, 0x96, 0x54, 0x94, 0x23, 0xd6, 0x23, 0xb7, 0x2b, 0x14, 0x1b, 0xd8, 0x33, 0x97, 0x23, 0x97, 0x1b, 0x96, 0x1b, 0x96, 0x1b, 0x96, 0x23, 0x76, 0x23, 0x76, 0x23, 0x96, 0x2b, 0xb5, 0x2b, 0xb4, 0x2b, 0xb4, 0x33, 0x73, 0x2b, 0x72, 0x23, 0x72, 0x2b, 0xf3, 0x53, 0x9c, 0xc6, 0xda, 0xe6, 0x98, 0xde, 0x3c, 0xef, 0x1e, 0xd7, 0xf4, 0x53, 0x53, 0x2b, 0x34, 0x1b, 0x36, 0x13, 0x36, 0x0b, 0x57, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x76, 0x03, 0x56, 0x0b, 0x35, 0x0b, 0x15, 0x0b, 0x35, 0x0b, 0x35, 0x13, 0x55, 0x1b, 0x13, 0x23, 0x11, 0x33, 0x1b, 0xae, 0x39, 0xc6, 0x1b, 0xe7, 0xba, 0xde, 0x3e, 0xd7, 0xd4, 0x33, 0x17, 0x1c, 0xf7, 0x1b, 0x75, 0x0b, 0x38, 0x1c, 0xd7, 0x13, 0x56, 0x03, 0xf9, 0x13, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0xf8, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0xb8, 0x13, 0x78, 0x23, 0x37, 0x33, 0x59, 0x6c, 0x3c, 0xbe, 0x3a, 0xc6, 0xdb, 0xd6, 0xfc, 0xce, 0xfd, 0xc6, 0xd3, 0x53, 0x37, 0x64, 0x9a, 0x64, 0x3e, 0x6d, 0xf9, 0x33, 0x36, 0x1b, 0xf8, 0x33, 0xd8, 0x2b, 0x97, 0x23, 0x36, 0x13, 0xf9, 0x2b, 0xd9, 0x2b, 0x77, 0x1b, 0x98, 0x23, 0xd5, 0x0a, 0xb4, 0x02, 0x16, 0x13, 0xd5, 0x0a, 0xf6, 0x0a, 0xb6, 0x0a, 0xb5, 0x12, 0x72, 0x0a, 0x11, 0x2b, 0x5b, 0xb6, 0x9a, 0xce, 0xdb, 0xde, 0xfc, 0xd6, 0xff, 0xb6, 0x32, 0x2b, 0x33, 0x23, 0x34, 0x13, 0x14, 0x13, 0x96, 0x13, 0x74, 0x13, 0x74, 0x0b, 0x55, 0x03, 0x76, 0x03, 0x76, 0x03, 0xb7, 0x0b, 0x76, 0x03, 0xb7, 0x0b, 0x76, 0x03, 0x97, 0x03, 0x76, 0x03, 0x76, 0x03, 0x96, 0x0b, 0x76, 0x0b, 0x55, 0x03, 0x55, 0x03, 0x55, 0x03, 0xf1, 0x1a, 0x19, 0xb6, 0x79, 0xde, 0x9a, 0xd6, 0x1e, 0xd7, 0xfd, 0x9d, 0x91, 0x22, 0x92, 0x1a, 0x94, 0x0a, 0x95, 0x0a, 0x75, 0x02, 0xb6, 0x0a, 0x95, 0x0a, 0x96, 0x12, 0xb7, 0x1a, 0x75, 0x12, 0x95, 0x12, 0xd5, 0x1a, 0x94, 0x0a, 0xb3, 0x0a, 0xd4, 0x0a, 0xb5, 0x02, 0xb5, 0x02, 0x16, 0x0b, 0xf6, 0x0a, 0x17, 0x13, 0xb5, 0x12, 0xf0, 0x11, 0xfa, 0x84, 0xbd, 0xd6, 0xbc, 0xde, 0xdc, 0xe6, 0xfd, 0xd6, 0xbe, 0xae, 0x92, 0x33, 0x72, 0x2b, 0xb3, 0x33, 0x11, 0x1b, 0x73, 0x23, 0x13, 0x1b, 0x13, 0x13, 0xf3, 0x12, 0x96, 0x23, 0x55, 0x1b, 0x97, 0x23, 0xb8, 0x23, 0x98, 0x23, 0xf9, 0x2b, 0x77, 0x13, 0xd8, 0x23, 0x77, 0x1b, 0x19, 0x34, 0x19, 0x34, 0xb7, 0x1b, 0x76, 0x1b, 0xd2, 0x1a, 0x5a, 0x8d, 0xf8, 0xb5, 0xb9, 0xde, 0x99, 0xe6, 0xdc, 0xde, 0x39, 0x85, 0x12, 0x23, 0xb6, 0x2b, 0xf8, 0x23, 0xf8, 0x1b, 0xf8, 0x13, 0xb8, 0x13, 0x97, 0x0b, 0x97, 0x0b, 0x77, 0x0b, 0x76, 0x0b, 0x97, 0x13, 0x56, 0x0b, 0xb8, 0x1b, 0x19, 0x24, 0xf9, 0x23, 0x97, 0x13, 0x36, 0x03, 0x36, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x15, 0x13, 0x90, 0x1a, 0xb6, 0x74, 0x9b, 0xc6, 0x9a, 0xce, 0xfe, 0xd6, 0x18, 0x7d, 0x33, 0x0b, 0x56, 0x03, 0x78, 0x0b, 0x79, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x96, 0x1b, 0x55, 0x1b, 0x35, 0x13, 0x16, 0x13, 0x36, 0x0b, 0x76, 0x13, 0x76, 0x1b, 0x35, 0x13, 0x15, 0x0b, 0x36, 0x13, 0x56, 0x13, 0x36, 0x13, 0x76, 0x13, 0x14, 0x0b, 0x14, 0x0b, 0x13, 0x23, 0x73, 0x4b, 0xba, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfe, 0xc6, 0xf1, 0x2a, 0xd2, 0x12, 0x15, 0x0b, 0x36, 0x0b, 0x36, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x36, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x36, 0x03, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x15, 0x0b, 0xd2, 0x22, 0xf7, 0x84, 0x9d, 0xc6, 0xdd, 0x95, 0x34, 0x2b, 0x16, 0x0b, 0x17, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb5, 0x02, 0xb5, 0x02, + 0x1a, 0xe7, 0x1a, 0xe7, 0x1b, 0xef, 0xfa, 0xee, 0x1a, 0xef, 0xfa, 0xee, 0x1a, 0xef, 0x1a, 0xf7, 0xda, 0xee, 0xfa, 0xee, 0xfa, 0xee, 0xfb, 0xee, 0xda, 0xee, 0xdb, 0xee, 0xdb, 0xee, 0xdc, 0xee, 0x9c, 0xde, 0x9c, 0xde, 0xbb, 0xde, 0x3d, 0xef, 0xfc, 0xde, 0xfc, 0xde, 0x1c, 0xe7, 0x1c, 0xef, 0x3b, 0xef, 0x5b, 0xf7, 0x3b, 0xe7, 0xda, 0xd6, 0xdc, 0xce, 0xbc, 0xce, 0xbc, 0xd6, 0x9b, 0xd6, 0x9b, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0xba, 0xd6, 0xda, 0xce, 0xbb, 0xce, 0x9b, 0xd6, 0xbc, 0xd6, 0x9b, 0xd6, 0xdc, 0xe6, 0xbc, 0xe6, 0x9b, 0xde, 0x9b, 0xce, 0x9b, 0xce, 0x39, 0xce, 0xba, 0xe6, 0xda, 0xe6, 0xba, 0xde, 0xfb, 0xe6, 0x1d, 0xdf, 0xbc, 0xce, 0x7b, 0xbe, 0xfa, 0xad, 0xfb, 0xb5, 0xfa, 0xad, 0x1b, 0xb6, 0x3a, 0xb6, 0xd9, 0xad, 0x78, 0xa5, 0x58, 0xa5, 0x99, 0xa5, 0xda, 0xad, 0x5c, 0xc6, 0x1b, 0xc6, 0xd9, 0xb5, 0xb9, 0xb5, 0xba, 0xad, 0x79, 0xa5, 0x79, 0x9d, 0x38, 0x95, 0xb6, 0x7c, 0xf3, 0x6b, 0x78, 0xad, 0xf9, 0xc5, 0x99, 0xde, 0x98, 0xde, 0xba, 0xde, 0xdc, 0xd6, 0x7a, 0xa5, 0x5b, 0x9d, 0x1e, 0xae, 0x16, 0x6c, 0xde, 0x9d, 0x94, 0x43, 0x54, 0x3b, 0x75, 0x33, 0x74, 0x2b, 0x75, 0x2b, 0xb5, 0x2b, 0xf6, 0x33, 0x16, 0x3c, 0x16, 0x3c, 0xf5, 0x33, 0xd5, 0x33, 0xd6, 0x33, 0xf6, 0x3b, 0x15, 0x44, 0x15, 0x4c, 0x15, 0x54, 0x15, 0x5c, 0x16, 0x6c, 0x7b, 0xa5, 0x7c, 0xce, 0x9a, 0xd6, 0xbb, 0xd6, 0x1b, 0xdf, 0x1c, 0xd7, 0xd8, 0xb5, 0xfa, 0xc5, 0x7c, 0xd6, 0x1a, 0xc6, 0xf9, 0xbd, 0x1a, 0xc6, 0xfa, 0xbd, 0xfa, 0xbd, 0xd9, 0xb5, 0x98, 0xad, 0x98, 0xad, 0xd9, 0xad, 0xb9, 0xad, 0x3b, 0xbe, 0x1a, 0xb6, 0xda, 0xb5, 0xda, 0xb5, 0x37, 0x9d, 0xf7, 0x94, 0xf7, 0x84, 0x76, 0x74, 0xd7, 0x84, 0xfb, 0xbd, 0x1a, 0xce, 0x7a, 0xde, 0xfc, 0xee, 0xbc, 0xde, 0xfe, 0xde, 0x16, 0x95, 0xd5, 0x8c, 0x17, 0x8d, 0x58, 0x8d, 0x9a, 0x95, 0x18, 0x8d, 0xb7, 0x7c, 0xd8, 0x7c, 0xb8, 0x7c, 0x35, 0x64, 0xf4, 0x5b, 0x93, 0x53, 0x56, 0x6c, 0x97, 0x74, 0xf9, 0x7c, 0xb8, 0x7c, 0x56, 0x6c, 0x76, 0x6c, 0x19, 0x85, 0x19, 0x85, 0x76, 0x74, 0x97, 0x74, 0x58, 0x9d, 0x5a, 0xce, 0x9a, 0xde, 0xba, 0xd6, 0xbc, 0xd6, 0x9d, 0xce, 0x79, 0xa5, 0x1b, 0xae, 0x1c, 0xae, 0x9c, 0x9d, 0xda, 0x84, 0x77, 0x7c, 0x36, 0x74, 0x99, 0x7c, 0x1b, 0x8d, 0xb9, 0x7c, 0x99, 0x7c, 0xf6, 0x6b, 0xbd, 0xa5, 0xdd, 0x9d, 0xf9, 0x7c, 0xb9, 0x74, 0x37, 0x64, 0x94, 0x4b, 0x33, 0x3b, 0xb1, 0x2a, 0xf1, 0x3a, 0x15, 0x6c, 0x3c, 0xc6, 0x9a, 0xd6, 0x78, 0xd6, 0xda, 0xde, 0xfb, 0xde, 0xbc, 0xe6, 0x5b, 0xd6, 0x3b, 0xce, 0xfb, 0xc5, 0x59, 0xad, 0xda, 0xb5, 0x9a, 0xa5, 0xdb, 0xad, 0xf8, 0x8c, 0x19, 0x8d, 0xf9, 0x8c, 0xd9, 0x84, 0xb8, 0x7c, 0x77, 0x6c, 0x36, 0x64, 0xf6, 0x53, 0xd6, 0x4b, 0x34, 0x33, 0x16, 0x4c, 0x33, 0x33, 0xf2, 0x22, 0xf2, 0x2a, 0xb1, 0x32, 0x9a, 0x9d, 0x7b, 0xc6, 0x9a, 0xce, 0x7a, 0xd6, 0x1e, 0xe7, 0xbe, 0xc6, 0x96, 0x74, 0x76, 0x6c, 0x15, 0x54, 0x97, 0x5c, 0x57, 0x54, 0xd5, 0x43, 0x74, 0x3b, 0x73, 0x3b, 0x94, 0x3b, 0xd5, 0x43, 0x16, 0x4c, 0x78, 0x5c, 0x57, 0x54, 0x57, 0x54, 0x78, 0x54, 0x98, 0x54, 0x58, 0x4c, 0xd6, 0x3b, 0x75, 0x33, 0x55, 0x3b, 0x92, 0x2a, 0xb0, 0x3a, 0x1b, 0xb6, 0x9b, 0xce, 0x39, 0xce, 0x7c, 0xd6, 0x7a, 0xa5, 0x32, 0x3b, 0x95, 0x3b, 0x17, 0x4c, 0xf7, 0x4b, 0x55, 0x33, 0x34, 0x33, 0xb5, 0x4b, 0x36, 0x5c, 0x78, 0x64, 0xf6, 0x4b, 0x37, 0x54, 0xb9, 0x64, 0x57, 0x54, 0xd5, 0x4b, 0xf7, 0x4b, 0x38, 0x54, 0x17, 0x44, 0x95, 0x33, 0x75, 0x2b, 0x34, 0x23, 0xd6, 0x3b, 0x16, 0x54, 0x14, 0x74, 0xb9, 0xb5, 0x7a, 0xd6, 0x9a, 0xce, 0x5b, 0xbe, 0xd2, 0x5b, 0x52, 0x3b, 0x53, 0x33, 0x53, 0x33, 0x33, 0x2b, 0x33, 0x2b, 0x33, 0x2b, 0x13, 0x23, 0xf3, 0x1a, 0x13, 0x23, 0x74, 0x33, 0xf6, 0x4b, 0x78, 0x54, 0x73, 0x2b, 0x32, 0x1b, 0x11, 0x1b, 0x12, 0x1b, 0x32, 0x1b, 0x13, 0x13, 0xf2, 0x12, 0xf2, 0x1a, 0x12, 0x2b, 0xf0, 0x3a, 0xd6, 0x8c, 0xda, 0xad, 0xfc, 0x9d, 0xd2, 0x22, 0x14, 0x13, 0x15, 0x03, 0x56, 0x03, 0x56, 0x03, 0x55, 0x03, 0x56, 0x03, 0x56, 0x03, 0x35, 0x03, 0x56, 0x0b, 0x56, 0x0b, 0x35, 0x03, 0x15, 0x03, 0x14, 0x03, 0x14, 0x03, 0x14, 0x03, 0x14, 0x0b, 0x34, 0x0b, 0x34, 0x0b, + 0x3e, 0xef, 0xfd, 0xe6, 0x3d, 0xef, 0x3e, 0xef, 0x1d, 0xef, 0xfc, 0xe6, 0x3d, 0xef, 0xfc, 0xee, 0xfc, 0xee, 0x1c, 0xef, 0x1c, 0xef, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xef, 0x3d, 0xe7, 0x1c, 0xe7, 0x1b, 0xdf, 0xd9, 0xde, 0x19, 0xef, 0x3a, 0xef, 0x1b, 0xe7, 0x1c, 0xe7, 0xfc, 0xf6, 0x1d, 0xff, 0xfd, 0xfe, 0xdc, 0xf6, 0x1c, 0xff, 0xdb, 0xee, 0x3d, 0xe7, 0xfb, 0xde, 0x1b, 0xf7, 0xda, 0xf6, 0xdb, 0xee, 0xfc, 0xee, 0x1c, 0xef, 0xdb, 0xee, 0xfb, 0xee, 0xdb, 0xee, 0xdc, 0xee, 0xfd, 0xee, 0x3d, 0xef, 0x1c, 0xe7, 0x1b, 0xdf, 0x5c, 0xe7, 0x1c, 0xcf, 0xdb, 0xce, 0x9a, 0xde, 0xba, 0xe6, 0xdb, 0xe6, 0xbb, 0xe6, 0x3d, 0xef, 0xfc, 0xee, 0x1c, 0xef, 0xfb, 0xee, 0xdb, 0xee, 0xba, 0xee, 0x99, 0xee, 0x99, 0xee, 0x78, 0xde, 0x58, 0xde, 0x58, 0xde, 0x9a, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xda, 0xde, 0xda, 0xde, 0xb9, 0xd6, 0xda, 0xde, 0xdb, 0xde, 0xdc, 0xde, 0xfc, 0xde, 0xbc, 0xd6, 0x9c, 0xce, 0x1a, 0xc6, 0x5a, 0xd6, 0x7a, 0xe6, 0x17, 0xde, 0x78, 0xe6, 0xdb, 0xee, 0xdb, 0xe6, 0xba, 0xe6, 0x79, 0xde, 0xda, 0xe6, 0xda, 0xde, 0xba, 0xd6, 0xbb, 0xd6, 0xba, 0xd6, 0xdb, 0xd6, 0xdb, 0xd6, 0xbb, 0xd6, 0x9a, 0xd6, 0x9a, 0xde, 0xba, 0xe6, 0x9a, 0xe6, 0x7a, 0xe6, 0x5a, 0xe6, 0x5c, 0xe6, 0x7c, 0xe6, 0x9b, 0xde, 0x9a, 0xd6, 0xb9, 0xd6, 0x99, 0xce, 0x19, 0xc6, 0xbc, 0xe6, 0x7a, 0xe6, 0x7a, 0xe6, 0xba, 0xe6, 0x59, 0xde, 0xda, 0xe6, 0x99, 0xde, 0x99, 0xee, 0xba, 0xee, 0x9b, 0xe6, 0x9b, 0xde, 0xdc, 0xe6, 0x7a, 0xde, 0xdc, 0xe6, 0xbb, 0xde, 0xfc, 0xe6, 0xdc, 0xde, 0xbc, 0xde, 0x7b, 0xd6, 0x9b, 0xd6, 0xbc, 0xde, 0xbc, 0xde, 0xdc, 0xde, 0xbc, 0xde, 0xbb, 0xd6, 0xba, 0xd6, 0xda, 0xde, 0x9a, 0xd6, 0x7a, 0xde, 0x9a, 0xe6, 0xba, 0xe6, 0xba, 0xde, 0x1c, 0xe7, 0xbb, 0xde, 0x9a, 0xde, 0x59, 0xd6, 0x99, 0xde, 0x9a, 0xd6, 0xdb, 0xde, 0xbb, 0xe6, 0x9b, 0xe6, 0x9a, 0xde, 0x1c, 0xe7, 0xdb, 0xde, 0xfb, 0xde, 0x9a, 0xd6, 0xfb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xde, 0x79, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x9a, 0xde, 0x9b, 0xde, 0x7a, 0xde, 0x9a, 0xd6, 0x9b, 0xde, 0x9b, 0xde, 0xbb, 0xee, 0x99, 0xe6, 0x79, 0xde, 0x79, 0xe6, 0x59, 0xde, 0xb9, 0xe6, 0x98, 0xde, 0x79, 0xde, 0xba, 0xde, 0x79, 0xce, 0x7a, 0xd6, 0x7a, 0xde, 0x9b, 0xe6, 0x39, 0xd6, 0x59, 0xde, 0x9a, 0xe6, 0x59, 0xde, 0x7a, 0xde, 0x9b, 0xde, 0xbc, 0xde, 0x1b, 0xce, 0x3b, 0xd6, 0x3a, 0xde, 0x58, 0xe6, 0xba, 0xee, 0xfb, 0xe6, 0xba, 0xde, 0xdb, 0xe6, 0xdb, 0xee, 0x9a, 0xde, 0x9a, 0xde, 0xba, 0xde, 0x9a, 0xde, 0x9a, 0xd6, 0x59, 0xd6, 0xba, 0xde, 0x79, 0xd6, 0xba, 0xde, 0x9a, 0xde, 0xba, 0xde, 0x9a, 0xde, 0x38, 0xce, 0x7a, 0xd6, 0x3b, 0xce, 0x9c, 0xd6, 0x59, 0xce, 0xd7, 0xbd, 0x3a, 0xc6, 0x36, 0xa5, 0x99, 0xbd, 0x5b, 0xde, 0x58, 0xce, 0x99, 0xd6, 0x9a, 0xde, 0x39, 0xde, 0x3a, 0xde, 0x5a, 0xde, 0x59, 0xde, 0x79, 0xde, 0x39, 0xde, 0x3a, 0xde, 0x3a, 0xde, 0x3a, 0xde, 0x3a, 0xde, 0x3a, 0xde, 0x1a, 0xde, 0x3a, 0xde, 0x1a, 0xd6, 0x1a, 0xd6, 0xf9, 0xcd, 0xf9, 0xc5, 0xf9, 0xc5, 0xf9, 0xc5, 0xfa, 0xbd, 0xfa, 0xc5, 0x1b, 0xce, 0x1a, 0xce, 0x3a, 0xc6, 0x39, 0xc6, 0x99, 0xd6, 0x38, 0xd6, 0x5a, 0xde, 0x7b, 0xde, 0x59, 0xce, 0xd7, 0xbd, 0xb7, 0xbd, 0xd8, 0xc5, 0xb9, 0xb5, 0x98, 0xad, 0xd9, 0xb5, 0x1a, 0xbe, 0xf9, 0xc5, 0x5a, 0xce, 0x59, 0xce, 0xf9, 0xc5, 0xf8, 0xbd, 0xb8, 0xbd, 0xb9, 0xb5, 0xfa, 0xbd, 0x99, 0xad, 0x58, 0x9d, 0x79, 0x95, 0x18, 0x8d, 0x79, 0x95, 0x78, 0xa5, 0xf5, 0xac, 0x38, 0xde, 0x58, 0xde, 0x79, 0xde, 0x7a, 0xd6, 0x59, 0xc6, 0x39, 0xc6, 0x19, 0xbe, 0x19, 0xc6, 0x19, 0xc6, 0x19, 0xc6, 0xf9, 0xc5, 0xf9, 0xbd, 0xd9, 0xbd, 0xf9, 0xbd, 0x39, 0xce, 0x59, 0xd6, 0x5a, 0xd6, 0x5b, 0xce, 0xda, 0xb5, 0x99, 0xad, 0x9a, 0xad, 0xba, 0xa5, 0x9a, 0xa5, 0x7a, 0xa5, 0x9a, 0xa5, 0x9a, 0xad, 0x98, 0xb5, 0x97, 0xc5, 0xd8, 0xc5, 0x9d, 0xc6, 0x93, 0x4b, 0x32, 0x2b, 0x54, 0x23, 0xd2, 0x12, 0xb2, 0x12, 0xb2, 0x1a, 0xd2, 0x1a, 0xd2, 0x1a, 0xf3, 0x22, 0x13, 0x23, 0x33, 0x2b, 0x74, 0x33, 0x54, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x53, 0x3b, 0x53, 0x3b, 0x73, 0x3b, + 0x5e, 0xdf, 0x5e, 0xdf, 0x3e, 0xdf, 0x3e, 0xdf, 0x3d, 0xdf, 0x1d, 0xdf, 0xfc, 0xde, 0xfc, 0xde, 0x3d, 0xe7, 0x1c, 0xdf, 0xfc, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0x1c, 0xe7, 0x1d, 0xef, 0x1d, 0xe7, 0xdd, 0xde, 0xff, 0xe6, 0xfe, 0xe6, 0x1b, 0xe7, 0x1a, 0xe7, 0x3a, 0xe7, 0x5c, 0xef, 0x7e, 0xef, 0x3e, 0xe7, 0x7e, 0xe7, 0x3d, 0xe7, 0x1d, 0xdf, 0x1d, 0xdf, 0xfd, 0xd6, 0x1e, 0xdf, 0xdd, 0xde, 0x7c, 0xd6, 0xbd, 0xde, 0xfe, 0xe6, 0xfe, 0xde, 0xbe, 0xde, 0xbe, 0xd6, 0xbd, 0xd6, 0xbe, 0xd6, 0x9d, 0xce, 0xbd, 0xd6, 0xfe, 0xde, 0xdd, 0xde, 0x7b, 0xd6, 0x5b, 0xd6, 0x9c, 0xde, 0xdc, 0xde, 0xfc, 0xe6, 0xfa, 0xee, 0x5d, 0xef, 0x3e, 0xd7, 0x3f, 0xcf, 0x5e, 0xdf, 0x1c, 0xdf, 0x1c, 0xdf, 0xfc, 0xde, 0xfc, 0xde, 0xfd, 0xde, 0xfc, 0xde, 0xfd, 0xde, 0x1d, 0xdf, 0xfd, 0xde, 0xdc, 0xe6, 0xbc, 0xe6, 0xdd, 0xde, 0xde, 0xde, 0xbd, 0xe6, 0xbd, 0xe6, 0xbd, 0xe6, 0x9d, 0xe6, 0xbe, 0xde, 0xfa, 0xc5, 0x9c, 0xde, 0x7a, 0xd6, 0x79, 0xde, 0xb9, 0xe6, 0x1a, 0xef, 0xfa, 0xee, 0xfa, 0xee, 0xdb, 0xee, 0xfd, 0xde, 0xfe, 0xde, 0xfe, 0xd6, 0xbd, 0xce, 0xfd, 0xd6, 0xdd, 0xce, 0xfd, 0xce, 0xdd, 0xce, 0xbd, 0xd6, 0x9d, 0xd6, 0x9c, 0xde, 0x9d, 0xde, 0xdd, 0xde, 0xfe, 0xde, 0xbd, 0xce, 0xfe, 0xd6, 0xbe, 0xce, 0xde, 0xce, 0x1b, 0xae, 0x98, 0xa5, 0x18, 0xbe, 0x59, 0xd6, 0x79, 0xde, 0x79, 0xe6, 0xda, 0xee, 0x38, 0xd6, 0xfe, 0xd6, 0x7c, 0xb6, 0xfa, 0xad, 0xbd, 0xce, 0x9c, 0xce, 0x9d, 0xce, 0x9c, 0xce, 0x9c, 0xce, 0x9c, 0xc6, 0x9c, 0xce, 0x9c, 0xce, 0x9c, 0xce, 0xbc, 0xce, 0xbc, 0xce, 0xbc, 0xce, 0xbc, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0xbb, 0xd6, 0xfc, 0xe6, 0xfb, 0xe6, 0x9a, 0xde, 0xba, 0xe6, 0x59, 0xde, 0x7a, 0xde, 0xba, 0xe6, 0xdb, 0xe6, 0xfc, 0xde, 0xfd, 0xde, 0xbd, 0xe6, 0xbd, 0xe6, 0xfd, 0xde, 0x1d, 0xdf, 0xdd, 0xde, 0xbc, 0xde, 0xfc, 0xde, 0x1c, 0xdf, 0x1c, 0xdf, 0xfc, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0xfc, 0xde, 0xdc, 0xde, 0xbb, 0xce, 0xfd, 0xde, 0xfd, 0xde, 0xbb, 0xd6, 0xdc, 0xde, 0xdc, 0xde, 0x7b, 0xd6, 0x9b, 0xde, 0x9a, 0xd6, 0x7a, 0xd6, 0x9a, 0xe6, 0x9a, 0xe6, 0xdb, 0xde, 0xfc, 0xde, 0xdd, 0xde, 0xdd, 0xde, 0xfd, 0xde, 0x1c, 0xdf, 0x1b, 0xd7, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0xbb, 0xe6, 0xbb, 0xe6, 0xdb, 0xd6, 0xba, 0xce, 0x1b, 0xdf, 0xda, 0xde, 0xda, 0xd6, 0xda, 0xde, 0x99, 0xd6, 0xba, 0xd6, 0x9a, 0xce, 0xfc, 0xde, 0x7b, 0xd6, 0x5a, 0xd6, 0x9b, 0xee, 0x7b, 0xe6, 0x9c, 0xde, 0xfe, 0xe6, 0xdc, 0xe6, 0xdb, 0xe6, 0xfc, 0xe6, 0xbb, 0xd6, 0x1d, 0xdf, 0xdc, 0xd6, 0xfd, 0xde, 0xbb, 0xd6, 0xbb, 0xd6, 0xbb, 0xde, 0xba, 0xde, 0xba, 0xde, 0xba, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdc, 0xde, 0xdd, 0xde, 0xbd, 0xd6, 0xdc, 0xde, 0xdb, 0xd6, 0xbc, 0xc6, 0x9c, 0xc6, 0x7c, 0xd6, 0x7b, 0xde, 0xdb, 0xde, 0x59, 0xce, 0x7a, 0xce, 0xbb, 0xde, 0x9a, 0xde, 0x9a, 0xe6, 0xdb, 0xee, 0x59, 0xde, 0xbb, 0xe6, 0x9b, 0xde, 0xdb, 0xe6, 0x9b, 0xde, 0xbb, 0xe6, 0x39, 0xd6, 0x7a, 0xde, 0x9a, 0xde, 0x59, 0xd6, 0x9a, 0xde, 0x59, 0xde, 0x79, 0xde, 0xba, 0xe6, 0x39, 0xd6, 0x9a, 0xde, 0x59, 0xd6, 0x3a, 0xd6, 0x59, 0xd6, 0x38, 0xd6, 0x37, 0xd6, 0x79, 0xd6, 0x18, 0xd6, 0x99, 0xe6, 0x79, 0xde, 0x99, 0xde, 0xbb, 0xde, 0x1a, 0xde, 0x98, 0xcd, 0x7a, 0xe6, 0x59, 0xd6, 0x99, 0xce, 0x99, 0xce, 0x79, 0xce, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0xbb, 0xde, 0x7b, 0xd6, 0x5a, 0xd6, 0x9b, 0xd6, 0x9a, 0xce, 0x7a, 0xce, 0x5a, 0xce, 0xf8, 0xcd, 0xf6, 0xd5, 0xf5, 0xd5, 0x58, 0xd6, 0x58, 0xce, 0x77, 0xd6, 0x98, 0xde, 0x99, 0xde, 0x79, 0xde, 0x9a, 0xde, 0x59, 0xde, 0x59, 0xd6, 0x59, 0xde, 0x1a, 0xde, 0xfa, 0xd5, 0x7a, 0xce, 0x9b, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x79, 0xd6, 0x9a, 0xd6, 0x9b, 0xce, 0x7b, 0xce, 0x3b, 0xd6, 0x3a, 0xde, 0x3a, 0xce, 0x39, 0xce, 0x17, 0xc6, 0xb5, 0xbd, 0xf7, 0xcd, 0x79, 0xde, 0xba, 0xde, 0x38, 0xd6, 0x18, 0xde, 0x18, 0xde, 0x38, 0xd6, 0x38, 0xd6, 0x19, 0xd6, 0x19, 0xce, 0x19, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x58, 0xd6, 0x17, 0xd6, 0x38, 0xd6, 0x39, 0xde, 0xf8, 0xcd, 0x19, 0xde, 0xf8, 0xd5, 0xf7, 0xd5, 0x17, 0xd6, + 0x78, 0x34, 0x58, 0x34, 0x17, 0x2c, 0x17, 0x34, 0x38, 0x3c, 0x58, 0x3c, 0x99, 0x44, 0xda, 0x4c, 0xb9, 0x4c, 0x99, 0x44, 0x98, 0x44, 0x98, 0x4c, 0x98, 0x4c, 0xb9, 0x4c, 0xfa, 0x5c, 0x3a, 0x6d, 0xb9, 0x8d, 0x78, 0x95, 0x79, 0x95, 0x99, 0xa5, 0xfc, 0xde, 0x7d, 0xef, 0x5d, 0xef, 0x9f, 0xe7, 0x5d, 0xae, 0xb8, 0x5c, 0xd8, 0x54, 0xb9, 0x44, 0x58, 0x3c, 0x58, 0x3c, 0x58, 0x34, 0xf7, 0x23, 0x59, 0x24, 0x38, 0x1c, 0x38, 0x1c, 0x59, 0x1c, 0x58, 0x1c, 0x38, 0x1c, 0x38, 0x14, 0x18, 0x14, 0x18, 0x14, 0x18, 0x14, 0x18, 0x14, 0x38, 0x1c, 0x38, 0x1c, 0xf7, 0x1b, 0x38, 0x24, 0x97, 0x44, 0xbd, 0xbe, 0xfc, 0xde, 0xfc, 0xe6, 0x1e, 0xd7, 0x18, 0x6d, 0x78, 0x4c, 0x77, 0x4c, 0x78, 0x4c, 0x99, 0x4c, 0x78, 0x44, 0x18, 0x34, 0xf7, 0x33, 0xf7, 0x33, 0x18, 0x3c, 0x79, 0x3c, 0xba, 0x44, 0x78, 0x2c, 0x58, 0x24, 0x58, 0x24, 0x38, 0x24, 0x16, 0x1c, 0x16, 0x24, 0x16, 0x2c, 0xf6, 0x33, 0xf5, 0x33, 0x15, 0x3c, 0xd7, 0x6c, 0xbd, 0xbe, 0x9b, 0xce, 0xdb, 0xde, 0xdb, 0xe6, 0xfc, 0xde, 0xde, 0xc6, 0xb7, 0x6c, 0x54, 0x33, 0x15, 0x2b, 0x35, 0x23, 0xb4, 0x12, 0xb3, 0x12, 0xf5, 0x1a, 0xd5, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x12, 0x97, 0x12, 0xb7, 0x0a, 0xb7, 0x12, 0x96, 0x12, 0x75, 0x0a, 0x56, 0x0a, 0x36, 0x0a, 0x76, 0x0a, 0x75, 0x12, 0xf3, 0x2a, 0x5e, 0xae, 0x9c, 0xc6, 0x5a, 0xc6, 0x39, 0xc6, 0x1f, 0xcf, 0x54, 0x2b, 0x37, 0x13, 0xb8, 0x0a, 0x98, 0x0a, 0x98, 0x02, 0xb8, 0x0a, 0xb8, 0x02, 0x98, 0x02, 0x97, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0x17, 0x0b, 0x36, 0x1b, 0x76, 0x33, 0x17, 0x5c, 0xde, 0xce, 0xdc, 0xde, 0xba, 0xe6, 0xfa, 0xee, 0x1c, 0xe7, 0xdc, 0xd6, 0x5d, 0xbe, 0x56, 0x64, 0xb4, 0x2b, 0xf6, 0x2b, 0xd7, 0x23, 0x97, 0x1b, 0x57, 0x13, 0x57, 0x13, 0x57, 0x13, 0x37, 0x13, 0x16, 0x0b, 0x16, 0x13, 0x57, 0x13, 0x37, 0x13, 0x98, 0x1b, 0x97, 0x1b, 0x97, 0x1b, 0x77, 0x1b, 0x36, 0x13, 0xb4, 0x0a, 0x36, 0x1b, 0x99, 0x54, 0xbe, 0xc6, 0x7a, 0xd6, 0xdc, 0xe6, 0x3e, 0xe7, 0xff, 0xbe, 0x15, 0x54, 0xb5, 0x43, 0xb7, 0x3b, 0xd7, 0x3b, 0x95, 0x2b, 0xd6, 0x33, 0x78, 0x4c, 0xb9, 0x4c, 0x79, 0x4c, 0x9a, 0x5c, 0x3c, 0x75, 0xd7, 0x4b, 0xb6, 0x4b, 0x57, 0x5c, 0x98, 0x6c, 0x3a, 0x7d, 0xdc, 0x95, 0x1c, 0xa6, 0xbe, 0xb6, 0xbe, 0xb6, 0x3b, 0xae, 0xb8, 0xa5, 0xdb, 0xd6, 0x99, 0xde, 0xd9, 0xe6, 0xda, 0xde, 0xfb, 0xde, 0x1d, 0xe7, 0xdc, 0xd6, 0xdd, 0xce, 0xfe, 0xce, 0xbd, 0xbe, 0x79, 0x8d, 0x9a, 0x8d, 0x9a, 0x8d, 0x1c, 0x9e, 0x3c, 0xa6, 0x3c, 0xa6, 0x1c, 0x9e, 0xfc, 0x95, 0xbb, 0x8d, 0x9b, 0x85, 0x7a, 0x7d, 0x3a, 0x7d, 0xf9, 0x74, 0xf8, 0x74, 0xb7, 0x64, 0xf4, 0x43, 0x73, 0x43, 0x35, 0x74, 0x7c, 0xce, 0x7a, 0xd6, 0x99, 0xde, 0xdb, 0xe6, 0xdc, 0xe6, 0xf9, 0xbd, 0xde, 0xd6, 0x5d, 0xbe, 0x9f, 0xbe, 0xfd, 0xad, 0xfd, 0xad, 0x9b, 0x9d, 0xbc, 0xa5, 0xfc, 0xad, 0x9f, 0xc6, 0x5e, 0xbe, 0x1c, 0xb6, 0x3d, 0xbe, 0x9f, 0xc6, 0xbb, 0xad, 0xbf, 0xce, 0x3d, 0xbe, 0x9f, 0xc6, 0xfc, 0xb5, 0xdb, 0xad, 0x5d, 0xb6, 0xdb, 0xad, 0x5a, 0xc6, 0x7a, 0xce, 0x7b, 0xd6, 0x7b, 0xd6, 0x9b, 0xde, 0xbc, 0xd6, 0x3a, 0xae, 0x7f, 0xcf, 0x9a, 0x95, 0x39, 0x8d, 0x59, 0x8d, 0x58, 0x8d, 0x9a, 0x8d, 0x59, 0x85, 0x9b, 0x8d, 0x9b, 0x95, 0x9b, 0x95, 0xbc, 0x9d, 0x9b, 0x95, 0x9b, 0x95, 0x19, 0x85, 0xf9, 0x7c, 0x19, 0x85, 0x3a, 0x85, 0x19, 0x7d, 0xf9, 0x74, 0xd9, 0x74, 0xb8, 0x7c, 0x99, 0xa5, 0xdc, 0xd6, 0x5a, 0xce, 0x5a, 0xd6, 0x9a, 0xe6, 0x79, 0xde, 0xfc, 0xde, 0x7b, 0xce, 0xbc, 0xd6, 0xbc, 0xde, 0xbb, 0xd6, 0xbb, 0xde, 0x9c, 0xde, 0x7b, 0xd6, 0xba, 0xce, 0xba, 0xce, 0x99, 0xd6, 0x79, 0xd6, 0x78, 0xde, 0x78, 0xde, 0x98, 0xde, 0x98, 0xde, 0x77, 0xde, 0x57, 0xd6, 0x78, 0xd6, 0x9a, 0xde, 0x39, 0xce, 0x18, 0xc6, 0x79, 0xce, 0x59, 0xce, 0x9b, 0xd6, 0xbb, 0xd6, 0x7a, 0xd6, 0x18, 0xce, 0xd7, 0xcd, 0x59, 0xde, 0x9a, 0xe6, 0x7a, 0xde, 0x39, 0xd6, 0x59, 0xd6, 0x7a, 0xde, 0x7a, 0xde, 0x59, 0xd6, 0x5a, 0xd6, 0xf8, 0xc5, 0x9b, 0xde, 0x5a, 0xce, 0x9b, 0xde, 0x19, 0xc6, 0x5a, 0xce, + 0x5b, 0x0c, 0x3b, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x5a, 0x1c, 0x79, 0x1c, 0x98, 0x2c, 0x58, 0x34, 0x36, 0x4c, 0x9d, 0xbe, 0x5f, 0xef, 0x3f, 0xef, 0x5f, 0xdf, 0xfa, 0x64, 0x96, 0x13, 0x18, 0x0c, 0x19, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0x1a, 0x04, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0x1a, 0x04, 0x1a, 0x04, 0x1a, 0x04, 0xfa, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xb8, 0x03, 0xd8, 0x0b, 0xd6, 0x2b, 0x7b, 0xbe, 0xba, 0xde, 0xfb, 0xe6, 0x5f, 0xd7, 0x16, 0x3c, 0xb7, 0x13, 0x97, 0x0b, 0xb8, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb7, 0x03, 0xb6, 0x1b, 0x93, 0x33, 0x5c, 0xae, 0x39, 0xc6, 0x7a, 0xde, 0xdb, 0xee, 0x1f, 0xe7, 0x9d, 0x85, 0x16, 0x1b, 0xd6, 0x0a, 0xb8, 0x02, 0x77, 0x02, 0x98, 0x02, 0xb8, 0x0a, 0x77, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x02, 0x58, 0x02, 0x58, 0x0a, 0x58, 0x0a, 0x58, 0x02, 0x58, 0x02, 0x57, 0x02, 0x57, 0x02, 0x58, 0x0a, 0xf7, 0x01, 0x78, 0x0a, 0x96, 0x12, 0x10, 0x12, 0xfc, 0xa5, 0x19, 0xc6, 0x38, 0xd6, 0x79, 0xd6, 0xfe, 0xce, 0xb2, 0x12, 0x18, 0x0b, 0x1a, 0x0b, 0x7a, 0x02, 0x58, 0x02, 0x38, 0x0a, 0x38, 0x02, 0x38, 0x02, 0x38, 0x02, 0x58, 0x02, 0x58, 0x02, 0x38, 0x02, 0x37, 0x02, 0x38, 0x02, 0x38, 0x02, 0x38, 0x02, 0x37, 0x02, 0x37, 0x02, 0x37, 0x02, 0x37, 0x02, 0x78, 0x0a, 0x56, 0x0a, 0x34, 0x0a, 0x72, 0x22, 0x7d, 0xc6, 0xba, 0xde, 0x99, 0xde, 0xda, 0xde, 0x3d, 0xdf, 0x9f, 0xdf, 0xba, 0x6c, 0xb5, 0x1a, 0xf7, 0x12, 0xf9, 0x12, 0x38, 0x02, 0xbb, 0x12, 0xb9, 0x0a, 0xb9, 0x02, 0xd9, 0x0a, 0xb9, 0x02, 0x98, 0x02, 0xb8, 0x02, 0xd8, 0x0a, 0xb8, 0x02, 0xd8, 0x0a, 0x97, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xd7, 0x0a, 0xb6, 0x0a, 0xb6, 0x0a, 0x35, 0x33, 0x9e, 0xce, 0x7a, 0xde, 0xfb, 0xe6, 0xfd, 0xce, 0x7b, 0x7d, 0xd3, 0x0a, 0x35, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x19, 0x03, 0x38, 0x03, 0x59, 0x03, 0x58, 0x03, 0x17, 0x03, 0x38, 0x0b, 0x99, 0x13, 0x38, 0x03, 0xd6, 0x02, 0x16, 0x0b, 0x36, 0x0b, 0x57, 0x13, 0x97, 0x23, 0x97, 0x2b, 0x18, 0x3c, 0x9a, 0x4c, 0xb6, 0x3b, 0x94, 0x4b, 0xba, 0x9d, 0x7a, 0xce, 0xfb, 0xe6, 0xfb, 0xe6, 0xfd, 0xd6, 0xff, 0xbe, 0x39, 0x75, 0x76, 0x54, 0x7b, 0x75, 0x9d, 0x6d, 0x95, 0x2b, 0x75, 0x1b, 0xb6, 0x23, 0x18, 0x2c, 0x18, 0x34, 0x38, 0x2c, 0x19, 0x2c, 0xf8, 0x23, 0xd8, 0x1b, 0x98, 0x13, 0x77, 0x0b, 0x1a, 0x2c, 0x56, 0x13, 0xf4, 0x02, 0x56, 0x0b, 0x56, 0x0b, 0x15, 0x13, 0x53, 0x3b, 0x1c, 0xae, 0x7a, 0xce, 0x99, 0xde, 0xbb, 0xe6, 0xdc, 0xde, 0xdf, 0xce, 0x5b, 0x8d, 0x56, 0x3b, 0x78, 0x33, 0xf5, 0x12, 0x16, 0x13, 0x93, 0x02, 0xb4, 0x0a, 0xb4, 0x0a, 0x77, 0x23, 0xf5, 0x1a, 0xb4, 0x0a, 0x15, 0x1b, 0x76, 0x23, 0xb4, 0x12, 0x77, 0x2b, 0x56, 0x23, 0x97, 0x2b, 0xf5, 0x1a, 0xb4, 0x12, 0xb4, 0x22, 0x92, 0x2a, 0x52, 0x53, 0x1b, 0xb6, 0x7c, 0xce, 0x7c, 0xd6, 0x7d, 0xce, 0x39, 0x95, 0x52, 0x33, 0x1b, 0x5d, 0x14, 0x13, 0x15, 0x1b, 0xd3, 0x12, 0xd4, 0x12, 0xd5, 0x1a, 0xb4, 0x12, 0xb4, 0x12, 0x36, 0x23, 0x16, 0x23, 0x36, 0x23, 0x76, 0x2b, 0x15, 0x1b, 0x36, 0x1b, 0xf5, 0x1a, 0xf5, 0x1a, 0x15, 0x1b, 0x16, 0x13, 0xf5, 0x12, 0xd5, 0x12, 0xd4, 0x1a, 0xb6, 0x4b, 0xfc, 0xad, 0x5b, 0xce, 0x39, 0xde, 0x79, 0xe6, 0xdb, 0xee, 0x7b, 0xce, 0x5c, 0xc6, 0x5c, 0xc6, 0x9d, 0xce, 0x1a, 0xbe, 0x5b, 0xc6, 0x3c, 0xce, 0x3c, 0xce, 0x7c, 0xce, 0x9b, 0xd6, 0x7b, 0xd6, 0x7c, 0xde, 0x7c, 0xd6, 0x5c, 0xd6, 0x7c, 0xd6, 0x9c, 0xde, 0x9a, 0xd6, 0x9a, 0xd6, 0x7c, 0xd6, 0x3b, 0xce, 0x1b, 0xce, 0xd9, 0xc5, 0x9a, 0xd6, 0x79, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0x7a, 0xd6, 0x5a, 0xce, 0x5a, 0xd6, 0x59, 0xde, 0x59, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x7b, 0xd6, 0x7b, 0xce, 0x9c, 0xce, 0x9b, 0xce, 0x9c, 0xce, 0xbc, 0xce, 0xfd, 0xd6, 0xbd, 0xce, 0x5b, 0xbe, + 0x19, 0x04, 0xf9, 0x03, 0x1a, 0x04, 0x3a, 0x0c, 0x5b, 0x14, 0x5b, 0x14, 0x5b, 0x14, 0x5b, 0x14, 0xbc, 0x1c, 0x9b, 0x1c, 0x9b, 0x14, 0xbb, 0x1c, 0xbb, 0x1c, 0x9b, 0x1c, 0x5a, 0x14, 0x3a, 0x0c, 0x1a, 0x04, 0x5b, 0x04, 0x1a, 0x04, 0xb5, 0x1b, 0x1c, 0xa6, 0xfe, 0xde, 0x3e, 0xef, 0x3f, 0xd7, 0x94, 0x33, 0xf8, 0x1b, 0x19, 0x14, 0xf9, 0x0b, 0x19, 0x14, 0xb8, 0x0b, 0xf8, 0x03, 0x3a, 0x0c, 0x9b, 0x1c, 0xbc, 0x1c, 0x7b, 0x14, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xf9, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0x54, 0x1b, 0x3b, 0xb6, 0xba, 0xde, 0xfc, 0xde, 0x3f, 0xcf, 0x17, 0x34, 0x19, 0x14, 0xd9, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfa, 0x03, 0xd9, 0x0b, 0xd8, 0x0b, 0xd8, 0x0b, 0xd8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x13, 0xb8, 0x0b, 0xd7, 0x0b, 0xd8, 0x0b, 0x19, 0x04, 0xf9, 0x03, 0x1a, 0x0c, 0xb7, 0x13, 0x52, 0x23, 0x1b, 0x9e, 0x9b, 0xce, 0x7a, 0xde, 0xfc, 0xee, 0xff, 0xd6, 0x15, 0x2b, 0x97, 0x02, 0xfa, 0x0a, 0x9a, 0x02, 0x7a, 0x02, 0x9a, 0x0a, 0x58, 0x0a, 0x37, 0x02, 0x79, 0x0a, 0x78, 0x0a, 0x58, 0x0a, 0x57, 0x0a, 0x57, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x57, 0x02, 0x58, 0x02, 0x7a, 0x02, 0x3a, 0x02, 0xf9, 0x01, 0x19, 0x02, 0x59, 0x1a, 0x14, 0x22, 0xfc, 0x94, 0xfc, 0xc5, 0xfb, 0xcd, 0xbd, 0xde, 0xbc, 0xa5, 0xb5, 0x1a, 0xd8, 0x02, 0xba, 0x02, 0x5a, 0x02, 0x18, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0xf7, 0x01, 0x38, 0x02, 0x58, 0x0a, 0x58, 0x0a, 0x38, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x17, 0x02, 0x16, 0x02, 0x16, 0x0a, 0x15, 0x0a, 0x12, 0x1a, 0x9a, 0xad, 0x9a, 0xde, 0xdb, 0xe6, 0xdc, 0xde, 0x1e, 0xd7, 0x19, 0x7d, 0xd5, 0x12, 0xd7, 0x02, 0x17, 0x03, 0x18, 0x0b, 0xd7, 0x12, 0xf8, 0x12, 0xf9, 0x0a, 0xf9, 0x02, 0xf9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xf7, 0x02, 0x18, 0x0b, 0xf7, 0x0a, 0x38, 0x13, 0x58, 0x13, 0xd6, 0x0a, 0x72, 0x1a, 0x5d, 0xc6, 0x9b, 0xde, 0x1b, 0xe7, 0x1e, 0xcf, 0x74, 0x33, 0x56, 0x13, 0x77, 0x13, 0x78, 0x0b, 0x39, 0x03, 0x5a, 0x0b, 0x59, 0x0b, 0x17, 0x0b, 0x17, 0x03, 0x58, 0x0b, 0x58, 0x13, 0x58, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x38, 0x03, 0x17, 0x03, 0xb6, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0x95, 0x0a, 0x73, 0x12, 0x17, 0x64, 0x7d, 0xc6, 0xbd, 0xde, 0xdd, 0xde, 0x1f, 0xcf, 0xb4, 0x33, 0xb6, 0x1b, 0xb7, 0x13, 0x56, 0x03, 0x77, 0x03, 0x77, 0x03, 0xd9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x16, 0x03, 0xd3, 0x1a, 0xfd, 0xa5, 0x7b, 0xce, 0x7a, 0xd6, 0xfc, 0xee, 0xde, 0xde, 0xbc, 0x9d, 0xb0, 0x09, 0xf3, 0x01, 0x16, 0x02, 0xf6, 0x09, 0xd6, 0x09, 0xd6, 0x09, 0xd6, 0x09, 0xf6, 0x09, 0xd5, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0x74, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0xd6, 0x09, 0x95, 0x01, 0xd5, 0x09, 0xb5, 0x01, 0xd5, 0x09, 0xb3, 0x09, 0x8e, 0x19, 0xb8, 0x94, 0x7c, 0xd6, 0x9c, 0xde, 0xde, 0xde, 0x9c, 0xa5, 0x71, 0x12, 0x57, 0x1b, 0xd6, 0x02, 0xb6, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0x76, 0x02, 0x97, 0x0a, 0xb6, 0x0a, 0x95, 0x02, 0x54, 0x02, 0x95, 0x0a, 0x94, 0x02, 0x1a, 0x34, 0x54, 0x02, 0xb6, 0x0a, 0x75, 0x02, 0x95, 0x02, 0xb5, 0x02, 0xb5, 0x02, 0xb6, 0x0a, 0x74, 0x0a, 0xb3, 0x22, 0x3b, 0x8d, 0x1c, 0xc6, 0x5c, 0xd6, 0x7d, 0xd6, 0x7e, 0xbe, 0x12, 0x33, 0xf3, 0x1a, 0xd3, 0x0a, 0x15, 0x13, 0x14, 0x03, 0x35, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0x56, 0x03, 0x76, 0x0b, 0x76, 0x0b, 0x96, 0x13, 0x75, 0x1b, 0xd6, 0x23, 0xf7, 0x2b, 0x16, 0x34, 0xb9, 0x4c, 0xbd, 0x75, 0xfb, 0x64, 0xf3, 0x2a, 0xd2, 0x32, 0x14, 0x6c, 0x59, 0xbe, 0x58, 0xce, 0x9b, 0xc6, 0x9d, 0xc6, 0x3d, 0xbe, 0x7f, 0xbe, 0x1e, 0xa6, 0xf9, 0x74, 0xd7, 0x6c, 0xfc, 0x95, 0x9f, 0xa6, 0xbb, 0x85, 0x78, 0x5c, 0x37, 0x54, 0xd6, 0x43, 0x74, 0x33, 0x37, 0x4c, 0x36, 0x44, 0x77, 0x4c, 0x33, 0x23, 0x34, 0x23, 0xb2, 0x12, + 0x5a, 0x0c, 0x1a, 0x04, 0x1a, 0x04, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x19, 0x0c, 0xf9, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xf9, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xfa, 0x0b, 0xf9, 0x13, 0x95, 0x1b, 0xda, 0xa5, 0xfc, 0xde, 0x5d, 0xef, 0x3e, 0xd7, 0xb4, 0x2b, 0xdb, 0x34, 0xf9, 0x0b, 0xb9, 0x0b, 0xf9, 0x13, 0xb9, 0x0b, 0xb9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xd9, 0x13, 0xd9, 0x13, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x79, 0x03, 0x79, 0x03, 0xb9, 0x0b, 0xb9, 0x13, 0x98, 0x0b, 0x35, 0x1b, 0xdb, 0x9d, 0xdc, 0xce, 0x3e, 0xd7, 0xbe, 0xae, 0xd7, 0x23, 0xfa, 0x0b, 0xf9, 0x03, 0x3b, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x03, 0xd8, 0x0b, 0xd8, 0x0b, 0xf9, 0x0b, 0x19, 0x0c, 0xd8, 0x03, 0xf8, 0x0b, 0x7a, 0x1c, 0xbb, 0x2c, 0xbb, 0x2c, 0x7b, 0x24, 0x5b, 0x14, 0xfa, 0x0b, 0xb9, 0x03, 0x36, 0x0b, 0x33, 0x23, 0xfc, 0x9d, 0xdd, 0xd6, 0xdc, 0xe6, 0xfd, 0xe6, 0xdf, 0xce, 0x56, 0x3b, 0x96, 0x0a, 0xd9, 0x12, 0x9a, 0x0a, 0xf8, 0x01, 0xf8, 0x01, 0x58, 0x0a, 0xf7, 0x01, 0x58, 0x02, 0x79, 0x02, 0x79, 0x02, 0x79, 0x0a, 0x99, 0x0a, 0x99, 0x0a, 0xb9, 0x02, 0xb9, 0x02, 0xb8, 0x0a, 0x97, 0x0a, 0x37, 0x02, 0x38, 0x02, 0xb7, 0x01, 0xb6, 0x09, 0x14, 0x22, 0xfc, 0x8c, 0x3c, 0xbe, 0x39, 0xbe, 0xfb, 0xce, 0x5c, 0xae, 0xd4, 0x1a, 0x97, 0x02, 0x37, 0x02, 0x38, 0x02, 0x17, 0x02, 0xf6, 0x09, 0xd6, 0x09, 0xf6, 0x09, 0xf7, 0x09, 0xf7, 0x09, 0xf6, 0x09, 0xf6, 0x09, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xf6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x17, 0x02, 0x57, 0x02, 0x34, 0x1a, 0x59, 0xa5, 0x7b, 0xde, 0xdc, 0xe6, 0xde, 0xde, 0xdf, 0xc6, 0x72, 0x1a, 0xf8, 0x0a, 0x1a, 0x03, 0xf9, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xb8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xd9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0x99, 0x02, 0xb9, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x98, 0x0a, 0x56, 0x02, 0x33, 0x12, 0x3e, 0xbe, 0x9d, 0xd6, 0x1c, 0xd7, 0x7f, 0xcf, 0x75, 0x23, 0x37, 0x0b, 0x36, 0x03, 0xf6, 0x02, 0x38, 0x0b, 0xf8, 0x0a, 0xf7, 0x0a, 0x17, 0x0b, 0x17, 0x0b, 0xf7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x0b, 0x17, 0x0b, 0x18, 0x03, 0x18, 0x0b, 0xf7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd6, 0x0a, 0x93, 0x12, 0xb5, 0x4b, 0x9d, 0xce, 0x7a, 0xd6, 0xdb, 0xde, 0x5e, 0xd7, 0xb9, 0x4c, 0x97, 0x03, 0xb8, 0x0b, 0xd9, 0x0b, 0x3b, 0x14, 0xfa, 0x0b, 0xba, 0x03, 0xda, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x13, 0xb2, 0x1a, 0xbc, 0x95, 0x3b, 0xbe, 0xdc, 0xde, 0x7b, 0xd6, 0xdf, 0xd6, 0xbd, 0x95, 0xb1, 0x09, 0xd4, 0x01, 0xd5, 0x01, 0xf6, 0x09, 0x95, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xf7, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0xb6, 0x09, 0xb5, 0x11, 0xb1, 0x21, 0xd5, 0x73, 0xdd, 0xde, 0xbb, 0xde, 0x9c, 0xce, 0x7e, 0xbe, 0x92, 0x1a, 0x74, 0x0a, 0xd7, 0x0a, 0x96, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0x76, 0x02, 0xb7, 0x0a, 0x55, 0x02, 0x95, 0x0a, 0x75, 0x0a, 0x75, 0x0a, 0x95, 0x0a, 0x99, 0x2b, 0x75, 0x02, 0x75, 0x0a, 0x75, 0x02, 0x75, 0x0a, 0x95, 0x02, 0x75, 0x02, 0x96, 0x0a, 0x54, 0x12, 0x51, 0x1a, 0xd8, 0x84, 0x7a, 0xc6, 0x99, 0xce, 0x9a, 0xc6, 0x1a, 0x9e, 0x51, 0x1b, 0x94, 0x0b, 0x75, 0x03, 0x56, 0x03, 0x55, 0x03, 0x56, 0x03, 0x36, 0x03, 0x16, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x0b, 0x37, 0x13, 0xd6, 0x02, 0xf5, 0x02, 0x16, 0x03, 0xd4, 0x02, 0xd5, 0x0a, 0x17, 0x0b, 0xf7, 0x0a, 0x36, 0x13, 0xb2, 0x12, 0xfb, 0x95, 0x3f, 0xbf, 0xb3, 0x2b, 0x12, 0x0b, 0x14, 0x0b, 0xd4, 0x0a, 0xb5, 0x02, 0xf6, 0x0a, 0x35, 0x13, 0x15, 0x0b, 0x15, 0x0b, 0x35, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0xf6, 0x02, 0x16, 0x0b, 0x56, 0x0b, 0x15, 0x03, 0xf4, 0x02, 0x36, 0x03, 0x77, 0x0b, 0x17, 0x03, + 0x3a, 0x04, 0x1a, 0x04, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xfa, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xfa, 0x0b, 0xb9, 0x0b, 0x99, 0x0b, 0xd9, 0x0b, 0x75, 0x1b, 0xda, 0x9d, 0xfc, 0xde, 0x5d, 0xe7, 0xfe, 0xc6, 0xf6, 0x2b, 0x9b, 0x24, 0x98, 0x03, 0xda, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xda, 0x03, 0xba, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x03, 0x54, 0x1b, 0xba, 0x9d, 0xfc, 0xd6, 0x3d, 0xd7, 0x3c, 0xa6, 0xb6, 0x23, 0x19, 0x14, 0xf9, 0x0b, 0x1a, 0x14, 0xb8, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0x99, 0x0b, 0x99, 0x13, 0x56, 0x1b, 0x33, 0x2b, 0xfc, 0x9d, 0x9c, 0xce, 0xdb, 0xde, 0xfb, 0xe6, 0x1e, 0xd7, 0x74, 0x3b, 0xd5, 0x12, 0x76, 0x02, 0x36, 0x02, 0x37, 0x0a, 0xf6, 0x09, 0xf6, 0x09, 0x37, 0x12, 0x17, 0x02, 0x38, 0x02, 0x38, 0x02, 0x38, 0x0a, 0x38, 0x0a, 0x18, 0x0a, 0x38, 0x02, 0x38, 0x0a, 0xf7, 0x09, 0xf7, 0x09, 0x17, 0x0a, 0xd6, 0x09, 0xb6, 0x09, 0xf5, 0x19, 0xb2, 0x21, 0xfa, 0x8c, 0x5c, 0xbe, 0xdb, 0xce, 0xdc, 0xce, 0xbf, 0xc6, 0x95, 0x2a, 0x57, 0x12, 0x18, 0x12, 0xd7, 0x09, 0xd7, 0x09, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf6, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0x70, 0x11, 0x79, 0xad, 0x5a, 0xd6, 0x9b, 0xde, 0x1f, 0xdf, 0xde, 0x95, 0x74, 0x12, 0xd9, 0x0a, 0x9a, 0x02, 0xda, 0x02, 0x99, 0x0a, 0x58, 0x02, 0xb9, 0x12, 0xb7, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0x18, 0x0b, 0xb7, 0x02, 0x96, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xb7, 0x0a, 0x76, 0x02, 0x32, 0x12, 0x3d, 0xbe, 0xbc, 0xde, 0xbb, 0xd6, 0x3f, 0xcf, 0xb9, 0x5c, 0xf4, 0x0a, 0x36, 0x13, 0x16, 0x0b, 0xf7, 0x0a, 0xb7, 0x02, 0xd6, 0x02, 0xf7, 0x0a, 0x38, 0x0b, 0xf8, 0x02, 0xf8, 0x02, 0x19, 0x03, 0xd8, 0x0a, 0xd7, 0x0a, 0xd7, 0x12, 0xb6, 0x0a, 0xb7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xd7, 0x0a, 0xb6, 0x02, 0xb5, 0x0a, 0x93, 0x12, 0x57, 0x64, 0x7c, 0xc6, 0x79, 0xd6, 0xda, 0xde, 0x3d, 0xd7, 0xb8, 0x54, 0x55, 0x0b, 0xd7, 0x1b, 0x97, 0x13, 0xd9, 0x13, 0x99, 0x0b, 0x57, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x03, 0x77, 0x0b, 0x37, 0x0b, 0x36, 0x0b, 0x15, 0x03, 0x35, 0x13, 0xd2, 0x22, 0xdc, 0x9d, 0x9d, 0xc6, 0x9b, 0xd6, 0x9c, 0xd6, 0x1f, 0xdf, 0x3c, 0x85, 0xd1, 0x09, 0x35, 0x1a, 0xd5, 0x11, 0xd6, 0x11, 0xb6, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0x95, 0x09, 0x95, 0x09, 0x74, 0x01, 0x95, 0x09, 0x95, 0x09, 0x74, 0x01, 0x95, 0x09, 0x95, 0x09, 0xb5, 0x09, 0x95, 0x01, 0x95, 0x09, 0x75, 0x01, 0x74, 0x09, 0x70, 0x11, 0x37, 0x7c, 0x5a, 0xc6, 0xfb, 0xd6, 0xfc, 0xd6, 0x9e, 0xb6, 0x91, 0x12, 0x94, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0x95, 0x02, 0xb5, 0x02, 0xd6, 0x02, 0x75, 0x02, 0x96, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x76, 0x0a, 0x55, 0x02, 0x5d, 0x44, 0x55, 0x02, 0x96, 0x0a, 0x55, 0x02, 0x96, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x96, 0x0a, 0x54, 0x12, 0x51, 0x1a, 0xd8, 0x84, 0x1a, 0xc6, 0x7a, 0xd6, 0x9c, 0xd6, 0xb6, 0x7c, 0x74, 0x23, 0x15, 0x03, 0x57, 0x0b, 0x58, 0x0b, 0x16, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x56, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x37, 0x0b, 0x17, 0x0b, 0x37, 0x0b, 0x77, 0x03, 0x76, 0x03, 0x15, 0x0b, 0x15, 0x0b, 0x16, 0x0b, 0xd6, 0x02, 0xf7, 0x0a, 0xd5, 0x1a, 0x1a, 0x8d, 0x9f, 0xc6, 0xd3, 0x1a, 0x36, 0x13, 0xd5, 0x0a, 0x17, 0x13, 0x37, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x36, 0x0b, 0x37, 0x0b, 0x16, 0x03, 0x15, 0x03, 0x76, 0x13, 0x36, 0x0b, 0x15, 0x03, 0xf5, 0x02, 0x16, 0x0b, + 0x19, 0x04, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x0b, 0xfa, 0x0b, 0xf9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x76, 0x1b, 0xdb, 0x9d, 0xfd, 0xde, 0x3d, 0xdf, 0xfe, 0xbe, 0xb6, 0x23, 0x1a, 0x1c, 0xd9, 0x0b, 0xfa, 0x0b, 0xd8, 0x03, 0xd8, 0x0b, 0xb9, 0x0b, 0x9a, 0x0b, 0xba, 0x0b, 0x9a, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0x9a, 0x0b, 0x9a, 0x0b, 0x9a, 0x0b, 0x9a, 0x03, 0x79, 0x03, 0x9a, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0xba, 0x0b, 0x99, 0x0b, 0x79, 0x0b, 0x56, 0x23, 0xda, 0xa5, 0xdb, 0xde, 0xfc, 0xde, 0x1b, 0xa6, 0x95, 0x23, 0x19, 0x1c, 0xd8, 0x0b, 0xb8, 0x0b, 0xd8, 0x0b, 0xb8, 0x0b, 0x98, 0x0b, 0x98, 0x03, 0x98, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb8, 0x0b, 0x97, 0x0b, 0x96, 0x13, 0x52, 0x1b, 0x3c, 0x96, 0xdc, 0xbe, 0xfb, 0xd6, 0xfa, 0xd6, 0x1d, 0xcf, 0x59, 0x4c, 0x96, 0x02, 0xb9, 0x02, 0x9a, 0x0a, 0x18, 0x02, 0xf8, 0x01, 0x18, 0x0a, 0xd7, 0x01, 0x18, 0x02, 0x18, 0x02, 0x18, 0x02, 0xf8, 0x01, 0xf7, 0x09, 0xd7, 0x09, 0xd7, 0x09, 0xd8, 0x09, 0xf9, 0x09, 0xd8, 0x09, 0x17, 0x0a, 0x94, 0x01, 0xb5, 0x01, 0x35, 0x12, 0xb0, 0x11, 0x37, 0x6c, 0x3b, 0xb6, 0xfc, 0xd6, 0xdc, 0xd6, 0x5e, 0xb6, 0x74, 0x1a, 0x97, 0x12, 0x57, 0x0a, 0xf6, 0x01, 0xd6, 0x09, 0xd7, 0x09, 0xb7, 0x09, 0xd7, 0x09, 0xd6, 0x09, 0xd6, 0x09, 0xd7, 0x09, 0xf7, 0x09, 0xd7, 0x09, 0xd7, 0x09, 0xd6, 0x09, 0xb6, 0x09, 0xb6, 0x09, 0x96, 0x09, 0x96, 0x09, 0xb6, 0x01, 0xd6, 0x01, 0xb5, 0x01, 0xd5, 0x01, 0x90, 0x11, 0xfb, 0xb5, 0x9b, 0xd6, 0x7b, 0xd6, 0xde, 0xd6, 0x5d, 0x85, 0xd5, 0x1a, 0xb5, 0x0a, 0xf7, 0x0a, 0xb6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xb6, 0x02, 0xb7, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x98, 0x0a, 0x97, 0x0a, 0x78, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0x77, 0x02, 0x77, 0x0a, 0xb8, 0x12, 0x97, 0x0a, 0x76, 0x0a, 0x76, 0x12, 0x55, 0x0a, 0xf1, 0x11, 0x1a, 0xbe, 0x79, 0xde, 0x9a, 0xde, 0xdd, 0xce, 0x7b, 0x7d, 0xd3, 0x12, 0x16, 0x13, 0xd7, 0x0a, 0xf7, 0x0a, 0xf7, 0x0a, 0xf6, 0x0a, 0xd6, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd8, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x0a, 0xd7, 0x0a, 0xf7, 0x0a, 0xd7, 0x0a, 0xd7, 0x02, 0xb6, 0x0a, 0x93, 0x12, 0xd9, 0x74, 0x7d, 0xc6, 0x9b, 0xde, 0xdb, 0xe6, 0xdd, 0xce, 0xb8, 0x5c, 0x75, 0x1b, 0xb7, 0x1b, 0x56, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x37, 0x0b, 0x57, 0x0b, 0x56, 0x0b, 0x14, 0x13, 0xb1, 0x1a, 0x5a, 0x85, 0x5b, 0xbe, 0x3a, 0xce, 0x7b, 0xde, 0xbe, 0xd6, 0xbe, 0x8d, 0xf2, 0x09, 0xb4, 0x09, 0xb6, 0x11, 0x75, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x74, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x75, 0x09, 0x75, 0x01, 0x95, 0x09, 0x74, 0x01, 0xb6, 0x09, 0x95, 0x09, 0x95, 0x09, 0x95, 0x01, 0xb5, 0x09, 0x93, 0x11, 0x50, 0x11, 0x7a, 0x8c, 0x1a, 0xbe, 0xbb, 0xd6, 0xfd, 0xd6, 0xba, 0x9d, 0x51, 0x0a, 0x94, 0x02, 0x96, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0x96, 0x02, 0xb6, 0x0a, 0x54, 0x02, 0x75, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0xb6, 0x0a, 0x96, 0x02, 0x76, 0x02, 0x55, 0x02, 0x96, 0x0a, 0x75, 0x02, 0x95, 0x02, 0x96, 0x0a, 0x54, 0x0a, 0x31, 0x1a, 0xb9, 0x7c, 0x5c, 0xbe, 0x7c, 0xce, 0x7d, 0xc6, 0x56, 0x64, 0xd7, 0x23, 0x78, 0x03, 0x59, 0x03, 0x18, 0x03, 0x17, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0xf7, 0x12, 0xf7, 0x12, 0xf6, 0x12, 0xf7, 0x0a, 0x17, 0x0b, 0x17, 0x0b, 0x17, 0x03, 0x78, 0x03, 0x97, 0x03, 0x56, 0x03, 0x15, 0x03, 0x36, 0x03, 0x57, 0x03, 0x36, 0x0b, 0xf4, 0x1a, 0xf8, 0x84, 0xdf, 0xbe, 0xb5, 0x2b, 0x96, 0x13, 0x14, 0x03, 0x56, 0x03, 0x16, 0x03, 0x38, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0xf6, 0x02, 0x17, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, + 0x1a, 0x04, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xd9, 0x03, 0xf9, 0x03, 0x19, 0x0c, 0xb8, 0x03, 0x75, 0x23, 0xdb, 0xad, 0xdd, 0xe6, 0xfd, 0xde, 0x1f, 0xc7, 0x95, 0x23, 0x19, 0x14, 0x3a, 0x14, 0xd9, 0x03, 0xf8, 0x03, 0x19, 0x0c, 0x99, 0x03, 0xba, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x77, 0x03, 0x54, 0x1b, 0xb9, 0x95, 0xbc, 0xce, 0x1e, 0xd7, 0x5d, 0x9e, 0x97, 0x13, 0x3c, 0x14, 0xfa, 0x03, 0xda, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xdb, 0x03, 0xdb, 0x03, 0xdb, 0x03, 0xda, 0x03, 0xd9, 0x03, 0x99, 0x0b, 0xb9, 0x13, 0x97, 0x1b, 0xf3, 0x22, 0xdd, 0x95, 0xbf, 0xce, 0x9d, 0xde, 0xdd, 0xf6, 0xbe, 0xde, 0xfc, 0x7c, 0x35, 0x12, 0x37, 0x12, 0x18, 0x12, 0xb7, 0x09, 0xb7, 0x11, 0xb6, 0x09, 0xf7, 0x11, 0xd7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xf8, 0x09, 0x97, 0x01, 0xd8, 0x11, 0xb8, 0x09, 0xb9, 0x01, 0xd8, 0x01, 0xd5, 0x11, 0x98, 0x5b, 0x3d, 0xc6, 0x7b, 0xd6, 0x1d, 0xef, 0xdf, 0xce, 0x33, 0x12, 0xb8, 0x0a, 0x37, 0x02, 0x38, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0x18, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb5, 0x09, 0xb5, 0x11, 0x90, 0x19, 0x99, 0xad, 0xba, 0xde, 0xdb, 0xde, 0xfe, 0xd6, 0x9d, 0x7d, 0xb4, 0x12, 0xf7, 0x1a, 0xd7, 0x1a, 0x98, 0x0a, 0x99, 0x0a, 0x99, 0x0a, 0x9a, 0x0a, 0xb9, 0x02, 0x98, 0x02, 0x98, 0x02, 0x99, 0x0a, 0x79, 0x02, 0x79, 0x02, 0x99, 0x02, 0x99, 0x02, 0xb9, 0x0a, 0x78, 0x02, 0x98, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x55, 0x02, 0x11, 0x12, 0x9c, 0xc6, 0x58, 0xce, 0x9c, 0xd6, 0xff, 0xce, 0x3b, 0x6d, 0x15, 0x13, 0xd7, 0x02, 0xf9, 0x02, 0xf8, 0x02, 0x18, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xd9, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf8, 0x02, 0xd7, 0x0a, 0x93, 0x12, 0x78, 0x64, 0x7d, 0xc6, 0xbb, 0xde, 0xfc, 0xee, 0xfd, 0xd6, 0xfa, 0x5c, 0x77, 0x13, 0x77, 0x0b, 0x57, 0x0b, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x59, 0x03, 0x59, 0x0b, 0x57, 0x0b, 0x35, 0x13, 0xf3, 0x22, 0x39, 0x85, 0x3a, 0xc6, 0x59, 0xd6, 0x59, 0xde, 0xde, 0xde, 0xbe, 0x8d, 0x13, 0x0a, 0xf6, 0x09, 0x96, 0x01, 0xb6, 0x09, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x09, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0xb6, 0x01, 0x75, 0x01, 0x95, 0x01, 0x94, 0x09, 0x31, 0x09, 0x72, 0x29, 0x16, 0x6b, 0x3d, 0xd6, 0x9c, 0xde, 0xbd, 0xd6, 0x3d, 0xb6, 0x93, 0x12, 0x75, 0x02, 0xd8, 0x0a, 0x57, 0x02, 0xb8, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x55, 0x02, 0x76, 0x0a, 0x55, 0x02, 0x96, 0x0a, 0x76, 0x0a, 0x55, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x54, 0x02, 0x95, 0x0a, 0x96, 0x0a, 0x33, 0x12, 0x31, 0x22, 0xb7, 0x7c, 0x19, 0xbe, 0xbb, 0xd6, 0x9c, 0xce, 0x18, 0x85, 0x54, 0x1b, 0x97, 0x0b, 0x37, 0x03, 0x58, 0x03, 0x56, 0x03, 0x56, 0x0b, 0x56, 0x03, 0x36, 0x03, 0x56, 0x03, 0x56, 0x03, 0x77, 0x03, 0xb7, 0x03, 0x76, 0x0b, 0x56, 0x0b, 0x16, 0x0b, 0x17, 0x03, 0x57, 0x0b, 0x57, 0x0b, 0x16, 0x0b, 0xf5, 0x02, 0xd4, 0x0a, 0x33, 0x2b, 0x99, 0x9d, 0x7c, 0xbe, 0xd6, 0x3b, 0x16, 0x13, 0x36, 0x0b, 0x57, 0x03, 0x56, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0x16, 0x0b, 0x15, 0x03, 0x15, 0x03, 0x15, 0x0b, 0x56, 0x0b, 0x16, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0x16, 0x0b, 0xf5, 0x02, 0x35, 0x0b, + 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xfa, 0x0b, 0x1a, 0x0c, 0xfa, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0x56, 0x13, 0xdb, 0xa5, 0xdd, 0xde, 0x1d, 0xef, 0x3f, 0xd7, 0xb5, 0x2b, 0xd8, 0x13, 0x9a, 0x24, 0x97, 0x03, 0xb8, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xdb, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x35, 0x1b, 0x7a, 0x9d, 0xbd, 0xde, 0xdd, 0xd6, 0x9a, 0x85, 0xd6, 0x1b, 0x5a, 0x1c, 0x19, 0x0c, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x77, 0x13, 0x54, 0x23, 0xdc, 0x95, 0xbc, 0xc6, 0xda, 0xde, 0xba, 0xe6, 0xfe, 0xde, 0xbd, 0x95, 0x53, 0x1a, 0xd8, 0x12, 0x58, 0x02, 0x38, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xb7, 0x01, 0xf8, 0x09, 0xd7, 0x01, 0xb6, 0x01, 0xf5, 0x09, 0xd3, 0x09, 0x76, 0x4b, 0xfc, 0xb5, 0xdc, 0xd6, 0xfc, 0xd6, 0xff, 0xc6, 0x12, 0x12, 0x57, 0x0a, 0x57, 0x02, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x09, 0xf7, 0x09, 0xf7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd5, 0x01, 0xb4, 0x01, 0x90, 0x11, 0xda, 0xb5, 0x7a, 0xd6, 0x9a, 0xd6, 0xde, 0xce, 0x5c, 0x7d, 0x94, 0x12, 0x96, 0x0a, 0xd7, 0x0a, 0x77, 0x02, 0xb9, 0x0a, 0xb8, 0x0a, 0x98, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x77, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x97, 0x02, 0x98, 0x02, 0xb8, 0x0a, 0x98, 0x02, 0x77, 0x02, 0x77, 0x02, 0xb8, 0x0a, 0x56, 0x02, 0x76, 0x0a, 0x56, 0x0a, 0x12, 0x12, 0x7d, 0xbe, 0x7a, 0xd6, 0x9a, 0xde, 0xfd, 0xd6, 0xd6, 0x4b, 0xd4, 0x0a, 0xf6, 0x02, 0x18, 0x03, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xf8, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xf8, 0x0a, 0xb6, 0x0a, 0x93, 0x1a, 0xd6, 0x5b, 0x3b, 0xc6, 0xba, 0xde, 0x9b, 0xde, 0x1e, 0xd7, 0xb8, 0x5c, 0x75, 0x13, 0x97, 0x13, 0x79, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x79, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x16, 0x13, 0xb3, 0x1a, 0x3a, 0x7d, 0xfa, 0xb5, 0x9a, 0xde, 0x9b, 0xde, 0x9d, 0xce, 0x3c, 0x85, 0x13, 0x0a, 0xd5, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0x95, 0x01, 0x75, 0x01, 0x96, 0x01, 0x76, 0x01, 0x75, 0x01, 0x76, 0x01, 0x76, 0x01, 0x76, 0x01, 0x76, 0x01, 0x76, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x72, 0x09, 0x70, 0x19, 0x95, 0x6b, 0xdd, 0xde, 0x39, 0xc6, 0xfd, 0xce, 0xbb, 0x8d, 0x93, 0x0a, 0x96, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x96, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x56, 0x0a, 0x56, 0x0a, 0x55, 0x02, 0x53, 0x0a, 0x11, 0x1a, 0x98, 0x7c, 0x3a, 0xc6, 0x5a, 0xce, 0xbc, 0xce, 0xbb, 0x8d, 0x96, 0x23, 0x57, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0xb8, 0x13, 0x57, 0x0b, 0x36, 0x03, 0x16, 0x03, 0x36, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x75, 0x2b, 0xbb, 0xa5, 0x5c, 0xb6, 0x16, 0x44, 0xb6, 0x1b, 0x35, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x03, + 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0x99, 0x03, 0x56, 0x1b, 0xfb, 0xa5, 0xfd, 0xde, 0x3e, 0xe7, 0x3f, 0xcf, 0x37, 0x44, 0xb7, 0x13, 0x7a, 0x24, 0x19, 0x14, 0xf9, 0x0b, 0xd9, 0x0b, 0x99, 0x03, 0x9a, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x35, 0x1b, 0x9a, 0x9d, 0x9c, 0xd6, 0xde, 0xce, 0x9a, 0x85, 0xd6, 0x1b, 0x5a, 0x14, 0x3a, 0x14, 0xd9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xba, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x97, 0x13, 0x54, 0x23, 0xbb, 0x8d, 0x9b, 0xc6, 0xfb, 0xde, 0xdb, 0xe6, 0xdd, 0xde, 0xbd, 0x9d, 0x33, 0x12, 0x77, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x09, 0x17, 0x0a, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x01, 0xb7, 0x01, 0xf8, 0x09, 0xd7, 0x01, 0xb6, 0x01, 0xd5, 0x09, 0xd3, 0x09, 0xb7, 0x53, 0x3c, 0xbe, 0xdc, 0xde, 0xfc, 0xd6, 0x9d, 0xbe, 0xf1, 0x11, 0x56, 0x0a, 0x78, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd5, 0x01, 0xd4, 0x09, 0x90, 0x11, 0xfb, 0xbd, 0x7a, 0xd6, 0xbb, 0xde, 0xde, 0xce, 0xbe, 0x8d, 0x16, 0x23, 0xb6, 0x0a, 0xd8, 0x12, 0x56, 0x02, 0x77, 0x02, 0x16, 0x02, 0xd9, 0x12, 0x19, 0x13, 0xb8, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x77, 0x02, 0x98, 0x02, 0x78, 0x02, 0x77, 0x02, 0x98, 0x0a, 0x56, 0x02, 0x56, 0x0a, 0x56, 0x0a, 0x12, 0x12, 0x5d, 0xbe, 0x7a, 0xd6, 0x99, 0xd6, 0xfd, 0xd6, 0x16, 0x4c, 0xf5, 0x12, 0x17, 0x0b, 0x38, 0x0b, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xf8, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb6, 0x0a, 0x93, 0x1a, 0xd5, 0x53, 0x3b, 0xc6, 0xba, 0xde, 0xbb, 0xe6, 0x1e, 0xd7, 0x9b, 0x75, 0x76, 0x1b, 0x57, 0x0b, 0x38, 0x03, 0x58, 0x03, 0x79, 0x03, 0x99, 0x03, 0x79, 0x0b, 0x79, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x59, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x03, 0x37, 0x03, 0x57, 0x0b, 0x36, 0x13, 0xb3, 0x1a, 0x1a, 0x7d, 0xfa, 0xb5, 0x5a, 0xd6, 0x9b, 0xde, 0x9d, 0xce, 0xd7, 0x53, 0xf3, 0x09, 0xf5, 0x09, 0xb6, 0x01, 0x96, 0x01, 0x96, 0x09, 0x96, 0x01, 0x95, 0x01, 0x96, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0xb5, 0x09, 0x72, 0x09, 0x70, 0x19, 0xba, 0x94, 0x5b, 0xce, 0x9a, 0xd6, 0xdd, 0xce, 0xf9, 0x7c, 0x93, 0x0a, 0xb6, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x56, 0x02, 0x56, 0x02, 0x55, 0x02, 0x53, 0x0a, 0x11, 0x1a, 0x78, 0x7c, 0x3a, 0xc6, 0x5a, 0xce, 0x9c, 0xc6, 0xdb, 0x95, 0x34, 0x1b, 0x56, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x16, 0x0b, 0x78, 0x13, 0x37, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0x34, 0x23, 0x18, 0x8d, 0x5d, 0xbe, 0x98, 0x54, 0x54, 0x13, 0x36, 0x0b, 0x57, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, + 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x98, 0x03, 0x55, 0x1b, 0x1c, 0xae, 0x1d, 0xe7, 0x3e, 0xe7, 0x3f, 0xcf, 0x3b, 0x5d, 0xd8, 0x1b, 0xf9, 0x13, 0xd8, 0x0b, 0xd8, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x35, 0x13, 0xba, 0x9d, 0x9c, 0xce, 0xfe, 0xce, 0x7a, 0x7d, 0xf6, 0x1b, 0x5a, 0x14, 0x5b, 0x14, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x13, 0x54, 0x23, 0xbb, 0x8d, 0xbc, 0xc6, 0xfb, 0xe6, 0xfb, 0xe6, 0xdd, 0xde, 0xbd, 0x9d, 0x32, 0x12, 0x76, 0x0a, 0x58, 0x0a, 0x38, 0x0a, 0x38, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0x97, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xb5, 0x01, 0xb4, 0x09, 0xf4, 0x11, 0xb8, 0x5b, 0x5d, 0xbe, 0x9b, 0xd6, 0xdc, 0xd6, 0xbe, 0xc6, 0x73, 0x22, 0x36, 0x0a, 0x57, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0x95, 0x01, 0xd4, 0x09, 0x6f, 0x11, 0xfb, 0xbd, 0x59, 0xd6, 0x9a, 0xd6, 0xbd, 0xce, 0xde, 0x95, 0x53, 0x12, 0xd6, 0x12, 0x35, 0x02, 0xf8, 0x12, 0xd8, 0x12, 0x98, 0x0a, 0xd8, 0x12, 0x3a, 0x1b, 0xb8, 0x0a, 0x77, 0x02, 0x57, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x98, 0x02, 0x78, 0x02, 0x77, 0x02, 0x98, 0x0a, 0x56, 0x02, 0x56, 0x0a, 0x35, 0x0a, 0x11, 0x12, 0x5d, 0xbe, 0x9b, 0xd6, 0x79, 0xd6, 0xdd, 0xd6, 0x57, 0x54, 0xd4, 0x0a, 0x17, 0x0b, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd8, 0x0a, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb6, 0x0a, 0x73, 0x1a, 0xb5, 0x53, 0x3b, 0xc6, 0xba, 0xde, 0xdb, 0xe6, 0x1e, 0xd7, 0x1d, 0x86, 0x75, 0x1b, 0xb8, 0x1b, 0x78, 0x0b, 0x79, 0x03, 0x78, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x59, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x37, 0x03, 0x16, 0x13, 0xf4, 0x1a, 0x9c, 0x8d, 0x1a, 0xbe, 0x7a, 0xd6, 0xbb, 0xde, 0xbe, 0xce, 0x75, 0x4b, 0xf3, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0x95, 0x01, 0xb6, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x54, 0x01, 0x73, 0x09, 0x4f, 0x11, 0x1b, 0x9d, 0x3a, 0xc6, 0xfc, 0xde, 0xbd, 0xc6, 0x19, 0x7d, 0xb3, 0x0a, 0xb6, 0x02, 0x97, 0x0a, 0x76, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x56, 0x0a, 0x56, 0x02, 0x55, 0x02, 0x54, 0x0a, 0x11, 0x1a, 0x78, 0x7c, 0x3a, 0xc6, 0x39, 0xce, 0x9c, 0xce, 0xfc, 0x9d, 0x13, 0x13, 0x56, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf3, 0x1a, 0x18, 0x95, 0x9a, 0xa5, 0x57, 0x54, 0x96, 0x1b, 0x56, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, + 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x75, 0x13, 0x1b, 0xae, 0xfc, 0xe6, 0x1d, 0xef, 0x1f, 0xcf, 0x78, 0x44, 0xb7, 0x0b, 0xf8, 0x0b, 0xf9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xda, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x35, 0x13, 0xdb, 0x9d, 0xdd, 0xd6, 0xfe, 0xc6, 0x39, 0x75, 0xf7, 0x1b, 0x19, 0x0c, 0x1a, 0x0c, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x77, 0x13, 0x34, 0x23, 0xdc, 0x95, 0xdd, 0xce, 0xdb, 0xde, 0xbb, 0xe6, 0xdd, 0xde, 0xdc, 0xa5, 0x32, 0x12, 0x56, 0x0a, 0x79, 0x0a, 0x38, 0x0a, 0x18, 0x0a, 0xd7, 0x01, 0xb6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xd8, 0x01, 0xd8, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xd7, 0x09, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xb6, 0x09, 0xb5, 0x09, 0xd3, 0x11, 0x77, 0x53, 0x1c, 0xbe, 0x7b, 0xce, 0xdc, 0xd6, 0xff, 0xd6, 0x74, 0x22, 0x16, 0x0a, 0x17, 0x02, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xb5, 0x01, 0xd4, 0x09, 0x90, 0x19, 0x1b, 0xbe, 0x7a, 0xde, 0xbb, 0xde, 0xde, 0xce, 0x7c, 0x85, 0x94, 0x12, 0xda, 0x33, 0xd7, 0x12, 0x97, 0x0a, 0x77, 0x02, 0xd8, 0x12, 0x57, 0x02, 0xb8, 0x0a, 0x98, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x0a, 0x98, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x56, 0x02, 0x56, 0x0a, 0x35, 0x0a, 0x11, 0x12, 0x7e, 0xc6, 0x9b, 0xd6, 0x99, 0xd6, 0xdd, 0xd6, 0xb9, 0x64, 0x94, 0x0a, 0xf7, 0x0a, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0x73, 0x12, 0xb5, 0x53, 0x3a, 0xc6, 0xba, 0xde, 0xdb, 0xe6, 0xfe, 0xd6, 0x5e, 0x96, 0x34, 0x1b, 0xf9, 0x23, 0x99, 0x13, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x59, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x78, 0x03, 0x58, 0x03, 0x17, 0x03, 0xf5, 0x0a, 0xf4, 0x1a, 0x7b, 0x85, 0x3b, 0xbe, 0x7a, 0xd6, 0xbb, 0xde, 0xbe, 0xce, 0xda, 0x74, 0xf3, 0x09, 0xb4, 0x01, 0xd5, 0x01, 0x95, 0x01, 0xb5, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0xb5, 0x09, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x74, 0x01, 0x32, 0x01, 0x91, 0x19, 0x17, 0x7c, 0x7b, 0xce, 0x59, 0xc6, 0xbc, 0xc6, 0xd8, 0x74, 0xb4, 0x12, 0xb6, 0x02, 0x97, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x56, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x76, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x73, 0x12, 0x11, 0x1a, 0x78, 0x7c, 0x1a, 0xc6, 0x19, 0xce, 0x9c, 0xce, 0x1c, 0xa6, 0x75, 0x23, 0x56, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0xd3, 0x12, 0x96, 0x84, 0x5c, 0xbe, 0x3a, 0x6d, 0x55, 0x13, 0x56, 0x0b, 0x36, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, + 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0x55, 0x13, 0x1b, 0xae, 0xdc, 0xde, 0x1d, 0xef, 0xff, 0xce, 0x74, 0x1b, 0xb8, 0x0b, 0x19, 0x14, 0xf9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x35, 0x13, 0x9a, 0x95, 0xdd, 0xce, 0xde, 0xc6, 0xd7, 0x64, 0xf7, 0x1b, 0xf9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x56, 0x0b, 0x54, 0x23, 0xfc, 0x95, 0xbd, 0xce, 0x9a, 0xd6, 0x59, 0xd6, 0x7b, 0xd6, 0x7e, 0xb6, 0x72, 0x22, 0x75, 0x0a, 0x78, 0x12, 0x17, 0x02, 0xd7, 0x01, 0xb6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x09, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xd6, 0x09, 0xd5, 0x09, 0xd3, 0x09, 0x15, 0x43, 0xbb, 0xb5, 0xbc, 0xde, 0xdc, 0xde, 0xbe, 0xce, 0xd1, 0x11, 0x36, 0x0a, 0x37, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb5, 0x01, 0xb4, 0x09, 0xb0, 0x19, 0xfb, 0xbd, 0x9a, 0xde, 0xbb, 0xde, 0xfe, 0xd6, 0xbd, 0x8d, 0x32, 0x0a, 0x7f, 0x65, 0xb7, 0x0a, 0xb7, 0x0a, 0xb8, 0x0a, 0x77, 0x0a, 0x98, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x0a, 0x78, 0x02, 0x78, 0x02, 0x77, 0x02, 0x57, 0x02, 0x76, 0x0a, 0x56, 0x0a, 0x35, 0x02, 0x12, 0x12, 0x7e, 0xc6, 0x5a, 0xd6, 0x9a, 0xde, 0xdd, 0xd6, 0xfa, 0x6c, 0x93, 0x02, 0x37, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd6, 0x0a, 0x73, 0x12, 0x16, 0x5c, 0x3a, 0xc6, 0x9a, 0xde, 0xdb, 0xe6, 0xdd, 0xd6, 0xff, 0xae, 0x13, 0x1b, 0xf8, 0x2b, 0x37, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x0b, 0x59, 0x0b, 0x58, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x58, 0x03, 0x37, 0x0b, 0x16, 0x0b, 0x93, 0x12, 0x78, 0x6c, 0xfa, 0xbd, 0x5a, 0xd6, 0x5a, 0xd6, 0x9d, 0xce, 0x9e, 0x8d, 0xf2, 0x09, 0xb4, 0x01, 0xb5, 0x01, 0x95, 0x01, 0xb5, 0x09, 0xb5, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0xb5, 0x09, 0x94, 0x01, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x09, 0x93, 0x09, 0x91, 0x19, 0xda, 0x94, 0x5b, 0xc6, 0xfc, 0xde, 0xbc, 0xc6, 0xf8, 0x74, 0xb4, 0x12, 0xb6, 0x02, 0x97, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x0a, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x56, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x73, 0x0a, 0x11, 0x1a, 0x78, 0x7c, 0x1a, 0xc6, 0x39, 0xce, 0x9c, 0xce, 0xbb, 0x95, 0x75, 0x23, 0x56, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0xf3, 0x1a, 0x75, 0x7c, 0xbe, 0xc6, 0x9b, 0x75, 0x75, 0x1b, 0x56, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, + 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x35, 0x1b, 0x1b, 0xae, 0xdb, 0xde, 0x3c, 0xe7, 0xfe, 0xc6, 0xb6, 0x33, 0x3a, 0x24, 0xf9, 0x13, 0x78, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x35, 0x13, 0x7a, 0x8d, 0xbd, 0xce, 0x9d, 0xbe, 0xb7, 0x64, 0xf7, 0x1b, 0x19, 0x04, 0xd9, 0x03, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0xb8, 0x1b, 0x34, 0x23, 0x39, 0x7d, 0xf9, 0xb5, 0x59, 0xce, 0xba, 0xe6, 0xfd, 0xe6, 0xff, 0xc6, 0x92, 0x2a, 0x76, 0x12, 0x98, 0x12, 0x18, 0x0a, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x09, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xd6, 0x09, 0xf5, 0x09, 0xd3, 0x09, 0xd4, 0x3a, 0xfb, 0xb5, 0xdc, 0xde, 0xdc, 0xde, 0xbf, 0xce, 0xd1, 0x11, 0x16, 0x0a, 0x37, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xb6, 0x01, 0xb6, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0x95, 0x01, 0x95, 0x01, 0xb4, 0x01, 0xb0, 0x19, 0xfb, 0xbd, 0x9a, 0xde, 0x9a, 0xd6, 0xde, 0xce, 0xfb, 0x74, 0x94, 0x12, 0xd6, 0x12, 0x76, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x77, 0x02, 0x36, 0x02, 0x97, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x02, 0x77, 0x02, 0x78, 0x02, 0x98, 0x02, 0x97, 0x0a, 0x57, 0x02, 0x77, 0x0a, 0x56, 0x02, 0x35, 0x02, 0x12, 0x12, 0x7d, 0xbe, 0x3a, 0xce, 0xba, 0xde, 0xdd, 0xd6, 0xda, 0x6c, 0x94, 0x0a, 0x37, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd6, 0x0a, 0x73, 0x1a, 0x99, 0x74, 0x3b, 0xc6, 0x9a, 0xde, 0xbb, 0xe6, 0xdd, 0xd6, 0x1f, 0xbf, 0x34, 0x2b, 0x5a, 0x44, 0x37, 0x13, 0x58, 0x0b, 0x58, 0x03, 0x78, 0x03, 0x58, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x78, 0x0b, 0x37, 0x0b, 0x16, 0x0b, 0xb3, 0x12, 0x57, 0x64, 0xfa, 0xbd, 0x5a, 0xd6, 0x5a, 0xd6, 0xbe, 0xd6, 0x7d, 0x8d, 0xb2, 0x01, 0x15, 0x0a, 0xb5, 0x01, 0x95, 0x01, 0xb6, 0x09, 0xb6, 0x09, 0xb5, 0x09, 0xb5, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x94, 0x01, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x93, 0x09, 0x50, 0x11, 0x54, 0x63, 0x3a, 0xc6, 0x7a, 0xce, 0xbc, 0xc6, 0x7a, 0x85, 0xb3, 0x0a, 0xb6, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x75, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x0a, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x55, 0x02, 0x55, 0x02, 0x54, 0x02, 0x53, 0x0a, 0x11, 0x1a, 0x98, 0x84, 0x1a, 0xc6, 0x7a, 0xd6, 0x9c, 0xce, 0x39, 0x85, 0x34, 0x13, 0x56, 0x0b, 0x57, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x15, 0x03, 0xf3, 0x1a, 0x75, 0x7c, 0x5c, 0xbe, 0x5a, 0x6d, 0x95, 0x1b, 0x35, 0x0b, 0x57, 0x0b, 0x77, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x36, 0x03, 0x16, 0x03, + 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x34, 0x1b, 0x3b, 0xae, 0xdb, 0xde, 0x3c, 0xe7, 0xfe, 0xc6, 0xf7, 0x33, 0x5b, 0x2c, 0xd9, 0x0b, 0xb9, 0x03, 0xf9, 0x0b, 0xfa, 0x03, 0xda, 0x0b, 0x79, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x35, 0x13, 0x7a, 0x95, 0x9d, 0xc6, 0x9d, 0xbe, 0xf8, 0x64, 0xd7, 0x13, 0x1a, 0x04, 0xfa, 0x0b, 0xda, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x78, 0x03, 0x77, 0x13, 0x54, 0x2b, 0x9b, 0x8d, 0x7b, 0xbe, 0xba, 0xd6, 0xba, 0xe6, 0xdc, 0xde, 0xdf, 0xc6, 0x30, 0x1a, 0x54, 0x0a, 0x58, 0x0a, 0x18, 0x0a, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd6, 0x09, 0xd5, 0x09, 0xd3, 0x09, 0x15, 0x43, 0x1c, 0xbe, 0x9c, 0xd6, 0xbc, 0xd6, 0xdf, 0xce, 0x13, 0x1a, 0x16, 0x0a, 0x37, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xb6, 0x01, 0xb6, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xb6, 0x01, 0xb5, 0x01, 0xd4, 0x09, 0xd1, 0x19, 0x1b, 0xbe, 0x9a, 0xde, 0xbb, 0xde, 0xfe, 0xce, 0x1b, 0x75, 0xb5, 0x1a, 0xb6, 0x0a, 0x96, 0x02, 0xd8, 0x0a, 0x57, 0x02, 0x98, 0x0a, 0x98, 0x02, 0xb8, 0x0a, 0x98, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x57, 0x02, 0x97, 0x0a, 0x56, 0x0a, 0x35, 0x02, 0x32, 0x12, 0x5d, 0xbe, 0x5a, 0xce, 0xba, 0xde, 0xdd, 0xce, 0x37, 0x54, 0xb4, 0x0a, 0x17, 0x0b, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xf8, 0x0a, 0xb6, 0x0a, 0x73, 0x12, 0x1b, 0x85, 0x5b, 0xc6, 0x9a, 0xde, 0xbb, 0xe6, 0xdd, 0xd6, 0xdf, 0xb6, 0x34, 0x2b, 0xdc, 0x54, 0x37, 0x1b, 0x58, 0x0b, 0x38, 0x03, 0x78, 0x03, 0x78, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x37, 0x03, 0x16, 0x0b, 0xf4, 0x1a, 0x78, 0x6c, 0xda, 0xb5, 0x19, 0xce, 0xbb, 0xde, 0xde, 0xd6, 0x7d, 0x8d, 0xb1, 0x01, 0x15, 0x0a, 0xb5, 0x01, 0xb5, 0x01, 0xb6, 0x09, 0xb5, 0x09, 0x95, 0x01, 0xb5, 0x09, 0x95, 0x01, 0x94, 0x01, 0x95, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x34, 0x01, 0xb4, 0x11, 0x91, 0x19, 0x74, 0x63, 0xbc, 0xd6, 0x9a, 0xce, 0x3a, 0xb6, 0x39, 0x7d, 0xb3, 0x0a, 0xb6, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x75, 0x02, 0x95, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, 0x75, 0x0a, 0x74, 0x02, 0x53, 0x0a, 0x11, 0x1a, 0xb9, 0x84, 0x1a, 0xc6, 0x5a, 0xce, 0x9c, 0xc6, 0x79, 0x85, 0xf3, 0x12, 0x36, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x36, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf5, 0x02, 0xd3, 0x12, 0xd3, 0x6b, 0xbe, 0xce, 0x1d, 0x86, 0xf3, 0x0a, 0x56, 0x0b, 0x36, 0x03, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x36, 0x03, 0x16, 0x03, + 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xda, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xd9, 0x03, 0x54, 0x13, 0x5b, 0xb6, 0xfc, 0xe6, 0x3d, 0xef, 0xfe, 0xce, 0x95, 0x23, 0x1a, 0x14, 0xd9, 0x03, 0xda, 0x0b, 0xd9, 0x0b, 0x99, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x78, 0x03, 0x35, 0x13, 0x9b, 0x95, 0x7d, 0xc6, 0xbe, 0xbe, 0x39, 0x75, 0xb7, 0x13, 0x1a, 0x0c, 0xfa, 0x0b, 0x99, 0x03, 0xba, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x77, 0x13, 0x34, 0x23, 0xbb, 0x8d, 0x9b, 0xc6, 0x99, 0xd6, 0x9a, 0xde, 0xfc, 0xde, 0xdf, 0xc6, 0x0f, 0x1a, 0x14, 0x0a, 0x37, 0x0a, 0x18, 0x0a, 0xb7, 0x01, 0xd7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xf7, 0x09, 0xf6, 0x09, 0xb4, 0x01, 0xf3, 0x11, 0x56, 0x4b, 0x1c, 0xbe, 0x9c, 0xd6, 0xbb, 0xd6, 0x5d, 0xbe, 0x12, 0x1a, 0x37, 0x0a, 0x58, 0x0a, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x09, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd6, 0x01, 0xb5, 0x01, 0xd4, 0x09, 0xb0, 0x11, 0x3c, 0xbe, 0x79, 0xd6, 0xbb, 0xd6, 0xde, 0xce, 0x3c, 0x7d, 0x74, 0x0a, 0x18, 0x1b, 0xd8, 0x0a, 0x77, 0x02, 0x98, 0x02, 0x78, 0x02, 0x98, 0x0a, 0x98, 0x02, 0x98, 0x02, 0xb8, 0x0a, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x78, 0x02, 0x98, 0x02, 0x98, 0x02, 0x57, 0x02, 0xb7, 0x0a, 0x56, 0x0a, 0x55, 0x02, 0x32, 0x12, 0x5d, 0xbe, 0x7a, 0xd6, 0xba, 0xde, 0xdd, 0xce, 0xd6, 0x43, 0xf5, 0x12, 0x17, 0x0b, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0x18, 0x0b, 0xf8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0x95, 0x02, 0x73, 0x12, 0x7c, 0x8d, 0x5b, 0xc6, 0x9a, 0xde, 0xbb, 0xe6, 0xdd, 0xd6, 0xbf, 0xbe, 0x13, 0x2b, 0xbc, 0x54, 0xf6, 0x12, 0x38, 0x0b, 0x58, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x79, 0x03, 0x79, 0x03, 0x79, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x03, 0x37, 0x03, 0x16, 0x0b, 0xb3, 0x12, 0xf6, 0x5b, 0x58, 0xa5, 0x97, 0xbd, 0xbb, 0xde, 0xbe, 0xd6, 0xdf, 0x95, 0xb1, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0x95, 0x01, 0x74, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x95, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0xb5, 0x09, 0x93, 0x09, 0x91, 0x19, 0x54, 0x5b, 0x5b, 0xc6, 0x9b, 0xce, 0x1e, 0xcf, 0xbb, 0x8d, 0xb4, 0x12, 0xb6, 0x02, 0x97, 0x0a, 0x76, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x56, 0x02, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x55, 0x02, 0x76, 0x0a, 0x96, 0x0a, 0x75, 0x02, 0x53, 0x0a, 0x31, 0x1a, 0xd9, 0x8c, 0x3a, 0xc6, 0x39, 0xc6, 0xbc, 0xce, 0x1c, 0x9e, 0x34, 0x13, 0x36, 0x03, 0x36, 0x03, 0x57, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x0b, 0x17, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x57, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x03, 0x36, 0x03, 0xf3, 0x1a, 0x55, 0x7c, 0x7d, 0xc6, 0xfd, 0x85, 0x54, 0x1b, 0x76, 0x13, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x03, + 0xfa, 0x0b, 0xfa, 0x0b, 0xba, 0x03, 0xda, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x0b, 0xd9, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0x99, 0x03, 0xd9, 0x03, 0x95, 0x13, 0x3b, 0xb6, 0x1d, 0xef, 0x1d, 0xe7, 0x1f, 0xc7, 0x74, 0x23, 0x7a, 0x24, 0xd9, 0x0b, 0xfa, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x78, 0x0b, 0x99, 0x13, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x56, 0x1b, 0x7a, 0x8d, 0xbd, 0xc6, 0x1e, 0xc7, 0x18, 0x6d, 0xd6, 0x1b, 0x19, 0x0c, 0xd9, 0x03, 0xfa, 0x0b, 0xd9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xdb, 0x03, 0xdb, 0x03, 0x99, 0x03, 0x79, 0x03, 0x98, 0x0b, 0x98, 0x0b, 0xb9, 0x0b, 0xb8, 0x03, 0xb8, 0x0b, 0xb8, 0x0b, 0xb8, 0x0b, 0x76, 0x13, 0x74, 0x23, 0x9b, 0x85, 0xbc, 0xce, 0xba, 0xe6, 0x78, 0xde, 0xbc, 0xde, 0xff, 0xce, 0x10, 0x1a, 0x55, 0x12, 0x57, 0x0a, 0xd7, 0x01, 0xd7, 0x09, 0xb7, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb7, 0x09, 0xb7, 0x09, 0xd7, 0x09, 0xd7, 0x09, 0xd6, 0x09, 0xd6, 0x09, 0xd6, 0x09, 0xd6, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xb5, 0x01, 0xd5, 0x09, 0xb2, 0x09, 0x76, 0x53, 0x1b, 0xbe, 0x39, 0xce, 0x9c, 0xd6, 0x5d, 0xbe, 0x33, 0x12, 0x57, 0x0a, 0x38, 0x0a, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xd7, 0x09, 0xd7, 0x09, 0xd7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb5, 0x01, 0xf4, 0x09, 0xd0, 0x19, 0x1b, 0xbe, 0x59, 0xd6, 0x9a, 0xd6, 0x9d, 0xc6, 0xbe, 0x8d, 0x74, 0x0a, 0xb9, 0x23, 0x96, 0x02, 0xd8, 0x02, 0x77, 0x02, 0x77, 0x02, 0x98, 0x0a, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x77, 0x0a, 0x77, 0x0a, 0x56, 0x0a, 0x14, 0x02, 0x32, 0x1a, 0x3c, 0xc6, 0x7a, 0xd6, 0xbb, 0xde, 0x1f, 0xd7, 0x75, 0x2b, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xf8, 0x0a, 0xf8, 0x0a, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xd7, 0x02, 0xd5, 0x12, 0x51, 0x12, 0x3a, 0x8d, 0xfa, 0xbd, 0xbb, 0xde, 0x9a, 0xde, 0xfd, 0xde, 0x1f, 0xbf, 0x12, 0x1b, 0x19, 0x24, 0x98, 0x03, 0x57, 0x03, 0x78, 0x0b, 0x37, 0x03, 0x78, 0x0b, 0x99, 0x0b, 0x58, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x37, 0x03, 0x58, 0x0b, 0x38, 0x0b, 0x59, 0x0b, 0x59, 0x0b, 0x38, 0x0b, 0x38, 0x0b, 0x57, 0x03, 0x16, 0x03, 0xd4, 0x12, 0x17, 0x54, 0xb9, 0xad, 0x19, 0xc6, 0xdb, 0xe6, 0xde, 0xde, 0xdf, 0xa5, 0x91, 0x09, 0xd5, 0x09, 0xb6, 0x01, 0x96, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x09, 0x75, 0x01, 0x75, 0x01, 0x75, 0x09, 0x75, 0x09, 0x75, 0x09, 0x75, 0x09, 0x75, 0x09, 0x75, 0x09, 0x75, 0x09, 0x74, 0x01, 0x73, 0x01, 0xf2, 0x19, 0x95, 0x5b, 0x5c, 0xce, 0x7b, 0xde, 0xbc, 0xd6, 0x59, 0x95, 0x92, 0x12, 0xb5, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x02, 0x77, 0x02, 0x56, 0x02, 0x56, 0x02, 0x56, 0x02, 0x56, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x54, 0x0a, 0xf0, 0x11, 0xf9, 0x8c, 0xfa, 0xc5, 0x3a, 0xce, 0x7b, 0xc6, 0x3c, 0xa6, 0x54, 0x1b, 0x57, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x38, 0x0b, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x0b, 0x16, 0x0b, 0x16, 0x0b, 0xd3, 0x1a, 0xb7, 0x84, 0x3d, 0xbe, 0x3e, 0x9e, 0x34, 0x23, 0x16, 0x0b, 0x37, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, + 0xf9, 0x03, 0x3a, 0x0c, 0x1a, 0x0c, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xfa, 0x0b, 0xd9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x99, 0x13, 0x99, 0x0b, 0xb8, 0x03, 0x95, 0x1b, 0x5c, 0xbe, 0x1d, 0xf7, 0xfc, 0xe6, 0xde, 0xc6, 0xd6, 0x33, 0x3d, 0x45, 0xd8, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x55, 0x1b, 0xbb, 0x9d, 0xde, 0xce, 0xfe, 0xc6, 0xb7, 0x5c, 0xb6, 0x13, 0x3a, 0x14, 0xd9, 0x0b, 0x98, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x97, 0x0b, 0x95, 0x23, 0x7a, 0x7d, 0x9c, 0xc6, 0xbb, 0xde, 0xba, 0xde, 0xbb, 0xd6, 0xdf, 0xc6, 0x31, 0x22, 0x34, 0x0a, 0x37, 0x0a, 0xd6, 0x01, 0xd7, 0x09, 0xd7, 0x01, 0xd7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xb7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x09, 0xf7, 0x09, 0xd7, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xd6, 0x01, 0xf5, 0x11, 0xb2, 0x09, 0x55, 0x53, 0xdb, 0xb5, 0x19, 0xce, 0x9c, 0xd6, 0x1d, 0xb6, 0xf3, 0x09, 0x37, 0x02, 0x18, 0x0a, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb5, 0x01, 0xf4, 0x09, 0xf1, 0x19, 0x3c, 0xbe, 0x7a, 0xd6, 0xbb, 0xde, 0xbd, 0xce, 0x9d, 0x8d, 0x74, 0x12, 0x17, 0x13, 0x96, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x78, 0x0a, 0x98, 0x0a, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x02, 0x56, 0x02, 0x56, 0x02, 0x55, 0x02, 0x34, 0x02, 0x52, 0x1a, 0x5c, 0xbe, 0x7a, 0xd6, 0xba, 0xde, 0xfe, 0xce, 0x54, 0x23, 0xf6, 0x02, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x0a, 0xd7, 0x0a, 0xd7, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xb7, 0x02, 0x95, 0x0a, 0x31, 0x1a, 0x19, 0x85, 0x1b, 0xbe, 0x9b, 0xde, 0xbb, 0xe6, 0xfd, 0xde, 0xff, 0xbe, 0xf2, 0x1a, 0xb7, 0x1b, 0x78, 0x0b, 0x57, 0x03, 0x78, 0x0b, 0x58, 0x03, 0x79, 0x0b, 0x99, 0x0b, 0x99, 0x0b, 0x98, 0x03, 0xb8, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x79, 0x0b, 0x58, 0x0b, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0xf5, 0x02, 0xf4, 0x12, 0x57, 0x5c, 0xda, 0xad, 0x5a, 0xd6, 0x1c, 0xef, 0xdd, 0xd6, 0x3f, 0xae, 0xd2, 0x11, 0xd5, 0x09, 0x95, 0x01, 0xb6, 0x01, 0x96, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x96, 0x01, 0x96, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0xb4, 0x09, 0x91, 0x09, 0x17, 0x6c, 0x1b, 0xc6, 0xdc, 0xe6, 0x7b, 0xce, 0xdb, 0x9d, 0x72, 0x12, 0x95, 0x02, 0xb6, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x0a, 0x55, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x53, 0x0a, 0x10, 0x1a, 0x19, 0x8d, 0xfa, 0xc5, 0x39, 0xce, 0x7b, 0xc6, 0xba, 0x95, 0x13, 0x13, 0x36, 0x0b, 0x36, 0x0b, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x0b, 0x16, 0x0b, 0x15, 0x0b, 0xf5, 0x0a, 0xf3, 0x1a, 0x79, 0x95, 0x1c, 0xb6, 0x3d, 0x9e, 0x33, 0x23, 0x56, 0x13, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, + 0x7b, 0x1c, 0xf9, 0x0b, 0x5b, 0x14, 0xb8, 0x03, 0xb8, 0x03, 0xf9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb7, 0x03, 0x74, 0x1b, 0x5b, 0xbe, 0xfc, 0xee, 0x3d, 0xef, 0x3e, 0xd7, 0x53, 0x2b, 0x7e, 0x55, 0xb7, 0x0b, 0xd8, 0x0b, 0xd9, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x55, 0x1b, 0x9a, 0x9d, 0xbd, 0xce, 0xfe, 0xc6, 0xd7, 0x64, 0xd7, 0x1b, 0x7b, 0x14, 0x1b, 0x14, 0xda, 0x0b, 0xb9, 0x03, 0x99, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x0b, 0x77, 0x0b, 0x34, 0x1b, 0x5a, 0x7d, 0xbc, 0xce, 0xba, 0xde, 0xba, 0xde, 0xbb, 0xd6, 0xdf, 0xc6, 0xb2, 0x2a, 0x34, 0x12, 0x57, 0x0a, 0xd6, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd7, 0x09, 0xb6, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0x95, 0x01, 0xb5, 0x09, 0xb3, 0x11, 0x96, 0x5b, 0xfb, 0xbd, 0x3a, 0xce, 0xbc, 0xde, 0x1d, 0xb6, 0x13, 0x12, 0x58, 0x0a, 0x18, 0x0a, 0x18, 0x0a, 0xf7, 0x01, 0xf6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb5, 0x01, 0x95, 0x01, 0xd4, 0x09, 0xf1, 0x19, 0x1b, 0xbe, 0x7a, 0xde, 0xbb, 0xde, 0xbd, 0xd6, 0x5d, 0x85, 0x94, 0x12, 0x96, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x77, 0x02, 0x98, 0x0a, 0x57, 0x02, 0x57, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x55, 0x0a, 0x72, 0x22, 0x5c, 0xbe, 0x9a, 0xd6, 0xbb, 0xde, 0xfe, 0xce, 0x54, 0x23, 0x16, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xf8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0x74, 0x0a, 0x51, 0x1a, 0xf9, 0x8c, 0x3b, 0xc6, 0x7a, 0xd6, 0xdb, 0xe6, 0xfd, 0xd6, 0x3f, 0xc7, 0x33, 0x2b, 0x76, 0x13, 0x98, 0x0b, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x59, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x03, 0x58, 0x03, 0x99, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x57, 0x0b, 0x57, 0x03, 0x56, 0x0b, 0x14, 0x13, 0x37, 0x54, 0x99, 0xa5, 0x9a, 0xd6, 0x38, 0xce, 0xbc, 0xd6, 0xbd, 0xa5, 0xd1, 0x11, 0xb4, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x96, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x53, 0x01, 0xb1, 0x11, 0x54, 0x53, 0x7c, 0xd6, 0x5a, 0xd6, 0xbc, 0xd6, 0x1c, 0xae, 0x71, 0x0a, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x0a, 0x55, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x75, 0x02, 0x55, 0x02, 0x75, 0x02, 0x53, 0x0a, 0x10, 0x1a, 0x19, 0x95, 0x1a, 0xc6, 0x39, 0xce, 0xbb, 0xce, 0x79, 0x8d, 0x13, 0x13, 0x36, 0x0b, 0x56, 0x0b, 0x16, 0x03, 0x37, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x17, 0x0b, 0x16, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x0b, 0x15, 0x0b, 0x15, 0x0b, 0xf5, 0x0a, 0xf3, 0x22, 0x9a, 0x9d, 0x3c, 0xbe, 0x1d, 0x9e, 0x53, 0x2b, 0x35, 0x13, 0x36, 0x0b, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, + 0x1a, 0x14, 0x98, 0x03, 0xd9, 0x0b, 0xd9, 0x0b, 0xf9, 0x0b, 0x98, 0x03, 0xfa, 0x13, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x19, 0x04, 0x19, 0x04, 0xd8, 0x03, 0x94, 0x1b, 0x9c, 0xb6, 0xfc, 0xde, 0x1d, 0xe7, 0xfe, 0xce, 0x74, 0x2b, 0x5d, 0x4d, 0xd8, 0x1b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x79, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x35, 0x13, 0x9a, 0x95, 0xbc, 0xce, 0xfe, 0xc6, 0x18, 0x65, 0xd7, 0x1b, 0x1a, 0x0c, 0xda, 0x03, 0xda, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x77, 0x03, 0x56, 0x13, 0xf3, 0x22, 0x39, 0x85, 0x9b, 0xce, 0xba, 0xde, 0xda, 0xe6, 0xfc, 0xe6, 0x7e, 0xbe, 0xb3, 0x32, 0x14, 0x0a, 0x57, 0x0a, 0xf6, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xf7, 0x09, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0x18, 0x0a, 0x18, 0x0a, 0xb5, 0x01, 0xb4, 0x09, 0x92, 0x09, 0x97, 0x5b, 0x1c, 0xbe, 0x5a, 0xd6, 0x9c, 0xd6, 0xfd, 0xb5, 0x13, 0x12, 0x98, 0x12, 0xf7, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xd7, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb4, 0x09, 0xf1, 0x19, 0x1b, 0xbe, 0x5a, 0xde, 0x9a, 0xde, 0xbd, 0xd6, 0x3c, 0x85, 0x74, 0x12, 0xb6, 0x0a, 0xd7, 0x0a, 0x97, 0x02, 0x77, 0x02, 0x98, 0x0a, 0x77, 0x0a, 0x77, 0x02, 0x78, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0x98, 0x0a, 0x97, 0x02, 0x77, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x0a, 0x34, 0x02, 0x31, 0x1a, 0x3c, 0xbe, 0x9a, 0xd6, 0xdb, 0xde, 0xfe, 0xce, 0x54, 0x23, 0x17, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0xd6, 0x02, 0xd7, 0x0a, 0xd7, 0x02, 0xf8, 0x0a, 0xf8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0x74, 0x12, 0x51, 0x22, 0x3a, 0x95, 0x5c, 0xc6, 0x7a, 0xd6, 0xdb, 0xde, 0xdc, 0xd6, 0x5f, 0xc7, 0xb5, 0x3b, 0x76, 0x13, 0xb9, 0x13, 0x77, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x99, 0x03, 0x58, 0x03, 0x99, 0x0b, 0x79, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x57, 0x03, 0x56, 0x0b, 0xd4, 0x0a, 0x53, 0x33, 0x17, 0x95, 0x39, 0xce, 0x18, 0xce, 0xdd, 0xde, 0x3f, 0xb6, 0x70, 0x09, 0xf5, 0x11, 0x95, 0x01, 0xb5, 0x01, 0x96, 0x01, 0x96, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x73, 0x01, 0x71, 0x09, 0x14, 0x4b, 0x1b, 0xce, 0x3a, 0xd6, 0xbc, 0xd6, 0x7e, 0xb6, 0x71, 0x12, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x55, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x96, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x53, 0x12, 0x10, 0x1a, 0x19, 0x95, 0x3b, 0xc6, 0x3a, 0xce, 0xbc, 0xce, 0x99, 0x8d, 0x34, 0x1b, 0x56, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x16, 0x0b, 0x15, 0x0b, 0xf5, 0x0a, 0x15, 0x0b, 0xf3, 0x1a, 0xf8, 0x8c, 0x7d, 0xbe, 0x3d, 0x9e, 0x74, 0x2b, 0x14, 0x0b, 0x57, 0x0b, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, + 0x5b, 0x14, 0x1a, 0x0c, 0x7f, 0x3d, 0x9c, 0x24, 0xfa, 0x0b, 0x98, 0x03, 0x78, 0x03, 0xfa, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x0b, 0x34, 0x1b, 0x3b, 0xa6, 0x9b, 0xce, 0x1d, 0xdf, 0x1f, 0xc7, 0xf6, 0x33, 0x9b, 0x34, 0xd8, 0x13, 0xb8, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xfa, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xba, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x35, 0x13, 0x79, 0x95, 0xbc, 0xce, 0x1e, 0xcf, 0x18, 0x6d, 0xf7, 0x13, 0x1a, 0x0c, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x97, 0x1b, 0x54, 0x2b, 0x5a, 0x8d, 0x7b, 0xc6, 0xdb, 0xde, 0xdb, 0xe6, 0xfd, 0xde, 0x7e, 0xb6, 0xd4, 0x32, 0x14, 0x0a, 0x57, 0x0a, 0xf7, 0x01, 0xd7, 0x01, 0xd7, 0x09, 0xd6, 0x01, 0xb6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xd5, 0x01, 0xd6, 0x09, 0xf6, 0x01, 0xf6, 0x01, 0xb5, 0x01, 0xb4, 0x09, 0xd3, 0x11, 0x18, 0x6c, 0x3c, 0xc6, 0x9b, 0xd6, 0xbc, 0xde, 0x5d, 0xbe, 0x53, 0x12, 0xb8, 0x12, 0x17, 0x02, 0xf7, 0x01, 0xf7, 0x09, 0xd7, 0x09, 0xd7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x09, 0xb7, 0x09, 0xb7, 0x09, 0xb7, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb5, 0x01, 0xb4, 0x09, 0x11, 0x22, 0x1b, 0xc6, 0x7a, 0xde, 0x9a, 0xde, 0xde, 0xd6, 0x9d, 0x8d, 0x33, 0x0a, 0xf6, 0x12, 0xd7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x78, 0x0a, 0xb8, 0x0a, 0x98, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x14, 0x02, 0x31, 0x12, 0x1b, 0xb6, 0x7a, 0xd6, 0xbb, 0xde, 0xfe, 0xce, 0x55, 0x23, 0x37, 0x0b, 0x38, 0x0b, 0x17, 0x03, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd6, 0x02, 0xb7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xb7, 0x0a, 0x95, 0x12, 0x51, 0x1a, 0x9c, 0x9d, 0x5b, 0xc6, 0x9b, 0xd6, 0xdb, 0xde, 0xdc, 0xd6, 0x1f, 0xc7, 0xd6, 0x43, 0x76, 0x13, 0xb9, 0x13, 0x57, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x99, 0x0b, 0x16, 0x03, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x17, 0x03, 0x79, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x37, 0x03, 0x36, 0x0b, 0xb4, 0x0a, 0x34, 0x33, 0xf7, 0x8c, 0x19, 0xc6, 0x39, 0xce, 0xbd, 0xd6, 0x7d, 0x95, 0x70, 0x09, 0xd5, 0x11, 0x95, 0x01, 0xb5, 0x09, 0x95, 0x01, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x75, 0x09, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x09, 0xd4, 0x11, 0x50, 0x09, 0x14, 0x53, 0xda, 0xbd, 0x7b, 0xde, 0x9c, 0xd6, 0x7e, 0xb6, 0x72, 0x12, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x0a, 0x55, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x33, 0x0a, 0x10, 0x1a, 0x19, 0x95, 0x3b, 0xc6, 0x5a, 0xce, 0x7b, 0xbe, 0x99, 0x85, 0x33, 0x13, 0x56, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x03, 0x38, 0x03, 0x38, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x15, 0x03, 0xf5, 0x02, 0xd3, 0x12, 0x76, 0x74, 0x9d, 0xbe, 0x5d, 0x9e, 0x53, 0x23, 0x55, 0x0b, 0x77, 0x0b, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, + 0xd8, 0x03, 0xb8, 0x03, 0xf8, 0x0b, 0xd8, 0x03, 0x19, 0x0c, 0xf9, 0x0b, 0x1a, 0x0c, 0x97, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xf9, 0x0b, 0xf9, 0x0b, 0xf9, 0x0b, 0xd9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb8, 0x13, 0x76, 0x13, 0x98, 0x2b, 0xf4, 0x32, 0x5c, 0xbe, 0x1d, 0xe7, 0x3e, 0xe7, 0xde, 0xbe, 0xd5, 0x33, 0xf8, 0x1b, 0x18, 0x14, 0xf8, 0x0b, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x99, 0x0b, 0x99, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x55, 0x13, 0x79, 0x95, 0xbc, 0xce, 0x1e, 0xc7, 0xd7, 0x64, 0xd6, 0x13, 0x5a, 0x14, 0x19, 0x0c, 0xd9, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xba, 0x03, 0xba, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x0b, 0x36, 0x13, 0x14, 0x2b, 0x3a, 0x85, 0xbd, 0xc6, 0xfc, 0xd6, 0xbc, 0xd6, 0xfe, 0xd6, 0xdf, 0xbe, 0xf4, 0x32, 0x55, 0x0a, 0x57, 0x0a, 0xf7, 0x01, 0xf6, 0x01, 0xf6, 0x09, 0xf6, 0x01, 0xd6, 0x01, 0xf6, 0x01, 0xf6, 0x09, 0xf6, 0x09, 0xf7, 0x09, 0xd6, 0x01, 0xd6, 0x01, 0xf6, 0x09, 0x16, 0x0a, 0xf5, 0x09, 0xd5, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xd4, 0x11, 0xd2, 0x11, 0x18, 0x6c, 0x3b, 0xc6, 0x9a, 0xde, 0xbc, 0xde, 0x9e, 0xc6, 0x53, 0x1a, 0x77, 0x0a, 0x36, 0x02, 0x17, 0x02, 0xf6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0xb6, 0x01, 0xd6, 0x09, 0xb6, 0x09, 0xb6, 0x01, 0xb6, 0x09, 0x96, 0x09, 0x96, 0x01, 0x96, 0x01, 0xb6, 0x01, 0xb6, 0x09, 0xb6, 0x09, 0xb6, 0x09, 0xb5, 0x01, 0xb5, 0x01, 0xd4, 0x09, 0x32, 0x2a, 0x3b, 0xc6, 0x9a, 0xde, 0x9a, 0xde, 0xdd, 0xd6, 0x3f, 0xa6, 0x32, 0x0a, 0x17, 0x1b, 0x96, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x57, 0x02, 0x56, 0x02, 0x56, 0x02, 0x56, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x75, 0x0a, 0x54, 0x0a, 0x72, 0x1a, 0x5c, 0xbe, 0x7b, 0xd6, 0xbb, 0xde, 0xde, 0xce, 0x34, 0x23, 0x17, 0x0b, 0x37, 0x0b, 0x17, 0x0b, 0xd6, 0x02, 0xd7, 0x0a, 0xf7, 0x0a, 0xf8, 0x0a, 0xf7, 0x0a, 0xd7, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0x17, 0x0b, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd7, 0x0a, 0xb6, 0x0a, 0x94, 0x12, 0x30, 0x1a, 0xdc, 0xa5, 0x3b, 0xc6, 0x9a, 0xde, 0xba, 0xde, 0xdc, 0xd6, 0xdf, 0xc6, 0xd6, 0x43, 0x76, 0x13, 0xb8, 0x13, 0x57, 0x03, 0x77, 0x03, 0x78, 0x0b, 0x37, 0x0b, 0x37, 0x03, 0xd6, 0x02, 0x7f, 0x4d, 0x36, 0x03, 0x57, 0x03, 0x57, 0x03, 0x16, 0x03, 0xd9, 0x1b, 0x58, 0x0b, 0x37, 0x03, 0x37, 0x0b, 0x57, 0x0b, 0x37, 0x03, 0x16, 0x03, 0x15, 0x13, 0xf7, 0x4b, 0x79, 0x9d, 0x9b, 0xd6, 0x9b, 0xd6, 0xde, 0xd6, 0x79, 0x74, 0x13, 0x1a, 0xb4, 0x09, 0xf6, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x75, 0x01, 0x75, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0x74, 0x01, 0x94, 0x09, 0xb1, 0x11, 0xb2, 0x42, 0x1b, 0xce, 0x39, 0xd6, 0x9c, 0xd6, 0xfb, 0xa5, 0x71, 0x12, 0x95, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x95, 0x02, 0x75, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x0a, 0x55, 0x02, 0x76, 0x02, 0x56, 0x02, 0x76, 0x02, 0x55, 0x02, 0x75, 0x0a, 0x55, 0x02, 0x54, 0x02, 0x33, 0x0a, 0x10, 0x1a, 0x3a, 0x95, 0x1a, 0xbe, 0x7a, 0xce, 0x5a, 0xbe, 0x78, 0x85, 0x13, 0x13, 0x55, 0x03, 0x36, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x36, 0x03, 0x37, 0x03, 0x37, 0x03, 0x17, 0x03, 0x16, 0x03, 0x15, 0x03, 0xf5, 0x02, 0xf3, 0x1a, 0xb7, 0x7c, 0x7c, 0xbe, 0x7e, 0x9e, 0x33, 0x1b, 0x76, 0x13, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, + 0xd7, 0x1b, 0xf7, 0x1b, 0x39, 0x24, 0xd8, 0x1b, 0xb7, 0x13, 0xf8, 0x1b, 0xf8, 0x1b, 0x39, 0x24, 0xf8, 0x1b, 0x19, 0x24, 0x39, 0x24, 0x39, 0x24, 0x39, 0x24, 0x18, 0x24, 0xf8, 0x1b, 0xd7, 0x1b, 0x96, 0x1b, 0x18, 0x3c, 0x5e, 0x7d, 0x58, 0x6c, 0x7b, 0xce, 0xba, 0xde, 0xfc, 0xde, 0xfe, 0xc6, 0x15, 0x3c, 0x58, 0x2c, 0x7a, 0x34, 0x9a, 0x34, 0x39, 0x24, 0x19, 0x24, 0xd7, 0x1b, 0xd8, 0x1b, 0xb8, 0x13, 0x98, 0x13, 0x98, 0x13, 0x98, 0x0b, 0x98, 0x13, 0xb8, 0x13, 0x98, 0x13, 0x77, 0x0b, 0x77, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x03, 0x77, 0x03, 0x77, 0x03, 0x35, 0x13, 0x9a, 0x95, 0xdd, 0xce, 0xfe, 0xc6, 0xb6, 0x64, 0xb5, 0x1b, 0x19, 0x1c, 0xd8, 0x13, 0x97, 0x0b, 0xf8, 0x1b, 0xf8, 0x1b, 0xf8, 0x23, 0xf8, 0x1b, 0xd8, 0x1b, 0xb8, 0x13, 0xb8, 0x13, 0x98, 0x13, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x0b, 0x98, 0x13, 0x98, 0x13, 0xb7, 0x13, 0x55, 0x13, 0x34, 0x23, 0xd5, 0x53, 0x39, 0x95, 0xbc, 0xce, 0xfb, 0xde, 0xbb, 0xde, 0xfe, 0xd6, 0xdf, 0xbe, 0xd2, 0x2a, 0x54, 0x0a, 0x76, 0x0a, 0x57, 0x0a, 0x37, 0x0a, 0x57, 0x12, 0x36, 0x0a, 0x36, 0x0a, 0x36, 0x0a, 0x36, 0x12, 0x16, 0x12, 0x16, 0x0a, 0x16, 0x0a, 0x15, 0x0a, 0x15, 0x12, 0x15, 0x12, 0x35, 0x12, 0x36, 0x0a, 0x56, 0x0a, 0x36, 0x12, 0xf4, 0x11, 0x70, 0x09, 0x75, 0x5b, 0xf9, 0xbd, 0x59, 0xd6, 0x7a, 0xd6, 0xbe, 0xc6, 0x52, 0x12, 0x56, 0x02, 0x56, 0x02, 0x16, 0x02, 0x16, 0x02, 0xf6, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xd5, 0x01, 0xd6, 0x09, 0xd6, 0x09, 0xd5, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xb4, 0x01, 0xd3, 0x09, 0x52, 0x2a, 0x5b, 0xc6, 0x9a, 0xde, 0x79, 0xde, 0xbd, 0xd6, 0x7f, 0xae, 0x52, 0x0a, 0x16, 0x13, 0x95, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0xb7, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x75, 0x02, 0x74, 0x0a, 0x74, 0x0a, 0x53, 0x0a, 0x71, 0x22, 0x7d, 0xc6, 0xbb, 0xde, 0xdb, 0xde, 0xfe, 0xce, 0x54, 0x23, 0x16, 0x03, 0x37, 0x03, 0x17, 0x0b, 0x16, 0x0b, 0x37, 0x13, 0x57, 0x13, 0x58, 0x13, 0x57, 0x13, 0x17, 0x0b, 0x16, 0x0b, 0xf6, 0x0a, 0x16, 0x0b, 0x17, 0x0b, 0x17, 0x0b, 0x17, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xd6, 0x02, 0xb4, 0x0a, 0x30, 0x12, 0xfd, 0xa5, 0x5b, 0xc6, 0x7a, 0xd6, 0xba, 0xe6, 0xbc, 0xde, 0xff, 0xc6, 0xb5, 0x43, 0x76, 0x1b, 0xb8, 0x13, 0x97, 0x0b, 0x77, 0x03, 0x77, 0x0b, 0x57, 0x0b, 0x37, 0x0b, 0x77, 0x13, 0x97, 0x1b, 0x77, 0x13, 0x15, 0x03, 0x57, 0x0b, 0x56, 0x0b, 0x36, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x57, 0x0b, 0x36, 0x03, 0x36, 0x0b, 0x15, 0x13, 0xd6, 0x43, 0x17, 0x8d, 0x3a, 0xce, 0xdb, 0xde, 0x9c, 0xce, 0x1b, 0x8d, 0xd2, 0x11, 0xb3, 0x01, 0xb4, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xb5, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0x94, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x74, 0x01, 0x93, 0x09, 0x70, 0x11, 0xd2, 0x4a, 0xfa, 0xc5, 0x59, 0xd6, 0x7b, 0xce, 0xba, 0x9d, 0x71, 0x12, 0x94, 0x02, 0x96, 0x02, 0x96, 0x02, 0x75, 0x02, 0x95, 0x02, 0x95, 0x02, 0x75, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x75, 0x02, 0x54, 0x02, 0x54, 0x02, 0x55, 0x02, 0x55, 0x02, 0x75, 0x02, 0x54, 0x02, 0x54, 0x02, 0x54, 0x02, 0x54, 0x02, 0x32, 0x0a, 0x0f, 0x1a, 0x59, 0x9d, 0x19, 0xc6, 0x5a, 0xd6, 0x7a, 0xc6, 0x1a, 0x9e, 0xf5, 0x33, 0x55, 0x0b, 0x35, 0x0b, 0x15, 0x0b, 0x15, 0x03, 0x15, 0x0b, 0x35, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x37, 0x03, 0x16, 0x03, 0x16, 0x0b, 0xf5, 0x0a, 0xd5, 0x02, 0xd3, 0x1a, 0xb7, 0x84, 0x5c, 0xbe, 0x5d, 0xa6, 0x53, 0x23, 0x75, 0x13, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, + 0x39, 0x44, 0x79, 0x44, 0x59, 0x44, 0x9a, 0x4c, 0x7a, 0x4c, 0x39, 0x3c, 0x39, 0x44, 0x7a, 0x44, 0x39, 0x44, 0x59, 0x44, 0x7a, 0x4c, 0x7a, 0x4c, 0x79, 0x4c, 0x59, 0x44, 0x38, 0x44, 0x38, 0x3c, 0x56, 0x3c, 0x36, 0x3c, 0x3b, 0x75, 0xf5, 0x63, 0x39, 0xbe, 0xfa, 0xde, 0x3b, 0xe7, 0xfd, 0xce, 0x15, 0x44, 0x58, 0x3c, 0x38, 0x44, 0x7a, 0x54, 0x79, 0x4c, 0x9a, 0x54, 0x19, 0x4c, 0x39, 0x44, 0xf9, 0x2b, 0x19, 0x24, 0xf9, 0x23, 0xf9, 0x23, 0x19, 0x2c, 0x3a, 0x2c, 0x3a, 0x2c, 0x19, 0x24, 0xf8, 0x23, 0x19, 0x24, 0x3a, 0x24, 0x19, 0x24, 0xd8, 0x13, 0x98, 0x0b, 0x77, 0x0b, 0x35, 0x1b, 0x9b, 0x95, 0xbd, 0xce, 0x1f, 0xcf, 0x18, 0x75, 0xf7, 0x2b, 0x59, 0x24, 0x18, 0x24, 0x19, 0x2c, 0x7a, 0x3c, 0x7a, 0x44, 0x79, 0x44, 0x79, 0x44, 0x79, 0x3c, 0x59, 0x34, 0x18, 0x34, 0xf8, 0x2b, 0xd8, 0x23, 0xd8, 0x1b, 0xf7, 0x13, 0xf7, 0x1b, 0xd8, 0x2b, 0xf8, 0x33, 0x17, 0x3c, 0x37, 0x3c, 0xf5, 0x3b, 0x1a, 0x7d, 0x5d, 0xbe, 0xda, 0xbd, 0x79, 0xd6, 0xb9, 0xe6, 0xda, 0xee, 0xbc, 0xde, 0x1f, 0xc7, 0xd2, 0x2a, 0x94, 0x12, 0x76, 0x0a, 0x76, 0x0a, 0x16, 0x0a, 0x15, 0x0a, 0xd4, 0x01, 0xf4, 0x01, 0xf4, 0x01, 0xf4, 0x01, 0xd3, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0xd3, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xd4, 0x01, 0xb2, 0x09, 0x90, 0x09, 0xf6, 0x63, 0x1a, 0xbe, 0x59, 0xd6, 0x59, 0xce, 0xfe, 0xce, 0x93, 0x1a, 0x96, 0x0a, 0xb7, 0x12, 0x56, 0x0a, 0x77, 0x0a, 0x56, 0x0a, 0x36, 0x0a, 0x36, 0x02, 0x15, 0x02, 0x15, 0x02, 0xf5, 0x01, 0xd5, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xf5, 0x09, 0x16, 0x0a, 0x16, 0x0a, 0x16, 0x0a, 0xf5, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd5, 0x09, 0xf3, 0x09, 0x92, 0x2a, 0x7c, 0xc6, 0xba, 0xde, 0x79, 0xde, 0x9c, 0xce, 0x1f, 0x9e, 0x31, 0x0a, 0xf6, 0x12, 0xd6, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0x97, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xd6, 0x0a, 0xd6, 0x0a, 0xb6, 0x02, 0x95, 0x02, 0x95, 0x02, 0x96, 0x02, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x0a, 0xb6, 0x0a, 0x95, 0x0a, 0x94, 0x0a, 0x94, 0x12, 0x53, 0x0a, 0x71, 0x22, 0x5b, 0xbe, 0x9a, 0xd6, 0xba, 0xde, 0x1e, 0xcf, 0x74, 0x23, 0x36, 0x0b, 0x36, 0x03, 0x36, 0x0b, 0x36, 0x0b, 0x16, 0x0b, 0x16, 0x0b, 0xf5, 0x0a, 0xf5, 0x02, 0xd5, 0x02, 0xf4, 0x02, 0x15, 0x0b, 0xf6, 0x0a, 0x16, 0x0b, 0x17, 0x0b, 0x37, 0x0b, 0x36, 0x0b, 0x17, 0x0b, 0x37, 0x03, 0x37, 0x0b, 0x16, 0x03, 0xd4, 0x0a, 0x50, 0x12, 0x1c, 0xa6, 0x5b, 0xc6, 0x79, 0xd6, 0xba, 0xe6, 0xbb, 0xd6, 0xff, 0xc6, 0x95, 0x3b, 0x76, 0x1b, 0xd8, 0x13, 0xd8, 0x13, 0x97, 0x0b, 0x97, 0x0b, 0x98, 0x13, 0xd9, 0x1b, 0x98, 0x1b, 0x19, 0x2c, 0xd8, 0x23, 0xd8, 0x23, 0x56, 0x13, 0xb7, 0x1b, 0xf8, 0x23, 0x39, 0x2c, 0x39, 0x2c, 0x19, 0x24, 0xb7, 0x1b, 0x76, 0x0b, 0xb7, 0x13, 0x34, 0x13, 0x12, 0x2b, 0xd6, 0x8c, 0x59, 0xce, 0x59, 0xce, 0xbd, 0xd6, 0xde, 0x9d, 0xb1, 0x09, 0xf4, 0x09, 0xf5, 0x01, 0xf5, 0x01, 0x15, 0x0a, 0x16, 0x0a, 0x16, 0x0a, 0x15, 0x0a, 0xf5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xb5, 0x09, 0x93, 0x09, 0x90, 0x11, 0x13, 0x4b, 0x3b, 0xce, 0x7a, 0xde, 0xbc, 0xd6, 0xfb, 0xa5, 0x91, 0x12, 0xb5, 0x0a, 0x95, 0x02, 0x95, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x74, 0x02, 0x74, 0x02, 0x75, 0x02, 0x74, 0x02, 0x74, 0x0a, 0x74, 0x0a, 0x95, 0x02, 0x95, 0x02, 0x95, 0x02, 0x54, 0x02, 0x54, 0x02, 0x54, 0x02, 0x53, 0x02, 0x31, 0x0a, 0x0e, 0x1a, 0x59, 0x9d, 0x19, 0xce, 0x38, 0xd6, 0x9a, 0xd6, 0xdd, 0xc6, 0x19, 0x5d, 0x54, 0x13, 0x35, 0x13, 0x35, 0x13, 0x35, 0x0b, 0x36, 0x13, 0x56, 0x13, 0x56, 0x13, 0x36, 0x0b, 0x15, 0x03, 0x16, 0x0b, 0x36, 0x0b, 0x56, 0x0b, 0x56, 0x0b, 0x56, 0x03, 0x36, 0x03, 0x36, 0x03, 0x16, 0x0b, 0xf5, 0x0a, 0xf4, 0x0a, 0xb4, 0x02, 0x91, 0x12, 0x75, 0x7c, 0x7c, 0xc6, 0x5d, 0xa6, 0xb4, 0x3b, 0x34, 0x13, 0x56, 0x0b, 0x36, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0x5a, 0x1c, 0x3a, 0x1c, 0x19, 0x14, 0x19, 0x1c, 0x5a, 0x24, 0x19, 0x1c, 0xf8, 0x1b, 0x39, 0x24, 0x39, 0x24, 0xb8, 0x13, 0xd8, 0x1b, 0xf8, 0x1b, 0xb7, 0x13, 0xb7, 0x1b, 0x19, 0x24, 0x5a, 0x2c, 0x59, 0x34, 0x38, 0x3c, 0xd6, 0x3b, 0xf5, 0x5b, 0x3b, 0xc6, 0xbc, 0xde, 0x1d, 0xe7, 0xbd, 0xc6, 0xd4, 0x43, 0x38, 0x34, 0x9a, 0x2c, 0x7a, 0x24, 0x18, 0x1c, 0x18, 0x24, 0x39, 0x24, 0xf9, 0x1b, 0x18, 0x14, 0x18, 0x0c, 0x18, 0x14, 0x18, 0x1c, 0x18, 0x24, 0x18, 0x2c, 0x39, 0x34, 0x19, 0x34, 0x19, 0x34, 0xf9, 0x33, 0x19, 0x2c, 0xf9, 0x23, 0x19, 0x1c, 0xf8, 0x0b, 0x96, 0x03, 0x73, 0x13, 0xda, 0x9d, 0xbc, 0xd6, 0x1f, 0xd7, 0xf9, 0x84, 0xf6, 0x43, 0xd6, 0x2b, 0xd7, 0x1b, 0xb7, 0x0b, 0xb7, 0x0b, 0x96, 0x0b, 0x96, 0x03, 0x96, 0x03, 0x97, 0x03, 0xd8, 0x0b, 0xd9, 0x0b, 0xb9, 0x0b, 0xb8, 0x0b, 0xd8, 0x13, 0xb8, 0x1b, 0x98, 0x1b, 0x98, 0x1b, 0x98, 0x1b, 0x76, 0x1b, 0x54, 0x2b, 0xf8, 0x84, 0x1b, 0xc6, 0x98, 0xc5, 0xf8, 0xdd, 0x7a, 0xe6, 0x99, 0xe6, 0xf9, 0xee, 0xda, 0xde, 0xfe, 0xde, 0xd4, 0x73, 0x2f, 0x32, 0x34, 0x4b, 0x54, 0x4b, 0x37, 0x74, 0xb8, 0x94, 0x76, 0x9c, 0xf8, 0xac, 0x34, 0x94, 0xd6, 0x9c, 0x98, 0xb5, 0xd9, 0xc5, 0xb9, 0xcd, 0x78, 0xc5, 0xfa, 0xcd, 0x78, 0xb5, 0x77, 0xb5, 0xb7, 0xbd, 0x18, 0xc6, 0xf9, 0xcd, 0xb8, 0xc5, 0x98, 0xbd, 0x98, 0xbd, 0x17, 0xce, 0xb9, 0xde, 0x79, 0xd6, 0x9c, 0xc6, 0xd2, 0x3a, 0x13, 0x12, 0xf4, 0x11, 0xd4, 0x09, 0xb3, 0x09, 0xb3, 0x01, 0xd3, 0x09, 0xf3, 0x09, 0xd3, 0x01, 0xd4, 0x09, 0x15, 0x0a, 0xf4, 0x09, 0x15, 0x0a, 0x35, 0x0a, 0x36, 0x0a, 0x36, 0x0a, 0x36, 0x02, 0x36, 0x02, 0x36, 0x02, 0x35, 0x02, 0x35, 0x0a, 0xf3, 0x09, 0xb1, 0x09, 0xf4, 0x4a, 0xfb, 0xcd, 0x3a, 0xe6, 0x3a, 0xde, 0x5b, 0xd6, 0x3b, 0xb6, 0x4e, 0x22, 0x94, 0x12, 0x56, 0x02, 0xb6, 0x12, 0x34, 0x12, 0x33, 0x12, 0x32, 0x1a, 0x72, 0x22, 0xd4, 0x32, 0x34, 0x43, 0xd6, 0x5b, 0x17, 0x64, 0xd6, 0x5b, 0x55, 0x4b, 0xb3, 0x32, 0x32, 0x1a, 0xf1, 0x09, 0x11, 0x0a, 0x32, 0x12, 0xd0, 0x11, 0xd0, 0x11, 0x51, 0x2a, 0x37, 0x74, 0x3a, 0xc6, 0x9a, 0xde, 0x9b, 0xd6, 0xde, 0xce, 0xf4, 0x5b, 0xd1, 0x2a, 0x34, 0x43, 0xd3, 0x32, 0x31, 0x12, 0xd3, 0x22, 0x14, 0x33, 0x94, 0x43, 0xd7, 0x6c, 0x55, 0x5c, 0x54, 0x3b, 0x92, 0x22, 0xb2, 0x2a, 0x76, 0x3b, 0x15, 0x23, 0x16, 0x23, 0x13, 0x12, 0x34, 0x12, 0x55, 0x0a, 0x97, 0x12, 0xd7, 0x12, 0x75, 0x12, 0x71, 0x2a, 0x1c, 0xb6, 0x39, 0xc6, 0x79, 0xd6, 0x9b, 0xe6, 0x9c, 0xd6, 0xfe, 0xc6, 0x55, 0x5c, 0x74, 0x1b, 0xd7, 0x13, 0xd8, 0x13, 0xb8, 0x13, 0xd8, 0x1b, 0x76, 0x0b, 0x76, 0x0b, 0x97, 0x13, 0x57, 0x0b, 0x77, 0x0b, 0x36, 0x03, 0x36, 0x03, 0x15, 0x03, 0xf4, 0x02, 0xf3, 0x02, 0x34, 0x0b, 0xf4, 0x0a, 0x15, 0x0b, 0x16, 0x13, 0xd5, 0x12, 0xd2, 0x1a, 0xd3, 0x4b, 0x56, 0x95, 0x59, 0xc6, 0x9a, 0xce, 0xbc, 0xce, 0x7e, 0xb6, 0xef, 0x19, 0x12, 0x1a, 0xb3, 0x09, 0xb4, 0x09, 0xb4, 0x09, 0xb4, 0x01, 0x73, 0x01, 0x73, 0x01, 0xd5, 0x09, 0xd5, 0x09, 0x94, 0x01, 0x94, 0x01, 0xb4, 0x09, 0x93, 0x01, 0x93, 0x01, 0x93, 0x01, 0xb3, 0x01, 0xf4, 0x09, 0x72, 0x01, 0x91, 0x09, 0xb1, 0x11, 0x8e, 0x11, 0x35, 0x74, 0x7b, 0xce, 0xba, 0xd6, 0x38, 0xc6, 0x3b, 0xb6, 0x50, 0x12, 0x94, 0x0a, 0xf7, 0x0a, 0x76, 0x02, 0x53, 0x02, 0x72, 0x0a, 0x92, 0x0a, 0x51, 0x02, 0x52, 0x02, 0x12, 0x02, 0x13, 0x0a, 0x54, 0x12, 0x32, 0x02, 0xb4, 0x0a, 0xb4, 0x02, 0x94, 0x0a, 0xb4, 0x12, 0x94, 0x0a, 0xd5, 0x0a, 0x74, 0x02, 0xb4, 0x0a, 0x31, 0x12, 0xec, 0x21, 0x78, 0xad, 0xd8, 0xbd, 0x5a, 0xd6, 0x9b, 0xd6, 0x7c, 0xce, 0x7d, 0xbe, 0xb4, 0x53, 0x33, 0x33, 0xd3, 0x12, 0x15, 0x0b, 0x56, 0x0b, 0xf4, 0x02, 0x35, 0x0b, 0xf4, 0x02, 0x15, 0x0b, 0xf4, 0x02, 0x36, 0x03, 0x36, 0x03, 0x15, 0x03, 0x14, 0x03, 0x34, 0x03, 0x55, 0x03, 0x57, 0x0b, 0x38, 0x0b, 0x17, 0x13, 0xf4, 0x12, 0x71, 0x1a, 0x15, 0x74, 0x5d, 0xc6, 0x5e, 0xbe, 0xb5, 0x4b, 0x35, 0x13, 0x77, 0x0b, 0x36, 0x03, 0x57, 0x03, 0x36, 0x03, 0x15, 0x03, 0x36, 0x03, 0x15, 0x03, 0x15, 0x03, 0x35, 0x0b, 0x15, 0x03, 0x35, 0x0b, 0x15, 0x0b, 0x15, 0x0b, 0x15, 0x0b, 0x15, 0x0b, 0x16, 0x0b, 0xf5, 0x02, + 0x16, 0x34, 0xf6, 0x33, 0x94, 0x2b, 0x74, 0x23, 0x74, 0x23, 0x54, 0x23, 0x95, 0x2b, 0x37, 0x44, 0x58, 0x4c, 0xf6, 0x3b, 0xd5, 0x3b, 0xf6, 0x3b, 0xf6, 0x3b, 0x16, 0x44, 0x57, 0x4c, 0x57, 0x4c, 0x56, 0x4c, 0x35, 0x54, 0x34, 0x64, 0xf6, 0x8c, 0x9a, 0xde, 0xfb, 0xee, 0xfb, 0xee, 0xdc, 0xd6, 0x38, 0x85, 0xb4, 0x3b, 0x33, 0x1b, 0x95, 0x23, 0x74, 0x2b, 0x74, 0x33, 0xd5, 0x43, 0x94, 0x3b, 0xd6, 0x43, 0xb6, 0x3b, 0xb6, 0x33, 0x96, 0x2b, 0x75, 0x23, 0x75, 0x1b, 0x75, 0x1b, 0x55, 0x13, 0x55, 0x13, 0x55, 0x1b, 0x76, 0x23, 0x56, 0x23, 0x55, 0x2b, 0x55, 0x2b, 0x75, 0x33, 0xd4, 0x53, 0xba, 0xc6, 0x99, 0xd6, 0xba, 0xde, 0x7b, 0xd6, 0xfa, 0xbd, 0xba, 0xad, 0xdb, 0xb5, 0xbb, 0xb5, 0xba, 0xb5, 0xba, 0xb5, 0xba, 0xb5, 0x99, 0xad, 0x78, 0x9d, 0x58, 0x95, 0x38, 0x95, 0x18, 0x95, 0x16, 0x85, 0x16, 0x85, 0x16, 0x95, 0x16, 0x9d, 0x78, 0xa5, 0x99, 0xa5, 0xba, 0xa5, 0xb9, 0xa5, 0x39, 0xb6, 0x7a, 0xc6, 0xf8, 0xb5, 0x59, 0xc6, 0x9a, 0xce, 0x9a, 0xd6, 0xda, 0xe6, 0x1a, 0xef, 0x99, 0xde, 0x37, 0xce, 0x38, 0xce, 0x9a, 0xd6, 0x79, 0xc6, 0x79, 0xce, 0x38, 0xd6, 0x59, 0xde, 0x38, 0xde, 0x18, 0xce, 0x78, 0xce, 0x78, 0xce, 0x57, 0xce, 0x37, 0xd6, 0xf7, 0xcd, 0x19, 0xce, 0x5b, 0xd6, 0x3b, 0xd6, 0x59, 0xd6, 0x38, 0xce, 0x58, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x38, 0xce, 0x37, 0xce, 0xd9, 0xe6, 0xfa, 0xe6, 0x7a, 0xce, 0x98, 0xad, 0xd6, 0x8c, 0x38, 0x95, 0xf7, 0x8c, 0x19, 0x9d, 0x3a, 0xa5, 0x5b, 0x9d, 0xd9, 0x8c, 0x77, 0x84, 0x98, 0x84, 0x57, 0x74, 0xb5, 0x5b, 0xb5, 0x5b, 0x74, 0x4b, 0xf2, 0x3a, 0xb1, 0x32, 0xb1, 0x2a, 0xb2, 0x2a, 0x71, 0x22, 0x30, 0x1a, 0x11, 0x1a, 0x31, 0x22, 0x51, 0x2a, 0x98, 0x7c, 0xbc, 0xd6, 0x38, 0xd6, 0x16, 0xd6, 0x74, 0xc5, 0x74, 0xbd, 0xd7, 0xc5, 0x5b, 0xce, 0x5c, 0xce, 0x5a, 0xce, 0x59, 0xce, 0xf7, 0xc5, 0x99, 0xd6, 0xbb, 0xde, 0x9a, 0xde, 0x39, 0xd6, 0x59, 0xd6, 0x59, 0xde, 0x38, 0xd6, 0x59, 0xd6, 0x39, 0xce, 0x9b, 0xd6, 0x5a, 0xce, 0x7a, 0xc6, 0x5a, 0xce, 0x7a, 0xce, 0x59, 0xce, 0xf8, 0xc5, 0x79, 0xd6, 0x78, 0xd6, 0xb9, 0xde, 0x79, 0xd6, 0xdb, 0xde, 0xba, 0xc6, 0x39, 0xb6, 0x9a, 0xce, 0x19, 0xc6, 0x5a, 0xc6, 0x9b, 0xce, 0x5a, 0xd6, 0x39, 0xd6, 0x79, 0xe6, 0xf7, 0xd5, 0xf9, 0xd5, 0x1a, 0xd6, 0x19, 0xd6, 0x5a, 0xd6, 0x3a, 0xce, 0x3a, 0xce, 0xf9, 0xc5, 0x1a, 0xbe, 0x78, 0x9d, 0x38, 0x8d, 0xb6, 0x74, 0x34, 0x6c, 0x16, 0x95, 0xf8, 0xbd, 0xb9, 0xd6, 0xda, 0xde, 0xbb, 0xde, 0x9b, 0xde, 0xdc, 0xd6, 0x79, 0x9d, 0x93, 0x4b, 0xf7, 0x53, 0xb6, 0x53, 0x38, 0x6c, 0xd5, 0x63, 0x16, 0x6c, 0x35, 0x6c, 0xf4, 0x6b, 0xd3, 0x6b, 0x55, 0x7c, 0x95, 0x84, 0x75, 0x84, 0x96, 0x8c, 0xb7, 0x94, 0xba, 0xb5, 0x75, 0x8c, 0x97, 0x94, 0xbb, 0xb5, 0x1c, 0xbe, 0x1a, 0xbe, 0xf9, 0xbd, 0xb7, 0xbd, 0xd8, 0xcd, 0x5a, 0xe6, 0x9a, 0xe6, 0x5a, 0xd6, 0x9b, 0xce, 0x58, 0x9d, 0x52, 0x5b, 0x16, 0x74, 0xd4, 0x73, 0xb3, 0x73, 0x93, 0x6b, 0x92, 0x6b, 0x93, 0x6b, 0xf4, 0x7b, 0x35, 0x84, 0x15, 0x7c, 0x35, 0x84, 0x35, 0x84, 0x14, 0x7c, 0xf3, 0x7b, 0xf3, 0x7b, 0x55, 0x84, 0xf7, 0x9c, 0x18, 0xa5, 0xb8, 0x9c, 0xb8, 0x9c, 0x35, 0x8c, 0x38, 0xb5, 0xf9, 0xd5, 0x39, 0xe6, 0x39, 0xde, 0x1a, 0xd6, 0x15, 0x7c, 0x95, 0x5b, 0x55, 0x53, 0xb7, 0x63, 0x18, 0x74, 0x96, 0x6b, 0xb7, 0x6b, 0xd6, 0x73, 0x19, 0x95, 0xb6, 0x84, 0x5a, 0x9d, 0x36, 0x7c, 0xb3, 0x5b, 0xf0, 0x3a, 0x94, 0x53, 0x32, 0x43, 0x50, 0x2a, 0x71, 0x2a, 0x71, 0x22, 0xb2, 0x22, 0x72, 0x22, 0xd2, 0x32, 0x52, 0x5b, 0x99, 0xb5, 0x59, 0xce, 0x58, 0xd6, 0x17, 0xce, 0xba, 0xde, 0x5a, 0xce, 0x1a, 0xbe, 0x99, 0xa5, 0x38, 0x8d, 0x18, 0x8d, 0xf7, 0x84, 0xb5, 0x84, 0xd6, 0x8c, 0xd6, 0x94, 0xf7, 0x9c, 0x96, 0x8c, 0xb7, 0x8c, 0x56, 0x74, 0x35, 0x6c, 0x14, 0x64, 0xf3, 0x5b, 0xf3, 0x53, 0xd3, 0x53, 0x93, 0x53, 0x92, 0x53, 0x71, 0x4b, 0x32, 0x74, 0x76, 0xad, 0x5a, 0xce, 0x3a, 0xb6, 0x13, 0x5c, 0x72, 0x23, 0x74, 0x13, 0x56, 0x0b, 0x57, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x36, 0x0b, 0x35, 0x0b, 0x36, 0x0b, 0x15, 0x03, 0x36, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x15, 0x03, 0xf5, 0x02, 0x57, 0x03, 0x36, 0x03, + 0xdb, 0xee, 0xba, 0xe6, 0x9a, 0xe6, 0x9a, 0xe6, 0xbb, 0xee, 0xba, 0xee, 0x9a, 0xe6, 0xdb, 0xee, 0xbb, 0xee, 0x9a, 0xee, 0x9a, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0x9a, 0xee, 0x9a, 0xee, 0xda, 0xee, 0xda, 0xe6, 0x78, 0xd6, 0x78, 0xde, 0x78, 0xde, 0x99, 0xde, 0xb9, 0xe6, 0xfa, 0xee, 0xba, 0xe6, 0x9a, 0xde, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xd6, 0x9b, 0xd6, 0xbc, 0xce, 0x9b, 0xce, 0xbb, 0xde, 0x9a, 0xde, 0x7a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x7a, 0xce, 0x7a, 0xce, 0x7a, 0xce, 0x9b, 0xce, 0x5a, 0xc6, 0x5a, 0xc6, 0x5a, 0xce, 0x7a, 0xce, 0x59, 0xce, 0x18, 0xc6, 0x38, 0xce, 0x79, 0xd6, 0xba, 0xe6, 0x7a, 0xe6, 0xdb, 0xee, 0x9a, 0xde, 0xdb, 0xe6, 0x1c, 0xe7, 0x9a, 0xd6, 0xba, 0xe6, 0x9a, 0xde, 0x78, 0xd6, 0x58, 0xd6, 0x99, 0xd6, 0xb9, 0xde, 0xba, 0xe6, 0xba, 0xe6, 0xbb, 0xde, 0xbb, 0xd6, 0xba, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x79, 0xd6, 0x58, 0xce, 0x38, 0xd6, 0xd6, 0xc5, 0x18, 0xc6, 0x7a, 0xd6, 0xdb, 0xde, 0xbb, 0xe6, 0xdb, 0xee, 0xdb, 0xf6, 0xfa, 0xee, 0xf9, 0xe6, 0xb9, 0xe6, 0x37, 0xde, 0x78, 0xde, 0x98, 0xe6, 0x57, 0xde, 0x38, 0xde, 0x38, 0xd6, 0x9a, 0xde, 0xba, 0xde, 0x99, 0xd6, 0x99, 0xd6, 0xda, 0xde, 0xbb, 0xde, 0xbb, 0xe6, 0x7a, 0xe6, 0x7b, 0xe6, 0x9b, 0xe6, 0x9b, 0xe6, 0x7b, 0xe6, 0x7b, 0xe6, 0x5a, 0xde, 0x39, 0xde, 0x59, 0xde, 0xba, 0xe6, 0x99, 0xe6, 0x39, 0xde, 0x79, 0xe6, 0x58, 0xe6, 0xb9, 0xee, 0xb9, 0xee, 0x77, 0xd6, 0x37, 0xd6, 0x57, 0xd6, 0x78, 0xde, 0x78, 0xde, 0x78, 0xde, 0x78, 0xde, 0x59, 0xde, 0x79, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x5a, 0xde, 0x3a, 0xde, 0x5b, 0xde, 0x5b, 0xde, 0x7b, 0xe6, 0x5b, 0xde, 0x5b, 0xde, 0xd9, 0xc5, 0x39, 0xd6, 0x78, 0xe6, 0xb4, 0xd5, 0x8f, 0xb4, 0xf1, 0xc4, 0x94, 0xc5, 0x98, 0xde, 0x99, 0xd6, 0x99, 0xd6, 0x57, 0xce, 0x98, 0xd6, 0xda, 0xe6, 0xf7, 0xcd, 0x39, 0xde, 0x19, 0xde, 0x18, 0xd6, 0x5a, 0xe6, 0x7a, 0xe6, 0x5a, 0xde, 0x7b, 0xde, 0x9b, 0xe6, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0x7a, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0x9a, 0xde, 0x5a, 0xd6, 0x19, 0xce, 0x5a, 0xe6, 0x5b, 0xee, 0x3a, 0xe6, 0xbc, 0xe6, 0x5a, 0xd6, 0xda, 0xee, 0xba, 0xe6, 0x79, 0xd6, 0x9b, 0xd6, 0x9b, 0xd6, 0x9b, 0xd6, 0xbb, 0xde, 0x5a, 0xd6, 0x7b, 0xd6, 0x9b, 0xde, 0x99, 0xde, 0x78, 0xde, 0x79, 0xe6, 0x38, 0xe6, 0x78, 0xe6, 0xd9, 0xee, 0x97, 0xd6, 0x98, 0xd6, 0x98, 0xd6, 0x37, 0xce, 0x57, 0xd6, 0x16, 0xce, 0x98, 0xde, 0x98, 0xde, 0x99, 0xde, 0xba, 0xe6, 0x99, 0xe6, 0x99, 0xe6, 0x78, 0xd6, 0xb9, 0xde, 0xb9, 0xe6, 0x37, 0xd6, 0x37, 0xd6, 0x78, 0xde, 0x58, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x59, 0xd6, 0x58, 0xd6, 0x37, 0xce, 0x78, 0xd6, 0x79, 0xde, 0x38, 0xce, 0x7a, 0xde, 0x7a, 0xde, 0x39, 0xde, 0x78, 0xde, 0x77, 0xd6, 0x57, 0xd6, 0x37, 0xd6, 0x17, 0xd6, 0x7a, 0xee, 0x9a, 0xee, 0x18, 0xd6, 0x37, 0xd6, 0x17, 0xce, 0x99, 0xe6, 0x79, 0xe6, 0x7a, 0xde, 0x5a, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x39, 0xd6, 0x39, 0xd6, 0x59, 0xd6, 0x19, 0xce, 0x39, 0xd6, 0x59, 0xd6, 0x18, 0xce, 0x19, 0xce, 0x7a, 0xd6, 0x7a, 0xde, 0x79, 0xde, 0x18, 0xce, 0x7a, 0xd6, 0x39, 0xce, 0x19, 0xc6, 0x39, 0xce, 0x9a, 0xde, 0x58, 0xd6, 0x99, 0xde, 0x99, 0xd6, 0x57, 0xc6, 0x78, 0xce, 0x78, 0xc6, 0x78, 0xce, 0x98, 0xd6, 0x37, 0xc6, 0x79, 0xce, 0x39, 0xce, 0xd8, 0xcd, 0xd9, 0xd5, 0xda, 0xd5, 0xb9, 0xcd, 0xf9, 0xcd, 0x39, 0xd6, 0x19, 0xd6, 0xf9, 0xcd, 0xf9, 0xcd, 0xf9, 0xd5, 0xd8, 0xcd, 0xd7, 0xc5, 0xb7, 0xc5, 0xd7, 0xcd, 0xb6, 0xd5, 0xd6, 0xd5, 0x59, 0xe6, 0x18, 0xd6, 0x58, 0xe6, 0x18, 0xde, 0x59, 0xde, 0x7a, 0xe6, 0x9a, 0xde, 0x39, 0xd6, 0x59, 0xd6, 0x59, 0xde, 0x38, 0xde, 0x18, 0xde, 0x18, 0xde, 0xf8, 0xdd, 0xd8, 0xd5, 0xf8, 0xdd, 0x39, 0xde, 0x19, 0xde, 0x18, 0xde, 0x18, 0xd6, 0x18, 0xd6, 0x18, 0xce, 0xf8, 0xd5, 0xf8, 0xd5, 0xf8, 0xc5, 0xd8, 0xc5, 0xd8, 0xcd, 0x3a, 0xce, 0x5c, 0xc6, 0x97, 0x74, 0x94, 0x43, 0x74, 0x2b, 0x12, 0x13, 0xf2, 0x12, 0x12, 0x1b, 0x32, 0x23, 0x93, 0x33, 0x15, 0x44, 0x76, 0x5c, 0xb7, 0x6c, 0xf8, 0x74, 0xd7, 0x7c, 0x96, 0x74, 0x75, 0x74, 0x55, 0x74, 0x75, 0x74, 0xd6, 0x84, 0xf7, 0x8c, + 0x5b, 0xef, 0x3b, 0xe7, 0xfa, 0xe6, 0x1a, 0xe7, 0x3b, 0xef, 0x3b, 0xef, 0x1b, 0xef, 0x1b, 0xef, 0xfa, 0xe6, 0x1b, 0xef, 0x3b, 0xef, 0x1b, 0xef, 0x1b, 0xef, 0x1b, 0xef, 0xfb, 0xee, 0xfb, 0xee, 0x1b, 0xef, 0xfa, 0xee, 0x99, 0xde, 0x99, 0xde, 0x78, 0xd6, 0xfb, 0xe6, 0x3c, 0xef, 0x1c, 0xef, 0xdb, 0xe6, 0xfb, 0xf6, 0xfb, 0xf6, 0xdb, 0xee, 0x1c, 0xf7, 0xfb, 0xf6, 0xda, 0xee, 0x1c, 0xf7, 0xfc, 0xf6, 0xdc, 0xee, 0xdb, 0xee, 0xda, 0xee, 0xb9, 0xe6, 0xd9, 0xe6, 0xf9, 0xe6, 0xd9, 0xe6, 0xf9, 0xe6, 0xd9, 0xde, 0xda, 0xe6, 0xba, 0xde, 0xba, 0xe6, 0x9a, 0xe6, 0x7a, 0xde, 0x9b, 0xe6, 0x9b, 0xde, 0x9b, 0xde, 0x7a, 0xe6, 0xdc, 0xf6, 0xba, 0xee, 0xda, 0xee, 0xda, 0xee, 0xba, 0xee, 0x99, 0xe6, 0xbb, 0xee, 0xba, 0xe6, 0xba, 0xde, 0xda, 0xd6, 0xdb, 0xd6, 0xdb, 0xde, 0xfc, 0xee, 0x9c, 0xe6, 0x9c, 0xe6, 0xdc, 0xe6, 0xfb, 0xe6, 0xb9, 0xde, 0x99, 0xde, 0xba, 0xe6, 0xba, 0xee, 0x58, 0xde, 0xd6, 0xcd, 0x79, 0xde, 0x99, 0xd6, 0xda, 0xde, 0x1c, 0xe7, 0xfb, 0xde, 0xba, 0xde, 0x1c, 0xe7, 0xfc, 0xe6, 0xdc, 0xee, 0x7a, 0xe6, 0x79, 0xe6, 0x99, 0xe6, 0xba, 0xee, 0x9a, 0xe6, 0x9b, 0xee, 0xdc, 0xf6, 0xbb, 0xee, 0x9a, 0xe6, 0xb9, 0xee, 0xba, 0xee, 0x9b, 0xee, 0x9b, 0xee, 0xf9, 0xe6, 0xf9, 0xe6, 0xda, 0xe6, 0xdb, 0xde, 0x9b, 0xd6, 0x7a, 0xd6, 0x9a, 0xde, 0xdb, 0xe6, 0xda, 0xde, 0xdb, 0xde, 0x7a, 0xd6, 0xbb, 0xe6, 0xba, 0xe6, 0xba, 0xee, 0xb9, 0xe6, 0x99, 0xde, 0xba, 0xe6, 0xba, 0xee, 0xb9, 0xe6, 0x99, 0xe6, 0x99, 0xe6, 0xb9, 0xe6, 0xba, 0xe6, 0x99, 0xe6, 0x99, 0xde, 0x79, 0xde, 0x79, 0xde, 0x79, 0xde, 0x9a, 0xde, 0xba, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x79, 0xde, 0x79, 0xe6, 0x99, 0xde, 0x79, 0xde, 0x78, 0xde, 0x78, 0xe6, 0xf2, 0xbc, 0x34, 0xc5, 0xba, 0xe6, 0xdb, 0xde, 0xfb, 0xe6, 0xba, 0xe6, 0xfb, 0xee, 0xdb, 0xe6, 0x5a, 0xde, 0xdc, 0xee, 0xba, 0xe6, 0xba, 0xde, 0xba, 0xde, 0xdb, 0xde, 0xfc, 0xde, 0xdc, 0xd6, 0xdb, 0xd6, 0xdb, 0xde, 0xdb, 0xde, 0xba, 0xde, 0xda, 0xde, 0xba, 0xde, 0xda, 0xde, 0x9a, 0xd6, 0xdb, 0xde, 0xdb, 0xd6, 0xda, 0xd6, 0x99, 0xd6, 0x7a, 0xde, 0x7a, 0xe6, 0x9b, 0xde, 0xdb, 0xde, 0xfb, 0xee, 0x99, 0xe6, 0xda, 0xe6, 0xbb, 0xde, 0x9c, 0xd6, 0xbc, 0xde, 0xdc, 0xde, 0xba, 0xd6, 0xda, 0xde, 0xba, 0xd6, 0x9c, 0xc6, 0xbe, 0xce, 0xde, 0xde, 0xbd, 0xde, 0xbc, 0xde, 0xfc, 0xe6, 0xbb, 0xd6, 0xdb, 0xd6, 0x99, 0xd6, 0x7a, 0xde, 0x59, 0xd6, 0x39, 0xd6, 0x9b, 0xd6, 0x7b, 0xd6, 0x9b, 0xde, 0x9b, 0xde, 0x9a, 0xd6, 0xbb, 0xd6, 0x9b, 0xd6, 0xbb, 0xde, 0x7a, 0xde, 0x59, 0xde, 0xba, 0xe6, 0x59, 0xd6, 0x59, 0xce, 0x9a, 0xce, 0x9a, 0xd6, 0x7a, 0xd6, 0xba, 0xd6, 0x79, 0xd6, 0x9b, 0xd6, 0x39, 0xce, 0xba, 0xd6, 0x99, 0xde, 0xb8, 0xe6, 0xb8, 0xe6, 0x78, 0xde, 0x78, 0xd6, 0x99, 0xd6, 0x18, 0xc6, 0x38, 0xce, 0xba, 0xde, 0x7a, 0xd6, 0xdc, 0xde, 0xbb, 0xd6, 0x39, 0xce, 0xf7, 0xcd, 0x99, 0xe6, 0x79, 0xd6, 0x59, 0xd6, 0x99, 0xd6, 0xba, 0xde, 0xba, 0xde, 0x9a, 0xde, 0x99, 0xde, 0x79, 0xd6, 0x79, 0xd6, 0xba, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x79, 0xd6, 0x79, 0xde, 0x79, 0xde, 0x79, 0xde, 0x18, 0xce, 0x59, 0xd6, 0x99, 0xd6, 0x79, 0xd6, 0x38, 0xce, 0x79, 0xd6, 0x9a, 0xe6, 0x9a, 0xe6, 0x58, 0xde, 0x38, 0xde, 0x79, 0xe6, 0x18, 0xd6, 0x58, 0xe6, 0x58, 0xde, 0x78, 0xd6, 0x99, 0xd6, 0x39, 0xce, 0x39, 0xce, 0xba, 0xde, 0x58, 0xd6, 0x17, 0xce, 0x38, 0xd6, 0x19, 0xce, 0x19, 0xd6, 0x39, 0xde, 0xf8, 0xd5, 0x39, 0xde, 0x3a, 0xde, 0xd9, 0xc5, 0x3b, 0xd6, 0x5a, 0xd6, 0x7b, 0xde, 0x9b, 0xe6, 0x5a, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x59, 0xd6, 0x9a, 0xde, 0x59, 0xd6, 0x79, 0xd6, 0x79, 0xd6, 0x59, 0xd6, 0x59, 0xd6, 0x39, 0xce, 0x5a, 0xce, 0x9c, 0xd6, 0x3a, 0xce, 0x39, 0xce, 0x59, 0xce, 0x59, 0xce, 0x79, 0xce, 0x58, 0xce, 0x37, 0xd6, 0x17, 0xd6, 0x17, 0xd6, 0x38, 0xd6, 0x59, 0xde, 0x18, 0xd6, 0x3a, 0xd6, 0x19, 0xc6, 0x3b, 0xc6, 0x3b, 0xce, 0x1a, 0xd6, 0xd9, 0xd5, 0xf9, 0xd5, 0x19, 0xd6, 0xf9, 0xd5, 0xf9, 0xd5, 0x19, 0xde, 0xf8, 0xd5, 0xd7, 0xd5, 0xf8, 0xd5, 0xf7, 0xcd, 0x18, 0xd6, 0x18, 0xce, 0xf7, 0xcd, 0x18, 0xce, 0xf8, 0xcd, + 0x7c, 0xef, 0x7c, 0xef, 0x5c, 0xe7, 0x5c, 0xe7, 0x3b, 0xe7, 0x1b, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0xfb, 0xe6, 0x3c, 0xe7, 0x3c, 0xe7, 0xfb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0x1c, 0xe7, 0x1c, 0xe7, 0xbb, 0xde, 0x9a, 0xd6, 0xdb, 0xde, 0x1c, 0xe7, 0xdb, 0xe6, 0x9a, 0xde, 0x79, 0xde, 0xfb, 0xf6, 0x1b, 0xf7, 0xda, 0xee, 0xfb, 0xee, 0x1b, 0xf7, 0xfb, 0xee, 0xdc, 0xe6, 0xbc, 0xe6, 0xbc, 0xe6, 0xbb, 0xee, 0x9a, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xba, 0xee, 0xdb, 0xee, 0xdc, 0xee, 0xfc, 0xee, 0xdc, 0xe6, 0xfc, 0xee, 0xdc, 0xe6, 0x7b, 0xde, 0x5a, 0xd6, 0xdb, 0xe6, 0xda, 0xde, 0xda, 0xde, 0xda, 0xe6, 0x5b, 0xe7, 0x9c, 0xe7, 0x5a, 0xd7, 0x5b, 0xdf, 0x3a, 0xdf, 0x3b, 0xe7, 0xfa, 0xde, 0xba, 0xd6, 0xda, 0xde, 0xdb, 0xe6, 0xbb, 0xee, 0xdb, 0xee, 0x3b, 0xe7, 0x3a, 0xdf, 0x5b, 0xdf, 0x5b, 0xdf, 0xfa, 0xde, 0xba, 0xde, 0xba, 0xee, 0xda, 0xee, 0xda, 0xee, 0x58, 0xd6, 0xd9, 0xde, 0x98, 0xd6, 0xb9, 0xd6, 0xfb, 0xe6, 0x1c, 0xef, 0x1d, 0xe7, 0x1c, 0xdf, 0x1d, 0xdf, 0xdb, 0xde, 0xfc, 0xe6, 0xba, 0xde, 0x9a, 0xde, 0xdb, 0xde, 0x7a, 0xd6, 0x3a, 0xce, 0x9b, 0xd6, 0x79, 0xd6, 0x99, 0xde, 0xb9, 0xde, 0x99, 0xde, 0x9a, 0xe6, 0xbb, 0xe6, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xda, 0xde, 0xb9, 0xde, 0xb8, 0xde, 0xb8, 0xde, 0xba, 0xe6, 0xbc, 0xee, 0xbc, 0xe6, 0x9c, 0xde, 0x1e, 0xe7, 0x1d, 0xdf, 0x5d, 0xdf, 0xdb, 0xd6, 0x9b, 0xd6, 0x9b, 0xde, 0xdc, 0xde, 0xfc, 0xe6, 0xfc, 0xe6, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xdc, 0xde, 0x1c, 0xd7, 0x99, 0xbe, 0xb9, 0xce, 0xba, 0xe6, 0x79, 0xde, 0xbc, 0xe6, 0x1d, 0xef, 0x9b, 0xe6, 0xbb, 0xe6, 0x7a, 0xd6, 0xfc, 0xe6, 0xdd, 0xde, 0x9c, 0xd6, 0xbb, 0xd6, 0xba, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0xdc, 0xd6, 0xfd, 0xde, 0xfc, 0xde, 0xdb, 0xde, 0xfc, 0xe6, 0xba, 0xde, 0xba, 0xe6, 0xdb, 0xe6, 0xfb, 0xee, 0x7a, 0xde, 0x9a, 0xde, 0x59, 0xd6, 0x59, 0xce, 0x7a, 0xd6, 0xbb, 0xee, 0xdc, 0xf6, 0xdc, 0xde, 0xfc, 0xde, 0xfb, 0xe6, 0xda, 0xe6, 0xda, 0xe6, 0xfc, 0xe6, 0xdc, 0xde, 0xdc, 0xde, 0xba, 0xd6, 0xd9, 0xd6, 0xf9, 0xde, 0xf9, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x5a, 0xe6, 0x7a, 0xee, 0x7a, 0xee, 0x9b, 0xee, 0x9a, 0xde, 0x9a, 0xe6, 0x9b, 0xee, 0x5a, 0xe6, 0xbc, 0xee, 0xf9, 0xd5, 0x5a, 0xd6, 0xbb, 0xe6, 0xdb, 0xe6, 0x9a, 0xde, 0xfb, 0xe6, 0xbb, 0xde, 0xdc, 0xd6, 0xdc, 0xde, 0x7a, 0xe6, 0x39, 0xde, 0x9b, 0xee, 0x7a, 0xde, 0x7b, 0xd6, 0x7a, 0xd6, 0x9a, 0xde, 0x7a, 0xde, 0x99, 0xd6, 0x18, 0xce, 0x7b, 0xd6, 0xbc, 0xde, 0x7b, 0xd6, 0x7b, 0xde, 0x5a, 0xde, 0x7a, 0xe6, 0x9b, 0xe6, 0x7b, 0xde, 0x9b, 0xde, 0x5a, 0xd6, 0x59, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xfc, 0xde, 0x79, 0xce, 0x78, 0xd6, 0x99, 0xde, 0xbb, 0xde, 0x7b, 0xd6, 0x9b, 0xd6, 0xbb, 0xde, 0x9b, 0xd6, 0x9b, 0xd6, 0x7b, 0xd6, 0x5a, 0xd6, 0x19, 0xce, 0x7b, 0xd6, 0x9b, 0xde, 0x9b, 0xde, 0x9b, 0xde, 0x7b, 0xd6, 0x5a, 0xd6, 0x7b, 0xde, 0x7a, 0xd6, 0x5a, 0xd6, 0x79, 0xd6, 0x18, 0xc6, 0x7a, 0xce, 0x9a, 0xce, 0xfc, 0xde, 0xba, 0xd6, 0x9a, 0xde, 0x9a, 0xe6, 0x7a, 0xde, 0x7a, 0xde, 0xbb, 0xe6, 0x79, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x38, 0xd6, 0x59, 0xde, 0x5a, 0xd6, 0x3a, 0xd6, 0x59, 0xd6, 0x58, 0xd6, 0x99, 0xde, 0x39, 0xd6, 0x9a, 0xde, 0x59, 0xd6, 0x37, 0xce, 0x78, 0xd6, 0x78, 0xce, 0x79, 0xce, 0xf8, 0xbd, 0xbb, 0xce, 0x7a, 0xd6, 0x7a, 0xd6, 0x7a, 0xce, 0x9b, 0xd6, 0xdc, 0xd6, 0x7b, 0xce, 0x39, 0xc6, 0x79, 0xce, 0x79, 0xd6, 0x99, 0xd6, 0x79, 0xde, 0x59, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x5a, 0xd6, 0x5b, 0xd6, 0x5a, 0xd6, 0x5b, 0xde, 0x5b, 0xde, 0x5b, 0xd6, 0x7b, 0xd6, 0x7a, 0xce, 0x39, 0xd6, 0x18, 0xce, 0x39, 0xd6, 0x7a, 0xde, 0x5a, 0xde, 0x19, 0xce, 0x7a, 0xd6, 0x7a, 0xde, 0x59, 0xde, 0x59, 0xde, 0x59, 0xd6, 0x38, 0xce, 0x59, 0xce, 0x59, 0xd6, 0x38, 0xce, 0x38, 0xd6, 0x38, 0xd6, 0xf7, 0xcd, 0x39, 0xd6, 0x39, 0xd6, 0x18, 0xd6, 0x39, 0xde, 0x59, 0xde, 0x19, 0xd6, 0x19, 0xd6, 0xd8, 0xcd, + 0x1d, 0xe7, 0x1d, 0xe7, 0x3d, 0xef, 0x3e, 0xef, 0x1d, 0xe7, 0x1d, 0xe7, 0x1d, 0xe7, 0xdc, 0xde, 0x1d, 0xe7, 0x1e, 0xe7, 0x1d, 0xe7, 0x1d, 0xe7, 0x1d, 0xe7, 0x3d, 0xe7, 0x1d, 0xdf, 0xdd, 0xd6, 0x1e, 0xd7, 0x1e, 0xd7, 0x3f, 0xdf, 0xbc, 0xce, 0xbc, 0xd6, 0xbb, 0xde, 0x1c, 0xef, 0x3c, 0xf7, 0xba, 0xe6, 0xba, 0xde, 0x3c, 0xef, 0x3c, 0xef, 0xfc, 0xde, 0x3d, 0xdf, 0x5d, 0xdf, 0x9e, 0xe7, 0x5c, 0xdf, 0x3b, 0xdf, 0x1b, 0xe7, 0xfc, 0xe6, 0xdc, 0xe6, 0xdc, 0xee, 0xdd, 0xe6, 0x9c, 0xde, 0xdd, 0xe6, 0xbd, 0xde, 0xbc, 0xd6, 0x9b, 0xd6, 0xfc, 0xde, 0x1c, 0xe7, 0xba, 0xd6, 0x79, 0xd6, 0x99, 0xd6, 0xba, 0xde, 0xfc, 0xee, 0xbb, 0xe6, 0xdc, 0xde, 0x1e, 0xe7, 0xfd, 0xe6, 0x1e, 0xef, 0xbd, 0xee, 0xde, 0xee, 0xdd, 0xee, 0xdd, 0xe6, 0xdc, 0xde, 0xdc, 0xd6, 0xbc, 0xd6, 0xdc, 0xd6, 0xfc, 0xe6, 0xbc, 0xde, 0xdd, 0xd6, 0xff, 0xd6, 0xde, 0xd6, 0x9e, 0xd6, 0x9e, 0xde, 0x9d, 0xde, 0xbe, 0xde, 0x3b, 0xce, 0x5b, 0xd6, 0x9b, 0xde, 0xfb, 0xe6, 0xdb, 0xe6, 0xfc, 0xe6, 0x1c, 0xe7, 0xfb, 0xe6, 0xfb, 0xe6, 0xfc, 0xd6, 0x1d, 0xd7, 0xdc, 0xce, 0x7b, 0xce, 0x9b, 0xce, 0xbc, 0xce, 0xbc, 0xc6, 0x1e, 0xcf, 0x3d, 0xd7, 0xfc, 0xce, 0xdb, 0xc6, 0xbb, 0xc6, 0xbc, 0xbe, 0x9d, 0xbe, 0x7d, 0xb6, 0xbf, 0xb6, 0xdf, 0xbe, 0xdf, 0xbe, 0xdf, 0xc6, 0xff, 0xce, 0x9d, 0xc6, 0x1a, 0xb6, 0x5b, 0xce, 0x9b, 0xe6, 0x9b, 0xde, 0x3f, 0xe7, 0xff, 0xc6, 0x39, 0x7d, 0x5a, 0x7d, 0x5e, 0xa6, 0x1d, 0x9e, 0xfc, 0x95, 0x1c, 0x9e, 0x7e, 0xae, 0x7e, 0xae, 0xdb, 0x9d, 0xdb, 0x9d, 0x5d, 0xae, 0x5c, 0xae, 0x7d, 0xb6, 0x9e, 0xbe, 0x5d, 0xb6, 0x1b, 0xae, 0xdb, 0xad, 0xdb, 0xad, 0xfc, 0xad, 0x3d, 0xbe, 0x1c, 0xb6, 0x7d, 0xbe, 0x5c, 0xbe, 0xdc, 0xce, 0x9a, 0xd6, 0x9a, 0xd6, 0xbb, 0xd6, 0x1d, 0xd7, 0x1f, 0xc7, 0x3d, 0xa6, 0xbc, 0x8d, 0x7a, 0x7d, 0x7b, 0x75, 0xfe, 0x85, 0x1d, 0x8e, 0x7a, 0x85, 0x9a, 0x8d, 0xda, 0x95, 0xda, 0x95, 0xfb, 0x9d, 0x5d, 0xae, 0x5c, 0xa6, 0x3c, 0xa6, 0x9e, 0xb6, 0x7d, 0xbe, 0x9d, 0xbe, 0x7d, 0xbe, 0x9d, 0xc6, 0x9d, 0xc6, 0x9d, 0xc6, 0x9c, 0xc6, 0xbb, 0xd6, 0xba, 0xd6, 0x99, 0xde, 0xba, 0xde, 0x3d, 0xd7, 0x3d, 0xcf, 0x3d, 0xd7, 0x3e, 0xdf, 0xdc, 0xde, 0xfe, 0xe6, 0xdf, 0xe6, 0xff, 0xee, 0xbf, 0xde, 0xdf, 0xe6, 0xdf, 0xee, 0xde, 0xee, 0xbc, 0xce, 0x1d, 0xd7, 0x9c, 0xd6, 0x1e, 0xe7, 0x1e, 0xe7, 0x1e, 0xdf, 0xfe, 0xd6, 0xbe, 0xce, 0xbf, 0xd6, 0x9e, 0xd6, 0x3b, 0xc6, 0x7b, 0xd6, 0x79, 0xde, 0x99, 0xe6, 0xb9, 0xe6, 0x99, 0xde, 0x99, 0xde, 0xdb, 0xe6, 0x3d, 0xdf, 0xbb, 0xce, 0xba, 0xde, 0xba, 0xde, 0xda, 0xe6, 0x99, 0xd6, 0x9a, 0xce, 0x9b, 0xd6, 0x7b, 0xd6, 0x7b, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x99, 0xd6, 0x9a, 0xd6, 0x5b, 0xce, 0x9c, 0xd6, 0x7c, 0xd6, 0xde, 0xde, 0xbc, 0xd6, 0xbb, 0xd6, 0x99, 0xce, 0x38, 0xce, 0x5a, 0xde, 0x3a, 0xde, 0xdc, 0xee, 0xbb, 0xe6, 0x9a, 0xd6, 0xfc, 0xd6, 0xbb, 0xce, 0x9c, 0xce, 0xbc, 0xd6, 0x9c, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0xbc, 0xd6, 0x9c, 0xd6, 0xbc, 0xde, 0x9c, 0xd6, 0x9c, 0xd6, 0x9b, 0xd6, 0xbc, 0xd6, 0xbc, 0xde, 0x9c, 0xd6, 0xbc, 0xde, 0x5c, 0xce, 0xfa, 0xc5, 0x3b, 0xce, 0x7c, 0xde, 0x5b, 0xd6, 0x3a, 0xd6, 0xbb, 0xe6, 0x59, 0xd6, 0xfb, 0xde, 0xba, 0xd6, 0xdb, 0xd6, 0xbb, 0xce, 0xbb, 0xd6, 0x9b, 0xd6, 0xdc, 0xd6, 0x9b, 0xce, 0xda, 0xde, 0xb9, 0xd6, 0x39, 0xce, 0x7a, 0xd6, 0xb9, 0xd6, 0x58, 0xce, 0x79, 0xd6, 0x7a, 0xde, 0x7a, 0xde, 0x5a, 0xd6, 0x59, 0xd6, 0x5a, 0xce, 0x7b, 0xd6, 0x3a, 0xd6, 0x9a, 0xe6, 0x18, 0xd6, 0x99, 0xee, 0x58, 0xde, 0xdb, 0xe6, 0xdc, 0xde, 0x9c, 0xd6, 0x5b, 0xce, 0x9b, 0xd6, 0x5a, 0xd6, 0x59, 0xd6, 0x9a, 0xde, 0x9a, 0xde, 0x9a, 0xde, 0x79, 0xde, 0x79, 0xde, 0x79, 0xd6, 0x79, 0xde, 0x58, 0xde, 0x38, 0xde, 0x38, 0xde, 0x39, 0xd6, 0x79, 0xd6, 0x7a, 0xd6, 0x5a, 0xd6, 0x5a, 0xd6, 0x39, 0xce, 0x9a, 0xd6, 0x7a, 0xd6, 0x5a, 0xce, 0x9b, 0xd6, 0x7a, 0xce, 0x19, 0xce, 0x7b, 0xde, 0x9b, 0xde, 0x7b, 0xd6, 0x5a, 0xce, 0x5a, 0xce, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xde, 0x99, 0xd6, 0x58, 0xd6, 0x58, 0xd6, 0x38, 0xce, 0x58, 0xce, 0x78, 0xce, 0x78, 0xce, 0x78, 0xce, 0x37, 0xc6, + 0xba, 0x3c, 0x79, 0x3c, 0x79, 0x34, 0x79, 0x34, 0x79, 0x34, 0x99, 0x3c, 0xba, 0x3c, 0x79, 0x3c, 0x38, 0x2c, 0x18, 0x2c, 0x38, 0x2c, 0x58, 0x2c, 0x38, 0x2c, 0x58, 0x2c, 0x38, 0x24, 0xd7, 0x1b, 0x18, 0x24, 0xf7, 0x23, 0xf6, 0x3b, 0xf5, 0x53, 0xb9, 0xa5, 0xdc, 0xde, 0x1c, 0xe7, 0x3e, 0xdf, 0x9e, 0xae, 0x3a, 0x6d, 0xb9, 0x4c, 0xfa, 0x4c, 0xfa, 0x54, 0xb8, 0x54, 0x99, 0x54, 0xbd, 0x75, 0xfd, 0x7d, 0xbc, 0x7d, 0x9b, 0x75, 0x7b, 0x6d, 0x5b, 0x5d, 0x3c, 0x5d, 0x1b, 0x4d, 0xba, 0x3c, 0x17, 0x24, 0x17, 0x24, 0x37, 0x2c, 0x17, 0x2c, 0x17, 0x3c, 0x78, 0x54, 0xf9, 0x6c, 0x7a, 0x95, 0xdd, 0xde, 0xbc, 0xe6, 0x1e, 0xe7, 0xff, 0xce, 0x7a, 0x85, 0xb8, 0x5c, 0xd9, 0x54, 0x3b, 0x65, 0xda, 0x5c, 0x7c, 0x75, 0xfd, 0x85, 0xdd, 0x7d, 0x1a, 0x5d, 0x98, 0x44, 0x77, 0x44, 0x98, 0x44, 0x98, 0x3c, 0x98, 0x34, 0x99, 0x2c, 0x99, 0x2c, 0x99, 0x2c, 0x58, 0x24, 0x17, 0x24, 0x37, 0x2c, 0x58, 0x34, 0x57, 0x44, 0x35, 0x54, 0x9a, 0x95, 0xdc, 0xce, 0xfc, 0xde, 0x1b, 0xdf, 0x1d, 0xdf, 0xff, 0xc6, 0x77, 0x5c, 0xb6, 0x23, 0x96, 0x0b, 0x77, 0x13, 0x78, 0x1b, 0x57, 0x1b, 0x57, 0x13, 0xb8, 0x13, 0xf8, 0x13, 0x39, 0x24, 0xf8, 0x1b, 0xb7, 0x13, 0xd8, 0x13, 0x98, 0x0b, 0x98, 0x0b, 0x96, 0x0b, 0xb7, 0x13, 0x98, 0x0b, 0x57, 0x0b, 0x57, 0x13, 0x97, 0x1b, 0x97, 0x1b, 0x13, 0x1b, 0xd3, 0x4b, 0xbc, 0xc6, 0x1c, 0xd7, 0xfd, 0xbe, 0x77, 0x44, 0x56, 0x13, 0xb6, 0x0a, 0x96, 0x0a, 0x75, 0x0a, 0xb7, 0x12, 0xb6, 0x12, 0x75, 0x0a, 0x95, 0x0a, 0x96, 0x0a, 0x95, 0x0a, 0x95, 0x0a, 0x95, 0x02, 0x95, 0x0a, 0xb5, 0x02, 0xb5, 0x02, 0xb5, 0x02, 0xb5, 0x02, 0x95, 0x02, 0x74, 0x02, 0xb5, 0x02, 0x53, 0x02, 0x73, 0x12, 0x71, 0x2a, 0x3d, 0xbe, 0xbd, 0xde, 0x7b, 0xd6, 0x1d, 0xdf, 0x9c, 0xb6, 0xf0, 0x2a, 0xd3, 0x0a, 0xd5, 0x02, 0xf5, 0x02, 0xf5, 0x0a, 0x94, 0x02, 0xd7, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x96, 0x0a, 0x76, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x97, 0x0a, 0xb7, 0x0a, 0x75, 0x0a, 0x54, 0x0a, 0x74, 0x12, 0x54, 0x12, 0xf4, 0x32, 0x5d, 0xb6, 0xdd, 0xd6, 0xfd, 0xde, 0xfe, 0xce, 0x39, 0x65, 0xb4, 0x23, 0x33, 0x0b, 0x34, 0x0b, 0x75, 0x1b, 0x76, 0x1b, 0xf5, 0x12, 0x16, 0x13, 0x36, 0x03, 0x57, 0x0b, 0x58, 0x13, 0x37, 0x13, 0x36, 0x13, 0x36, 0x13, 0xf5, 0x12, 0xf5, 0x12, 0x14, 0x0b, 0x14, 0x0b, 0x15, 0x0b, 0x36, 0x13, 0x57, 0x1b, 0xb8, 0x33, 0x54, 0x33, 0x59, 0x85, 0x7b, 0xbe, 0x9a, 0xce, 0xfc, 0xd6, 0x1d, 0xd7, 0x1f, 0xcf, 0x76, 0x6c, 0x74, 0x33, 0x5a, 0x4c, 0x3a, 0x4c, 0xd9, 0x4b, 0x96, 0x4b, 0x99, 0x6c, 0x7b, 0x8d, 0xbc, 0x95, 0xbb, 0x9d, 0x3c, 0xae, 0xbe, 0xbe, 0xdf, 0xc6, 0x3e, 0xbe, 0x5a, 0xa5, 0x7d, 0xbe, 0x7c, 0xb6, 0x76, 0x74, 0xf8, 0x84, 0x1c, 0x9e, 0xfb, 0x9d, 0x57, 0x95, 0x7b, 0xbe, 0x1a, 0xc6, 0x9c, 0xde, 0x7c, 0xd6, 0x9d, 0xce, 0x1f, 0xc7, 0x13, 0x33, 0xd4, 0x22, 0x13, 0x02, 0x52, 0x0a, 0x72, 0x12, 0xb3, 0x1a, 0xf4, 0x22, 0x34, 0x23, 0x55, 0x2b, 0x75, 0x33, 0x75, 0x33, 0x34, 0x2b, 0x74, 0x33, 0xf7, 0x43, 0x17, 0x44, 0xd7, 0x3b, 0xb6, 0x3b, 0x95, 0x33, 0xb5, 0x3b, 0xf6, 0x53, 0xf5, 0x5b, 0xb3, 0x53, 0xfb, 0xa5, 0x7b, 0xc6, 0xdc, 0xde, 0x9b, 0xd6, 0xfd, 0xce, 0x7a, 0x8d, 0xb5, 0x43, 0x75, 0x33, 0xb7, 0x3b, 0xd7, 0x43, 0xb7, 0x43, 0xd8, 0x43, 0x39, 0x4c, 0xf8, 0x43, 0x1c, 0x75, 0x1d, 0x75, 0xb7, 0x4b, 0xba, 0x6c, 0xfa, 0x74, 0x9d, 0x8d, 0xda, 0x7c, 0xb9, 0x7c, 0x1a, 0x85, 0x5a, 0x8d, 0xd8, 0x74, 0xb8, 0x74, 0x76, 0x7c, 0x77, 0xb5, 0x39, 0xde, 0x38, 0xde, 0x59, 0xde, 0x9c, 0xde, 0xba, 0xb5, 0x56, 0x7c, 0xf9, 0x8c, 0xd9, 0x84, 0xf9, 0x8c, 0x19, 0x8d, 0x9b, 0x9d, 0x9b, 0x9d, 0xdc, 0x9d, 0x9a, 0x95, 0xdb, 0x9d, 0xda, 0xa5, 0x3b, 0xa6, 0x5b, 0x9e, 0x3b, 0x9e, 0x1b, 0x9e, 0x1b, 0x9e, 0x1b, 0x9e, 0x1b, 0x9e, 0x1a, 0xa6, 0xf9, 0xa5, 0xf9, 0xad, 0xf8, 0xb5, 0x7a, 0xd6, 0x9a, 0xd6, 0x99, 0xc6, 0xdb, 0xce, 0xbb, 0xd6, 0x7b, 0xce, 0x7b, 0xce, 0x5c, 0xce, 0x5b, 0xce, 0x5b, 0xce, 0x5c, 0xd6, 0x5b, 0xd6, 0x3b, 0xce, 0x3b, 0xce, 0x1b, 0xce, 0x7c, 0xd6, 0x7c, 0xd6, 0x5c, 0xd6, 0x5c, 0xce, 0x5d, 0xce, 0x5d, 0xce, 0x1c, 0xc6, + 0xf9, 0x0b, 0xf9, 0x0b, 0x1a, 0x0c, 0xf9, 0x0b, 0xb8, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0xd9, 0x0b, 0xf9, 0x03, 0xd8, 0x03, 0x19, 0x0c, 0x19, 0x0c, 0xd8, 0x03, 0x19, 0x04, 0x5a, 0x0c, 0x5a, 0x0c, 0x1a, 0x04, 0xf9, 0x03, 0x76, 0x0b, 0x33, 0x1b, 0x38, 0x85, 0xdd, 0xce, 0x1d, 0xdf, 0x3f, 0xcf, 0x3a, 0x6d, 0xd6, 0x23, 0xd8, 0x13, 0x1a, 0x14, 0xd8, 0x0b, 0xb9, 0x13, 0x99, 0x0b, 0x9a, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x03, 0x98, 0x0b, 0xb9, 0x13, 0xda, 0x13, 0xda, 0x13, 0x99, 0x03, 0xba, 0x03, 0x99, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0x99, 0x0b, 0x57, 0x0b, 0x57, 0x13, 0xb6, 0x3b, 0x7b, 0xc6, 0xfb, 0xde, 0x3e, 0xd7, 0xdf, 0xb6, 0x56, 0x3c, 0xd6, 0x13, 0x38, 0x0c, 0xd8, 0x03, 0xd9, 0x03, 0x98, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x0b, 0x99, 0x03, 0xb8, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x13, 0xb9, 0x13, 0x77, 0x0b, 0x97, 0x03, 0xf9, 0x0b, 0xb8, 0x03, 0xf9, 0x0b, 0x55, 0x13, 0x1a, 0x6d, 0xbe, 0xc6, 0xfd, 0xe6, 0xfc, 0xee, 0xfc, 0xe6, 0x1f, 0xcf, 0x33, 0x33, 0xd6, 0x0b, 0x3a, 0x04, 0xba, 0x03, 0x79, 0x03, 0x78, 0x0b, 0x98, 0x0b, 0x18, 0x0c, 0xb7, 0x03, 0x38, 0x14, 0x18, 0x14, 0xf8, 0x13, 0x19, 0x14, 0xd8, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xba, 0x03, 0x99, 0x03, 0x57, 0x03, 0x56, 0x03, 0x57, 0x03, 0x35, 0x13, 0xd1, 0x32, 0x1c, 0xb6, 0xdc, 0xde, 0xff, 0xd6, 0x77, 0x33, 0xd8, 0x0a, 0xd9, 0x1a, 0x78, 0x12, 0x77, 0x0a, 0xb8, 0x0a, 0x98, 0x0a, 0x97, 0x02, 0xb8, 0x0a, 0x97, 0x0a, 0x57, 0x02, 0x98, 0x0a, 0x57, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x37, 0x02, 0x17, 0x02, 0x37, 0x02, 0x58, 0x0a, 0x78, 0x0a, 0x77, 0x02, 0x97, 0x0a, 0x55, 0x0a, 0x11, 0x1a, 0x3c, 0xbe, 0x3a, 0xd6, 0xbb, 0xe6, 0xbc, 0xde, 0x1f, 0xdf, 0x3b, 0x8d, 0x75, 0x12, 0xd9, 0x12, 0xfa, 0x12, 0x1a, 0x13, 0x19, 0x0b, 0xb8, 0x02, 0xb8, 0x02, 0x98, 0x02, 0xd8, 0x0a, 0xb7, 0x0a, 0x96, 0x0a, 0x96, 0x12, 0x76, 0x0a, 0xd7, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0xf8, 0x02, 0xf8, 0x0a, 0xd6, 0x0a, 0xb5, 0x0a, 0x32, 0x02, 0xd3, 0x32, 0x5c, 0xce, 0x7b, 0xe6, 0x9b, 0xe6, 0x3f, 0xdf, 0x16, 0x4c, 0x15, 0x13, 0x17, 0x03, 0x39, 0x0b, 0xb6, 0x0a, 0xd6, 0x0a, 0x75, 0x02, 0xf6, 0x0a, 0x15, 0x03, 0x16, 0x03, 0xf5, 0x02, 0x17, 0x0b, 0x38, 0x0b, 0xd7, 0x02, 0x18, 0x0b, 0xf7, 0x02, 0x77, 0x03, 0x56, 0x03, 0xf6, 0x02, 0x17, 0x03, 0x38, 0x0b, 0xd5, 0x0a, 0xf2, 0x22, 0x92, 0x4b, 0x19, 0xc6, 0x7a, 0xe6, 0x9a, 0xe6, 0xdd, 0xde, 0x1f, 0xd7, 0x54, 0x43, 0xb4, 0x12, 0x96, 0x02, 0xb7, 0x02, 0x76, 0x02, 0xb6, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x96, 0x0a, 0x56, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x75, 0x02, 0x75, 0x0a, 0x74, 0x0a, 0x33, 0x02, 0x58, 0x23, 0x76, 0x0a, 0x77, 0x02, 0x16, 0x02, 0x16, 0x02, 0xf3, 0x09, 0xb2, 0x3a, 0x95, 0x94, 0x39, 0xd6, 0xba, 0xe6, 0xfd, 0xe6, 0x3a, 0x95, 0xf0, 0x11, 0xd3, 0x01, 0xb4, 0x01, 0x95, 0x01, 0x95, 0x01, 0xb5, 0x01, 0x95, 0x01, 0x94, 0x01, 0xb4, 0x09, 0xb4, 0x09, 0x94, 0x01, 0xd4, 0x09, 0x73, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x94, 0x01, 0xb4, 0x09, 0xb4, 0x09, 0xb4, 0x09, 0x73, 0x01, 0x72, 0x09, 0x6f, 0x09, 0xd1, 0x42, 0x9c, 0xce, 0x59, 0xd6, 0xdb, 0xde, 0xdd, 0xce, 0xb6, 0x4b, 0x74, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0x75, 0x02, 0x95, 0x0a, 0x94, 0x02, 0xb4, 0x02, 0xb4, 0x0a, 0x95, 0x0a, 0x14, 0x02, 0x75, 0x12, 0x54, 0x02, 0x54, 0x02, 0x95, 0x0a, 0x54, 0x0a, 0x54, 0x12, 0x54, 0x0a, 0x14, 0x02, 0xf7, 0x12, 0x55, 0x02, 0x94, 0x1a, 0x71, 0x32, 0x1c, 0xb6, 0xbc, 0xce, 0xbc, 0xc6, 0xdf, 0xbe, 0x74, 0x3b, 0x72, 0x12, 0x94, 0x0a, 0x74, 0x0a, 0x75, 0x0a, 0x55, 0x0a, 0x75, 0x0a, 0x35, 0x02, 0x56, 0x02, 0x35, 0x02, 0x96, 0x12, 0x54, 0x0a, 0x55, 0x0a, 0x55, 0x02, 0x56, 0x02, 0x36, 0x12, 0x36, 0x12, 0x35, 0x0a, 0x35, 0x0a, 0x34, 0x12, 0x33, 0x1a, 0x32, 0x1a, 0x51, 0x22, 0x3c, 0x85, 0x9f, 0xae, 0x17, 0x4c, 0xb2, 0x0a, 0xd4, 0x12, 0xd4, 0x12, 0xf4, 0x0a, 0xf4, 0x12, 0xd3, 0x0a, 0xd3, 0x0a, 0x55, 0x1b, 0x75, 0x2b, 0x95, 0x2b, 0xb5, 0x33, 0x78, 0x4c, 0x98, 0x54, 0x36, 0x44, 0xb4, 0x33, 0x73, 0x2b, 0x94, 0x33, 0x16, 0x44, 0x16, 0x44, + 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x0b, 0x3a, 0x0c, 0x3a, 0x14, 0x1a, 0x0c, 0xf8, 0x03, 0xd8, 0x03, 0xf9, 0x03, 0xf9, 0x0b, 0xb8, 0x0b, 0x98, 0x03, 0xb8, 0x03, 0x75, 0x13, 0x76, 0x6c, 0xbd, 0xd6, 0xfc, 0xe6, 0x3e, 0xd7, 0xd8, 0x5c, 0x79, 0x34, 0xf8, 0x1b, 0xf9, 0x13, 0x3a, 0x14, 0xf9, 0x0b, 0x3a, 0x14, 0x3a, 0x0c, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0x3a, 0x0c, 0x1a, 0x0c, 0x1a, 0x0c, 0xd9, 0x0b, 0xb8, 0x0b, 0x77, 0x03, 0x56, 0x03, 0x95, 0x2b, 0x9e, 0xbe, 0xdd, 0xde, 0xdc, 0xd6, 0x1f, 0xc7, 0x95, 0x23, 0xb7, 0x03, 0xf9, 0x0b, 0xf8, 0x03, 0xd8, 0x03, 0xd8, 0x0b, 0xd9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xda, 0x0b, 0xb9, 0x13, 0x78, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb8, 0x13, 0x13, 0x1b, 0x19, 0x75, 0x9c, 0xc6, 0xfc, 0xe6, 0x1c, 0xe7, 0xfd, 0xd6, 0xff, 0xbe, 0x33, 0x2b, 0x77, 0x13, 0x79, 0x03, 0x99, 0x03, 0x9a, 0x0b, 0xb9, 0x0b, 0x99, 0x0b, 0x3a, 0x1c, 0x7b, 0x24, 0x19, 0x14, 0x19, 0x14, 0xf8, 0x0b, 0x9b, 0x24, 0x39, 0x1c, 0x19, 0x1c, 0xd8, 0x0b, 0x99, 0x03, 0x78, 0x03, 0x58, 0x03, 0x58, 0x03, 0x57, 0x03, 0x57, 0x03, 0x56, 0x13, 0xd6, 0x3b, 0x1c, 0x9e, 0xbc, 0xce, 0xdd, 0xc6, 0xb6, 0x3b, 0xf7, 0x0a, 0xb7, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x76, 0x02, 0x56, 0x02, 0x97, 0x0a, 0x36, 0x02, 0xf1, 0x11, 0x78, 0xa5, 0x9a, 0xde, 0x7a, 0xd6, 0xfd, 0xde, 0x3e, 0xcf, 0x9e, 0xa6, 0x37, 0x23, 0xb8, 0x0a, 0xf8, 0x0a, 0xd8, 0x0a, 0xd8, 0x02, 0xd8, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x02, 0x97, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0x95, 0x0a, 0x54, 0x0a, 0x92, 0x22, 0x1b, 0xb6, 0x7a, 0xd6, 0x99, 0xd6, 0x1d, 0xd7, 0x78, 0x54, 0x36, 0x1b, 0x98, 0x13, 0x17, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0x17, 0x0b, 0x38, 0x0b, 0x18, 0x03, 0xd7, 0x02, 0xd7, 0x0a, 0xf7, 0x0a, 0xf7, 0x0a, 0xf7, 0x02, 0xd7, 0x02, 0xf8, 0x0a, 0xb6, 0x0a, 0x94, 0x12, 0x74, 0x43, 0x7c, 0xc6, 0x9b, 0xde, 0x9a, 0xde, 0xdd, 0xd6, 0x3f, 0xcf, 0x13, 0x2b, 0xd5, 0x12, 0xf8, 0x0a, 0xd7, 0x0a, 0x19, 0x13, 0xf8, 0x0a, 0xf8, 0x0a, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x55, 0x0a, 0x54, 0x12, 0x11, 0x1a, 0xd4, 0x73, 0x3a, 0xce, 0x9b, 0xde, 0xfe, 0xde, 0xda, 0x7c, 0xd2, 0x09, 0xd4, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x74, 0x01, 0x94, 0x09, 0x94, 0x09, 0x92, 0x09, 0x10, 0x2a, 0x1b, 0xc6, 0x7a, 0xde, 0x9a, 0xe6, 0xfe, 0xde, 0xd6, 0x43, 0xb4, 0x0a, 0xb6, 0x0a, 0x96, 0x0a, 0x96, 0x02, 0x95, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x56, 0x02, 0xd8, 0x0a, 0x75, 0x02, 0x74, 0x12, 0x50, 0x22, 0x9a, 0xa5, 0x5b, 0xce, 0x9b, 0xce, 0xbe, 0xbe, 0xb4, 0x43, 0x72, 0x0a, 0x95, 0x0a, 0x75, 0x02, 0x55, 0x02, 0x95, 0x02, 0x94, 0x02, 0x74, 0x02, 0x74, 0x02, 0x95, 0x0a, 0x95, 0x0a, 0xb5, 0x02, 0xd5, 0x02, 0xb5, 0x02, 0xb5, 0x02, 0x94, 0x02, 0x94, 0x02, 0x95, 0x02, 0x95, 0x02, 0x94, 0x02, 0x74, 0x02, 0x53, 0x02, 0x93, 0x12, 0xb3, 0x53, 0x5d, 0xae, 0x74, 0x2b, 0xf3, 0x0a, 0x14, 0x03, 0x15, 0x03, 0xf5, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xf6, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xf5, 0x02, 0xf5, 0x02, + 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x0b, 0xd9, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x75, 0x13, 0x96, 0x6c, 0xbd, 0xd6, 0xfd, 0xe6, 0x3e, 0xd7, 0xb8, 0x54, 0x79, 0x34, 0x5a, 0x24, 0xd8, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x57, 0x0b, 0x56, 0x0b, 0x75, 0x2b, 0x7d, 0xbe, 0xfc, 0xe6, 0xfc, 0xe6, 0xfe, 0xc6, 0xb5, 0x2b, 0xf8, 0x13, 0x3a, 0x14, 0xd9, 0x03, 0xb8, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x0b, 0xb8, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x97, 0x13, 0x13, 0x1b, 0x39, 0x75, 0x9c, 0xc6, 0xdb, 0xde, 0xfb, 0xe6, 0xfd, 0xd6, 0xff, 0xbe, 0x13, 0x2b, 0x57, 0x13, 0x59, 0x03, 0x58, 0x03, 0x59, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x78, 0x03, 0xb9, 0x0b, 0x98, 0x0b, 0x78, 0x03, 0x78, 0x03, 0x99, 0x0b, 0x98, 0x0b, 0xb8, 0x13, 0xb9, 0x0b, 0x78, 0x03, 0x38, 0x03, 0x38, 0x03, 0x37, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x36, 0x13, 0x54, 0x2b, 0xfb, 0x9d, 0xbb, 0xce, 0xde, 0xce, 0x96, 0x3b, 0xd7, 0x12, 0xb7, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x57, 0x02, 0x77, 0x02, 0x36, 0x02, 0x12, 0x12, 0x99, 0xa5, 0x7a, 0xd6, 0x9b, 0xd6, 0xfe, 0xde, 0xbf, 0xd7, 0x5b, 0x75, 0x99, 0x2b, 0xf8, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0x96, 0x02, 0x75, 0x02, 0x54, 0x0a, 0x73, 0x22, 0x3c, 0xb6, 0x9b, 0xd6, 0xda, 0xde, 0xfd, 0xd6, 0x98, 0x5c, 0x15, 0x13, 0x98, 0x13, 0xf7, 0x02, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x0a, 0xf7, 0x0a, 0x17, 0x03, 0x38, 0x0b, 0x38, 0x0b, 0x38, 0x13, 0x38, 0x0b, 0x18, 0x0b, 0xd7, 0x02, 0xd7, 0x02, 0xd6, 0x02, 0xd6, 0x0a, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd6, 0x0a, 0x94, 0x12, 0x33, 0x3b, 0x5b, 0xbe, 0xbb, 0xde, 0xbb, 0xe6, 0xdd, 0xde, 0x3f, 0xcf, 0x53, 0x33, 0xd5, 0x12, 0xf7, 0x0a, 0xd7, 0x02, 0xf8, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd6, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x55, 0x0a, 0x54, 0x0a, 0x31, 0x1a, 0xd3, 0x6b, 0x3a, 0xc6, 0x7b, 0xd6, 0xde, 0xd6, 0x1b, 0x85, 0xd2, 0x09, 0xb4, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x75, 0x01, 0x74, 0x09, 0x53, 0x01, 0x92, 0x09, 0xcf, 0x21, 0x1b, 0xc6, 0x39, 0xd6, 0x7a, 0xde, 0xdd, 0xce, 0x17, 0x4c, 0xb5, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x0a, 0x55, 0x02, 0x76, 0x0a, 0x76, 0x02, 0xb7, 0x0a, 0x75, 0x02, 0x74, 0x12, 0x0f, 0x22, 0x59, 0x9d, 0x3a, 0xce, 0x7b, 0xce, 0xbe, 0xbe, 0xb5, 0x43, 0x73, 0x0a, 0x75, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x95, 0x02, 0x75, 0x02, 0x74, 0x02, 0x75, 0x02, 0x75, 0x02, 0x95, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb5, 0x02, 0x95, 0x02, 0x95, 0x02, 0x95, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x75, 0x02, 0x74, 0x02, 0x52, 0x0a, 0x52, 0x43, 0x7e, 0xae, 0xf7, 0x3b, 0x14, 0x13, 0xf4, 0x02, 0x15, 0x03, 0xf5, 0x02, 0xf6, 0x02, 0x16, 0x03, 0xf5, 0x02, 0xd5, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, + 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0x76, 0x13, 0x97, 0x64, 0xde, 0xce, 0xfd, 0xe6, 0x3f, 0xd7, 0x36, 0x3c, 0xf7, 0x1b, 0x9b, 0x2c, 0xf9, 0x13, 0xf9, 0x0b, 0xf9, 0x03, 0xb9, 0x03, 0x1b, 0x0c, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x77, 0x0b, 0x57, 0x0b, 0x75, 0x2b, 0x5c, 0xbe, 0xdb, 0xe6, 0xfb, 0xe6, 0xfe, 0xce, 0x16, 0x34, 0xf9, 0x1b, 0x3a, 0x14, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xf9, 0x13, 0xf9, 0x13, 0xd9, 0x0b, 0xb9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0x98, 0x03, 0x77, 0x13, 0xf3, 0x12, 0x3a, 0x7d, 0x9c, 0xc6, 0xbb, 0xde, 0xdb, 0xe6, 0xfd, 0xde, 0xff, 0xbe, 0x12, 0x2b, 0x76, 0x1b, 0x99, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x59, 0x0b, 0x78, 0x0b, 0x38, 0x03, 0x59, 0x03, 0x39, 0x03, 0x59, 0x0b, 0x79, 0x0b, 0x78, 0x0b, 0x58, 0x03, 0x18, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x0b, 0xf6, 0x12, 0xd2, 0x22, 0xdb, 0x9d, 0xbc, 0xce, 0xfe, 0xce, 0x76, 0x43, 0xd7, 0x12, 0x97, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x57, 0x02, 0x37, 0x02, 0x35, 0x02, 0x32, 0x12, 0x7a, 0x9d, 0x7b, 0xd6, 0xbc, 0xd6, 0xff, 0xd6, 0xb8, 0x6c, 0x93, 0x12, 0xf7, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x98, 0x0a, 0x97, 0x02, 0x97, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x75, 0x0a, 0x75, 0x0a, 0xb4, 0x2a, 0x3d, 0xbe, 0x9b, 0xde, 0xdb, 0xde, 0xfe, 0xd6, 0x78, 0x5c, 0xf5, 0x0a, 0x58, 0x13, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0xd6, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0x94, 0x12, 0x13, 0x3b, 0x3b, 0xbe, 0xbb, 0xe6, 0xbb, 0xe6, 0xdd, 0xde, 0x3f, 0xcf, 0x94, 0x43, 0xd5, 0x12, 0xd7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x76, 0x0a, 0x55, 0x02, 0x54, 0x0a, 0x32, 0x1a, 0xf4, 0x73, 0x5b, 0xce, 0x9b, 0xde, 0xde, 0xd6, 0x5d, 0x8d, 0xb2, 0x09, 0xb4, 0x09, 0x95, 0x01, 0xb5, 0x09, 0xb5, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x74, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x09, 0x95, 0x09, 0x95, 0x09, 0x75, 0x01, 0x94, 0x09, 0x53, 0x01, 0x92, 0x09, 0xf0, 0x21, 0xfb, 0xbd, 0x59, 0xd6, 0x7a, 0xde, 0xbd, 0xce, 0x58, 0x54, 0xd5, 0x0a, 0x96, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0x96, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x74, 0x12, 0x30, 0x2a, 0x59, 0xa5, 0x3a, 0xce, 0x9b, 0xce, 0xbe, 0xbe, 0xb5, 0x43, 0x93, 0x12, 0x75, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x95, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x55, 0x02, 0x75, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x32, 0x0a, 0x12, 0x43, 0x1e, 0xa6, 0xd7, 0x3b, 0x15, 0x13, 0x15, 0x0b, 0xf5, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf5, 0x02, 0xf5, 0x02, + 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x96, 0x13, 0x96, 0x64, 0xfe, 0xce, 0xfd, 0xe6, 0x3f, 0xd7, 0x77, 0x44, 0xb6, 0x13, 0xbc, 0x34, 0xb8, 0x13, 0x3a, 0x14, 0x1a, 0x0c, 0x99, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xba, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x78, 0x0b, 0x57, 0x0b, 0x75, 0x2b, 0x5c, 0xbe, 0x9a, 0xde, 0xfb, 0xe6, 0x3e, 0xd7, 0x58, 0x44, 0xd9, 0x13, 0xfa, 0x13, 0xb9, 0x03, 0xd9, 0x0b, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb8, 0x0b, 0x98, 0x03, 0x98, 0x03, 0xd9, 0x0b, 0xfa, 0x13, 0x1a, 0x14, 0xfa, 0x0b, 0xb9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x98, 0x03, 0x57, 0x0b, 0xf3, 0x1a, 0x5a, 0x85, 0x9c, 0xce, 0xbb, 0xde, 0xdb, 0xe6, 0xfd, 0xde, 0xde, 0xbe, 0xf2, 0x22, 0x76, 0x1b, 0xd9, 0x13, 0x58, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x58, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x58, 0x03, 0x59, 0x0b, 0x58, 0x0b, 0x58, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x0b, 0x38, 0x0b, 0xf7, 0x02, 0xd5, 0x0a, 0xd2, 0x22, 0xfc, 0xa5, 0xbc, 0xce, 0xde, 0xce, 0x76, 0x3b, 0xd7, 0x12, 0x97, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x98, 0x02, 0x77, 0x02, 0x78, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x57, 0x02, 0x58, 0x0a, 0x57, 0x0a, 0x55, 0x02, 0x32, 0x12, 0x18, 0x95, 0x7b, 0xce, 0xbd, 0xd6, 0xff, 0xd6, 0x54, 0x33, 0xb5, 0x0a, 0x38, 0x0b, 0xf7, 0x02, 0xf8, 0x02, 0x97, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x98, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x77, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0x96, 0x0a, 0x75, 0x0a, 0x94, 0x2a, 0x3d, 0xbe, 0xbc, 0xde, 0x9a, 0xde, 0x1e, 0xd7, 0x38, 0x54, 0xd5, 0x0a, 0x37, 0x0b, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0xd6, 0x0a, 0xf7, 0x02, 0xf7, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0x73, 0x0a, 0x33, 0x3b, 0x5b, 0xc6, 0x9a, 0xde, 0x9b, 0xe6, 0xdd, 0xde, 0x1f, 0xcf, 0xd5, 0x4b, 0xb4, 0x12, 0xd7, 0x0a, 0xb7, 0x0a, 0x96, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x96, 0x02, 0x97, 0x02, 0x76, 0x02, 0x55, 0x02, 0x54, 0x0a, 0x52, 0x22, 0x15, 0x74, 0x7c, 0xd6, 0xbc, 0xde, 0xde, 0xd6, 0x9d, 0x95, 0xb1, 0x09, 0x94, 0x09, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x09, 0x75, 0x09, 0x75, 0x01, 0x94, 0x09, 0x93, 0x09, 0x71, 0x01, 0x31, 0x2a, 0xb9, 0xb5, 0x7a, 0xde, 0x7a, 0xde, 0xbd, 0xce, 0x37, 0x4c, 0xd5, 0x0a, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x73, 0x12, 0xf2, 0x42, 0x9a, 0xad, 0x3a, 0xce, 0x9b, 0xd6, 0x9e, 0xb6, 0xb5, 0x43, 0x93, 0x12, 0x75, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, 0x55, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x53, 0x0a, 0x12, 0x43, 0x1d, 0xa6, 0xd6, 0x3b, 0x15, 0x0b, 0x15, 0x0b, 0xf5, 0x02, 0xf5, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf5, 0x02, 0xf5, 0x02, + 0xfa, 0x0b, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0x1a, 0x0c, 0xfa, 0x0b, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb8, 0x03, 0x95, 0x13, 0x76, 0x64, 0xfd, 0xce, 0xfc, 0xe6, 0x1e, 0xd7, 0x56, 0x44, 0x59, 0x24, 0x1f, 0x66, 0xf9, 0x1b, 0xf9, 0x0b, 0xd9, 0x03, 0xfa, 0x0b, 0xfa, 0x13, 0xba, 0x03, 0xba, 0x03, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x0b, 0x57, 0x03, 0x75, 0x23, 0x5c, 0xb6, 0xbb, 0xd6, 0xfc, 0xde, 0x1f, 0xcf, 0x58, 0x3c, 0xb9, 0x0b, 0xd9, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xf9, 0x13, 0x3a, 0x24, 0xf9, 0x1b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x99, 0x0b, 0x98, 0x03, 0x36, 0x0b, 0xf3, 0x1a, 0x7b, 0x85, 0x9c, 0xce, 0x9a, 0xde, 0xdb, 0xe6, 0xfc, 0xde, 0xbe, 0xb6, 0xf1, 0x22, 0x76, 0x13, 0xda, 0x13, 0x58, 0x03, 0x58, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x78, 0x03, 0x99, 0x0b, 0x57, 0x03, 0x57, 0x03, 0x37, 0x03, 0x99, 0x0b, 0x57, 0x03, 0x37, 0x03, 0x78, 0x03, 0x59, 0x03, 0x38, 0x03, 0x18, 0x03, 0x38, 0x03, 0x38, 0x03, 0x17, 0x03, 0xd5, 0x0a, 0xb2, 0x22, 0xfc, 0xa5, 0xbc, 0xce, 0xde, 0xce, 0x97, 0x3b, 0xd7, 0x12, 0xb7, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x0a, 0x78, 0x02, 0x78, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x77, 0x0a, 0x55, 0x02, 0x31, 0x12, 0xd7, 0x84, 0x9b, 0xce, 0xdc, 0xde, 0x1f, 0xcf, 0xf3, 0x22, 0x37, 0x13, 0x58, 0x0b, 0xd7, 0x02, 0xd7, 0x02, 0x96, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xb8, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x98, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x76, 0x02, 0x34, 0x02, 0x32, 0x1a, 0x3d, 0xbe, 0x9b, 0xde, 0x9a, 0xde, 0xfe, 0xd6, 0x79, 0x5c, 0xd5, 0x0a, 0x17, 0x0b, 0x18, 0x03, 0xf7, 0x02, 0xf8, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xd6, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0x96, 0x0a, 0x73, 0x0a, 0x33, 0x3b, 0x5b, 0xc6, 0x7a, 0xde, 0x7a, 0xde, 0xbc, 0xde, 0x1f, 0xc7, 0xf5, 0x4b, 0xb4, 0x12, 0xb7, 0x0a, 0xd7, 0x0a, 0x97, 0x02, 0xb8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x76, 0x02, 0x97, 0x02, 0x77, 0x02, 0x56, 0x02, 0x54, 0x0a, 0x52, 0x1a, 0xf4, 0x6b, 0x7c, 0xce, 0xbc, 0xde, 0xde, 0xd6, 0xbd, 0x95, 0x91, 0x09, 0x93, 0x09, 0x95, 0x09, 0x94, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x73, 0x09, 0x71, 0x01, 0x31, 0x2a, 0x99, 0xad, 0x5a, 0xd6, 0x5a, 0xd6, 0xbd, 0xce, 0x95, 0x33, 0x94, 0x02, 0x97, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x76, 0x02, 0x56, 0x02, 0x77, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x76, 0x02, 0x96, 0x0a, 0x74, 0x02, 0x52, 0x12, 0x94, 0x53, 0xba, 0xad, 0x3a, 0xce, 0x9b, 0xce, 0x5d, 0xae, 0x74, 0x3b, 0x94, 0x12, 0x95, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x0a, 0x55, 0x02, 0x56, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xb6, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x75, 0x02, 0x95, 0x02, 0x95, 0x02, 0x32, 0x0a, 0xf1, 0x3a, 0x7e, 0xae, 0x58, 0x4c, 0xf4, 0x0a, 0xf4, 0x02, 0x15, 0x0b, 0xf5, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0x75, 0x13, 0x55, 0x64, 0xfd, 0xd6, 0xfc, 0xe6, 0x3e, 0xd7, 0x56, 0x44, 0xd6, 0x1b, 0x3d, 0x45, 0x97, 0x0b, 0xf9, 0x13, 0xf9, 0x0b, 0xfa, 0x13, 0xb9, 0x0b, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x77, 0x03, 0x55, 0x1b, 0x3c, 0xae, 0xfc, 0xde, 0x1c, 0xdf, 0xfe, 0xc6, 0xf7, 0x33, 0xd9, 0x0b, 0xfa, 0x0b, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x03, 0xd9, 0x0b, 0x3a, 0x24, 0x7a, 0x2c, 0x3a, 0x24, 0x99, 0x0b, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x0b, 0x36, 0x0b, 0xf3, 0x1a, 0x7b, 0x85, 0x7b, 0xc6, 0x79, 0xd6, 0xba, 0xe6, 0xdc, 0xde, 0xde, 0xbe, 0x12, 0x23, 0x76, 0x13, 0xda, 0x13, 0x59, 0x03, 0x79, 0x03, 0x58, 0x03, 0x78, 0x03, 0x98, 0x0b, 0xd9, 0x13, 0x78, 0x03, 0x78, 0x03, 0x37, 0x03, 0x98, 0x0b, 0x57, 0x03, 0x57, 0x0b, 0x99, 0x0b, 0x79, 0x03, 0x38, 0x03, 0x18, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf6, 0x0a, 0xb2, 0x1a, 0xfc, 0x9d, 0xbc, 0xce, 0xde, 0xce, 0xd8, 0x43, 0xd7, 0x12, 0xd7, 0x02, 0x97, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x0a, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x97, 0x0a, 0x55, 0x02, 0x32, 0x0a, 0xd7, 0x84, 0x9b, 0xce, 0xdc, 0xe6, 0x1f, 0xd7, 0xb6, 0x3b, 0x57, 0x0b, 0x9a, 0x13, 0x39, 0x0b, 0xd7, 0x02, 0xd7, 0x0a, 0xd8, 0x0a, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x78, 0x0a, 0x77, 0x0a, 0x98, 0x0a, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x76, 0x02, 0x14, 0x02, 0x32, 0x1a, 0x1c, 0xbe, 0x5a, 0xd6, 0xbb, 0xe6, 0xfd, 0xd6, 0xfb, 0x6c, 0xb4, 0x0a, 0x17, 0x0b, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0x73, 0x0a, 0x12, 0x3b, 0x3a, 0xbe, 0x9a, 0xde, 0x9a, 0xde, 0xbc, 0xd6, 0xff, 0xc6, 0xd5, 0x4b, 0xb5, 0x12, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x55, 0x0a, 0x32, 0x1a, 0x93, 0x5b, 0x5b, 0xce, 0xbc, 0xde, 0xde, 0xd6, 0xbd, 0x95, 0x91, 0x01, 0xb3, 0x09, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x53, 0x01, 0x92, 0x09, 0xd0, 0x21, 0xba, 0xb5, 0x19, 0xce, 0x7a, 0xde, 0xbd, 0xce, 0x54, 0x33, 0x94, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x56, 0x0a, 0x56, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x02, 0xd7, 0x0a, 0x75, 0x02, 0x72, 0x12, 0xb5, 0x53, 0x9a, 0xad, 0x3a, 0xce, 0x7b, 0xce, 0x1c, 0xa6, 0x33, 0x33, 0x93, 0x12, 0x95, 0x0a, 0x96, 0x0a, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x95, 0x0a, 0x95, 0x02, 0x52, 0x0a, 0xd1, 0x3a, 0x3d, 0xa6, 0x58, 0x4c, 0x14, 0x13, 0x15, 0x0b, 0x15, 0x03, 0xf5, 0x02, 0xd5, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0xfa, 0x0b, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0x1a, 0x0c, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0x75, 0x13, 0x35, 0x64, 0xfe, 0xd6, 0x1d, 0xdf, 0x3f, 0xcf, 0x77, 0x44, 0xd7, 0x13, 0x9b, 0x2c, 0xf9, 0x13, 0xfa, 0x0b, 0xb9, 0x03, 0xd9, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xba, 0x03, 0xda, 0x0b, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x77, 0x03, 0x55, 0x1b, 0x1c, 0xae, 0xfc, 0xe6, 0xfc, 0xde, 0xfe, 0xc6, 0xf7, 0x33, 0xf9, 0x13, 0xfa, 0x0b, 0xd9, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0xd9, 0x13, 0xf9, 0x1b, 0xd9, 0x13, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x0b, 0x36, 0x0b, 0x13, 0x1b, 0x7b, 0x85, 0x7b, 0xc6, 0x59, 0xd6, 0xb9, 0xe6, 0xdb, 0xde, 0xff, 0xbe, 0x53, 0x2b, 0x76, 0x13, 0xb9, 0x13, 0x58, 0x03, 0x79, 0x03, 0x38, 0x03, 0x58, 0x0b, 0x58, 0x03, 0x99, 0x0b, 0x58, 0x03, 0x57, 0x03, 0x17, 0x03, 0x58, 0x03, 0x37, 0x03, 0x37, 0x0b, 0x78, 0x0b, 0x58, 0x0b, 0x18, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd5, 0x0a, 0xb2, 0x22, 0xdc, 0x9d, 0xbc, 0xce, 0xbe, 0xce, 0x18, 0x4c, 0xd7, 0x12, 0xd7, 0x0a, 0x98, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x77, 0x0a, 0x77, 0x02, 0x33, 0x0a, 0x39, 0x95, 0x7b, 0xd6, 0xbb, 0xe6, 0xfe, 0xde, 0x16, 0x44, 0xf5, 0x02, 0x19, 0x0b, 0xb9, 0x02, 0xb7, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xb8, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x98, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0x96, 0x0a, 0x55, 0x0a, 0x73, 0x22, 0x3c, 0xbe, 0x39, 0xce, 0xdb, 0xe6, 0xdd, 0xd6, 0x5c, 0x7d, 0xb4, 0x0a, 0x37, 0x0b, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x0a, 0xd8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0xf8, 0x02, 0xd8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xf7, 0x02, 0xf7, 0x02, 0xb7, 0x02, 0xb6, 0x0a, 0x93, 0x0a, 0x33, 0x3b, 0x5b, 0xc6, 0x9a, 0xde, 0xba, 0xde, 0xdc, 0xd6, 0xff, 0xc6, 0xb5, 0x4b, 0xb5, 0x12, 0xb7, 0x0a, 0xb7, 0x0a, 0xb8, 0x0a, 0xb8, 0x02, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x55, 0x0a, 0x12, 0x12, 0x73, 0x5b, 0x5b, 0xc6, 0xbc, 0xd6, 0xde, 0xd6, 0x9d, 0x8d, 0x91, 0x01, 0xd4, 0x09, 0x95, 0x09, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x09, 0x53, 0x09, 0x92, 0x09, 0xaf, 0x21, 0xda, 0xbd, 0x19, 0xd6, 0x7a, 0xd6, 0x9d, 0xc6, 0xb5, 0x3b, 0xb5, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x56, 0x02, 0x56, 0x0a, 0x56, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x97, 0x02, 0xb7, 0x0a, 0x75, 0x02, 0x94, 0x12, 0x33, 0x4b, 0x9a, 0xad, 0x3a, 0xc6, 0x7b, 0xce, 0xfb, 0x9d, 0x33, 0x33, 0x93, 0x0a, 0x95, 0x02, 0x96, 0x0a, 0x96, 0x02, 0x95, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x0a, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x75, 0x02, 0x75, 0x02, 0x73, 0x12, 0xd1, 0x3a, 0xdc, 0x9d, 0x18, 0x44, 0x15, 0x13, 0x36, 0x0b, 0xf5, 0x02, 0xf5, 0x02, 0xd5, 0x02, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xba, 0x0b, 0xda, 0x0b, 0xb8, 0x03, 0x76, 0x0b, 0x36, 0x64, 0xde, 0xd6, 0x1d, 0xdf, 0x5f, 0xcf, 0x57, 0x44, 0xd7, 0x1b, 0x39, 0x14, 0x19, 0x0c, 0xb9, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xda, 0x0b, 0xba, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xb8, 0x0b, 0x77, 0x03, 0x54, 0x1b, 0x1b, 0xae, 0xbb, 0xde, 0xbb, 0xde, 0x1e, 0xcf, 0x17, 0x3c, 0x19, 0x14, 0xd8, 0x0b, 0xd9, 0x03, 0xd8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x9a, 0x0b, 0xba, 0x0b, 0xb9, 0x0b, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x0b, 0x36, 0x0b, 0x13, 0x1b, 0x7a, 0x85, 0x7b, 0xc6, 0x79, 0xd6, 0xda, 0xe6, 0xfb, 0xde, 0x1f, 0xc7, 0x73, 0x33, 0x56, 0x13, 0x99, 0x0b, 0x38, 0x03, 0x59, 0x0b, 0x18, 0x03, 0x38, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x39, 0x03, 0x19, 0x03, 0x18, 0x03, 0x18, 0x0b, 0x37, 0x03, 0x38, 0x03, 0x18, 0x0b, 0xf7, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb5, 0x0a, 0x91, 0x22, 0xdb, 0xa5, 0x9b, 0xce, 0x9d, 0xc6, 0xf8, 0x53, 0x96, 0x0a, 0xb7, 0x0a, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x0a, 0x78, 0x0a, 0x78, 0x0a, 0x77, 0x02, 0xb7, 0x0a, 0x76, 0x02, 0x77, 0x02, 0x34, 0x0a, 0x9b, 0x9d, 0x5b, 0xd6, 0x9b, 0xe6, 0xdd, 0xd6, 0xf6, 0x43, 0x37, 0x0b, 0xf9, 0x02, 0x99, 0x02, 0xd9, 0x0a, 0x77, 0x02, 0x97, 0x0a, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x0a, 0x75, 0x0a, 0x93, 0x2a, 0x5c, 0xbe, 0x5a, 0xd6, 0xba, 0xde, 0xfd, 0xd6, 0x5b, 0x7d, 0xd4, 0x12, 0x17, 0x0b, 0xf7, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xb7, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd7, 0x0a, 0x18, 0x0b, 0xf8, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xf7, 0x02, 0xf7, 0x02, 0xf7, 0x0a, 0xb6, 0x02, 0x93, 0x0a, 0x94, 0x43, 0xbc, 0xce, 0x9a, 0xde, 0x9a, 0xde, 0xdc, 0xde, 0xff, 0xc6, 0x95, 0x43, 0xb5, 0x12, 0x97, 0x0a, 0x97, 0x02, 0xb8, 0x0a, 0x98, 0x02, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x98, 0x02, 0x98, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x55, 0x0a, 0x32, 0x12, 0xb4, 0x5b, 0x7c, 0xce, 0xbc, 0xd6, 0xfe, 0xd6, 0x7c, 0x8d, 0x90, 0x01, 0xd4, 0x09, 0x95, 0x01, 0x95, 0x01, 0x76, 0x01, 0x76, 0x01, 0x76, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x54, 0x09, 0x73, 0x09, 0x51, 0x09, 0xaf, 0x21, 0xda, 0xbd, 0x59, 0xd6, 0x39, 0xd6, 0x7c, 0xc6, 0xd6, 0x43, 0x94, 0x02, 0x76, 0x02, 0x77, 0x02, 0x96, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x56, 0x0a, 0x56, 0x0a, 0x57, 0x0a, 0x57, 0x02, 0x77, 0x02, 0x77, 0x02, 0x57, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x97, 0x02, 0x77, 0x02, 0x96, 0x02, 0xd5, 0x1a, 0xd2, 0x3a, 0xbb, 0xad, 0x5a, 0xc6, 0x9c, 0xce, 0xfc, 0x9d, 0x33, 0x2b, 0x94, 0x12, 0x95, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x95, 0x02, 0x75, 0x02, 0x96, 0x0a, 0x96, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0xb6, 0x02, 0x96, 0x0a, 0x96, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, 0x53, 0x0a, 0xf2, 0x3a, 0x1e, 0xa6, 0x59, 0x4c, 0xf5, 0x0a, 0xf6, 0x0a, 0xf6, 0x02, 0xf6, 0x02, 0xd5, 0x02, 0xf6, 0x02, 0x16, 0x0b, 0x37, 0x03, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0xf9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x0b, 0xda, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0x99, 0x0b, 0x36, 0x13, 0x76, 0x64, 0xdd, 0xce, 0xfd, 0xe6, 0x1e, 0xcf, 0x78, 0x3c, 0xf8, 0x0b, 0x3a, 0x14, 0xf9, 0x0b, 0xf9, 0x03, 0xf9, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xb9, 0x03, 0xda, 0x03, 0xda, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x95, 0x23, 0x5c, 0xb6, 0xdc, 0xde, 0x1c, 0xe7, 0x1f, 0xcf, 0xf7, 0x33, 0xb8, 0x0b, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xba, 0x03, 0xba, 0x03, 0x9a, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x77, 0x13, 0xf3, 0x1a, 0x9b, 0x8d, 0x9c, 0xce, 0xdb, 0xe6, 0xdb, 0xe6, 0x1d, 0xdf, 0x1f, 0xc7, 0x33, 0x2b, 0xf5, 0x12, 0x9a, 0x1b, 0x19, 0x0b, 0x39, 0x0b, 0x39, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x0b, 0xf8, 0x02, 0x18, 0x03, 0x18, 0x03, 0x37, 0x03, 0x17, 0x03, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf7, 0x02, 0xb5, 0x12, 0x72, 0x22, 0xbc, 0xa5, 0xbd, 0xd6, 0xfe, 0xce, 0x76, 0x33, 0xb6, 0x0a, 0xd8, 0x0a, 0x77, 0x02, 0x78, 0x0a, 0x78, 0x0a, 0x98, 0x0a, 0x78, 0x02, 0x57, 0x02, 0x57, 0x02, 0x57, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x02, 0x98, 0x02, 0x78, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x57, 0x02, 0x76, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x13, 0x12, 0x5a, 0xa5, 0x19, 0xce, 0xdc, 0xde, 0xfe, 0xce, 0x14, 0x2b, 0xd6, 0x12, 0xd7, 0x0a, 0x97, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x0a, 0x97, 0x02, 0x98, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x76, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x76, 0x0a, 0x54, 0x0a, 0xf3, 0x2a, 0x5c, 0xbe, 0x7a, 0xd6, 0xda, 0xde, 0xfd, 0xce, 0x98, 0x54, 0xf5, 0x0a, 0x58, 0x13, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0x95, 0x0a, 0x51, 0x1a, 0xf9, 0x84, 0xf9, 0xb5, 0x9a, 0xd6, 0xba, 0xde, 0xbb, 0xd6, 0xfe, 0xc6, 0xf2, 0x2a, 0xd6, 0x12, 0x97, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x0a, 0x77, 0x0a, 0x96, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0x13, 0x12, 0x53, 0x53, 0x7d, 0xce, 0x9c, 0xde, 0xbe, 0xd6, 0xda, 0x84, 0x90, 0x09, 0xb4, 0x09, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x74, 0x09, 0x53, 0x09, 0x72, 0x09, 0x93, 0x3a, 0xfb, 0xbd, 0x5a, 0xd6, 0x3a, 0xd6, 0x5c, 0xbe, 0x54, 0x33, 0xb5, 0x02, 0xb6, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x56, 0x02, 0x56, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x56, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x0a, 0x75, 0x02, 0x32, 0x0a, 0xd2, 0x32, 0x59, 0x9d, 0x39, 0xc6, 0x7a, 0xc6, 0xfc, 0x95, 0xf3, 0x22, 0xb4, 0x0a, 0xb6, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x75, 0x0a, 0x74, 0x02, 0x52, 0x12, 0x71, 0x32, 0x3f, 0xae, 0x79, 0x54, 0x14, 0x13, 0xf5, 0x0a, 0x16, 0x0b, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0x1a, 0x0c, 0x1a, 0x04, 0xfa, 0x0b, 0xfa, 0x03, 0xfa, 0x03, 0xda, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0xb9, 0x0b, 0xb9, 0x0b, 0x56, 0x1b, 0x97, 0x64, 0xfe, 0xce, 0x1d, 0xe7, 0x1e, 0xcf, 0x37, 0x34, 0xf8, 0x0b, 0x1a, 0x0c, 0xfa, 0x0b, 0xf9, 0x03, 0xf9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xd9, 0x0b, 0x98, 0x0b, 0x98, 0x0b, 0x75, 0x23, 0x3c, 0xb6, 0x9b, 0xd6, 0xfc, 0xde, 0x1e, 0xcf, 0x17, 0x34, 0xd8, 0x0b, 0xd9, 0x0b, 0xd9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x0b, 0x77, 0x13, 0xf3, 0x1a, 0x9b, 0x85, 0x7c, 0xc6, 0xbb, 0xde, 0xdb, 0xe6, 0xfc, 0xde, 0xff, 0xbe, 0x73, 0x33, 0x56, 0x1b, 0x18, 0x0b, 0x18, 0x03, 0x18, 0x03, 0xf7, 0x02, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0x18, 0x03, 0x38, 0x03, 0x38, 0x03, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, 0x18, 0x03, 0xf7, 0x02, 0xb5, 0x12, 0x71, 0x22, 0xbb, 0xa5, 0x7b, 0xce, 0xde, 0xce, 0x18, 0x4c, 0xb6, 0x0a, 0x96, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x98, 0x0a, 0x78, 0x0a, 0x77, 0x02, 0x57, 0x02, 0x57, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x78, 0x02, 0x98, 0x02, 0x78, 0x0a, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x76, 0x02, 0x77, 0x02, 0x77, 0x02, 0x33, 0x12, 0x7a, 0xa5, 0x19, 0xce, 0xdb, 0xde, 0x1e, 0xd7, 0x75, 0x3b, 0xd6, 0x12, 0xb7, 0x0a, 0xb7, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb8, 0x0a, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x96, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x76, 0x0a, 0x54, 0x0a, 0xd3, 0x32, 0x3c, 0xbe, 0x9b, 0xde, 0xba, 0xd6, 0xfd, 0xce, 0x98, 0x5c, 0xd4, 0x0a, 0xf7, 0x0a, 0xf7, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0x94, 0x0a, 0x52, 0x1a, 0x5b, 0x95, 0x3a, 0xbe, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xd6, 0xfe, 0xc6, 0x33, 0x3b, 0xd5, 0x12, 0x97, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x0a, 0x77, 0x0a, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x56, 0x02, 0x35, 0x02, 0x12, 0x0a, 0x53, 0x4b, 0x5c, 0xc6, 0x9c, 0xde, 0x9d, 0xd6, 0x5c, 0x95, 0x70, 0x09, 0xb4, 0x09, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x74, 0x01, 0x74, 0x09, 0x53, 0x09, 0x51, 0x09, 0x52, 0x32, 0xba, 0xb5, 0x3a, 0xd6, 0x5b, 0xd6, 0x9d, 0xc6, 0xf2, 0x22, 0x94, 0x02, 0xf7, 0x0a, 0x97, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x56, 0x0a, 0x77, 0x02, 0x97, 0x02, 0xb7, 0x0a, 0x76, 0x02, 0x97, 0x0a, 0xb7, 0x12, 0x55, 0x02, 0x53, 0x12, 0x74, 0x4b, 0x9a, 0xa5, 0x39, 0xc6, 0x7a, 0xc6, 0xfc, 0x95, 0xf3, 0x22, 0xb4, 0x0a, 0x96, 0x02, 0x95, 0x02, 0x96, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x74, 0x02, 0x32, 0x0a, 0x91, 0x32, 0x3f, 0xae, 0xba, 0x5c, 0x14, 0x13, 0xf5, 0x0a, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0x1a, 0x0c, 0xfa, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0x56, 0x13, 0x96, 0x64, 0xfd, 0xce, 0xfd, 0xde, 0x1e, 0xcf, 0x16, 0x2c, 0x19, 0x0c, 0xf9, 0x0b, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x0b, 0xda, 0x03, 0xda, 0x03, 0xba, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0x98, 0x0b, 0x77, 0x03, 0x75, 0x23, 0x3c, 0xae, 0x7a, 0xd6, 0xbb, 0xde, 0xfe, 0xc6, 0xf7, 0x33, 0xd8, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x98, 0x13, 0xf3, 0x1a, 0x7b, 0x85, 0x5b, 0xc6, 0xbb, 0xde, 0xdb, 0xe6, 0xfc, 0xde, 0x3f, 0xcf, 0x52, 0x33, 0x19, 0x34, 0x5c, 0x2c, 0x58, 0x0b, 0x59, 0x0b, 0x58, 0x0b, 0x17, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0x18, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xb5, 0x12, 0x71, 0x1a, 0xbb, 0xa5, 0x9c, 0xce, 0xff, 0xd6, 0xb6, 0x3b, 0xb6, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x0a, 0x98, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x02, 0x57, 0x02, 0x57, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x0a, 0x98, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x76, 0x02, 0x56, 0x02, 0x54, 0x1a, 0x7a, 0xad, 0x19, 0xce, 0xbb, 0xde, 0x1e, 0xd7, 0x96, 0x3b, 0xb5, 0x0a, 0x96, 0x02, 0x97, 0x02, 0xd8, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb8, 0x0a, 0xb7, 0x02, 0xb8, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x56, 0x0a, 0x54, 0x0a, 0x14, 0x33, 0x5d, 0xbe, 0x9b, 0xde, 0x9a, 0xde, 0xfd, 0xce, 0x1a, 0x6d, 0xd4, 0x0a, 0xf6, 0x02, 0x18, 0x0b, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xd8, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xd7, 0x0a, 0xb8, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd6, 0x0a, 0x74, 0x0a, 0x31, 0x12, 0xbc, 0x9d, 0x1a, 0xbe, 0x59, 0xd6, 0xbb, 0xe6, 0xdc, 0xde, 0xff, 0xce, 0x94, 0x4b, 0x95, 0x12, 0x97, 0x0a, 0x97, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x78, 0x0a, 0x77, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0xb8, 0x02, 0x98, 0x02, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x35, 0x02, 0x12, 0x0a, 0x12, 0x4b, 0x5c, 0xc6, 0x9c, 0xd6, 0x9d, 0xd6, 0xbe, 0x9d, 0x70, 0x01, 0xb4, 0x09, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x55, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x09, 0x73, 0x09, 0x71, 0x09, 0x52, 0x2a, 0xdb, 0xb5, 0x7a, 0xd6, 0x9b, 0xde, 0x9d, 0xc6, 0xd6, 0x3b, 0xd5, 0x0a, 0xd7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0x76, 0x02, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x56, 0x02, 0x57, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x57, 0x0a, 0x77, 0x02, 0x97, 0x02, 0x96, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x97, 0x0a, 0x96, 0x0a, 0x53, 0x12, 0xf2, 0x3a, 0x79, 0x9d, 0x3a, 0xc6, 0x7b, 0xc6, 0x1d, 0x9e, 0xf4, 0x22, 0xb5, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x0a, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x0a, 0x54, 0x02, 0x12, 0x0a, 0x91, 0x32, 0x3f, 0xae, 0xfb, 0x5c, 0x14, 0x0b, 0x15, 0x0b, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0x1a, 0x04, 0xfa, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x0b, 0xd9, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xf9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0x55, 0x13, 0x96, 0x64, 0xfd, 0xce, 0xfc, 0xde, 0xfe, 0xc6, 0x16, 0x2c, 0x3a, 0x14, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xda, 0x0b, 0xda, 0x0b, 0xba, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x98, 0x0b, 0x95, 0x23, 0x1b, 0xae, 0x5a, 0xd6, 0x9b, 0xd6, 0xde, 0xc6, 0xf6, 0x2b, 0xb8, 0x0b, 0xd8, 0x03, 0xb9, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x77, 0x13, 0x14, 0x1b, 0x5a, 0x7d, 0x7c, 0xc6, 0x9b, 0xde, 0xfb, 0xe6, 0xfc, 0xde, 0x5f, 0xcf, 0x32, 0x2b, 0x76, 0x1b, 0xde, 0x3c, 0xf7, 0x02, 0x38, 0x0b, 0x17, 0x03, 0x59, 0x0b, 0x38, 0x03, 0x18, 0x03, 0x17, 0x03, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xb5, 0x0a, 0x71, 0x1a, 0xbb, 0x9d, 0xfd, 0xd6, 0x3f, 0xd7, 0xd7, 0x43, 0xb6, 0x0a, 0xd7, 0x0a, 0x77, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x78, 0x02, 0x57, 0x02, 0x57, 0x02, 0x37, 0x02, 0x37, 0x02, 0x57, 0x0a, 0x57, 0x0a, 0x78, 0x02, 0x78, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x56, 0x02, 0x33, 0x1a, 0x7a, 0xad, 0x19, 0xce, 0x9a, 0xde, 0xfe, 0xce, 0xb6, 0x43, 0xb5, 0x0a, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x97, 0x02, 0x76, 0x02, 0x96, 0x02, 0x97, 0x02, 0x77, 0x0a, 0x56, 0x02, 0x56, 0x0a, 0x74, 0x0a, 0x35, 0x3b, 0x5c, 0xc6, 0x7a, 0xde, 0xba, 0xde, 0xfd, 0xd6, 0x5c, 0x75, 0xf5, 0x12, 0x37, 0x0b, 0xf7, 0x02, 0xd7, 0x02, 0xd8, 0x0a, 0xd8, 0x0a, 0xd8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x0a, 0xb8, 0x0a, 0xd8, 0x0a, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xd6, 0x0a, 0x94, 0x0a, 0x10, 0x12, 0xfd, 0xad, 0x1a, 0xc6, 0x59, 0xd6, 0x9a, 0xde, 0xbb, 0xde, 0xff, 0xce, 0xd5, 0x53, 0x94, 0x12, 0x97, 0x0a, 0x96, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x78, 0x0a, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x35, 0x02, 0x12, 0x0a, 0xf2, 0x42, 0x7d, 0xce, 0x5b, 0xd6, 0xbd, 0xd6, 0x9d, 0x9d, 0x70, 0x01, 0x94, 0x09, 0x95, 0x09, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x55, 0x01, 0x55, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x74, 0x01, 0x54, 0x01, 0x73, 0x09, 0x72, 0x09, 0x31, 0x2a, 0xdb, 0xbd, 0x7b, 0xd6, 0x9b, 0xde, 0x9d, 0xc6, 0x78, 0x54, 0x16, 0x0b, 0xb6, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x96, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x56, 0x02, 0x57, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x77, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0xb7, 0x0a, 0x97, 0x0a, 0x76, 0x0a, 0x96, 0x0a, 0x53, 0x12, 0xb1, 0x32, 0x7a, 0x9d, 0x3a, 0xc6, 0x7b, 0xc6, 0x3e, 0x9e, 0x14, 0x23, 0xb5, 0x0a, 0x96, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x76, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x96, 0x02, 0x76, 0x0a, 0x76, 0x0a, 0x76, 0x0a, 0x74, 0x02, 0x12, 0x0a, 0x91, 0x32, 0x3f, 0xae, 0xfb, 0x5c, 0x14, 0x0b, 0x16, 0x0b, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0x1a, 0x04, 0x1a, 0x0c, 0x1a, 0x0c, 0xfa, 0x03, 0xfa, 0x03, 0xfa, 0x0b, 0xfa, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xfa, 0x0b, 0xfa, 0x0b, 0xf9, 0x0b, 0xf9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xd9, 0x0b, 0x76, 0x13, 0x96, 0x64, 0xfd, 0xc6, 0xfc, 0xde, 0x1e, 0xcf, 0x37, 0x34, 0x5a, 0x14, 0xf9, 0x0b, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0x9a, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xda, 0x0b, 0xfa, 0x0b, 0xb9, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x98, 0x03, 0x78, 0x03, 0x98, 0x0b, 0x96, 0x2b, 0x1b, 0xae, 0x5a, 0xce, 0x9a, 0xd6, 0xbd, 0xbe, 0xd6, 0x2b, 0xd8, 0x0b, 0xf9, 0x0b, 0xf9, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x57, 0x0b, 0x14, 0x1b, 0x19, 0x75, 0x7c, 0xc6, 0x7a, 0xd6, 0xfb, 0xee, 0xfc, 0xde, 0x3f, 0xcf, 0x31, 0x2b, 0x55, 0x1b, 0xbf, 0x5d, 0x38, 0x0b, 0x79, 0x13, 0x99, 0x0b, 0x38, 0x03, 0x38, 0x03, 0x38, 0x03, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xb5, 0x0a, 0x92, 0x22, 0x9b, 0x9d, 0xdd, 0xd6, 0xfe, 0xce, 0xfb, 0x6c, 0xb6, 0x0a, 0x96, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x77, 0x02, 0x57, 0x02, 0x37, 0x02, 0x37, 0x02, 0x57, 0x0a, 0x57, 0x0a, 0x57, 0x02, 0x78, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x0a, 0x56, 0x02, 0x13, 0x12, 0x7a, 0xad, 0x19, 0xd6, 0xba, 0xde, 0xfd, 0xce, 0xf7, 0x4b, 0xd5, 0x12, 0xf7, 0x0a, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0x97, 0x02, 0x97, 0x02, 0x75, 0x02, 0xb6, 0x0a, 0x97, 0x02, 0x77, 0x02, 0x56, 0x02, 0x76, 0x0a, 0x74, 0x0a, 0xf4, 0x32, 0x1c, 0xbe, 0x5a, 0xd6, 0xbb, 0xde, 0x1e, 0xd7, 0xfa, 0x64, 0xf5, 0x12, 0x38, 0x13, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0x95, 0x12, 0x11, 0x1a, 0x3e, 0xb6, 0x5b, 0xce, 0x7a, 0xde, 0x79, 0xde, 0x7a, 0xd6, 0xff, 0xce, 0xd5, 0x53, 0x74, 0x12, 0xb7, 0x0a, 0x96, 0x02, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x55, 0x02, 0x12, 0x0a, 0x12, 0x43, 0x5c, 0xc6, 0x5a, 0xce, 0x9d, 0xd6, 0x7d, 0x95, 0x90, 0x09, 0x93, 0x09, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x55, 0x01, 0x55, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x74, 0x09, 0x51, 0x01, 0xd0, 0x21, 0x9a, 0xad, 0x3a, 0xd6, 0x9b, 0xde, 0xbd, 0xce, 0xd6, 0x43, 0xd5, 0x0a, 0xd7, 0x0a, 0xb7, 0x02, 0x96, 0x02, 0x96, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x76, 0x0a, 0x77, 0x02, 0x96, 0x02, 0xb7, 0x0a, 0x76, 0x02, 0x97, 0x0a, 0x97, 0x0a, 0x55, 0x02, 0x74, 0x12, 0x34, 0x43, 0xdb, 0xa5, 0x3a, 0xc6, 0x7b, 0xc6, 0x1d, 0x9e, 0x14, 0x23, 0xb5, 0x0a, 0x96, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x75, 0x02, 0x32, 0x0a, 0x50, 0x2a, 0x3f, 0xae, 0x99, 0x54, 0x14, 0x0b, 0xf5, 0x02, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0x1a, 0x0c, 0x3a, 0x0c, 0x1a, 0x0c, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xf9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0x56, 0x13, 0x96, 0x5c, 0xfd, 0xc6, 0xfc, 0xde, 0xfe, 0xce, 0x16, 0x2c, 0x3a, 0x14, 0x3a, 0x14, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x03, 0xda, 0x0b, 0xba, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0xda, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0x98, 0x03, 0x78, 0x03, 0x78, 0x0b, 0x96, 0x2b, 0x1b, 0xae, 0x7a, 0xd6, 0xbb, 0xd6, 0xbd, 0xbe, 0xd6, 0x2b, 0xd8, 0x0b, 0xf9, 0x0b, 0xf9, 0x0b, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x57, 0x0b, 0x14, 0x1b, 0x19, 0x75, 0x9c, 0xc6, 0x5a, 0xd6, 0xfb, 0xee, 0x1c, 0xdf, 0x1f, 0xc7, 0x15, 0x4c, 0xf4, 0x12, 0x1b, 0x2c, 0x58, 0x0b, 0x38, 0x0b, 0x37, 0x03, 0x79, 0x0b, 0x58, 0x03, 0x38, 0x03, 0x17, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x17, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf8, 0x02, 0x18, 0x03, 0xf8, 0x02, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xb5, 0x0a, 0x92, 0x22, 0x9b, 0x9d, 0xbc, 0xce, 0xfe, 0xce, 0x7a, 0x5c, 0xb6, 0x0a, 0x96, 0x02, 0x97, 0x0a, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x78, 0x02, 0x77, 0x02, 0x58, 0x02, 0x58, 0x02, 0x57, 0x02, 0x57, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x56, 0x02, 0x77, 0x0a, 0x56, 0x02, 0xf2, 0x11, 0x9a, 0xad, 0x39, 0xd6, 0xda, 0xde, 0xfd, 0xce, 0x17, 0x4c, 0xb5, 0x12, 0xd7, 0x12, 0xb7, 0x0a, 0x97, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0xb6, 0x0a, 0x76, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x97, 0x12, 0x53, 0x0a, 0x71, 0x22, 0xdb, 0xb5, 0x7b, 0xde, 0xba, 0xde, 0x3f, 0xdf, 0x58, 0x54, 0xd5, 0x0a, 0x17, 0x0b, 0xf7, 0x02, 0xd7, 0x02, 0xf7, 0x02, 0xf8, 0x0a, 0xf8, 0x02, 0xf7, 0x02, 0xf7, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd8, 0x0a, 0xd7, 0x02, 0xd7, 0x02, 0xb6, 0x02, 0xb5, 0x12, 0x31, 0x12, 0x9c, 0x9d, 0x7c, 0xce, 0x9a, 0xde, 0x7a, 0xde, 0x7b, 0xd6, 0xff, 0xce, 0xb5, 0x4b, 0x74, 0x12, 0xb7, 0x0a, 0x97, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x02, 0xb8, 0x0a, 0xb8, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x76, 0x02, 0x96, 0x02, 0x97, 0x02, 0x75, 0x02, 0x12, 0x0a, 0x53, 0x4b, 0x5c, 0xc6, 0x7b, 0xce, 0x9d, 0xce, 0x5c, 0x8d, 0xd2, 0x11, 0xd4, 0x09, 0x74, 0x01, 0x95, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x55, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x95, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x73, 0x09, 0x51, 0x01, 0xaf, 0x19, 0x9a, 0xb5, 0x19, 0xce, 0x7b, 0xde, 0xbd, 0xce, 0xf6, 0x43, 0xb4, 0x02, 0xb6, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x0a, 0x56, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x02, 0x56, 0x02, 0x55, 0x02, 0x53, 0x12, 0xb2, 0x32, 0x9a, 0xa5, 0x3a, 0xc6, 0x7b, 0xc6, 0xfd, 0x9d, 0xf3, 0x22, 0x94, 0x0a, 0x95, 0x02, 0x75, 0x02, 0x76, 0x0a, 0x75, 0x02, 0x55, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x74, 0x02, 0x32, 0x0a, 0x50, 0x2a, 0x1e, 0xa6, 0x79, 0x4c, 0xf4, 0x0a, 0xf5, 0x02, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0x17, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0x1a, 0x0c, 0x1a, 0x04, 0xfa, 0x0b, 0xfa, 0x0b, 0xfa, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xfa, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xb9, 0x0b, 0x56, 0x13, 0x97, 0x64, 0xdd, 0xce, 0xfc, 0xde, 0xfe, 0xce, 0xf6, 0x2b, 0xf8, 0x0b, 0x5b, 0x1c, 0xb9, 0x03, 0xd9, 0x03, 0x98, 0x03, 0xba, 0x0b, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x0b, 0x78, 0x03, 0x77, 0x03, 0x55, 0x23, 0x1b, 0xae, 0x9b, 0xd6, 0xdb, 0xde, 0xbd, 0xbe, 0xb5, 0x23, 0xd8, 0x0b, 0xf9, 0x0b, 0xd9, 0x03, 0xb8, 0x03, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x57, 0x0b, 0x14, 0x1b, 0x5a, 0x7d, 0x9c, 0xce, 0x7a, 0xd6, 0xba, 0xe6, 0xfc, 0xde, 0xfe, 0xc6, 0xd4, 0x43, 0x35, 0x1b, 0x99, 0x1b, 0x38, 0x0b, 0x39, 0x0b, 0x38, 0x03, 0x17, 0x03, 0x38, 0x03, 0x38, 0x03, 0x18, 0x03, 0x18, 0x0b, 0x39, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x02, 0x17, 0x03, 0x18, 0x03, 0xf7, 0x02, 0xd5, 0x0a, 0x71, 0x1a, 0x9b, 0x95, 0xbc, 0xce, 0x1f, 0xd7, 0xf8, 0x4b, 0xb6, 0x0a, 0xb7, 0x0a, 0x98, 0x0a, 0x77, 0x02, 0x78, 0x0a, 0x78, 0x0a, 0x78, 0x0a, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77, 0x02, 0x56, 0x02, 0x56, 0x02, 0x56, 0x02, 0xf2, 0x11, 0xdb, 0xb5, 0x19, 0xd6, 0xda, 0xde, 0xfd, 0xce, 0x37, 0x54, 0x94, 0x0a, 0xb6, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x96, 0x02, 0xb6, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x97, 0x12, 0x53, 0x02, 0x91, 0x22, 0xdb, 0xad, 0x7b, 0xd6, 0xdb, 0xde, 0x3e, 0xd7, 0x98, 0x5c, 0xd5, 0x0a, 0x17, 0x0b, 0xf7, 0x02, 0xf7, 0x02, 0x18, 0x0b, 0x18, 0x0b, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xb5, 0x0a, 0x31, 0x12, 0x78, 0x74, 0x7c, 0xce, 0x9a, 0xd6, 0x9a, 0xde, 0xbb, 0xd6, 0x1f, 0xcf, 0x94, 0x43, 0x75, 0x12, 0xb8, 0x0a, 0xb7, 0x02, 0xb7, 0x0a, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x77, 0x02, 0x77, 0x0a, 0x77, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x98, 0x02, 0x97, 0x02, 0x97, 0x02, 0x96, 0x02, 0x76, 0x02, 0x96, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x32, 0x0a, 0x73, 0x53, 0x3c, 0xbe, 0x7b, 0xce, 0x9d, 0xce, 0xb9, 0x74, 0x12, 0x12, 0xd4, 0x09, 0x95, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x74, 0x09, 0x52, 0x01, 0xd0, 0x21, 0xdb, 0xbd, 0x3a, 0xd6, 0x7a, 0xde, 0xbd, 0xce, 0x58, 0x54, 0xb4, 0x0a, 0x96, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x77, 0x02, 0x57, 0x02, 0x56, 0x0a, 0x56, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x96, 0x0a, 0x76, 0x0a, 0x35, 0x02, 0x76, 0x0a, 0x13, 0x0a, 0x30, 0x1a, 0x39, 0x95, 0x39, 0xc6, 0x7b, 0xce, 0x3d, 0xa6, 0x13, 0x23, 0x94, 0x0a, 0x75, 0x02, 0x75, 0x02, 0x75, 0x0a, 0x55, 0x02, 0x55, 0x02, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, 0x55, 0x02, 0x75, 0x0a, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x75, 0x02, 0x96, 0x02, 0x76, 0x02, 0x76, 0x0a, 0x76, 0x02, 0x75, 0x0a, 0x74, 0x02, 0x52, 0x0a, 0x70, 0x32, 0x1e, 0xa6, 0x78, 0x4c, 0xf4, 0x0a, 0x15, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, + 0xf9, 0x03, 0xf9, 0x03, 0x3b, 0x0c, 0x9c, 0x1c, 0x7c, 0x14, 0xfa, 0x0b, 0xb9, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xda, 0x03, 0xda, 0x03, 0xb9, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xd9, 0x0b, 0x76, 0x13, 0xb7, 0x64, 0xfe, 0xce, 0xfd, 0xe6, 0xfe, 0xce, 0x78, 0x3c, 0x39, 0x14, 0xdd, 0x2c, 0xd9, 0x0b, 0xd9, 0x0b, 0x98, 0x03, 0xda, 0x0b, 0x99, 0x0b, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0xb9, 0x0b, 0x78, 0x03, 0x57, 0x03, 0x34, 0x1b, 0xfb, 0xa5, 0x7b, 0xd6, 0xdb, 0xde, 0xbd, 0xbe, 0xb5, 0x23, 0xd8, 0x0b, 0x19, 0x0c, 0xd9, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0x99, 0x03, 0x99, 0x03, 0x99, 0x03, 0x98, 0x03, 0x98, 0x03, 0xb9, 0x03, 0xb9, 0x03, 0xb9, 0x0b, 0xb9, 0x0b, 0xb9, 0x03, 0x99, 0x03, 0x98, 0x03, 0x78, 0x03, 0x78, 0x03, 0x57, 0x0b, 0xf3, 0x1a, 0xbc, 0x8d, 0x9c, 0xce, 0x7a, 0xd6, 0x79, 0xd6, 0x9b, 0xd6, 0xde, 0xbe, 0x94, 0x3b, 0x15, 0x13, 0x58, 0x0b, 0x18, 0x03, 0x79, 0x0b, 0x38, 0x03, 0x58, 0x03, 0x58, 0x03, 0x38, 0x03, 0x38, 0x03, 0x38, 0x0b, 0x39, 0x0b, 0x39, 0x0b, 0x18, 0x03, 0x17, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0x18, 0x03, 0xf7, 0x02, 0x17, 0x03, 0x18, 0x03, 0x17, 0x03, 0xd6, 0x12, 0x72, 0x1a, 0x5a, 0x95, 0xbd, 0xd6, 0xde, 0xce, 0x1d, 0x75, 0x96, 0x0a, 0x97, 0x0a, 0x98, 0x0a, 0x77, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x78, 0x02, 0x98, 0x02, 0x78, 0x02, 0x77, 0x02, 0x77, 0x02, 0x57, 0x02, 0x57, 0x02, 0x57, 0x02, 0x77, 0x02, 0x76, 0x02, 0x36, 0x02, 0x56, 0x02, 0xf2, 0x11, 0xfc, 0xbd, 0xf8, 0xcd, 0xba, 0xde, 0xfd, 0xce, 0x98, 0x5c, 0xb4, 0x0a, 0xb6, 0x0a, 0xb7, 0x0a, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0xb8, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x02, 0x98, 0x0a, 0x97, 0x0a, 0x97, 0x02, 0x96, 0x02, 0xb6, 0x0a, 0x96, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x76, 0x0a, 0x53, 0x02, 0xf3, 0x2a, 0xdb, 0xb5, 0x5a, 0xd6, 0xdb, 0xde, 0xdd, 0xce, 0x3b, 0x6d, 0xf5, 0x0a, 0x37, 0x0b, 0xd7, 0x02, 0xf7, 0x02, 0x18, 0x0b, 0x18, 0x0b, 0x18, 0x03, 0x17, 0x03, 0x18, 0x03, 0xf8, 0x02, 0xd7, 0x02, 0xb7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0xd7, 0x02, 0x95, 0x0a, 0x52, 0x1a, 0xf5, 0x5b, 0xbd, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0x9b, 0xd6, 0x3f, 0xcf, 0x74, 0x43, 0x95, 0x12, 0xb8, 0x0a, 0x97, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0xb7, 0x02, 0x97, 0x02, 0x97, 0x0a, 0x77, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x77, 0x02, 0x77, 0x02, 0x97, 0x02, 0x97, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x97, 0x0a, 0x76, 0x02, 0x32, 0x0a, 0x32, 0x4b, 0x3c, 0xbe, 0x3a, 0xc6, 0xbd, 0xce, 0xd6, 0x5b, 0xf2, 0x11, 0xb4, 0x01, 0xb5, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x75, 0x01, 0x74, 0x01, 0x75, 0x01, 0x95, 0x01, 0x95, 0x01, 0x75, 0x01, 0x74, 0x01, 0x74, 0x01, 0x74, 0x09, 0x52, 0x01, 0xf0, 0x21, 0xfb, 0xbd, 0x3a, 0xd6, 0x7a, 0xde, 0xbd, 0xce, 0xb6, 0x43, 0x94, 0x02, 0xb6, 0x0a, 0xb7, 0x0a, 0x96, 0x02, 0xb7, 0x0a, 0xb7, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, 0x57, 0x02, 0x57, 0x02, 0x56, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x76, 0x02, 0x96, 0x0a, 0x76, 0x02, 0x97, 0x0a, 0x76, 0x0a, 0x76, 0x02, 0x54, 0x0a, 0x92, 0x2a, 0x7a, 0x9d, 0x39, 0xc6, 0x9b, 0xce, 0x5d, 0xae, 0x34, 0x33, 0xb4, 0x12, 0x75, 0x02, 0x54, 0x02, 0x55, 0x0a, 0x55, 0x0a, 0x55, 0x0a, 0x75, 0x02, 0x55, 0x02, 0x55, 0x02, 0x55, 0x02, 0x75, 0x0a, 0x76, 0x0a, 0x55, 0x02, 0x75, 0x02, 0x75, 0x02, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x74, 0x02, 0x52, 0x0a, 0xb1, 0x32, 0xfe, 0xa5, 0x99, 0x54, 0xf4, 0x0a, 0x35, 0x0b, 0x16, 0x03, 0x16, 0x03, 0x16, 0x03, 0xf6, 0x02, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, +}; diff --git a/examples/peripherals/ppa/ppa_dsi/main/image.h b/examples/peripherals/ppa/ppa_dsi/main/image.h new file mode 100644 index 00000000000..400f48925ab --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/main/image.h @@ -0,0 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +extern const uint8_t image_map[]; diff --git a/examples/peripherals/ppa/ppa_dsi/main/image.jpg b/examples/peripherals/ppa/ppa_dsi/main/image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cacad0905071aeb6d88710ea0478e122988f060c GIT binary patch literal 43700 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 +#include +#include +#include "esp_attr.h" +#include "esp_log.h" +#include "esp_check.h" +#include "freertos/FreeRTOS.h" +#include "esp_lcd_mipi_dsi.h" +#include "esp_lcd_panel_ops.h" +#include "esp_lcd_ili9881c.h" +#include "esp_ldo_regulator.h" +#include "driver/ppa.h" +#include "example_dsi_init.h" +#include "example_dsi_init_config.h" +#if CONFIG_EXAMPLE_SOURCE_IMAGE_FORMAT_JPEG +#include "jpeg_decoder.h" +#else +#include "image.h" +#endif + +#define EXAMPLE_IMAGE_H 240 +#define EXAMPLE_IMAGE_W 320 +#define EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt) (((buffer_cnt) + 1) % 2) + +static const char *TAG = "ppa_dsi"; + +#if CONFIG_EXAMPLE_SOURCE_IMAGE_FORMAT_JPEG +//Reference the binary-included jpeg file +extern const uint8_t image_jpg_start[] asm("_binary_image_jpg_start"); +extern const uint8_t image_jpg_end[] asm("_binary_image_jpg_end"); + +//Decode the embedded image into pixel lines that can be used with the rest of the logic. +esp_err_t s_get_rgb565_image(uint16_t **pixels) +{ + *pixels = NULL; + esp_err_t ret = ESP_OK; + + //Allocate pixel memory. Each line is an array of EXAMPLE_IMAGE_W 16-bit pixels; the `*pixels` array itself contains pointers to these lines. + *pixels = calloc(EXAMPLE_IMAGE_H * EXAMPLE_IMAGE_W, sizeof(uint16_t)); + ESP_GOTO_ON_FALSE((*pixels), ESP_ERR_NO_MEM, err, TAG, "Error allocating memory for lines"); + + //JPEG decode config + esp_jpeg_image_cfg_t jpeg_cfg = { + .indata = (uint8_t *)image_jpg_start, + .indata_size = image_jpg_end - image_jpg_start, + .outbuf = (uint8_t*)(*pixels), + .outbuf_size = EXAMPLE_IMAGE_W * EXAMPLE_IMAGE_H * sizeof(uint16_t), + .out_format = JPEG_IMAGE_FORMAT_RGB565, + .out_scale = JPEG_IMAGE_SCALE_0, + .flags = { + .swap_color_bytes = 0, + } + }; + + //JPEG decode + esp_jpeg_image_output_t outimg; + esp_jpeg_decode(&jpeg_cfg, &outimg); + + ESP_LOGI(TAG, "JPEG image decoded! Size of the decoded image is: %dpx x %dpx", outimg.width, outimg.height); + + return ret; +err: + //Something went wrong! Exit cleanly, de-allocating everything we allocated. + if (*pixels != NULL) { + free(*pixels); + } + return ret; +} +#else +esp_err_t s_get_rgb565_image(uint16_t **pixels) +{ + *pixels = (uint16_t *)image_map; + return ESP_OK; +} +#endif + +void s_srm_ops(void *in_buf, void **out_buf, size_t buf_size, esp_lcd_panel_handle_t mipi_dpi_panel, ppa_client_handle_t ppa_srm_handle, void *clear_buf) +{ + ppa_srm_oper_config_t srm_config = { + .in.buffer = in_buf, + .in.pic_w = EXAMPLE_IMAGE_W, + .in.pic_h = EXAMPLE_IMAGE_H, + .in.block_w = EXAMPLE_IMAGE_W, + .in.block_h = EXAMPLE_IMAGE_H, + .in.block_offset_x = 0, + .in.block_offset_y = 0, + .in.srm_cm = PPA_SRM_COLOR_MODE_RGB565, + .out.buffer = out_buf[0], + .out.buffer_size = buf_size, + .out.pic_w = EXAMPLE_IMAGE_W, + .out.pic_h = EXAMPLE_IMAGE_H, + .out.block_offset_x = 0, + .out.block_offset_y = 0, + .out.srm_cm = PPA_SRM_COLOR_MODE_RGB565, + .rotation_angle = PPA_SRM_ROTATION_ANGLE_0, + .scale_x = 1, + .scale_y = 1, + .rgb_swap = 0, + .byte_swap = 0, + .mode = PPA_TRANS_MODE_BLOCKING, + }; + + //scale up from x0.5, x1, to x1.5 + const float size_mul[3] = {0.5, 1, 1.5}; + const float mul[3] = {0.5, 2, 1.5}; + int buffer_cnt = 0; + for (int i = 0; i < 3; i++) { + srm_config.out.pic_w = EXAMPLE_IMAGE_W * size_mul[i]; + srm_config.out.pic_h = EXAMPLE_IMAGE_H * size_mul[i]; + srm_config.scale_x = mul[i]; + srm_config.scale_y = mul[i]; + ESP_ERROR_CHECK(ppa_do_scale_rotate_mirror(ppa_srm_handle, &srm_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W * size_mul[i], EXAMPLE_IMAGE_H * size_mul[i], out_buf[buffer_cnt])); + vTaskDelay(800 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W * mul[i], EXAMPLE_IMAGE_H * mul[i], clear_buf)); + srm_config.in.buffer = out_buf[i % 2]; + srm_config.out.buffer = out_buf[1 - i % 2]; + srm_config.in.pic_w = EXAMPLE_IMAGE_W * size_mul[i]; + srm_config.in.pic_h = EXAMPLE_IMAGE_H * size_mul[i]; + srm_config.in.block_w = EXAMPLE_IMAGE_W * size_mul[i]; + srm_config.in.block_h = EXAMPLE_IMAGE_H * size_mul[i]; + buffer_cnt = EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt); + } + + //rotate the x1.5 image in CCW direction + srm_config.rotation_angle = PPA_SRM_ROTATION_ANGLE_90; + srm_config.scale_x = 1; + srm_config.scale_y = 1; + srm_config.out.pic_w = EXAMPLE_IMAGE_H * 1.5; + srm_config.out.pic_h = EXAMPLE_IMAGE_W * 1.5; + ESP_ERROR_CHECK(ppa_do_scale_rotate_mirror(ppa_srm_handle, &srm_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_H * 1.5, EXAMPLE_IMAGE_W * 1.5, out_buf[buffer_cnt])); + vTaskDelay(800 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_H * 1.5, EXAMPLE_IMAGE_W * 1.5, clear_buf)); + srm_config.in.buffer = out_buf[buffer_cnt]; + srm_config.in.pic_w = EXAMPLE_IMAGE_H * 1.5; + srm_config.in.pic_h = EXAMPLE_IMAGE_W * 1.5; + srm_config.in.block_w = EXAMPLE_IMAGE_H * 1.5; + srm_config.in.block_h = EXAMPLE_IMAGE_W * 1.5; + srm_config.out.buffer = out_buf[1 - buffer_cnt]; + buffer_cnt = EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt); + + //rotate the x1.5 image back in CW direction + srm_config.rotation_angle = PPA_SRM_ROTATION_ANGLE_270; + srm_config.out.pic_w = EXAMPLE_IMAGE_W * 1.5; + srm_config.out.pic_h = EXAMPLE_IMAGE_H * 1.5; + ESP_ERROR_CHECK(ppa_do_scale_rotate_mirror(ppa_srm_handle, &srm_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W * 1.5, EXAMPLE_IMAGE_H * 1.5, out_buf[buffer_cnt])); + vTaskDelay(800 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W * 1.5, EXAMPLE_IMAGE_H * 1.5, clear_buf)); + srm_config.rotation_angle = PPA_SRM_ROTATION_ANGLE_0; + srm_config.in.buffer = out_buf[buffer_cnt]; + srm_config.in.pic_w = EXAMPLE_IMAGE_W * 1.5; + srm_config.in.pic_h = EXAMPLE_IMAGE_H * 1.5; + srm_config.in.block_w = EXAMPLE_IMAGE_W * 1.5; + srm_config.in.block_h = EXAMPLE_IMAGE_H * 1.5; + srm_config.out.buffer = out_buf[1 - buffer_cnt]; + buffer_cnt = EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt); + + //mirror the x1.5 image along both x and y axis, then mirror it back + for (int i = 0; i < 2; i++) { + srm_config.mirror_x = 1; + srm_config.mirror_y = 1; + ESP_ERROR_CHECK(ppa_do_scale_rotate_mirror(ppa_srm_handle, &srm_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W * 1.5, EXAMPLE_IMAGE_H * 1.5, out_buf[buffer_cnt])); + vTaskDelay(800 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W * 1.5, EXAMPLE_IMAGE_H * 1.5, clear_buf)); + srm_config.in.buffer = out_buf[buffer_cnt]; + srm_config.out.buffer = out_buf[1 - buffer_cnt]; + buffer_cnt = EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt); + } + + //back to 1x original image + srm_config.in.buffer = in_buf; + srm_config.in.pic_w = EXAMPLE_IMAGE_W; + srm_config.in.pic_h = EXAMPLE_IMAGE_H; + srm_config.in.block_w = EXAMPLE_IMAGE_W; + srm_config.in.block_h = EXAMPLE_IMAGE_H; + srm_config.out.buffer = out_buf[buffer_cnt]; + srm_config.rotation_angle = PPA_SRM_ROTATION_ANGLE_0; + srm_config.out.pic_w = EXAMPLE_IMAGE_W; + srm_config.out.pic_h = EXAMPLE_IMAGE_H; + srm_config.scale_x = 1; + srm_config.scale_y = 1; + srm_config.mirror_x = 0; + srm_config.mirror_y = 0; + ESP_ERROR_CHECK(ppa_do_scale_rotate_mirror(ppa_srm_handle, &srm_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, out_buf[buffer_cnt])); + vTaskDelay(800 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, clear_buf)); +} + +void s_blend_ops(void *bg_buf, void *fg_buf, void *out_buf, size_t buf_size, esp_lcd_panel_handle_t mipi_dpi_panel, ppa_client_handle_t ppa_blend_handle, void *clear_buf) +{ + //this operation will blend the bg_buf with the fg_buf + ppa_blend_oper_config_t blend_config = { + .in_bg.buffer = bg_buf, + .in_bg.pic_w = EXAMPLE_IMAGE_W, + .in_bg.pic_h = EXAMPLE_IMAGE_H, + .in_bg.block_w = EXAMPLE_IMAGE_W, + .in_bg.block_h = EXAMPLE_IMAGE_H, + .in_bg.block_offset_x = 0, + .in_bg.block_offset_y = 0, + .in_bg.blend_cm = PPA_SRM_COLOR_MODE_RGB565, + .in_fg.buffer = fg_buf, + .in_fg.pic_w = EXAMPLE_IMAGE_W, + .in_fg.pic_h = EXAMPLE_IMAGE_H, + .in_fg.block_w = EXAMPLE_IMAGE_W, + .in_fg.block_h = EXAMPLE_IMAGE_H, + .in_fg.block_offset_x = 0, + .in_fg.block_offset_y = 0, + .in_fg.blend_cm = PPA_BLEND_COLOR_MODE_A8, + .out.buffer = out_buf, + .out.buffer_size = buf_size, + .out.pic_w = EXAMPLE_IMAGE_W, + .out.pic_h = EXAMPLE_IMAGE_H, + .out.block_offset_x = 0, + .out.block_offset_y = 0, + .out.blend_cm = PPA_SRM_COLOR_MODE_RGB565, + .bg_alpha_update_mode = PPA_ALPHA_SCALE, + .bg_alpha_scale_ratio = 0.9, + .fg_alpha_update_mode = PPA_ALPHA_SCALE, + .fg_alpha_scale_ratio = 0.5, + .fg_fix_rgb_val = { + .b = 0xd3, + .g = 0x03, + .r = 0xff, + }, + .bg_ck_en = false, + .fg_ck_en = false, + .mode = PPA_TRANS_MODE_BLOCKING, + }; + ESP_ERROR_CHECK(ppa_do_blend(ppa_blend_handle, &blend_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, out_buf)); + vTaskDelay(800 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, clear_buf)); + + //the `ESP32` in the bg_buf will be color-keyed out + memset(fg_buf, 0xff, buf_size); + blend_config.fg_alpha_update_mode = PPA_ALPHA_NO_CHANGE; + blend_config.in_bg.blend_cm = PPA_SRM_COLOR_MODE_RGB565; + blend_config.fg_fix_rgb_val = (color_pixel_rgb888_data_t) {}; + blend_config.bg_ck_en = true; + blend_config.bg_ck_rgb_low_thres = (color_pixel_rgb888_data_t) { + .b = 0, + .g = 0, + .r = 0x80, + }; + blend_config.bg_ck_rgb_high_thres = (color_pixel_rgb888_data_t) { + .b = 0x40, + .g = 0x40, + .r = 0xfe, + }; + ESP_ERROR_CHECK(ppa_do_blend(ppa_blend_handle, &blend_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, out_buf)); + vTaskDelay(800 / portTICK_PERIOD_MS); +} + +void s_fill_ops(void *out_buf, size_t buf_size, esp_lcd_panel_handle_t mipi_dpi_panel, ppa_client_handle_t ppa_fill_handle) +{ + int buffer_cnt = 0; + ppa_fill_oper_config_t fill_config = { + .out.buffer = out_buf, + .out.buffer_size = buf_size, + .out.pic_w = EXAMPLE_IMAGE_W, + .out.pic_h = EXAMPLE_IMAGE_H, + .out.block_offset_x = 0, + .out.block_offset_y = 20, + .out.fill_cm = PPA_FILL_COLOR_MODE_RGB565, + .fill_block_w = 10, + .fill_block_h = 200, + .fill_argb_color = { + .a = 0x80, + .r = 0xe0, + .g = 0x10, + .b = 0x10, + }, + .mode = PPA_TRANS_MODE_BLOCKING, + }; + + //below ops will add a frame to the `ESP32` characters + ESP_ERROR_CHECK(ppa_do_fill(ppa_fill_handle, &fill_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, out_buf)); + buffer_cnt = EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt); + + fill_config.out.block_offset_x = 0; + fill_config.out.block_offset_y = 20; + fill_config.fill_block_w = 320; + fill_config.fill_block_h = 10; + ESP_ERROR_CHECK(ppa_do_fill(ppa_fill_handle, &fill_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, out_buf)); + buffer_cnt = EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt); + + fill_config.out.block_offset_x = 310; + fill_config.out.block_offset_y = 20; + fill_config.fill_block_w = 10; + fill_config.fill_block_h = 200; + ESP_ERROR_CHECK(ppa_do_fill(ppa_fill_handle, &fill_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, out_buf)); + buffer_cnt = EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt); + + fill_config.out.block_offset_x = 0; + fill_config.out.block_offset_y = 220; + fill_config.fill_block_w = 320; + fill_config.fill_block_h = 10; + ESP_ERROR_CHECK(ppa_do_fill(ppa_fill_handle, &fill_config)); + ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, EXAMPLE_IMAGE_W, EXAMPLE_IMAGE_H, out_buf)); + buffer_cnt = EXAMPLE_BUFFER_CNT_CYCLE(buffer_cnt); + vTaskDelay(800 / portTICK_PERIOD_MS); +} + +void app_main(void) +{ + uint16_t *pixels = NULL; + esp_lcd_dsi_bus_handle_t mipi_dsi_bus = NULL; + esp_lcd_panel_io_handle_t mipi_dbi_io = NULL; + esp_lcd_panel_handle_t ili9881c_ctrl_panel = NULL; + esp_lcd_panel_handle_t mipi_dpi_panel = NULL; + + //---------------MIPI LDO Init------------------// + esp_ldo_channel_handle_t ldo_mipi_phy = NULL; + esp_ldo_channel_config_t ldo_mipi_phy_config = { + .chan_id = CONFIG_EXAMPLE_USED_LDO_CHAN_ID, + .voltage_mv = CONFIG_EXAMPLE_USED_LDO_VOLTAGE_MV, + }; + ESP_ERROR_CHECK(esp_ldo_acquire_channel(&ldo_mipi_phy_config, &ldo_mipi_phy)); + + //---------------DSI Init------------------// + example_dsi_resource_alloc(&ili9881c_ctrl_panel, &mipi_dsi_bus, &mipi_dbi_io, &mipi_dpi_panel, NULL); + example_dsi_ili9881c_panel_init(ili9881c_ctrl_panel); + example_dpi_panel_init(mipi_dpi_panel); + + //---------------Get Source image------------------// + ESP_ERROR_CHECK(s_get_rgb565_image(&pixels)); + size_t out_buf_size = EXAMPLE_IMAGE_H * EXAMPLE_IMAGE_W * 4 * 2; + uint8_t *out_buf[2] = {}; + for (int i = 0; i < 2; i++) { + out_buf[i] = heap_caps_calloc(out_buf_size, 1, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); + if (!out_buf[i]) { + ESP_LOGE(TAG, "no mem for out_buf"); + return ; + } + } + + uint8_t *clear_buf = heap_caps_calloc(out_buf_size, 1, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); + if (!clear_buf) { + ESP_LOGE(TAG, "no mem for clear_buf"); + return ; + } + + //---------------SRM------------------// + ppa_client_handle_t ppa_srm_handle = NULL; + ppa_client_config_t ppa_srm_config = { + .oper_type = PPA_OPERATION_SRM, + .max_pending_trans_num = 1, + }; + ESP_ERROR_CHECK(ppa_register_client(&ppa_srm_config, &ppa_srm_handle)); + printf("start srm operations\n"); + s_srm_ops(pixels, (void **)out_buf, out_buf_size, mipi_dpi_panel, ppa_srm_handle, clear_buf); + + uint8_t *fg_buf = heap_caps_calloc(out_buf_size, 1, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); + if (!fg_buf) { + ESP_LOGE(TAG, "no mem for fg_buf"); + return ; + } + memset(fg_buf, 0xff, out_buf_size); + + //---------------BLEND------------------// + ppa_client_handle_t ppa_blend_handle = NULL; + ppa_client_config_t ppa_blend_config = { + .oper_type = PPA_OPERATION_BLEND, + .max_pending_trans_num = 1, + }; + ESP_ERROR_CHECK(ppa_register_client(&ppa_blend_config, &ppa_blend_handle)); + printf("start blend operations\n"); + s_blend_ops(pixels, fg_buf, out_buf[0], out_buf_size, mipi_dpi_panel, ppa_blend_handle, clear_buf); + + //---------------FILL------------------// + ppa_client_handle_t ppa_fill_handle = NULL; + ppa_client_config_t ppa_fill_config = { + .oper_type = PPA_OPERATION_FILL, + .max_pending_trans_num = 1, + }; + ESP_ERROR_CHECK(ppa_register_client(&ppa_fill_config, &ppa_fill_handle)); + printf("start fill operations\n"); + s_fill_ops(out_buf[0], out_buf_size, mipi_dpi_panel, ppa_fill_handle); + +#if CONFIG_EXAMPLE_SOURCE_IMAGE_FORMAT_JPEG + free(pixels); +#endif + free(out_buf[0]); + free(out_buf[1]); + free(clear_buf); + free(fg_buf); + ESP_ERROR_CHECK(ppa_unregister_client(ppa_srm_handle)); + ESP_ERROR_CHECK(ppa_unregister_client(ppa_blend_handle)); + ESP_ERROR_CHECK(ppa_unregister_client(ppa_fill_handle)); + example_dsi_resource_destroy(ili9881c_ctrl_panel, mipi_dsi_bus, mipi_dbi_io, mipi_dpi_panel); +} diff --git a/examples/peripherals/ppa/ppa_dsi/pytest_ppa_dsi.py b/examples/peripherals/ppa/ppa_dsi/pytest_ppa_dsi.py new file mode 100644 index 00000000000..65eece56575 --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/pytest_ppa_dsi.py @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32p4 +@pytest.mark.generic +def test_ppa_dsi(dut: Dut) -> None: + dut.expect_exact('Calling app_main()') diff --git a/examples/peripherals/ppa/ppa_dsi/sdkconfig.defaults b/examples/peripherals/ppa/ppa_dsi/sdkconfig.defaults new file mode 100644 index 00000000000..73cebe337da --- /dev/null +++ b/examples/peripherals/ppa/ppa_dsi/sdkconfig.defaults @@ -0,0 +1,3 @@ +CONFIG_SPIRAM=y +CONFIG_IDF_EXPERIMENTAL_FEATURES=y +CONFIG_SPIRAM_SPEED_200M=y From 9b387caf19cf25b694a48cfe7042590a5daa9e66 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 16 Jul 2024 09:31:16 +0800 Subject: [PATCH 054/113] fix(etm): add ulp etm ll functions --- components/hal/esp32c5/include/hal/etm_ll.h | 5 +++++ components/soc/esp32c5/include/soc/soc_etm_source.h | 4 ++-- components/ulp/test_apps/.build-test-rules.yml | 6 ------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/components/hal/esp32c5/include/hal/etm_ll.h b/components/hal/esp32c5/include/hal/etm_ll.h index 6708cd7f17e..a042b0f922b 100644 --- a/components/hal/esp32c5/include/hal/etm_ll.h +++ b/components/hal/esp32c5/include/hal/etm_ll.h @@ -11,6 +11,7 @@ #include #include "hal/assert.h" #include "hal/misc.h" +#include "hal/lp_aon_ll.h" #include "soc/soc_etm_struct.h" #include "soc/pcr_struct.h" @@ -112,6 +113,10 @@ static inline void etm_ll_channel_set_task(soc_etm_dev_t *hw, uint32_t chan, uin HAL_FORCE_MODIFY_U32_REG_FIELD(hw->channel[chan].tid, chn_task_id, task); } +#define etm_ll_is_lpcore_wakeup_triggered() lp_aon_ll_get_lpcore_etm_wakeup_flag() + +#define etm_ll_clear_lpcore_wakeup_status() lp_aon_ll_clear_lpcore_etm_wakeup_flag() + #ifdef __cplusplus } #endif diff --git a/components/soc/esp32c5/include/soc/soc_etm_source.h b/components/soc/esp32c5/include/soc/soc_etm_source.h index c1b6f4f49d2..32470c56fb8 100644 --- a/components/soc/esp32c5/include/soc/soc_etm_source.h +++ b/components/soc/esp32c5/include/soc/soc_etm_source.h @@ -292,8 +292,8 @@ #define I2S0_TASK_START_TX 140 #define I2S0_TASK_STOP_RX 141 #define I2S0_TASK_STOP_TX 142 -#define ULP_TASK_WAKEUP_CPU 143 -#define ULP_TASK_INT_CPU 144 +#define ULP_TASK_WAKEUP_CPU 137 +#define ULP_TASK_INT_CPU 138 #define RTC_TASK_START 145 #define RTC_TASK_STOP 146 #define RTC_TASK_CLR 147 diff --git a/components/ulp/test_apps/.build-test-rules.yml b/components/ulp/test_apps/.build-test-rules.yml index b601d66f143..0f1c3e5be96 100644 --- a/components/ulp/test_apps/.build-test-rules.yml +++ b/components/ulp/test_apps/.build-test-rules.yml @@ -3,17 +3,11 @@ components/ulp/test_apps/lp_core: disable: - if: SOC_LP_CORE_SUPPORTED != 1 - depends_components: - - ulp components/ulp/test_apps/ulp_fsm: enable: - if: SOC_ULP_FSM_SUPPORTED == 1 - depends_components: - - ulp components/ulp/test_apps/ulp_riscv: disable: - if: SOC_RISCV_COPROC_SUPPORTED != 1 - depends_components: - - ulp From 3712dfa6c5633191174f2b125da7c8bea609c7f2 Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Mon, 1 Jul 2024 14:49:17 +0800 Subject: [PATCH 055/113] feat(openthread): update openthread submodule --- components/openthread/CMakeLists.txt | 2 + components/openthread/Kconfig | 3 +- components/openthread/openthread | 2 +- .../openthread-core-esp32x-ftd-config.h | 4 +- .../openthread-core-esp32x-mtd-config.h | 4 +- .../openthread-core-esp32x-radio-config.h | 4 +- .../openthread-core-esp32x-spinel-config.h | 4 +- components/openthread/sbom_openthread.yml | 2 +- .../src/esp_openthread_netif_glue.c | 2 +- .../src/port/esp_openthread_radio.c | 26 +++++++--- .../src/port/esp_openthread_radio_spinel.cpp | 49 ++++++++++++++----- .../src/spinel/esp_radio_spinel.cpp | 20 +++++++- .../esp_radio_spinel_uart_interface.cpp | 1 + examples/openthread/ot_rcp/sdkconfig.defaults | 5 ++ 14 files changed, 96 insertions(+), 32 deletions(-) diff --git a/components/openthread/CMakeLists.txt b/components/openthread/CMakeLists.txt index 39cc5b78b81..7a1db20cf12 100644 --- a/components/openthread/CMakeLists.txt +++ b/components/openthread/CMakeLists.txt @@ -266,6 +266,8 @@ if(CONFIG_OPENTHREAD_ENABLED OR CONFIG_OPENTHREAD_SPINEL_ONLY) PUBLIC "OPENTHREAD_CONFIG_FILE=\"openthread-core-esp32x-${CONFIG_FILE_TYPE}-config.h\"" "${device_type}" + "OPENTHREAD_PROJECT_LIB_CONFIG_FILE=\"openthread-core-esp32x-${CONFIG_FILE_TYPE}-config.h\"" + "${device_type}" PRIVATE "PACKAGE_VERSION=\"${IDF_VERSION_FOR_OPENTHREAD_PACKAGE}-${OPENTHREAD_VERSION}\"" "OPENTHREAD_BUILD_DATETIME=\"${OT_BUILD_TIMESTAMP}\"" diff --git a/components/openthread/Kconfig b/components/openthread/Kconfig index 740479a940a..56739b5ec3d 100644 --- a/components/openthread/Kconfig +++ b/components/openthread/Kconfig @@ -259,7 +259,8 @@ menu "OpenThread" config OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE int "The size of openthread spinel rx frame buffer" depends on OPENTHREAD_ENABLED || OPENTHREAD_SPINEL_ONLY - default 2048 + default 1024 if OPENTHREAD_MTD || OPENTHREAD_RADIO + default 2048 if OPENTHREAD_FTD || OPENTHREAD_SPINEL_ONLY config OPENTHREAD_MAC_MAX_CSMA_BACKOFFS_DIRECT int "Maximum backoffs times before declaring a channel access failure." diff --git a/components/openthread/openthread b/components/openthread/openthread index be7d36e4ff9..f32c18bc084 160000 --- a/components/openthread/openthread +++ b/components/openthread/openthread @@ -1 +1 @@ -Subproject commit be7d36e4ff9cf7df6dfce54e58a31163c87b93f7 +Subproject commit f32c18bc0840f400182456e58ae3900fc2fb4af7 diff --git a/components/openthread/private_include/openthread-core-esp32x-ftd-config.h b/components/openthread/private_include/openthread-core-esp32x-ftd-config.h index bf61bc9094c..5c851511f5c 100644 --- a/components/openthread/private_include/openthread-core-esp32x-ftd-config.h +++ b/components/openthread/private_include/openthread-core-esp32x-ftd-config.h @@ -355,13 +355,13 @@ #define OPENTHREAD_CONFIG_MAX_STATECHANGE_HANDLERS 3 /** - * @def OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE + * @def OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE * * Specifies the rx frame buffer size used by `SpinelInterface` in RCP host code. This is applicable/used when * `RadioSpinel` platform is used. * */ -#define OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE CONFIG_OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE +#define OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE CONFIG_OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE /** * @def OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE diff --git a/components/openthread/private_include/openthread-core-esp32x-mtd-config.h b/components/openthread/private_include/openthread-core-esp32x-mtd-config.h index 40ac95b9ebd..8067323649b 100644 --- a/components/openthread/private_include/openthread-core-esp32x-mtd-config.h +++ b/components/openthread/private_include/openthread-core-esp32x-mtd-config.h @@ -169,13 +169,13 @@ #define OPENTHREAD_CONFIG_MAX_STATECHANGE_HANDLERS 3 /** - * @def OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE + * @def OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE * * Specifies the rx frame buffer size used by `SpinelInterface` in RCP host code. This is applicable/used when * `RadioSpinel` platform is used. * */ -#define OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE 1024 +#define OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE CONFIG_OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE /** * @def OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE diff --git a/components/openthread/private_include/openthread-core-esp32x-radio-config.h b/components/openthread/private_include/openthread-core-esp32x-radio-config.h index cd8ad159092..aba848fe496 100644 --- a/components/openthread/private_include/openthread-core-esp32x-radio-config.h +++ b/components/openthread/private_include/openthread-core-esp32x-radio-config.h @@ -142,13 +142,13 @@ #define OPENTHREAD_CONFIG_MAX_STATECHANGE_HANDLERS 3 /** - * @def OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE + * @def OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE * * Specifies the rx frame buffer size used by `SpinelInterface` in RCP host code. This is applicable/used when * `RadioSpinel` platform is used. * */ -#define OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE 1024 +#define OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE CONFIG_OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE /** * @def OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE diff --git a/components/openthread/private_include/openthread-core-esp32x-spinel-config.h b/components/openthread/private_include/openthread-core-esp32x-spinel-config.h index 68d5b8240a3..35c33d55a60 100644 --- a/components/openthread/private_include/openthread-core-esp32x-spinel-config.h +++ b/components/openthread/private_include/openthread-core-esp32x-spinel-config.h @@ -39,13 +39,13 @@ #endif /** - * @def OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE + * @def OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE * * Specifies the rx frame buffer size used by `SpinelInterface` in RCP host code. This is applicable/used when * `RadioSpinel` platform is used. * */ -#define OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE CONFIG_OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE +#define OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE CONFIG_OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE /** * @def OPENTHREAD_CONFIG_MAC_MAX_CSMA_BACKOFFS_DIRECT diff --git a/components/openthread/sbom_openthread.yml b/components/openthread/sbom_openthread.yml index ae0203670fb..7738bbe0a2e 100644 --- a/components/openthread/sbom_openthread.yml +++ b/components/openthread/sbom_openthread.yml @@ -5,4 +5,4 @@ supplier: 'Organization: Espressif Systems (Shanghai) CO LTD' originator: 'Organization: Google LLC' description: OpenThread released by Google is an open-source implementation of the Thread networking url: https://github.com/espressif/openthread -hash: be7d36e4ff9cf7df6dfce54e58a31163c87b93f7 +hash: f32c18bc0840f400182456e58ae3900fc2fb4af7 diff --git a/components/openthread/src/esp_openthread_netif_glue.c b/components/openthread/src/esp_openthread_netif_glue.c index 8e0ff030855..e7184698682 100644 --- a/components/openthread/src/esp_openthread_netif_glue.c +++ b/components/openthread/src/esp_openthread_netif_glue.c @@ -320,7 +320,7 @@ void *esp_openthread_netif_glue_init(const esp_openthread_platform_config_t *con otIp6SetAddressCallback(instance, process_thread_address, instance); otIp6SetReceiveCallback(instance, process_thread_receive, instance); otIp6SetReceiveFilterEnabled(instance, true); - otIcmp6SetEchoMode(instance, OT_ICMP6_ECHO_HANDLER_DISABLED); + otIcmp6SetEchoMode(instance, OT_ICMP6_ECHO_HANDLER_RLOC_ALOC_ONLY); s_openthread_netif_glue.event_fd = eventfd(0, 0); if (s_openthread_netif_glue.event_fd < 0) { diff --git a/components/openthread/src/port/esp_openthread_radio.c b/components/openthread/src/port/esp_openthread_radio.c index 07041438b27..4276809c528 100644 --- a/components/openthread/src/port/esp_openthread_radio.c +++ b/components/openthread/src/port/esp_openthread_radio.c @@ -64,10 +64,13 @@ static otRadioFrame s_ack_frame; static int s_ed_power; static esp_ieee802154_tx_error_t s_tx_error; static int s_radio_event_fd = -1; -static bool s_diag_mode = false; static const char *s_radio_workflow = "radio"; static uint8_t s_txrx_events; +#if CONFIG_OPENTHREAD_DIAG +static bool s_diag_mode = false; +#endif + #if OPENTHREAD_CONFIG_MAC_HEADER_IE_SUPPORT static otRadioIeInfo s_transmit_ie_info; #endif // OPENTHREAD_CONFIG_MAC_HEADER_IE_SUPPORT @@ -113,7 +116,7 @@ static inline bool get_event(uint8_t event) esp_err_t esp_openthread_radio_init(const esp_openthread_platform_config_t *config) { ESP_RETURN_ON_FALSE(s_radio_event_fd == -1, ESP_ERR_INVALID_STATE, OT_PLAT_LOG_TAG, - "Radio was initalized already!"); + "Radio was initialized already!"); s_radio_event_fd = eventfd(0, EFD_SUPPORT_ISR); @@ -165,7 +168,7 @@ esp_err_t esp_openthread_radio_process(otInstance *aInstance, const esp_openthre if (get_event(EVENT_TX_DONE)) { clr_event(EVENT_TX_DONE); -#if OPENTHREAD_CONFIG_DIAG_ENABLE +#if CONFIG_OPENTHREAD_DIAG if (otPlatDiagModeGet()) { otPlatDiagRadioTransmitDone(aInstance, &s_transmit_frame, OT_ERROR_NONE); } else @@ -183,7 +186,7 @@ esp_err_t esp_openthread_radio_process(otInstance *aInstance, const esp_openthre if (get_event(EVENT_TX_FAILED)) { clr_event(EVENT_TX_FAILED); -#if OPENTHREAD_CONFIG_DIAG_ENABLE +#if CONFIG_OPENTHREAD_DIAG if (otPlatDiagModeGet()) { otPlatDiagRadioTransmitDone(aInstance, &s_transmit_frame, OT_ERROR_CHANNEL_ACCESS_FAILURE); } else @@ -219,7 +222,7 @@ esp_err_t esp_openthread_radio_process(otInstance *aInstance, const esp_openthre while (atomic_load(&s_recv_queue.used)) { if (s_receive_frame[s_recv_queue.head].mPsdu != NULL) { -#if OPENTHREAD_CONFIG_DIAG_ENABLE +#if CONFIG_OPENTHREAD_DIAG if (otPlatDiagModeGet()) { otPlatDiagRadioReceiveDone(aInstance, &s_receive_frame[s_recv_queue.head], OT_ERROR_NONE); } else @@ -302,7 +305,7 @@ otError otPlatRadioTransmit(otInstance *aInstance, otRadioFrame *aFrame) { esp_ieee802154_set_channel(aFrame->mChannel); - aFrame->mPsdu[-1] = aFrame->mLength; // lenth locates one byte before the psdu (esp_openthread_radio_tx_psdu); + aFrame->mPsdu[-1] = aFrame->mLength; // length locates one byte before the psdu (esp_openthread_radio_tx_psdu); if (otMacFrameIsSecurityEnabled(aFrame) && !aFrame->mInfo.mTxInfo.mIsSecurityProcessed) { if (!s_transmit_frame.mInfo.mTxInfo.mIsARetx) { @@ -447,6 +450,15 @@ int8_t otPlatRadioGetReceiveSensitivity(otInstance *aInstance) return ESP_RECEIVE_SENSITIVITY; } +#if CONFIG_OPENTHREAD_DIAG + +void otPlatDiagSetOutputCallback(otInstance *aInstance, otPlatDiagOutputCallback aCallback, void *aContext) +{ + OT_UNUSED_VARIABLE(aInstance); + OT_UNUSED_VARIABLE(aCallback); + OT_UNUSED_VARIABLE(aContext); +} + void otPlatDiagModeSet(bool mode) { s_diag_mode = mode; @@ -479,6 +491,8 @@ void otPlatDiagAlarmCallback(otInstance *aInstance) OT_UNUSED_VARIABLE(aInstance); } +#endif // CONFIG_OPENTHREAD_DIAG + #if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2 void otPlatRadioSetMacKey(otInstance *aInstance, uint8_t aKeyIdMode, uint8_t aKeyId, const otMacKeyMaterial *aPrevKey, const otMacKeyMaterial *aCurrKey, const otMacKeyMaterial *aNextKey, otRadioKeyType aKeyType) diff --git a/components/openthread/src/port/esp_openthread_radio_spinel.cpp b/components/openthread/src/port/esp_openthread_radio_spinel.cpp index a926138f9a5..34eccebc8ad 100644 --- a/components/openthread/src/port/esp_openthread_radio_spinel.cpp +++ b/components/openthread/src/port/esp_openthread_radio_spinel.cpp @@ -6,6 +6,7 @@ #include "esp_openthread_radio.h" +#include "link_raw.h" #include "sdkconfig.h" #include "esp_check.h" #include "esp_err.h" @@ -23,9 +24,11 @@ #include "openthread/platform/diag.h" #include "openthread/platform/radio.h" #include "platform/exit_code.h" +#include "spinel_driver.hpp" using ot::Spinel::RadioSpinel; using esp::openthread::SpinelInterfaceAdapter; +using ot::Spinel::SpinelDriver; #if CONFIG_OPENTHREAD_RADIO_SPINEL_UART // CONFIG_OPENTHREAD_RADIO_SPINEL_UART using esp::openthread::UartSpinelInterface; @@ -35,7 +38,17 @@ using esp::openthread::SpiSpinelInterface; static SpinelInterfaceAdapter s_spinel_interface; #endif +static SpinelDriver s_spinel_driver; static RadioSpinel s_radio; +static otRadioCaps s_radio_caps = (OT_RADIO_CAPS_ENERGY_SCAN | +#if CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE + OT_RADIO_CAPS_RX_ON_WHEN_IDLE | +#endif + OT_RADIO_CAPS_TRANSMIT_SEC | + OT_RADIO_CAPS_RECEIVE_TIMING | + OT_RADIO_CAPS_TRANSMIT_TIMING | + OT_RADIO_CAPS_ACK_TIMEOUT | + OT_RADIO_CAPS_SLEEP_TO_TX); static const char *radiospinel_workflow = "radio_spinel"; @@ -60,7 +73,7 @@ esp_err_t esp_openthread_radio_init(const esp_openthread_platform_config_t *conf #if CONFIG_OPENTHREAD_DIAG callbacks.mDiagReceiveDone = otPlatDiagRadioReceiveDone; callbacks.mDiagTransmitDone = otPlatDiagRadioTransmitDone; -#endif // OPENTHREAD_CONFIG_DIAG_ENABLE +#endif // CONFIG_OPENTHREAD_DIAG callbacks.mEnergyScanDone = otPlatRadioEnergyScanDone; callbacks.mReceiveDone = otPlatRadioReceiveDone; callbacks.mTransmitDone = otPlatRadioTxDone; @@ -70,14 +83,15 @@ esp_err_t esp_openthread_radio_init(const esp_openthread_platform_config_t *conf esp_openthread_radio_config_set(&config->radio_config); #if CONFIG_OPENTHREAD_RADIO_SPINEL_UART // CONFIG_OPENTHREAD_RADIO_SPINEL_UART ESP_RETURN_ON_ERROR(s_spinel_interface.GetSpinelInterface().Enable(config->radio_config.radio_uart_config), OT_PLAT_LOG_TAG, - "Spinel interface init falied"); + "Spinel interface init failed"); #else // CONFIG_OPENTHREAD_RADIO_SPINEL_SPI ESP_RETURN_ON_ERROR(s_spinel_interface.GetSpinelInterface().Enable(config->radio_config.radio_spi_config), OT_PLAT_LOG_TAG, "Spinel interface init failed"); #endif - s_radio.Init(s_spinel_interface.GetSpinelInterface(), /*reset_radio=*/true, /*skip_rcp_compatibility_check=*/false, iidList, ot::Spinel::kSpinelHeaderMaxNumIid); + s_spinel_driver.Init(s_spinel_interface.GetSpinelInterface(), true, iidList, ot::Spinel::kSpinelHeaderMaxNumIid); + s_radio.Init(/*skip_rcp_compatibility_check=*/false, /*reset_radio=*/true, &s_spinel_driver, s_radio_caps); #if CONFIG_OPENTHREAD_RADIO_SPINEL_SPI // CONFIG_OPENTHREAD_RADIO_SPINEL_SPI - ESP_RETURN_ON_ERROR(s_spinel_interface.GetSpinelInterface().AfterRadioInit(), OT_PLAT_LOG_TAG, "Spinel interface init falied"); + ESP_RETURN_ON_ERROR(s_spinel_interface.GetSpinelInterface().AfterRadioInit(), OT_PLAT_LOG_TAG, "Spinel interface init failed"); #endif return esp_openthread_platform_workflow_register(&esp_openthread_radio_update, &esp_openthread_radio_process, radiospinel_workflow); @@ -106,7 +120,7 @@ esp_err_t esp_openthread_rcp_init(void) const esp_openthread_radio_config_t *radio_config = esp_openthread_radio_config_get(); #if CONFIG_OPENTHREAD_RADIO_SPINEL_UART ESP_RETURN_ON_ERROR(s_spinel_interface.GetSpinelInterface().Enable(radio_config->radio_uart_config), OT_PLAT_LOG_TAG, - "Spinel interface init falied"); + "Spinel interface init failed"); #else // CONFIG_OPENTHREAD_RADIO_SPINEL_SPI ESP_RETURN_ON_ERROR(s_spinel_interface.GetSpinelInterface().Enable(radio_config->radio_spi_config), OT_PLAT_LOG_TAG, "Spinel interface init failed"); @@ -128,6 +142,7 @@ void esp_openthread_radio_deinit(void) esp_err_t esp_openthread_radio_process(otInstance *instance, const esp_openthread_mainloop_context_t *mainloop) { + s_spinel_driver.Process((void *)mainloop); s_radio.Process((void *)mainloop); return ESP_OK; @@ -211,7 +226,8 @@ int8_t otPlatRadioGetRssi(otInstance *instance) otRadioCaps otPlatRadioGetCaps(otInstance *instance) { - return s_radio.GetRadioCaps(); + s_radio_caps = s_radio.GetRadioCaps(); + return s_radio_caps; } bool otPlatRadioGetPromiscuous(otInstance *instance) @@ -319,7 +335,7 @@ void otPlatRadioSetMacFrameCounter(otInstance *aInstance, uint32_t aMacFrameCoun SuccessOrDie(s_radio.SetMacFrameCounter(aMacFrameCounter, true)); } -#if OPENTHREAD_CONFIG_DIAG_ENABLE +#if CONFIG_OPENTHREAD_DIAG otError otPlatDiagProcess(otInstance *instance, int argc, char *argv[], char *output, size_t output_max_len) { // deliver the platform specific diags commands to radio only ncp. @@ -331,12 +347,19 @@ otError otPlatDiagProcess(otInstance *instance, int argc, char *argv[], char *ou cur += snprintf(cur, static_cast(end - cur), "%s ", argv[index]); } - return s_radio.PlatDiagProcess(cmd, output, output_max_len); + return s_radio.PlatDiagProcess(cmd); +} + +void otPlatDiagSetOutputCallback(otInstance *aInstance, otPlatDiagOutputCallback aCallback, void *aContext) +{ + OT_UNUSED_VARIABLE(aInstance); + OT_UNUSED_VARIABLE(aCallback); + OT_UNUSED_VARIABLE(aContext); } void otPlatDiagModeSet(bool aMode) { - SuccessOrExit(s_radio.PlatDiagProcess(aMode ? "start" : "stop", NULL, 0)); + SuccessOrExit(s_radio.PlatDiagProcess(aMode ? "start" : "stop")); s_radio.SetDiagEnabled(aMode); exit: @@ -353,7 +376,7 @@ void otPlatDiagTxPowerSet(int8_t tx_power) char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE]; snprintf(cmd, sizeof(cmd), "power %d", tx_power); - SuccessOrExit(s_radio.PlatDiagProcess(cmd, NULL, 0)); + SuccessOrExit(s_radio.PlatDiagProcess(cmd)); exit: return; @@ -364,7 +387,7 @@ void otPlatDiagChannelSet(uint8_t channel) char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE]; snprintf(cmd, sizeof(cmd), "channel %d", channel); - SuccessOrExit(s_radio.PlatDiagProcess(cmd, NULL, 0)); + SuccessOrExit(s_radio.PlatDiagProcess(cmd)); exit: return; @@ -378,13 +401,13 @@ void otPlatDiagAlarmCallback(otInstance *instance) { } +#endif // CONFIG_OPENTHREAD_DIAG + const char *otPlatRadioGetVersionString(otInstance *aInstance) { return s_radio.GetVersion(); } -#endif // OPENTHREAD_CONFIG_DIAG_ENABLE - uint64_t otPlatRadioGetNow(otInstance *aInstance) { OT_UNUSED_VARIABLE(aInstance); diff --git a/components/openthread/src/spinel/esp_radio_spinel.cpp b/components/openthread/src/spinel/esp_radio_spinel.cpp index 2b7bcfdf16b..2057433ce43 100644 --- a/components/openthread/src/spinel/esp_radio_spinel.cpp +++ b/components/openthread/src/spinel/esp_radio_spinel.cpp @@ -12,17 +12,27 @@ #include "esp_radio_spinel.h" #include "esp_radio_spinel_adapter.hpp" #include "esp_radio_spinel_uart_interface.hpp" +#include "spinel_driver.hpp" using ot::Spinel::RadioSpinel; using ot::Spinel::RadioSpinelCallbacks; using esp::radio_spinel::SpinelInterfaceAdapter; using esp::radio_spinel::UartSpinelInterface; +using ot::Spinel::SpinelDriver; static SpinelInterfaceAdapter s_spinel_interface[ot::Spinel::kSpinelHeaderMaxNumIid]; static RadioSpinel s_radio[ot::Spinel::kSpinelHeaderMaxNumIid]; static esp_radio_spinel_callbacks_t s_esp_radio_spinel_callbacks[ot::Spinel::kSpinelHeaderMaxNumIid]; +static SpinelDriver s_spinel_driver[ot::Spinel::kSpinelHeaderMaxNumIid]; otRadioFrame s_transmit_frame; +static otRadioCaps s_radio_caps = (OT_RADIO_CAPS_ENERGY_SCAN | + OT_RADIO_CAPS_TRANSMIT_SEC | + OT_RADIO_CAPS_RECEIVE_TIMING | + OT_RADIO_CAPS_TRANSMIT_TIMING | + OT_RADIO_CAPS_ACK_TIMEOUT | + OT_RADIO_CAPS_SLEEP_TO_TX); + static esp_radio_spinel_idx_t get_index_from_instance(otInstance *instance) { // TZ-563: Implement the function to get the esp radio spinel idx from otInstance for multipan rcp @@ -213,7 +223,8 @@ void esp_radio_spinel_init(esp_radio_spinel_idx_t idx) // Multipan is not currently supported iidList[0] = 0; - s_radio[idx].Init(s_spinel_interface[idx].GetSpinelInterface(), /*reset_radio=*/true, /*skip_rcp_compatibility_check=*/false, iidList, ot::Spinel::kSpinelHeaderMaxNumIid); + s_spinel_driver[idx].Init(s_spinel_interface[idx].GetSpinelInterface(), true, iidList, ot::Spinel::kSpinelHeaderMaxNumIid); + s_radio[idx].Init(/*skip_rcp_compatibility_check=*/false, /*reset_radio=*/true, &s_spinel_driver[idx], s_radio_caps); } esp_err_t esp_radio_spinel_enable(esp_radio_spinel_idx_t idx) @@ -309,6 +320,7 @@ void esp_radio_spinel_radio_update(esp_radio_spinel_mainloop_context_t *mainloop void esp_radio_spinel_radio_process(esp_radio_spinel_mainloop_context_t *mainloop_context, esp_radio_spinel_idx_t idx) { + s_spinel_driver[idx].Process((void *)mainloop_context); s_radio[idx].Process(static_cast(mainloop_context)); } @@ -354,3 +366,9 @@ esp_err_t esp_radio_spinel_rcp_version_get(char *running_rcp_version, esp_radio_ strcpy(running_rcp_version, rcp_version); return ESP_OK; } + +esp_err_t esp_radio_spinel_set_rcp_ready(esp_radio_spinel_idx_t idx) +{ + s_spinel_driver[idx].SetCoprocessorReady(); + return ESP_OK; +} diff --git a/components/openthread/src/spinel/esp_radio_spinel_uart_interface.cpp b/components/openthread/src/spinel/esp_radio_spinel_uart_interface.cpp index 56806500590..b01ef694c27 100644 --- a/components/openthread/src/spinel/esp_radio_spinel_uart_interface.cpp +++ b/components/openthread/src/spinel/esp_radio_spinel_uart_interface.cpp @@ -11,6 +11,7 @@ #include "esp_openthread_common_macro.h" #include "openthread/platform/time.h" #include "hdlc.hpp" +#include "core/common/code_utils.hpp" namespace esp { namespace radio_spinel { diff --git a/examples/openthread/ot_rcp/sdkconfig.defaults b/examples/openthread/ot_rcp/sdkconfig.defaults index 002c6f9f305..91439591345 100644 --- a/examples/openthread/ot_rcp/sdkconfig.defaults +++ b/examples/openthread/ot_rcp/sdkconfig.defaults @@ -8,6 +8,11 @@ CONFIG_PARTITION_TABLE_OFFSET=0x8000 CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + # # OpenThread # From d25b1375b579eb00b423ed365e50dace170eeeb2 Mon Sep 17 00:00:00 2001 From: zwl Date: Tue, 16 Jul 2024 10:16:15 +0800 Subject: [PATCH 056/113] fix(bluetooth/controller): fixed alloc memory fail when use uhci on ESP32-C6 and ESP32-H2 --- .../transport/driver/uart/hci_driver_uart_dma.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/components/bt/porting/transport/driver/uart/hci_driver_uart_dma.c b/components/bt/porting/transport/driver/uart/hci_driver_uart_dma.c index a90fb749a11..3111a7cea3c 100644 --- a/components/bt/porting/transport/driver/uart/hci_driver_uart_dma.c +++ b/components/bt/porting/transport/driver/uart/hci_driver_uart_dma.c @@ -423,6 +423,10 @@ int hci_driver_uart_dma_tx_start(esp_bt_hci_tl_callback_t callback, void *arg) uart_env.tx.link_head = lldesc_head; uart_env.tx.callback = callback; uart_env.tx.arg = arg; + /* The DMA interrupt may have been triggered before setting the tx_state, + * So we set it first. + */ + hci_driver_uart_dma_txstate_set(HCI_TRANS_TX_START); gdma_start(s_tx_channel, (intptr_t)(uart_env.tx.link_head)); return 0; } else { @@ -513,6 +517,11 @@ hci_driver_uart_dma_process_task(void *p) while (true) { xSemaphoreTake(s_hci_driver_uart_dma_env.process_sem, portMAX_DELAY); ESP_LOGD(TAG, "task run:%d\n",s_hci_driver_uart_dma_env.hci_tx_state); + /* Process Tx data */ + if (s_hci_driver_uart_dma_env.hci_tx_state == HCI_TRANS_TX_IDLE) { + hci_driver_uart_dma_tx_start(hci_driver_uart_dma_send_callback, (void*)&uart_env); + } + if (s_hci_driver_uart_dma_env.rxinfo_mem_exhausted) { rx_data = (void *)uart_env.rx.link_head->buf; rx_len = uart_env.rx.link_head->length; @@ -553,14 +562,6 @@ hci_driver_uart_dma_process_task(void *p) os_memblock_put(s_hci_driver_uart_dma_env.hci_rx_data_pool, rx_data); } } - - /* Process Tx data */ - if (s_hci_driver_uart_dma_env.hci_tx_state == HCI_TRANS_TX_IDLE) { - ret = hci_driver_uart_dma_tx_start(hci_driver_uart_dma_send_callback, (void*)&uart_env); - if (!ret) { - s_hci_driver_uart_dma_env.hci_tx_state = HCI_TRANS_TX_START; - } - } } } From fdfab41f9526813c5e4923a3e7f99c404226aa9a Mon Sep 17 00:00:00 2001 From: wanlei Date: Wed, 24 Apr 2024 12:26:15 +0800 Subject: [PATCH 057/113] feat(esp32c61): enable c61 ci build --- .gitlab/ci/default-build-test-rules.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/ci/default-build-test-rules.yml b/.gitlab/ci/default-build-test-rules.yml index 2fbd2205212..def222985b3 100644 --- a/.gitlab/ci/default-build-test-rules.yml +++ b/.gitlab/ci/default-build-test-rules.yml @@ -7,8 +7,8 @@ # # This file should ONLY be used during bringup. Should be reset to empty after the bringup process extra_default_build_targets: - - esp32p4 - esp32c5 + - esp32c61 bypass_check_test_targets: - esp32c61 From 3cf069c7d85033c47412f9355753175c80b4dea9 Mon Sep 17 00:00:00 2001 From: wanlei Date: Mon, 29 Apr 2024 19:55:27 +0800 Subject: [PATCH 058/113] feat(esp32c61): disable unsupported build test --- .../app_trace/test_apps/.build-test-rules.yml | 4 +- .../test_apps/.build-test-rules.yml | 4 +- .../test_apps/bootloader_support/README.md | 4 +- .../driver/test_apps/.build-test-rules.yml | 4 +- components/efuse/test_apps/README.md | 4 +- components/esp-tls/test_apps/README.md | 4 +- .../esp_common/test_apps/esp_common/README.md | 4 +- .../test_apps/.build-test-rules.yml | 4 + .../test_apps/.build-test-rules.yml | 6 + .../test_apps/uart_vfs/README.md | 4 +- .../esp_http_client/test_apps/README.md | 4 +- .../esp_http_server/test_apps/README.md | 4 +- .../test_apps/.build-test-rules.yml | 9 +- .../esp_hw_support_unity_tests/README.md | 4 +- .../main/CMakeLists.txt | 5 +- components/esp_mm/test_apps/mm/README.md | 4 +- components/esp_mm/test_apps/mmap_hw/README.md | 4 +- .../test_apps/test_app_esp_netif/README.md | 4 +- .../esp_pm/test_apps/.build-test-rules.yml | 4 +- .../esp_rom/test_apps/rom_tests/README.md | 4 +- components/esp_system/Kconfig | 2 + .../esp_system/test_apps/console/README.md | 4 +- .../esp_system_unity_tests/README.md | 4 +- .../main/CMakeLists.txt | 5 +- components/esp_timer/test_apps/README.md | 4 +- .../esp_timer/test_apps/main/CMakeLists.txt | 9 +- .../fatfs/test_apps/.build-test-rules.yml | 4 +- components/fatfs/test_apps/flash_ro/README.md | 4 +- components/fatfs/test_apps/flash_wl/README.md | 4 +- .../freertos/test_apps/.build-test-rules.yml | 3 + components/hal/test_apps/crypto/README.md | 4 +- .../heap/test_apps/.build-test-rules.yml | 3 + components/lwip/test_apps/README.md | 4 +- components/mbedtls/test_apps/README.md | 4 +- .../newlib/test_apps/.build-test-rules.yml | 4 + .../newlib/test_apps/newlib/main/test_time.c | 2 + components/nvs_flash/test_apps/README.md | 4 +- components/protocomm/test_apps/README.md | 4 +- .../test_apps/pthread_unity_tests/README.md | 4 +- .../esp32c61/include/soc/Kconfig.soc_caps.in | 342 +----------------- .../soc/esp32c61/include/soc/soc_caps.h | 183 +++++----- .../spi_flash/test_apps/.build-test-rules.yml | 11 +- .../test_apps/esp_flash_stress/README.md | 4 +- .../test_apps/flash_encryption/README.md | 6 +- .../spi_flash/test_apps/flash_mmap/README.md | 4 +- components/spiffs/test_apps/README.md | 4 +- components/tcp_transport/test_apps/README.md | 4 +- .../vfs/test_apps/.build-test-rules.yml | 4 +- .../cmake/component_manager/README.md | 4 +- .../build_system/cmake/import_lib/README.md | 4 +- .../cmake/import_prebuilt/README.md | 4 +- .../build_system/cmake/multi_config/README.md | 4 +- examples/build_system/cmake/plugins/README.md | 4 +- examples/build_system/wrappers/README.md | 4 +- .../bootloader_hooks/README.md | 4 +- .../bootloader_override/README.md | 4 +- examples/cxx/exceptions/README.md | 4 +- examples/cxx/pthread/README.md | 4 +- examples/cxx/rtti/README.md | 4 +- examples/ethernet/.build-test-rules.yml | 12 +- examples/network/bridge/README.md | 4 +- examples/network/vlan_support/README.md | 4 +- examples/peripherals/.build-test-rules.yml | 4 +- .../peripherals/gpio/generic_gpio/README.md | 4 +- .../uart/nmea0183_parser/README.md | 4 +- .../uart/uart_async_rxtxtasks/README.md | 4 +- examples/peripherals/uart/uart_echo/README.md | 4 +- .../uart/uart_echo_rs485/README.md | 4 +- .../peripherals/uart/uart_events/README.md | 4 +- examples/peripherals/uart/uart_repl/README.md | 6 +- .../peripherals/uart/uart_select/README.md | 4 +- examples/phy/.build-test-rules.yml | 4 +- examples/protocols/.build-test-rules.yml | 104 +++--- .../http_server/restful_server/README.md | 2 +- examples/protocols/l2tap/README.md | 2 +- .../modbus/tcp/mb_tcp_master/README.md | 3 +- .../protocols/sockets/non_blocking/README.md | 4 +- .../protocols/sockets/tcp_client/README.md | 2 +- examples/security/flash_encryption/README.md | 4 +- examples/storage/.build-test-rules.yml | 8 +- .../storage/custom_flash_driver/README.md | 4 +- examples/storage/fatfsgen/README.md | 4 +- examples/storage/littlefs/README.md | 4 +- examples/storage/nvs_rw_blob/README.md | 4 +- examples/storage/nvs_rw_value/README.md | 4 +- examples/storage/nvs_rw_value_cxx/README.md | 4 +- examples/storage/nvsgen/README.md | 4 +- .../partition_api/partition_find/README.md | 4 +- .../partition_api/partition_mmap/README.md | 4 +- .../partition_api/partition_ops/README.md | 4 +- examples/storage/parttool/README.md | 4 +- examples/storage/semihost_vfs/README.md | 4 +- examples/storage/spiffs/README.md | 4 +- examples/storage/spiffsgen/README.md | 4 +- examples/storage/wear_levelling/README.md | 4 +- examples/system/.build-test-rules.yml | 20 +- examples/system/app_trace_basic/README.md | 4 +- examples/system/app_trace_to_plot/README.md | 4 +- examples/system/base_mac_address/README.md | 6 +- examples/system/console/advanced/README.md | 4 +- examples/system/console/basic/README.md | 4 +- examples/system/efuse/README.md | 4 +- .../esp_event/default_event_loop/README.md | 4 +- .../esp_event/user_event_loops/README.md | 4 +- examples/system/eventfd/README.md | 4 +- .../system/freertos/real_time_stats/README.md | 6 +- examples/system/gdbstub/README.md | 4 +- examples/system/heap_task_tracking/README.md | 4 +- examples/system/ota/otatool/README.md | 4 +- examples/system/pthread/README.md | 4 +- examples/system/rt_mqueue/README.md | 4 +- examples/system/select/README.md | 4 +- examples/system/startup_time/README.md | 4 +- examples/system/task_watchdog/README.md | 4 +- examples/system/unit_test/README.md | 4 +- examples/wifi/itwt/README.md | 4 +- .../build_system/bootloader/README.md | 4 +- .../build_system/ldgen_test/README.md | 4 +- .../protocols/mqtt/build_test/README.md | 4 +- .../protocols/network_tests/README.md | 4 +- tools/test_apps/storage/.build-test-rules.yml | 4 +- .../partition_table_readonly/README.md | 4 +- tools/test_apps/system/.build-test-rules.yml | 4 + .../system/bootloader_sections/README.md | 4 +- tools/test_apps/system/build_test/README.md | 4 +- .../test_apps/system/cxx_build_test/README.md | 4 +- .../test_apps/system/esp_intr_dump/README.md | 4 +- .../test_apps/system/g1_components/README.md | 4 +- tools/test_apps/system/gdb/README.md | 4 +- .../system/gdb_loadable_elf/README.md | 4 +- .../system/gdbstub_runtime/README.md | 4 +- .../system/ram_loadable_app/README.md | 4 +- tools/test_apps/system/startup/README.md | 4 +- 133 files changed, 452 insertions(+), 741 deletions(-) diff --git a/components/app_trace/test_apps/.build-test-rules.yml b/components/app_trace/test_apps/.build-test-rules.yml index 6976e3b934d..cb147bedd6a 100644 --- a/components/app_trace/test_apps/.build-test-rules.yml +++ b/components/app_trace/test_apps/.build-test-rules.yml @@ -8,6 +8,6 @@ components/app_trace/test_apps: - driver - esp_hw_support disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-8705 + reason: not support yet # TODO: [ESP32C5] IDF-8705, [ESP32C61] IDF-9306 diff --git a/components/app_update/test_apps/.build-test-rules.yml b/components/app_update/test_apps/.build-test-rules.yml index d5682ad14d0..4bcee9b3ad6 100644 --- a/components/app_update/test_apps/.build-test-rules.yml +++ b/components/app_update/test_apps/.build-test-rules.yml @@ -2,6 +2,6 @@ components/app_update/test_apps: disable: - - if: IDF_TARGET in ["esp32c5"] + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: target esp32c5 is not supported yet # TODO: [ESP32C5] IDF-8640, IDF-10317 + reason: target esp32c5 is not supported yet # TODO: [ESP32C5] IDF-8640, IDF-10317, [ESP32C61] IDF-9245 diff --git a/components/bootloader_support/test_apps/bootloader_support/README.md b/components/bootloader_support/test_apps/bootloader_support/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/bootloader_support/test_apps/bootloader_support/README.md +++ b/components/bootloader_support/test_apps/bootloader_support/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/driver/test_apps/.build-test-rules.yml b/components/driver/test_apps/.build-test-rules.yml index a90d12dd6e8..cea2987e205 100644 --- a/components/driver/test_apps/.build-test-rules.yml +++ b/components/driver/test_apps/.build-test-rules.yml @@ -30,9 +30,9 @@ components/driver/test_apps/legacy_adc_driver: components/driver/test_apps/legacy_i2c_driver: disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-10307 + reason: not support yet # TODO: [ESP32C5] IDF-10307, [ESP32C61] IDF-9296 disable_test: - if: IDF_TARGET == "esp32p4" temporary: true diff --git a/components/efuse/test_apps/README.md b/components/efuse/test_apps/README.md index bae04212cab..273797f03ae 100644 --- a/components/efuse/test_apps/README.md +++ b/components/efuse/test_apps/README.md @@ -1,3 +1,3 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | Linux | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | ----- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | Linux | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | ----- | diff --git a/components/esp-tls/test_apps/README.md b/components/esp-tls/test_apps/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp-tls/test_apps/README.md +++ b/components/esp-tls/test_apps/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_common/test_apps/esp_common/README.md b/components/esp_common/test_apps/esp_common/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_common/test_apps/esp_common/README.md +++ b/components/esp_common/test_apps/esp_common/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_driver_gpio/test_apps/.build-test-rules.yml b/components/esp_driver_gpio/test_apps/.build-test-rules.yml index 8132f076cca..741de20f56b 100644 --- a/components/esp_driver_gpio/test_apps/.build-test-rules.yml +++ b/components/esp_driver_gpio/test_apps/.build-test-rules.yml @@ -1,6 +1,10 @@ # Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps components/esp_driver_gpio/test_apps: + disable: + - if: IDF_TARGET in ["esp32c61"] + temporary: true + reason: not support yet # TODO: [esp32c61] IDF-9877 disable_test: - if: IDF_TARGET in ["esp32p4"] temporary: true diff --git a/components/esp_driver_uart/test_apps/.build-test-rules.yml b/components/esp_driver_uart/test_apps/.build-test-rules.yml index 403036b446e..c6916dd7d18 100644 --- a/components/esp_driver_uart/test_apps/.build-test-rules.yml +++ b/components/esp_driver_uart/test_apps/.build-test-rules.yml @@ -3,6 +3,9 @@ components/esp_driver_uart/test_apps/rs485: disable: - if: SOC_UART_SUPPORTED != 1 + - if: IDF_TARGET in ["esp32c61"] + temporary: true + reason: IDF-9320 uart driver disable_test: - if: IDF_TARGET != "esp32" temporary: true @@ -14,6 +17,9 @@ components/esp_driver_uart/test_apps/rs485: components/esp_driver_uart/test_apps/uart: disable: - if: SOC_UART_SUPPORTED != 1 + - if: IDF_TARGET in ["esp32c61"] + temporary: true + reason: IDF-9320 uart driver disable_test: - if: IDF_TARGET == "esp32p4" temporary: true diff --git a/components/esp_driver_uart/test_apps/uart_vfs/README.md b/components/esp_driver_uart/test_apps/uart_vfs/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_driver_uart/test_apps/uart_vfs/README.md +++ b/components/esp_driver_uart/test_apps/uart_vfs/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_http_client/test_apps/README.md b/components/esp_http_client/test_apps/README.md index 351f5fdebc7..7b4730e9190 100644 --- a/components/esp_http_client/test_apps/README.md +++ b/components/esp_http_client/test_apps/README.md @@ -1,3 +1,3 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_http_server/test_apps/README.md b/components/esp_http_server/test_apps/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_http_server/test_apps/README.md +++ b/components/esp_http_server/test_apps/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_hw_support/test_apps/.build-test-rules.yml b/components/esp_hw_support/test_apps/.build-test-rules.yml index 09fb7029314..75a3f94f997 100644 --- a/components/esp_hw_support/test_apps/.build-test-rules.yml +++ b/components/esp_hw_support/test_apps/.build-test-rules.yml @@ -5,6 +5,9 @@ components/esp_hw_support/test_apps/dma: - if: IDF_TARGET in ["esp32"] temporary: false reason: No general DMA controller on ESP32 + - if: IDF_TARGET in ["esp32c61"] + temporary: true + reason: not supported [ESP32C61] IDF-9310 depends_filepatterns: - components/esp_hw_support/dma/**/* @@ -32,9 +35,9 @@ components/esp_hw_support/test_apps/rtc_8md256: components/esp_hw_support/test_apps/rtc_clk: disable: - - if: IDF_TARGET in ["esp32c6", "esp32h2", "esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32c6", "esp32h2", "esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: Unsupported on C6 for now. TODO IDF-5645, TODO IDF-7514, TODO C5 IDF-8667 + reason: Unsupported on C6 for now. TODO IDF-5645, TODO IDF-7514, TODO C5 IDF-8667, TODO C61 IDF-9274 components/esp_hw_support/test_apps/rtc_power_modes: enable: @@ -44,4 +47,4 @@ components/esp_hw_support/test_apps/rtc_power_modes: components/esp_hw_support/test_apps/wakeup_tests: disable: - - if: IDF_TARGET in ["esp32c5", "esp32p4", "linux"] + - if: IDF_TARGET in ["esp32c5", "esp32p4", "linux", "esp32c61"] diff --git a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/README.md b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/README.md +++ b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/CMakeLists.txt b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/CMakeLists.txt index 26c3f712a80..5bd97e4951b 100644 --- a/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/CMakeLists.txt +++ b/components/esp_hw_support/test_apps/esp_hw_support_unity_tests/main/CMakeLists.txt @@ -1,7 +1,6 @@ set(srcs "test_app_main.c" "test_dport.c" "test_fp.c" - "test_intr_alloc.c" "test_dport_xt_highint5.S" "test_ds.c" "test_hmac.c" @@ -21,6 +20,10 @@ if(CONFIG_SOC_ETM_SUPPORTED) list(APPEND srcs "test_etm_core.c") endif() +if(CONFIG_SOC_GPTIMER_SUPPORTED) + list(APPEND SRC "test_intr_alloc.c") +endif() + # In order for the cases defined by `TEST_CASE` to be linked into the final elf, # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} diff --git a/components/esp_mm/test_apps/mm/README.md b/components/esp_mm/test_apps/mm/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_mm/test_apps/mm/README.md +++ b/components/esp_mm/test_apps/mm/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_mm/test_apps/mmap_hw/README.md b/components/esp_mm/test_apps/mmap_hw/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_mm/test_apps/mmap_hw/README.md +++ b/components/esp_mm/test_apps/mmap_hw/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_netif/test_apps/test_app_esp_netif/README.md b/components/esp_netif/test_apps/test_app_esp_netif/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_netif/test_apps/test_app_esp_netif/README.md +++ b/components/esp_netif/test_apps/test_app_esp_netif/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_pm/test_apps/.build-test-rules.yml b/components/esp_pm/test_apps/.build-test-rules.yml index 67cf500b6ce..86afa715356 100644 --- a/components/esp_pm/test_apps/.build-test-rules.yml +++ b/components/esp_pm/test_apps/.build-test-rules.yml @@ -5,8 +5,8 @@ components/esp_pm/test_apps: - if: INCLUDE_DEFAULT == 1 disable: - if: CONFIG_NAME == "pm_pd_top_sleep" and IDF_TARGET not in ["esp32c6", "esp32h2", "esp32p4"] - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-8643 + reason: not support yet # TODO: [ESP32C5] IDF-8643, [ESP32C61] IDF-9250 depends_components: - esp_pm diff --git a/components/esp_rom/test_apps/rom_tests/README.md b/components/esp_rom/test_apps/rom_tests/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_rom/test_apps/rom_tests/README.md +++ b/components/esp_rom/test_apps/rom_tests/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_system/Kconfig b/components/esp_system/Kconfig index 870ab3cf0cc..5a64617fed7 100644 --- a/components/esp_system/Kconfig +++ b/components/esp_system/Kconfig @@ -323,6 +323,7 @@ menu "ESP System Settings" default 21 if IDF_TARGET_ESP32C3 default 10 if IDF_TARGET_ESP32C5 default 16 if IDF_TARGET_ESP32C6 + default 5 if IDF_TARGET_ESP32C61 default 37 if IDF_TARGET_ESP32P4 default 24 if IDF_TARGET_ESP32H2 default 43 @@ -342,6 +343,7 @@ menu "ESP System Settings" default 20 if IDF_TARGET_ESP32C3 default 11 if IDF_TARGET_ESP32C5 default 17 if IDF_TARGET_ESP32C6 + default 4 if IDF_TARGET_ESP32C61 default 38 if IDF_TARGET_ESP32P4 default 23 if IDF_TARGET_ESP32H2 default 44 diff --git a/components/esp_system/test_apps/console/README.md b/components/esp_system/test_apps/console/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_system/test_apps/console/README.md +++ b/components/esp_system/test_apps/console/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_system/test_apps/esp_system_unity_tests/README.md b/components/esp_system/test_apps/esp_system_unity_tests/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/esp_system/test_apps/esp_system_unity_tests/README.md +++ b/components/esp_system/test_apps/esp_system_unity_tests/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_system/test_apps/esp_system_unity_tests/main/CMakeLists.txt b/components/esp_system/test_apps/esp_system_unity_tests/main/CMakeLists.txt index 0e7335e2f42..94141c53ab3 100644 --- a/components/esp_system/test_apps/esp_system_unity_tests/main/CMakeLists.txt +++ b/components/esp_system/test_apps/esp_system_unity_tests/main/CMakeLists.txt @@ -8,7 +8,6 @@ set(requires "unity" set(SRC "test_app_main.c" "test_backtrace.c" - "test_delay.c" "test_ipc.c" "test_reset_reason.c" "test_shared_stack_printf.c" @@ -21,6 +20,10 @@ if(CONFIG_SOC_SYSTIMER_SUPPORT_ETM) list(APPEND SRC "test_systick_etm.c") endif() +if(CONFIG_SOC_GPTIMER_SUPPORTED) + list(APPEND SRC "test_delay.c") +endif() + if(CONFIG_ESP_IPC_ISR_ENABLE) list(APPEND SRC "test_ipc_isr.c") if(CONFIG_IDF_TARGET_ARCH_XTENSA) diff --git a/components/esp_timer/test_apps/README.md b/components/esp_timer/test_apps/README.md index 351f5fdebc7..7b4730e9190 100644 --- a/components/esp_timer/test_apps/README.md +++ b/components/esp_timer/test_apps/README.md @@ -1,3 +1,3 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_timer/test_apps/main/CMakeLists.txt b/components/esp_timer/test_apps/main/CMakeLists.txt index 15fc56ac952..c89a9424fc2 100644 --- a/components/esp_timer/test_apps/main/CMakeLists.txt +++ b/components/esp_timer/test_apps/main/CMakeLists.txt @@ -1,4 +1,7 @@ -set(srcs "test_app_main.c" "test_esp_timer.c" "test_ets_timer.c") +set(srcs + "test_app_main.c" + "test_ets_timer.c" +) if(CONFIG_SOC_LIGHT_SLEEP_SUPPORTED) list(APPEND srcs "test_esp_timer_light_sleep.c") @@ -8,6 +11,10 @@ if(CONFIG_SOC_SYSTIMER_SUPPORT_ETM) list(APPEND srcs "test_esp_timer_etm.c") endif() +if(CONFIG_SOC_GPTIMER_SUPPORTED) + list(APPEND srcs "test_esp_timer.c") +endif() + idf_component_register(SRCS ${srcs} PRIV_INCLUDE_DIRS "../../private_include" PRIV_REQUIRES cmock test_utils esp_timer spi_flash esp_psram esp_driver_gpio diff --git a/components/fatfs/test_apps/.build-test-rules.yml b/components/fatfs/test_apps/.build-test-rules.yml index 25c58d1f479..5aae749df65 100644 --- a/components/fatfs/test_apps/.build-test-rules.yml +++ b/components/fatfs/test_apps/.build-test-rules.yml @@ -24,9 +24,9 @@ components/fatfs/test_apps/flash_wl: components/fatfs/test_apps/sdcard: disable: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: target esp32p4, esp32c5 is not supported yet # TODO: [ESP32P4] IDF-7501 [ESP32C5] IDF-8704 + reason: target esp32p4, esp32c5 is not supported yet # TODO: [ESP32P4] IDF-7501 [ESP32C5] IDF-8704, [esp32c61] IDF-9305 disable_test: - if: IDF_TARGET not in ["esp32", "esp32c3"] temporary: true diff --git a/components/fatfs/test_apps/flash_ro/README.md b/components/fatfs/test_apps/flash_ro/README.md index 6bf7583055f..4a52ff36d78 100644 --- a/components/fatfs/test_apps/flash_ro/README.md +++ b/components/fatfs/test_apps/flash_ro/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | This test app runs a few FATFS test cases in a read-only FAT partition. diff --git a/components/fatfs/test_apps/flash_wl/README.md b/components/fatfs/test_apps/flash_wl/README.md index e7a249990cf..98a0aeec71a 100644 --- a/components/fatfs/test_apps/flash_wl/README.md +++ b/components/fatfs/test_apps/flash_wl/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | This test app runs a few FATFS test cases in a wear levelling FAT partition. diff --git a/components/freertos/test_apps/.build-test-rules.yml b/components/freertos/test_apps/.build-test-rules.yml index 44a3a7d585e..369f14081df 100644 --- a/components/freertos/test_apps/.build-test-rules.yml +++ b/components/freertos/test_apps/.build-test-rules.yml @@ -5,6 +5,9 @@ components/freertos/test_apps/freertos: - if: CONFIG_NAME == "smp" and IDF_TARGET == "esp32p4" temporary: true reason: target(s) not supported yet + - if: IDF_TARGET in ["esp32c61"] + temporary: true + reason: target(s) not supported yet # TODO: [esp32c61] IDF-9280 disable_test: - if: CONFIG_NAME == "smp" and IDF_TARGET == "esp32c5" temporary: true diff --git a/components/hal/test_apps/crypto/README.md b/components/hal/test_apps/crypto/README.md index 21c9f846185..4e2c6f4f57a 100644 --- a/components/hal/test_apps/crypto/README.md +++ b/components/hal/test_apps/crypto/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | ## Crypto peripherals test diff --git a/components/heap/test_apps/.build-test-rules.yml b/components/heap/test_apps/.build-test-rules.yml index 1e3b8ecd8cf..ca893a4ba41 100644 --- a/components/heap/test_apps/.build-test-rules.yml +++ b/components/heap/test_apps/.build-test-rules.yml @@ -3,6 +3,9 @@ components/heap/test_apps/heap_tests: disable: - if: IDF_TARGET == "linux" + - if: IDF_TARGET in ["esp32c61"] + temporary: true + reason: not support yet # TODO: [esp32c61] IDF-9858 - if: CONFIG_NAME == "psram" and SOC_SPIRAM_SUPPORTED != 1 - if: CONFIG_NAME == "psram_all_ext" and SOC_SPIRAM_SUPPORTED != 1 # These 3 configs are build only for non-nightly, buildig for a single target is sufficient diff --git a/components/lwip/test_apps/README.md b/components/lwip/test_apps/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/lwip/test_apps/README.md +++ b/components/lwip/test_apps/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/mbedtls/test_apps/README.md b/components/mbedtls/test_apps/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/mbedtls/test_apps/README.md +++ b/components/mbedtls/test_apps/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/newlib/test_apps/.build-test-rules.yml b/components/newlib/test_apps/.build-test-rules.yml index 8383b02ebce..bbd175f8a1e 100644 --- a/components/newlib/test_apps/.build-test-rules.yml +++ b/components/newlib/test_apps/.build-test-rules.yml @@ -1,3 +1,7 @@ # Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps components/newlib/test_apps/newlib: + disable: + - if: IDF_TARGET in ["esp32c61"] + temporary: true + reason: not supported yet # TODO: [esp32c61] IDF-9284 diff --git a/components/newlib/test_apps/newlib/main/test_time.c b/components/newlib/test_apps/newlib/main/test_time.c index 584b6588802..3c8929a6501 100644 --- a/components/newlib/test_apps/newlib/main/test_time.c +++ b/components/newlib/test_apps/newlib/main/test_time.c @@ -39,6 +39,8 @@ #include "esp32c2/rtc.h" #elif CONFIG_IDF_TARGET_ESP32C6 #include "esp32c6/rtc.h" +#elif CONFIG_IDF_TARGET_ESP32C61 +#include "esp32c61/rtc.h" #elif CONFIG_IDF_TARGET_ESP32H2 #include "esp32h2/rtc.h" #elif CONFIG_IDF_TARGET_ESP32P4 diff --git a/components/nvs_flash/test_apps/README.md b/components/nvs_flash/test_apps/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/nvs_flash/test_apps/README.md +++ b/components/nvs_flash/test_apps/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/protocomm/test_apps/README.md b/components/protocomm/test_apps/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/protocomm/test_apps/README.md +++ b/components/protocomm/test_apps/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/pthread/test_apps/pthread_unity_tests/README.md b/components/pthread/test_apps/pthread_unity_tests/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/pthread/test_apps/pthread_unity_tests/README.md +++ b/components/pthread/test_apps/pthread_unity_tests/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in index 43920c58115..0cb5341d2f4 100644 --- a/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in @@ -219,138 +219,14 @@ config SOC_DEDIC_PERIPH_ALWAYS_ENABLE bool default y -config SOC_I2C_NUM - int - default 1 - -config SOC_HP_I2C_NUM - int - default 1 - -config SOC_I2C_FIFO_LEN - int - default 32 - -config SOC_I2C_CMD_REG_NUM - int - default 8 - -config SOC_I2C_SUPPORT_SLAVE - bool - default y - -config SOC_I2C_SUPPORT_HW_FSM_RST - bool - default y - -config SOC_I2C_SUPPORT_HW_CLR_BUS - bool - default y - -config SOC_I2C_SUPPORT_XTAL - bool - default y - -config SOC_I2C_SUPPORT_RTC - bool - default y - -config SOC_I2C_SUPPORT_10BIT_ADDR - bool - default y - -config SOC_I2C_SLAVE_SUPPORT_BROADCAST - bool - default y - -config SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE - bool - default y - -config SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS - bool - default y - -config SOC_I2C_SLAVE_SUPPORT_SLAVE_UNMATCH - bool - default y - -config SOC_LP_I2C_NUM - int - default 1 - -config SOC_LP_I2C_FIFO_LEN - int - default 16 - -config SOC_I2S_NUM - int - default 1 - -config SOC_I2S_HW_VERSION_2 - bool - default y - -config SOC_I2S_SUPPORTS_XTAL - bool - default y - -config SOC_I2S_SUPPORTS_PLL_F160M - bool - default y - -config SOC_I2S_SUPPORTS_PCM - bool - default y - -config SOC_I2S_SUPPORTS_PDM - bool - default y - -config SOC_I2S_SUPPORTS_PDM_TX - bool - default y - -config SOC_I2S_PDM_MAX_TX_LINES - int - default 2 - -config SOC_I2S_SUPPORTS_TDM - bool - default y - config SOC_LEDC_SUPPORT_PLL_DIV_CLOCK bool default y -config SOC_LEDC_SUPPORT_XTAL_CLOCK - bool - default y - config SOC_LEDC_CHANNEL_NUM int default 6 -config SOC_LEDC_TIMER_BIT_WIDTH - int - default 20 - -config SOC_LEDC_SUPPORT_FADE_STOP - bool - default y - -config SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED - bool - default y - -config SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX - int - default 16 - -config SOC_LEDC_FADE_PARAMS_BIT_WIDTH - int - default 10 - config SOC_MMU_PAGE_SIZE_CONFIGURABLE bool default y @@ -387,78 +263,6 @@ config SOC_MPU_REGION_WO_SUPPORTED bool default n -config SOC_PCNT_GROUPS - int - default 1 - -config SOC_PCNT_UNITS_PER_GROUP - int - default 4 - -config SOC_PCNT_CHANNELS_PER_UNIT - int - default 2 - -config SOC_PCNT_THRES_POINT_PER_UNIT - int - default 2 - -config SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE - bool - default y - -config SOC_MCPWM_GROUPS - int - default 1 - -config SOC_MCPWM_TIMERS_PER_GROUP - int - default 3 - -config SOC_MCPWM_OPERATORS_PER_GROUP - int - default 3 - -config SOC_MCPWM_COMPARATORS_PER_OPERATOR - int - default 2 - -config SOC_MCPWM_GENERATORS_PER_OPERATOR - int - default 2 - -config SOC_MCPWM_TRIGGERS_PER_OPERATOR - int - default 2 - -config SOC_MCPWM_GPIO_FAULTS_PER_GROUP - int - default 3 - -config SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP - bool - default y - -config SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER - int - default 3 - -config SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP - int - default 3 - -config SOC_MCPWM_SWSYNC_CAN_PROPAGATE - bool - default y - -config SOC_MCPWM_SUPPORT_ETM - bool - default y - -config SOC_MCPWM_CAPTURE_CLK_FROM_GROUP - bool - default y - config SOC_MPI_MEM_BLOCKS_NUM int default 4 @@ -471,34 +275,6 @@ config SOC_RSA_MAX_BIT_LEN int default 3072 -config SOC_SHA_DMA_MAX_BUFFER_SIZE - int - default 3968 - -config SOC_SHA_SUPPORT_DMA - bool - default y - -config SOC_SHA_SUPPORT_RESUME - bool - default y - -config SOC_SHA_GDMA - bool - default y - -config SOC_SHA_SUPPORT_SHA1 - bool - default y - -config SOC_SHA_SUPPORT_SHA224 - bool - default y - -config SOC_SHA_SUPPORT_SHA256 - bool - default y - config SOC_SPI_PERIPH_NUM int default 2 @@ -507,46 +283,10 @@ config SOC_SPI_MAX_CS_NUM int default 6 -config SOC_SPI_MAXIMUM_BUFFER_SIZE - int - default 64 - -config SOC_SPI_SUPPORT_DDRCLK - bool - default y - -config SOC_SPI_SLAVE_SUPPORT_SEG_TRANS - bool - default y - -config SOC_SPI_SUPPORT_CD_SIG - bool - default y - -config SOC_SPI_SUPPORT_CONTINUOUS_TRANS - bool - default y - -config SOC_SPI_SUPPORT_CLK_XTAL - bool - default y - -config SOC_SPI_SUPPORT_CLK_PLL_F80M - bool - default y - -config SOC_SPI_SUPPORT_CLK_RC_FAST - bool - default y - config SOC_MEMSPI_IS_INDEPENDENT bool default y -config SOC_SPI_MAX_PRE_DIVIDER - int - default 16 - config SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE bool default y @@ -619,10 +359,6 @@ config SOC_SYSTIMER_ALARM_MISS_COMPENSATE bool default y -config SOC_SYSTIMER_SUPPORT_ETM - bool - default y - config SOC_LP_TIMER_BIT_WIDTH_LO int default 32 @@ -639,47 +375,15 @@ config SOC_TIMER_GROUP_TIMERS_PER_GROUP int default 1 -config SOC_TIMER_GROUP_COUNTER_BIT_WIDTH - int - default 54 - -config SOC_TIMER_GROUP_SUPPORT_XTAL - bool - default y - -config SOC_TIMER_GROUP_SUPPORT_RC_FAST - bool - default y - config SOC_TIMER_GROUP_TOTAL_TIMERS int default 2 -config SOC_TIMER_SUPPORT_ETM - bool - default y - -config SOC_MWDT_SUPPORT_XTAL - bool - default y - -config SOC_TWAI_CONTROLLER_NUM - int - default 2 - -config SOC_TWAI_CLK_SUPPORT_XTAL - bool - default y - -config SOC_TWAI_BRP_MIN - int - default 2 - -config SOC_TWAI_BRP_MAX +config SOC_TIMER_GROUP_COUNTER_BIT_WIDTH int - default 32768 + default 54 -config SOC_TWAI_SUPPORTS_RX_STATUS +config SOC_TIMER_GROUP_SUPPORT_XTAL bool default y @@ -879,10 +583,6 @@ config SOC_PM_PAU_LINK_NUM int default 4 -config SOC_CLK_RC_FAST_SUPPORT_CALIBRATION - bool - default y - config SOC_MODEM_CLOCK_IS_INDEPENDENT bool default y @@ -903,42 +603,6 @@ config SOC_RCC_IS_INDEPENDENT bool default y -config SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC - bool - default y - -config SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL - bool - default y - -config SOC_TEMPERATURE_SENSOR_INTR_SUPPORT - bool - default y - -config SOC_WIFI_HW_TSF - bool - default y - -config SOC_WIFI_FTM_SUPPORT - bool - default n - -config SOC_WIFI_GCMP_SUPPORT - bool - default y - -config SOC_WIFI_WAPI_SUPPORT - bool - default y - -config SOC_WIFI_CSI_SUPPORT - bool - default y - -config SOC_WIFI_HE_SUPPORT - bool - default y - config SOC_PHY_COMBO_MODULE bool default y diff --git a/components/soc/esp32c61/include/soc/soc_caps.h b/components/soc/esp32c61/include/soc/soc_caps.h index 1a38385826f..2f1e6eaa622 100644 --- a/components/soc/esp32c61/include/soc/soc_caps.h +++ b/components/soc/esp32c61/include/soc/soc_caps.h @@ -231,50 +231,51 @@ /*-------------------------- I2C CAPS ----------------------------------------*/ // ESP32-C61 has 1 I2C -#define SOC_I2C_NUM (1U) -#define SOC_HP_I2C_NUM (1U) +// #define SOC_I2C_NUM (1U) +// #define SOC_HP_I2C_NUM (1U) -#define SOC_I2C_FIFO_LEN (32) /*!< I2C hardware FIFO depth */ -#define SOC_I2C_CMD_REG_NUM (8) /*!< Number of I2C command registers */ -#define SOC_I2C_SUPPORT_SLAVE (1) +// #define SOC_I2C_FIFO_LEN (32) /*!< I2C hardware FIFO depth */ +// #define SOC_I2C_CMD_REG_NUM (8) /*!< Number of I2C command registers */ +// #define SOC_I2C_SUPPORT_SLAVE (1) -#define SOC_I2C_SUPPORT_HW_FSM_RST (1) -#define SOC_I2C_SUPPORT_HW_CLR_BUS (1) +// #define SOC_I2C_SUPPORT_HW_FSM_RST (1) +// #define SOC_I2C_SUPPORT_HW_CLR_BUS (1) -#define SOC_I2C_SUPPORT_XTAL (1) -#define SOC_I2C_SUPPORT_RTC (1) -#define SOC_I2C_SUPPORT_10BIT_ADDR (1) -#define SOC_I2C_SLAVE_SUPPORT_BROADCAST (1) -#define SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE (1) -#define SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS (1) -#define SOC_I2C_SLAVE_SUPPORT_SLAVE_UNMATCH (1) +// #define SOC_I2C_SUPPORT_XTAL (1) +// #define SOC_I2C_SUPPORT_RTC (1) +// #define SOC_I2C_SUPPORT_10BIT_ADDR (1) +// #define SOC_I2C_SLAVE_SUPPORT_BROADCAST (1) +// #define SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE (1) +// #define SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS (1) +// #define SOC_I2C_SLAVE_SUPPORT_SLAVE_UNMATCH (1) /*-------------------------- LP_I2C CAPS -------------------------------------*/ // ESP32-C61 has 1 LP_I2C -#define SOC_LP_I2C_NUM (1U) +// #define SOC_LP_I2C_NUM (1U) -#define SOC_LP_I2C_FIFO_LEN (16) /*!< LP_I2C hardware FIFO depth */ +// #define SOC_LP_I2C_FIFO_LEN (16) /*!< LP_I2C hardware FIFO depth */ -/*-------------------------- I2S CAPS ----------------------------------------*/ -#define SOC_I2S_NUM (1U) -#define SOC_I2S_HW_VERSION_2 (1) -#define SOC_I2S_SUPPORTS_XTAL (1) -#define SOC_I2S_SUPPORTS_PLL_F160M (1) -#define SOC_I2S_SUPPORTS_PCM (1) -#define SOC_I2S_SUPPORTS_PDM (1) -#define SOC_I2S_SUPPORTS_PDM_TX (1) -#define SOC_I2S_PDM_MAX_TX_LINES (2) -#define SOC_I2S_SUPPORTS_TDM (1) +// /*-------------------------- I2S CAPS ----------------------------------------*/ +// #define SOC_I2S_NUM (1U) +// #define SOC_I2S_HW_VERSION_2 (1) +// #define SOC_I2S_SUPPORTS_XTAL (1) +// #define SOC_I2S_SUPPORTS_PLL_F160M (1) +// #define SOC_I2S_SUPPORTS_PCM (1) +// #define SOC_I2S_SUPPORTS_PDM (1) +// #define SOC_I2S_SUPPORTS_PDM_TX (1) +// #define SOC_I2S_PDM_MAX_TX_LINES (2) +// #define SOC_I2S_SUPPORTS_TDM (1) /*-------------------------- LEDC CAPS ---------------------------------------*/ +//TODO: [ESP32C61] IDF-9291 #define SOC_LEDC_SUPPORT_PLL_DIV_CLOCK (1) -#define SOC_LEDC_SUPPORT_XTAL_CLOCK (1) +// #define SOC_LEDC_SUPPORT_XTAL_CLOCK (1) #define SOC_LEDC_CHANNEL_NUM (6) -#define SOC_LEDC_TIMER_BIT_WIDTH (20) -#define SOC_LEDC_SUPPORT_FADE_STOP (1) -#define SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED (1) -#define SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX (16) -#define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) +// #define SOC_LEDC_TIMER_BIT_WIDTH (20) +// #define SOC_LEDC_SUPPORT_FADE_STOP (1) +// #define SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED (1) +// #define SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX (16) +// #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) /*-------------------------- MMU CAPS ----------------------------------------*/ #define SOC_MMU_PAGE_SIZE_CONFIGURABLE (1) @@ -290,26 +291,26 @@ #define SOC_MPU_REGION_WO_SUPPORTED 0 /*-------------------------- PCNT CAPS ---------------------------------------*/ -#define SOC_PCNT_GROUPS 1U -#define SOC_PCNT_UNITS_PER_GROUP 4 -#define SOC_PCNT_CHANNELS_PER_UNIT 2 -#define SOC_PCNT_THRES_POINT_PER_UNIT 2 -#define SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE 1 +// #define SOC_PCNT_GROUPS 1U +// #define SOC_PCNT_UNITS_PER_GROUP 4 +// #define SOC_PCNT_CHANNELS_PER_UNIT 2 +// #define SOC_PCNT_THRES_POINT_PER_UNIT 2 +// #define SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE 1 /*-------------------------- MCPWM CAPS --------------------------------------*/ -#define SOC_MCPWM_GROUPS (1U) ///< 1 MCPWM groups on the chip (i.e., the number of independent MCPWM peripherals) -#define SOC_MCPWM_TIMERS_PER_GROUP (3) ///< The number of timers that each group has -#define SOC_MCPWM_OPERATORS_PER_GROUP (3) ///< The number of operators that each group has -#define SOC_MCPWM_COMPARATORS_PER_OPERATOR (2) ///< The number of comparators that each operator has -#define SOC_MCPWM_GENERATORS_PER_OPERATOR (2) ///< The number of generators that each operator has -#define SOC_MCPWM_TRIGGERS_PER_OPERATOR (2) ///< The number of triggers that each operator has -#define SOC_MCPWM_GPIO_FAULTS_PER_GROUP (3) ///< The number of fault signal detectors that each group has -#define SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP (1) ///< The number of capture timers that each group has -#define SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER (3) ///< The number of capture channels that each capture timer has -#define SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP (3) ///< The number of GPIO synchros that each group has -#define SOC_MCPWM_SWSYNC_CAN_PROPAGATE (1) ///< Software sync event can be routed to its output -#define SOC_MCPWM_SUPPORT_ETM (1) ///< Support ETM (Event Task Matrix) -#define SOC_MCPWM_CAPTURE_CLK_FROM_GROUP (1) ///< Capture timer shares clock with other PWM timers +// #define SOC_MCPWM_GROUPS (1U) ///< 1 MCPWM groups on the chip (i.e., the number of independent MCPWM peripherals) +// #define SOC_MCPWM_TIMERS_PER_GROUP (3) ///< The number of timers that each group has +// #define SOC_MCPWM_OPERATORS_PER_GROUP (3) ///< The number of operators that each group has +// #define SOC_MCPWM_COMPARATORS_PER_OPERATOR (2) ///< The number of comparators that each operator has +// #define SOC_MCPWM_GENERATORS_PER_OPERATOR (2) ///< The number of generators that each operator has +// #define SOC_MCPWM_TRIGGERS_PER_OPERATOR (2) ///< The number of triggers that each operator has +// #define SOC_MCPWM_GPIO_FAULTS_PER_GROUP (3) ///< The number of fault signal detectors that each group has +// #define SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP (1) ///< The number of capture timers that each group has +// #define SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER (3) ///< The number of capture channels that each capture timer has +// #define SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP (3) ///< The number of GPIO synchros that each group has +// #define SOC_MCPWM_SWSYNC_CAN_PROPAGATE (1) ///< Software sync event can be routed to its output +// #define SOC_MCPWM_SUPPORT_ETM (1) ///< Support ETM (Event Task Matrix) +// #define SOC_MCPWM_CAPTURE_CLK_FROM_GROUP (1) ///< Capture timer shares clock with other PWM timers /*------------------------ USB SERIAL JTAG CAPS ------------------------------*/ // \#define SOC_USB_SERIAL_JTAG_SUPPORT_LIGHT_SLEEP (1) /*!< Support to maintain minimum usb communication during light sleep */ // TODO: IDF-6395 @@ -329,42 +330,42 @@ for SHA this means that the biggest safe amount of bytes is 31 blocks of 128 bytes = 3968 */ -#define SOC_SHA_DMA_MAX_BUFFER_SIZE (3968) -#define SOC_SHA_SUPPORT_DMA (1) +// #define SOC_SHA_DMA_MAX_BUFFER_SIZE (3968) +// #define SOC_SHA_SUPPORT_DMA (1) -/* The SHA engine is able to resume hashing from a user */ -#define SOC_SHA_SUPPORT_RESUME (1) +// /* The SHA engine is able to resume hashing from a user */ +// #define SOC_SHA_SUPPORT_RESUME (1) -/* Has a centralized DMA, which is shared with all peripherals */ -#define SOC_SHA_GDMA (1) +// /* Has a centralized DMA, which is shared with all peripherals */ +// #define SOC_SHA_GDMA (1) -/* Supported HW algorithms */ -#define SOC_SHA_SUPPORT_SHA1 (1) -#define SOC_SHA_SUPPORT_SHA224 (1) -#define SOC_SHA_SUPPORT_SHA256 (1) +// /* Supported HW algorithms */ +// #define SOC_SHA_SUPPORT_SHA1 (1) +// #define SOC_SHA_SUPPORT_SHA224 (1) +// #define SOC_SHA_SUPPORT_SHA256 (1) /*-------------------------- SPI CAPS ----------------------------------------*/ #define SOC_SPI_PERIPH_NUM 2 #define SOC_SPI_PERIPH_CS_NUM(i) 6 #define SOC_SPI_MAX_CS_NUM 6 -#define SOC_SPI_MAXIMUM_BUFFER_SIZE 64 +// #define SOC_SPI_MAX_PRE_DIVIDER 16 +// #define SOC_SPI_MAXIMUM_BUFFER_SIZE 64 -#define SOC_SPI_SUPPORT_DDRCLK 1 -#define SOC_SPI_SLAVE_SUPPORT_SEG_TRANS 1 -#define SOC_SPI_SUPPORT_CD_SIG 1 -#define SOC_SPI_SUPPORT_CONTINUOUS_TRANS 1 +// #define SOC_SPI_SUPPORT_DDRCLK 1 +// #define SOC_SPI_SLAVE_SUPPORT_SEG_TRANS 1 +// #define SOC_SPI_SUPPORT_CD_SIG 1 +// #define SOC_SPI_SUPPORT_CONTINUOUS_TRANS 1 // #define SOC_SPI_SUPPORT_SLAVE_HD_VER2 1 // TODO : [ESP32C61] IDF-9301 -#define SOC_SPI_SUPPORT_CLK_XTAL 1 -#define SOC_SPI_SUPPORT_CLK_PLL_F80M 1 -#define SOC_SPI_SUPPORT_CLK_RC_FAST 1 +// #define SOC_SPI_SUPPORT_CLK_XTAL 1 +// #define SOC_SPI_SUPPORT_CLK_PLL_F80M 1 +// #define SOC_SPI_SUPPORT_CLK_RC_FAST 1 -// Peripheral supports DIO, DOUT, QIO, or QOUT -// host_id = 0 -> SPI0/SPI1, host_id = 1 -> SPI2, +// // Peripheral supports DIO, DOUT, QIO, or QOUT +// // host_id = 0 -> SPI0/SPI1, host_id = 1 -> SPI2, #define SOC_SPI_PERIPH_SUPPORT_MULTILINE_MODE(host_id) ({(void)host_id; 1;}) #define SOC_MEMSPI_IS_INDEPENDENT 1 -#define SOC_SPI_MAX_PRE_DIVIDER 16 /*-------------------------- SPI MEM CAPS ---------------------------------------*/ #define SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE (1) @@ -388,7 +389,7 @@ #define SOC_SYSTIMER_SUPPORT_RC_FAST 1 // Systimer can use RC_FAST clock source #define SOC_SYSTIMER_INT_LEVEL 1 // Systimer peripheral uses level interrupt #define SOC_SYSTIMER_ALARM_MISS_COMPENSATE 1 // Systimer peripheral can generate interrupt immediately if t(target) > t(current) -#define SOC_SYSTIMER_SUPPORT_ETM 1 // Systimer comparator can generate ETM event +// #define SOC_SYSTIMER_SUPPORT_ETM 1 // Systimer comparator can generate ETM event /*-------------------------- LP_TIMER CAPS ----------------------------------*/ #define SOC_LP_TIMER_BIT_WIDTH_LO 32 // Bit width of lp_timer low part @@ -397,21 +398,21 @@ /*--------------------------- TIMER GROUP CAPS ---------------------------------------*/ #define SOC_TIMER_GROUPS (2) #define SOC_TIMER_GROUP_TIMERS_PER_GROUP (1U) +#define SOC_TIMER_GROUP_TOTAL_TIMERS (2) #define SOC_TIMER_GROUP_COUNTER_BIT_WIDTH (54) #define SOC_TIMER_GROUP_SUPPORT_XTAL (1) -#define SOC_TIMER_GROUP_SUPPORT_RC_FAST (1) -#define SOC_TIMER_GROUP_TOTAL_TIMERS (2) -#define SOC_TIMER_SUPPORT_ETM (1) +// #define SOC_TIMER_GROUP_SUPPORT_RC_FAST (1) +// #define SOC_TIMER_SUPPORT_ETM (1) /*--------------------------- WATCHDOG CAPS ---------------------------------------*/ -#define SOC_MWDT_SUPPORT_XTAL (1) +// #define SOC_MWDT_SUPPORT_XTAL (1) /*-------------------------- TWAI CAPS ---------------------------------------*/ -#define SOC_TWAI_CONTROLLER_NUM 2 -#define SOC_TWAI_CLK_SUPPORT_XTAL 1 -#define SOC_TWAI_BRP_MIN 2 -#define SOC_TWAI_BRP_MAX 32768 -#define SOC_TWAI_SUPPORTS_RX_STATUS 1 +// #define SOC_TWAI_CONTROLLER_NUM 2 +// #define SOC_TWAI_CLK_SUPPORT_XTAL 1 +// #define SOC_TWAI_BRP_MIN 2 +// #define SOC_TWAI_BRP_MAX 32768 +// #define SOC_TWAI_SUPPORTS_RX_STATUS 1 /*-------------------------- eFuse CAPS----------------------------*/ @@ -501,7 +502,7 @@ #define SOC_PM_PAU_LINK_NUM (4) /*-------------------------- CLOCK SUBSYSTEM CAPS ----------------------------------------*/ -#define SOC_CLK_RC_FAST_SUPPORT_CALIBRATION (1) +// #define SOC_CLK_RC_FAST_SUPPORT_CALIBRATION (1) //TODO: [ESP32C61] IDF-9249 #define SOC_MODEM_CLOCK_IS_INDEPENDENT (1) #define SOC_CLK_XTAL32K_SUPPORTED (1) /*!< Support to connect an external low frequency crystal */ @@ -511,18 +512,18 @@ #define SOC_RCC_IS_INDEPENDENT 1 /*!< Reset and Clock Control is independent, thanks to the PCR registers */ /*-------------------------- Temperature Sensor CAPS -------------------------------------*/ -#define SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC (1) -#define SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL (1) -#define SOC_TEMPERATURE_SENSOR_INTR_SUPPORT (1) +// #define SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC (1) +// #define SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL (1) +// #define SOC_TEMPERATURE_SENSOR_INTR_SUPPORT (1) /*------------------------------------ WI-FI CAPS ------------------------------------*/ -#define SOC_WIFI_HW_TSF (1) /*!< Support hardware TSF */ -#define SOC_WIFI_FTM_SUPPORT (0) /*!< Support FTM */ -#define SOC_WIFI_GCMP_SUPPORT (1) /*!< Support GCMP(GCMP128 and GCMP256) */ -#define SOC_WIFI_WAPI_SUPPORT (1) /*!< Support WAPI */ -#define SOC_WIFI_CSI_SUPPORT (1) /*!< Support CSI */ +// #define SOC_WIFI_HW_TSF (1) /*!< Support hardware TSF */ +// #define SOC_WIFI_FTM_SUPPORT (0) /*!< Support FTM */ +// #define SOC_WIFI_GCMP_SUPPORT (1) /*!< Support GCMP(GCMP128 and GCMP256) */ +// #define SOC_WIFI_WAPI_SUPPORT (1) /*!< Support WAPI */ +// #define SOC_WIFI_CSI_SUPPORT (1) /*!< Support CSI */ // #define SOC_WIFI_MESH_SUPPORT (1) /*!< Support WIFI MESH */ -#define SOC_WIFI_HE_SUPPORT (1) /*!< Support Wi-Fi 6 */ +// #define SOC_WIFI_HE_SUPPORT (1) /*!< Support Wi-Fi 6 */ /*---------------------------------- Bluetooth CAPS ----------------------------------*/ // \#define SOC_BLE_SUPPORTED (1) /*!< Support Bluetooth Low Energy hardware */ diff --git a/components/spi_flash/test_apps/.build-test-rules.yml b/components/spi_flash/test_apps/.build-test-rules.yml index a580b216a39..e24939c79b0 100644 --- a/components/spi_flash/test_apps/.build-test-rules.yml +++ b/components/spi_flash/test_apps/.build-test-rules.yml @@ -2,9 +2,9 @@ components/spi_flash/test_apps/esp_flash: disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-8715 + reason: not support yet # TODO: [ESP32C5] IDF-8715, [esp32c61] IDF-9314 depends_filepatterns: - components/bootloader_support/bootloader_flash/**/* depends_components: @@ -39,6 +39,9 @@ components/spi_flash/test_apps/flash_mmap: components/spi_flash/test_apps/flash_suspend: disable: - if: SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND != 1 + - if: IDF_TARGET == "esp32c61" + temporary: true + reason: not support yet # TODO: [ESP32C61] IDF-9255 disable_test: - if: IDF_TARGET != "esp32c3" temporary: true @@ -49,9 +52,9 @@ components/spi_flash/test_apps/flash_suspend: components/spi_flash/test_apps/mspi_test: disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-8715 + reason: not support yet # TODO: [ESP32C5] IDF-8715, [esp32c61] IDF9316 - if: CONFIG_NAME == "psram" and SOC_SPIRAM_SUPPORTED != 1 - if: CONFIG_NAME == "xip_psram" and SOC_SPIRAM_SUPPORTED != 1 - if: CONFIG_NAME == "psram" and IDF_TARGET in ["esp32p4"] diff --git a/components/spi_flash/test_apps/esp_flash_stress/README.md b/components/spi_flash/test_apps/esp_flash_stress/README.md index bf47d80ec64..fb8e4a96b8b 100644 --- a/components/spi_flash/test_apps/esp_flash_stress/README.md +++ b/components/spi_flash/test_apps/esp_flash_stress/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/spi_flash/test_apps/flash_encryption/README.md b/components/spi_flash/test_apps/flash_encryption/README.md index 458eaae0927..d7952e0d44a 100644 --- a/components/spi_flash/test_apps/flash_encryption/README.md +++ b/components/spi_flash/test_apps/flash_encryption/README.md @@ -1,6 +1,6 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | ## Prepare runner -To prepare flash encryption tunner, you can run `encrypt_flash.sh`. Note that doing so will burn efuses. \ No newline at end of file +To prepare flash encryption tunner, you can run `encrypt_flash.sh`. Note that doing so will burn efuses. diff --git a/components/spi_flash/test_apps/flash_mmap/README.md b/components/spi_flash/test_apps/flash_mmap/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/spi_flash/test_apps/flash_mmap/README.md +++ b/components/spi_flash/test_apps/flash_mmap/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/spiffs/test_apps/README.md b/components/spiffs/test_apps/README.md index 16fcfff0ebe..c67bed143cc 100644 --- a/components/spiffs/test_apps/README.md +++ b/components/spiffs/test_apps/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | This is a test app for spiffs component. diff --git a/components/tcp_transport/test_apps/README.md b/components/tcp_transport/test_apps/README.md index 3a502b1f86f..7b96141437e 100644 --- a/components/tcp_transport/test_apps/README.md +++ b/components/tcp_transport/test_apps/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/components/vfs/test_apps/.build-test-rules.yml b/components/vfs/test_apps/.build-test-rules.yml index a9145fd4c37..5a050d00c46 100644 --- a/components/vfs/test_apps/.build-test-rules.yml +++ b/components/vfs/test_apps/.build-test-rules.yml @@ -1,8 +1,8 @@ components/vfs/test_apps: disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not support yet # TODO: [ESP32C5] IDF-8704 + reason: not support yet # TODO: [ESP32C5] IDF-8704, [esp32c61] IDF-9305 disable_test: - if: IDF_TARGET not in ["esp32", "esp32c2", "esp32c3", "esp32c6", "esp32h2", "esp32s3"] temporary: true diff --git a/examples/build_system/cmake/component_manager/README.md b/examples/build_system/cmake/component_manager/README.md index 974a423556b..8d152f35b8d 100644 --- a/examples/build_system/cmake/component_manager/README.md +++ b/examples/build_system/cmake/component_manager/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Using the component manager for downloading dependencies diff --git a/examples/build_system/cmake/import_lib/README.md b/examples/build_system/cmake/import_lib/README.md index 10dc2b05222..8db29368fe6 100644 --- a/examples/build_system/cmake/import_lib/README.md +++ b/examples/build_system/cmake/import_lib/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Import Third-Party CMake Library Example diff --git a/examples/build_system/cmake/import_prebuilt/README.md b/examples/build_system/cmake/import_prebuilt/README.md index a9ec1e4d9a0..1adcadaa4ab 100644 --- a/examples/build_system/cmake/import_prebuilt/README.md +++ b/examples/build_system/cmake/import_prebuilt/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Import Prebuilt Library Example diff --git a/examples/build_system/cmake/multi_config/README.md b/examples/build_system/cmake/multi_config/README.md index fbaa5ff6041..12333e5afa0 100644 --- a/examples/build_system/cmake/multi_config/README.md +++ b/examples/build_system/cmake/multi_config/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Multiple Build Configurations Example diff --git a/examples/build_system/cmake/plugins/README.md b/examples/build_system/cmake/plugins/README.md index bbcceb724ba..331e8e115ea 100644 --- a/examples/build_system/cmake/plugins/README.md +++ b/examples/build_system/cmake/plugins/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Link Time Plugins Registration diff --git a/examples/build_system/wrappers/README.md b/examples/build_system/wrappers/README.md index 41967272940..08b91a4c09e 100644 --- a/examples/build_system/wrappers/README.md +++ b/examples/build_system/wrappers/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Using wrapper to redefine IDF functions diff --git a/examples/custom_bootloader/bootloader_hooks/README.md b/examples/custom_bootloader/bootloader_hooks/README.md index 3ba822f5251..28f704496de 100644 --- a/examples/custom_bootloader/bootloader_hooks/README.md +++ b/examples/custom_bootloader/bootloader_hooks/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Bootloader hooks diff --git a/examples/custom_bootloader/bootloader_override/README.md b/examples/custom_bootloader/bootloader_override/README.md index 03a20611b21..78d15e06b7f 100644 --- a/examples/custom_bootloader/bootloader_override/README.md +++ b/examples/custom_bootloader/bootloader_override/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Bootloader override diff --git a/examples/cxx/exceptions/README.md b/examples/cxx/exceptions/README.md index e6fe8053647..f95a0f95242 100644 --- a/examples/cxx/exceptions/README.md +++ b/examples/cxx/exceptions/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Example: C++ exception handling diff --git a/examples/cxx/pthread/README.md b/examples/cxx/pthread/README.md index 5620cb083f4..73d7429080e 100644 --- a/examples/cxx/pthread/README.md +++ b/examples/cxx/pthread/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # C++ pthread Example diff --git a/examples/cxx/rtti/README.md b/examples/cxx/rtti/README.md index 3d0bb0d36e0..c61170f09ea 100644 --- a/examples/cxx/rtti/README.md +++ b/examples/cxx/rtti/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Example: C++ run-time type info (RTTI) diff --git a/examples/ethernet/.build-test-rules.yml b/examples/ethernet/.build-test-rules.yml index e52a8067320..56f1ebae6ce 100644 --- a/examples/ethernet/.build-test-rules.yml +++ b/examples/ethernet/.build-test-rules.yml @@ -4,9 +4,9 @@ examples/ethernet/basic: enable: - if: INCLUDE_DEFAULT == 1 disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [esp32c61] IDF-9298 disable_test: - if: IDF_TARGET not in ["esp32"] temporary: true @@ -21,9 +21,9 @@ examples/ethernet/basic: examples/ethernet/enc28j60: disable: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: target esp32p4, esp32c5 is not supported yet # TODO: [ESP32P4] IDF-8073 [ESP32C5] IDF-8697 + reason: target esp32p4, esp32c5 is not supported yet # TODO: [ESP32P4] IDF-8073 [ESP32C5] IDF-8697, [esp32c61] IDF-9298 depends_components: - esp_eth - esp_netif @@ -34,9 +34,9 @@ examples/ethernet/enc28j60: examples/ethernet/iperf: disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [esp32c61] IDF-9298 disable_test: - if: IDF_TARGET not in ["esp32"] temporary: true diff --git a/examples/network/bridge/README.md b/examples/network/bridge/README.md index c7910f5cbfa..a3fb3ccab92 100644 --- a/examples/network/bridge/README.md +++ b/examples/network/bridge/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Bridge Example (See the README.md file in the upper level 'examples' directory for more information about examples.) diff --git a/examples/network/vlan_support/README.md b/examples/network/vlan_support/README.md index 051b9f3143c..ee1b820d5f1 100644 --- a/examples/network/vlan_support/README.md +++ b/examples/network/vlan_support/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Ethernet VLAN Support Example diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 15fa7295af1..f7fd70f16ea 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -399,13 +399,13 @@ examples/peripherals/timer_group/gptimer: examples/peripherals/timer_group/gptimer_capture_hc_sr04: disable: - - if: SOC_TIMER_SUPPORT_ETM != 1 + - if: SOC_GPTIMER_SUPPORTED != 1 or SOC_TIMER_SUPPORT_ETM != 1 depends_components: - esp_driver_gptimer examples/peripherals/timer_group/wiegand_interface: disable: - - if: SOC_TIMER_GROUP_TOTAL_TIMERS < 2 + - if: SOC_GPTIMER_SUPPORTED != 1 or SOC_TIMER_GROUP_TOTAL_TIMERS < 2 depends_components: - esp_driver_gptimer diff --git a/examples/peripherals/gpio/generic_gpio/README.md b/examples/peripherals/gpio/generic_gpio/README.md index e6ac34b725c..a25a6bdf7c1 100644 --- a/examples/peripherals/gpio/generic_gpio/README.md +++ b/examples/peripherals/gpio/generic_gpio/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Example: GPIO diff --git a/examples/peripherals/uart/nmea0183_parser/README.md b/examples/peripherals/uart/nmea0183_parser/README.md index b682ed90b4c..746e20af3a2 100644 --- a/examples/peripherals/uart/nmea0183_parser/README.md +++ b/examples/peripherals/uart/nmea0183_parser/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # NMEA Parser Example diff --git a/examples/peripherals/uart/uart_async_rxtxtasks/README.md b/examples/peripherals/uart/uart_async_rxtxtasks/README.md index 1c4e6d5da11..b3933f3d2fb 100644 --- a/examples/peripherals/uart/uart_async_rxtxtasks/README.md +++ b/examples/peripherals/uart/uart_async_rxtxtasks/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # UART Asynchronous Example with Separate Receive and Transfer Tasks diff --git a/examples/peripherals/uart/uart_echo/README.md b/examples/peripherals/uart/uart_echo/README.md index 334856229cb..485a430c3bb 100644 --- a/examples/peripherals/uart/uart_echo/README.md +++ b/examples/peripherals/uart/uart_echo/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # UART Echo Example diff --git a/examples/peripherals/uart/uart_echo_rs485/README.md b/examples/peripherals/uart/uart_echo_rs485/README.md index 3c08e9285bd..fdf84d9caad 100644 --- a/examples/peripherals/uart/uart_echo_rs485/README.md +++ b/examples/peripherals/uart/uart_echo_rs485/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # UART RS485 Echo Example diff --git a/examples/peripherals/uart/uart_events/README.md b/examples/peripherals/uart/uart_events/README.md index e8397f72cae..c802e4a4333 100644 --- a/examples/peripherals/uart/uart_events/README.md +++ b/examples/peripherals/uart/uart_events/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # UART Events Example diff --git a/examples/peripherals/uart/uart_repl/README.md b/examples/peripherals/uart/uart_repl/README.md index a3b5cd4555e..8c6a5353437 100644 --- a/examples/peripherals/uart/uart_repl/README.md +++ b/examples/peripherals/uart/uart_repl/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # UART REPL Example @@ -61,4 +61,4 @@ USB monitoring <------ TX -----------> RX----+ Adapter ``` -If everything goes fine, the output on default UART should be "Result: Success". Else, it should be "Result: Failure". \ No newline at end of file +If everything goes fine, the output on default UART should be "Result: Success". Else, it should be "Result: Failure". diff --git a/examples/peripherals/uart/uart_select/README.md b/examples/peripherals/uart/uart_select/README.md index b0dc2088006..3e1845d165e 100644 --- a/examples/peripherals/uart/uart_select/README.md +++ b/examples/peripherals/uart/uart_select/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # UART Select Example diff --git a/examples/phy/.build-test-rules.yml b/examples/phy/.build-test-rules.yml index 68eea70a324..1072fffc25c 100644 --- a/examples/phy/.build-test-rules.yml +++ b/examples/phy/.build-test-rules.yml @@ -2,9 +2,9 @@ examples/phy/antenna: disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8851 + reason: not supported yet # TODO: [ESP32C5] IDF-8851, [esp32c61] IDF-9859 - if: IDF_TARGET in ["esp32p4", "esp32h2"] reason: not supported examples/phy/cert_test: diff --git a/examples/protocols/.build-test-rules.yml b/examples/protocols/.build-test-rules.yml index 71197480d59..912fd85e41d 100644 --- a/examples/protocols/.build-test-rules.yml +++ b/examples/protocols/.build-test-rules.yml @@ -15,9 +15,9 @@ examples/protocols/esp_http_client: enable: - if: INCLUDE_DEFAULT == 1 or IDF_TARGET == "linux" disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET not in ["esp32", "linux"] depends_filepatterns: @@ -26,9 +26,9 @@ examples/protocols/esp_http_client: examples/protocols/esp_local_ctrl: <<: *default_dependencies disable: - - if: IDF_TARGET in ["esp32h2", "esp32c5"] + - if: IDF_TARGET in ["esp32h2", "esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET not in ["esp32", "esp32c3", "esp32s3"] reason: only test on these targets @@ -39,9 +39,9 @@ examples/protocols/esp_local_ctrl: examples/protocols/http_request: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -49,9 +49,9 @@ examples/protocols/http_request: examples/protocols/http_server: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET not in ["esp32", "esp32c3", "esp32s3"] reason: only test on these targets @@ -61,9 +61,9 @@ examples/protocols/http_server: examples/protocols/http_server/captive_portal: <<: *default_dependencies disable: - - if: IDF_TARGET in ["esp32h2", "esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32h2", "esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on p4 # TODO: IDF-8076 [ESP32C5] IDF-8697 + reason: not supported yet # TODO: IDF-8076 [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -73,18 +73,18 @@ examples/protocols/http_server/captive_portal: examples/protocols/http_server/restful_server: <<: *default_dependencies disable: - - if: IDF_TARGET in ["esp32h2", "esp32c5"] + - if: IDF_TARGET in ["esp32h2", "esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 depends_filepatterns: - components/esp_http_server/**/* examples/protocols/http_server/ws_echo_server: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -96,9 +96,9 @@ examples/protocols/https_mbedtls: enable: - if: INCLUDE_DEFAULT == 1 or IDF_TARGET == "linux" disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -106,9 +106,9 @@ examples/protocols/https_mbedtls: examples/protocols/https_request: <<: *default_dependencies disable: - - if: IDF_TARGET in ["esp32h2", "esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32h2", "esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on h2, p4 and c5 # TODO: IDF-9076 (H2) [ESP32C5] IDF-8697 + reason: not supported on h2, p4 and c5 # TODO: IDF-9076 (H2) [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -116,9 +116,9 @@ examples/protocols/https_request: examples/protocols/https_server/simple: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET not in ["esp32", "esp32c3", "esp32s3"] reason: only test on these targets @@ -129,9 +129,9 @@ examples/protocols/https_server/simple: examples/protocols/https_server/wss_server: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -141,9 +141,9 @@ examples/protocols/https_server/wss_server: examples/protocols/https_x509_bundle: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -153,18 +153,18 @@ examples/protocols/https_x509_bundle: examples/protocols/icmp_echo: <<: *default_dependencies disable: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on p4 and c5 # TODO: [ESP32-C5] IDF-8697 + reason: not supported on p4 and c5 # TODO: [ESP32-C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: SOC_WIFI_SUPPORTED != 1 examples/protocols/l2tap: <<: *default_dependencies disable: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -172,34 +172,34 @@ examples/protocols/l2tap: examples/protocols/modbus: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8697 + reason: not supported yet # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 depends_filepatterns: - examples/protocols/modbus/mb_example_common/**/* examples/protocols/mqtt: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported on c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 depends_filepatterns: - components/mqtt/**/* examples/protocols/mqtt/custom_outbox: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported on c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 examples/protocols/mqtt/ssl: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported on c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -214,9 +214,9 @@ examples/protocols/mqtt/ssl_ds: examples/protocols/mqtt/tcp: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported on c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -224,9 +224,9 @@ examples/protocols/mqtt/tcp: examples/protocols/mqtt/ws: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported on c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -234,9 +234,9 @@ examples/protocols/mqtt/ws: examples/protocols/mqtt/wss: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported on c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -244,9 +244,9 @@ examples/protocols/mqtt/wss: examples/protocols/mqtt5: <<: *default_dependencies disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported on c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: IDF_TARGET != "esp32" reason: only test on esp32 @@ -254,9 +254,9 @@ examples/protocols/mqtt5: examples/protocols/smtp_client: <<: *default_dependencies disable: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 examples/protocols/sntp: <<: *default_dependencies @@ -268,9 +268,9 @@ examples/protocols/sntp: examples/protocols/sockets: <<: *default_dependencies disable: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 disable_test: - if: SOC_WIFI_SUPPORTED != 1 @@ -288,14 +288,14 @@ examples/protocols/sockets/tcp_client: - if: SOC_WIFI_SUPPORTED != 1 # linux target won't work with CONFIG_EXAMPLE_SOCKET_IP_INPUT_STDIN=y disable: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 examples/protocols/static_ip: <<: *default_dependencies disable: - if: IDF_TARGET in ["esp32h2"] - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697 + reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8697, [ESP32C61] IDF-9298 diff --git a/examples/protocols/http_server/restful_server/README.md b/examples/protocols/http_server/restful_server/README.md index e95ba79b99a..bc39fb3bdc7 100644 --- a/examples/protocols/http_server/restful_server/README.md +++ b/examples/protocols/http_server/restful_server/README.md @@ -21,7 +21,7 @@ This example designs several APIs to fetch resources as follows: ### About mDNS -The IP address of an IoT device may vary from time to time, so it’s impracticable to hard code the IP address in the webpage. In this example, we use the `mDNS` to parse the domain name `esp-home.local`, so that we can alway get access to the web server by this URL no matter what the real IP address behind it. See [here](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/protocols/mdns.html) for more information about mDNS. +The IP address of an IoT device may vary from time to time, so it’s impracticable to hard code the IP address in the webpage. In this example, we use the `mDNS` to parse the domain name `esp-home.local`, so that we can always get access to the web server by this URL no matter what the real IP address behind it. See [here](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/protocols/mdns.html) for more information about mDNS. **Notes: mDNS is installed by default on most operating systems or is available as separate package.** diff --git a/examples/protocols/l2tap/README.md b/examples/protocols/l2tap/README.md index b077d71640f..9f7a97afa95 100644 --- a/examples/protocols/l2tap/README.md +++ b/examples/protocols/l2tap/README.md @@ -69,7 +69,7 @@ python3 pytest_example_l2tap_echo.py [] [] * `dest_mac_address` - MAC address of the destination device (the ESP32 board with flashed example). ESP 32 board MAC address is printed by the example so you can find it in monitor output under "Ethernet HW Addr". Broadcast address is used when this parameter is omitted. -* `host_eth_interface` - name of host PC Ethernet device on which the frame is to be transmitted/received. When this parameter is omitted, the script tries to find Ethernet interface automatically. If you need, you can find names of installed Network interfaces by running either of bellow commands on Linux: +* `host_eth_interface` - name of host PC Ethernet device on which the frame is to be transmitted/received. When this parameter is omitted, the script tries to find Ethernet interface automatically. If you need, you can find names of installed Network interfaces by running either of below commands on Linux: ```bash $ ifconfig diff --git a/examples/protocols/modbus/tcp/mb_tcp_master/README.md b/examples/protocols/modbus/tcp/mb_tcp_master/README.md index 7f298e1cae4..14e09abea74 100644 --- a/examples/protocols/modbus/tcp/mb_tcp_master/README.md +++ b/examples/protocols/modbus/tcp/mb_tcp_master/README.md @@ -115,7 +115,7 @@ I (5664) example_connect: - IPv6 address: fe80:0000:0000:0000:bedd:c2ff:fed1:b21 I (5674) uart: ESP_INTR_FLAG_IRAM flag not set while CONFIG_UART_ISR_IN_IRAM is enabled, flag updated I (5684) MASTER_TEST: Leave IP(0) = [192.168.1.21] set by user. I (5694) MASTER_TEST: IP(1) is not set in the table. -I (5694) MASTER_TEST: Configured 1 IP addresse(s). +I (5694) MASTER_TEST: Configured 1 IP address(es). I (5704) MASTER_TEST: Modbus master stack initialized... I (5704) MB_TCP_MASTER_PORT: TCP master stack initialized. I (5724) MB_TCP_MASTER_PORT: Host[IP]: "192.168.1.21"[192.168.1.21] @@ -143,4 +143,3 @@ I (47094) MASTER_TEST: Alarm triggered by cid #7. I (47094) MASTER_TEST: Destroy master... ``` The example reads the characteristics from slave device(s), while alarm is not triggered in the slave device (See the "Example parameters definition"). The output line describes Timestamp, Cid of characteristic, Characteristic name (Units), Characteristic value (Hex data). - diff --git a/examples/protocols/sockets/non_blocking/README.md b/examples/protocols/sockets/non_blocking/README.md index e551d259a7f..d6b1712fa45 100644 --- a/examples/protocols/sockets/non_blocking/README.md +++ b/examples/protocols/sockets/non_blocking/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # TCP non-blocking client and server examples diff --git a/examples/protocols/sockets/tcp_client/README.md b/examples/protocols/sockets/tcp_client/README.md index 59218a487ef..1d0f3b65c43 100644 --- a/examples/protocols/sockets/tcp_client/README.md +++ b/examples/protocols/sockets/tcp_client/README.md @@ -23,7 +23,7 @@ Set following parameters under ```Example Configuration``` Options: * Set `IPV6 Address` in case your chose IP version IPV6 above. * For IPv6 there's an additional option for ```Interface selection```. - * Enter the name of the interface to explicitely establish communication over a specific interface. + * Enter the name of the interface to explicitly establish communication over a specific interface. * On selecting ```Auto``` the example will find the first interface with an IPv6 address and use it. * Set `Port` number that represents remote port the example will connect to. diff --git a/examples/security/flash_encryption/README.md b/examples/security/flash_encryption/README.md index cf4c7364369..866a8fdabae 100644 --- a/examples/security/flash_encryption/README.md +++ b/examples/security/flash_encryption/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Flash Encryption diff --git a/examples/storage/.build-test-rules.yml b/examples/storage/.build-test-rules.yml index e28311bda05..2bdea003dbc 100644 --- a/examples/storage/.build-test-rules.yml +++ b/examples/storage/.build-test-rules.yml @@ -26,9 +26,9 @@ examples/storage/ext_flash_fatfs: - spi_flash - driver disable: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8715 + reason: not supported on p4 and c5 # TODO: [ESP32C5] IDF-8715, [ESP32C61] IDF-9314 disable_test: - if: IDF_TARGET not in ["esp32"] temporary: true @@ -111,9 +111,9 @@ examples/storage/perf_benchmark: - esp_partition - esp_driver_sdmmc disable: - - if: IDF_TARGET == "esp32c5" + - if: IDF_TARGET in ["esp32c5", "esp32c61"] temporary: true - reason: not supported yet # TODO: [ESP32C5] IDF-8704, IDF-10314 + reason: not supported yet # TODO: [ESP32C5] IDF-8704, IDF-10314, [ESP32C61] IDF-9314 disable_test: - if: IDF_TARGET == "esp32p4" and CONFIG_NAME in ["sdmmc_1line", "sdmmc_4line", "sdspi_1line"] temporary: true diff --git a/examples/storage/custom_flash_driver/README.md b/examples/storage/custom_flash_driver/README.md index c936097cb89..aa314093434 100644 --- a/examples/storage/custom_flash_driver/README.md +++ b/examples/storage/custom_flash_driver/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Custom Flash Driver Example diff --git a/examples/storage/fatfsgen/README.md b/examples/storage/fatfsgen/README.md index 29fb29db7fd..2d0164cf27b 100644 --- a/examples/storage/fatfsgen/README.md +++ b/examples/storage/fatfsgen/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # FATFS partition generation example diff --git a/examples/storage/littlefs/README.md b/examples/storage/littlefs/README.md index d8fbb7d5d0b..fed9fec96da 100644 --- a/examples/storage/littlefs/README.md +++ b/examples/storage/littlefs/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # About LittleFS diff --git a/examples/storage/nvs_rw_blob/README.md b/examples/storage/nvs_rw_blob/README.md index bdded9bfc5a..868b1521f08 100644 --- a/examples/storage/nvs_rw_blob/README.md +++ b/examples/storage/nvs_rw_blob/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Non-Volatile Storage (NVS) Read and Write Example diff --git a/examples/storage/nvs_rw_value/README.md b/examples/storage/nvs_rw_value/README.md index 3f5c3ebd5d3..68847e2bbdb 100644 --- a/examples/storage/nvs_rw_value/README.md +++ b/examples/storage/nvs_rw_value/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Non-Volatile Storage (NVS) Read and Write Example diff --git a/examples/storage/nvs_rw_value_cxx/README.md b/examples/storage/nvs_rw_value_cxx/README.md index 5cbf93de814..d4fd7a02747 100644 --- a/examples/storage/nvs_rw_value_cxx/README.md +++ b/examples/storage/nvs_rw_value_cxx/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Non-Volatile Storage (NVS) C++ Read and Write Example diff --git a/examples/storage/nvsgen/README.md b/examples/storage/nvsgen/README.md index 6993f8483c9..b3507d6170f 100644 --- a/examples/storage/nvsgen/README.md +++ b/examples/storage/nvsgen/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # NVS Partition Image Generation on Build Example diff --git a/examples/storage/partition_api/partition_find/README.md b/examples/storage/partition_api/partition_find/README.md index 15fe7c0aab4..e2c096a4151 100644 --- a/examples/storage/partition_api/partition_find/README.md +++ b/examples/storage/partition_api/partition_find/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Finding Partitions Example diff --git a/examples/storage/partition_api/partition_mmap/README.md b/examples/storage/partition_api/partition_mmap/README.md index 85a67b6dd63..06162c6a98f 100644 --- a/examples/storage/partition_api/partition_mmap/README.md +++ b/examples/storage/partition_api/partition_mmap/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Partition Memory Map Example diff --git a/examples/storage/partition_api/partition_ops/README.md b/examples/storage/partition_api/partition_ops/README.md index fd916fc2ea4..ae4b23c3f00 100644 --- a/examples/storage/partition_api/partition_ops/README.md +++ b/examples/storage/partition_api/partition_ops/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Partition Read, Write, Erase Example diff --git a/examples/storage/parttool/README.md b/examples/storage/parttool/README.md index de135fb8926..89434343ed8 100644 --- a/examples/storage/parttool/README.md +++ b/examples/storage/parttool/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Partitions Tool Example diff --git a/examples/storage/semihost_vfs/README.md b/examples/storage/semihost_vfs/README.md index a1b3009a653..0cf77e01fa4 100644 --- a/examples/storage/semihost_vfs/README.md +++ b/examples/storage/semihost_vfs/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Semihosting VFS driver example diff --git a/examples/storage/spiffs/README.md b/examples/storage/spiffs/README.md index 3a233ba5702..455fcd57389 100644 --- a/examples/storage/spiffs/README.md +++ b/examples/storage/spiffs/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # SPIFFS example diff --git a/examples/storage/spiffsgen/README.md b/examples/storage/spiffsgen/README.md index 96a892f78bc..a95598ac4f5 100644 --- a/examples/storage/spiffsgen/README.md +++ b/examples/storage/spiffsgen/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # SPIFFS Image Generation on Build Example diff --git a/examples/storage/wear_levelling/README.md b/examples/storage/wear_levelling/README.md index 5777cc39067..b4158590058 100644 --- a/examples/storage/wear_levelling/README.md +++ b/examples/storage/wear_levelling/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Wear levelling example diff --git a/examples/system/.build-test-rules.yml b/examples/system/.build-test-rules.yml index 4c7dfc8f392..7481a8b4c2b 100644 --- a/examples/system/.build-test-rules.yml +++ b/examples/system/.build-test-rules.yml @@ -39,9 +39,9 @@ examples/system/deep_sleep: examples/system/deep_sleep_wake_stub: disable: - - if: IDF_TARGET in ["esp32c2", "esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32c2", "esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: target(s) is not supported yet # TODO: [ESP32C5] IDF-8638 + reason: target(s) is not supported yet # TODO: [ESP32C5] IDF-8638, [esp32c61] IDF-9245 examples/system/efuse: enable: @@ -141,9 +141,9 @@ examples/system/light_sleep: examples/system/ota/advanced_https_ota: disable: - - if: IDF_TARGET in ["esp32h2", "esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32h2", "esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: target esp32h2, esp32c5 is not supported yet, esp32p4 is not supported with bluedroid/nimble case + reason: target esp32h2, esp32c5 esp32c61 is not supported yet, esp32p4 is not supported with bluedroid/nimble case disable_test: - if: IDF_TARGET not in ["esp32", "esp32c3", "esp32s3"] temporary: true @@ -161,9 +161,9 @@ examples/system/ota/advanced_https_ota: examples/system/ota/native_ota_example: disable: - - if: IDF_TARGET in ["esp32h2", "esp32c5"] + - if: IDF_TARGET in ["esp32h2", "esp32c5", "esp32c61"] temporary: true - reason: target esp32h2, esp32c5 is not supported yet + reason: target esp32h2, esp32c5, esp32c61 is not supported yet disable_test: - if: IDF_TARGET != "esp32" reason: Only esp32 has ethernet runners @@ -184,9 +184,9 @@ examples/system/ota/otatool: examples/system/ota/pre_encrypted_ota: disable: - - if: IDF_TARGET in ["esp32h2", "esp32c5"] + - if: IDF_TARGET in ["esp32h2", "esp32c5", "esp32c61"] temporary: true - reason: target esp32h2, esp32c5 is not supported yet + reason: target esp32h2, esp32c5, esp32c61 is not supported yet disable_test: - if: IDF_TARGET != "esp32" temporary: true @@ -202,9 +202,9 @@ examples/system/ota/pre_encrypted_ota: examples/system/ota/simple_ota_example: disable: - - if: IDF_TARGET in ["esp32h2", "esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32h2", "esp32p4", "esp32c5", "esp32c61"] temporary: true - reason: target esp32h2, esp32p4, esp32c5 is not supported yet + reason: target esp32h2, esp32p4, esp32c5 esp32c61 is not supported yet - if: CONFIG_NAME == "spiram" and SOC_SPIRAM_SUPPORTED != 1 disable_test: - if: IDF_TARGET not in ["esp32", "esp32c3", "esp32s3"] diff --git a/examples/system/app_trace_basic/README.md b/examples/system/app_trace_basic/README.md index 2da31cd059a..b02e44b350c 100644 --- a/examples/system/app_trace_basic/README.md +++ b/examples/system/app_trace_basic/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C61 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | --------- | -------- | -------- | # Application Level Tracing Example (Basic) diff --git a/examples/system/app_trace_to_plot/README.md b/examples/system/app_trace_to_plot/README.md index 3ff84736518..5c9b702563e 100644 --- a/examples/system/app_trace_to_plot/README.md +++ b/examples/system/app_trace_to_plot/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Application Level Tracing Example (Plotting) diff --git a/examples/system/base_mac_address/README.md b/examples/system/base_mac_address/README.md index 1aa4f2dae8b..51e012f3487 100644 --- a/examples/system/base_mac_address/README.md +++ b/examples/system/base_mac_address/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Base MAC Address @@ -93,4 +93,4 @@ E (288) system_api: Base MAC address from BLK3 of EFUSE version error, version = E (298) BASE_MAC: Failed to get base MAC address from EFUSE BLK3. (ESP_ERR_INVALID_VERSION) I (308) BASE_MAC: Defaulting to base MAC address in BLK0 of EFUSE I (308) BASE_MAC: Base MAC Address read from EFUSE BLK0 -``` \ No newline at end of file +``` diff --git a/examples/system/console/advanced/README.md b/examples/system/console/advanced/README.md index a86268b3c76..43ca13ffc4f 100644 --- a/examples/system/console/advanced/README.md +++ b/examples/system/console/advanced/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Console Example diff --git a/examples/system/console/basic/README.md b/examples/system/console/basic/README.md index 45c86f4cc18..42387e5c625 100644 --- a/examples/system/console/basic/README.md +++ b/examples/system/console/basic/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Basic Console Example (`esp_console_repl`) diff --git a/examples/system/efuse/README.md b/examples/system/efuse/README.md index 67564da1dcd..475c9826b24 100644 --- a/examples/system/efuse/README.md +++ b/examples/system/efuse/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | Linux | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | ----- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | Linux | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | ----- | # eFuse Example diff --git a/examples/system/esp_event/default_event_loop/README.md b/examples/system/esp_event/default_event_loop/README.md index 3f8df792352..6bce5b8a8fb 100644 --- a/examples/system/esp_event/default_event_loop/README.md +++ b/examples/system/esp_event/default_event_loop/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Default Event Loop Example diff --git a/examples/system/esp_event/user_event_loops/README.md b/examples/system/esp_event/user_event_loops/README.md index 8d71fbbea3e..55f04df47f4 100644 --- a/examples/system/esp_event/user_event_loops/README.md +++ b/examples/system/esp_event/user_event_loops/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # User Event Loops Example diff --git a/examples/system/eventfd/README.md b/examples/system/eventfd/README.md index 439388a6c56..f3367fa4b64 100644 --- a/examples/system/eventfd/README.md +++ b/examples/system/eventfd/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # eventfd example diff --git a/examples/system/freertos/real_time_stats/README.md b/examples/system/freertos/real_time_stats/README.md index 9e66114458b..9c1bc29c1d6 100644 --- a/examples/system/freertos/real_time_stats/README.md +++ b/examples/system/freertos/real_time_stats/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # FreeRTOS Real Time Stats Example @@ -72,4 +72,4 @@ During the examples initialization process, multiple `spin` tasks are created. T ### Understanding the stats -From the log output, it can be seen that the spin tasks consume nearly an equal amount of time over the specified stats collection period of `print_real_time_stats()`. The real time stats also display the CPU time consumption of other tasks created by default in ESP-IDF (e.g. `IDLE` and `ipc` tasks). \ No newline at end of file +From the log output, it can be seen that the spin tasks consume nearly an equal amount of time over the specified stats collection period of `print_real_time_stats()`. The real time stats also display the CPU time consumption of other tasks created by default in ESP-IDF (e.g. `IDLE` and `ipc` tasks). diff --git a/examples/system/gdbstub/README.md b/examples/system/gdbstub/README.md index 3f105f5c183..2236d75a241 100644 --- a/examples/system/gdbstub/README.md +++ b/examples/system/gdbstub/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | # GDBstub example diff --git a/examples/system/heap_task_tracking/README.md b/examples/system/heap_task_tracking/README.md index 3be6907e82d..7f8cb912831 100644 --- a/examples/system/heap_task_tracking/README.md +++ b/examples/system/heap_task_tracking/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Heap Task Tracking Example diff --git a/examples/system/ota/otatool/README.md b/examples/system/ota/otatool/README.md index 8ee6bbc5861..31f16d86f93 100644 --- a/examples/system/ota/otatool/README.md +++ b/examples/system/ota/otatool/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-C61 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | # OTA Tool Example diff --git a/examples/system/pthread/README.md b/examples/system/pthread/README.md index f95b3c83cbf..f5ac440ac42 100644 --- a/examples/system/pthread/README.md +++ b/examples/system/pthread/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Pthread Example diff --git a/examples/system/rt_mqueue/README.md b/examples/system/rt_mqueue/README.md index f5400e96742..d0924d71f11 100644 --- a/examples/system/rt_mqueue/README.md +++ b/examples/system/rt_mqueue/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # POSIX Message Queue Example diff --git a/examples/system/select/README.md b/examples/system/select/README.md index 56463959355..5b2e3308f82 100644 --- a/examples/system/select/README.md +++ b/examples/system/select/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Synchronous I/O multiplexing example diff --git a/examples/system/startup_time/README.md b/examples/system/startup_time/README.md index 86b9afc3e12..74622582ea9 100644 --- a/examples/system/startup_time/README.md +++ b/examples/system/startup_time/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Startup Time Example diff --git a/examples/system/task_watchdog/README.md b/examples/system/task_watchdog/README.md index e8d1c73bf61..acdbbcdb372 100644 --- a/examples/system/task_watchdog/README.md +++ b/examples/system/task_watchdog/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Task Watchdog Example diff --git a/examples/system/unit_test/README.md b/examples/system/unit_test/README.md index 4e7a0a5697b..e5298981764 100644 --- a/examples/system/unit_test/README.md +++ b/examples/system/unit_test/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Unit Testing diff --git a/examples/wifi/itwt/README.md b/examples/wifi/itwt/README.md index a4a16a2528c..265fe586aff 100644 --- a/examples/wifi/itwt/README.md +++ b/examples/wifi/itwt/README.md @@ -8,7 +8,7 @@ This example shows how to use itwt of wifi. Itwt only works in station mode. And AP needs to support the capability of itwt. -Itwt can works under differnet power save mode. +Itwt can works under different power save mode. ### Modem sleep (supported) This is default mode. Under this mode, can support console command "itwt, probe" to config itwt. @@ -17,7 +17,7 @@ This is default mode. Under this mode, can support console command "itwt, probe" * probe: this command will send a probe request to update tsf time with ap ### Light Sleep (will support) -Need system suport light sleep. Console command will not support in this mode. +Need system support light sleep. Console command will not support in this mode. ### Typical current consumption with Itwt enabled diff --git a/tools/test_apps/build_system/bootloader/README.md b/tools/test_apps/build_system/bootloader/README.md index 3a502b1f86f..7b96141437e 100644 --- a/tools/test_apps/build_system/bootloader/README.md +++ b/tools/test_apps/build_system/bootloader/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/tools/test_apps/build_system/ldgen_test/README.md b/tools/test_apps/build_system/ldgen_test/README.md index b24e140f405..a4db75e2fd7 100644 --- a/tools/test_apps/build_system/ldgen_test/README.md +++ b/tools/test_apps/build_system/ldgen_test/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | Runs a build test to check ldgen places libraries, objects and symbols correctly as specified in the linker fragments. Specifically, this app diff --git a/tools/test_apps/protocols/mqtt/build_test/README.md b/tools/test_apps/protocols/mqtt/build_test/README.md index 23dc2cfbbf9..4f186a5e86b 100644 --- a/tools/test_apps/protocols/mqtt/build_test/README.md +++ b/tools/test_apps/protocols/mqtt/build_test/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Build only test for C++ diff --git a/tools/test_apps/protocols/network_tests/README.md b/tools/test_apps/protocols/network_tests/README.md index 8da7308af96..fb994aaea73 100644 --- a/tools/test_apps/protocols/network_tests/README.md +++ b/tools/test_apps/protocols/network_tests/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Intel net test suite for LwIP network stack diff --git a/tools/test_apps/storage/.build-test-rules.yml b/tools/test_apps/storage/.build-test-rules.yml index b82d3253e82..d27c0ab8933 100644 --- a/tools/test_apps/storage/.build-test-rules.yml +++ b/tools/test_apps/storage/.build-test-rules.yml @@ -19,9 +19,9 @@ tools/test_apps/storage/partition_table_readonly: tools/test_apps/storage/sdmmc_console: disable: - - if: IDF_TARGET in ["esp32h2"] + - if: IDF_TARGET in ["esp32h2", "esp32c61"] temporary: true - reason: Console component not supported on H2 yet + reason: Console component not supported on H2 yet, TODO [ESP32C61] IDF-9305 sdspi disable_test: - if: IDF_TARGET not in ["esp32", "esp32s2", "esp32c3"] temporary: true diff --git a/tools/test_apps/storage/partition_table_readonly/README.md b/tools/test_apps/storage/partition_table_readonly/README.md index 3a502b1f86f..7b96141437e 100644 --- a/tools/test_apps/storage/partition_table_readonly/README.md +++ b/tools/test_apps/storage/partition_table_readonly/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/tools/test_apps/system/.build-test-rules.yml b/tools/test_apps/system/.build-test-rules.yml index 4d704049da2..b11db03fab1 100644 --- a/tools/test_apps/system/.build-test-rules.yml +++ b/tools/test_apps/system/.build-test-rules.yml @@ -72,6 +72,10 @@ tools/test_apps/system/no_embedded_paths: tools/test_apps/system/panic: enable: - if: INCLUDE_DEFAULT == 1 or IDF_TARGET in ["esp32p4"] # preview targets + disable: + - if: IDF_TARGET == "esp32c61" + temporary: true + reason: not supported # TODO: [ESP32c61] IDF-9268 tools/test_apps/system/ram_loadable_app: disable: diff --git a/tools/test_apps/system/bootloader_sections/README.md b/tools/test_apps/system/bootloader_sections/README.md index 3a502b1f86f..7b96141437e 100644 --- a/tools/test_apps/system/bootloader_sections/README.md +++ b/tools/test_apps/system/bootloader_sections/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/tools/test_apps/system/build_test/README.md b/tools/test_apps/system/build_test/README.md index 37dba5c140e..1aef9a5f7a9 100644 --- a/tools/test_apps/system/build_test/README.md +++ b/tools/test_apps/system/build_test/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | This project is for testing if the application can be built with a particular sdkconfig setting. diff --git a/tools/test_apps/system/cxx_build_test/README.md b/tools/test_apps/system/cxx_build_test/README.md index 9f10fd995c5..371ab304bfd 100644 --- a/tools/test_apps/system/cxx_build_test/README.md +++ b/tools/test_apps/system/cxx_build_test/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # C++ build test diff --git a/tools/test_apps/system/esp_intr_dump/README.md b/tools/test_apps/system/esp_intr_dump/README.md index de5462f0939..2edf948c68f 100644 --- a/tools/test_apps/system/esp_intr_dump/README.md +++ b/tools/test_apps/system/esp_intr_dump/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Test for esp_intr_dump diff --git a/tools/test_apps/system/g1_components/README.md b/tools/test_apps/system/g1_components/README.md index a57b58b0360..0f9105bc2d2 100644 --- a/tools/test_apps/system/g1_components/README.md +++ b/tools/test_apps/system/g1_components/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # "G1"-components-only app diff --git a/tools/test_apps/system/gdb/README.md b/tools/test_apps/system/gdb/README.md index d137dba8190..4a5c3dcdb19 100644 --- a/tools/test_apps/system/gdb/README.md +++ b/tools/test_apps/system/gdb/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # IDF GDB test application diff --git a/tools/test_apps/system/gdb_loadable_elf/README.md b/tools/test_apps/system/gdb_loadable_elf/README.md index d29850b90a1..3296c7a65d3 100644 --- a/tools/test_apps/system/gdb_loadable_elf/README.md +++ b/tools/test_apps/system/gdb_loadable_elf/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C61 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | # Loadable ELF test application diff --git a/tools/test_apps/system/gdbstub_runtime/README.md b/tools/test_apps/system/gdbstub_runtime/README.md index 3a502b1f86f..7b96141437e 100644 --- a/tools/test_apps/system/gdbstub_runtime/README.md +++ b/tools/test_apps/system/gdbstub_runtime/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | diff --git a/tools/test_apps/system/ram_loadable_app/README.md b/tools/test_apps/system/ram_loadable_app/README.md index 76930508c72..d284a950d86 100644 --- a/tools/test_apps/system/ram_loadable_app/README.md +++ b/tools/test_apps/system/ram_loadable_app/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # RAM loadable app Example diff --git a/tools/test_apps/system/startup/README.md b/tools/test_apps/system/startup/README.md index 3a502b1f86f..7b96141437e 100644 --- a/tools/test_apps/system/startup/README.md +++ b/tools/test_apps/system/startup/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | From 156c1c0891c411d98a6a2db9cf729b4c1baa0469 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Tue, 16 Jul 2024 16:56:36 +0800 Subject: [PATCH 059/113] fix(etm): fix the outdated etm source on c5 --- .../soc/esp32c5/include/soc/soc_etm_source.h | 112 +++++++++--------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/components/soc/esp32c5/include/soc/soc_etm_source.h b/components/soc/esp32c5/include/soc/soc_etm_source.h index 32470c56fb8..d3d24514300 100644 --- a/components/soc/esp32c5/include/soc/soc_etm_source.h +++ b/components/soc/esp32c5/include/soc/soc_etm_source.h @@ -30,8 +30,8 @@ #define GPIO_EVT_CH5_ANY_EDGE 22 #define GPIO_EVT_CH6_ANY_EDGE 23 #define GPIO_EVT_CH7_ANY_EDGE 24 -#define GPIO_EVT_ZERO_DET_POS 25 -#define GPIO_EVT_ZERO_DET_NEG 26 +#define GPIO_EVT_ZERO_DET_POS0 25 +#define GPIO_EVT_ZERO_DET_NEG0 26 #define LEDC_EVT_DUTY_CHNG_END_CH0 27 #define LEDC_EVT_DUTY_CHNG_END_CH1 28 #define LEDC_EVT_DUTY_CHNG_END_CH2 29 @@ -111,44 +111,44 @@ #define REGDMA_EVT_ERR1 103 #define REGDMA_EVT_ERR2 104 #define REGDMA_EVT_ERR3 105 -#define GDMA_EVT_IN_DONE_CH0 106 -#define GDMA_EVT_IN_DONE_CH1 107 -#define GDMA_EVT_IN_DONE_CH2 108 -#define GDMA_EVT_IN_SUC_EOF_CH0 109 -#define GDMA_EVT_IN_SUC_EOF_CH1 110 -#define GDMA_EVT_IN_SUC_EOF_CH2 111 -#define GDMA_EVT_IN_FIFO_EMPTY_CH0 112 -#define GDMA_EVT_IN_FIFO_EMPTY_CH1 113 -#define GDMA_EVT_IN_FIFO_EMPTY_CH2 114 -#define GDMA_EVT_IN_FIFO_FULL_CH0 115 -#define GDMA_EVT_IN_FIFO_FULL_CH1 116 -#define GDMA_EVT_IN_FIFO_FULL_CH2 117 -#define GDMA_EVT_OUT_DONE_CH0 118 -#define GDMA_EVT_OUT_DONE_CH1 119 -#define GDMA_EVT_OUT_DONE_CH2 120 -#define GDMA_EVT_OUT_EOF_CH0 121 -#define GDMA_EVT_OUT_EOF_CH1 122 -#define GDMA_EVT_OUT_EOF_CH2 123 -#define GDMA_EVT_OUT_TOTAL_EOF_CH0 124 -#define GDMA_EVT_OUT_TOTAL_EOF_CH1 125 -#define GDMA_EVT_OUT_TOTAL_EOF_CH2 126 -#define GDMA_EVT_OUT_FIFO_EMPTY_CH0 127 -#define GDMA_EVT_OUT_FIFO_EMPTY_CH1 128 -#define GDMA_EVT_OUT_FIFO_EMPTY_CH2 129 -#define GDMA_EVT_OUT_FIFO_FULL_CH0 130 -#define GDMA_EVT_OUT_FIFO_FULL_CH1 131 -#define GDMA_EVT_OUT_FIFO_FULL_CH2 132 -#define TMPSNSR_EVT_OVER_LIMIT 133 -#define I2S0_EVT_RX_DONE 134 -#define I2S0_EVT_TX_DONE 135 -#define I2S0_EVT_X_WORDS_RECEIVED 136 -#define I2S0_EVT_X_WORDS_SENT 137 -#define ULP_EVT_ERR_INTR 138 -#define ULP_EVT_HALT 139 -#define ULP_EVT_START_INTR 140 -#define RTC_EVT_TICK 141 -#define RTC_EVT_OVF 142 -#define RTC_EVT_CMP 143 +#define TMPSNSR_EVT_OVER_LIMIT 106 +#define I2S0_EVT_RX_DONE 107 +#define I2S0_EVT_TX_DONE 108 +#define I2S0_EVT_X_WORDS_RECEIVED 109 +#define I2S0_EVT_X_WORDS_SENT 110 +#define ULP_EVT_ERR_INTR 111 +#define ULP_EVT_HALT 112 +#define ULP_EVT_START_INTR 113 +#define RTC_EVT_TICK 114 +#define RTC_EVT_OVF 115 +#define RTC_EVT_CMP 116 +#define GDMA_EVT_IN_DONE_CH0 117 +#define GDMA_EVT_IN_DONE_CH1 118 +#define GDMA_EVT_IN_DONE_CH2 119 +#define GDMA_EVT_IN_SUC_EOF_CH0 120 +#define GDMA_EVT_IN_SUC_EOF_CH1 121 +#define GDMA_EVT_IN_SUC_EOF_CH2 122 +#define GDMA_EVT_IN_FIFO_EMPTY_CH0 123 +#define GDMA_EVT_IN_FIFO_EMPTY_CH1 124 +#define GDMA_EVT_IN_FIFO_EMPTY_CH2 125 +#define GDMA_EVT_IN_FIFO_FULL_CH0 126 +#define GDMA_EVT_IN_FIFO_FULL_CH1 127 +#define GDMA_EVT_IN_FIFO_FULL_CH2 128 +#define GDMA_EVT_OUT_DONE_CH0 129 +#define GDMA_EVT_OUT_DONE_CH1 130 +#define GDMA_EVT_OUT_DONE_CH2 131 +#define GDMA_EVT_OUT_EOF_CH0 132 +#define GDMA_EVT_OUT_EOF_CH1 133 +#define GDMA_EVT_OUT_EOF_CH2 134 +#define GDMA_EVT_OUT_TOTAL_EOF_CH0 135 +#define GDMA_EVT_OUT_TOTAL_EOF_CH1 136 +#define GDMA_EVT_OUT_TOTAL_EOF_CH2 137 +#define GDMA_EVT_OUT_FIFO_EMPTY_CH0 138 +#define GDMA_EVT_OUT_FIFO_EMPTY_CH1 139 +#define GDMA_EVT_OUT_FIFO_EMPTY_CH2 140 +#define GDMA_EVT_OUT_FIFO_FULL_CH0 141 +#define GDMA_EVT_OUT_FIFO_FULL_CH1 142 +#define GDMA_EVT_OUT_FIFO_FULL_CH2 143 #define PMU_EVT_SLEEP_WEEKUP 144 #define GPIO_TASK_CH0_SET 1 #define GPIO_TASK_CH1_SET 2 @@ -280,22 +280,22 @@ #define REGDMA_TASK_START1 128 #define REGDMA_TASK_START2 129 #define REGDMA_TASK_START3 130 -#define GDMA_TASK_IN_START_CH0 131 -#define GDMA_TASK_IN_START_CH1 132 -#define GDMA_TASK_IN_START_CH2 133 -#define GDMA_TASK_OUT_START_CH0 134 -#define GDMA_TASK_OUT_START_CH1 135 -#define GDMA_TASK_OUT_START_CH2 136 -#define TMPSNSR_TASK_START_SAMPLE 137 -#define TMPSNSR_TASK_STOP_SAMPLE 138 -#define I2S0_TASK_START_RX 139 -#define I2S0_TASK_START_TX 140 -#define I2S0_TASK_STOP_RX 141 -#define I2S0_TASK_STOP_TX 142 +#define TMPSNSR_TASK_START_SAMPLE 131 +#define TMPSNSR_TASK_STOP_SAMPLE 132 +#define I2S0_TASK_START_RX 133 +#define I2S0_TASK_START_TX 134 +#define I2S0_TASK_STOP_RX 135 +#define I2S0_TASK_STOP_TX 136 #define ULP_TASK_WAKEUP_CPU 137 #define ULP_TASK_INT_CPU 138 -#define RTC_TASK_START 145 -#define RTC_TASK_STOP 146 -#define RTC_TASK_CLR 147 -#define RTC_TASK_TRIGGERFLW 148 +#define RTC_TASK_START 139 +#define RTC_TASK_STOP 140 +#define RTC_TASK_CLR 141 +#define RTC_TASK_TRIGGERFLW 142 +#define GDMA_TASK_IN_START_CH0 143 +#define GDMA_TASK_IN_START_CH1 144 +#define GDMA_TASK_IN_START_CH2 145 +#define GDMA_TASK_OUT_START_CH0 146 +#define GDMA_TASK_OUT_START_CH1 147 +#define GDMA_TASK_OUT_START_CH2 148 #define PMU_TASK_SLEEP_REQ 149 From ddc3c2b78be402c037835aca2d350dc8f4067832 Mon Sep 17 00:00:00 2001 From: Peter Marcisovsky Date: Tue, 16 Jul 2024 11:32:22 +0200 Subject: [PATCH 060/113] refactor(usb_host): Update USB Host multiconfig public API - previous usb_host_get_config_desc_free() - updated usb_host_free_config_desc() --- components/usb/include/usb/usb_host.h | 4 ++-- .../usb/test_apps/usb_host/main/multiconf_client_async.c | 2 +- components/usb/usb_host.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/usb/include/usb/usb_host.h b/components/usb/include/usb/usb_host.h index 823a42b1585..b9a1c4dabb1 100644 --- a/components/usb/include/usb/usb_host.h +++ b/components/usb/include/usb/usb_host.h @@ -352,7 +352,7 @@ esp_err_t usb_host_get_active_config_descriptor(usb_device_handle_t dev_hdl, con * - The USB Host library only caches a device's active configuration descriptor. * - This function reads any configuration descriptor of a particular device (specified by bConfigurationValue). * - This function will read the specified configuration descriptor via control transfers, and allocate memory to store that descriptor. - * - Users can call usb_host_get_config_desc_free() to free the descriptor's memory afterwards. + * - Users can call usb_host_free_config_desc() to free the descriptor's memory afterwards. * * @note This function can block * @note A client must call usb_host_device_open() on the device first @@ -373,7 +373,7 @@ esp_err_t usb_host_get_config_desc(usb_host_client_handle_t client_hdl, usb_devi * @param[out] config_desc Configuration descriptor * @return esp_err_t */ -esp_err_t usb_host_get_config_desc_free(const usb_config_desc_t *config_desc); +esp_err_t usb_host_free_config_desc(const usb_config_desc_t *config_desc); // ----------------------------------------------- Interface Functions ------------------------------------------------- diff --git a/components/usb/test_apps/usb_host/main/multiconf_client_async.c b/components/usb/test_apps/usb_host/main/multiconf_client_async.c index 26e67069a9a..811a1dbdc14 100644 --- a/components/usb/test_apps/usb_host/main/multiconf_client_async.c +++ b/components/usb/test_apps/usb_host/main/multiconf_client_async.c @@ -146,7 +146,7 @@ void multiconf_client_async_task(void *arg) TEST_ASSERT_EQUAL_MEMORY_MESSAGE(config_desc_ref, multiconf_obj.config_desc_cached, sizeof(usb_config_desc_t), "Configuration descriptors do not match"); // Free the memory used to store the config descriptor - TEST_ASSERT_EQUAL(ESP_OK, usb_host_get_config_desc_free(multiconf_obj.config_desc_cached)); + TEST_ASSERT_EQUAL(ESP_OK, usb_host_free_config_desc(multiconf_obj.config_desc_cached)); multiconf_obj.next_stage = TEST_STAGE_DEV_CLOSE; skip_event_handling = true; break; diff --git a/components/usb/usb_host.c b/components/usb/usb_host.c index 9bbf31c19d1..2f5dc6fbed9 100644 --- a/components/usb/usb_host.c +++ b/components/usb/usb_host.c @@ -1173,7 +1173,7 @@ esp_err_t usb_host_get_config_desc(usb_host_client_handle_t client_hdl, usb_devi return ret; } -esp_err_t usb_host_get_config_desc_free(const usb_config_desc_t *config_desc) +esp_err_t usb_host_free_config_desc(const usb_config_desc_t *config_desc) { HOST_CHECK(config_desc != NULL, ESP_ERR_INVALID_ARG); heap_caps_free((usb_config_desc_t*)config_desc); From 38bdfe195e8a679a140398adf59b40840197f71d Mon Sep 17 00:00:00 2001 From: Armando Date: Tue, 16 Jul 2024 11:48:47 +0800 Subject: [PATCH 061/113] fix(aes): fixed aes wrong dma desc alignment --- components/mbedtls/port/aes/dma/esp_aes_dma_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/mbedtls/port/aes/dma/esp_aes_dma_core.c b/components/mbedtls/port/aes/dma/esp_aes_dma_core.c index 928252cc204..e09310355ed 100644 --- a/components/mbedtls/port/aes/dma/esp_aes_dma_core.c +++ b/components/mbedtls/port/aes/dma/esp_aes_dma_core.c @@ -615,7 +615,8 @@ int esp_aes_process_dma(esp_aes_context *ctx, const unsigned char *input, unsign } #if SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE - if (esp_cache_msync(output_desc, ALIGN_UP(output_dma_desc_num * sizeof(crypto_dma_desc_t), output_cache_line_size), ESP_CACHE_MSYNC_FLAG_DIR_M2C) != ESP_OK) { + size_t output_desc_cache_line_size = get_cache_line_size(output_desc); + if (esp_cache_msync(output_desc, ALIGN_UP(output_dma_desc_num * sizeof(crypto_dma_desc_t), output_desc_cache_line_size), ESP_CACHE_MSYNC_FLAG_DIR_M2C) != ESP_OK) { ESP_LOGE(TAG, "Output DMA descriptor cache sync M2C failed"); ret = -1; goto cleanup; @@ -834,7 +835,8 @@ int esp_aes_process_dma_gcm(esp_aes_context *ctx, const unsigned char *input, un } #if SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE - if (esp_cache_msync(output_desc, ALIGN_UP(output_dma_desc_num * sizeof(crypto_dma_desc_t), output_cache_line_size), ESP_CACHE_MSYNC_FLAG_DIR_M2C) != ESP_OK) { + size_t output_desc_cache_line_size = get_cache_line_size(output_desc); + if (esp_cache_msync(output_desc, ALIGN_UP(output_dma_desc_num * sizeof(crypto_dma_desc_t), output_desc_cache_line_size), ESP_CACHE_MSYNC_FLAG_DIR_M2C) != ESP_OK) { ESP_LOGE(TAG, "Output DMA descriptor cache sync M2C failed"); ret = -1; goto cleanup; From da4c55fdbbc6b6415cadb1ab1aab20ce6c86face Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Tue, 18 Jun 2024 20:39:34 +0800 Subject: [PATCH 062/113] feat(esp_hw_support): support esp32p4 gpio wakeup deepsleep --- components/esp_hw_support/include/esp_private/esp_pmu.h | 6 +++++- components/esp_hw_support/sleep_modes.c | 4 ++-- components/soc/esp32c2/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c2/include/soc/soc_caps.h | 1 + components/soc/esp32c3/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c3/include/soc/soc_caps.h | 1 + components/soc/esp32c5/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c5/include/soc/soc_caps.h | 1 + components/soc/esp32c6/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c6/include/soc/soc_caps.h | 1 + components/soc/esp32c61/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c61/include/soc/soc_caps.h | 1 + components/soc/esp32p4/include/soc/Kconfig.soc_caps.in | 8 ++++++++ components/soc/esp32p4/include/soc/soc_caps.h | 2 ++ 14 files changed, 42 insertions(+), 3 deletions(-) diff --git a/components/esp_hw_support/include/esp_private/esp_pmu.h b/components/esp_hw_support/include/esp_private/esp_pmu.h index 02a2c5762f8..47db5ab0666 100644 --- a/components/esp_hw_support/include/esp_private/esp_pmu.h +++ b/components/esp_hw_support/include/esp_private/esp_pmu.h @@ -62,7 +62,11 @@ typedef enum { #define RTC_EXT1_TRIG_EN 0 #endif -#define RTC_GPIO_TRIG_EN PMU_GPIO_WAKEUP_EN //!< GPIO wakeup +#if SOC_LP_IO_HAS_INDEPENDENT_WAKEUP_SOURCE +#define RTC_GPIO_TRIG_EN (PMU_GPIO_WAKEUP_EN | PMU_LP_GPIO_WAKEUP_EN) //!< GPIO & LP_GPIO wakeup +#else +#define RTC_GPIO_TRIG_EN (PMU_GPIO_WAKEUP_EN) +#endif #if SOC_LP_TIMER_SUPPORTED #define RTC_TIMER_TRIG_EN PMU_LP_TIMER_WAKEUP_EN //!< Timer wakeup diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 63fcec1f3d3..0c84bf9f4c1 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -217,8 +217,8 @@ typedef struct { uint32_t ext0_rtc_gpio_num : 5; #endif #if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP - uint32_t gpio_wakeup_mask : 8; // 8 is the maximum RTCIO number in all chips that support GPIO wakeup - uint32_t gpio_trigger_mode : 8; + uint32_t gpio_wakeup_mask : SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT; // Only RTC_GPIO supports wakeup deepsleep + uint32_t gpio_trigger_mode : SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT; #endif uint32_t sleep_time_adjustment; uint32_t ccount_ticks_record; diff --git a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in index c8fd88516dd..2e711551174 100644 --- a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in @@ -311,6 +311,10 @@ config SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK int default 0 +config SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT + int + default 6 + config SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK hex default 0x00000000001FFFC0 diff --git a/components/soc/esp32c2/include/soc/soc_caps.h b/components/soc/esp32c2/include/soc/soc_caps.h index 545f4e5cdbc..9ee2f14fed6 100644 --- a/components/soc/esp32c2/include/soc/soc_caps.h +++ b/components/soc/esp32c2/include/soc/soc_caps.h @@ -135,6 +135,7 @@ #define SOC_GPIO_OUT_RANGE_MAX 20 #define SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK (0ULL | BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5) +#define SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT (6) // digital I/O pad powered by VDD3P3_CPU or VDD_SPI(GPIO_NUM_6~GPIO_NUM_20) #define SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK 0x00000000001FFFC0ULL diff --git a/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in index d16372d9724..95dff02b456 100644 --- a/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in @@ -403,6 +403,10 @@ config SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK int default 0 +config SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT + int + default 6 + config SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK hex default 0x00000000003FFFC0 diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index 1b18dda18a8..e51177a0518 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -173,6 +173,7 @@ #define SOC_GPIO_OUT_RANGE_MAX 21 #define SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK (0ULL | BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5) +#define SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT (6) // digital I/O pad powered by VDD3P3_CPU or VDD_SPI(GPIO_NUM_6~GPIO_NUM_21) #define SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK 0x00000000003FFFC0ULL diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 9563ff9a9b6..7237c4d01fa 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -351,6 +351,10 @@ config SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK int default 0 +config SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT + int + default 8 + config SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK hex default 0x0000000001FFFF00 diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index d64a2d66133..f52f09d9e3c 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -210,6 +210,7 @@ #define SOC_GPIO_OUT_RANGE_MAX 28 #define SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK (0ULL | BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7) +#define SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT (8) // digital I/O pad powered by VDD3P3_CPU or VDD_SPI(GPIO_NUM_8~GPIO_NUM_28) #define SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK 0x0000000001FFFF00ULL diff --git a/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in index 8c3894401bb..5f0e1d9ee43 100644 --- a/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in @@ -503,6 +503,10 @@ config SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK int default 0 +config SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT + int + default 8 + config SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK hex default 0x000000007FFFFF00 diff --git a/components/soc/esp32c6/include/soc/soc_caps.h b/components/soc/esp32c6/include/soc/soc_caps.h index f062dcd9c75..9a75285a3bf 100644 --- a/components/soc/esp32c6/include/soc/soc_caps.h +++ b/components/soc/esp32c6/include/soc/soc_caps.h @@ -204,6 +204,7 @@ #define SOC_GPIO_OUT_RANGE_MAX 30 #define SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK (0ULL | BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7) +#define SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT (8) // digital I/O pad powered by VDD3P3_CPU or VDD_SPI(GPIO_NUM_8~GPIO_NUM_30) #define SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK 0x000000007FFFFF00ULL diff --git a/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in index 43920c58115..5fefbfe6fba 100644 --- a/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in @@ -191,6 +191,10 @@ config SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK int default 0 +config SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT + int + default 7 + config SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK hex default 0x00000000003FFF80 diff --git a/components/soc/esp32c61/include/soc/soc_caps.h b/components/soc/esp32c61/include/soc/soc_caps.h index 1a38385826f..c0bbd26d916 100644 --- a/components/soc/esp32c61/include/soc/soc_caps.h +++ b/components/soc/esp32c61/include/soc/soc_caps.h @@ -201,6 +201,7 @@ #define SOC_GPIO_OUT_RANGE_MAX 21 #define SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK (0ULL | BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6) +#define SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT (7) // digital I/O pad powered by VDD3P3_CPU or VDD_SPI(GPIO_NUM_7~GPIO_NUM_21) #define SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK 0x00000000003FFF80ULL diff --git a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in index 7b0f8b7842e..df3a8813b7a 100644 --- a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in @@ -599,6 +599,10 @@ config SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP bool default y +config SOC_LP_IO_HAS_INDEPENDENT_WAKEUP_SOURCE + bool + default y + config SOC_GPIO_VALID_GPIO_MASK hex default 0x007FFFFFFFFFFFFF @@ -615,6 +619,10 @@ config SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK int default 0 +config SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT + int + default 16 + config SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK hex default 0x007FFFFFFFFF0000 diff --git a/components/soc/esp32p4/include/soc/soc_caps.h b/components/soc/esp32p4/include/soc/soc_caps.h index d82591c07f2..9b39b548074 100644 --- a/components/soc/esp32p4/include/soc/soc_caps.h +++ b/components/soc/esp32p4/include/soc/soc_caps.h @@ -233,6 +233,7 @@ #define SOC_GPIO_SUPPORT_RTC_INDEPENDENT (1) // GPIO0~15 on ESP32P4 can support chip deep sleep wakeup #define SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP (1) +#define SOC_LP_IO_HAS_INDEPENDENT_WAKEUP_SOURCE (1) #define SOC_GPIO_VALID_GPIO_MASK (0x007FFFFFFFFFFFFF) #define SOC_GPIO_VALID_OUTPUT_GPIO_MASK SOC_GPIO_VALID_GPIO_MASK @@ -241,6 +242,7 @@ #define SOC_GPIO_OUT_RANGE_MAX 54 #define SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK (0ULL | 0xFFFF) +#define SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT (16) // digital I/O pad powered by VDD3P3_CPU or VDD_SPI(GPIO_NUM_16~GPIO_NUM_54) #define SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK 0x007FFFFFFFFF0000ULL From f43b3afcec3b8089fee6dfa4f901b66e24f40f8c Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Wed, 19 Jun 2024 20:37:36 +0800 Subject: [PATCH 063/113] fix(esp_hw_support): hold LP_IO mode if LP_PERI domain powerdown in sleep --- components/esp_hw_support/port/esp32p4/pmu_sleep.c | 9 ++++++--- .../port/esp32p4/private_include/pmu_param.h | 11 ++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/components/esp_hw_support/port/esp32p4/pmu_sleep.c b/components/esp_hw_support/port/esp32p4/pmu_sleep.c index 04355078fdf..cdda568baab 100644 --- a/components/esp_hw_support/port/esp32p4/pmu_sleep.c +++ b/components/esp_hw_support/port/esp32p4/pmu_sleep.c @@ -154,6 +154,10 @@ const pmu_sleep_config_t* pmu_sleep_config_default( if (dslp) { config->param.lp_sys.analog_wait_target_cycle = rtc_time_us_to_slowclk(PMU_LP_ANALOG_WAIT_TARGET_TIME_DSLP_US, slowclk_period); + + pmu_sleep_digital_config_t digital_default = PMU_SLEEP_DIGITAL_DSLP_CONFIG_DEFAULT(pd_flags); + config->digital = digital_default; + pmu_sleep_analog_config_t analog_default = PMU_SLEEP_ANALOG_DSLP_CONFIG_DEFAULT(pd_flags); config->analog = analog_default; } else { @@ -200,6 +204,7 @@ static void pmu_sleep_power_init(pmu_context_t *ctx, const pmu_sleep_power_confi static void pmu_sleep_digital_init(pmu_context_t *ctx, const pmu_sleep_digital_config_t *dig) { pmu_ll_hp_set_dig_pad_slp_sel (ctx->hal->dev, HP(SLEEP), dig->syscntl.dig_pad_slp_sel); + pmu_ll_hp_set_hold_all_lp_pad (ctx->hal->dev, HP(SLEEP), dig->syscntl.lp_pad_hold_all); } static void pmu_sleep_analog_init(pmu_context_t *ctx, const pmu_sleep_analog_config_t *analog, bool dslp) @@ -255,9 +260,7 @@ void pmu_sleep_init(const pmu_sleep_config_t *config, bool dslp) { assert(PMU_instance()); pmu_sleep_power_init(PMU_instance(), &config->power, dslp); - if(!dslp){ - pmu_sleep_digital_init(PMU_instance(), &config->digital); - } + pmu_sleep_digital_init(PMU_instance(), &config->digital); pmu_sleep_analog_init(PMU_instance(), &config->analog, dslp); pmu_sleep_param_init(PMU_instance(), &config->param, dslp); } diff --git a/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h b/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h index a3c48c04202..0d2bb42bf65 100644 --- a/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h +++ b/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h @@ -314,9 +314,18 @@ typedef struct { pmu_hp_sys_cntl_reg_t syscntl; } pmu_sleep_digital_config_t; + +#define PMU_SLEEP_DIGITAL_DSLP_CONFIG_DEFAULT(pd_flags) { \ + .syscntl = { \ + .dig_pad_slp_sel = 0, \ + .lp_pad_hold_all = (pd_flags & PMU_SLEEP_PD_LP_PERIPH) ? 1 : 0, \ + } \ +} + #define PMU_SLEEP_DIGITAL_LSLP_CONFIG_DEFAULT(pd_flags) { \ .syscntl = { \ - .dig_pad_slp_sel = ((pd_flags) & PMU_SLEEP_PD_TOP) ? 0 : 1, \ + .dig_pad_slp_sel = (pd_flags & PMU_SLEEP_PD_TOP) ? 0 : 1, \ + .lp_pad_hold_all = (pd_flags & PMU_SLEEP_PD_LP_PERIPH) ? 1 : 0, \ } \ } From cb8c67f55fa1ab87418b3100b3c0feb41a513094 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Thu, 27 Jun 2024 16:19:15 +0800 Subject: [PATCH 064/113] feat(example): update gpio/ext1 wakeup avaliable IO num in example Kconfig --- examples/system/deep_sleep/main/Kconfig.projbuild | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/system/deep_sleep/main/Kconfig.projbuild b/examples/system/deep_sleep/main/Kconfig.projbuild index 51dffc1f8ca..7c34046cda6 100644 --- a/examples/system/deep_sleep/main/Kconfig.projbuild +++ b/examples/system/deep_sleep/main/Kconfig.projbuild @@ -44,6 +44,7 @@ menu "Example Configuration" range 7 14 if IDF_TARGET_ESP32H2 range 0 21 if IDF_TARGET_ESP32S2 range 0 21 if IDF_TARGET_ESP32S3 + range 0 15 if IDF_TARGET_ESP32P4 choice EXAMPLE_EXT1_WAKEUP_PIN_1_SEL prompt "Enable wakeup from PIN_1" @@ -118,6 +119,7 @@ menu "Example Configuration" range 7 14 if IDF_TARGET_ESP32H2 range 0 21 if IDF_TARGET_ESP32S2 range 0 21 if IDF_TARGET_ESP32S3 + range 0 15 if IDF_TARGET_ESP32P4 choice EXAMPLE_EXT1_WAKEUP_PIN_2_SEL prompt "Enable wakeup from PIN_2" @@ -247,7 +249,7 @@ menu "Example Configuration" if we turn off the RTC_PERIPH domain or if certain chips lack the RTC_PERIPH domain, we will use the HOLD feature to maintain the pull-up and pull-down on the pins during sleep. but if we turn on the RTC_PERIPH domain, we don not need to use HOLD feature and this will - increase some power comsumption. + increase some power consumption. EXT0 wakeup source resides in the same power domain as RTCIO (RTC Periph), so internal pull-up/downs are always available. There's no need to explicitly force it on for EXT0. @@ -259,7 +261,7 @@ menu "Example Configuration" depends on SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP help This option enables wake up from GPIO. Be aware that if you use low level to trigger wakeup, we strongly - recommand you to connect external pull-up resistance. + recommend you to connect external pull-up resistance. menu "GPIO wakeup configuration" visible if EXAMPLE_GPIO_WAKEUP @@ -268,6 +270,7 @@ menu "Example Configuration" int "Enable wakeup from GPIO" default 0 range 0 7 if IDF_TARGET_ESP32C6 + range 0 15 if IDF_TARGET_ESP32P4 range 0 5 if !IDF_TARGET_ESP32C6 config EXAMPLE_GPIO_WAKEUP_HIGH_LEVEL From c2bb64fbe847f6d81fefe260194db51b5b7c2436 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Thu, 11 Jul 2024 17:34:32 +0800 Subject: [PATCH 065/113] fix(esp_hw_support): stall another core during cpu/mem/apb freq switching --- .../esp_hw_support/port/esp32p4/rtc_clk.c | 23 ++++++++++++++++++- .../hal/esp32p4/include/hal/cpu_utility_ll.h | 4 ++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/components/esp_hw_support/port/esp32p4/rtc_clk.c b/components/esp_hw_support/port/esp32p4/rtc_clk.c index 343aaf1955a..4bcccf422e1 100644 --- a/components/esp_hw_support/port/esp32p4/rtc_clk.c +++ b/components/esp_hw_support/port/esp32p4/rtc_clk.c @@ -14,6 +14,7 @@ #include "soc/rtc.h" #include "esp_private/rtc_clk.h" #include "esp_attr.h" +#include "esp_cpu.h" #include "esp_hw_log.h" #include "esp_rom_sys.h" #include "hal/clk_tree_ll.h" @@ -182,7 +183,13 @@ static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div, bool to_default) clk_ll_mem_set_divider(mem_divider); clk_ll_sys_set_divider(sys_divider); clk_ll_apb_set_divider(apb_divider); +#if (!defined(BOOTLOADER_BUILD) && (CONFIG_FREERTOS_NUMBER_OF_CORES == 2)) + esp_cpu_stall(1 - esp_cpu_get_core_id()); +#endif clk_ll_bus_update(); +#if (!defined(BOOTLOADER_BUILD) && (CONFIG_FREERTOS_NUMBER_OF_CORES == 2)) + esp_cpu_unstall(1 - esp_cpu_get_core_id()); +#endif esp_rom_set_cpu_ticks_per_us(cpu_freq); } @@ -194,7 +201,13 @@ static void rtc_clk_cpu_freq_to_8m(void) clk_ll_sys_set_divider(1); clk_ll_apb_set_divider(1); clk_ll_cpu_set_src(SOC_CPU_CLK_SRC_RC_FAST); +#if (!defined(BOOTLOADER_BUILD) && (CONFIG_FREERTOS_NUMBER_OF_CORES == 2)) + esp_cpu_stall(1 - esp_cpu_get_core_id()); +#endif clk_ll_bus_update(); +#if (!defined(BOOTLOADER_BUILD) && (CONFIG_FREERTOS_NUMBER_OF_CORES == 2)) + esp_cpu_unstall(1 - esp_cpu_get_core_id()); +#endif esp_rom_set_cpu_ticks_per_us(20); } @@ -240,14 +253,22 @@ static void rtc_clk_cpu_freq_to_cpll_mhz(int cpu_freq_mhz, hal_utils_clk_div_t * // Update bit does not control CPU clock sel mux. Therefore, there may be a middle state during the switch (CPU rises) // Since this is upscaling, we need to configure the frequency division coefficient before switching the clock source. // Otherwise, an intermediate state will occur, in the intermediate state, the frequency of APB/MEM does not meet the - // timing requirements. If there are periperals/CPU access that depend on these two clocks at this moment, some exception + // timing requirements. If there are periperals access that depend on these two clocks at this moment, some exception // might occur. clk_ll_cpu_set_divider(div->integer, div->numerator, div->denominator); clk_ll_mem_set_divider(mem_divider); clk_ll_sys_set_divider(sys_divider); clk_ll_apb_set_divider(apb_divider); +#if (!defined(BOOTLOADER_BUILD) && (CONFIG_FREERTOS_NUMBER_OF_CORES == 2)) + // During frequency switching, non-frequency switching cores may have ongoing memory accesses, which may cause access + // failures, stalling non-frequency switching cores here can avoid such failures. + esp_cpu_stall(1 - esp_cpu_get_core_id()); +#endif clk_ll_bus_update(); clk_ll_cpu_set_src(SOC_CPU_CLK_SRC_PLL); +#if (!defined(BOOTLOADER_BUILD) && (CONFIG_FREERTOS_NUMBER_OF_CORES == 2)) + esp_cpu_unstall(1 - esp_cpu_get_core_id()); +#endif esp_rom_set_cpu_ticks_per_us(cpu_freq_mhz); } diff --git a/components/hal/esp32p4/include/hal/cpu_utility_ll.h b/components/hal/esp32p4/include/hal/cpu_utility_ll.h index 38a21cfc3c2..f9686b8ceae 100644 --- a/components/hal/esp32p4/include/hal/cpu_utility_ll.h +++ b/components/hal/esp32p4/include/hal/cpu_utility_ll.h @@ -31,8 +31,10 @@ FORCE_INLINE_ATTR void cpu_utility_ll_stall_cpu(uint32_t cpu_no) { if (cpu_no == 0) { HAL_FORCE_MODIFY_U32_REG_FIELD(PMU.cpu_sw_stall, hpcore0_stall_code, 0x86); + while(!REG_GET_BIT(HP_SYSTEM_CPU_CORESTALLED_ST_REG, HP_SYSTEM_REG_CORE0_CORESTALLED_ST)); } else { HAL_FORCE_MODIFY_U32_REG_FIELD(PMU.cpu_sw_stall, hpcore1_stall_code, 0x86); + while(!REG_GET_BIT(HP_SYSTEM_CPU_CORESTALLED_ST_REG, HP_SYSTEM_REG_CORE1_CORESTALLED_ST)); } } @@ -40,8 +42,10 @@ FORCE_INLINE_ATTR void cpu_utility_ll_unstall_cpu(uint32_t cpu_no) { if (cpu_no == 0) { HAL_FORCE_MODIFY_U32_REG_FIELD(PMU.cpu_sw_stall, hpcore0_stall_code, 0xFF); + while(REG_GET_BIT(HP_SYSTEM_CPU_CORESTALLED_ST_REG, HP_SYSTEM_REG_CORE0_CORESTALLED_ST)); } else { HAL_FORCE_MODIFY_U32_REG_FIELD(PMU.cpu_sw_stall, hpcore1_stall_code, 0xFF); + while(REG_GET_BIT(HP_SYSTEM_CPU_CORESTALLED_ST_REG, HP_SYSTEM_REG_CORE1_CORESTALLED_ST)); } } #endif // SOC_CPU_CORES_NUM > 1 From c503e385ab9af596ba79630af7935880a513af23 Mon Sep 17 00:00:00 2001 From: Armando Date: Tue, 16 Jul 2024 11:04:52 +0800 Subject: [PATCH 066/113] fix(dma): fix esp_dma_is_buffer_alignment_satisfied align issue when l2 cache line 128B --- components/esp_hw_support/dma/esp_dma_utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_hw_support/dma/esp_dma_utils.c b/components/esp_hw_support/dma/esp_dma_utils.c index a8e7611a741..0c1f0df1af8 100644 --- a/components/esp_hw_support/dma/esp_dma_utils.c +++ b/components/esp_hw_support/dma/esp_dma_utils.c @@ -130,7 +130,7 @@ bool esp_dma_is_buffer_alignment_satisfied(const void *ptr, size_t size, esp_dma int cache_flags = 0; size_t cache_alignment_bytes = 0; if (esp_ptr_external_ram(ptr)) { - cache_flags |= ESP_DMA_MALLOC_FLAG_PSRAM; + cache_flags |= MALLOC_CAP_SPIRAM; } esp_err_t ret = esp_cache_get_alignment(cache_flags, &cache_alignment_bytes); assert(ret == ESP_OK); From 74a04c140cc9c095d14883d6b7c79f6fde98a1d0 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 16 Jul 2024 15:35:10 +0800 Subject: [PATCH 067/113] feat(ulp): add option for routing LP-printf to HP console --- .../esp_rom/esp32p4/ld/esp32p4lp.rom.api.ld | 9 ++++ components/ulp/Kconfig | 19 ++++++++ components/ulp/cmake/CMakeLists.txt | 2 + .../lp_core/include/ulp_lp_core_print.h | 7 +++ .../ulp/lp_core/lp_core/lp_core_print.c | 30 +++++++++++-- .../ulp/lp_core/lp_core/lp_core_startup.c | 11 ++++- .../{ => lp_core_basic_tests}/CMakeLists.txt | 2 +- .../{ => lp_core_basic_tests}/README.md | 0 .../main/CMakeLists.txt | 0 .../main/lp_core/test_main.c | 0 .../main/lp_core/test_main_counter.c | 0 .../main/lp_core/test_main_gpio.c | 0 .../main/lp_core/test_main_i2c.c | 0 .../main/lp_core/test_main_isr.c | 0 .../main/lp_core/test_main_set_timer_wakeup.c | 0 .../main/lp_core/test_main_spi_master.c | 0 .../main/lp_core/test_main_spi_slave.c | 0 .../main/lp_core/test_main_uart.c | 0 .../main/lp_core/test_shared.h | 0 .../main/test_app_main.c | 0 .../main/test_lp_core.c | 0 .../main/test_lp_core_etm.c | 0 .../main/test_lp_core_i2c.c | 0 .../main/test_lp_core_spi.c | 0 .../main/test_lp_core_uart.c | 0 .../pytest_lp_core_basic.py} | 2 +- .../sdkconfig.ci.default | 0 .../sdkconfig.defaults | 0 .../lp_core/lp_core_hp_uart/CMakeLists.txt | 14 ++++++ .../lp_core/lp_core_hp_uart/README.md | 3 ++ .../lp_core_hp_uart/main/CMakeLists.txt | 11 +++++ .../main/lp_core/test_hello_main.c | 16 +++++++ .../lp_core_hp_uart/main/test_app_main.c | 41 ++++++++++++++++++ .../lp_core_hp_uart/main/test_lp_core.c | 43 +++++++++++++++++++ .../lp_core_hp_uart/pytest_lp_core_hp_uart.py | 14 ++++++ .../lp_core_hp_uart/sdkconfig.ci.default | 0 .../lp_core_hp_uart/sdkconfig.defaults | 7 +++ docs/en/api-reference/system/ulp-lp-core.rst | 2 + 38 files changed, 226 insertions(+), 7 deletions(-) create mode 100644 components/esp_rom/esp32p4/ld/esp32p4lp.rom.api.ld rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/CMakeLists.txt (94%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/README.md (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/CMakeLists.txt (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main_counter.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main_gpio.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main_i2c.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main_isr.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main_set_timer_wakeup.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main_spi_master.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main_spi_slave.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_main_uart.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/lp_core/test_shared.h (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/test_app_main.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/test_lp_core.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/test_lp_core_etm.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/test_lp_core_i2c.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/test_lp_core_spi.c (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/main/test_lp_core_uart.c (100%) rename components/ulp/test_apps/lp_core/{pytest_lp_core.py => lp_core_basic_tests/pytest_lp_core_basic.py} (91%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/sdkconfig.ci.default (100%) rename components/ulp/test_apps/lp_core/{ => lp_core_basic_tests}/sdkconfig.defaults (100%) create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/CMakeLists.txt create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/README.md create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/main/CMakeLists.txt create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_hello_main.c create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_app_main.c create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_lp_core.c create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/pytest_lp_core_hp_uart.py create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/sdkconfig.ci.default create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/sdkconfig.defaults diff --git a/components/esp_rom/esp32p4/ld/esp32p4lp.rom.api.ld b/components/esp_rom/esp32p4/ld/esp32p4lp.rom.api.ld new file mode 100644 index 00000000000..4d7fc793e20 --- /dev/null +++ b/components/esp_rom/esp32p4/ld/esp32p4lp.rom.api.ld @@ -0,0 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +/** ROM APIs + */ + +PROVIDE ( esp_rom_output_putc = uart_tx_one_char ); diff --git a/components/ulp/Kconfig b/components/ulp/Kconfig index 94167bd5dfa..53be58f8292 100644 --- a/components/ulp/Kconfig +++ b/components/ulp/Kconfig @@ -106,6 +106,25 @@ menu "Ultra Low Power (ULP) Co-processor" Disabling this option will reduce the LP core binary size by not linking in panic handler functionality. + config ULP_HP_UART_CONSOLE_PRINT + depends on ULP_COPROC_TYPE_LP_CORE + bool + prompt "Route lp_core_printf to the console HP-UART" + help + Set this option to route lp_core_printf to the console HP-UART. + This allows you to easily view print outputs from the LP core, without + having to connect to the LP-UART. This option comes with the following + limitations: + + 1. There is no mutual exclusion between the HP-Core and the LP-Core accessing + the HP-UART, which means that if both cores are logging heavily the output + strings might get mangled together. + 2. The HP-UART can only work while the HP-Core is running, which means that + if the HP-Core is in deep sleep, the LP-Core will not be able to print to the + console HP-UART. + + Due to these limitations it is only recommended to use this option for easy debugging. + For more serious use-cases you should use the LP-UART. endmenu endmenu # Ultra Low Power (ULP) Co-processor diff --git a/components/ulp/cmake/CMakeLists.txt b/components/ulp/cmake/CMakeLists.txt index 0664238e4cc..20db7cdb3f1 100644 --- a/components/ulp/cmake/CMakeLists.txt +++ b/components/ulp/cmake/CMakeLists.txt @@ -135,6 +135,8 @@ elseif(CONFIG_ULP_COPROC_TYPE_LP_CORE) PRIVATE SHELL:-T ${IDF_PATH}/components/esp_rom/${IDF_TARGET}/ld/${IDF_TARGET}lp.rom.newlib.ld) target_link_options(${ULP_APP_NAME} PRIVATE SHELL:-T ${IDF_PATH}/components/esp_rom/${IDF_TARGET}/ld/${IDF_TARGET}lp.rom.version.ld) + target_link_options(${ULP_APP_NAME} + PRIVATE SHELL:-T ${IDF_PATH}/components/esp_rom/${IDF_TARGET}/ld/${IDF_TARGET}lp.rom.api.ld) endif() target_sources(${ULP_APP_NAME} PRIVATE ${ULP_S_SOURCES}) diff --git a/components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h b/components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h index 6544ba72014..27a080581df 100644 --- a/components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h +++ b/components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h @@ -37,3 +37,10 @@ void lp_core_printf(const char* format, ...); extern void ets_install_uart_printf(void); #define lp_core_install_uart_print ets_install_uart_printf #endif /* CONFIG_ULP_ROM_PRINT_ENABLE */ + +/** + * @brief Print a single character from the LP core + * + * @param c character to be printed + */ +void lp_core_print_char(char c); diff --git a/components/ulp/lp_core/lp_core/lp_core_print.c b/components/ulp/lp_core/lp_core/lp_core_print.c index a14a91bcc64..0a704c28a32 100644 --- a/components/ulp/lp_core/lp_core/lp_core_print.c +++ b/components/ulp/lp_core/lp_core/lp_core_print.c @@ -6,25 +6,47 @@ #include #include "sdkconfig.h" #include "ulp_lp_core_uart.h" - -#if !CONFIG_ULP_ROM_PRINT_ENABLE +#include "hal/uart_hal.h" +#include "esp_rom_uart.h" #define LP_UART_PORT_NUM LP_UART_NUM_0 #define BINARY_SUPPORT 1 #define is_digit(c) ((c >= '0') && (c <= '9')) +#if CONFIG_ULP_HP_UART_CONSOLE_PRINT +void __attribute__((alias("hp_uart_send_char"))) lp_core_print_char(char c); + +static void hp_uart_send_char(char t) +{ + uart_dev_t *uart = (uart_dev_t *)UART_LL_GET_HW(CONFIG_ESP_CONSOLE_UART_NUM); + + while (uart_ll_get_txfifo_len(uart) < 2) { + ; + } + uart_ll_write_txfifo(uart, &t, 1); +} +#elif !CONFIG_ULP_ROM_PRINT_ENABLE +void __attribute__((alias("lp_uart_send_char"))) lp_core_print_char(char c); static void lp_uart_send_char(char c) { int tx_len = 0; int loop_cnt = 0; - /* Write one byte to LP UART. Break after few iterations if we are stuck for any reason. */ while (tx_len != 1 && loop_cnt < 1000) { tx_len = lp_core_uart_tx_chars(LP_UART_PORT_NUM, (const void *)&c, 1); loop_cnt++; } } +#else +void __attribute__((alias("lp_rom_send_char"))) lp_core_print_char(char c); +static void lp_rom_send_char(char c) +{ + esp_rom_output_putc(c); +} +#endif // CONFIG_ULP_HP_UART_CONSOLE_PRINT + +#if !CONFIG_ULP_ROM_PRINT_ENABLE // Ported over ROM function _cvt() static int lp_core_cvt(unsigned long long val, char *buf, long radix, char *digits) @@ -268,7 +290,7 @@ int lp_core_printf(const char* format, ...) va_start(ap, format); /* Pass the input string and the argument list to ets_vprintf() */ - int ret = lp_core_ets_vprintf(lp_uart_send_char, format, ap); + int ret = lp_core_ets_vprintf(lp_core_print_char, format, ap); va_end(ap); diff --git a/components/ulp/lp_core/lp_core/lp_core_startup.c b/components/ulp/lp_core/lp_core/lp_core_startup.c index 4d87b07fd1a..81cd5c91bc8 100644 --- a/components/ulp/lp_core/lp_core/lp_core_startup.c +++ b/components/ulp/lp_core/lp_core/lp_core_startup.c @@ -1,18 +1,27 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ +#include "sdkconfig.h" #include "soc/soc_caps.h" +#include "esp_rom_caps.h" +#include "rom/ets_sys.h" #include "ulp_lp_core_utils.h" #include "ulp_lp_core_lp_timer_shared.h" #include "ulp_lp_core_memory_shared.h" +#include "ulp_lp_core_print.h" extern void main(); /* Initialize lp core related system functions before calling user's main*/ void lp_core_startup() { + +#if CONFIG_ULP_HP_UART_CONSOLE_PRINT && ESP_ROM_HAS_LP_ROM + ets_install_putc1(lp_core_print_char); +#endif + ulp_lp_core_update_wakeup_cause(); main(); diff --git a/components/ulp/test_apps/lp_core/CMakeLists.txt b/components/ulp/test_apps/lp_core/lp_core_basic_tests/CMakeLists.txt similarity index 94% rename from components/ulp/test_apps/lp_core/CMakeLists.txt rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/CMakeLists.txt index 5a16c97e491..2881fcd2f42 100644 --- a/components/ulp/test_apps/lp_core/CMakeLists.txt +++ b/components/ulp/test_apps/lp_core/lp_core_basic_tests/CMakeLists.txt @@ -11,4 +11,4 @@ set(EXTRA_COMPONENT_DIRS set(COMPONENTS main) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(lp_core_test) +project(lp_core_basic_tests) diff --git a/components/ulp/test_apps/lp_core/README.md b/components/ulp/test_apps/lp_core/lp_core_basic_tests/README.md similarity index 100% rename from components/ulp/test_apps/lp_core/README.md rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/README.md diff --git a/components/ulp/test_apps/lp_core/main/CMakeLists.txt b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/CMakeLists.txt similarity index 100% rename from components/ulp/test_apps/lp_core/main/CMakeLists.txt rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/CMakeLists.txt diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_counter.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_counter.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main_counter.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_counter.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_gpio.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_gpio.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main_gpio.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_gpio.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_i2c.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_i2c.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main_i2c.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_i2c.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_isr.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_isr.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main_isr.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_isr.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_set_timer_wakeup.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_set_timer_wakeup.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main_set_timer_wakeup.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_set_timer_wakeup.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_master.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_spi_master.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_master.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_spi_master.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_slave.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_spi_slave.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main_spi_slave.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_spi_slave.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_main_uart.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_uart.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_main_uart.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_main_uart.c diff --git a/components/ulp/test_apps/lp_core/main/lp_core/test_shared.h b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_shared.h similarity index 100% rename from components/ulp/test_apps/lp_core/main/lp_core/test_shared.h rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/lp_core/test_shared.h diff --git a/components/ulp/test_apps/lp_core/main/test_app_main.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_app_main.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/test_app_main.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_app_main.c diff --git a/components/ulp/test_apps/lp_core/main/test_lp_core.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/test_lp_core.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core.c diff --git a/components/ulp/test_apps/lp_core/main/test_lp_core_etm.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core_etm.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/test_lp_core_etm.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core_etm.c diff --git a/components/ulp/test_apps/lp_core/main/test_lp_core_i2c.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core_i2c.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/test_lp_core_i2c.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core_i2c.c diff --git a/components/ulp/test_apps/lp_core/main/test_lp_core_spi.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core_spi.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/test_lp_core_spi.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core_spi.c diff --git a/components/ulp/test_apps/lp_core/main/test_lp_core_uart.c b/components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core_uart.c similarity index 100% rename from components/ulp/test_apps/lp_core/main/test_lp_core_uart.c rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/main/test_lp_core_uart.c diff --git a/components/ulp/test_apps/lp_core/pytest_lp_core.py b/components/ulp/test_apps/lp_core/lp_core_basic_tests/pytest_lp_core_basic.py similarity index 91% rename from components/ulp/test_apps/lp_core/pytest_lp_core.py rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/pytest_lp_core_basic.py index 0c8a36668c3..325bd2ca59f 100644 --- a/components/ulp/test_apps/lp_core/pytest_lp_core.py +++ b/components/ulp/test_apps/lp_core/lp_core_basic_tests/pytest_lp_core_basic.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 import pytest from pytest_embedded import Dut diff --git a/components/ulp/test_apps/lp_core/sdkconfig.ci.default b/components/ulp/test_apps/lp_core/lp_core_basic_tests/sdkconfig.ci.default similarity index 100% rename from components/ulp/test_apps/lp_core/sdkconfig.ci.default rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/sdkconfig.ci.default diff --git a/components/ulp/test_apps/lp_core/sdkconfig.defaults b/components/ulp/test_apps/lp_core/lp_core_basic_tests/sdkconfig.defaults similarity index 100% rename from components/ulp/test_apps/lp_core/sdkconfig.defaults rename to components/ulp/test_apps/lp_core/lp_core_basic_tests/sdkconfig.defaults diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/CMakeLists.txt b/components/ulp/test_apps/lp_core/lp_core_hp_uart/CMakeLists.txt new file mode 100644 index 00000000000..2c8bfb98612 --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/CMakeLists.txt @@ -0,0 +1,14 @@ +# This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +list(PREPEND SDKCONFIG_DEFAULTS "$ENV{IDF_PATH}/tools/test_apps/configs/sdkconfig.debug_helpers" "sdkconfig.defaults") + +set(EXTRA_COMPONENT_DIRS + "$ENV{IDF_PATH}/tools/unit-test-app/components" +) + +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +set(COMPONENTS main) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(lp_core_hp_uart_test) diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/README.md b/components/ulp/test_apps/lp_core/lp_core_hp_uart/README.md new file mode 100644 index 00000000000..59db987a228 --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/README.md @@ -0,0 +1,3 @@ +| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-P4 | +| ----------------- | -------- | -------- | -------- | + diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/CMakeLists.txt b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/CMakeLists.txt new file mode 100644 index 00000000000..6fce89dfdde --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/CMakeLists.txt @@ -0,0 +1,11 @@ +set(app_sources "test_app_main.c" "test_lp_core.c") +set(lp_core_sources "lp_core/test_hello_main.c") + +idf_component_register(SRCS ${app_sources} + INCLUDE_DIRS "lp_core" + REQUIRES ulp unity esp_timer test_utils + WHOLE_ARCHIVE) + +set(lp_core_exp_dep_srcs ${app_sources}) + +ulp_embed_binary(lp_core_test_app "${lp_core_sources}" "${lp_core_exp_dep_srcs}") diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_hello_main.c b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_hello_main.c new file mode 100644 index 00000000000..3c844cec7df --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_hello_main.c @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "ulp_lp_core_print.h" + +int main(void) +{ + lp_core_printf("Hello, World!\n"); + + return 0; +} diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_app_main.c b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_app_main.c new file mode 100644 index 00000000000..d8a9a98ccc0 --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_app_main.c @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "unity.h" +#include "unity_test_runner.h" +#include "esp_heap_caps.h" + +// Some resources are lazy allocated in the sleep code, the threshold is left for that case +#define TEST_MEMORY_LEAK_THRESHOLD (-500) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ + unity_run_menu(); +} diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_lp_core.c b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_lp_core.c new file mode 100644 index 00000000000..0d3949cd59a --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_lp_core.c @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "sdkconfig.h" +#include "unity.h" +#include "soc/soc_caps.h" +#include "esp_rom_caps.h" +#include "lp_core_test_app.h" +#include "ulp_lp_core.h" + +extern const uint8_t lp_core_main_bin_start[] asm("_binary_lp_core_test_app_bin_start"); +extern const uint8_t lp_core_main_bin_end[] asm("_binary_lp_core_test_app_bin_end"); + +static void load_and_start_lp_core_firmware(ulp_lp_core_cfg_t* cfg, const uint8_t* firmware_start, const uint8_t* firmware_end) +{ + TEST_ASSERT(ulp_lp_core_load_binary(firmware_start, + (firmware_end - firmware_start)) == ESP_OK); + + TEST_ASSERT(ulp_lp_core_run(cfg) == ESP_OK); + +} + +TEST_CASE("lp-print can output to hp-uart", "[lp_core]") +{ + /* Load ULP firmware and start the coprocessor */ + ulp_lp_core_cfg_t cfg = { + .wakeup_source = ULP_LP_CORE_WAKEUP_SOURCE_HP_CPU, + }; + + load_and_start_lp_core_firmware(&cfg, lp_core_main_bin_start, lp_core_main_bin_end); + + // Actual test output on UART is checked by pytest, not unity test-case + // We simply wait to allow the lp-core to run once + vTaskDelay(1000 / portTICK_PERIOD_MS); +} diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/pytest_lp_core_hp_uart.py b/components/ulp/test_apps/lp_core/lp_core_hp_uart/pytest_lp_core_hp_uart.py new file mode 100644 index 00000000000..df0edfec741 --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/pytest_lp_core_hp_uart.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32c5 +@pytest.mark.esp32c6 +@pytest.mark.esp32p4 +@pytest.mark.generic +def test_lp_core_hp_uart_print(dut: Dut) -> None: + dut.expect_exact('Press ENTER to see the list of tests') + dut.write('"lp-print can output to hp-uart"') + dut.expect_exact('Hello, World!') diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/sdkconfig.ci.default b/components/ulp/test_apps/lp_core/lp_core_hp_uart/sdkconfig.ci.default new file mode 100644 index 00000000000..e69de29bb2d diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/sdkconfig.defaults b/components/ulp/test_apps/lp_core/lp_core_hp_uart/sdkconfig.defaults new file mode 100644 index 00000000000..e3c08c60fa9 --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/sdkconfig.defaults @@ -0,0 +1,7 @@ +CONFIG_ESP_TASK_WDT_INIT=n + +CONFIG_ULP_COPROC_ENABLED=y +CONFIG_ULP_COPROC_TYPE_LP_CORE=y +CONFIG_ULP_COPROC_RESERVE_MEM=12000 +CONFIG_ULP_PANIC_OUTPUT_ENABLE=y +CONFIG_ULP_HP_UART_CONSOLE_PRINT=y diff --git a/docs/en/api-reference/system/ulp-lp-core.rst b/docs/en/api-reference/system/ulp-lp-core.rst index ec5bfa083e6..dd3cb7cd0c7 100644 --- a/docs/en/api-reference/system/ulp-lp-core.rst +++ b/docs/en/api-reference/system/ulp-lp-core.rst @@ -212,6 +212,8 @@ When programming the LP-Core, it can sometimes be challenging to figure out why * Use the LP-UART to print: the LP-Core has access to the LP-UART peripheral, which can be used for printing information independently of the main CPU sleep state. See :example:`system/ulp/lp_core/lp_uart/lp_uart_print` for an example of how to use this driver. +* Routing :cpp:func:`lp_core_printf` to the HP-Core console UART with :ref:`CONFIG_ULP_HP_UART_CONSOLE_PRINT`. This allows you to easily print LP-Core information to the already connected HP-Core console UART. The drawback of this approach is that it requires the main CPU to be awake and since there is no synchronization between the LP and HP cores, the output may be interleaved. + * Share program state through shared variables: as described in :ref:`ulp-lp-core-access-variables`, both the main CPU and the ULP core can easily access global variables in RTC memory. Writing state information to such a variable from the ULP and reading it from the main CPU can help you discern what is happening on the ULP core. The downside of this approach is that it requires the main CPU to be awake, which will not always be the case. Keeping the main CPU awake might even, in some cases, mask problems, as some issues may only occur when certain power domains are powered down. * Panic handler: the LP-Core has a panic handler that can dump the state of the LP-Core registers by the LP-UART when an exception is detected. To enable the panic handler, set the :ref:`CONFIG_ULP_PANIC_OUTPUT_ENABLE` option to ``y``. This option can be kept disabled to reduce LP-RAM usage by the LP-Core application. To recover a backtrace from the panic dump, it is possible to use esp-idf-monitor_., e.g.: From ceda7d04e4412c25ef83afb000b7108d2864e6dc Mon Sep 17 00:00:00 2001 From: zwl Date: Wed, 17 Jul 2024 17:23:28 +0800 Subject: [PATCH 068/113] feat(bluetooth/controller): support default tx power configurable on ESP32C6 and ESP32H2 --- components/bt/controller/esp32c6/Kconfig.in | 50 ++++++++++++++++ components/bt/controller/esp32c6/esp_bt_cfg.h | 2 +- components/bt/controller/esp32h2/Kconfig.in | 59 +++++++++++++++++++ components/bt/controller/esp32h2/esp_bt_cfg.h | 3 +- 4 files changed, 111 insertions(+), 3 deletions(-) diff --git a/components/bt/controller/esp32c6/Kconfig.in b/components/bt/controller/esp32c6/Kconfig.in index 665e34366a1..9de74d8f05f 100644 --- a/components/bt/controller/esp32c6/Kconfig.in +++ b/components/bt/controller/esp32c6/Kconfig.in @@ -621,3 +621,53 @@ config BT_LE_CCA_RSSI_THRESH default 20 help Power threshold of CCA in unit of -1 dBm. + +choice BT_LE_DFT_TX_POWER_LEVEL_DBM + prompt "BLE default Tx power level(dBm)" + default BT_LE_DFT_TX_POWER_LEVEL_P9 + help + Specify default Tx power level(dBm). + config BT_LE_DFT_TX_POWER_LEVEL_N15 + bool "-15dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N12 + bool "-12dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N9 + bool "-9dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N6 + bool "-6dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N3 + bool "-3dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N0 + bool "0dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P3 + bool "+3dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P6 + bool "+6dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P9 + bool "+9dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P12 + bool "+12dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P15 + bool "+15dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P18 + bool "+18dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P20 + bool "+20dBm" +endchoice + +config BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF + int + default -15 if BT_LE_DFT_TX_POWER_LEVEL_N15 + default -12 if BT_LE_DFT_TX_POWER_LEVEL_N12 + default -9 if BT_LE_DFT_TX_POWER_LEVEL_N9 + default -6 if BT_LE_DFT_TX_POWER_LEVEL_N6 + default -3 if BT_LE_DFT_TX_POWER_LEVEL_N3 + default 0 if BT_LE_DFT_TX_POWER_LEVEL_N0 + default 3 if BT_LE_DFT_TX_POWER_LEVEL_P3 + default 6 if BT_LE_DFT_TX_POWER_LEVEL_P6 + default 9 if BT_LE_DFT_TX_POWER_LEVEL_P9 + default 12 if BT_LE_DFT_TX_POWER_LEVEL_P12 + default 15 if BT_LE_DFT_TX_POWER_LEVEL_P15 + default 18 if BT_LE_DFT_TX_POWER_LEVEL_P18 + default 20 if BT_LE_DFT_TX_POWER_LEVEL_P20 + default 0 diff --git a/components/bt/controller/esp32c6/esp_bt_cfg.h b/components/bt/controller/esp32c6/esp_bt_cfg.h index b8bbfd3d4b7..4e24c186140 100644 --- a/components/bt/controller/esp32c6/esp_bt_cfg.h +++ b/components/bt/controller/esp32c6/esp_bt_cfg.h @@ -216,7 +216,7 @@ extern "C" { #define RTC_FREQ_N (32768) /* in Hz */ -#define BLE_LL_TX_PWR_DBM_N (9) +#define BLE_LL_TX_PWR_DBM_N (CONFIG_BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF) #define RUN_BQB_TEST (0) diff --git a/components/bt/controller/esp32h2/Kconfig.in b/components/bt/controller/esp32h2/Kconfig.in index e45aa2030ae..f68a615b7c2 100644 --- a/components/bt/controller/esp32h2/Kconfig.in +++ b/components/bt/controller/esp32h2/Kconfig.in @@ -613,3 +613,62 @@ config BT_LE_CCA_RSSI_THRESH default 20 help Power threshold of CCA in unit of -1 dBm. + +choice BT_LE_DFT_TX_POWER_LEVEL_DBM + prompt "BLE default Tx power level(dBm)" + default BT_LE_DFT_TX_POWER_LEVEL_P9 + help + Specify default Tx power level(dBm). + config BT_LE_DFT_TX_POWER_LEVEL_N24 + bool "-24dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N21 + bool "-21dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N18 + bool "-18dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N15 + bool "-15dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N12 + bool "-12dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N9 + bool "-9dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N6 + bool "-6dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N3 + bool "-3dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N0 + bool "0dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P3 + bool "+3dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P6 + bool "+6dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P9 + bool "+9dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P12 + bool "+12dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P15 + bool "+15dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P18 + bool "+18dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P20 + bool "+20dBm" +endchoice + +config BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF + int + default -24 if BT_LE_DFT_TX_POWER_LEVEL_N24 + default -21 if BT_LE_DFT_TX_POWER_LEVEL_N21 + default -18 if BT_LE_DFT_TX_POWER_LEVEL_N18 + default -15 if BT_LE_DFT_TX_POWER_LEVEL_N15 + default -12 if BT_LE_DFT_TX_POWER_LEVEL_N12 + default -9 if BT_LE_DFT_TX_POWER_LEVEL_N9 + default -6 if BT_LE_DFT_TX_POWER_LEVEL_N6 + default -3 if BT_LE_DFT_TX_POWER_LEVEL_N3 + default 0 if BT_LE_DFT_TX_POWER_LEVEL_N0 + default 3 if BT_LE_DFT_TX_POWER_LEVEL_P3 + default 6 if BT_LE_DFT_TX_POWER_LEVEL_P6 + default 9 if BT_LE_DFT_TX_POWER_LEVEL_P9 + default 12 if BT_LE_DFT_TX_POWER_LEVEL_P12 + default 15 if BT_LE_DFT_TX_POWER_LEVEL_P15 + default 18 if BT_LE_DFT_TX_POWER_LEVEL_P18 + default 20 if BT_LE_DFT_TX_POWER_LEVEL_P20 + default 0 diff --git a/components/bt/controller/esp32h2/esp_bt_cfg.h b/components/bt/controller/esp32h2/esp_bt_cfg.h index b8bbfd3d4b7..22a09be3adc 100644 --- a/components/bt/controller/esp32h2/esp_bt_cfg.h +++ b/components/bt/controller/esp32h2/esp_bt_cfg.h @@ -216,8 +216,7 @@ extern "C" { #define RTC_FREQ_N (32768) /* in Hz */ -#define BLE_LL_TX_PWR_DBM_N (9) - +#define BLE_LL_TX_PWR_DBM_N (CONFIG_BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF) #define RUN_BQB_TEST (0) #define RUN_QA_TEST (0) From 1a19463ceb0e977f36d77ce53a9c6a23db364978 Mon Sep 17 00:00:00 2001 From: zwl Date: Wed, 17 Jul 2024 17:27:42 +0800 Subject: [PATCH 069/113] feat(bluetooth/controller): support default tx power configurable on ESP32C2 --- components/bt/controller/esp32c2/Kconfig.in | 59 +++++++++++++++++++ components/bt/controller/esp32c2/esp_bt_cfg.h | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/components/bt/controller/esp32c2/Kconfig.in b/components/bt/controller/esp32c2/Kconfig.in index 8699b6b56c5..75355ed098e 100644 --- a/components/bt/controller/esp32c2/Kconfig.in +++ b/components/bt/controller/esp32c2/Kconfig.in @@ -540,3 +540,62 @@ config BT_LE_ROLE_OBSERVER_ENABLE default y help Enable observer role function. + +choice BT_LE_DFT_TX_POWER_LEVEL_DBM + prompt "BLE default Tx power level(dBm)" + default BT_LE_DFT_TX_POWER_LEVEL_P9 + help + Specify default Tx power level(dBm). + config BT_LE_DFT_TX_POWER_LEVEL_N24 + bool "-24dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N21 + bool "-21dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N18 + bool "-18dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N15 + bool "-15dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N12 + bool "-12dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N9 + bool "-9dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N6 + bool "-6dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N3 + bool "-3dBm" + config BT_LE_DFT_TX_POWER_LEVEL_N0 + bool "0dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P3 + bool "+3dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P6 + bool "+6dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P9 + bool "+9dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P12 + bool "+12dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P15 + bool "+15dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P18 + bool "+18dBm" + config BT_LE_DFT_TX_POWER_LEVEL_P20 + bool "+20dBm" +endchoice + +config BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF + int + default -24 if BT_LE_DFT_TX_POWER_LEVEL_N24 + default -21 if BT_LE_DFT_TX_POWER_LEVEL_N21 + default -18 if BT_LE_DFT_TX_POWER_LEVEL_N18 + default -15 if BT_LE_DFT_TX_POWER_LEVEL_N15 + default -12 if BT_LE_DFT_TX_POWER_LEVEL_N12 + default -9 if BT_LE_DFT_TX_POWER_LEVEL_N9 + default -6 if BT_LE_DFT_TX_POWER_LEVEL_N6 + default -3 if BT_LE_DFT_TX_POWER_LEVEL_N3 + default 0 if BT_LE_DFT_TX_POWER_LEVEL_N0 + default 3 if BT_LE_DFT_TX_POWER_LEVEL_P3 + default 6 if BT_LE_DFT_TX_POWER_LEVEL_P6 + default 9 if BT_LE_DFT_TX_POWER_LEVEL_P9 + default 12 if BT_LE_DFT_TX_POWER_LEVEL_P12 + default 15 if BT_LE_DFT_TX_POWER_LEVEL_P15 + default 18 if BT_LE_DFT_TX_POWER_LEVEL_P18 + default 20 if BT_LE_DFT_TX_POWER_LEVEL_P20 + default 0 diff --git a/components/bt/controller/esp32c2/esp_bt_cfg.h b/components/bt/controller/esp32c2/esp_bt_cfg.h index ff0db7c8919..456ddcf9a85 100644 --- a/components/bt/controller/esp32c2/esp_bt_cfg.h +++ b/components/bt/controller/esp32c2/esp_bt_cfg.h @@ -241,7 +241,7 @@ extern "C" { #define RTC_FREQ_N (32000) /* in Hz */ #endif // CONFIG_XTAL_FREQ_26 -#define BLE_LL_TX_PWR_DBM_N (9) +#define BLE_LL_TX_PWR_DBM_N (CONFIG_BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF) #define RUN_BQB_TEST (0) From 01ee296db0e6444749ffdcbd8cd07305ab0172d6 Mon Sep 17 00:00:00 2001 From: Jan Beran Date: Mon, 15 Jul 2024 10:11:15 +0200 Subject: [PATCH 070/113] fix: fix various errors in Kconfig files --- components/app_trace/Kconfig | 7 ++++--- components/bootloader/Kconfig.log.format | 4 +++- components/bootloader/Kconfig.projbuild | 26 ++++++++++++------------ components/esp_system/Kconfig | 4 ++-- components/log/Kconfig.format | 8 ++++++-- components/mbedtls/Kconfig | 4 ++-- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/components/app_trace/Kconfig b/components/app_trace/Kconfig index 9ff09cdb595..be61cfd49ef 100644 --- a/components/app_trace/Kconfig +++ b/components/app_trace/Kconfig @@ -14,6 +14,7 @@ menu "Application Level Tracing" config APPTRACE_DEST_NONE bool "None" + endchoice config APPTRACE_DEST_UART @@ -60,7 +61,7 @@ menu "Application Level Tracing" endchoice config APPTRACE_UART_TX_GPIO - int "UART TX on GPIO#" + int "UART TX on GPIO" depends on APPTRACE_DEST_UART_NOUSB range 0 46 default 12 if IDF_TARGET_ESP32 @@ -70,7 +71,7 @@ menu "Application Level Tracing" This GPIO is used for UART TX pin. config APPTRACE_UART_RX_GPIO - int "UART RX on GPIO#" + int "UART RX on GPIO" depends on APPTRACE_DEST_UART_NOUSB range 0 46 default 13 if IDF_TARGET_ESP32 @@ -213,7 +214,7 @@ menu "Application Level Tracing" depends on APPTRACE_SV_ENABLE default APPTRACE_SV_DEST_JTAG help - SystemView witt transfer data trough defined interface. + SystemView will transfer data through the defined interface. config APPTRACE_SV_DEST_JTAG bool "Data destination JTAG" diff --git a/components/bootloader/Kconfig.log.format b/components/bootloader/Kconfig.log.format index 985fa5f43a4..b1b877b0a99 100644 --- a/components/bootloader/Kconfig.log.format +++ b/components/bootloader/Kconfig.log.format @@ -28,9 +28,11 @@ menu "Format" config BOOTLOADER_LOG_TIMESTAMP_SOURCE_NONE bool "None" - depends on No # hide it now, turn it on final MR + depends on NO_SYMBOL # hide it now, turn it on final MR + config BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS bool "Milliseconds Since Boot" + endchoice # BOOTLOADER_LOG_TIMESTAMP_SOURCE endmenu diff --git a/components/bootloader/Kconfig.projbuild b/components/bootloader/Kconfig.projbuild index 4ac03c56cd1..ea0ea7d4bda 100644 --- a/components/bootloader/Kconfig.projbuild +++ b/components/bootloader/Kconfig.projbuild @@ -145,7 +145,7 @@ menu "Bootloader config" config BOOTLOADER_FACTORY_RESET bool "GPIO triggers factory reset" - default N + default n select BOOTLOADER_RESERVE_RTC_MEM if SOC_RTC_FAST_MEM_SUPPORTED help Allows to reset the device to factory settings: @@ -200,7 +200,7 @@ menu "Bootloader config" config BOOTLOADER_APP_TEST bool "GPIO triggers boot from test app partition" - default N + default n depends on !BOOTLOADER_APP_ANTI_ROLLBACK help Allows to run the test app from "TEST" partition. @@ -763,7 +763,7 @@ menu "Security features" config SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE bool "Enable Aggressive key revoke strategy" depends on SECURE_BOOT && SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY - default N + default n help If this option is set, ROM bootloader will revoke the public key digest burned in efuse block if it fails to verify the signature of software bootloader with it. @@ -779,7 +779,7 @@ menu "Security features" config SECURE_BOOT_FLASH_BOOTLOADER_DEFAULT bool "Flash bootloader along with other artifacts when using the default flash command" depends on SECURE_BOOT_V2_ENABLED && SECURE_BOOT_BUILD_SIGNED_BINARIES - default N + default n help When Secure Boot V2 is enabled, by default the bootloader is not flashed along with other artifacts like the application and the partition table images, i.e. bootloader has to be separately flashed @@ -819,7 +819,7 @@ menu "Security features" config SECURE_BOOT_INSECURE bool "Allow potentially insecure options" depends on SECURE_BOOT - default N + default n help You can disable some of the default protections offered by secure boot, in order to enable testing or a custom combination of security features. @@ -830,7 +830,7 @@ menu "Security features" config SECURE_FLASH_ENC_ENABLED bool "Enable flash encryption on boot (READ DOCS FIRST)" - default N + default n select SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE help If this option is set, flash contents will be encrypted by the bootloader on first boot. @@ -917,7 +917,7 @@ menu "Security features" config SECURE_BOOT_ALLOW_ROM_BASIC bool "Leave ROM BASIC Interpreter available on reset" depends on (SECURE_BOOT_INSECURE || SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT) && IDF_TARGET_ESP32 - default N + default n help By default, the BASIC ROM Console starts on reset if no valid bootloader is read from the flash. @@ -932,7 +932,7 @@ menu "Security features" bool "Allow JTAG Debugging" depends on SECURE_BOOT_INSECURE || SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT select SECURE_FLASH_SKIP_WRITE_PROTECTION_CACHE if SECURE_FLASH_HAS_WRITE_PROTECTION_CACHE - default N + default n help If not set (default), the bootloader will permanently disable JTAG (across entire chip) on first boot when either secure boot or flash encryption is enabled. @@ -979,7 +979,7 @@ menu "Security features" config SECURE_BOOT_ALLOW_UNUSED_DIGEST_SLOTS bool "Leave unused digest slots available (not revoke)" depends on SECURE_BOOT_INSECURE && SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS - default N + default n help If not set (default), during startup in the app all unused digest slots will be revoked. To revoke unused slot will be called esp_efuse_set_digest_revoke(num_digest) for each digest. @@ -998,7 +998,7 @@ menu "Security features" bool "Leave UART bootloader encryption enabled" depends on SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT select SECURE_FLASH_SKIP_WRITE_PROTECTION_CACHE if SECURE_FLASH_HAS_WRITE_PROTECTION_CACHE - default N + default n help If not set (default), the bootloader will permanently disable UART bootloader encryption access on first boot. If set, the UART bootloader will still be able to access hardware encryption. @@ -1008,7 +1008,7 @@ menu "Security features" config SECURE_FLASH_UART_BOOTLOADER_ALLOW_DEC bool "Leave UART bootloader decryption enabled" depends on SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT && IDF_TARGET_ESP32 - default N + default n help If not set (default), the bootloader will permanently disable UART bootloader decryption access on first boot. If set, the UART bootloader will still be able to access hardware decryption. @@ -1020,7 +1020,7 @@ menu "Security features" bool "Leave UART bootloader flash cache enabled" depends on SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT && \ (IDF_TARGET_ESP32 || SOC_EFUSE_DIS_DOWNLOAD_ICACHE || SOC_EFUSE_DIS_DOWNLOAD_DCACHE) # NOERROR - default N + default n select SECURE_FLASH_SKIP_WRITE_PROTECTION_CACHE if SECURE_FLASH_HAS_WRITE_PROTECTION_CACHE help If not set (default), the bootloader will permanently disable UART bootloader flash cache access on @@ -1031,7 +1031,7 @@ menu "Security features" config SECURE_FLASH_REQUIRE_ALREADY_ENABLED bool "Require flash encryption to be already enabled" depends on SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT - default N + default n help If not set (default), and flash encryption is not yet enabled in eFuses, the 2nd stage bootloader will enable flash encryption: generate the flash encryption key and program eFuses. diff --git a/components/esp_system/Kconfig b/components/esp_system/Kconfig index 5a64617fed7..10fb36e3595 100644 --- a/components/esp_system/Kconfig +++ b/components/esp_system/Kconfig @@ -315,7 +315,7 @@ menu "ESP System Settings" default -1 if ESP_CONSOLE_NONE config ESP_CONSOLE_UART_TX_GPIO - int "UART TX on GPIO#" + int "UART TX on GPIO" depends on ESP_CONSOLE_UART_CUSTOM range 0 SOC_GPIO_OUT_RANGE_MAX default 1 if IDF_TARGET_ESP32 @@ -335,7 +335,7 @@ menu "ESP System Settings" is reconfigured after the bootloader exits and the app starts. config ESP_CONSOLE_UART_RX_GPIO - int "UART RX on GPIO#" + int "UART RX on GPIO" depends on ESP_CONSOLE_UART_CUSTOM range 0 SOC_GPIO_IN_RANGE_MAX default 3 if IDF_TARGET_ESP32 diff --git a/components/log/Kconfig.format b/components/log/Kconfig.format index 9e5b1bc6f72..ba0c6286ed8 100644 --- a/components/log/Kconfig.format +++ b/components/log/Kconfig.format @@ -39,14 +39,18 @@ menu "Format" config LOG_TIMESTAMP_SOURCE_NONE bool "None" - depends on No # hide it now, turn it on final MR + depends on NO_SYMBOL # hide it now, turn it on final MR + config LOG_TIMESTAMP_SOURCE_RTOS bool "Milliseconds Since Boot" + config LOG_TIMESTAMP_SOURCE_SYSTEM bool "System Time (HH:MM:SS.sss)" + config LOG_TIMESTAMP_SOURCE_SYSTEM_FULL bool "System Time (YY-MM-DD HH:MM:SS.sss)" - depends on No # hide it now, turn it on final MR + depends on NO_SYMBOL # hide it now, turn it on final MR + endchoice # LOG_TIMESTAMP_SOURCE endmenu diff --git a/components/mbedtls/Kconfig b/components/mbedtls/Kconfig index 0f4b84eb97f..77a92287c8a 100644 --- a/components/mbedtls/Kconfig +++ b/components/mbedtls/Kconfig @@ -246,11 +246,11 @@ menu "mbedTLS" See mbedTLS documentation for required API and more details. config MBEDTLS_PKCS7_C - bool "Enable PKCS #7" + bool "Enable PKCS number 7" default y depends on MBEDTLS_X509_CRL_PARSE_C help - Enable PKCS #7 core for using PKCS #7-formatted signatures. + Enable PKCS number 7 core for using PKCS number 7-formatted signatures. config MBEDTLS_SSL_CID_PADDING_GRANULARITY int "Record plaintext padding" From cd59d96ff44d23977c954d8c9a6bdc9eb0c5afa6 Mon Sep 17 00:00:00 2001 From: Aleksei Apaseev Date: Tue, 2 Jul 2024 17:38:41 +0800 Subject: [PATCH 071/113] ci: add dut_log_url column to failed testcases report Introduced changes: - add xml attribute "dut_log_url" to pytest report - add column "dut_log_url" to failed testcases table of dynamic pipeline report - make the table header sticky - add permalinks to the Table Titles - split target test report by testcase type for better clarity - fix the logic of finding the testcases failed on cur branch / other branches --- .gitlab/ci/post_deploy.yml | 1 + conftest.py | 28 ++ tools/ci/dynamic_pipelines/models.py | 1 + tools/ci/dynamic_pipelines/report.py | 361 ++++++++++++------ .../scripts/generate_report.py | 12 +- .../templates/generate_target_test_report.yml | 3 + .../templates/report.template.html | 53 ++- .../reports_sample_data/XUNIT_REPORT.xml | 34 +- .../expected_job_report.html | 56 ++- .../expected_target_test_report.html | 102 +++-- .../test_report_generator.py | 31 +- tools/ci/dynamic_pipelines/utils.py | 51 ++- 12 files changed, 531 insertions(+), 202 deletions(-) diff --git a/.gitlab/ci/post_deploy.yml b/.gitlab/ci/post_deploy.yml index 0c28b547511..fe1ea90f834 100644 --- a/.gitlab/ci/post_deploy.yml +++ b/.gitlab/ci/post_deploy.yml @@ -3,6 +3,7 @@ generate_failed_jobs_report: tags: [build, shiny] image: $ESP_ENV_IMAGE when: always + dependencies: [] # Do not download artifacts from the previous stages artifacts: expire_in: 1 week when: always diff --git a/conftest.py b/conftest.py index 7d8290b071f..af6d356a0e6 100644 --- a/conftest.py +++ b/conftest.py @@ -252,6 +252,34 @@ def set_test_case_name(request: FixtureRequest, test_case_name: str) -> None: request.node.funcargs['test_case_name'] = test_case_name +@pytest.fixture(autouse=True) +def set_dut_log_url(record_xml_attribute: t.Callable[[str, object], None], _pexpect_logfile: str) -> t.Generator: + # Record the "dut_log_url" attribute in the XML report once test execution finished + yield + + if not isinstance(_pexpect_logfile, str): + record_xml_attribute('dut_log_url', 'No log URL found') + return + + ci_pages_url = os.getenv('CI_PAGES_URL') + logdir_pattern = re.compile(rf'({DEFAULT_LOGDIR}/.*)') + match = logdir_pattern.search(_pexpect_logfile) + + if not match: + record_xml_attribute('dut_log_url', 'No log URL found') + return + + if not ci_pages_url: + record_xml_attribute('dut_log_url', _pexpect_logfile) + return + + job_id = os.getenv('CI_JOB_ID', '0') + modified_ci_pages_url = ci_pages_url.replace('esp-idf', '-/esp-idf') + log_url = f'{modified_ci_pages_url}/-/jobs/{job_id}/artifacts/{match.group(1)}' + + record_xml_attribute('dut_log_url', log_url) + + ###################### # Log Util Functions # ###################### diff --git a/tools/ci/dynamic_pipelines/models.py b/tools/ci/dynamic_pipelines/models.py index e661e3ded31..b40d827448d 100644 --- a/tools/ci/dynamic_pipelines/models.py +++ b/tools/ci/dynamic_pipelines/models.py @@ -166,6 +166,7 @@ def from_test_case_node(cls, node: Element) -> t.Optional['TestCase']: 'time': float(node.attrib.get('time') or 0), 'ci_job_url': node.attrib.get('ci_job_url') or '', 'ci_dashboard_url': f'{grafana_base_url}?{encoded_params}', + 'dut_log_url': node.attrib.get('dut_log_url') or 'Not found', } failure_node = node.find('failure') diff --git a/tools/ci/dynamic_pipelines/report.py b/tools/ci/dynamic_pipelines/report.py index dd3951c107d..be8fce0af35 100644 --- a/tools/ci/dynamic_pipelines/report.py +++ b/tools/ci/dynamic_pipelines/report.py @@ -1,11 +1,13 @@ # SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import abc +import copy import fnmatch import html import os import re import typing as t +from textwrap import dedent import yaml from artifacts_handler import ArtifactType @@ -21,20 +23,24 @@ from .models import GitlabJob from .models import TestCase from .utils import fetch_failed_testcases_failure_ratio +from .utils import format_permalink +from .utils import get_report_url from .utils import is_url from .utils import load_known_failure_cases class ReportGenerator: - REGEX_PATTERN = '#### {}[^####]+' + REGEX_PATTERN = r'#### {}\n[\s\S]*?(?=\n#### |$)' - def __init__(self, project_id: int, mr_iid: int, pipeline_id: int, *, title: str): + def __init__(self, project_id: int, mr_iid: int, pipeline_id: int, job_id: int, commit_id: str, *, title: str): gl_project = Gitlab(project_id).project if mr_iid is not None: self.mr = gl_project.mergerequests.get(mr_iid) else: self.mr = None self.pipeline_id = pipeline_id + self.job_id = job_id + self.commit_id = commit_id self.title = title self.output_filepath = self.title.lower().replace(' ', '_') + '.html' @@ -47,10 +53,30 @@ def get_download_link_for_url(url: str) -> str: return '' + def write_report_to_file(self, report_str: str, job_id: int, output_filepath: str) -> t.Optional[str]: + """ + Writes the report to a file and constructs a modified URL based on environment settings. + + :param report_str: The report content to be written to the file. + :param job_id: The job identifier used to construct the URL. + :param output_filepath: The path to the output file. + :return: The modified URL pointing to the job's artifacts. + """ + if not report_str: + return None + with open(output_filepath, 'w') as file: + file.write(report_str) + + # for example, {URL}/-/esp-idf/-/jobs/{id}/artifacts/list_job_84.txt + # CI_PAGES_URL is {URL}/esp-idf, which missed one `-` + report_url: str = get_report_url(job_id, output_filepath) + return report_url + def generate_html_report(self, table_str: str) -> str: # we're using bootstrap table - table_str = table_str.replace('', '
') - + table_str = table_str.replace( + '
', '
' + ) with open(REPORT_TEMPLATE_FILEPATH) as fr: template = fr.read() @@ -62,19 +88,16 @@ def table_to_html_str(table: PrettyTable) -> str: def create_table_section( self, - report_sections: list, title: str, items: list, headers: list, row_attrs: list, value_functions: t.Optional[list] = None, - ) -> None: + ) -> t.List: """ Appends a formatted section to a report based on the provided items. This section includes a header and a table constructed from the items list with specified headers and attributes. - :param report_sections: List where the HTML report sections are collected. This list is - modified in-place by appending new sections. :param title: Title for the report section. This title is used as a header above the table. :param items: List of item objects to include in the table. Each item should have attributes that correspond to the row_attrs and value_functions specified. @@ -86,17 +109,34 @@ def create_table_section( a function that takes an item and returns a string. This is used for generating dynamic columns based on item data. - :return: None. The function modifies the 'report_sections' list by appending new HTML sections. + :return: List with appended HTML sections. """ if not items: - return + return [] - report_sections.append(f'

{title}

') - report_sections.append( + report_sections = [ + f"""

{title}

""", self._create_table_for_items( items=items, headers=headers, row_attrs=row_attrs, value_functions=value_functions or [] - ) - ) + ), + ] + return report_sections + + @staticmethod + def generate_additional_info_section(title: str, count: int, report_url: t.Optional[str] = None) -> str: + """ + Generate a section for the additional info string. + + :param title: The title of the section. + :param count: The count of test cases. + :param report_url: The URL of the report. If count = 0, only the count will be included. + :return: The formatted additional info section string. + """ + if count != 0 and report_url: + return f'- **{title}:** [{count}]({report_url}/#{format_permalink(title)})\n' + else: + return f'- **{title}:** {count}\n' def _create_table_for_items( self, @@ -185,7 +225,7 @@ def key_func(item: t.Any) -> t.Any: def _get_report_str(self) -> str: raise NotImplementedError - def post_report(self, job_id: int, commit_id: str) -> None: + def post_report(self, print_report_path: bool = True) -> None: # report in html format, otherwise will exceed the limit comment = f'#### {self.title}\n' @@ -194,18 +234,12 @@ def post_report(self, job_id: int, commit_id: str) -> None: if self.additional_info: comment += f'{self.additional_info}\n' - if report_str: - with open(self.output_filepath, 'w') as fw: - fw.write(report_str) - - # for example, {URL}/-/esp-idf/-/jobs/{id}/artifacts/list_job_84.txt - # CI_PAGES_URL is {URL}/esp-idf, which missed one `-` - url = os.getenv('CI_PAGES_URL', '').replace('esp-idf', '-/esp-idf') + report_url_path = self.write_report_to_file(report_str, self.job_id, self.output_filepath) + if print_report_path and report_url_path: + comment += dedent(f""" + Full {self.title} here: {report_url_path} (with commit {self.commit_id[:8]} - comment += f""" -Full {self.title} here: {url}/-/jobs/{job_id}/artifacts/{self.output_filepath} (with commit {commit_id[:8]}) - -""" + """) print(comment) if self.mr is None: @@ -234,11 +268,13 @@ def __init__( project_id: int, mr_iid: int, pipeline_id: int, + job_id: int, + commit_id: str, *, title: str = 'Build Report', apps: t.List[App], ): - super().__init__(project_id, mr_iid, pipeline_id, title=title) + super().__init__(project_id, mr_iid, pipeline_id, job_id, commit_id, title=title) self.apps = apps self.apps_presigned_url_filepath = TEST_RELATED_APPS_DOWNLOAD_URLS_FILENAME @@ -365,14 +401,26 @@ def __init__( project_id: int, mr_iid: int, pipeline_id: int, + job_id: int, + commit_id: str, *, title: str = 'Target Test Report', test_cases: t.List[TestCase], ): - super().__init__(project_id, mr_iid, pipeline_id, title=title) + super().__init__(project_id, mr_iid, pipeline_id, job_id, commit_id, title=title) self.test_cases = test_cases self._known_failure_cases_set = None + self.report_titles_map = { + 'failed_yours': 'Failed Test Cases on Your branch (Excludes Known Failure Cases)', + 'failed_others': 'Failed Test Cases on Other branches (Excludes Known Failure Cases)', + 'failed_known': 'Known Failure Cases', + 'skipped': 'Skipped Test Cases', + 'succeeded': 'Succeeded Test Cases', + } + self.skipped_test_cases_report_file = 'skipped_cases.html' + self.succeeded_cases_report_file = 'succeeded_cases.html' + self.failed_cases_report_file = 'failed_cases.html' @property def known_failure_cases_set(self) -> t.Optional[t.Set[str]]: @@ -382,6 +430,10 @@ def known_failure_cases_set(self) -> t.Optional[t.Set[str]]: return self._known_failure_cases_set def get_known_failure_cases(self) -> t.List[TestCase]: + """ + Retrieve the known failure test cases. + :return: A list of known failure test cases. + """ if self.known_failure_cases_set is None: return [] matched_cases = [ @@ -392,109 +444,187 @@ def get_known_failure_cases(self) -> t.List[TestCase]: ] return matched_cases - def _get_report_str(self) -> str: + @staticmethod + def filter_test_cases( + cur_branch_failures: t.List[TestCase], + other_branch_failures: t.List[TestCase], + ) -> t.Tuple[t.List[TestCase], t.List[TestCase]]: """ - Generate a complete HTML report string by processing test cases. - :return: Complete HTML report string. + Filter the test cases into current branch failures and other branch failures. + + :param cur_branch_failures: List of failed test cases on the current branch. + :param other_branch_failures: List of failed test cases on other branches. + :return: A tuple containing two lists: + - failed_test_cases_cur_branch_only: Test cases that have failed only on the current branch. + - failed_test_cases_other_branch_exclude_cur_branch: Test cases that have failed on other branches + excluding the current branch. """ - report_parts: list = [] + cur_branch_unique_failures = [] + other_branch_failure_map = {tc.name: tc for tc in other_branch_failures} + + for cur_tc in cur_branch_failures: + if cur_tc.latest_failed_count > 0 and ( + cur_tc.name not in other_branch_failure_map + or other_branch_failure_map[cur_tc.name].latest_failed_count == 0 + ): + cur_branch_unique_failures.append(cur_tc) + uniq_fail_names = {cur_tc.name for cur_tc in cur_branch_unique_failures} + other_branch_exclusive_failures = [tc for tc in other_branch_failures if tc.name not in uniq_fail_names] + return cur_branch_unique_failures, other_branch_exclusive_failures + + def get_failed_cases_report_parts(self) -> t.List[str]: + """ + Generate the report parts for failed test cases and update the additional info section. + :return: A list of strings representing the table sections for the failed test cases. + """ known_failures = self.get_known_failure_cases() - known_failure_case_names = {case.name for case in known_failures} failed_test_cases = self._filter_items( - self.test_cases, lambda tc: tc.is_failure and tc.name not in known_failure_case_names - ) - failed_test_cases_with_ratio = self._sort_items( - fetch_failed_testcases_failure_ratio(failed_test_cases), key='latest_failed_count' + self.test_cases, lambda tc: tc.is_failure and tc.name not in {case.name for case in known_failures} ) - skipped_test_cases = self._filter_items(self.test_cases, lambda tc: tc.is_skipped) - successful_test_cases = self._filter_items(self.test_cases, lambda tc: tc.is_success) - - current_branch_failures = self._sort_items( - self._filter_items(failed_test_cases_with_ratio, lambda tc: tc.latest_failed_count == 0), + failed_test_cases_cur_branch = self._sort_items( + fetch_failed_testcases_failure_ratio( + copy.deepcopy(failed_test_cases), + branches_filter={'include_branches': [os.getenv('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', '')]}, + ), key='latest_failed_count', ) - other_branch_failures = self._sort_items( - self._filter_items( - failed_test_cases_with_ratio, lambda tc: tc.name not in [t.name for t in current_branch_failures] + failed_test_cases_other_branch = self._sort_items( + fetch_failed_testcases_failure_ratio( + copy.deepcopy(failed_test_cases), + branches_filter={'exclude_branches': [os.getenv('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', '')]}, ), key='latest_failed_count', ) - - self.create_table_section( - report_sections=report_parts, - title='Failed Test Cases on Your branch (Excludes Known Failure Cases)', - items=current_branch_failures, + failed_test_cases_cur_branch, failed_test_cases_other_branch = self.filter_test_cases( + failed_test_cases_cur_branch, failed_test_cases_other_branch + ) + cur_branch_cases_table_section = self.create_table_section( + title=self.report_titles_map['failed_yours'], + items=failed_test_cases_cur_branch, headers=[ 'Test Case', 'Test Script File Path', 'Failure Reason', - 'Failures across all other branches (20 latest testcases)', + f'Failures on your branch (40 latest testcases)', + 'Dut Log URL', 'Job URL', 'Grafana URL', ], - row_attrs=['name', 'file', 'failure', 'ci_job_url', 'ci_dashboard_url'], + row_attrs=['name', 'file', 'failure', 'dut_log_url', 'ci_job_url', 'ci_dashboard_url'], value_functions=[ ( - 'Failures across all other branches (20 latest testcases)', + 'Failures on your branch (40 latest testcases)', lambda item: f"{getattr(item, 'latest_failed_count', '')} / {getattr(item, 'latest_total_count', '')}", ) ], ) - self.create_table_section( - report_sections=report_parts, - title='Failed Test Cases on Other branches (Excludes Known Failure Cases)', - items=other_branch_failures, + other_branch_cases_table_section = self.create_table_section( + title=self.report_titles_map['failed_others'], + items=failed_test_cases_other_branch, headers=[ 'Test Case', 'Test Script File Path', 'Failure Reason', - 'Failures across all other branches (20 latest testcases)', + 'Failures across all other branches (40 latest testcases)', + 'Dut Log URL', 'Job URL', 'Grafana URL', ], - row_attrs=['name', 'file', 'failure', 'ci_job_url', 'ci_dashboard_url'], + row_attrs=['name', 'file', 'failure', 'dut_log_url', 'ci_job_url', 'ci_dashboard_url'], value_functions=[ ( - 'Failures across all other branches (20 latest testcases)', + 'Failures across all other branches (40 latest testcases)', lambda item: f"{getattr(item, 'latest_failed_count', '')} / {getattr(item, 'latest_total_count', '')}", ) ], ) - - self.create_table_section( - report_sections=report_parts, - title='Known Failure Cases', + known_failures_cases_table_section = self.create_table_section( + title=self.report_titles_map['failed_known'], items=known_failures, headers=['Test Case', 'Test Script File Path', 'Failure Reason', 'Job URL', 'Grafana URL'], row_attrs=['name', 'file', 'failure', 'ci_job_url', 'ci_dashboard_url'], ) - self.create_table_section( - report_sections=report_parts, - title='Skipped Test Cases', + failed_cases_report_url = self.write_report_to_file( + self.generate_html_report( + ''.join( + cur_branch_cases_table_section + + other_branch_cases_table_section + + known_failures_cases_table_section + ) + ), + self.job_id, + self.failed_cases_report_file, + ) + self.additional_info += self.generate_additional_info_section( + self.report_titles_map['failed_yours'], len(failed_test_cases_cur_branch), failed_cases_report_url + ) + self.additional_info += self.generate_additional_info_section( + self.report_titles_map['failed_others'], len(failed_test_cases_other_branch), failed_cases_report_url + ) + self.additional_info += self.generate_additional_info_section( + self.report_titles_map['failed_known'], len(known_failures), failed_cases_report_url + ) + return cur_branch_cases_table_section + other_branch_cases_table_section + known_failures_cases_table_section + + def get_skipped_cases_report_parts(self) -> t.List[str]: + """ + Generate the report parts for skipped test cases and update the additional info section. + :return: A list of strings representing the table sections for the skipped test cases. + """ + skipped_test_cases = self._filter_items(self.test_cases, lambda tc: tc.is_skipped) + skipped_cases_table_section = self.create_table_section( + title=self.report_titles_map['skipped'], items=skipped_test_cases, headers=['Test Case', 'Test Script File Path', 'Skipped Reason', 'Grafana URL'], row_attrs=['name', 'file', 'skipped', 'ci_dashboard_url'], ) - self.create_table_section( - report_sections=report_parts, - title='Succeeded Test Cases', - items=successful_test_cases, + skipped_cases_report_url = self.write_report_to_file( + self.generate_html_report(''.join(skipped_cases_table_section)), + self.job_id, + self.skipped_test_cases_report_file, + ) + self.additional_info += self.generate_additional_info_section( + self.report_titles_map['skipped'], len(skipped_test_cases), skipped_cases_report_url + ) + return skipped_cases_table_section + + def get_succeeded_cases_report_parts(self) -> t.List[str]: + """ + Generate the report parts for succeeded test cases and update the additional info section. + :return: A list of strings representing the table sections for the succeeded test cases. + """ + succeeded_test_cases = self._filter_items(self.test_cases, lambda tc: tc.is_success) + succeeded_cases_table_section = self.create_table_section( + title=self.report_titles_map['succeeded'], + items=succeeded_test_cases, headers=['Test Case', 'Test Script File Path', 'Job URL', 'Grafana URL'], row_attrs=['name', 'file', 'ci_job_url', 'ci_dashboard_url'], ) - - self.additional_info = ( - '**Test Case Summary:**\n' - f'- **Failed Test Cases on Your Branch (Excludes Known Failure Cases):** {len(current_branch_failures)}.\n' - f'- **Failed Test Cases on Other Branches (Excludes Known Failure Cases):** {len(other_branch_failures)}.\n' - f'- **Known Failures:** {len(known_failures)}\n' - f'- **Skipped Test Cases:** {len(skipped_test_cases)}\n' - f'- **Succeeded Test Cases:** {len(successful_test_cases)}\n\n' - 'Please check report below for more information.\n\n' + succeeded_cases_report_url = self.write_report_to_file( + self.generate_html_report(''.join(succeeded_cases_table_section)), + self.job_id, + self.succeeded_cases_report_file, + ) + self.additional_info += self.generate_additional_info_section( + self.report_titles_map['succeeded'], len(succeeded_test_cases), succeeded_cases_report_url ) + self.additional_info += '\n' + return succeeded_cases_table_section - return self.generate_html_report(''.join(report_parts)) + def _get_report_str(self) -> str: + """ + Generate a complete HTML report string by processing test cases. + :return: Complete HTML report string. + """ + self.additional_info = f'**Test Case Summary (with commit {self.commit_id[:8]}):**\n' + failed_cases_report_parts = self.get_failed_cases_report_parts() + skipped_cases_report_parts = self.get_skipped_cases_report_parts() + succeeded_cases_report_parts = self.get_succeeded_cases_report_parts() + + return self.generate_html_report( + ''.join(failed_cases_report_parts + skipped_cases_report_parts + succeeded_cases_report_parts) + ) class JobReportGenerator(ReportGenerator): @@ -503,12 +633,19 @@ def __init__( project_id: int, mr_iid: int, pipeline_id: int, + job_id: int, + commit_id: str, *, title: str = 'Job Report', jobs: t.List[GitlabJob], ): - super().__init__(project_id, mr_iid, pipeline_id, title=title) + super().__init__(project_id, mr_iid, pipeline_id, job_id, commit_id, title=title) self.jobs = jobs + self.report_titles_map = { + 'failed_jobs': 'Failed Jobs (Excludes "integration_test" and "target_test" jobs)', + 'succeeded': 'Succeeded Jobs', + } + self.failed_jobs_report_file = 'job_report.html' def _get_report_str(self) -> str: """ @@ -516,7 +653,6 @@ def _get_report_str(self) -> str: :return: Complete HTML report string. """ report_str: str = '' - report_parts: list = [] if not self.jobs: print('No jobs found, skip generating job report') @@ -530,34 +666,41 @@ def _get_report_str(self) -> str: ) succeeded_jobs = self._filter_items(self.jobs, lambda job: job.is_success) - self.additional_info = ( - '**Job Summary:**\n' - f'- **Failed Jobs (Excludes "integration_test" and "target_test" jobs):** {len(relevant_failed_jobs)}\n' - f'- **Succeeded Jobs:** {len(succeeded_jobs)}\n\n' + self.additional_info = f'**Job Summary (with commit {self.commit_id[:8]}):**\n' + self.additional_info += self.generate_additional_info_section( + self.report_titles_map['succeeded'], len(succeeded_jobs) ) - if relevant_failed_jobs: - self.create_table_section( - report_sections=report_parts, - title='Failed Jobs (Excludes "integration_test" and "target_test" jobs)', - items=relevant_failed_jobs, - headers=[ - 'Job Name', - 'Failure Reason', - 'Failure Log', - 'Failures across all other branches (10 latest jobs)', - 'URL', - 'CI Dashboard URL', - ], - row_attrs=['name', 'failure_reason', 'failure_log', 'url', 'ci_dashboard_url'], - value_functions=[ - ( - 'Failures across all other branches (10 latest jobs)', - lambda item: f"{getattr(item, 'latest_failed_count', '')} / {getattr(item, 'latest_total_count', '')}", - ) - ], + if not relevant_failed_jobs: + self.additional_info += self.generate_additional_info_section( + self.report_titles_map['failed_jobs'], len(relevant_failed_jobs) ) - self.additional_info += f'Please check report below for more information.\n\n' - report_str = self.generate_html_report(''.join(report_parts)) + return report_str + + report_sections = self.create_table_section( + title='Failed Jobs (Excludes "integration_test" and "target_test" jobs)', + items=relevant_failed_jobs, + headers=[ + 'Job Name', + 'Failure Reason', + 'Failure Log', + 'Failures across all other branches (10 latest jobs)', + 'URL', + 'CI Dashboard URL', + ], + row_attrs=['name', 'failure_reason', 'failure_log', 'url', 'ci_dashboard_url'], + value_functions=[ + ( + 'Failures across all other branches (10 latest jobs)', + lambda item: f"{getattr(item, 'latest_failed_count', '')} / {getattr(item, 'latest_total_count', '')}", + ) + ], + ) + relevant_failed_jobs_report_url = get_report_url(self.job_id, self.failed_jobs_report_file) + self.additional_info += self.generate_additional_info_section( + self.report_titles_map['failed_jobs'], len(relevant_failed_jobs), relevant_failed_jobs_report_url + ) + + report_str = self.generate_html_report(''.join(report_sections)) return report_str diff --git a/tools/ci/dynamic_pipelines/scripts/generate_report.py b/tools/ci/dynamic_pipelines/scripts/generate_report.py index bb2996d1910..5d2a361b941 100644 --- a/tools/ci/dynamic_pipelines/scripts/generate_report.py +++ b/tools/ci/dynamic_pipelines/scripts/generate_report.py @@ -74,17 +74,17 @@ def generate_build_report(args: argparse.Namespace) -> None: app for file_name in glob.glob(args.app_list_filepattern) for app in import_apps_from_txt(file_name) ] report_generator = BuildReportGenerator( - args.project_id, args.mr_iid, args.pipeline_id, apps=apps + args.project_id, args.mr_iid, args.pipeline_id, args.job_id, args.commit_id, apps=apps ) - report_generator.post_report(args.job_id, args.commit_id) + report_generator.post_report() def generate_target_test_report(args: argparse.Namespace) -> None: test_cases: t.List[t.Any] = parse_testcases_from_filepattern(args.junit_report_filepattern) report_generator = TargetTestReportGenerator( - args.project_id, args.mr_iid, args.pipeline_id, test_cases=test_cases + args.project_id, args.mr_iid, args.pipeline_id, args.job_id, args.commit_id, test_cases=test_cases ) - report_generator.post_report(args.job_id, args.commit_id) + report_generator.post_report(print_report_path=False) def generate_jobs_report(args: argparse.Namespace) -> None: @@ -93,8 +93,8 @@ def generate_jobs_report(args: argparse.Namespace) -> None: if not jobs: return - report_generator = JobReportGenerator(args.project_id, args.mr_iid, args.pipeline_id, jobs=jobs) - report_generator.post_report(args.job_id, args.commit_id) + report_generator = JobReportGenerator(args.project_id, args.mr_iid, args.pipeline_id, args.job_id, args.commit_id, jobs=jobs) + report_generator.post_report(print_report_path=False) if __name__ == '__main__': diff --git a/tools/ci/dynamic_pipelines/templates/generate_target_test_report.yml b/tools/ci/dynamic_pipelines/templates/generate_target_test_report.yml index 8fe17af72e7..88c27ff1608 100644 --- a/tools/ci/dynamic_pipelines/templates/generate_target_test_report.yml +++ b/tools/ci/dynamic_pipelines/templates/generate_target_test_report.yml @@ -6,6 +6,9 @@ generate_pytest_report: artifacts: paths: - target_test_report.html + - failed_cases.html + - skipped_cases.html + - succeeded_cases.html script: - python tools/ci/get_known_failure_cases_file.py - python tools/ci/dynamic_pipelines/scripts/generate_report.py --report-type target_test diff --git a/tools/ci/dynamic_pipelines/templates/report.template.html b/tools/ci/dynamic_pipelines/templates/report.template.html index 6997fa45c1c..bb35367f941 100644 --- a/tools/ci/dynamic_pipelines/templates/report.template.html +++ b/tools/ci/dynamic_pipelines/templates/report.template.html @@ -5,18 +5,29 @@ {{title}} + + @@ -24,8 +35,29 @@ + + + diff --git a/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/XUNIT_REPORT.xml b/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/XUNIT_REPORT.xml index 8f3737b75d8..0334a681550 100644 --- a/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/XUNIT_REPORT.xml +++ b/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/XUNIT_REPORT.xml @@ -1,7 +1,7 @@ - + conftest.py:74: in case_tester yield CaseTester(dut, **kwargs) tools/ci/idf_unity_tester.py:202: in __init__ @@ -18,7 +18,7 @@ tools/ci/idf_unity_tester.py:202: in __init__ raise EOFError E EOFError - + conftest.py:74: in case_tester yield CaseTester(dut, **kwargs) tools/ci/idf_unity_tester.py:202: in __init__ @@ -37,9 +37,9 @@ E EOFError - - - + + + /root/.espressif/python_env/idf5.2_py3.9_env/lib/python3.9/site-packages/pytest_embedded/plugin.py:1272: in pytest_runtest_call self._raise_dut_failed_cases_if_exists(duts) # type: ignore /root/.espressif/python_env/idf5.2_py3.9_env/lib/python3.9/site-packages/pytest_embedded/plugin.py:1207: in _raise_dut_failed_cases_if_exists @@ -48,19 +48,19 @@ E AssertionError: Unity test failed - - + + /builds/espressif/esp-idf/tools/test_build_system/test_common.py:134: Linux does not support executing .exe files - - - - - - + + + + + + - + /root/.espressif/python_env/idf5.2_py3.9_env/lib/python3.9/site-packages/pytest_embedded/dut.py:76: in wrapper @@ -95,7 +95,7 @@ E pexpect.exceptions.TIMEOUT: Not found "Press ENTER to see the list of t E Bytes in current buffer (color code eliminated): ce710,len:0x2afc entry 0x403cc710 E Please check the full log here: /builds/espressif/esp-idf/pytest_embedded/2024-05-17_17-50-04/esp32c3.release.test_esp_timer/dut.txt - + /root/.espressif/python_env/idf5.2_py3.9_env/lib/python3.9/site-packages/pytest_embedded/dut.py:76: in wrapper @@ -128,7 +128,7 @@ E pexpect.exceptions.TIMEOUT: Not found "re.compile(b'^[-]+\\s*(\\d+) Tes E Bytes in current buffer (color code eliminated): Serial port /dev/ttyUSB16 Connecting.... Connecting.... esptool.py v4.7.0 Found 1 serial ports Chip is ESP32-C3 (QFN32) (revision v0.3) Features: WiFi, BLE, Embedded Flash 4MB... (total 6673 bytes) E Please check the full log here: /builds/espressif/esp-idf/pytest_embedded/2024-05-17_17-50-04/esp32c3.512safe.test_wear_levelling/dut.txt - + /root/.espressif/python_env/idf5.2_py3.9_env/lib/python3.9/site-packages/pytest_embedded/dut.py:76: in wrapper @@ -161,7 +161,7 @@ E pexpect.exceptions.TIMEOUT: Not found "re.compile(b'^[-]+\\s*(\\d+) Tes E Bytes in current buffer (color code eliminated): Serial port /dev/ttyUSB16 Connecting.... Connecting.... esptool.py v4.7.0 Found 1 serial ports Chip is ESP32-C3 (QFN32) (revision v0.3) Features: WiFi, BLE, Embedded Flash 4MB... (total 24528 bytes) E Please check the full log here: /builds/espressif/esp-idf/pytest_embedded/2024-05-17_17-50-04/esp32c3.release.test_wear_levelling/dut.txt - + /root/.espressif/python_env/idf5.2_py3.9_env/lib/python3.9/site-packages/pytest_embedded/dut.py:76: in wrapper diff --git a/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/expected_job_report.html b/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/expected_job_report.html index cb76abeacf5..3c75ce390f2 100644 --- a/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/expected_job_report.html +++ b/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/expected_job_report.html @@ -5,22 +5,34 @@ Job Report + + -

Failed Jobs (Excludes "integration_test" and "target_test" jobs)

+

Failed Jobs (Excludes "integration_test" and "target_test" jobs)

@@ -61,8 +73,29 @@ + + + diff --git a/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/expected_target_test_report.html b/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/expected_target_test_report.html index 4353e38771a..c2d0b95c970 100644 --- a/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/expected_target_test_report.html +++ b/tools/ci/dynamic_pipelines/tests/test_report_generator/reports_sample_data/expected_target_test_report.html @@ -5,28 +5,41 @@ Test Report + + -

Failed Test Cases on Your branch (Excludes Known Failure Cases)

Job Name
+

Failed Test Cases on Other branches (Excludes Known Failure Cases)

- + + @@ -36,7 +49,8 @@ - + + @@ -44,7 +58,8 @@ - + + @@ -52,28 +67,17 @@ - + + - -
Test Case Test Script File Path Failure ReasonFailures across all other branches (20 latest testcases)Failures across all other branches (40 latest testcases)Dut Log URL Job URL Grafana URL
('esp32h2', 'esp32h2').('defaults', 'defaults').test_i2c_multi_device components/driver/test_apps/i2c_test_apps/pytest_i2c.py failed on setup with "EOFError"0 / 200 / 40link link
esp32c3.release.test_esp_timer components/esp_timer/test_apps/pytest_esp_timer_ut.py pexpect.exceptions.TIMEOUT: Not found "Press ENTER to see the list of tests" Bytes in current buffer (color code eliminated): ce710,len:0x2afc entry 0x403cc710 Please check the full log here: /builds/espressif/esp-idf/pytest_embedded/2024-05-17_17-50-04/esp32c3.release.test_esp_timer/dut.txt0 / 200 / 40link link
esp32c3.default.test_wpa_supplicant_ut components/wpa_supplicant/test_apps/pytest_wpa_supplicant_ut.py pexpect.exceptions.TIMEOUT: Not found "Press ENTER to see the list of tests" Bytes in current buffer (color code eliminated): 0 d4 000 00x0000 x0000x00 000000 0 Please check the full log here: /builds/espressif/esp-idf/pytest_embedded/2024-05-17_17-50-04/esp32c3.default.test_wpa_supplicant_ut/dut.txt0 / 200 / 40link link

Failed Test Cases on Other branches (Excludes Known Failure Cases)

- - - - - - - - - - - - + + @@ -81,7 +85,8 @@ - + + @@ -89,7 +94,8 @@ - + + @@ -97,12 +103,14 @@ - + + -
Test CaseTest Script File PathFailure ReasonFailures across all other branches (20 latest testcases)Job URLGrafana URL
('esp32h2', 'esp32h2').('default', 'default').test_i2s_multi_dev components/driver/test_apps/i2s_test_apps/i2s_multi_dev/pytest_i2s_multi_dev.py failed on setup with "EOFError"3 / 203 / 40link link
esp32c2.default.test_wpa_supplicant_ut components/wpa_supplicant/test_apps/pytest_wpa_supplicant_ut.py AssertionError: Unity test failed3 / 203 / 40link link
esp32c3.512safe.test_wear_levelling components/wear_levelling/test_apps/pytest_wear_levelling.py pexpect.exceptions.TIMEOUT: Not found "re.compile(b'^[-]+\\s*(\\d+) Tests (\\d+) Failures (\\d+) Ignored\\s*(?POK|FAIL)', re.MULTILINE)" Bytes in current buffer (color code eliminated): Serial port /dev/ttyUSB16 Connecting.... Connecting.... esptool.py v4.7.0 Found 1 serial ports Chip is ESP32-C3 (QFN32) (revision v0.3) Features: WiFi, BLE, Embedded Flash 4MB... (total 6673 bytes) Please check the full log here: /builds/espressif/esp-idf/pytest_embedded/2024-05-17_17-50-04/esp32c3.512safe.test_wear_levelling/dut.txt3 / 203 / 40link link
esp32c3.release.test_wear_levelling components/wear_levelling/test_apps/pytest_wear_levelling.py pexpect.exceptions.TIMEOUT: Not found "re.compile(b'^[-]+\\s*(\\d+) Tests (\\d+) Failures (\\d+) Ignored\\s*(?POK|FAIL)', re.MULTILINE)" Bytes in current buffer (color code eliminated): Serial port /dev/ttyUSB16 Connecting.... Connecting.... esptool.py v4.7.0 Found 1 serial ports Chip is ESP32-C3 (QFN32) (revision v0.3) Features: WiFi, BLE, Embedded Flash 4MB... (total 24528 bytes) Please check the full log here: /builds/espressif/esp-idf/pytest_embedded/2024-05-17_17-50-04/esp32c3.release.test_wear_levelling/dut.txt3 / 203 / 40link link

Known Failure Cases

+

Known Failure Cases

@@ -142,7 +150,8 @@ -
Test Caselink

Skipped Test Cases

+

Skipped Test Cases

@@ -159,7 +168,8 @@ -
Test Caselink

Succeeded Test Cases

+

Succeeded Test Cases

@@ -228,8 +238,29 @@ + + + diff --git a/tools/ci/dynamic_pipelines/tests/test_report_generator/test_report_generator.py b/tools/ci/dynamic_pipelines/tests/test_report_generator/test_report_generator.py index 551eaece9f5..abdd8a7b646 100644 --- a/tools/ci/dynamic_pipelines/tests/test_report_generator/test_report_generator.py +++ b/tools/ci/dynamic_pipelines/tests/test_report_generator/test_report_generator.py @@ -46,6 +46,17 @@ def setup_patches(self) -> None: self.addCleanup(self.gitlab_patcher.stop) self.addCleanup(self.env_patcher.stop) self.addCleanup(self.failure_rate_patcher.stop) + self.addCleanup(self.cleanup_files) + + def cleanup_files(self) -> None: + files_to_delete = [ + self.target_test_report_generator.skipped_test_cases_report_file, + self.target_test_report_generator.succeeded_cases_report_file, + self.target_test_report_generator.failed_cases_report_file, + ] + for file_path in files_to_delete: + if os.path.exists(file_path): + os.remove(file_path) def load_test_and_job_reports(self) -> None: self.expected_target_test_report_html = load_file( @@ -62,9 +73,23 @@ def create_report_generators(self) -> None: jobs = [GitlabJob.from_json_data(job_json, failure_rates.get(job_json['name'], {})) for job_json in json.loads(jobs_response_raw)['jobs']] test_cases = parse_testcases_from_filepattern(os.path.join(self.reports_sample_data_path, 'XUNIT_*.xml')) self.target_test_report_generator = TargetTestReportGenerator( - project_id=123, mr_iid=1, pipeline_id=456, title='Test Report', test_cases=test_cases) + project_id=123, + mr_iid=1, + pipeline_id=456, + job_id=0, + commit_id='cccc', + title='Test Report', + test_cases=test_cases + ) self.job_report_generator = JobReportGenerator( - project_id=123, mr_iid=1, pipeline_id=456, title='Job Report', jobs=jobs) + project_id=123, + mr_iid=1, + pipeline_id=456, + job_id=0, + commit_id='cccc', + title='Job Report', + jobs=jobs + ) self.target_test_report_generator._known_failure_cases_set = { '*.test_wpa_supplicant_ut', 'esp32c3.release.test_esp_timer', @@ -72,7 +97,7 @@ def create_report_generators(self) -> None: } test_cases_failed = [tc for tc in test_cases if tc.is_failure] for index, tc in enumerate(test_cases_failed): - tc.latest_total_count = 20 + tc.latest_total_count = 40 if index % 3 == 0: tc.latest_failed_count = 0 else: diff --git a/tools/ci/dynamic_pipelines/utils.py b/tools/ci/dynamic_pipelines/utils.py index c8252f58ad0..79cd3f44d71 100644 --- a/tools/ci/dynamic_pipelines/utils.py +++ b/tools/ci/dynamic_pipelines/utils.py @@ -66,10 +66,14 @@ def load_known_failure_cases() -> t.Optional[t.Set[str]]: if not known_failures_file: return None try: - with open(known_failures_file) as f: + with open(known_failures_file, 'r') as f: file_content = f.read() - known_cases_list = re.sub(re.compile('#.*\n'), '', file_content).split() - return {case.strip() for case in known_cases_list} + + pattern = re.compile(r'^(.*?)\s+#\s+([A-Z]+)-\d+', re.MULTILINE) + matches = pattern.findall(file_content) + + known_cases_list = [match[0].strip() for match in matches] + return set(known_cases_list) except FileNotFoundError: return None @@ -111,7 +115,7 @@ def fetch_failed_jobs(commit_id: str) -> t.List[GitlabJob]: response = requests.post( f'{ci_dash_api_backend_host}/jobs/failure_ratio', headers={'Authorization': f'Bearer {token}'}, - json={'job_names': failed_job_names, 'exclude_branches': [os.getenv('CI_COMMIT_BRANCH', '')]}, + json={'job_names': failed_job_names, 'exclude_branches': [os.getenv('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', '')]}, ) if response.status_code != 200: print(f'Failed to fetch jobs failure rate data: {response.status_code} with error: {response.text}') @@ -128,20 +132,20 @@ def fetch_failed_jobs(commit_id: str) -> t.List[GitlabJob]: return combined_jobs -def fetch_failed_testcases_failure_ratio(failed_testcases: t.List[TestCase]) -> t.List[TestCase]: +def fetch_failed_testcases_failure_ratio(failed_testcases: t.List[TestCase], branches_filter: dict) -> t.List[TestCase]: """ Fetches info about failure rates of testcases using an API request to ci-dashboard-api. :param failed_testcases: The list of failed testcases models. + :param branches_filter: The filter to filter testcases by branch names. :return: A list of testcases with enriched with failure rates data. """ token = os.getenv('ESPCI_TOKEN', '') ci_dash_api_backend_host = os.getenv('CI_DASHBOARD_API', '') + req_json = {'testcase_names': list(set([testcase.name for testcase in failed_testcases])), **branches_filter} response = requests.post( f'{ci_dash_api_backend_host}/testcases/failure_ratio', headers={'Authorization': f'Bearer {token}'}, - json={'testcase_names': [testcase.name for testcase in failed_testcases], - 'exclude_branches': [os.getenv('CI_COMMIT_BRANCH', '')], - }, + json=req_json, ) if response.status_code != 200: print(f'Failed to fetch testcases failure rate data: {response.status_code} with error: {response.text}') @@ -166,3 +170,34 @@ def load_file(file_path: str) -> str: """ with open(file_path, 'r') as file: return file.read() + + +def format_permalink(s: str) -> str: + """ + Formats a given string into a permalink. + + :param s: The string to be formatted into a permalink. + :return: The formatted permalink as a string. + """ + end_index = s.find('(') + + if end_index != -1: + trimmed_string = s[:end_index].strip() + else: + trimmed_string = s.strip() + + formatted_string = trimmed_string.lower().replace(' ', '-') + + return formatted_string + + +def get_report_url(job_id: int, output_filepath: str) -> str: + """ + Generates the url of the path where the report will be stored in the job's artifacts . + + :param job_id: The job identifier used to construct the URL. + :param output_filepath: The path to the output file. + :return: The modified URL pointing to the job's artifacts. + """ + url = os.getenv('CI_PAGES_URL', '').replace('esp-idf', '-/esp-idf') + return f'{url}/-/jobs/{job_id}/artifacts/{output_filepath}' From 9b94afdd389b57bf9a335cfba9e955b6bc4dcdff Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Thu, 11 Jul 2024 14:56:10 +0800 Subject: [PATCH 072/113] feat(dedic_gpio): add support for esp32c5 --- components/esp_driver_gpio/src/dedic_gpio.c | 21 ++++--- .../test_apps/gpio_extensions/README.md | 4 +- .../main/test_dedicated_gpio.c | 14 +++-- .../gpio_extensions/pytest_gpio_extensions.py | 1 + .../esp32c5/include/hal/dedic_gpio_cpu_ll.h | 55 +++++++++++++++++++ components/soc/esp32c2/dedic_gpio_periph.c | 1 - components/soc/esp32c3/dedic_gpio_periph.c | 1 - components/soc/esp32c5/dedic_gpio_periph.c | 36 ++++++++++++ .../esp32c5/include/soc/Kconfig.soc_caps.in | 16 ++++++ components/soc/esp32c5/include/soc/soc_caps.h | 8 +-- components/soc/esp32c6/dedic_gpio_periph.c | 1 - components/soc/esp32h2/dedic_gpio_periph.c | 1 - components/soc/esp32s2/dedic_gpio_periph.c | 19 ++----- components/soc/esp32s3/dedic_gpio_periph.c | 19 ++----- .../soc/include/soc/dedic_gpio_periph.h | 19 ++----- .../dedicated_gpio/soft_i2c/README.md | 4 +- .../dedicated_gpio/soft_spi/README.md | 4 +- .../dedicated_gpio/soft_uart/README.md | 4 +- .../components/soft_uart/riscv/soft_uart.S | 6 ++ .../parlio_tx/simple_rgb_led_matrix/README.md | 4 +- tools/ci/check_copyright_ignore.txt | 3 - 21 files changed, 161 insertions(+), 80 deletions(-) create mode 100644 components/hal/esp32c5/include/hal/dedic_gpio_cpu_ll.h create mode 100644 components/soc/esp32c5/dedic_gpio_periph.c diff --git a/components/esp_driver_gpio/src/dedic_gpio.c b/components/esp_driver_gpio/src/dedic_gpio.c index 9c60cfe7e21..bbc66995b2c 100644 --- a/components/esp_driver_gpio/src/dedic_gpio.c +++ b/components/esp_driver_gpio/src/dedic_gpio.c @@ -10,22 +10,21 @@ #include #include #include "sdkconfig.h" -#include "esp_compiler.h" #include "esp_heap_caps.h" #include "esp_intr_alloc.h" #include "esp_log.h" #include "esp_check.h" #include "esp_cpu.h" #include "soc/soc_caps.h" -#include "soc/gpio_periph.h" #include "soc/io_mux_reg.h" #include "hal/dedic_gpio_cpu_ll.h" -#include "hal/gpio_hal.h" +#include "esp_private/gpio.h" #include "esp_private/periph_ctrl.h" #include "esp_rom_gpio.h" #include "freertos/FreeRTOS.h" #include "driver/dedic_gpio.h" #include "soc/dedic_gpio_periph.h" + #if SOC_DEDIC_GPIO_ALLOW_REG_ACCESS #include "soc/dedic_gpio_struct.h" #endif @@ -59,7 +58,7 @@ struct dedic_gpio_platform_t { }; struct dedic_gpio_bundle_t { - uint32_t core_id; // CPU core ID, a GPIO bundle must be installed to a specific CPU core + int core_id; // CPU core ID, a GPIO bundle must be installed to a specific CPU core uint32_t out_mask; // mask of output channels in the bank uint32_t in_mask; // mask of input channels in the bank uint32_t out_offset; // offset in the bank (seen from output channel) @@ -104,7 +103,7 @@ static esp_err_t dedic_gpio_build_platform(int core_id) return ret; } -static void dedic_gpio_break_platform(uint32_t core_id) +static void dedic_gpio_break_platform(int core_id) { if (s_platform[core_id]) { // prevent breaking platform concurrently @@ -151,7 +150,7 @@ static void dedic_gpio_default_isr(void *arg) } } -static esp_err_t dedic_gpio_install_interrupt(uint32_t core_id) +static esp_err_t dedic_gpio_install_interrupt(int core_id) { esp_err_t ret = ESP_OK; if (!s_platform[core_id]->intr_hdl) { @@ -172,7 +171,7 @@ static esp_err_t dedic_gpio_install_interrupt(uint32_t core_id) return ret; } -static void dedic_gpio_uninstall_interrupt(uint32_t core_id) +static void dedic_gpio_uninstall_interrupt(int core_id) { if (s_platform[core_id]->intr_hdl) { // prevent uninstall interrupt concurrently @@ -187,7 +186,7 @@ static void dedic_gpio_uninstall_interrupt(uint32_t core_id) } } -static void dedic_gpio_set_interrupt(uint32_t core_id, uint32_t channel, dedic_gpio_intr_type_t type) +static void dedic_gpio_set_interrupt(int core_id, uint32_t channel, dedic_gpio_intr_type_t type) { dedic_gpio_ll_set_interrupt_type(s_platform[core_id]->dev, channel, type); if (type != DEDIC_GPIO_INTR_NONE) { @@ -269,13 +268,13 @@ esp_err_t dedic_gpio_new_bundle(const dedic_gpio_bundle_config_t *config, dedic_ // route dedicated GPIO channel signals to GPIO matrix if (config->flags.in_en) { for (size_t i = 0; i < config->array_size; i++) { - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[config->gpio_array[i]], PIN_FUNC_GPIO); + gpio_func_sel(config->gpio_array[i], PIN_FUNC_GPIO); esp_rom_gpio_connect_in_signal(config->gpio_array[i], dedic_gpio_periph_signals.cores[core_id].in_sig_per_channel[in_offset + i], config->flags.in_invert); } } if (config->flags.out_en) { for (size_t i = 0; i < config->array_size; i++) { - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[config->gpio_array[i]], PIN_FUNC_GPIO); + gpio_func_sel(config->gpio_array[i], PIN_FUNC_GPIO); esp_rom_gpio_connect_out_signal(config->gpio_array[i], dedic_gpio_periph_signals.cores[core_id].out_sig_per_channel[out_offset + i], config->flags.out_invert, false); } #if !SOC_DEDIC_GPIO_OUT_AUTO_ENABLE @@ -314,7 +313,7 @@ esp_err_t dedic_gpio_del_bundle(dedic_gpio_bundle_handle_t bundle) bool recycle_all = false; ESP_GOTO_ON_FALSE(bundle, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); - uint32_t core_id = esp_cpu_get_core_id(); + int core_id = esp_cpu_get_core_id(); ESP_GOTO_ON_FALSE(core_id == bundle->core_id, ESP_FAIL, err, TAG, "del bundle on wrong CPU"); portENTER_CRITICAL(&s_platform[core_id]->spinlock); diff --git a/components/esp_driver_gpio/test_apps/gpio_extensions/README.md b/components/esp_driver_gpio/test_apps/gpio_extensions/README.md index 4fc69c16b6a..3a9c73a780a 100644 --- a/components/esp_driver_gpio/test_apps/gpio_extensions/README.md +++ b/components/esp_driver_gpio/test_apps/gpio_extensions/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_dedicated_gpio.c b/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_dedicated_gpio.c index f0a4ba65763..fb306b523ee 100644 --- a/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_dedicated_gpio.c +++ b/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_dedicated_gpio.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" @@ -60,7 +61,7 @@ TEST_CASE("Dedicated_GPIO_bundle_install/uninstall", "[dedic_gpio]") typedef struct { SemaphoreHandle_t sem; - const int gpios[TEST_GPIO_GROUP_SIZE]; + int gpios[TEST_GPIO_GROUP_SIZE]; } test_dedic_task_context_t; static void test_dedic_gpio_on_specific_core(void *args) @@ -144,6 +145,7 @@ TEST_CASE("Dedicated_GPIO_run_on_multiple_CPU_cores", "[dedic_gpio]") { SemaphoreHandle_t sem = xSemaphoreCreateCounting(SOC_CPU_CORES_NUM, 0); TaskHandle_t task_handle[SOC_CPU_CORES_NUM]; + test_dedic_task_context_t isr_ctx[SOC_CPU_CORES_NUM]; for (int i = 0; i < SOC_CPU_CORES_NUM; i++) { #if CONFIG_IDF_TARGET_ESP32P4 @@ -151,11 +153,11 @@ TEST_CASE("Dedicated_GPIO_run_on_multiple_CPU_cores", "[dedic_gpio]") #else int start_gpio = i * TEST_GPIO_GROUP_SIZE; #endif - test_dedic_task_context_t isr_ctx = { - .sem = sem, - .gpios = {start_gpio, start_gpio + 1, start_gpio + 2, start_gpio + 3} - }; - xTaskCreatePinnedToCore(test_dedic_gpio_on_specific_core, "dedic_gpio_test_tsk", 4096, &isr_ctx, 1, + isr_ctx[i].sem = sem; + const int gpios[TEST_GPIO_GROUP_SIZE] = {start_gpio, start_gpio + 1, start_gpio + 2, start_gpio + 3}; + memcpy(isr_ctx[i].gpios, gpios, sizeof(gpios)); + + xTaskCreatePinnedToCore(test_dedic_gpio_on_specific_core, "dedic_gpio_test_tsk", 4096, &isr_ctx[i], 1, &task_handle[i], i); } diff --git a/components/esp_driver_gpio/test_apps/gpio_extensions/pytest_gpio_extensions.py b/components/esp_driver_gpio/test_apps/gpio_extensions/pytest_gpio_extensions.py index fa4bf41babd..58c95c8f3a6 100644 --- a/components/esp_driver_gpio/test_apps/gpio_extensions/pytest_gpio_extensions.py +++ b/components/esp_driver_gpio/test_apps/gpio_extensions/pytest_gpio_extensions.py @@ -24,6 +24,7 @@ def test_gpio_filter(dut: IdfDut) -> None: @pytest.mark.esp32c2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32s2 diff --git a/components/hal/esp32c5/include/hal/dedic_gpio_cpu_ll.h b/components/hal/esp32c5/include/hal/dedic_gpio_cpu_ll.h new file mode 100644 index 00000000000..00ee9296a37 --- /dev/null +++ b/components/hal/esp32c5/include/hal/dedic_gpio_cpu_ll.h @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include "riscv/csr.h" + +/*fast gpio*/ +#define CSR_GPIO_OEN_USER 0x803 +#define CSR_GPIO_IN_USER 0x804 +#define CSR_GPIO_OUT_USER 0x805 + +#ifdef __cplusplus +extern "C" { +#endif + +__attribute__((always_inline)) +static inline void dedic_gpio_cpu_ll_enable_output(uint32_t mask) +{ + RV_WRITE_CSR(CSR_GPIO_OEN_USER, mask); +} + +static inline void dedic_gpio_cpu_ll_write_all(uint32_t value) +{ + RV_WRITE_CSR(CSR_GPIO_OUT_USER, value); +} + +__attribute__((always_inline)) +static inline uint32_t dedic_gpio_cpu_ll_read_in(void) +{ + uint32_t value = RV_READ_CSR(CSR_GPIO_IN_USER); + return value; +} + +__attribute__((always_inline)) +static inline uint32_t dedic_gpio_cpu_ll_read_out(void) +{ + uint32_t value = RV_READ_CSR(CSR_GPIO_OUT_USER); + return value; +} + +__attribute__((always_inline)) +static inline void dedic_gpio_cpu_ll_write_mask(uint32_t mask, uint32_t value) +{ + RV_SET_CSR(CSR_GPIO_OUT_USER, mask & value); + RV_CLEAR_CSR(CSR_GPIO_OUT_USER, mask & ~(value)); +} + +#ifdef __cplusplus +} +#endif diff --git a/components/soc/esp32c2/dedic_gpio_periph.c b/components/soc/esp32c2/dedic_gpio_periph.c index 84070ee47b8..4c3f6b93e0e 100644 --- a/components/soc/esp32c2/dedic_gpio_periph.c +++ b/components/soc/esp32c2/dedic_gpio_periph.c @@ -8,7 +8,6 @@ #include "soc/dedic_gpio_periph.h" const dedic_gpio_signal_conn_t dedic_gpio_periph_signals = { - .module = -1, .irq = -1, .cores = { [0] = { diff --git a/components/soc/esp32c3/dedic_gpio_periph.c b/components/soc/esp32c3/dedic_gpio_periph.c index 711274f8930..45e0fd7a23e 100644 --- a/components/soc/esp32c3/dedic_gpio_periph.c +++ b/components/soc/esp32c3/dedic_gpio_periph.c @@ -8,7 +8,6 @@ #include "soc/dedic_gpio_periph.h" const dedic_gpio_signal_conn_t dedic_gpio_periph_signals = { - .module = -1, .irq = -1, .cores = { [0] = { diff --git a/components/soc/esp32c5/dedic_gpio_periph.c b/components/soc/esp32c5/dedic_gpio_periph.c new file mode 100644 index 00000000000..ef5fc640824 --- /dev/null +++ b/components/soc/esp32c5/dedic_gpio_periph.c @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/gpio_sig_map.h" +#include "soc/dedic_gpio_periph.h" + +const dedic_gpio_signal_conn_t dedic_gpio_periph_signals = { + .irq = -1, + .cores = { + [0] = { + .in_sig_per_channel = { + [0] = CPU_GPIO_IN0_IDX, + [1] = CPU_GPIO_IN1_IDX, + [2] = CPU_GPIO_IN2_IDX, + [3] = CPU_GPIO_IN3_IDX, + [4] = CPU_GPIO_IN4_IDX, + [5] = CPU_GPIO_IN5_IDX, + [6] = CPU_GPIO_IN6_IDX, + [7] = CPU_GPIO_IN7_IDX, + }, + .out_sig_per_channel = { + [0] = CPU_GPIO_OUT0_IDX, + [1] = CPU_GPIO_OUT1_IDX, + [2] = CPU_GPIO_OUT2_IDX, + [3] = CPU_GPIO_OUT3_IDX, + [4] = CPU_GPIO_OUT4_IDX, + [5] = CPU_GPIO_OUT5_IDX, + [6] = CPU_GPIO_OUT6_IDX, + [7] = CPU_GPIO_OUT7_IDX, + } + }, + }, +}; diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 181dc73c473..466607e158b 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -7,6 +7,10 @@ config SOC_ADC_SUPPORTED bool default y +config SOC_DEDICATED_GPIO_SUPPORTED + bool + default y + config SOC_UART_SUPPORTED bool default y @@ -463,6 +467,18 @@ config SOC_RTCIO_WAKE_SUPPORTED bool default y +config SOC_DEDIC_GPIO_OUT_CHANNELS_NUM + int + default 8 + +config SOC_DEDIC_GPIO_IN_CHANNELS_NUM + int + default 8 + +config SOC_DEDIC_PERIPH_ALWAYS_ENABLE + bool + default y + config SOC_I2C_NUM int default 1 diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index c608de7ac8f..6e02acdff00 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -18,7 +18,7 @@ /*-------------------------- COMMON CAPS ---------------------------------------*/ #define SOC_ADC_SUPPORTED 1 -// #define SOC_DEDICATED_GPIO_SUPPORTED 1 // TODO: [ESP32C5] IDF-8725 +#define SOC_DEDICATED_GPIO_SUPPORTED 1 #define SOC_UART_SUPPORTED 1 #define SOC_GDMA_SUPPORTED 1 #define SOC_AHB_GDMA_SUPPORTED 1 @@ -234,9 +234,9 @@ #define SOC_RTCIO_WAKE_SUPPORTED 1 /*-------------------------- Dedicated GPIO CAPS -----------------------------*/ -// #define SOC_DEDIC_GPIO_OUT_CHANNELS_NUM (8) /*!< 8 outward channels on each CPU core */ -// #define SOC_DEDIC_GPIO_IN_CHANNELS_NUM (8) /*!< 8 inward channels on each CPU core */ -// #define SOC_DEDIC_PERIPH_ALWAYS_ENABLE (1) /*!< The dedicated GPIO (a.k.a. fast GPIO) is featured by some customized CPU instructions, which is always enabled */ +#define SOC_DEDIC_GPIO_OUT_CHANNELS_NUM (8) /*!< 8 outward channels on each CPU core */ +#define SOC_DEDIC_GPIO_IN_CHANNELS_NUM (8) /*!< 8 inward channels on each CPU core */ +#define SOC_DEDIC_PERIPH_ALWAYS_ENABLE (1) /*!< The dedicated GPIO (a.k.a. fast GPIO) is featured by some customized CPU instructions, which is always enabled */ /*-------------------------- I2C CAPS ----------------------------------------*/ // ESP32-C5 has 1 I2C diff --git a/components/soc/esp32c6/dedic_gpio_periph.c b/components/soc/esp32c6/dedic_gpio_periph.c index 1321608a3eb..58fc3671a71 100644 --- a/components/soc/esp32c6/dedic_gpio_periph.c +++ b/components/soc/esp32c6/dedic_gpio_periph.c @@ -8,7 +8,6 @@ #include "soc/dedic_gpio_periph.h" const dedic_gpio_signal_conn_t dedic_gpio_periph_signals = { - .module = -1, .irq = -1, .cores = { [0] = { diff --git a/components/soc/esp32h2/dedic_gpio_periph.c b/components/soc/esp32h2/dedic_gpio_periph.c index 711274f8930..45e0fd7a23e 100644 --- a/components/soc/esp32h2/dedic_gpio_periph.c +++ b/components/soc/esp32h2/dedic_gpio_periph.c @@ -8,7 +8,6 @@ #include "soc/dedic_gpio_periph.h" const dedic_gpio_signal_conn_t dedic_gpio_periph_signals = { - .module = -1, .irq = -1, .cores = { [0] = { diff --git a/components/soc/esp32s2/dedic_gpio_periph.c b/components/soc/esp32s2/dedic_gpio_periph.c index d953ca659e9..8ebcb4cfd53 100644 --- a/components/soc/esp32s2/dedic_gpio_periph.c +++ b/components/soc/esp32s2/dedic_gpio_periph.c @@ -1,22 +1,13 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/dedic_gpio_periph.h" #include "soc/gpio_sig_map.h" const dedic_gpio_signal_conn_t dedic_gpio_periph_signals = { - .module = PERIPH_DEDIC_GPIO_MODULE, .irq = ETS_DEDICATED_GPIO_INTR_SOURCE, .cores = { [0] = { diff --git a/components/soc/esp32s3/dedic_gpio_periph.c b/components/soc/esp32s3/dedic_gpio_periph.c index 929cc7000e5..e4f4166785c 100644 --- a/components/soc/esp32s3/dedic_gpio_periph.c +++ b/components/soc/esp32s3/dedic_gpio_periph.c @@ -1,22 +1,13 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/dedic_gpio_periph.h" #include "soc/gpio_sig_map.h" const dedic_gpio_signal_conn_t dedic_gpio_periph_signals = { - .module = PERIPH_DEDIC_GPIO_MODULE, .irq = -1, .cores = { [0] = { diff --git a/components/soc/include/soc/dedic_gpio_periph.h b/components/soc/include/soc/dedic_gpio_periph.h index f6eeeeb5e7e..c0b6720b704 100644 --- a/components/soc/include/soc/dedic_gpio_periph.h +++ b/components/soc/include/soc/dedic_gpio_periph.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once @@ -25,7 +17,6 @@ extern "C" { #if SOC_DEDICATED_GPIO_SUPPORTED typedef struct { - const periph_module_t module; // Peripheral module const int irq; // Interrupt resource (-1 means no interrupt supported) struct { const int in_sig_per_channel[SOC_DEDIC_GPIO_IN_CHANNELS_NUM]; diff --git a/examples/peripherals/dedicated_gpio/soft_i2c/README.md b/examples/peripherals/dedicated_gpio/soft_i2c/README.md index d9b5a6697d4..48c2226b77f 100644 --- a/examples/peripherals/dedicated_gpio/soft_i2c/README.md +++ b/examples/peripherals/dedicated_gpio/soft_i2c/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | # Example: Software I2C Master via Dedicated/Fast GPIOs diff --git a/examples/peripherals/dedicated_gpio/soft_spi/README.md b/examples/peripherals/dedicated_gpio/soft_spi/README.md index beb35c91423..7bfae455bb4 100644 --- a/examples/peripherals/dedicated_gpio/soft_spi/README.md +++ b/examples/peripherals/dedicated_gpio/soft_spi/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | -| ----------------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | # Example: SPI software emulation using dedicated/fast GPIOs diff --git a/examples/peripherals/dedicated_gpio/soft_uart/README.md b/examples/peripherals/dedicated_gpio/soft_uart/README.md index 9d4481ff64c..7236a047b88 100644 --- a/examples/peripherals/dedicated_gpio/soft_uart/README.md +++ b/examples/peripherals/dedicated_gpio/soft_uart/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | # Example: UART software emulation using dedicated/fast GPIOs diff --git a/examples/peripherals/dedicated_gpio/soft_uart/components/soft_uart/riscv/soft_uart.S b/examples/peripherals/dedicated_gpio/soft_uart/components/soft_uart/riscv/soft_uart.S index afb0f56be86..afde13ed698 100644 --- a/examples/peripherals/dedicated_gpio/soft_uart/components/soft_uart/riscv/soft_uart.S +++ b/examples/peripherals/dedicated_gpio/soft_uart/components/soft_uart/riscv/soft_uart.S @@ -4,12 +4,18 @@ * SPDX-License-Identifier: CC0-1.0 */ #include "sdkconfig.h" + #include "soc/soc_caps.h" /* RISC-V fast GPIO special registers, taken from "hal/dedic_gpio_cpu_ll.h" */ #define CSR_GPIO_IN_USER 0x804 #define CSR_GPIO_OUT_USER 0x805 /* Special register for machine cycle count */ + +#if SOC_CPU_HAS_CSR_PC #define CSR_PCCR_MACHINE 0x7e2 +#else + #define CSR_PCCR_MACHINE mcycle +#endif .section .text diff --git a/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/README.md b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/README.md index db62a41730d..35ee2e30d49 100644 --- a/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/README.md +++ b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C6 | ESP32-H2 | ESP32-P4 | -| ----------------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | +| ----------------- | -------- | -------- | -------- | -------- | # Parallel IO TX Example: Simple RGB LED Matrix diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index b45b0680a9c..5a94cf6adba 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -590,7 +590,6 @@ components/soc/esp32c3/include/soc/wdev_reg.h components/soc/esp32c3/interrupts.c components/soc/esp32c3/ledc_periph.c components/soc/esp32s2/adc_periph.c -components/soc/esp32s2/dedic_gpio_periph.c components/soc/esp32s2/i2c_periph.c components/soc/esp32s2/include/soc/apb_saradc_reg.h components/soc/esp32s2/include/soc/assist_debug_reg.h @@ -626,7 +625,6 @@ components/soc/esp32s2/include/soc/usb_wrap_reg.h components/soc/esp32s2/include/soc/usb_wrap_struct.h components/soc/esp32s2/include/soc/wdev_reg.h components/soc/esp32s2/ledc_periph.c -components/soc/esp32s3/dedic_gpio_periph.c components/soc/esp32s3/i2c_periph.c components/soc/esp32s3/include/soc/apb_saradc_reg.h components/soc/esp32s3/include/soc/assist_debug_reg.h @@ -684,7 +682,6 @@ components/soc/esp32s3/include/soc/usb_wrap_reg.h components/soc/esp32s3/include/soc/usb_wrap_struct.h components/soc/esp32s3/include/soc/wdev_reg.h components/soc/esp32s3/ledc_periph.c -components/soc/include/soc/dedic_gpio_periph.h components/soc/include/soc/gpio_periph.h components/soc/include/soc/ledc_periph.h components/soc/lldesc.c From 38b1fe9b11c5fd6889afe78eeb2d59499539649d Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Thu, 11 Jul 2024 17:35:50 +0800 Subject: [PATCH 073/113] feat(glitch_filter): add support for esp32c5 --- .../gpio_extensions/main/test_gpio_filter.c | 2 + .../gpio_extensions/pytest_gpio_extensions.py | 1 + .../include/hal/gpio_glitch_filter_ll.h | 66 +++++++++++++++++++ .../esp32c5/include/soc/Kconfig.soc_caps.in | 8 +++ .../soc/esp32c5/include/soc/clk_tree_defs.h | 2 +- .../soc/esp32c5/include/soc/gpio_ext_struct.h | 23 ++++--- components/soc/esp32c5/include/soc/soc_caps.h | 6 +- .../soc/esp32c5/ld/esp32c5.peripherals.ld | 1 + 8 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 components/hal/esp32c5/include/hal/gpio_glitch_filter_ll.h diff --git a/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_gpio_filter.c b/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_gpio_filter.c index 6826cd15db9..081d9ab2ec6 100644 --- a/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_gpio_filter.c +++ b/components/esp_driver_gpio/test_apps/gpio_extensions/main/test_gpio_filter.c @@ -16,6 +16,8 @@ #if CONFIG_IDF_TARGET_ESP32P4 #define TEST_FILTER_GPIO 20 +#elif CONFIG_IDF_TARGET_ESP32C5 +#define TEST_FILTER_GPIO 0 #else #define TEST_FILTER_GPIO 2 #endif diff --git a/components/esp_driver_gpio/test_apps/gpio_extensions/pytest_gpio_extensions.py b/components/esp_driver_gpio/test_apps/gpio_extensions/pytest_gpio_extensions.py index 58c95c8f3a6..6988a925959 100644 --- a/components/esp_driver_gpio/test_apps/gpio_extensions/pytest_gpio_extensions.py +++ b/components/esp_driver_gpio/test_apps/gpio_extensions/pytest_gpio_extensions.py @@ -11,6 +11,7 @@ @pytest.mark.esp32c2 @pytest.mark.esp32c3 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32s2 diff --git a/components/hal/esp32c5/include/hal/gpio_glitch_filter_ll.h b/components/hal/esp32c5/include/hal/gpio_glitch_filter_ll.h new file mode 100644 index 00000000000..f1f5622dfce --- /dev/null +++ b/components/hal/esp32c5/include/hal/gpio_glitch_filter_ll.h @@ -0,0 +1,66 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in hal/include/hal/readme.md + ******************************************************************************/ + +#pragma once + +#include +#include "hal/assert.h" +#include "soc/gpio_ext_struct.h" + +#define GPIO_LL_GLITCH_FILTER_MAX_WINDOW 64 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Enable GPIO glitch filter + * + * @param hw Glitch filter register base address + * @param filter_idx Glitch filter index + * @param enable True to enable, false to disable + */ +static inline void gpio_ll_glitch_filter_enable(gpio_glitch_filter_dev_t *hw, uint32_t filter_idx, bool enable) +{ + hw->glitch_filter_chn[filter_idx].filter_chn_en = enable; +} + +/** + * @brief Set the input GPIO for the glitch filter + * + * @param hw Glitch filter register base address + * @param filter_idx Glitch filter index + * @param gpio_num GPIO number + */ +static inline void gpio_ll_glitch_filter_set_gpio(gpio_glitch_filter_dev_t *hw, uint32_t filter_idx, uint32_t gpio_num) +{ + hw->glitch_filter_chn[filter_idx].filter_chn_input_io_num = gpio_num; +} + +/** + * @brief Set the coefficient of the glitch filter window + * + * @param hw Glitch filter register base address + * @param filter_idx Glitch filter index + * @param window_width Window width, in IOMUX clock ticks + * @param window_threshold Window threshold, in IOMUX clock ticks + */ +static inline void gpio_ll_glitch_filter_set_window_coeff(gpio_glitch_filter_dev_t *hw, uint32_t filter_idx, uint32_t window_width, uint32_t window_thres) +{ + HAL_ASSERT(window_thres <= window_width); + hw->glitch_filter_chn[filter_idx].filter_chn_window_width = window_width - 1; + hw->glitch_filter_chn[filter_idx].filter_chn_window_thres = window_thres - 1; +} + +#ifdef __cplusplus +} +#endif diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 466607e158b..91e6ffe6ed1 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -399,6 +399,14 @@ config SOC_GPIO_PIN_COUNT int default 29 +config SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER + bool + default y + +config SOC_GPIO_FLEX_GLITCH_FILTER_NUM + int + default 8 + config SOC_GPIO_SUPPORT_PIN_HYS_FILTER bool default y diff --git a/components/soc/esp32c5/include/soc/clk_tree_defs.h b/components/soc/esp32c5/include/soc/clk_tree_defs.h index 083b4c69a85..6c50e48480d 100644 --- a/components/soc/esp32c5/include/soc/clk_tree_defs.h +++ b/components/soc/esp32c5/include/soc/clk_tree_defs.h @@ -402,7 +402,7 @@ typedef enum { * @brief Glitch filter clock source */ -typedef enum { // TODO: [ESP32C5] IDF-8718 (inherit from C6) +typedef enum { GLITCH_FILTER_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL clock as the source clock */ GLITCH_FILTER_CLK_SRC_PLL_F80M = SOC_MOD_CLK_PLL_F80M, /*!< Select PLL_F80M clock as the source clock */ GLITCH_FILTER_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F80M, /*!< Select PLL_F80M clock as the default clock choice */ diff --git a/components/soc/esp32c5/include/soc/gpio_ext_struct.h b/components/soc/esp32c5/include/soc/gpio_ext_struct.h index 56aa2ecdd9d..adf51ea44af 100644 --- a/components/soc/esp32c5/include/soc/gpio_ext_struct.h +++ b/components/soc/esp32c5/include/soc/gpio_ext_struct.h @@ -142,13 +142,13 @@ typedef union { */ typedef union { struct { - /** filter_ch0_en : R/W; bitpos: [0]; default: 0; + /** filter_chn_en : R/W; bitpos: [0]; default: 0; * Configures whether or not to enable channel n of Glitch Filter.\\ * 0: Not enable\\ * 1: Enable\\ */ - uint32_t filter_ch0_en:1; - /** filter_ch0_input_io_num : R/W; bitpos: [6:1]; default: 0; + uint32_t filter_chn_en:1; + /** filter_chn_input_io_num : R/W; bitpos: [6:1]; default: 0; * Configures to select the input GPIO for Glitch Filter. \\ * 0: Select GPIO0\\ * 1: Select GPIO1\\ @@ -157,20 +157,20 @@ typedef union { * 28: Select GPIO28\\ * 29 ~ 63: Reserved\\ */ - uint32_t filter_ch0_input_io_num:6; + uint32_t filter_chn_input_io_num:6; uint32_t reserved_7:1; - /** filter_ch0_window_thres : R/W; bitpos: [13:8]; default: 0; + /** filter_chn_window_thres : R/W; bitpos: [13:8]; default: 0; * Configures the window threshold for Glitch Filter. The window threshold should be * less than or equal to GPIOSD_FILTER_CHn_WINDOW_WIDTH.\\ %see DOC-4768\\ * Measurement unit: IO MUX operating clock cycle\\ */ - uint32_t filter_ch0_window_thres:6; - /** filter_ch0_window_width : R/W; bitpos: [19:14]; default: 0; + uint32_t filter_chn_window_thres:6; + /** filter_chn_window_width : R/W; bitpos: [19:14]; default: 0; * Configures the window width for Glitch Filter. The effective value of window width * is 0 ~ 63. \\ * Measurement unit: IO MUX operating clock cycle\\ */ - uint32_t filter_ch0_window_width:6; + uint32_t filter_chn_window_width:6; uint32_t reserved_20:12; }; uint32_t val; @@ -454,13 +454,17 @@ typedef struct gpio_etm_dev_t { volatile gpio_ext_etm_task_pn_cfg_reg_t etm_task_pn_cfg[6]; } gpio_etm_dev_t; +typedef struct { + volatile gpio_ext_glitch_filter_chn_reg_t glitch_filter_chn[8]; +} gpio_glitch_filter_dev_t; + typedef struct { volatile gpio_sd_dev_t sigma_delta; uint32_t reserved_018[16]; volatile gpio_ext_pad_comp_config_0_reg_t pad_comp_config_0; volatile gpio_ext_pad_comp_filter_0_reg_t pad_comp_filter_0; uint32_t reserved_060[30]; - volatile gpio_ext_glitch_filter_chn_reg_t glitch_filter_chn[8]; + volatile gpio_glitch_filter_dev_t glitch_filter; uint32_t reserved_0f8[8]; volatile gpio_etm_dev_t etm; uint32_t reserved_170[24]; @@ -474,6 +478,7 @@ typedef struct { } gpio_ext_dev_t; extern gpio_sd_dev_t SDM; +extern gpio_glitch_filter_dev_t GLITCH_FILTER; extern gpio_etm_dev_t GPIO_ETM; extern gpio_ext_dev_t GPIO_EXT; diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 6e02acdff00..56cadf63a72 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -188,9 +188,9 @@ // ESP32-C5 has 1 GPIO peripheral #define SOC_GPIO_PORT 1U #define SOC_GPIO_PIN_COUNT 29 -// #define SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER 1 -// #define SOC_GPIO_FLEX_GLITCH_FILTER_NUM 8 -#define SOC_GPIO_SUPPORT_PIN_HYS_FILTER 1 +#define SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER 1 +#define SOC_GPIO_FLEX_GLITCH_FILTER_NUM 8 +#define SOC_GPIO_SUPPORT_PIN_HYS_FILTER 1 // GPIO peripheral has the ETM extension #define SOC_GPIO_SUPPORT_ETM 1 diff --git a/components/soc/esp32c5/ld/esp32c5.peripherals.ld b/components/soc/esp32c5/ld/esp32c5.peripherals.ld index 31097118a3f..e1f8c4a005e 100644 --- a/components/soc/esp32c5/ld/esp32c5.peripherals.ld +++ b/components/soc/esp32c5/ld/esp32c5.peripherals.ld @@ -44,6 +44,7 @@ PROVIDE ( IO_MUX = 0x60090000 ); PROVIDE ( GPIO = 0x60091000 ); PROVIDE ( GPIO_EXT = 0x60091e00 ); PROVIDE ( SDM = 0x60091e00 ); +PROVIDE ( GLITCH_FILTER = 0x60091ed8 ); PROVIDE ( GPIO_ETM = 0x60091f18 ); PROVIDE ( MEM_MONITOR = 0x60092000 ); PROVIDE ( PAU = 0x60093000 ); From 3fbd7eb80b77059ee3ae79ee5c36356ce87608c1 Mon Sep 17 00:00:00 2001 From: Sarvesh Bodakhe Date: Wed, 17 Jul 2024 17:33:58 +0530 Subject: [PATCH 074/113] fix(wifi): Free scan configuration after use when channel bitmap is used --- examples/wifi/scan/main/scan.c | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/wifi/scan/main/scan.c b/examples/wifi/scan/main/scan.c index 2876fb95a50..243b4a7a98f 100644 --- a/examples/wifi/scan/main/scan.c +++ b/examples/wifi/scan/main/scan.c @@ -179,6 +179,7 @@ static void wifi_scan(void) } array_2_channel_bitmap(channel_list, CHANNEL_LIST_SIZE, scan_config); esp_wifi_scan_start(scan_config, true); + free(scan_config); #else esp_wifi_scan_start(NULL, true); From 07da0f627c8ad2e6f27e2382870b7fa2ff17f763 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 17 Jul 2024 14:45:17 +0200 Subject: [PATCH 075/113] docs(jtag): update esp32c5 jtag debugging guide --- docs/docs_not_updated/esp32c5.txt | 10 ------ .../jtag-debugging/configure-other-jtag.rst | 2 +- docs/en/api-guides/jtag-debugging/esp32c5.inc | 31 ++++++++++--------- docs/en/api-guides/jtag-debugging/index.rst | 2 +- .../jtag-debugging/configure-other-jtag.rst | 2 +- .../api-guides/jtag-debugging/esp32c5.inc | 31 ++++++++++--------- .../zh_CN/api-guides/jtag-debugging/index.rst | 2 +- 7 files changed, 36 insertions(+), 44 deletions(-) diff --git a/docs/docs_not_updated/esp32c5.txt b/docs/docs_not_updated/esp32c5.txt index f4ad140ff4d..89df0f3002f 100644 --- a/docs/docs_not_updated/esp32c5.txt +++ b/docs/docs_not_updated/esp32c5.txt @@ -6,16 +6,6 @@ contribute/style-guide.rst contribute/copyright-guide.rst contribute/install-pre-commit-hook.rst contribute/index.rst -api-guides/jtag-debugging/debugging-examples.rst -api-guides/jtag-debugging/configure-ft2232h-jtag.rst -api-guides/jtag-debugging/tips-and-quirks.rst -api-guides/jtag-debugging/using-debugger.rst -api-guides/jtag-debugging/building-openocd-macos.rst -api-guides/jtag-debugging/building-openocd-linux.rst -api-guides/jtag-debugging/configure-other-jtag.rst -api-guides/jtag-debugging/building-openocd-windows.rst -api-guides/jtag-debugging/index.rst -api-guides/jtag-debugging/configure-builtin-jtag.rst api-guides/tools/idf-tools.rst api-guides/tools/idf-clang-tidy.rst api-guides/tools/idf-component-manager.rst diff --git a/docs/en/api-guides/jtag-debugging/configure-other-jtag.rst b/docs/en/api-guides/jtag-debugging/configure-other-jtag.rst index e3c95d1be58..471bfcbace2 100644 --- a/docs/en/api-guides/jtag-debugging/configure-other-jtag.rst +++ b/docs/en/api-guides/jtag-debugging/configure-other-jtag.rst @@ -3,7 +3,7 @@ Configure Other JTAG Interfaces :link_to_translation:`zh_CN:[中文]` -{IDF_TARGET_JTAG_SEL_EFUSE:default="Not Updated!", esp32s3="STRAP_JTAG_SEL", esp32c6="JTAG_SEL_ENABLE", esp32h2="JTAG_SEL_ENABLE", esp32p4="JTAG_SEL_ENABLE"} +{IDF_TARGET_JTAG_SEL_EFUSE:default="Not Updated!", esp32s3="STRAP_JTAG_SEL", esp32c6="JTAG_SEL_ENABLE", esp32h2="JTAG_SEL_ENABLE", esp32p4="JTAG_SEL_ENABLE", esp32c5="JTAG_SEL_ENABLE"} For guidance about which JTAG interface to select when using OpenOCD with {IDF_TARGET_NAME}, refer to the section :ref:`jtag-debugging-selecting-jtag-adapter`. Then follow the configuration steps below to get it working. diff --git a/docs/en/api-guides/jtag-debugging/esp32c5.inc b/docs/en/api-guides/jtag-debugging/esp32c5.inc index 65ccf72bad8..d4f87e35b61 100644 --- a/docs/en/api-guides/jtag-debugging/esp32c5.inc +++ b/docs/en/api-guides/jtag-debugging/esp32c5.inc @@ -22,26 +22,27 @@ :: user-name@computer-name:~/esp/esp-idf$ openocd -f board/esp32c5-builtin.cfg - Open On-Chip Debugger v0.11.0-esp32-20221026-85-g0718fffd (2023-01-12-07:28) + Open On-Chip Debugger v0.12.0-esp32-20240318-139-g35ddcf93-dirty (2024-07-16-15:00) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html - Info : only one transport option; autoselect 'jtag' + Info : only one transport option; autoselecting 'jtag' Info : esp_usb_jtag: VID set to 0x303a and PID to 0x1001 Info : esp_usb_jtag: capabilities descriptor set to 0x2000 - Warn : Transport "jtag" was already selected WARNING: ESP flash support is disabled! force hard breakpoints Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections - Info : esp_usb_jtag: serial (60:55:F9:F6:03:3C) + Info : esp_usb_jtag: serial (60:55:F9:FF:FE:F9:54:A4) Info : esp_usb_jtag: Device found. Base speed 24000KHz, div range 1 to 255 Info : clock speed 24000 kHz - Info : JTAG tap: esp32c5.cpu tap/device found: 0x0000dc25 (mfg: 0x612 (Espressif Systems), part: 0x000d, ver: 0x0) - Info : datacount=2 progbufsize=16 - Info : Examined RISC-V core; found 2 harts - Info : hart 0: XLEN=32, misa=0x40903105 - Info : starting gdb server for esp32c5 on 3333 + Info : JTAG tap: esp32c5.cpu0 tap/device found: 0x00017c25 (mfg: 0x612 (Espressif Systems), part: 0x0017, ver: 0x0) + Info : JTAG tap: esp32c5.cpu1 tap/device found: 0x00017c25 (mfg: 0x612 (Espressif Systems), part: 0x0017, ver: 0x0) + Info : [esp32c5.cpu1] datacount=1 progbufsize=2 + Info : [esp32c5.cpu1] Examined RISC-V core; found 1 harts + Info : [esp32c5.cpu1] XLEN=32, misa=0x40101105 + Info : [esp32c5.cpu1] Examination succeed + Info : [esp32c5.cpu1] starting gdb server on 3333 Info : Listening on port 3333 for gdb connections .. |run-openocd-cfg-file-err| replace:: ``Can't find board/esp32c5-builtin.cfg`` @@ -121,17 +122,17 @@ * - ESP32-C5 Pin - JTAG Signal - * - MTDO / GPIO7 + * - MTDO / GPIO5 - TDO - * - MTDI / GPIO5 + * - MTDI / GPIO3 - TDI - * - MTCK / GPIO6 + * - MTCK / GPIO4 - TCK - * - MTMS / GPIO4 + * - MTMS / GPIO2 - TMS -.. |jtag-sel-gpio| replace:: GPIO15 -.. |jtag-gpio-list| replace:: GPIO4-GPIO7 +.. |jtag-sel-gpio| replace:: GPIO7 +.. |jtag-gpio-list| replace:: GPIO2-GPIO5 --- diff --git a/docs/en/api-guides/jtag-debugging/index.rst b/docs/en/api-guides/jtag-debugging/index.rst index d6e967dc4ef..66a2b3c97fe 100644 --- a/docs/en/api-guides/jtag-debugging/index.rst +++ b/docs/en/api-guides/jtag-debugging/index.rst @@ -180,7 +180,7 @@ Open a terminal and set it up for using the ESP-IDF as described in the :ref:`se :start-after: run-openocd :end-before: --- -{IDF_TARGET_FTDI_CONFIG:default="Not Updated!", esp32s3="board/esp32s3-ftdi.cfg", esp32c3="board/esp32c3-ftdi.cfg", esp32c6="board/esp32c6-ftdi.cfg", esp32h2="board/esp32h2-ftdi.cfg"} +{IDF_TARGET_FTDI_CONFIG:default="Not Updated!", esp32s3="board/esp32s3-ftdi.cfg", esp32c3="board/esp32c3-ftdi.cfg", esp32c6="board/esp32c6-ftdi.cfg", esp32h2="board/esp32h2-ftdi.cfg", esp32p4="board/esp32p4-ftdi.cfg", esp32c5="board/esp32c5-ftdi.cfg"} .. note:: diff --git a/docs/zh_CN/api-guides/jtag-debugging/configure-other-jtag.rst b/docs/zh_CN/api-guides/jtag-debugging/configure-other-jtag.rst index d176f3d6930..8396f435b79 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/configure-other-jtag.rst +++ b/docs/zh_CN/api-guides/jtag-debugging/configure-other-jtag.rst @@ -3,7 +3,7 @@ :link_to_translation:`en:[English]` -{IDF_TARGET_JTAG_SEL_EFUSE:default="Not Updated!", esp32s3="STRAP_JTAG_SEL", esp32c6="JTAG_SEL_ENABLE", esp32h2="JTAG_SEL_ENABLE", esp32p4="JTAG_SEL_ENABLE"} +{IDF_TARGET_JTAG_SEL_EFUSE:default="Not Updated!", esp32s3="STRAP_JTAG_SEL", esp32c6="JTAG_SEL_ENABLE", esp32h2="JTAG_SEL_ENABLE", esp32p4="JTAG_SEL_ENABLE", esp32c5="JTAG_SEL_ENABLE"} 关于适配 OpenOCD 和 {IDF_TARGET_NAME} 的 JTAG 接口选择问题,请参考 :ref:`jtag-debugging-selecting-jtag-adapter` 章节。然后按照以下步骤进行设置,使其正常工作。 diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc index 65ccf72bad8..d4f87e35b61 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc @@ -22,26 +22,27 @@ :: user-name@computer-name:~/esp/esp-idf$ openocd -f board/esp32c5-builtin.cfg - Open On-Chip Debugger v0.11.0-esp32-20221026-85-g0718fffd (2023-01-12-07:28) + Open On-Chip Debugger v0.12.0-esp32-20240318-139-g35ddcf93-dirty (2024-07-16-15:00) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html - Info : only one transport option; autoselect 'jtag' + Info : only one transport option; autoselecting 'jtag' Info : esp_usb_jtag: VID set to 0x303a and PID to 0x1001 Info : esp_usb_jtag: capabilities descriptor set to 0x2000 - Warn : Transport "jtag" was already selected WARNING: ESP flash support is disabled! force hard breakpoints Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections - Info : esp_usb_jtag: serial (60:55:F9:F6:03:3C) + Info : esp_usb_jtag: serial (60:55:F9:FF:FE:F9:54:A4) Info : esp_usb_jtag: Device found. Base speed 24000KHz, div range 1 to 255 Info : clock speed 24000 kHz - Info : JTAG tap: esp32c5.cpu tap/device found: 0x0000dc25 (mfg: 0x612 (Espressif Systems), part: 0x000d, ver: 0x0) - Info : datacount=2 progbufsize=16 - Info : Examined RISC-V core; found 2 harts - Info : hart 0: XLEN=32, misa=0x40903105 - Info : starting gdb server for esp32c5 on 3333 + Info : JTAG tap: esp32c5.cpu0 tap/device found: 0x00017c25 (mfg: 0x612 (Espressif Systems), part: 0x0017, ver: 0x0) + Info : JTAG tap: esp32c5.cpu1 tap/device found: 0x00017c25 (mfg: 0x612 (Espressif Systems), part: 0x0017, ver: 0x0) + Info : [esp32c5.cpu1] datacount=1 progbufsize=2 + Info : [esp32c5.cpu1] Examined RISC-V core; found 1 harts + Info : [esp32c5.cpu1] XLEN=32, misa=0x40101105 + Info : [esp32c5.cpu1] Examination succeed + Info : [esp32c5.cpu1] starting gdb server on 3333 Info : Listening on port 3333 for gdb connections .. |run-openocd-cfg-file-err| replace:: ``Can't find board/esp32c5-builtin.cfg`` @@ -121,17 +122,17 @@ * - ESP32-C5 Pin - JTAG Signal - * - MTDO / GPIO7 + * - MTDO / GPIO5 - TDO - * - MTDI / GPIO5 + * - MTDI / GPIO3 - TDI - * - MTCK / GPIO6 + * - MTCK / GPIO4 - TCK - * - MTMS / GPIO4 + * - MTMS / GPIO2 - TMS -.. |jtag-sel-gpio| replace:: GPIO15 -.. |jtag-gpio-list| replace:: GPIO4-GPIO7 +.. |jtag-sel-gpio| replace:: GPIO7 +.. |jtag-gpio-list| replace:: GPIO2-GPIO5 --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/index.rst b/docs/zh_CN/api-guides/jtag-debugging/index.rst index f92bb4238f6..7d4dbc4e177 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/index.rst +++ b/docs/zh_CN/api-guides/jtag-debugging/index.rst @@ -180,7 +180,7 @@ OpenOCD 安装完成后就可以配置 {IDF_TARGET_NAME} 目标(即带 JTAG :start-after: run-openocd :end-before: --- -{IDF_TARGET_FTDI_CONFIG:default="Not Updated!", esp32s3="board/esp32s3-ftdi.cfg", esp32c3="board/esp32c3-ftdi.cfg", esp32c6="board/esp32c6-ftdi.cfg", esp32h2="board/esp32h2-ftdi.cfg"} +{IDF_TARGET_FTDI_CONFIG:default="Not Updated!", esp32s3="board/esp32s3-ftdi.cfg", esp32c3="board/esp32c3-ftdi.cfg", esp32c6="board/esp32c6-ftdi.cfg", esp32h2="board/esp32h2-ftdi.cfg", esp32p4="board/esp32p4-ftdi.cfg", esp32c5="board/esp32c5-ftdi.cfg"} .. note:: From 48b3e4f76f9aa2141fcbcf8c265c0d6208a2111d Mon Sep 17 00:00:00 2001 From: David Cermak Date: Fri, 7 Jun 2024 16:23:41 +0200 Subject: [PATCH 076/113] feat(lwip): Add support for disabling IPv4 in PPP networks --- .../esp_netif/lwip/esp_netif_lwip_ppp.c | 2 + components/lwip/Kconfig | 40 +++++++++++-------- components/lwip/port/include/lwipopts.h | 5 +++ 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/components/esp_netif/lwip/esp_netif_lwip_ppp.c b/components/esp_netif/lwip/esp_netif_lwip_ppp.c index 259ec9f4b75..442f249a881 100644 --- a/components/esp_netif/lwip/esp_netif_lwip_ppp.c +++ b/components/esp_netif/lwip/esp_netif_lwip_ppp.c @@ -231,7 +231,9 @@ netif_related_data_t * esp_netif_new_ppp(esp_netif_t *esp_netif, const esp_netif #if PPP_NOTIFY_PHASE ppp_set_notify_phase_callback(ppp_obj->ppp, on_ppp_notify_phase); #endif +#if PPP_IPV4_SUPPORT ppp_set_usepeerdns(ppp_obj->ppp, 1); +#endif return (netif_related_data_t *)ppp_obj; } diff --git a/components/lwip/Kconfig b/components/lwip/Kconfig index 90ee1262013..4af717287b4 100644 --- a/components/lwip/Kconfig +++ b/components/lwip/Kconfig @@ -882,6 +882,21 @@ menu "LWIP" default 0x0 if LWIP_TCPIP_TASK_AFFINITY_CPU0 default 0x1 if LWIP_TCPIP_TASK_AFFINITY_CPU1 + config LWIP_IPV6_MEMP_NUM_ND6_QUEUE + int "Max number of IPv6 packets to queue during MAC resolution" + depends on LWIP_IPV6 + range 3 20 + default 3 + help + Config max number of IPv6 packets to queue during MAC resolution. + + config LWIP_IPV6_ND6_NUM_NEIGHBORS + int "Max number of entries in IPv6 neighbor cache" + depends on LWIP_IPV6 + range 3 10 + default 5 + help + Config max number of entries in IPv6 neighbor cache menuconfig LWIP_PPP_SUPPORT bool "Enable PPP support" @@ -889,6 +904,15 @@ menu "LWIP" help Enable PPP stack. Now only PPP over serial is possible. + config LWIP_PPP_ENABLE_IPV4 + bool "Enable IPV4 support for PPP connections (IPCP)" + depends on LWIP_PPP_SUPPORT && LWIP_IPV4 + default y + help + Enable IPCP protocol in PPP negotiations, which assigns IPv4 addresses to the PPP client, + as well as IPv4 DNS servers. + You can disable this if your modem supports IPv6 only. + config LWIP_PPP_ENABLE_IPV6 bool "Enable IPV6 support for PPP connections (IPV6CP)" depends on LWIP_PPP_SUPPORT && LWIP_IPV6 @@ -900,22 +924,6 @@ menu "LWIP" This would in turn fail the configuration for the whole link. If your modem is not responding correctly to PPP Phase Network, try to disable IPV6 support. - config LWIP_IPV6_MEMP_NUM_ND6_QUEUE - int "Max number of IPv6 packets to queue during MAC resolution" - depends on LWIP_IPV6 - range 3 20 - default 3 - help - Config max number of IPv6 packets to queue during MAC resolution. - - config LWIP_IPV6_ND6_NUM_NEIGHBORS - int "Max number of entries in IPv6 neighbor cache" - depends on LWIP_IPV6 - range 3 10 - default 5 - help - Config max number of entries in IPv6 neighbor cache - config LWIP_PPP_NOTIFY_PHASE_SUPPORT bool "Enable Notify Phase Callback" depends on LWIP_PPP_SUPPORT diff --git a/components/lwip/port/include/lwipopts.h b/components/lwip/port/include/lwipopts.h index c9a6d570229..d150106f814 100644 --- a/components/lwip/port/include/lwipopts.h +++ b/components/lwip/port/include/lwipopts.h @@ -1080,6 +1080,11 @@ static inline uint32_t timeout_from_offered(uint32_t lease, uint32_t min) */ #define PPP_IPV6_SUPPORT CONFIG_LWIP_PPP_ENABLE_IPV6 +/** + * PPP_IPV4_SUPPORT==1: Enable PPP IPv4 support + */ +#define PPP_IPV4_SUPPORT CONFIG_LWIP_PPP_ENABLE_IPV4 + /** * PPP_NOTIFY_PHASE==1: Support PPP notify phase. */ From 95169eb929cb598e58a644493a6eaa834065c496 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Fri, 7 Jun 2024 16:52:32 +0200 Subject: [PATCH 077/113] feat(esp_netif): Add support for IPv6 autoconfig flag per netif --- components/esp_netif/include/esp_netif_defaults.h | 14 ++++++++++---- components/esp_netif/include/esp_netif_types.h | 1 + components/esp_netif/lwip/esp_netif_lwip.c | 2 +- components/esp_netif/lwip/esp_netif_lwip_ppp.c | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/components/esp_netif/include/esp_netif_defaults.h b/components/esp_netif/include/esp_netif_defaults.h index 414b6c389ba..b215aca1dca 100644 --- a/components/esp_netif/include/esp_netif_defaults.h +++ b/components/esp_netif/include/esp_netif_defaults.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -36,9 +36,15 @@ extern "C" { #define ESP_NETIF_DEFAULT_MLDV6_REPORT_FLAGS (0) #endif +#ifdef CONFIG_LWIP_IPV6_AUTOCONFIG +#define ESP_NETIF_DEFAULT_IPV6_AUTOCONFIG_FLAGS (ESP_NETIF_FLAG_IPV6_AUTOCONFIG_ENABLED) +#else +#define ESP_NETIF_DEFAULT_IPV6_AUTOCONFIG_FLAGS (0) +#endif + #define ESP_NETIF_INHERENT_DEFAULT_WIFI_STA() \ { \ - .flags = (esp_netif_flags_t)(ESP_NETIF_IPV4_ONLY_FLAGS(ESP_NETIF_DHCP_CLIENT) | ESP_NETIF_DEFAULT_ARP_FLAGS | ESP_NETIF_DEFAULT_MLDV6_REPORT_FLAGS | ESP_NETIF_FLAG_EVENT_IP_MODIFIED), \ + .flags = (esp_netif_flags_t)(ESP_NETIF_IPV4_ONLY_FLAGS(ESP_NETIF_DHCP_CLIENT) | ESP_NETIF_DEFAULT_ARP_FLAGS | ESP_NETIF_DEFAULT_MLDV6_REPORT_FLAGS | ESP_NETIF_FLAG_EVENT_IP_MODIFIED | ESP_NETIF_DEFAULT_IPV6_AUTOCONFIG_FLAGS), \ ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(mac) \ ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(ip_info) \ .get_ip_event = IP_EVENT_STA_GOT_IP, \ @@ -78,7 +84,7 @@ extern "C" { #define ESP_NETIF_INHERENT_DEFAULT_ETH() \ { \ - .flags = (esp_netif_flags_t)(ESP_NETIF_IPV4_ONLY_FLAGS(ESP_NETIF_DHCP_CLIENT) | ESP_NETIF_DEFAULT_ARP_FLAGS | ESP_NETIF_FLAG_EVENT_IP_MODIFIED), \ + .flags = (esp_netif_flags_t)(ESP_NETIF_IPV4_ONLY_FLAGS(ESP_NETIF_DHCP_CLIENT) | ESP_NETIF_DEFAULT_ARP_FLAGS | ESP_NETIF_FLAG_EVENT_IP_MODIFIED | ESP_NETIF_DEFAULT_IPV6_AUTOCONFIG_FLAGS), \ ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(mac) \ ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(ip_info) \ .get_ip_event = IP_EVENT_ETH_GOT_IP, \ @@ -92,7 +98,7 @@ extern "C" { #ifdef CONFIG_PPP_SUPPORT #define ESP_NETIF_INHERENT_DEFAULT_PPP() \ { \ - .flags = ESP_NETIF_FLAG_IS_PPP, \ + .flags = (esp_netif_flags_t)(ESP_NETIF_FLAG_IS_PPP | ESP_NETIF_DEFAULT_IPV6_AUTOCONFIG_FLAGS), \ ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(mac) \ ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(ip_info) \ .get_ip_event = IP_EVENT_PPP_GOT_IP, \ diff --git a/components/esp_netif/include/esp_netif_types.h b/components/esp_netif/include/esp_netif_types.h index c9874c5673b..84a06281773 100644 --- a/components/esp_netif/include/esp_netif_types.h +++ b/components/esp_netif/include/esp_netif_types.h @@ -178,6 +178,7 @@ typedef enum esp_netif_flags { ESP_NETIF_FLAG_IS_PPP = 1 << 5, ESP_NETIF_FLAG_IS_BRIDGE = 1 << 6, ESP_NETIF_FLAG_MLDV6_REPORT = 1 << 7, + ESP_NETIF_FLAG_IPV6_AUTOCONFIG_ENABLED = 1 << 8, } esp_netif_flags_t; typedef enum esp_netif_ip_event_type { diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index 20ce5f5d7f3..b63577dd711 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -1105,7 +1105,7 @@ static esp_err_t esp_netif_start_api(esp_netif_api_msg_t *msg) ESP_ERROR_CHECK(esp_netif_lwip_add(esp_netif)); #if ESP_IPV6_AUTOCONFIG - esp_netif->lwip_netif->ip6_autoconfig_enabled = 1; + esp_netif->lwip_netif->ip6_autoconfig_enabled = (esp_netif->flags & ESP_NETIF_FLAG_IPV6_AUTOCONFIG_ENABLED) ? 1 : 0; #endif if (esp_netif->flags&ESP_NETIF_FLAG_GARP) { #if ESP_GRATUITOUS_ARP diff --git a/components/esp_netif/lwip/esp_netif_lwip_ppp.c b/components/esp_netif/lwip/esp_netif_lwip_ppp.c index 442f249a881..26e90560e4d 100644 --- a/components/esp_netif/lwip/esp_netif_lwip_ppp.c +++ b/components/esp_netif/lwip/esp_netif_lwip_ppp.c @@ -271,7 +271,7 @@ esp_err_t esp_netif_start_ppp(esp_netif_t *esp_netif) #endif // CONFIG_LWIP_PPP_SERVER_SUPPORT #if ESP_IPV6_AUTOCONFIG - ppp_ctx->ppp->netif->ip6_autoconfig_enabled = 1; + ppp_ctx->ppp->netif->ip6_autoconfig_enabled = (esp_netif->flags & ESP_NETIF_FLAG_IPV6_AUTOCONFIG_ENABLED) ? 1 : 0; #endif ESP_LOGD(TAG, "%s: Starting PPP connection: %p", __func__, ppp_ctx->ppp); From 3f535886a4b294a3e0ad9b6b1a1ee6752d4c1161 Mon Sep 17 00:00:00 2001 From: Zhang Shuxian Date: Fri, 12 Jul 2024 11:33:47 +0800 Subject: [PATCH 078/113] docs: Update cn trans for bootloader and host-apps in api-guides --- docs/en/api-guides/bootloader.rst | 4 ++-- docs/en/api-guides/host-apps.rst | 1 + docs/zh_CN/api-guides/bootloader.rst | 36 ++++++++++++++++------------ docs/zh_CN/api-guides/host-apps.rst | 15 +++++++++++- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/docs/en/api-guides/bootloader.rst b/docs/en/api-guides/bootloader.rst index f2b4d6277c9..e12660ce4ba 100644 --- a/docs/en/api-guides/bootloader.rst +++ b/docs/en/api-guides/bootloader.rst @@ -25,7 +25,7 @@ The bootloader does not support booting apps from older versions of ESP-IDF. Whe .. note:: - If testing an OTA update for an existing product in production, always test it using the same ESP-IDF bootloader binary that is deployed in production. + If testing an OTA update for an existing product in production, always test it using the same ESP-IDF bootloader binary that is deployed in production. .. only:: esp32 @@ -54,7 +54,7 @@ The :ref:`first-stage-bootloader` in ROM reads the :ref:`second-stage-bootloader .. only:: esp32 - Bootloaders prior to ESP-IDF V4.0 used the bootloader's own header to configure the SPI flash, meaning these values could not be changed in an update. To maintain compatibility with older bootloaders, the app re-initializes the flash settings during app startup using the configuration found in the app header. + Bootloaders prior to ESP-IDF V4.0 used the bootloader's own header to configure the SPI flash, meaning these values could not be changed in an update. To maintain compatibility with older bootloaders, the app re-initializes the flash settings during app startup using the configuration found in the app header. Log Level --------- diff --git a/docs/en/api-guides/host-apps.rst b/docs/en/api-guides/host-apps.rst index adfc33905b8..c846486353a 100644 --- a/docs/en/api-guides/host-apps.rst +++ b/docs/en/api-guides/host-apps.rst @@ -109,6 +109,7 @@ On Linux, applications prints an error message and a rudimentary backtrace once /lib/x86_64-linux-gnu/libc.so.6(+0x1097dc)[0x7f49f0ecd7dc] Note that the addresses (``+0x...``) are relative binary addresses, which still need to be converted to the source code line numbers (see below). + Note furthermore that the backtrace is created from the signal handler, which means that the two uppermost stack frames are not of interest. Instead, the third line is the uppermost stack frame where the issue occurred: .. code-block:: diff --git a/docs/zh_CN/api-guides/bootloader.rst b/docs/zh_CN/api-guides/bootloader.rst index 2565a2ea843..6412fe3d861 100644 --- a/docs/zh_CN/api-guides/bootloader.rst +++ b/docs/zh_CN/api-guides/bootloader.rst @@ -25,24 +25,24 @@ ESP-IDF 软件引导加载程序 (Bootloader) 主要执行以下任务: .. note:: - 如果在生产中测试现有产品的 OTA 更新,请确保测试中使用的 ESP-IDF 引导加载程序二进制文件与生产中部署的相同。 + 如果在生产中测试现有产品的 OTA 更新,请确保测试中使用的 ESP-IDF 引导加载程序二进制文件与生产中部署的相同。 .. only:: esp32 - ESP-IDF V2.1 之前的版本 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ESP-IDF V2.1 之前的版本 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 与新版本相比,ESP-IDF V2.1 之前的版本构建的引导加载程序对硬件的配置更少。使用这些早期 ESP-IDF 版本的引导加载程序并构建新应用程序时,请启用配置选项 :ref:`CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS`。 + 与新版本相比,ESP-IDF V2.1 之前的版本构建的引导加载程序对硬件的配置更少。使用这些早期 ESP-IDF 版本的引导加载程序并构建新应用程序时,请启用配置选项 :ref:`CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS`。 - ESP-IDF V3.1 之前的版本 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ESP-IDF V3.1 之前的版本 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ESP-IDF V3.1 之前的版本构建的引导加载程序不支持分区表二进制文件中的 MD5 校验。使用这些 ESP-IDF 版本的引导加载程序并构建新应用程序时,请启用配置选项 :ref:`CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS`。 + ESP-IDF V3.1 之前的版本构建的引导加载程序不支持分区表二进制文件中的 MD5 校验。使用这些 ESP-IDF 版本的引导加载程序并构建新应用程序时,请启用配置选项 :ref:`CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS`。 - ESP-IDF V5.1 之前的版本 - ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ESP-IDF V5.1 之前的版本 + ^^^^^^^^^^^^^^^^^^^^^^^^^^ - ESP-IDF V5.1 之前的版本构建的引导加载程序不支持 :ref:`CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM`。使用这些 ESP-IDF 版本的引导加载程序并构建新应用程序时,不应使用该选项。 + ESP-IDF V5.1 之前的版本构建的引导加载程序不支持 :ref:`CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM`。使用这些 ESP-IDF 版本的引导加载程序并构建新应用程序时,不应使用该选项。 配置 SPI flash @@ -54,7 +54,7 @@ ROM 中的 :ref:`first-stage-bootloader` 从 flash 中读取 :ref:`second-stage- .. only:: esp32 - ESP-IDF V4.0 版本之前的引导加载程序使用其自身的文件头来配置 SPI flash,这意味着无法在 OTA 更新时更改 SPI flash 配置。为了与旧引导加载程序兼容,应用程序在其启动期间使用应用程序文件头中的配置信息重新初始化 flash 配置。 + ESP-IDF V4.0 版本之前的引导加载程序使用其自身的文件头来配置 SPI flash,这意味着无法在 OTA 更新时更改 SPI flash 配置。为了与旧引导加载程序兼容,应用程序在其启动期间使用应用程序文件头中的配置信息重新初始化 flash 配置。 日志级别 --------- @@ -116,7 +116,7 @@ ROM 中的 :ref:`first-stage-bootloader` 从 flash 中读取 :ref:`second-stage- - :ref:`CONFIG_BOOTLOADER_NUM_PIN_APP_TEST` - 设置启动 TEST 分区的管脚编号,该管脚将被配置为输入并启用内部上拉。要触发测试应用,必须在重置时将此管脚拉低或拉高(可配置)。 - 释放管脚输入并重启设备后,将重新启用默认的启动顺序,即启动工厂分区或任意 OTA 应用分区槽。 + 释放管脚输入并重启设备后,将重新启用默认的启动顺序,即启动工厂分区或任意 OTA 应用分区槽。 - :ref:`CONFIG_BOOTLOADER_HOLD_TIME_GPIO` - 设置 GPIO 电平保持的时间,默认为 5 秒。设备重置后,管脚电平必须保持该设定的时间,才能执行恢复出厂设置或引导测试分区(如适用)。 @@ -163,12 +163,18 @@ ROM 中的 :ref:`first-stage-bootloader` 从 flash 中读取 :ref:`second-stage- 当启用 Secure Boot V2 时,由于引导加载程序最先加载到固定大小的缓冲区中进行验证,对二进制文件大小的绝对限制为 {IDF_TARGET_MAX_BOOTLOADER_SIZE}(不包括 4 KB 签名)。 +从深度睡眠中快速启动 +---------------------- + +引导加载程序有 :ref:`CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP` 选项,可以减少从深度睡眠中唤醒的时间(有利于降低功耗)。当 :ref:`CONFIG_SECURE_BOOT` 选项禁用时,该选项可用。由于无需镜像校验,唤醒时间减少。 + .. only:: SOC_RTC_FAST_MEM_SUPPORTED - 从深度睡眠中快速启动 - ---------------------- + 在第一次启动时,引导加载程序将启动的应用程序的地址存储在 RTC FAST 存储器中。而在唤醒过程中,这个地址用于启动而无需任何检查,从而实现了快速加载。 + +.. only:: not SOC_RTC_FAST_MEM_SUPPORTED - 引导加载程序有 :ref:`CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP` 选项,可以减少从深度睡眠中唤醒的时间(有利于降低功耗)。当 :ref:`CONFIG_SECURE_BOOT` 选项禁用时,该选项可用。由于无需镜像校验,唤醒时间减少。在第一次启动时,引导加载程序将启动的应用程序的地址存储在 RTC FAST 存储器中。而在唤醒过程中,这个地址用于启动而无需任何检查,从而实现了快速加载。 + {IDF_TARGET_NAME} 没有 RTC 存储器,因此无法存储正在运行的分区状态。每次唤醒会读取整个分区表,并加载正确的应用程序,而不进行额外的检查,因而使得加载速度更快。 自定义引导加载程序 ---------------------- diff --git a/docs/zh_CN/api-guides/host-apps.rst b/docs/zh_CN/api-guides/host-apps.rst index 917495235b7..546180d76dd 100644 --- a/docs/zh_CN/api-guides/host-apps.rst +++ b/docs/zh_CN/api-guides/host-apps.rst @@ -27,7 +27,7 @@ ESP-IDF 应用程序通常在主机上进行构建(交叉编译),然后上 1. 使用 `FreeRTOS POSIX/Linux 模拟器 `_ 可以模拟 FreeRTOS 调度。在此模拟的基础上,在主机上运行应用程序时也会模拟或使用其他 API。 2. 使用 `CMock `_ 可以模拟所有依赖文件,并在完全独立的情况下运行代码。 -原则上,这两种方法(POSIX/Linux 模拟器和使用 CMock 模拟)可以混用,但此功能在 ESP-IDF 中尚未实现。注意,尽管名称中包含 POSIX/Linux,但目前的 FreeRTOS POSIX/Linux 模拟器也支持在 macOS 系统中运行。在主机上运行 ESP-IDF 应用程序通常用于测试,但模拟环境和模拟依赖文件并不能完全代表目标设备。因此,仍然需要在目标设备上测试,此时测试的侧重点通常在集成和系统测试上。 +注意,尽管名称中包含 POSIX/Linux,但目前的 FreeRTOS POSIX/Linux 模拟器也支持在 macOS 系统中运行。在主机上运行 ESP-IDF 应用程序通常用于测试,但模拟环境和模拟依赖文件并不能完全代表目标设备。因此,仍然需要在目标设备上测试,此时测试的侧重点通常在集成和系统测试上。 .. note:: @@ -44,6 +44,18 @@ POSIX/Linux 模拟器的模拟 ESP-IDF 已支持使用 `FreeRTOS POSIX/Linux 模拟器 `_ 预览应用程序在目标芯片上的运行效果。使用该模拟器可以在主机上运行 ESP-IDF 组件,并使这类组件可用于在主机上运行的 ESP-IDF 应用程序。目前,只有一部分组件可以在 Linux 上构建。此外,各组件移植到 Linux 上后,其功能可能也会受到限制,或与在芯片目标上构建该组件的功能有所不同。有关所需组件在 Linux 上是否受支持的更多信息,请参阅 :ref:`component-linux-mock-support`。 +注意,该模拟器在控制和中断线程时大量依赖于 POSIX 信号和信号处理程序。因此,它具有以下 *限制*: + +.. list:: + - 避免使用不是 *async-signal-safe* 的函数,例如 ``printf()``。特别是,在多个优先级不同的任务中调用这些函数可能会导致崩溃和死锁。 + - 不是由 FreeRTOS API 函数创建的线程,禁止从中调用任何 FreeRTOS 原语。 + - 在 FreeRTOS 模拟器中,如果一个任务使用了像 ``select()`` 这样的原生阻塞或等待机制,模拟器可能会错误地将这些任务视为处于 *就绪状态*,然后尝试调度它们执行。实际上,这些任务可能仍然处于阻塞状态。FreeRTOS 对于那些使用了 FreeRTOS API 而被阻塞的任务,调度器只能识别出 *等待状态*。 + - 当一个模拟的 FreeRTOS 任务调用可能被信号中断的 API 时,这些 API 将持续接收模拟的 FreeRTOS 时钟中断。因此,调用这些 API 的代码应设计为能够处理潜在的中断信号,或者通过链接器进行 API 的包装处理。 + +由于测试和开发过程会受到这些限制影响,我们期望寻找到更好的解决方案用于在主机上运行 ESP-IDF 应用程序。 + +此外,请注意,如果您使用的是 ESP-IDF 中的 FreeRTOS 模拟组件(``tools/mocks/freertos``),这些限制不会影响程序运行。但是,该模拟组件也无法执行任何调度。 + .. only:: not esp32p4 .. note:: @@ -97,6 +109,7 @@ ESP-IDF 已支持使用 `FreeRTOS POSIX/Linux 模拟器 Date: Thu, 18 Jul 2024 10:30:11 +0800 Subject: [PATCH 079/113] fix(ble_mesh): fixed BLEMESH24-76 --- components/bt/esp_ble_mesh/core/net.c | 35 ++++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/components/bt/esp_ble_mesh/core/net.c b/components/bt/esp_ble_mesh/core/net.c index 2f9889669be..d5b768c7d22 100644 --- a/components/bt/esp_ble_mesh/core/net.c +++ b/components/bt/esp_ble_mesh/core/net.c @@ -2,7 +2,7 @@ /* * SPDX-FileCopyrightText: 2017 Intel Corporation - * SPDX-FileContributor: 2018-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2018-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -1129,23 +1129,34 @@ int bt_mesh_net_send(struct bt_mesh_net_tx *tx, struct net_buf *buf, if (((IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_provisioned()) || (IS_ENABLED(CONFIG_BLE_MESH_PROVISIONER) && bt_mesh_is_provisioner_en())) && (bt_mesh_fixed_group_match(tx->ctx->addr) || bt_mesh_elem_find(tx->ctx->addr))) { - if (cb && cb->start) { - cb->start(0, 0, cb_data); - } + /** + * If the target address isn't a unicast address, then the callback function + * will be called by `adv task` in place of here, to avoid the callback function + * being called twice. + * See BLEMESH24-76 for more details. + */ + if (BLE_MESH_ADDR_IS_UNICAST(tx->ctx->addr)) { + if (cb && cb->start) { + cb->start(0, 0, cb_data); + } - net_buf_slist_put(&bt_mesh.local_queue, net_buf_ref(buf)); + net_buf_slist_put(&bt_mesh.local_queue, net_buf_ref(buf)); - if (cb && cb->end) { - cb->end(0, cb_data); - } + if (cb && cb->end) { + cb->end(0, cb_data); + } - bt_mesh_net_local(); + bt_mesh_net_local(); + + err = 0; - err = 0; - /* If it is a group address, it still needs to be relayed */ - if (BLE_MESH_ADDR_IS_UNICAST(tx->ctx->addr)) { goto done; + } else { + net_buf_slist_put(&bt_mesh.local_queue, net_buf_ref(buf)); + bt_mesh_net_local(); } + + err = 0; } if ((bearer & BLE_MESH_ADV_BEARER) && From 08a698515202dc5582e1373f777544fae3c0d296 Mon Sep 17 00:00:00 2001 From: "igor.udot" Date: Thu, 18 Jul 2024 13:52:27 +0800 Subject: [PATCH 080/113] fix: temporal solution for host build and test --- .gitlab/ci/host-test.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index 3d93a205106..62fa8feeefc 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -314,8 +314,8 @@ test_pytest_qemu: --pytest-apps -m qemu --collect-app-info "list_job_${CI_JOB_NAME_SLUG}.txt" - --modified-components ${MR_MODIFIED_COMPONENTS} - --modified-files ${MR_MODIFIED_FILES} +# --modified-components ${MR_MODIFIED_COMPONENTS} will be fixed with IDFCI-2270 +# --modified-files ${MR_MODIFIED_FILES} - python tools/ci/get_known_failure_cases_file.py - run_cmd pytest --target $IDF_TARGET @@ -344,8 +344,8 @@ test_pytest_linux: --pytest-apps -m host_test --collect-app-info "list_job_${CI_JOB_NAME_SLUG}.txt" - --modified-components ${MR_MODIFIED_COMPONENTS} - --modified-files ${MR_MODIFIED_FILES} +# --modified-components ${MR_MODIFIED_COMPONENTS} will be fixed with IDFCI-2270 +# --modified-files ${MR_MODIFIED_FILES} - python tools/ci/get_known_failure_cases_file.py - run_cmd pytest --target linux @@ -376,8 +376,8 @@ test_pytest_macos: --pytest-apps -m \"host_test and macos_shell\" --collect-app-info "list_job_${CI_JOB_NAME_SLUG}.txt" - --modified-components ${MR_MODIFIED_COMPONENTS} - --modified-files ${MR_MODIFIED_FILES} +# --modified-components ${MR_MODIFIED_COMPONENTS} will be fixed with IDFCI-2270 +# --modified-files ${MR_MODIFIED_FILES} - python tools/ci/get_known_failure_cases_file.py - run_cmd pytest --target linux From 95bd043bda86e2d48eda1daf6f6df7839b91e399 Mon Sep 17 00:00:00 2001 From: zhiweijian Date: Thu, 18 Jul 2024 14:52:49 +0800 Subject: [PATCH 081/113] feat(bt/controller): support mesh duplicate with extend scan --- components/bt/controller/lib_esp32c3_family | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c3_family b/components/bt/controller/lib_esp32c3_family index 55485554203..bfdfe8f851c 160000 --- a/components/bt/controller/lib_esp32c3_family +++ b/components/bt/controller/lib_esp32c3_family @@ -1 +1 @@ -Subproject commit 55485554203a225ff09a8dfcf5284c46b70aa0bd +Subproject commit bfdfe8f851c99ced8316b133b0b15521917ea049 From 5b91022b1ed0e7d6a280a012eb0fa79c2e0cb14f Mon Sep 17 00:00:00 2001 From: renpeiying Date: Thu, 11 Jul 2024 10:49:39 +0800 Subject: [PATCH 082/113] docs: Update CN translation for api-guides/jtag-debugging/confugure-ft2232h-jtag.rst --- .../jtag-debugging/configure-ft2232h-jtag.rst | 10 ++--- .../jtag-debugging/configure-ft2232h-jtag.rst | 40 +++++++++++-------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/docs/en/api-guides/jtag-debugging/configure-ft2232h-jtag.rst b/docs/en/api-guides/jtag-debugging/configure-ft2232h-jtag.rst index 52e3e47f4ed..812df6d4e30 100644 --- a/docs/en/api-guides/jtag-debugging/configure-ft2232h-jtag.rst +++ b/docs/en/api-guides/jtag-debugging/configure-ft2232h-jtag.rst @@ -49,9 +49,9 @@ Windows - manual driver change 1. Download Zadig tool (Zadig_X.X.exe) from https://zadig.akeo.ie/ and run it. -2. In Zadig tool go to "Options" and check "List All Devices". +2. In Zadig tool go to `Options` and check `List All Devices`. -3. Check the list of devices that should contain two |devkit-name| specific USB entries: "Dual RS232-HS (Interface 0)" and "Dual RS232-HS (Interface 1)". The driver name would be "FTDIBUS (vxxxx)" and USB ID: 0403 6010. +3. Check the list of devices that should contain two |devkit-name| specific USB entries: `Dual RS232-HS (Interface 0)` and `Dual RS232-HS (Interface 1)`. The driver name would be `FTDIBUS (vxxxx)` and USB ID: 0403 6010. .. figure:: ../../../_static/jtag-usb-configuration-zadig.jpg :align: center @@ -60,11 +60,11 @@ Windows - manual driver change Configuration of JTAG USB driver in Zadig tool -4. The first device (Dual RS232-HS (Interface 0)) is connected to the JTAG port of the {IDF_TARGET_NAME}. Original "FTDIBUS (vxxxx)" driver of this device should be replaced with "WinUSB (v6xxxxx)". To do so, select "Dual RS232-HS (Interface 0) and reinstall attached driver to the "WinUSB (v6xxxxx)", see picture above. +4. The first device (Dual RS232-HS (Interface 0)) is connected to the JTAG port of the {IDF_TARGET_NAME}. Original `FTDIBUS (vxxxx)` driver of this device should be replaced with `WinUSB (v6xxxxx)`. To do so, select "Dual RS232-HS (Interface 0) and reinstall attached driver to the "WinUSB (v6xxxxx)", see picture above. .. note:: - Do not change the second device "Dual RS232-HS (Interface 1)". It is routed to {IDF_TARGET_NAME}'s serial port (UART) used for upload of application to {IDF_TARGET_NAME}'s flash. + Do not change the second device `Dual RS232-HS (Interface 1)`. It is routed to {IDF_TARGET_NAME}'s serial port (UART) used for upload of application to {IDF_TARGET_NAME}'s flash. Linux @@ -112,7 +112,7 @@ On macOS, using FT2232 for JTAG and serial port at the same time needs some addi Manually unloading the driver ............................. -1. Install FTDI driver from https://ftdichip.com/drivers/vcp-drivers/ +1. Install FTDI driver from `FTDI official website `_. 2. Connect USB cable to the |devkit-name|. diff --git a/docs/zh_CN/api-guides/jtag-debugging/configure-ft2232h-jtag.rst b/docs/zh_CN/api-guides/jtag-debugging/configure-ft2232h-jtag.rst index 023cb389772..b70d7fc168c 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/configure-ft2232h-jtag.rst +++ b/docs/zh_CN/api-guides/jtag-debugging/configure-ft2232h-jtag.rst @@ -7,7 +7,7 @@ :link_to_translation:`en:[English]` -所有版本的 |devkit-name| 板子都内置了 JTAG 调试功能,要使其正常工作,还需要设置相关跳帽来启用 JTAG 功能,设置 SPI 闪存电压和配置 USB 驱动程序。具体步骤请参考以下说明。 +所有版本的 |devkit-name| 开发板都内置了 JTAG 调试功能,要使其正常工作,还需要设置相关跳帽或 DIP 开关来启用 JTAG 功能,并配置 USB 驱动程序。具体步骤请参考以下说明。 配置硬件 ^^^^^^^^ @@ -33,15 +33,25 @@ Windows """"""" -1. 使用标准 USB A/micro USB B 线将 |devkit-name| 与计算机相连接,并打开板子的电源。 +1. 使用标准 USB A/micro USB B 线将 |devkit-name| 与计算机相连接,并打开开发板的电源。 2. 等待 Windows 识别出 |devkit-name| 并且为其安装驱动。如果驱动没有被自动安装,请前往 `官网 `_ 下载并手动安装。 -3. 从 `Zadig 官网 `_ 下载 Zadig 工具(Zadig_X.X.exe)并运行。 +3. 访问 https://github.com/espressif/esp-win-usb-drivers/releases 下载 |devkit-name| 驱动程序。解压驱动程序文件并 `安装驱动程序 `_。这会更改 Dual RS232-HS (Interface 0) 的驱动程序。 -4. 在 Zadig 工具中,进入 “Options” 菜单中选中 “List All Devices”。 +4. 现在,|devkit-name| 的 JTAG 接口应该可以被 OpenOCD 使用了,想要进一步设置调试环境,请前往 :ref:`jtag-debugging-run-openocd` 章节。 -5. 检查设备列表,其中应该包含两条与 |devkit-name| 相关的条目:“Dual RS232-HS (Interface 0)” 和 “Dual RS232-HS (Interface 1)”。驱动的名字应该是 “FTDIBUS (vxxxx)” 并且 USB ID 为:0403 6010。 +.. note:: + 如果驱动程序安装失败或 OpenOCD 无法运行,尝试以下步骤手动更改驱动程序。否则,可以跳过以下步骤。 + +Windows - 手动更改驱动程序 +"""""""""""""""""""""""""""""""""""" + +1. 从 https://zadig.akeo.ie/ 下载 Zadig 工具 (Zadig_X.X.exe) 并运行。 + +2. 在 Zadig 工具中进入 `Options`,选中 `List All Devices`。 + +3. 检查设备列表,其中应该包含两条与 |devkit-name| 相关的条目: `Dual RS232-HS (Interface 0)` 和 `Dual RS232-HS (Interface 1)`。驱动的名字应为 `FTDIBUS (vxxxx)` 并且 USB ID 为:0403 6010。 .. figure:: ../../../_static/jtag-usb-configuration-zadig.jpg :align: center @@ -50,23 +60,21 @@ Windows 在 Zadig 工具中配置 JTAG USB 驱动 -6. 第一个设备 “Dual RS232-HS (Interface 0)” 连接到了 {IDF_TARGET_NAME} 的 JTAG 端口,此设备原来的 “FTDIBUS (vxxxx)” 驱动需要替换成 "WinUSB (v6xxxxx)"。为此,请选择 “Dual RS232-HS (Interface 0)” 并将驱动重新安装为 “WinUSB (v6xxxxx)”,具体可以参考上图。 +4. 第一个设备 (Dual RS232-HS (Interface 0)) 连接到了 {IDF_TARGET_NAME} 的 JTAG 端口,此设备原来的 `FTDIBUS (vxxxx)` 驱动程序需替换为 `WinUSB (v6xxxxx)`。为此,请选择 `Dual RS232-HS(Interface 0)` 并将驱动程序重新安装为 `WinUSB (v6xxxxx)`,见上图。 .. note:: - 请勿更改第二个设备 “Dual RS232-HS (Interface 1)” 的驱动,它被连接到 {IDF_TARGET_NAME} 的串口 (UART),用于上传应用程序映像给 {IDF_TARGET_NAME} 进行烧写。 - -现在,|devkit-name| 的 JTAG 接口应该可以被 OpenOCD 使用了,想要进一步设置调试环境,请前往 :ref:`jtag-debugging-run-openocd` 章节。 + 请勿更改第二个设备 `Dual RS232-HS (Interface 1)` 的驱动,它被连接到 {IDF_TARGET_NAME} 的串口 (UART),用于上传应用程序映像给 {IDF_TARGET_NAME} 进行烧写。 Linux """"" -1. 使用标准 USB A/micro USB B 线将 |devkit-name| 与计算机相连接,并打开板子的电源。 +1. 使用标准 USB A/micro USB B 线将 |devkit-name| 与计算机相连接,并打开开发板电源。 .. highlight:: none -2. 打开终端,输入 ``ls -l /dev/ttyUSB*`` 命令检查操作系统是否能够识别板子的 USB 端口。类似识别结果如下: +2. 打开终端,输入 ``ls -l /dev/ttyUSB*`` 命令检查操作系统是否能够识别开发板的 USB 端口。类似识别结果如下: :: @@ -77,7 +85,7 @@ Linux 3. 设置 OpenOCD 所支持 USB 设备的访问权限,请将 `udev 规则文件 `_ 复制到 ``/etc/udev/rules.d`` 目录中。 -4. 注销并重新登录 Linux 系统,然后重新插拔板子的电源使之前的改动生效。在终端再次输入 ``ls -l /dev/ttyUSB*`` 命令进行验证,查看这两个设备的组所有者是否已经从 ``dialout`` 更改为 ``plugdev``: +4. 注销并重新登录 Linux 系统,然后重新插拔开发板电源使之前的改动生效。在终端再次输入 ``ls -l /dev/ttyUSB*`` 命令进行验证,查看这两个设备的组所有者是否已经从 ``dialout`` 更改为 ``plugdev``: :: @@ -149,7 +157,7 @@ MacOS .. note:: - 其他板子可能将通道 A 用于 JTAG,因此请谨慎使用此选项。 + 其他开发板可能将通道 A 用于 JTAG,因此请谨慎使用此选项。 .. warning:: @@ -182,7 +190,7 @@ MacOS 1027 -3. 保存并关闭文件 +3. 保存并关闭文件。 4. 禁用驱动的签名认证: @@ -196,8 +204,8 @@ MacOS csrutil enable --without kext - 5. 再一次重启系统 + 5. 再一次重启系统。 -完成这些步骤后,可以同时使用串口和 JTAG 接口了。 +完成这些步骤后,就可以同时使用串口和 JTAG 接口了。 想要进一步设置调试环境,请前往 :ref:`jtag-debugging-run-openocd` 章节。 From 999de9c864b28e6e0e7b62406d1fe9669d5b5dc5 Mon Sep 17 00:00:00 2001 From: Jacky6 Date: Wed, 10 Jul 2024 17:53:10 +0800 Subject: [PATCH 083/113] fix(tools/mfg_gen): Allow encoding u64 and i64 --- tools/mass_mfg/mfg_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/mass_mfg/mfg_gen.py b/tools/mass_mfg/mfg_gen.py index b3a9e0b1884..33850026c80 100644 --- a/tools/mass_mfg/mfg_gen.py +++ b/tools/mass_mfg/mfg_gen.py @@ -72,7 +72,7 @@ def verify_keys_exist(values_file_keys, input_config_file): def verify_datatype_encoding(input_config_file): """ Verify datatype and encodings from config file is valid """ - valid_encodings = {'string', 'binary', 'hex2bin','u8', 'i8', 'u16', 'u32', 'i32','base64'} + valid_encodings = {'string', 'binary', 'hex2bin','u8', 'i8', 'u16', 'u32', 'i32', 'u64', 'i64','base64'} valid_datatypes = {'file','data','namespace'} with open(input_config_file,'r') as config_file: From 5f1916f8e7788a3db9a927e4fd0e232efed44f0d Mon Sep 17 00:00:00 2001 From: "hrushikesh.bhosale" Date: Wed, 17 Jul 2024 16:13:16 +0530 Subject: [PATCH 084/113] test(nvs_flash): Added test for u64 and i64 encoding methods in mfg_gen.py --- tools/mass_mfg/mfg_gen.py | 3 +-- tools/mass_mfg/samples/sample_config.csv | 2 ++ tools/mass_mfg/samples/sample_values_multipage_blob.csv | 8 ++++---- tools/mass_mfg/samples/sample_values_singlepage_blob.csv | 8 ++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/tools/mass_mfg/mfg_gen.py b/tools/mass_mfg/mfg_gen.py index 33850026c80..63e21a9ec88 100644 --- a/tools/mass_mfg/mfg_gen.py +++ b/tools/mass_mfg/mfg_gen.py @@ -3,13 +3,12 @@ # SPDX-FileCopyrightText: 2018-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 # - import argparse import csv -import distutils.dir_util import os from itertools import zip_longest +import distutils.dir_util import esp_idf_nvs_partition_gen.nvs_partition_gen as nvs_partition_gen diff --git a/tools/mass_mfg/samples/sample_config.csv b/tools/mass_mfg/samples/sample_config.csv index dc516715914..ce4f363312e 100644 --- a/tools/mass_mfg/samples/sample_config.csv +++ b/tools/mass_mfg/samples/sample_config.csv @@ -4,6 +4,8 @@ dummyI8Key,data,i8 dummyU16Key,data,u16 dummyU32Key,data,u32 dummyI32Key,data,i32,REPEAT +dummyU64Key,data,u64 +dummyI64Key,data,i64 dummyStringKey,data,string dummyHex2BinKey,data,hex2bin dummyBase64Key,data,base64 diff --git a/tools/mass_mfg/samples/sample_values_multipage_blob.csv b/tools/mass_mfg/samples/sample_values_multipage_blob.csv index 0fb8e7d2302..660a2da233a 100644 --- a/tools/mass_mfg/samples/sample_values_multipage_blob.csv +++ b/tools/mass_mfg/samples/sample_values_multipage_blob.csv @@ -1,4 +1,4 @@ -id,dummyU8Key,dummyI8Key,dummyU16Key,dummyU32Key,dummyI32Key,dummyStringKey,dummyHex2BinKey,dummyBase64Key,hexFileKey,base64FileKey,stringFileKey,blobFileAKey,blobFileBKey,binFileKey -1,127,-128,32768,4294967295,-2147483648,0A:0B:0C:0D:0E:0F,010203abcdef,MTIzYWJj,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_multipage_blob.bin -2,126,-127,32767,4294967294,,A0:B0:C0:D0:E0:F0,102030abcdef,MTIzYWFh,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_multipage_blob.bin -3,125,-126,32766,4294967293,,00:B3:C4:BD:E2:0F,010203efcdab,MTIzYmJi,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_multipage_blob.bin +id,dummyU8Key,dummyI8Key,dummyU16Key,dummyU32Key,dummyI32Key,dummyU64Key,dummyI64Key,dummyStringKey,dummyHex2BinKey,dummyBase64Key,hexFileKey,base64FileKey,stringFileKey,blobFileAKey,blobFileBKey,binFileKey +1,127,-128,32768,4294967295,-2147483648,1125899906842624,1125899906842624,0A:0B:0C:0D:0E:0F,010203abcdef,MTIzYWJj,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_multipage_blob.bin +2,126,-127,32767,4294967294,,1125899906842624,-1125899906842624,A0:B0:C0:D0:E0:F0,102030abcdef,MTIzYWFh,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_multipage_blob.bin +3,125,-126,32766,4294967293,,1125899906842624,-1125899906842624,00:B3:C4:BD:E2:0F,010203efcdab,MTIzYmJi,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_multipage_blob.bin diff --git a/tools/mass_mfg/samples/sample_values_singlepage_blob.csv b/tools/mass_mfg/samples/sample_values_singlepage_blob.csv index 1e3508df829..df59949d331 100644 --- a/tools/mass_mfg/samples/sample_values_singlepage_blob.csv +++ b/tools/mass_mfg/samples/sample_values_singlepage_blob.csv @@ -1,4 +1,4 @@ -id,dummyU8Key,dummyI8Key,dummyU16Key,dummyU32Key,dummyI32Key,dummyStringKey,dummyHex2BinKey,dummyBase64Key,hexFileKey,base64FileKey,stringFileKey,blobFileAKey,blobFileBKey,binFileKey -1,127,-128,32768,4294967295,-2147483648,0A:0B:0C:0D:0E:0F,010203abcdef,MTIzYWJj,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_singlepage_blob.bin -2,126,-127,32767,4294967294,,A0:B0:C0:D0:E0:F0,102030abcdef,MTIzYWFh,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_singlepage_blob.bin -3,125,-126,32766,4294967293,,00:B3:C4:BD:E2:0F,010203efcdab,MTIzYmJi,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_singlepage_blob.bin +id,dummyU8Key,dummyI8Key,dummyU16Key,dummyU32Key,dummyI32Key,dummyU64Key,dummyI64Key,dummyStringKey,dummyHex2BinKey,dummyBase64Key,hexFileKey,base64FileKey,stringFileKey,blobFileAKey,blobFileBKey,binFileKey +1,127,-128,32768,4294967295,-2147483648,1125899905842624,-1125899906742624,0A:0B:0C:0D:0E:0F,010203abcdef,MTIzYWJj,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_singlepage_blob.bin +2,126,-127,32767,4294967294,,1125899906842600,-1125899906842614,A0:B0:C0:D0:E0:F0,102030abcdef,MTIzYWFh,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_singlepage_blob.bin +3,125,-126,32766,4294967293,,1125899906842624,-1125899906843524,00:B3:C4:BD:E2:0F,010203efcdab,MTIzYmJi,testdata/sample.hex,testdata/sample.base64,testdata/sample.txt,testdata/sample_blob.bin,testdata/sample_blob.bin,testdata/sample_singlepage_blob.bin From 1b8c8d5fd46e646fb1d156594487bcf74d135e7b Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 18 Jul 2024 08:58:57 +0800 Subject: [PATCH 085/113] fix(psram): fixed p4 psram 20M wrong clk div --- components/esp_psram/device/esp_psram_impl_ap_hex.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp_psram/device/esp_psram_impl_ap_hex.c b/components/esp_psram/device/esp_psram_impl_ap_hex.c index 82a1b4e0b83..7832460eb38 100644 --- a/components/esp_psram/device/esp_psram_impl_ap_hex.c +++ b/components/esp_psram/device/esp_psram_impl_ap_hex.c @@ -384,8 +384,8 @@ esp_err_t esp_psram_impl_enable(void) s_configure_psram_ecc(); #endif //enter MSPI slow mode to init PSRAM device registers - psram_ctrlr_ll_set_bus_clock(PSRAM_CTRLR_LL_MSPI_ID_2, 40); - psram_ctrlr_ll_set_bus_clock(PSRAM_CTRLR_LL_MSPI_ID_3, 40); + psram_ctrlr_ll_set_bus_clock(PSRAM_CTRLR_LL_MSPI_ID_2, AP_HEX_PSRAM_MPLL_DEFAULT_FREQ_MHZ / CONFIG_SPIRAM_SPEED); + psram_ctrlr_ll_set_bus_clock(PSRAM_CTRLR_LL_MSPI_ID_3, AP_HEX_PSRAM_MPLL_DEFAULT_FREQ_MHZ / CONFIG_SPIRAM_SPEED); psram_ctrlr_ll_enable_dll(PSRAM_CTRLR_LL_MSPI_ID_2, true); psram_ctrlr_ll_enable_dll(PSRAM_CTRLR_LL_MSPI_ID_3, true); From 4e3951a587cc544690d23a01460588d2da736ab8 Mon Sep 17 00:00:00 2001 From: Shyamal Khachane Date: Tue, 16 Jul 2024 11:09:44 +0530 Subject: [PATCH 086/113] fix(esp_wifi): Recompute keys in OWE if AP does not include PMKID in assoc response --- components/wpa_supplicant/src/rsn_supp/wpa.c | 181 ++++++++++--------- 1 file changed, 95 insertions(+), 86 deletions(-) diff --git a/components/wpa_supplicant/src/rsn_supp/wpa.c b/components/wpa_supplicant/src/rsn_supp/wpa.c index 4e4e1893638..aef17fc9c0d 100644 --- a/components/wpa_supplicant/src/rsn_supp/wpa.c +++ b/components/wpa_supplicant/src/rsn_supp/wpa.c @@ -2868,7 +2868,8 @@ int owe_process_assoc_resp(const u8 *rsn_ie, size_t rsn_len, const uint8_t *dh_i struct wpa_sm *sm; sm = get_wpa_sm(); - wpabuf_free(sm->owe_ie); //free the dh ie constructed in owe_build_assoc_req + /* Deallocate the dh ie buffer constructed in owe_build_assoc_req */ + wpabuf_free(sm->owe_ie); sm->owe_ie = NULL; struct wpa_ie_data *parsed_rsn_data; @@ -2882,121 +2883,129 @@ int owe_process_assoc_resp(const u8 *rsn_ie, size_t rsn_len, const uint8_t *dh_i goto fail; } + if (!dh_ie && parsed_rsn_data->num_pmkid == 0) { + wpa_printf(MSG_ERROR, "OWE: Assoc response should either have pmkid or DH IE"); + goto fail; + } + + /* Check for PMK caching */ + if (sm->cur_pmksa && parsed_rsn_data && parsed_rsn_data->num_pmkid == 1 && parsed_rsn_data->pmkid) { + if (os_memcmp(parsed_rsn_data->pmkid, sm->cur_pmksa->pmkid, OWE_PMKID_LEN) == 0) { + wpa_printf(MSG_DEBUG, "OWE: Using PMK caching"); + wpa_sm_set_pmk_from_pmksa(sm); + goto done; + } else { + /* If PMKID mismatches, derive keys again */ + wpa_printf(MSG_DEBUG, "OWE : Invalid PMKID in response"); + } + } + + if (dh_ie == NULL) { + wpa_printf(MSG_ERROR, "OWE: No Diffie Hellman IE in association response"); + goto fail; + } if (dh_ie && MIN_DH_LEN(dh_len)) { wpa_printf(MSG_ERROR, "OWE: Invalid Diffie Hellman IE"); goto fail; } - if (!dh_ie && parsed_rsn_data->num_pmkid == 0) { - wpa_printf(MSG_ERROR, "OWE: Assoc response should either have pmkid or DH IE"); + + /* If STA or AP does not have PMKID, or PMKID mismatches, proceed with normal association */ + dh_len += 2; + + dh_ie += 3; + dh_len -=3; + group = WPA_GET_LE16(dh_ie); + + /* Only group 19 is supported */ + if ((group != sm->owe_group) || (group != OWE_DH_GRP19)) { + wpa_printf(MSG_ERROR, "OWE: Unexpected Diffie-Hellman group in response"); goto fail; } - if (!sm->cur_pmksa) { /* No PMK caching */ - if (dh_ie == NULL) { - goto fail; - } - dh_len += 2; + prime_len = OWE_PRIME_LEN; - dh_ie += 3; - dh_len -=3; - group = WPA_GET_LE16(dh_ie); + /* Set peer's public key point and calculate shared secret */ + sh_secret = crypto_ecdh_set_peerkey(sm->owe_ecdh, 0, dh_ie+2, dh_len-2); + sh_secret = wpabuf_zeropad(sh_secret, prime_len); + if (!sh_secret) { + wpa_printf(MSG_ERROR, "OWE: Invalid peer DH public key"); + goto fail; + } - /* Only group 19 is supported */ - if ((group != sm->owe_group) || (group != OWE_DH_GRP19)) { - wpa_printf(MSG_ERROR, "OWE: Unexpected Diffie-Hellman group in response"); - goto fail; - } + wpa_hexdump_buf_key(MSG_DEBUG, "OWE: DH shared secret", sh_secret); + pub = crypto_ecdh_get_pubkey(sm->owe_ecdh, 0); + if (!pub) { + wpa_printf(MSG_ERROR, "No own public key"); + goto fail; + } - prime_len = OWE_PRIME_LEN; + /* PMKID = Truncate-128(Hash(C | A)) */ + addr[0] = wpabuf_head(pub); + len[0] = wpabuf_len(pub); + addr[1] = dh_ie + 2; + len[1] = dh_len - 2; - /* Set peer's public key point and calculate shared secret */ - sh_secret = crypto_ecdh_set_peerkey(sm->owe_ecdh, 0, dh_ie+2, dh_len-2); - sh_secret = wpabuf_zeropad(sh_secret, prime_len); - if (!sh_secret) { - wpa_printf(MSG_ERROR, "OWE: Invalid peer DH public key"); - goto fail; - } + int res = sha256_vector(2, addr, len, pmkid); + if (res < 0 ) { + goto fail; + } - wpa_hexdump_buf_key(MSG_DEBUG, "OWE: DH shared secret", sh_secret); - pub = crypto_ecdh_get_pubkey(sm->owe_ecdh, 0); - if (!pub) { - wpa_printf(MSG_ERROR, "No own public key"); - wpabuf_free(sh_secret); - goto fail; - } + hash_len = SHA256_MAC_LEN; - /* PMKID = Truncate-128(Hash(C | A)) */ - addr[0] = wpabuf_head(pub); - len[0] = wpabuf_len(pub); - addr[1] = dh_ie + 2; - len[1] = dh_len - 2; + pub = wpabuf_zeropad(pub, prime_len); + if (!pub) { + goto fail; + } - int res = sha256_vector(2, addr, len, pmkid); - if (res < 0 ) { - goto fail; - } + /* prk = HKDF-extract(C | A | group, z) */ + hkey = wpabuf_alloc(wpabuf_len(pub) + dh_len - 2 + 2); + if (!hkey) { + goto fail; + } - hash_len = SHA256_MAC_LEN; + wpabuf_put_buf(hkey, pub); /* C */ + wpabuf_free(pub); - pub = wpabuf_zeropad(pub, prime_len); + wpabuf_put_data(hkey, dh_ie + 2, dh_len - 2); /* A */ + wpabuf_put_le16(hkey, sm->owe_group); /* group */ - /* prk = HKDF-extract(C | A | group, z) */ - hkey = wpabuf_alloc(wpabuf_len(pub) + dh_len - 2 + 2); + res = hmac_sha256(wpabuf_head(hkey), wpabuf_len(hkey), wpabuf_head(sh_secret), wpabuf_len(sh_secret), prk); + if (res < 0 ) { + goto fail; + } - wpabuf_put_buf(hkey, pub); /* C */ - wpabuf_free(pub); + hash_len = SHA256_MAC_LEN; - wpabuf_put_data(hkey, dh_ie + 2, dh_len - 2); /* A */ - wpabuf_put_le16(hkey, sm->owe_group); /* group */ + wpabuf_free(hkey); + wpabuf_clear_free(sh_secret); - res = hmac_sha256(wpabuf_head(hkey), wpabuf_len(hkey), wpabuf_head(sh_secret), wpabuf_len(sh_secret), prk); - if (res < 0 ) { - goto fail; - } + wpa_hexdump_key(MSG_DEBUG, "OWE: prk", prk, hash_len); - hash_len = SHA256_MAC_LEN; + /* PMK = HKDF-expand(prk, "OWE Key Generation", n) */ + res = hmac_sha256_kdf(prk, hash_len, NULL, (const u8 *)info, + os_strlen(info), pmk, hash_len); + if (res < 0 ) { + goto fail; + } - wpabuf_free(hkey); - wpabuf_free(sh_secret); + forced_memzero(prk, SHA256_MAC_LEN); + wpa_hexdump(MSG_DEBUG, "OWE: PMKID", pmkid, OWE_PMKID_LEN); - wpa_hexdump_key(MSG_DEBUG, "OWE: prk", prk, hash_len); + os_memcpy(sm->pmk,pmk,hash_len); + sm->pmk_len = hash_len; + wpa_hexdump_key(MSG_DEBUG, "OWE: PMK", sm->pmk, sm->pmk_len); - /* PMK = HKDF-expand(prk, "OWE Key Generation", n) */ - res = hmac_sha256_kdf(prk, hash_len, NULL, (const u8 *)info, - os_strlen(info), pmk, hash_len); - if (res < 0 ) { - goto fail; - } + pmksa_cache_add(sm->pmksa, sm->pmk, sm->pmk_len, pmkid, NULL, 0, + sm->bssid, sm->own_addr, sm->network_ctx, sm->key_mgmt); - forced_memzero(prk, SHA256_MAC_LEN); - wpa_hexdump(MSG_DEBUG, "OWE: PMKID", pmkid, OWE_PMKID_LEN); - - os_memcpy(sm->pmk,pmk,hash_len); - sm->pmk_len = hash_len; - wpa_hexdump_key(MSG_DEBUG, "OWE: PMK", sm->pmk, sm->pmk_len); - - pmksa_cache_add(sm->pmksa, sm->pmk, sm->pmk_len, pmkid, NULL, 0, - sm->bssid, sm->own_addr, sm->network_ctx, sm->key_mgmt); - goto done; - } else { /* PMK caching */ - if (parsed_rsn_data && sm->cur_pmksa) { - if (parsed_rsn_data->num_pmkid == 1 && parsed_rsn_data->pmkid) { - if (os_memcmp(parsed_rsn_data->pmkid, sm->cur_pmksa->pmkid, OWE_PMKID_LEN) == 0) { - wpa_printf(MSG_DEBUG, "OWE: Using PMK caching"); - wpa_sm_set_pmk_from_pmksa(sm); - goto done; - } else { - wpa_printf(MSG_DEBUG, "OWE : Invalid PMKID in response"); - goto fail; - } - } - } - } done: os_free(parsed_rsn_data); return 0; fail: os_free(parsed_rsn_data); + wpabuf_free(pub); + wpabuf_free(hkey); + wpabuf_clear_free(sh_secret); return -1; } #endif // CONFIG_OWE_STA From cd0e0a683f294b9754b6b5ca96ff1779af372d55 Mon Sep 17 00:00:00 2001 From: gongyantao Date: Thu, 18 Jul 2024 11:09:30 +0800 Subject: [PATCH 087/113] fix(bt): fix uTask stack overflow in bt example spp_initiator --- .../bt_spp_initiator/main/console_uart.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/bluetooth/bluedroid/classic_bt/bt_spp_initiator/main/console_uart.c b/examples/bluetooth/bluedroid/classic_bt/bt_spp_initiator/main/console_uart.c index 7e10c2ea106..4bd1b2a0e19 100644 --- a/examples/bluetooth/bluedroid/classic_bt/bt_spp_initiator/main/console_uart.c +++ b/examples/bluetooth/bluedroid/classic_bt/bt_spp_initiator/main/console_uart.c @@ -1,9 +1,10 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ +#include "stdlib.h" #include "driver/uart.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -31,7 +32,7 @@ extern void spp_msg_args_parser(char *buf, int len); void spp_msg_handler(char *buf, int len) { - ESP_LOGE(TAG_CNSL, "Command [%s]", buf); + ESP_LOGI(TAG_CNSL, "Command [%s]", buf); spp_msg_args_parser(buf, len); } @@ -44,13 +45,18 @@ static void console_uart_task(void *pvParameters) spp_msg_parser_register_callback(parser, spp_msg_handler); spp_msg_show_usage(); #define TMP_BUF_LEN 128 - uint8_t tmp_buf[128] = {0}; + uint8_t *tmp_buf = NULL; + + if ((tmp_buf = (uint8_t *)calloc(TMP_BUF_LEN, sizeof(uint8_t))) == NULL) { + ESP_LOGE(TAG_CNSL,"temp buf malloc fail"); + return; + } for (;;) { //Waiting for UART event. if (xQueueReceive(uart_queue, (void * )&event, (TickType_t)portMAX_DELAY)) { switch (event.type) { - //Event of UART receving data + //Event of UART receiving data case UART_DATA: { len = uart_read_bytes(CONSOLE_UART_NUM, tmp_buf, TMP_BUF_LEN, 0); @@ -95,6 +101,8 @@ static void console_uart_task(void *pvParameters) } } } + + free(tmp_buf); vTaskDelete(NULL); } From a14dc38023195bf38d79e09f3a060e2e356df6f6 Mon Sep 17 00:00:00 2001 From: gongyantao Date: Thu, 18 Jul 2024 12:06:02 +0800 Subject: [PATCH 088/113] feat(bt): add bt address printing for all bt examples --- .../classic_bt/a2dp_sink/main/main.c | 15 ++++++++++- .../classic_bt/a2dp_source/main/main.c | 2 ++ .../classic_bt/bt_discovery/main/main.c | 2 ++ .../bt_hid_mouse_device/main/main.c | 27 ++++++++++--------- .../bluedroid/classic_bt/hfp_ag/main/main.c | 16 ++++++++++- .../bluedroid/classic_bt/hfp_hf/main/main.c | 16 ++++++++++- .../esp_hid_host/main/esp_hid_host_main.c | 16 ++++++++++- 7 files changed, 78 insertions(+), 16 deletions(-) diff --git a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c index 9ceb01d0cc5..8f23f4bcd15 100644 --- a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c +++ b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -47,6 +47,17 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param); /******************************* * STATIC FUNCTION DEFINITIONS ******************************/ +static char *bda2str(uint8_t * bda, char *str, size_t size) +{ + if (bda == NULL || str == NULL || size < 18) { + return NULL; + } + + uint8_t *p = bda; + sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", + p[0], p[1], p[2], p[3], p[4], p[5]); + return str; +} static void bt_app_dev_cb(esp_bt_dev_cb_event_t event, esp_bt_dev_cb_param_t *param) { @@ -176,6 +187,7 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param) void app_main(void) { + char bda_str[18] = {0}; /* initialize NVS — it is used to store PHY calibration data */ esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -230,6 +242,7 @@ void app_main(void) pin_code[3] = '4'; esp_bt_gap_set_pin(pin_type, 4, pin_code); + ESP_LOGI(BT_AV_TAG, "Own address:[%s]", bda2str((uint8_t *)esp_bt_dev_get_address(), bda_str, sizeof(bda_str))); bt_app_task_start_up(); /* bluetooth device name, connection mode and profile set up */ bt_app_work_dispatch(bt_av_hdl_stack_evt, BT_APP_EVT_STACK_UP, NULL, 0, NULL); diff --git a/examples/bluetooth/bluedroid/classic_bt/a2dp_source/main/main.c b/examples/bluetooth/bluedroid/classic_bt/a2dp_source/main/main.c index 66efa2b10f6..b47e2399876 100644 --- a/examples/bluetooth/bluedroid/classic_bt/a2dp_source/main/main.c +++ b/examples/bluetooth/bluedroid/classic_bt/a2dp_source/main/main.c @@ -735,6 +735,7 @@ static void bt_av_hdl_avrc_ct_evt(uint16_t event, void *p_param) void app_main(void) { + char bda_str[18] = {0}; /* initialize NVS — it is used to store PHY calibration data */ esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -788,6 +789,7 @@ void app_main(void) esp_bt_pin_code_t pin_code; esp_bt_gap_set_pin(pin_type, 0, pin_code); + ESP_LOGI(BT_AV_TAG, "Own address:[%s]", bda2str((uint8_t *)esp_bt_dev_get_address(), bda_str, sizeof(bda_str))); bt_app_task_start_up(); /* Bluetooth device name, connection mode and profile set up */ bt_app_work_dispatch(bt_av_hdl_stack_evt, BT_APP_STACK_UP_EVT, NULL, 0, NULL); diff --git a/examples/bluetooth/bluedroid/classic_bt/bt_discovery/main/main.c b/examples/bluetooth/bluedroid/classic_bt/bt_discovery/main/main.c index 5b4123c45e2..0c7669fadce 100644 --- a/examples/bluetooth/bluedroid/classic_bt/bt_discovery/main/main.c +++ b/examples/bluetooth/bluedroid/classic_bt/bt_discovery/main/main.c @@ -272,6 +272,7 @@ static void bt_app_gap_start_up(void) void app_main(void) { + char bda_str[18] = {0}; /* Initialize NVS — it is used to store PHY calibration data and save key-value pairs in flash memory*/ esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -304,5 +305,6 @@ void app_main(void) return; } + ESP_LOGI(GAP_TAG, "Own address:[%s]", bda2str((uint8_t *)esp_bt_dev_get_address(), bda_str, sizeof(bda_str))); bt_app_gap_start_up(); } diff --git a/examples/bluetooth/bluedroid/classic_bt/bt_hid_mouse_device/main/main.c b/examples/bluetooth/bluedroid/classic_bt/bt_hid_mouse_device/main/main.c index 0cf207b1c18..9ad5e21f6d3 100644 --- a/examples/bluetooth/bluedroid/classic_bt/bt_hid_mouse_device/main/main.c +++ b/examples/bluetooth/bluedroid/classic_bt/bt_hid_mouse_device/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -71,6 +71,18 @@ uint8_t hid_mouse_descriptor[] = { 0xc0 // END_COLLECTION }; +static char *bda2str(esp_bd_addr_t bda, char *str, size_t size) +{ + if (bda == NULL || str == NULL || size < 18) { + return NULL; + } + + uint8_t *p = bda; + sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", + p[0], p[1], p[2], p[3], p[4], p[5]); + return str; +} + const int hid_mouse_descriptor_len = sizeof(hid_mouse_descriptor); /** @@ -158,16 +170,6 @@ void mouse_move_task(void *pvParameters) } } -static void print_bt_address(void) -{ - const char *TAG = "bt_address"; - const uint8_t *bd_addr; - - bd_addr = esp_bt_dev_get_address(); - ESP_LOGI(TAG, "my bluetooth address is %02X:%02X:%02X:%02X:%02X:%02X", - bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); -} - void esp_bt_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param) { const char *TAG = "esp_bt_gap_cb"; @@ -390,6 +392,7 @@ void app_main(void) { const char *TAG = "app_main"; esp_err_t ret; + char bda_str[18] = {0}; ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -477,6 +480,6 @@ void app_main(void) esp_bt_pin_code_t pin_code; esp_bt_gap_set_pin(pin_type, 0, pin_code); - print_bt_address(); + ESP_LOGI(TAG, "Own address:[%s]", bda2str((uint8_t *)esp_bt_dev_get_address(), bda_str, sizeof(bda_str))); ESP_LOGI(TAG, "exiting"); } diff --git a/examples/bluetooth/bluedroid/classic_bt/hfp_ag/main/main.c b/examples/bluetooth/bluedroid/classic_bt/hfp_ag/main/main.c index d5e6f3d30e7..c93aac3da22 100644 --- a/examples/bluetooth/bluedroid/classic_bt/hfp_ag/main/main.c +++ b/examples/bluetooth/bluedroid/classic_bt/hfp_ag/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -32,6 +32,18 @@ enum { BT_APP_EVT_STACK_UP = 0, }; +static char *bda2str(esp_bd_addr_t bda, char *str, size_t size) +{ + if (bda == NULL || str == NULL || size < 18) { + return NULL; + } + + uint8_t *p = bda; + sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", + p[0], p[1], p[2], p[3], p[4], p[5]); + return str; +} + /* handler for bluetooth stack enabled events */ static void bt_hf_hdl_stack_evt(uint16_t event, void *p_param) { @@ -73,6 +85,7 @@ static void bt_hf_hdl_stack_evt(uint16_t event, void *p_param) void app_main(void) { + char bda_str[18] = {0}; /* Initialize NVS — it is used to store PHY calibration data */ esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { @@ -101,6 +114,7 @@ void app_main(void) return; } + ESP_LOGI(BT_HF_TAG, "Own address:[%s]", bda2str((uint8_t *)esp_bt_dev_get_address(), bda_str, sizeof(bda_str))); /* create application task */ bt_app_task_start_up(); diff --git a/examples/bluetooth/bluedroid/classic_bt/hfp_hf/main/main.c b/examples/bluetooth/bluedroid/classic_bt/hfp_hf/main/main.c index 66d73c58111..958f0193190 100644 --- a/examples/bluetooth/bluedroid/classic_bt/hfp_hf/main/main.c +++ b/examples/bluetooth/bluedroid/classic_bt/hfp_hf/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -32,6 +32,18 @@ static uint8_t peer_bdname_len; static const char remote_device_name[] = "ESP_HFP_AG"; +static char *bda2str(esp_bd_addr_t bda, char *str, size_t size) +{ + if (bda == NULL || str == NULL || size < 18) { + return NULL; + } + + uint8_t *p = bda; + sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", + p[0], p[1], p[2], p[3], p[4], p[5]); + return str; +} + static bool get_name_from_eir(uint8_t *eir, char *bdname, uint8_t *bdname_len) { uint8_t *rmt_bdname = NULL; @@ -151,6 +163,7 @@ static void bt_hf_client_hdl_stack_evt(uint16_t event, void *p_param); void app_main(void) { + char bda_str[18] = {0}; /* Initialize NVS — it is used to store PHY calibration data */ esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { @@ -186,6 +199,7 @@ void app_main(void) return; } + ESP_LOGI(BT_HF_TAG, "Own address:[%s]", bda2str((uint8_t *)esp_bt_dev_get_address(), bda_str, sizeof(bda_str))); /* create application task */ bt_app_task_start_up(); diff --git a/examples/bluetooth/esp_hid_host/main/esp_hid_host_main.c b/examples/bluetooth/esp_hid_host/main/esp_hid_host_main.c index 420ff9d72bf..1643b8a33ea 100644 --- a/examples/bluetooth/esp_hid_host/main/esp_hid_host_main.c +++ b/examples/bluetooth/esp_hid_host/main/esp_hid_host_main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -51,6 +51,18 @@ static const char *TAG = "ESP_HIDH_DEMO"; +static char *bda2str(esp_bd_addr_t bda, char *str, size_t size) +{ + if (bda == NULL || str == NULL || size < 18) { + return NULL; + } + + uint8_t *p = bda; + sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", + p[0], p[1], p[2], p[3], p[4], p[5]); + return str; +} + void hidh_callback(void *handler_args, esp_event_base_t base, int32_t id, void *event_data) { esp_hidh_event_t event = (esp_hidh_event_t)id; @@ -165,6 +177,7 @@ void ble_store_config_init(void); #endif void app_main(void) { + char bda_str[18] = {0}; esp_err_t ret; #if HID_HOST_MODE == HIDH_IDLE_MODE ESP_LOGE(TAG, "Please turn on BT HID host or BLE!"); @@ -188,6 +201,7 @@ void app_main(void) }; ESP_ERROR_CHECK( esp_hidh_init(&config) ); + ESP_LOGI(TAG, "Own address:[%s]", bda2str((uint8_t *)esp_bt_dev_get_address(), bda_str, sizeof(bda_str))); #if CONFIG_BT_NIMBLE_ENABLED /* XXX Need to have template for store */ ble_store_config_init(); From 5e0c5e0ba560a005225e3aca0cb451788c3fbb35 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Mon, 15 Jul 2024 20:24:55 +0800 Subject: [PATCH 089/113] change(mcpwm): remove mcpwm on esp32c61 mcpwm is not supported on esp32c61 --- .../soc/esp32c61/include/soc/clk_tree_defs.h | 44 ------------------- .../esp32c61/include/soc/pmu_icg_mapping.h | 2 - .../soc/esp32c61/include/soc/soc_caps.h | 16 ------- docs/docs_not_updated/esp32c61.txt | 1 - 4 files changed, 63 deletions(-) diff --git a/components/soc/esp32c61/include/soc/clk_tree_defs.h b/components/soc/esp32c61/include/soc/clk_tree_defs.h index 300547aa65a..c3cc167dc9e 100644 --- a/components/soc/esp32c61/include/soc/clk_tree_defs.h +++ b/components/soc/esp32c61/include/soc/clk_tree_defs.h @@ -231,50 +231,6 @@ typedef enum { LP_UART_SCLK_DEFAULT = SOC_MOD_CLK_RTC_FAST, /*!< LP_UART source clock default choice is LP(RTC)_FAST */ } soc_periph_lp_uart_clk_src_t; -//////////////////////////////////////////////////MCPWM///////////////////////////////////////////////////////////////// - -/** - * @brief Array initializer for all supported clock sources of MCPWM Timer - */ -#define SOC_MCPWM_TIMER_CLKS {SOC_MOD_CLK_PLL_F160M, SOC_MOD_CLK_XTAL} - -/** - * @brief Type of MCPWM timer clock source - */ -typedef enum { - MCPWM_TIMER_CLK_SRC_PLL160M = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the source clock */ - MCPWM_TIMER_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ - MCPWM_TIMER_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the default clock choice */ -} soc_periph_mcpwm_timer_clk_src_t; - -/** - * @brief Array initializer for all supported clock sources of MCPWM Capture Timer - */ -#define SOC_MCPWM_CAPTURE_CLKS {SOC_MOD_CLK_PLL_F160M, SOC_MOD_CLK_XTAL} - -/** - * @brief Type of MCPWM capture clock source - */ -typedef enum { - MCPWM_CAPTURE_CLK_SRC_PLL160M = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the source clock */ - MCPWM_CAPTURE_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ - MCPWM_CAPTURE_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the default clock choice */ -} soc_periph_mcpwm_capture_clk_src_t; - -/** - * @brief Array initializer for all supported clock sources of MCPWM Carrier - */ -#define SOC_MCPWM_CARRIER_CLKS {SOC_MOD_CLK_PLL_F160M, SOC_MOD_CLK_XTAL} - -/** - * @brief Type of MCPWM carrier clock source - */ -typedef enum { - MCPWM_CARRIER_CLK_SRC_PLL160M = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the source clock */ - MCPWM_CARRIER_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ - MCPWM_CARRIER_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the default clock choice */ -} soc_periph_mcpwm_carrier_clk_src_t; - ///////////////////////////////////////////////////// I2S ////////////////////////////////////////////////////////////// /** diff --git a/components/soc/esp32c61/include/soc/pmu_icg_mapping.h b/components/soc/esp32c61/include/soc/pmu_icg_mapping.h index 4f4ca84f1e3..eae01baf4f9 100644 --- a/components/soc/esp32c61/include/soc/pmu_icg_mapping.h +++ b/components/soc/esp32c61/include/soc/pmu_icg_mapping.h @@ -19,7 +19,6 @@ #define PMU_ICG_APB_ENA_PARL 23 #define PMU_ICG_APB_ENA_PCNT 20 #define PMU_ICG_APB_ENA_PVT_MONITOR 27 -#define PMU_ICG_APB_ENA_PWM 21 #define PMU_ICG_APB_ENA_REGDMA 24 #define PMU_ICG_APB_ENA_SARADC 9 #define PMU_ICG_APB_ENA_SEC 0 @@ -44,7 +43,6 @@ #define PMU_ICG_FUNC_ENA_PARL_RX 25 #define PMU_ICG_FUNC_ENA_PARL_TX 24 #define PMU_ICG_FUNC_ENA_PVT_MONITOR 23 -#define PMU_ICG_FUNC_ENA_PWM 22 #define PMU_ICG_FUNC_ENA_SARADC 20 #define PMU_ICG_FUNC_ENA_SEC 19 #define PMU_ICG_FUNC_ENA_SPI2 1 diff --git a/components/soc/esp32c61/include/soc/soc_caps.h b/components/soc/esp32c61/include/soc/soc_caps.h index 7c4b1e2610c..d704741723c 100644 --- a/components/soc/esp32c61/include/soc/soc_caps.h +++ b/components/soc/esp32c61/include/soc/soc_caps.h @@ -64,7 +64,6 @@ // \#define SOC_REG_I2C_SUPPORTED 1 //TODO: [ESP32C61] IDF-9276 // \#define SOC_PCNT_SUPPORTED 0 //TODO: [ESP32C61] IDF-9332 -// \#define SOC_MCPWM_SUPPORTED 0 //TODO: [ESP32C61] IDF-9338 // \#define SOC_TWAI_SUPPORTED 0 //TODO: [ESP32C61] IDF-9336 // \#define SOC_ETM_SUPPORTED 0 // \#define SOC_LP_CORE_SUPPORTED 0 //TODO: [ESP32C61] IDF-9331 @@ -298,21 +297,6 @@ // #define SOC_PCNT_THRES_POINT_PER_UNIT 2 // #define SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE 1 -/*-------------------------- MCPWM CAPS --------------------------------------*/ -// #define SOC_MCPWM_GROUPS (1U) ///< 1 MCPWM groups on the chip (i.e., the number of independent MCPWM peripherals) -// #define SOC_MCPWM_TIMERS_PER_GROUP (3) ///< The number of timers that each group has -// #define SOC_MCPWM_OPERATORS_PER_GROUP (3) ///< The number of operators that each group has -// #define SOC_MCPWM_COMPARATORS_PER_OPERATOR (2) ///< The number of comparators that each operator has -// #define SOC_MCPWM_GENERATORS_PER_OPERATOR (2) ///< The number of generators that each operator has -// #define SOC_MCPWM_TRIGGERS_PER_OPERATOR (2) ///< The number of triggers that each operator has -// #define SOC_MCPWM_GPIO_FAULTS_PER_GROUP (3) ///< The number of fault signal detectors that each group has -// #define SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP (1) ///< The number of capture timers that each group has -// #define SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER (3) ///< The number of capture channels that each capture timer has -// #define SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP (3) ///< The number of GPIO synchros that each group has -// #define SOC_MCPWM_SWSYNC_CAN_PROPAGATE (1) ///< Software sync event can be routed to its output -// #define SOC_MCPWM_SUPPORT_ETM (1) ///< Support ETM (Event Task Matrix) -// #define SOC_MCPWM_CAPTURE_CLK_FROM_GROUP (1) ///< Capture timer shares clock with other PWM timers - /*------------------------ USB SERIAL JTAG CAPS ------------------------------*/ // \#define SOC_USB_SERIAL_JTAG_SUPPORT_LIGHT_SLEEP (1) /*!< Support to maintain minimum usb communication during light sleep */ // TODO: IDF-6395 diff --git a/docs/docs_not_updated/esp32c61.txt b/docs/docs_not_updated/esp32c61.txt index 2e4419a458d..0f9e537a42d 100644 --- a/docs/docs_not_updated/esp32c61.txt +++ b/docs/docs_not_updated/esp32c61.txt @@ -99,7 +99,6 @@ api-reference/peripherals/gptimer.rst api-reference/peripherals/pcnt.rst api-reference/peripherals/touch_element.rst api-reference/peripherals/ppa.rst -api-reference/peripherals/mcpwm.rst api-reference/peripherals/ana_cmpr.rst api-reference/peripherals/camera_driver.rst api-reference/peripherals/ledc.rst From 6b7da2901e9217a0d257f0086db7e43e444ead92 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Mon, 15 Jul 2024 20:33:48 +0800 Subject: [PATCH 090/113] change(pcnt): remove pcnt on esp32c61 pcnt is not supported on esp32c61 --- components/soc/esp32c61/include/soc/pmu_icg_mapping.h | 1 - components/soc/esp32c61/include/soc/soc_caps.h | 8 -------- docs/docs_not_updated/esp32c61.txt | 1 - 3 files changed, 10 deletions(-) diff --git a/components/soc/esp32c61/include/soc/pmu_icg_mapping.h b/components/soc/esp32c61/include/soc/pmu_icg_mapping.h index eae01baf4f9..08ac435ee71 100644 --- a/components/soc/esp32c61/include/soc/pmu_icg_mapping.h +++ b/components/soc/esp32c61/include/soc/pmu_icg_mapping.h @@ -17,7 +17,6 @@ #define PMU_ICG_APB_ENA_MEM_MONITOR 25 #define PMU_ICG_APB_ENA_MSPI 5 #define PMU_ICG_APB_ENA_PARL 23 -#define PMU_ICG_APB_ENA_PCNT 20 #define PMU_ICG_APB_ENA_PVT_MONITOR 27 #define PMU_ICG_APB_ENA_REGDMA 24 #define PMU_ICG_APB_ENA_SARADC 9 diff --git a/components/soc/esp32c61/include/soc/soc_caps.h b/components/soc/esp32c61/include/soc/soc_caps.h index d704741723c..812cb484c4d 100644 --- a/components/soc/esp32c61/include/soc/soc_caps.h +++ b/components/soc/esp32c61/include/soc/soc_caps.h @@ -63,7 +63,6 @@ // \#define SOC_MODEM_CLOCK_SUPPORTED 1 // \#define SOC_REG_I2C_SUPPORTED 1 //TODO: [ESP32C61] IDF-9276 -// \#define SOC_PCNT_SUPPORTED 0 //TODO: [ESP32C61] IDF-9332 // \#define SOC_TWAI_SUPPORTED 0 //TODO: [ESP32C61] IDF-9336 // \#define SOC_ETM_SUPPORTED 0 // \#define SOC_LP_CORE_SUPPORTED 0 //TODO: [ESP32C61] IDF-9331 @@ -290,13 +289,6 @@ #define SOC_MPU_REGION_RO_SUPPORTED 0 #define SOC_MPU_REGION_WO_SUPPORTED 0 -/*-------------------------- PCNT CAPS ---------------------------------------*/ -// #define SOC_PCNT_GROUPS 1U -// #define SOC_PCNT_UNITS_PER_GROUP 4 -// #define SOC_PCNT_CHANNELS_PER_UNIT 2 -// #define SOC_PCNT_THRES_POINT_PER_UNIT 2 -// #define SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE 1 - /*------------------------ USB SERIAL JTAG CAPS ------------------------------*/ // \#define SOC_USB_SERIAL_JTAG_SUPPORT_LIGHT_SLEEP (1) /*!< Support to maintain minimum usb communication during light sleep */ // TODO: IDF-6395 diff --git a/docs/docs_not_updated/esp32c61.txt b/docs/docs_not_updated/esp32c61.txt index 0f9e537a42d..18628f28dfc 100644 --- a/docs/docs_not_updated/esp32c61.txt +++ b/docs/docs_not_updated/esp32c61.txt @@ -96,7 +96,6 @@ api-reference/peripherals/spi_slave.rst api-reference/peripherals/etm.rst api-reference/peripherals/i2s.rst api-reference/peripherals/gptimer.rst -api-reference/peripherals/pcnt.rst api-reference/peripherals/touch_element.rst api-reference/peripherals/ppa.rst api-reference/peripherals/ana_cmpr.rst From cde7750f0ab0bdbe1b7a6bb4edf0edded6aaa7a2 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Thu, 11 Jul 2024 18:31:42 +0800 Subject: [PATCH 091/113] ci(legacy_pcnt): re_enable legacy_pcnt test on c5 --- components/driver/test_apps/.build-test-rules.yml | 4 ---- .../test_apps/legacy_pcnt_driver/main/test_legacy_pcnt.c | 7 ++----- .../test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py | 2 +- docs/en/api-reference/peripherals/pcnt.rst | 2 ++ docs/zh_CN/api-reference/peripherals/pcnt.rst | 2 ++ 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/components/driver/test_apps/.build-test-rules.yml b/components/driver/test_apps/.build-test-rules.yml index cea2987e205..f9d3c10bb14 100644 --- a/components/driver/test_apps/.build-test-rules.yml +++ b/components/driver/test_apps/.build-test-rules.yml @@ -54,10 +54,6 @@ components/driver/test_apps/legacy_mcpwm_driver: components/driver/test_apps/legacy_pcnt_driver: disable: - if: SOC_PCNT_SUPPORTED != 1 - disable_test: - - if: IDF_TARGET == "esp32c5" - temporary: true - reason: target test failed # TODO [ESP32C5] IDF-10341 depends_filepatterns: - components/driver/deprecated/**/*pcnt* diff --git a/components/driver/test_apps/legacy_pcnt_driver/main/test_legacy_pcnt.c b/components/driver/test_apps/legacy_pcnt_driver/main/test_legacy_pcnt.c index 9c2c4a9287c..80bd8657f37 100644 --- a/components/driver/test_apps/legacy_pcnt_driver/main/test_legacy_pcnt.c +++ b/components/driver/test_apps/legacy_pcnt_driver/main/test_legacy_pcnt.c @@ -30,16 +30,12 @@ #define PCNT_CTRL_VCC_IO 1 #define PCNT_CTRL_GND_IO 0 #else -#define PULSE_IO 12 +#define PULSE_IO 0 #define PCNT_INPUT_IO 4 #define PCNT_CTRL_VCC_IO 5 #define PCNT_CTRL_GND_IO 2 #endif -#define HIGHEST_LIMIT 10 -#define LOWEST_LIMIT 0 -#define MAX_THRESHOLD 5 -#define MIN_THRESHOLD 0 #define PCNT_CTRL_HIGH_LEVEL 1 #define PCNT_CTRL_LOW_LEVEL 0 @@ -407,6 +403,7 @@ TEST_CASE("PCNT_basic_function_test", "[pcnt]") // use LEDC to produce the pulse, then the PCNT to count it produce_pulse(); + vTaskDelay(10 / portTICK_PERIOD_MS); // ensure LEDC is working pcnt_test_io_config(PCNT_CTRL_HIGH_LEVEL); // initialize first, the initial value should be 0 diff --git a/components/driver/test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py b/components/driver/test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py index 68f8593a260..46eddeb18ed 100644 --- a/components/driver/test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py +++ b/components/driver/test_apps/legacy_pcnt_driver/pytest_legacy_pcnt.py @@ -7,7 +7,7 @@ @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32s3 -# @pytest.mark.esp32c5 # TODO [ESP32C5] IDF-10341 +@pytest.mark.esp32c5 @pytest.mark.esp32c6 @pytest.mark.esp32h2 @pytest.mark.esp32p4 diff --git a/docs/en/api-reference/peripherals/pcnt.rst b/docs/en/api-reference/peripherals/pcnt.rst index d3998235c0e..365d6c9f6f3 100644 --- a/docs/en/api-reference/peripherals/pcnt.rst +++ b/docs/en/api-reference/peripherals/pcnt.rst @@ -163,6 +163,8 @@ It is recommended to remove the unused watch point by :cpp:func:`pcnt_unit_remov When a watch step and a watch point are triggered at the same time (i.e. at the same absolute point), the callback function only gets called by once. + The step increment will be reset to 0 when the count reaches the high/low limit value. Please do not rely too much on the exact step interval. + .. code:: c // add positive direction watch step with 100 step intervals diff --git a/docs/zh_CN/api-reference/peripherals/pcnt.rst b/docs/zh_CN/api-reference/peripherals/pcnt.rst index 565a8ddeea5..8f47f0b9b86 100644 --- a/docs/zh_CN/api-reference/peripherals/pcnt.rst +++ b/docs/zh_CN/api-reference/peripherals/pcnt.rst @@ -163,6 +163,8 @@ PCNT 单元可被设置为观察几个特定的数值,这些被观察的数值 当观察步进和观察点同时被触发时,回调函数只会被调用一次。 + 当计数达到上/下限值时,步进增量会被重置为 0,请勿过分依赖于精确的步进间隔。 + .. code:: c // add positive direction step notify with 100 step intervals From 6f445a52df99f919b1a3a1e31eb745a3e5553831 Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Thu, 18 Jul 2024 16:46:29 +0530 Subject: [PATCH 092/113] fix(nimble): Add host callback to provide security key --- components/bt/host/nimble/nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 46ae5865554..9372de75dee 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 46ae5865554f2fd7df829b6b9b5ca24522b9ad76 +Subproject commit 9372de75deea015234e6b1d51dd63356a3c88683 From cbf59b4c763e86e12ecdc4cb35e0a0e05d18dbfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20M=C3=BAdry?= Date: Thu, 18 Jul 2024 12:53:29 +0200 Subject: [PATCH 093/113] fix(sdmmc): Fix logically dead code in sdmmc_io_rw_extended --- components/sdmmc/sdmmc_io.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/sdmmc/sdmmc_io.c b/components/sdmmc/sdmmc_io.c index 8334f3a22f6..970657dfe19 100644 --- a/components/sdmmc/sdmmc_io.c +++ b/components/sdmmc/sdmmc_io.c @@ -364,7 +364,9 @@ esp_err_t sdmmc_io_rw_extended(sdmmc_card_t* card, int func, err = sdmmc_send_cmd(card, &cmd); - if (arg & SD_ARG_CMD53_READ && + // Cannot do a normal bitmask check (arg & SD_ARG_CMD53_READ) + // since SD_ARG_CMD53_READ (0<<31) is 0 + if (!(arg & SD_ARG_CMD53_WRITE) && datalen > 0 && cmd.data == card->host.dma_aligned_buffer) { assert(datalen <= SDMMC_IO_BLOCK_SIZE); memcpy(datap, card->host.dma_aligned_buffer, datalen); @@ -672,7 +674,7 @@ static bool check_tuples_in_buffer(uint8_t* buf, int buffer_size, int* inout_cis esp_err_t sdmmc_io_get_cis_data(sdmmc_card_t* card, uint8_t* out_buffer, size_t buffer_size, size_t* inout_cis_size) { esp_err_t ret = ESP_OK; - WORD_ALIGNED_ATTR uint8_t buf[CIS_GET_MINIMAL_SIZE]; + WORD_ALIGNED_ATTR uint8_t buf[CIS_GET_MINIMAL_SIZE] = {0}; /* Pointer to size is a mandatory parameter */ assert(inout_cis_size); From d70383422be0d59fbbfb6e46ddc4d598e2b876c3 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Wed, 17 Jul 2024 09:20:35 +0800 Subject: [PATCH 094/113] feat(lp-core): add reduced footprint print functions --- .../lp_core/include/ulp_lp_core_print.h | 23 ++++++++++++ .../ulp/lp_core/lp_core/lp_core_panic.c | 24 ++++++++---- .../ulp/lp_core/lp_core/lp_core_print.c | 37 +++++++++++++++++++ .../lp_core_hp_uart/main/CMakeLists.txt | 4 +- .../main/lp_core/test_hello_main.c | 9 +++++ .../main/lp_core/test_panic_main.c | 15 ++++++++ .../lp_core_hp_uart/main/test_lp_core.c | 17 +++++++++ .../lp_core_hp_uart/pytest_lp_core_hp_uart.py | 15 ++++++++ 8 files changed, 135 insertions(+), 9 deletions(-) create mode 100644 components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_panic_main.c diff --git a/components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h b/components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h index 27a080581df..eeb15208dd4 100644 --- a/components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h +++ b/components/ulp/lp_core/lp_core/include/ulp_lp_core_print.h @@ -44,3 +44,26 @@ extern void ets_install_uart_printf(void); * @param c character to be printed */ void lp_core_print_char(char c); + +/** + * @brief Print a null-terminated string from the LP core + * + * @param str null-terminated string to be printed + */ +void lp_core_print_str(const char *str); + +/** + * @brief Print a hex value from the LP core + * + * @param h hex value to be printed + * + * @note Does not print '0x', only the digits (will always print 8 digits) + */ +void lp_core_print_hex(int h); + +/** + * @brief Print a two digit integer from the LP-Core + * + * @param d integer to be printed + */ +void lp_core_print_dec_two_digits(int d); diff --git a/components/ulp/lp_core/lp_core/lp_core_panic.c b/components/ulp/lp_core/lp_core/lp_core_panic.c index 70fac05483f..f85f6f30889 100644 --- a/components/ulp/lp_core/lp_core/lp_core_panic.c +++ b/components/ulp/lp_core/lp_core/lp_core_panic.c @@ -16,16 +16,19 @@ static void dump_stack(RvExcFrame *frame, int exccause) { uint32_t i = 0; uint32_t sp = frame->sp; - lp_core_printf("\n\nStack memory:\n"); + lp_core_print_str("\n\nStack memory:\n"); const int per_line = 8; for (i = 0; i < 1024; i += per_line * sizeof(uint32_t)) { uint32_t *spp = (uint32_t *)(sp + i); - lp_core_printf("%08x: ", sp + i); + lp_core_print_hex(sp + i); + lp_core_print_str(": "); for (int y = 0; y < per_line; y++) { - lp_core_printf("0x%08x%c", spp[y], y == per_line - 1 ? '\n' : ' '); + lp_core_print_str("0x"); + lp_core_print_hex(spp[y]); + lp_core_print_char(y == per_line - 1 ? '\n' : ' '); } } - lp_core_printf("\n"); + lp_core_print_str("\n"); } static const char *desc[] = { @@ -57,21 +60,26 @@ void ulp_lp_core_panic_handler(RvExcFrame *frame, int exccause) exccause_str = reason[exccause]; } - lp_core_printf("Guru Meditation Error: LP Core panic'ed (%s)\n", exccause_str); - lp_core_printf("Core 0 register dump:\n"); + lp_core_print_str("Guru Meditation Error: LP Core panic'ed "); + lp_core_print_str(exccause_str); + lp_core_print_str("\n"); + lp_core_print_str("Core 0 register dump:\n"); uint32_t* frame_ints = (uint32_t*) frame; for (int x = 0; x < DIM(desc); x++) { if (desc[x][0] != 0) { const int not_last = (x + 1) % 4; - lp_core_printf("%-8s: 0x%08x %c", desc[x], frame_ints[x], not_last ? ' ' : '\n'); + lp_core_print_str(desc[x]); + lp_core_print_str(": 0x"); + lp_core_print_hex(frame_ints[x]); + lp_core_print_char(not_last ? ' ' : '\n'); } } dump_stack(frame, exccause); /* idf-monitor uses this string to mark the end of a panic dump */ - lp_core_printf("ELF file SHA256: No SHA256 Embedded\n"); + lp_core_print_str("ELF file SHA256: No SHA256 Embedded\n"); while (1) { } diff --git a/components/ulp/lp_core/lp_core/lp_core_print.c b/components/ulp/lp_core/lp_core/lp_core_print.c index 0a704c28a32..64d07b783f3 100644 --- a/components/ulp/lp_core/lp_core/lp_core_print.c +++ b/components/ulp/lp_core/lp_core/lp_core_print.c @@ -298,3 +298,40 @@ int lp_core_printf(const char* format, ...) } #endif /* !CONFIG_ULP_ROM_PRINT_ENABLE */ + +void lp_core_print_str(const char *str) +{ + for (int i = 0; str[i] != 0; i++) { + lp_core_print_char(str[i]); + } +} + +void lp_core_print_hex(int h) +{ + int x; + int c; + // Does not print '0x', only the digits (8 digits to print) + for (x = 0; x < 8; x++) { + c = (h >> 28) & 0xf; // extract the leftmost byte + if (c < 10) { + lp_core_print_char('0' + c); + } else { + lp_core_print_char('a' + c - 10); + } + h <<= 4; // move the 2nd leftmost byte to the left, to be extracted next + } +} + +void lp_core_print_dec_two_digits(int d) +{ + // can print at most 2 digits! + int n1, n2; + n1 = d % 10; // extract ones digit + n2 = d / 10; // extract tens digit + if (n2 == 0) { + lp_core_print_char(' '); + } else { + lp_core_print_char(n2 + '0'); + } + lp_core_print_char(n1 + '0'); +} diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/CMakeLists.txt b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/CMakeLists.txt index 6fce89dfdde..87918dae185 100644 --- a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/CMakeLists.txt +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/CMakeLists.txt @@ -1,5 +1,6 @@ set(app_sources "test_app_main.c" "test_lp_core.c") -set(lp_core_sources "lp_core/test_hello_main.c") +set(lp_core_sources "lp_core/test_hello_main.c") +set(lp_core_sources_panic "lp_core/test_panic_main.c") idf_component_register(SRCS ${app_sources} INCLUDE_DIRS "lp_core" @@ -9,3 +10,4 @@ idf_component_register(SRCS ${app_sources} set(lp_core_exp_dep_srcs ${app_sources}) ulp_embed_binary(lp_core_test_app "${lp_core_sources}" "${lp_core_exp_dep_srcs}") +ulp_embed_binary(lp_core_test_app_panic "${lp_core_sources_panic}" "${lp_core_exp_dep_srcs}") diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_hello_main.c b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_hello_main.c index 3c844cec7df..504aedd026e 100644 --- a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_hello_main.c +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_hello_main.c @@ -8,9 +8,18 @@ #include #include "ulp_lp_core_print.h" +volatile int hex_value = 0x1234ABCD; +volatile int dec_value = 56; + int main(void) { lp_core_printf("Hello, World!\n"); + lp_core_print_hex(hex_value); + lp_core_print_char('\n'); + + lp_core_print_dec_two_digits(dec_value); + lp_core_print_char('\n'); + return 0; } diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_panic_main.c b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_panic_main.c new file mode 100644 index 00000000000..4985426bebd --- /dev/null +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/lp_core/test_panic_main.c @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +int main(void) +{ + asm volatile("ebreak"); + + return 0; +} diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_lp_core.c b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_lp_core.c index 0d3949cd59a..bdd1e863c76 100644 --- a/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_lp_core.c +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/main/test_lp_core.c @@ -19,6 +19,9 @@ extern const uint8_t lp_core_main_bin_start[] asm("_binary_lp_core_test_app_bin_start"); extern const uint8_t lp_core_main_bin_end[] asm("_binary_lp_core_test_app_bin_end"); +extern const uint8_t lp_core_panic_bin_start[] asm("_binary_lp_core_test_app_panic_bin_start"); +extern const uint8_t lp_core_panic_bin_end[] asm("_binary_lp_core_test_app_panic_bin_end"); + static void load_and_start_lp_core_firmware(ulp_lp_core_cfg_t* cfg, const uint8_t* firmware_start, const uint8_t* firmware_end) { TEST_ASSERT(ulp_lp_core_load_binary(firmware_start, @@ -41,3 +44,17 @@ TEST_CASE("lp-print can output to hp-uart", "[lp_core]") // We simply wait to allow the lp-core to run once vTaskDelay(1000 / portTICK_PERIOD_MS); } + +TEST_CASE("LP-Core panic", "[lp_core]") +{ + /* Load ULP firmware and start the coprocessor */ + ulp_lp_core_cfg_t cfg = { + .wakeup_source = ULP_LP_CORE_WAKEUP_SOURCE_HP_CPU, + }; + + load_and_start_lp_core_firmware(&cfg, lp_core_panic_bin_start, lp_core_panic_bin_end); + + // Actual test output on UART is checked by pytest, not unity test-case + // We simply wait to allow the lp-core to run once + vTaskDelay(1000 / portTICK_PERIOD_MS); +} diff --git a/components/ulp/test_apps/lp_core/lp_core_hp_uart/pytest_lp_core_hp_uart.py b/components/ulp/test_apps/lp_core/lp_core_hp_uart/pytest_lp_core_hp_uart.py index df0edfec741..974a9d108a9 100644 --- a/components/ulp/test_apps/lp_core/lp_core_hp_uart/pytest_lp_core_hp_uart.py +++ b/components/ulp/test_apps/lp_core/lp_core_hp_uart/pytest_lp_core_hp_uart.py @@ -12,3 +12,18 @@ def test_lp_core_hp_uart_print(dut: Dut) -> None: dut.expect_exact('Press ENTER to see the list of tests') dut.write('"lp-print can output to hp-uart"') dut.expect_exact('Hello, World!') + dut.expect_exact('1234abcd') + dut.expect_exact('56') + + +@pytest.mark.esp32c5 +@pytest.mark.esp32c6 +@pytest.mark.esp32p4 +@pytest.mark.generic +def test_lp_core_panic(dut: Dut) -> None: + dut.expect_exact('Press ENTER to see the list of tests') + dut.write('"LP-Core panic"') + + dut.expect_exact("Guru Meditation Error: LP Core panic'ed Breakpoint") + dut.expect_exact('Core 0 register dump:') + dut.expect_exact('ELF file SHA256:') From a616782218e6286c716cdb73948736f6ceb6b887 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 12 Jul 2024 16:07:16 +0800 Subject: [PATCH 095/113] fix(parlio): fix cache sync issue on P4 --- components/esp_driver_parlio/src/parlio_tx.c | 12 +++++------ .../test_apps/parlio/main/test_parlio_tx.c | 20 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/components/esp_driver_parlio/src/parlio_tx.c b/components/esp_driver_parlio/src/parlio_tx.c index 3dfeb9f9d0f..e27e2de320d 100644 --- a/components/esp_driver_parlio/src/parlio_tx.c +++ b/components/esp_driver_parlio/src/parlio_tx.c @@ -394,7 +394,7 @@ static void IRAM_ATTR parlio_tx_mount_dma_data(parlio_tx_unit_t *tx_unit, const while (len) { assert(desc_nc); - mount_bytes = len > DMA_DESCRIPTOR_BUFFER_MAX_SIZE ? DMA_DESCRIPTOR_BUFFER_MAX_SIZE : len; + mount_bytes = len > PARLIO_MAX_ALIGNED_DMA_BUF_SIZE ? PARLIO_MAX_ALIGNED_DMA_BUF_SIZE : len; len -= mount_bytes; desc_nc->dw0.suc_eof = (len == 0); // whether the last frame desc_nc->dw0.size = mount_bytes; @@ -404,11 +404,6 @@ static void IRAM_ATTR parlio_tx_mount_dma_data(parlio_tx_unit_t *tx_unit, const desc_nc = PARLIO_GET_NON_CACHED_DESC_ADDR(desc_nc->next); prepared_length += mount_bytes; } - -#if CONFIG_IDF_TARGET_ESP32P4 - // Write back to cache to synchronize the cache before DMA start - esp_cache_msync((void *)buffer, len, ESP_CACHE_MSYNC_FLAG_DIR_C2M); -#endif // CONFIG_IDF_TARGET_ESP32P4 } esp_err_t parlio_tx_unit_wait_all_done(parlio_tx_unit_handle_t tx_unit, int timeout_ms) @@ -572,6 +567,11 @@ esp_err_t parlio_tx_unit_transmit(parlio_tx_unit_handle_t tx_unit, const void *p t->payload = payload; t->payload_bits = payload_bits; t->idle_value = config->idle_value & tx_unit->idle_value_mask; +#if SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE + // Write back to cache to synchronize the cache before DMA start + ESP_RETURN_ON_ERROR(esp_cache_msync((void *)payload, (payload_bits + 7) / 8, + ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED), TAG, "cache sync failed"); +#endif // SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE // send the transaction descriptor to progress queue ESP_RETURN_ON_FALSE(xQueueSend(tx_unit->trans_queues[PARLIO_TX_QUEUE_PROGRESS], &t, 0) == pdTRUE, diff --git a/components/esp_driver_parlio/test_apps/parlio/main/test_parlio_tx.c b/components/esp_driver_parlio/test_apps/parlio/main/test_parlio_tx.c index 061fefae122..a1fd71d8883 100644 --- a/components/esp_driver_parlio/test_apps/parlio/main/test_parlio_tx.c +++ b/components/esp_driver_parlio/test_apps/parlio/main/test_parlio_tx.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -109,7 +109,7 @@ TEST_CASE("parallel_tx_unit_trans_done_event", "[parlio_tx]") parlio_transmit_config_t transmit_config = { .idle_value = 0x00, }; - uint8_t payload[64] = {0}; + __attribute__((aligned(64))) uint8_t payload[64] = {0}; for (int i = 0; i < 64; i++) { payload[i] = i; } @@ -155,7 +155,7 @@ TEST_CASE("parallel_tx_unit_enable_disable", "[parlio_tx]") parlio_transmit_config_t transmit_config = { .idle_value = 0x00, }; - uint8_t payload[128] = {0}; + __attribute__((aligned(64))) uint8_t payload[128] = {0}; for (int i = 0; i < 128; i++) { payload[i] = i; } @@ -210,8 +210,9 @@ TEST_CASE("parallel_tx_unit_idle_value", "[parlio_tx]") parlio_transmit_config_t transmit_config = { .idle_value = 0x00, }; - uint8_t payload[8] = {0}; - for (int i = 0; i < 8; i++) { + uint32_t size = 64; + __attribute__((aligned(64))) uint8_t payload[size]; + for (int i = 0; i < size; i++) { payload[i] = i; } for (int j = 0; j < 16; j++) { @@ -255,15 +256,16 @@ TEST_CASE("parallel_tx_clock_gating", "[paralio_tx]") parlio_transmit_config_t transmit_config = { .idle_value = 0x00, }; - uint8_t payload[8] = {0}; - for (int i = 0; i < 8; i++) { + uint32_t size = 64; + __attribute__((aligned(64))) uint8_t payload[size]; + for (int i = 0; i < size; i++) { payload[i] = 0x1B; // 8'b00011011, in PARLIO_BIT_PACK_ORDER_MSB, you should see 2'b00, 2'b01, 2'b10, 2'b11 on the data line } - TEST_ESP_OK(parlio_tx_unit_transmit(tx_unit, payload, 8 * sizeof(uint8_t) * 8, &transmit_config)); + TEST_ESP_OK(parlio_tx_unit_transmit(tx_unit, payload, size * sizeof(uint8_t) * 8, &transmit_config)); TEST_ESP_OK(parlio_tx_unit_wait_all_done(tx_unit, -1)); // check if the level on the clock line is low TEST_ASSERT_EQUAL(0, gpio_get_level(TEST_CLK_GPIO)); - TEST_ESP_OK(parlio_tx_unit_transmit(tx_unit, payload, 8 * sizeof(uint8_t) * 8, &transmit_config)); + TEST_ESP_OK(parlio_tx_unit_transmit(tx_unit, payload, size * sizeof(uint8_t) * 8, &transmit_config)); TEST_ESP_OK(parlio_tx_unit_wait_all_done(tx_unit, -1)); TEST_ASSERT_EQUAL(0, gpio_get_level(TEST_CLK_GPIO)); TEST_ASSERT_EQUAL(0, gpio_get_level(TEST_CLK_GPIO)); From 5c23314da19449f88191a34b40c121c459ceb4a3 Mon Sep 17 00:00:00 2001 From: "igor.udot" Date: Fri, 19 Jul 2024 12:28:32 +0800 Subject: [PATCH 096/113] fix: apps empty list is not None --- .gitlab/ci/host-test.yml | 12 ++++++------ tools/ci/idf_pytest/plugin.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index 62fa8feeefc..3d93a205106 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -314,8 +314,8 @@ test_pytest_qemu: --pytest-apps -m qemu --collect-app-info "list_job_${CI_JOB_NAME_SLUG}.txt" -# --modified-components ${MR_MODIFIED_COMPONENTS} will be fixed with IDFCI-2270 -# --modified-files ${MR_MODIFIED_FILES} + --modified-components ${MR_MODIFIED_COMPONENTS} + --modified-files ${MR_MODIFIED_FILES} - python tools/ci/get_known_failure_cases_file.py - run_cmd pytest --target $IDF_TARGET @@ -344,8 +344,8 @@ test_pytest_linux: --pytest-apps -m host_test --collect-app-info "list_job_${CI_JOB_NAME_SLUG}.txt" -# --modified-components ${MR_MODIFIED_COMPONENTS} will be fixed with IDFCI-2270 -# --modified-files ${MR_MODIFIED_FILES} + --modified-components ${MR_MODIFIED_COMPONENTS} + --modified-files ${MR_MODIFIED_FILES} - python tools/ci/get_known_failure_cases_file.py - run_cmd pytest --target linux @@ -376,8 +376,8 @@ test_pytest_macos: --pytest-apps -m \"host_test and macos_shell\" --collect-app-info "list_job_${CI_JOB_NAME_SLUG}.txt" -# --modified-components ${MR_MODIFIED_COMPONENTS} will be fixed with IDFCI-2270 -# --modified-files ${MR_MODIFIED_FILES} + --modified-components ${MR_MODIFIED_COMPONENTS} + --modified-files ${MR_MODIFIED_FILES} - python tools/ci/get_known_failure_cases_file.py - run_cmd pytest --target linux diff --git a/tools/ci/idf_pytest/plugin.py b/tools/ci/idf_pytest/plugin.py index d88370792b7..10e48614984 100644 --- a/tools/ci/idf_pytest/plugin.py +++ b/tools/ci/idf_pytest/plugin.py @@ -82,7 +82,7 @@ def __init__( self.apps_list = ( [os.path.join(idf_relpath(app.app_dir), app.build_dir) for app in apps if app.build_status == BuildStatus.SUCCESS] - if apps + if apps is not None else None ) From df42da4c7d3b23ea7f9f7342a66fc41476ec6252 Mon Sep 17 00:00:00 2001 From: zwx Date: Wed, 22 May 2024 11:28:24 +0800 Subject: [PATCH 097/113] feat(openthread): add task switching lock holder check --- components/openthread/include/esp_openthread_lock.h | 13 ++++++++----- components/openthread/src/esp_openthread_lock.c | 7 ++++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/components/openthread/include/esp_openthread_lock.h b/components/openthread/include/esp_openthread_lock.h index 19f504541a6..c2ad28fad99 100644 --- a/components/openthread/include/esp_openthread_lock.h +++ b/components/openthread/include/esp_openthread_lock.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -35,10 +35,10 @@ void esp_openthread_lock_deinit(void); /** * @brief This function acquires the OpenThread API lock. * - * @note Every OT APIs that takes an otInstance argument MUST be protected with this API lock - * except that the call site is in OT callbacks. + * @note Every Openthread APIs that takes an otInstance argument MUST be protected with this API lock + * except that the call site is in Openthread callbacks. * - * @param[in] block_ticks The maxinum number of RTOS ticks to wait for the lock. + * @param[in] block_ticks The maximum number of RTOS ticks to wait for the lock. * * @return * - True on lock acquired @@ -63,7 +63,7 @@ void esp_openthread_lock_release(void); * * @note Please use esp_openthread_lock_acquire() for normal cases. * - * @param[in] block_ticks The maxinum number of RTOS ticks to wait for the lock. + * @param[in] block_ticks The maximum number of RTOS ticks to wait for the lock. * * @return * - True on lock acquired @@ -75,6 +75,9 @@ bool esp_openthread_task_switching_lock_acquire(TickType_t block_ticks); /** * @brief This function releases the OpenThread API task switching lock. * + * @note This API must be called after `esp_openthread_task_switching_lock_acquire` or + * `esp_openthread_lock_acquire` and will cause a crash if the current task is not the task switching lock holder. + * This error could be caused by calling OpenThread APIs without locking OpenThread stack. */ void esp_openthread_task_switching_lock_release(void); diff --git a/components/openthread/src/esp_openthread_lock.c b/components/openthread/src/esp_openthread_lock.c index ba7c63d4115..7e35da6c21b 100644 --- a/components/openthread/src/esp_openthread_lock.c +++ b/components/openthread/src/esp_openthread_lock.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -45,6 +45,11 @@ void esp_openthread_task_switching_lock_release(void) { ESP_RETURN_ON_FALSE(s_openthread_task_mutex, , OT_PLAT_LOG_TAG, "Failed to release the lock because the mutex is not ready"); + if (xSemaphoreGetMutexHolder(s_openthread_task_mutex) != xTaskGetCurrentTaskHandle()) { + ESP_LOGE(OT_PLAT_LOG_TAG, "Task %s is attempting to release the OpenThread task switching lock but never acquired it.", + pcTaskGetName(xTaskGetCurrentTaskHandle())); + assert(false); + } xSemaphoreGiveRecursive(s_openthread_task_mutex); } From e86c7570814c33291ff6d022161ef54f093f1b5d Mon Sep 17 00:00:00 2001 From: shenmengjing Date: Thu, 18 Jul 2024 16:00:38 +0800 Subject: [PATCH 098/113] docs: Update the pin layout for esp32-pico-kit-1 --- docs/_static/esp32-pico-kit-1-pin-layout.png | Bin 0 -> 465545 bytes docs/_static/esp32-pico-kit-1-pinout.png | Bin 661057 -> 0 bytes .../esp32/get-started-pico-kit-1.rst | 4 ++-- .../esp32/get-started-pico-kit-1.rst | 4 ++-- 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 docs/_static/esp32-pico-kit-1-pin-layout.png delete mode 100644 docs/_static/esp32-pico-kit-1-pinout.png diff --git a/docs/_static/esp32-pico-kit-1-pin-layout.png b/docs/_static/esp32-pico-kit-1-pin-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..a523768b3e86bb46ecc2bf54204ab7755e6aafbc GIT binary patch literal 465545 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©_33;-`mxKT7l#D|4}8Kp5nL7wPEgdj(wtr zdIsfluZgRSUgpMugG(;bs@mG2(56#CB;z^kC!nID0(ZNlx%Bh*@873Bx=&aQT$zCKlR2C~SJ3&# zd3DzZ;4o;q+%_FGd3kw2ZKC|nPp(&hK|B5Ki9r**Boz5J0L~a$Sjs&05TL~2+Sji0 z)b8DxOOF<|J}3wID>6j_c&8@#Lg0Xj4;JZ{_@27;5C{%%kla9SdZ_IofPHD%*lvQB zByME%iPB<>5861GoD{-7BzKjPa0^`MVq_fKDBbyN?*{#NDhAHXm(tP_Q1a;M>5b;v zV{RHQ>+9)76gOVzY;lr8IfIA-1wXYkT=%!_*)}I|aC$x<#ke#F=O`Kt1f`{rfav#y z#We(m%7e-QDnzx{e%?}7%CN1JwKX#k*M*%&GJj3v0VQa-q1j{*8PG6n&?xRSJz*hn zDM~Y$C+3M%E%&F!q}E0>Ub5vYR%iNcsV+rlKl1-PO(4)Zw%Tp4haSCLia^+lON&l0 zUFm~m3&;RkJS3T7~LbIs7y?y#9ep>`-uTkXNtStcHAW@_A`Ai~3|GYdgu=kx^TvS0n z*z|!6RaqHVlCUosa+81vrN7Vv_8=zM`f?o7CcsoUOumOO940{Kz@hPcV4+&*crLcH z$OY+!13~v{126%m2K>MRzD`UGPfJTfJKa7wfXu=J9W%Sc0lvEyczL?L@qh?021YIO zhz)&8hPxymJwnke)ajqv%mN9rd32OKT{_x+gJ84}ls4PZip~W;1CQxfn$$A4k=p_N zwallGWlWIxNusi~xonbs(7sIJzOBFH>EOwbyr1-2w5K$D>U8r`EKLQW#^iIcO}1m9 z@Z$Kr_w~xWGjndijb!au9(lSK)-#lhmvbW62I}RP7TIW`NiE=n=k0>jxz$SUU<9^H z0B;#(%#~lieqjNyLQ3keE73C5h70_p{vk(A6+q;n*eR45ok8%yh=W9@(?r1rz^&G^ ziOxl&gc{J5t95|IDVOZ_zwX0CdB{Vxgb@Y^P+z%v)d}`@ zoQ%+_$;jpNO{utrc!m zZGRp6-&l0{lb;Q;-Px2cE{;?`)r_QR2DL?;PVrb`{1iUMcr0>`;d0C2!$gM29@ftZ ze{zE^LG({q!odsEcU4Xf$gvHc_%74!p{u8YmIP&Y`Q}^y6WZ>tX`IcWrW{W+#b)NZ z8VVDFgVDvr#U%r;DsDrnjgFc5=gm^<8Xy|jNYQ*N2^?orNPQ3q=-#B@d)`LneFHF? zjT<7Xe0Oh8!qPIw$an1hK)KD6CIm*guU^AgtB0p2El7}nABd^^&z#QY+5MZuafDt1 ze>Ca-^f!E?#xV<&KfrU7Qnpa@_QQvyP#;~Esvsy7f8Pw#yervmJ3c{yp+LV@)A31A zJy^#DS|!NPB9R>k03f_7C5Eqzs>40q0!Hwyt*vcX9j`vLxZj#m@RqU3uFD+rwNyli z0)vf9?Ng+(`Qg-UccBw00tH(9Wt9@om}1ecAUfW?>&~Vo7L*>~ydoTa8Ty>HcIxz^ zt((OMGta5=(aLDqh~K-(f}o3T_HsjSg_LXBS{~_xR{m$xht)4%is4O`Htlx8`INrN zZDqf%s(b1)tcT2Yd@=ily80}M{~0F445MzD&+~!4GrDr+skPqeQRnoxIp>GqiN21H z4}ltPI#K6&1evOcyU89`kjnw5*-ZtCsRE?(S{Sj7l7*zY$GZ^}GfG zi45E!&EIA)C_ude75Z_$<}@HEB0FG1@dEDlrC6`apT)$)AYBS%-R~wN!Ujkj&?YZ0 z|96>+2`x4ec-~_=`Nqvb#t=&Z`by-p4rVAE1GI+^A1cLDB0CEn%5%tzWHkB?be~t1 zH@Rd^2s@JVp(eW!eO>JLr*&MlKWaEMWc1#zu;(Zx&2(Txvp0`?{bTB(g@T(6pAJkzdKr8lIcB08)MZs*}rWlAhW4s)eoR>1|l~y>FPzab; z=Y0Yj4!mfL8#inRNRVt2<0)WBNV!$j){1AUm4}H+izCA=1qB6v+Xq0mbxmA-s8IVW z{Q*rlAOiz`mEP(s%r!AJ-Ch*A9A5CV9e&YM@9q9K&DE7yeEpqVKSRZ5Ogn*V-PW3V z$V4iYd*9hhxBDof@CY0Pk1*BU;ocJi?ym!bDq><+7?hHk8 z0u=R`7wA-uUcMg&Ae89`J-w`&nn?66^qjOBkP{{6Yq&Yyz5it0RW$NEq@Nz&V?qEO zS`UH9W%dUhI_w;+<7;CMDLO8>a@YEoO1kZ>kI>3!*D>CP`XUfvFC}CM!q5V_gGwzv z90BJhVjYR1CRVzXl6X&ou#yJagS;#V0b>^3==%B7+6_T}|NfWG!F+I- z2?Y&QRE**fGFDbhnnik{kfaFb@%Q)dNERBkzqep^KcUxw#LL_JHV7)YE}!FI55jtr ztlAo*Sz9l~D==iEJAqV&y11Bw2pQr7c7kniH|`g0rAfZ%nB~l3{hGW2qiA)kYdP@O?y)tmK0fU`S6Sn&@6zucJ#!h{Q6Qw#Qu!!#Wzj z7fScE`aX_S9vyi!A=-b$-ZkbT`{=hBoWp8)E?@kk2v+6fVEx{ZCSrWc2@KU?Vbzr%qM7_4Gs|YGft#RB0o%!4hO7XX z&vhyXyWEbKAV2bud?f>O9jqqQQ6!)R*PKY1`maDCQ3+6^;SvXdXkJ#&;s30>#pPml zC+u=hnxLcRRtx(Dsbm+6#0BMS>S#&f0Y%r`sm)b#?4I>8gHwOA6hG11SkrmzN%@E6 zf^=V+cKf46TBgvoLCho;Gyop(z@o|~q#YSR6E_i{EYm3rwD?nlQHVgd#(Y0YCm=u$ zDeP*arZp&`u>8?ht|N#NeNl+lxNj-Ee1?>7fKGaaN9ls;9Zt-yLvaYf5yj5_0fi(! zyz!c6w`>J`Pq-@V?W(ru{uamK6zjE@BcH^EPaUwbN|-&DJ(mvF^4vQ#G{a_yFK;w& zmwmXZ#w57u|G8)TMqAXtg<;-yK%HqbRzpPfpmC9l$Ri@sJ6=WiOK=3U#>bZ^a?V4; z!*A)Ax$iBhHqA|s`3t>)5h3C7Q+TTj;cP$>40)o zdD>QA2nkqtB3w5zGkr5T@=nR|`N?WAQEtiFGBgm51O?5mY*z4us!lg*|Azbzpk2}3 zxzo~Airj&8){7ZxIn;)z2#Bary|Zb^8`SeX#&;E2$88v}lsMk$vTk%G=fQs?C45SL zU+Ky-;ZrVxZUiD;fy3ak-XN{Ruu3XTA~Rsn@M2&o3ST#r^#pZ9NeVahRiqn^S63yq*%|9KsM$k#I*LrNs7-6Qa+!! zN(ByTrko1-zLrRRem~Vca4~WJF~|6kP|If)ExuZ*dK)=^9G0;H0kvp}E1SdyL4tWM z>Au5qEbF`oq{fkBpMhIfYByGe2Xa(^T~YF5z}{2=ZP64DO-g7=QWrg!|6~Rn=IF$N zbv%52k;J{Tv$F+xCaj9;lhu47Bj+Z~IcNyr+(E-Kn>_lCNrZmwTKQ5{;rMW=#kFYO za*jHPYekD(gdkCW1^i-sSSJhAYKS{nzBa1K1_^BnENE7*UPBl$0E;W0<56AJB!o+2 z-n}z(@_}p!GSUn=uQmQ`V5yI?d$lPxfr0(XXv{-~#Q?5qRoIe36q0phu-Fg>1QhTs z+LWV^@=4Ceos(WeRmVBpj`?{;zYFE1t>sHZH3fcoR?}*RaKnDX`)j%bzIE@mrBE_Z zxDPQhk|QT0xCeir(Uvt!oKM|WiA))?6gfaf_rZ9JU+_LXSVxj<(Bl%v{ecy2fxI_9 zbA+6p08Ny)))2wS#?}fFj>PDw*tx7OP&i{KQA9{I;{>9RgtYV^)$ZY8Fr?1T3L1bw z!+}-(+?rbsd}(Xv7rQQn|MV+j$XE}p`Mvn?QO4wO!9L12AEIm{N$+bQErztwSg`?k z8>?T=`5+x-P);C}b`=eWDgyLlv56}!#gOawJKuj2J`3cI?J}t6bwI!sfO$V>s^l`Q z|IC_jkZb`#od!-yWC!67P$dW>$JAGeA>{#%2TYp`r`f?}137VsNl8bBly*CLfiqfz z)(_nm_1ZOBUf#-yZ3vwq(^6HJ7pJKzjBEF^4gJpv+oGw7ZOJ)JUh216M#7zYos<;O zC2~1769_T4?-28kyoN^Nk^ zw`mtJnjNN0DC>eE#HRt_CXPFp!ax9h)er}iWpo@W+Y%=fBUo_O5s`AitgqH)9p(=J zdu{bdQzP|u7@Kfg_lM9`0N(J+moItBZzCsXAn^P7*Q_Zd>i``!@uPtypVpFP{}{?Q zd&7|!#}NpLFJRl;KbpRRRB)R5%s}Z$`ug(kU?ej)1 ze|`Hl{m}i+{!PbxS8?lIRk=$%LCYom z%i4Km>S)C^kea?a3^V7nDm`amp$My@>K1H(j0Ec|iOf8A-|-JLCK;4|%KJ8X1VzO< zao@-5w?na5T5XviOZ*MYEJ_{&d2%5yu8peMn-&nTWqK!vG;2PuLy;tELngZ%ChFcN zzi*D95+b{Gm!ILWo<5v$kLAob3SqWkYIUPfIHq5$R#Qmc$z5}|nLzlvoS!@cib@0? z0n$qakWP2|cA-*qX1}%5%=hbSqm|08k~=T2-}+QDAK6$4(ZyECOH8e=M}Ge<0q3JR zZ{#ZMMQBg0ke-onAz*;90T}Yg^MoO)R0*SU84V2r^N#o)b816;9*->}7&N$^_56Nf z=TNOXdla=u)T2PORA?-k#2w5mED|7HML~n<-An;eISV8*Ah!l|sO=wjQ)rl&t_PxF z!-&(9^mAa=NM?!*=R+cB>LJuAAQ84tTAJ|j@l|wm!XO!-QwDj(85s9^Fw>2c^m@a`_w_D*{WxUjbC-MU!C^VPVbKBVjI|W)Zc9O+#b0qs)*;3aJiXl zA36AHHGiO1s&{LVRsE4LG95^D*co_g7fZh0MV0KcBa8S7i?Wvd?0XCnpf4tS|DJc_ z4?$v}4!$>Wals�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%0ALoM*ON940_4(LL^f&54i}t-$Of zyIB6TqsId}rZA5t%z;cZ# z4QDa!CXT`^6);?Q65zL(k3T99a89Q)y8lC~+RweL%damYFwmXGCi z4pL8Jrl2QpQ`#E9A36Q|8Bbt2bVknZgvV!ZnxBm_1k^{H9&fAdA5k1El|O}g?QeCS z|8Ny7G@PIQ#WQ%vFoPX|W^_9)4B6F9P~2ajZJR;E^VcA_Zc-|(!h($rMr-#H=r=~2 zNQoEE>O?{t*d3qG)4@@VbSF#A5-4&3)K>RCv$d>aq@j7;Da-FkU%9sb1;(dh+)B(n zg{ht~ul;lfl4i3KM@cE&qoSaXMj$Gyo_2>@{h?B^JQ@A|UQ6K)^k(2y-Jqyo-&VFmLu}-Sz(pgiT)EJaE(aq3tfMrsKag|C;@*xH~0OXUM z2BXuUqs%!jL+weR5K)_nINiAG*Rh!#B@A_2qbJkbOqoJRnWM@J( z^Q;V|O`oxi{jBguCn^p%?hA!)Ab&ldb)}}4hne2r8$b4A!ZqRerCZTtPnVA^*3~ir<9qX1eg+q4;p^$W3jlvt-~{S-n?Y!UQcZZRU!2(A-TxJH%z3DjGpxX2>p zGe%isO=JY@=L-7M7E67Te^wQTS>t*Jzc)|r;1}#A;n*ea^K{pomqIzQe1+lkjY7P^ z^1=z-xobJ_!A2+JISTwX#!$?Zn&y4-GUx!y#^AVKSM`%Z&HHzE1>f#8Fdk55?-`f$ z`m=0R)Om?;59p`j4g#^t5 zzgHwIk~1+@;j{lN?pNAhP}crh{C9jIaDMvtO*j5RY&D5ufdj6a*a zcLGPGqLWn*{J;br0oVNCv3NDNO!*0*6H6gCK~ny#PreE-N+F6G6Ldcp6B- z58dbbtffA{@E6vorv5_lmeAS|-KM?1wF%RUgGqn&X~sN9UighO77mMW)=rak`}uAn z0KFuu>vOtR!BL(YL%2O9xuAE$=4II$7;BDPN%}mm70XQ-z#*K)IJfAMy}mQ=aJ)XG zSqn9wg|X~*Dqsqzt-O3OjJMrLV%5@ua=X|C`1y#8QpdCOB)v;@Znlz!xO~mXf|I$a zU47L}9*CizTV?QHpjJ4jus>XC?dbL~r~uM8OCZZhe~GhD7SEBqTgU_GY6myxZbBbY zAB91>o_C7X{TTV2P6O2++hf4|k|u{vWitAAP-_57?gZfM@T;@TI8z|IdjN=ld*XqD zIpBc{oyf<-4UZ2Fx|TTKlq9JBG9)O?LU84GN3{Tz$ke!(Z`!E{)93nsxNbZ^{-bN2 zHSm=ni5|W-HD0?mgEPi&0)gY`iJ3?vbYk4}rykGE?4UiUQ~I>~J+AL!P%dX5o!GQW z$7O zJo+V3TbS@qm+C}FtEt}u^}WJ|{qYSs?$%?RSHWmv_Z>O2r*eE`P`z`a;K4c2>{zs%rpJA=*s*HK&Hi#+awN`i`%_s#PJ<%W z`Q{kwAJ=N_UXMDhZ<=qvHm36xrs{5|tmeM`-M=@6_!38lAxpVn9@&q&NJZ~>-&BRUC{D$qty)=`zRx0gQX;%;RVOK{Iz~cWY z0()c@JesX!A)fjBwwfB z@pEkj)RH(Bo^4TE%5Z&`?7+-D7t9!u&1tD~E;5?e!}8wtx1toAg#0giOKRUqD&U2@ zTcx(AcQfb7t6kr{9&%x{tj9FvxK48%$JHau^BU@3v+Q6Se`_=_f-{H46qPd25D1ou zqSj2<@MkQ(h421|A~(Ozh8O2^oauQ|qBO+R=R)0g%V*4%AJSE1q1t;MPs!NX%Nz4M zy5@w{wB4+lJTltVhuZw^i%6$N*2?xmB%#=6A*6c5-6Kwxg~8iH8KrCOiczux!laOu^RifvKL(e)q@jmn%rZ$s{mTMh&tPf0n0 zfmaWwUcYK3&lr$AK-ig^Pfb~6!IRcVR{#;HVp_^nssHWp?`nb4rPj*~?_i+hzGEHe zsE?rcKp=`=IC0|R3XJU!X|f=ZrUKk`^gtYa7k?8&Ve_ayCyb>tg4{1}z1n~cm;7(i zP5EmoJ!e)Q7h&R)K}qI(SVKyds)gpXrPTSW%*%B$2%sY6h5fOLgX$f{SGLHc4BySJ z)MlqyCM@pimmW=qU_jvMviOSk)Zl=wWQwS1W!|9W4dLC@o6|l_3|VLQ-^aDzW)VrG zaBpEe%tGcyg4l#!8^3kD4>8?0i#983aNW?^&#JbEeUJOgA6=TM-@58$l;7^0ask5+ZV75 zx@v?)L2}|^aEKk9-qBbFU*MZ?e)WIxjDvJ3uUbV53w@F(iPOTe&SRcXMf~+p@#1x< zggJKBor6#wRx1Nte7s9a@}3~sO~k-k&}KLGld^A8bO%!Cp7#q{dlB%FLnX$(e8StG z*1vvv>rBr`;6qLFsmUTHPv`pOZjZLY!B#7ny4Nd8fNozP7-24*){JY5#aL^^C`#|M zZ?=c$^a`TO>CZ4q)QuL-Yr?4mG#?_mT$sV|vr<|x~br-+D%x*k~E{48i+jHtIP8*p(%12qUcPwwXr z|4$3h#OT=QwFVvd8FGtTyFEu>0i{+_6rT@t1o;r)Ha#R7cJ^2hqU1THU99nN$E1T- z5io{uYeUNE?1WRuJs7J8DLRHx;Z_wf)gpUXqAmCkO=2iT;kfp|`L22;_WlZ`wq{1f zYH5dUCD0R`GI?w{3#QgBBMpT&f2FbELos1n%TLg@g&XvONo8S=hsxknyL!m96@8oN zBzeGVX>Xi>m%4=vm|_$q&gbiP*;9RuXN%VR3`!7Z17c5TpyhO}esl?n61%G2Mryt3 zk*B9QZUZ9TazFCQ$}4wG87eHXqBiTjf%99LgDg*k$Sz32YnYP&-J`@GsAFyLY!q#D z@At@!T~wGP+EE^{lQFs1^1b<+rBxUn^*-;kgu(YW$u#*KZX&RSvM7IH< zMN!e(GNB?auhh@jyHFEn3bFYjTT2AM=r{jk3-tfk58EhX`WYj zyhFE2Dz2ip{h|f_&iBJaL^_r+n+w4GX#QIKbgRTV96$BjuV~a7M5n4NV95?tUxf0f z+fN?!=8rEkFgHh5)t_7%OYjWoFa!?>aTSZ&lTA*1E~s7sHP^{{!puD>|) z&yftG>zw0k9)?`qFY<=;FEjA=atv9?K&RurVpc|fdLip zXW5_rVUB_P8xe^~2@7e)*6Ah~`>lX9iBUT*Z?Axh=5=^r8>>=Rk3#X8vLFk47GA zfMiqR*0Tk$V4m<^fdMz_V>_Hc4AD~ok!F@HaH{W!wTJ8uXa~(N`!M=i$UI>}s}IB3 ze`jKa1C>oxH@^>#wNHuC0H+C?XxHk4AvwUbH%QS`3{QC4R*74+DTR=voKh{hA9*qm zU?>ec&HEhok|@;{S+WKBM+L-awyher{xOd!vQQ$o$jPsq^aC%De`7WjESM#mg&cGC z@Sen^>}R^oUsDKWIiED-{Uqyy%uOF}9qHM_!@~L^Tl$a%8R^`gcZ< z1^L0e+$6+GmG!2>k=OotLPEt>O8G}z3w+SyJpb4ctm=MtI>?NaT#R(9$vmkKyHWp7 z6B8HTWg>F-uSerxVDn_%8t{9bW*>A*D968+Liy!&6mJjo4C)25Tq<>y$!K0zYLnrS!qeQHH^u)vWhf*oS_R2gw7`nE<#K&r;jwU}ka$h) z&uA@~wl8dLoy{_=8q!DgB_QC__fMnMa@pRK%i9;z7nC*wSH;?CIJ=GrHc98d>N4f{NRS!n81UcUPde{hOI% z8NY-fH;wx9?5kLx-bdTCURK2RC${Cv*q4!o#AfO_XSP4!nP_bd|8v?Qm14WUx9fer)hQQG?NQ$x zh%UZbx1%$}{A0ulBv_l68I_*DZVL_2UC%~&*pqytM}8U(Qn z$-R^I8NzyrbI9|8QjD6CDN!}3z8y$PVEnj=8Q$g0x(i@zRzr2{U zlq9}X8mNoWxBWSQL_u08+lEd-iS~o1raXCm+A%&a?RD^yr+F%We3SCwY|MjY zZOIDD1%vTW98ZiY+^zxL7F&u73Drn0DsGk*g@pRY`sNp%l1HQE`IEszlMM$=O=O=M z33jK_ewEK$7BBGFXa(?otbH0kFYf4PP$%lGdLMyD=^=^sJ+^mvcGp*J=Ey3Zz=1HP zgJ;2ot#FtZU+jj^8TxAKq%=jW3)M!3t)O+djsFDogn!8V#j~4ZHLa%yR{{0oTH^9wH=sC>YXZ(9dEG=eS1L z{N|BWp%eU~aeNXEoJn_EJMw#X+#<66CO368THWa~l2dYXU&!{%fl^r!$qZx)4Wh<^ z+m(ASy+H+_I@=L-cxzKf>Sf~4V$3$6NLv9addO1}_5hFrH7hIh&Rd@;aS(&>#mgW5&Eu)c$jS?PE$+2$Ilv0CTBg*Br@PzvxidujE_P!xBK+DqxGwI z;}M6o9432DtlmCD7j^kwXgR~} zP(5CVK@;(b`rx>zWCpV?M6UE?)*n8pLeavkaOIMpH~x3mwvdCf$FRK&Lj9>>twGyB zF1O$^Vf7bH?_I&Lt!ZpCL94cT75)~zWo$F=PQf<&gvZ*vqR(W7xwDq(ihJ?fp+m@l z#gEVV6mL>8a9L>H2c(DVu(o42s4I8&XGqkt2?S79(ITtS@KHZPdiQWlkz3K|gj;d) z-iG7_6=r-hsSr%5-z9Ldm$5KAc-A!gq2rDM&ai)Ov2)?*B?1l_XMxhAoU7oPU1}GV zU){((t#djCh6(*a_^bc2$i(hHOs!2ZL{R#Xhc^kY&u5)%5#`hKOZH>(de}|EcS|cW zCN<385H-yxcMQ_~xLmvAmMt7~eKMw83_G6wHffhX^e*S?nD9_?-Sh0Vl9RawMz0?) z0@C&LcgyFM?SFcD5XKRs#re8LMnJx@bAAerixSxYolr}_jXdPIOQvj0@Rin8%wFW> znn{}vnsaBUpZ*Nb6eIM&NsW>7XFbC(C8zH3%X_C4ix{-nnK8*G>gH6L2=o=|&GxV< z@)MX=6i@P>s!*1De)-YA(s-;fMptpnkg~1fqVzxgtG>)m676Bw)YusF$sE&9ZCSNC z@-pm=ocr2s2ktXRHI6;Gzr#LM)cbA##SUf@cxCUZe=E-JSBt@djIKC)M3 zmNM}05K&WGs}?jgqyqssh^~5%8uncRq-6u+$GUH`^SUe^K6$fG)X!+ce#we9CTsx; zY%@+$aI3kffkBBHxj;rVkVr_AW1_F@FOG~EZGq4etP1_FImVKk@2I-0* z3c$|I*Xz77p{#s@bN}Tp;gEJ?DTerXDxL&4FGD9;kA&a-UqPv9vozHun#4)6+c=S^ z;LtfE_@^Z6u3{IfNjI(GhP54}TGD0WknW159E!V>_H=k)Vf)Jv%-L@{M{Cbw!}eaP zVyp4w^V^?}S*HV(Sjau*zm>CwXRQ4v#1Jp}^jm_V07CCx%=T*=*v`?(d#z8Vot z-7)Rh{p@f|`bkG>wd1-VNor*0dezgzsYBO%qath!Ip*yYs%fDs7c;-R zm=ST2$P!`+G7`$Q_PPQAOV&s;2f|mWyEx(YkJMk)u#8eiw6`+8e=`vFWGSwOW>S4> zB(6KbHm5VkB|o9{$Fa_S*wdv^G3w|lngq}bE2JLLAO}A5MOKm~GPGoi;IfY%+OwbG zH1)r*Gg`O5UYoQB%1-XHFfx2-PlVxy>U0loLJw+T|5G=3{9??iG^H@HH#XfV+Z&eK=Y>P0g zNo4B%M)!2O-ZWo$4jYeZL$}|Hj^)q!d}q3(*7sqIMWNi*D&@^z{7zih6J$08ZB&rd zr&%zy_rlGPUe4(Zbu%$kMcFUdjZ%LM0PDC-&-9Y{@ophC#^j7eH;Ihzw0h;Y0>&5cv@Yq6WY z#K>G*`Ne^1^CQLQl2v09su(8{+7aLia}#)5ocE;^ySb;b(z2H4@_AdsDxcP!piCfX zWaK>tM6N2kj@^CLslTW28+4FusQZ7Nmoc9s6HlZNDUQ?9)^V{k4UjYkM6Az(v}3Q;DBhP$OyHO6+wC@!FKXUN@l#*}ZT$S}?odXskAIDe6SuHn z03sFJnaW;zQg5IyZ@#-?hKPuWJY2PEcU~cANf%>#kOEP)e`)5>TY4Hz(mH5eF|AuZ zM8}cS_hHoD$y=>8M*e^wqnI;bN0n-$u$_$$p&;i&lqw%RQeb)g&oF(qbjz0+=lu2& z1-8M0NR(e5`OL)T^s^O8mi2#DO31r!Li6UR{RG7~pOwulCwFbBq0_g1!!VX0YN&ov z-v8bIhgl+8Ss`V37aW81kLp@?O(whPuS&ZG2EK`=N6!`^)C8OY+~JEKGU z>u)vZT=Rv+9`Dz+m(TLSDwMElV#5&^4|{F0j#3V#nY!ed&-l7>N;h+WC&hL^Hx=HH zcxhK{?9t+{Nqo3CF^Kj^>G82Tr(Y#OFYaIMetMkzvh~h(yGgE{BGzhkOJ`^ExQHdE zt(^wmCD@cjr$K@iKpc-iA|BY`ZuA?rO`dWz<_ZfWmJVYqsAN&zg$d zxjgUox2N(lEvT;aep<|Nv!3~~YIN_mv2oFOqf13=kEQg*>(MN;jSv-~k$amTe(^Ot zm*Sfu7}y%==`qt#ds~twkz;D)@#lK;XNFHB(gw@gv1F|{ma>rVQ`eM7NKYkha{SD*G$j<_Uz%Nw>2VbrV?d*+_}4h zls$|f__}f}0Ahj940Q>3pWJc9K=Ka0CG8owqTK66`Ds`^NjC!;r+PPo%(LKeT-6hGg^KdZLK%(=V}5r^l?LAuOizZ>m8B+`-mSCJbVC{R; zT;?6M?9Wb9fmaLs(tgD+dVOouzZhS{soB)9(B zA8r0wBuu-GsEI8SUiDZl+&gS(bLY*Ge$1$|-pQnPy(Y?$lNVeXM@tubP0HF$D$_3>{B*RjIy=(M(5Pd=V7l0;%% zH_0||t>rtkSch`w)e+i!^~vc`nY~UdV<=xhjN+8CC5)@N=3A)Ary4ef*sMOA-!_(p zmJH$;J>zMARmYqYwhQ_MIM04s$gB#}8~E+pen$J$O#2ps3#QUQF-P(6CmJVN*7{y% zP$IXVqCC^aJ~hT#FJRGMoa&pu&-J`vGrJ3 zW`~(4Dv0ZcoThE|Ca-#Ui8kOSmE__bFIcw(7ZFd%yMl-ZSI;uW{>4^cMB5I9nyl*-QC?K z9ZE`fm(oZ}cXxMpcX#cJ=iSe{zt2N|2)B4}v(~ldoMX&!CNT^BWT7hM{wqn|SSQi{ zQ*O?1>fe&y##0mWDQJaoad^{FPCijfEM|~$@daS45oo^zjvZXRx)$jd@JKTWkZ!%KXkQvjfK5xp;i;Er`d^xo zNZnEOf(v*F6JFSB;>GJ=<#jol70>mcxF&ULc<^Kcsj59?_}Xjp)IG2}M!_Lcggtb# z+)D?oKx%cL{)Y1=$x67H|K2Td-YO{KX6S3qsj=od;rp_jAt)T^fR6p>}{nYYr}sSvkNiwUN2&1ax@KU`fcm2{s$#?G);L;mIvdtz9EZCGew^nI zS-yrEmYCmf1{q51Xnt`1P`M~njT{HNlzPv}NK@!=&-A?n;ry+VGXLq*e*Q-M7xKRG zUI?i{=JE59vfz`FUv+fll75v#=58ssnv0k?1hS0yZv|BZWL2cuGh?h4es3HDqn>je zIIaM1N@9A?I?93=4e4B-0(gRM^uK%N@G@93(i0&w7yJGOA8T`@joqii4<`MJrbZf8QG7Wr>^N^rvl&B75V(y`i8-VRz6*{p?uN z1xr5MUN%lgJumejG3<8A0!n3vz?AWyJ z+qQ%%sXFgGKMJGf14Ei^GB_L92N0(C@2M5f<0(}w=;99PwSBuK2FRlfG-$I}RLb%U zizx$-eZYr$vaZn!q#~me@`eI7jw;BXG%g;YT|8(%3nP3)#?Zewt*MHc4=Hb>^Uh5c z{-KG#FOe_bwr!A3uCxYO$D^OyM811g@Z$1(_;`n&v3<+Hct zK~r;)5H`YZ?@>w=WzDL}tNT}#b zQwSS*PsPdkLytA#%g-?ZTy$e7kn5$94hBuXSxWQYTEw&rfNS}dYLlRd_A&_(ojE_uuUk?T z-IVz&npX*@eALWX0);>py^oh5sF*|`aeRwj$Sm5LiKN1vXpvp zPlU70bX{{muGl4Q)E}jZrLZzcS>y8Zdf)cJx!=)!x78YCyxgW~l%m->@G$i7S>@fY+Vbc3jA}DI-pB$(0@y`4kP(mIWzd^P6 z=L(l@>XcsVKaL7gyr&@}`FkAtq;0u~-km3b{;ANO|IDQt1bLl;zzhel{QRc&YsupG z8LcBMeux0FupOzEFrM;j^UL6W4(!t{zNe5V+vq)mA^Z;8xOU8p@K`H|9K*i-{9ga= zyaNUr+BhcC)?r(ln0_jPYf<}gC$!R<;paP77WWdCIW-F&6R2KrrCSG`Iydku*xYx( zpxD%fa-etk-IAcV{P=GX{#q}r5}=@?Z=`11=eYO$hOvOyduhQ`}fVPv+o;X~?LcfRP(fFuN&sq8WTUI|@dLoS*$_l62eq(}`2zFPLfp{NAjl z78r@em&+4B8$S_l9<@_1KgWC>{ba~Yk8o*hY>5(t7xk$5;S`$W$A8MB|C!yrd_aQ5 zh;>u=@D;gD=f^*4HX|i$Yw`;%=cO*Xn#J~VgC0P|=vi5LG6#J#jYneQBLfA+ONhM? z$z46|U&)*u-AZq|$0?G|dnfY2ye$vqpM+k*qO5_Vv=9 zM>-3q=;Xd{tbD5Zb_DZ;&T#qZnNn=@lNid_8}P%k@ris7^FJ5+|MXS=_j`QY`mdbu z|No><3&H>Q|MFqCKWDVv!}j;h zL5!m-xKD6FSb|y=&FjSVKXagA{{Mahr+KZGRTo>Od3WYQsP$YV9*;?p14f~}aNEar zc3)u%HE3hN0U8!@lILPGMa)y*!o&Mw0QHshQ)35#|c8C!tH-P z7%BRXYy;KiD)_&%Do(cV%0$m(A)b`qfpP;swz^Yn+gvkCpg66bKdP3x;NubZ75cBb zRbE;9S1I(iZ-sKBG-DA0#n^c?Lx)4tdNt0L`Xa@#6X1ig-sE7~)F88)&oZZZ?Hq2Z znRX2E_exp(uVm_+(GHx=r1)neHsgMC+Eg*~qWD`|M2e8KA|I}IG?LamIdXk+y+*rX z>@`No`Ze6DO?jzSB85o~5-Rs(cMXRttPdYjGI+@de*`)_LPF0-tE%M80O>%FfRO zTD~za_~S~tz4Z-}+}Pf@?c}rg-+vZ;D~bV2``evdA55f}5Z(e4+48r`TB>EEoAUl8 zo+ei)qW~Wy!WIA3RGCb-xmo2KLItdn^(7kbk4&GMw5Ghlrcd52Nx}fgd))#`39wh> zN~iUM{7c~3{aj;!1&%Z|OC*}9TxQAYdIa8BenfMBj_1F!jhp=lycn;S+T*wXeOx01 zFCDLz%S2R3JVMkudr$`Cap;VtY3Q#u<>bw}{Ei-Q4?G?1yu~u-U_KZ?FIrRzkbKJ# z@oQ~+AnQz-Emw?N$$WFJv|=t}qWMe;7q9Oq%RuXEGFMC(hj+h0-!vM;dONGfy{>vi zJ(q7>mxlPOW}uwHO7eI(N$(hTz2>WPe&;B);pZeDi#)Oz`*miwTTHd#&Gbp(D*uXc z77J@IfoH?5!^y35cDH!Dpj}*&4SVYL0pd3zLItU`xTK2+rk7`;PJc6q*@rcF_7T3# zJu^Gz%Q{v;_elgQq}kKjLV?kzw_>WCF_~I%v?X&1z7 z)NcO4Xl~N~*ya9L7WUH~7&yj?l{@0mS3Sw~+fzqORl7gxnL%n^OniXivcTuiev`nH z+8&)!ZD(l*`9;fPkDmq8l>Ucf9dk0cHr88r>Im+xF_`^Bn{S--b}#lmdE%8O1=AAp zhptF|i+?y6G5&WkK*xO=c1`g-ZVM57VDI`^Q?8gKKJRIX9eh#evshHJogo2x238&6 z#=p8~p6umiI5npOA^#PTxPEb}~Hm3pT|kRS}Rfb=j;*R42gHym%S zN_DFRe{}(hn6!yXjXHbz@X@2zBu@N$*)`mzieTMyWB7?om^h@K*C-9rTQZ;a3&$1^pAY!9 zQ};6=&C1kqrd9J!-u$>nNd0u|JQ@^aoEgxrePU|y{deHfgN}f$ zoXF`R9wA7drI8BmZJTY$gZ^S0qU`Mc&hR302#?8kZk-QMWgHrTUDU<*45d+-Z;n$? zMy`ZDLUP9D?HJk-F0Ffrg0PN8%b7BssahhX86Y($*B(ZlR&BIfTj$vccUj zv&jphC7+`Im_8-7C;)Tnp@W!b}B}>4h?BAU%<}x*muRFB8 znlK}ncptm$ps+Xi&dMU%EF}eN(r>8h5hB5o_1xO7__@3{<_@WGVV5gmQFXn@16~$h z7@?$~E0&uYt-bd?3XgC{YchSy)IfEL=3&ZBf*5Z-BljnGV#y`qS<1M zlX0ykb!65zPE{GmkM520Yh2{ZUbDGVW1RnxDJ77cp&D-GT{Y1-fuPKCezbfwZ*ogfOzu&<}U}IO5C;Hg9re`^B2rkqX&E@B89e zz@~Dh@r;ZyvsKS49irZYP-wF?RT%H;sI6S2+6HD05MbSL9fYI`XN`g27lPL<%T_SX zYX?j4vIXi9tlSyUcN%cl9FWZYg-VKhoz&(s00E*0y1&=k0e9H{$KHVzIqRsO_}=eK zVKLXLWQRW?$8!~dpdgZ0ocwgXV%I}Bn8uA=_xLDP6o+^2>bY|SW;ZaYPoM8ALL^Nj z#I%TL9QcfkhVw4Ltf++{T_(HQVZgsaVl60R^+8J){jOW{*JWT&ck5Ee(mN96!Z-lz z`se-PC7r?dlu%t3Gq44iEFe$$i?DFO!iY!ITzBKTxw7)4oaysH(3h71&|1AmINgqi z^LD$dw(O!osr3JEIjbq#yyECYGwBQzm@fbEVDTKm?mXn&7>uoKc2(cbzwSK}+>$0}FTczCU~jAlD{v=A2+Nm1QRUp?oNCq}oEbJc>TOJI zalC@i8fh{id;jSZf96I=+X3T@IC4o~^RUoSX=hQ)GFWfft_Yb~#XlNi1CP0zTKwAE z=91ekH-o?Br(LVxCpX2EDMY+`O`Zll6aOxFOBV^_^GnZ%3X+Q?*g&)@8f*n4KcLO^ zR4ig*s&UyXWB(yEHg*70i~U6~jk4Z<#$d*yoUVU+we?S$<2=LarKkJx1X2`%@M}xH z9o_T``GdjoA{&U9Z1-5l!E;YDJQ@EAA@+W7wX1Ca?kwDTT!#3qu#B$aBY$F*E9u)p zGQ}|Q+N1{emY`DRQ8g#w?!v)^7aW9$#`izO|E&3w4D1qmB~=U-?=hVAhilxjo#5B> zG}Kss2G4S+$v;-c~!J8ygtOV?u3}6o$P8pT3W!oW6cRL3MGLsy2{c@C zStp5QD(dR<;4-+~&5HOH9&QX)^-WkjYEp}qM|=+gvMLl)mAKW7AlyPKBeV3P?>*p1 zsQup-F8M5-?WkTfmpZ;-QNGa|9*xU>tFvD3Fhx@PY>;nn@G&>CLqnle0&>MN@Jg-Z z;RGLYDRZ^P;B<>Ua$q&ri?ION??G&gEabYihTCrWht>it{mJrdz}&kowz6Y5OEa{o z2`U^SVwxteOOey)jtdoula~qt`+=O9H)w0yKO>c(OH0j)UOH8OAq2cw2Ut%5<_{Y<2H8ni^qQjIy5_V}UT8oj7Xb404GkIX z45z)~-n_k4Xl617EL>^x2!!zCYu-Gu(cef&&HZK3br1;c4}lK5^sH)_o-G2r9u;=RKrJ@ zYVvPXjE=Bpjf(|yy89$R;*s@}5%akumUL2)cGOw@GCKlf6Ve5C5ff1#LGuwrU% zF~pBmuw1>U3cHp^f-PD(sk?==z4~Em$lOcAcHVaGkuX)5L^SVl#77dR03O&^*Y^gV!RoOcUZcHn~8a$IWoRhSVNJ<9U67gd`p26GT&zPT|L90(wV5~@w9 zPJfqdG)EDzpNT`6Rg zm&>~y6HxfsomnGaSs4Ap{suWVJCxYZ_8;S4-slh~ z`PL*byvZ!xoZk$@N#RTzf(e<^u59e`0){=A>z4qO6Vu>J%DWF2dhZ<7z#uSrVO%F$ zrgKa35K!Awt27X0|AS9Oa^QMPih#Zx*{3PNdS~G?$#=591D|=#g{;G6Tw+@+C z)n|*LzL#QVch2mzy`8a9ccHkdgBvF|tF1vloNmr06=XhlMF79_Yij@kV{Aa;Fhk=h z6i6{-frp1TaljeMXG*wOO_ms&<6>_kI9W+6;7!l`DD;=1S!C3m&>CsYv{C(fD?-1=zK6*4R$*CeAk;?FgO7}P^(Eui zz}TlsLlu+rjq)0*=^e*io?W^rp63NsKBB5pIi8g`gqUqX8uX6Y!%<$m07~DQaV3bT zfz>`cluUm_5%TiQo`%)G=_OX0GuXL^eoQtJ9KKIzYvCkA4{p{zWbuoPGHBlfJ@E&4 zYZTGMa<3D*%eQ5-AndJl3N-78mQ_P8jL-f=q3pi7;1D}0ZGo%z<2bpgI#_M9S!=pF z9_iQ@V%++u>Q?HwDB5BLTP2K#lk82 zbu9@ij>`o+ikLpCx72asAh9ZPU@JB@R+kk|qgX>#wb%RQLC3n~$tiDXrC*#E*)YL1 zw)?muR&g-@+J!l;D3(4oO^LM^M)(0SA|!D4bB!W%Jz zLV`U_Ntrw0aL9tf-0u@+{w6s%aF5!+xxfW9%X?Q_HkQ+$iBa#!Ok98!2BRS1|$GTEVgd;mjvifEiG8oLe z1xhUJssmSg%|IO2Y}|Kogv&Wk6y5_P>Qb4*Ar!gTBp}fPE-( zLbfQ!C1r?4I)PA{$J%@|htcvg&IMb(vP9E)pxg!)gx<=asc)`half0BjX zPfWY-*&PGoJ5IBFr}E>*4Q7`Qx7+)VH`u@!go0_D?Tf?j=@74ipO?GYMuw%jpcvOF zqOt5j6~|CXI^){9`)u9HKOC4J;!{AwCKs*N)i>33d1rzhP1$|^a1pq0T(hj*&oGbg zFD|Vc&G4?ukx2T)G(&X?)$ko|TVM0llPh1{cbz-vgd1_Iftoeo?#x==6Ea2i2IaiG zr~F7iZUfJ89z|(5o{(3{7BFa8i@78HV5>uLF?$#q_WaBSd$-+7KoGu-jz5(vAFd?6 z0j5Pitx4YOqB2Jk{du$W?t^b;Da9}Y43NMSQeLIA(Yc5>uq@2l2A1oNe7vWuY}@u; zed#?XFcPU)+MwcQA$_L6U}nhlKrdiSHx{^5f}rKRrELgSsVH<|3;K!sT6~uW)v$QK zpj$_H&UF)iQmScov<0D>i9_Si3%g@kDaBZTnM?|b2o9_ee*gu^oB^Sa(ja%2;WfG! zM3P%cA3_|ioGdF3>sV}s!Cs@GTH0&m{`AY|T6Xymv&V4#&E`}S1q<#OZqpuiWQ0@T zB(|FF%~KVYc9RXi^K%|@U7qJW?TWycFOb0HNd*B|y|2RIE42Vr!h8>hECArc&~%9g zNSa5xdX>Em3&a8@G$*o45}DnM7OOY;nB#WSYUZ+3tnWh_!Z%l&7yt2Kf)XP^^II%C zYNQ`joS;xFdsN96Puw)dFzo8(UQm%iz+Hrsi>K_ODdowVx_qDIs`tNyZ8aNVR^*RVt3TOpl-#G+H5%)NzV1aS?oYzHtR0HKCK1I>ZNUO4`OZIl@vf?myzEr3>D zd-!iaR6;_iKoMBmI{@7`|F8L@#|lU>hK8vVuEYxy1`fV%0G0qi<=2o%fPE>PDsKW2 zp@8Z6YP$!(^~1{Fl?z7%JT8%20|^Fuc>oC->O!nRJnOMQ!uTQJ6vUi!6>HVvslgxqE5iAo9PE~Wcj5B`FK;u{MSQftvAr*OJ zo9_{#@Mx;r)pz$=>wq!`*x5K$2swsym^qC}A>LZhxv~X9;8DUBhmA2Mkss7io4qyr zQ%uS6yq0I+eInku{o z-bqsIT`(KZ_$` z@*Oc!tkw1uVNG=DKzq+XM9PHmh5H&>(e-v=gN@c$*gFH%HNLdkyqkshzlcUI(;ZTw zL?sqykL z8wDqIG#iLM>?-0={*;f6GQrWm-u)nw3-f8;8fR;@=^;ZXzEs`wl>46bqx^`>qge?} zY&csG*h0(R=mCGVtlZc z4#p=lces|nfwdT@9F^*H0GFAamp4(MKnYX^-b**$xVUkBtSa@ehzMk)z>aUC<#U#o z2Qv`^^f9!I2nYy(+vyh=7?YkZ4K@V1osTWQH^L$l8P1mJJ68Z}TlUkye+{bLh9E@#q$ba0Q%+ zF(*DgCFv-3V1D6CBt%-KHGO{aT-4QbYGTvCwjtNa6GrPd zJ+lh5is#0=zp@xtb`4ANu}25$Yhclsry$M>e=46AV8#^ep6(TIgmljxfFy35Q zH|KVhdZm;M?*ju5zgCY3&AD2A6Gq6?aH?6KB*CapQ@bnaoq69g_5QkUZV_I8C-GbT z3eh)~W!>h8Eu2)FE15O=(`rntFxCrWe4Z0vSut1TUJ?!|5KXJ!ibLGnx zCAsg$za;b)qO9eRqsFMiBO5-~Lrb~B(@la6Ghjmg^NDJLC$i2XyiVxAc5|}>72D>; z;I`QA{*ki%fq!ISv@yzWq#OxZ8|&TcPY@)_a#k4-$iS`#CVshHo}Lfa-|-ic3>7KHtilU$R!0XX8cVt$?ls2L>>~4&MM8R{q6zz$2&y z*gr@!n0r9+S>VNTCZJvj)>>ww>4evM4pPPy2&+rYV-IuoGMQHUKDhMo0UVhc#X9l{ zJvAaaFdyU>=BO|-f;4k=Elv8`PkM?t?yh2EIrH=1~FqO{_IBq?_KzwVvHsW>ER zC}*F)ngiM6?0;LLw`{#Y2+031Bvi7Z-fGr?y*R%%i^V(dEBM?yj!p~}i8FgKNK%QA z($W9toGyBGm8wT#HS%(yeQOD?CL-Va>4I3AMfJ{}z(0BJ7iN!yCLqAD%u~hu;v=O12jDyN;#j~@{9b(_(~Th52G;Fw0Z1qqOe+|Kl14hlY1@3_~V%x2*N zI$l@sM-7DXLje2Qu$2u6qo10Zx;$Q5n49h)_8tV}2NzH=g122~9)n+?KhI&a7j;@O zjT?WNWlqaN5GfQnJ~IH5`SsZ@n}%zEu(sXgIps%%d04{suUTEamzjFBXKOqehqUU- zO08Jo5u%KXfM7Hut;s@S_Gf~$*o~G#`(rH!1&Y69H#T`aJ9-x}hpJ1dY`+dG#VoAS zQyIjU5v-feQSB>m;Md0gy#p4X)zG``G&BP&~cGY=0zE5jsD}IMa z7v)(WK8(5y#;Fz!w)mUzIAY;rTv?nD>38SQ5T(oM?W@OhrB2CL0Pmv$4&m`SL~p6SlR0Nec*!;vorGIw88r4=*3TYMb2N#```?7)v}R=k-8-_G7hF629xk01r_+u1{9ljcaA75Y~@s!7sfvJfr*U64c*O^mUv z(fIoWD;nux6X!F$MUn(D^xsJ8e8%oi*8%p3j_`+4+0`r`ivLbi<3Igv;d+Eh_!{;H z*n+(hKNPF-XxH@|;UqJA%-S9|?glFlfZTdO1*!$+o?pS{YO=0pUD!$d-h9Bu0_LC9 zroL5-e?Ju5YLQ*_~M>K@;jySX_vcurX^ zHztAR=iQo+?KB1^rrrJ|)oWZl$PEaPq;OF0>-si{O1SN6sG)G5r)0~x&@yC?&taWi ztBUsimB6E}o;>heppeJq9|5+?!ofXIDzx!A#=!q5F`M7F8TBLNtY#TbTAjh2kYH1e zKQvYYd_~ii1HnOpWTf!F-*bv(vql+jU|TS0NtqaZFGssmvELS2WSe%}*yR++#j>ei z(Zv@qr$3$87myI!FKNJ5^+rpIDb_Y}H`ZaX_6r{rWU%DCw9F%MXhLPVi$)P}Xp?RY zCsshQSK9Mu%C-Meq!NK`J)vAoSW+PV9)(5)kA>*dGqa#K4}l~9!dLZNW2{31C0d3> zL;$bn6|FQqZFysqV*fAo{5*W_U)48zduHHOEh?gQ;7m>u^&K zW0!{C$!S$388x16=uI9|nuM8K8=2;B@7&Sv3)Hc{@frzLXVoi&l>b z{+tsBvsUe9^Xtjv)2M;nbvnR z?R1LJQ_AOj7;(Igx<=%TBvm9;YF}4a#r=OZ{wX&sDmJ1=)idkN`*)O`GJTZ;S+3qm zJB1Q6hsC;IOHszrJ#eE?2j>U7g987UeL3XP_Fdjh;w;lw!TsnSI7%lyF!iQgt+A^D z_GK`JE0~&Br^$$M?)J%+tz*Ks*31RN;wC<;u*Oh4e2h6WA(o(QuUs>lp!K?_J23w3 z0c~6Yfw#@K251zWFsN_8-<^6~X(pVF^OwvdB)s#>?nSlw!Qh%3kO^ zC-&jfDKxmXQTa(zy_4r9Tf$~WMdE)*I=Pd9MF?~Qt`0Nr!3ZKL`dl>R>aSD| zPz3cVr|jylq46)gbr<%Gim#_o)=-bpS1dEs*Q5ZnUgg_UB3`Y+H#6D5UIa5w8Go4=}3b>LW{j{;Max>c!g=GW3sulK9#a?)syvfV}_6POmO#$e7K?DT>pGTrK;B(NxGU~QM zAQAD1N=k+&P=B8eyit?0mk}ziK)i5EW6pWvYNs$PO1|D*|nDH3sHqdfD z#ZYn@;C;B&E`<)zKnif*hW7se-QJ!#uk0L{Y%1*a{oPk`K0%!CycFJqv6yP3Q6=_ z`_sWeOpdpdt2J(_p4w)-xa*G7_?e1 zRkDzpSXtGzxwPwmC(J`0<&JM!Pp(ep*a5jJw*Pts%!`ma+}~DQiDKS(Zzg?jJqawF zEo+I^+xs%uSj__N@z0TkLa)B2v%`;)$;{4bL~j~kP_T2?CSWJjsv6!G3%AvVbezif z_R=wx?K+z=yNtKm64h0+q#!8)XFSZZISj}97@}%~{;*i(8V1K^h1!7nl4gvf>&Kr} zZR`7+{iF%Mel;TI;Lr>LrJqcPaN?6SL{l#1_|ZM5$49o_gP7(MmyaO^A^1ma)q|e} z*JnSGKD=c*d-$oCmfuxWffi2>4@ds+7dQjt0-6$~_cu8=wZqT{W=e4bmezH<(zyGy z4w6*A-!8nEoHTZ1mybfjn31x7RSfpI+E+TM(r&^kyD3y{ z3)wx%RHPbL6v%c)gM!~{vUcKFxVh;eOQAJO`GvT1!NX%XlFH&>?BukadgH!)Geo{M zFYTBz78Dioz2(tGC-QRvt8L*w#^l)F`%P5t2s=|GgeV4Ep^L6-!yf)QZp8;FY zPSFUbZ)qq{de@E4~$D`adSSzrbpDnyb#m z_8@3+OLyU}rLU!<67b3*@_J^chPXt$Fm;MS_#7e<-lyg}-BSKJk;QW_MvjX^ z@5AepX}E?~ZOc)xvU(lEjVNEX3cQ_PI3Rh%<~2y!e_J%%ui%0B(=^J*DZrUrCI11C zpOZ1azJuu)Ul4KeA7v+x%u>0kC3Xge2xR_8lpi4coW**PbJM==(~n=3_`YqeAQ>GN z&Sx2n+ZwAaCJ6z6)R}?!vpuv4O+Xpoz_3v%e8TAL>2bI%Tm4)Om`U;UTJzb?ad}06|aoK4yLl=EnJOnIX)SgD`$8%%=7%U2myu z?MQwq_-X4+0^5^c|43{xqTp+Vn{L112Z1rju0h71Hj_mUem6SZ5|Nc z5tNZZ?E4mx6hMxFRf8EYY{AMv2UtfwQP}MZ7bAum*-|WPiRuvv&)IXA{}^{Fl@w*+ zQzZ#E%}g!Zq3!D*Yx1JZt-+vWZd4VSCkcL%VK{HuTNvUZ5*y8Px&FO)z`&yL8=7iN)43HFqwltsg`zuMP&(h}VD!0kpOMor0sh|=xxl8FX;xA0)MXJgp9IOVtrNIm; z?zyxt$l1R`ror#ke+`^>uIvlXPMtTNQ&G*-87IWN-M?WKei0MzeU_e{)@NUGMai40 z2{Jg3HFbhyycyl5rTQ0jGUW|Le)(AoOE1&6Og7}s zmu~3-N}pZ`&ULgG-4QV3N$UgO8|l4pK+I~K(&ZShX(vx@P!&nD&`jv`Y&oH222qGH zbUv`p;qxR4_bhcDKTfHpRgoRQ+A2K~LRb!HOH1UFKVKqR)T=jU4Fbk^50QK5-@nvA zh2=&f;A{o3v+{+b#`AufbTYQ$pY>*JG*!&9tG1LPNQR@Cgy zy*l_tY$|dd;lPW}AB)FKdAgV5Wee#9dfF#qlO2M_DO_AV8tc93@#@0eVH<^RBL56k zYdBmJ(juW#h#(ehxpS(YH&IsVN%R!tRd_oGOQ~ruG(caP$|DPqMxFQm9ua-NFA`1? z7ZLtcG50ibeDyw|TQg)#xsT>yr*a-!C#o{pFbhW0x(#779F?&?1?As6zkl7mIX)r* zOH^<~D``GH3I6BJX^k+E87z8(7Dp!oYnopmaHlXyp;ixs5FZ+BDkBGZDB$`-Mm3N-Ah2a-=5S&bU)fzijV!iNuL-6(|sA_8&QM+*t+q`JteVGY(5jNf`k< zW4gipe2Y{Hd%4XDUjP!Jc#GGQ>?e#@786JUsJf-rR!F{`_sU6U4bIL=iXMI9JI+EAM)xOwvpLjYiiUw?V2SmWal9V^5g zX?In4h>&O?#eonrP7oFFM3zR6+Wtd>K4vvvgGotMZ|#ihOQ)_i7hGw<_w$>Gi9Mo1 zBLR7cXFOaOOm;6GIkC8MPk1RhcI*-FxIRjabKGgV$T9(Pwkqjx!)aUUJd$uHIsd7N zJZgmlbl;kp?bXt#D7j55)z6O8t+6H%wrV3ExI|3L=Co3WS?pGe+76O)cTy71*5v{m z5y_b3ebuQxHe|gJbR63#) z`q-@H`EQDIwsG~t0uj%8ADz7G^slVywMF(J{?^<(E6Scrn1qfY@XyP4{1t(fF^W1z z5&ZCrt!q_=OK5bY-11a(@N&F-q$>oYrSe6oIk^+g_~7x zE?n$qRW1>ThZ1Hs^_(VM1i!~6JGdU4Ei60%|7j*O9)QOXB}Uf~i)Dv$lU8M5+xnK}&K2}eUgX$7M@*H>~Z z$=Er_pK<{Z&)#9IP-D;gOFhs5wA`wi%@N*wkl>whTLAHK5I$>efGG>au#m^cM;$uD z;NGqZ_-7W^#)OHNMiXPfTpB3t8WJ3{L4bBzF*BTqo5X z9V4_JKeAoIH~8p{#q4cn2x?1l)v@_78kldnK7QLr&`$quC8wSuVtmDf2KB&5qDTJ_ z%o0(>HvcE$}Y1Am1kra7pF0%lB?Hl$a?SwiGPzC(S*<7Y(bY&-2Ei zIY`HF5t4{vBGn_|cpSh)TEGgFntoz#ZFWFh5Fu;FzF3WlD?5(_i5%pDy{d?joJI6vGo};Y{d0#Du;DvP;Y8ETIdwE}d-*4i@ z+d0jDY4Fl8c-=&8^M$QD>&D+(tYcwLD(Y~}qo$??bN)BnPKUZ683>d_EViox8PF&> zf|$+(j8z zm**~adX9Y=gqt`6<-o`9L8D6Y@HKu97i#5@#2<6-{j})~ywW~g$jPxyAz@DlI)=WV zWF!^nI99fg(#%w_Gl`8XHIu44^SLf0s;Yd`p5Lp3B?s|})C9lowDzXddaMi#ZXG4O z7UJ;jcnV#!+=b<=(4!!re`eY7g~p2xu|*{>IJQq$#l)L+s7Dw*?*Fws3~P7AR93y) z&WrD$#-(e%fb8s=;hAd8boeC$Gr*QtKf za2J6ZI3stEeOYVMhdW}jo3(^(aAs@-P)h!L|5?yS2Fg0hcNV=Vqq(bR&(@1}bOE9hMc=er6 z?(lx6q5X!D%v?}ib&RNVz$kCp-?@MJjQFfr7SQs-7@*c5jQO8$ zKY}4Y8Bmk50q;89yb0s&~ArG2c+kJuTr&lxOPr_&VS*6~$YAE(f^2_Uclo}F#K(PxQLx3IrLZ3~ zPG0F9SbSjpHxb_2XALgdx7PoVLcOhl$5; z30;O=`|6|MoeFX#xGz&RF{gJ68!mN?e7x}bS7rJ{9=ec1#j8OiQE+v<`^N`55)eViT`jZDs7n0i`$L4HUvylYFZ|Nf0jzQs_0iK^wJuIW=72G2?ThU~!1SSuQ2PVT&OW4v~ zp@yY}vzl7eJrs?+jsS_$pGayZ?&RQ*Qo_U?1)XawuLXVi%NU~u*UKI|Q8IZ}d#ws0 z3UK$)cEG1UnZ5l`BwWoY$+@&Vvuw$6djFH#^R565gemclj5pPlfGed!CZgOK@3D!FkRy8*`|I@E0Llf4(f=@qv2SKX=gSq~^2J zX3=l=Q{7zhm67aD7)f!>)j8wu)Bjvfiiu9bsKjmlFJ|=+C5~yjHH)OgFhA zfGyTy#M^bs^{ADHJ^i6p$nywoHl*`+Go##_QjeMDZi+(CbQaK&avc(4v?^~vfSXH zWUM$j_DP>xWZvy7%-w{eu$hX_(l>1D0j-^aaamdX{HD ztntLhO+qv;9sGHROEu(yOiD^eVpl^s`d_YTZ>gwTbI?c)_PK&NCdB}8N7ia-xFYo* zXKX@+zyOx#=uxb1L=rh+Po)`alh|{LM$hbaK`;AXFA*|l4(TsjXi$^>ZmBZ6BXE?l zZ)kZlDz{w|)b_km!U(?J z;(krqC@a&L+q``OtleYpVq#^D zjuQaB0c@qYT04V4LEWj7jc5t_GaT~-TD5i{aK0MugaY4v=J4_H>Fw_)WgM-!+}4Qj z>RecTlAa4!`YHt3;`%4WRAh6-$+=<8O5C?E| z&pn#K+d6u11@fhWn%wysd;Tib(22oEO_B~E(wpdJlLBU$p4BmOk zCyaL#(y5|=n~?0H5}%MzVL8YAK46;HK}bkQt?d7>_0~~UK;61GAT3?e-5}jar*wm) zbhjW4(%s!4NO!k%C?F->-O>$rao%&z{l*>N{zDymY;+5Itu@zte)D-gLx#w4*-2jr zc#b7LQ4rqH^pIXMI)4 zoFII|N8wvJBjWP?p%xr0**-E@7zq0fT+z4{U$!c*Qah6G}-_P=hiw-&N!pj1ue$&ZDZHO-&mI5pgL?QMKoZ*Tn&q+NE@Zrh~` z0r@JVu$#f_n|pL*CoyO`jSJkwrl%wR#8mvy-Sx8Up-_0??zCNTL5tJYS69;Ty$Qy zxOC(=Tx@KKD*X;6`lL+$uhG-fYRrm}vP><|z`zE0kOc(=WuNPJc%b9rhR)kupW}vw zhLY0JA!LjWfchhYkeQJ&5_Abg#l!$LgoTCW0A$;v>%Ri<1uAq+OHOaW#s=}hqcSqd zv@=Z97xo8OUwqo+g9mHdZ*i#)Z%99W|EwNk@yO&l>lybp9Q0@ZKaWQd3t5N~8tU@o zngH3o3|$H7TvDE70yRQGqCW5~!%8gmjW`JpeKhiaJdVUu>-l+-Bp$34`%72tFYQNx zcR#P+7-rg$g^UJa2m`Bgpn{qXM*rYVc%>eIaf;XVGhj*yNH!M3xnpUW$`S80(S)#6 zu$?`+ey%#AzWpB-;4-m`bNN<`@AoYP6Z!Y6DsX00d!bl#^bQ=abY$2rHr`=T9~g-N zhf|PteSdv?NLSaow3MYh5?vZiW%Tl$l~wE4KfmPF7k3S~7rG;@%61{BtQkZ>Sp*t| z8NpL+boBrIME>U@6R=hWK~8?Ixhsl5N*Z_t@&+O`qXVm}SwP(_dAicU-@ckzI@R93 zO*~1sx|#e``$5GQW?hVGiiPbO_7%&idDhdZOw~kCtip71;lMQ8W0p@rbMx|#oh=CR zqz2M4h(SaS<~5xv&$L#s~L)0ZSJG9Ar+PrtysgpeRROD9qE32huVRM4$)!!Sy(rsXYdXn z`ASMke#0iMv;v}(7zn`OvbmY((!)FBD$9=h!MZ%NVUC55x%2SMT%0Nn?Rz}?2jQs7 zAn^-w@=ntK?FawYyY)pAhZGm@<7TS=pZD+NNFH4(@t=m$|NAQw-|MUYe;-@7F%}yq?ygZQy4f>2vWl6UAnOy(>$@$*1`A-J&LY5t*t` zNf(hCQ_I$&X1hOeM7RQ~gE*f;iCoELN6k&&5f_ zs6O)e-S1H1dyNY#{I^!T_Y=IejX1_btj1-IkFHry5qVKc=!wM??lK%5W-cN>tlaey zmQ77{uHPNe>B@pmg?ci^QnOF*iYsBtub^Ku&z)A=BH{eU_2P5VaidQuNS%)TUmwx`d``X55^_PxQRw5a1LP@|+L^ux=e5u} zg)X8mM%`kN2=%v5>yVG^8ZnO_#M0)G1{Fl3&b}THk|unUL2!keJMMZuqr})FeESiB zgS9|&dd}U$9rj@g%os$6ehC#kdw%rPz(5xnpFgZK?A?V3E{<G^T}@}IR;G4!pD8C^(}#=Vt#dm3$dq<2+y_zS~T zYfA3p{9MR0^0n zHj_Ib$?wOAYPc7f~u3@AH)Q0zbmq$!)@(|6spX=WGe>6nLO5s@DiT6P( zfA=i-1#5&M{qMxRh!c5WFb6z(lDfma+ye|=A%>B0pm%bjsPfw-qV%l-L(Et3}J zCmA%u%s0z!OB4!&zm=8sfolXDUXWQMAyd)FmT*Pl`IdZG#mTN5C?p$kAbJ{_^S`oa z8equiHm7TsB?wr~c-@JSaW))tAE6%O4E2c^Qi@wSw2*Pm_MH>Kn51ZZa5>4sk}|0t zxtKR{R?#xt9>h#4*v$~wPPv|TzWS*&Qfk}Yxv-c@L{x4xU>bLMP%crHoS=zR3u7b`_<-pKor`%v~6jR;5VnUHm~a zd*Zw3O%!UT=@5G#s58IaP-8C5kYr4Br*YmLdEap;SU(ib=ZX_iyt|^d zRN-JN{9Hb^sycQJ7o$|IdAmNU*oE&MAAO8UWcqTrukYP)waW_8j@=l%;IxkS15t(L zC!Y-W{ zX#UU`=HOY5#(B81mRGEd*8VA$(lJ}f1=v7v;5%L)eS!dh(eTjFKexhigRX2)F6jU9 z35N*ZJ`?}cpJJlO(+-)l*cpHB{= z1Sk-x|8sQslJ%i!z5dacypz7-?9(Fzyyj4-I_FEVrYuZZlMMaYG?;bj3WIPmZtgN~ z6FulK@%2-XM-`&76Nb`7FE%tTY>Klp$qoLR&?7Kd*Rm{5x4ra^C{TlbJ7~$Q{9-gW z>0^dK$}=A}ckq5{f_{&k*n0*Ut6Lr_e+7CXl6QF0oQu**45>J!Z`R6MFI2ht?EQF> zGM|f6am!5`S^eD2Ws1LW;I;-E>WZR+xk`luCszFoY9Z80rxwPMqo8Li%qPvQqzC zPtCcne{OuP4v*jGr~a;(ttx7Uc7h^h(zty*#ZEiM5Q69lNQ~SkSUPItr|ENgfwMGu zH`}OHL~N_KN7^FS(`8P@S{n29iP({k8VPB8pntG>!J8dPwh)83i|kuiK)dD^jno5c zr7t|H&zE#Db7Tml6MSi>FH_B*od;Zu_8XyAR%71^?>cZA-^0#^(ExAewM1c@%0R5` zfc{~@Zu!_3VuJ3$4ld)8`i8l`mM%5d1376auAJ#;R8%{J`b+$E@@Eu(yBO*`KJ@?D z`v|%YgiQPo5nSib6Ct!LW)NrGq&}l~SE0@_RG|)-rGStmi z%x2QK1-6|^;tATG0?IZ|Ntc*WQWifZuTvTnb&Y-fBr9+Qf~@!?&{Pvn3pMxPw^XPs zu^(<%_ccozlRXZofc7cBktIJ?)ZQ2iaEFQ@>&NKnEt1b+EVoIJ>H3WEJbN}sxD4{!SV>fX5-7icY3f??<>R3EW0@0 zD^!m!wsXf|(`UxDolPW2!_PNvUm2GL9&tl%0<1_4YCS9XZ(n#cL1iVPSP{=p@y5L< z_i0yk+re>oozMhhuUzGyXbKuAv07;OVwZ!pJF6#n+Agyr3VVn#k>As4?lEP@D z5C~+GM}1t$kq8wXNb(RO-Y+QXQt02fMcc_i*TrK(on~RxlC4=DJ}!!wkf!qb%jplM z5VX|Iw$#`kY@%->kd`pe{c6<0YqFeIYY{~_;(q0-Mxu$*lM|LA$7U@mF*B;6QJkL# zd93HfCa;jjOH=-73nBHvm3P>}oz@OKza3N3TI%$fC-UD7?GmD0;4K~cjdSnDSQeb4 z!tZMThDXnCr`-|5556P*PP0EAw{ZP=*pbnVJIQlZ@nYKh=-w^gU%h-;XC%3I8$vAu zTG5}s>ZGq&up4LGe#%4PBHr0 z+Hw$&c0cgo{GqHQW0YG6yY6~dg@c}M6E2X=MT@6yP`vKRq9uh!+W3+WW_%2zFS7mv zrhV0D-tW)ma$TQyqEGwwI=eIJLU*R#-$95UBoUt(_kLpoO36fBT{L9ab0)+2vY*3| zE^?cKy3;2`0U<%3o?X|dk7+moQ#%`TgS&fOq;ZLstb}gg_vwvNrbZva2x6tF`eI_% z4p8AR5_3%_Ysnb9jNl+jAz(05P$YlE$Jc!i&Iu8zvLvY) zc(l0?Fx?QicuXx=&CRUe8K)#K_uVJj=*yBk;~d)`3jaR1Ycr#sN9x@~V`*Du2uL^2 z)hD?Y4so1*VAeBlmqJ#O#r&ThJ1vH%Aa3l3*T(EbNed4pTS35!dsL6YIS>gr#WM*jtOnyAP>F@E?qzp1a5hM6iCA*KjsXqqIPMf(C ze{CCqI>2VWwqI34S-Crkdu1pXnV=bv9L(Z38B`TEB#Jg^3Q3Grc}hLZBUi39VHIX= zkaf$#;M%fSn}X?{|Muq6H-t-Ik&_q+@@!b!1vE?hs2{0 z0OP1LA6L=P2!6diI*Zd|Awoexfd~db3FVL8!xlxHmi;!-CQRhde5X^|FZ5m|Ff)zL z3MK{aZk?v1Iop=p_rw2eT|J%nZ>g@M`~Nnz20AEL#2MBk6l<_>ivK!v5&e~j)=isi zS(D(9jYbYRu>S-Cr7Iq-s6+N}u?s}#;y#xV*sNmhDEi6CB=z?D*HL8)X0psTbAL}X z@Sl2rX)R%i9Pl{P$9=H6(Js@ukKRAitqqGskcyMvyAtfDX7%-4;v+IpLhY%7S*eG{ zDPZMGFCK48>w~8n{Nwf)5iz-g@7T$-4(lL{N(uZ1llS<%R#0e6w*4gEhr-pcu0Tn< z>1D5OsK6s(wF~$|!Nfs9+aq`JnFnmrz?{8-{zl1O_VmR2sp+5ZXW#CC0)e?>|F0u| zDY|~UZMceQXXnz+ymZ}OV}VO2*p;d>$#+^=r0z^{s?JF(G7p(CjiTPqC+;GIxl}eM zi{S;E^-4F0=W2}ojuW-0RBYO+Gf@p#-+V%Lm!|rYY1>}EaI*ih9*O_TM$l_XRE@O) zNYENK1fw9yxR%HL^RT5NZW+*T1{J9`la-a1+}tU1?3sVAe_{6)r}Ux6TO}!5n`aK3 zdD1~ip-7T(Xqfukbu0}dVB#bb-DuE`c!(J)_)%)*gbkn&xi9|WtqOE5;!&QSUB~wwLD`6#|C8s1z9KP7+i*8(49U&W=F$$i;86|2 z*DR^uX`C=>S?uVExm3+%UE@&FOW1~iH<)&}_V%la{g&O%1KSQ47aR3|(;LGl4RF&l zWEit!btT{!UUv|-AbZ%K^;J%IXS$j`zxC#=1bj_d6j2@!qjaUT`vvt^eEE5U)zsL8 z%v^mVH%;5B`K&YQb(&pBVFr*c58!dGJpZ@GL)PR*~fH+K}pG) zMfq)PeZ4zWC}Vc>_>TLFXW~Acud(k0H42t@NWWpvdhLbj0(qy5XBy~Bk4I`r0Jcyy z{^UB8zz30xW3y(GM9cYFZ@fm%Rjh3H_z(V^w+BUvt8IU?#vm9k9v&Hi$~EZn$yU-t z4Dy#E@lI?zX?^PlOe!w8-w6j_F@Ydm_D}@tdm_j!oQJc&njepZ3SZT3gfW>p41aHzH6-C`uCI;OzLss`_?(+tfLM4=BNS zYnJk;oqYt5h5IOcif61mZcau)ixG&Lzth-5E-$}KTe*ZhtYQ#M3T-!tIg7X&CJlK6 zT=!E4POF-XYz*rq0A;qTr3IM(5d4y7IW(U8a(=VFbShGa*SW;}m?40)l7W!^BVsC3 zfd=T#CcvX-&ZcuzmI?MXYfN2JPr}5+B*E6TDWeIo^sc@*eF2402L0|BKKA1$H0+_J zV&T5E9P%!l|1`nQY1Ru$HUs9hlKjyjk(s7Jb8lYbw3-&L!PS3TgMV7TJDPHmPUU3^kG+9tKMMXb+!GN?ji zUqv?^)Cc7>IxAQl<*SoX6DX8qsTdi!Vy$h{+1I?d)YDn`!~kf8bfxJ$W>nOq!6VsN znCI=f-05NMjmiKSt8GoQ2Sq8s%!Cb%79}~NAufgRLEfOKkMv!WEe(HGI+LGr;frGlzbc z!B7n58qJ`EW24R^g!DMKGWluhuEMNk7R1nshUiI5ArGShIEizkl#J;c>ldzc2XBDE-Sn zX!oOv|GZF+mN=fhR>s%>+RPUPZ~FW2Y3}KWu2r8PpkhE|peaa@sOTUwEVHK$_qf8B z8xwN}GZ(2F2(!~CbZXjx4=V>87sFvR3m+5;3sb8m^^Hu9kfBR@5R`&Ef{II}`~$-f zE+DjW?gVveQy@Qo{dBi?E3}X8iYFiz>@2^bM@V}gEvicG%ze|dfkv!U#6Uk6cR>Ys zD{)aJl5wAgaAAlsHR6qsrI$MgQ~cYLKeK`eq%SwVFS~bOYU%Wvjb|)dAOlzhqym=T z=XMY0!R@OKmNd9TC z)>KhZ0W$!3_N$%XLJsT${u)A>e7=#%)^WgSsNIGU6nS zzSXx?c?d;S7nP+F*{y_d(mPfZeYZi4J#&U456F?D_(K%v9 zNRej0EO($|>mj5pdfR z>#n&FHt4?AML_8bhcJbw+R=60tuj+wZ^gL~aXD8cTVjsZ6~ixVaF=hqK_U{-d?K|X z;(XL?Ub*l&!{)XV6gYz>OSc&K+9FR|UKylZ)f4vkmtdR_s>5hamyU6MzoWvJQCA4Q z+||vjgXO0ze9)q#@QpOf;@aSsTO*R`zfmOs$#78X6|_Mq=IG8NoOAi>sdRJWC^}b) zJZQM<{+6#*qUXIB87mT_D^Dy;&I^#b1{w7km*2D`Ri6neaRjn9EFOD-xi{kOPF`@U z0-bb7QXwIdvIcN4fB+fLu(#nN0BoZC0t_syQH@q{g{{5=+@Jj~z?C_7Y99=2?SP$a z&W7s?AJO{ydPTN|r6nCFXOCz+7|q1M#8fVuQBzk3@byG#?rXR)aE*91){|DSa}!L> zVmjeb?Ridbtg6zW-j1jo?dl?GPV>G8(c%jKI^-rM44gOFW0jB+&@-`@=h7PS-nVQ2Q2}xfudt(g>psI#WBmSfJJbo;;k_`Np zL`SCmBaj0rc!jxqXZyox(ikKgT?WJG67G(oZx$jD`T|7PPd5YQlZ}`jge?D#P8T(blo)(zGw$CUJUdF!avYgG`f#fSkt^We&F1~8GheT?ON4Tqg5CS zAXBhcZnnx&gu<(AIQ7Q;PS&gsfu%jXp8cYdu4C4{jZ>-Urq^>m*Ls13s#bko)A}lmK%jNR`mR0<{VnzM($UWLglEo59!)UhVAG7IS87<*m}+(hoWIrpT2)=TplR#5Pb@~aBS0? z=1U(Z!Q6Q#8)#q-0T#Jkt+(b1_azdZ!s(x1A55<{qy$=99kin!N-8cO5LAMkWn*Y+ zc&+C(>%++%@u$%eYNAJBm}i$ww#(87En;j_1bX!%Bnikfr2F? zD+^|`?ICah8v?}9M4+QP6|RkPdR$t7ZYwJ;67aBx^83Zym3gwKuwO1BXi^bQBd$|*a^0+@edbBuT(r~U}FZmISSjShXLpJ>kjj7 zCm}ixvV2TFfYkZ9{Iq&G62wYs#E6Npb2iyIPdw4&+lR|^`b96{+HR>_@B-(B_ng#j zN&MF3zwV__(urK(cA0e)%YC`4t~XnM@9g$meQ4U1EFTNLSpxhIQbcy&&!IEv*neP1 zsC?XQwN8&d?kt8Zhn@afQt?wo@6d*K-F#M8>GJG)z;{$u4lD9+r7X=45sm$*eo90i z_=rn?{~NZmXos-Ac4)Teuo0vSB~iWa33vZ9_sjdQlA8^b?j4^=vWQx4b=MA0GF-xH z(7l(RGjmWPJT0f&Thf@wkas^2-mobe1S1Tl-4h>;pWmfd3m`u?pk(J9&}lc>>6LB3 z`Kgqc0KY{DugeLktzB;2U$0oBT$<>|j|eY!8pk@%e9!2Q|tDfqV;`{CaT;PAuc?wdV+e|5;~_Ky_Y(CNNQMv2nf{)1%67`0hy zj>DwU_Gwx?cGalV9R@fGJTkU;uvFcMH|PnQz#Had^iEh{t2L{flyGy34=zTD@=7sm z%OOmV!Gvdo&9R7_N-r={?iXWzH8x%$r(x z65>|GH@PugVa*d_EfDIK+-yFllEy$dSvL!L*V8Mc+5kjv^I^{H`m024usaAq$<*u* zkwCsU#4XHxxe6uEkK^H{P#gR`)lYcCsW(cRo zzX~3R3Yl?5~a+ai7IU-C=%6VnbVIWL>V!!o(LBNMIPCP7aw z`#00zzTIBUB~<0cA8D!&lO<#YAi7}+_;9rTydX2|xH!*+QRs#vui_7Mip+d~JHwwvzqDv7~R(BHKGhXwfbod7B4 zVX`a(p0p_{YQ3=r*&TJsPOFx+ifP~dVtTwVqa)C+>7OFG2t9hc%(P4X%IXhSv)y6( zXmdO~A=1FMsxXSOxt_5E!JVJNEMu;e<3Zrks+A+0squ~}Bx6YSQZ1Vk5o%~Ul?w(9 zq9w|h14(fn z0I)@6KC!zOBbT#t2KB>bdgHO^eS7g?6I9N|O;V6^I`xnlb$6ZnGstHxvZL~vh$*Sg z5b#Ptq$%|2l(wi7;_Pf1ENXVY^iSw+65gH`vSyikjO<)}`VA*VVrF`8{XUBeqG(d# z?ATczv$*M%rUxFtmMT8S4YRdgEq{stt=~ZF2SSqi5~P>k<>%*1%gA8(7~3_auv&Cq zM!E`gnW}Jq)yo*}sJgsJ6nOmCi-m)8zWVa~4ox)lm6B`+cgoJwTSZ}cd1Qs6fBw@J z90dghz|gM*lvrS12%N>htDv|PBT@^rzD21M;xaN0)qg0_f@|qbqPn{JtJgqJPY+9) z9O!I;eLomXw}GVEY>&Yh5)jIebAIlmI1l8npbs0S12>;HCA5QLApVs!qWLWX->gIWQC8fu}k+DxnP5s|-f&jEO zeZ0kqTsk(fUxzKVT=n-KK#Ix!?VZvd0gVt6-c)=4dr@t11P`Axt|rTVUF~jMeu0p2 zrROEf2d_cy*IIE|S}IG9EWcBql<`kC%9m6@qb+tt}HU zGqK6554=S|H{{FyWDuxFG{C|J@DzY*oA-ZY%o!J(ig{L=Q=I&w-A+XvxGy2oW`;Cz z3T>SEBfoj6ooUAnD&W_#Nxq?&nQde;$V&KWx4xK{n zkuXzeR8EaSx->%Q!6&{+$GKW}KsYPCgA)hQ76kyS@fl(2i^_5e?_P%Ji;8mM+w!4m z+ScnZ-b9UhTa^UD83l@LCCjjD9z3}*a;4&x1lc0K(@sm=;~P&B&G^hy;?xYUJ_K)F zpHEdkcJbYDuVNMBg|CP(MfM+ToD2*qn%|s4PuD1X=KX+S3KE z!Jxi%`q+EHOIIxPhJ3(7@O0>@_G6nAtnbbhZ^to%1FoGx?%wa}C~jm& ztlu^(>3Uzyj3$FPRpJu0@L${cV9`82dKnqDcd34#nA;gy`fFj6t8idKNmcp8iseb8 zj!9rh-K52$D=99X3rK9xE_sb?86F!0`1^u0)4R98v`C*!2LvvE@GbiBgR8{g)N&%# zBPMc(mdWm)bm2J1-1Kc? zYU*Al2?uPZ;hKvX_MK_K ze(}3nGcJ2^!HhAtl;7X(!l#k>+NP^mK2qHfk1C=Hjb9Z_D+lwyd^Q!B<-`cmhc<(* z>L?7Ruct z5l6b76t{?Q6JcFDE^8c^^!y_4J$CUNIyt~j=Lm_3xqC5D<6Hlbe#E>mbd`bWO;T-^ z+#LqBhmEZ1YL6zI9}vi*Y1c#=5BU02w6Rd%st^H}E5Rigz9h6C2VQ@P0yg-nmZtju zb@3a@aT{*S%DzR-&Zd0qI)j#bQ0#TL;X^3OM*kppLX7ZY_v~qf6G5aw6x>$12J%um zo2=m|BqN3Clg>e`XRYxd%Cr?Hh|Glm1vU+E8L6#h1IP&O2d(B1FsOELRUR4@Ma8Wt zt&*Dco>6-8@M`I64rwv?v8I7nDn8v4>VVFR{yL4Zv2jM=wpAFIR`|?8?@%0M;J#O!BF5U zo|QXao1t85>(ZWj)q8p(1^UBQ1AT5OmljJW1w0)77frLRA1uB&l5n-1q6)FPBg6rP zpA<25^aLk1Q5aB75-})KoGkrl>ZTTXwW{aMiN0wl^u+X?8n~24xw;cg)wdX_K)$? zGUSPD1EATdV{B;d@;=~cCKBbGLWQnq=r7B^vy_h|XNF1VcXP|tc|CnQGML5zkJ6L0 zZnrP<{HOouN9s{mojpFDCUIbh?sd==!~2IC>AfwlbUChUZ9OQ>adB~(WkPHY2edGB zqJ&!b<%%`pen*b}&VzA$Lgp4_W}x3d)-R@pW&e$W! z4+xzop3}A8o@l2ZL;TCmDE#Y^W%DD2e`O4!_PzjoYhcnHm_v zkDS8xl63I2Sn-NdUzJNpOZHppO0_XW$SEjM(L%(|;VcJoL#mZR!~HgSRou(#vHld3 zF~NpwkA@Y`_`yf3mPyZ0K|`vIsPZ>0+r>2{zsuD?G@(YK7StWAn8I{B`=#6UFqiaR z;E&Y|;us#*2x?n9OR~UWj11KoeNL}HVf2>&CX6#>Q4cZryQk_zpil{a>l8&34 z6gEhd=%!7Aqpm;Mm8Inc1fOlF$9!q-OfwVN1RU~Z%Zdeu(~P<%NY^A6S2h6>_7X7b z&|hTKX+$bgz3)UO;!6aQ)U>9i{?TGn45#&9Qh5Ja=&Q9aFEYIMM$#TxQV_5H0AT2M z$@k^y!^2S>Ac=F;=zTReLVoXeAG@mR>dHAfvUWY5%N8w$=L1<-mNz9clQ4!SA#K`E zW2)oAR!Q5IAJPO2@Ek|}2KIsn!w{|D?*qZC`iIPIM{F?=wII591+pjapT`7$Pfk@h~cK>DMXanS+7C5>^>-g<1#ak5D52Vgz{`=xvKNWz_?{{*E)gLkboz?bSUw21`gnhucq19-bMB%1J|z&2g<46)pYjYvBJlQ-WtQegEDM!ltAN;u(f>c<45Q z5f~&64P9dNc#9|A%IaW#@gpn?!0>z^h^t~CXyIpqF4HkFg$uSG<#swv{##RB-k-B} zzek$AhdGd_^k#fZ^TJZ%jc+&txm@8^ug^rgl2Wf@M3#u;d&NtH&8Q7+L8co$?q`!` z@qOy!Ct zW=Zm=%Y%LXgN1wzzGg-~j-A0;P8Y*&Ya~=ykj`GXNXbDtb?e)?fsp)udKfTaw$Nr{ zeUvB)O0_7-RQD=3@i}po&4-nSf)kdYBIKK#WcmreDH$*UFBy;sqoPk{8faqXrvTUB z63;Dd6~2XB>l`zEGptlb&B z>_yBekzpoh%%&zOw>NiN$)D!Dnxkvdx*xC3P4F3+xJW7`s+1ji6WxqNIUZMw=6%9Q zCDgh89#NYx{(L`b&*^!j_*v$G9I6kG{YQJnj9z{)Z9?eY}g*T~T za#KfsGKe<55JFLH{T}@15@O893ZkWKM2pM(ts&kw-HT01sEy0%-Hc(dnZ{Y#E=ES!>vFi3NhDW68FrPx2PD5$kW( zEJjnL^nWy;QD!yeck7Slm5!PO#ccLWXM8faO_JKP;97+#v5DM$50CiFwn0QqqbHSB z;V(675ZV$o7^-x*5VyG zYjw`+t(|6shqXA@8Xe;3p*=+y}fTpD)j7ERPAwrl6DbGO_d< z;fS+Pj8zM4q9rpZgZ(I@{nVTehV7~Bqa91CFHWn;bTH^UmnPh&Wt-87)2YE=h7z0P zjf6ExfVUu&Zh8vU9m(2SUOS{RmZi|)0J6BhFM6b3NYn9y?y_JOX+FG#3TXmFSaW6lS-uZ41jhWOi4F=0-m|qvY zEbT?KUz=~6%d>Ti0}wPBKB*g<#pLJ{jgp5zg{mC_ol>z zNB%A$e@n^+9vy+`ka`&wHuA6gW6?!fM_+^)qK(1|ZDrx#{T~xj9IBa;{leeX?22p! zCU<5X@v#FUwXf4{mfYL@-S?FX_NRX<-bBw4pywVoLO@lw{{4L|$w2Yu%ZC-3$TE~9 z2XkF`5g8ayIW9%S)AmWe$}q%&7>)j;V&N70i_R1icLFOP{fVDKZ?)}ieT!M^@>Y5R zNr4njO%6dX^7*6s_d&`r14(EL1mu%e2n<5#fLd*R9oy;`QjYWjgpHve4_BpDr>;@d zCF02%3}M7AG;2Q%Keodof15TrJ${e#$Tkb}@d)?BPtQ+k1(&M&ke-id!lGiIrLE8w zV_a-5m$5ZYD?vn(@vt0=(`q^8N%rD%cPB;m3wen9S95gC((M_Y2Sev(WjdHdM98+O z(H@eBCmgHiGYOQixK9NGd+r+x9M3*3^sYsr3KRkmnWYmR>{K&c&mEL8U3y6)yaA$V z91hT~MFh60W&;!C?9N@*VVRF!dUWiPQf!^R@NZ8^0(uFr!0>$zkK~! zmYKMRbGI`RrQ5P$LkHi$5Z26xZJ;i!Vd10+{ICux z^>B^96zHP$riR?J?&KwhmF3H;(>8=Ny(P`a77{0|#yev?D3lH)gOYBtPT65L8k+w8mb;YZO@pzN3PiEi^y zw#&0b9bSz(%%I%0sNsxH$pR@PieBL=N={EdizaAY=5%pT?uz49(;3EETLxDa6X{gp zQBjLZOT(iGxNBVwH55O_ZVtx0N`=DdN_=VPN5c+nZ8`6Eof_(&X1kuZ?-n)pf2_U* zUWulF3+lRN@!$lxjnJ@-Ie%2?lK@Q(>?M^;)Q)SJ@$vE9Hlw&dEGlI3#DNKJPZ>uS z;4Le5=sa)mL*XiGA{iK^+f^pcRJ)xSaG{Jc}IUf6QGVIJv_D*CKvvTwkaYfXe;y{YjbARBi zEFJ-OLSf3^JhVhCPHDV&e+NW=6V0cA#%&SHj;(!GR-(>DW>Y^1M*FL-%b=uKJxE18 zq%>9*GWq+KJI2&I>iQ_H)kkhRV@fWq)=!PR>)p)zv45%jjs?f^cGz^5>9Ch55i_Hm zRm*JYzy+lnKAz0|@M^T{y`FdRnTV+=6^ZvHI=k6#QZBA!po9TP;nhO`h_h#Gwx>uS z>-`YRjF)>>M*z~nZ+3MQ7aOs&g6(W~?(+c50k6=saN~?fbWE*fjr@2YSCe#Ozeu%A zcQh=+8zg)tc+ToldD1NZDTA{-PBCqFGiob!S_ogJ@lp-c2nFR!H;mGS58_#P&;E}?@ms1CF3vlLTk@)X>WYQ^jW#PxiHb(g3iar>r#@1`7=zA9$j|9Yy%? zmz8u63^GROtDEqnmzl!wXE@(?TjIOO(v{JZr2QInqO8epAt}OiJxUG?A9DCeShHB@ zos|4wa4>8Y)Q+;F`Gg?Nj!$W5z5sOi+q~jmuv;2!5&6{Pk!IrPE4sx>13^AYex`NPUSoJzP?WC?XR`DHMNnxFr15RIhQwTpW%b&%SYpDX)`zJZ#C zyQ4K{ez%|1R-C8CknaorH-AKiRokkqx`y`+gCo|*xb-qQ##ZtH5*}UK4J-MJO*-_n zWev_xTRgB-aJlLX#l>}XPEy#XFG_*)f6xE@wQzBK$bf5knKYp`3CdN2KN6Z4>Pp#C zR@=_$=8_(NdKVq}6RnWSMH^|J;gOxY{_n#4Qzx_OMMMZBi}+!&;KG_a z@)}E9@u(%`?t@DC%yCr!au5zqwDzbU??+0-Xi1X1yqck&xT*-APPy{{o=a0mi45-t z?=R}*4yl=5j_V$i%waT78$3{$mtfv|>#-^E4N2C|kGtdVqAm_1LA2|iR%;t3{Q;Vg?CsWPUvsPTD>?bjmAbL@#O5v!#zR zI#34~`y@i`QY-KLfMITB+sQ^rQGxLj(1*^Co8sYqzGZG-OZ(6YOr1JLAYDRg4^H4j z6E(oDw=48AEQTroEloWO93PdjS~jEk6)e5FI2Aa_KS^T1c)5S)aQ^ka^T}6KRJ0lR zk+^S!(YRgDn>+Gly;{HlOu-+}1lf};fTErr5sgCTtN9if z1Gzm2FUs*rS1;3mRM~IYdDgB2km&d-5WmTJd0VE=W&$fE3p{Ep-vH7E%XLVY;P$jOj{R5W& zWCEFr@q6p0PKxN+la1&ZinKV7w}!1+*Xrd(OPS;B=H7?uIEVF{I8=F?J9TUA&+$X( zBv3(|)pes$hbjD@&lFMxA&9eK&5LBs_E8lBic&o735;T=+bB%q&4;>t{oZ8V$|p4- zo`)m&hjWP-$Ww)!p~wE6s>hL8@X<^+;C|_zg3^4d(2#D7tdWN? z$s6X?oG<6!qjw!60@~^p3CtRICfbt`ddb@oMz4rgaRoCMpCOC-PPSSetw?laxn=O~ z$9_TC7B^KFb}ul&;C+r6-r;t|hLO2JNU>}b1QL{Z5B>m36YA%7TRi1U)#10L~b}!R~ zN#UaF;u@JkyM~&9I_r4nd~9uNFQjqm%=^>(BKlT$MNa;EKuYJxW?|L&AM2#KBc`gK zy}}(Bd|_j?d`rY{Tq2f7ACrQ98+;1Yrt>4c<6b-YJyp0gr0vlNaXtqy3PNv09!A*(Y;>h zAsGQVUozu9)7RBr$9e1jTIdwSV`|IjINh$j5mvqt!evt{;VZ2tx(0pOiJJov5;0XqV582Gt0D$ zj&s{7e}(_yAmB-{y6lMNN70IS&d+C_B`&Z;jKEhB8=!%&EaCk}7i!iS~87wPocU?)7j*{zc3-_D4RYuRXa}3(o1;*;f~k&gXmU zp5ER&AUZ<;t105DZ>ol~aVH40`S5KqjrHm!+Qg6`q512w%R5D(r%Sq+)284fOQ!=} zpSx`&{ONdQa}IpqEAj6Z1!(4K^w_?45lvDt{YGcvA%|BUfQc0ZR6z61isvU_j4^or z#-hF${?Au$QRm$_H0C%_ED7K@5ISLTRFGs36jw2AZT$K9c@V^11LPYZ_w0PK=gJU( z3X>_^XglpZRFbpY`8Ja~R@4?TN0#l(f-r`-kUMKdFJE_u_-^(0N%-1dk zxs}pW0C|4{YTQB_7=*Eb*t5(3g7 zAt5O#-JQ}c-6h@K-61L6ozgAc-6aju-QVW9pZj~?_Zs}6V{q_zarVB}UTer^z+E{1K&NrdohQP#Tu-G!%iv%aUjs5Myh{o5JD{zAd)D{UEUC&B!Ur|bQl|EN`)o4 zX!rf!#vE}k%)T=hLpV5fK1s+NAxXhaUQ|qv5`Lcgz5Oe>Gfm_;1bL&Y@@LQmWU~BQ zVUHVX?_Vs65__q$cPyW46xBR3gy+VM6$2-#VmYKS~5sm;-}XebY8fbF>K(J00_nUm}@{mM9{eQE%4-O|vBe zt=mZ(W0C#f^>)qTxU7LGDxaqy^c92ke(V{6zH2L$xAExx&!Ac9tjWnLK7GgOnyvZ6 z^bd+{g|+Bs!}+|o%#k^I)T;Q>{ z6*YdYHomccWaJfK*|%*gr$z~b^qBtmKa(;LqXW_dR|Z(035|e24M6edOM1P&OMON| zLi)l=1$2tQ7+UG|;yHE*x-X7LK&u=P5y1rlV!#?S8cynLu-WV%{V8OU_+4k=UbQ@V zkvV7U9QVujYo~6yEHtB$lx<3c8}JXiy(0?4qPv!Ymr41$pZgb-UKHrfLE^+R;5nM*OshRPj2sMO(-0zL)1sXbB4FyuCs6 zLhyd0gvSk4*B&0;=*_)tZr$+X54J*5vLh!1@3xbSdnChWL3`ObymB6BBThtV?~=S~ zf359`uT-jzSdaE_&#g^8D4KJMk;P$Zt2|Yl8*yK(=NeDPVPapz>`rICq3O6!jaM+fj72>}5pAoT$! zK|TGv*v`8nkU|8EF^)cu&qCv`C-wM@^gW%&4vGX~*IAU+%Ud{oC_cBu%9m%XF7m(P zUck^wKwBLPHqxt1FUop5JEP{@-0<^;F&hUbb91IvY?ZPoXLf%l+nS{Q546qEhJ2)& z>nP#YB`)Y4{ZvYpeP{jMf_?&*jI{^)!l>%zLN!>TlP@Qbv@8Wr-?yL9#5$DN z3QH1a<#S@{)s^z-yIDIydz2TN(v9j<2&e@3>azC$9(^sFP~nb?ldK?!$p>6A2Cg`E z*?wZ<#m*eOQA?-i@u0UNjK)juwWFL zg|k%6%k_TtkcgzUr?wR*L4G|CkLh*{xySv{j$w9fPw4&)LS&|_{l~;_&StxVdSdo|hk=JljpJ-Goy+ICB8bCM+ z$z7fgfv#?(_ESXUuhGynmlcAs=4L`tCX278p9Ec;hl7@xACV4@l+xvu-q*iuQ*q`@ z$PFEGo~%z)WiT@CKw)Ysibd4LiwP1-@C*C3rl|a0J6Q14>%w?6^xqQJQ-pnUy8DUF zZmMHfHT{D2iR3n^qoW(VfmJUD@-`SN5f)p~M?#XlP!Ccwl-3`a${8F){pV zYB)fNMM_Q%hJeE$4omvJT>}NWyzSmBJ0}MRSYBQQf0p%A6&YKipdY?n4=V-~+&D-Q zj*b&KRms0U??LRIP!rDuwf9wyfaZ6VMyR*` zu2@yUc%v>`{Wt|jBE7cvK~S@Q7j z`o5})6YB|8wpzhH7Xpasb6{19o)@=BO=;7X>e^>UF6sF-QZag?Bz#DO8{1ZKx;tjd z;cR1LWF+VR-p!lHM`nzzGTNN1j>$tN0neer2#GGnH{uyM zqRuaoIr`o93|u_N2;dA{UF3{&hZI!F=H*vpj87Cw{9bg9@ZN#y%~_`h4i0xhX)t)S zu1^KX7j1>nwXI*xY46sI@c;nqYlz7?=+)Kz;=e44R?*ukf>Gmgx#)}wCBjUNC0`xM z&KzE^(*VUFjp}+`DLdoKjWDTcoqQYC4d8~oVNDZEBF#9Qbwx{hvu7A2C;*qqIOfv z%g;*M8LF^8n2Y87S#CXvUs&ki=8ZHS^(IgHX-o2Hks|y+$AXs0JgjY<_krNT!rURn zq;^in&VfK|%a#-Tu@{yL_n1&!9AZ>v{MX6MbHmVt@Y zJ_H@B9(7Mz)jzp^O29Bg$4*Vv_3_)zkw;;eC_gbDe%JICZx=HZSB=2nm~xM1R4&`K=da; zu0w#8z6HL9rvq{}wj`ja%1@ke5{Iw}%}%5<_%8KrfmC$Fv8{x~CRaST(4nbykaDhh z88q6m+f3d31kUp=nSW*+&>)&G8kdR)$E*w-_S9LJ*D`Wa1wX%KhKGKieAJ??Jf=)& zm?k_*k3m1ID&gkf2qkD)&Rr36D3{H8Hi@h;wZwsmScY zgUjHz-O7giaR@?Ih1LjaO@foep{n-W)q3TAR$!bJDan*Dv|Jlg{A=s+f3Lf5l|T`o z<+7b1JtR-om(p-C_))|_xgITH#d6-3D6Jl=;5QoYb0P%|&1Lh~;TK}?kl-1s0=tqm z(68A66In)W6ac-wdNROnbYK}pLeoF`rN)-s%O1x}>7giugd8gQL8&+~>KoGt@hEuq ztbIX_Hc|#}5bSLb1A8vV%Z*&u^ZMx@xL$*tk$G-2*Pf1OUy_67qlV2 zL=)}Lpul-g&hSg`@quUW;2V-PeRYYr`hh3y zu96ZNQw{uB6sm-UVl#i`wjge4DU^@S66er&_SBDe`jkw0B`vlX%bYmTE!?ZFhhGj3 z+{5JCfXe$5AO)5wOX};BG&VNkYfzI#cMJ+C_q&d5*5u+qyhs&V6I!U%DM*3PF=7>RhNmuR-8S(+U#2> zE#j*z9E_Y1V}z?o?83vS z_C#N*XLpyHOcT#snZ4hEmQ&0+sr)7bczrl+z!5Ze^wZeL=yl|Gc^}!g5e8-zU6M=B z{!=R#XtBnFdv|jJeCzj+GB%pCYu_;!e_3zfts0iPl3*bP_SB0LkTM(1E5NB^EI)qw zNX72*z^=dHhnIVK@EI6ERU52z>#NDU=zw0{AJ{%!v`#E)86L!nWKJSi2ZxGKH5T)8 zZOuWccsn(5&Ewx1LX_v*qgIu>zvYIVoGwc1Lq_s{t|^3~;;GY%>waxF?Dkg)eE;z9 z*278rixLbuSLzNGLueFY&<8PIP)N*1t zD1QDG`oe3Ufoy}#)pRj$?v@~Hpo1^6|;}PJk=QJgbFS_jw3*Q-W!QO1o#%MKar8g&u!YVj|a*# zx13_%ok#iNYEd8DUK}0i$)re+eD@$RJQLih{q&z+*z5T7f39`}AZ&W&j=!c0wzNEk zAF+~YMfB|CXD{}^pdp6i73Wm<_Jrt>HzP0I&UJCTy_}){;p?;I%sg;r_BnF=V#W+@ z0mhie)(srH6jfB5ICSp;zsL5targK4)$#ETkfAvWI-(N5B>&1lH=ir#{?*NWYOv=EB`hMs0g_^*_f@#lIh#kb9d(gZiH8J{1#ATf_!luMu&gq6RE(63Jn%2U?KO% zkZ>E;Ei!WP4IS{G(G;7kw=)|>e*dWWf;oB8Bn~JSrZnS@y{O)Bb+Mjrk(dOKG%!)U z54`xc67H^|VNh`X?Zd`y0 zPpRPn^c!QODbx?S>w#*JG*1J=*KZ1Tnyooh0d#gKkU>V1Ml58xc)aJybsaL2D9as+fB zP4F+HtS}{;fzLrJ*8jU{#N26G|C?vfa@{8b=##N|9=Z%YgC2E+ggRP#b(rk=atWk~ z4GAM{^o|V;SV_;XF)CZ@2m6qPN>DYUOtN!(JM$q-iSN#P@vPG9Q^8>qEM*Rjb`X;J z8Z8yq4J;b}bM4zmAD5EaK;uXQ-O7E3>Tg5ls9QDikPQht-O(G8S&m;}zT9vFwHZVO(K3K6m@2pqIxjXu2Z z-DBxBrRwjkIesnMPknpEtfm{j?i|!A<)qZqhw;7SQy0LD!r*dl0JPB(!ooeKD~al4 zC}`!mh06m!RAA7siY`mT;FK8I1iNeBxw4$poehM(4ZNAN9cUCmhaWeCwrn7cuIH`T zP1IB#B`DVy@ioqdz*_kPj-xW+X&lB;@KAFkwY$ z+Hyh?pu&+Sr`9t0(RGb;67VB5neIOl=8_1_Fc#_9Hc~n@u$fhDnsHzQy@}u((y0mU z1Da{pJR}Nl1c3-RsDDfg6qW3tB|;)Wa%F56rpT`Gv5t+t*^PE4vtwuLguGZ)(|99d z8V*t7BxGRHmdzTDW66*YLdaj-E6lt5Jtp<^tOHFFG>nA68$Ji5Y1Z3S=^URV3R6N$ zEX6qiVZ*rq>|gJp-sCzuIIQnw9t2YeDAj$VVJMr_U%sn8z%lE%L=^FPP`o*PjK%gNZ)qlS<~ z;lE9Pbv>cx5b`TdkT9xiE@EJBmB@#HK1hJZQDoB~-mW`px8i?`VOr%Hu1*G%z#<)g zvrL*o(RG~m*3#>c$Z1&2;M!%CFf(s(bgqU)wjpcsga;;|qws-AmI9`f*%6E?&(y7g zrx|a1(Z|f~@*;Zm5bn&WtkpH}ukm6qgnGB%L6hTD&a#2Igj}-?3^`uN$B*Gl8~G** z7{3>fjf6ZyW|&`$1FlI*=*-^rY!nc;|_8+%)A(okEnH_!5e`wN(vy4$bs zYmvEM8mJKjnHai^az4g42YaP8`$D2_HZS*)L~;Ek^Mn9&X?o!M20au(6B82|B$fO` zRQ&SH%Hf{VXLY)>9A=KP4)z>-gZ#o<0~ZotPg{?|g3VUsllAtMB*(jTb|FzK!qp>I zgvN!zm1f|jufbQLC_E2E$!_waS^IB%lj+K@Lw$%$ z(LWsM9Wo3|?p)PLnYzLuG#c9HCI7&wP%nHXh0G(WEbAPc36gBRZ=|O6Z~qenA+J36 zk7V@_@-6n)mK03!V(FtgcaL8I54Kc=S9bDuC8er?xOGQA6FD`w;O!Cr$E$3E4Z_SuH^d`5I2lrD7r;R7NB5* ze&Angl0<(zRG;A^@<&`JCIvyHmKD~}9m?Ya-1)}cEj>YZ8Uw@M+LkrlF*&k3Bz$(` z5aRO?6x2bju!~k`SP04cnHEec3M$CW*Y-4ewIW6F{^3b`m^mu-c<%`VvSUY=;Gqz4 z;9^j}47DvOcTQz&+b{RSDg*{x45zh$|HaJWovR=YaHmK`%Z&^c1UW5^-M?XeylTyX zxRm*N4)6{JpRu_Q@o1!1)wMcUQwN*BwoPMmBWuQVjVt4z(bo5?;0-#PyFju8*{6ST zb*2Z$U*Eii9lfV#+*NhCbyQAEHr_~H?IbbBkmN(H#oYzvGV}&JBSKm{!T^yO;#&M+ z*0beZc7sH*zxnc?PFFqNaC|(WgEdn-)qaukdjYyEtcXbHjw9KjubP_Y5u&f?lNuLMlUvVzO{)7k_m`p2%7?#S4K> zK<5tW`vi1hgU&Hrb@{&F1=gglW7R<<{=b(>^EGpC-TDHX)%L*5Nf2QSKdV&fyhAsS zm!@&IvXCnsrn~#S?{4E*GyR8s7VdFb6SQ|!?~~XW=Kej;y$|ANZeF+m^?RBT43?iS zHq?zTKfEG-NdEmJR<6bUE}07rPVvQ z{IZTown5gL)HRcg>{e%9J7?YE$eJ43-m_zNw_Hwmik{VEGK=Ne6Io5zvWOU()( zL;J%;5Qy+P1#16H*?z}}75*Z{>TNFl z{c_nbx*3_VufAmHd*r0vY0t!=7wm*met9wGQJV-R>Zrqddpe4BwUwCWi5&N8r?uy> zxzRc8OBO*F7Lt2C()5{pO}BsGcDt5USAVTz-ytLOz9ISFL;T$rBIEz)!=VQM(Q46_ z?kg`@72{U@4kfLyzKtYJ2Y#%cE=))RkwVnGaU0D$1OX&A;TYV4)CnJT0VN5uv@agy z09YK0BbX`AAJE;ysuWQO;{#T2>>?cTb9K%{@AX@1P-5N^aqqh_SLBP>&RdZ89q3q! ze~BUuWFY4VzRSD%+OWL*0S&RkE$>RP&gBGl#PRo6Rq=@;c51OcFw{px8fQGzd6%D$ z7#r3V-jX!QsBp3;vfNRO%S2uBO$wQbIMjO2WRCGmnl#%_5*Je;QJ)D2KiIC-r&Z!$ z0Z7yhojM+KvMh1B5yzt!T5RskLaV^-nH#=f_Rs!ER#P z84Oo_4{d!U`M|MqqEPc-yNW`oWTLG_!W{8F@CJ#vBr4|a#=xe#{U%OZR~Y5=gX3Z~ zXMvynC&HHdk$0m6C=!)&J;!(Knt%Zbq~dR6T`JRqONoFaNPlkGB4erC!-6n4nvpq> zXIF^vY{6$wVEXZKTx*O4Exljw@(m8e$NR9_8ixOB0b0D%P9)*Pk#uhHO{ag+`@xZ% zd?PedU9u|mS&;CpPt&-Q%ZHyLSsgyp*Z zBSorINAq~iJU+=>WGQyqxV}R>M%@aqayaqfZM=Sx?YLtPf+})$Emc$3Fo#t0OuRv0 zqmeTk-1d8la%%D@Wk}c^)moKC!Nzk#-Mwjy44VDcx$lUQ9ib<3P{#8BJUi!mP5WCj zl4ghOAznnE=>56^^|he-e+X*rgoZz~E=C5Y50ZJD{9X9wrSpAXLP(BO7HyD3pGVjJ zpMAv-m5kdYtop|Z>bUK{ZBEvG<0`V0>eX8Bm40jtAk`H9{*4v>5gs9`ti>0(VtH-f z#&qOjjQ1p&sO{-`sqwJ9ISFV5y91HBj~to2p4|yNF6F>j|M6I1=kl*@W2GvMv4Ng; z32Nn{Fm#rowzv%ymAS@0E))Hkw@h(;2kdSQ?*jygDEK=6g+aNv$#ExB;=a93I1b8> zoV!@;b5NXVlq(qxM{Sxhd&)pv0CD6E_Xj1ff&mE7x@iG#VK|-pA^hJOh!X1#+_o5a z@Coe|&=@Rtp~pddOH4un`jcZP$4m-v@V;MBh4A9Q))%C_&*`Tr@_Owk{`YXuQGkJ@ z+O!|}q{ol6jUP-f0yQ&EK}6H>I#3#CUl+ri<-44tv@wWFbWbuQRQY!ca8|P z^S#}c}v~>rgoZ5lZK+qYHsaV1aFMRa0Zdl?CvX5isG*n zPCY-DB5~`*1(VIH7OMOGnMVeW!XbUj9bUsLuuI6x!R%bm^m6nZ1qx7_2Bo$9{1@W6 zFS}Z7q2x?a7%#sQq)ZZmzo9E{N*&Eech5{FrKr?h-umSSLRj9_Gdz>aT`awV233R% ziq1c=qFiMIp<+Q3FAz@$HzsTPeF#1qMnit>uJw3t{4+bEmi{llwKS75LFO#IlsZP)Zk_LnNoGpvwLMF*hV-N>Y(m*!Z zUvUFFZsJhoZVof|3vVcLF6v>WoEayPjHpS7h07ya5;KBqbMp2*OtfGIhHRp-9w-o! zPlYgzpVlBmc*mnOPYe`N^@)j;`{sl4#2>$n;p?qze#y8St&h?#ijREB-$m935}y-4 zE)5n|U-|WX4=j{)9I>@9y@i7Uh-_JEwwnw;NVcZjV5{ehlY>GaIsu7S>Bxx4UWJdhO(u`Feof2v;}UnpTwfa z_tZTRZa?NOSWv2Uj@^YpU}HKEI3atX$=Sc^A<(~m)D?K7v7kk$`yC0>sCNbtRPs9p zhvy)-?={6vI4t+cv`(GCWeXMJEi%FIYj-SB+cRXrVh1GtZG*gRUQ;jbkyB4*DLn1o z=u3_+-(0(vV(ISVoKNoU3@O}w0;9J{o(QiUDj=@=_HD$JmEY=Xvv{y_^8U|b-M7}1ZgSsS)9>i!jv|ig zjI~Ul>;Z3{9poG47^?{izIi1p0k)e|22X3;Y(Zf6{(9AorIBE_@!kU)U(n?g{(;XE zk^P6X=_R0Imy&Am<-K$Z-dgwhW%=Dwy*s1{xrou~&rUqIxhnzWFRDPXO;ULQOJc<} z7ZwLVl>nVOQg90c1K(zd?x71O>JK_IT0D2pZMNajMicq5gKi#{@s-jg1!m_P`Dqy`(<7pAf50u!>VVV8T zZdqq1EChk&kIMxm7A?O)$#5lN^Goy*!o<4K)cV&wex@dRk$nT$p~hM7$mfM)RN&2B z*qMES?UyT^$O>z20<<=cnHFvtNjjqiFe*BeBg6rT`Y8JEGp-z>*tn> zuLcHRzLEq+Iy2I5!D2_W3Zw&C8<8~Jq-j2hyja=2{R|U}NsXU|g|+MQ2idz!^pL}BR#zM6 zOg_ISOnb-m&LMto(c|8!maJe}KrJG|9}YjJ6W=XKittmyDO=Lo9x5*c)ggY%gU2VC zvE!k=aGfrw8AVpMmPa`V%hXk@I{Ed+F}s%48eR)_`95JvenrA7Ui0ka!mLmJxww?8 z^53pQKY%6g@mV+`l^%;faSXz{@JZlZ(oyFZQ>ZEZ`&NLNJCR^P1eX2Mb z+5ST8y@$E*WGPw1JV7R(XiUt-gpxPw^yI1iCklbQFv`BI)Jv}&{01sn?X`!eL?z}* zn_4ho&iZ2oL{<}}C$~)6?}191??-t^8QGds(@O0Y-agtiVZqX_D^l-^~onM>!9j-kn-&HM(0N-R!j9J%h);4<=pAqqYBi@ zX)NDJWBz*r!IbUWbi6WK)-%d7UhjNx(&BDm1BHL>qVkoGxFSOO1i+^M-SiuSsQh=U z5f5KiV6P(TUgtm%^^La?;vA67{@P3ECjo;R0HLKjyvm+#&xhzBZ})PdoI$&MbpB7S z*5Tg?Ui_VZSx4MXdR=8wcq)UnHhGV=+@V;!|AI!IA40Ktab8E2sVos-)*z?0-%cmz zR9NPOhFO|hIXn>RV3eOxCb~dnZD1W3*g!#cfi+iSl)?UqJMjN-}-I=%+u&)z$ZZ`bsHp(-zcZtbe?SqMmwYym#VW3Vjxmd-}lZh7n93PA*Ton8yM4EA=ts|Any!uFBLJ?X_Io#88*l8;IFf`Pz_x3yu`)B7Ub zdU~22W^~^hCs}l1VA%uJ8lGo;wx~G`CIT}v^Xupr36I6P2ScTH4B`ibC1l$zvk1i| zD|3h3I+~9Bl+_x>A45;_eyIQSmNVy9pWfBYO%Yesr|h@UHBU-LL(ESSy(6mWdNZ$R zwf*-L0$Rteb*2EqmcQ_8V{=t!7em+^R{Bq3QF28cTehGjn6)s~Smxp?lc@wZjL5`T zIDoa~U9|ny%T$SkwHG?ZaNOE6*hjB9PKN3+HFIUv1jaXHs&JeVx?)ndAQX?HioHsm zlXdGFHctElO}xbTVeSJfzjtB2gr*X6rfD%FCeCW?0_wQplNdTDi|7e0RUT=tx1#zG zVd=L55z`-iatE5iCCc<3xw+8WDz{$8NYd{hGV>=oAqf|7G_x8j)Z^k>T~;{98M4%~ z1#|84O5--CSfx|^t!N=&pIw&YZt!N> z!3=v9^G9&Xtxat3bONJRj9>24!U4V_!Kq9K9zA);^nO+PoNpBS{yo~{nN&0VPi_QT zRP<;E2SSLb^}onh>wFaO-?YE8^+^4M(k~779`tgAnKK-F-CuJb{re&8q zE?FUc?1780uHzI^{rwIMboAwx_G;OkhsrjildX8cQMD`U`N`VR#+;0Sg4Mg$@Z!0{ z*SO>Jm!~MNM?WARi2)eE*WBIL>FsX|ocdK)^ZMR30*7mO%Vz^0o0rk$0%~n~aNDIGr;e6haWO!WTG&?z^{Yptl5Ec=6 z3m9n@D^1LMtwjn2dS7uD>ddjo$bh&uOEx+=SsY9#wJH)@TDV@^3Sy(9I|}7;0Kb6` zT^QWk`D#N1BqSuMWJZ{{f$8H009@1dxWa${PUdg|?pO3C7XdO599XQi{R#}ct~jHj zrdDgRr(|7q*5`w+f|&9iZ_9?P^*&j(MgzXkht<105YrRkHg>y(55^kXnb73q^z;Q{&2U1ngVy(^hWi?V=b;G>N4;TBjP$tg-;qWk&emU7_ujXsI3b+g)bu>`pPBtSx^U!Ib{vy&dNPf%U1sI3_%DdO zZbVDneJkRq%fHYyCiV4OzfcJFB3S&WWf~`fL7$ylu=c;bQ&Y#L3ZlfAZ{_BUD;l77 zZ1(Ria&C=<_{+o?6%J9Se!gYRkr&kc$uLAnM6CC4aHpoNZ;BZ?R(3Cg@<)5Vva7$Z zRd&*fiz{KMa@qRG18fdZ-R0E!?E+7 zd$ty~@=6^EI=F3r*@7-(wd8{~@`JD8@3|AqmMuX?S6*EBIpvwj)Z+5}hoRN<_q-zn zsHBLpHzF!hv5fG_?sJWej^F3gv@|q_anE90l1aVORKL@5dud8nnA#YON**ghKt2)& z_2$C69#1+$H>?L()NYua&&A8tQeGzieLiyN+!Zue&S7@?*s$~@K_F-;R&cURdQ8)V zou};6_vwizK4skajI+%0V|rvyQ9S(s9a%lCbs~4`Tt)B%Z1u-BIxTTsed!X11mDo< z%I9VJTLy?oMJscauOSS%x7t`N1g2M>{C@U{xaML%>^#aQJ8lgIXgo!W6x(?R;(g?0 zC)P_pb9%mIMZUwU3RH}oJKD_SzNsqE(|q83|8KG04@_gdPHl2m8riASM1$Q-P)B>;ur?*m?3ev1iqQ{z^;?RWTPv1joc!klM0(aO zdhN}DDNUz$H|I0v^mu#rZ>4$83Z-0;N?ckxKQr?|ONy5~l8|>4$m_&_4rw<+22IX? zIga-JM%j*NPW)SI&=D-xKelxpYu+y^!;Hjm(F>B_Do8On-?JsLOQ)#DE=Z0%XsbW= z?H5{;efEQroJuZ=I|nKZ{ra0n(gax?-dc{=w;@pb%dLW=H{&I4#%0q;xlFxhB1aT* z4`k8SuQ=jSC4}~bVcCr^%afih7-wt)ChoDERm7SH3zn7hSO}qdo)2EoV*tB{rC>!Y zRFl?3_kGv)quUMlSB^Z}@^*sjuZaeapG`EwN+LD4&D9+D#yqQ8(I^R&Ty-!RI0Xs^hD zojYe?EX#@j=P8&%^v}y$2oBdPo>iTN#}VRjK1)ktbw5(QG^OC{7qe?^m_>`9rIkw+-`fJ;@~==r2ue!I@Q>_(qxJ~C zeZAA~m1g)S1Py5XQ7|xi5>&Ks;+0(G`2&=h`g*rnv8D%Xkzibt;N=sd?q}l zKaEoOX&%jku=e9&Mhq%A`=~frPef`$l%;H3^%gSl=#V%Hm4=ZLy@|7 zFeWIWclwfUolNn!M@M_YO%m*TwqeYgH{@&qL6mgU7DDvGz*ze_NCHL>R=mRFrL93# zJl>kQkKCh6T*k2YMj{{=dH`)p=kRtXD)KM7omJ}85aH@Dh#MTQ!TmVWjv$CNNK_}9 zQ|6#eTc0SBikBeo)AkGSD7BduJo4mWvndi*UH|&IFQ;G66pN$=VKZSbVb{wQTzbLM z6vVfMhK2fN;g~9j6SR`iS1wGMwZj;6jzL$)P7Y}k)tGK=$#U1XdvBm zd@CGv^P*`sU{2=k&Q{O0XH`;?j&-vsHmTTF8u{}`-4+D@g^c%BHUIto zJ6@v3%mb1yha>GlgjQE{AyIK5bRd*qNc*$r;FY$4yuKB$&W1h5D~PlCBtv4Y%_Fa) zmvZJR;i;d*S~pf zGczo}qm>vw^d;g4m?r~0e^mR^k=69fOiWTzKd{a8J>9IWiOU$nTGpoq1_m-IM;cC9 z!p>>w{k2XH+k=B?*D?`-{z+q{<5eD)l|1Pm?t_E-{v*QU>Ic2}d3@q;j&vfezK?pW z%1g=3*CrMgkK#ym6~8>HhYqDcN~fti9sH2sP_Wx}g34pX3GlZmj$p~W?)F(h1lfQM z0-Rg3720F9rc+H^>A(An7Wms5$}R#wWy>AhKHODOH`On z5=?O+YV8g>ofFTfxqX1K_!8rLU>5MRpuk0L%ADSLM3=;m?p%TfX zXXG%%8PL7JPOkNrAHrIp3aP8vViB6~6T#`Zt&Iv{mfC6A%5%4=W!0LP;Tp9kb|5LV zT$G3_iJm^C7NZ}@FVuy37$UsBVWz*9K@4?647+lW^+n)` zf)5`h1%(bcB11TH5kT|5+MS<0SuB@>J9Tu%Gx>pTRY6N@^;p#dq&U2ye5;WbVt4zJ z*Hy&+2EkC)Y!cB!-;$gPg*m?Qx#MnFvGQJu`4h+)T`iLiDNSq$W-Wn0TOUd)JuEt? zY(sQsd8-;oTHXS6>$&=+ZqsFCtj&}5O*)sMR6SG{xwzA?$hw`5G&tQ|)Cl}{Zv-VG zCo?~mcY>1gv1H_y6Q%sPA=n|MJPvKYVSROT`%{we$ict`aDN-FfT2b5O}a%4jjcEJ ziUzp~TFJOY6R=pq4sQj`(CbN)aLi``ZHw#6B+l`-$c{`DRrOUqt6wSLrO$Niv9K4M z87thB8t}ygHS9Jw_Mt+^AF$9+Sl#nV-Jc0LeqFNFc}UaVRyV-#pTkmCusv0g{^4&& zq}1_Rx6Uk`N&d5Q$#|88Z;*%Uvf0+T#|+PwBeXY%_Q zD((kj=J*+oJ3V6z?SG|zyJ8q?gB+Xf}?BSAx_e) zE9P3JmTp<^mcCFR4!`%KE#4>-&9&huvH>>GW3!EE4-qaG zZF`=nWx12=V`m+WrvBeU8zAdPcSgwvCsxoZHosQs_#_4Eo3Y}OMDQfp2djVE+Sh8U zAAZNX_X@XKeIA&uAGrc`VGl`DRTD0oMr(kQ3!U5#b1zJ%GVW+ybYrocUV=26t)=Ip zA;@yvQR;@O$S;PSS2%|(gm9# zPZ99&b?Kpxx4w^x;ZL+j(hJVjloOB8244QqnL{;Q0%csC`P@0^*qy)T%mHPiJqJE~ z0F;$X9_6!t(umRI)D+-k-%WfQhcv_E+QMu|q8A8T`IJ2;{!%k7gwaT@=?O{tSwP%D zQ-=!_llIE)Bl)}pLoB<_1 zvs;YZq+NyS%52FcF&0TR#vUZX7)(#Hn0vWDxSthtpJvzcbI+J0aCrqwLic||{5@xp zHB$3a<^4>`-(CX5_|ag8u2%=I&rN_Z_k=V!m@b0z<+HRbUyDM>%*^cY zTBV_a*N}Wqz=aJ_GK2dSvdiSF-dBmZ!t0Z@6D+Rtiwjif&XdL|9DrIUesI1{X5u)R zderb!Y#Rt8m3Ft2XvP?c3K8pkn(BeyV&Sw+%>UH_X!3h#Tx}*rrzpWI79{JS;6Oe-h*y*plXZSt zM&u|{#5{cXQE6IoIo~As;d8AzeQMSKCcV_yFhna)!y3=NCZ41o7a{@0JF1|lx5Kl7 zJ&8Sf)4x1tVLCPhsLgK_-&n8ZwaV7Y9hY(c-ksL1b3=i?9Z8!eBDuk?2^`)UFTnKh zYIrYcr+uTfNZpT8PZC=E?;o4`*l|l>G?;!kJmm5{?mcfHiX#UTQRQ_+Fp=4OD(IIG z|5h2*Kfd$3Poime0}>@)B^wF36|)&R1LAxo2i7_71naqPA}TL+#q%O|Nt3m@B1AGV zN>CO~Rl?%qLk9YveoZ9-g}gWXpR6bFc3~pS=gT~>t%Wlm$D;8j8}}kEP@sKg>W>k{ zTi6mpTOB-64eoh^VDIcM+lbN`kgrc{GkCIVhT%r~-0S3e3LkO_-ABo@#vbQH&FBj` z-=Ch8#2@>Ula5>%E4tgAx6|;Rqi=sZ8XNYs-h^4My5{n%*X6MK=$tEf_9nBEAxOO$ zUH0@Y@)iXe1}%1%HOg3U+zsohF(5VQ5u<*tXY+eG{P|bPx~)&4TJi80+sdY;*?Zdt zt?{~OjJqtq9wi2QkT7_pqDqS>!`hPXt%`y*?6yTKN?O^^-_YFiI2KYjw@z)yzo5}bfBStJFr)QU8DqR!%B!DO;jUrb z3G=7d@$vgUtuN8(YXrbSNd+S~$EAB*tG%kyMZ&Qm`PSl(Wy1FpXVoj&ZT><7Gb6HV z3qZfH{hBlg1ok2nOicG9b}vsI^-EwTUDgFDRQAB7GOD~}a#+<~xm(Q}?;9%lu==he zNc3d`iYq$NwG`KXs{q$fAB&(VHmSk6!l`B=KO4(g6WSSh8JmQM)g%S$tlc_ML(#xrn~m}L^F~!g~>dgZam;WRNn(5M{rc)U_-jP zJOZ3rEyTcdOObdJCP?*R5e!5;Gj?~(d(C#3$FjYM+=mUfI1@9^8A;#S{Yv^t57#Fa z(KwcDWQ-(Q!rDi1^iZBu&Io_MN%!7Z|t*Y<^x7w12s z`e8M`6lHw*cLl%MW`N5(FzuX$ywF|ahi<7_ANkA=Shf5BJlS_pdD5&U(xx>z6Qf(! z+@RU#{(bJx8oW6Uem)6*j^4;RX!1%}%)1b32gD(rSN`{Hj-K=S`^09Yqsu|ejy9u5)m$O9!<3&#o zRkd6?&Q4yo(5((;dNY$fmGUUgp9JBtxs+w6jKr&c%OXI9;9~Twh)pP!=nhke_m8t2 zvN>{oG%J@voBP;aSoY?SlCY=;UiWiwl+V2@TiTl(Q3*BTO;Jf4Qh3O&F49jqX~TkB6^-NiV%SO?gdMV!=qZhz9;Wd~CV=JbnAGg(>C5PA`+ zr%2|EbRTMC*o`fJ-ATg|)bJ1d25ZiMr#Os9t~s%GxePgY$T5a!)6nv0J|j-hR*kF> zBvN%*?|18H_2t`pWGn+Gt(SIc_qvjllF#JhygmJP^+@Y+C)9;hGIKJ%zk#BaCf$k$GU}8|YLW-J*u;!diuh(aFL>kvheF=L zJfCAz?sy!O_Zf={ z_r~%$GUuZAs@D3htIG7p4qpg&c>*N!ehS=Tfk@I0ap5WD917xhZeRcimf`Jz2v7-- zrd!#memZnT2nXu!!QDXwNl+PbMsu zNqS`^Eg-mfSam>};(MX>csMr(yg%9=XN{-p9T|*<4`T^I*xG`h7*crL@0ES=CIAP; ztil-3Mi2uyrrus5Nl8g{Ao=`ezcKpn(`bLtaSHP_Qz#a);;ifuJ`+TO=IH9O{G%X6 z)ru%G`fXHVU`ezj_`QX7f?n4YgXRlm{r;yPp4H*&8*%-Tc6&T8#)jgwa`$Fx*z0*a zyX(u}oV0Xzvc`M+rj)AldG(coX^nv7>Xd)Wx}NxbydR{z+fcX1=uiW^gTARD9NKqk zh-!R-CYTJeF^+MKs+3O1DZYd<#^I1gNypF}A2&Wd1b!u+O{mhn(5)lBSMk*a2%X$|#O)3uEq<&M z(B;SybP?K%S!^Dc3;(ZeBok8l%R+rYtw&>!ESq4+{j_|EcXxyoVQ3y4zKSL&>=c)f=26@hdiqF+ zsBmaSVz;ikxU@K^_U^GFzr@pnh?7*)d6wx)6Z;lE(>60r3^UCmW%aG=-}y7WT~f#X zqk2(nC)j3i?3op2w5=h)&wP%*!V-H`ej4bcxDBcW`~fOnt8J;Tp+^Keni2TPSD*2()1;t3Hl zO=xxp`k}l_2hSF@EKiQoVbEq`O<7?UU*4UYcTtF$v^VD^GIqqD6jRs%x;oUNHayT;w9_(MvZ$$@ISE$Rd znxYK#Dh-+ETUQ)7@O<@C4tcPXDIQkwzmTnp6IXwNh)X$#x;HF`OSGk-$L{86_PF9a6a1 zZWBXt)BprS<+k#5jp?^(SKc{^y$DI3_Z3zxXL(*RXj2irskw&Q6RUv2u6GbmchL*8 z3;zkO0QFa`<)odtWzpf>Pb}pb(4q75H2u@IkdMLAKn)|&XoIWAm@*gTd?oB@>LQ0x z53%e`@hDaccl*)3RqktJ2nb+1`Vi?E7BUDSS+?5h%*x5e?dtW>$HVSK(hTnv@5i(w z!Fo^5R>@D6%+twWy%LEBf>NF4Y7=vcDQ+BCS6~0Rg&Y_d02uU<8PIhkKXSASTs>DmK^;uL_34d@)5&sRqVqj(i?cMb%-z4-uC zW?p5blSU&Unp8r{0>AZc9X8Z+QQ4DwM3meDyTZaD8I$VByEet%9KrfquaIS7yq6e$ zzZgv#@3cV2z*vZ0j>eTCFo5URM4mOM&7C&I;&P+}f)D`{{mjgaEeGk(;hBGL<5S5S zd-AOSw0=cG!2oFIfB1-DS7fUYGm8j&YL{b92%pWD5C#yjY^P=ZA_jwUB5(O z{x;gTrWfz>OFLR1A-e2-Hsjs@K#^Vucm#ILS!B)jg~t-lqH8i2!x{2a((ut9cx`Q& zugeSE+8Y#}9K5_}OZRsNwo*BAii<@sl(w$r!;#7D4LrI>9I<%c`HetHIi*K$|CSqI zA>VkQ`$Hj5S0seZ$K)-~b4hLABDW>tqbSB$-IgepecC|*&jBF5QBa!I_HGEGP?IyF z-{0Q{KxH+IPRGgsZ6#*f)aZJ51b7@o0^S6KipCqmddhI#5*B>2MQ9Qz4mLL_2x|~k zFeK0dzxQrMeNSU3%@&~x zN9O_)T%SPrPS2|>q*M=k1I*i8Ya62LzSk)vt7$II)6P($ToT!rj*JXIOJbS-n-QxS zr0FH72td29hSVYC(GAk2l3y}tbFLZ22pIzi&zIryJNNcSd8nDX!xqyY^br9ONXfbA zx$|UR-Z7Z}u00*xXlr2R=#f;ck*wTg_!ISl^0IPG)#~i6E$HVkFsQ;1oxUYb(9xyz zBN77NG7r7c$#VH#w!7CCrc}P9UKtOQKkFyRU~J2(S%|8c7oYH@6<@l}+JcsjDUGN} z10;=&Ik-pm(6va3Ls@@s1mmgdl}}esNm#cGohJrP2^yBDrkcLDP|beR=wxXU zpxso`Z{OgnNMoZ)2o-(>h<*132&Y{0n!<;X7#m4fch%Iz@KMBcsv$%$yGh?`fBMix z(MgZ!X(>sk>W=h$AN&`8fwZ7x;xzjgowi?jp1bv`6+99jxo1(Z8S{9x==glARZEL~NLS$xHRI-b<=yjkHr ztF}S<)>lG?;c=|~{T#PQ+v@f74X!c%F6>Xf+#P8Z{^M-mfuzGN1`Pf6I{ERmZAX zp0+D^oP33p+~vI$ zn@F;cS&>U!`qL}|V0#RSX&?%-d(+KNMm%!)#rNCat>6cySu^6iDwL3HVS{|{ zdseV>Wk26qjm5j$O6PSayPVfXfN|fMb;Sso&cR`l6`_e|5vtc&gCzJvj3+Q_7%_2U zV5whd474zGv%Sq&ZMH^Dk_pmToF&AJV2R;1ey}S%hAqBd50#j$Sz0LY0u?TZBo$(Z z_k|kTnk5L3n8gg>YHaQLA&@JaB$zcA`>0=2MtY+isHjrXNde`=Kzz3ZQkcp>F@Tq8 zmTH;(K>|ah)3+C2ZKqs5za^$OSXd(?wLh69WpB?6C~JTm+WD^bA|ezNlxY$nYY`Dh zz&=mG%p8BUGsI%QD-JLm)0hmQDpaeE+XJ$9W&JyNtbw4;lC#nMAy?9y8;Ne2i8GIC z9K9E#CRZJQ($GhUSPx%4_O5%KcWo#h452PQG$-FPU^NjqDj`5?UmPr*@_)sUvB;ld z#;|2aT|^wa>U+&FsKtR_yHH3*FQUQZoi)SVxd1YrB>8Yy_$MX>HT`-vTp* z+qve8ZG)jTlE<;N>^Hfq*yY+$^D#dDUq$= z{It5KCt7bRNc2}NPR-SOTGkp$w-`^Kmg%)CF*MWQf zo3|ufw^Dl&fbmsGPY_X2ts+3zd=I@}16Sp_l4T**+`0-pzem@hU5zimg-v&UdsJ36 zk-&gm5W0mw#01*Az_*Pq*zX+E5<6XS@O<~tujXx-w9VFhv=ayBqhs`Kk-+f_k&sW? z+M50o8v(fJfjKg`FK}xSf$yK!aZ{jH$b>0uG#1zds7$=K3uv%(=uQESpco>UOrQ5B zTHW^4l5Ds$7JgiqFJDMFInw~o4vT8>p7M2sPWyZ9mwE}o4@b5iENrQfV4+~DZ7J90 zNQBdh_{iV{ z$A$~ZC?OE6YvwM}CZY6Wmw^4QxRu4TKKdh#oERzV{iTXI zSiO&wy7GkUbj2iJ*JNXCYqaYrWeB?@9>s|p(4(Bv*sMHuwoyVjr9iv^6Y*tME-tQN zb?ur3L*_L9<;NDFlf-5=f{~Gtq1Ef;5&uh1L({iq3uN$N19Z`%BAo|&3jnWr{h+6% zHTFropVB{(zP!y-rUnOnW)YD>+4Lwp4aFfvAr4?6@m-yNef@ExE=p`%!Qq?y=O=4y zG--68ed`vtCptJ?0_O`!TJ{t$=HEQ#!(Ry=%^dizo_JiNcU&C&;}EUy2Ss_U$5hnn zICBcL74-D(^5hK6B$%}{lY@w1oQ97^^odGc5E z4EBbKtFusP1mtZ=m1V2cHohttFub$*c*#qoWeerWUv5V*FdGiSx9c+0bP;%}y#qX~ zg4srTu_cxCQ%O~8@n6$HIu!*i+Zjf9likuEK-9nu0J+<`bAQ|O!NHZ=>3(M+VPcAV zx;b#z9Y*mPNz4g{ib%nS_70|S*9Rudo&c+R_uzwd=CbNVfjtE zR7rsnUE6+yto=Tnwd1)DiGLS3^xt=N0ch^>^1^OMXJ_XU0OjfKs2T%H#CETEujW1U zcX5Pv^qGWPQf+qk{IyvV7<3#A>7C6qeaEcXozIi|sVK%+GG*nNj>$;eQn}$}n&d7# zJ(fH(1%idn3+lTqT9z%7&=#jMq-!L-jmJ!^X|kJ%C{YZrUHx}_%&Rb1Z{&BN35p2& zKvadPEna`&2+=@0h;MK3d^Yuuog4_Fc}B<%01OB`G@m;J{zy7+OO;~$+LoT3rZz+t zLE@IO?xXo5j?jh`l$$rABCb0zCU|le^^Cw2EJ2!a5JKcD9=E+644{AeT~DpJ)8yve835d7Y7&j?LfY5EqdX^7|4kS zQgFg*4TltUbSBQ%6rE=Qybd-XD!Ax;vChySE6GWQQRW6u43Jr^^ z%lyF`5*QRDs5neGa#RoF3i-%#`Ca}CEvbC`vHndxtVF7r+Xe>cp)b@Qz6==zQV=h{ zHb2gZF|Yh!h8IIRKU7tsq{HQKBZF)(bf@14knv$$;_Kh&&}?-u#E#Ys8$&FcIS4s-EB>e)7IO5W=ku!5=VvP<{2eA_4NLp4|7ftVSh62tct!?$k+{(bz3E|u z1dMprxORZsts2Xo@CIttPx5L<<|Kp5i5fV5Zvj-LTWB40I7m63tA4YLoaWuCDG$5# zZcXM{Av9V<0`{Br^oCqxoAxUxKphD%zn;ckc-|j(c)yEcr^zq=rb(`88gS@I{VN?= zal-bxljY6J7ajBk^BFQ07%zrF6S#sziE^p(e7xSgJF98iiHN_+h-VK0jiAdqqcE^h z_Q=lo6UT@0!_918mXH6PI!Q(ZK8%-FE>8&%?ik9vE7G5Op><)uPeE;yd;?TB9C**x|Bx|g;Tk!!7bYIX-SV=D!JM>C?{&F z{U^M#(IUBBD?uxG;E*l6E}C#+lmZc}zVk%sk!3D9&3AWqce>md5l15Sxv?UbNe?7~ zd5>2I=D-g*Clqqo9VV`DeXqfL3fvZ74Lj$R}dH7)A{*bv5bb0VDkf%@cYM_B8b@tlK2vpg5&uX z6M=-$6?RUu5gib-2hIqN3I4%bG{G_vbKtk(+`?|fQiOXloQVNrAlHUD@)<3ciNcdF zUOW4vk299cjy_L`QhdJruZuE883G=ntz*IR)RM0#f~HmOt_r1V2QkK-?C~-UA*sV) zC}UaZmj%bvCwpqyh>T!=^3`uRf5#m0lVtr`Q&6I)Zl9#{4~s@sSF1zJ zYM^NzRcCJlWyJG#S`4T;`x6;rK+Qg&$?B!Z@$7Y&;$5ib50JR{b!8QTl{9x%xmyLD z|1@@@p>9=jz-!->H)jq25KKPa-&k24*Sd~UdQ+JU0Sh)q7XR8nh~hWva4pJKL>?yy@j zy!rE6|7lr!hZ2q1c{0lYZF!yLIL22@j*vCpjjO$2A-4nM*WbTZZI+!a?A(g8IB!QC z@o*dCUj^%ihPsL%0iA9~K|J(#=>y?6zu9#gU+xh8sdjIdoqJ7&{E51#G1qI(xWJeEWfc8@hF*ct3r047_0x)0w{>0 zmEnR4h|F^JD~;-i9*X9wi0)h}E7)v^W!hCXwe7BgVeSWanC^-RqvWVB{pQ1G&Hn-a{nK@x> zY;38;jwA#TGQt+f=+Os`*?8Q}<9hRxV!-haja)j{W}~xo&Kz*{^YiBbs-0kMz@LL_ zovY@`K*f^J9Tvj1*|xvn0>Z7??m~45BQHp_BLu4*WE7aa*8Z-rDYLl&!OZ;*8EIjX zu>d9}gttKgQ3s&lIBj8Ep)cS5CBPV2(3%s-No7NllO&z|X?9y;)(5$y2F*#}&UiS{ zzj2Vt2hkH5*!Xt#pl6z~CoUweCJ+7+D`_>7>G0nc572V_=QTbRI0=DFm=LVSWTDO3 z$8y4WL{{5UD=~1M3Ddb6-~I41S^0S5Q1Gb?x&h(D1#Z8`Y3aXhquuKW<5}9hrInfn z#H50Q=gRh!8{^H~1{!Z(U<5W6L4_0$$i78VDfY86?4a=`Q^0-G3V_x>y(1vN9!XCA zySNED8^PW}PE2p!Ve5?j&vfzPLR}Hjen$9XM&JNYS9XXNJ%4`NjE(IB>O~?ZZ_YV6 zn2&LGk5MIOAX;Mqs-E`3fS28U0UQ~GUmZm$#>o{i<)S(g>Bv3|_4a~Q->{T_j!Soa zUR+8DNT3|4I~bJd$#d!qlIips?(hpD7hW8N0VW*<&mS?jYbw1?KMrx7OhT;glX-nt zR-8Vn>mdc@nW@gCwq<5PDe36;0Ob?R^#KfIm1@Mo2|}5$N-0nZ+jVVHhU}@ivJgZ1 zri)Hzfw4%vzF*?c{u6O*IFm265Gg}k7~DPBga=$mpgt!JN#h#-v!3~^WuLECX&4m{ zvoKYXq<+hzyDO;yQ`S$*O_SA1X;l^3OyzDmr{8AFEZOyPNEGQ%S&L~MXvfz~`bX!s zr~(RYZJ#pO1VO(>iQP6G=W93}X{byVSLZ^_T zES0Ut7nlvH?(Nqj$Sj`rtY9sQ1xyn`xJ7BRt@HyLGHtFoan1ZhvirFQ89Y7$7!KJS zzAWI}n3E-5s2Wz9sB0NL$&%tO2?C_rz!UOi_Jxow=oTr44Ux#?AtE6ibo+q==UK7PsPJlI+CcxmNr}t#iDqUCm)&kP1*)b2$%Lh@q{F8#(kNAgW4Vv~E{ngU zwuH2^9qQX_eEqk=KJsn;;R}u-;c;{WWbn7H6g?cE+j~7$>$*;v057x*t0xP6r?!=X zzOWG*U4A69WsA=lWuP&;#|%0J1>h9__j343@`Vr-K-Fsi({3Q*`rrIKfGf2M7;ejf zo*K;I?*qQjDlL0J#;+zKSNy|<$WHaRz>Ux^OxgNV7i;RHIon^6UF(4hB+jD-!DNLG zS{AeYMTF!oO81w{Ulvc_;IkJk-0YJEun+eVzd$Uq2ztaFLYuj(yRW!?&lba+TS65m zE#^&e4{BOe74~Qt)kGvJQGyhVHh z`!G!Zf$7$e&U;=*B{3Fs%iK(SUXRJi4E75OHbEPt6s_((zIqhODA7J3@SqQ%+5(WT zOK1lSILMlgd(D&qB;WO|AFdbIJi2T5Vto8pa0E_MsU2A-+hSeAmS2r|djogftUCEQ z&h3C6{*>l}_q&>y>?p5PqZJJx7PcL1dT=0?Udh>lol4L*@AwFSMk43o$pmuTL$v9S zwFQb4nSPC96-%dWKQLe2a4_OM@?PF>wKwh8h!1X`*`1TKLWV*Th*0x7TNCQ~T>XFR zRpdAWT!C!&Nm3nE`ALWJ0<_0ZSl11Pd0O*tWSDI}oSXdIe zUiTP2C!TBPN+rzpQ-MDAFN+kM>TkSl5eo{cdIAM)P=SBH*a0P@tM#TeSTv7B8&}G| zmc7rQB$j}$bk=F6w}yPc6MHYYQF*0F-vMI>C1bMN)Q1z$C&C}I8o(!nvSr2)H84m5 zk|}#Ye5t6eE)HzE04p8`Ue&;6J${goAK+7>r;i>VACIn|q!+s$U-V5BQGmGB7HMZ0 z`1Zn&2=q&o}>q0uAJM{ z)Wl7A#X0u-XWt{xAi1~eMJW!2wwOhRTC4#BqX}+(p5NJGnCe%d3mv6Wzs4o<7t804^^FvjEo-_&GCOPBq7@W z530&Z0pw)?IVAE53e(j+%|znZ=m=jKf{Y0)opCX980NZd{|G1hEIDsE)Tp6i!gE0; zlgB}_z~k{A{qm_MZE|h@eZ8`&$dgRYFxJ)3#J%pXh*?jLwbZoXw^*qahz$uhwi=0B zychCAkqSFNw%am(u-(h&caE@A7G{91zN-&H$aQ9kH5l+?Q}q=Y;&nwFaL6?^eQoP7 zX{Y)R5D@syyZV3bb!qX?{E*^N1XdO6{xeFXRlyH`JX%=hVK1cdah3NH!ws2-y%r%Lw6roils!m*mbsoL5vm=|8&9_CpzM2vMyf;*}jL z6pZT+Y-SR9LdUzKzwV?gGH}6Pk#4sn1XIV0PhxneJ~T-y{d(ewunLI7R6KVKvQXvI(c;zn;- zfrrj#lmu`;9iJ3Mh6I{I){`HCUb+HLS#B2{t6v`q6l@3tPqpw+d*MLAzB_p#BMbjA6BssD?@C$!?{UP7Z6@XhUDt z3du`Ln_Ztg4bcihOk1yoNCq$nf`6H-x6RF;@2O3~V$K42sn#0!Afg@JY!1B~_Nx+# znc=Gm)wxcX^xBX0tb!^3!(}}(gHU*d6#f053-Twh=#*ykel?7ayQbP7x`kG$?- zq94f%E{M8v?qxn7PuBC6H5m=s+kg7a6D83cm7Jc)c+y6`w6SWvrqbm)MozZQ+h>A7 zLGMMQKoM>n7k4NNvm}3^>3c7F2l2{#cHcZj%y91zHaV@xRANam^W|~ViM0)-c29)I zdEUIPcd*zzOXhi1I1vmbBnGC*Yq}ni2UKJJU2O>q;5h~Y2G|IFUTb|cw6*an)N07N zxnCLv7ry3rUc*lDK4fZVmu46NaB%$|ux!_DSb#!1T?#pa3V!qM*@^9*C2(QHrpbn$ z_@}Ho1>)f!L=vET6ARQ3ydY(xj~R~JkzFM)(~uV4bTxGeMNfjRSy1(n3=+8bl@l9| z6SL9J!zL(UnHZkVg+w8>7Mh<}7N1=Rlra?6!6wFINP`09OiDz&0J1odpn+quW+HVE zx2+(|Nq11;PfVWC-SHegF6!9-^ndyPQ-{+K%SN<>md@LJrm^AA^1cvC*W7do7De4L zRB+$&w%YJUE>NW;nj#sRf7Nhl_f<5xW*B3rw|k%wD=oLt`BOmGdn;Lt6oaTaZ+c@} z*DI=PmcT#kur-Y3n0_A+`aL9st*!jc=cG}R94Wd`FCH{T&FJDvw27dsZzZaNEK0Jc zUl7HJ9Cx}LGCFBdy}2fsTx_%15zxtuF#YLv&D1SF&cdVpt?vQ_rUM&?Gl&=pqCYnu zt_n8Y&5Cw#$AV_9te|mWwBx54Ua^uLhG#hcmqu31sUQMv&nhLvEGAMIoMAmqB#;SN z`u2~As!nTAK@Pf0Sd3_mG*h9t}XJjzr8gcKWfRdX#$`f)nkn7+Fwl z6-V|{nUv(>7*N;5!NB>|=`>pUkcV8aISHOAbCJF6ljX5haK3u~Y!=A~HB>h-CgT@SzLa&xh$05RmNUc+07~^a4U`vat6aW9I>2*nb#MT=00I>-y*YLEGJHm)$SWz$TBrT4 z2mQY?4GY-{k^FfilWtR|={!?@l{ec7#eakue8i?qgu+7zDI4)f8;qBGvqCp#VS4is zQ=cKDoZI5SaVQ;igR*$i^vU>LC?%0`2^*@5=#9m}JAmXBpZbop-INsD>`Z!&{ELYq z`VmvX>!SCpl=R_d-IZ67_q_kq2QA4Cx@kEJPmdcaiQex$1p?ZtqZ;ZI0lIX|Ct>+@ zAupgiuj3s=M5~&}YqZ(dx1-J%FbB>QKjuZqklp34aO1h0f5!W$SkqPFD(@aj$ME)TfRG^NYHOZop~h0|4N zo*LpzlN1*)2O84xNZ)1KAoEt4^l5%UN_f~9Fj~Kc2LZ&YNbT8Zb&sIPR`ZvCd)KWx zQ`F3Nwwj~u>v|`3QVLNGt-BnRG^+X-d;uB5AMUG$5q1KJw1rrlra=u<3HAxDf5_rD69L>Xh zG|%L!)VV4^B|t-`Y`1z?GbDRy_0s5}KM&v*32lD7^LrfN6N;pLTs_=dx?gml5JAL# z4fjQ_RlG&NQ&zs6k>3?y)Lvhp%O;vIEKuMUE_>2PIn4mwi%jx+8RTgpex z)`r`dQ?IY(Nt+D8VepX!<}qMt(;DJNvk)GK$~hm(dJ1*$0`w9&V0E8=oMFQf9iG^YF?Lr&kX>TelI`>h{=oxG0??LZn2K5kv zL^aM|Z1Ai*kt7hT@ss&?G+`AtDG!QPDdk z9>rt}9ABiD%ja9xyai6Bd!bij^w|_TPpD%6d&!@IDdbEZq*iMG*ne84lLS)WVt*Kc}n9UY=gOt~qI4{uBgok5CGM{%9a1bkhVB?7#{w`CGa)-m@ zj$t7(hWWOH#?;Ktog9RaBfFeK_=ETa87ZG)a__P23u804oGlnD{!;M%qO3o3wDCwW zb@LKj_T|wab$a73A#n6@4vNSIEH*j4l%Bg9ykAF6IIo`lu*YFb-$+HusVZk`chu2{ zeno-6OWy7jWiTrY7bVUgYc!T1CJFUE9RwC6N=;+)PWg_8-tFCW8Eq9LDy|vn&t-D~ z|GRy?KXwv!=+car|AUb+_X#3vuA(@07Ph#oBnXmT8h}ubepOuf)eiEJnbF&Siah?+ zFR9Ifs(PA*n9g^EGjBWtN6MltO^!WWsK-gkpv6*~6rqY-^|X?Vdnso+O|aeGftX4IxTLqQb0eC*B!Vj-x=HN}r@=J6$BaZKFFPA&ujwoJhR z7Z|l4RZ7A}&`i&rpuz}9zwR*&pNz(#j;{wE^sgHzi#wU&No`*%;G8>b;p^8&yJ^ru zaR|oEGFng*Po*Yhs)On~ku&$F#>oujA4f}9r@Mekz7_xHSdp@ zi2tlX^yL@Tb$M;-mH0vZX7))cDLpe(f+Fz7Fl9F68uZ|72-_oU;NH*F2~Kh*fqTtZ zeb+78*u6eEDahtV;hiM4iag{o4x8COBbZ0b`O%dWl}aT2ho{}Eo@K@B;50iQQ3CKU zW0%8arAFp(Y$1=2!-lWwZ(cD&ZN-P+ze+Y_C1XtzasXL+rJ?qxI^q)q2xQhTuUwLG5t@2e2F2ugjP#>n(GQNy3}qT_eU$HzxxR8%2=X=uaM zwpBt-O&y+`oU9imUl^-}ow+Pz6bc%oom-~T6E*{alkV}5a~uWOSw6!Xfn_5|tYp#W z-s&?I$fUzcjzhaCWI#)=MBKyIISi`MYpgtZZ13|O(9r|6-(NC%6-K;Z)rR8mzx&nN zv1ED2@bplpGHR{q(YSH4pw|(R-s+IDWlW?>cXip9qJ}{b=5!jza+!jA`;_c9M=|_; zC@`=~;*@6pA# zO0>_Kj!_<_74OmM?a;``;#l>8zAa0_M!dVKAPSFUXza%%0zwm8A*MAO`&Ww-!J5Z0 zUBX89N`VM1DTBQtfyHkKW#gDuXHX^MXxvF2`*{}6C}F~~{kdXcShtiv(_9o>PO&S0 zRYi0-=2AT&dFQd1j&5u>MO7CE?p&;Hxn=`pC04vl{e{nJzzqZ|-8@#js8H_#y*$=5 zGF?+LxkLKp2n_&(m;LBI|{bg0E$2=Vlt)$q3bKfiFzCy0GyQWY6O3PwQD^ zR$JPieZ~2l$4_oeBudb+%nyX(MsTBQ9U?bjyrkN%?EZE35}A#@`BT|;OEuOH%@9a< zW5*qLCXTeu$rqJH`MQz98=ft3BF#v|ER!jJK_EYx-x~^aEK`vr;>=~0&D|_iT4%q1 z9hVgPmSUeTG*)FpAYwwp-{@+H(Mg@A#96-HVj_#mCrK5g!e#As6Z*sG$y^J;?kAt} zcgL7?hHC4BF8)x%x2cCqp9lDFz*|WC5L$&J0!MqrGw#lQ$q!}Y4?no7sG3{lrU;{% zjN0GFzM@@Gh?vyhnqi6qX}>gP(u!gImLU1KyKV{9|HAZBo>A*MgNJX>#$|!Y*p%`q zCsCj6f!BcFA)2GrZu>;?-xhVgSRgVtc_Q#sUR%atB|k=FS8{1dOBkbRz3O%pVgbkU z+5l1A_zmrQ6@vf-0Q3XJCOyh(@$&lk%L(&9GF8`EQEih@-!H zIBj+)kai=`KJ43aV4Qetq}L>Jnc)LO#Jt~B!IHL&0yF!Pz|ScL8InqzbwLHpZ4qsx zSAwL8O9WkT!h}b=e`^yEc14OcPZ%v6sT795A2i-HL|x zE894CruEl1)*1168k2w6X;hMz@17}=0+p|rW^y^#2F!&1x-|!l3%WZ+ zDZ0l_9&Zwsfze%)RKH&Ty6-X{Oy!Qy{ygb{S$`o9Iu2&Ztb9U9NKHMw1Tix^;&eEU z83&*)Zxxpyu(vEM7u%@xcxq8KG4+i4jY8{X`s;7xNrnS!ybC-%`i!Lk0?vZS&y z5;#1^0XFi6d6WXTpHRMT=cEi z@aj5Y=YJa;sfIf(UUM~{SICkBcNqdurWB&MFw8)I{bGZuyT4SZt!2B0VB5b6Zl`Qp zWx|w2gw8RC6TdYmdy<9IdKKnvvI)(81PkHIiH~{$MG6Y0=@jV!#y_oi8|ky8pq9b4 zav>U8Ore~gIcb^E@dfHT5l)*-H&1)o+myV8?iZhx$Z^skjp7CAy@G(iyd6YaH1gD`e75N;Ttz6Aa{ zW8jI+LR2aTHrzvO_qEtyB`r)X4N&X8%^X7~te+r}y!=+eHBy>GcmQy)-j=GiVH~r`%OycN|S%;Bzs+Oy{b+N;y_rt!36ev!t zyPNie(#!aFP@7~^HN;_WQ**{FG`aOGXmESO4*A86;R1AAm5Jx7J+NZ9W@BFF6~xux z#ke7j73j6!zu#i)8_{mojYIOn5&7UhGy9D)9y=wi*4v?~EE9tO@j781V&2`YS1Byt zoyobW)#M9Dc6MHes7#lq){h&9N$qtxZP1pscG9vPdD~=b@(Ve0vP!y)eJ0%JzkWcs zD)-!=Eim)g!=)InE){@){cd~oh=GU&;tlj0!*f1xty_9VPIdsOi@``d8OW#N5mV3e z%7li3mAE3T#D;gqs%|k_h@R2dh^_#d{d%goo>Lk5wmxz!BBc|Ruxw`!(oHy|_1!8_ z@~3)naPv8TcZC$QdLv!&)C&*<_bmh|0+cr|FHbs~C#|OI9mm(>yfx%gnVFmW{t@Zv zvdi+`_`yZ`^Xs!#H8RAO3ynX}*K{&Gr4m+j?UY^7U?DGisa_lPS>RQ>!BlK&hg8Qmk#TM2C)RnFv*%yjlx$(MxIA6?W zE?kzx=|>RC7z3)4Hm3^sHsd zedT;Vzs~&0sQH?+h7<@wz)`J-xg%lR-rT1Pm<7&rt@Sw5Z00Fv(7kXcD z(m;3uB!RVR48*HGKN{flDTuL;=SQzno|UmEY3X#&$JF>;zqF>Cf*H1}->)I_)O%e< z6X7nso;~8>2B^BpXauGDJ+xOHDhrl{O-uE-JCQBXVMjj(*2bLff+km%eI(Ig|4C9w z#Ni)|8=+8E+WQQ}q89x!3Z~4z{YTFy&2uqCv)tCh&SR!%rgnUS3|QjnUibEKf*g(dtopi-Z_uKk-r&AVL8aM z)63@3UJA1J?Yn$2a#}?t69M*qEI?B!Ok7mChZTXi7SgEH+84E#^RTRkTxnUO-IEy! z8Tcqnk}#|TN8TAOFgP#)rhipyg1-&jy}bRw$a}viVp0eC2%G+6&P z2s}0=MGT;HYc*RN&lF};ls^Zw!05zmi>2Y{R_C;aDGcEnr zBsfrxNFGC0$AdFttjj)8q#*&76{7XuopkZ~s;JvZ7z^LLs23ZOO-HPc+>)SY$quLP z16YWK2jZ_f62Z~SRCb9kZ#0had6CKFh{|h%8ugS0NRf}wKsDjMYlMRu&FI>ezvIQC z^?ISl#<@ckKEFA^h&|odK+9Sq0j~hQGf*kZE&nXSuhxmzWfm zlNT5W0fm4Qn3F?DM@NUp>z+7UBG-0WGH0&Q?#cwX(ddAj>+N1teXz|ZD@W)Ju&{3Y zZmq0jB=A!aD1VTb6%(%QT`%R5rnBxZ-Sv(T5JlkieqG;wG`})(L75K*ZezBZF0%u=(b_)k- zw^(^t=q79qKfJ)H0Rcusz^q7{Se=(a`52Aa|6dvR8E@J0hYJq(T;N5dGJ$~lJ{U;G zh$|)lqo1{@e=8&AFe5;Kta&gyb!Hv-_+~!rFr2tOVZT;;u-1eSni0k2ND9|wB%~;e zQgV0OtR9&yGN7fC3Yr5uN;G}DB(Jt^m8IWkU|K40&W&sw`%(vT9$WSr`x17Cxm>|Z z$h$1cw_=V z0aZV>PWr3G+1_&$uw1sxHKU-KauTrB&Z>V{dVJc9i?!{lhDQ5Jli#Ebp`mVk9*lr7 zj70dYAbFC!V!@8j%c_a+V*L+z>sN`}roDUTv8IJOeO2Ozaan`?RB@o*saqb1f4lJ5 z{WD@YV1E4aRA=IoSc!IlNYk`nIFk-5dqZJw%Gem<-U;gx%G=ZmZ&o5rSn0Pw= zkVDODDW`b2_1({=aFpsxKf`Fq2m^diA=}NHRdvC4-X4Pnu0a26EIj(~JZ{+ZHirOJ);H! zEraXqnK~+XJxHnPiMz>a*7G12uwiz$G-SmA;&efXxVX|+S68jAs#~_i7QG9arC5GLNb8X`Q%j}TUH2MQgqvIHr*KJ5?% z8CNBdv&{T*{f@y;FY|)ijNr2-VLKev5vXz0d~&^B0Q)-m~$V5GwD#})d zFAd^?&0cnt2?bm;4z8QkhMueOHMv0Mzo}-Kdk-PWVb2*M8xdq$bPGNKn`&}p-gMKC zFA5_hZH+cFX9d+>XrQB@!cS8`A<`7`607gDRc4>=MLS+@{#&>r7HiHJ_dYBBlt6S`TPnpce`h7^&T!#vFq7HBjhIPo358h?U&{T$z|aQ@6)TIsY1Ed6 z@6)weE!~_j>eFe|unIW=HN;`gN+E|B=iGjAb{8ZtzpE<;fJ^8zZ*)cz018w8?t&Dj?GB z4}?XF9qG4F7esypu7*Z^ae2S927 zn&_a}+T+#EXNEYCQ0cg|U{HGr#JD>E{^J5=$}OBp>DNP=xNheD%8(!3szl&SxVwtN zJv|^svpT0786$7Mg#CyJQem{Aq`~d|CT$?eY+((^rCO@8bU-u^7HtfNh{E}dyRBF1 zCY#q&7MoNeT*n=JCt=%B^&uH?IKorkm{1-Ov5Za@Fgr!Y!CISR-r8TuFX4zj$KTs~ zm9<#rW@V3XK{h~}7AL&-`lUWEIysyk?EsbP%8*a+C?&k<9(n;RG-|$F1)^VDsDE?F zjQ(TX5d3!XQA}?WnI8nqfI+avE{hwN=`Uw`WtBT!l84Rl4c}C@uJ!R*eOEMWZ8o_+ znJislRuqc|<-(kkPq660FolQ!mZGs3Yi(y!;xhgQGN(1-(M>jF_rGF6J-skFS8WDE z9uK$*$Kk?QJTlR}jrU1AM0EFT*uTXmsVxXs3A2CQ_vwRVvYvyVX-aLFW@fB^0mrac zFQZ88%|GL!xiy&rdRKR4(^yNu_z0=1M%cvmgNtoRk|7A9<@*R?J)Mm?+R*J&GBrFo z4Q347(1O@t-5DEeW10pdO`K|$iE-vLcpFH(mlvvrTKG3z`wW;QPKs(ZP*T=DLJ+S4 zl=^l5ray-9ETj`TgJ>ox1GBjQ4_9viR8`pR4^tu_5|Yv--6$d5-AH#zcc%!_-7VeS zE!`#EAl=>dJ-qk6cmDJ3VTL$|ImF&;ueE;F%Ua!)%0)J^S}gC8S2y9zXSUqScRqxr3XAU@`Ic1Gjew8iN>%TegbKW|` zp^lxj#dA-;*zY^5Z9|p#@=3_CZfqDsR}}TvuDwUe*-t#RW^%&1{QOH@gVRLbS!wvq zBg+j7gp@LLghgwt2b;E>?eoXf3@&8;iu0pF=cVwT@M*K$f`WosCnw-RrzL|vmdX($ zO6ZC116=6!Yt^;tz_hdj_$RwpZV_Bm`uh5CNSHnQqq$c4q?e%tOE(LcXuoDq2`qB7 zNo7)d`$96B*Vc3a5trvRtEM-Ca122G{ylcrS(gl9z*>)yF>>E*jM?+K03CWU7t>8KlvkLU>@`oJ`I-dxSCn575HjK6a^#@)??mPMhA3)B0)$qI;l7k3b z7L#ip$V2$%BIQYvqle0?Zok{12K#Oeu}GWW#?Y&n^jXVG0#=8)p%E$4QSZj`wZK4n zSI7phEX+*4O)@Ikl6(NmJ^EuI46n@oNR1+<-__v|iwwpvlWFRFl~mSNU86s+z*IBc zmQ4}uMXI(g@nr~Wh~l_RUHbRnT`fC>9nSM0%J~5oP3|JDtD^?{N<%=&_yk_D_YCQe zRhifq2Z*A@=f1W{Z+lwg>yN=At52!Z_0~IbwTbW1vj{piH>F`HSw3Q)p#+#e&+k;u z)_9IpHtpaUaIo2a$=qkk@n4bP?`p?C`UkZGVN-KVCDQA~r@3adIm;tbybkjq6OweQ z5cHSW2mSM7N^;#v+VvJ`1o5ylE#19`S#3%`TyqR4f9RhbV4~i`wG+ZCgimpgfESPx zgKlK6_Dl4UgggHzP~B#7B8tMokASnPt2<|4vAn=rZmSX<9sL?YR$5w$$8H1ig&_c6 zeH56;7nGE2juY?9%4APeSf;pmqM)L70P^*~@UY=hgDoDHOXSr-&)T~}r9l9bL(H{% z^M-}}J27>2rV6xy1GI+5e7!ZH0d8++*)tEWRbn`$ zSE7%t&uEb>xRuzPDmneUD4y1aobekEJi2Pa^tz;rBQ^H;oazx*G3*XUXu~Tld}1);oPl1*d5xEM z%?u;S+0@&LeVU({^ z+{RXn;`uuMTyB88N_pHgPf92Xj_70qodpo*T=2>7zj@WW! zXT>bq%+wbZpVOmbpz@HuDZ4|=euFG{j&kuaz3Fi3ew2f*VB`b^W^DNG(MSt}w z5&CmJkRu`)-;Jsd9$Y?NY(Rmfm72#3O2QK>p4p~9L&yX!T_V>oHM@M~R#w!yA;n#` z@<3{L^f0@Q?-NG26OoyT&Pl=g0Y1L|Ki=&;C^@Cl>~gVB(QO{m5bRZ4FvV+1JVW|5 z|FE_Mw^P~cxNW;Fy^|CquCE3l(7hQ5L?zWYlS$}03cV2T?MeL2Qz_EP6ySXW=K0bU z+6u!jlPVFL$fLN+Qymtbla9wIggjb3NR`NBL+sSC;xT;M26l@yoXNty-Ex+v1bmp$ zYqOdwE7Vbaq)43A7B-vs@uND)i+|)&=xj}9k2Neu%uLCXOVQormr5$9m2*{SaQgg> z&o1G*Vzq_*h!~ODsfeb0TF!kjr}-SG$jK{=GM3u>A#OOqh(c%MdzXxxAazt!@MU{5D872LrL)_1GP#n(42VhWFVFUj zm1oCl?;J*~CrO)JrcuRpo%u2g^Wy1J!Is! zwtO;uGqK7%tK@^>bUntaDDySpk>xZAOa(;Ww0atgh1D0Jo zU0ul8Y|hTAWs~13%8l_MK+6|{k|^wUYV%7peMcE$0JM;yk*IKRTuqjkeYnnx*BAJ1 z_MEdwZn3;ZD?CpOeE7PL5C7`zNe?DZiy=um(VM=GngMw&De%VTOV&8VvZv_24;E@QF^zsw_k|4=Ii@g1`J92Sxbi+3 z2PQ?_diJ`lGHakEb3&PS)hx4Ctc4kgkSV+Q-X`8mXfnz&w)D3CyB~dAcDRH{g}Q0E zjVF&0kCz`zp;p-ejd92yPV?^K_4!8BoSs{^rTWb2?$HhXnT}Gd9yF|(^?;}kx!d=J z^xc$fpedU(V?k@b>U3e=_$q67&FEDfr<^u#a0ad0)gcmUOw&gF(OEM&a0C{*R$;I; z;S+RLlAAV#PE4YVHsJ&@bsjPr?~W%E-`hy>PcQ{W1zjLJQGe{YU}^qO^PV|g#8|#1 z?AJ&BucS9oSx73V-d5}hpnU|(xf0_at>qaGHS-t2w*qkr?uis zE;e7i5~PUF_mvV<_EqP}D!Dy@MJi%uV_T*k~P_C8 zg77ex@-LuHpN`(DV%K%<$v5#2htIjZ5Vy7bx$^s_@<{S6{4hMdzyeKj_Wl0lvfImc z;jkKN@5DX+ansq~l@u4Z9nIs#&;COyLZ|#Ig52@rUze2wb%&sUN$k9(XZ*-oUDb4> z!?!5%2=9~ju(xa(V;XNUe@7RpG5*6hj1Ir0^H63U(eUw)R51w&$L1>k z!K}}>BxHj)Lfl98cQ0#G|Hnan7^-MrxhzdhPos_&Tuh@JQC%#FGeTF1P)>5-0BAQh4{5!7|y|fS}WW4@H z8Z>208jEs+0*SFL>4k;OV(^Xdh27P5CRa!QtTW3=P?I(fyE={*-^n?-Bnv(01WFa< zfl*hvLr6M>{f+?3MlGWbAB$*|eRd88rC66tiW`YArLkE8^Oq(yESCd)NG@9lzn)j{ zN{=gN=`XaYnWvg(e&A8+97qT;GNK>p*Gi@=JJ;hOPIzp7s4pWYhq9CAoWAkUiFO8! z!Yvx^*3z8b2+tJK@$B+fIHlI-iTM^<$o{e&a@j!LOWkYt@`i8mg;^I#z1(jAu)r@1>yZtMt^`(B7$1^7YZhxNxei z#WgK_O#ag_6!`HORv5RpVFYI{R4I?VliXp7&>Q>%97Qw8Z9D5>@`v*?*WM%29cK?e z1XJ6fcrhilvR(RY$GA_-#{UB>rQR!9#nUs=-J+0F*+Fv0GWNzkT1yXxU6Hho>w+9_9UevpDLY3pK^hjc$B|g2}znww-3@vD=vTx_=cl88M_% z@#2}SeOE*L`QfR-T$#j~_Pm6i=}+-$EHfF0Pax5!4DQ6PHYnR+Qf4Um!Q9xXT`o*` z?dPW0)K~~WhjM;y>?nFb!ly62H=h=9ftuETX=z9TCYxdM{iWUAZooO)A-~sE|D^mivJu07kyH z?;@H@>xmby&#uOQMgkww){J?lyYfK?KWjdalLgz>rGU0E~dne*-uQjO=KnH#ezZ~og~dNJh`OQS@P%^e)eov>YLT;T3nS#sku0zcy;Vt zE?6nvC8VN#31gbTvXz|W>GZq9#}ajWe2IWX@t8yZPJOw-T6P%KJ#4Nd07^S=yQO|c+(be_o;jJ9`&)nj;;FPHheY13_nRV-tM(L0cd#AC8;H&OA1H!%V)E>EOOv0%m0#%&F`p^ZdWcE-U0+*UX}QR1)qKQ?gM;&$ zSLRE^PEKz0x7wZIoq(t}KT6^kbLEJSQmCx?>T|A*5!FDIJamdxl_lC5RZ+c!e|g)+eN%c|nkl1jiBdQ$!K$b=* z+aLcdtfW)EGwLkYh3Bjt1iecgIdi*N@lTT<6bL*`3H`>XkiQ%{zaS#`AVcyY3OkgrNkUbFtvV$iZYMjgES)|*AtwEISw2xeDJ4?RZ5Ev}yS!YR zkR~Jzk#y_*s@p9&7saQY)hWD&@567-*PVk@AYQqiSPb-M5$WMlAOB{iqcn_04MH=Y?Vf z_mgpG-yWg$e-r~vj>P-BN_GUAzPe1rQ9-EgdGT(+JkIoNij~`1u+LA@k00LJjw%*c zCQFNL>AR1dY1N=RrRt1SrYTu!N)5YuliM9yko1i@nGteWvE~k8U7HRoG)51n=yXtU zAsN`?Gsod1Meu^M_ZP#u;Rx%i1%gCltoS@}$+F5xU0OaIR7-79X#F!!qi#bTJ5vQ17I>;H{J z>8rYWi|ev&Kh}zJC{=3|j@UqwE=cI6%p;7E!$+MU*IFLbIjyyy{Vwvw79NPP;bk!V zvwoqK_Iq-YJS`j`P90j4yu>Kr$ksU>w4Wz0zfz>;bQFX7F;4=EZoX9R#G&CmwBY${ zS2-2kGWDm|_w!css44BdNR7Q(hONzsQIPxI;rRY*lTSioUVy!vhV_jY|B&2jVje zT$%JzNn_lks|H5voQGUbbO5m^!=;@`;ayf13#o+69S)%A^&HtvdZaYL*4>Dlzd?f`hl5oRkzg)GRT<%S3(U0}_|E`d0 zvC?SsXq1H99Aap{RDHaql9T8ehOVC8?SB?S!0TQnU3ILXvgBBhhImsHT=8EnKqJu> z`KV+A0%0SsU7<@@{lR7ZVVU}JS6lZ9d`!yWdw1mkPpPz|IQsam`?~Q~im7>9<1DqG zR#>>fy(oLm1Yi(E#kGNd9z^W@L~9_;kE7h-NyXYM-$bN}C(tpkyPDpi@D@(&6SY2+ z5HXDscQCR1Sa!7ke0oH;N|ac0;f?qsc1loFhi2a&I3`sIatxNt4JZ@EsY?Q5bJ0fX zI9kM3HAEr#!R~`)7ADu1#{Q9!Pe8!Ay={Dbazdc_0VIi~Ij`*1loS;erOdm@0>cNM zyG^uL&;YE>z!WLue0`-r?JBBcp4b~UEZNCe7Z|ozK2VusGE%Pkgmk!t&Y!J3}j_I0abJA0guyb{22JT+;`r_qoU;QE? zWjv4SwT>RASYx%l3|!uz{D;~8??d5m!fDB?BIS=IE+B-;l!=o9V3MbUqaVEkdr>Bn z>WRT^aWiIKj>cH8A+wdgh5bt%#@qsjP9b)!u+p;&3lG0wBo&mFMaP$`J{=*AdU*cb zz~r*86+V0^rsYx}gQu6au~TStP-G(?gizy&wH^9&9B3$bTUN8ZjxhT8NqVvlyt*co zonjwnt;xN5rD5Lp3m;?o71l=OJ(enYy%2`t?CjpnWc|d`aiBQEdd7I!w8*i0lQ#p4 zb6uY8F_ML};ecyIv&yI86}l^~vXKz!uS71Yq9Ji~Z8T+}f#B2F`UW(9CELer9ryPV zHCug5pMy3klEctFuRn`dA9u6yyn_iT#hVd8d>=<2p@V@Vy{USJaF=(nal0O=Iy#_8 zy?>?oTyjfLy!Y9*^+f5NeL6>=5|sMSi)-z>Cck=>xCtwp){IUwe706EzfH<7L8v^5 zbWoy03*+A(tWdPGne4_MC<5UWqH#)lMX7SLR`~SdF8r22XIS-Jx^a=ok%#`_%&9iv z*3SG3jngzU(Mp7zHwWnF!c}Svj{e%53>a^7*#{C2Ji`1{OZm3-U^5}D(N)w zU&J|hll_8FW3Bg=*?Pt;{>3oiE|smGi}7d>3^;S?JS4Qmp`w;Ry~V_^)0Ni?cq5Wv zU%RoFedw~_sokteXOCUgycm$#Xi$}-+hdBL9H>TG*1|hjKXrCSIh%x$^5U8}@^aX? za^1wa9MV;W{XDA#h1Me;krL4ICx&y`1TV2vgkX^;#Cwxo?|Zi)y+o^jhyrK#9?1wX z!e`GRecQhECc2i#4Uc1-%D@i24Q#v_Vi=`5jMM%)NhZ~9X0)(-vxSk;VTtxI07r5x z)Fyp?G#`5pAr+Xi0bnCz6NlJLC`v1yLuCl@m{22|?s<4rEmvT-4Jb~S5J0g>a|r$W#aRtchM=d6`0n{@aItq|euEPL0M$0Kg#ACxL=;wR#lx zGBvBkEu6L@`?P5+(%TlGjw<_`8aHg^>BOSu1rZ|o{hiDWnu$cs%NqcT|2t8PT~$J_ z8x95STvJW_oYb&8vP6|hRKX^yp+E0#4gFth1Ozok5lL>$Vx%Ocun4YRVxIzwPgM)j zTP7Zw>AElJ0NY;nGT*doR7@EKEiJR>y#vVfx;x*(MqGv#0HH>}09r^`7!?y!1lWjz zxNrUpe@S3y2tq;nfHobQ!;TE_`)}{>?Iwh=-6jGB&8AUiwgFcwVai*!cN+=tUOkSn#4J0d#I75=rP`8hxSQzwymAv7h(_ePGI7u`;6_u4~)2_noIQ zU>nU{^O{a$;>ozAc9-a`eA!Qkx>lIKF+(VZ+Oxl5-8Bb+DVT++GvMuW>~OUX`qk73 ze6{fJst!jbk8jxrTVbW?AIsvWb}0+@v@dQ3c=Mysw^phRmw&)wT05lM6q~au%pUSo z|1KO6ig`;A?Up@#bOwbjrA$$d?3_5Pe4TN=MASwDnmv;pqqX9F6nOe42gHm`tKUZs zt6@{#%%e6)Y&Sn>dwF^KkM6hi=|cX_G^`l$;+EdTCCX75D7wCia>v7SvW;Jz?IJ`B`9whx08)=ZTtOnQHxDr} zF>oK3vHL_$Znx~HMNxl03IrfB-)>_FR@pY@4SFDBl^kzT)o3waoiPbq)*#b8&c*i+ z4nUD;e|H8=^yyQNp0Bo?+_-xHFD2Wu!z9?gx0%THeeqwR+zKEhO^ni*6pT2osT-Pi zqUQSHJULL z54jrFp{~DNX5^2a^>VAiurLRu4#3;1+3wR(FCyF$oe)=bQ8ZxivBuJEuRd7YH;&@p zU2!I2d%qFv9P80RJybfjQM!CXX{5g`I(u@{vAz*Sl&P*ERb2UE-UmY|7?u9xt!SVd zOd&B_jLH)cxyD`LXzxGF;)nB$ApY4%bPsNbPstGvE!HMvfLv|^M}2+N^Cp<3Cyq`> zac(Y(BL>|AU%X=$6^pT11yYFqigZDC={O?aI&*n0$|yDE^rM6tb|qwjT+v;u+p<&E zV;<@;CqdXVkwQ?k9ATxVQks)}Mz~n!u7-%dd9h0vb(9z!5>j4ap&%I|JiM)$0R`xm zXv$kY0K^cP_i?T25ra=r5$!dP8bqxDM-FddTH4T>ni`hp=h;1n*H#l43?4UZAmu1f zot>Qlwz6F#UQiL?ppI+s2NxWdpGbnIU4eN!wtwbTFptw<)^zIH>q(QdB49p1;@gno z&u%dNIrxLUc&pjh=ctP%uMC~xp#E$kbY{Ss1yS`r(PXh4-~Fz_(vu^RKDBi#B0-1v z|3E@fl23YvDoTV+0YFbfaA*BEhJRDkH^c_<+RTn#R8`ODWB!EU0%cC4+Kr!fgathHZz*3;5v}~*LH_8v(%{f+ zpWbpq@sFM+h$V!XQ{C2vu$oe-yxc72zD^J$`z}3FLglt4gC1l0}##>J(T5GJg5=qGUVOzG|x!lb(|9Gn3hljH~$3KqTZ++Jp5<+eQ9X;RH?&S;x$jKI4~ z+xy88jUUs8KP-HhPZSDKKX++1ay3 zMZq(AxepoH(y$BgJ% z;>^8T`2ji~XZ5hoQ&tSFDVTB97N*!vj;6aL`Fwkf%K8}!#DZJ=k%Ev&Ns!BS9L1Cd z7?#Z{e8FZE_V975+adWrtR(j*X+q+0+cbsZrysX}Xae6QN*8V`BH%nr$F6>c73J}l z+LvrNaZx%K!&z{?+zL2mbJb|d}9?53tOgL+Owjb4m%JV}<%GD_hd*vkLFPKY5eHN8F>FJ{n;K z30&d_2@gM?zFF|musk^G>``7Dl6fNg!;8|&Z%le0*B}_2*a3CQR8ceel_d*;8NYIB zI^oYnVBa&M9PCmMWlQRak@S+<<<)s{&;Rnr69}Tj;<^#N6)#sQpHVEA$%mWF))JE7 zXqVmi%PkEDBefS(;T4h?ivIA!bdQje-HDJfW33Z^fVZ98M&7maiB2DLe zHOo=>Vo&s~=qyZ}g3N>&HJjeyHp#(gzk*T32=;7bRNV=0T28*a@B7`A5SjZw#Sd!_ z4^1`a@?zp)$}Fa0a0#K|d{oX_ofM1{2?tJ6>)o>$V0)07{3N~m<%tyHITc7YJ_~cN zZr=M{jtO1Q|HCaL@zP|Uzlat~-1Sm8J|AvoXRxI&Mp)hGOFk)>h}W%h+on2~1gl3T zoG?||c$SiO27c2sie+!Ii(a07j!H$h6FbaMT((iYtdiLf{Q`l^wO9F4wB-Gmz1hix z+=@>6AYFBc8wNiN3FC}bn}=(A*wHLdLB0oe8rR9cZ#n_LS=RGu z{=qtpD*wR4zZ14*2hPksym&8MD`msNbV}u7w4=Gv zWb;8PwB0vKo~2;&8wz1$5YTo_&+YcZ9!fQo8Y)+3zO2eB1ce5{tNf1d`|x`(YuaWh z+Y6I_EFzALg?9T3z;ngnk`Gi>R@>sVww85dy^Ua>B_=F1Op1Q1UJ&=~r}J){tMC_D z_$tjq)O>tLW#JLv3wzc|9*m0$ghv2LmU-G=tmhc~)&o17)366!|4@<8USz3pLgwZ3 zy?}tw<;}!17E#Q-!gN!xf#X;-#u+1rygvMz@`kw6w}w#?JJFmMrRbkA4@#`^C@`;? zBp_NC8;k^izOw7^Ro}n>w7;?O@d|2Gd2awv4>Vu=C}L7l4(GSKRQ8r&pMprhm3Vq; zBNB$wbG%%}BG7CHq+w`SSbdLo7lp;eg87pmG92(W0dpWcD=Yo!TtQJ$k9ypD!DNgU zN`&a%duiO%mB!|s?(DVQk9LPW_oSnjkxMNI`28Agnk@diG@mB}Q!Kt2$32R<1#Q6- zsD2lr%pNF*($oj&EVwKvdRU&fWrFBGo+nH-Um)(4#b=XDO(tfC%HvmOwVM8;ZND2h z1*(i;o10%V+NtvXJ<&D;tKtng=IaU!+^D-WCM#2_+tNoGIT;B$kRPyZT)Cj>PqaCg zh8QFZWD#ePy;2X}@;*xAnbi~oYg!O*{>PA+$$nd^s;cVVlUK4$@^{r}z+xFC z8FP1S;L)qX_LG-c8GCycu<6xCyVPcPyWEvE^F4;=JnvLJ9h5t6%kvo) zn$2CV`N~1)nbKVqc1DmeaQF^L+VsG}$zruF4SI%L+r}5KsW;-SgtQ6 zK7AJd@l#9zQ2+%nKh?Xk1aA~p+_E$>7;ATBEEp8$GKOW^m)FIkG3{vH7N49qScf@r zucqM$M9L!Z7ZKMnZBLXqU%SuiIKD+lQXN%B8QvZF!Wt3E;@)*s)PR$uM4M!W5xP4v zjXgZNlh$*}PXqHptqqOQ_i1Z?eS|D2;DyWIt!ci>zv(OP|(o4x|6srS%XD+ff99Z zIKHH+YM-?tKmU&yY(iYz5Q$ImbJ1dCuV<^JXr>Lm*c*_B1GudW;MVc#w+#Aaho%+D z8hU_?T#Rx?fM8S6yaeDq4`2{rs!-R*hX`77jvbI-hgyv?TJ!g?HZTcC>r0!*n#bbm zbw(}eANFoLSp(E+;=v!ad?rUPFY}xyr+I_d5#CiPHPVx<8WNegbZ-n#N}&*-g72F! z*urlp8tNI!W`i1fo_u}Z!C;`omL6*T9zI^qW8u7evi+MwY?>mlykoD`xWM(0nwrYB zbH{Vz*&engGKlq7UHqme;m-=@39gR;Ts+xGKT0F*yY5q@j?o;kI~P;jrT>Kg6!j7mIba9_17mZ!JK?k( z{}?kcI@+sWsayR-F#2y%gxWup-Vw3Cg!t=lpnz3=p0@a?INc)BuZi!cN7sYvHfuKQ zuMuLSl(1qfk_q%i3!n84s+5b3fW~FX?VxmX8)314(EX4p-J`0MvO9e$nYzK$mAB|9 zjZjsc{u@eWxag-@xfvIPn4|iT_FP3_)U4p&EmVX*YYi#`zWyu;%;aLz$AGk3udd}B zesr+I{_-oW{XrGtzOOYvBx%XaOYbNlwcu<_Yf~rAa5)Y!^ab4qM0aD-s;(vc8UNrf zz;9?s1`IX8*KlyS%IT7%X7c*=SW|$7Fc6!91pr`leFRv)9p}7eT@v63X6%iC2SApj z93?ssfjnH{{%!a6rf*n-S|8#3V|k=}cVRj=!5r9h$sJ#n7ncBZ#~3*cTW0ebSU)yYJs0hvh%uOG7{mL zF{X{K`b9`p^04oWH*q2e@f4-<$V<1JVOtU8cpY&wfxK=+B<&bk?`Z#f9{tbzC~q>Le*tzR%ocNu zDtJ&3AOQy0{;%krLBq`cJds`QIbXWD{XQErH6StSmihv-o-I1ZM=#kPu?|1!xm}C_ zA9~c}|8pzCzUAKXFnpCE@0(1IV!MWpH#x{ma}(m?Q@`aFBTJuA)oOBB@5Qx#wWgvE zDfEWI3HyagD#G}Eoap3a%is^u8YI`U$kRu)V~?kpC=!?uZ%ncKpM50fDJ1GX|IeR3 z@KGFvj&BqxO-2-?yqM3F+zI~lc$rV)@%)-ElLp$(=LmwqkCSScL?f}Wv8O=&PytX- zpq6j}HVv;b9=|97+b&xqWvjeFRe@~bRWE;Ul#W3gk||q5(NH3Vm|bV?5NTP{u87ac z5eBwX&%a0?O|qgzK9md+QGZ8d7Uyf;x^m+N7(`B8-L>qx`bj-s_5{kukKzgRT9HFf zbFyv7bG|4W|86Gtg&v8qcYRS#x%MOQgZoc@QvUyc5umAk<*#(L?Y+FBug_cMm7|z^ zLjQ9-r$5%3aDlV+|2gtead96+k@^4kDMFjFKG@Lz{X|G;lhAj-n9rKJ@A%feDgV1j zey{)?@_lvy@%dX4b(sJAEBgHJ4{{q+NFQ(?O;~|*ZaeqvDkJrY8N<%;LkAO@oWJ4S zw?3tBLL(j0iA5om8qcmfB>+hBr>0FGFVQRL+*qWuW?a0xicIekmY!l&_XB7)F0ADT0}D+N3SFEV?DPT%p#4 zE|9m{itIz@Lnwvoe!KkluGT7iB-N_QSY$8Sth$N&w}^5%bj&fniQL>tC1k73`xmn+ z72BiBN_Z&HQP1i9N(%R@^J(j{M#RXGu3O$o56mYg-YCUScX9?-Z@K zu6fEy5~#l}{Q@>V3pJ)C>a~M$d6Rpu9?&4{ZC5Sg%%K~bC{2)$58~nGqGavUNsk+1np7Hl5oiK1|&N(i(@e{AMyvO^W zA1NIt43~H^eEP{$l9wT0?he^`4+}1v)7I58g}yI`B*Dgn4Ss#carYj3*a_k<8q|Q8 zg}eM_f}q>rrSa^;a1Ie{o+&(Hq@t$LX1?dN32nba$Rr~>w_haR8%JqnR=fh@@+JIO zHi2S8m-x}E75!SpMZ*mne$qHcMO|^1&DES#JHpxFa`Ns) zQBQ>FBs&)#?3Ul*yGR53rxaRhlh0e-+WVG2G^&eaq%{A1%5td*GQ*Jw!+Xw(OGpGf?LUdjwo-0{}$*BRq3rw>-2@ZTU2b02HidcEO%CZ;|3R%W9_8pU#8d}S_7+GVfX)xcpj>fiU(Gi!=^5- ziByCkb=h#)&sXp={sjn8=PpjanA$)7s!~KR^BChWeuD~4PgHWF8k;$xifdlT*%VVH zt)pA$%#cMAHU5;`2!URDmzbBOsiLf_4{K{s-f32_vl+d^bsuf+8$@7BMZEV@4rY(> zTY}u#LA}z^6FeRgddIp$5`8L&z$(`-E47(^f507o%Co_!j3Hm~Px?mA(5}-hjF_?V zty49s=cqBxxqVCcWC;VQb4TlC>JyWK5d;Kb3H@Q@Eu_uXF7~MSv|BD)l10m%7Nm|9 zwSh}scnUdL&HU&~tFs?-Ym#nlC`H*}Z-rEv=<^X4In&L>M#-wq#?9Om^+#l#_|99N z^mzJuX^FL%3<(!!BVwoKpE(5(1c_1qzOAnNWZZna$QYB=Wt`XC2%MpET`yK7fa=(CewR()kkcbi!_2+`7EMtZ~Fuxyv3D z1qm)l2)TyB=(zgB*Pnj;V&Bkh7=a=$iliMQMwJkMq(;@|u}v}HDQpDW~JUQ$RhN|}*d z8c~#amhQMb$@e6BsxVX=*>`q>Xh zvD3ahX5xK!K(m0(7hJD=wp_cI^c&KXB1Hd9LDk!@DvvATan;N^ zzH43Avjgig2xn+>O5>@l-k=XD;T9wmsR1K}SL_YQv~#PfqJcsv_RTxYM{)y94o(33 zfUe9zOOZ7t3@m6tlLq`7m_7vg2?ik90w*?zJejm$P5K=WC3U#mjO8;BLy@ge$PTjC zo1KoJbpPgv17GFy^Yb~dZG!*}5>H1*2Ra7E895BPOR@(?p&fw16pxm@|dX9)X?s|E;;HredeTsqWc|7 ztJm>8S0PiO_J~#Pf0}~L6aW9->vPV>Cso5fm2L;*Es1HqI77fYX`m^XLQq>`cGzOs zdN^8JY?}#0ml1ibiHecg9nQe!oD(T6NI_-y+5YQ$p0kuLt)VBj`tv~fQ-NvbFw5{p z%PVZ&sxX_xguZfTnDp}&IW;nO$h6XrvZ1T~*!4u*a7Fub?y>Y7gskd}ytM?$CoUGN zl3oRByJx{ejtfXiwRUU+VK15hvQH&r4XlgBy!3}kac^Lvye@`d@-NT(k!ALTry{BF zTyF?)-bFP0O<63RYf6nbQ3BzTsu{M4=G^{oq&3<8T6}MeHJNf}Xn8QJ?taLlJr*zM1{JGt?>PB4-<;7t&v{*rpY%ay=3-B_2cp}r zi2VkSKl0YX6JFWGBlsURsY0RO%SvP~N1^(#GAB(PIB`vLoFy2$svWSUjzXYE#6F!a zIWB*UCGZ_N)&*&pb_h5@@4qoyilOWA+Z{Tc2(R2IW9mEe3HULNRW9E-+ z^^HQ3qUh2ZBkbzz&(@R1F}+o_Ww_w?r~CQYQfi+A`_qZBi$_XYO_2RlsNu)Png0#Y z*0nk0Ji&VWMnElLvoPjd)ET(yXHib^{C2jsTSX#MM*nH61smL0{Sw&ML();Z8ZT1s z9Hy_Fa+54zc}84=8Nyq35#paa{P55f#)P}n72h1Zi$Cr7A^N=ru58R|mm@)3%lco! zKWkTu3ndk`Fs?+-hqlq(?jbF!0zCFPwWj0*=OrQk%<)<|{Ic+kJnb=-&(9>E&vhkm zWzP&&C}@Y14(zsaqu$zEj!}F}@c8ug8@ih!2QEU}W*2mXoVAr!iHCC^wA8*EDRYo_ z1ivirQ_aB(h^4b1_>?eSZ><9sM?ZS>*C%Cpw<`MxNU5j_!<4;nNgT*UZc2a4y3y&W zuiqCGeXF8S=^NuDDJ)ZbJ~p^#kylmSjmuLmhJ<^M0W%&MiIT9z_x(F1a}r{y@pOtg2X{|bV?uVdm z8tF_qm)s;N^77Bc)B6%MG&Bb_7xx+{1$9j4sR*!!Gbk8l0`%3{)^c{chK#%?p=9k! z_R2>)J3ID32wnw}#0;4~zPcfUnU<8Yzh1I$wA-w{qH!0OHTCgV_Lt^@dSwI0TWeRU zC^5i5=r>%UM|z?EzNt>~`OMHC+35R{u%R&GMf>@L9lJK{hNe)p0P2Rf3*8^Vw;xs?oz{4Rr-qMcN_Q}@*vvh87Zh@w zA+0Z;2z{Iit2lO6v^}-$Y+ilOch}Kpo4WmWb-f}}x&hnqRu}PG`~9*k%e`U-%H)GE znF0oeMnb*%s9wG8Z7HYLNwX$bfKP!TwR2gPT}p-dq#4T6J(-RJRtHsUg~rGxgD1#* zJ%SM;i{$cTg+zsSXf~#Q&}rBYg({YeGy7}Y=EF<|rT7iib!gjwlAB-7j@)*mEb|}8 zm18(U{o;baFP=1&G1pZoODKvTC$up963uvKJXr7Xb7Ygw>6?|745(3RjoF8Iip#$`{SV?5_kT0KZ{FT~(mt+x6y9^t znN~G+P%CkW^(0IsafprO#yD7@TV%NB+D3Z8Y*Z4@&W#6|oAP3Dm*IFLTinMcf*n|~ zpWU>*Da>v%+2XUm`NtF;bj4a#i~TjWJGq~Eqn#u)T1~1F{gDSIplfs`*fFt0Iu(sO z{F!No#d-q8tfOjc{w;ZXf?=}(4e8A8+Qmg zsLRY}%QRp88o<6Tal}~LZSNDH3e8%%r}+y(sYnlR6v5vW#ID?oqIyy{n(mA9Xh#k2 z@RA2-7I>V_n`F4=(y3K-(;NZ8%(;Yl8@c-Vvh%8IZYiLY(^!rqf6+D_i6^21nMBzt z3xFa6LUuw#7eIat5D}(`E&u|j<_xv>o8D`Nol(gM)S|088{DPpU~`6kgPuHW?UyWE zW63@(CqPnXaynEEC*(!)S+?2%*$PA;z6iMFJm+KWJsvqvlI`7|nig><_M)jydm$an?Hav*lWKrl-z&p1NMMa|O z_s(G&KV*MM^L-qDPJb7*iu*niD)rqk%)f>5=t;xvkU`kGS=_>kxr#tE-*!4k1^7w{ zj;db2r z#M78Y!*fz;mX1q-3vWd+l4Hv_GV2ULNqfR$KSZ}|#8@X(y+jcoSZJiFB?SwA31dz%k3T%Ocp8V_Twr1P{34K=2 zSP^LadA?8sy9*o5d^EHohaNW2IaNwNLiE#_8Fu}^>AglWkSdpJTT%G640$g?gR1^U zZGhimtn?Ef742iJ6A_Xai@WR$+EvJlRfl>s>lXr_mW;sx9hHv$MsD#G%(1bXW6S#E z@VmZUXBB6t&e-nvNcp;+ZI$1en#8P;{18anDCL$hPtTVlJyXitm- zSC5O&IH@;Jv5^+wn$!knQk|)d7L<=4d?1<7T#UPKz|0{iA;wB!?is?0*1RHSe2a33 zgo|w56p5eP*-E39GC*U%ic%=E)>M-3VmV7o>x9N|(hx+yK-Z!@|rSeU8L6bSIE5_#ke0_FM?O}{^RwYcrfdchNgVA9#CkAfi?|VYi15{CgIdAlCq~$To=Zf5dZOwg3y&bzt$a^XiU} zB6u1E{dUZ{>BpBI!ikPZ!K3;kn@2j~$auVxrA~bFx3(uf$RE>Ol1z-H(S}{#dVPKD zLp(13HGrUV;(K!4!Ku>mMUd;l{6~rp1LwFgI|>xG&!l&7G~`D)$f=C@+4ucW7I40j zZ_*<0zMDpxLJj_y;SO}0F|~<*dt+NC9950%!}xnX#0tLi&h&lK#WZSWVekAZ`5MQX z?V7g7ia`m|Tl;rrs;bHXyc)xXAK;?zysWA?f3J|&WJO8HiG3n4rGt+ZkCObe@6$VZ zu5qnb#mRW@)?f=B-7CXneY1r#jJ-g45VCFid83#&SIAeL9Nny9-t-LHUzuE(1TuU1 zN8wLT=-o|)CRj?w1$;cFMDB$dv0Ta=-8xQn?y~K(44&h1m5CQaA;|xXVBPPEJG`BR6#Owki4gd}AV`1`0$LKSGX>`#lbGx1W*zz7L+r#O z{Yt20h#)CaiQn?sWGcbsq~J23$(MmKXG8>_)u+MB8d|RIMX$UPA`w@1T&WULdQ;4I zBTr7}(K0|7A|w;Lnfo@h*X`@VF?6Ju5&NMNb^Xg)lnL!v_VXrBP2tY(1E$?jn8@*x zb%}qDGR9+C>0nJ$B$QYm9wg{=e>sp*Jejr)e($@L^xO(TPOya(O zyxMHL&26^1xy`n1+qUht+U(7?wbf?Zw!gFY^W5h=zu%nx>CALpS2gpQ_q>=pZKU?= z<|f91c0*lE%#i3F5-*RF&YW9Fv?`-#HWuz1h{YTP=-%HI$FavFCgqG77X-5MxY!#$ zo2Z%>G=wEO*I%$yz1M*}csgpmF+WUXb+lA?VoZq(Z+?Eh=RAsSx{kB9_e7o)?vC9X zf!Hq*SbH(0xgee0R^$~sqBX{x!%_6_mY`uGN39#|KHDs|4IuqgA>MU%O|I^65H?~k!t~u-Y_^G0%v!Ae7D30`Ue>yys!$ZZu zU!2CjbQ9+G;e;ZLQ69wT`7`? z&2gbtVc$LBvFU10haw6KMi>*3w{Y=0(7BqZu%J8AIe{;Co5M2ajSYarLz3mm)$(( z!jgQ`;aBW(*!N3Hy71Tia0_9=LTHd_8 ztZcS5Pr^40k7=09tZFt~7%$;YTN4>Fb?F!?HtKlT+H$1N1eNusR%V#u_*DwlC|fp2 zNh^QWa5tn6x2qDJ{%)~dl$ly&vSk0BH{p;6bJ1(P5E~u8$E&E3SB=P;JxXCrBLPFI zRC|a<)Kizi_T6LD+>NpMXC`-6PW!G)RqAUAF)Y!4_zqppvyaa|!*?$X`8pvW`v*fw zdp7C*^IKj_Y@825V9q|Z8kS`=cN>a6tJrZBR;caqTgRoxo$r+sZd5F>8dTD2uMg*0 z7uE|XK0BQ1>hig9hodyDTI@CJ>1KAJ*{@qL<0~)sDIK`&u-V)h8|S26bHAUthn3kIbT`ew9`ViMZkO#CL`Auo^#dupqHe z+Fix?-cvRIBO6Ja*$l)z?3{z~@hU)h=K2G7JX#%heKD9s{=fu6v8yK4XcJSZOHJ;% zOS3H-PX?ey0LsM~0B#drWnOK^fEQ&K&>k}ph3=hovT{}2_$zr<;5q_Lcouo6ur2)8 zmO}K~0LzNfN4?s{#cwuXG3*^)?vaWm3iH#ZB8PCuld4#?j!`P4jkh_=I zunbbk{fxpk)U-?Rc6TcmJc(#kA3bSWSS^d(0*IH6H@mylGH_T-Yn={dK>+*0YB|Ww z2x;6EP?%1fG^)*nvqA#sZChG^J6!wtr+~lo$=1uL$NAp}(}QFs>m`DSbq|e>r=6&Y z3>K(X?J1y8c)7s>4XA6vN8-Ku9=3{!!lhK5mmQ|PQ0MhPZWQ%oCic)?VvN|@pAUj-Ql{$*qu8TL zLK#TuDd$Oj6c@A9J@42y)<`S=76%(UX~ezyG}Sd563AKSUZ8eljT4lvouPg=M&)vQ z^ook0%01j$+p}t6^+EhMK<+?3!rtomZ2r`1Xck=$d`J4dG|bmds(y~CyWzodndgUG zL<_Q^z1Z{wDzE-U4IVsZRtu!n5!ra4udgbQp|_}hYYpDbHyhCuF=(`t=-$AbRnVC6 zPU_*}FwnZii8k6B)N%YfwM!bD?e%K4LLZV_Z}`OpYYIO7Inpi*(LQm!l)>%$pLrV- z2}?3wM$pjWz9X!VhCTZw?>xpSQ(Jt*UER0|v4=8}L$L?J* zEMZ|lKZ^WG-*Csc^frRMXWc!d;flKfCc&Xk8dxO378oL}7wq&Ws)3M<;3MC>q>aZv2Vp84}R03R{49K`BhWRWYTVfyH4D3tC4oZIG3U zUxvxAEVsC^VB1AE=g#Rj6TQu_LewhF{$Cimq1k z6*`18FlMM(uqc4L_RhMGRb(sY7v)>C#q0~9V6&yh|DvhY^3BuP<4@qkQq|HzGoOlg z9YAVoXR@e|!VLR_dpGsLiN(YuVs6B29h!p`AxSY{W7TigwCBVJFEKV^!I1}V?i^Xd zQC`%dtYMoYmz42W94psR;cdNAuSiAfD&<)EQ)(Oxne+ZvVpE@(^1GONd|yfvU2|+7 zHQIZd#SFyDMWG%?uj8O$WBsl<0bv!D;qc5tji^uID=`tRglxj-EeisYs(W(M5AqIA zC+_3xfVJBV6i+h9n;L~W>96P!U)+mh)Jb!Gtg!aJkP<16>R>2=#8-rzGTV6aX614& znflly4w1Y6#e$KGLLi3>MEiTBxT2?h0go#Mfn`FcquDroqR~F`zT%@N-AxuyCdI3x zz?zEtY zzI;>5MNWPvuX&LJ$XN65tRVl;>6_TB6;4agig`(yn9qw@30S05 zD==EuUSIiuXeDcQJoYSv`quZbV}FpxAWJDX4n8HT2*gwOpPK_m6tjsZT;7sT_`jw$ z3f*(6^*M=|Zn;Pj#q1D>#x_y0l@#KFw zBK;noHG|&|IL;Wo9<0+;76Iuej|zx}_mwEV@1@d19I^`dbgbqNpiY5Wm?;YBGwtm~ zn9PEug?ZN?R{8R(+^ClQYUd$Cf?P4N5l1`Q6{(X{+(~D;#NFpnr|N-?)CUnw$#kcu z_r}QXcjFyY0o$l{&NDVluLUpD9gVFX3rK}iz4A|?^!BrwrSCDLbo^L>~f?)%pzjw$=e0g$Zh(0>N6rlI~(zVJEj_4MLHV`~C z#~zA)OnmJt$a$0meW^#2>~|*Aa`L_~eET*S_+-$~Ly*^7V1xV>`qPabpAt2&`O_<# z$oDU6ZzW$o$ z9*8sj3Rw+?uJ6FbS`2PVGxEcobIh7pE1rLaui`GRq+az zO^!CUIK%LL?&2Y(WsNJ->Te(|9K^|8g4D3ms-}6RSFcz@pdFf(W(J-UIFIjcLjQ&J z6P~(Tss-+eUz7+*5=MUDUK0q;9HOqDa=|w1o>P-5g(k3CQ!$%RHbO}KIrQ17rwdyb z>a9upf~YuT{XNYagYDZ!QJG`?^i5Sh3}Ga@FK%iv7(CnR%#hr-w!=Ae+s@hHeAuV~ zlUKrDr!9IB65Uuz!nR>ANfN³G_`V_y>B2xznCs5BXP3E!~ss!uz8dST`lX2rO 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ø)~xTI-GcMMs0(Fm7GmR|>Irnz%s>K>nL zU=#q3vUw{fXXkqD?wjD`WK4-T;K}03kEy zejpsBR5FfORZXql?M&Oq$cX#n^@jf>^T&^}+S&uaQm3lwq2~Jf4ai#v2@hxUdwtA1 z^ZWGL0~a5gSozQ{@UsrV1DDKnp5PJJv9K4Ov0vwE7M*nyd*Q<1Ns9zlrYmV?=O?}! zD(fIiFsT_d*n5g5cp;pe`Brp#fqEkP+1vA@N>79`y+?anDxMOwnIysDf(e;2-NF1e zb%}WM6lNAaU8=1UUYLCa*H!o+Y>D`hXNltBZWzO0bnW!j2|QU%Et_WrdsX7#@sD4P z>-f4OR;o?e)mD3~?^)DMJA#arBdc)I4HBJnlz4RECT5~PF>bq?M6il?OmAA_~YY5?<1gnEXQ`l`W_!Sec4oH;>h zw{cugQ$p^Ri&roMyy*(#_>b3zh~q1mxo;ViNS={xe*Psbn-CT9UE4b(+bBOG{6c6V z`@XkxI$*~S({?e*adal|;-12VEefD`L@#C1a|O@MzR31l+KbGJKy-8;RZZCxY)nQi zz6`x26D|%UT=WX#;C%%)>gA;dU+yzEFNKV${EyeD@uU&%>jAD18p@KRnq|&( zqkt?eFZZ`GsTaJ>Nd#Rbd>9=kpPXMmTn_r>hCl>)QSvZ_Sa59oITmfY8b~Th=;W=m z5!SErFru|8<}&m=yMduAzmIK0(uP{d%8eGTG!*i}9q^7k7~|3b*NDc|Gh4f(4&Qik z{94%7lJG5GaHU{CEobNHddp@;!0re1#j8WugLmbOx$=ST zg^p%4Z&Dy)808xV?6TAqVazGs@avv&`Is#wqt-~ButcJy#LZP%Zcy4nd)!#uLBfom zu1V*b@>L|bu`{UuIiCHlMw|&_a!U!+~<(@dLn=KFTEaUU&;KYUhYmLRaJGEV-T3T zeqrGL8$f`glNyi2QZX~%UT7#QqXVmeRALCF^r&96q?r{(cPB^KY8(Ls+liE{MM<4p zbaP>0Vf$eLu!-&O@0&4oo;Jk8q6Pr)DBE~KJo1Cr5W76`q#8=!z-(V-fr_htPWJx_8gak zd)_aZO9PEao>{OefjhW%Bt36`V5gceF8o-NKzFdKh3d+@`TQZk6a?{RJmR1Q^6br3 z@ShfRUk_Nb9Li($TCV2l9uy4#k_X?vIKdU_rg+;;o_ex{SF~I%?t9L)C-#_(wplNp zOdfkimFg8Xhncq+OvV1L`NLw6@qoVHR zyYF1(Gvit#ZRzbh6PY0Bc|Q&Jfb zgUpZ967d~b#hv$t|~U4;?wY=}D3n4X_Kh#Z``2 zEYC`m_$B$t1YhQf@WmN<)#yu41a>s{oN-mx@N%w^CC-F^^=(&5d?XR-Eq}Qw$~a|a zmic_9E@WCw!v)%%bTrOOEL4n4WN%-8vlRP`sZTb{1*%8~c9@fZ&G#4TH!R z{n~|>GyC5~(tztb7mGpNun{Up!+y0b0U$*K#X8Zg_ACCO7g72KdN`U*$x9=RP^Wkw ztXM`O#J8Mx?tK3wVpmL}F&p`(C#{%d4)n(e#$l%)wJZ z%Tg_GXmqai*SY0vxv1Z4Jj!vRiH{1d7*_u8B(p}!spV={hE|vu(c4A8*<~7Z@i4zK zv69I=o%p%pP!c47VV8zzQ}2Wg{xXGJ9nm&^@O>N$Fz*;)?aSMDXiQo7u9HUO%1@Y> zVVn}B>DUDW+)<@tKVU`=aUO8`=WJ!Ibo%q|&CGt-=8t7-o~}p62+w!3g%hHNx*9Z` zMbqj`Me7TNl=!FJZ=lQQv08~L%t+>2GR$n&sVdjmkvEqL2qzNKHp30x`=;x&#iD1d zbF#^kaK+{%x&O8vhGQ++&r=*RwB(kseeVQ|6FpBnc39>keuae=_KS$n*6j@~bMYHw z=)`r4%J_K`s{forb>ZN3Kn<qUU{#51af zUjY3T*3uwbJPwlR;P!i-cMz$d-=f}F_XQzB20=s9rNXbunREW_)O_$?*2`uEVU{T& zCtV>??(IQ*X2p(gyCz`|-}8EwrUiS(4-T^Wl7=Lb2AWAeMr<6^$lF#z!QIt8y}DwV zxl)~u*j}CvdPAk(VpLRkDH;AMjqb8~O`*+X5UXIM-|W#&x9iM}gi~2cQFaOs>M2 z^u|HEPKRtwYNN^POxK?anDwb=Fxl>yBD7h`xKsSbb#0A0Svn20avc2d zSuU{FKMVuXthZvNh%~*N;c>|P)4>EKhVIZkZs&d4O)Y1QQq)P_sS9C;#>E=qmm{a* zpk&THXU~oB^ejIt5U(k2+JkR|nCL_NGdz|`iQHAE&vKJxj(0iW(E9zm1=2x91*23U z{QT1&{7(!*(09kLnk=0|EdbQ6a8?TN@&g`?Ll<6TLT*$i1Az8JD$uhtANey+xg1>o zV1o_#@^S;97W@11@*`~pK7Wg&?0?Uj|1uEWS^-K>4&ofJ9$e3$P! zA^26sm-dVEGer|Tgmj|MEB|@-LS=4ZYU(gxrv-BqY)bCr)2W(7_>y{osNB!$`P_vi zW{E*-_2s8*r~S?r(x0cpO=Hc|solTl){S2+RRsK3yzo92{g7nin1{)hG8WI^fo&1C zqgDs{lacCmC^scvE{W$4NzSS5H3$TjC4wUowjVH(J`s~xi|Ok-5@vT@p7U zW7N1SZA=$+hDTITdpPlQZGB&5;?CuSknq<$Q8WAu41RA#kZag!ql z*4GoIQCG^auMajV*6TCJt3Pc7ospXNeK9#03-j(pK?SbsGE0r(c6Zj~33u7|D{gqJ zp3r<~gZ- ~ReRRS+`q7b$?~1F#6{jYGvYfKq4H zf*lhF$NBMci__Qdc2<&6t05$t&z)QveQ9ZFG7E2&a%Ib*&fkBb{AU)D-v$;b(U6f( z^BOf+;M|vc((!sPkOHYpUKqJdv4HLDxzQ#Iq>>ZF_Amk#rx>0pdBJiKLp|{pofGOI z@|OtiI0Lw5HyD`AAQ<@7dGv|O%r;(uEY+AqBv&(f+gMH?MUw0vE-|nza#t!ute<3N zw#*p9GpnQ7j&X@=#OadW=vg&0c(HDb2Q1uppPc=$n9T+qWsM*W)Y%m+5r}QZe^p4S zN3EQejXij+C83XnvOpi7%AX5pp(PgmT@qnZ*-5VAreY|y5-e%(q+s*T77NRQodV%k z(?Hl|+I2w(@H!)7OIom!xuynd63v%k%@*MwsF+?e$Nf=aUy-k`d^9_qmXIOvr)06g z7fsYZj_2`~bTC^H4YanadURYG6r@J|j71C|&`y2ULgFuPRV7u2k8^e(d$QnA>o6A!caYZ5tc0{!PotHM_)%?!eruQNfWD%jk9U&yLRvYL)AHl#}$6xK5Ed$wi>gslg74f zG`4L!josL`?WD17+sQrs;ok3^KQhVl%uFUHXU@C#yVqJDG0snO$Lr%GWDh;6iO2G9 zr@YhOk9dGQ;}8zwoztAaj}DY7ZKwe6+g}+RD`4hInDc5CqHOXN}-_jyCmb z6=%)9Q%Mc@Ug(2L4+;8>?Bta8h)6Yu`>ppaxr(i2V{nsw=$2(;i!@iB|0t^*ndJM- zj9I6YSGL(bN-cDT8(K%!-R2~vWY7pN^`wq{aY0GF4I+~8^NXznV^>%jeyuc*nME_H zOiK}xhzuS#;^B({4UlF}4td2CP2u~)KB%7{$e;Q$zYh@zxi9S{mr zSmLL-|I$~*;`{%}uYh5<*9s7%3f30kJ2g3Z5GRTc(< zahBaEdzvXO8-bj_f0(b#N-a4G)bUKNWB}0HHaj$noj@l2qHP5A@d+7}cWSJyxdZI_ zJz!=95Td1}cMu-~_TuZZbE_YiDI5-DnvItFA8*ezx}6yx@2?K)PK(z-@(B{o^7H7` z)6sO}dZ!oHz<|M7W>V5X4u62>f-Zo5#6K(3~L@){5^TZWM`H~OZ ziklmsgu2sNxG!mELReE%d2CFa z2P@iLa-59nZrSDQaAZ{7V50QYoS+Adx)Z&t_w`-%8?Nr5jWq)xk+mQsq@hhfzG98r zDC=ka^{cr$ckqlonM4u6`kbw}A8qhKBC9=H>3D0t7 z#7D9B3C)F5lt)jG=&^w+Y}BK};D~S6iG`&MrMlB2t+dvP1cxdw<7%_9vaU)NTks0) zE%2YST~IX>9HRJ=BMq+4KQ%!V3ySGFv6v$!;d}}qqOi68K1Duv{^z!jK|M`lv1oo+vA_Z%9dKAJ_4dR7KH{t_-}8A@eLZU3vXr$o9bilzPh*KV zJF{f9TtZ|f>Z3h>(cFF121VZRPLRnpcCz5L#oNGXGp_BWfxsdbObmA_q?z#Q(-zbu ztEn5$gV6GGwQU|kLm&=~mD7g^AP_Iq1=~~#KO6iJlwni)W?I=sTI0-|((<5|dUz|| zf;lbiRPk9^3Iii1N7+ohd^9@*tP!ohTC-+72wA=cNeyD4Mg0>W*w u!Y@!&(Cx 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

Test Case ZH@D3?(EF};htRRG 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

9Mib;Py5XGrIYNA1fO=t)g+TIj2#y=+KVP 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 literal 0 HcmV?d00001 diff --git a/docs/_static/esp32-pico-kit-1-pinout.png b/docs/_static/esp32-pico-kit-1-pinout.png deleted file mode 100644 index 7daf96bd9943ba657d741634834e3dd5ecc09bb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 661057 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 z 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⁡hMvu|^)+p*qe(S6#bC zKdLV{{JiBNhM;EHhe7N0eMZ4)_n-%JqIS+t??ij9?Pk%n=zr+(`)7&cwpju2#^iv; zCQ~oZNoE@~+H9YT(l7TZ0EsUD(iWEN5U9xgLPlUGc|%ye1F5v5@5;Y?t4P}1-ABmX z(Qldo+AiBCsB2wMI&nzo-`)ujx@1lgECXcQL|wC(gWQvc3epU=NPXY{2kqZKP23 zcOzZmoiN5U8fFFrp@gmqfaU&p6$6jq8)_N($m~-K!t(9AghvEk48;zg2c1kTM<<&R z6l?{%on5v9hI?*{>icEilz9Oz8RfjyKF4>FF10@NCD9}>R?*(Yl_lg9BetxakaxQ} z!X6E4>NFWr$>r?5zL->#^Y()XCp|zkz1_6ab-6Eoxu-OMR!Ur~sf7lWQ-b`lV)WF( z<&)RHJTl*$Jhy1i9KqqsXPUhjoenTS9pi{-NWJ%(aoA88Uvo}I$ce@bSKwoY!^y*K zdY3*>?>^}r5)(AKc!GLFwR=9;3&l3MwUGVWWrsXh%khrqwW!&iX|4sH0$sYS4DhVc zab=(h)Ocuw!X%aNYH8stZ2pecr=1-X&D3FwWd6ZK$1G+gXXWegL(f|dDJ*5d_upou zVe#jxCpuwkC6~I?zCidHd$%w9qrH(vu?ThY`M+V@(Nqv?-%(F$Wg1C{G!pUKSkE!C z<-cnmZAwC+et(CBf<4v~^)>FOcJaGm1kh`f73#z8oq7TkW+&1l>a`% z!xNRbO#T}0!Fukw&euU@*Hl(YP-jT$F^Ey0-zFGK%r2~i40Jnj`h8{{*Uf)N6U0Ie zDIf?NjUIP9M1qhCSJx;9{3dRuE|K%H?jo(=b=n2CXkmLYFSvyw1QybbaFm#jWuu64e|;aCcGW6+-XeR9IS%@HI(cgG-+d z-&gZKoJBjXYib)kjais%7Ab$_(L(39xI&=~^pEaHsA#w5fbm4kW#*3B)lk4PNtva| z?`JY4;?w8-g~tj1$sKG&O1k?g^+$_2e7wAwP{c86UJ4JYbzq}6SOEp|yqd|<-l}}% zpyNZW=94`He`{nP=<;Tn^H!Wo@V|lsk|aD%1p6hllxPTmm>IzLPY?|%OPZ}rM-hU5 zH>Dm{Fn9L?DxvBk-|-d@FHm?u`Ss;+lEq&<0p#>o@@Sz7-mhy+@e1aWM>`0!7W=3QS^f^F zE6lb_66;f9h;}*PWIqS&UqU?{1U~#c$SU3hg|BdGnLeysSgwKGOBZXpY*`UT@=vdd zyyL-pixs$j%|sV2S=Q`EMu;^q0b=q?-U!rx>|hPGw5=p?VX){{J$N-rnxf}HJgQo1 zait%3Fv;$x3flzYTfyV?Ztwj3TUa{vY;ihrbi2}U&eedG#CO*BR*ymlHvk`3MA$HQ zkRyTD3F7NjLoi}dGWu#xGNEEchfK>dlsMqM-R9t*w89Yd@Sw$s#@PKa z^{P{Ei`6o$J2RIcO=dyyTSl@8C`Sp)g)ZIKGLvhMHFjc01G%Aob)y&U^l$7FCF4Q5 zv$c@eppXqhiutA{pKLZJYL5K3RYzx1cn)R$q|Zus37WMg$=gmX2P(29`AZ&Tw5xH7 zM#98TzJ9rVE-t=bIbcXyf!lLIcqV_yVET2-zmgYB&hF4kB<0F;+WrQ-PHxemGl$u*Xeb zq(H~?UcsF-m16ET$KC+3cc(KpQ>Xo>>#~hHd~jyS4nK;P5_X;UDHGdR8e@=ie=R4P za;k5J|A4PuGllkSYn9%7_gm|uCjQo-PU2V$?dc|PR@+JRqp)i3KiZP+Vft0KxMzmn z4-E}d;B^NF|Abd%rqtUde*7es!v@irIeom?V-4Z@%PPm<@t_HGay=;#MN7e!xi+^&uQM^XW*r-k?s)>{`%T};&$njOkE0>bS(GSuVy zuMmG4N7Ac8xx>sLkb91qx2Yr6clUji2)fmH0lEMtEl2}&us@bM)38tpSs@(x{s?Wj zt+=I>g81ljA$>J+b5Q_NgFSu6zZp@e!A<*&ek>B!Gqe^*0G$AdR?wD0xmwe`EQHf& z&rxNzR8{ra+8Uj;?2rAEdW9MlvPIKmi}YR7$2n!Sow5C@a!{H8UaQYdpZu3n&#@;o8mjqLp-{ys0-G~COOk4RmD~DWu2d|}y5a-$mP)@&&BrMA-;rUdHn=4}KOrO{u7lZc( zGL{~3SkPPY*Pvm@^A)c2=3zqyV`H0YhDPtuaQc&bcY_9Rrpn&2SW@zT`of#mAQ;cv z39S2`lwwO0W%e6aw{Uoqp!4Zp$r2A}%+=^zS+mV;=C8MZD#w3jU_g^mlksuF(yzeTgN!4{^ ztPCDb0d^B^QR4dE3)l0G2kc&|>bXE+giQKz;LTeHu~sNmk}SrKipo>;n*L;D>Bk># z!9F`B7pQ-kxtHkMGwz7pO*m!7>OYa{%8-IzCQ@>EpG6cQ4Bfv9;)?9LMo1rbnzx9z0_lqhEBc4a?s=-WDV3ClRwAFCnBd%6Y>$gG3e|u1)%tImb z8QSQm{;^Tt+3M>080l%(NFwIH+$P6+je4IQYPmCu2W&eMI!446~QgW}z;k&t69%lJcvstlVR} zii3F|B{+Kac755X=kg7VB~J)fDBeGyX6rjSLhrAhAJHYI4nzAd!Z)c;5c z??cD!yy4dLEd1CXV~9i3{^1>8{PQ7**~m}EEhw;~!Ns~v-#NwA;j;}Da}kuVLF;TE z&N;1ljBv<|)az(uLVB8d_TyK6bZ2o&W7DKp)SL{*VSH zX2TIyL$_&~J7w%qyqnTrAy$iU%K<_Bh=qGt)a7|j-os)9pDr`_A zlF2U*p1q)0CjE&Vgg)`rnhXL0)yZIE0a8%3Exip;ze+dx;%S3(E3Y}b2Rft%XCy^` zjXVQakVr96jp)WBb#v2eK+Z*4)Zc)Js{V?J2_#`bq{@x+12KKYQhXa2db-AuU=_C1 z;rUkNpt)|ioDf^^dKFBsWpoflzE_hSyjddcuRo09u7uh@fOPmg zT)ot|pXWp#k=ykzCD{L-JM`+P?DF-b_}Wv_3Ycc&%qG$zeM|JwDvT8x+pGz)bXT2E z&+ly%&ckq~-=W$4y{5t!AIu<>yq@#@-L7DlNLM}`M*Ua9da*!`s{1L`MN>Vp8Jz@g^F;9X%Ll>u)c5c`1!iqH|eZ6uA9$K`t z?CyB$n?p^H@qPR8dKMtTXcwj2-N#z^HZvze5u)3?0fJY)OG1IbU+>gpFKM?|>#Qn| zXNZcPKf7cf{4bM9W=loHr!gEx5WZgOsYt~+L2=VHAc9jL5JSXGgk*;5ejhE|sP~Qs zRzCh?WgB07c4q8p)sMkxgx`wpOR4(;(L5kup-Bu=echH5+;=na_UMyC?i}qNw0X#5 znQy;hx5A2lapH^h(q{|aLQ?y8a4~yuZKCAtAy>5hg2--p+5gaw;ebwXZMIf!Pi^-R znSrj-KJ~J~u~&%$0K6!5rN_q|>EjG&ZNl&9+oKpKp@#X@9F~y?n?|ZpFU)`a=3r1Xg;-|eeWag6Ql5~hbv57au~Yju@^78a*!ax?GpN>C;-w}?C84Yj2qZkx+(ElAL!v1w9@K#N%tB51ej9mu#N3?Dk zMjS*N3`R}VHS1s(Mk$J-jZEY(E0bB{ zp9YpDwzw^6S`zFYZGZr4FNAT-wQkHx=%S>7LXH3dn)ltmoQ`C#K-{c2v>;GfS^F#Z zTK*%OE>NP@)p%8NK5wMiZ7s-4K${V7%}Vaw1M_X_dq?L<^l00ZvI>7O3#*w&-A{&c zT*xWDG{3h;lb-HOzqf;mX>du8MN>UX4M= z_^TK?{g%}q7QNR`#{pezxG2LZ9p+6p{r&V&jRG(7%kiJy7DMIjpy6}jDKE{ku1`wN zrZd9IJ0rlsj%aDh0?EW1H}}R-YsY{*y|B;WgV3YQe-`Bnn+vc;Q~sOsuw}@=f_FbG zUSpbs*u2KpH71sgtS;Zi#`r|XpHnz*i&4Nz`W=%g3F<5{7X|1;Y$O71d$h z=WJ2_fqNq_?0-Lz*`QUK;Z9m8NY7#_B5GLZ;Yo88pUspfNx|(x z6@M{>F!vWElqn602{WhRP?7HX$DepZwBaqVx8K(l!Gu%-BAwTd&uGS`(Qe0v>JBLD{=5*;t`ex=btvk1PT!^cIkrr|QBkE(C+!i%IeO46x3NSOUlLpIvA z{$~5fwE;UuM}@J2PWx_xc}AEJp_ppO(mEPLd!76q3j}x2S&n$38!(0QemEUR=z69Ct6ME29xI<1uJGtP;XP~G3l1PF_!>A5l&sxgt zj*kN9ubXYpApN7}bu_wUKh-GpI%?r1y}SsyCUys{r0H8%W{2~fAaju$Gs#uJUkr9=>wWh*UF+t%kWm!_dP1Ic-YvA?>DX4EBUBj&=GZM<5LUivH~U6v1Xl0ZoKYlj$^q9xJ5mf2wC4q ztMnU@|F}ZTTA~?dJcgB-W5JDVqvtpJmk(roYzW$SUJ5IAynuKg29sv1Jy;O&X2MC? zgOIXLulB3>T;p6rQUdDq8j_goO$EA5m)$D6w|$z6t#lhfUh<8<&f8fGAI%Kw#MCv~U9;h@2OFjp zCg!9zhi4xh&njy7jZD+^zUl+4K48+lOZi*yUDz1nWZB{J`N(bJe<;|SS&&JjIgsj?WRZHeey|#$zAPPkh;=4bc~}18W9O% zsPQ_oHgx}n$5y;q=z*nDX+AwO^ZOWA+iBRk3g)8Ia462MN9!g-4Z6Uk=qwi6y}cwN zu4I8ASB=wlW*=4}1fa}ohhfaBka1ojkb#kH5Wj?0lir@bM64=d&aQN@%xviyuYeOIuc);dMhq!7q_M98uROn7Wi0xNIBkt-PXnzXb4;W zz+2IwjrP;|3PX>82|^XAK0j(a3Z4^f6blVk=2b>2LBs4jTwi;n4r3HIM0Z0J{f?i? zsy|qZgUxm!ByQ&xX$SPKd}F2y{H8}P&938Hp?G3QUJ;xP_HO}!^DwLE;!pUaC?KNlJ9Daf89qy0?kBAh*=!so+c;->XBN79vGpCKE5g9FWq8% zn@;DMeq`eiPj?+G&}q0byA!a5Fu5}{Sy!u)#^UzBOVnw-{D9f%{YscVn4cDj_k)Qa z3DgYqf34G6?D~7%HPeI}wh(jX>;GJm#`gO$WNLZrNv+fH6*=sIk3h)O=Pz`yot~le zawgp8b-DYYAX0NtXNUVjs}YMIxV3ef*v@Ztm6;?*`)&l?tyz^R+*Xh~aV~OkZrp{1 zcI0+(|KHO0+J+{UWT%0hzyA0yIz5M7x9eF2-Wvsm=Q3X|O$5gPmH_XIKcCK@7M+B} zr{s&*8`4t$tld%;zc+3wrMn7+9C?q<-5W(3Ule>dCUjRshl~~;i&MasV!H(*B~9B% zd=njt;ep`Yi|`%kCU2_c%+1A+h)2VVIXUqw5w_QTfi|B6l7#1ZQX>sgAWM76dDU$QZOQ1DXeOo9v&eTh?p9)1c0 zg~bJKR9v4U_=jcr`4S21HegGHqYPEncE|g7Hh_7{N=P!uME@H6;qM`^(uq|Hbi|wb zSsAOQ8JfkA-_?S=VckxitBBC^SDahv%CdKi-$Y(tRfs>HOj6QJ6^ai{wRWEE_wkC5 zvDD|Dol2a|9eDO>FujXfZ zWLM-9vB&f38ydjvAaT!eFUZStZ%J7KQ%yN6_*;EG4ry zWJ)bj_}vDISe_&G+Q?S;$;-qxRn`pek(s3b+DU2n2^&%hL#cQyP}nNpeX+Gext}BJ z9gJKF&TX|wd#_NtednU+#PPVl8}})kVdnAzhV?kWr2e8POC%TFnyOm>(sRGRukHFs zF8ysy@oj`!Il5@W#=XR-@YQHKX}Vt|H#fAeB5znu=#~1fAduBtDO)yp{kklR1J8Y4 z9P#O$-!{{oJGIjp=VDfA=w0TLj%uN(40v}I=guO%app67`}`J4nWSH?i_~#g9Y%A4w0Q9Bs-PPx4ksxV4==YcEP!`Rt8nr@@HwrEWy* zCkNq{4^3clvq6C6^t@p&2dH}Jb;ChoLnw)LXD#DtRVwL|?(E~~;qiL>vM2b^?lOPb zL%ZN1@pk5BC+W!Ror0X)2@?s?L4#z0kM&M)$M0@AZ=|x(f~@{Qu9HLv3nu)tYap}Z z&0gQVljL5f;{hKNrITnqRZ+ZlhlA~W)rR$caQ%7&M6)Zd3jzei`Ik^`nC87++3UCA zrF5tlu@S^Fbw{$jPyc84kxP40d*Bk96v9w?Y)Ci+$aAg-1 zV6l7T;(|%wpE{tNtKmMTt{b-%tHruA^37F9r(>66Dkr^{jV5j0W355YCp$cu;w(HG z1f_`>Dbg(@zbp?1FScJxGUFuqw^xG1OXqFm*GA#}XT~r(*wwdBnSrKGZEA9tl7$B)phK;kNFDxOx`^&rg&;r?(Ntw;^2uT;^KW*ZfJhGD8S zAc;ZLz|%F$K4D`~5 z8k+2(ub@a%ZzH8w?k4I?SS`)661i9U?XJg73C6OWo66cg0f+k`GK}s}i#*@l{0w5< zetzcH=jp@(m>~FCa3#Z`bC0hy3PZhstxZ3U7P~F-po$jz)wp&hH&2IS>nh!DbUP$H zRb74ZDZ6iOn(MhW)mfkxlaJ4b;X^28Bff``ey>WYlhQOpUpVtN+}o}8KNM6N#P?h{ zu%u=}Z~dlIJ)KYk&FAH+Y}HSrYLf1xhWG z-|H(UZ(w7K!Xu|wP88Lpt7kToaokGK&azhU>VSWd0B=*2Ker}GIqBd2 zY}r2K2Qs3;2ubWx;KNru zh}){h)yTPL7|#~Ry?;ggfU?=qTxx_M;srS%O9dNkyuu#BaM+_4aWnUKT(fbYkB(>buVi zgEHWgv*2T|MyJS`{F{m7>V^JV7Y_8pc_4Ukw(>3TCy#J^@Q*4~QTjEX-7kENN67(A z{I)^WcGDtIuyqfCe^hce3XI?F=;6EH$_3!S4Iy~_Zfy3nJm*&|&j{C!x*Q<2b~uSl za@yOpA?N4;o0~fU8lX&S)A5+~ZqMn!bmvMxTgO@8M>@hxiSDOU&;5Tf<9REhP zX_+v0wA|L?%xkCGg78cn=tC{+5hZGmrH8TaG``j3VQV+f@-{A!{^Fx|uo#99m#-ev z;cwLZy~$3)yzk8WJ)~LNoi=}N_C^fKOX|+~@8|*3wbF;%Ws8UYsy(p$BjeZ#Dhks_iJNe->kkG}j8v=(!1jYqU z8t0!6^OAsQPkii(Vc-0X7s0KFPW;gFW*}Rz1TNPJ?gF)7m0@#K0B!U=K#xGHCU}Bt z3vRQ-@D>A2#ngxS;^i40tzb%wJDZ(;@6ZT6pZ|{_A_pv26`8U>K~1GNo83(L#*Z@ zZ1D(7*SKHWXt2-;@)oeDx8zvra;li$k!K3cLSF{EvxuT=1Ijuvk;6lpn+lu=Qma-XgoPMbfA+{jY$IYb)k-WgFE#-Q?gy}nr4-;~`AqU2 z%Q2n~k6R^XDlFT*Vp`YvpNRVgyx(pUo< zgY}tvMr;%?)ht&-9y1YR1g-`3{}lnE!#6|G!q0v4&%Z=!uBIqPo2DS6ja{BPTN~&k zB|&5yq6>fF^BRG-p7|4r>!PoZzC@e=5!dXetstEqC)OXYX29>)SBIZTvY$Y#Ad3$X zKv-Jeku!79p0`^K34hA41^~`5UfgffnOD;5kQ8T0pgNBrxgq7QEA7x&lY!MM*MV*0 z>5w3OUMr*>Wx7P$!gTM~kWO6_RB4U?xBzhqiT~5w)U05=7o>UD3mUW6lPcmSLEixQ;hzqaQx>zJ1dbx#Ky_@bk%&Rc?%IvT;KcKXjwPFtPGLO&GJWSb!g zm#x11;9(<;Wg(CP@XY@mCgC|6XUAvWeAnlVyb+1SK6bla0l8Ptwc7o3vxmcAAqHe& zI@3o3v=XH+(6HW0Yb$>YyCBToPZCpeFS2z#(q_7q_FlCI_q>^5lBc~Td@FJ@-dQ&wj~|UV zxDa=s?sNI%O6uoFJFvs6uX5hQaeb6A+Wbj0zvWB0@u#=Yg9B=5w)Irt)z z##JU)O$po#H32?8yofp2;|P64$otGBmjKLE0Vw0`ZS9~6l*yf&a9^K}6D;mT@!!at zdbe_Ua}!}mXb4lb4$Nc3rxj^K5-Hvi0rtX7I?*)kbj96UlUy}!;cgVMF{@8-kik|X&M2pBFog`BupPBjQzYC>?Ab*yAfj4E5VjiQ&+Z@oWEz3Mo+kAssISxa@4iZ9fo0fUbXv^+07lRU%c$&(M}Upc{}U!=;yI z&&5h<$W}zg@ADT6b)n6;F@7I&k%VsiP?ITIru+cx^XU`lTew7_(zA6Mf zzd77|uLJWg?aUXP_E@dcmVv{B^?LT(!UHlh(--S8!rm6UQ-v2mr;9(pN5k+1lb8?B z``?8oPSa@lay>BG8W#^vZd-jHLUbx&F7YBC>RBX0GajtC0w$%WxcvrBq!Jd(%G8uX zU#g8BSIh(z`upNY$S`4t>d$p9+Rt@Eho$J`%zHwWre(&oD77m=m}b6-%)t@5+^ z<6LJuprEUk3at6n3b;uC@&vh||BL?r0GmK$zvnr#Tc7{KwmbW{qZa+%{N6vyz6lT& zE&&>#78)~Y^^>RA*{5J&zg~F#?WNGQ3RISs5LD&~$n$7uX(3Pz;gEv{qf2E4UU+RG zMh@$Tii#pEUb-3s`_>?z<8n1BA_Sc|+HZSX8~f$LByiN!G)kyFcKB>Z)`Azp<);sq5^&KjkoV zt)?a@ZAw?JUAfjY=B~l=U+Z<;RL{SilnRB<>GW~U&4>^!WKj|DyS#AQjj*`|+>+{b z+Tj*TIrK3H8)gL+`9wT^yPsf);Vlc^#DLH56L3c&HlNc1|WcrgbZ#XWQq70&3yO-7oRq}1OT{7y^i?{3 z{Ic>2S{KYijxumv_R$7--4+7OAg-rcmVE>wwU_`~4Uf}Hz^#TzCI<05loC0&I(wyJ z9>$c-j}@?JQ(`IPE*B(08ZH&ZU|%Eiz)7%bB$#Gu2_~xpO0}9>yqP|%*1Uey zCemCJhFp#BTe1e*BtjP9z|xzjKm4k1#Qfr72vk4YTuyCHS$Y3!u^sM^n7HnrI8PIl zHl?Q2l$z2tnuKDJKuN$A8ySpy2em>(S|4~^1QZSnGBdOA^U*WNEXYQ2aV1P8Cb&gH z2t7i`6-+pukq1F4L6X4l4#+_{T->O`9g7%DDrMZcC`_$|Q{u);GhW2Jd9UH)B`fgU z#8Hrh$Wd@)GupEv~UO7;hZ9!g`7SkSn2)(ZFitG{#DvPt=CkS&Aq@~41z~~n9 z(5K82%I1$s2s#}O2h;?-LOwfG$Ri&q6*5%m^iaqH)>S8!@8HoKbnlpova$+X*R>}K zOG>$=Q>QoLm!l^k@jJP=zMmktw7eW~5vg1f%I7=F0}6zMhQVw$ae;jv(_SdzR%JJ> zW9Q*cS71QzL1c6ciVF&0b6R;o0w2M%hd`UvkC#o%W#0d6xSqgNB9=f(*TJN?nB0ep zNo>hPbR4Qviyoh?`v~8Bvx7dmbiK?P>hSRprQh#83JbyMnXF9s1T3zVh^Ye9eVao= zL;Y7m63XF4@aJc+_G*0Y-?%BXMiMG<&ovN&XbI;9?$8xcw^?!Gl0ZMzKO7E^(Md*vgwWgE2aT!ybVtb?zU z9b2~T<4#8RJ^nC3oCfL56H#Fo;^BM7a9|V&eeihv+`7lKGG+2$2v`hvp%gZU6~QtA zEFuNkHEV{~|1$$ty9+jp6=gaL+y*_I9uWrj90*%CAlrsddlL!Gv^|U#ZF)v@Vamj+%XtbDU~>VwgTaS zOIhTl5N!y|+{wzpKaE1U2zQL=iv@44q_R7?! zA$H@17iU1OQ4_R!*b02|!E(qXDJY_j!O$Ut5k}8;S-Bo!uMxcCx6sD4)gI9@U_gq=Z}7b z$x8xr!H5Jg17Us(b9kGb&1H+KJbzB2~GxqHBb z`ULLL5FeWfcS8Ndd6viAGZo5$LOAErzKaP;1Qn3nwGjT7qv36RSKYo1ovnU9N$7qD z)krgmX}SL1togVCT{R-^%+#W}AK5tqdLF9q?gJ56OK??DB)CA*$!}61X>6^lsh_r+ zkTgz-{0~hv&sHe5J?O`vcUg@I{*WXTJbCCl;65aVgrLA+;NJ60dZ#wsI^!b@E}Dkq z32Wg#`~_}*d~r>_UR=_LNlGP#0GeAD;Eh{MxM|G4`R0pBLa{KT9-*JdZVv!yAg($a z_BQB^IDPCGoK`0XE|*9}a9NF{_#`ZU;|(b88;!#Ueuhk{gv)IwD3rj@#POwau374{ z>bc_%^TO9?gU})=0&(Fns4(a-Vak(qD+tDn7WycfxwX*c@!+GiJNaBy534RJQ>WhP zP^Qqkd2k09KnrPoe!c+;jfN=)a0oS7txa*uemN{vdLp5Rr& z=Ug%?DC=sK64)^hc`F+NXBJhx30k!bF=1jHIC7k>)yEx~vIz9pd{lNWF_XL^0G5lH zP(HybfoqUg1G~co5y7sM#k=Q_?B{^+{zq#GSj{|e0Gs3BqieL%zD#hRNm(&nSLV5| zQLAA$GHa?FuP$4QZk@UzKQoU2+z(r^0YPDMoH>04%~P7;@X=#1n#`yuEkV)epF}@8CPbCfxr%lveM1AMN@s_ z;LGUQ>Sr7{bNQc`Xn%dHmqo{m?==Jo2_vxQ+&b=kpOCP+Zo9SkD0ObYp|m#TZu}be z4xho7qp00`^{^4o_0s+&pFf|+&D%C6XTffKA$>Gj*UU8coZbt;&;jT-G?hc;uZ)@0 zmYjLjB6HDfq>aqrYZ+{w51M{+CeFHhAii7-=YiK@o-mW|^IZ*?HbH4qYD%KUk77sq z2DBPK4~e(UA^5xnibt12yS0pq4bOFsN8X|mOx{+2_G=!)NrK2aq2J%JS3N$c8PY>$ zW1;IzKn`ldI)2P)uY6RmQ#$Nn6s%v2_%@v&KX>_;RtuR$*-zn|vp2Ty7{S-g-Wd4% z9s%jh-|?(x+xH#FfHyMvuWbOHUJl740gFYgPO0rZRjl}dA0Zy)~gr*j|=|eQ*-6}j?p+>VQ7wT#yja8fnnqv5?CFnY?-a%~n zA`uqOGhy{JL0E8HglX-6TR^{W|C!jmXE(Cf&cdv(vN89o(~Y*v6k-BB4V}q~VGrkF z_m4HO={%1679ZyD`T2AG;OU-9Ksp@L7A(j9SrfrR>%^Up=n}EN%%sC-U+#yoq8MF! z-wACWVMm#hj@QM8 z?YT%3hb|WBNhq_UTdzLIJbM-q5z*)r?MHZ0B90!Rk6W1-M+&mIkpAF~NvL2lPt4kM zrV2Wf9mhBArjM?V4~NSL9w*#)7uIat2|K}@lt5D{R>IAO@L5zS%G*388bu{l1bc3z zCdJ^ysk3O?Itdfrb&!?|@yAAJVRw1qmq{s~9AV+X$T?fWl?a&Ue{^axY!(k3 zE(<&&KYtsP>L98of?GG6_bQ}+^sF=EDqTNYw&!JGZ*dl+5+R?M>7sJmd@?Nm56JS&Xk+rq3g@e&xhCULR4%d3>GWZx%)Sv^m3%39_Y&gG#thkYc|#? zJ^Wq@8Mv&zpC30CJ?KH~v7}yYW6JvVu;|Mh<*BujvUD?Brs|u#;_aF>BkQ)sjI6h? zPFZ`XZn?#cwGVkWbZ>k4ZQaV^`cd;mC4uEy%jo&b-Je`szrHB2oH}X-YW?m7Er#H^ z7Jp3}ED$H5b#1fmm!sdnBw%1YM7DjZemP*}^ucbn*5jxomh#uMZT<+{GM;(s*L&M1 zwrzJ_embY7HF^%M+1|0<$kG1_TS=Rsv?*OZ$=i6eYQZTR&g$(PNRuBtjr`AA;|Z4= ziFYpLz{m!sZ_gq~d-+SW9X{d$D`%sZUUg?9t7<0#mAPxzax3hjr!t_O@GKTQe;*dq z>|e0Hrg0Lnh%=XeY0S#WQiqoFkd~c+8wane15LJV=FqP=pq>x0waH=l6!U+q>BU#w zha3I^X{cK3q+>(^R0B@I+g1aAX+T~{++iwgT@oOysDY>>h43{PIpf-+x4i;E!UR54 z?Eg7FAfRuZ28sTO0JyUDF`MdM)(!TPPeU+lW#GI|e+=&_7%1s zg|8ox(eG)2o%RmL`X!HJ_>`x3Z)@(wEG%BH-)nXu$54s6ALT*$#ePVrQdI<1MFc#| znaL#-!|8KEAyvTRbrJ*$pfgm!@9}eMACn+rKq?nW=mRI^uXaf>jv%$YkPuH9B5bfXAMA2`Y_(&x;%}?k?;-l#i6C5c-&}=5kOsj<^F$ z=Kh4#7O^;&Q;bu;>>#8cb zBb6s82;DlR;OOZxgobKiHJi9@setLDQa#+zt|f9#oPm()QRrjyTxC3{01F}@^-}{u z&zpy}U1C4gD{W&@u4Hs>f>W!<1r6;l5lF!NxJ-0iKUW^b!Q)5aA(-_OlruF0fyWII zK{1=Qz~;%axvNsS{C8iC%aMi(PVS6<{k8pDs6(TgzGMGL67rFT|JBq4rA_JTNQw@1 zL-n<3TAT11aOli?*}3DXM>oE{2Yb`hKySBEzVn-Mzp@TUFW8sT)Yk&XxOd$}K#yss zcDTIDntB01uD#HT>c?+dO64JU)AqanvZ`*VQz~CqSZ4{9=w{Sg^A6STl&?V^xH2uufyV? z?TwF9u-4Szc?sy0=3kPWWAFt-?dSjQIHBe_NbYx$eeXZ-cgC-ti8;=z1EL6PP1?K(4oM@y3rfjI*OF-%qu(Me;z}$I@p{sTvHYpMkp#(~)5?;3tPrvvcG(j@R1Tr2yDmo?# zCYzhUQjLO~a$-0Uj^~-+7m2tO5{uTPR4Vx}Ja-=Qcu-Pqgwy3D`13)`9DhVYWS%YN z9{4JSjQ?gbQYNzlHiwfyR7=2WKzwWjj-EP;un;YRR0@LA3Pgqlp+e_?-QkBehzaWp zxHAw@bS!ZybNsKDci=NcEhGkP-)e05v()KQIVAL*sZ*7y)rph zI&e8%@YDI6CL5$;IYcTcbqZu~uqgo&5%=mB65LD0BHB*^7ZED6W4lCdNC@~vaw?a= z&%?tysU9LUY-)g{uJ?1LlpR!JRJ_m)SEcgB3wr$(t(!|Xht`bDghw3sryPcwptLD9 zrAvKJuTi}=eNBTndCApT{>e+~1>bXlYqJ5=>l-{LHo;Y1M5Lyq3a-R6$cDQe7AGPi z!%$da=OYdxp_~AY0Mq9R3_yte+{$Mo_>?kPC~uAEzRLrZQcC*>x%H1ZJ4qOn@#&Oa z0=h7GJR&%p7H(}^vuzJH?>Pnmfmds{6La2p3(q_=18!9`9U}-@tr$j=j-Xe9U{x?8 z5<}3Y$6&no`peYu@o|rH7nNb$xV!Pr()YOo6VoIWiN$aeWZLaEsMKm`)fz}75-#+w z3|4dRe}ThJ04L=RQ5K^aadDBTsMMizdK#+eFLOR((?C@Om*Jrr4%J#ZmPjl`ct|jU zwF+*nv^s2D|CG(e=5`6P3L9T$E?6If>I-k1jUvWQf}>KQdA5? z?KU%?ODLBHL8Bx9_Hd^v5t>p{YJ$?H)Rg|Y#H3EH(W3kHW%{Jh=+J_zwScu2gloEv z^?KpeehpW$p4qvn0T+r?5?ISB(XUGy(wnJ~c6|?=JyVR5YBLV)`vnfW6(@?yIo!z! zrWo!>eZ-wo2DKjU5$~n{BtlU@cFApr*e8IEh}P>22)Z+?rADbCaMVNSkt6eTDJpa( zgh~at{myP^-M%O8zULlztv0M)`5{I*(fGY<#zcXR>|NeNM}w@VuDS%T*iY9Fsmt5B4k|Di75#9c{o=V zcfdoy-MxJ?=!_-=g@jONKmm;=2v&~|WqAbz*alP>s}LI;1B1ze;2@3oO16{i*|K^N znGhLTel@>)*HZh&%9~$R*}YTCR{O6}V@#7IR8#ujPIta~DdF0@*fcv367q&;qL8X&Ktg1_>&@}k$`L*#3NaeyiCE6}-#ov%Zu^Zh zqXKdye=x0nHkZGgx^4Q4Z1rI6cN^+{IbCXux@j;rZhQkrD}YDFKLPf+T(xB@U(eFk zt*bD2FpDj3#v32L4OvW2JbY6>l%Ls(pq7Jq3}$=D&(KG8gS=!PHlDIzY)#&arLaNu zPCCK*3(M%)xCTO3U|H1X7Pt>@hS1WWQMhd+d}1>^ue=RWYEKA8^}FbKJRdKDpwI=$ z^H1<0e&5K4BYwo#o93KV$NE;SEP7!~P4&$PfrxlK~cU#UQw9(H7OsJT$O!{uHlqC^+A zt49v0vG$+{lgAklClg}T4>FAE?W{SMip~{qDrmSqP|x+zpw8Ek%sci2*6lcm9=DFh zbuFT>^_#8SxmGICqThh)P<84DXwrJ~vVXT`IWo(Du@6mv3IQjS?@pMIaciL7x2{=> zi1vNZsYU(7-ns}I|=i1AnKhcer zu~?)&7gPj*C$lnfEawbdrX@Tg6cHk(Onn+|rxR_vwZo|X!|>Gj`{4I8E297dZ|sBV zPyGjBG2wjLKv8iKcMf8JCn17l!}3friOmxgiUJ^LG?*YK{0fWDAi?9mHJ^Y zR6#72Lswnh$anB!I;DU98FTUoSM1}@oV7Z4X&i@?>6F$kKe460{V<%~ieo?gfYw8& zBPv#dQ@hsi`cOx-Lwwto7nJYp?p1L6r4UI%(V|y<8@}dycAulg!O45YqWhL`Bu>FEO3cdRY2nI;DHpY(uY+fhc?@x9*~I^~1@% zKj2WI1Y<{ChXdd2LXkVLZ|6Qe5ar3o=6xk~`4hYKKv>BUeDKXt+&=yubWFK~0P+6d zuj{{iuQuK$a6o4gAxsl+Rw~Y~MqE-b3ij=U$stGDfSz@Zq~}hQBBfnS<3sz+C_I+S zm(}qt5E>RJm)}u|vMM=Z;x*7`9)+d8=|Xt>j$Cdk@6ZV(cL_K`d5lFU$k8FSOUEn9 z1x--el&+B^!cC6^;rq8usMh(={*fr8RXecdZ9AVgm-lHE^1w9KE}U%N{;4R~vyIsF zrk8K`yPS>NgunQe%IH55N4^}0W_Ro$05v0d+Iz@b@C3NCqw8n9bSM_@FMhQSN?%<( z9oMH+;g`s%cw$`rJk1SDC!*-OnTVv1NdEB;aOcEX*jRZzUb-m^i6atFu&(e=mC*OV zV-W4!LG)&XE4^i%(^IYYz3bQ_$l|5~&p&_h_SJg|g2gU~9}Rfl2Iica;hUL9`JaI2 z;0lQ6yW#%!F$gy#K=i2!;wJ*fa;<*^vNktEQgl6hqr%`$NVp_PDCX?6Y=aRguc&eE zc?X{PQqaKrJ`8X66kyQPm3V%Nt1geJLJEaNfx>7zqLhtCMFU>^dZcq_RUyBBPrs%{ zRjCXD`bPZcLox2^>Bp2GJ=pSzv=Nm4T4Ih%Y@X=j9eUTToAaNKxrU^(ItP7w&ceG7 z=0K6w2{&`S$O+&fUYy7A*8WI5+NT4um)?(06Vh>a$6yQ|nSo_f`XO}jE+n1TVzU{b zi7_#_<<_oHYT|1|?*T1=DvKUeSXhFXh$tjeJ^yg<7o0m&hOi(f$_d=%ieNl7eHQn6 zhsXSjzL0rB3EvS@1czfOq zJo3y-_;}?8e6@8C4(vaS*v^BYktyJ2j_3q+r%s*1SF1n59rr!REu$K>GGO&oNV#QE zqhV2x?A-av!62BfM=X^ZP$=clYLzG{H9(M zmgjb1&}*llcyl2Z?tBY&w;4C2-^IQ0M`pCF*C~Y&2|ecG{>R55^-_TJ_juJ^j?+7` z5E04(M0il@Y6ea9Zk*VWgS3&uYJk+o+o#M;*%v@5yn5KQEdn~Fls3Jz5kp=Yip{Sc zz;y#lpbMXbu+|;HFutKq=})s~n`!wG;kFt7iK$7#%Vb*hb5}rU%#U z|Mw>iZah018*@iuXsQ;8{~C#t1e0G2vyo?YBg%UcIi8yk)M5he9o_|J*B?UBFN-kX z>u@lPd+N?f+_HK^unnG&7TB~s6ECI5K@j=OWtB?MqUEnQ3LPfE5#I&UqC;?fPoVli zI0PSzs?RG*gL{4gq_-V`FF^_SbuA%3M4%cHus4gljs=(@@7o$r{n@nd=v??D6%b5a z2VdSJ5PY5mf8Q7glmGa299bKNdsmh74$8s7YRvtGV96qc-73cZT^dB)Xh+6)Ka$6V zApgT^eDi)N4t6r)rA{uGsxPi`y`YN_i+_>g;Z7cO84-dX))~3X)YLlzp!=T>Lt!Bd zTiD-^)}Q>b?#q8hCt=2l?=WXVf=m-^+^1X5sW!m zSW<@#5;~b&rGcfi2p*44Zk7@!mr@IvYp8h4q-8~8qKluX8W-nr*G`MH% zV~9*ipbxDJ@hwtdC^Hhw1>)E<$ta!Cg8agK3?A4U+qdoFpvo+!Y>um%K#&0`o9F50 zz^Z}CYT??e@v)((HaiF`HP9LC^g9NH#U)V6l#obe9A4QlzSqlO+(M8m<0AP|Hmoj^ zASx;hc?A`GPHJdK9M0yIqg`48om)fo-R} zK?LLkupanfC#VdI2#1CKim80ef-IEzpk|>&t4i?bl=~rL7H5x#N3m*|l7cV3*#JAS zW>iQRs;jG*l^Z*^Z-q*(#HoGzQFN{tGJQM_k16n&RpkcUgbJMFL;vas=!!4bHXt5zXoO zoU-m^ESt9m6Q3U0piwHvXG=Ah^ajw5Ky=BlG3b;efR$dmWADvFhj~*kD-_6mHwduy zq#hY9MVNQij|T`wn~%>!&gOq%&14boeiKM(neeOmZKrl2diXfJ{NxCH_2P6yJT@PF z!v31CM0k2{wBq9T4wP;$NA`we=s59l#Kp)jsxx}Q{h{~EkdoYmar9hs& zwA_R8H#EKL_N_q5^qIUq`(LNSsiFiF>^y+h4|IY+o7QA0ZAwk)cOgnBZe#_GInN@R zRx=YItY;Voo|m^_zCkt1X{mp2dDHLMQMbHoL;cj#TI=SaIxA;73N{8b01MU!H2P9H zO~tuRY-v=3H-4SlltT(l` zfTTF!J{1<3)QKmr1dsuepJ;hAFA=vueH1ew$~3|)(YzX zUb_Cl6}Y~3IpcAB#TFj^xbgFP?+X5R?w(zB>uRl5YidLccK`6--?w_ZJzl2qxqkN{ z96VKs7AY$9@6{6?w+~s_Wys4ug_D`NaJdDrJFGaDSBb*BCD^{gNwpz>U+ja|C*qwx z8Qn#ZkM4?C3^Bo(+iT-P-eMU6say^>0fy7(fg_6rI6NV=ANa8NrFB5 z4)ZAoK?*hOZi0Wh5GI^nZ5KgAKoS;2!0Pl;$4@HyJD;&G6INVOn;}V>gt1QrmfK7W zv_+FY4XAY_-!zZ@1+1kFQ?2Dx9i3jcJgBxQ7Nir9rU%;cTAfmV6and^`urO{t62~9 z_)o!Q$EF*%vR?V5R+BWprfMYAXWdYA;dZ`Uqf@F(8;+kB1=ig@YyMyNZTlUa(uP3F ztemdm@3H;;`VNJx+uay=b6`3{>(NgJ{x-YxrOC}!_T$|VCIUeQ?#3hib3FKrF5sO<$Fh!usKuHpiX=08)KBtr5R0+S+j9_gT z>?RX-ulW=|h*v@`l@P?b32uEQ>`FGqv7RX z(-v%WYa~HhSae2i$z>8w?0T3)sfFr8$)aC*y}X=EIlyAIpqlDDSfYWD6^d!GIvoV| zA`ZPw6+t4DqS|QSGEru#GZsZkK>#jMY2orpxOYFT^Iq=rbs5iAI#YL0h@fjYck@!y z`Fa1Y_98TN&|hl+`FqNF8>`dk;E)rmpMCZ(J+O7xQmo$fPki?#H$iDrYD!nH=@zbQ zK_l;)(eb;+ui=W7Q2?LK=7x(2urt#jQIFkefkG1mFM*X`EG1ABz~Qh#s!+jhGX*Sr zw9Ut2vl9UMm|mz*1esI}nVewG?uW%jFiRlIrIthzf=Sw61TN{sz>_v{sFEucP|!Jy z<|+sY9ND}|3Bf1R^JJDyDU(rRz@?D!-vUCd{=K?Fu2%3VycU~Yq7e37uXp+vTRZkZ9C&kK9lN)rSDNQqLBPt8lfyd)Hd~CKHQo{|jw$6O=Zk z|H(9EY1eB~u4whMxzLyC6aB|=RZ2oJ3vO-0mwMTQURNeD3vcZ;_zx-lS7$xT>ttyz z<{kZardnN8kw7ez$V8A6KnV%{nAA~-z=?zBddWYZJ8 z9L%`LJ^>YzPGUpoF1MFJmSEFE%QgZoiIamA3lqxpNkw8eK`TM7$H8LB!f7(XEs-Ha z8xE7z1U~_;lVFiqOBqZu0eP8R29LuHIg46EkhpQnPDF)A;K>=!pg2DddR+;&e!CBS zdUnCK9X~=9qCuEOfgU}2;>59^p-^kNe3Y2V)~;ofG56JJi3K zzxHqJ$S|b06>}M>J~RK?5P1i_9Ej$3?BE`c1BNGH!HQgT)JpjBm+K3WK5PIAHU#EU zv2{B)97N)6qxm{}$wsu9UxFE;*%Q`NQ#&oUD6dUV4_g{cHG%5FK6If{{?uUPcrtr`vA&rT!=;Y zPvlxao3c3rfwb~&A5CO_1pcQ5>FU^4^-Cqf<+jk1bT*lix{`uRu1WfwuC4aT?I zcEB$cLL!&IY>5X{;jR|i9) zb;DtC!9|cOrTy4E)1rzB0#+fkA;Iv_{>&mN6tjne_N8O6xuR|-fhhs3$LoTL*3WwB z|9C_u7yb6T+}N;5&-F}=4kIedL^z$3OXp_MkSYoA0H0rkUHcC}F7ly7Cm?V;2Z>6J z4jtQ}eOgzfBt_$;na?9FttB!A66`&g4XH>Dm0E+%-~YrF23&RrHg4L9Kooo6|6X6j z%gN@izPa#Ifn_I17vA;|c|KkCVVt3zba4qfsR!hG59(e?elWV^Kb%#Q<5g6`49GN(%|jP4wO| z$1kvuqpn6erT=87he<-k#l>~f!yY*pA77O^rMaQc)^!LkkXX73Q>WCFuOGN^&@fo7 z-Tj%F*Q8GAKNakz2}+yNHIZtal@fvpp6CP6w~vd!vVyPIeXm2#J_kg5o#-+>_@eoH zXUI5+CXK3%gDxZ>WnTO`X#a-tGC%Zysl$%5QO|H7WohTiHJE#-aXX(wue#~fr}*!C zTljB9>`;97tPb1f&u)BB+i?sY*p1of;LBxBFq8g#0nKK(`lUf}us+NvYSdcYhdzaT z{}#Splr$7rs%w;$NkU1cf6al^^Yn}S1J6A>#i!s~y9&aP*1*hkU>AXe^=C+DZmE%t zQoz4tG=!zcA-J;}<)iC3`d^6t@O6kekTTBZohXc($bpolk2f#Ek^>v-uHCIaSMIeF6?VD5cH4edp-K}N<~O?d&p%fZvBjkh=R$aM_g?k4k?*DxS+c;WC^ z`Ovu2sE1G~g^W4+xCqc3E+}Md&Z>vc?X;MU5cz~qYl2{LSit$BkQWy9H-*tf+7lA-zLq1S@1z zCMnLI%Eay;mO&K}jMo>xhli)V440`IAwfY0IkBduA$i+#)H67)+e!;X)3@U~dcZWwON=m@_pAKxxIi(8%^a6$gf z^FFQnebdaD+^NlQUt2Tr?ZGhWb3co}CG;)P_y7UaxaV`ffIrpNb&wIuXj9&dk7q)R%Bzd`FzzJQG7cXe=QDINE0Cx^G)7=tb2u&0z$_{?RFDD1Pn6FtDeOMRVYZxTnxXjFMc^zg3et!Lg^_%pRWD!!57<+dHOgEW#xzn6T@V2z-Xu_A0HIhTJ5QOaR8nh+8m&8IAg*z^X1 zZoA6~xm?8^t=M%lNM+Vfu~Gtq$Aw{&9>eI#&mdUlMm23q2~}gDYXr1(edT3UaJlW+ zwf{8A3d&GrtVVIsUQ{~lD9EYc0SuH1#cx7s-~KbPd(UoUubqWiUu9$NSEn0WI~8KO zpBj43tQhui9(Mm&W9aaOm)w3ZAZ6gl0W$e(L={bf>#kui zWNf&&g)Ll0jRBMJx54<5nCEMlG;?~vJY#QwakCFWv+7AGdnxH0i)i0VP#K|nnfKZ2 zC{_maI#ua+K$h4Oam`PnIH!y_G0+wWlnfN}FPcB~-Y4tzK4&k&EzjMCOxGaX{E!X@ z4ppH0)S1-PY^?WL3#6N7zm6O4?*=PTtX zv%&EK@+n~nJuxw%=Vg^m)UQ6jAcTN3q-Hriu3_s5(b%!SeVo2S1MOJN{tbbYZ|_!r z9?{T|jkh(YZOt$3I=XeSHU2QC{Yqy-?#9@m?#ADOAXgpiTwn=pX{CRGXMs$%Wl4;4epEaoKS8bO9V*3(N$B@4opKj5Z68-#+%9 z$&d==5Hc@*f+?Xu%&mpYips2i9)IBOGT9=bR01IZ8IzAnJgp;m8tbtb^P#dr$0J>-=^(62 z!{n&MbS#-v#;wE*teL*4jUe9VVwPPo+$J0Lto{Hxqm>>8C8|u-a2Z1}ecIztg~wv_ zts@W|p+QzoG0KX{QC3}nob1!^JG@l?BG?5Em~^_|oKw1c&)fCZPD)SrO~v+wXe5Sz zbh()@Ooc5gyVvb2Y&{C!Eq##xevta0qhI;-PqiUYg);(RS`+}xhCu4C`PUFWtqYjd zUy0y3;yO#HbX*2PX1A*YQr-f#=mOn<*TpKEnRPoAw`XPGhmK!j*Tf8r zGzG|V&5CvC8g$+lQgvsYRh5BgCwjN$u3gJ5po^Z$fcD`}aBoWe$8r6JFOfKWM1u}G z0je;E=jFdw&ccJUKH`?rBkN~k%I2rvI`BfjN1LFuDgDo;Yg!VDH3D65RhD1hAhc*M zaBX^eHn;{s7n|T}F5;E+ruDi!LX}p5(0b|2%?Ome~klgq(9@1-IMfu4wm z`ed?B;POm9?)c!nb{!TP|;^vb-Sj>3~bE2{_hbM5yCZSv$kWC_>i;Rzfp`wyIK8aOK`_#oPvQn9Z zhw)_pISEh|GC4d{Muk!VkH}AXfu$d=#-s=CMsjR4j-1Wo*At=Az#(u#Vdw&>R zUb-J8kjMnEnymzns(^|Bl}@6f|5KeXe=h|AC{rB}s-$q!wXtD&tHs0>4CDlo%-Zav zvdCz=j77Sl>$Ex?kg=#z3MJfD3)QQbgSnH3rt^PyoKT~?ncVMp z_r3HaYy_R>TR+eL&4%uI=dfo_+Sc{ps}KvvHtHmq-7J zHmwOtn^IG1N=@k+O%ehlx6=WipTLbiXa=i+fKCGsfe=@Sk_!0nxtO4ddC&`Gw7<&< z1woR?Bj5v?Op}vAA&W*NkxAh(mT`}Fi`xm0)eR9;w4Vz?f=a1U%sh^uRLD83MudhE z=$eoi8xLJ|1*$4_@VmtjX$S@#HiBFM40}eUFUI*+1 zp-KW^W&zdfbdXUw_a*nE06vl;8IfzkVOgteQw$G1tg;UUOp$5O$Tt&4nhk% zUSOUnbNq5y>;b7OpEodvl{yMyi2@Fn6?TGpfm95ior*)JQP4VtOzLaU$-E++o=_+% z4r21v*{Rh}zTzFiKb2If1OJr6(6ySHptLDnvBW$luhF9W^%eT)(8$p8tF?f&jrBEM z$9lc+YQKgnSqFEbu-MGpGU#WR<)eKB z1fog}oJJd;bIFF-+or_w$VsofvkIrPkHcJQz?a+h;!M^l4z(T;xE?3d8}<2EI8HxO zTen79d@MS2?T!P zib``49TA6Wa}@+`AH-@Ifw3Jnivf|LVHi7M0zO{-Esjio3JF0nv~8V?ShWzvSy>Qh zym)NVI=F>0ytVi>EPU;CJpJ#5c*SET8oxohJmV4ITuA24nQ2 zPvF1v=Wr*g@E|R8w7=WvLQqH$kBDV9nYfdcf}q&xBp?@vAPXWGC+KuDZCC>7;ILq> zJ1P@MAy!G@CAd`x325ci8KCXa5s`GC39%dVCd(Z*Xpn%70Bt~$zwGI@>95lA)kjhZ*6Xjy zI<5{471Tc`j;pku>pg@2X`RyA2tUlpMiZh%ywi=)AT{nD*#RPT3|!D4FDDm29XW_< zs~gq=3kNKrm+6wSaF`M5@{0ZNDe*kme{E*;Ng!0NlsHFn5N^J%U zf#q$t4B(Pa-)#Q@cAF8sI(3GeKsdjk3R{mXhej-gRHlH-?!@rB|Ahmae!|(JlMquG zy>2Iz^tll*rzVdV4vUk|8!aozgV5uFP$q!a;N>9gG25XecvKMtRvXPIKbMIiHw{MC zfp78FTd$!^Z{=E^xdnxAnT%-L!;Res4&ua#Gbk)DaI370p!dcuu^9ivOE`J*80;1c zfw>LA+EC10_%6z-bcl|Og`4Uotz8QkimKqz1k*W%FuDkw-Ck%zwXm9Pl-I^3orvY> z`c!aM*`Wzm!Qqj>sMB+8(q_$DqKN97x$!HRE~~)D6sX`cTDg{KIlYIGK_c|-(~qFj zh4N|>LX=V%^=9bH&8V~*QB_sR9l?Ub!&%fRVZ+XQlO$B*)KC)Yi7i)u8`nA%U*FLT z!}6;tyT7t#?KLS0wPf<-x(>Kr|Mz{no1nBQUD@P1g?I9r;h~l_&PD9KL++2KSNi#oRxDDk@i#p_uRass&1f3>KKs#<+?!3dQZDWJnp^s z>W;##FF^}XRDLz`(W`eb?=XifP9u5$6}= zqjhouBHX246L#LV`E9jYo#E&^;5&=xHV}W)4kql>#=ig-2?tC@JNCWkh~%k&?=)gT*U= zTrEdZS{ja=Du=GBin2;!smz2@8-b{>AjEZOj?cc_f+PF)W58{LP*9u)gP{tiemMcT zJrXyZK2BgQMr3jl%w{uWbPl`Q0UI4_!E0|27`stiSc%H=QY5x$hH8Bko}Kmx916M) zxfFm>xWSrc45twei*%E7gT?;31{+8k!&8QLyz** z9}%{hTD^om5L4gSFnl(&U(G~i%4|gZlmSOx5|q6pC{LJ=@KZCXLy`^q(P)_O{fK+o z`^}Z8XtNDbMPvT-C*`w|2^h7e5JJ~EEE)a*x^?&vZT?dLh1ZTHceca?+SUks+&|;T zld0&D9){D)hNG(aa5z~oP#2)wUrhGXL=hXdRFr?Bkp zTugkt6W)7yKPJr_`G?Ev_v9n1C?eqXFK}Sj_HrZ?eT=9vFVHjR!=~ADFl6QoY@@%P z$iBE`N}mhzpU#iq4qo}2-h(0WcBHop#gW%%qr`?r^JF*A+gT@t<*ht~E&ttwezaZb zFU7ai4&FR69^ZbFkDKrA_`BsE7N3C)MS;1hZ}-c1fv8z!} zSi!9_pniWG-k^81;OkWw^vPKciSN#MoVGrW#9Lp(=1Fo`9b8G1efcqa$$m^+GNSRz zTH}B{VAx&QMG)$)_yMABBhWkR9qgmVrf<-%m#LEdPudbonbBAwz+YYuWj<|Xt!<^|uOtAW0~xdi!Cz2OzwcQ;Z*3TiGB~dL z9>n)1ApK*qP=1{n?|9s}Bi|3h*CEKBUwy$oY)YcV!J0Kb2@td2mtpUC0g|T&5olI% zDWYFX)(R0!PCxwi3%4bX2&#e8OYQb2W7XkfjaD&$2xygpYnay6g_S{EEVhij3AXpY zsfXA;cM*`T`;`+2#6iJ9xaGzk2#;*VBMtd{erSV&U}M7e0tw>dlVG)HLFkKs$fU=( zdnQ6H^Fkik0?QUJCs354+G2*GqL@Bxi73_UXkR~f=!uMqf>}hcsEtQnP8rVH3g9(U z9eGY*myOUn0EJu$x7kR~1~m#cC#nr* zR8=12&Ra%ZIizwK%8H8+OJM%q`=6m$U%?E@1pP|@B7Qr!TnK(DHC47`yT~7@wZm{@eutT z_4q{OT7dTIKi8gwpPCV9#}5;ni85)a8|>d41zid>i>E_aLm9%jb}(N*8?1#1=#joo zZ>Ws}Ej@j(tvw2XT6tMO%F^v0=W?ZlimYD%`NqJA0{@=^_s@FdJffP~ zZZmN`zQ1`6I=^J(KpFtiIRv6JY8s({CX?T?ivy`37+69O%)oTwqiNh>&3AYX?J@Ea z+lj`rHInXniU*9aR@MTs5Q7LFnH1GUKQT33n4}?-aPp=)U;71^y!*KU)@koEOFSaQIK$GdBrptLDn;UrDNw6uogq2yLk++E`>NH0m?cl}4X;G2H@ zZ`-;&k;q?q8_IR{&>)sKqvHl%m7VKrG}@@K2M#yTmA7z|NG zz4s}zlJfOQBe|w%U4v5e13_qcqk$Dk`P+5B6!)*^U@O|wSp1$vapHR)pV4TY_q=ih z&hf`}N(EsSd|Fe!jD7+A&{`{LpdR&&p9{EXdqC1Duf_parL@8I$GpXBFy~n{ zY=UHj1gT*$nQ-E4Hp&XlBKzcNs6)bV?BppPMwEpIRmHc(!-c74k5!9uGl3^ZL3(x>_Av4i0l>`ReJ~72hMV+weaP zq#THJVh*7mhk{`9C3vbTp=}vL0|fs*fr|yt@W`x};4Bs}B_i!Hy3Zi*_EAu##Q!B- zib5kp_MR0m+qD?CG8NSsdr+QskSd!74U@*B^F<9~b2Jp4LH_Yf1UGJnaqA}|KRt^; zQ}A_n8PZX$cOWQ0hJkMhTF$v=HGT`K$biC}3Iw>$BI8Ukzvh({U^t>fqlS0Hyhr1e$||{F}>QG`pcy)4=f| z;rQ~5?0Oc|;+!%B$_>cRHPHH(E-Ty2N_vpmhSStEj@{<>?q9a-IsagO(9`^Dp`#)X z8O{jg|9DcV(*MfSMMi6{aR2B(d#NPq z&6w^^`gK~eKDB!qkX}U|Ra8i-f8++L>)ZoW@qbx4herRExh(PJQ7)6G|0B=XBld_D zGMq@u#KTWaM?{DSy}EaRi@-}8)BtXy5mhw?q@Bx#%i-oGAsJQO^6cZ7GVw*&?G`SI zFAEHUxHKOQmkXV5ZI3S(eTUoo4aDx9ySa2xO=T6tDhbpIHJnTqimvIj+7O@&!s+~C z0yP=bQZ|=ThNuPvB-GIuO;*?lB8!|3s0g&!{MWLgT!hCqMrp=zE~Df!nz%QATzD7? zDyj$=El^O0EK*3h*S@~I21(7M5U6c{vu92tqDd><7Tg#C1bim50k)bdRN3|-v)l+3 z<*kYarislOqu^X2fu##k$vp`;rJ)A8t=XuqHXuGB68VJ&cvv6+r5qNk z9Sy^RAR?Ml2WsH9TA2U5Fy!HAF zt{R}P$j8f1JVh{SfnUd%w4mG4P-u-kTKE1lX3P^qT z*v&t}4{F*CLBIP6Mu(W>`nu9FN&ca~M3>|{KBk$_fW&v~RPXqPap0zl_J6`+AQG#g zQ~L-Np%KC#Ax&H1!jg=Ly2PD$l!%D0Uw#oW{v##oaAfoh{>n4=mO#fICB_}t#5%XQE11f5X zX4iB6SUL#YkY!v?r!@I=v+F#Ih>3}5_D?)x7K)Qu1+~Ee(CdvTK5xajf~^EkE`mN8 zF{p&LGr3GB90ZI3T!YgBv&G28?PV%C3(*BJK~iv#4rRqM98b$bw=TC}>!!m5l_r8i z5s%KqI!yMNTOm`x;mHB z5C69mr%#NGq(b}X93#G+xN_5`m+9^W34 zKonZ@U}D;;OaMQ)4HA)$lLW{h_zVsVMrpMkky0y+`Wi?*%#P}Y-6LWVmSC-^hSTjr zS&bD-7kmnZCLGP0wnTAR8U8otV|ZMZkhnrnR#pL(P74{c5Ys(X8SRiLWw29OvH^tN zVB#Nc)^}8>?jVTEg9~OR~)?w&IP1m~2Z$jzK zbTi#dH`5K8JQ6Miit_3Txa|@SaWy70g0&&AI|!(_hN+E!PYjh@3Ztop3+MB2q9Qv) zb^<=DiCYJmr+bi2hqN=fXw@nXK@9>?o=+g96hrEkz-qI@O8Xj&R_N4P?vZYHIv`Og za3Z@98v2cj)FL514qB0dgPciUh0lN3gs9+ST)1Bw9gbkR3JR4B7K0r!r4DAhiNmX& zd7#%6^Z9@pRS;PCcPAZlPwy@;OGB`C!x|KwOhsbn6l9*y#K|)!&^R#~VWB~&FxgN^ zFx$FiG6A^*Qndz!xmnnI^en2&i(s;pAuK2W2?>o+T2KV1)rfcAegPvNc!WDxF@SVR z2%>c=0(CVM1fLFzg$wj6IGTE(3D9xTd$BYS9a8#X#DEl>$}C2!q*!d(z5{Q+Jq1BQ zVlcmXw?h~(m>o_8s1+PUl?0?#7DRwxI)I?nW;F2#S`gdlIs~o?ITUi4ppqb!-K^X< z)Bl%A%G~>hzyJPqnK?G1VEMaIrGuDA?tc#AAJtf7(EulRf{c}8V&(PooY@FG72|G5 z4b8qGKcKR>GR|`Xxz}U0 z)9MhrY)%e|ZkZGckrT0za)gE}p|A1aOr8>0Cg==6DXy`v>6%BwK`_35y?r$ND?&d7!6os@$JjT)_5 zw#DMvpChk&Bw!UIyWEWbPJNRAk?FQN5EBuIQi4|*L3w0CJf0f!2*M+RQIcB;r<1{B zFe>fUusN-;n@w;!XkS*Y1d?pND+@-z=9DU6#rgCzSg+N=ZMGpMx&e|~wSiWqCTMr^ zs8|vf1AvOxO@jnxQ5I2o_vq9D>vtYSg8%}08G&b@6jDVXJqr&q^GiTH3JXDgpiBd+ z-RASYzbOfIak?o9_0RBFZGHUvC80!CROlrL)d{1uf}CnZ#|I!|>n1qlp-8?>@ERyQ zb^uO!L&UX+x#$!wb0to1-HX5$oe`TDj>5yKXxKqG&f_tl(x~L;ch=+}KTm>2tzs^d zvdmby<$&+c&OLiz=jNRl(Km(vtKLR4^+9Yn@i8IrrVyNrxj;Vh9r8Yw(u>%nR$I|V@h;Uz;DHUEZk~q%lgEf6j;ct{6U zU2^*XI1c{;v9V5LaQ86kMCsYRHwTi$ZV-(~x%7D!&xI(@4%urj@^6gpl`Dj*9h?YJ zN;^2WuYk0tFsIA;;d>B!VjzCWpI^t?rH~C0>aTOzB1oI{0oq;uWY49)QknJ@GQM=1 zmV16iM%aBZ>m7PIz2_==&n@(x+j%p$Xq6gWdmE4xa4|a`P1R!MAqmEgu0pgzjHSC2 z7}4G4y_SZqWuj*k08xSkeVaNiE05X7cVX4$L%8*>2hpWzBsTuMk-M78Wr0ZP-38@o zyP!+%&hx%?#s6@o7#Q``zkRYi8C%z)X|F-P^R3--8iRVbxVQmVNZk?wrRK4X@cPqz zAqrsgxx_e|nTPcB(~urJiL#P1IK@(&%gKS1e#H_IYy_vw(TIt{D>(#;sLj_SKA{mz z1aTX-Z$xNN0?d|bY}~S)K#;OeU}m@5q1Fb#Ze`9%RMu_>k4O{|A4wqPK#krA1)Ccw zcEf14Kw=XkbrSP=LJ5ETm;*L#)xlWU%n525hdW(QFF5mUXN;`!Kei zWDZc>|B_bEe(($|YtBRcuRf49QgTmvmc+rKP^QFq`-hen^*K~}aOSgjjrxe8t^OiQ z%oX;r)Q6tgv70XjC-p>RL%}oOV@XF=ZXgnyMWXn?3RL@rNf6y*7<5t#(srKp^|$7{ zgE)KgJlYQ!afSK46mL=e*s}$Cs}jk*yP?)MKkH->5?a-t_{n%G?|3F(*2XkNNT>ij z9%~tj%aw?Vp+V-EV=&tM$Aq<7X zoaO&P!~0%Gt3m!o_3YYpJ}8B&61gV|uz&Mm9$U6i;1xVT>XaAdI54KE;D8Y=v0+)Y z6tB+NkF00g;n971YVeBDw@Eb~KB&X3FAl}4Yggiz=|j{|$i?|rijIiCsJ;)V?2>xT^-h?x_HB7E9PG`)-%9Eaa( zj6+%7amR~-e9`%ZW6Cu9t2jL?4vk;P#chwj>sz;f-b6o?x^i)P z*HQfR<#!mjY73IXFS8u2CD6}23t60!gOtnG7?xRc;W!hEfH}f5b{C(A{EpipC5oyX zJOx2Nz5(OwnQ&}eh`^6uN8r2u=WCp}t`3w|!n~#cmUj+w?KySyUyFT_JWosn@6m-M@WoFxNO(_+tkLPH8A+ zcN3xSq%wNX?ezu$DL!=V(Sste`>(fJ*gieuBtk?)47#?V z_ju$e%=_XCm|S9%>dmOCEX3>Y&%^1n=OMM4vFB(y3XlFu`LZHVp+IIvKJ)~q4Ro>m zQ?@#=InJIt2c?Pt&Q1Ra%xY@%1hj4*ij#ewj%pZ*1`VQNciEv+OCVDbz*{Zc!pOpL zc4*lhagA@m&l|pnRIWlyY&2|67k2MC2^#_J{!^37lnYR!* zIoVK2SYUu4l+!@iQD{Nu+d9H*Dup3Wf`mXhIu03#!jcl&ClE4)5_X4`&SR$hdSJ2J zc)qQ)PT`io5)yEVOLb*r7M-q16ULOaLyDcpzudoJ>YA zEqf-n#dJ+GbM*Lp$tnW76R4(gb4pwUyb|awM!YC?E-pw$o!zm9YaPiq|RL4Hrcn+el zUU>GdAm4eeE>XQ2_5)Ne2tdjV9>#Yo5OJh8?1v7ZdZr7u+0;J_3A?Dz@$C2k!K(!? zaA(>cI85!J>ZHD^++1lN%lc4#cu(KD`2*g>xL@AIf?-Q=&*R5X6tfyporj?TZCmir zT#WrzX#eI9O~TlD)3J45IC^!BhB~$r+Q-FV{=i8Xw|3fP=l4>)rK{eKlbg>WdDuN( zAa(Qh>CC!}i=dS8lsT}epmR!T-P>z1@a;kP<^2Qb(x(s=VUHuUd0Xx@#U!N$OcHcX z_f46Cu5Uh%^-EH5=g5vwgvX<4LUMRI;_KsogIDZf3Z zG^|~BH1mqN7HulQxm*u=yz~&%GAq_inMpSrj&x^tbfSk9tgJu(CGPG=uzvb#4460= zc^kh*b)#WiC(Pw=z{MIWx~i&SI|9;fbgn75!u}Z9d6kW z#=(;V=<09jLM%?P8T+^Y50SlJ#mpy%B4*M;jD7bTDA^5O#s|EE$2}On@P7zW=&4e7 zM5iRWmdyc=y%Y;yco*YV)R)(3{=|>?{E>=t%tXxAb^yf}K@5qqVe)))isgIzv z{c37-2E*{*MUdP&)LUo{xT&)dQ=VjP+aVyY8=Yqg*QEQa)2Dg;F(h^!7896061(-% z15j${bsuiRu#$Lu`=Jt9v~J-p59S=}f`%#w9seuAY~O4A(L;wj&QHPG%wZUm7>Kz0 zhvC$!JggCCAlu|Xr0W#UIr}4^>A&&F;Ep)IIu-dx=A!qSFfg2(F#K`;!X6d<3TLA} z__aV!b@DTM$L>Y$n$=fsL};4y+c@3k->}AXggieL_8kPOUxh*Rm4DPPk|e`1Jr?r2 zkHQ_RhNDXol&J)&!NS`sy=4@@0u8OF=2O!N_9?XQgPCy4N+BA*3a-347ub{m4S}&` z)?i3zu~i_!mTQY`f2gsBQ*3kiU~lZ*uPDO$U7_;`j`ieMh7EjVKsjK zG6aX(*Wk-{g0N#*C02i1bJ00xbrj>1BXT_5-brv1j9sg0sNUEyez*X-A1n;PXr~BI zuPwvr#i2N6bEB=|_eY-}JQ$D3i?(9ws9xB&ayF(H`o*plK~1oI&zoK?Ne#N5{S@0W z`XQyM7Crlp$2tOpx+3OAPZHkfFGK%%mj(xq2X2ee&b2iA4;l%nL;;h* zRTmhDs+t;V=Vh=l=&h_qRB|##^yr1`+zM1x<-%dugjL_K!TD+PG4Qd+@X4pks9m?h zTv7-{ua?Nk%0r+g5H_0=29q8IxrHzgycgu=Bfqc^)dasTaR9f{N@c%a$*!u7ZTT9b z=4ayBPLU8rkGcA9Lup4L9nuE@FLs0etou4c1V>zoE^fW+{7B_*wth z;M+Kqb~uQY4-CY(<-0KY`**H5&lmDm#!tu5cFgmLj#6?)sw>}gspPO&VYiBrx$+Yv zj($=&=567a-L!lw9bY&96?+yTVd5K{S$cJ;z^RNv}CU z@qEDyY?wI?_q71h8TrCXvnsFlx0i1lx03SW4aEqShwlcU)}Gs< z&M^#Zt|gGx)hYerr`$SqQFunFKAqBb$XzQ~32U`U6WWhQR(rNIqR#mQ0L`8yjMD!M zkk-=&t+QOKQ_AWj(+y=+S$6w)c)A?*Su=&+qbXzsd0tt1I$vs@SEqD*{lSh`r<7eo z*f+Y~^=k8>$`g)Pys#Rs%PG^L74XVnBlMOkyh^{XE)+mBWl$AU8W7&|g~B|XyZ%*) zyXg1rS}jtAlUq~krrcHKzU9aXENbM_ zVW>8tsIY=y)kd)6!uOl@5E$*o?hPt9nZ73+u(@0)EU4hlPBy0oRZR)Z>|2XZL^u2KyQ>jI&N5i{O=2QG`5Yob;&=#&zg(!LHSL5zzAI5dc>s3_nD0EJu*#!uOq=WuJU zp4h+pD7LQJfTv!41v~eb6GW#YC@6qK?XDHy!b#L@W`IoprqBF};JY>EdA>rE*ro^$ z4d7*+mt8>6UPafaCfIeNL9`B1v50xExvpg$`|)X^17=#LSN&}$xf?>g>qMf=h*j3l6x-;|8W&< z#$-W0#*-Ox_0L(v1oW;hKiSp(8ScR^XkT!zi!I)f*}%f82andQ8vr{TIKmS z@1bst`KvEybGhGmxF7z~;l}AaXf)q#~PxiOEYL zA>d+jK$%00i^)St+&pxs!(@WX>4x3ugiR3uz1c;_*dVhjU@)5ys1zeAwh@(#k6!wi=-fkfOAx3e|M1)vbiJnqbjshFqcIqZkLB z8xj!#Bon}QqI2K&uvFHdD$jzB3C;O>CWd4#t3j){I9Q_^V8^!8h>&SfM)x3-XyEcV zV0G9Dqi~vwE_9HA)3?^NVoiY&P<8bD-8} zP;9n9DObSbaB|Oj_NhNKEEG982Dn+2DQ1EuIISqnXIm-Xf;?3J+j~JO7h~}kvj}>l zV5q6Ue_x*nyT!`Oxyr)sodB7RHBh_DraO4&z979Y8`c^#^3#jC=BtQVW!)kw7b}lW zB^Jq0P+W=tg_8aj*PXoVq538I8|zj()^{;UDCSUfowsow>SM2}U)%d~Q|!HV`K(QM z-$!N2B%z46{?Zehwk^O9+pc}5=jAb8<{=@M&tz9xp3*bf+0CwD$8z=TQc@gEEos1w zN-yUME1Uo00L5^kGCRr5T@$XKR9Jbs`HlEYm54mcLatQ)^UwCT2C?USgPO|98?ua( zfU~|fpm6W?c@OfK{MyChlH$KLk20x@n|fI6BIZydC0GCp#qbCJ`JHD zzYyW!p|r1?;N2r=k-F@B9;(ac7Rt@zrZSYl#w4%kUfI+EsYDHh+{$I4+;lGrF~K|C z7v$_1H=CaZol*yzRSc({3Y$QaX%k4K64>k#I0>ZPbT2ZE5)P{kb|%a(mO?F4LM)d- zDid)pe}ln9c`+*M7&rd0{`q>>0sSY-=KpG${?lbHZQiI+`gJV{71^NhMwW#7^aRfQ zqj~U3LbVHNlySXDLY=~!XKuvj>XU>zh3hi^btR$h1a8POt|tj~s{M6Z&VEU#{QUgC zHIKEDP*RCRRFG9j(4~Oc;)aS~R4&)SV%9@S@Fo&Dxy97u5<$vz^4)TnO%^8m0~xbg z5;RFg1dVPxL7NC)eDkBAktq^EMf*5iHZE!}@_1mko9G;J8rm{=vJ=>fQCe1sWt%o| z?M;`2Yw7byO%{uTAXmXHpLVx{hyL_%kU|PCZJHLKNa1h;>2PT49=HMVF_;xx8#6>Qsv`kaf0I68Qz@N&^ zO@L{JDkK0NhX*xw8{LtZOHo;9y^Fw8&ISU^Dy@`5E>Y6Jz(Zv(p|)4Vr+qlxZaye* z)31ukgbDYHIQSCJa!{vhQ+d`H&CsdU^js8BDpWozJd@!0N5IMBj0g#hD7jwSh+0Xg zn=tx+EAcs{9%l~D=7$U3TOupAZ7M-*{$fNv^g6UMH`Yy=ineV;&<=bZ%F+YKw6;Qv z#(obucKqp_a3s^ZoOPe0D(+siYZZc{GpC@?Tz^i)FVnVQz@*-M*;ST`4WF$;3T;<= zim+`%4N~q*!n$`CW8j;QUOLD2G|V~|jTe%=j!q&o;s!s2^($5(nfQJ1;GqzYoQjqA zCvyiSI0hnj?N~U<_M_>?=a4;RB#v&HgHI**VL`8pV`{~Z{02GSjP#!ON$xlmclVpf zUGpyDA6m(`rSD&k{=Wv|)&rm7>oqGe?ct%Av}7e8`Cpj69TtlbY?8D+3-bqmg-&f2 zqQwWfP`NCaKRk&~maaFk*KrVgPbK2kcA+@^#b6XSpN(GK6R_>ESe&h?KW}uw$PY30 zn-}?V{))j^yX3I2-IIo8U*+S0fA_*?cRwnfTyz=p60A9}oCvQ!2|aZ&0{-_p#40yR zVy7Z9Zz4+D@8MpR&SR-C{u~VVmTwTU`3+R|nF7ts=b>n)Lj^4d{_qB*A=j|xS}HIk zX}@odD06!HZ`we#&;cjsY(@Mty|{zWgqU@F4ywyy#l1;e`2K8P|J>4RlMXEJgC_TF z<{po|2ghR8qD-_6l=0=|tMkzAp5Dm)X$#+%t=sa`A*yE&@^zNNwP-QD5R)ZSFk(io z;OMk`Fq{KcW7z#;aQ??Ru(|-9=E}V9?Xj`G`J8o^ovl9P-t#~S9MKO#Rt(Q>n1_jWh&fqE8UFlvhKl=qeJ88huJQ-uNRX9e;Y_ml1p!_+n9sOy$F^T{wIzFdW&ja<}rgkj0*YP1@!s^ifg zg6%JPP|>a$EeS+a8s{J8al<=9k=1J!p18dccFubO#dmy!x&Io&J)@n*Z1m~30P~*A zNBkp;XrG>VZS`if2$tdzTAsUOI}ZQvHN5@xZa)9-g&rxGzH=K6{qG3`jr@f1q7vOYmE{rv1l$DqA&n7ChlFdbhTP)=g zQS9?E^Vo+>#6O9@_~avqYSsmNkDS1L18>9GoLn?dNW}faM-pZ^xMk5sfF~u&b=BCp zU_TRmw-N|TLZl(3pd* z7*6azattCmKChsZ-(dpPqkMxIQnM8nhXG2Z4B6Q^u-R--GL2P-6H1Mi--F%ego^3* z5%IAP^9H?v0Un*#fa1bJ1O^B5sSM2XzD=7J*q=&3X!r0?piDMOPv_FeHE=2&kjYgr z+ss_r$z^3gD~C)b=OcXvm`arlCX*Cy0#2!j%76gZY_nt3xW_R1zTr4_@+?9l1M%^+ zPjU9t5%lkOCqZ%%6q+DjMsA0V^5;N#Nd=Xv0|muy4(~KZpgy&Jn9;vmr_>Kp*QY@! zB*gCzaO%|cuT!d2V$Dt5yaFf{mg-w%;~$s+HefcD2_0AT;MY;K^J^T@w?oRHizOSx z-Vej^10Tn!w>P4R*usHS0MU&EqWvzoq=N$~n*_Vf>s{6}1ss3}zWMtTo~`uavKY<6 zXDp!E@M(Bt*buCp*d0rLT8d#y&g1JhydL4Qb$Iyu?if=&4=4V!kblf>cgHiBV*agp zpAeQSjr~g(#`0EZAo43gX_OT@a<26161GpTH%lhxb+fB7WXdBrs`6MO@C7Za0 z1F3V;n;dX>jgh9oy>cnliRQo??SO66X`2p0{>BEcY?KO~`42)uoF{+b3)nvtoTuai zr}6F1GYcUv9|m{#&_8Uh7?84;?$*If8G~L5t!PQ3G8DUM6ma6*a{i5=UB4=k<)XAuoCi2U3<6|1uZz_f}xszu&`` zU-#teW)YCidN>6^erPlih)Qt5U^1auQd68hn}P3s z`Wc1g`LMg$+(idofB7x^uxdGa+|~(U@g4E-2`Ycwa0vRJ_d#JR!}gz+ zz(v5;uvtecJ26zj4NzU0%Ri0VoEG|(aX>TMtdL6;#DX3II07s7SR@keG~{+Uxg}6V zaOiP}_#Dee@YoSdov{ECYbB;ln}Pp*vkaBR zg^)``-1^Ac|G>ZiSS$o}H8nUy@Ejf*ihw{Zs;X+xAS#Nhq;MxYV!OP8Ou9d24feon zF+r_TLq+YuneRXyn64h>u3&ro(vMj0_Ef zl*&+FQHZQUde=8@h3?F0ly6&zjEMJ_H|`rb9N;9G*+SWExmEz(3YEYc~wv<4o7r| z+y^?XTZcnRFGgj?NmT1yxRZdfIwupdxD+tVs4O)jBtl&WW+D+HDnV%`flR|#41BvE zH87O~nt}(u%UlMd*$u5)jE)br;p@sXvg=t;i_WI=h#{RvjiU49BO>uP#MY(J=qWA0 z(X++;&%l^wc<=T|bb9zl94s`V6W!8B{lnqt`weovc`V6HLqOw&P*EedX!Aa_Xnz|z zMO|7P^}Dx(&S3lDR6IImCAhuTT!dqV8hrOuOYAv*91UZd_&oZTu3nAConO5qkn&Nd zhDP;!R={l6a__wAj6En%J4pATLBpi+=zI~)G)F_x8RQ?&L~!GF7`J{h^3$^jGzAZQ zmm!^=i333aG7Nl60Pozh8ovcqWI#TR%9+LC?*FVn-m#-1bh->NeQ7v7U%3xbG!c4q>fXWu%}i*)jt}}6*<7Qgi@&%oufp! zH@!8A9Mp)*?1=G>cN*T+2DOi4!qQGiJ6Hj!T88G&2wwW{Ebes8U#!?}??dMWvYZ9u zaq9R+q!t@7s^2iY+7Wp5r!CmHbt#xTK`mSkq-VBt?IMK4bVa|mNw{O|QYd}rdj|m; zR+sl+&FS1f1*DS2%eY07dCfbk(jh8{qS2-fk|jbtl68EMxxc`*Xc5GXyFzqZefcOR z3592=4sKryaff!0Ps`(;+mZ#7A?lpqufp#yA9sX@rIlbpfwCG@=_uR?1fA$_hN)}zC zjk!ML(=l1;8tlvvVfY{eJuL~n=YEyx#qW7V`q%2vxB~%c;vee-Fbk)#A{z(GWJtMd zG@gtN!r|6)(4lJ^-#&>0-=vmG!M&f)9o~f#g-po2AI5nlO{UD5#eWZ{9!8%@AJb9+ zY8;UWyde6dm;g$p)u2O%*3fDrAr_0_VPPso^pAirvSB|49tLaW2^5!RVfl)m zke!o<>~r~W8NVWcloB}7V7qA?GS3$xH~lz56O+-nMQ4nE;t`k#=H`F3lJ>EorXmk2 z0y8Vq*DBs!{N{k}|oR&p~B*u(1%P>~l9AW4AlFu)dSP*g%7$9O^S} zA3hSj+I7IeBl!qYIdOZhCvo2ceNb(*z-@D5%+r&oUyvg*Dh_2uxoFn1DM6za)l~$S z8YQ<}1_TD7u&9IpSxMmNL`Hf#bhM6n=8MH1=(JjtmX{+uG6FV>8KJ>J+^Sh^G(bxC z&ccE+?|hfp8=Kzl=CW5BkrHysx0|lR?3OlK$L`C;<{{Aj9s*N^R6;hc4-dNy; zQZ}gjZ5v4D$~g#qPSD$4I`tQf`(-88&;I11{YuXjLMi`i+F?u4E|{znE-{)5#jH_D zcyC=6UK^P3o5y>sRnW;J(6(oL-@2NLe6-b~zT%Fg5!O8r2h%sFZUX6F0i`0b8af|T zi4p3Bxsax

UZy@rl2E7LO7U@$vOmMa1~QMWPOe*0(;0|AsYfT5tcTW=WTqV{st5 zC0_uP0fD@NaL}aR`*7FfjSCpS&>8~U$p;- z!Gr%W%Z<7X^DPH8?S`P=+u5T-Omcl_ib?XnG!k8s@A#Nzf&hGc$4(aqS$NK{D$1qeV%24)T6F7WS_TqwUO%kOq#{MZoa zf}6qNbRs7&8|U*1v3vU-6qc8wro@2aN&-p(tbDr;8jTM9?;4IBCkr7t{xb|U24rXD z^C(6xxflcPzYAiw61xwbKyp$Gs1<4sQ*zqQoTc2}Ig%o&m`5#Q^F5hPD4zmgck{WJ z?2|Z~!^t)LC z4$S>>5k^1s2zS%WJeLEb$$)2{eG!Lt@4{o0ibrPolHmx&-E`p@Rh!Aq0h!^snAh;7jtW5+&zGZGD^`@DJuFI&?Hy)JU0N!;s^yJ{z{rdAa%khHL z5%X`zXIoi0Uudv8LUf(JGk)s?aAUqdb?!mb(JZ>ovxvlmMA1L-jO|v7qPn66+scmM zTy_>3L@3ZIF&<^bg*aDOg{o=?3d$=`VK}LJwY%jhAt==T8SM)?j8!W-2|(HsSkM2 zvsZsO%r#IbwMa;8fx91=0DXBn0cj%~+r1U14(<@*-UkNLy((b0IO)7{REi0s2|9z7 zN|+308tbbONY^l$EL>8`Nnp$^z_eXNqcb~Eiq&F-#iYgLxBi1cLr3D&`C=5MpN7+3 z0+C$;cc~apKJ`32PBWjvAXCX9lgLq{H?dNJL@t4a%EDI6tc|XE^(ing@T0%0Zqf70 z@fsma@I-!eowg9q)h=kXxT-vAw2{{yw4^wC6F0BGQhGDpOgGcbbTi#}iFnOpVbVq( z2TrHw69{>*c~2%(DhaFvp<<5{9u^X}w5kZ{`3W*p_nTCMYfRks^_~&*TmnRaT zNqizQ3$l@wo5|)i!fIplEddqtM3)d1GB0(f9V&?i27MJIGC3?Z8v!8u3{KZkdSEeH z=~y|fldu@>&?r^>lQ$F3w;GHDJz{v|ZkX(L1Tg(ksS;<4E6}4?PdIIESk-DwdT$<- z1eHvTp5-sBK{zrqGnhLR6fzHFY7N{nC!QG85e0b${Iu^3YAj}$EG7bHI<7$jxQ#~c zY~>=Dt}>cXTvLNL-kOM)UmB0Ir!%2e$Uvoo;NT#xRjRM3fLs@V?1FL*v`j9_>2N}& zRdXO_j#N^o15T@(-wz96>LOTonC#q}o>|XWm{U(l36AdDf}*@!u7F@=;Lc_`h+WWA z*)SyoH|=jXu&EAiZbf#|eYq?)D41e`g3W35{PP9{5kVd^M5^-;|>07J(b0k@gWUDaUGHtwKb1#zZGu6M%jw`w zN^*^y3)Hi)=`IHZNh1PQiA)TO!wMKBaEshfDg#iduZEl;iAf?k2o6KFfv7N;a4zp0 zL9CmL$xA$9uf0yhbv&7+mCsqFzpHDipwTE{vpNY9<*+kYqkSYc51*eYVzZ42=+tth zkT+UqvN3q0b5j0n1fMFo76bd;K_DxGS{lluN;zPKOr?f{0FB5K4ucL44!#dcH4qjY ziptU=+D}5q8_~T*3&gbPg|PMtY&tm&(E$>CJpU_{8q65=E2P0;{1d#x;($mc0~334Sgmk6Z3qsDKzVgJR7xi3>VljAojF!9 zM=OWb!GF1QmYqpZX}E#`9mu0ed1Mk)6MQp^GK&l)CJ1F^Q7a22<7MK6n+6PaDlev$ zC8P6;n1hwo&MmMKIb=8SX{q?tdYzWD-yQz%lxvQT9;mb{DiV6$etL&1ti^>3At@1ZXZB0kK#DsZ2(& zYo==ndYm4)3=)<{g&b}c$%ufBO*fU(KZRHdi>-ooqP!63*$vf@5-hu{)v$}IAQ34D zvOO@?7!ec^h4If%gfb)y+YX8OlQPp9~oH?`qMr@Or?)u*brA%iuqqrfGV%Xr!jm?|$5Pf>XF8=1c|GHIe7h9dW0TP8 zgIq4cQ@UXcthauFxVrJG90zeAJyDQ}5>;Tq*zYiQ{&+6+luXT3kCk_v$1#v|6x zOoeO5Is~s4{;nE4g_b9BJyXw)MZWcx#ot0U=%H(>QOdMO&xt~@Dz6LHKKKhh-=(2t zp-v6$a26{MH-j}j3$qW0;*}9X;m&+78-sLtkUZG~6BE|q+q{8LU&9yc=<+^jeBWm7 zd=*zmlQe7FB>WQf2Hu}IxSmew+E1q9xl>)Spugbo_v}|o(fZURjGmFpO(v&SKLpDi z-y$acJ&c?E8J2vV3*8mwsjfDubx17KtAyC|&Q^0FJvkn(^NS!m&=u|ng*)eE!W=Le%s@kiFAf98 z_o(pkcs;(G5{CY7mLbIBZ(HMrg!;VpPi+iBP#+_1dqsup>Hc%(uBznwiDK-&YyDoj zI=P;wu;2;7k&HQ^9N)POZF;0&(a03s`^`377*<;>6}zG$!;u&fi3!i%3teanlvh@x zw6YupS$Q~i<}8k-rNJR}!CY<u)w^hT2nB%l?s`J@ERZWeTa_G5zg5;u!PrRP>n-s}@>J1CEK zy9I8O3vR24TbCJd-#L5)o_Kf^cAq(eejVFj_0lcK&DeqpqX`Y8B9R!Ez(bifZqgY0 z4jn{BRxVs=3`OVdbf{COkSp_9u3kwvzz?b2r*N4l&T&K=y#`@;s&jnS=h>|fIUp4z(t>vo^P zBhS2s29&i;M+s4DH?p zNB94V#$BoGX`R04IL;yh`DcWfABoM|qpeqwXvMm9XwbYXx+RAEBk=2c6g*M}tI;Am zSMtlN0-Afl%XxY?q9#tnx_1RV(T&|AF)o~i@*)HVe7Wyw&r zZZtAJSV{L|^zEOqV>b+wCh&)HVPeNlInx`D)3zB0J=pj9?RfXY_katalvf63xVZ$; zeE!Bzy!FwNdg}~szskVr!$L}V-WE8M=(<3xoLPTMlan#ok9%v#CK;ifO!0}Duc)2tpgA|jy<*R*$g&kuY+c$i4JCy-@AO(s_AImlwlya0*1q3LfZ1) z7`9S4uH~QADP>(p*+xkAJcx^WJ*k%7OMf1m^QJ>KxxPYxr^K)H>JBWcwXJx6Wdelu zVRbG5p4?LZzUMu>wc(=qv9UfN<=e79fWj~y&Oe}RPlXnr(gVCN$AhXh!N{0iebGKl z+uUfCLU4~2Vak^Z?0!syMiT=FG|K_cZx8lOr4s0EY?5aE^$bY)_4DP}Zg!!k`U;}; zUa4G% zNegqO2`-C_%SJGZY-Lpibkx4O6%v$|l<@2E&+8H~clPplrJ~GqJ+)K;jZ8tWc#0csDV`I!*4Y>d<+JE7C5F#NuL=y`iDun7_^tK?eOS6s@wKr4x(|xf5A_qGjJ$oI&wc9ioO$9;s8iT zNkzKm=;nPN;@Y<5zdCQ`3w z<$K&Jzh>EmFqtrB3tZ+37%TnSZgNd0bZ%K&%t?5BDzjSoUz}!j&QWV64eRp-m)>Bh zd5W+-&g)S4#EQ!l&sWAnD%3Ym$!TDD6#(mVIe?CvOR#HiLKS)aZ`5S?g!ZVY^598XRKETW0#ho_lHW#vz zIljMC|60w#R&s$Qo<(!wd!LwGZ=LIceAHS?IRIadQ6bcbZ@l>%nj#D~>sl_EMU%Hz z{viNu7Y10_-sY&HQdaL;b#+fWKV0#f=k%vP2GYMmu4l1#{jjH=6w0c}{TO+vX%1DD z9_CbZ>_jFa<2pm7)^VpL_9@zKQz5e`6BR`zs5V$3QH3BZ&;yg%O0Z_fiNk9#`JK6V z`qA$(?(t`lmy?M-`%r8EjYZSMRJ8BX4jJdtaXS4x8a9YTWMmi&1`CYz zFE1|(sW~OEXP3inwIM#HDgA4L*gn1CHY%}u*GgE;W)7Pk2?3|m!#`28FrH4glWVEE zY<6&QFIvy6o+71^dvMw5Nr{{yZb?*@WRZ_S*OMiUjUaKDT{%-MbR?Af!QS+mwV#}N_|%J;Y1 ztvo_rqF^osZa8V7!lZ|qU|U~a#RdOmY!(&*Qi+71n*iEqv+(IcjV1z60!^2`P(|R%G(dFB^PRV9>aHMNLhWSl#P?OSZ{N+ekM%^H}hj0g)0r)Q-{PGJ$( za@DHTuvm>ao_ZcurvoLWWhgE!ro!GwPJZO!{wSa56Y z@Oxkj>`Hpc-|IX&d51(?l1*s zE5D)*qcQ2tbR4|M91xAONONsHBKPZixmyB_uEObxw0c_p0V3ZzjuRDZihIhl$iEZ)zFXs@n zD+zCXcL?)Fcf+e69|7^*1;bE>F!cROY+Sez-Mfsz#N>5Xo!^da+TqsrwKA6`M=-Xx z--g)XAM+U{2d>QGvs315^s&m=yGCN!w+qnX{tuD8Vg@!Wor}XAX5y7D^(~u1bQ8qK z#h_&nGaejE?)@vi9FjSHzrypufBiXM zgZ%glXDXjV{sv9-RYiGS-_7f$TrY%{;JX^Db@ zY&bn$v2L%<(=aZ>fEPP#75&hPzI=BBS2=+?ku8R1fTVk z1!dW-W;p1t$nJ#A<5!OKu%Ig!O1%{jY-T9bQV4E00>UF8E;GX=2yoeqkSn!t(mjWX zB&Z~Kw7ML~&&xziY$!|wk0t^=v)h2yO`0ID!VIUy2$$Q=0a;+Lv&1K1C3X_vYE+QA z9rRI_KusWQak5|~5e#-CJZ>kfdOLJV1sqJ?ih$TmK&4g%aF+!mm1E1!U0~1`U_hV# z(Az8U+ld_f`pZ@n=a*o~lI3XCr7MD|oDKR)WEYh}Y@z%R1ZS64LfbeTgM0Ud(X79s zGEUD&mZN9&?~za9NA}~fOLu%;-?OvUN?)fFw0O_1Yf$s$$j$e;tKI(e9NbQSU-4Ty zkJPbvR$EC`2}6*%$hWTABARpDM|gcF%)p^*kfWgsb81?UUzp}7{oVLP-G*~F|DzZ%DQ3WY~M8x{sAC`ECH|dsNd>s9mn+0 z6Ohxl&hoh0viy3z&-j(S!l#=)?1A~XHT?$y&Dv4gM#EpNF_sBIU68%fH_VwitGcu8 zJ74v+r@ye&_v4c_muP|i%TU^&Q~Li${;$V!Yzm`NIk;iJY!)!HT_u&j| zJD351U`j5yQDmrsPOX4MkaH<05&gA0oNxteAh-@V-%BYJV;?h%cLBf4B z6>2T4bj+P2hT!LIry!A8pf6*(sydX@z6zHM?OOMS+hasVVHvUwX1E;^L^o2w5gd*R zqZ<;YH%iL^78yG9>4)HA6OQfpnaeIQ?Nq5$%GCp8^p^#0+1Mx`0k%q~;kvENoj`9f zK&FvHq6&eN@^2?_)=>W31i~&VYrDgS@W61CRF&fW=VuYjs<8626_i6a%q9~AnGC1W zQ{gbvvr5_zD*-VZp?6pvd?EswjLxl)Lq#R9dD|}Z?%B!vkJo=eQUWAi*ILZiqHJ<= zbN_o8SE~>H9RWiDiHXP^^E&<)QiD!uLuyD3sUh8g~e;*qWPue6$m82@@h43$_S+hvfR=L96Gcg z1w|!1T3^iPxd(xpoL@s15{XKi6~(7hV68IXkx3Kav|8X~I;cc@tCuf^&7enQgc@Bs zb;8;;d(eN_aGX3_0E^KIFMJYH%p}8Rfbw$ROaUgVlh91UEu zHnk}2V|BQA+>=6~fY;$bqu40eGEA^|tOTugc$HGhpA~d49JF03l0d0baW@BTfR6jh z%9INJe3-(4hs};faO{-`)RAzz8)|n$`u{O;ozm-75^C|(sa*2mMwNtOJ)-|Rgnv|H zkx4?$=>{n)$LmQF>M*7X$(VM-X=thtd#VlQw1)#R-jld4bxN6ALA3=T4!9w8N}1b1 z^*wl#Ro?5foE0^BJfC^~znVwpF2JrWk%+t=f=abk#Rc5uA~941O?HnLcAFb59`wGgAHH6-f!I$3g<1`> z(Fn2N3m|0EjC!3cxL$xlN&x57p>x-cIFNi8ty;B#oB+~jvBF|tLi0A9$ui(v7C~>Y z7M9Xtl;&k|2`QuA#$5tf6=iZtUY8qs?z5@j)=7niu4^(vu2CW7=uxN%=sXS+9-a0u z%8Te8q(1-I$EQ63hg(YLVnh8NeE#n@5YoIo&Ynyqc+}zL=bylVgU8Xhc?WLc4AAQM zy)&zPcoi0R15|CG!VIfEj zluMu>;5>8o6!%RP1nMR*$~4=+oLSv;Uvh*YH*2S<92{;a zL!>N7gPxaA<5T*NNkX|w!oA0v7GKZr9xIz0LH4dI@Y8p|T@A>26;OKN3a|Y<&g3;h zLUShXWW(m43(z;A2-}uz<8j$SySs4P$c{XsUP-%1JB`E51L{XHdo9`c`JLtdg+>_i z(iFab?>Tc3K(CrLbscuD(_+9F;MZlfvI>_9aJn!t38#!|l@2&BdV9vb9)~yATwaz>86?)D49xVfab1@Gf>;Fd7J1>)%T3A^7U8!*fX6Le| zpvjbjXl`6vbM5#$p24rvZsz;2u&yWH`wHWmUDl&2rAh g!)&w&p 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

yH8AggGHHpYQ zQ2XUkuJcbJ?-NUJH`5K)^OmYA1Uq_^6SYQq7&8{ITUy7lcwO+s>K+q2u7OBXG05XC zs$OzN)&_;kXHZxHtAwv|aOsKeeUIf&S4LljHKxoDI|y0eLm~xyGH7C(%V#u!b@<-N z63^EVZtSEU(0W!i%0~<1;zA(t3;A337T%p_v8oo_Rko8_+&zCwtD1k?E6({%Y5$|W ztozkQgO=FY_{dekN$6T7hk754#L19;(fK^URPQrEGLaw`p~*_`syKLH$D#aj2BTIj ziM1I)mM5k7ST&V26qJsE<3%^IP?#f6wzgy_Bim{8rcx4%0+~bcQC@yIRLaDCUt8J= zHl~*RixW_RQw#mmy*ajeSxoXRym-Q($ZGFA0&=f3!QvYg2F9}Eu4_pBuBx6_+y=Qo zK3n{FFxE=SFlReg9Q2?WAaKyD z8Zb%uIAS=%B3LZ`Zic6#Z`4L9T(YaFMvcuuTA6$B`EuyP3qvWGwrV7gH+aPDtz23vyV`$aZUBz8eR=Ko?O6q?sC57L# z((YaC?t)@sVI1-Eu$`-TU6~j^l~Yq5j;AB*kFiH{*k#Z=g&T|hpU1X1WkTPZLJ7vQ zg*gc_Wx!>O0FiKkF7>=a1PbkX!rBa!+;_s!sK5$*vWfWVZ}{<>#7N@kp;JA7;%;Ir z(n>BfsdY$Hzx;pRtpF%T7QAG2EtPoss5qE60^o4J^k0RkW)XWtL~6E(%aGMR-*K#Hp&iM2T_&9O4R+D1#pLfgd=DeD zyqydDnf9@p_~O1td9kN#3S40ami|$=jgi1?X{K5?_c_KbRgCe(@n_HH; zI;TXFNjF^Sf?Ph-ePE>mYc;s3Nfr+8!c@7ij^1icnF}R`P0VVMEV$K0l;hI_cx}^{V5AVbFN8;KFw)Xd{bn z4*f3irnUHz!=R{#0#6}?`_sjVF-_5)YO(d`W2-nyI$Dn-U7*jMotKK@65|ux0+|!tmr~a z>#$6g%_x5B#Y@aqs@1o!3C)Bz9dHapik-d0t^!vVzd(n+zsE0%#ZTw#Cz zf|_qMlc@P{W7xJqL0QPo)pwx*y;??Kss1$W_{ct*3y@+WnxZlfDpfhAl$&#gZP>Pf zlQ$sQ?#s#Bz*S@up`xPp7m>KvlvTj|L_=yWh9g4`H~vVrk;+#{y4{g-XOUZR&4ulv zBq=f&PQNRtFgk+ECOYEnR^+r`J&zH#(E0p|AT2-JN#~Fs`j^Fw)oFfJ<4 z8wYSXlxQztkytfWpcAJ3RA$X9kDYT~M^m|oWixsD^V$GL`>Do~6mAttLPWZXJgZhS z^tkd6!kqw{%O5t_h^Vw6jih?>{mRT{bh}g1k`JXc#J~8y4M+p0#DnR`%=jXt>Qo9Z z$7ZNF$>1dzlm)63VZ?L&`3bWMgmOSYE77O(AnLru5Wh}XbK}h?O<5417G71rY7-I? z3>2go&p~s!Y45ivigDsoHnA>TZG!`P-v%TP?hd(~cDI^;+;o0G;(PwawydDJ{ph*w zUwl5c}GcyJP2tmG`}1M$uk`_QPf#KqI*9+ za>P-o5VNR_5}@P12+CuEN8)ez>cALj;WSz-LkrJb{DiOTv9bf@%l=0tH6az3kOd|` z8VjgIl1heh6%QUgE-HMJ9+wgqt@@!R4b7bRs9;u9%Y~h6!(8VuB8bgM8L!@}nSH3j zAFaRk5%{s+Q*ZNlx-GoQ*IZ|U&QarW*XaGoZYc9tKJJQ=59N(D)26meS=&;};j!Mt zY}1Uv;dZxY5}zHu*x~i2vnV_~faUJ!k6erRa<|X>VG`+1q%Xky{dKAoz#f&~0vvBX zdsDD#RcJ7X6#YtGdpk0>>xto4z(6fFr+O#O^9~2L)yn1Ibu^B{`(x_fgq^RDrltcd zO(ArAK~ht(7T$?#YMxRpzb~pKHvhSc7?@hktV(^LYJNgEqI6ki$}$e5feAJz7=Gi_ z_+Vr31fcf3k(%douyD2g0Hpb9Iw*17SR!B4*W=fcF4sc_B)<2xFaS~~)A=&&UGL4m z+C)ez1UGT}XjWAbldjy|cmADGTV}S*@%Cflds9{d-7#~MawRm8WlG6F*SEdt*f?qd zUpA$2x8>?=zJ-pKEV#HnF;}cBj@s_S+3Cr`)p904h$U!aL+|-;8AQc`9`Sy<*c~~V zH#7#S;z`o|bxm{nX!#o_BPk)!(hkuH!#6~v z$$eM!#o@^9bm_$Oa#cSn*HVDDdR9&OD& zrhfl6JH5lJellm$FxmI%I)O!<^~SQ6CoW_O12$%iL@Y_K9+{L(T?M~3m5FjmMTlgq zwsb8}#SnGu^KNu_3(81Q^m{GE@b|*#8Cy^vA((Z|7=@`F5f&W^r-PJYGZCC@s4{%*ZnEWWoxWlkSZFd>X>zZ;`0r|qNFHZ%T1bi9=5 zcPUPTa#G1O0tqA!+ORHuq1#fy1U0J0W~3a6{2rmUN(JIWSAkMS;h|p_WU&(5mdu!Y z`A)&!dPp=fM(n2A zRFhbbn2QSa^1Zz{O-0vHXkvyM#OA-vtn^ELq;CCQ?!2yeakanaFeL19g0KTWo2Ss|QP>H)dIB(D1mLg(FSrW;;!2@_kh6d(y;y1TFikt;s5!)(Yq5B0Mde zw7=Rw9W*?b3>3-@R27O5>U2R&a119Xv);^O&@Du1bb2F%z*|DJM&5n1&}S>&gE7~8 zbb(mSNk3=VWPiNxO=;9EL?Wd=afhRyhWZIZuIJRL^!4R73vRW*Y~Ij`FO~;;=;(_~ zMDBf2rCbVaHNYjMYq?{f3Hn)(7p+Ti>T4rB=Go4|$$X*gpfa$h(9Dt~2k-|DUEpD^ zPlRYLr0y1EG6+UcH_sHE@P(F$Qf#`&x=p@2lTjo@Lh&ZVuVh7@)%XHZ+n|P{@x7&_ zntoqNp)M6iLH}_vx4I|V>_qS^8l?X?t2b#iz1?j;YHIX;(4^CCM&w8DxErKfiBxG3 z7oR|y)bB3&H1q%QdQRI~qEGApSt^~9ug}85p7ag?(_<~m9YsH?T#aRDPBvKF4RD~0 zme%2%OXR(u@XFPOb( zX(EQGbX+QWY)M2B1ScQ3SsJwXAbwB+ADAOmH^Fm6m_dS1YxE?WX^3gd`%o$U?j1<| z5|pV2N7O53Lt&He@WKz>*`;D+-S)*O0%?B=Ti1wRkGdPtt19$!4G$ld7@TK6NLbSa zH`!KcrtNI;xKnFHLNintWR5&(R||T}@+mBpTpV|6zYCX1-OgjHtB@V+H(YD^)Jkge zl|v^FnwkLeRAZj(xugEa;j*R zTHnEAcv?2nQ-ql~Sra%iD5uwHLkky<4YR$awIxz!)AHUQrK*rX0cN42x-_^yndE^^ zv0>~AI!aQA6~P-<0aF?Naa_cgylad83|7n;r&>gymH4shf4uIIi_VRyk+vm`SV^8| zZC4XANT>>-qUgRMAnOtysy}s{XLM)q!rBPD{cn2S;m42oNoXeg8{Qs=j$P0mV83Iw z?U}QzrN7X$sbomKRn!w?0yj>?qqpG6mYUWK1lqVMmAXFL0gQQHaqW{b`0@14cZ+ip z*DgQW$w6+mm=Np7XqfJjqcPW~!UO!iuxL&;Lo0YAnQqskHD2e)Fd5BBhdY}PbrYc- zE=pC?o<~7oPv2qHfDea$tGVWTn7@$Lzdzfg?)P)5O@Dyr0BY1lG2WBaVGg7W;vqDl zy<`11iovTR&!#+XV2LuDB|*8^JcTfnsh`jin}@_(<4x|rfIEWW^$&6v1?=97$_e|E zqn3zC*{%8zBd5Lh(Q(|^{(`aFqbkvb33S4*i#>bWv`Af>8UX^s>wnClMw)YAls?6y zQkfzB^-L7Hf6XYm1A<{rR=#rhd;#R&aF9Szgn4muZu}e`P48!+;EBQeHsQB?sIH2w zP=t}xT)JMwc04&8tyxBt#G>B+hpTgL%LH7beZ9Tem~3NevTfUwZQHhOPPUtDPPT2^ zb=v#vKhAYN#B)D4erv6;I|zdh4A=Yvl|=o*57Sw9jK;LsF*UKgy~Mkl2__P|mx?=m zSjd5!H*{H{_SElmmp`CpoFSLqr`O-V(Sh%8+53Z_N`RsH%irb?d&88&t?n$+EopD$ zrRnkEzy2kBu1xcY-eEniv1}d!x*hgGtuB=EB)8BQS@jr=a0eOHmL?!A3HPb{xE5Zz zO1j?f$+w(=lh$fL!7*JA@6@>3jj7As4Ly+SCHRDYhZj{)-9gFVeXPWol-i;9){?3< zz2a5=fx%xj*LQWaeyXYEeW3R*^Mec@(-VyGcVplFC{yiDi7v2}Dxa`5iufFHrpsgJ znsnBBmcy9Z#Q{c8WP6;o^qjDo<(Q)x**{N_T{2yUTsrHK1qID!-DA+bw93A)c`>xU z1JCWYmqER559wAaYx?Y-*fM_ZAYj1&9cje)NbeK(N6*DW#C#?$89z~0ML{1E&xreB z6Sn3ddmgevNJfUHg`+a>VveHwZzFOdvL?I;DH;W3Md;2=LgpTr)uE$V1#RV}MR^Tc zWmkbT+VJbvPWkfV%}%05s||ps%OHOzH=8c7K2~wVlba5+w9>=lE9n+${UtMBLYChW z8~35>mGS-kqh;Vs0C2;6->nA)@7F;8*8kGFQw+)Q5nWPe*URm6wy9xeyHZ!trz88Y zN3@J6&-08_UK-4YDWK?pG9UJS+Te2ajQKRBuK6@hxSHlUb?#w#s27O%YAW}I8hKP1 z1s}EsFOpdRIVzD zkzA!4Y(BOnj6HMRyzpRbRmxWnI=I4&bjq4EK?|ip2 z2d@t6`seTVNQ_@|OJp7=QujODY@$78*wc2)LDKI&tWv850Ux^`M@h3+7d-0fm87c3 zh3S(j>Ix0VEVlCu56$a?*Ma<}(B`v1sbo9;#3?U0cy~Oua&)0_w|Sq}jrE!D#vP_L zgbV&k@wDESWy|&kJf!`Vb!ymrmm(Go?XEm_YHQZ?_{+v`SH1o|@MHItz}B0yRN3Q$ zbp`o|KedRtl`VS?t1aUUze+2rE0oQx(mZ*b)U95%;^9_tTTIvC2UMoG!I0gIJEgBilLN`bR50r;M@ zpk*k3-Hoqb&ad6Q=*h?p*886dnDu(Ores3|4ABTNw=2c+YoQANEFKd^N&+Ra@Rd*= z%M|CQ%A$prDM7<=(Id8%$KM>S>HIhe zLD!1u0&m}>l!?Jj@AjFKzDPZL_Zipim1m3_Z+~7<=jIIMy`OYOd_DoqGJD9*+T!$_ za64cx4;hME@78fjSQCi^5k;jxm{@#whJ(wiDtB8Zhz0XO*1N)vVbu{ZIHrHj&6?#} zmP`&}HUQecr?|?>5(RbkyCgJgy{k>)`HYB7p&T_F9v|+_QP}OljedGwPa+j%5UG>S zaeNoPLT;X#p<*yzQ*fulq%9)5n&$?OM~e9}8MF0DVVAmV^M26pu6o>@r2Ea`w(Y76 z^~0ytZicSrjNj+#Kw7d<|L&Y(`lO3(PK;XvIyMXPnXzCP%PrG4M}9CD82v>Cf(C_pHAPE^U1`Hly`!4HL1Y zX7@UjId44A1xh-fTwVcdtia|nh207o#L>S_fCT3@gkvCj%sIG3l9SK zZiYkEOO~Z6lyJ;7edZ1t9OjTfsW=V}pU>I97<2njWvHzmvc{=Lc)EclBdm5QDDu*7 zuPzddIj(L;_h|n8l8Kkfj?n!g#J_g)1M9-Ha;{a-Ov|?Px6Pl_Wa3)SjxBLfFGiV z($uZM5hqD=1WMIXB(1O%q*XqSUj;Q-p-R+mu|dMj!vIDS7SZ6H#C6C2jbQjsOUd5Y znJw9JlKg?4-dxJYi1fIi!X{Dc`lh-lIp8;h0bg&WW+C!X!rV(Rx@rY7R{1q3yd-lJ}gX>OqF6G#MfqD5esU| zk=_sw`_xqZ1L~F6LEu{Mqk8b$3DmUM`WwInCwaokN zr2UBRmPg68Kk^B2xSfEG|56FI&bhbY*=!O3H?6c`^NIA!s=8OB$g#H0fYO6Bc-mw> zZA*CsH~w6IiO6*aaIQ&@|3pW_FXkib6L8JX!pY5y0}g9iu+mD_>O1=qSM>BzwKY0^7l`H{X%h6$klQi*m;Hh4(S(j%sV&TIRFrbC|GmAK#9}^3uO!(GIe@ zZPU?o>mAj7pUl^kW4tIl^1E5|Ih(9!0KP|v2gkRDE=8czfbY+p1CoU^Ix{dXnz<}8 zS9pK+C|~Oyv+rXgZjbv*cvAA;1BwvNIf4W9)Y=z z!rqXGmWfmQ0MF9HLwT=SUZG;4Ki`Z+{ z3{yf@C>sn5;WXHs{U)zc1Ww)*W}3NB>)a53U;2QIVv)wm3a1oK_o8B`pwTSslDC_>GBEXrY>}GM=Y6FlP7=^x}#{n?Gqr6 zkn{^+JM*4AV)l<4M3oskThduKQj5j5(=lheC<*QsYpbRk>x+kHjgO zzITF%+S^1Nxi&e8O&^MA(geft;5}sZzo zFWs?KK5Ib~QwD6<3a>5!+--Ketd+mRHP(DQL+C5Ev<*7&9MHd&Fnp*DlBV#PeidxC zg0E>M3hC{L$@i0yd**97zAn9$gKP0$mkf^dlmvRYdiJ}(JAk2sV+xDT3VKvY;&bNn(8F9V9E zVi1dWH>GyPhFt>3@f3E>PGVkjamd{ja8eY8%SDQ)HThJ!?eu>%L6VqQN6T!frJ6B3 zT`^km{3*bJEi{!C^6aF)FdQz4l&Lj-iGNZ@a(^q-x>YansfIix<=ez59rlcje&B!i z)IJ^c>pzr{$-n=xJ)KXV(R>zil4?D4bk{Xpo}2UaAP~C+pUWjIe=KCq9;DsS6)M^V zoZ-i`vG}dy8Y&*z|#)qGeD;IrhX_6ThY+MGs;jQ`0DPx97{E2nN)H+zJL6I(Xo1u(=`F9XyQMxDPA3 zsRbFJ4FBOW)5A{_SbOl{I{Vf^B=$SA3Hs--)zxB=#zq3DkXQ^m!ej>dK+5duQ-9cF ziCJD|-1;*$7}p|K^*Bllo7nVy<(h6;sJ`;Ax->=h}*V=GLS(*)59(P;cdyVhvS zn3ZZtX|euU#15xzD%x3%Y+voOjJYnykF6}jW_U9Krk3LsPr{f|)MebN{A<^r3_Oo^ zDu+Lrz5aQ(4`#W?^3>23v50EVzIIOn{@Z{OQQSH#QdMJjXl2VCA8?o7&ldVlZALc} zxC`8vcH||1a)d{Fe&DXn)KWM&yLg8#F`OMMBXjYx%p%pBsLT?+pauO(qCz2JNsCTJ zjB>8OHHmI2ilA%klB#SA1fs$7C9ZA+hovdzW3rU@etO6HEB^SCwH$2Jj5{LAatTOw zs=OD2sfNmz3cS*>a3oOlHC)Q++<3SkV(6FqG8muyK(`+@Yk6pO)g+bV8bG7U+tgvY-w`%&aO3O&Vdt( zHMy300|1}}Rw_37jTNIap;=KQrP!BJ71{B^EP`Jxp)lY2Nt7%>50eDS(lE!PM=JE_ zlq_OhKljz;J@6tjJ9(KWOG&5W!1D$XTVyR%V@Zx#mZqT5TNIQ+QwzT;Q{f_SKErJ- zur&1*<_fXcyHLAy)N549V?{k1dsa{5JA!yMzs_hfFE_Sc`I$oiKe+XJu`9(C%+`sRaKbvyU z`AYlPzJ5w4xShpHy&rH-?2p`ko)DjMmK1vw9bjqJ94;bQ5PWs7dWPNApWT0t9)1)M zoE*JrQoHL9)TR5#0D6RoU#L6D%V*i0M`Xw}O3+1UqRYe8b3rXua@2chIVkptf^Jn( z^@Mu~BYXJK)WYh;=O!m+jEJKPTq@nT5#h08rD(RMFxzPH-~p``kv>E0-Uk4aIWY@>W$10=b|8-t zifIqzLFXdGcPdFeO2WwU5`9=dapCJR;QN5@UhuLD)F^Rd$;3@%fQU~R~RVgV>cVK2h)~Lz+RMugi1>4s(?`=G);*~LgVQ(c@=Fby%LmZGx}o#|10SI za|E_~PTFjyu*!eR?B^U_&&nse7PD0yWF~#pwLe(L@X4`(t zWfLSyHY`E-WdcyjkgVwy4~CwT|v?mWbK z1LSC-gpK4{Nt>AWJ{X4NDW$c1JrFuqG|oUB>52wCs?f0AC^68sP+*11a&*0Q z+3=pIq-2EOs_H~kEh*{DjSp$sz5#Yu!6GoQ9A!o30a(QQhqP`dNHPude6ph8tTp(9 z((}5()K}DlGmDPxpGkwAm%)U!pkl(Zm?8a6VK5&dZgkIuo#17%fZ-p;vnJ&(kb7mF zbiIFJr9#%i(BU~EafC_}_OX4)`B*>ntC!nzWhh%^7c_&8Kl|>_@10^{G)tHU8CB}~ z)%T;aBg4K?qyKCw2gvBY8fKdv#m+Z8kn+u-!cE|bHLL7q?OU_x6|Zy@b*KV%+dp(b z^Ed;@YkrBJxg}(?_((Eb)F_mN8wm+oj&)-#vj-_FqX!SL#==!_7KPDfWUl}%RlN~A zW&INp7`?7n)JACS_6|;%kgtPw9@_OJC4;sq(EUbNRTt6f_3LM{f}(NQpa~z}0DUe= zESdg#l<0)HEDgk>Wsp7yJ!0^?#UDk%=rd$g*Tw{-0>X@E`y2lf+7 zB`2I(Ts1%RAHV6@~G$}$|OCHOBHKwC-mU8FdT(l2~2qsvQOi&D*m~mB9 zekh#lq=WM}(|+V2zR*~m3{QS- zSS}0|uGEs`7v{^$=kh+`z)sWh3)Q($OAKv36Zv+Z)UN?Z0$ zF(KeVY-j<-C%MHAt)ArWxpzI??LO15b5^YagLzJR8YVM*4UbUFjeCAA~n4KZE1U7`^Go%1Tn*y{iSBPanB|*|uMc&yWv3b*c&TcW3WL zc^t!jW`|9bMXVW?+qUov<(EW{7b=cGc?S<7SDth~3^qw@U>nU-D9s}UX}^1{xarNB z+ODJvf=7Pe3yG9hRE@9z&=jhM#!&~Eu}2tNA{4eY!%ZgiyFH&kyS=O&A;G*LA=H^D zL`G*eI~vGiMtOkxS|mq|{rE9=U>H1V(X8z2m5@c! zFmy%MvWSmMqckXK`vC2De+|{!A`M-l-7SSVB11?N=^14$u*en_hJ$JktlR#;eGR`- zsz7@hu`5q7zy3Bt8mVz0V&Q;JR{2i7pcIXDsoHkCBHYznSQ^m$@yVQfBI;CZ-c(qb`V1HfQsiGr+c8QJ^`@MGc@h;O zan)xxuiq0>Q&#rhdjKiNUBcRdsE+~}-SN^7uE#^@l4>A8s$mc$bUe^RV}-KJq2GwU z-)uU6c8C9RM-m{)#GO2u_LxAFw4K#&#E@2B!UNfDo03gdtst*VEhtjgTRNppWf1NF zqeyl!m7%)0%}6LlNFd@$~b@GWHd0c$i z(an2qMQlbJ&glHdj%#SrxnSly`h;4n?d$w;wRZReX1VnFlJjTU0+=B$e(1xK(Nb>U z!L1xj{BcI8x#8s?-d&97dm1NW#mv>0xYpWD-(#`cJ#I6@W5J*!q}}+_SD%*#tTHY; zC17uB(FmAQltHAzdHp%1ySvDn%EmcZ$@N=*zCG(=(!YBuEkrEzPga7f`$`ZrCO0p7 zp)&@pYu*9by;^Dtgsuh_-JdPohzktOrRbDcYdjjW&Z`l^rZXtGj>bauLr1NixAAxN z+kXQPh$Y~3?zf!h9>##I4;!)E219)q9>`P@T^H8Xmg(W|YVnn+*lD$ru4a~PGZjCG zQN#T)Zd+Bxu~)86g~CmMjMaqtWv+YJt(mD(L$z>HMB0S1xX+ACnrj$823^dqP0j^j zY;4+Zrc81SyM5QExbH4Vznr1>Xi9)AJbLpn^;TO_uL&GBr7a6fl*rPnR~LR)QdO-V znm>as>?n@NqYI;jytNC=(o-o4is5G>orCdIHdcoJk=%Rr&^L}P75p7nl*(ILzpTtH zP@14uV;YOF++iIlemBaRQ`u|8&Wsgp=guwYSS~-NCqIOnt!_DfyldAMjAt6K5JkXt zDf-p0X82YuL`mmL%+(*!IPY{mH6fHR5p~Ehas4s25Jz=ymSf)6%mYrJk$CdX8w8cc z(c^89AY#U};*-qMU?o^do%xkZj>ix5BXqtf?;#AWF|s5^)S(7vng!JDD#kxfMkhSH#%f^N zMi%b7_e=%YM#Hxt`p!Bk-Gl8=PCM{%7JJnY*P~Mf1R;~} zf^(Ji$i{xXWoa`qpUp|=N4!S@F~pw|Vd39AuMHgVXk(sQp)#m70~9UM{5QR1@*S@b zFxBDU#b3jY@blA#g%fMg5FQW+KNg6rJdQ*fPb$AAc3#ND@*XdsnLAFPG;ZXM>0i-*=5}LXM4QnxtJQep9QwHK ziL>mtd!izDLuT>d_jU}jYr#;~%SL|k{f|B;hv8zWbCIp4hceBAI7K>!hY$!!3ReZ|(x``v8Ph}t$=OSlJTDZYAHct=yt#Yntcw$M02jz71sr9{cmx$l z26PLz^3b_u<1cTxV3$bPEdr5>ygMfSMifn$ek%y`A3C`qJ&Hl49S|dw&6$f?s4B%j z<;<1WK_vLc?!;xsEdP}d-Nr@`JJFS|j6FC9Cd)*JaYxx@E6ry(drmitkk5}%QkQG7 z+nF)_RD~U@Snso^DlzArRb;%r7=xcKjqbb4wKfXWG6#;}Q)~qC5niSTKDYDOm^ot~ zKR^Ja3H(#Bnud=dsi~gD^XF+;f?et#k1XeK4gg zelS9@J71+olQbe*UF(0HpZFTwWF;GLlx@g2Qepe~|BC7%k(2AaltHQH?R9b4c&}2o zb9GI^P|Le(CGfKrYe~;+9^UD*Fme@te+VoR7C*T2leaZmf2MuScE#NCY9YYTb(3~L z(SQPPd$XT8U|SISX(@h`MNQ8G;krpo2>+vIxL<0rx7xD&st_I0b&+Sgvsve zolW0rAi}%%SZ2vNo(b)7y_)WiaiU+-nzIF8BH@B_qkXHBB=Rqw35#U#E}X+TPrm%V zoF+@MoWo&zOvWz=bfT$mA$_ggFh$IH;!{`=k616uYS^K(tpg$>dHVhK*CX`wtI$sw zuDchTv4mIn*b}3G5quYCZ#}Qc)kfzX!1W*VnZwwbr}SUTIH-R$*!Hd)qO)r7@GGaAiuuB22mMvY+0$#pi-LGd^%JiSdF4E7Bqp!KKTJ`*1Y?6qv z!=CM{2Jh4AFmu+wulm%;Y!<=uwc90HiA&rI=gjzP(A*-Jf#WQ^AeK@QrVU>mAz#G*P8~pW4O|NxpsKldohsb}zb}M9{yhT@4-w1w5K19;Q@HqKUuy zHPNi=^R9r#l|0PwyVp$fE+Lr%yi+obdqb+x{TJ(>Eu=piM2J?5(-=A-Jg?*i9thMF z*AnzU&V_|VRku&i6njSheDcl31*shgLf<5l}0{Ce7o&3DC{NS;7q z$a_Mo)MP{Ne?tT*dDy+*uKA?}J~2B?|9BzTmJg`gitgY66~}r(*XcZYt~AAu6$2)x z7BC!Px^zIp^xW#{UJ{imGsst!yUcp<+2DB6HowkiiWC%R9ZipeS5OvL0v_lvzkYxEM9L%t#-c<1H zUfUo^*t8x_7Kn}sq97Pt&}7RfH_v-h#JJbJX7i{65@GW0(c~lr!2YtbGGz=Fs33M? zKS{GOj?9F$GmJ^a_^>Rz^&Lmg6F0C3Ny}sWAHW3cM)Q@RMXsGx34k4&^>`p(5-bxa z(eMwI5vaB%P12I$ydj&=t+PPdnGnAznvSnbBjZ_b$Q>ioUjU(|8K7}1O3b&b1$E$0 zOC=6CG{{Xg3p6PCzh1x{>=^mHc|Bbp=qQhgj{}f zUYmWdLe^Ltua*FBk?&^NW!8;bt8%P`-wZ%29A525(_eAl(+EtwTzn?uZwCK_2p%*} zfA+B-wuc8+zR?ByRl^`V@2N*n+UvvE$=5L(WU))`D<~kiZm(F5o7c8u5#+q!g8Wt8 zHvL;6P^@6oOEHzV5=cPoVdvj^n5PeWTJu4zy+n2viqJ1Bu#b?A^5HQ#;65rW&IpyQDhM-bZmXt*D2-f(La z@h9N1Vk6ASSpJTP-HBBhE$S59 zQ_WO}{pAhyOK47P8zHjgtp^>Ba|n2aJ&qPgrXs;vKPF)lnr*`Nx+#q+C56PCdL*P3}-HUjrYkGgaYN9x!SM$Qe4 zvsH!;ky=55UbM9gEwHQ!cQV{sT1bETVtNZI3gQ(n3aVYoW!Zrpml&v&gk3myfcmn} zai2VXO;!1i@d>Tx;y*X;t<%fjw2$U$PU^C1kkT+snA05;{$+0$xULQgwH*e`VJF zG~m$C_;&NK`_XD;W|@@$qOrOd*1?6Vp=8MCigByAGs@ZX4p=*OedQvFdyuw@2IBxMXdmD+4olyy04eiTIO=RH1P>5CN})c&6&bwy z=*mBHg7BZX{f&C_wFjCPonl`1jFX{Eb;AB3Xd6hzy6c8}?$hx)VF!&wf2;0fVI@eA z*b`d1CX%Q2Y~johANp+y(s3w0{d^mv{QH`KiLe-x!$N%1U0-R?8m~RCj!{0xy}CS4 z$UV{*?qsY`IG2;HdS6P%kGsRe7oMMaDa$APc$GPQaSjQ=yvH;rwvf!$4A2;dN!y7X z0Ijuu(Kgm^i&rj#D~2&#jlN5szh-FYdVP@8L(VPR)>-rTi+5u#aN1*%Pw8t z>#@La{^d3o{Thn?@=E)b$uzXNm193`@E~KzcEYo5G~-wJ_&h(GO5~NrkJcK^aBBG^ z!;hM0i-eI!k_os)aN*j-vzUEd2GS!1O{9Mi`KYhJ#Yl1~b9-M#4g%qyI}KiS>Fj|@ z5^g0@z(AK&Scphfc3$v8M$Q%hM_HMf1wB!dJC|2`7DVVELQ=9S;Y4x2-{wVK=Qa{) zE<}+F+w6pB{FSy02^7Sf*#KlTN3x#`U5|VtvaD;lVxN%T2z|M#cxl-~o^32b?OJvz zu^9tqWodPDp@aqC0>da1oZ2=mCrczLelEm>RU%~k#J~SSNYsMZ;`miU`H_C!AVOE9 zHfLiXU;|PTnjM}#Q>GS^MO?N%uY3`*a1dCLIHng5yQV2o-N#4Zsk-bhXck*m4QHXC z8ot*OF<*^xkNwwARhGD9-b}c1rZ!_*ee$t(K8AW+q`CBj$+RCQx5x}ulSd(jlB{1;KysV$lM=2! z)pfep9jtn19=3RO5UU^HR$OrDEOCB!y%=R@of?TK7*3F{MX@G@|2{O_Wf)HL+zjG% z9`CgA#SL!BeYM>}rl7c~D*tWMdKpHF7;dfvHouAUIC_NFa)lc0gICAKO9kGjh=6m?(;X&YMmH| z5P4YUL{|T{BcE6c*7h=c7@n?sp?T=w0Q)b-kr`N~C!I~NjUuqYe-Z@S4Y!=o2oVqi z)(aO7BfKjW4Ms4|gey*TJO=3Ms1Fd2s<1c(VodQHck@`n>RQP4y(VX@GnXjs9w`a_ z6cm;hg#Ie@?y43J-H}k|sR2x&MWg;Yfm7)CtU_oA9c+xNgvQ(YcCu~Il-{!a_!;j< z9z~nW3C;Z+;=4t&nzjj}WK!MF<@zu*7EG`+er6b0TsE$jf5FgcUDD9LliEQ~SEl5B zbr7n*(O>gZ`X1RF}Nf{_L(`J4Ywj|eghP>iwFBg3{4(z4~A z3PGm8u7$9SW};tF-n2?@JtVE4I+{1me{TObUztXaH3LfAomvOHgv(ElKByBCHZD0E zl&zOMlN>E&k&uT2bnt-1EF(Q4;uNOQIz3u56cxPz>pe_ktsnG+BiIbW-{NvdGail* zB|bc@y6QJ;u>W>j{i57bYWQ~m90FIHla=W98G3r{x(&v>3qT`U!06xXDf~6?0^q|@ z=BL<5_ILW9gYk(Iw%ai`Tm^L^sDEDSoW-DG$ZR$EkAqt5sI-S2vFUmkog#jE{;Kf< zQvL@e@9DhI97xO31qw{7f+u&Om`BD%@><-6&flpf&QcI?cpL>c?aa63N~^v!_u=%X zds}tgg3RP|UuSQT|M`?~I0~qY|EA92OWx0D-4dA~vHQ@Ys&hP;cyT&^)9;hEdCR^Z zOfB;SOCPh4v0#d(8XIuQe}?PZU-OslgDHQP3iJ}=d^XvU`=5RTIIoUcu1Dk33)%hl z_3>eU=of8T@h#7M7_DU0JCOD=2dq>VRB8-T*TTk?mXM={8k;}bWVkMwQB!!xlbqlx zmk>1kQpOUgP!>eBJH(uKRQ0z;l^zoIO8eUlrj`s~be)izcf!_v;pXYWR)QBTMNFzh zk9$*No(tzA{}BY(DCu`XsGR@q-PVK`*$VwMQ;RyC1ckdeLhlag$O@7KctXhLgJ1m^ zfanCA<;F}mM5P0ry8nehQrCWK+dfy`^8 zMoZ~_4Hka2V#V@4k;8G~b#Qyo$Oh~#x2)`rq%%GYq{rzzPt^1wlB^wOuh1h6rs76gXpRF3{79$Z*{>=!wqvc^z8Gu z-lXpB*7+b;_YP7DA4yh9Y`?Rnd|+!hW`(9IGBC%yp9LRnT~pT~X$dzPws2nf=C+a= zw+TThZ`g{{He1HL2B&+`7&B}Tj+ ziUMVUT3*Q}R7e5rS8rY>&-{WUklW{Y*(Pz%vi^_@6OA>Mo9ChgG$H`ZKjehXze=zW zP3O7S4um=w_Y+DWaS?Sh)#ipIN5=&>I{I zqJM;jI*od-u~<5<5bK9#Mr#Gd6SPPfV$7k(8o5)F+SZwa-BAQ$wtT~@2o;WtDt*GOZk)AP0gUU~R z!xSD;I_X6pf-}|sbiBD&a~U&e`Ko4o&B1ZvBMN-2DTAGGHJLxTVRZhN_TLltS2*da zmFYXraZ||>&xoQ@?3Y1yJc>v;?dw*NMqGXk6yD(~7Ww%#~W%dRoOxe`m zX2KeY>C$Hfx3%I5*s8+8oz_98M1o6D5Tuy*qQDQ(AY+AZ@zAoi3-XAr%-h??P8x@> z_A@mC&)8F$Vue{d`nR%>5HBEPX2GoBXuHr7xe}sp+8lluAj93S`2Chi|7%$Ry8j<~ z$=&$gnf#@J^VUU7^m}da4KGzLF(}2#GObNXi?`$nOn(jZuFfgH**m?|ESlh%2MX&j z%3h2zFss0PcMNn&qxne>QIJXnenb*~a~9suYg#SGz3e_|zotTc36wfXXOHabMvM$eYQAB37CRTx z>=d8zZ5PjANUyNGT5}UtgoD(66Bbx&3&{c*;L9(>wH=4{pejl(F7qa8c0{zo@-|87 zEl((;m7L@YajdA9U#b0jk3Hf`J06CKAmCts6hq#Ixcz)(+#*zF`^ZzyGP0YOC+Ck4 zgly;eZ(o9|=qTW~k<{ub1^Bdc%cI6BP-Nxbf3go+5bl?}!4GqP1wT{=iBpnF>n?Yt z7-mz))Or8!j@|nHLZG72@qWWNboR18K#(L+7Ot6;9F&)U*0+aGB#7s(JOGhwmVP05 zAo#odkF%t3p#Y%N52|56X^c_!LBekgThPUhIE0Knf>0Q#IH>|!=L1T@VV&!dfLJSO zuyQz2jxUJET}8d!04pK_kJy!aE%&vMcc;;iL6iREfx><++7O!cN8cpl@f{Mg7{gt| zprDj_%bGq>={#~2L)zaBn;qmUqG!10k3OMIGv+>-ZJIv886SgHEjkP;L5=>CCrG_% zb9qgbNTWzu;0D|2!!^qE;o*-$rBHN(@-3O^bfX58T8NWk!&n*`CR8#qGA9|Ph=_>b zGJj#`q9scOOIMiCGUzF3!de6k&(fBZk7l08S^fRTL9 z87z@M*Z?XumJ@X;$+rgv#&=@9U$Y3iEoER9DG7dLn7LP=4sFL;uo^EI30@!Q{y}4n z;^Z|3`L^*ftUyKbu$9aQ9cZJLdNo;XzH`er7{?bLS9_OQ|PtbYjRjG!s!MfkU3P|A3H_=zQdv1+ki2SO#w z(EQI<&NdR_Kzw^BVvH{+!OABrfMTQuX7Ki2Di!b=E24lol>7%7nOXx|8=_gJW!VK9 z#d1{@mB={Rb0g!T*S)kdZtq`-R3~20b@XzK1if8Z7x+*SEBO+%RucVv&B{c(?cdH` zVQ>zzo+1Y`a}Ucy^TK}Ghfa*~eQA1V&Y0K8wbZ2QW`w;NYUvW-?U8#;FLdQvX|+eT$Z@nwb`v<5>(#9A9G1E+_9fV>W~WoQQ7(zLrj3Mw+nZxqIm=!#x_C zPZ^#Ibgq%JUe5L3YrXln4-P1+Dn)e6v6z90aIzL;a%xM0iX%wGP=;I*IrWF;4wJ6~ z#Eka0?@Ywk$fPIpoIzpbR^bw*Rh8s%(fpRPz1m5k7%BgRo_LR-N6IOy_{Xa+pvj-| zIvP=IQia&j?b*o@P;FSu>2D577|tUU1TDui#Hg^rLl5^W6|B5QAJg@zsIxLFO~Cq) zsWVkccC+hIf4~m^Fb=!_B=9@}{dV^H{MgFgWJ$tt$n#MlqwNUP;o)`(pMKwfIKs~369YISrkqX|}5v)jY zU+(nnzJ8jwa0Wh^l((x1U$=}}hJ?#W_iYil13!^WE7gP!%Uq+;^);vfX>Pgn6!3(8 zY{#gVkWPx18^vL8tK^Ggk47RDkR4Fy0)YT`w7X`Dj zj|EXM&gO})!Z*qEoL?gKv2R-zbGfUB5|lD2U#kuaOyDKj*_kV==e&=9UCKU^YHAj2 z_%2q}lSjbR)krOllzcfI=MH6jN8FRCX&Dun%?zdbY1t4%{|{wv!BkhchFKy9hv4q+ z?#{u3dvHx~_u%dj2pZtvdT@7l2=4B|-MzWDXQrxWx@Kys_D|UL*}I#qn@JZ@^fe4$pE6Qwzg zX1vfWy5Oql6+M7WXdt}I{OnWm+yuIS;mHE=<#h3wlhii$r`m|y{d_I<@2$p~^V|NT z?UOD*rxUz@P{@ts{e}2hBD-Rv!)vi`sF_vy?7h$4$SWPsBup0NqQgR|P2?#b0n=~t zT~z1y{v4~fVTI(^G{X>b6qeS_h=D{54q;-4iS9t&GWPGLIHnCipQqn&eKh7=E1Ytx z0{yk!ez-iTCulnRl3RG!d-#siv0YhsR|^jRwpDVry*C3xEpY^5hBkenL9N(3>73qV zrkhdVBofO(0^u4tTW6iA)uN#V<{LKuU6PoVD-*6+NS6iMfniADey4vvEdWYZyeR%? z^ZWz;#XN(kXWWIU;Kx@<8J0h_>E%)o8U@vKG)CQ_nNL{MBDP4>nZ{gmIh?B&qyu?`=!M zjF9-x4h&@WMKGbp5h{@plg_zJ%-l?$LW6~;7IidInQFGmIJTxU*7)3Se?}|N5uFQL z;qsj+V%CrM;R*J$#yMD}@@eJ7jWKSYWW2Iw2T@%uGPvOhHFTw2vSjg_EBESwKs zDfoTr(6tP-UvW#3;GLB$B^H$c%Rdq4vBF(|?k@{Ni-}ctK#G%@hTtIf!0t*NBaydQU>$=Gv=HAF>3Xf41 ztr&+x^Yt6X?A7mT_v@d@*2!o~xIMDwoKbN}-Dh9=GEF5j7MN>X9?&6+lQkPGvyvgh zXIYEZza`R|7fEx>fRdd3{#Qu7O@{>Na{f zR<@c(cq$d$_E7_Dc8cPgm_a@p2w+sM%c~fUbkQ=eAd~n}$bRnM7I)uv%&gmh!=s9p zaASeKd>WZSLH9Z(OKhmFV+63T(1<2lFx58WhOPp%(-%_UCew!n3Rgn4N7DPhezstZ zJdYGD?GIc#M-xvYO7qEQ-U)_wJiA%(G+uuR(*TotlgBChG+qm8M+Fcg04t6tKu3Ku zaA*d3SNg*XSgEpnwIDp&(S;_`vQ7hlf&K;q#y+5p4 z#j)tEL3YT@cYfxm!YUXEufrNwHEJIz24o*9B%06|)*>&mf=XfJg7@73uB!;tR<+=} zv5t~A2I-Rq?V2d{D(WrEE2@R9*Snnhp+BKp=Ug8vR(#hze8cC-!~Tx^aqZVs3=fmQ z_q2v3b`rWpjHKFY`Eop)QKahQ>3cfQEj=M8Z*rD4Ce#a-waD-d9X-@SRHf`dWs9}2 zKiN2DN4JLY=Swk-quEBH{E|6;1SP+_Mv>}39lc|#C@@PN?%(8enf;{jcza?te#8YH zB!-Gp8F}b4%nTnF=RVg%C#h#i?w#nUC{y4q`7k0QVXW3@cNTretp?+5Uw28=U0`fQ z(xQ9q@>q7YBISNfjWC0yxeeOB$UuL=?@-BxJ7Oj;L_~jOHC)_|Iw&)V1}Av@6u4(8 z>EXY9NNkzM18c&g`!3-5p1!-byRpS#w!}Sf&hoeiDRJt?@$M$1;ZPP+*Q%Zwn2FtD zu%_eBS^5`~2;x5aiK9s1aXDIoI!lxzwpi2o3GjVC!yy8l?k~o&oLZ*WNs4$Iv#~uM zezD0Ho6+g((QJ<^ihTLEZVHBV7*&P>c+3YKVcs|`SNBUu$2X~@MrtVL1(w{^=1oeH zp_s-9@!zMtK#*3;M|=l=v)~86{{_{-!`Z~qbUOgYHCXu>#{Aoba0Tgi8 zbXe92=1F%7p>CfU{JaB2$vYclHk-StqnHRj@x%E1V8)yPr7AJELXg;8j6^uslAaG5 zda|^F6(N&Q1xd&AzC=p^yk~6)P9(i8E#1XE3x&7zJ^^@(JK4VTMV7wGFRWW@F1jZ3paZii#soF4HV5)r ztJ!Z=*&l6G`_UBM^Pq$m9m_Pi_sUClO`n0_ZbcmC} zE_;s=U-zTJrNGlyEtHq8)9Q5g3vdq@C9SA-Vm*&{bm>BP=dq+_7U7IeI2{xdc7FUR zDJ%gDDsec=Re1$Fi__<8H%B{Obj&Z;>OnI~+5+BiEUn&r;Kjd#Qu^s%V)Z|cK zRvk~%I1ube(;|ZFXg((=6z{T3isDwanK;y`0k>sG^Tro!WFhr0rX%r_OBPH&z7 zRzt_0nMvmv-&kUGl@}-KXVKpfs*1ufGY4^ln?=3OJH;O>d#aD;$&y(I<&Bin`5dUU z^0-fv`S^4!vf7w9EKE2!iY>=Fe;;M56X|RadhxR-&t2G4NKkU@Hdx1ADM(i!ms8@F z4oJn9{W7PB?OsVV&c`L&UGiAcfA30NSrz!cjl~}WuI4SKqk|G97HM|{SY&rAVZ=tF zBhA*Y33|sTcK3vK(q_=|`tu;B&S?#06vFQpJ)IW3%>l>O<^M!S>FyPxcaqlu1mk^{ zrHZbrLy{Lm$`ylpZaP^6xDO)G8$ZJpE94Gcg!zQ<)3}wQ=}8L%!g&S+1Ii+cS=;`G zu}Xh%ePg?bdvM%5k&hGp2}RW2wpq~?zAX(pU!x`I&3pJ3HF-oFp6`1^Ce&q)-B^|O zt3?Ul1H6J3@7&4W8s~XGauot0|ASp60}O~qjFyWr9{P^eT8Ld(cw38z^dbEP>e+k* z!>87m+SL`hJ`AEKOC5fn5sLsayu5UzwFuZMVNH%wNG*np6h9+Rl!*yc__F&RIjOoD z4j&Q7yZHhbOJN;q9jLo{w#nX35gZhEXcU*Yi=62+&nMXsgTM(A?^=&eHOi0}i|NG} z4U~cnl4}}cuB9&BMSOe(3dm%Nv6G`FOGDUIHRRVWQ0JZOCP3)hXIDdLF7lBNVyq+A*=DM%7V7$YyePw;T%&EVXXT>7DJ7 z*?6-V@j_+b4>$f+NluuRh_i@$ zJpkU$e`HgnU-|4!z%}txLbtfByh}20W+W8JjM_o{n_aAQhpj9JiTy2)jBGp)8# zgxEnZVjfU?FyrUVXg^q(-;|qaZxmN!Wkhd|053b#E`-n6$sg5Y5SQ~(!8>EeBT@MZ zfuf`A2kI3Y{egK`ravzs1y{q!jlC*j5JhrUDa>PE0atGWCrig?Mq!xYcT)vhFf_U` zUpBC*E3;Ej>mt0ss**eVbCIGiPg-mi+5%vH{vwx8OGhdCdfi#{c{4e1 z<;Q&9?3-xNXh;LsG(z3J3nz2gX_d@^lknLDF5|R=I8LV*Sk2bM_GL4_fH*aN#bphN z_EX|SyH?UvV$B7v+HVn({ex<9s_79aHQCvT1!v?7_cOJrJK+2e9_M+aks&>lnhpbW z5f)Hn<%mk%4aF^?l;t(2 z@CP-Yh8Gt4!o%%L!eUW!nr`P?rQUX2KigYNspr2^f77``CwM7O0z+!51U}1fU;aA* z?7XW8yo&0JlDJM6G&L%kKGN%HQC`zd_*Ll_{(ckTU1hU4lH zqa(+Z5<4q4t9pIKe0{kY7|yfM&o+Q)07mx7$iqM|Qel4~*^ocOz#aj}F+?AELlnA- z_z%mg$eqP)zT>y;-s^Z;+-3V;J5=2~1|M2!D5S7ms3T3|#o^i!=fXcFXa}xsMvw7YNc73kf~&ro!Hh%|uo9W_;_^7<2`> z1gIiLVZUcEcZn-OPwa!*NlQ=ja`l#10N~kbm)txa!zwCK+M!nyt=|DIhKk(n%j(Cn z-qQLj$L(42*N5|=RUP0en~(jflIYr5qNIPf;p7nKzntk>^7x3@*ldphy!o zg`KyUp4!aZ@76>1eilCh@Fc0UYYy%;VK__@gA5iTlBL-g_;$lL;ui>JAZ8j~kq@=i zzaz-F>t=vGxI6Bf+4H+c%2A%%k}-y;>yp zqWX_i0p0rObijy3c>pM2eq@d`@xt->E%pIzsvJ_I!w;PBrM6dJ7wTfF-+6I^ZPqOlY^0n@4YZl=1h{8rn1)9_ zfk9SX+`YUBbF= zJppUbu&g4vG0#q5I7u$;7EUkiZA$e!-fQqr+)MXWJ$z=z7=QmP zNhqwk{4rVz%Bqn`SCH~|dnobZ4OpK%$km<2UN!V5^v&)?`1e!Z_tV`>}5aleQFb^DFrF6oD@Gr~1l{X)^z-A&%172!@n0!D%RdIxz1llEQ5 zf_XK#TH*$OyYZK zmNos?qun(+lzw6DPIV^N+af_)A>4Agzinl~(hhrM{fPmBR;QnJnm=_buRB7DV5ojQ z+BG7sRN?T)(d3DxSs8o#CBUw7fSdhIPCwtLT8QAf2fyp=s`|mvIDZAD%LDI{#fRQ6g1@ zc{sNct)Y``m+f8xTYZP#(+W$d0++1Y?7bY-mBFtMgUEW(WM71dioDSd(xV%gVISd> zc1+P`w}qa|ll|3FM`uen=pAFu{YF=Y-d(OX}|CEdGA7NV0<5v8!UbC5&jFh2OUzLsjD zCpj1R>T5%fjWHe?$~IpYIa#i@!n8Ixz(gCOHq1u|YfR2@318>&xW20U>-*e&NC@@v zA7Yo3f&;_$OI*!`-XBFn&govfz}n!iW#osN-Ii0IwpA9ut${siLkE6C92p14Oi$XW z>rYi(L;0~-x-v%uN9MAUu&}s+*;ma>`y}Y1J@_6^Jen_SGXz_oYJJTcCQo?3I*vMH zaT5;Nz;`J-O>8OG686b_3EypCtTf7KY_NG_1}8C2)upF8RFU;7lqU{gWAA zOfWTp+$(W%6H55Up{7YLKFD84Z4>0IX85%*P^l-I+GKt&r^u6T)Rkr?%{g8r`qc-^ zw<+2%00>o&h{w_aXoQ_GXuop;LyQS7&&(QE)gUpe+^7Cvb890K|0id~zM!K_i9qfLCV0u$Rq#SD z@9zXPD4~LH8C);cV7*b3Ocy&T68bs^x5aMO6nvUa0#pE75k9dS@D*U3`7c$n4WoZ@ z@$}8E@PfE1D`>>dmx`!~XX&9pdCtgQg*fP>a4Ptc&X5bVnjGCSX1yGQ2R`?%Sco01-B_|UbU`MOtVY#&alK*lI4n-V(T$%SKR6gJe*5=e zUEg6VZJ+hHpSvn0><3cPap)^i?IU;&c~@l4vLn2Uwm?1qb2u>LoQ?+pYb5me&Hvld z3Qsd)+6`tlbpt;0%bi`+eB-OvnE5URR0aXInUeZq@ZZ*5(p4ihy!e&Fe@8ADV|w?( zFG-%kw4c|t_v-8Eki1P;dFsdw)oTZ;TfMof8pe;N^TeWpQfeyqbi?pM5YhnBd)s*| zlgy7l0X3~)oH$)x5!dG}r*cUJY$+}U=qMHay-JH|j|pikl%X6oda^Pd2hN0!NI1C6 zIuOk1yg7H!2E?513N03;>~BE900nyxBZ@V=WGw!l2v`I!Vs{^*GbcK3MD+GS{CtsA zK3-om#N_liavYx;ik8v)hWg-Trb)JNm*&lAIw z#Hhc7;e9=Mqk4ngiKw7m<7|zU`qUx8OxU5)w7dP|THCh^(LEBI23>kAxrkO5kr%OH z)Yzcn_~eL?HGnce3XpYLKa!r#PESKI#{U>mXBvi(se$;Z1_5}&5D68M;^4>EpS~Qr zQO|f|EJ-6Q2nk6kp_TJyp#K;n3rvc7A6V*&hhQW?jXrv&>q#zGw)|C_O{e_C$W2fZ z!?Sju+65m?wF}CcK)>_sZ&}7DE0dodx!Y-Go`7xeHmXs9S*j`4W;(E0R@Y!*`ki?f zIeD<+FF6+tylh(!56xyeFkWdtgSfs)@7s3W-r7d&Khg!;xKd!XH2-DhQUPV<_g;_U ztVzho#RD&ouO5$dcRY6-5{(tP`%WUFFJLiy1c3FMq*y@RH5S_|4Rt~Scm=T*6{G2V;iy91K?rO1<>C&CUFQNofO)( z=1xUPD!kwA8p(_0vuSwo%=`$+pEnoq690R4qtc-55nY}TRpaaX{k5up8v?SVToTbH z9Ak@a4iL>i4Ajqrz>1{z`g5~n6GB6yr-Xk#$3$5efuwCVKE(&gco2&kF45b?K9K@M zpCkPYi7|1JqQGrC_vcKbsnGxE$HPjt-p(jh14|83ei6&-69(@D^s{5q}|2Z5U9Wwaue=V(bV<(a-= z*kcb#&>EJLIuE!;U_rT@Ywb@GK1tw6tDW-8EWSk%08pxi@TGPjLyiccREZ;RpcPAS zJC|cpS&PQ%(o^K=+{{5RQvfb>tvMrCMu0g#6cw@EM6k1}_8eGsHmQ*l3RB~HI>Jg={##CfX#Y}w#RF0-Rv1900pv@HB zAgy0RD9KupvO+<(b4(hmWhXO%7_MKfOAdtyf)PxN#J&f}jn`~jTCr;oEM#bi4e1sG zY%!E&;DYNr5dDH=U>o@$Pfunow*F<<%g|w=i&V%_D~B_NB0;`{!orX8T{6h!SaAK> zx_JUj)ixvrM?aDlLut-7@-OqB_KArdeG-f@faWW0q9d!wwfj=({OWYCl1c(715{#0 zM#|XkIoh1`Uww<_Yy>L$`eAceoN+0dNRA3k%f=iTs#n4R)(g4v!#wQu zZQ2E*10ezHsD)vbp$k?D=H&SMb!~@BfO9~hSF4Qe$o>{frCAy#jH5aIGvkZSkY;eR zxHNb<-lsZ|8liCHH&d5I&9d#a<|J08`<=bHP2EckxG2ZqyEeVMX# zzm*1dH@Qk**?u6^3cqJmql@@m&7n%dt9MpvvCA(VedpR)r#(lMdM{!~8c02bupnQd z5 zv4&4#VzcTU{;DeOu+Y1&zAKw-q)pJkz$QM#RC`m1UrgAFD30C8h!A>!Q;Qugj6My1 zg5puFus=}1Re@CRPo`84=m6IRpq<`N$ z>0=m#Svqc&)9SW34@)}241CG|`8E?V>lNfXTvR@KxuENs7v<{s33NW1woF-^tu!Dl z*l$JzTHFs7Id~xX8#H3qEhUB-&m5pcG)9Ia%p|kZwF926N-k}^dV9ma5$86l z(S@*ip+HY{Z!X_uw63jUDD% zfU5s7YVjp!Y<5~+HZpG<66;p304${NdAhMlpDDHMAcc9uP&X~i@Ex`)4l=3;)#;z? zS2!82Rg&FJM@+NR){`08ZKEK<=VGy z6U)TP(3?w~^2do-bWt)1%rCIm&XUqYuPK(vI70)t51+Afv{Idl>VFvyf#Z7UwP}ty zF##M*k(NjeQ60p)5jAWb1>|URlzT`sQG9!rF-B1O7E%#Hfa5b*`k2qqs*2NOeE zbrV6n1ieKSg6I*B^+HXp#0)6#VD&8q)&W>uWkGS)qZ(&SVHZShU@k@(uU)X}OpkS) z@t9JOPHSZjQSkaU+I!YS8tDbPXF9ULBfQq;`>i~b3-McGwdD~F`g)hYKl>LVhEVc> zpo@DPvlpO}Iv5KKLD;zgTd3PB-G*czo)}=LoP&>%UVR`HDJQ!Ec+y_V^JPVLzB<#{j2^AOZq?H{CgsJo>#2cCu*=~EtxFlZ zMj4t;wzk+u&CBf7LJuGC=t^ey?JtGAM$X@ul-+Sps-l5mD}?o#4jbeM!yTz@N&%wR zZsvMM|K<=j%Pkdh^Dn(iKxjCV>A%y%hc6bH35f0gzpxC(f6djl;iC zdNlp%h-+(hq`gGqRpJ$&rsFvD$WHkq5kMfeNa8!yVfHO(^~X|I8I-X1{ov`(3#4iP zM%zI%ju=2IB-C!YXIl4MxQb95L{I+2FrWNZ#UdHe6$OD7X2A)X#v}TrmkCc{w=oYQ zF;^@_f)#^;uQV44CeTPO=vzkTka% z>P)Yx|D96GG7Bsj9iw5(EC5B^apvItaBP4|3UhCvbmY;e zIVt3#+ukRV&X(J$Xp_n!e74bJCE+KU9Q=8D9iunm8fQL4`(?U*L*hzcBUUVMSx*{4 zu8fzk=S3#0Gl(RQ%9vE|X8`_!yIx2!Tp0JjgVgD{8jV!-7W+GHl;G;1VI==@opE5t zMQb(TP<13~iq_or>0lZe3zupx1NVQ$5^xQCIqmD%~Vl^P~tBvhG=AtUgW5~Pt z;*Q#FGX_ej<3CV>|F$&o{|P0~z$*Ulp@hbM7u3xly{ebRhwLPX83pJHy-HGmnJ%r# zG^K0M>aL`_InMprM)Yer(PJ<$X@!y9Y=J4JWq-2ydQ@D}n$dBoxc7WKBUCC$>V{jl z!Sa_e9UW8%p9F^TmCYe*blVU#us~aV`_2U3@#u z&-W0H&1|jSzGLn^;V88SExrESId%=l`!2lc|DLfC5|qQ^WsaUyuX9S9?z8FlH>5-G z$EoHB-Lv*Dpd!I_{~5GB%54hU-^VPS;s}6Ie5;ttP8JbZ$u%5Re;?z;Hnx~tj_xP2 z{qnUyqw4WYB8sFB1)6j;Zk9iO#=&II7^jTc+iz+*%0}Yn{)6GF6Q_zHVfXh|26sUZ zfMK~|utP^TJ`FaBj~5RtN;}bFl}O96|ASVG^9AQh@9z|(iVdowzkM2T4Z6XN6?&Ac zT@Z2Aq!#8Y)dy34KG(~*X&D6YVz?FDw4({942EpL2_=0;@)SL^BrAjJRbav2^m0W z;R;y4prdVQxZQJaQZaBc2}9$p^F6KZ#Nuz$@vyQ+tj2PMq*M(t3$|Wd#lu)waq^J- zTidgzFU$B^CAT;PuV+%LJb)JJ0Tni?q2<)MaI6e$6DYTP!u^0k$C&e$sAHBgG-S#6 ztOevJerZ=yVVr}9;~1F>UjS&rK9mKXT!6@FKwKGh&~cAIm8|GY<$COq~h%q z6ik{;?fX6%T$7VVN&zQebc2;e*o@jY#8c3@2RWVN$7(kJEa>d2Ss4@inaaE=hT1_k>Py6rNZ?LGDur7fz9wj+Y?HF= zJH=UD$UT0P+=}5(X%f>-oap@x|Gz;O)J=SqM|W+x<13*n(Oo#3Ki?+l(ut;NbnAxmVJ|5hZotve$ejhyY<6# zJUsWieGQNISmvJFWGXpvU>RBnMe4?Uul2^gmJ!x(G9twC7bqNYGHN#i(4_LV>pkMN zckyWj+!J>|%4~F$j)>eC5=DEb*2pI!Q4T8g-Oa0`xB0+MfHD0KrCuD0-YEA^Ot{|t zqR{@6yio6a^k`E7bLZOG#~6xWxMRc@8UBgO)F_>pDZ=95^?e?yG4aLoec?W{Z&a#~ z?7Gsaetvy4O@TWwqKXkXWTTPS)<%*p{4jT8ZGTbUGw>mf67?q)?D8Uz0%Zp+r-w0S zXT|j?uZJEKiA11J;!t+|3c=5KFtM$Ix+PeKw!u9W*w#jtixCo!rFkZW5CIthSyvC` zqXS1iH4TchkkYKbb98D@uUjh6tX83Qp@wNv=A?d+yI;+!_`b8{L3hM&@_n}B@aL(l z{Tf_QKI(WuBNar7!p}!fcO-HB@Pf(po>VqAZ9d;rX2SFs9ME`S7bB8nG9t_q#Q)zi z23|QrIyJ8MJFKb2J7mOlu5~a6zW76Zv_d{Kx4z1~Vbe@2?|tqD>P-orZd*@}vpdwy zX1DWraw?;RA5*!9Uiw-?NHpy+z_%fj`ERq;{sUul!n=lRVwaaRKygJK6z82)Rlf1q zpSy<}{dHXrnT4OW342D5br$GuB)^1r1we{{Df1*j=Ui~a}^pdzG=XLw@ObRRtdeqOvt4J(%raCKRM@Gm3Vzw`P z-i9Y^!yq(yB{hc5k!{~XrwEg!p4HLP!Vd|w?Yd7~jBka_rmAFQgkEn6@#dOnH5##U zMXhU>&S6%l0HVKXlC>&IBG=EJ{O}AmbM@Ug z!dFFG#A-;LRVQ&X6bXz?GVgtF*=6(FV7RS1*;y+5zS6+c{&6I9Xj%Q|y3QLFx&i4R zl$1p}NG;?2Qm7soKb$6rguIzlPbnCYk?H0`itr;p5;Tu=?LJzMQjx8arI0%H7 z1*f&L?O&QlBC@W|+vj(}aV6Ytjez2H=>CRGS~$p-ue3iwD|>ME%S9#|j$bzpyaLbD zb&I^>!RfQf)<8n#p_DE8Z4qW>+U-#2+5FRo35OeZNVc$83Hma|?=e3)N_>T(!s3g< z=R&c79{(kS4_Lz0-=A^R?~E+)tEa$jSu~&xH^=p?jE|ODmGk30H0`z5tFX6L7|Wo zT8O9fV#ClPQ0|Bgb*RZw4P?d8D=Esx+ke)L@1+;8f<52s$9B^T433+@$lyb96`!x*iWaiC@}4okfs z{};}|$(;Nmrr6Pal=W=@muzE&Ld5!08GV(^2$N&O;?+n(b615!*=k2!u&k#9q2?4} zpHJ?uPal+=v_1joWDKc4`@7pX3v8{0IM(td^WYERvn%UxK;L5$=K7XI_B_F42`3b) zy`o(1p%6Q1-g4Y!pZPDGk|Fmw=ga)Dr?3x;zIJfziDFs@wqk(mL?Z2pMt*&4;>z6r zgL5$cin>#GgW_qI@MYkJSabzc8*2R)MO}hG*nd!RLw8-T*pz<%3-VUKo{9`a1(o64 zhGRM)x=j58fHVGv_VZhNNE{BPxj`)qDTYe9?#t*y)^s_qtjmE<+{+L)Mp7fT@hHV* zW`gD9J2ca`Q0q1%I5SNEkX%Ug2gCXM7~a~=lxGk(>BhSc_v<}@Bs|wHV$gu4zAUyC z!iKiKVPWoO`d|DEarpi`C^URy31=+yCStoA0b~CWks!SWcTF zcWq4@%MR9%xm%5-RMMb{^tj_|j-^`8(ror3heUlqGLs*gBV+(V@e>VB+i^UsGr-Xl&Dg@{6Kib-2)$I=p## zPU(P3(gLr!-KZizHfsBtcUMHCCxcnrAc>E=&nit&T;R%%TeFEbZF{z)k3LD7HtAb~INQj!o#UIBIOR5z2Qao^#LfaAw zlMWQcZy1b;R@wR&P>VW?_Wb5DMX_sq0lTapg`KFX+HQ|6s@!YQtRMkyb_8+J2lv`9 z(5wn&lh~6B6J{z;X4GxoJejUB>kdqPVk;I09#;#*4eK~(o68|sm)05|6BV(5zD^!)wx? zIQ5I_<6rS~nInZ(R~N^B2NH?`y>YNa8EKPDmg(*sbvZq7jFd*?<=H4wKw?$tH(s00 z%1&rZXlW2)mlVcW-72q*=`In!kA^y^DkHYxH&Za!X* zT8U~|7f3Jugzx`vd8y=P2_Z6f7rPPaf2-$Qrxm*@C^C#Mq0NQ_17KW z8-<gv(8E4n73x84RN<@HF$psRPdH1-z* zqMC37B2B*AYg*Z9hJG#~<@_OvTD$^T8hcfjZ#Hv5^92C1xm3{PfoG3i3PG zq}UH9`dcrh(yxw1@q%8>$eJXyOf;P5>5oJpnc#sF_no8Stf5|I(S9RZ1@ZV}DjCz> zR>E1jP|i@6cMwoC@3TY0 zIvGny$Wb9%l@5P1Xg_8hR~7r>7cH*`GWV_(J2ou(HbRVFr_Uac?ZkCl9@o{>E&Mvu z>l(lpZjJU*lcyXr@5|~4H}PmyG1R2)zqcV$!kc?0Z5%$R9~g6}8j?4AG1>3+xE#5Q z+`Rm|UpBSf%AjO7p^9vitPR}t67pQN8*WN>9D5YJT1IDWb$|b<0k&SnZ5ZDy z4&NiIh4=g^_ZcCZ-H6^g8&Q>gvW0RLPJbRet{j(nbRnCH%e&@33rB<=%`4`fCwJNY!JaSfYtFNv5Ldu=MD7@((6|z`xo>Dp4A`fX z_?Xj=nYHTlP(IqX2IN~BlGBX*i3wCicgx^nr19IA+#qHUTYLToAV?cRdJ7)r|<++k=X1F52=L z;g^zBT7YuJOpo#+*ZsM-s{I3npfCzfS?FXbJtL*c&|5VcF$+$Gzd9%cOi>-JiLD2NGj+%w^GDj$JLVO zvp5}+h* zLSC_#Sx-!5s5V#IaZgsJ*^eJm!RU5=km(-hEcf)F2m01EXGpu$l8@?0 z+A9AJW%^`q3Rko51ZzxwNL848oliW~&i@qCI9>dRUB4(jhIM}Ezxn-sA|h(3JYrwR zcC){$g_Ix43hu1K$urHx8OUC}YzlS2EHT`0MKn_C`CCbNn1;Z3?E9+&@#iEaT|0}@ zmw72=vWD|NKhNu)(q>C0{`qyOpuM|Z5&7JQVo2wsqc>Wvf&l->EgQV5g}SB^27a|+8oW-~J}e3BxfP=d`1ozHT4p!>A?AuZM^#_$ym>@I3Bx{)ompQR#+ys=ae0(me_kZlLvYK%_gi2eUf0EW z@NO!@^)y`W?6uqV?$w7fC1f{%wCDMeG4r!Kb#X*d%Tu?shi5y>zyZciU?0pDgj9t0 zt=VHoS9OVfOCl1^J~L)F3s+%hQqaj{rMr8_Cp&=bt1r1R(9@LU)cQ0f_>@_DMhZDB z52(ppgXI+F=j0^i?;#Qj>SKBhN8NDhanmYB4UO=ym>}#;HswmZ_+`X0(0)Q*f*gLd zkPaJH$$^awCk|8o-RSTBiT_T_AFmvIzPi7}vVG&v>sI7lfMN*f`;i+AgJ@T$+>N-V z5vrp_)qy=HVF%`Z8RC(9P=z1ALX58(%o8UhjY5TU+zVBfE?EHcAb9+soFP`ws_{rw zU2hx&#@RY8i9DmUuNQY=K|uQMwqHGb-sg6vXyv>nkRd#Wm>tqd-eJ69DT-4sk1$b@ zv?H#jHBb_nrbaydQ)IzhSrrB%hf;8Ki|Apn{4WW%2Wn+Zwa86 zn6Mj>OkzI9NoRbpt*5z)l_RV?(1etziUo;}zcfb}Zrnu!-{L38=8~-MxQ+i(3G?R6 zC>=Rz6{DH098kHXCMjEfH|mZVE+@o0M^w-vAa0GC%0?_9ZP7HJ zU6m9!rcXxDdNzZ2o~<#Jsuiyap&nbHH77KG@#Hc3JA}46Oum_}MII*sTQC%SZ=`dgsNkMPNhS4+RrTK95BW!~s;BAMBHX z7(&HML`0?PMeFfY%88k?E6l*kVBG@ABvsJHD$xO&qUsbiATdgVEm0+f!ULl$_^^e(>+CD14=^%?>nGyL#F|D4E3;9=&|Fq6fMC?0w>kxd`&63r zi^AEjlebAIF*wJZxVCHhfYl}>jW}++9GzAYCe@wxvb@2aDCxv6nZ!Up=joiy^&G7O z8HZl9NRMi=pGM@L`R#yBwde~wZO~Mj!9Z_X9fo#EwE`}%5g)S*`CvgoCWhkKVKgPDsj@DZv&tvMUc`+RW(X&HGfBh_EETq_eengOs@T+|kVZ=hL06w8 z3Me*9ScVg{ScYSxx1ep79WA3R^TrO6vd8sMovj49w+sRy_NfdxdY|yZTMBV}i7MaOv zLDA}dpfxdcgM3Zhfo*r2=#z-uw^Pb8xsugu!|f{nc7 z+Gm^E;J9^2`rq=HrU@y&d8e+7xJnHwBAEQENN$a9 zGpYY=R*95t*|U5)mU1LI%YMGc$BrmGvhy$2?Zj8_H8?v<%V_i=<%mP1(SC~+*Ga=v zg=kTS%n_!}r|iScj{<@v2}dk74Ks@hV!(s~5}Zu^{7Mlf_zgm0mY!F7-I2h-a*b1m zU7G(C4=RP@QF}r7^e_chLZwck1G*XL-i#r2FJO}iID?8V5+o@r%g)DbXc7}sA~U5K zC)tA~k6^yv@lGwFt7@zyZWe~ls@=cKR7>7+WhP6Uo7E$*!SV>k+T4Eleh+^Z zt;Ec$G^t>_L(u{yB~wkMzGU`a%(1RKW~j$FR=1zK$oqMjk86$FtJU%l&9wLOJ{L^x zjqBmYf&bW^C6iFqQc>407RCnu@|XuM@nabAc+NtqD%bvVBoT81@lfgg0;FM6QO;dG zX~2SIvQx3?YQ6Un;fDLXWU`vNU{UPegqi_b-}vz?4H^Vg9$e&wYywE#gf(){m-!Jb z9r%0v(Vy%hQ=CBjZ$F=~euekw!%CYUi*=>-Y^g8w+4BWYkSRir3@xa(qbnQ4235uf zl`|Zrod&1J(>nAUfu}$n^~s97810IG3=3By@&bZ;cD zzxw87;3-qVmUq5BXJ>HD_#95JfZu0Llk=PCgl-JZa+?>lakh_(RsR^37aBnb)oF~l9ZZlUeYs|v zADMn?K=Vyz4y6RT`y8zMPhKMQSiSla4Cfhx`1}o_3>!JYh5CTeA>V;Iz!do=ZsZiKH=;Jg(}`~_GhV4MlXVb_ zDu&&xx#VTI!ZNx8J5GK+q$3S%c5H3uzr7CDZ>|@8KphcBObZ~mzrOHFMzQN9#U**V z|8v3WqI?wcqb4df`ipEJ9Lz~elI{$(m63D2rH;I@h_mI(?_M$)66bvBGZu=rbLP^Z zXFz%3j;RpwO|>)p-yjzJAo%_ZB{bx zB(42YZSQZ$h;}*UCEUogAX3*NIGvVmB-{+N(MIJ@0BSvf77k#!TRq0JacfXsWVwU` zmMBJ{Uz|XVvvT%fr`@CVk{sUmp{nC_^4;=hyx2zE{#ef+!`ksmnm{Cu5~0)=*j%mj zOBUOnJ&5l}emzQERl!4pXUW=M;uMycwqBy3;3VR4#=uq0;E)x}F||sio$CRae3b$Y zVbG7k5%%q|m0C}vyb*U~_;x;H-N}W1;|9_(fo~7i5ZWOxLSI=Udh5UlG5rhc1-UCO zb4|v!9B|EQbJYb^rA;X%-C_yTWX!d4s*uhcD!Qs5Nrn)0jBhe>2pklQi&Vr$3^HQ& z+w$(6Xv!51N$Ofk)XlJ5*~%Pm!NQ8_+T(IO6>o1K;s`VIq@c`U(!D#YkPv`isS+6p zf1E>zG45zYzT(+x2WEHY@4&wEcx4*J3T}9{FzIIL2+BDOlKe*S@Hjh(*x^6jS{YU2 z?bKBfA)0MSxga;C?qnjA6qH*ThlY9tEo;?zo+yZBN3GQk<#Cf(0`@Ef>rkS}^1#89 z5C)ymG&)XQ3dBL!3Vdmj^0)6BezZ*hNB(zKLR@Cp_GiGgDwLWTMTY>^PMl>MMh4SK ziK9*qpkJWu&DrQ2E7~YEZ0{PT2sD>BT5HndK-nY0*bJ{>vR-?Oy;g@{NHY{3EhX-T z6H?&2zEI-WI20$p^J7JN+5~!-fXxH}Xe!U-do487cbV#Xp`bBW@Sv7mBm#8LO zUPO}xVftKahJdYHWR0ZKuFB?OMp{QCn5NQQiWt?aY$0c6qa6wcVq~`UcqnvJ=ihWE zfps$hCo(zoGI85-I(NkQN&~(TAEBsY{%-1xPO2Y%0fCR3K0?OHEQL!zRVg;ks{(Pk zoV)1ot8GCC4GRgpY}?4Z8p^OcGafc6dEwfkw;2tm6TVW8RtMqn+|0rwBm+*SyA^^> zKV)05j)mGAF5D5fc(f4R)cxc-uhz&7!RQX6iR5VX{`6nHXVEyn~Z}FXXF$ z1d#xd7U9!Rnx4-qEg#2Ps2NHWk4bJx&~bF@Q@5u;*2ONCl*cH1pH5)W)i5Cpf6_aI zL{VMiDn+W%`@h)ZN&w6h8Fp_2y00kD@qh|`91^QHsC3J0oRV9%ptr#Ulhk3#)YKL? zx;5?4M6gDyJw5R+=j+y;mjNXy%>Et558_3;J68srin^kN6)EJczPMaU*wI#e3-svp z0u_50Nv`I|6Rxb8{!OXDc}IA?KSHy=%ZZX_&ThcSz>Y9DU3_kFw{y;|h)Js7iwa6l zHR`AD^=Saf8yKMGznu-r_lgp>?ApA(3Ax`Ta{l3*0`@VU{gUbjL{ zCY7`A+zyF5?hnwLeSBwJiOLejAeF(ZDJc*GDbk@JQK^5Sf0S3&iq_TYU7ZP7^vCxt zh+P)ceFc~3=YV|%Fm>JRZeNcLKJKmC3G~}FEaDl4y!4(u-L6F$al2w5KXwlnD!ZaNc>EZOBmu z8zwcNT4#jWAa+lhSBk=iPfh#w(pFfY!-y^jiIJT8U~V2cBUz_;ooEJHk9$j5aek|k)2G`0-MLE8+v7aw{_sf%e+J4k?hx2=#w#>%tMzNg|QEfMdqXj!lQ?y)+m0$THn+AsqgQ2E*pJVt-JG4D>RB zdSIL$R;kh#9R3@s$$JE#n8Kf@nvRSw-RZyoUUgRTWb4A3TWSJ?Yq0stx`HN=uNMPe zqat2p=qmt--3p~0Yq#2B1;pD2zK*&NLPc=|?Gn7nztbdqCLV6i)Vtyc?)*wK#vkb=;$Bbyi?iM}&xt$`ZQSP*=)H_N?mV#@r^z!l)@xdSr-b10% z$nymdxGZ0HCk>{1>9JmKNo@)i;*cIw z^9@X4v^Sq&*|UrMTnu5k8$W6XX~1`#@QsU#C`kqUzvK{Fac={w*nG_i2A%0I^t*(; z0of%Gng3P3OA$_2dyS1Ua{ecZi=y6b`O{!$QI`0gN3vX-6NnHAc6E`*m2Vq7KS^`9 z?;L=n|0J4|O1qz$PWXR3n1Lg_yv{hFh~$Wqx!Wv5wDlpjnT`vuQ6_N$kf^mIE)RRX zbS~Y`R{S=23P0Q_FV(WJyMA%g@1@MTf#_a(QF60akGZes*P4{xJ`JX1hYIXE*2kmI zdx|?uvhzKg1JantFH<;%DZ14?*KzWprmNE!5?` z9rN(Z{;{jnTuY!KOZZE-?z-C5-T$x*P133lyrv?SpF5{LuKF-@vAH|mIq-AqB2m)& z6e_1)oFsynTLW5Ds6z3%Qt2!(0mn?^m5h@UJ(4w|NuAvIpmiJcL{9KyI(L8)E>#G% zvOjfGOVMf(P|Comr_U*eDJljjm^S0HN;^x#PADIbU?emJ!We(Pa5q<6IB6EHQ0mh? z7qyi9hH5kJxUY-=V1U-U6)d9-oH8wJ_QeaFbb}lE$>sXy2Chy|_hNmq7>QF7v@XI# z51PO8>;MNqHMSH(A^yS~U-owJhlg`*n`C^8+=I4yE5BZ4cWra>_>@XcR_l``e(8T> zG^CjcT_z6-8V7~f;N=(ogh8AekTTN|p0ypD2un89bYJCos;sUQ1O~cENx=*Z7S{h; zSET|MF84_lJ|P<4H1q4`$1ox>@_4>Pn=SQr@M$q5S-ZOk=OD_6FgZy}uu$AhkwP*V zU$6k$(i%F-IPEtE_HBj@SFw{a^&t^xQwmGnqhlj~OB)@GJ=e*Ww}d$12zE0gPH|@z zB@J>KyG!n7^vZG|oYmjl{1ZHM=*!{r*#p?NQ>|n-c$;-NN$_CiLq# z$tVb!B8j^D`WahHP}{?i>xXsMu`}Lt zPn$dAXI0$|Mp)|$6QTn;S;aOP@b4V4!5Rvm%8y#SWxcZP*?b*o&K;uu_mR+JiG+5W z2jih`_6l{_o4T6c`OyVuY+xVB793%P9Gg0cPJm~1P~1A5cNquvsz8i{SCP15$wvxj zyE$jzi6;15EWR@2M~_V;1W~{#%#sF&kd?|4L(2RL^L4@=G^x)Ah#9yW3i}vov)3p|)hvRGy&Jjvig~oRAe{B=8 zT?T<9-dI5xGYO(xN?1o@%kMjc4JbjgC!7z@rg>qmZSl4ixrqHk>vT5Htw*4Xg1}(8 zeuK*}D9?J|S)@uz_x?>qt@Y4A%AzuuzFHW^79C*o_W<&~8b+@o1;wzJkbETB`|k}M zOV+k{vafbtFi|m(95v(w+!7J1j4ykQy%00JgfSUT2+ahqqHWGWDcmbwc=3z~W!}G& zi_XUk&-4t!4hu&VD-=Dib{=7?@r~*hjiHUrc@thzauv4owDE>EWe(4ljQ`BtKU@( zO8>zrZ}(^E7Px=L&$8X++&&a5-IPllTRCSW z=A%jl_0Ww5`NI1I2~A8&2jvUwkk@ArS}*2oCRgnC1`#Kxp%Zi5l5)HJi*qAbH+jBc zqoSWJ&~ibCm5C<7fNh5%&l(-)6K|N}cgu?IOE8QzRHsTc*7)aTj*n4>R7O&%;H|n+ zl7Pa*f?#Rtf!Jr$ReTCQvgtcfJL zj>K#NNQWUl*7CE5$H1_)fbJ1I88D`u2+2ms*PL8BL_(4-04Am=6J*AWXs-*`q8vCW z60Vr(3gy<1O@qe++jt9N7$1o6=I;B4PHK0gZntEec6zQ6Wq>7eMWkG#Ft z{j#dI`*TuE|4D=X+9EWd7w#2{SxbGd!;!?O(_kwZE?6U~NdhL(fz-C(-;4C%f_pYe z0AtoFyAr1#@E~)jdLGHI9 zg=%NP`nf-)>Q-50={ZkJG@CJi{aaaHDSTe;Aayc=Q>{L7Vv7$99XBJi zrj0hC7sV)Po1ME$ReQkCDC8R%TB`Er92zeS9#}Y_uZld4o-7y{7kR7(QBeSN#bubjXdL!Pmi{pJv3!4zA1} ztu3P$6ma2Daj%p9_K$)0`cNam@r zb}#kWb8l5Fy$yBqn@oK#1%)}C;>zr5l8}A9+0Go50_EOsriB=HBwjh+RH&56D^R)rQ zHi9^p6Dfo|=0FFJqbl`4qLw|4#P(bm!(a_(_kw%(o7qx;#jJ6G(}Bbe(A_PyWx( zV31};yE=be%iHPbvsNZeK_Q9m z_|;*D-wk%iRkXE!@^L2n;XJ1~x7#U~=t71n$H|D9akkphUz{%zP>_L<3#G6V<0HXa z2R55f8aaDAfr$IH+X;Uq5aaXt5JJx!7+!T3UEi18Dr)M+98T>eB;~-gED@0+xh4SE zWmS$HJ4rB=a^Jue0hJ}l&qH-uboT&dg z&zzW+GL5(+^PdQ~uNKU>^aL_0YQ*Om_xNU}x+;2Mb8}{_2F!Tv_R_-nDCoB5-D&1Q zm6zp&1pYgfS;1ppppTX0Ak&wF(Dz3_Fe~UoGUrE9beES`wR2XKi88xB15BhqV(x?A zX04|iN(*%0L6~r3 zLTBA<%k71kf*a|yfc?utam~ckyuYjR=yW9X^Z10gvllqAaA?h5kJA!TNzBU&IzCRk zb7$+iGgc3V4Ci1FdP-0G-?JI!fm*rcJZXXH=CTEtHS-A>EPF?nydgT{m%brVtDppo| ztOEnMc9O@ZqYmj+82%RX`Q zPF)uHY?II~XCK(Mx?JwfOE12nJ$cbNbGC4U8udEeic~nLO~(}_hwOuh$gC%!uq$H} zrPazSYQuuL5B1g`jX$@V+PtrrVmkb(<_xl=kZnSROF}{f6{?i`7?}yd3L4U%t~{#O z8=%!*ejrMNjT5ifVy2fvSaklw$+zQi1du6vkr>obDx#BAsBuv3|47C`KyI(1@@Jb> z?=&Q}bj3NRqM-ww>hpnOFDN zDeDkwP`Nox6~=C5;T=#$G|%SC4EfAOL$;`77>@ywGcG+Fbo-}_xaind@DU|pe#)sc z_P63FH^8$)wZ_q)V>LV+A84ycN8Rk2OKbc-%hG{I{wu&$f`NY)zvN_uY}LZ)=7QDO z6s7c&At!%C)J)`2Th5XYD>%f>u7U5IIBH^iw%r-;D|`n@+tm`T?2qid%HZ-^YAObZ zG_ZY29kOT`u|*gmZOT=I0M&*l+`X)DpkRNr_Mh;OZVRv9hmQMS%MvcI6MS2pUa+YP z?AT4BMa18xHM5N3L-T9QWwh+o0&#p*d2M#j^z#28KXJ&J7zMx&iY1;q6nilS@kCT) zd4OH~i&>vh%q>l+X6uk|YJcDFciC30JF*0w@cytg@( z)6fJdR_>olO%1OeFEpsDF+>O-$;XLbcN4;S$$K_3d~7Pn2e6W2c0fQEoLqkgw>Qs2 zGi6oug`7xpkeKkM+==~N(DU)Vg98=MQft}gKtGFArH}wxM zeQ$eY%h{BJS`@Ksz=wuINVHGI#oD0Eo*}7d7(*qc`Fdv|5?gU!IcoYJ>Xrqot_5eg ze`SR$SFwE+BjbrB&h!^DS0*RqF`QBu5^|6!Kj=UiXA%+4z4zoENQ?nYNb!XEd6+2m zJ?yV(U{4fMTo)DdN z8d1csuwQOXXLCkO1Ta$2$rDAW63^J*UliI(>r^zQBJ7*)fctNqZqzX`Qq_M|D9GsW z1scFQMc6MqK+KSH$fsii!m0s*&?`>5A}nVW{a}7azX!kX#PNDcBJ-O-I!#r6;gQS% zY8w@!eZjY9@)F4?`JoW#a1=V1zT9_-#1dNZD#C7N`wh*mAA97u*gW;2Ta35H%)@E} z@!XaoDPR>=;RUIL;!g!sW2)LA06>1gx6RYW0oxxa)fz&lWr2Tfi;g~c3+~%G{aU+L z1W^4n^e#6FJkJwhMI_=opeT$XtS$Hl)(sbq*?T(>qDTh|GLiKKihiMbr-ZTA%i~eW zNLe}>_-x*9{}>bgHS6c7oHH9`y;>v5eP2}7htDbC*E7c^Xf-C=z9{uT7%2% zqUoJi+J5evWKY{02y=Ze^0Kn_BhhlUOX6|l5(8VOY}FR~X`~cN2m@vN*xl0ZMPnB( zL>j=Vxm6HxmE*A0xm;tWixL5Y7RGv^5lo63=v*hyuPG;WvLWbz5{PJPi=5^XT%hr_ z1^%qcSJZu(KhR?6)b)=M@c9T15YWS^T9wZeKmY!K^ogh(dFTI20;Ruji0p`GX}haf zu;O1O8zj0CY|S2m<{*h-D`UDn%#hc~>SEBS^0%8ODMYiFdxCVH3jo zN^yM$XMRCAi(;egmGCg7GS+q#w=|^62J}&ga2>3VxS!w3QGrtq489vRp-FlV1LLAZ zL`_+TNHI1@8JjUu6wTC?nN|DZ12zwdVqo>S40`(dbmT$QB!7>&(qt1f?$-Q3|Qw{C2E??@ggqBzK>!vw#x0 z9e>o?HYwY2e-#{#l-qOY-~wgGQG%R?y*Y9w3n>BoM$+>Y`xO{sZ#T9=K?jfx4Tds8 zH3O{(N00~#SW=P=znDIwyAw4UNpfEs8=&#%Da*SCLKDALXbfMt8;os6?zSgY#eCL`9E`KMP!B zy?kld83Y2P8**dG8^50PdFjr^uAEotr4)_$t=+kElj z!O`ZMeOgwhnpxKG;$I`TWs`$*{#?2l=-1}Z(@!RT{we&ge2Df0~ZEw9hij`Tv#z9|fMFI7jRInn=KtYkjlQ|9;7^2Rl)o*W*8=TYr zm>Fj`e+@+S%rXHd}?1C@f$E6=KX5O?AX==mP<#dN4tb?}O%iQU48U+35xL%To z&UfilQrC=nVut}VQjBK-goA_+*{E4);g}Pr64TsqekKBp3$RFIVf{Uw*x!O%fbfW6 z5%hTZHXmTP$1tX@p3lHLxS%Q1euWdQfOR;v2!ZAgX>{E=lG=L$pFPy|dwu)gWIS~d zyDvt6gItl<^b(}aHlQjJKBN|svA|smqQSU@Iw$^c2uBtRbJ}9Atj77LL6dW7t@OIm z+9E=x1VeO8(y6MVBZqXfV?Ye}^x#CLq-dVqI+}g`iJicd$83NHDN%CXji)FF{lo(~ zIi5maJuNMKpg{56Z3uLYKg_USeXt~-e0EI!*9EhNmd>Jo6bsR$c@DFaOtMWbBu=$L z&0U10*MO0??R)|whG6OYky#`TLqht-_E4PdsF|?`-XPkL+~POEkc2d2=b@aX$laSx zTw#b+qJZfD{>OZM6kUKkV(T}1FMUZDfb9rwn9)XyRm(79ifEvbJCfkYABZu!+L6Q0 z?EU(Yn<5z4pmf1Cp_#-9Gp0=I<2rO(@EkLWUQVPPlqp3mb=b1?{^d$9>v2#cmy*76 z#JBO&lRNli4RjF-G$D-yg`)`+JiORc=A9MS3r=*!eoLp_+?}F&hiww0+J8L;3{eWtv|oAz4#C9b1;=Vd5o$X@a^`*8{ZQEf;8Z8rne^P4}G)n%Vl_ zMsCVIT}`wL>=&n9Z?BpB3! z2x7^LCK(06aZG#dNvMnah}np`6jQw14g1nn6;jq8uxu$QK;?P0DB7Q}PtDv-dnb2Z zBu4Y&!t9afhbjw*;aJk(!jam6H*=^FqCb)|&XM6NXDeN4@%d9C$t)OeaxNKK(b|uu zk4)gnF6ZjE=ld zx?e27VEwoS5j*;sT)@-mHzB=5k3MzinvefEb8@Z%_e)N*4l)bW9%JiOMgnUagiKV1 zt(t;Q6ND<$6odFiL)Mf8nu|%2@DCCsCB}B`6L%euQ$dONS5--@L1WaE-WIm7YgnsB z-ersLqxBVGISOMEi$)6m@vSDcHaZj6P31pe=wa4N0`g$x`1L6{rUrr|KWT(Jb?BiVkU8#!LEn^Xl~Goth)I99 zq*vFk*4)7dQF{?KJ^$&VZfIT!`!a>Oq)Zl~Q4yBbi;|`f@6CfJGv^R4CA+)vQh zPH=fOs}M<&@z%iN)mj&F2j3(-HM}_*s`gO-Kh&E?i>#zp*h~NGK?;dmh@)1W$CA>kM#H z&%3(nxA_$2`*pUoZ=bZ6`P){n!KqCpwb}6m0uKhhZa%ua{_IUnC(W8LKrui$X$TrJ zMTk_vER7R$75*v)1)}ATlo=BgmP4D?wkLC3^Bzem^Q@e{_lb!i;~rXrNjqOyMJ0W} ztgo-vUEhf_K+ir(mT98&Ce)bZkq%^r4E4L zL1)O}gKV0DNvnsFeNR_-`v6eLP!c;l}e`*EcNChtlDNvkTV z=aF)DF%h`GyNX!Wqq^T;#KaM38?QOf4DPu&R{=;1kcUeSfH!cVYStnn&v0$Q7k{|j zVf4!&P;enxak?$ zo_`uheB!76tGyenmL>9eJr~H4?HMo;{C`PFDV4SVxqNf^iZtDRG+_HQ%wevUVaH2} z0aWl97>l#(?jjg;!ctO*L3CKR4y7tBzDAF>tv%EB^#G83|wHBue^yVxh z@*artk?@4SBPEBrm;*mdI#+2yb;<<}@$4(^Z}11BAtdjY1Ami_@)^e{#_o@JmJMD; zU1Ge?lw|$S+0Ndtz0q~K<5?(Y@)ddsXQ7}-%w~Z;jn+IpxjcBv9RlAgU>^mTF#=JM zDMX4kFk>dNbi!&XlRSG8<>Q2>2C#j#Dy{R3aAU}ubxUN|tfk4q!SSOmc|*}WqDyvyMS%p&^7W!R~(mDY<> zh}-c%{Qr4%j!C%ZYr?#8or* zfpe19bp#Sk(>-^tF8C_mJ}f)OAAD5huIo1L)U(BMa8l%V!%3 zqptS02_4R8i0GMDGrcjv#fb)@U;6SjjmIzF@Md&B?D z(?LD`f44J6gBilST&8_;N4@`iXyh-qAiT@K_@El=kd)RN`l5@L`VGY zZ>OnrR796ZQqEkHHghC~!_q+-Ty$WycW}t=mQ#D0ON1dT6HvVxFJKI0x?WsEMm;Yr z)m(@N*amCn-0HC>H+bw?JZ|>oLjg)C{Pe=s{H*R0q$V~(n*{QmfC6huW2oT;ud*w{ zqfBLZY_!0_qT!W}5`1@oEhv~N^4@1?*MDXAV+~867hCSEr04A(z6Z+RTZm%AFVBD$ z2h_>WuA<)`ku;)A*tA_rUU%pe{Ui8*7w0GB!d&G zAlCa4g`iPv-039iD-YtD2|AY`L*iKD(?90)ats5-YU<(lmw2KAJ(jlj8f6%Rx4JL`ia%9M0E%`NIn_F=b z<}pR}#NMvBPFmnG|6lmTWs-skV)%0%hp{))NP?UJ-yc)zj^IJ%(`~s$*rltcDkty1 zNM~&vVUsgO(NWG8G`k~WqJ&1CWy=?Yu5Psz^~^#xt;hq^22Y&&jhO|@iJ4qiNsKZ@ z!AX;bffaf1((UMocz@InHF9fE3`-Lu3|4=BGiR?DkuDeS`_}>oECnhb;DT$xY@l*w z1Dpv9fMzA+S5fB)1K|EG;OgN}h*hy!!p5cL$AT=#mR&RsfLU2TAJUYV5P5K&X%1{gu#R}Lq+JWKxOkd*ssT;Z|AEPh8&ssietc! zlcdH~;s+H$1FhJ7d%f~EIS;3Q=;`q0R23Up82iFm8R5=|SNH8$EKMl5XcK8#Z(DXT zo?h1OkB&o7ZtNuKb^eZoyuNaICaVb-Hls>Y z#HW}ySz{obbCagIrP%;6*u?M1Fx@KurY)5HGy7gttdFqVmM5fJMPh$LKo{3F zD$q(;Zgk;a)v0iI(4M+?d5>O0j`_z!o}gmZMRIPPu5L;OG8Ba_iz#*C6T^6@VzH=d zr`Hhxa!6e%yM}kRB(I{5emCn-PkT_?5$poAq`2&5ILC~n%xs5@dp+@?k5s)KxmD!5 zk(AgGK0c^nkE7#Oczy-un5sXJ8Z7pvYiJ3t>@{j~nt6`RZZ4^pozSUb>DU(T{Rj5{ z@SP6uCI3NLw8dXgmI&Hjd=n(>-4{h@fjJ%c^G5c}%K|H`>*L!agJTQxa*j*wQA~y< z#kD69_S+30`Bdaz{@w2Hb9`y{`Ih2}x~(rb;#aj;-MHYtigQ3&IMsH~NLYKLof`K-1HgBxyAL6T9K|+Aji!AFX4`*^l{B|5WL$ z7dv1l$=u{K8M_?I-0*W(m$&5~q$<8%#IUox;oRhiV*3}qChnUPkNG2yGOBF3R>IH8 zhaj0ypEXwG#JXeYDEcf*BKhd|G7RuGdn&>0I{g0s!rH;tHQ<*hRTcQP{}QpXy2B6A z&6Enlc;lpV2G8zD;HF}eTc0jyj;V#j_r7l};je-r5^!%sls53#h2P@FicMBx=Ik`& zFfQ9bc#wK$vF3>)N;CX(223u^9Uh&R#by$Xnwc;0Fmdyy>-L5Yaz_&H`+7_Sm-q-_ zi4F0S5?@$;pUq0}N}3zV<@_quly2}!*~8u>Yrdwq;&^IYyX%U?ea6F#=uoc*YEv#@ zEDD)%{ZAFB(z+D`=n_WyH|&ud1>-&*Ze3m6U}t()$&S!>WPP4M^CmFI$JxH5G}wLt zH<70g%N4Bq;N1*8AB5~0f7awrisNj)%-6QGBMvu`e;cn9Ls>c^tPbqi;g}*nM!}b_ zDf2guJL8`_(&hvathhO&J|Ry^cKWJU>luAf8zGW*JW0W85A{f1FVK+>g36ZDkn>8L zNk@d0yIxASiq>U*9D;|v)^9h6#=Qzql{qK}r6=~cwKahI9$&iKOq}pw&9xI}=bVaX z4u$k?k_&IV((Jz#k)$_z;QoS40p#Pd=9TtW+2f2%KK36C`%1Tk@ywoTLEfY;&UOdB zZ5iOQl7BfxpE4{=`mQ+q4~j`?ZEL`r1KvOCeYMqPg1xpHklaf!kh|zFG5l;N>A8>n zP>mh5?^kra5G2>4_-`P;Va9}~#GQ`{V^*L>I8I^&DU7b1Z~K6d5Hk$3;ac)y9<6TD z3$G-_YmAP8|NY~l*L?4_nRVYRcNEXLcWA-F;CtJhaQ|7Hmmbx`;@-4;cLU?SfZ{V` z{5m?&l@bBG9_U>FK~G`I~q*J|d`)i_3Lq%YWbXoWQn=Iy z!YCIRY;Pe)h+3{HPubL}or-R(&IkE_zN+ZfXxJdyWqk(Gxd-ybILin@5Sk^9il6*1o`J}1E1Fx4!#87u74qsZ*B zp6gaN`&3pK=r6tF=ac=4;I+77S62&}BBrNJt$5uby`3Mfh;w=)oRDaqL2^4$$N#0&$50S?PE*O`U zoKIs&9N>q+Mr_gRTpo>8Ar)T4G>R^HA7R*+g->cZ1a=iW?%&%z4hM_ID5+X7^Ta3l zkn(9=M{sN~K{XI)OeTh$#wzM0?sni|HBO`!`H+m=N|JrNh*&DUVjFu{2~94bSPpKz zjn1^sMUB6&e?$~pPJOd~KT6<%E2kPj6?5RSwZHu;sP&~*7u46#-}}q={)mPlTvfq> zQrdkV)_Qbhly1dTfhZSH1D?Km@-4?V@!P%YWY=IBz31VoLjHOqx|6dTsfD?KYDm1u z?ONCzP!bP7eOc;bw405v023>^-QZx1dT@P~Vnd3<;CF@P<3$4G`5f4ASE4+C>8|jB z`~T5`UWBfG)&^)W7veb&I=02Lpx^?OOfpmMH|yIe0nDSn;#Q5kb|pxKqgc-o?P5Fw zBcVOqZhD0hR>Fo^@BDy~4}3{H-(!Z~92jC8RN^pf1TAm)k|)CaEq z7XX+*XTO_=hyUFgYmVA6rbP`NdOfO<+W!itu~mq&FHZslr7u0fw5Ze(Xw^71>qmTU zNWgdk(%;p~Xl;3Y@!kZS{Z!{GtAsJ=SQ^6+^P1Z~Dhz=xKFBBRHtD!#(_8iqK3-Sf zDCb=EV$S{4Mx2A7yA6+a-kdY=1_r~u^&5y1U*L)|Urq{?$J1spiKm zf}qx)y`(2)peG%StV7nuH&3Q-EPsJ7t;fHBBeEaF6V^eJ{{sX^sLfs206}sQoCLD6 zgO_kq&OhC9BtC3H&s7>&Yje(LJVY*BnD4@;=f$Xqa?p1!to_dQ{O{jb?g|xX+04-> zIm0C-R;(!Jtwzzzh}`#Rko$rR^Va!+=_Yh%fcx61FtD8uaF;Bq`o%1o&aA@oOHylp zsW>>8&abSiLq`Kmz}i{Uv2FDp-}m2UC=v^jsbGd9ZQl}nd8+oCzpFpKc;Ut!wL~ID zL}UOoA?+X%tN5;VwgE@PjonKT5g&!4?G?DGFVtp#y9yjb> z3G}5!2x{Jp+szD-im`Fi4ov#{G;I1|Biu#@G#U+Twra?v3fLWX&|?X}2)jH4X%e;` z(h0dn$v0O)EQFZuW7Fbhy8hy;A0wws51ZHnfrKp?aAMEi<1pA9)RB7d*{6#kQ%ayF z2%h@)8Sp4X@K_!Aao-_&ALgBj(lJ}15Qt#0nK5(r+qir&169;Hy*_(BI(6uXu5H_~ z*>!yM!7>aRJQQWcCCDkX;OOZsNa=SE1VRyBd1F4W>q$>PjjYQ#xTAYJYDY>eeg91Y z5@sID&AmgpDc@{&JX^wGC}-7F1*(iWfAjD@&*TP_`hKueqm0gCurV4XESqr5~ zhGByS;(VSFe;GRp3T+Vbba}8B<{}~{5=x~Kep)Thi_PwU*WrXhp@vkefnQ(>=O_jhe$C)frw`rV~hGWO@&5gRA_RiaLEmjGp*zk+tbK!ggTkc~UNG_o)3`56vraA^nKkkX~8}hO8K7!Iso9ejbO8;WM zFdw}a=HtL*N^g8VM%8+WDmifyi4WX*z8mrut4MG4VI1BlMpC~=5Tcd9D(#4#DH+!n zi&x~gM1yWA;WQKisx~e}KVq+4vlk=oHD6~Tr%Ltj ztDD4u55V;V>r8F{rR*gW`}Xx!@@X24k9$#L;^R4p`3u1$ja;|SnTtW!xV&o2 z@h(d>ecabRqur~oV(;8Jh`bG#St&hwkN|RXQzfVA_asW=lN>wVJ~sk0W2gZM>_`=Q z5i{a>x>`f|Z#=zjHI$LS_yv#@Sooj4E58OFnsXJT)iz^GHe$xU0NvJ&H<@!K2TQj_ zkDXJZk@V)dU!aJ_!xg8o5EA*dx81ca8*3hnMvGf?pQf4Yt7GSeH2xtl!1Nj|TvO_| zj@3&QpI#BDl?W?*0OpSuUQ@rGs_HsGZ5V=bUPXD_93Qm)#zERD7Ax*O26f9yjQ%VE zIoG*|Z9$o{C=?~sn*CqzgPK{#xv1WlKLl=r9rOF`z&+m%MyKD|AxMzl&wtELeHNQ= zqxM!-f6}IB3;rMoosMT8oa`H!F4Ip4aZv=6lTsNC(V0n9cMff`?( z`KA{^ha28%wMgu|(+ zC?YvHaMsp3&6L0YwQUx1I%)HjMM3JjX!*|tII-tBlqMFSPg2x1k5kB`0;AE)4Yo5N zt&_q+wgcY-mr01isv?*SE)HDlSFOTdpL`65PVR%TxEOXeT}^GxU=%?^P*qxJg~epT z-~KudS$R2laKvbA-L?Z3fMRvk}IMY9Kn6Yc|zl zDc@6Ga5)d=;wm^jLV{Tn=6$phO0^c7)~`ZbfFE=O!)#}}#q8q#=@l{otPZwnRg9zC zzJWj_L}Yv{Yz}5`)yYAyvc^cTSBw@dTEOjaz+p5(MKVfAWe^+~NKi?DELWhotc>#= zGlb9Gv5I8`>mn2um2eF$Gg9BVbvTw%xp-+{!(h>Du|dH-N!g(a^d}(p^4<3m6{Rnd za4o6GT7mupdeZxe3GN&yH*`Se`FfZuh0!o zx6aJAKO7bdECjj!N(CxSR(J?{6>_GDbwbUaBNqLxZS2Q&?{e*Gm#zUA^V;8kwT$!o z>=g(#RKEw)Q5wA(($1)xmJiJ#ZphesgFff?2)EeBUcDTKYv!YFm0(+*!KsoUc0&mfx*EPJwmLn0<2s}8B~fr{{1AWeS?Bu_0^u5?FLz4zSj=JoHSC#i@mJAR9OZnwwbCtf|M_ zx)~g%U~JgGX+neG%-xC=%8AI0^A*a+OE2?5mkT#G{UpAA#Wd7=5?GcT#h!h@JrDLm zXk0iy?*r0TxdCO7yzwimYSN&u?v6mM2dVEb;M4a`s|^mDur75qNzH+i24Tl%dolRw zzPD6~PP-j8f>PU+oYGhD_VXk0>9UQ;dVLd4ZTuHjtlo%ZC5=2zEW=wTD$%icHI9`H zMb}^_5+^)$Lv87m5Hn&dvNml*#>SbLx>JXCY!qXo=402R?X;E9ZR$t&%!2N_wJ?$Z z(%HwTL3CD+6WD1Qe zcB6rWCP^Q!uloE*SUx^~E*8JA5R>LlzO7H$b?zu?7EuShpcf>4!mm6X%26Gzm5Grqu$XWwwnMSAHRfWyTqf*n2y-L@mgW}m`i|CCInBVA#(H! zx2{E?=L%c4g6os*zj~(Ogb6tO>!Y=izyFF@zsaf_+9m$p8ImqqHPlM#1^o28ix^nol9!OqiMB zshd7$fS61yueYJ-P(#ZuPg9&Z}U}puZ-3mgJr&PPdI$pv z7+B~%a3Jous>uzSu?We%UqIS{`N-V82nC%Q148)SQ}G;S_iRB7qT<7^uQen2D`e{> zO(hU%eGe$EsD!?%66xvZVX)Vrw7eW1hmd<-63~C$?o7dfjC@R<^cT#Y`wl!_H^H6* zyH8w%M(p86?2jEff#~QK*sy9HqFc9s%_~54Q5n}%x|tZXS zNUZv12ZEc0@TvPppMDmh)G_Tpun$G~MREzwT;buU^>$FrQw77QjqBX>t$Sd(p&_m&w#8`e7*d=PQP(ozOH8dh7Goj zKR`0(*IQ$`oj#Tg?LBrHj8$F4=9QUvviEw#PyPu5`bAO(PvMJq*5k>SMmG>{r7$;t z4NuSaX&^tlZ!D@~_ap52lZX$OayfV_Th*@SEeI;{{j4px_qB-#Pi%o|^DoC|12KoO z6o+?LVNg;!!iG;lmyT4q-U598O*-yRIF$yhrtK zhSgxf;f+fWKIY{cLutD)YGCj-0I8>3fd_VajqCN{#fw%DVK$;oZ?=K;|tqx><8(;Z#G1NV4LEvu50}+9-ep(r*|wz z#PF2}(aJGo`aqOkJ_G-5GcjS%wF`{dT9?8j>v1~0cKY6NqJL{xeEoUVa41NsmGt$nF{5SS#~@Z(f3}AF}OChkbwT z^u5ahaX>j-7uYySS(mmrsXMeUXa2U7Csw0(3lXB1CZn@cPW^-fQMIkO*|7F?Q}R!( z?8ZOWSu48nHKuQ_X%Bh3AS{?(jqS^`(dOwp5%)W4Nxz;|JB=ahNI?1-)@)mjm^L(G zeABl<>GafdSWf32eEA~iyGGKhI^NpR%hJA@$j_pt(B3Eco&{Md${0{4t}Q&CKaFS;7Z>E!SWN=04YzR{Umt5Ero0O za){dBNwhQ?g8#?fc>qRLfE8epVa;!4Z3SxK42YX=z$R7@)<4d3|&N%~df)-2W*&DuY zo27`y$*f55Ciy`F zgw7O&BS(%yG)O2oahO2d4uOEOyu1PilOEv_(Wv&w1XS%%Xb-|26d?p;gb2#K1Z%QK zg&Jo$y2ixe=_--~h@hdh!GhYO3L+p`}r zi5)m3hGaEz-hLm|1OsvqJc`uZy^ld4u+(X&|F&s^{1YW8Y+nS&+RX%)?Fb~xFy_)L z@p1N7Fc?h`B|lcI`5xPMZdY7C!N&sw_-ZP+#FI&W3knN4U^)qmEzAMG+sDB(KE4eH z(%9HoloXdBD#}KXF%$*GWjKDK5ET`rupiln#ov4fugA|pkm-9`%zC&8C_MoWG@^z} znwYed`4csnB6+A#hch2T+V{XkmkvYW(Gw6=h0svGSSZsV!Mc|6xp3}mm>2*%>#)5t zfZj)rV$Y7<=-j0)$HhuncC4I=a%wLN{?!lLcOOB!k$=VJ z$;KatQd`GH$h0IYpLJpJNbMhAzq}zZNltD!hmm&E#40ALOAkbyTv(`#&CUlJt?X>6 z9nY%K^-NDc?e8gR=?#BVS~j}0Bt_?;eF;fDq5GRM@w@w3_S;t#2VRUl~b8Ac*CXa5ug`UzW zlm0bMJOjHmwz#47R->b@nEZ?KBd8-GH)%GiOr@=;+BI)~>K^oa4@D;EPfSG9AjkTB z1&}PUP&cubSN9m$0!p=z>)(T5OMx)CWp6Yziwfyy|{VQ+0}Rdi$^qe zkMOpqO#Z!lv^%-4gwa{!TlP*QH?hDAPw4vNtnLj7A;F7f-yKDic^M>i2jtgy5HboV zB`EXN`3ckl1YS;f2_ji6_d9N#0#OsdH$fHCMM6*|5X72rY}+0r#>K-F9*g}Yc35>X zs>@2C)*8_>r7NtFBHVPnKvQ#EVjCRXumMJc28W9)q1BoR7(=jHZ73=_2$wUU_yDDL zEUO82Rf@DxtrH-7>6rm9-_Ez&E3xQ5n-FFWgWK!D?gKlqa^o5T90`Z=N-%QFpRwqh z)qESDsV6XL@6kht(XL}B=nYz!&Eed8N_ABYmdzm!rs1Ly z?K=0O`aXMJ z(Z@W^oTDF@{Hu?>zhsVWHa4dWY%Z+ot$a7eDfdxZI-#j7`)uajGvzHoYeBpI{hF7{ zmi(i<)oiCazIpw})ZhQ)^^C_NnoNO)_+%JkaF2iZ|EP59S?Yzhrq=XZC0z?WPw6}_kF}GX`u+d6 zw-gdQQV5m#C3yCIJ354~Lx=W>D7X7iSzCqT!**18-O%fe@cO(6F$bk!4&zlE*d$4Y zE!qmZ>_DV7f{usastdwsH9-^dLPzjsHXBh?Rt#B;M98m($4B?H>Jb?ci?zFU6GGAS zqmp2Vi$+Cx8JD{5-nEZMbP5H7T!N?~a8wa+`Mm*{bRrHNKLL}$2zSr|9l>#JX%UC9 z${OYl$_*9}RYlKsO9H{J270pzUM7XqXkaAZRBN@|=t@N(%u15lE*VlNfUvM|#KcD< zNB}7sMC9e=^YEg3_8q{Q^;-}isI4fgpqW`f$9Aa%rloXli1H|KmsCE2WoXr0SM|iP zt!&TEbw^TurJM5e4EmIT;!0w@ANoeoveKIU{YtAN-DaK2AnaI!6-E({S5o!g=^!yH;28 zK|zij{)fNY)28aiC{A*%?cB`c&!jLkDMRFN{W)6CjqSN_pT5E$@s0yQKlGvrrOpDl zJOrYZGB)ko0ZC0@!CA8Air=cI;D1iMx(|2>|CTIB_KN7f_{DbV$+uGFzH2jE4}bI-6*pc zV_@%5sH<~u9Z#7+4T6UIJJqnTq@f_9V`4Ehy*Fy>oVcKUiem9j0C()*L0s4=9X)RL9kM4(zwRE@Cka1@l30xY0_ph8IULt`-zEP4oTgZx~TN)40I1iznI zFUVA9USz-VI6PG6VdikS2{bKw1N=S@So}~{x6GXr3;D{tAA|w{UiMIk`A;SAWcVCp z!3?SpMqvHJhOOM)R>&`N)qy%%NSMP-T#vPBViA`9i1C^IrFrAr96zcREk+h8={!jd zbxO>2KF)jf`Hy|pX6yP}hNLoRl+aPSvQ`MTs)-wFjd1MaXE6b~) zQRxUU2}FZ3w{BGhHPC8hzIDvv*~@~Kpvq5d7=%_*E8F1&LZU{6%^SBub~_Pnio&HA zcf{5oc7xICXI~yiNK`_KhKV}tpZ5hqvLAFuELq`(+sAB3ijZU$;q!RmqG!2f9R!aD zpM3BtL>9W#sDsDlp}eTL^}HkrGl6a6zxqnN_elb zu2LX=-@XIr(4hlL%Sw6pP?<#ppt}lmUR_lUmv$H$%D^IGg_QGyR4+_dR!d;d)C_$7AarVh>ua-+u3oAGQAfu#^j@frn6Fj_y$o6{ z7887QKNiq{8KN;rJ{QLB^Q7+yt>fAMuR7P1+3lUr#e#>MOa-DwYPaH& z@VrXYVWjrJ5&p$@qyuD0eQwrsXI{^eB*jP}DdP8hv`(wz&lYq#xow+p54KPPJ%V&byN0x`1UvlE(UkLAdF#F9tM;d52-{gYFx$W)8$X-l9T|o--!S0 z-i-}gcXK_^8iG!fULs@*Fg;e35N-Jb4#dZ_!H8aMP)E>v?9d_XF7m@0qE@E~KuwS) z`TX1+6FmZ2gPzBpciUaKZ2WjIM+oDyF2lY(R1`X4>((8}`F1tBbxlQiStU*s7bB3D z&zcE;f& zM-UYgh5fttqka1nxZTWv&5UZlPf=kA1-LsXjlfg_)NtADTtdoxk!lI78Bj{T5P@a@ zT7lKAq{OGE{Ag`z81)7?yiN!N++L>(7ONsD6=;zV3P^ATsi`nSC<0i4x#y?+dYm2} zL5sgbQN^Qbi8>8DZZ9-iSL>?3HT};f&7%t!9yk{>#?%TJk;{Ac9ylK>_N3auz28>< zq4{9j8>}AxjC1EbAB$8}3398iI`7`AQBK(3RhW@xYhyc5m0NvI=27UQ*e9jiYz5)f z)#qIuYXJKpT9@)gReZn0Rk_}Cw4S+VQA9^amu=a)<#&B{YDy}9wnnYtK0O6yAs&zs zX)&R?t_~WVNOUj3?Qn7(Oddj0P$Ys(awn;R2>5-xwpn;i<|~wMJ%`1@Myy*!> zJ@C0H-}O?~%Gz3{{)r2^c7={0H6lC=g$0F3PD$plZ8DosSzd|A2pbOUKg2<{y1JGF zrO9kTctjYN7&B=q+ecR$Kmh8aav9{a&o4rPR)e_M2)^B& znw)^GJN6Pl>(MiJ%e~wcBy{jmFcy*y*>`=HPucI_YCL-`sZ_c5Mi;Pit0`sVp3}@yj&8i;x4`z zs9VegvOX8rn-%B*M)n>8L70sesv{Phpn0r0o6RQw&do|@+suE!bI&-P+(JH=^LV;C zZ5^@B5K7B;Zf%IYT6cIStQ~tGXfMIuwc8NcwI32vqak~%ab)Wev>Vj#6kl1zbbS!a zZH5sE-5Xs16>iny2Lg#4Ym8-5Q3MYQYF1)jnKkfOTKYE$_=pZVoV>WY|n%a3Mw z^V(G?tdHK}3mVYH;z2NV0Q%Mkn_ZBbiwX5o$_2S=>GR-*YnSKdU|o?DkK8m-2~XG{ z@{o|dVok$WALS2*FiaS%xGPxjRW1g%vto0ZhgaEU!v@1Z*H;zn!m|3>nJNz(5cSl0EQ+=BrUA+JSSw{n?4IKw%HvE1#cL6#MpTOOg z99X%e;djYzMz;|oP`Z8rq6SWASY;gedOpmZN1ky*@MLdoh)e8SwG(1y4@gC&aK5<} z;>do`4~m9=^8o}4m8cSi%X-j+7lL=Q3;GNT_f=XqdnMER31I2aVuY zY9(ZJ^q)a4gIM_1Jh*gm_{-$+2v+UKiY1kM%Pcj|)N^jJQQ9615KL613a&R1ZOj(OZpg2_l!diOW>_0^13?Y)h^w^POa5$XY?Gy`qMcfRdNM&Na zU4bzF$2e_Zr5TjD6G$uI?(fOiL1Hs4Q)GPX|K@Om5rd9zr z0jJR{QhC%6sh-?kKhyDmEjp6ww1%$tAUVdyT}%Z$0o1vid@En8)9~lWEimi%mclnR z+N-Y4J*NR?@80ucC#YLDTdPgS*+A)mFTZMl(&BHwBq&Wo?)=@jeA;MKteKBI^R?Lj z`U)QJp83dX>5||GUC$imO94mYaiJEwmVJdlLON1nv`FgF0~KpuL)hRuaZ-_R<-4Ep zXfC7vIU4Kex&d@u*~)pSiTd%t-cQVa896!G4d3U@7>`-ow;+G%eMDBfaR1!797+QP zx%~4*BL<@_b@D#r#^H;Fi!nlE(VE6JcL^n{G5+FAZ2D{}I$S*$Z0+?v-FI>OY*f53 z9^D_!#@92)<4-SS!xr@M>klrPgT9OFkoUJvNSUhCX2#H9?ZF6)xn(BSPD_IM zwY^w7?>MG>bT2A5zlM3Uw&9i;&ExQHdwDu{m>=?$aer#ueTAwBD_)-tU+1ytoxU!aT$l-twC^ z+|O>?gOa~!@%GGklr7(bxzn9kTriL;dXDeC582yjLE))Ferzlz4-~Ot#v0`I?}Zx@ zim@}0{F^~(&kM7_Ff#etIXLmjy^!lxA^H9lIPu0zlpS7xhdpb}e5|lD+PbnX3 zN>Z`3UkTLH@F>gY9{MFNj2>r2?algnMA0j{7j<4U=<4-SEP@kmnWn2^vF0RC2`uoMg3hL)d zy!t&)N?5IR;*N{dNO{48yuUXEQ+Az&JH_`DThMO01rJLiCd^U%mL6PVL~x7~Sr6-R z^piSx&uCZGhoM78aEIp9lXy7CWpCbs=zf#XD*|}y)=UU;Qnrx6q?kbk3<;RNTd^81e)J8l zys#5W?A1s~YKNU$cH^n1pM;+3m2LMsoh|}15e@<>9f6%zr|7G4FPj<-bZQGhnU_lk zbp&of0#RnU&s;6(b!H5|co>{z70~IJ+awMA1g<8!pFz*=>4T0SIYwoJv5knl;$rB{ zk*KL9pkrI&1gw=+H88Sppne}WXky#v4wnlqj~huz32?i;h>DIzM3@D;_8#PtRMlwrY{` z*q?v&CMU;gwbp`+%s3uTwPx{a7)Fq}V&*)gJgNW+lMps^H@O7Hfs+xwem-448iVRV zxB5sal7{|trdMs;2p3Ic=9rG~Rsu76t)pM>BS3u&GcHh`aQoDMA%Dp`1dO@Jn=uTP zaTC$5KH|lX`6$%^4U_#1v$DB^{UO&qg-!_R*Ocr;-O~u^)6n4sC`PvG9jWZw4F(iao#|mCm?)8_q;BPw&n#rF*TktJ}O^W0e z+HVo)*a^D%KR~{??avoL(xdY=P7L_S0#AL;`HqJ=hy!zicw@f?l?i_8=c@WTQldQF z!E#q*K!-NXrJQw#jQHS#3f^7}Z5%j0n-;nEig^CBFdqIPe>ZUT7#7Y~h4vG|@xWtt zOzrj4S#<9H2=~0by#AYs!>M!shYj!0-(=8T`1k`@_VFrZJm@+aoeOE;3y#6+HE-kH z9qhyo1f(6U_sS(l9HtZ(wOzW76+FA!Z1f2}HtE#Hth>YYG?*01q!p@!hP)^Tj6B`d7fv3H; zjzE(43_gdc2^J-;_Zi|Yoa)L6nhjb$nuNGjK8?#%29^gk)2k)mRB6>Pg+&u=ySYm% zk1K>#YgeMzzyUZ^vM6Z6CuvpaS-M0_yG|AS~lta})M1EmD4(>jRvhq4u zje2NI7HEW@-{pOAQYIGXGqvj)bi3wBJU8SJMo)de;W%q|L;Jsu)f;ceI9eFNMrT$7 zFXgPJId>**`uAbTHTm_6r(d3WCyv9m`iMTy$BoB*rP)ZN-&p^-=bMi(*1Z_rvOa4# ze@)(EeAst9`hS~^;j!T778HC;f3IseCws?Y^o{)GdHQ?bB&?+ciCk5V=W~u>-{|(Z zZCif*uBZcpUfP9qcMZb3cP3%~kT3Dv)jgYC|J>C{_`;!FKY8}|xHB^f{fEuN#_yES z&iyj_AXzBKi6+;)bN5L6WzI2bAcwJOQ>(A>{~AhJhwMB=iBB%>G<2Nd#?_hvh06Nn`J!qjnl|n)^ES z)Rn_vjrr+^2nvFI{~x1{l1_;xhumq2NPBAE zS-l)JP28+1zRRV$%uVF1<)ZpDwII!$hhC&JU*w?P{l&#rcx!AHz96<5SqD#m*XTohFh}lRU_j2SI=O`%6sH`o$K=*;W=U6jJsgUMhVa z16jw9cPYA`>^m8P&_aN!4Bjkql(yjK2lDqHHRIr383#2oj(u*x(9^Bvn)P!X^>aVU z_F9qgh#L9XE%Fu+2%cyNv?%W+uR_7a`>wL{7|uIFkpx-(2DoLC*QxcNe`+z}3b4$G zccV*hLr47;t2dk;9#jOA zQC2HPkG=?ITSx8}G__rOL`Ov-Hr57*eK`S86}@*4ydDo;ef1@5S+@Z@j_k#APtV50 zo9>1f@bT?y256$zg5~SC(6|#s@zMPdyiPc2DBQVs4=t2U&~n|?0D>A8k6Fd7>X{Ex zX0W3*7!Y*22wXh`yIO96?xA~Ym=!)%iCRqyU3G}Nc49DQjr zZAeT?fWzT{-R?jP)j_S@PTyVFx_uX7qN89k=}}Z#!eR~(Ap4=!Q=XXPdxIV-rYB4P z^z=Mg72wccBC$^ENO zK8{s6k7EABOsVfoONNfv8uRmp~ zmuOJ(JIb(eWerBA?L_RDY3Re^ugZn^=F^?H?CKuPt~p4nyiqfh372j8@7)bV{ORwA zk5HW=p=p@{GzfSJO1&p@uIr6w?iq(S-dl{LkL6&;;wSLI$BQx42vlu*4^MBaM$eLu zv88-8`bGuNdGeH>jp&p#_BtHRS&Y4lXW*{fd~|2>3budet3tQwA0q$LH1vD(05;u5 ztE^D;=_g^ei22XY!{qyJL2{4Y^^=Sp0k;E1Yi7YP^zBowVFHzq&jWYOL45h)Vca}u z5mN8`0mE4=UU>)JdUg?RzCWwUL(1T4_b6_iqe!FQyz)BKCa*>8J=>8Qr^C8m+%&3D zmaqh|g*QNdX?ytV=VIgd9;cisUU~`25@!*_-c5gBq5^dN%^R+f2E)iJdSP7RxA>r7 z6s~{#M*_yxfkxo_-FHxoFQQD)a`7lEFu z>d*=PJ&@6oj!68n_?;Ph) zsve)k`)t#GD|~bhLR05KHTM?y9vlY!D{nNrSID&)!qYVnp16oQ^qJ{C&)6Gkh(FH& zaVW8Tm5-KfJ}tUEprK$L0=TxDo|eZH4Yb+Ko{Ks9n1-M=Hr!c)jDZB3h?MlMuH(rL^$@Z z&&G|Dt|5qZAk1PQkksSfA1;K)%`Df01g!L%-wTaMP%3E&K*254y&gB0AZkP%*9G;s z2{zOM*O!#IuA~edn>*+)i@MakS5Iu%@B`1M%j3nRnPc%$&PV8#o`J<*uE2G-PRG1= z-ympB!`Hbh_#$6J&~1y2MMQWsWO@dR>{M4pV^u{Z>~(br(!$6`<0sorXIAz;T2zM! zAepgJSy?%BIvsz0e47{)G2?`gtXR_%R5JgdYNm!Du_#U&h*X~{`prPF%>bM0e6st} z_3YVU5n<3%^DDNypf?%0p_i5*_2P>M(W1`9WEN=q*U4D=$tUREtsVDc8XunmUyPps z*2sjHh>J-;%+@`MYp%i~gj=KF`g(NoM47WZF{0$S0l=! zCZpy=0oUD$No^imHGSel)D#y(MJr6EPwFZ;hF(4E#Q;JAdiPSc&CF?IICRM&HwH{= zoK!Eqc{1!C2^xO|>dGWo6H|XQ!;jB;96OF4RT>}-Bv(&=Qt5TwrxfHl*dtV z^dKrU`iAS5jM#;@mTf@(m(QPGXd-!W%?*RF>+AW5AM+uit$K`lU_<3``z* zszKM#e=bDn(LDtIVO+{um$x3546EKR@L>8=G?#-jsj6$? zCWJ4#4W19?E3RXH!-hNM!wkM0di;Y7uv&a-L3(2wd8a5N-^7At^O4l`1{{A%d6&EH+K2h{+g1NKh)y(lr9GUF zyhGGJmu({;Eud*Xh)?cnG;aCenb{cHtrNdb`%4!i?QDgRL6 z-Q~|Vz@*{d`3UY@1!4ZSQ-GA;BK;P~pO+yxe?HXd7Xo{-And%b#d&%Ne@=xqB?EHz zJcQ_6@t$RnW0l!Q5W7=8G*Fo`AYHefo|OY_>04*8b+5&edG>~{o9DPu6BMXV>QSK$ zHApjaaw@5xn=yZfvVC7wtjFhf2-tCq-nk)&jFhH|p+P#Qmg>|3TcQ_v5BcdGgjflb z@!%pCtWjPpxx`5Qoceus%^3};Y)f?G%H^o^8~Nv8Z4r`M@Z_AQ3C6{C1f;XDY*9Aa zT#$v8FV`D`iJdSkNln+4;nmk>V%PqI2nMw1-RIQBo@h33f1{`m|Tlf?lmg#SM65=4hU> zdT8%)Y+bhrTB8-iM~p!p!Se8NSD}5o_W0Jl89_OO^npXUo@Sgm72z@Qs3|K!c$5uY zJ9pz-^W_y4+z4mPYYbGTKK75F*sFg1j?TQ-ar5b0&|~_c^A-9*+l|z9ZJi~&^9g> z;n9(B+3R2+@U=xnVe{Ix73x2HFD7Ox0*Mu?(WQkyoeM7PjUV!Y7?q+N zI6#kH^sm>E_1GI2Iq_30+~>r^H1jVW=i-{^zaBh93!6k5-^!bxlf7>-`dXB&`jY~W zjEQ^jY%T+w1XDb(Q?=SOdCgSS50fmbK>Y}jhQtzGkTqHkJ+Ww&RbU%$jt zw%VgpyJE(o%^2_(Wx@W&Y8m5X%DlZ%^+!lPO_WLdX7sz{0c_gRx^@4nK&h=`BLrHK zmCu6Kf_DA;o!o^+OmcF=IZU$IG_^E*GQ~HC%9#55i#FvRg33rM-NxgF_+*@^reDwW z^wa*Hl9t}^x8?e0Xj&5go6$cLCuKuSU$kjrpcxsjY-wt(iD4YHoto8MYSAW&JJV&O{zkbsk9SSyXNgt-GhGbq3D{jZS|%L3;n(VNS0WrCr@s2{=gPc zs)d}QJV>ymK$zUJgBTj}p-!W=oHp>x3ZM?4N0SYS*i;Wm(c~R8YEH9jm1ntebL!dEcmIn=G!C-iZP8-dMeiObXG#-B zXN_;!8MDY8>tv?UgFw(tK&s=0N0RJ^Agd8@6ZmR1N?6TcP;sjyE8F#K1;mW3m^&$E$WvZb z0nwmg&X};7;M7~|fJ&!@%k9FRl6-{mc=28s2!0D)2O;KOR;0`VU$+YB2ZI-aI2aY1uA+sb@2MUC@-&qo9gS>iQ_m{#B|~%)Y#pyn)Il1 z*8Ozj3h$3m&dC@$M3DfhdQZT}Ak(EqGu3*z%88EG%)#>)4aKwd9eMup)u{dKUM^u( zbV{%Oug1A|*8aT#Hsi9U(jbwBe@z$%rbYVCZ$ARupEqdMg_sYM(C-yxRGODtfDP9qaR6m$^1s)h)~^8O zy6oBL*K-;+?Rd4x^%F37e;+zuA?y3OayM{O(o6K4q9XVD@`96VS~&bl>G}=N;%%Hg z=arQOxUc|@Kykly`~JU!(z8vYenzkKd`LgHegAug+g?cK}t@b~r0*;HY*$ZxZpt-h90J>~u`N z@hTkko3MM!M#QqnNM(f(MMZBe@`B!2x%~*dP8qlT{a*aAc|R&#-@xarE+)FRvjk)h(?}42>+L6x}f<>#wx&wRBxkDnZy?Q+M?cGB_ zeHe*t!tun+8Mt-oomBQCnEBXrSgaP@Iqd=N1>nQCU&Mg}$1v@_M_@EtP`G_7-J>fC z3lAe8F}Rj_^eBmeHk0V8Rb0xcp;=O^*TCiQLSV*P+_}93vqj{(rdmPGBQnXNh&JIC zTsdkCqLSL;>+d$8L#H-aO?lVp6X9jKu9Q%2v*%F8kE zqQN+{|M1Vg_A4HkPyd?#*3t%#898ym$C~E)$jR5w!K&+jo#tmq8H|F0<}MKn3YvDZ z8@N3rU!=zNLqQ1>Tuf^?deTU$`8EGtn(<9Oni5KnZ}V|mlka!-Y}Wvwn|A&g6%}QT zP^!1$rrBF@Q;U1v_HOfgD3YNJEW1nj*lOJLD?;g;Q>L7g{wFA3N<;3`=e+cfQGJd? z(s`slA6sw^z31vF=WmY@8s4vP9<;&p-nUF^J^ys_+Py+Z?ZF32wn1yMz!uX5c25vS zwT58T4!;!OE{`f5wcJ2x-pj8dGE&6ioG$?X=ZK3+KxxHs$btkNfuYy8*V4=zV$L}*SCO{^r_Q??FuZl_@^7@t?744)KH_NVq5FsT!PZpDrilusWr8x^D}8R ze$|Ph8ia>=@ygqa(J?6ksj*h2bY7?f%%VKNt=6Ms!f+!0 z7&Q72mn4Ry0GANzpoJ&kf}5@<3WHlF7$rQ@Fzfk{pBn}-xMbVVLP!OzR>Q-Ts?_(UTP@7N1bWE$Ba z#Ky*;rm75KVLI&FU4mslY`~v~kAcNXu&mQS=U1jbok7p@$z2JASU6UJyJZRxXzS>= zkUEHf+Xp{^r)ahi)CLr3DV5zyuSX6T-`- zbU9!lFuVKFM-X9%L%LTf}_MJ*2+ zzznvefDfjKc-X5dkQf__6D4IZh8wvT10R(uNcq)LnVD}_7B$Kf@In{TQC)aolO?#l zP9jMe5n*9)27{=ns6bKPC-71pmj{{;e61rlVcALiebdnI7? zLhpoG|1+rfGnY^zm6Pf`7?fKZc57;d($>_PT2pIkP3Ko)QH|;xbp(h82>uX(5DSy( z;Ra942a}IG#t*?Ds^N8c6{pe;7p!V6m!|4X1~}brgc%LcYvWLEXNE>1)GR`iL2;QB zlGs1Ct?Y%Y(n4T{PV|rIKuZ1~mjudmjx4CTUr)7Kk&H6u^s+?fszro+KJHVMxoXns zM1p3C1L}|=7bENHE8z2n&^FwH&Bu>oaOZAVxqbtt-q#HdzYC?+b^<>ix45^vJV;LL zgg9FyV#6Y#D%lIC$B&>y;79e~C5ZKv5m?eQiyiqq>XKPBBM`D9#$ZN%WjSnSEi@q! zLNEYZd>ho&)Iw)4pt7!($FFB@uILPu7L-FvAkTcEGUxviv()Dc0D)WGGXpLaJ%<6Q zk={dqj}VODnKK7}yY^B< zw`qry_;W_u_~eyZeeS&HV>ad8=2l;I-o00&oUs4o=c?T5b3VV})z#-+9cy@O z;FC$9diI|4dET;h%OCPw7AD>8vBPMzGUw6=zyqD$h_>MosFwWjI$Y4{)NB_X27?Jf zj~9{AQK&sq#&t&77CbXza(V*H)P{hFN%1%@@vUdJl^q~x3J@%62sCA8&_h7Wv_b=3 zKZ1gWZ_%p=;xrI>WGLqNp6N?6p{$QU)TGt%t!_0lc_O$B5snr#MF_y#}-Ayo%daEkSWv74%^m#B}J4N*wt7Bx=f9fq6WFjT>wBXG-qliAGkZy_-C`@B?VI#~4v4%^Ja-pL{t zGKnwMi)hgD-vqD30h?{#GovL2wpx=Op}G+FQK|_KLv3X_qHJcWKQ)JNrdP`i$fzvL z&nde|OLZ#iz$MUBJm?5a1s3y)`I@CNhBVC=VLrdF$M4yuM4hO_l9oL^&e;wp7@_;%`6cdDp6HI|Lm$DDjM{2Dw-i@}2x0?Xm<lJ%c)kXaD&SGKZ{&K3q@FARshQ{#j^L7EV;f zTvaKm3RQMH^aSid6$^`MfZb^)5LI!3y+JSXaH32nRUK5r=XD`O(5jIbluHQeP4Kwf zkOd`>fsx7wqYhOB&?5$AVB^kxuo_wDR)Sx(Ncp7q5r5H)ySI~Ej%?Pi%3of5Ny4g)u(lO6TNm8%z$h@LE|IF@j zDP5}*y!dM7?8Xb^_89f(b=dp-EYuCY83Qhihke`USiho_7H2i5I_LN7LejO5Hhf+3 z>Bksz^>qyn@IRR`9xtZ;6Ps@8ffpu?$M)-9z=xxh5G*WmQ^$@M;PBzy*pags%{JOv z-1o^BKf=TJOjORJK{{#dHK#b)ZyE_oFkOZFte<0cN#jkMpD*x;O_3ctqU!Kr+?u@) zZ;o$_;&bJD1&FscFY3p1{>k_<;UiwhHMd>CKePKxUQ|Hiw4>QQSlsYim%PP~U;6qn zw2#%I^1EqR^x9;4L?i~SXTMZqXPTw2fp>4y%s2lJk zo!9*LsGT#Qw*7`JwyqN6x^2SZf>HeI9f@Dz_I<-KBduvikHq4g9WbuP#`^DOI)4bp zCFauK;W)ZrJEnhZ#G)@d|LWO$^^PRWE^cfO-z+G=^%D{ygahTZz{2+n(5-k5_9oqn z0W9i=XFZ-i)EN(^97FQtEaf7pH}aQ!h~#VM;lw9O9Ob03eUP8CmFDh4NS?T~;rBC5 zA=i3HT^fU6>%Z9u?`8d)wIlWZTOp-4=0RJWbIN@JEXq@_iy&`b1O1@_IIl>A<`9}( z^C5&;yCKi$Mdx;ca8Yl_Ym~613`+vv&!Gwb21tXIuufjOpRxYfnWPscMPd8II(&G! zAFtjX)zJ5Z@DNVCSA)W>VHh||gN|Xq(PTf4&!m1lP6_AxOIgp^f|0Y)|M9}|TKmny&iTzYX*CKl(jkaacacFmJ` zZpa~wp89^naTa=XX#dx_bMtXShO&shsHp~C%2|zG5kTq2caWpW!mWM6F_ez8;7&Kb zy$s_zo*E8P(5U6;ut*pz28`>|7VUcUfy-|}MR5i89z6y(PQdN=!ta#`;3Vh_BEe*c zV2GegVD6gK2>OGtMaIHzujbNBK`p=+U>ocq1wcg|0cMa#Y|@*J5SVrVRfEgz1JshT zRZqa^CouJU2ngx7kVfXxM~~mfC8nZI**wrW^IDSuXnqGFqm0vc^@oBGv>bb3O@Sy3&dEhFd0=Ss;Y%XOMvNQMoBC@sK{Mb zG5@5Jmq1TLz)4eGjaLIPstpjd!$hF#l6*8bskx6;4S`~SfYk5tbDyYzdW(5KL9XN_ zAQnwrD$U$ssb#81Dzio)5GQ~pa^_Gi5#(zEYJ|K_L>l#Q5;(v6(QEkgRa0=~sFB#d zc?0_Q?T*?yKiVbR;B^L2Qc(_VO$|2~t6^LI8Ubdrv30f8n*L{#rlq)4%SJ$gNFinr zF1}?LSlE76OZqCh|$rf+~_1o?tN_*t$e#fC|Zwhx7>sk*#~gh_%8f- z)!Nr!9eig)H|m%Zp5Z%;KhA* z+>;iD2X?kc=Pt@!U#=bt{F^51QH!zTv*~#I-NhKr%T$fGwwB=L-to=ud++RzaCb+d z1Hp%O_kK+i|3V~PITamHgri?B#wh{7<+gOr+=j37?)w~j31TgD-u92DVuKqriPayZ z)pqJ_OE7#yPdIkZhuuq$iGBc6-n>%*&2htU>*5us)aA)2PaCEs(O`N7gd_7X-*@t>P-M|%QPpXD-4dG}RpqU+ZmI3R*N4G)`w9gZ2@tjQQJnmrJ_;3s zk0yhI=aNL2>G(;k3(j5+fo^vaIK5Oh)VZu(ju12pjc zQ&7d6T{&KM(TjYO9(s8d^aiS{#g(v7>)pH5hSd%U*UwV(nD@MI&W=FgP66M4QGs^U z*OPBFUjuV$EBhKI6GvflvkEI?wO(yWgcInm#9JDbh-x*}kz7~gv z&cW(idMkiBg~p;`z46*tt8oD_WnT8Z*zTnF5oyNZh4*6mqSY7_rCiDYblJ<}kxhM8 z&!Z;0@Y&o(U%-jd@)ATv zMxm;bfsY$H4YQIb2vmn)vzSp==iwnW15$wNj=ul;9NatoVaVY!(o(zNs}<{b1R|Zv z0Ik`~9r24=BLS|58$9U=6lXsAFy3AI6|@ABSBx2rC!c#oakkHzH-RS$HR@q8FjWM( z)ZQ78sRmrxmL<%Lpd@p(0tVJhGA!zhsBqT6WH!+;rAM&cc}uhnQ|`GP zUAlFH;0LTx;fS=v!R>aTPoLgMOl$**3elrW8mirP?B0J2`lBaMSyO>(daf-pnwR_M zQxFT^ng^FI4u6?E9>J>pSWzE$J+;R`bci!!*^2!bJ*+E1a}i#e_Zd3&8Hv$Dx;ETl zd#Mk-;>7=Iyj!;@7lX2f*N-W*KOktQXMiHtk zn4gQmU98wt2FV7l$#^J_)da!fg%~xK9m^2VKj?F~=)mBV}T&pA2E5w5GI1)uI@$#D7Q6Oi-y ze00sc3Z0_PycC<)u0mlw@c4oTbg_64OdWu}G0J;ckeiDM^{Rl&==13M&nzv^&B3}N zCmy+J;wfWO;o*(gT&Rc&6FQ_LBPk3E)*Qry!S!|jRW57>Ho|DB-C8huuo6nWs$d_o zcNgL2QN#aOC}k_z+!tO@CJKV8PO=_DE{kl4anGckv60k~cjh3}>!3KQjp_JNMc2V!W8}kJC>=LQ#XX^!AzWgUu)1#wy=qGp@qsri6Q2SR9WWKAEtsottBdh7V60**=c?KL4zdOxcYJT%Z z`=>braQ`DEc&UE@<}B$1-)YZklq$8KkY4}EiMysd@z*8Yf42^{Wy@MzHn#D5ua=TF zS=%6GY}o1<@i_gz1EIW`=zGH(^}iQ}|E@s$jWN`}n@cH=xTL*h`pLGa!q~AkeEn&;LLeulzCHm{ zF7h?}_R5V;%)3{Q0XHfu2qxKHG*X8P7X-0voa&5pot(wTar?EC_-7Vhyi5JM;?7Y+ z8zrUn!@%zUWA8k`q$tup{-2z~&IT4(cF8$MK?DQ=g;RoxWFsJF1jT@do?sTigouIy zf`XhxK?OmAf`lbXhFv!2*)Tcu^!HZv=0(6W!F^LaJUgALtE;Q4e)ZNHem;mk6~b#Y zr;0FkcpQ_P9>b^SI2IF-x-f3s81xc!D%39y_Md;@&hkY9D<)-RdZKEo zIk_PDCJhC>Jj#-wV7^hMWpL(bpZP;&PU}@N0!YEjeV#JoBA?d>CFQ}uk0}Lcv>FuJ z3-}T@lXen8!sEz?pTOB1VIlAlA%t=e8D)lxAX$*-bL;pBs}-W3fHK5_GQtBa)*U~lgJpKT+=^*8&fXD0QdbiBVo_Q2tIf*sun+fRBKED9)s<{e56cpxL$4 zDC|414c?56xNh9XnCP8_`&JDv2iApqGI3J}CAxO$Tr)f<9q-zi%Dg|3s`dn((~0uh zj+f{ESPrEx&zy&SiR%FOevDi~fH%1d{@EoS@9s~qWlw<~szrYbu0X zGlpT-p#w<$`boZ$`_#O75|qkvF`0h9+`JdY)zhF8G00ad*J6N%t)dOBv7-CUg4Zze ztu^BL3DH zNL@ec?}Jj-z4w3O3BH3#Dn(xs&iWck(odNeTfa#{W8Ws^L=8fpe>A*ghUd3uqf;+8 zT-p{$J#qvsdp5$EbT695X{(&~;}-|fVt5=JhE_N__doDlXGX(2CLlh0H_oNkG;Emi z%5qF;S@y9K^*V!?(d+=`(uX&7)(SA$<=_`LVdk`^IA^&YlgG`*HxpW8Yo>sqwH5rO zCQRIolm$aCnr~lvu}p?y%KH)1HUGr8A78_cQESlKd>Kh8n;|kuDU~UH$Y|OcQ!$8Z z^w8Wm6_akB3Nd3T_8czwRS39PIJ`E}5Lz7sEhP9X7(6&FW)XZf#R-ueOJ#2YIu<8MO0v_beQ z7Rfqy?uqTG0o)ZY!RH~SYes`{u9GtdN|LrAN;jDr%fa$%_I=S0!jQFGB6{E>N$MPb z>k!O1CSt}=2>^Gv9!77&Z!3%TKPMn`Gr`Z6;4gMUr80Qu_J!erZ4fF8YdbOUWb`zi zMxgNswk9}kOaM!OTLG4m@`(^5p`HY$)b0bFOC`2t`455O=vl~*0{#~&B(#@GgJ;Px z^GPetS^b!NUle9Es5o|Tmjc&~_draqn2fL`_Zb`V&}wKDcCOAveTBTLl+h5v+u!Q2 zY>2N^ifzLT>fSalDd5ZWhgU}8=t?U>)WB|GjciF&xfJ%-lCgFZ%wMt>A3W3z+t+=D zug3I|RzK|4jwZ`?x=CU_=Nh1 z)r6oi#BjqU_F|c$?~1l6x|TZ zB$Yw{&001@R!$o9$`HX{F{~yX0hos`U2BYLZUL{c=y2=Jw_yGEKR~7Sen%oBiKr-vsX>3pixY^mM>ok}Y?+-HiRArWqm2RedH znOwo6LloS<1Z!Ua)8%~)T2lv>~P_IUZZe0)^ z8I738D4GQLV6|AFH?>7-iW5nh*{By60efK){9eVSCqBn$%v!X$bj!fu)Om6l%9daJ zm737X7oWz)&$mmeRV@aiSvpOQg12JFu0{Ct575SRRGU)nU-1RrdSV_Gr6Il@vI-a( z&x=*IGIY-uYdC!Ne)<(mjHHQK*)f#{r@y-w3-%S`@vfHtzC0&Z;hpcL)kkgJ!T9+z z;FCM6!ByZq!RGLb#;bQ6`55!JCze)iOFY&(uhK|zF?y2H2Lz;twl2l;Lh(0;ZrZ+g zFW3T*F{TN;`M``0KhfSN2~c0aj5boI@ZEcpu%9@i%dJmh+=kbYA3Fy1OXm~SfwU|g zOU*(QO{%`wSA^T?+;+3paQN&s`V~wtSG+rw#)kilX@U$zLu|R1@tvK%#TfiuNhvJ^ zRN|yU>eMt1k+*UdHkIz{^REZ6{Us)KSdLBGP*djsT=Sb-q1%^~DEbrXR{u)B86dZD9uto}Y@k96*NiW1Z+a!BxyB6M>ZX(e#P+Xwp-P zm%QzRda#YX0UzDlm+O>zgIA`lSGih5wtRTkXs%~kmYAf}ak}bcK`d1bs4PK^zA)p@ zZLtB7>$kn~P7FSFHiplWRo;Gs4xxN$dF}D;96tFgi;lsXCnO02KbF?F%JTl7kwm*> zK;CM|=a@bu9@At}4R2kM1~YvZ4-Tzp7pZHfV%+B&_|iTvFHJ&HMo}Kg{wg#0vgQ5w z0Wbe%AZ2iXfRvv)?J(EnWFROOR~Wi0PHx~!_`GAV4TUhJ8r0JLz4a=}tzNnlfhS+* zfLpo!$h-mQ64S~hsQldAO5jSx&`zO_g!1>k-3j`~6R$w0RD*)HJ`C3FZ(qrsFRQ`b~Hud1#Cb)Jnv{HGGguKp|+ zJ0@4e!KN+-P43D?>b(lCU)o}9J}&E?%GwQsoZ|^1pOR#>9YYE4~C8_^p~(c~Y`ExPFK^73;;rjuDF0A|KW!B7x-y^&jz z+b?8t>v^l*#9{TD4I810u)v;EL@?+;&=*46=1tJ=AGhOF(rK*w;XHI|<_zC~ZmpU^ z)W}ib^djI4pnK15uv(4yV$Eg(KrJSX8;bqMQt&% zrgorHBRBmt0v+2Tu6YbTUA_u2HX9D?J%b2y6mRD`jh0JQLm@SHxuqqzR?)Ni6$)r{ zR$O-VUQ`pr1o$`c_T2eMT(bi67fit3&6|-)bwA+6uaQs+Ojc{vOWmxkX=$f7?GNea zOqITe8ZuXz{~}korAhUxUjPqRgGGPf4;UZ(aC-yg7@U?>a}t^K*_+t9^l1#5z8afe z8D8Uf2Cx&1~ zyrkDZ;d}ZJz8}iJ^Bh#2w0KH#OIJy%rl?384ler_+C2WQWJ@EH>VD@ks{0XD>z-P) z1cUA*#E+he)UVh6y-?b}5@fb2{oTJBcvc2cpTkjQ5V^4ir2gxo*G3O`qV%JR#x3_o zmmj~b^my$Xex;PUwl&~zN(*VQNm<^JcU(#LRMml4xPA@aU-dcxIrfS{NvUmyXWN#3 zN}{F4J=k_mHJ3UyXC?QPkI2pXKZ$+Sj!vo!o?^9aHtV(LRN1Zxs;L*vFK%4vY%bwp z+?Y`F_{7q0ZO*_evpOm>a$+g6^mpZbd^@XemF-_U?@vwCv5)7%+Rpg5)a{~8>7mxs zZ>n@&L=EUD?q^Q zgi)t~S*eB67|9KnO1yH|YS|!X*8VOB_gCs8GFLMfNh$`IN^XFqpaQ#T@@_Qf!OZBn zl#6)WRxYvC(ta6%mqw}P*K6s%G8OZODu=7Y!+m`E9X{^HNv|~{ z;B|3cXA!6PxXj!<1(_=N)DlB7Zsf&O1{jdKoGuu(S}FRJI>arzf&}+! zot~bv?F?^c)wxCu*PcojIuNEDDrAsDMs)X+NdLwj=RTuYR~`(`HPbFaiSzN?E#ozyPkd zTsaMVW#n#Ldsv z9MJ348;#_&wK%r$c|5iv6|LAhibtSEP=J=VE<;+{9lsBf+fBx^ov*|0{fWr@`F-5= zWfUf`-XrLt$ypFus-K4UeF#&FF6eVG9$T|-MZZ{8rRyKXV_oWD*S<6a(zoNoqz<@G zq&_YEb?Sj0hW*G=D7tqkKfjDU@9bI+U(hxAnK`KY8+{tFC~ID7>)tZhRCmN{Q-?vIZ^y95KEgXU#&AQ|25)Rf`>fA#Aa^i2M+MMq{KSh&OKTf67&-Axd^BVz zGWxDX_aUQke%)FeUpoVjZAs-53U+V1Jq5Qd&p_%3I|1p7Nd0Oh9ByV*sKMWn{wtSI z8j}gvWD*sqW&3TW;lK6#-#;XW;Ij zsNBpzj6mCHHF8I>M!lZi0aHr=+O7( z!kRDud*(Dn+KG6a{N)#Z*iyeWo*5{qAU^eNDt7PLO*7d_DrusUFY9kwzZB{^Z6)1N zO8fSo!KQVzFRCr}%x_;>hpq9*KuP+zimq9={9`1HSc{gwf#qJL=RbV@yacE8U5uFa zvNRceWhNRBgC;-nB62*y?7lHl2P|)j<^8p#cN zeS7ikCo8#~O#30TaM!^^SW54$)|q%7f#NKD^~%%OfBHO?MTs75oBlmeTIQtw4;jQ{ zGEo%8Kh&31WdA?U3hd7)Z?!R8cBPWaKNH3Il7;P=t8PH;Z(DUOzSkCZ`;5}IX~Wf+ z?3JYZMYgN6jF(9kRCCEr5$L#})ToepE(sscnG3fsggqP9K}7)PaJW&gz8W3^%lO(h`223@6=rU+ zpIcIlx^?P6Df40Dwx1#Qm%wU?L`rHZj0OX8(~HoiK^)E|CqqyO@RXDwMCDPic=tLL zmCsKc7~n7{Fuhc*3PMSMnLuLFF;Lfn;E*imZo9&J59`k7QHP;13`1lo)cy_zLN4%O0p#`M9;hl&X#O zAi8#~ur`byvl1I0>w!VHjjsW_7u(mqVMSg;#!UFlMQz`Y&eqhqHU_f(l{qf5)$e|x{G{Hq+I{*KP~sxIHPlEU@) z|F1s(7v6ceo-du81eDC(lF#ME$IBdujZQ?1CJhm7w!vt$AfI5!>t)fB0Kdx*Bf%S! z4tk0Up&-EWvL$JQo+~CqMpzICdSOws$V_s`2nu};FS1lc$jQz?UO_Ru4kyl}<`Im! z39RJk(y=3g%ql(P!#3|rRdNQ&KJQ&ckEs_a{7xw9cB7(w} zF%e)fqnP9WEk7NEFY_FF-EtE&dK6 z7NDiN@lZW7Svu1fwGzCz2!_2>zoJrr%^C%7v7bwV#WKZDg@|aI6@~O3tdJQVJ&a0}LUM+{L6o^`Vm40-xe6X%33ePx#+(eP-zorHSWuxSgGUq?XB9@&RaSFVLxsfSu6KFH16 zt@jo}tJU)mq9LCQ0`n3eS3<+WsRn{jYnXna96_oZrkl&$Lm4e5IGuLxB1*|3T~Yb` zUKia(}kRze7aAFhZ|L@6+9q8i0V&mQlrr2!7)rw_oWd!b z!s%C&$45{D5kV+;lqHAD1twdR`$Qf<|XS zJ`j`tGYkII5+|%C3r?q}AR!?V zM~`2-g__3lG|)uk5ra)P)J!J3kTA2UQ^#!I1) z1Y}yRj>n{D;X2v#m<(!IbPC+us}q;z7MFyu@9=R%8Rh8SApv$rA@oWCdNCX0?i>XZ zf#`u zdc7Vlw;NhD{q+W<`1GODC}PabmDxaf7eU92Li`HoGG>%HnM?;Y$h`ot=v6+N zG^jLM0@EN@U0`dnqE1Hdh52YzgPGlH4RW{(gW-l9PXBLH7)rw_oWd!buF<5B$z^^f zfg`Zfuz2F7ZHAD+tg4Q-q28 zE3I9>F~0q7H;M^ZnM)}q*<{eh42(p%3^D?!2%`mgMGjm@%|fHNI`9!h#+YL1JUNb@ zJPI{IpUede9?$`2Grc&p_Yj)5=?1MO2C|^L)JZ+KPN@(ia1K)08K4ogF%VQKWCX(j z0&8%qb%ln3bO290J{`M{oWSk_N8s|faPw{dKq#oem#cn&QWZkC0YgyB8iV;u*1$o} zH~1fS;HSi6*q4|>d9kH(Kb6%3H9eCkS3*tynfic&o=eV*o8TE#Fj-6>E{4|?L}X+w6l52`V3J%?g_xTzI*)0(Gxt{l zJrrB6XQFJ8NroLh7%WzZY`R4Ejv5Apibrv0`PB zQHy>lz*y>IG=FC~+C_moI9!XX=RNlq>#q#Rj^84{YrfXrYb3h!`V}q<8)u za7z|Y=US^{`e1ycfMtB6XxUgXy)NJnwE8RWZ8Dkoy#+-`#$qP< zWljWxaxUFtk~ob*1$ju%Au{L}__DMVp~weI9TN%&Sh?TOpbYMygFCdh)UqP&d@^(q zEE*C4qrfD48kki|cw8>JUe05`Gb?+qo5dXtBEk{{Z&48ro%n@EIub<7M;;PoTm z4r0SMd+_Zyw?k_(bN{BY&Arzqw!yqUBb(S3 z7HqL!orNrg(or_sCac|k&DAmSNpTsJ+8RFkS-}?XRr--j17n@qb@m)cJn)y^x(pmt z%;k|zNqnd!;AHXHLon#AuoK+qbz-!J38{LqX1=k?CHhQj&A`QDR7x;8(}Ofcp6oc`>zN zx4RexdATr|wFJTWPr*g{6&-+XJ?u3K{sgG+sZQ<4a?ac(P2|k!=lg8mNa$ZsY zA5P&EPT>?z*J4s>^)kI4Fv~RrM=CU_Z9?OwQ8bs&$Jq-huotRu*5Tst$gJ%{f*&@W z0S*W$ zq~r?(xB>@cv%!iIR}mB{?vkGyJLwEYuBM=)eWn-_WK7jUsX|6}9*mX!w^!K%mQ z4ma#@3PWjG+A?cac{Hcv^qWO^Vqrpcv9a)EXJa637w!HWd$%$POyNaCj{Z#N7gA3t z((JLrBhNv3=mYHEWy7H7NAu$>znkc~?`Ktnx@vIOBWTgodg;=7jv{{4^W~cxzWf}w zju>6;4&jR#!!Wnuzj>I?XGvRsNq&-{2bY0?H~&mP0!b!(-tTV+XB7PnqX zEH>0f?*92*`x^y z&YtBVM;8pM@Y;6U;xyE*wwQhLgTC0grI@bGMZ-zop+(Wd*to1ACT)-=hb-jic*uo}>)%`HCi-tzPd<<=M45J!*@x{4{7dkhw3#N41 zU%tIEZ4lR?xSNF?r7{=i0<(?`LYqIqh39+!jK`aq6=nH$MHI#;a$V;h6?WNElxlhD+#()D6p!FzREZd?7`3iXYMmTORH~?d>=Z zA6p|L)MZl0wHre73V(dsZ}-A`b0yz(fq_t*oCKk5MHy6?>uTh~!jQ^3+yL>=E@;oB z!TFDRP?m<9m9AL^*{ov_XLO)*n?iO&M~J%)LX##%ehTcILxcU@5PC-Pytw4(+Y=C4 zU0Fbmx5h@{(3lb|yTy<9CP(4TtWu*BYX~We3z42^L62EVG_e5Z6Z||1RQymW@0Z^! z!nh_vmHZyKEecy~1Rq5*Ec)1vQ&S=_W_cd<4>BHFR2ZI%yGF-=#h-ipZMwd`aM?1> z9oq+MQ?0yzY<1Vmc%#=D41Q=y`Elm#ymzsUcCWohlSLgzP)Y-Iz#~3dq2TC z<#0^uWaTmMdGd`cj{;RW)ryLhW%@3lZL?+=(6v6Awd?>jXKwcMfh_8m(Y{8g&?!uHwlMoqe!z}}cBj4^tFu0p;<%LeI zfl{sGASjos3Eboo+|fTDK^lCJF(4RF!lregc9aF0P!O9A?8YaHzs9Do7UQF3 z3$gQP8s2?j3RDUuR7M@__Iw`U$xIW4VuIj?akUU1UmrdK+)zM<>pL~Zj{Qln=VzmF z<9HO=i&0pjL_xlTTloJOZOgiQChq;{EX2Z8>AcIdt>6FcIXGg(4>ePNRddDWa^GI? zW)DU_P~jdcb#1{V%jai(Q>E=-Q&jX#tk0wV%H6ac6wxsd^KzlxlLR5Is{XF;gVB(` zx@?^Tb7tYzraQK6b!^+}*tXTNZQJPBM#sh*b!^*jY-4ifd{Z?wHC6i;?0RbLwb#0y z>yC~```brF6+e~lS842Hw#?2R)f36MLQpF~USWTF4dCzpFN1e=^^EGMzUP7aFPMk#C|#+3g0CLctOq7aEw;w*_W7BVxU;3l>AiL*CyeFD4iw@?}?8z&`290O1xJcp$#J%9&NH);ff3_19AUwfWx*! zIP<`@LF6Etq3s)GaR@~Myybq+na@3*`-okr5iD6!emqP=v%ii)Rd|GaQpETWQPUC* z-?$dttWjD~-8D|{t$*Df%~M^$V$fIui%f*HA+ts}djsGDoBv7YV@8Qa0?n=MuN<$< zHb3kmtA>BFtUZAH6RfBaK0`6?8wqvay@?2V{sE6!C`b#1eDHtaQ^64{R}S9+Y9LAQ z=!cp0b8?DGtfqpLrRT;jdi<&i3J+LFP{#~f05hPkOm#(3BrKAJXP6F zbcjdU$4pn{Q;5R3m5fewN=83_ogI>BiZt48xOZiW%!9J7{`_{MazLCa%$scdiIc&q zf0oR?;D_R+_!ZZGEMF`oz8&Y`KaWTV%HlbxitohIZ9q0vn;m6U<-X%ZZOjrL5_<&? zz{UO5Tq4kD=1SDJr(q}b0r|ivpwQZB=4xVmv*KH16dOlzt=xa;M#91ZYa0YQC7uoF zNiH*7RHmeF?Y}C#9S1LmfwXN%-1wr3&NwLbWhtGnP@MrEj)pFQ$+Q#XTYv_)_#xbj zM3Wk(lgoPMbab8@3aj?-fXXQZ85#nabVqJ_N_eJd@THgzTkC)IQC2bkq{ExBEfExh$ItI_POef{AdHSlUDcp^ul z3~2STWnq+ivR}tz7*1Z0kT{Grz~0*;H<2)|AS>3nl7)&Y5ypln5U&a4OZGC1A=5w{%<( zR$5D={;;O?XGH{_C5`p$+0ieCP18szE*k`bfxzoGazPYT_1JL2TkqL&TiF-4un z`ZMAVJ`YNHy=#%r2dAbhOr0WP4P3pw=CaEH8#C52*F3-)P=3Pq)t9g59kZ*`lIO^F zsubk`+-s8+YTnzzcrQ)0Y1Iw!DJB3NL%0bgK_48qF&&MG?zmTjQS0AVtM{pZ2gnAv$0ZQimY6KRE}nsM{3ep8mw{scgHGe`0Mz##I74s+8G?v_Z??#iw|A81{wiG z_bkrVs93jW+YMUJ+qJ0WNK&LzmMtP~V2#}dMe%sQz`r+)oX97lzvxOrxCf4MI(xWF zVM!D|!jLdS6K8>k{oPNH4n?983{=~CSGyTg-u$C({?{Q%eV9H%>j+#UIcQ`!lF@Tb zYrgGS2h(Zn400PLIxn-?8rwo07L=YCs1qxq$zJ!9$xe;v&0uh{(Hx{Y7Z(B@j^2sBTE8BjS6` zy}|PcQ_TOkT5Xd3lfpYhrjJ$ z=rNwEYC0dnEr)2s{rnL2*TL@%$2T4ypW#q{4(503Z-ukCM1Dr=;^0w|&atF504j&?PkWCi;ez3&-fK>qb_4%_|k zcxHne_w~k?BzqI;N#T+vNjXh7+x-DL#{_ju-^YMZxXRJ3h-Ue9E_O#{LXa9ke+EWI zJ$GnfFfC*LWjVj88jUuv&;pF@>QCq(E6K)!>YD#0qcZo^MmuFo8Ki?o7kFNHhU9fV zQM)|Dfwl3o&pJ`V$*5MI)PAV9U4tCNh{8^CmovIen-*}MmQjBq2?I+vA2+K+{ zM9J4C6L>c4P5ie-BP+Kfb!s&sTwS!N-r1Gml(rJ_H;*W^y?+(pFG-IwbqfM3F6f_h z^lS1#04*8HJ+K~t(YNFY;lhV{h1lM-8~*=6h}d zQ5x3j;N6y&dH^33fG^qgZ@wGtU4P zqKKalsob!Hv1a;>BcD~)mQIn5OrGJ0jCV2^8*WWc{@R|!KR?R$?yY}D_3%@~zxT(8 z=N+WVJ2U2G6swM|#~4;!6?mBnEi!K@LlsOTf}xeHJb-{IsCgL=MHpGe^_>D0Cy9Qr zUp)D+6ssz~@}YPBjFiAR8Dm5EzE#AKGEz+b+9%3du+@Y%ru9UOUQ{`k9yWg!GB;-D z9V$|Bd#64%P&()93oX`5otni0v?{Y=Rjiu3?H*V{JneS*M4EGJr8FmQx}qm+E^^FK zVcOu%X^BroG!8vPUExSB)$3^zL3S>S@84h%@^vMdQlY%U^cgF#P3pTdg5cFa63@%UnjuqX}p2Nub964!TIkA9c&W72~X&EG|NtF{5&}Y%BY90q*li zvU_7E;buw}c{EFN!|OfS^TZ<3$Bvg5U}(O~$3xv?YYRokewHAjt0!+s6GYgWJ>5Dl zKEVfH)-Em9rn*Su#kryaBljdX85GIZK4(#E89;AO2TO6CUwXV4`vTj2 z>5rb_7Wh#qN-2^~C8G>1P+5O013EkHE98M-y)}IOKjLYpwzbxbJY>>OhxYcO?4J(8 zoTP&1IM4@DtQ9*sVhuC|?6v<3=>p_2Fl-rxC5*M(!Bg}8=)mY|9Z1Q6J$K0Plw`U0 z01hFRanYL|j2sjww{fo}&~GiPjr;zs>uLx-o?)y!7542Wmi%9cF0fR%xVFMWUri6{ zln*cTS)rug<-wwTg}Gf_+_{Vfjg2s-lQT?aNm9X8x2LdXlWCNju-luT9Kq$A&^4R^ zK{C-YDS1-b5liko`X5C1k8X#jq`3PakFlH{pFkn!9`Lw4J?$$CH;xJtJX4ptVu=Yr zkSpk}s4y+$a0~~oxMP^qhW&fm;2}J*%9H+jQXpHpk+O4QKoca3||= z)!_S>fbV*IN2hXWz8;WaZLrywcz3u5-}3ule{VB^>d|h+A@bux>O_2x$+Y(kA?neO zHi#n}@QvpS&vXCy(F*upu~4qW9Zn;}=f%_O3kEi;!zm%}P!g-%LaUHiPD)gwf%K44 zYS?4Dts7$hj%_$7^33?GlQfKt1FQy*+?-cq&2(vz@jcu}Lo09cu^920)}mrlD>To_ zj%YibJiG)uaCfIz{FqIgRb;(_;-Tn3$RAY-nyK?e=xwycsL2{5uTFK9W?XFXyK2<{ zDQ54#|E@1B{w?_NcB=2CJ@P30KLQD#M7@0=m({Qui|zFjneewD9*7wUD%m6}>o8~A z^OkB)z(V7oHzg;NYGlxu7-4q)~B&=kzB2ok-jlU8T9^8Y4xvlF)mj zV!EqQ$>Cz}b&#j2D$Pef4>@iz^)#sCm1x@3RYf~wwL9IN-Bo46{mP3guVcF6cgQ-4 zWE!v{OETl0fK z-V{Rq6U}&;Tpi!Hcxf5w2cc#4w{icn)-=D2B8Eyv9$w!WgGZwhyIMsjgI0#-qnpz( z>DNd0#}d0t?HljzV#;i%5q}NB_5!Go+(Y{=-S6?Ztg+`Y^*2k)S5pXYEU!l0)TLf? zdp1VF0WV1mjYtY( zdD6EVo8P=anHizvy^REfYkr;6 zBoDYMYpu=+Ho9?QBRHT8Qm1N*Eyab6TnJZ%c$DM*yY9E3oN17;FPAkxX@+$yog#XJTBr~gOtZQ-%0QgRe9a}k$}r`0x8E{`!#+d|Bx=vDDNv0t4Ql0dsPNS+!H zTCJPS;|dbAvrqVAV*?Nngr@`1S19$*11D1~6~_w5&f;?7Nw($n#OeZE3_KcnxY=oY zyIHL~yk=&Hk^{f=zxFfD<^^#Ea9H9S^-akAQKIcZOqyrWoS~?l+j)9zW2joRCVO5a zeh{J9(8r1QuA3|WOle7FvO{c%uX5QkTU)yNdK`Q02%583xcSrDeTjEh_uQ$XacaK; z-Vq~BgNJX0N;?J9FY2qi$gII1kxNr^np|m?!fLUMI{<`;qPkgUlyQY6L5f@CA&83XO-HSM#@0=vj2UczlHvyiy?NB6ICo*c2qK(-#3Oxn} zFNzUc{~29a><-(n8R{ATV11dVYmxz6gjnSrRQZ<4fzZEiXYk)X*jie2YkJkc$X&+J z|JvQ`nzvh|z+&*Y;d$Ni1}f#MV8${$Qri8Li&m!a7gsMf=WwqkJ&DM{9re~-hvB~b&_IHQKR@jHSrxwE5Dkzy z?|Wd9DdcvQM?Qn?0sKz_69lUU%Qa9@(a}n#Po(jN0^2CW*rqhlNoc;!%9DVgzlU$c zDwI2y^_tikAh@_E)hOn4FV_4L8@^Zzu-pP37AV?H)&Yab75OrWE{}Xf>N>jqtmb^| z1T7)MqyKLDXvc@&U*H^6dId(OCjjlmtTPp6nsD@dekh@#)ZhBhRZ}shpYKSI6dL=j zWkmuEd`F+t!d6_ND*t&t_^AQ<0k5;o^+wB5gPgq4R66ic*}}yJzr=;*1rDqUTC*5w z90$%GgrVE6f!=wd0dWSR~yrxZQ}D!KmWmh!NnCFPT!V*l=+q0Rhnl}mrSq+VMrEEqPMa5+KpM$ZWFN0=K z?^)nJi9gI`P9^|gaBu(UUNdQ_%K(ywRbffBSP%q(xy2@9*vK-TBCvRX7c^m_G@ggldvS z0Rw)pprD_`?mpA`s_T#%LSfLeI*Lh|#Byf;B4Hg5y``yJdqHwL6@b#;q z#`)acT=0y(d4m)X%EsI284^MEU~vnP$aN&LK)--fVPRy0Jr`nHULx(#G`vb`j9s^H ziYLCnrGGF|!z=}aCjDm(Z~>SV6J*#cO$vOkYQl$d!05Jk8?<>0Zdk`k={8tppMk7< zfhOJc>Ty904e$7<6U`YlkEa z{cP9WEC}Mj92AJW0V@0l0ORULf{sh>b|nxnspEG*BCG~Y^6{GoDH!%BPqoOXhZ$NE z0x?!1Ht~nbt?O7oD)lY1>o4uag`Q#Xm)DZ`~h*QF;H zP#KpyyYGgwW1X)aw3GOuPA2rknpKQk?Iau-0Zp6Qj}X5Mh`r0uXSkyyMtb22h~~Tc zu|NUle*U#EudsLE8Kjhl#k>Ul?(~Y!<7OS)&>Fu3sVWV@A1puK4MlaJP1PP(iKkfQ zD8L{>%Z=l-9jKjChpv2V96WAQ06tGuCVLp424> z(Jl{)1eDi6k>!-z;T^O~pRx;F1rc;<&5P*Vj~sRHlr+3g>e?HoFrz;k6tq!Z1A@ut zgejXpZx9ekLC6z_AGF<(m{_i{9OCBdMY?7f6xQxu$WlsPwg+gp7qyrprlf>YFM?o* z&l}{UOl};@2B5S|0?$kaOwEm0#GE8C?R(GcEkX zn)%Oe;fJj9xbY+_uzdO|K%$DgFXbjeT^1=+%0|2+p1(B#??XoUz#aBkSRWzedRH;j6n{x?TN*nxx}t41^_{O3tfq+l6>tiL)6Cj@1OMX(k= zdlA20?Ha|<8=qV^eCYx%0Ac~w)3>Q6EI$q98t%KN124q>rmWDz=Ke!#{s-7>Ns=zX za^4j8$;_nJTZfYo5+wO{?auu8)_;?O;OKan&xU0rdM9pz#Ltgx;!(qVW>isjs|Op% zQv$9W$T&D~Yf%}eu-1&4#EaxzzzZiO4h}H-!B;@31H0`)JDP=|V z$VWU4_=BWHHoK!ea1r%lB2!)YKr`gq+k92ef;mlO!^?NgjA`X|L#ok2T8Q#rENvSg zc9!V3%(OlT>4hu?g@m9Iy$U-ruXe3?UfpqT#`MK+5~vwz=xBYA)JPPzDdQgCl%;66 z-xttJeuOJRcFL*+NSR`=kb`t0UFJh+n?EQpjRq*oB~X!Jnj#KIG*;(jaco0BAyr5EoM-D-q4-1Rl`Sk@C zv>|IjsMvX!nAz`A@(b=nS#Y2(zTYZSO4$D{)}uSX3oKYzW|?~kCuSi* z`LUufK;4;an9m9psS^zwZxoBnlT-6s!7E-M96a8ksSYEUv=t9V17ubE&g6qPQ{{=z zNE4coGhf@X0_NqBCu4F>v3F_i3rre4bhkTMd$!z?h!eQ$G>~;)VYnv2SH;0sNI?1M zH{j1TwWyFV0*kf`g#w6EfZq_&5uG}mq^^1B^v_gCu)`}SWrAm;7R|OBtUD=O8U*AW zCmuzOqCT`b!BDbDtooDa=>iQKu9z{HopvS6MJ(rUCleg<0o`e81exHKI1I??WzJi~ zPjP6_z-rmzkvqk9Rp{AvlA{oVy72I^=}XG_axP0a)oH&<_rxiSPt(jQYB#haCz)av z5@Ju*^6cLn>jv~Z7#D7x@Ahq17-cMrK~?QBSXJ{5@fiQ-SbwdWGNC?GEhf;y6hphr zG5!>`m~o6GW__HseBevtah4@YqHP~ckU|X(BxaLF*tkR;)nkL7af=+68!;^pa#f^P{k`pLX!hnT_ zP3~S!RD5i$DwxardbQL|oAD}g8_Fgox%!OiG52D+Qdsyr_m<25##PR81twd!sNl(x zqr{lpq^z&+j|>&p>2Ru_7K;?wZVK}&22RMaJ zqXdNEB!9;-z*{F|C=(hlM~_m|g-C-x9paMCn5n<>RKg{W6_9u!pk`OLO{)v0Q#d;n z9Aj3B`|>7u>@eD@qS&pbRPn@KHdr~)|`dFV=V~OrOwdh{fHg3GH zN8hdU3WL6}ZZ>=7J!?PTasn534#9v8B@)QXe!Eb$VZTNT3GG6(L^zr|^a)%p)Rsp+ zxV`%&!|*zuKU${V_p9Erw3j9)EjUZwM)bC#(Q>06F&n&1r}qto?6QLZmghK}z&kM~ zGs^9PmzZ-K(Vl7WgN23+-T~FJw6vt(x<#mN-T^=fnSQwk3R;K!t+#|>z<^eK$w>8C zpW?q6KC5&7SPB`gX%nzgM26u?1)l=dmFE--j}B(LBO0Q6!{fA$`(xLYE5rIkNhnfv zB=_CJ;kCJcyZaXYinC^OdlR}^FAs;pRdD%V;#aHF;>$w?{!QvEFitJt!~t?gHMqTa zCsZIX;l_X;3J^L*wTHo?(!qi!Kz0X?RqrJ!961V^T0^D;&X2q&Rkq)x3r;hNFC;Zu zifh}+l6$}eu)_+V%-|qg!}*P^hg-^^M}6P^kPZq8*HimT1$FJw4L&9@I>^);@*ffz zs35J<`{r%o=ucY`HE?*{ELj`9%Ns7x^74Hv^3nHlmVm{#m1`K6jVo|fY2QLHn z1lI=v6(o25Cnlt-YCOVe(-SX<8uu%{Zy__foro^1F+ZVC=^#u*zoSg4Dp-07 z|1!E>n{VtSJN z@45DoK(x5M@$?1dPPJYu;&~>JjrqFYR2?ulCR?Ld)JjZ779WsG+%*c4!@j4n{jt&D zThFlwi;2*%sK>Y;t8c;dTtI#};#pj3ch~;y&g}M@kBOWrX4tuKimE4EIKO&ipH>nzir6CNX+|;5;3%~bDtn0EOVacWqiSfn1yEc zw*n};=mAU}XyZiqXn~gfg_K`0TDc>Dm`fc@7$XmcTs#cX7qDh~SEE&e^h>D9a0Nt; zl1_~%%Ub?qNcVX!MX?c~iSbZ31=NtX%Gb^wBni>aQwHL&Tv{gBu_9LF^5wszNFBqo zMI`R|SKg^pIqtZHbXb+0TY_lw1(kb^H#LBj|EMqU>D}QhTnqpi z-RcHa;+IJ4ol)7Q6Biqi3IB6jEfr#yfzC7B`T@=6yCyt38s;oa$_Cac;_b`!{-!{Z z!61G&v$=uDq6fY8!8VGK6WG%0Qe!iOf-TWfq~8a!&8S*>@UzE&5Cz6IuZ^~jE)xra z99Ar=IF6L81lkp?`qySR0=YiD_TxqW8N=PE0QjOS@^+#1R^f@zni6npxQ(J-{Iuj_ zi_i4fMu~R{{H=n_K^>e@SoM$Fj7ljMs=x4uys}uip(Bs-G)BHrnOpCRFVUwbdlD^a zUZG9hZuwbf09KlBP?~M{e(l*BnW12eu8jAB*(Y=;K0XykQKMWq07}CIVex6Ov#h8V zQ?ucWNn(q5$V&fa(>w;B>qiwQgZS^ez?0eXC40I|umX0SVr!0Jk)>WZTl?|_JUkL2 z?jHkji+xKfiu}9;1<}u`n5;--O#y4y4*(Lp8NzgosL5KOSd)EHq<= zICln4_k=nPiX!W%rD)_{3RB5Tjy#FByzw3EOX}aK9Aq=^eXZ~!J<~+hetkVY<{p%y zD8q!zR7K1|fPf^L7f>03h&PZJ#tH-!1{s5a%tAqkp_IUs3wtpZpb;aBc-gl;y$Q17 zDgVIm-8%N2^$$~M^M1OVnwpS*naX56UMZ4|C`wOrmIwz7?Y(q*WoATMnL%H8zNwjNf-q?Krrj_|UU8KsZHOI>FZ(Z~5bA@d2KD1_O;wRvL0O zv#(N(cKod|Zd)X)2rip&oqmp^=`f{XnnaB{?RNg)?*i)>iOW?O@TA}E-CD+cDKrqm z6|j?3H5{E_9921g5?HX|H%#Vo_1+xLY+Lj5>jPxuS8oN9y~bcnhhpVrH5SIn>k=w% z01Dm>wr>I*OEC2PWt(;-&j-3u|2CTc-m_9y?KlyuR*Bq&c+`F>T76H>SBN!i6oHSV zf~?^(GB`71(0+&38)$rSDQah>U2>iT(|M@>Qp<7vUmMe5UQNg5(y)WGEVxsHoFJK`>f>|AU z=O7XxSR)Kcq&LdkW-@RTVL6|XOvV2V7Fe`qXZzBmz)p4#DRks$H z+}Be!(!dT3Yr`=R`{XFEKbJh6`R0t8ikpu}#++a%q__j@b~e6rw}*WpBRf=+k5Ai$ zgy!E+OX&QLEPjwW^8)h|Zd^8dHwvE*UabS*^{JG^)WamkqaN*%4?pCp&x%DC5=4881cTK3S3?Y3f=f|O$w1L?Q*2LdS9cFN)(jrv&i zJ{M^1-PawMVqyr`kutYs1Gk&N8s=L`oM&ax^`9{t(4KY{*oY0J6f4b;rUx$HJz1o6cD%m`lf=IE6dP~p zLIUHE3S&hxs;-|C%iW~B7%Q0&8lQg@ixD8rCqnMF|JmKY04j~Y2{>cF zHih29A^CO)1-JCV**9&|E=4@qRbMZLq3^?l!YLQ8(JdX5P5Ig;*sB9JEkvZhMPfM4 zg{NoJRXcdRw(}GEM1wr`uM_b~lLx4Xy)W{GRrTlljXpBwdEdrUoS`BVniqdN5wE&H zcv9n^@2xsY)AS3dv-?$FB4ch}`-!;aBQN1yjC3sWIuDAT_HcnoYv&HBCJh}!pgd6o z+K37=24MS0A!UIcj+F4;d|G@;aUE992-+h-_ae z@pDa6I>6+PI3(AiRn0+f{_mJF-Io)!x?eN?4Gj1JXs{-XLj0t0jXdW%j(zj0qOvli zb104l+?C{ z9`oEO_oTnVwGZQycrjvGneNUAGi+g!wT%ppUJPzDYcXW$!vwE0cIK5GWp^OzgebRP zxUqOlAxnFlr)4wl+1bw1mIF%RW-$li81m}T1tC*f?(pVuvsMV3HO-M`vU_G7ld(UL z!#GA&8zm@vjA3v;1~kwmtGL&ZLk?Sl4mt&;?#4Xh{?!>Jkf5hTKyrcogHPd@u@}zZ zzSFpit-&QWSL(wG2Hifc+Rcn6N5rIf6aHUk!8P9^$U}$IgQAx+wbUps-`27F!1%kn5_JD zU&zyruw!a^cHhV6-B-{1?@tEDr3?zhxt?e!B>_E109+9< zLOLseUV}xYte`^jAryFK{H&r*!shxDe`J$M&=<2{)qQ!R-z}-~Gut~UY2VvHAX>sG z@Pf)NX2z|i;VkEA*7%tpJ0nHaSI_EFynJuXfETIUOZU7FhU>0Q4!k5d!QwJt%J)|B z^hc1|vib)gn!{x0YSLHYS>ztK8if`{KW~+eOdOvXDfKoJ??Op;UuqpD&uI?nxQyJ*pIFkj|2H9xo} z_X-vsxkwrw8aCWNG7ZwF{LKN!NkD%1D8=uClhq49yOJYMm8qxN8O(`{G!H@EW=>H;3J9VS5RQzgTdCX zIM>J@Vzpdn(GdYo_kKz&;9JS+R&5YRG#o)|72SFv)>tKRyVUC17YL68$${$6B?-}f zG#`rnIZS#_bVqR1&5F{~gwHqp`tibFm44?>3!g>aKT#3bhJ7+nEGd$(P@YC?){5R5 zTY{NcR3*Ua%cOT_!kk{L&sg3p;Pc#wOB)t3t`4u8ycc*-C;f8!aiiAn5bntYw1vy! zFe821!Anc=ica3OdZ9f~c&h3|#+pIyIUEU$+!NcD+o7J8s=(oGn%vR9gFS$I6Ba(c z_##v$r!I+Hy@XLKGW?Em^xzutgI}%C7;4MSg4y2O7UJ>*NlIQA-j1kETU!eM?#3d6 z@?>~2x8~Byie`=7PV+i+qzwncmTPp%EjCamsTam{MGV*xbiT%*Tn?e$pMR$j)C%6f ze;g1R7irVFN$;+L`>}bb_Pmn+yb#~3ui@_(1h8PEs{HSYSK=xzY;~Y#nl4 zptPRbDPx1KJVOH4r?C3ig?_g|ND+SRaYL9+r3ntKerauHr4s19Q${$@R^GMUBDyWa zJL~H8(hI+{c;{lg+n;-~zVF)lUHgbyAO+IgA3DGa>Eb09Ro$#nGCAp{KE9Gg@|C4T z=N7JVRdo;ybTnY%(;X-jImfnTKiC=#89X(IQQiX}VUn6%v}(3_fFe>*lEq83`>}G6 zwp1P?z*l=$)mXz@bOZ+`Yp5AK=?Igg!XlQX?x+G>Nj&Ed2ov!mY_fmY?!bhIV*?Kr zKc`k5zA`|5$y$bKv2G1ypolu2tZ1Ph9QE&8)YD`c!7f;#6r0GrX`d{z*l7b@PPvZ) z(d5$!oJ!#Js}Kaz!~1BF^}~awI!Vf;o`GnT{pyCn2n87rM{nT4>YCEG`30}K@`hvC zm@mGls_H2w?=p=>4Vm9*l9sqshR0iIGsy7LKmF{^7VuC7o#*8ysCq<5BwvT%N2#|%Lr0z=NzEanJ{Xe!0arjog@}Krm?L##mExUR@NTUt z3zQt5UAgV8^pp8ifERcIb?Y@CuDgu?O(j4!nvatixebag~GgOflwg+tW~n_|&|J0eeMKaN83Gmf0- z!=pMtc3V3fG|7evaP)h4`b9?iAGL+N=rhL1CM}^X2OZN83zpXLdj)CtmMT5sIf!Z zgy|WyD%0@8t~#3xhI#qWy2#|!W+h6@@)LY%7kHjhJP&TPTVAg?N5oiCN&kAH2blT0 zyPVA@aK2V8qHRp{wTK4E*kBR+z5hJd{`6}Oab*;)LHan|Q0chBbIDE%almcL!Aefd zLJO$24WBuWd`yYQ{Bk6~{=A1A+~CL6!qeEB*jjB{xTQY<3wFFZe`$MPGM(`B=Lzfn z6S^V~idkH|TM>72!u6NnvAWX@^zJj6*^>JK8#0WREBHeTZ5@W zwNmFE44kT^tlwXftPO2VSc>(7Cuu>h4&eRtdz7OGQ~?R@{i|o9K$Yh=mp@kXcJ}qd z-8FwRcoGEKj!y-rDiLD`>fQt?>gjisWqX&wA~&PsHT;5osml^)sPI=I)Y;(G z_PgWL_illrx^)Zcz#u+NQ2PcVOi-~<;^S#!U%3G02;#-y^ip{d-7_5~-#Ha*!B>Vh zXmG(7YqG)tP~>$c#7;y4@$oj|>SdejD^F+YJOMEYPGKJ(d?zQTgcY{H{6rxhRw#PZ zKYel^1EJAaGlib4_)^?ct{h~f0|^F-AuYB#d&@PQO!@Zq)jGW>zE|gwx3{qPTnQop z*2g=)YnzB^C?Ho?wea;f39$n6LUL&Vr9>JcaZH*^-e&mDJ<2beZNHFzX*ulOPT-2aPjjYRPgku=2e+gyK-P8ZWKT#bYN`jjv6LV= zr==Ro)1yq#(^75GaF`=uQkbU&X^3EGyjn9_jci=A+rSW57^P0dga<>HynNbez+ z>fvx1a{3nD!;P|Q3mw40DEyvsw<5@K%Q=r#?;|@Y^oq#KLHa)6pqWk(R4vDQ@`k%> zCvbFHigXd7=!foN2>NpuK`e6TQj$0p?m%vnscg}JmPv|=6rj2|SGrUqin2ioV}>Qa zuN;Ntj-s2z!blRxQx!EJ@@t`hDQxj11@_h<#0FL=(L!RQ{P|Wx`F7 z4Bi!jYn3djtAjU-v@WjSdBv#sgc?uZ-PWc216f>v3noX6R&-cRxXGL3E>{*RTqZwU zI)f+jdKVa|pT(mQnW1s5a5uxzBvlBYVEy8dcZODmCNVb+OeGU0_3&^8`3Hl34+;Sf z*4|E!o+g(841b0d1q`QJu`yBAQRqUCWt8q*~S1Et4kLyP&eG0S7~=IEf3pu;L(L*RLbAuTCcKPXcu>pASq#2`mne#RuCTEay!1eUSHYWy!^CfKqT{&} zih0_hs0s_$>tueYfJo=ScMy~5XTH$n;`0(Z#+oQ;Ys*@x0BAi>2=Rl0x{MFda|+gu zjxObcMF*5JGp9=$zq)or+iuK7+1W!J*iS|IQ$GDMQVQs2%!N`1V)k+(u|LED-K9GtZ`&}3Q{_Gy~B8{xlAu6#2`sgSv z-&>>6eyjF99(EJr2z1U~88n0|@INK?g27G5piS`fSdr^pp!4sBCDfF=@t~DC*TR-6 zk8j-G(>?;_bLiWWs&>K_tUw}gwC4}mvCW4H91*=ZkF>AyC8D!7$M@f&LGPyA z7s{hXLCNZvJLd~*br%ycgTs)jxVIYs2!a6dPV@6W? z2Ri9-*a{zVhqi30DTX8E_7s!w9rsMb1hf#Iep_1>ds)QJoTDHbx)(2uTn{@I_=5hE z;R%A5ZjYP8r#1$Pb@U;(8s5#{o*Un3^PsRTAY&IrQiY&EoU;5956Mk$#=m;ia^BZx zTPmXy)8Wj0zw*udETYv_d{YeHeS;f5!qqZ9c1hWyY{i6*4+181ZD|g`UBLrj#)f?w z=a+K4+YxPk1k%jgxwm&QK|=OR{4d7du|3mZi`EU^*tR;hZFX$i=-9S8NyoNr+qTuo z8+L3v*;(hTeQkW&f1#eL`OK<$k1^`j+N4ZOO%HZrE`fDsqlBM2igA&BSy2h?@)ffR z$48G28YNR`Nr`<)>F%gLc2)0oSPVsaJ3EubiQm^yWAa;?S{cBAjk5+aKjXFyc>sS* zP|zLV#Lv|HfRvOJ0j!^A@#I0di?#I{nygE~+}(V!5mU^apomI3@-ou#Eel_Gz3wHd37dO$*cV1w2M15| zTEZIguk@)^UV8eRzB94(`ZyTwb*}phtW!;cd0!w=A|uV$vM4&jEL<}cx3fc`k)AZH z*M<=RUNbw8xky9D4$T+fQ++tqIG>n|T#tt3b( z_(7#69Yh{@6_+|uys3)1@pP#X`NKPNGH_&mT2V70BAd6>WRrB(_>5DY?%9PIv=%`< z9HJNz2_0a<;$<#jghD2bfp`uKJ5L0SI|*vPdRbU-8l&RBp9Q>rAoVynh8Qoki%Q|y&>Q+N4P7SOGbHXQB28pjnFl3;YNG}BFTT{Ox zbijGLp9clyeLmWOBctYt{WUUY7m9Jxp^hQoja&p&SL?8eO8JpQ(n!b0=YTg>gV5B% z&PD=ng};hOz~%EK2jNvF>2-+Sf3 zuuS!sHT_vbml;3Y7s#N&qRGG5TdAfEh#YIFq|U6nsLyn@suAl3EZ=!KG6Vi*dpH;@ z%kj@FF`Iw&>M1}x6WF!Jsp$tE2oj2qJpwIpSJQMpsi?}u+$0zPX2=t|91bC5T#ek> zaWd$e-Y6U7wFeYwOAeZJ0I|ONqS9R@&Y_lzHc4P343e-#URj zw6fq$d6u_O0u?%P76U*mjHH(fd>17i8Wu5BxX2wTG#e|Tofs{pC%I{cJR*9Ll<6+I_ z{LHIo*4^q>M1i+17Le}6m`W>M+zp7#8UIUmw|QUdE+DiTbK$V(0$Dr?2vv`67*IZr z4%~#t?9{JaWX4WW{&?=31wRx0&pFG4M+|vwTI$_+Wn1}vAY(*kYws$nW8p0Th%%5n zMKSiD#G~w}2^A*|TGLW!-a2=VPyO}@T?TDeoj{m=^U?3|&Tc16mV{B|#~fm_ic$)` z5_J*bqoIwevmeC5W`2ao;`WQ{lZHS77II=MrezLt{)AD+$u2D_V{h~Lhy6`3K3@I} zzloI(8?YX!^B&zfaK}V`r=hAgJ9hZ#uRB94_NMdK=s_BT(DM-C5B^GQC#{;Im_7_K zWdJKA#1B5UZ%>!_vZ}Iw`uS`4nYPjvykF@=Zy?=>^g3it{!d!m?UrkGpt9zy_}>F) zcVA6Q>?SX8*jpzfChYcIzrfo|mo@5knxyZ(duz`=&W$0;JJEPSv0niu4i!lnq6`C< zMy7>88rC@;BH7H%gC0UL1&f%62JBlA8<1gm`)z9wOy9=aJrzUSre7JovwGz!O0MRl z270+ZaX7FQOxb>>_K0o4-OX7HFCXMUq<5C@GYQ;8OHNu)Mk;>DCzSrrS3r8m7kK9f z16M+Hl*Ryaaay||lza#9*)jeLLPt%872w_2m(aAjKhg)z~sFBuVu{)<~zpBiu& zqe2o4=R~LdN|57E3!@x`Mw1PNQcr)gfyb0^xFzOR&PKZI+7S)p1YqD6@x{iK%LX39jngN5!dt- z88HJfJX$DyCoYePfg{7)Wuei+vx|zc7EsC^Bw$`KvFozC8R|ks^>uSoFUjwo(}{1E z0;wwxMKdYx$kDla+AJ)QclyZGsG!UcolKP^x!$Ye0xk5iSCQp6zf9HWcuh z6Aa9_rcwG}hAz6UNfO$_cWMTVRd{%_$SciM{j{bQ_L5hzl(=D0=;}e3NJ(Ff!74E;JE43h zo_Q$*&N>9sX;B<4x+3=lHj4|DAAbWJ(mhTHg5VcCk&+`AsF8>%S6Uhq7aO`ekRSSO zCRMn0VRzKPpG4@6HAc)$m^=eYqK`7Mz)=#sY^=#*%{d#F}k+|?~B#*c!q}TOL zpbT0*z1PcpZ(MXoS5tLBFEWSEHO5=ViFZ>?=2QRueNw$faB^s6st7GAJg__@U=bPn zcfy{?o)&j2>1ekYiZ3phsfX=|u`XX~g!^`mT%R2Bc*>U^AYzIQO<2&KTiRbe69$bi zJK!a^E0{yB(C|Kql%oQa(Ek(0=5HHBxEr|&PPxZAPui?^b%H%&;zSxCW3Nb%W5-MD zU6x#kVs}BSaxicwFN{eI-N71MSDO}k`3;KEO!w8m6?te$DeZpSlI>NdmCJ6zi_rz0 z{&i&kYL_pfTxq#heMQvjzdOG$m^ksZTD`N6%pVjNfrieUZRySNNtD##_}MB;YF1pU z9xfUU&GGo!FNhCA#MMi;#5?_xd?U@ISxu-`QAL*xU(yGlZREjzVx~JrSFo=LroGd= z`UPQc27$^ml(+pm-qKCS{rEtd?P?P*N3H9jueok=*iL*|?c$tA}cYVztAr~Rm$b!Om|x-8Wa^<2+8OD zrQ$&Kek2r0lwcnFE>_`>)p35*Xr+v~N4&ST99UkiS3&=(d5s#>Q2}V!sOL&URJ7E4 zcqOJz=7};w0s2vUsOHuxB6C!OCAp8gJD0#s1{w^oWSBNkzle;9K}rXya#fPuK0-V6 zI@5U#%LP6Z>150+zdGnpGdJ`@EN6`}h9E_i_EZ_ubiGBP?wkdZzt5_bNxHEbG^vB7 zNkWII$XPu3YUPF;SdLLQzk+jQZ2w#L+3ME+Za3L{v~jyZzFLJ*yx^to%VE_>qSzhY ze@t)8Z2v&|O10{`wW(b^NPRZj?5@$T31S2Bu3B?>$Xmb!?$Dq&T z6nFCim6ncb%a%`F1TUS0$rgdB+y>=eyL4tXpZUa8koCfGQs7RS>f;4n-xU2ei6+aP>X;Fuhe(TxS7y}dgJ_+iFX9mF&?JK$zF}t-p1?vYfAtBYQpz`lFjcD8 z6_RI(pz8$gcE$bYHb?|a7-xn^E^Ki(oP#Vahw{j)Mt0Wlt>y#yH#!=wxU+(!dK5vj zIjb|wux)f$c<9dkN#ocoZGaeqxLGKS(*)cG&q%c}N*YV{3?u^Xw>ARRJSx=Qqd^mJ zd78M+XU5d|c4V)p-2dl*w*BA2bkXcRwG#DC1Mf=%??&h>hxG6$N1*h@&=3q#VM7!A zfjXML_oKK68N>0?CITjuoOzJ6guh$Kk3O*>y6GgpYT-eIdv85LFgK!BjvWW?w0wR6 zYG`Prz|h-%j=trTlobGyx^E9aT^yW`#SNRU*rNX8wEHq?Jv^Sci9 z9-lS(=4F*(9sf+h9}nlr%)83}wvT4W@xT+Awlnxm=~M)>OoW!c{`GhdD>2r6d~u(0wq3I?+Ez=gzj*AUI# zz92W~#r3j?yTCTMMRS3|M~2T;67cb^3azNP81AQY;-UJZlQI4_zwN?85?xD09AArn z06!4Kkd|q+dC|eNaoFzZN|t{)_*y|9>iU#$OfNjo&MdL1(FAL|%69*ByJBZq^Jpot z+j=(_0Q(9nkt|cGsM>(yvU_DClH$JgztxRhmI*GfRMf9s-l?gvb$CBkVza`Bs@4xI z$yd7Wq+9b1NH=vF5RNmi-!QV!Zz@tolm!FLUZwx;e4ZIzZ98WSZ&mi|{2nx*=b((w zha8{HePLI3?|G*!aq&V`yjynLBSeYk#eZ;eVrfT%L@Ngm8~Bb+GrvHWVso8B58$#{ zhB(H`4|UXT_ZKFb@8pj&{`kQK8<-y$*QWRU=h8@?n?m4|Y!fhUQ`!-h*FH)-Hx{93^t->Dz zOm+*ZLm||49-qBR`biPq60!gAy3mK_WnG0N&;aHesx(ZUA5MtNenARI$x@bOh#2aW zseDjYs)~4~x=%}|_rWlZ%eV;L3cLm@y#h%*^Nl}yX#^kCc`hU5q9}>)SD@wvpr8Mr zcpZzUdy&mBIqdgZ=e18y!OfdB_j}JTqLpU(#pFLzam_8Lg1-3!zmX!1?#EDA*#JkY z$$5CbpLG@3A4#Z}j?vt;9v`8|KIxaFRNXurZn-($mW}^AVe}VXpf_{EI1h>O3c1cK zE4qeV-P`%CddGWDYph~wjk~b0Qtq#(_H^($8~Bt+8|hEsoKA$TDY?Ep@;JK+>)Fh9 z1T|CBV13e9(VT2pg9S6c-lu=9aWf75-N8AHu3Wt-+&D%#`D^v(w~TRqI`U!yV3)t= zpD5v~?B&~$MDiWQF`aVbJDG6OIlT-*(31qQ?dqRjq!^4LC={tI?Y2BTQV72u1 z);U*@61B-gOkHe*d9U&@LEgBjUSRV5iS^sM{jwwv`Fc3K5oPg`qsejwF2up(Bzkt2 zenMDeQZvmK6M&n9Y$|a42Z2Nlfb5|SJwT=if!%H`pE(%TwdaJMqN8NgV*C{!wdQEZ z*kz{gbNxaC_yy)rPln;ujLy*u8!O0;V3!V=zAi2q2T}L&aE&@tz0n3?7o=VSw&T*- z-tV1aUaTB}LA!b_r(u(x9gpXX7?-UU;Jo7U?bc3(A)SX6 zPC*5wf>lOrsk&Fp4X2clJDJ39WT6h43u#~Q*ZXmY!EtGeXhi2*5s4eC z#%iHN3JV`SO%R$~7If%zevAbs9mR^;Mw=iAF0+>n z4LoWgiN@c{By;kyzu$$6m|KHhSx+rWkR)rU`flGVgfDD~hVAVoXB=8bTOgD&_uk2j zd33OHGpaxbRK;^-Sn|XHC)MT8q^-TCx)YNYZZ$7+ozfzNy1~VtVpPkA@ZnTGSSu)v^Wm z`N7?MLxOiEn6qo_>xyuPJdS-pqS&uz?yrxT(9}6DT^qLK(IXO!eZOANOvZk{22eJ= z^dmB;?<|er8h_A7JT)Yu8vmzcX#~M9JF~N(hLq1?ob`tG;5IQ=mhzGrKT55;5vDw{RFJ70KN=?Z~f z&y^~kZF@GKTT}SM!{w#$+}`OCQPM&Z02te+;j+fMWjZI4g>lJ_8@-<4c6jR|>Wy-t z%x?nTu3sR>0aZjA#BNKdrhcTadNDW)D5cw(A?hkv%EIVM{BO?kSUxMh*Bst?ubrny z!48|t?ehEyIllN?9PCzcN7cO)gcK;qf8E2s*6hj_8jRX`aU0l{IxHYUv`TjrekrVS zgwAz?zjwx}OQ9cs>fPlf{0VN=VTz4PPI^63_0T!Bry{x%#11ksk=11G3ss;9Rc+-b znG2s{oQzLI4Paqxem|xHook30=;%4_<3t?0BXD;Az{L(hJ9&)t%Z5SL`n!I zp1u1Io_U;ryd|6d&uZ^Bn4*0g3O4&~NQ+paqmtAmF9hN2%rl(|2#hp{AH6@p_Sn!% ziH2(}V*B#u2hAA=E`YE3#80SCD@iJLL4Q003kn=IY?&6EEr-GuwFmfl>*b`dW=r;s zC77KW;I1#+4f5LBP)Cr#5v#PoOXa|twWEkQ&co6nUq9ZEP(fY|q2UjN&Wt!DV7S(2 zT(adyFCtkKRA~-5x6XF`-NNBeg?H?f(#y${rR7eV`gfb0EzQhx@4fhEi5k)S$Vzc3 zB8s|LQY+8(Vf0jX>+*t5DH?$jQ+iTGo2azgHbZ;M73`bUzlw+9BL<>@g0&+`U`Hj< zg(%plkp_N1$ZToYO1+VvD#8d<2ii3hdFGv`)YDUyNx?DU2m~P#(P)kqx`JgGsOXr< zr0i#?G3V>xkf9>lXZUFeQ@)CrO8ofAp zC_3x~P>?I#%jy_9nY>}UiF-gUbr*DCu3m@~X-1(%Y`#ay)3;jY`P7wQCiiB)YbsV| zyK=r!zSQC3!40jyw;$re-m0!0LX#j#vwO{tHF7vap}RI=+j$df>KvudUX8@@VvAW+z=tJ7u zF22kAGcnW(1M4G+b+^ZMLi?2-r~G2*RXnCAqn(k>2*^`T=^UV4a=Y&GZ@2HKWTd_D z!z#H-?ZSH_y2Gh3Ruo}g5+J5dcitk%<@XHd5Dogj<92T?VjVTIS_~Xd_ zS&Lp`39Ww4qacB3<8~*Bu5J+F)z|M@LFo~b*~k6fquP_`o!yNg?mRN^d=rh`)lrIk zX3&cLdpxeh%kZjoA~wTzbkyoDFAi$OqhEfGv?8ntnhQo=da{{CQVJn<7CDJNRD?bt z3ndzHo$9)3N55){UySd4f>y>kKZC5|;;0Xn37GCq6Y7mTR~1UXGX8Hh2d;C$SAqIU9b zM$#dR{o6U!_FW&c$e*3>!wNH}WOgn7F8<}hv;wd2W~R5%ad^gWYR)n%=gqje2cyWT ztgH$rP9Jodb=;nKb&_XIJMS=RV6L3C?9#08e$D2*RV3su9z2-v?_c1qX%|{qZf%g& zI|(4816y;le<{F74QfyqcU~`DB`sC2mrqH~eGBp@YfjGjofAnET{Hp~g*{Dlq$%jDjCWI9V$TxPboa=@Q&xl1 zIi5e!iN@0_$}fLydH8N6AU>D3CR34#wB1ckkwsx7ht1Sc6g5iGm9wM!XMmG0Ezs?|^H>-CE)Ggh#2)$Pyk1XkmY}b;U=E#WXeH{o9%rbaZ%``f!YtFr2GQ={ z*6^RcN-{-c{Ph#Fv`FbTPx4fm&CuDDR1C2GL=8wHR&<3qx9xzQwhz@_S+=p+qN1rvw8p|;`)+*Q z-+gDuETzLZ`CXssU84fd>dU`G`U-TL#H8{DWq?A;e8UF&W4` z?74*jWA8-bamEHVF++l6Oc75K=TG!aMi4 zkDls#HOn^6#RO}M{@F1y904l`vOSFfa4K5(CD6&7~T zqVjkNMJwHkxssGaba=z`oUJB=@gN`1e)~3V{cJ44;<~r{Lh5UB<8m@Zy2Mq!>;6~< zL+%%do0jOd}C;_=C0f zMK6P*1NR|E2l6Y?KxDy(PjJ?y_W3I3a`{Q}1^rMuZ$`@v@^%B-Plt#ip~wcSXt9Xu zQ=zz*m>fDvfL3BZ*l0~z-#y^}lP$#HiX?Tad-p1Tkzun8{m$*7-5XsVz%31k0A?>A z2@u-%Cs5OD3g~AEGmSq^q_9w#)d=dX902m@bTxU=SpC}qN(L>*FdEtjiQ!1MUUA1v z2brcB_^K>W2zYMz2axC8s1ODf<`So7Gz6$k5^XoE9ClLuDF!W~m5)0wM+PN`)X*&r zVAxbS)4k`T++fOSQOL+bixD)X;t|u@yF)KNVqq-cuT#^dGHm9Ism>ARnwHRXn6xxB za*CCzn=zJVW)N)J1mPNxd+;I<A^_xQZRJd=2d4PL;h_y7?0es&$J z8_%R9f2?;|!DKkTaxzn}uNksp{Rvv$l!XWRQi5T1!E?_O#b3#aXmPy9FR~Srr`}fO z;0JDkuLuOe;MC=DnOVoH`|^@nBxvuP(Du+Kb@3aF?8(Xd?I$YV_y*iurs2n`DJ^Vd z+O9v`sp^vUAbaL9{$|b})YLE{ZyHNJ<(2MVTN}Xgz)_UAnLWHr+!n%^3!>0P#=$zP zW%u7WH`Ez;u4(+oR6RP4Q^KuGv9f#0_KE&HeZq-&I zS9(~eO*h*(CvT6%ewg9JRTqE0u30_ns@iw9RDM5Buq0tZe|97+@Cy~%DeSKdpCPk) z5z1~D^u#wLgR$vtJI^3^Fn4dlQr%b*D!#T{PMjY6@(lX;H$ga#wb8Txz-h|Wi0lGZ{(3-E87sr2*O=25`Ck&!cdswk$-mTSKQTNS-wYT8cwSoEU==PGs#V5KCd#ty;Ucp>( z`$uCc)L7rwQh(i)fy4&7t*E$IBzAyipY}{4##HQe)l)2Otn-jkfD8WO&+rj!F2&^h ziJ_m+78b;T(DHalwHp+Lp{gCiyV2}TGR6u~ktme8PTjBhX>AIoGPb}Imi)4T7=Y-kV(GFy3K_{f`R5cY=jYas+ zdg5LDWe<=?3o+>Z;?!n~4Am|Oid`2i{yUVCtCj7fMbMVzg&)Wx*vfud*g-fpl*~ez zrH(a2xCvRUi;y}LE-ix-Sdr7oCCBZEAJ(S{fP^IBrOZ5Yo+tuS1^CK(ofW+wBk(|D zIuI!6ghm9YB0zjxK6xH%Q@iKm3VAlISI?c@(li)kV>$U=HH_?q2JC#+@XWd8&YIpe0U%@A7cy z%6_cfGL#9c{!xSZ%)fsb_Pr$FOCFP$Cx-6LE8~j8*a{1yi2U)=cRSBbo(MachJ=FX z9|u|e+TcmbzA9U%XN3FHCDC0dy3tlaN)L%pOAC#2FEkxi($|LACU_~K{w?Ol)4pTp z+lsl~ZfjDpfYX64N9$;E>`TH7P+zo$EQTDc;$oW#j1T_h!hy$L9k{v^ws$xpPyab2 zqEnl}EDil*rz)cq=HiF731yMVaQ3a=k)uZje9dw{`85Wfl>&;0ui7eHD@Vm!mOT4x zJR+|Coh+%Ig^kNJjj``{8pihO%8}0sy+e74`(5gDP@cnyMqkYE{>{Z+v)bfQ_wz%z zxqz;(!DwfxK9M9prej>`y3Ib!m0G{Of#3ErPjNGOu>-Ey7?-bCLwcWyGUi z*P^$s6={ZMCySY%i&z}Q`I&3iExyuE@)g=aAK*?#`UdaKAwquPSpB{5{|qPabUBqO z_IVB5pBj6m!{_|7otuj*@>9Qxg z;W7S4-q41P&-EhYSqT@;u8g0tdoUT*)s57$|F3s=+xt(RQu0pl1%3@-&X4~ob6{#U z_e61%ufVa>db^>a*GxkXyE=KpBid^F=MSuTSXNfTJgk)(`FEh@O4-N2T5Hium#O4i zU9>J~^JT-4;~zm${9mEPrSm3YsiNuApmBppxzk#R=L%84crsM9GHhk$iB-cJdEBHL6Kl6p1gc$cv>D7Q{2yS=f3QVIbbiKbf;B@v=#yUGuCoBj3jL0r&mJVrQ6sipGPJh7FSCGAaQ$ zgB**_Pm_I<{N)N{929vb%Oku@<3ad1oO>>R0dU()c3}xS0XlQ6rV3;(U1LA+2hgc3 zstM}p=)EAAUqA;`CAOu?xMY=(JY>?Oq>)L_RB9qwp0l4`TjIaMag#c6P&;6LE%Qaw zVd>MrrBJ4*myZrUXf4BHINe1#{NP8zDCP!?BVJqO*%!2}>|kY9T9FeLb&}%ZxrMoKOfj>UzShzAI=(UR5)wBW;5JYvnKzt6d!s7mpP|5f7bUV z5k|DYbpb23)m<&B{HTk)()9|gp`@zi{~Bnv+DQ)#p1JJdQ>oObgU=1-E){!uRz5cG z@m{KC$I$j}udR?!Za2A*`}E|8`0Ga>BK+0of7XhBkc>v}uB(!`5iYqmnrT3tD(`pN zYzW$`R<3V*=vVf;l;G4_LI_-yrM5A4`8~JcY z3Sl4)0;f(?PQldZGc70n?KCIWKVIyiqx{(a>q&&Z8Fgtr-{F;H{<*)aik0YGKQ-4L z7F82R5^#ASHDF^mQ8X70DMUrJ^O{m1>>;@3hhLKFbpUb31{*{R$4NH3u>VQu?wHv%quv~cSd_|5eo(tb`q zaIVAJy^HAuhwQ5jH(Wu#Z|Nv^xV{i7-sc&4%jd>G^Lp0?pD!h{d{%Cte9@x*^{Cp# z4_7{mEAmA~V=wXP$RYQMA`@L%x^=@Wcq=b(+H_x819FFsacVpuyDu$0*f_JqM;Wvv zNZIFczX^e4taRu*j+6kTVQ zeipY@LE7H~?qp6A`RnswO5|Izx?{W|j?VnCkQP<|R2EhSR;7g(e;qg!x4#CzRoF@A zZzmh2drH4%hIsMreu+t)e2GDSCMI*e_v)Uwj$FTLKc@x*es%ZsV1Mc)gj`?yYu26? zKAyk*>?Un7oh~Zsd@A|zgAKVlqe;l9J-BZqHtIxcY+@{Q*;K?O4Ur!TVGv8EH&nSC za(hTl@gFIdv9f%qIzsB;lq(y-A*^H&Iu#?s4~L|_=@b<{0govS%Cvd;F?Jgh3_UAKCbP`cD$Fu?o=eE(gC!2cff)))-dVt6!)Fu^EI`d|3hf1 z#jcYQH5m=*D*_&PvQ=8QM)N(m#uA~OOIyoc1 z3fieh+D66+vQpI8kRx>(uC{TSbnS2P^4!I3pU83bi3QH+1r}sy# zJ5cLC?3=*SeFrtV?R5Pb249hV0k&;NHN5e;nc--qvp0HYC9qIaL2$IG zA44AJ;Wb6?1Fzu=(K`3c}=ymD13l813<8h%}@q=Qu9vIgmb(}!2?t_iXop)*I%c5(3bgkd$QS+i3(L;;+J z4P8DtaWiqrmt!_nS^v}tF?lmpqXr>~L@>xc<&IKmf&%>pb)wV!`;w#;m-FY=ESO{< zS&oZ-rSvF@Y?tRmz0KZs&+a>c`SBNkTEv(8%g>?XpDxc4MI9Zzd;UVjNDyPsk>6@@ z+@dGa)5|5ruX}GfUH>~LFT`ywvZts7e!RP0yQBe=J2WPm{3U4=yFWr5Cs~$$5r&g8 z4jBgekzojUhUbN7N?D%q-n_62M^ZrYIUa{OefQ|g6*WypZ zvVf>Q`3akH7HV2h)6`2n$JyUXzY$`BmcsZ{y45ra%xUY6{dojw$>RQSwJ z(9*CdArs{H9B9y5b1P{b)+s+I&GMwx1c* z0{idA7a+>P{G=&1kVg#Ht?rzgAt)Csi`%}4ypKSs#66q8EG8~(db=I)#CamA426-; z*h(|(ixDp+I3q+>3S#3+hXE=tvD>$c6z&VCd;0@8|0 zfxY+}6c`*HA8Y}$Z)eUg&+TWuXYPu0@wDk=4FGE?=mqEfk`{ba4+Fu_Jx;j90w(Z#d zxj6;IM#4OCRqK7u{-i9jr z(*o)imgd`7VZM@vDBT8Y4+qVN`wvl$H>`OVE7m-fd(bQMbwGZdoK7EkDhP4uCs{@f z`tWL_e~@U<&&0--3>wuRn$ps25%azj(e&u>zg^q%BO1FIY{{~BZo`;ZbW{3VOJb-S zaxpIyO7C99ae`^^^Y8)a2wqu6>V>vu;@J!u2~H6JDVj(^0PlsqlHSGi_z+S z2A^&X-*sRAua&GpF_e)F!qZBIaVW~dPcnlcklk?2fANt-v4r?RLbead2G(flhpY$m z8{=REPXl=G#CU?S3-Vvq`Jh(Ms=U#~%A!Zp|t; zqgVe~zne;S(^b^C$!8uVz&qKZ8st6?uBoZ{TsxD|p{wv}zjh@siq(i_aKwChk>#a9 zha}y795FIdtB^ZUXViXJ|M;~1b(lS7cykv;<+SpcJN-YGr z8&y#Z!AyfET9qYGhzT-SNM2bD)VbV4+0x0Wg&7~VzfMllX|`jad>mbC0-3%N@Ln*Z zT5@3loz*D^b)@e=jT#|eh6`$^0+y=lNgEk;7dLgghK}#^9N{u&g$-~=0UM~NR1nLl z152K7Ey03Mari-Hszozyjur^tZzdm*JN(?fpB*cn@4Bc5Wb=!T$rW0h=qtFmE8_2* zU=CrOyS?YL?rE5z)yZtILw9yfnZby9K1*+!QzaL{5LD+$oGb{EA>ksO;%O)Wk(()C zNoz2t5w!4Oc#aC89Z3%zhXiS|=TF@AeP!>Z_($=%TwAR~`txFH!B217+hBgn;Q=7z#sfWeHc;e;Q= z2K|y;%4G4WUyL{621sIlw1l34Mx7K|Ol-tEE$%>=g&teZ6i_k#sj@SiIp;o>{R zH@C7C#&s6YBOoRsyc=d=4l})p4{%xol;|q=1wAvYI-+uQtkY%eQ@b>=<;Q`%}t1#-}LohIP3xIZe_%(j~_d<$#|9Tf$?WH zBn@3v$rCtQId<;Q16rRnix`w~%VI5wvGJv=zPiRTL-Y+5fVs^i@~qqe&>%Tn-oTEc z!znNyKz}(|prCE4445jIO%1E7l{XD2-J~eVwB^LWr(Zm`93IZUQP_B97bA~8EwEe# z%(opc9lMSMz0e-c-(KpqB};JMTm8A0$QrXdtk{A!XshT9{7m z2Wc2$?jPqEY|us%a_w7*yad6@3-iBz@P)9!n(ce+T|F)Y4DCA-s*nL#N3}yqj@*?U zSlgKq)RYHJYFHd+*eWf(JrgiowMQ(A%0>7KFoh?NI-P_ZKjKQWpuI1x`>I^8Ki(y{ zyw^iJO~|uG^@DwuOeHB}0-9|o{&i&Kbvxafwh6xy8!QMz=|g%iitMEKihRsqID}s$ zq$ZrXa;ddPXI^zdZ(FH6zEEXwiXAs2m#zl=d1XhTvz-R|--ZB!_yuTKEk>^A5qGe# zMnVbBGG>2hZk-#S!jyOGgI#^80JPOGHL~I`H)0W{Y-P4l#C~dJd-!n}U4{=<5{*?7Aw`7pa))VU;2Q@eSy@+aH5-%WK_7#xNB zj6BNCrDVy#`n*Ev7lrRy!^si9zsVaLlunsR5Z)oI~O-C;b--4V`iv z1!f^hKPpaz8%+2;MPKuzfnFvGliIMdv%@3@K)fh{_Q;l=Yd5!g?7YKx6sAz3@Gzfe z@j713<2n4rP`L8RdaxTM`h-4Y=z&LDkIRosDQexfx0n+D9N4(|5VQ%|(28pR&NR3w z)omR0`l9l4_G1>{W{j~=7~gwJ#n|r|!RM5DL2MCRj(9!r#C8sk1oiAY+|sh?0XCgCJ>2_Q1zu%Ak$mtxty?`}CwlA(mt%bq6Mo1eyl&pW_&qL;w>h}5 z6Kc0$D$xC{N0SzOUXHy9)}Yu|&{)Yc*@MEqE7lmDbm{f&|Do*AG>AG(&k@QAP)DDY zd|(d7W(MTD@PBS4w~7c{$%7Ub)^=uYosPrQ{VOV^7rDhqoU) zK3_@>YJZA`Y>m;6BFcYuG~dH$MA_^!?rvYx@3d?fz2E$>B+`R93hy?2z=60}P6iRS zdJK#r27VDLwq7anyz)fz143CBI~5=uR>1E`%wLYV8Ae_?|1zcc^}Z_8$}gGT7`430 z<2n0E=?cgTZ*PaxKTviCQ`cf)5T(7wP`$p>MP}L{s9etS51$={8~V~lDCjfxAJj^g z5wu<%y>)L;7@aXA?ToJe8GirCFih)#j0C*u)*Xv747k_!3zK*&G^Hk&2fYd zUnOtP`~FGv&R}FHGu7yEpVD}sozZ9p?&y8`W37SqhRsd*3QU*h#ZnUBlQ_#wWUWy> zQl&*Su+EkB>&x^37h3{~W4YLIHaIrFuowX)h@-b~2kVJnbWRf43Plle;CYz7 zHLqz^h$}26a)M^_cGCM;6F+{}6&>#2h2_*VeB?NM3O65qNEl3X66LjuFZvQraxZwc zp|PDufx-Kr+;@_ZWr&XSpwQWbrv*emI3RnM9~lwVfx?OaO1NVh6~y>-J3b#pjHR!k zA%HPykgS0BEY-#axdjAD3pwz`MbVniQlxG%H1XHh#nti&zK zx{Lkz#%n*Ah0|*I>WLNyOGG1df03&o^rdrjzG(g0kM6tcLkF9+5Cfv;w=(w@&4g>c z#W1w_o%ao_pS0Y&d2=GnWlwypA+5HL74GT4+lZZAN7VmN1wf%dOL)I_4!GDZ4L5gM z_SQHX^ck8Pvk&mElDCMeYZyeFAD%#O@xsltbI*F8&0vuL+00@YFDD8=@>lqC!Bsm1 z>Yb`LkG!bv)Ep*B1%WsEy1lTl5JlwQKGNY zOxLXha_qJA;L61j!pQie5A;$woj=tYu>n4x3UQ_yvKDZV*}hmYKD!jh3*;V8Ck95# zj0RYVI;1hZu>Q{*+(p^`%RN4|Ad8-?Th9|kYdYTRTlKv_=kyY}M#sLytHQ@=t2g1m z_76eFZPhA2wxeTJ4ntT8HfQsvj#~X|JZZ%Z#;47H_<5)fI+y)T8UWr0#r(*>I9I!Y z%U}OguU6C?;G&FrKUk84S0h#G-%b=)QU`ES@Pd0UC*|etRkNO;i*llRuEwHBZ06i} zzWl})AEkL#U3+J3&!7~Dbv)^o%4_GsN4(>_Y(|=*asnK`{B(ydKp?XdhvH|&Przw8 zopLB3`^P%o==omTBU>uyUM<_{7O{xpQtys&gN_a2fhNv32qb)W@TJ-q09w>FHzMCO z{mR|d+JAx7J=Pka+a!;;{PhIkUAhehN3S(n1Zm#ZL^n@ulY|((M6Y{Hbdc>rv(@OQ zQ2K!+5bZKItXF~|P}_Q;YKZL98GMnS+WS4t1q3}~r7uvd5QuI{R8P!YcHYHKs=^8hpw3Ru+qb~(gc^OXp(iTnT2dJwTrSovnzwcU{bN+eliHQM%DmO=zjO$ z{KVcuYZPLK2Qk*I7aR9O+sIQNc;L@BTS+BX^$l6;hR!`_`>3h4>*FR2*48hrP;T$d(zixg zk=IA^(9e_EVQsG8`^%2=cOX1(p?`2{TT!lEul|iMdgD%1{t_x*bB1euG3AurT3hBm zU3*sn#hQ<^`^O*` z2Et&!e7u$|AT{kCv4t*vcyUy(LYx;>_^ZY8K{?39j&C(lIk_!_5U?aRBcewOa@FI^l(wLtpL zV{gIBigDC=7bQ>1d%laAcn2Eu^|tv ziR6@}z5JDIl#R@01vJI4D~=XAZ@CX2eRl{SpOb9#(f%&0>+##Y4%$>7D!XTBjqlR2 zPp(5zcin7}?fZsdt8JO@r}g``e+SvvWe*-&_AXOok9YwFfRjBdtJmWkUl2vrHNkDV z=3Z-zH&xOPQRkGf{0&ySSbr88W$N<3-uTr}qG3@BfUUykTo0Zr2~s405v#useI zqmyUv-SmN@rLDCB=}ueEd2a?FajlHx*l-2qofz?Oz>Vxpv*VN$>G4!28_oc)xc4N& z&5am35L$d`VPkgramR!xvO?xx>7L5xFdIRM{fWmr&oMSfMtAiHp0FeOA$r9+UX_l_-BgCDrm$7lg zJ#)u!?JTdAB~0<4r7D`~f&1%;f&3QTk%D>rkqx;e19@jm|E};45UyD1KgbB&9JRif zjq;H5x>@AKJ?m@hdER-vZx?jfzHz{;W5V-afd|MW~3*BuHOS4Nlo-c?p-H!^HPFv${=GI92=hq|J zw%he`H4XDuarWft{Q5o-79#%tMVB#`GHQ|r(SHcMe{T8KGywzf zKJUu}*}U^7X_HiglTMhKuTCAQ-MX)evv@8$?+KJmnx_3&PrzQPm+Egshbq19CZu+f zHc$UZZXOotw_jUv@L=zouy;KVL|#sPK4VRvjHGP+nZEaMT7BwhtMH@BdIH<2Ov$Zv z?717&(LJO711R2+TVhgf9{S;0cS?OY+&3U6)Y{R)t)Ty*c&l|#d5;1e!$t0`k00&V z#uL{Wo!;>-^*B1P`|ui4`gk0feHa}u@Z2m#cGyF+)Qr)J*Rdv zKt%b8p}+7lm0fRuyg&Rv18?HWf&{zoR#|~ECiD7Mwd?G(xa}sk~iN3leRspmzY&zD^k-0j~Q&`X> zJxQDdWmt%-_h}fM^xj-J*ow@0r7qq;-8Ep#>I!JX2Th#}BKsOX?=FW|qXjZ_`@TWCwj?%&ENC=Sp_imecu8sE%=GNU1>|1q1T8ogB zT!$G38jV+~C9h`aChmGbZgXjl5i?0P%CU`;ivlTfM-sh_gwG7qgOHpkxR?I;Xt?--dVctXk6=PrUFZ=V+0sj`Ne^Bp6ARaU0t z9g+h~=B|+!X01UJ36xTh+%!nNGFuLf8r1Hxva-I*Onzbh?la_oAeNx9p@SQuO6 zh6=WvY8@Fcv$+~B!6NlsA>mwTo;eUNtFf}S07JMz%sQ6SZDC|pB*X}iRf8jtmil2*po(P`{j9fjl2u<=)TlZ-# z0mE+U^X0Miwzb5Rdfs$ObeVcN0=A-*GV2+a$9^`n)o!<2pe*ER7yLJNMg=ba?Uq4f zGspnhkp<`&{J4R+MBm@_i>&!e;+~@Gr|j3Wyca6u(ie9|i?2lN7t85Jy({C6v#C?h z#VH!2XP>7kYEtrkoO@xw(gth>-}J`t)y8KRIq|(3>jAe%%-KBsH27@2?^zS`dih#t z|0^&rx+T&I@8zxy$|*R0Gdf9f{ zQ>@8bzUU7#@>ah2IP>3k=&+opB`?=Ho;CPxyGvSl)`un0fWo#4`OByj23J|y;a{6o zoK!E1msOqnY?T|G>H>HEfu8$~!9Lrm~X$PA7NS^Cko7oAtmq!BCln{ zC*xphFRQhR9~k_;p8=EDE-78ByR^M|9c(q)p{&eKAV^ilw8r23Y+rmN9*zs1|_ z{Pt>72gck<14)A&V&=@z<@e%r>TF0+Bynmt6Z_+GH?beTE}i}%8a{4r@T|A%_erf; z8l8ttK1Jn}-g&gT2RsfR$gSC9D~bWH`pf&(@9X7LzPlwdu{YN0>mW>SXo zxAG+1>ke=NG{=RdYCR^PQX_aF%|~=7C`-BB`rOS6O~h%ZV%rgjY8`cGm6XOv%5TOH zh_n>NoyKn_Bfk|)gwT64Nh!u1;3%X?UQc0iivr7Lr;0@jV)-uubL^(;X=iy3dJFe+ z>6-yz&9lLkmP8mcCyY?Z*+OCqHE;1L_+$)=P#92bsH#qVnjvis!r74sFGE*14;;}6 zz-gB2?q}L_D@FoHcfZMid17aem(5U^{)Pk8p0b&Xedq-A5WPT*ZOrx@Cj;JuR{cIp zXwX}<+;JnQD-da6fg$ik_T>>{f=*xUzyRd)R`NSxVpPEbEfn!*Yv*r z)cma(TXMSE+|OHyvm13Vm&%iUUGwX9*VWX(V!Z3k_qD&cd$c!3>b&sNGY6fmTaNO9 zw1s=zO5WFO*MgVF&t2XDbGvLK&%K1-WlqY@o_J|B`)j;5jtL1X+pjEd_t&2t`~PQ$ z`X#9RE6XoyGN?L2p+M}~x$Uoif&GfU=h83@VI1u#JC^A)_Ge4W>k!0M7^Ckq8_Y}e zs{=Z>T+#gT@QF^_ws7QgNV5f=QlU zpg9g}3%tLYoG6O3n~!gwaXI{bT)J3CVAom2*?d;ee*qX7Y`=3{B`E_sG$T~A-1v-|zj&D}_H#z0SCJUxKY zu)O(-g^|8>?TANt7ATqUe$nZDg6P>@4I=vK`nCBzQ}@uYZg?ncwn_MHho2^*5h1PL z$XX?=P!l+~z{E|%XxG%@Oo$i@gFP!E&TgOc&6^X6r`VzS$O;zdj^8P{Ytg8Vmir?=i`BUbedkoN1sp1 z6ICEWw9a{-NrMk4us5!uxHxt1PtXP8at*jwIl}evL=hG&q_=Wj_|IM;U5)}MY#Gg; zSX%m4i#xEzs)4@~Dg|f`?dl#O`-u)1*RqJ~!#Xl|dPj_`IxUHGwh=|q?1D|x_h_R^ zBrs*@tvVn)cs%j4{#;3nACftFDWqqea`;(DyG}Z3fCUr_i${ov*8FzL3t@%OF}69T=ipSXhIZYq#%V`h%cyc#BK8;u_x`jwKGP(6aW zN{P5*qNSYn+wP|cjc_RtWTf1hTsnc4a>m?uvkm0z$3}|WTK3;S{m@7&^|^2Yeu4c) zCBV<#pEGiN-yrVj=`(Yvlz8x(JckF9l=aho*gau3xxUtZ{?EtFo#t(S1AU%{o$pnx zP+T{Gnif;iSgyV}ZTozdgbP`)QgUtB=I3}Mn%V=sk2-GK`TIkdsP6HyFTdU_`>uDp z!L#F8Fhr5gg@eLddXR)4N|s&!w-lSeUy>2$&2L)i7D8N3bi|gEpqdhC@e#TdIODfb3`S0-K0S?t#U-%8>X@xT4~w!kqR01PCusbUA4+Z zYFIyo$d%0J-{}=R4!7pk;mj ztz~Em3IM_ec>zgZ5f6FloB8)xroPpTmV2LsYD~=sJ}n^7s%ZY@Hv@L)NI2zh8O}%v zjHN3z=1+eqSMT}&7h-4tti|7W1N%T z%N@+h-CR)Iii9{xkJF$gMV)aXChW+(KmhC*F~t!rnCvQhtgNgY_3GN$++BP3!8HQW zn`%3VdWn5fdHkQX(mFcU^wEXylh@c5Mwj7BOYCfolsRwo+oY^pbs4HCOv-*awQo$Z zYz2e;Udv5itc@6VUs|RtaZfHRSDmS)HZGGG_^!l{{28iTCSWFa^vj+ibMjz`B%oG4 z=#Z60BSc`1;r6OiuI{DaS1$6w8JDI97DWwJ|M7W?qYrXKIiaN#2A3C*!7K(!fXU_z z7{gm2@E@K4i08lM+Ne`}$Y;^YJITCYiu#FQr? z_ZlLrjat0LqNIG9J{6hSgFz&fv}(X+vM8Ljf+VA&J??q4EqeAn-yf`o*WIyFw z%26zJg~0NXQ=A|oqKYxQ^R*vSldEBNMaex!wC?GCHk>?Mi?Ntdvipaw!g?1=XhAN1 zDY=0^Txp1Y-J>tmBN0!}) zaG)_Efdbz5ORnUY4AISE)9(;Tf{QAGnre1qgMc7vGfKI-U?HHtL`Owy@a`^-WJQDZ z9nNZN&JP1PC0hnzVQpsF6~_0?$&_3$IXJG|;PNgQ;GZwA1i3uU`B z)vSKv4_+WB^2sDf5cvsl8breAFbcF`H-KBZ-54S;kN9r9@q{Q*4?w}k#z#*9gwc@q z<^AhnZsx$>7)6N+0#b(>1v93hQGh9~HEn;qgwaOpfF`gExY9UU?>~7gXfRQTPPzDCPepBS zTHq9t2-5bF}49^8bGs{w8)umYHb(b(J0@nmhj{pKjzv9csusIjC z9wjuTO*ASZ!Gq)Df($)dh-gVTarr+EKqiyAkcQP0&}S!_>fy2Iw1U!FBYt-n%~sXO zs}pUt3|ktHAA8bE2vQffhW zmECBtg4Z#`Qtt;3R5dBiP(t2RAix@I8K_F1S|Pn~f3SGTC9D0LMAN8bs;v*Xl;;Uk zi>*oLiS8}@Rlw@Qf(vRdHddaBm40INXN$-(VS3=b3t`gD*8`|A+|s3{<}&pk?zIR!BD3-R&$+$KcUS$I-EOyQ=o+QNCy zP`q5P+w@LXf0KHsDi55P`H@hcNDRkIxb_`~%p_U$jYy*j%v(iaIO7;;j_i@*&-3|3 z*0e#v;~I{g^bc+G;u^+aM2@BVa9o`1-#%#bi&qxYgTwIx#Bm)#E=0(=G+`xTNNIjY zM^W}F?pKnYCptt^_Bp2R#P;zT){>RcrWfI$xh0V(e5apps1CL1zfx99ADa6rL{dxV zclP1WnDIMZoqE+G`NgtUhLJ02;qAgikWmY1VQ~x6^5WZB?;;qdV*(dyfsV6+Uep$u zwq+7*D6OCW?|JKT6x7sC=rp@8blazWyx+rR(gjBiVd&k#lKZtU+9(Zdz@-Z3A%hAe zkb#OG3TvCKEGx;?NI4p0XCJ5fud8DlLYw0fq~_{8&3s_r}28!IEMjyh|xVgmC8{^}E=&9c#D<26iBbQqK4l}=6S~3~E zIQt=J!n>sS)QeHC!9pbXcyW7OW|(d0zu7_W)K^pwkyohdFU%UwET)Mh3*1Nd_=Fwn zq{Z5-nUG-g*%tGL(@}!^;sLYzUmUH8p)4rpH``>*ASNx~*fm%pM;>G}+A>DdACr`+ zjs2V8x;Zr26gA~vjvgaguZ%dNx$2)rigM64W2%5@HQx55wvI4vGpDLB4Vo&;o;o5a z#4x~=pcR*pw~ww6^0U-X&tuX{(*nsQS`^hK1F@N+j5ut;kjdi3y4m!-JzqT+{2wp$ ziT>svVaWP=qGbN6?<0jtD0n$AT1ggnrbyi^}?3 zP|r{d6Iqf1B{JVm$+O>v{IU5;&FH!s3&l0?uzzh1d55Uxz-xkL{5mA$5`lfRTDf4~ z(0cDbvU}28`|)5-xMUh2l{=iCN5e3!kuSy;_|XsI$mq%2R+wi6jQKDhSCRylOJ^-cjG?ton7mddpDPZr9K;%TGOVQ$D%sH2V+z4> z0F9l-I4TjyG!3HH;Dd)&uEiS=)juhf9L$aK+|8WGC8Vc2CVSk$XH;KY%6W(cCQ5P3 zoi7s5P^<+KH>oBx&6*@Zhyv$Fk+5`VUk_hNt;bP;-OnqX$d52_j0(sbzKgp!6A8jD zIjKat@sL0HPfO?apMvmV8|1&N`vDV^#RPS<1_lX_8)-L9eBH?fQIh3+Fg5Z#jolYq zK6Votc=H~}v75^WnTVd3R}JNy;S%OCxA#}b$;AcIw7`kV-#-vSZ~wT7sKY|Kc_rk> zN#QXHHp)MazXaGqdM1FXy*)t!6YcJv3W1h-sQ48wC>BXsT~J4dQ?V=tXS6Q5G^=8S zhGI;-zDt@#D9r_{Qd33gPmBPAACR0mcaTnUl#HS{S;B;K6*eFx9VCTdZK74kB%FJB zHHl9HiP14wCVc?WE6{R&jgy5R#rX`>%F+&iKecy7T%bW z9IIqEwHC6|7+flAnC4bI50pArsNqA%cOl=gH(H)2dfMQXui23l1AdOth?y*U5{baV zxW4~2yh<9(3~2&Ft;x?nDJ#Pahs>XmJxem*QCCPo0hSWWwii7(NrDLTIwWU`(${^o zcCx(lTc-UWYgs;L@-vH-h~s=k(F!J}*NOw7z1;zFB~23u~{MRAMnK)`F2oa zmC2LEMo?*f4Z2?IhxpJuj>NK5zxV?+ z{}|lY`w)s{Js}a>vq~%^Qpu>G@8d{v=Nl1_;5#fN8Ro&gpj`)~YacnR0vhCdLyhnG zhM~6ku*cEq#VtEXnbK&6P{`FtOo9xtPb_5nr&+5s1Xy5<)43f8B;!W^4p6>o@+ zbdhZ27_mjDG0nM zn)#UVTHWY$I^URhZdP#2lw3W%e2ET(WuW#KW*5VfAH}W%ph2)8x~RtVY2Q&~xzptr zDj?IEZM?o-O*wuJTKBpeciDmWjSW|2Fgng^XqZ$0l_%OjniEZdyaif;o}q6ZW{O@$ zjO3;NsCNH7#*IPC|Grtxc2Z!pT6=>6CgN(mZU&PU2P6* zhdXD~@2^w4xfN;!L_A_b@Not}nz|EXIjupMn&E~Ds)PvIv74O;6rN@12@U%Je=0~Y zRANXv6~nI3?Y53{}zVlLhj94>qX_iUC+kaOhFHXYt_vMZn-Jx__ zYvkL_6RjBaHbqs&MURmw=1WF(JbFy3;@=3>W)&Ej5*v0&`J z`f!=3L!LmGzvuNcFttaKL@%R<<*J&4f&apn%FT}DTO5J}1f+6%Viqn+?-nXU_DDS=ZNGu78|ZV5N>76{D<^rI#6}C*Iq>Y%I_Y0byjetr#m+{{1!??4%7p4j?+q*)nCdozp&Lo!Ct{I+yvlc z22dW0%>!CQEYX?Zs)Pi-r#kQj8dW*@G@Eg_`Z7r};*_6?N*>#gv+QUM*Fg}pB}q&F ziXz8YE)q9%VWw$RFSE@4``t)`m%|1Li)u7Mx7IUe%`5LsDB%K*C0KB#8U#SKOd!hW z-}wrhvF#=J8Ld-ORFw)m&I~AQmSBbK_2=57p{WqZUy5u;0} z)alRvQC9gA-oAhUOc*N*^wN16N=(0O!NV7z*u5JVeV!)LhcM+Jq5U;B!;wOEcMt5hR zu<_WjEl8MqyrzSVRsFTAj3OGq@%f;H5QCauK}|`Li?z0PijxM|8mR3mLtKn@HZ!*f zp-0&P|L}#DBF}WouN66@vHf87kW|hJ%Q3R3tvyw_hWp=-qj%isb>6%o>e|cc8u?!B z>%OFezr9QmCNk9M+3Cn_5DXFa4x#~+1qk=9sF0UN&`?$j001XUGa*t_^~R+m;kceL znpsHdzaMMHUzicTDCat$^9W|>?iUwQ81+Cg%j%U&KpJs6O30s;&p@`$opJzIW}W|D zR!>nvWKGS)oHWAGhp|Yf4Eo6Y=OlV*5vF%NpOiyz1Vd!}TIY6&#aQLL_p*Px5jm|- z$_p=wq>O`_SznL~nA`jW{Ya`*7+NS!>u07uAQB*|CUYUKBotUkI0_9199%p_7p z%g$A|SSqw`Os(izlEWJmm?ZXYv`WF+o3@5>XQd_PWjF0okiHix`J6_XHB3q< zm1|WiTTU;)FA#ENngr5QNst7-mGMl8rAi~T+uL`tT*LnMd=+R$5N4;(SWZ>0pjPe( zR$khdW%n@qayj7Jk2oNf>n%;oX0sWjW1RHu)X`OTK5FOqXSyP6sINL*A@c0Z;^Uwx zX$yPyzbW!HZ+O+2=JwgNY<~*jm>cfN!gJT#g`rXO6+QAytGEj5CAp?SpexhR06>!C zc1&SkmM24^1X(7)>L7xA@shw$PgGe#SXfo-vI6E>$0Ed-ObUAO4Dw^MTn{VRV|a*) zbf#VijSIzzBq&Ze}>o%rI=+7){|-DLCU;Dr&vA&3IMAf@R$4Ux=Kf$0ltaOGc-5##U+JHMhVv-KDQ zq`|k=B;Au(G4od&uA@#fj4~sQ-nz>*BJ44xo8)*zCUxMPkf>@%R-ouFla57#tdh!0 zf>FP*_kv5X03NU$#O9Jp@^UJw_KpOhG6G`LLHpMgM5(&qY!u;}ozzId5nTVh03ntZ z=iK&u$c^7*h?y`$paF-&Z+{X|hI5b55wt=T6m=q41nn3%m(Ih!Z3Bwngm_An`!%u?F}L8d$k7G}5pt8b!qEvD!m~s40=D zqlAuCFt;&~1GNI3lVRkOMfM+kq=~Nw+PRz~+T8S=LIjZ9Y&abw4S3vdk{^(rT$JoK z9z)Z4t}fG@!^dnWiXuK@M?R*=HntSmqXDronz;qK7D7ti-}*cb`C9m>%_n zBIFL14?I?9415_+AWSFRJSmJw1`v8yP7Xro5f&&%n1L|jN2B`$plf;5#jR;{I^+GR zUW?jN8CucMjAY1)mFNw~_%I zMfVkX%boB<_V^Di;{UX`-tr=xgI<|kXXqdU}RUtcM zy9_yurfM#@GO$sz<&Q(vj1r~Deg6y;$o+timg5j7huOhwTsSy?CO1qh?<fyBZS6A=jJto$!cGknVAh1M{DX~ zhQ!fp^t8kK-|%cWU1y18@_Dsfv$kGdg$}s{#d1TkKpnt>Nb$QCa0C7}2LX)}NVZjy z$?=*(3gjK+#&#^K+wtK*?TGVpV1Gj3#k8-1qac;yabLLs7I=P|u^fWGSr5Mg^Y&W9 z5OB^gwK)jV(opIj25iL5g~e$y$;W=Vk^Xaumo=4F{1f!nJ_$J(K`_s^n5!$0o8|0A z&_+g!_IS*tsGw99c0tcgMF*h6(eazdU4ab=n`)oodAgY2{-LdO&z<(<~k^WgX zI!6V_v*!)hV~{vUj>}L-@Q<*fwhX&#W2lEcEFbN62p5bS`a10dm}OBWOo0X{yxBSH z&%6P1sb-uv3)zy|>g<@OWSYX>^gVaN9hISt6Z1Iz*mYbNKM*b@mZp8j! z)pJ^E7q$f=1%$~RxD^bHVT27z?IZRX?hTF zv+NfV5A!-z!MHRt;>S)X;U0H#JGNlBYun}hLz*{YP zURQzQxiueteszWvC*=jhI}c2pgogA7oHivVg?{jUeQnJ=6IcQL;(r6Q+i0kHlgsJG zlK@p&bjc^xh~=DS^{}7-JhB11{-+Lae^DY!embr}`98Ub4V^(!(=i z%oDYPZ0o(?Up({$MhG{dtpZ9$2-e9>EKqta*6UP-`D*FqF5_IvgDfm9 zX`{tjFQ5}<7hpAWd@?wW2NELrf;8VZpb`ncg$PhYud(1%b$mE!#)ozYL33SM4EkI5 z<5-<>W;%XxakVqp^#3y`?{akp^LV5iY=`?fH1h%k%WFik^=^hZgIMAX<~Rn_3@kc} zK(Kfn@PzMjL=P- z9?XR1j|Plz9`RGkXaug08%u^=(ySuQ3I50v7RH5{>`E1<4#U4-8pzh+W*aOq!}sf} z`_Y(wJm8+o>nvh#Zh|Ax%C0E3;0eQ1Ag1Rhp@Nm#o*=Om`b>&?n&Jq9!ym*O$jhRp zi`VYQMeXGywIYIkLg4sC3F=`GlqTaOCZhI|64206h`nX4*yZGV)zV;{hyCvPuEc;>|%X zKGkvYmZI7i?JW0)$aRtRt+A8a99rh$Q?@#%lx=1fi^2 zV2H)C{ady?An3c8(Z9?9pHP3vv%Nrk?pK)m?IXZmFymB`>xtAd>^8zznyrypLd=PS z-I&6`n70cIPlb$SF+HBIqGivQ@)87WUgu)%mlp61PA}8}fq-m)%WaH}Q%egG(P{pl zPjkx9{BD;r*d?){Nl}lKdrv@!lcCWfxf#h5c0<8QXY!qKa0;;1`H(G?; z%Mwvg)C%xaCwN(AVv6MHaBByp2Mf*iCy8?=cG^KVZA;J;i5JKkm0lDf* zGT!5WKQu{+Dzs{U0skgmS3`-gkT%;>r%WI{cY{@LBhRbFnX*Vvpc$5Po0>44xv}a@ z#$6K2k*+-Lu!?yf>uV1Vvfb%^=}pe-RU%~JUdA<8o0)I;H$TBw>M|k+zN7BX9xoA# zyl=9Z==}cr$D*)26VbfJiox_jP+4s&PVz@=WEPrvQ^3$Q*a>-D&fY~W9!HtH!0C>remsjSj@w4I5)cbb#wr~J(DBP;sz zGAea;)&5*lLVI_SHG#05%)rh32r22A)hVo6ghNz#U>iZ5>=nEU;M(z|$={lQ#!guq z7DI7bz8v5j{&!n1b@ynM|E)21j7*Q`cpe>4=8`m5-9yltPcqY1VX8Qp`4P*@M>lzriv>Bnw zG)~D2{^Rd2?SHU>#_WA)o6~%ELWW90=H|f|#O%M#f#EKr*W)FM6;gA={gVBq>^j_( zi21bJAuS3q1RF53s&FMb_$JaBk{Xh9`_mjS*jQ`vOU|>a)2q_ezYa|*|K92J_vl<dB7o@Bb1B7SH#-P2;!^oOQcD`>_h6n(n`DU?W|R_*uuI9H#8{*mk1e z-WF2O;Bs4Fuq`g{em)=Te}>?m{B|L%p$Jim;lMzi?!ovcgVtvUg#Nh$ZKQZPD1zi) z7Os{^z&s@MiV2Ba*hqaw8GbRi&?Bmsgdd*Ai-?XXp?*s!p|?0!^@EzG?F4dwOG|0M zO^HD_a1OcpzY;QP?jk**a21wb0D`(ouILd1gicMadIxdBvx@6c!_6jZ&HnmHfsk~X zacpz7N?iWcFq>?3RzpOonZRsZGh6z3RmoZ9TzXiUs4g@01uBqp*np9A{$&{zW%;n` zE0>4rYNUOAB_KZW@a66FB;+%4j6~c7R81%}VWA8b>N9iB49Rs8JGr8S z2ORUbKp&3POl9TdDRNV8L%?>5wg(|No)bm?tk*;i_b=P7CupQwly2W81&Pt5Fjsa# z2e?-FXnu3O@gozF@$s3B86mwhfda>Ju#Yrv4`8RPNO)7M=Eda#Ih7>0O%^Aooo7Rs z+lr=MtG9QI_E=|YPRr`KNXswb?UA&WiJPs||7OW;4$58by8PGeBt-_3?1qnhA5H5f z%uF|HbXyNE@_vn(zYS8Zk<7;x3&^-=wVLTF^0C2!DE-I4B?Jr9vG*|!M;6>D{aNrG zw5$xJW-*xRoxZm-?n7gAJ2;HDr>fyX9r;d81Al)jqqxDEu-s0fswE8pE@&vIRUATa}o!VTYY37SoGBqH4;(bvs4% zRWL=L?Vpm{(1M>BVorfgqd9N1dgS`JeKi#&P8h^}hzS;ksVj#>6*6teV#bi4IYgZ*`kw8Sl@{Lc_PH~eL?+DLT4h9dIOoUQC zd@>+LD0*zT8nJkSwHouwgf@u35-L(Tdyd?V<>~NoQ9z*m9!BO&X5(=aR21&k8HVeI z+GolozbZyCz_tz^n|?#_q>J;v?ff1;WlSau8vUkE=1WIGFmPhLK5%o-y|%J8=dV_a z4b>(4Ki{Z_5Sg8F>(j(1nvHtEK2EQ$P%Z)a=3-7^4PFVBdHIzXd4BkxArE~e(y9he zm0%dI{gSEAeLSsYCY2v7)Qys>e9A-wlZ9r;4pR_Y_Qo&9x%H}?>E{{x9Bf{V{6on@ zi9B+<5X6YUjm7v9Sn3mbmvWrv%JE73$5UWL&onE>1yDsqMnK}Q z25g8;WH%r%ANvH+;EI>qL!7nP79YYXtE%YD1>N2}OK{EV47D|wbB0V{GH(UUt|lQ@ zFSly)3lQM>Wl7C5)~A)isVEM)8(b>=#(59aGPHO+VUx^%4WE?7c5R$%-G7;So*Mq> znHtu#_3`uZE=Lpr|CD++oDqb`%a{t!W)h)2B@D#@bX9;N(uSSZ^vE7lQW_Psvgqj& zg|)tT&u8T9-^DXF(q@Aj_@GF+=63mTpQ8__nV*iB@-eir3w3Hnb7Y zH>cFuo}Imypocv&U%Y~M@_l>fT`KE-D^X+rp7rkVLk>ebIPObg0T%z@mz#C)J`fy$ z7jl#)7mBB76an#<-~&$i1-1)0<{5nZ33J^)`HLs&NERUIgHE{_5KFPZg!{tEk26n} z8IVMDbc(f>JpF=(`C^2aP^L$8gu^0+kVnp>vzL|g@k?V5>V5&+MuC%l~5AgtN zy^SWXp#uB1+654RRd2<(v#cfqR6R|m$LiQQs4!28|h0hdipt?Y@4y5#;CeSObyCJS8@%KzK*p1=5! zs;F`UVjqc=(z-!n@`{Zdot|3iTVNl4&iZ99rzIf*hS)#V3&adN z06TCo&)b#Fr+MkT{al3yuyr5~3FEl7<#;%CJo9>7RArr)d;wW(F0@w$+OkI|fGe6@aAkslZLVkcqUCjJxjk_8{!I8w#z~^n zVcVt9xW~lqHB>Gpg zFA_|zk|U4Ga1|f%Ba4u3Rq)Yr1X9GOrq}MxBslh;3J`q9*h!29nPG$O;$Gu9+9&x@ z>~NmiNDFBwv-BiKtil4q6L@Q}v+;r(UH1$&AJ3Y*vm8FG2*5n`9!)>w)tXqYE|Yf^ zfFM{fzFz5U@52GhUp1rxA3F8+a(5(?BNM!jujg#0pje$}6L+6gWU<@5G~#P8B-OEx z!(fkd9R-DQiUi6r>zeQ?rxr z#F{UO7&TI}vqktL7&y3u@?*|Rlc(s&xh^+4RHZaA9q(7}d--V8mwNAY9+W*?=scKDwYvhof}(zLvB!Y}M|6_f0!**TEY#Gpr;!Es_nX-41C zdZB&Ng^%&%Tbtod^dq6C!rcC%)%C{;pYSM(K&AKL`?~wJC7Dz7nES|M@{i)^SQr)# zK7N#bT*dy+msblpV^wF5hvN@T_&!`Q72=y;(q7kn^jUoC-5vQDMO3sbpCaN8CVrU2 zMB+vUKYN%ihq*Q-Z~mN6@@?g@*XAO7CAKRe0b{!fpBG7g+H-Tf?sO`vwjU2GkT02* z6RqQVJ*E~pfq=M9(!j>*)<7nn!$})kVIy?E%~*SugIvL6<`(mPrV4)+8*@0@G; zpT8f+IgIx;yuLkE_Y0NedM_q;pmyyu?LIt=ZfU$-DrwqCQ1*aKA868T6I!oR^1x!K z4+{%rEf$5@VT%yDjWzEm12d2c+nlEN)<3L(P2H*T6AR=(xdoI9Uv}l#3YIha6Q(_x zp00TPR7PqBs@AUt|Mp>trO*uQoQ{CJzs{dmd>{Ez}6X}{@*8; zaNp0^df6Q@=&_F-(uctRo>;yeOX)#zwOREy85r4Ept)M_!gsxFMGqYzpC$3T^HIBKD(!foF2jF5+3r9c*~h8s~G|jhDDe2n*_?EAnTl*f~0{5e}f@ zB6*tPy@pkmK|YUBk1}yYsQ6RUe{-T}uK?Gu;L)s%%|J5fZ>bBXY%!OgC@psTOO&22 z2cnz&Fk2=Z`_RxuvKCD-A!&$mBp9oh77n;v5I6K!OaVXoUW_b%e@H^C@X&LcCsp%C z9T;3sM2(Dga6*iBc+q%Dt~k;6&HhxHq~ z#{a20cN_;2^8v#7rpw7) zE6(4``hdWbSUCb(llX_%Coix8Vd9mRZv>F>gttua@S2U^V*&Rh{W8o68pYt}m6;;A zl*1bah$DM3B9=O2{K1^>v0!As@QL!!W{z76xVzX;4b7Y&14-bk4$&;wLP6sQnyE2J zciqh1voJJS!k#{O#Bi{!(^Hh-X3PMk9CSy=rn4|@Rw^+^Z=?)DabY%djLRf#=POA+ zw93{0kG;42ifdcGK!b;1!5soL7Tgr_ZM|{;uiUyqpq!doX}m=2Q3TZ$zIzJVLSPSMVd?x zt+j?k*E<`IN?6Duw5*r~-l4;FR@n901<+r#^p1Ain-F_Fv-Wys^>Y%0|Tns-tX298l(xiw$(_UUQ0OzU3z1) zA$y4QxiL3hIff=Onx41Zf;0vJI( z312^naCuvDlj?4O9bczW>mDLTKuu7_GcMydHlmMZ$el|Ucb&c5<9N4Dxm;^V3%iCX zOx?esD5;gFK0jIVyNdB%SYIm0o3e5LVlpSu%JVB|;;1f0#X;){N?hgAmxT3=>W6dl z(TTD)P#dciz`6uz6352~>ni0W(sF+nb&@yM|Azx>ex;-C97mtXc_U_Ut42Pk+dndZ z6-6B#Is5K(mjbaw1hy(%xMt$4~Gdc_>-?nCbyhi9Zd)McWDMF-K|a%+|<8S>zuib32w7ccFu^ zxl`uh-b7fZ<6GTk3)v| zbA`Sh$k-+6_#S)8u^7H$`h&5b`44P2$q%utn;tobg@u$wqQ}gANgkIzuoZho8VL7K zvIbJA){Q#h*t&K(O=U@@*%MZqr+qN?Gz^DU4v$5un87j7PwgJKnf*4@5dKYz%TuWj zg`pIUZI+jJK9x+&fVHS-DYu6iqEJZ%#@`m}@qP z_U5ZJqf@awl5`#f1SHw|B>T+$h9=ykD9HECvk^}A?;Zp(p-Ow1hH|8FadpuFFZrRD z?T}in0S-4S9qPp-QVko|A=<(GZuf|5FJc;$FRhHK{l*1A2hJkv!>%9Q)VX_Y?tsa; zN0$&)smC*> z+p0M~{P|OBq>I|%7~=-OOTKvo5W=ceZjdAzN8!CL^TMikHuQ8{payCe?~z)JG(q4~ zq?3~2<`3iS(EeqQWqFy_-$9Gg2n%r^xSMQU;nW_Hb)GnIk`b1%7`f1nC?~>Y8wk8d zYo0mwo64T|j+i3(A&gKq?SSPKMEGGyI`;R%c^%BF_$cttlIwYX!L3?Lxk!P}*b7nX$B zqob@(Dl}||@((vYqi7(x$g7K9OA$Cu(N_Km|FGkx4FZ8Te<2!|PD+2F?pEOczy(2g zfC4G>N1&67<6gkV&~IkaS!l4Go?BYvK)dy8-JSZYzNxI+6q*zI|J&LW!d#yubL%?H z;Bn`=mV8bE_r$uc%WtyfHg_BN8#c!Q$W1p;soNS>H##V2|#Hy36B9y zM$G02%vWtCp7orcWjv6YZK$3X?RXDB8u2|$A~!Z5vAeNTDz+W!%pxZFc~X!Pi5B$1Y(K*CBBrOyj$&EpEQnm<9>|8r?8a7almQa(yB39}O}!qC3Vh zcfX%l)zR2F{oDN;wDR7AEh+4mQo>u-5c45im-Vjj96C@v6RZPr`pqW#=IqrqQ}J=ZBuWsb=FvB$Lc`p~t`MlJ0&P%`fa5dknfO=fRtt<(ZlJNKFa0!-62 zu&Eo+4o}xGN1jP%)~q->Yv-yab#P89awxsCzVtFRzvrP&4Hj3EB{p)AUv`)eQ4cjt zl8XqYh89VdZ5XXN#nXP#66tg)Sy%wJCkZNxdN9+?N^nt@YtY-yczF=A&~0~T*!ou2 zo8H5`W;fhTU@&;$M5!4Rq*)%OXT|x4lLcQr^TVkHz-uY43;a3d#nYn5{;PZH`i{u3septU00pZ$U=fo zM=sv&!+y~X}ni*--mXAQ0M5^{?DfMUX%jY;1&6kRt` z!^v?mf} zr*_`(NQHW1;AsU3DScDTA;P$GPHg!kag*+~y{$~lc+(+~I7RpddRuo6g0Ph&4|SBg zad&DwYq>)zbzE%*Yr=rBgNnX!TtxrEgH)QdYCfmb(Cr8?*2>i;bqE_Iz{@Yh1Qp4_JVBXt()oOo74 z>0L(vLKA?!+1jF#bh5?hHZnXbTK)jXYTl0hSGa^7v>T&JI9Ds;lW+{fJL`g(kQq5Sx_zln0Gm{(cH-qn7SXHQXaw@SY0$MO@S?U?p< zNRzoYSjc&lip;iZ;?tK(13foUk6FhC;M$F~aw*XG$YO*%<@2W=x+_81=##$vU65Fu z-Rk4w+~$C%OAmog^oj3Te8_!C0%%in4k2n_Umk{o@PW@ayP-L zw0_zWR%Iw9!ckP8S>TQZ6%EBO;f+9)VJa5Ku#JtzDakJ-i{H+}YRY4A3JY@7`innP zyO)?cZlX;`_LVoQJfkaL(7SSaTY z+$B)rBPnGqSO?MaoiTYc(q7p zzsYKPuxi`FC#Y0GV{Is=M;1`R>!8c8c+HsJ!bK9myWl~wln$rIaS8Xk=DKqF7? z4IhW2xeYJ4);g6e~#cX|;K-W1e1`BaCW7HGZ+blkq z3cxevrV<7N$hO-TEVl|`Ny=E9n-f}2jGOL00JHLmBmGCLqNr)Y0{4QTrX~bIt2s>l z#q_L!!O4Q#LE29EX!sp$1tClreAI&m4P~k$Y!=Sk@J(F#`YerQ&@Y_LDw{_#%kFr$h$8u}_GpYwEP#A{q?y%b* znT`NUW?x>A_t=vC^^4rx9IenLc}L|xVNjIAn9zyWV?e-ur3w0x}>^H2Lk!LGb$I-w#(_V-;Y6l?aNZOirb-Wx1HL|D14n; zm^LVj&}V-JY$SFxDT~FVCMQN%YX~5ATk3|gmQ_)*@>Uru602h2H(zY$WQWa?7d~@` zU1XnwLtDX-2OuncP_o#*d^%o1BXC#OflwSj+Tf;xe%WhEGylzV3$@H}GdfFLQl3_W zlug!dP#x^{p>xoRYJ392TE#A)z^0LkNpRsRBJM4jH8{(-G0CW~sXgoQay!LpG?#0x z=W-d4c{Z{;SUq$f<0c2yvVpduheAA}P{#OQ{r{$r)GTOi@#Mx+={8fd!C`;Sf2PIB zno{4&jgACcFv_%mw_0*%Oj+RGw)2m1F``J*^Sx%(9eB>rZaOibZs!x)@N9*!@PR%d z^RI8@c%yfhwPQV7TYx_Rl~OJw?60*XhUqVDb6wM&zVNDuEZ|}8k>2b(c3->Iqo&JV z1RsarzKEwYBRx*FDVI6hWdr%`nZ3 ze)7CAbQ=-P1AY2D6Qd+keqHvqv_K{~SBNLLc+h^MHZyd$;}l`O#+t;|?MZXOm}2m0 zJrYMTB@rf9{39}d#kOGszue~$F-e02+o@ftumDl!)?#E=FKGv-BOJ}+Rli+bBdK#t z6h0Te<}_MbLR^4dGLvSwxFHI1_j^GsSHJjdC6uA1HL;+(Spf^c;)sB-8cy+CIv_3{ zp<05S<4+H__P$SoQAxmu1RL7?9a{W_WF?i17_kRkfkl9@daQjdV;+Q-GO0NrzAu5f zui63g(WW)rLa-~5$97vuc5)4r>#e$Xp;h=!oMz@toIE9y3U7F3TF*5^}i0#Z$XN1qGcrpqJSo+6=p&{$2+PyS=Dxv2m$c5so=*!8DxalZz@wDxP> z592nFoRt&3CXL{IH6hoD$5_X;u&Ig%n2IK!H$u-N)aQ$0ColLUt&nGhHB}tkg4dK^ zLhzf``6j;LVIsD??<9)=Q8G5)(e%{mk*!vg=}%vfhm2~1;LMVBU90wF60?s3bo7;| z0+D29_BVDsdp}-a@Ici&&rl!xk=CN4+fJzFCpt8-(wgd&qCuKx+V&Ey?Y!_6!4aZV z;56wYr8$72ndD}SVe2{BT65-4%e*<8*p#yHFGhY%`cI*kezsxbDEl1x^CIH}IIcC) zo7KF)01$GkUq9fx`Eo))y0&A!q#%BuLQlxG6y;QX!8|CrZ1X-}i~4&n4)BmYiVCwn zL)mt*aM@(nZIZIl{&XBj8Xw;5LwB+7()8f?PRn23=mY8%$rT%>kQLnV zN!M?EvVzne0=l>gs%@?{$0R{5*oK`v%2DUyA9gi>afFr4(Z&pFLBi)3Lf5drQddcu})*mF0-?)m+dq|`Tmg2n z;bR^y$fqon4OIcFMF*kdHb-I=a%{b;8t0~~3Qacq;vbAR)au2=SBia%%?3bWIX;{M zwtNS4yMQF`3USOXpH2dNxya85FolgC9!4|B!yF~%25 z^jvv^8l6gmiCj$hhTurr3O|LOvn^;;Z~M)v%;v;*(^jC*k+f6mMe!}JJ-YB`zEL!y zQral95wQy?fkl!VDcIEb4AgrP6eXLJeGgo$WJWZ{eM^Yg4cf7>EzVo1Y!(ep#)az) zvwnXUJ0mtmqU89zrgW@egequ@Q$PE%)3!5E0ED)7VMgRF>49os&bmqI1~gj`Sa`A`9<61d(N?(dCYcB{}TpnV{WP!^L`^qNfFNy zC2hQ4Ze!>!ByFVJj~%p%`as2I5zy>JZs0mW@Jry0dp`9d z=4avS{KeaC}1(4~<1L9p4MV z+uk)#WagLJ=-%?CxDVTt2bDfgmS^=4-?)>jytR{_i{O63`X4ncZ8*KAjq!bEX^!Vu zb7)72jTeq%FGbDjld7QsT9ij(ysMl=?ku{s1j4alYW0$$9)Rn#QJCg-jH!6F+2Smj zw*AhhQ#`BIU64^>oqjHP7>&{~&ro%#*8wQ^ssstJHyovUh+j*W#0qC4LR5g|JM=Tp zK&Q4Xczdyp5E=q-FMA2{^763W#Q-oz{0#*>Pp#5q#&TnS zPSkjQ6$j%r39AnZ(epEJU*1U<2xln_FP$Tfn?t7TNux!|-KQA`0jB$lJcdnL6(2{hve;;$2@}Pc>)>en+tLBl_8T=g!yR zCp<4E+bN4m{x8uWVB@yfyz2vlo{!6T+Nn2CSr2wnerTT3@ zLKtVlp+|57176KIZ$(0X>23@imEVqozB`uMlZ%W2Cz7{a~khR)0c%*#kB)g|xq4#a*LYJ6nMNfuQmMvJV+A0EGlQ?oG8^Bc^1BGXh zXE!LSm0%%I)U|0(&j5;D=wtFi40As^E5+g|(blh|{n)nC^^D)yoK(eX_!_S!n3BiC z=Wi^72Q^pVMYB|`_~fl8X^~6TEH)N+LQR%n8G+aA6jx(53VZ<3V%o+PZ@J`W*s#=V zX=7Mp)o4{t7hDbJYK86BLO-q)G+A2|d^RMg$&3)*~8P%h;XeR^-x zyqwW>g8=U$-;|GX{h+^zL+Q~A)Bq(dG zN`L z$dKKUK!U&^Zo4K@i>L(nk`r}6m?!1Vf|#+o@uZ(mQ(}-es3iw z@ugt9j+(K(mj+aRK9;*UQaW-hlFC{2g0lzd`TB|YYUn?86`n9h2nd>Ypn`4V;ksffiV zYme{UV3v~9o0Ag-%zn%a)wlhgxtl`Et788SE0E@+dyob0TMMdryF&}93UU&Hgrw}L zueD||1eQ&po(){LUGirb=H^@2!>pfOC4ftGQh^Y$a3ZCIOc`0@!=y<)FU#c(z{j;f zsa)1@N_stA>a!Hdl`jb=Q&WH_sV&@7SZ3{SlAAc-oC>IZRqg)&n!SpAu94V&AdbODPer zU8fW%Db-d(uTh!L+V&=+(>BhGj7&Qqbith9@Rx)3H>}yiYlnH5a&}m(Gnmj>i@<{% zq7d^JTle0R4(EmQZOzM?|G>*H9wgzDMFu=GT2IB-eN2JS+TnNpOn|QSOJR)W6jTYI z9G!6^{y{qwVx_SD(s@%}sb^=VX23R;TgE^11f}wD1FZA?bXWceGpVDy8vh68Df4Yh zZkCKcb}*Wqr9uhfIQ>#=kiJ@ybDYf=-ly-i6DOn4u2n&`I=6^E1B%oOMytC9ulLiZ zx%lnt{goaw1#6pH_l%Ip+(F3<{6eESTCM0X5hREB+MaVx9#Sx~Stkv6QQY2O!t+vm zY>AlrD8GJAW~-_#Tbl?$0xl*0wpM^j&I;c>X(7>q8gemBF`?b3Z-&OAQzKGo z_D@+qSKuRoA>;k885mSFjNA#c?77Go8gE8j&Nrol`K0EV{j6x37Wp(Js$sH2oLAK9 zrSJWIFC5bc)7TXi(Ipb7%g=BAdXs9{Ywu+qI>c6@?@896m}I(X2YXD@Z!OX56EgN# z)>Jy0(_NE*^Fh0aq)6{+Zz_9vAWVmY{Mm5gE>+~hX9uYmD)^CM$Fa#=q>|+S*hK-4 zI2^T)jf2f5W>|)LZf_kOF9xL~+~6 zsIzd&mRyR#;v~6(Yk?f&eO)nrC3o-HTxEwmLrAe#Y=}+zn1rMf;=XHFTT$bct3@vK zdQOmNMF1MBOmE=KP^ULkyygo-n@h||2-c#Trn)5!3H*%pjf@D;k+t`APns~scpw)t zQj)&Hkc@wFUqzpGHH8-2TK)C9uMj>{@DmbxxuEr^$6==18^r{}g-HrVGEK2u&X}YE z{j5IPT^3_6Pf*u+PD1`ia4OMT>|^HbxDZb2=V@1lVstL*Qg62fjpJM7a8RSmibjeT z##(*8xMhJ#|KL14K5`{1yEO?iwh_I}NT@cw+7Dw!ia*DGv?0mp0zexT+IFZ?f zJ%D;y$6{?!4Oa#tY4OX?dV!qn7;u@9*M|b_jxnO<-=qOzib#qXlp8jZ4OBe|mOc&` zMco@PPVsL+9|6+M_})<-1;|B8tBX9%;a@F!ZwmZ(-tQB!=J?1fl!Geh$%SAynvFJ{r*OC2ujTLmqO-$)`a(uV%}dB_rHeEb_!Ux zlDsdgki2U{+xPqLVU}L|&I_q|;>-xc#9`M;?eMDd` z-4K-E-yhyqjq&3`EF+ADe-O|Rf%G#$$@>ZO(C0;;2IGJ^`13tEfi5?s}`QL zA_#SCkd1Wphbpwa+0EemHJtxyIB)-jYN+zf+|v`oS@r6{>5LFxa);vy`$tl2tK|$B29aQ%sMu< zeSNJjXhP2yGW*FJII2%a{jA)xb`mcKz?r!jrB_08@qe&H0N%AZp4NZO@~>>aD5~_{ zxPEOBjh4achCimUAsso%(XbXmyx;EX44rz6{+r~3 z&A+yg|LfO%|Jg`Gm1wF@3ukTvx`Mcx4_RGjPoDO@iM(TvUFrlq@Xz;$1#Y{M2dBOb zB;wUM{&zb5cXyzVk)M2dRbFl5()1q_3d=SpC^HrHP=3>rJSb2u~w;>nIh$j}8DJ>W0* z#-TCHv9EJHcl#9iR~_abqX*-0<3^{1n<(P==@WniZ}yuNAlCPPCh|-OXav7(Tkm-{ zdW{xesNS354tm1{>1G#?A0!Gu;HEek2)$PsZ#I&$epsdji7ZXnA)ZVX9x-_c{6SL1 zx#R9~LyYu3-JQ=ER>Qf?3LoETxY>CbpAXa-dVSDn+y8DmU4>tlO`&A8q}E88#tUfQ z&nTuiZ4kpO6ti3O2oNt@dT9(5x40JTGN)9RY8cM>&VRv(=4rLvgUpjECm!78 zB@ziAr2yvd_;gZ|kn{9Br`=Mh%v15owWAmn^wpERuDeqQcNuXmJA|`#t)~Qj7^kpv zLwa+cb}nb~?@a4n3^pzb^~uO-fBONVJ14DB+vCt#pIMS#8U2pGmcr2Q-=#QrE2KMw z6-&&7r<=cJ2nrX_Oe(mOX#b#=W=!bwrxo|GXTrCTKzF@uaII$54enD>2J~A6eO(muO>5~1Bq-t{I>qe-qZ=H}4r2zS z*MZDlo$nx}zt4bCR5V%DtS7->&ZHfx^ca!^wTe>uB@T6!vB+p@nXhbE?k|DD(Pdg{ za40_}x!a;1JH)^vOBdA_w+1TbHz-iNHkC^O$U+z6T%*=Qp#8qk6nFo+fCF@kq4)?#&+lT(fDJA6UJ zvoG|Q0#JhGzmC*UQqhR^Ronhp``|)GkeZrVNuDMkz&W$e6$ZG39Z+OBKOM(=bTtt zLBX9AbXR@sEK8%Q^D!U!?0}M-NqwU>C+*E)tTm%}`o$jHN0? zOJ&89S-qu(lvJx@=J`ROfg_Dnn;syUhFRj+UM>wih+isR-}hsq$+0lp$X5GK6S6fLO#d zKmp;0KKW6JO-+uNKvP%Yq74l;+Ll80y;)Ap7QQ?UWEhK&>HPNGp_{tYVpx+q1kcwxuR?vx5pq|l>iA59*AwI!B78o&4 zhx%+^m8gWHCt`3*Bu5_iBspjPsbgi+?rkVv>y9f}jdL6W?hN2sMhUjL^m1hK2mn25 zpATN&#SWJ_{|0jch<1E8XpL)U5F~UmpX=K#5|b7|(G~8vx~?rP6nB&ETC~0=$%x7` zx*zz!?}n6IUl&dAER&e}tx5wQ$mivjZcl%_=@miyAUB?GogR*tGqsttKqnuSFKV7vt)4>IOrT{oT-{8I znW)Z7W1GB9SX0H4wR>~U$ubIJqul4(ijy9r`QV!wsXpfnSd5d~v6yEL^UQ z{S66g!0=Ej^-n}t+cvH3E!Wacu)U75zmQAzaD2{-cViib@K0Q*5_0&Iv#4PeiIG`)37P?ae$83*)H{!8Nl|aXkglJ*UrnLGYRC zI_6sD^^$jdY!e69m=n%hQ_Zzz-uIjm;2Qv6+NcYJp>kBG^vCQprvOiv*KiLU#z-$? z1GCGMZ|nZ3t^3o-Psg#Zpqv*a`mkIQ?c%?_C}oK*Kr+Qs#tV-Sn~+7o)3&n zy+hyG*^RyCd)xaqQ3Gwt@xo5vtL(?%JQx%>#Z5|i!v^whVZUIP(eQ5ddE{J9%nQ3y zJ6yPm$g5$ZJtxok+LI3|6#|HvyV6xuMJ|p3RK#&oIz)Db`SJLYc(PxmDhqd?fQ**1 z(nr6wMh2-)sN=Y;6S!D;1DA8{u|v*iO14QBR0#~;*YFxIjD2PrtqGzbF7{%y`c$(q zfEk7utd$lh$|h~WYnxF^A0Bw=TN`1vb@eF>Fp5V>?-*)j1ZI{KVN~Y}(rIL(hu&B% z`AM(zPG6#4+qU8lr!$O4IxaUpft1a?cZ-m!Ozs?RO@jPl^#i0Le(7RDCkwdZ>BQvY zA;X`PbojZs7v66{-^Tl-=0GkC^J*lGJ-Ia(^qBA{$&wyd+OgTXZ>NKH&=_vX#AI8CNyCW_q* zSc~cklT7nOBrH8aZ6Cg`73X1ttM(ST_tk=f5&JW;(k-QM%3dozSV@?JPHpt%$Qt@qY9a^u#dcmm5=Qy}krnEA+Scv3?#q+V;dA+l zjE>9x@LIu((O+gJ_&;VQdVMU^bbVg=a-qwe#K^^GPhMW)4r~Yn?uSySm#R#Jf1W<5 z5bdhQ+{fpRqZ1Yi%O5bpNyc%&fktQ(;`u)X8$D2wrjt6MIaej8XOq9HzFQb1@foxmW`=b?m= zFxvc?(v-KRK{p9ouQn};qiD{=cugj!1RZb}C{kF0TTcNw)=x5pAHnc&%cY~8g zcLp_E@C-snm?{}$k~osB0TwB#}! zB+JlqX9G>VQKmrfoGC#L-mSqFp1Qlh&B=10;T);N9RHjQQ~oHP?{QZLvdcYnOCp?m zyucQ-hJ(-TW&?qSORH@r)%_0g(io^=`QR zkm7tBbF%LN!->GfAxCGs%~O!vJxlUy=sfX1p|cENxW@l^%cLg=Gd+O~mgW1d3c#R7 zv7GWPEL)2Jl}N8)eBGy_r2#(`l=2SbJk{*-P|PwwjVf-M|eFc z2RtSreRXBoBfoZnM2){vvWZYjV;h{?Kgn@lMbsF^q*$oy5T#*#8&b?xq!TBRz}ztp zix}l;jQ|R=gCsP`Li-q7i*}8NT4JUD@XpOJMg#&}QsF9PDJCLO)AR2>i%|K5Q<3l* zw^_Y2PMCqMQMPbgY`D@JozzMb!8OPj8<95@Gkha5N|CPxj+hRiVjNX`;NZ^$TZ^$sNzdm26PD5FXkjA4P=#daEe0N?&9{r+ z$EbiFY*EIM?)*#6MuM9Fe{=px<&ZofD)lMY4pou)ldAYI|EOAW7fid_d<5*cN?g!o zK;$=~X!LWkjUiEi()o@MIp29Cc&}-amVd8pA^gk$#SJS(P#r zFx+}jj)#>@4Ne@L@k>IQ^7W)(-;E9 z7p^j%tB{9gMB<$`+5?+wbNZI-5@?By$atnV1{AEqq<+f7DdP1GMR95l^_gwoIGVR9 zBYvvsHk0P@Tvc752SKny4-J3J$PTv@J@U;lZ%dAZTpNb}P6;Ihn_pSMr-?66XHK0i z$ij7+q_UFAL^(d5e!j@|!BEu6-iJ5XqCweyqp?D^_!C3~=R?TGutT5jmP*hwll@UK z%)X~yf{JKP+`q=9nBqX6GF(KXa*}}A!DDCgS|4DNPd|~aZk|*_Vd04dL)hSHaE^zv zva?`x)M$Ep9|PTis4#F5(I(vItwUXhCsC60^VTQdSc&JADGV7pM2`0ueO*l0`=Uu1 z=cvX>%g~5<^$P$~vh7ErLLJLjd}<4Z9g)n5rMqR33gkDn@lqIh}-kYN6F{L@NhId*^p z<|NnHEv@Jv1ZUofUgj}tzf@%0=rl6$z%uGMnk(VT)E()y2YruPs^?(TF@oN8UVSd( zzlOi0_L%u-d3e4?oMtOtS-)s4OPeq{;e~}%s2PGnd{It_ipFU?y1T>#6gIap zb+>skeQ{Z7*l*BX@~st^TWYh14tyoQxBc69egALTFB1^SR*8iJSO0E6Jg84ki%q$g z&@>}J+WO6m1p>`{IvXAlm9d>RoX;2GS7rLDMb1Q3^;tgj{Yq`#A)^iktGgMxy^v_M zH3tNfWBA6a1nGCl#9!GwW0Lu)fd^3#L4lQ*bT2?&e5X)Y-9IFfW%y%jx@q(Dsu4%j zXqU1@KvHCq8>*D&?qW(^x#1#8>`!ASs^~--dXlKYgamgGA490@z46`8~IXU1RYSgP{jS~zucZc$bF}oph+n`aV{3^%P`&4ShM@L zIO#r`qCHx5^~%I_mIW7e;;%!m&D>~@*==P+nTTCTax}Fay za=N^~Ra(uS$_j=gBAWdK!X~tvakI%uupgVJ*UU1`rHcIjGXsT@9ydG19mT}=A<&VbJiY z9Vu&=n%c$8wgei^R(4$~D-f|*t8qk_Si}D;p)b=EjGzVW%SJFQe1|8a!GIV{>=7XT zf_bD!w^WjZRxLEUTUo3{#=mM71_p3=)_m~M6%@J{e_;ue;@4d-Uxr4S@V(XW<$CwZ zM@Lcq*Qs@G$(*GLJ-`XP_|qCF&Ik**zM1pAdFdwieO%gpnBX|usO%u>|C!ah^l}`G z@vxlbb9_?u$FFkT+4stt(RVd#-J3-aUDBsT%JUvZ>*h)btZL)tRCKuLqImP?6b?x| z)38jv8(Tp;($54ta-hn}P{3@Iz#!j#MPjW|>i(+lFoSc5J`B}z08a|AZDlJIb6pUW zZ+&l2Hwtlm-;XH}oF|T*QpkXa%Y)&tOtmsXp`T07b7C(j^^z3yiG<4{9V_;?q7Mn? z(6eP+V#%FVKw^-^$CZI*;py17isn6lk}KnQ^5ILspRbcUN9@4pgJg%koPN^DJEyJw z®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

  • -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
  • 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 Ko5bvet2PZ5 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�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 diff --git a/docs/en/hw-reference/esp32/get-started-pico-kit-1.rst b/docs/en/hw-reference/esp32/get-started-pico-kit-1.rst index c0fa06dc31b..f3b00a5ed05 100644 --- a/docs/en/hw-reference/esp32/get-started-pico-kit-1.rst +++ b/docs/en/hw-reference/esp32/get-started-pico-kit-1.rst @@ -353,9 +353,9 @@ Header J3 Pin Layout """""""""" -.. figure:: ../../../_static/esp32-pico-kit-1-pinout.png +.. figure:: ../../../_static/esp32-pico-kit-1-pin-layout.png :align: center - :scale: 50% + :width: 95% :alt: ESP32-PICO-KIT-1 (click to enlarge) :figclass: align-center diff --git a/docs/zh_CN/hw-reference/esp32/get-started-pico-kit-1.rst b/docs/zh_CN/hw-reference/esp32/get-started-pico-kit-1.rst index e9681d7aef4..2015aec869c 100644 --- a/docs/zh_CN/hw-reference/esp32/get-started-pico-kit-1.rst +++ b/docs/zh_CN/hw-reference/esp32/get-started-pico-kit-1.rst @@ -353,9 +353,9 @@ Header J3 管脚布局 """""""""""" -.. figure:: ../../../_static/esp32-pico-kit-1-pinout.png +.. figure:: ../../../_static/esp32-pico-kit-1-pin-layout.png :align: center - :scale: 50% + :width: 95% :alt: ESP32-PICO-KIT-1 (click to enlarge) :figclass: align-center From 4607cff1f9770be34311584da7f5567bd506e5f4 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Mon, 15 Jul 2024 09:35:51 +0200 Subject: [PATCH 099/113] fix(esptool): make 80MHZ Flash SPI speed not supported by v0.0 of P4 --- components/esptool_py/Kconfig.projbuild | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esptool_py/Kconfig.projbuild b/components/esptool_py/Kconfig.projbuild index ec7e12ee2aa..5877ada398e 100644 --- a/components/esptool_py/Kconfig.projbuild +++ b/components/esptool_py/Kconfig.projbuild @@ -114,7 +114,7 @@ menu "Serial flasher config" config ESPTOOLPY_FLASHFREQ_80M bool "80 MHz" - depends on SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED + depends on SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED && !ESP32P4_REV_MIN_0 # TODO IDF-10488 config ESPTOOLPY_FLASHFREQ_64M bool "64 MHz" depends on SOC_MEMSPI_SRC_FREQ_64M_SUPPORTED From 3a6b665b908f439ee2eeb43ae34c89e01c5ec754 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 19 Jul 2024 16:06:53 +0800 Subject: [PATCH 100/113] ci(ana_cmpr): enable the ana_cmpr target tests on P4 --- .../test_apps/.build-test-rules.yml | 4 ---- .../analog_comparator/main/test_ana_cmpr.c | 10 +++++----- .../analog_comparator/main/test_ana_cmpr.h | 13 +++++++++++-- .../analog_comparator/main/test_ana_cmpr_common.c | 4 ++-- .../analog_comparator/main/test_ana_cmpr_iram.c | 4 ++-- .../test_apps/analog_comparator/pytest_ana_cmpr.py | 2 +- 6 files changed, 21 insertions(+), 16 deletions(-) diff --git a/components/esp_driver_ana_cmpr/test_apps/.build-test-rules.yml b/components/esp_driver_ana_cmpr/test_apps/.build-test-rules.yml index cbcb9d16bc0..39fb87a34c0 100644 --- a/components/esp_driver_ana_cmpr/test_apps/.build-test-rules.yml +++ b/components/esp_driver_ana_cmpr/test_apps/.build-test-rules.yml @@ -3,10 +3,6 @@ components/esp_driver_ana_cmpr/test_apps/analog_comparator: disable: - if: SOC_ANA_CMPR_SUPPORTED != 1 - disable_test: - - if: IDF_TARGET == "esp32p4" - temporary: true - reason: not supported yet depends_components: - esp_driver_gpio - esp_driver_ana_cmpr diff --git a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr.c b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr.c index b24776e455e..21154fed14e 100644 --- a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr.c +++ b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -50,12 +50,12 @@ TEST_CASE("ana_cmpr_unit_install_uninstall", "[ana_cmpr]") TEST_CASE("ana_cmpr_internal_reference", "[ana_cmpr]") { - int src_chan = test_init_src_chan_gpio(); + int src_chan = test_init_src_chan_gpio(TEST_ANA_CMPR_UNIT_ID); uint32_t cnt = 0; ana_cmpr_handle_t cmpr = NULL; ana_cmpr_config_t config = { - .unit = 0, + .unit = TEST_ANA_CMPR_UNIT_ID, .clk_src = ANA_CMPR_CLK_SRC_DEFAULT, .ref_src = ANA_CMPR_REF_SRC_INTERNAL, .cross_type = ANA_CMPR_CROSS_ANY, @@ -77,10 +77,10 @@ TEST_CASE("ana_cmpr_internal_reference", "[ana_cmpr]") TEST_ESP_OK(ana_cmpr_register_event_callbacks(cmpr, &cbs, &cnt)); TEST_ESP_OK(ana_cmpr_enable(cmpr)); cnt = 0; - for (int i = 1; i <= 10; i++) { + for (uint32_t i = 1; i <= 10; i++) { test_simulate_src_signal(src_chan, i % 2); esp_rom_delay_us(100); - TEST_ASSERT(cnt == i); + TEST_ASSERT_EQUAL_UINT32(i, cnt); } TEST_ESP_OK(ana_cmpr_disable(cmpr)); TEST_ESP_OK(ana_cmpr_del_unit(cmpr)); diff --git a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr.h b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr.h index 13566bfc84c..16ace493581 100644 --- a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr.h +++ b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr.h @@ -1,9 +1,11 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ +#pragma once + #include #include "sdkconfig.h" #include "esp_attr.h" @@ -14,6 +16,13 @@ #include "soc/soc_caps.h" #include "driver/ana_cmpr.h" +#if CONFIG_IDF_TARGET_ESP32P4 +// The pin of unit 0 is used for other purpose on P4 runner, use unit 1 instead +#define TEST_ANA_CMPR_UNIT_ID 1 +#else +#define TEST_ANA_CMPR_UNIT_ID 0 +#endif + /** * @brief Test default on cross callback * @@ -32,7 +41,7 @@ bool test_ana_cmpr_on_cross_callback(ana_cmpr_handle_t cmpr, const ana_cmpr_cros * @return * - int Source channel GPIO number */ -int test_init_src_chan_gpio(void); +int test_init_src_chan_gpio(int unit_id); /** * @brief Simulate source channel signal diff --git a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_common.c b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_common.c index 0feb218ea66..7f5c3e0889c 100644 --- a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_common.c +++ b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_common.c @@ -16,10 +16,10 @@ bool IRAM_ATTR test_ana_cmpr_on_cross_callback(ana_cmpr_handle_t cmpr, const ana return false; } -int test_init_src_chan_gpio(void) +int test_init_src_chan_gpio(int unit_id) { int src_chan_num = -1; - TEST_ESP_OK(ana_cmpr_get_gpio(0, ANA_CMPR_SOURCE_CHAN, &src_chan_num)); + TEST_ESP_OK(ana_cmpr_get_gpio(unit_id, ANA_CMPR_SOURCE_CHAN, &src_chan_num)); TEST_ASSERT(src_chan_num > 0); gpio_config_t io_conf = { .intr_type = GPIO_INTR_DISABLE, diff --git a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_iram.c b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_iram.c index 44da8afacd6..957bd39980c 100644 --- a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_iram.c +++ b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/main/test_ana_cmpr_iram.c @@ -40,11 +40,11 @@ TEST_CASE("ana_cmpr_internal_reference_iram_safe", "[ana_cmpr]") .count = 0, .src_chan = -1, }; - test_data.src_chan = test_init_src_chan_gpio(); + test_data.src_chan = test_init_src_chan_gpio(TEST_ANA_CMPR_UNIT_ID); ana_cmpr_handle_t cmpr = NULL; ana_cmpr_config_t config = { - .unit = 0, + .unit = TEST_ANA_CMPR_UNIT_ID, .clk_src = ANA_CMPR_CLK_SRC_DEFAULT, .ref_src = ANA_CMPR_REF_SRC_INTERNAL, .cross_type = ANA_CMPR_CROSS_ANY, diff --git a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/pytest_ana_cmpr.py b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/pytest_ana_cmpr.py index 1cc5cf49718..020ff3713ee 100644 --- a/components/esp_driver_ana_cmpr/test_apps/analog_comparator/pytest_ana_cmpr.py +++ b/components/esp_driver_ana_cmpr/test_apps/analog_comparator/pytest_ana_cmpr.py @@ -1,11 +1,11 @@ # SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import pytest from pytest_embedded import Dut @pytest.mark.esp32h2 +@pytest.mark.esp32p4 @pytest.mark.generic @pytest.mark.parametrize( 'config', From 6da89cc8b9856664a432c193d1d6404a356b953f Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 19 Jul 2024 16:10:45 +0800 Subject: [PATCH 101/113] ci(touch_sensor): enable the touch sensor target tests on P4 --- .../esp_driver_touch_sens/test_apps/.build-test-rules.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/components/esp_driver_touch_sens/test_apps/.build-test-rules.yml b/components/esp_driver_touch_sens/test_apps/.build-test-rules.yml index ff1dc3e64ca..16e6ca03696 100644 --- a/components/esp_driver_touch_sens/test_apps/.build-test-rules.yml +++ b/components/esp_driver_touch_sens/test_apps/.build-test-rules.yml @@ -2,9 +2,5 @@ components/esp_driver_touch_sens/test_apps/touch_sens: disable: - if: SOC_TOUCH_SENSOR_VERSION != 3 temporary: currently driver ng only support version 3 - disable_test: - - if: IDF_TARGET == "esp32p4" - temporary: true - reason: the runners do not support the pins for touch sensor depends_components: - esp_driver_touch_sens From 6960c747b5d6c0e93b544aef0262c72284c7295a Mon Sep 17 00:00:00 2001 From: morris Date: Sun, 16 Jun 2024 14:09:04 +0800 Subject: [PATCH 102/113] feat(rmt): set DMA transfer burst size default burst size was set to 32 bytes --- components/driver/deprecated/rmt_legacy.c | 4 +- components/esp_driver_rmt/src/rmt_private.h | 4 +- components/esp_driver_rmt/src/rmt_rx.c | 84 ++++++++++------- components/esp_driver_rmt/src/rmt_tx.c | 93 ++++++++++--------- .../test_apps/rmt/main/test_rmt_rx.c | 4 + 5 files changed, 104 insertions(+), 85 deletions(-) diff --git a/components/driver/deprecated/rmt_legacy.c b/components/driver/deprecated/rmt_legacy.c index 36f757a2f2c..6d28bb11938 100644 --- a/components/driver/deprecated/rmt_legacy.c +++ b/components/driver/deprecated/rmt_legacy.c @@ -139,11 +139,11 @@ static void rmt_module_enable(void) { RMT_ENTER_CRITICAL(); if (rmt_contex.rmt_module_enabled == false) { - rmt_ll_mem_power_by_pmu(rmt_contex.hal.regs); RMT_RCC_ATOMIC() { rmt_ll_enable_bus_clock(0, true); rmt_ll_reset_register(0); } + rmt_ll_mem_power_by_pmu(rmt_contex.hal.regs); rmt_contex.rmt_module_enabled = true; } RMT_EXIT_CRITICAL(); @@ -154,10 +154,10 @@ static void rmt_module_disable(void) { RMT_ENTER_CRITICAL(); if (rmt_contex.rmt_module_enabled == true) { + rmt_ll_mem_force_power_off(rmt_contex.hal.regs); RMT_RCC_ATOMIC() { rmt_ll_enable_bus_clock(0, false); } - rmt_ll_mem_force_power_off(rmt_contex.hal.regs); rmt_contex.rmt_module_enabled = false; } RMT_EXIT_CRITICAL(); diff --git a/components/esp_driver_rmt/src/rmt_private.h b/components/esp_driver_rmt/src/rmt_private.h index f61082ee8ee..017ed9d9ab6 100644 --- a/components/esp_driver_rmt/src/rmt_private.h +++ b/components/esp_driver_rmt/src/rmt_private.h @@ -53,9 +53,6 @@ extern "C" { #define RMT_ALLOW_INTR_PRIORITY_MASK ESP_INTR_FLAG_LOWMED -// DMA buffer size must align to `rmt_symbol_word_t` -#define RMT_DMA_DESC_BUF_MAX_SIZE (DMA_DESCRIPTOR_BUFFER_MAX_SIZE & ~(sizeof(rmt_symbol_word_t) - 1)) - #define RMT_DMA_NODES_PING_PONG 2 // two nodes ping-pong #define RMT_PM_LOCK_NAME_LEN_MAX 16 #define RMT_GROUP_INTR_PRIORITY_UNINITIALIZED (-1) @@ -205,6 +202,7 @@ struct rmt_rx_channel_t { void *user_data; // user context rmt_rx_trans_desc_t trans_desc; // transaction description size_t num_dma_nodes; // number of DMA nodes, determined by how big the memory block that user configures + size_t dma_int_mem_alignment; // DMA buffer alignment (both in size and address) for internal RX memory rmt_dma_descriptor_t *dma_nodes; // DMA link nodes rmt_dma_descriptor_t *dma_nodes_nc; // DMA descriptor nodes accessed in non-cached way }; diff --git a/components/esp_driver_rmt/src/rmt_rx.c b/components/esp_driver_rmt/src/rmt_rx.c index a7da1a288f2..8c1cdb087ba 100644 --- a/components/esp_driver_rmt/src/rmt_rx.c +++ b/components/esp_driver_rmt/src/rmt_rx.c @@ -59,12 +59,13 @@ static esp_err_t rmt_rx_init_dma_link(rmt_rx_channel_t *rx_channel, const rmt_rx .direction = GDMA_CHANNEL_DIRECTION_RX, }; ESP_RETURN_ON_ERROR(gdma_new_ahb_channel(&dma_chan_config, &rx_channel->base.dma_chan), TAG, "allocate RX DMA channel failed"); - - // circular DMA descriptor - for (int i = 0; i < rx_channel->num_dma_nodes; i++) { - rx_channel->dma_nodes_nc[i].next = &rx_channel->dma_nodes[i + 1]; - } - rx_channel->dma_nodes_nc[rx_channel->num_dma_nodes - 1].next = &rx_channel->dma_nodes[0]; + gdma_transfer_config_t transfer_cfg = { + .access_ext_mem = false, // [IDF-8997]: PSRAM is not supported yet + .max_data_burst_size = 32, + }; + ESP_RETURN_ON_ERROR(gdma_config_transfer(rx_channel->base.dma_chan, &transfer_cfg), TAG, "config DMA transfer failed"); + // get the alignment requirement from DMA + gdma_get_alignment_constraints(rx_channel->base.dma_chan, &rx_channel->dma_int_mem_alignment, NULL); // register event callbacks gdma_rx_event_callbacks_t cbs = { @@ -72,6 +73,12 @@ static esp_err_t rmt_rx_init_dma_link(rmt_rx_channel_t *rx_channel, const rmt_rx }; // register the DMA callbacks may fail if the interrupt service can not be installed successfully ESP_RETURN_ON_ERROR(gdma_register_rx_event_callbacks(rx_channel->base.dma_chan, &cbs, rx_channel), TAG, "register DMA callbacks failed"); + + // circular DMA descriptor + for (int i = 0; i < rx_channel->num_dma_nodes - 1; i++) { + rx_channel->dma_nodes_nc[i].next = &rx_channel->dma_nodes[i + 1]; + } + rx_channel->dma_nodes_nc[rx_channel->num_dma_nodes - 1].next = &rx_channel->dma_nodes[0]; return ESP_OK; } #endif // SOC_RMT_SUPPORT_DMA @@ -199,32 +206,32 @@ esp_err_t rmt_new_rx_channel(const rmt_rx_channel_config_t *config, rmt_channel_ ESP_GOTO_ON_FALSE(rx_channel, ESP_ERR_NO_MEM, err, TAG, "no mem for rx channel"); // gpio is not configured yet rx_channel->base.gpio_num = -1; + +#if SOC_RMT_SUPPORT_DMA // create DMA descriptor size_t num_dma_nodes = 0; if (config->flags.with_dma) { + // DMA descriptors must be placed in internal SRAM mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA; - num_dma_nodes = config->mem_block_symbols * sizeof(rmt_symbol_word_t) / RMT_DMA_DESC_BUF_MAX_SIZE + 1; + num_dma_nodes = config->mem_block_symbols * sizeof(rmt_symbol_word_t) / DMA_DESCRIPTOR_BUFFER_MAX_SIZE + 1; num_dma_nodes = MAX(2, num_dma_nodes); // at least 2 DMA nodes for ping-pong - // DMA descriptors must be placed in internal SRAM - uint32_t data_cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA); - // the alignment should meet both the DMA and cache requirement - size_t alignment = MAX(data_cache_line_size, RMT_DMA_DESC_ALIGN); - size_t dma_nodes_size = ALIGN_UP(num_dma_nodes * sizeof(rmt_dma_descriptor_t), alignment); - rmt_dma_descriptor_t *dma_nodes = heap_caps_aligned_calloc(alignment, 1, dma_nodes_size, mem_caps); + rmt_dma_descriptor_t *dma_nodes = heap_caps_aligned_calloc(RMT_DMA_DESC_ALIGN, num_dma_nodes, sizeof(rmt_dma_descriptor_t), mem_caps); ESP_GOTO_ON_FALSE(dma_nodes, ESP_ERR_NO_MEM, err, TAG, "no mem for rx channel DMA nodes"); rx_channel->dma_nodes = dma_nodes; // do memory sync only when the data cache exists + uint32_t data_cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA); if (data_cache_line_size) { - // write back and then invalidate the cached dma_nodes, we will skip the cache (by non-cacheable address) when access the dma_nodes - // even the cache auto-write back happens, there's no risk the dma_nodes will be overwritten - ESP_GOTO_ON_ERROR(esp_cache_msync(dma_nodes, dma_nodes_size, - ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_INVALIDATE), + // write back and then invalidate the cached dma_nodes, because later the DMA nodes are accessed by non-cacheable address + ESP_GOTO_ON_ERROR(esp_cache_msync(dma_nodes, num_dma_nodes * sizeof(rmt_dma_descriptor_t), + ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_INVALIDATE | ESP_CACHE_MSYNC_FLAG_UNALIGNED), err, TAG, "cache sync failed"); } // we will use the non-cached address to manipulate the DMA descriptor, for simplicity rx_channel->dma_nodes_nc = (rmt_dma_descriptor_t *)RMT_GET_NON_CACHE_ADDR(dma_nodes); } rx_channel->num_dma_nodes = num_dma_nodes; +#endif // SOC_RMT_SUPPORT_DMA + // register the channel to group ESP_GOTO_ON_ERROR(rmt_rx_register_to_group(rx_channel, config), err, TAG, "register channel failed"); rmt_group_t *group = rx_channel->base.group; @@ -377,25 +384,24 @@ esp_err_t rmt_receive(rmt_channel_handle_t channel, void *buffer, size_t buffer_ ESP_RETURN_ON_FALSE_ISR(!config->flags.en_partial_rx, ESP_ERR_NOT_SUPPORTED, TAG, "partial receive not supported"); #endif rmt_rx_channel_t *rx_chan = __containerof(channel, rmt_rx_channel_t, base); - size_t per_dma_block_size = 0; - size_t last_dma_block_size = 0; - uint32_t data_cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA); + size_t mem_alignment = sizeof(rmt_symbol_word_t); +#if SOC_RMT_SUPPORT_DMA if (channel->dma_chan) { - // Currently we assume the user buffer is allocated from internal RAM, PSRAM is not supported yet. - ESP_RETURN_ON_FALSE_ISR(esp_ptr_internal(buffer), ESP_ERR_INVALID_ARG, TAG, "user buffer not allocated from internal RAM"); - // DMA doesn't have alignment requirement for SRAM buffer if the burst mode is not enabled, - // but we need to make sure the buffer is aligned to cache line size - uint32_t align_mask = data_cache_line_size ? (data_cache_line_size - 1) : 0; - ESP_RETURN_ON_FALSE_ISR(((uintptr_t)buffer & align_mask) == 0, ESP_ERR_INVALID_ARG, TAG, "buffer address not aligned"); - ESP_RETURN_ON_FALSE_ISR((buffer_size & align_mask) == 0, ESP_ERR_INVALID_ARG, TAG, "buffer size not aligned"); - ESP_RETURN_ON_FALSE_ISR(buffer_size <= rx_chan->num_dma_nodes * RMT_DMA_DESC_BUF_MAX_SIZE, - ESP_ERR_INVALID_ARG, TAG, "buffer size exceeds DMA capacity"); - per_dma_block_size = buffer_size / rx_chan->num_dma_nodes; - per_dma_block_size = ALIGN_DOWN(per_dma_block_size, sizeof(rmt_symbol_word_t)); - last_dma_block_size = buffer_size - per_dma_block_size * (rx_chan->num_dma_nodes - 1); - ESP_RETURN_ON_FALSE_ISR(last_dma_block_size <= RMT_DMA_DESC_BUF_MAX_SIZE, ESP_ERR_INVALID_ARG, TAG, "buffer size exceeds DMA capacity"); + // append the alignment requirement from the DMA + mem_alignment = MAX(mem_alignment, rx_chan->dma_int_mem_alignment); + // [IDF-8997]: Currently we assume the user buffer is allocated from internal RAM, PSRAM is not supported yet. + ESP_RETURN_ON_FALSE_ISR(esp_ptr_internal(buffer), ESP_ERR_INVALID_ARG, TAG, "user buffer not in the internal RAM"); + size_t max_buf_sz_per_dma_node = ALIGN_DOWN(DMA_DESCRIPTOR_BUFFER_MAX_SIZE, mem_alignment); + ESP_RETURN_ON_FALSE_ISR(buffer_size <= rx_chan->num_dma_nodes * max_buf_sz_per_dma_node, + ESP_ERR_INVALID_ARG, TAG, "buffer size exceeds DMA capacity: %zu", rx_chan->num_dma_nodes * max_buf_sz_per_dma_node); } +#endif // SOC_RMT_SUPPORT_DMA + + // check buffer alignment + uint32_t align_check_mask = mem_alignment - 1; + ESP_RETURN_ON_FALSE_ISR((((uintptr_t)buffer & align_check_mask) == 0) && ((buffer_size & align_check_mask) == 0), ESP_ERR_INVALID_ARG, + TAG, "buffer address or size are not %zu bytes aligned", mem_alignment); rmt_group_t *group = channel->group; rmt_hal_context_t *hal = &group->hal; @@ -421,17 +427,23 @@ esp_err_t rmt_receive(rmt_channel_handle_t channel, void *buffer, size_t buffer_ t->dma_desc_index = 0; t->flags.en_partial_rx = config->flags.en_partial_rx; - if (channel->dma_chan) { #if SOC_RMT_SUPPORT_DMA + if (channel->dma_chan) { // invalidate the user buffer, in case cache auto-write back happens and breaks the data just written by the DMA - if (data_cache_line_size) { + uint32_t int_mem_cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA); + if (int_mem_cache_line_size) { + // this function will also check the alignment of the buffer and size, against the cache line size ESP_RETURN_ON_ERROR_ISR(esp_cache_msync(buffer, buffer_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C), TAG, "cache sync failed"); } + // we will mount the buffer to multiple DMA nodes, in a balanced way + size_t per_dma_block_size = buffer_size / rx_chan->num_dma_nodes; + per_dma_block_size = ALIGN_DOWN(per_dma_block_size, mem_alignment); + size_t last_dma_block_size = buffer_size - per_dma_block_size * (rx_chan->num_dma_nodes - 1); rmt_rx_mount_dma_buffer(rx_chan, buffer, buffer_size, per_dma_block_size, last_dma_block_size); gdma_reset(channel->dma_chan); gdma_start(channel->dma_chan, (intptr_t)rx_chan->dma_nodes); // note, we must use the cached descriptor address to start the DMA -#endif } +#endif rx_chan->mem_off = 0; portENTER_CRITICAL_SAFE(&channel->spinlock); diff --git a/components/esp_driver_rmt/src/rmt_tx.c b/components/esp_driver_rmt/src/rmt_tx.c index ae61213dceb..44efad957bd 100644 --- a/components/esp_driver_rmt/src/rmt_tx.c +++ b/components/esp_driver_rmt/src/rmt_tx.c @@ -50,26 +50,55 @@ static bool rmt_dma_tx_eof_cb(gdma_channel_handle_t dma_chan, gdma_event_data_t static esp_err_t rmt_tx_init_dma_link(rmt_tx_channel_t *tx_channel, const rmt_tx_channel_config_t *config) { - // For simplicity, the encoder will access the dma_mem_base in a non-cached way - // and we allocate the dma_mem_base from the internal SRAM for performance - uint32_t data_cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA); - // the alignment should meet both the DMA and cache requirement - size_t alignment = MAX(data_cache_line_size, sizeof(rmt_symbol_word_t)); - size_t dma_mem_base_size = ALIGN_UP(config->mem_block_symbols * sizeof(rmt_symbol_word_t), alignment); - rmt_symbol_word_t *dma_mem_base = heap_caps_aligned_calloc(alignment, 1, dma_mem_base_size, + gdma_channel_alloc_config_t dma_chan_config = { + .direction = GDMA_CHANNEL_DIRECTION_TX, + }; + ESP_RETURN_ON_ERROR(gdma_new_ahb_channel(&dma_chan_config, &tx_channel->base.dma_chan), TAG, "allocate TX DMA channel failed"); + gdma_strategy_config_t gdma_strategy_conf = { + .auto_update_desc = true, + .owner_check = true, + }; + gdma_apply_strategy(tx_channel->base.dma_chan, &gdma_strategy_conf); + gdma_transfer_config_t transfer_cfg = { + .access_ext_mem = false, // for performance, we don't use external memory as the DMA buffer + .max_data_burst_size = 32, + }; + ESP_RETURN_ON_ERROR(gdma_config_transfer(tx_channel->base.dma_chan, &transfer_cfg), TAG, "config DMA transfer failed"); + gdma_tx_event_callbacks_t cbs = { + .on_trans_eof = rmt_dma_tx_eof_cb, + }; + // register the DMA callbacks may fail if the interrupt service can not be installed successfully + ESP_RETURN_ON_ERROR(gdma_register_tx_event_callbacks(tx_channel->base.dma_chan, &cbs, tx_channel), TAG, "register DMA callbacks failed"); + + size_t int_alignment = 0; + // get the alignment requirement from DMA + gdma_get_alignment_constraints(tx_channel->base.dma_chan, &int_alignment, NULL); + // apply RMT hardware alignment requirement + int_alignment = MAX(int_alignment, sizeof(rmt_symbol_word_t)); + // the memory returned by `heap_caps_aligned_calloc` also meets the cache alignment requirement (both address and size) + rmt_symbol_word_t *dma_mem_base = heap_caps_aligned_calloc(int_alignment, sizeof(rmt_symbol_word_t), config->mem_block_symbols, RMT_MEM_ALLOC_CAPS | MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); ESP_RETURN_ON_FALSE(dma_mem_base, ESP_ERR_NO_MEM, TAG, "no mem for tx DMA buffer"); tx_channel->dma_mem_base = dma_mem_base; - // do memory sync only when the data cache exists + uint32_t data_cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA); + // do memory sync if the dma buffer is cached if (data_cache_line_size) { - // write back and then invalidate the cache, we will skip the cache (by non-cacheable address) when access the dma_mem_base - // even the cache auto-write back happens, there's no risk the dma_mem_base will be overwritten - ESP_RETURN_ON_ERROR(esp_cache_msync(dma_mem_base, dma_mem_base_size, - ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_INVALIDATE), + // write back and then invalidate the cache, because later RMT encoder accesses the dma_mem_base by non-cacheable address + ESP_RETURN_ON_ERROR(esp_cache_msync(dma_mem_base, sizeof(rmt_symbol_word_t) * config->mem_block_symbols, + ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED | ESP_CACHE_MSYNC_FLAG_INVALIDATE), TAG, "cache sync failed"); } - // we use the non-cached address to manipulate this DMA buffer + // For simplicity, encoder will use the non-cached address to read/write the DMA buffer tx_channel->dma_mem_base_nc = (rmt_symbol_word_t *)RMT_GET_NON_CACHE_ADDR(dma_mem_base); + // the DMA buffer size should be aligned to the DMA requirement + size_t mount_size_per_node = ALIGN_DOWN(config->mem_block_symbols * sizeof(rmt_symbol_word_t) / RMT_DMA_NODES_PING_PONG, int_alignment); + // check the upper and lower bound of mount_size_per_node + ESP_RETURN_ON_FALSE(mount_size_per_node >= sizeof(rmt_symbol_word_t), ESP_ERR_INVALID_ARG, + TAG, "mem_block_symbols is too small"); + ESP_RETURN_ON_FALSE(mount_size_per_node <= DMA_DESCRIPTOR_BUFFER_MAX_SIZE, ESP_ERR_INVALID_ARG, + TAG, "mem_block_symbols can't exceed %zu", DMA_DESCRIPTOR_BUFFER_MAX_SIZE * RMT_DMA_NODES_PING_PONG / sizeof(rmt_symbol_word_t)); + + tx_channel->ping_pong_symbols = mount_size_per_node / sizeof(rmt_symbol_word_t); for (int i = 0; i < RMT_DMA_NODES_PING_PONG; i++) { // each descriptor shares half of the DMA buffer tx_channel->dma_nodes_nc[i].buffer = dma_mem_base + tx_channel->ping_pong_symbols * i; @@ -80,20 +109,6 @@ static esp_err_t rmt_tx_init_dma_link(rmt_tx_channel_t *tx_channel, const rmt_tx tx_channel->dma_nodes_nc[i].dw0.suc_eof = 1; } - gdma_channel_alloc_config_t dma_chan_config = { - .direction = GDMA_CHANNEL_DIRECTION_TX, - }; - ESP_RETURN_ON_ERROR(gdma_new_ahb_channel(&dma_chan_config, &tx_channel->base.dma_chan), TAG, "allocate TX DMA channel failed"); - gdma_strategy_config_t gdma_strategy_conf = { - .auto_update_desc = true, - .owner_check = true, - }; - gdma_apply_strategy(tx_channel->base.dma_chan, &gdma_strategy_conf); - gdma_tx_event_callbacks_t cbs = { - .on_trans_eof = rmt_dma_tx_eof_cb, - }; - // register the DMA callbacks may fail if the interrupt service can not be installed successfully - ESP_RETURN_ON_ERROR(gdma_register_tx_event_callbacks(tx_channel->base.dma_chan, &cbs, tx_channel), TAG, "register DMA callbacks failed"); return ESP_OK; } #endif // SOC_RMT_SUPPORT_DMA @@ -110,7 +125,6 @@ static esp_err_t rmt_tx_register_to_group(rmt_tx_channel_t *tx_channel, const rm mem_block_num = 1; // Only the last channel has the DMA capability channel_scan_start = RMT_TX_CHANNEL_OFFSET_IN_GROUP + SOC_RMT_TX_CANDIDATES_PER_GROUP - 1; - tx_channel->ping_pong_symbols = config->mem_block_symbols / 2; } else { // one channel can occupy multiple memory blocks mem_block_num = config->mem_block_symbols / SOC_RMT_MEM_WORDS_PER_CHANNEL; @@ -247,13 +261,7 @@ esp_err_t rmt_new_tx_channel(const rmt_tx_channel_config_t *config, rmt_channel_ ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(config->gpio_num), ESP_ERR_INVALID_ARG, TAG, "invalid GPIO number %d", config->gpio_num); ESP_RETURN_ON_FALSE((config->mem_block_symbols & 0x01) == 0 && config->mem_block_symbols >= SOC_RMT_MEM_WORDS_PER_CHANNEL, ESP_ERR_INVALID_ARG, TAG, "mem_block_symbols must be even and at least %d", SOC_RMT_MEM_WORDS_PER_CHANNEL); - -#if SOC_RMT_SUPPORT_DMA - // we only support 2 nodes ping-pong, if the configured memory block size needs more than two DMA descriptors, should treat it as invalid - ESP_RETURN_ON_FALSE(config->mem_block_symbols <= RMT_DMA_DESC_BUF_MAX_SIZE * RMT_DMA_NODES_PING_PONG / sizeof(rmt_symbol_word_t), - ESP_ERR_INVALID_ARG, TAG, "mem_block_symbols can't exceed %d", - RMT_DMA_DESC_BUF_MAX_SIZE * RMT_DMA_NODES_PING_PONG / sizeof(rmt_symbol_word_t)); -#else +#if !SOC_RMT_SUPPORT_DMA ESP_RETURN_ON_FALSE(config->flags.with_dma == 0, ESP_ERR_NOT_SUPPORTED, TAG, "DMA not supported"); #endif @@ -269,19 +277,16 @@ esp_err_t rmt_new_tx_channel(const rmt_tx_channel_config_t *config, rmt_channel_ tx_channel->base.gpio_num = -1; // create DMA descriptors if (config->flags.with_dma) { - mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA; // DMA descriptors must be placed in internal SRAM - uint32_t data_cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA); - // the alignment should meet both the DMA and cache requirement - size_t alignment = MAX(data_cache_line_size, RMT_DMA_DESC_ALIGN); - size_t dma_nodes_mem_size = ALIGN_UP(RMT_DMA_NODES_PING_PONG * sizeof(rmt_dma_descriptor_t), alignment); - rmt_dma_descriptor_t *dma_nodes = heap_caps_aligned_calloc(alignment, 1, dma_nodes_mem_size, mem_caps); + mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA; + rmt_dma_descriptor_t *dma_nodes = heap_caps_aligned_calloc(RMT_DMA_DESC_ALIGN, RMT_DMA_NODES_PING_PONG, sizeof(rmt_dma_descriptor_t), mem_caps); ESP_GOTO_ON_FALSE(dma_nodes, ESP_ERR_NO_MEM, err, TAG, "no mem for tx DMA nodes"); tx_channel->dma_nodes = dma_nodes; - // write back and then invalidate the cached dma_nodes, we will skip the cache (by non-cacheable address) when access the dma_nodes + // write back and then invalidate the cached dma_nodes, because later the DMA nodes are accessed by non-cacheable address + uint32_t data_cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA); if (data_cache_line_size) { - ESP_GOTO_ON_ERROR(esp_cache_msync(dma_nodes, dma_nodes_mem_size, - ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_INVALIDATE), + ESP_GOTO_ON_ERROR(esp_cache_msync(dma_nodes, RMT_DMA_NODES_PING_PONG * sizeof(rmt_dma_descriptor_t), + ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_INVALIDATE | ESP_CACHE_MSYNC_FLAG_UNALIGNED), err, TAG, "cache sync failed"); } // we will use the non-cached address to manipulate the DMA descriptor, for simplicity diff --git a/components/esp_driver_rmt/test_apps/rmt/main/test_rmt_rx.c b/components/esp_driver_rmt/test_apps/rmt/main/test_rmt_rx.c index b418b39ca18..c88c6a24b69 100644 --- a/components/esp_driver_rmt/test_apps/rmt/main/test_rmt_rx.c +++ b/components/esp_driver_rmt/test_apps/rmt/main/test_rmt_rx.c @@ -181,6 +181,10 @@ static void test_rmt_rx_nec_carrier(size_t mem_block_symbols, bool with_dma, rmt TEST_ASSERT_EQUAL(34, test_user_data.received_symbol_num); TEST_ESP_OK(rmt_tx_wait_all_done(tx_channel, -1)); + + // test rmt receive with unaligned buffer + TEST_ESP_ERR(ESP_ERR_INVALID_ARG, rmt_receive(rx_channel, remote_codes, 13, &receive_config)); + printf("disable tx and rx channels\r\n"); TEST_ESP_OK(rmt_disable(tx_channel)); TEST_ESP_OK(rmt_disable(rx_channel)); From 002c10d97b516a930e43e819ac3005e457014e93 Mon Sep 17 00:00:00 2001 From: zhangshuxian Date: Wed, 8 May 2024 16:52:50 +0800 Subject: [PATCH 103/113] docs: Provide translationfor low power --- docs/conf_common.py | 3 +- docs/en/api-guides/index.rst | 2 +- docs/en/api-guides/low-power-mode.rst | 7 - docs/en/api-guides/low-power-mode/index.rst | 15 + .../low-power-mode/low-power-mode-soc.rst | 495 ++++++++ .../low-power-mode/low-power-mode-wifi.rst | 417 +++++++ .../sleep-current/esp32_light_sleep.inc | 28 +- .../sleep-current/esp32_modem_sleep.inc | 53 +- .../sleep-current/esp32_summary.inc | 70 +- .../sleep-current/esp32c2_light_sleep.inc | 28 +- .../sleep-current/esp32c2_modem_sleep.inc | 53 +- .../sleep-current/esp32c2_summary.inc | 70 +- .../sleep-current/esp32c3_light_sleep.inc | 28 +- .../sleep-current/esp32c3_modem_sleep.inc | 53 +- .../sleep-current/esp32c3_summary.inc | 70 +- .../sleep-current/esp32c6_light_sleep.inc | 28 +- .../sleep-current/esp32c6_modem_sleep.inc | 53 +- .../sleep-current/esp32c6_summary.inc | 70 +- .../sleep-current/esp32s2_light_sleep.inc | 28 +- .../sleep-current/esp32s2_modem_sleep.inc | 53 +- .../sleep-current/esp32s2_summary.inc | 70 +- .../sleep-current/esp32s3_light_sleep.inc | 28 +- .../sleep-current/esp32s3_modem_sleep.inc | 53 +- .../sleep-current/esp32s3_summary.inc | 70 +- docs/en/api-guides/wifi.rst | 2 +- docs/zh_CN/api-guides/index.rst | 2 +- docs/zh_CN/api-guides/low-power-mode.rst | 1035 ----------------- .../zh_CN/api-guides/low-power-mode/index.rst | 15 + .../low-power-mode/low-power-mode-soc.rst | 495 ++++++++ .../low-power-mode/low-power-mode-wifi.rst | 417 +++++++ .../sleep-current/esp32_light_sleep.inc | 8 +- .../sleep-current/esp32_modem_sleep.inc | 8 +- .../sleep-current/esp32_summary.inc | 8 +- .../sleep-current/esp32c2_light_sleep.inc | 8 +- .../sleep-current/esp32c2_modem_sleep.inc | 8 +- .../sleep-current/esp32c2_summary.inc | 8 +- .../sleep-current/esp32c3_light_sleep.inc | 8 +- .../sleep-current/esp32c3_modem_sleep.inc | 8 +- .../sleep-current/esp32c3_summary.inc | 8 +- .../sleep-current/esp32c6_light_sleep.inc | 8 +- .../sleep-current/esp32c6_modem_sleep.inc | 8 +- .../sleep-current/esp32c6_summary.inc | 8 +- .../sleep-current/esp32s2_light_sleep.inc | 8 +- .../sleep-current/esp32s2_modem_sleep.inc | 8 +- .../sleep-current/esp32s2_summary.inc | 8 +- .../sleep-current/esp32s3_light_sleep.inc | 8 +- .../sleep-current/esp32s3_modem_sleep.inc | 8 +- .../sleep-current/esp32s3_summary.inc | 8 +- docs/zh_CN/api-guides/wifi.rst | 2 +- 49 files changed, 2820 insertions(+), 1137 deletions(-) delete mode 100644 docs/en/api-guides/low-power-mode.rst create mode 100644 docs/en/api-guides/low-power-mode/index.rst create mode 100644 docs/en/api-guides/low-power-mode/low-power-mode-soc.rst create mode 100644 docs/en/api-guides/low-power-mode/low-power-mode-wifi.rst delete mode 100644 docs/zh_CN/api-guides/low-power-mode.rst create mode 100644 docs/zh_CN/api-guides/low-power-mode/index.rst create mode 100644 docs/zh_CN/api-guides/low-power-mode/low-power-mode-soc.rst create mode 100644 docs/zh_CN/api-guides/low-power-mode/low-power-mode-wifi.rst diff --git a/docs/conf_common.py b/docs/conf_common.py index fc29c450289..0b1d0f80af4 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -56,7 +56,8 @@ BLUFI_DOCS = ['api-guides/blufi.rst', 'api-reference/bluetooth/esp_blufi.rst'] -WIFI_DOCS = ['api-guides/wifi.rst', +WIFI_DOCS = ['api-guides/low-power-mode/low-power-mode-wifi.rst', + 'api-guides/wifi.rst', 'api-guides/wifi-security.rst', 'api-guides/wireshark-user-guide.rst', 'api-reference/network/esp_now.rst', diff --git a/docs/en/api-guides/index.rst b/docs/en/api-guides/index.rst index ffc491c00d9..9e11d6e4f9b 100644 --- a/docs/en/api-guides/index.rst +++ b/docs/en/api-guides/index.rst @@ -29,6 +29,7 @@ API Guides :CONFIG_IDF_TARGET_ARCH_XTENSA: hlinterrupts jtag-debugging/index linker-script-generation + low-power-mode/index lwip memory-types openthread @@ -45,5 +46,4 @@ API Guides :SOC_USB_SERIAL_JTAG_SUPPORTED: usb-serial-jtag-console :SOC_WIFI_SUPPORTED: wifi :SOC_WIFI_SUPPORTED: wifi-security - low-power-mode :SOC_WIFI_SUPPORTED or SOC_BT_SUPPORTED or SOC_IEEE802154_SUPPORTED: phy diff --git a/docs/en/api-guides/low-power-mode.rst b/docs/en/api-guides/low-power-mode.rst deleted file mode 100644 index 607055ea82d..00000000000 --- a/docs/en/api-guides/low-power-mode.rst +++ /dev/null @@ -1,7 +0,0 @@ -Low Power Mode User Guide -========================== - - -:link_to_translation:`zh_CN:[中文]` - -The document has not been translated into English yet. In the meantime, please refer to the Chinese version. diff --git a/docs/en/api-guides/low-power-mode/index.rst b/docs/en/api-guides/low-power-mode/index.rst new file mode 100644 index 00000000000..c8d4734efb1 --- /dev/null +++ b/docs/en/api-guides/low-power-mode/index.rst @@ -0,0 +1,15 @@ +Low Power Modes +=================== + +:link_to_translation:`zh_CN:[中文]` + +Overview +---------- + +The standby power consumption plays an important role in embedded IoT application scenarios. This guide aims to introduce the basic principles of low power consumption of the {IDF_TARGET_NAME} and the low power modes supported by the {IDF_TARGET_NAME}. Besides, it also covers recommended configurations, configuration steps, and power consumption performance of each mode to help users quickly configure the appropriate low power mode according to the needs at hand. + +.. toctree:: + :maxdepth: 2 + + low-power-mode-soc + :SOC_WIFI_SUPPORTED: low-power-mode-wifi diff --git a/docs/en/api-guides/low-power-mode/low-power-mode-soc.rst b/docs/en/api-guides/low-power-mode/low-power-mode-soc.rst new file mode 100644 index 00000000000..460a5c7bf5c --- /dev/null +++ b/docs/en/api-guides/low-power-mode/low-power-mode-soc.rst @@ -0,0 +1,495 @@ +Introduction to Low Power Mode for Systemic Power Management +============================================================== + +:link_to_translation:`zh_CN:[中文]` + +The {IDF_TARGET_NAME} supports various low power modes. From a systemic perspective on power management, the typical modes include DFS, Light-sleep mode, and Deep-sleep mode. These modes reduce power consumption by lowering clock frequencies (DFS) or entering sleep states without affecting system functionality. During sleep, unnecessary power domains are shut down, or clock gating is applied to peripherals not in use. Sleep modes are further classified into Light-sleep mode and Deep-sleep mode based on whether powering down domains would disrupt program execution context. + +.. only:: SOC_WIFI_SUPPORTED or SOC_BLE_SUPPORTED + + Furthermore, for common use cases of the {IDF_TARGET_NAME} such as Wi-Fi/Bluetooth operation, ESP-IDF segment the modes above and optimize them specifically, which will be introduced in subsequent sections. + +This section will first introduce low power modes from a systemic perspective, without considering specific use cases. + +DFS +------ + +Dynamic Frequency Scaling (DFS) is a fundamental feature of the power management mechanism integrated into ESP-IDF. DFS adjusts the Advanced Peripheral Bus (APB) frequency and CPU frequency based on the application's holding of power locks. When holding a high-performance lock, it utilizes high frequency, while in idle states without holding power locks, it switches to low frequency to reduce power consumption, thereby minimizing the power consumption of running applications as much as possible. + +The frequency adjustment mechanism of DFS operates based on the maximum frequency demand dictated by held power locks. Additionally, the values of :ref:`CONFIG_FREERTOS_HZ` also influence the frequency adjustments of DFS. Higher values lead to a higher frequency of task scheduling, then the system can also more quickly re-adjust the clock frequencies according to the system requirements. For further details regarding the frequency adjustment mechanism, please refer to :doc:`Power Management <../../api-reference/system/power_management>`. + +The following graph illustrates the ideal current situation during the operation of the DFS mechanism. + +.. code-block:: text + + Hold CPU and APB MAX lock + │ + │ Release CPU MAX lock + ▲ │ / + Current  │ ▼ / + │ ──────────┐ Release APB MAX lock + │ │ / + │ │ / + │ └─────────┐ + │ ▲ │ + │ │ │ + │ m-th tick │ └─────────── + │ ▲ + │ │ + │ n-th tick │ + └──────────────────────────────────────► + Time + Ideal DFS Mechanism Frequency Adjustment Current Graph + +DFS is suitable for scenarios where the CPU must remain active but low power consumption is required. Therefore, DFS is often activated with other low power modes, as will be detailed in the following sections. + +.. _Light-sleep Mode: + +Light-sleep Mode +--------------------- + +Light-sleep mode is a low power mode preset in the {IDF_TARGET_NAME}. Users can switch to Light-sleep mode by calling :cpp:func:`esp_light_sleep_start` interface. Upon entering sleep, the chip will shut down unnecessary power domains and apply clock gating to modules not in use, based on the current operational states of peripherals. The {IDF_TARGET_NAME} supports various wake-up sources. Please refer to :doc:`Sleep Modes <../../api-reference/system/sleep_modes>` for more information. When the chip wakes up from Light-sleep mode, the CPU continues running from the context it was in before entering sleep, and the operational states of peripherals remain unaffected. To effectively reduce chip power consumption under Light-sleep mode, it is highly recommended that users utilize Auto Light-sleep mode described below. + +Auto Light-sleep mode is a low power mode provided by ESP-IDF :doc:`Power Management <../../api-reference/system/power_management>` component that leverages FreeRTOS's Tickless IDLE feature. When the application releases all power locks and all FreeRTOS tasks are in a blocked or suspended state, the system automatically calculates the next time point when an event will wake the operating system. If this calculated time point exceeds a set duration (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`), the ``esp_pm`` component automatically configures the timer wake-up source and enters light sleep to reduce power consumption. To enable this mode, users need to set the ``light_sleep_enable`` field to true in :cpp:type:`esp_pm_config_t` when configuring DFS. For more details, please refer to `DFS Configuration`_. + +.. code-block:: text + + ┌────────┐ + │ │ + │ DFS │ + │ │ + └───┬────┘ + │ + ▼ + ┌──────────┐ when idle ┌──────────┐ exceed set time ┌──────────┐ + │ │ ─────────────► │ │ ────────────► │ │ + │ │ │ │ │ auto │ + │ active │ │ IDLE │ │ light │ + │ │ │ │ │ sleep │ + │ │ ◄───────────── │ │ │ │ + └──────────┘ not idle └──────────┘ └──────┬───┘ + ▲ │ + │ configure wake-up source │ + └───────────────────────────────────────────────────────────────┘ + + Auto Light-sleep Mode Workflow + +Based on the workflow of Auto Light-sleep mode, its ideal current graph can be obtained, with key nodes marked on the chart. + +.. code-block:: text + + ▲ DFS frequency reduced + Current | │ exceed set idle time + | ▼ / light sleep + | ┌──┐ / ┌──┐ + | │ └──┐ │ └──┐ + | | | | | + | │ │ │ │ + | ───┘ └────────┘ └──── + │ \ + │ wake-up source wakes up + └───────────────────────────────► + Time + Ideal Current Graph of Auto Light-sleep Mode + +.. note:: + + - To better illustrate the main changes of Auto Light-sleep mode, the DFS frequency reduction process is omitted from the graph above. + + - Auto Light-sleep mode is suitable for scenarios where real-time response to external demands is not required. + + - Auto Light-sleep mode operates based on timer wake-up sources. Therefore, users should not manually configure timer wake-up sources in their application. + + +.. _Deep-sleep Mode: + +Deep-sleep Mode +----------------- + +Deep-sleep mode is designed to achieve better power performance by retaining only RTC/LP memory and peripherals during sleep, while all other modules are shut down. Similar to Light-sleep mode, Deep-sleep mode is entered through API calls and requires configuration of wake-up sources for awakening. Users can switch to Deep-sleep mode by calling :cpp:func:`esp_deep_sleep_start` interface. + +Deep-sleep mode requires the configuration of wake-up sources. The {IDF_TARGET_NAME} supports multiple wake-up sources. For a complete list of wake-up sources, please refer to :doc:`Sleep Modes <../../api-reference/system/sleep_modes>`. These wake-up sources can also be combined so that any wake-up source can trigger the awakening. If no wake-up source is configured when entering deep sleep, the chip will remain in sleep state until an external reset occurs. Unlike Light-sleep mode, Deep-sleep mode upon awakening will lose the CPU's running context before, so the bootloader needs to be run again to enter the user program. + +The workflow of Deep-sleep mode is shown as below: + +.. code-block:: text + + ┌───────┐ call API ┌───────┐ + │ ├───────────►│ deep │ + │active │ │ sleep │ + │ │ │ │ + └───────┘ └───┬───┘ + ▲ │ + └────────────────────┘ + wake-up source wakes up + Deep-sleep Mode Workflow + +The primary application scenario of Deep-sleep mode determines that the system will awaken only after a long period and will return to deep sleep state after completing its task. The ideal current graph is as follows. + +.. code-block:: text + + ▲ + Current | + | call API + | │ + | ▼ + | ┌────┐ + | │ │ + | wake-up source| | + | wakes up \ | | + | \ │ │ + │ ──────────┘ └──────────────── + │ + └──────────────────────────────────────────► + Time + Ideal Current Graph of Deep-sleep Mode + +Deep-sleep mode can be utilized in low power sensor applications or situations where data transmission is not required for most of the time, commonly referred to as standby mode. + + +.. only:: ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB + + Devices can wake up periodically from deep sleep to measure and upload data, and then return to deep sleep. Alternatively, it can store multiple data sets in RTC memory and transmit them all at once upon the next wake-up. This feature can be implemented using the deep-sleep-stub functionality. For details, please refer to :doc:`Deep-sleep Wake Stubs <../../api-guides/deep-sleep-stub>`. + +Low Power Mode Configuration on Pure System +---------------------------------------------- + +After introducing low power modes from a systemic perspective, this section will present common configuration options, recommended configuration options for each mode, and configurations steps. + +Common Configuration Options +------------------------------------ + +.. note:: + + The configuration options below are briefly introduced. For more detailed information, please click the link behind each option. + +.. only:: esp32 or esp32s3 + + - single/dual core operation mode (:ref:`CONFIG_FREERTOS_UNICORE`) + For multi-core chips, the single core operation mode can be selected. + + + - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + This parameter denotes the frequency of the system's periodic task scheduling. + + +DFS Configuration +------------------------ + +DFS offers the following configurable options: + +- ``max_freq_mhz`` + This parameter denotes the maximum CPU frequency (MHz), i.e., the frequency at which the CPU operates at its highest performance level. It is typically set to the maximum value specified by the chip parameters. + +- ``min_freq_mhz`` + This parameter denotes the minimum CPU frequency (MHz), i.e., the CPU's operating frequency when the system is in an idle state. This field can be set to the crystal oscillator (XTAL) frequency value or the XTAL frequency value divided by an integer. + +- ``light_sleep_enable`` + Enabling this option allows the system to automatically enter the light sleep during idle periods, i.e., enabling Auto Light-sleep mode, as detailed earlier. + +Specific configuration steps are as follows: + +1. Enable :ref:`CONFIG_PM_ENABLE` +2. Configure ``max_freq_mhz`` and ``min_freq_mhz`` as follows: + + :: + + esp_pm_config_t pm_config = { + .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, + .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, + .light_sleep_enable = false + }; + ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); + +Recommended Configuration +++++++++++++++++++++++++++++ + +.. list-table:: + :header-rows: 1 + :widths: 40 20 + + * - Configuration Name + - Configuration Status + + * - Enable power management component (:ref:`CONFIG_PM_ENABLE`) + - ON + + * - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + - 1000 + + * - ``max_freq_mhz`` + - 160 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - false + +.. note:: + Configurations not mentioned in the above table are set to default. + + +Light-sleep Mode Configuration +--------------------------------- + +This section introduces the recommended configuration and configuration steps for Auto Light-sleep mode. + +.. note:: + + The configuration options below are briefly introduced. For more detailed information, please click the link behind each option. + +- Minimum IDLE Tick count before entering sleep state (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`) +- Put light sleep related codes in IRAM (:ref:`CONFIG_PM_SLP_IRAM_OPT`) +- Put RTOS IDLE related codes in IRAM (:ref:`CONFIG_PM_RTOS_IDLE_OPT`) +- RTC slow clock source (:ref:`CONFIG_RTC_CLK_SRC`) + + .. list-table:: + :header-rows: 1 + :widths: 40 40 20 + + * - Clock Source + - Timer Accuracy + - Frequency Offset + + * - RTC_CLK_SRC_INT_RC + - High + - Large + + * - RTC_CLK_SRC_EXT_CRYS + - Low + - Small + +- Disable all GPIO when chip at sleep (:ref:`CONFIG_PM_SLP_DISABLE_GPIO`) + +.. only:: SOC_PM_SUPPORT_MAC_BB_PD + + - Power down MAC and baseband (:ref:`CONFIG_ESP_PHY_MAC_BB_PD`) + + +.. only:: SOC_PM_SUPPORT_CPU_PD + + - Power down CPU (:ref:`CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP`) + + +.. only:: SOC_PM_SUPPORT_TAGMEM_PD + + - Power down I/D-cache tag memory (:ref:`CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP`) + + +.. only:: SOC_PM_SUPPORT_VDDSDIO_PD + + - Power down flash in light sleep (:ref:`CONFIG_ESP_SLEEP_POWER_DOWN_FLASH`) + + .. only:: SOC_SPIRAM_SUPPORTED + + Due to the shared power pins between flash and PSRAM, cutting power to PSRAM would result in data loss. Therefore, to ensure light sleep does not disrupt program execution, enabling this option requires that the system does not utilize PSRAM. + + +Configuration Steps: + +1. Configure wake-up sources (refer to :doc:`Sleep Modes <../../api-reference/system/sleep_modes>` for details) +2. Enable :ref:`CONFIG_PM_ENABLE` +3. Enable :ref:`CONFIG_FREERTOS_USE_TICKLESS_IDLE` +4. Configure DFS parameters +5. ``light_sleep_enable`` = true, detailed as follows: + + :: + + esp_pm_config_t pm_config = { + .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, + .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, + #if CONFIG_FREERTOS_USE_TICKLESS_IDLE + .light_sleep_enable = true + #endif + }; + ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); + +6. Additional relevant parameters for configuration introduction + +Recommended Configuration ++++++++++++++++++++++++++++++ + +.. only:: esp32c3 or esp32s3 + + .. list-table:: + :header-rows: 1 + :widths: 30 15 + + * - Configuration Name + - Configuration Status + + * - Enable power management component (:ref:`CONFIG_PM_ENABLE`) + - ON + + * - Enable RTOS Tickless IDLE mode (:ref:`CONFIG_FREERTOS_USE_TICKLESS_IDLE`) + - ON + + * - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + - 1000 + + * - Minimum IDLE Tick count before entering sleep mode (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`) + - 3 + + * - Put light sleep related codes in IRAM (:ref:`CONFIG_PM_SLP_IRAM_OPT`) + - OFF + + * - Put RTOS IDLE related codes in IRAM (:ref:`CONFIG_PM_RTOS_IDLE_OPT`) + - OFF + + * - RTC slow clock source (:ref:`CONFIG_RTC_CLK_SRC`) + - Internal 150 kHz OSC + + * - Disable all GPIO when chip at sleep (:ref:`CONFIG_PM_SLP_DISABLE_GPIO`) + - ON + + * - Power down MAC and baseband (:ref:`CONFIG_ESP_PHY_MAC_BB_PD`) + - ON + + * - Power down CPU (:ref:`CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP`) + - ON + +.. only:: SOC_PM_SUPPORT_TAGMEM_PD + + * - Power down I/D-cache tag memory (:ref:`CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP`) + - ON + + + * - Power down flash in light sleep (:ref:`CONFIG_ESP_SLEEP_POWER_DOWN_FLASH`) + - OFF + + * - ``max_freq_mhz`` + - 160 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - true + + .. note:: + Configurations not mentioned in the above table are set to default. + +.. only:: esp32 or esp32s2 + + .. list-table:: + :header-rows: 1 + :widths: 30 15 + + * - Configuration Name + - Configuration Status + + * - Enable power management component (:ref:`CONFIG_PM_ENABLE`) + - ON + + * - Enable RTOS Tickless IDLE mode (:ref:`CONFIG_FREERTOS_USE_TICKLESS_IDLE`) + - ON + + * - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + - 1000 + + * - Minimum IDLE Tick count before entering sleep mode (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`) + - 3 + + * - Put light sleep related codes in IRAM (:ref:`CONFIG_PM_SLP_IRAM_OPT`) + - OFF + + * - Put RTOS IDLE related codes in IRAM (:ref:`CONFIG_PM_RTOS_IDLE_OPT`) + - OFF + + * - RTC slow clock source (:ref:`CONFIG_RTC_CLK_SRC`) + - Internal 150 kHz OSC + + * - Disable all GPIO when chip at sleep (:ref:`CONFIG_PM_SLP_DISABLE_GPIO`) + - ON + + * - ``max_freq_mhz`` + - 160 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - true + + .. note:: + Configurations not mentioned in the above table are set to default. + +.. only:: esp32c2 + + .. list-table:: + :header-rows: 1 + :widths: 30 15 + + * - Configuration Name + - Configuration Status + + * - Enable power management component (:ref:`CONFIG_PM_ENABLE`) + - ON + + * - Enable RTOS Tickless IDLE mode (:ref:`CONFIG_FREERTOS_USE_TICKLESS_IDLE`) + - ON + + * - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + - 1000 + + * - Minimum IDLE Tick count before entering sleep mode (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`) + - 3 + + * - Put light sleep related codes in IRAM (:ref:`CONFIG_PM_SLP_IRAM_OPT`) + - OFF + + * - Put RTOS IDLE related codes in IRAM (:ref:`CONFIG_PM_RTOS_IDLE_OPT`) + - OFF + + * - RTC slow clock source (:ref:`CONFIG_RTC_CLK_SRC`) + - Internal 150 kHz OSC + + * - Disable all GPIO when chip at sleep (:ref:`CONFIG_PM_SLP_DISABLE_GPIO`) + - ON + + * - Power down flash in light sleep (:ref:`CONFIG_ESP_SLEEP_POWER_DOWN_FLASH`) + - OFF + + * - ``max_freq_mhz`` + - 120 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - true + + .. note:: + Configurations not mentioned in the above table are set to default. + +Deep-sleep Mode Configuration +--------------------------------- + +For Deep-sleep mode, other configurations are of minimal significance except wake-up source-related configurations. + +Configuration Steps: + +1. Configure wake-up sources (refer to :doc:`Sleep Modes <../../api-reference/system/sleep_modes>` for details) +2. Call the API, as follows + +.. code-block:: none + + /* Enter deep sleep */ + esp_deep_sleep_start(); + +Users can keep specific modules powered on during sleep using the following configuration options: + +- Power up External 40 MHz XTAL + In some special applications, certain modules require high clock accuracy and stability during sleep (e.g., BT). In such cases, it is recommended to enable the External 40 MHz XTAL during sleep. + Code to enable and disable, as follows:: + + ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_ON)); + ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_OFF)); + +- Power up Internal 8 MHz OSC + In some special applications, certain modules (e.g., LEDC) use the Internal 8 MHz OSC as a clock source and need to function normally during light sleep. In such cases, it is recommended to enable the Internal 8 MHz OSC during sleep. + Code to enable and disable, as follows:: + + ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_RTC8M, ESP_PD_OPTION_ON)); + ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_RTC8M, ESP_PD_OPTION_OFF)); diff --git a/docs/en/api-guides/low-power-mode/low-power-mode-wifi.rst b/docs/en/api-guides/low-power-mode/low-power-mode-wifi.rst new file mode 100644 index 00000000000..9f2d4fefb1d --- /dev/null +++ b/docs/en/api-guides/low-power-mode/low-power-mode-wifi.rst @@ -0,0 +1,417 @@ +Introduction to Low Power Mode in Wi-Fi Scenarios +================================================== + +:link_to_translation:`zh_CN:[中文]` + +After the previous introduction to low power mode from a systemic perspective, this section delves into low power mode in Wi-Fi scenarios. Due to the complexity of Wi-Fi scenarios, basic principles of Wi-Fi power saving will be introduced before specific low power mode. This section is focused on station mode. + +Choosing Low Power Mode in Wi-Fi Scenarios +--------------------------------------------- + +To help users select appropriate low power mode, a summary table of low power modes in Wi-Fi scenarios is provided before detailed introduction. + +.. todo - add sleep-current/esp32c5_summary.inc + +.. only:: not esp32c5 + + .. include:: ../sleep-current/{IDF_TARGET_PATH_NAME}_summary.inc + +.. note:: + + All currents in the table are average currents, and the terms in the table are explained in the following text. Users can refer to them as needed. + +.. _Basic Principles of Wi-Fi Power Saving: + +Basic Principles of Wi-Fi Power Saving +---------------------------------------- + +Firstly, during the operation of a station, prolonged channel monitoring is required to avoid conflicts during transmission and reception. It leads to significant energy consumption as the RF module remains active, thus wasting power. Therefore, Wi-Fi protocols introduce power-saving modes. + +The basic principle of power-saving mode is to reduce energy consumption by minimizing unnecessary monitoring time. Access points (APs) will cache packets for a station that has entered power-saving mode. At the same time, it will periodically send beacon frames containing Traffic Indication Map (TIM) information. TIM indicates the unicast packets cached by the AP. Within TIM, the Delivery Traffic Indication Message (DTIM) is special as it caches broadcast packets and sends them out periodically every n TIM intervals (determined by the AP). For stations, TIM is optional listening, while DTIM is mandatory listening. Therefore, station can choose to wake up only before each DTIM frame to power up Wi-Fi-related modules (RF modules) instead of constantly being in listening state. This effectively reduces power consumption. + +.. code-block:: text + + DTIM DTIM + TIM │ │ + │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ + AP ───┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴──── + + + ┌────┐ ┌────┐ + │ │ │ │ + │ │ │ │ + │ │ │ │ + Sta ────────────────┴────┴─────────────┴────┴───────────────── + + DTIM4 Power Saving Mode Diagram + +Second, the time from powering up to powering down Wi-Fi related modules in a station also affects power consumption. Apart from the necessary time for data transmission processing, there are four configurations mainly affecting the duration: + + - Time offset caused by clock accuracy. The main reason is that clocks may deviate from ideal time to some extent, and the deviation can be positive or negative. + - Time spent processing missed beacon frames, such as the duration of continuous listening after a missed beacon, the maximum allowable number of missed beacons, etc. The existence and duration of this period are uncertain but can be configured within a range. + - Active time added to ensure the reception of burst data packets, which can be determined by configuration. + - ILDE time is required for specific power-saving modes to meet entry conditions. Therefore, reducing the working time can improve power performance while meeting communication requirements. + +.. code-block:: text + + ┌────────────┬────────────┬────────────┬────────────┬────────────┐ + │ │ │ time spent │ │ │ + │time offset │ necessary │ processing │ active time│ IDLE time │ + │ │ processing │ missed │ │ │ + │ │ time │ beacon │ │ │ + └────────────┴────────────┴────────────┴────────────┴────────────┘ + Chip Operation Time Overview + +Furthermore, when the station is not in a Wi-Fi transmission or reception state, other modules begin to affect the chip's power consumption. Different power-saving modes will configure different clock sources or dynamically adjust the operating frequencies of certain modules such as the CPU, while also shutting down varying numbers of functional modules, which effectively reduces the power consumption. Users can select suitable configurations according to their needs. + +If time is plotted on the horizontal axis and current on the vertical axis, then the ideal current consumption graph of the chip under low power mode can be simplified as shown below: + +.. code-block:: text + + ▲ + Current | + | + | interval period + | │ ◄──────────► │ │ ◄─► │ + | ┌─────┐ ┌─────┐ ┌─────┐ + | │ │ │ │ │ │ + | | | | | | | base current + | | | | | | | | + | | | | | | | ▼ + | ───┘ └────────┘ └────────┘ └────── + | + └───────────────────────────────────────────────► + Time + Ideal Current Graph of the Chip Under Low Power Mode + +When the station needs to engage in Wi-Fi communication, the Wi-Fi-related modules (PHY) are activated, causing a significant increase in current. The current remains at a relatively high level until the task is completed. After that, the chip will deactivate the Wi-Fi-related modules, causing the current to decrease to a lower level. + +Three main factors affect power consumption performance: interval, period, and base current. + + - **Interval** refers to the interval at which the station's Wi-Fi-related modules operate. It can be customized by low power mode or determined by the DTIM interval according to Wi-Fi protocol power-saving mechanisms (see first part in :ref:`Basic Principles of Wi-Fi Power Saving`). Generally, a larger interval leads to better power performance under the same conditions. But it also results in slower response times, affecting communication timeliness. + + - **Period** can be seen as the duration of each time the station's Wi-Fi operates, which also affects power performance. The period is not fixed (see second part in :ref:`Basic Principles of Wi-Fi Power Saving`). In ensuring normal Wi-Fi communication, a shorter period leads to better power performance. However, reducing the period will inevitably affect communication reliability. + + - **Base current** refers to the current of the chip when the Wi-Fi-related modules are not active. It is influenced by various factors. Different power-saving modes have different sleep strategies. Therefore, optimizing the configuration to reduce the base current can improve power performance. But closing other modules will affect related functions and the wake-up time of the chip. + +Therefore, power consumption can be reduced by considering the three aspects. Next, Modem-sleep mode and Auto Light-sleep mode will be introduced. The main difference between the two modes lies in the optimization of these three factors. + + +Modem-sleep Mode +---------------- + +The main principle of Modem-sleep mode is based on the DTIM mechanism. In this mode, the chip periodically wakes up for Wi-Fi-related tasks, and enters sleep state between intervals to power down PHY (RF module) to reduce power consumption. Besides, through the DTIM mechanism, the station can maintain Wi-Fi connection and data transmission with the AP. + +Modem-sleep mode automatically enters sleep after the Wi-Fi task ends without the need to call an API. During sleep, only the Wi-Fi-related modules (PHY) are closed, while other modules remain in power-up state. + +Modem-sleep mode will wake up according to the DTIM interval or listen interval (as introduced below in :ref:`Modem-sleep Mode Configuration`), acting as if the system has automatically set a Wi-Fi wake-up source. Therefore, users do not need to configure a wake-up source. The system can also wake up when actively sending packets. + +Modem-sleep mode is a toggle mode that automatically runs after calling the API to activate it. Its workflow is very clear, as shown in the diagram below. + +.. code-block:: text + + ┌───────────┐ Wi-Fi task finished ┌───────────┐ + │ ├─────────────────────────────►│ modem │ + │ active │ │ sleep │ + │ │◄─────────────────────────────┤ │ + └───────────┘ DTIM interval activated └───────────┘ + / sending packets + + Modem-sleep Mode Workflow + +Based on the base current graph provided above and combined with the operating principle of Modem-sleep mode, an ideal current graph can be derived, taking Min Modem-sleep mode (as introduced below in :ref:`Modem-sleep Mode Configuration`) as an example. + +.. code-block:: text + + ▲ + Current| + | DTIM interval + | │ ◄──────────► │ + | ┌─────┐ ┌─────┐ ┌─────┐ + | before │ │ │ │ │ │ + | DTIM | | | | | | Wi-Fi task + | interval| | | | | | finished + |activated | | | | | | / + | \ │ │ │ │ │ │/ + | ────────┘ └────────┘ └────────┘ └────── + | + └─────────────────────────────────────────────────────► + Time + Ideal Current Graph of Min Modem-sleep Mode + +Modem-sleep mode is generally used in scenarios where the CPU needs to remain active and maintain a Wi-Fi connection. For example, it is utilized to realize local voice wake-up by the {IDF_TARGET_NAME}, where the CPU continuously collects and processes audio data. + +DFS + Modem-sleep Mode +------------------------ + +In Modem-sleep mode, the CPU remains active while the DFS mechanism primarily adjusts the CPU and APB operating frequencies to reduce power consumption. Therefore, combining DFS with Modem sleep mode can further optimize power performance. Additionally, as the Wi-Fi task requests the :cpp:enumerator:`ESP_PM_CPU_FREQ_MAX` power lock to ensure the rapid execution of Wi-Fi tasks, frequency adjustment by DFS and Modem-sleep mode only occurs during the base current phase, which is after the Wi-Fi task ends. + +In Wi-Fi scenarios, to help users understand main changes, the state of DFS can be simplified. Specifically, although DFS primarily adjusts frequencies based on the maximum demands of the CPU and APB locks, in Wi-Fi scenarios, the CPU frequency needs to be maximized for operation. Besides, after the Wi-Fi task ends, it can be ideally assumed that no other tasks need to be completed, and that after some time, both locks are released to enter IDLE state. This simplified situation also ignores any current variations caused by changes in the locks during this time. + +In Wi-Fi scenarios, the flowchart of DFS csn be simplified as follows: + +.. code-block:: text + + ┌────────┐ + │ │ + │ DFS │ + │ │ + └───┬────┘ + │ + ▼ + ┌──────────┐ when IDLE ┌──────────┐ + │ │ ─────────────► │ │ + │ │ │ │ + │ active │ │ IDLE │ + │ │ │ │ + │ │ ◄───────────── │ │ + └──────────┘ not IDLE └──────────┘ + + Simplified Flowchart of DFS in the Wi-Fi Scenario + +The system transitions between active state and IDLE state in Wi-Fi scenarios. After the Wi-Fi task is completed, the system releases all locks after a period of time and enters the IDLE state. At this point, the DFS mechanism reduces the frequency to the set minimum value, ignoring the frequency adjustment actions during the state transition, which facilitates understanding. + +The DFS + Modem-sleep mode's ideal current graph is simplified as below: + +.. code-block:: text + + ▲ Wi-Fi task finished + Current | / modem sleep + | / + | ┌─────┐ ┌─────┐ + | │ │ │ │ + | | | | | lock released + | | | | | DFS frequency + | | | | | reduced + | | | | | / IDLE + | | | | | / + | | │ | │ / + | │ └─┐ │ └─┐ + | ────────┘ └───────────────┘ └───────── + | + └─────────────────────────────────────────────────────► + Time + DFS + Modem-sleep Mode's Ideal Current Graph + +Auto Light-sleep Mode + Wi-Fi Scenario +---------------------------------------- + +Auto Light-sleep mode combines the ESP-IDF power management mechanism, the DTIM mechanism, and Light-sleep mode in Wi-Fi scenarios. Enabling power management is a prerequisite of this mode, and its auto aspect is demonstrated by the system automatically entering Light-sleep after being in the IDLE state for a set duration. Additionally, auto Auto Light-sleep mode adheres to the DTIM mechanism. The system will automatically wake up to maintain Wi-Fi connection with AP. + +In the Wi-Fi environment, the sleep mechanism of Auto Light-sleep mode remains consistent with that of the pure system. It still relies on the power management mechanism, where the condition for entering sleep is when the system has been IDLE for a duration exceeding the set time. The system will assess if the IDLE time meets the conditions, and if so, it will directly enter sleep. This process is automatic. During sleep, RF, the 8 MHz oscillator, the 40 MHz high-speed crystal oscillator, PLL, and gated digital core clock are automatically turned off, and CPU operation is suspended. + +In the Wi-Fi environment, the Auto Light-sleep mode follows the DTIM mechanism. The system will automatically wake up before the arrival of DTIM frames, as if a Wi-Fi wake-up source has been set. Therefore, there is no need for configuration. Additionally, the system can be awakened when actively sending packets. + +The operation workflow of Auto Light-sleep mode in the Wi-Fi environment is relatively complex, but it is entirely automated throughout. Specific details are illustrated in the diagram. + +.. code-block:: text + + ┌────────┐ + │ │ + │ DFS │ + │ │ + └───┬────┘ + │ + ▼ + ┌──────────┐ when IDLE ┌──────────┐ exceed set time ┌──────────┐ + │ │ ─────────────► │ │ ────────────► │ │ + │ │ │ │ │ auto │ + │ active │ │ IDLE │ │ light │ + │ │ │ │ │ sleep │ + │ │ ◄───────────── │ │ │ │ + └──────────┘ not IDLE └──────────┘ └──────┬───┘ + ▲ │ + │ DTIM interval activated / sending packets │ + └───────────────────────────────────────────────────────────────┘ + + Auto Light-sleep Mode Workflow + +In Wi-Fi scenarios, Auto Light-sleep mode is often enabled simultaneously with Modem-sleep mode. Here, an ideal current graph of Modem + Auto Light-sleep mode is provided, with key nodes marked on the graph. + +.. code-block:: text + + DTIM interval + ▲ │ ◄───────────────────► │ + Current | ┌─────┐ ┌─────┐ + | │ │ \ │ │ + | | | \ | | + | | | Wi-Fi task | | + | | | finished | | + | | | modem sleep | | + | before | | | | IDLE time + | DTIM | | IDLE | | exceeds set time + | activated| │ DFS frequency | │ light sleep + | \ | └─┐ / reduced | └─┐ / + | \ │ └─┐ / │ └─┐ / + | ────────┘ └─────────────┘ └───────── + | + └─────────────────────────────────────────────────────► + Time + Ideal Current Graph of Modem + Auto Light-sleep Mode + +In the Wi-Fi environment, Auto Light-sleep mode can be utilized to maintain Wi-Fi connection and respond promptly to data sent by AP. Additionally, the CPU can remain IDLE when no commands are received. For example, in applications such as Wi-Fi switches, the CPU is mostly IDLE until it receives a control command to operate on GPIO. + + +Deep-sleep Mode + Wi-Fi Scenario +----------------------------------- + +The Deep-sleep mode in Wi-Fi scenarios is essentially the same as in a pure system. For details, please refer to :ref:`Deep-sleep Mode`. Here, it will not be further discussed. + + +Low Power Mode Configuration in Wi-Fi Scenarios +----------------------------------------------------- + +After introducing the low power mode in Wi-Fi scenarios, this section will cover common configuration options, unique configuration options for each mode, and instructions for using the corresponding low power mode APIs. Additionally, recommendations for the respective modes' configurations (including recommended configurations for pure systems) will be provided, along with specific performance details. + +.. note:: + + The configuration options below are briefly introduced. For more detailed information, please click the link behind each option. + +Common Configuration Options +++++++++++++++++++++++++++++++++ + +- Power consumption related: + + - Max Wi-Fi TX power (dBm) (:ref:`CONFIG_ESP_PHY_MAX_WIFI_TX_POWER`) + +- Speed optimization related: + + - Wi-Fi IRAM speed optimization (:ref:`CONFIG_ESP_WIFI_IRAM_OPT`) + - Wi-Fi RX IRAM speed optimization (:ref:`CONFIG_ESP_WIFI_RX_IRAM_OPT`) + - Wi-Fi Sleep IRAM speed optimization (:ref:`CONFIG_ESP_WIFI_SLP_IRAM_OPT`) + + +- Wi-Fi Protocol related: + + - Minimum active time (:ref:`CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME`) + + - Maximum keep alive time (:ref:`CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME`) + + - Send gratuitous ARP periodically (:ref:`CONFIG_LWIP_ESP_GRATUITOUS_ARP`) + + - Wi-Fi sleep optimize when beacon lost (:ref:`CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT`) + + +.. _Modem-sleep Mode Configuration: + +Modem-sleep Mode Configuration +++++++++++++++++++++++++++++++++ + +- Configurable Options + + - Min Modem + This parameter indicates that the station operates according to the DTIM cycle. It wakes up before each DTIM to receive beacon frames, which ensures that broadcast information is not missed. However, the DTIM cycle is determined by the AP. If the DTIM cycle is short, the power saving effect will be reduced. + + - Max Modem + This parameter indicates that the station customizes a listen interval and wakes up to receive beacon frames at intervals defined by the listen interval. This approach saves power when the listen interval is large but may lead to missed DTIMs and broadcast data. + + +- Configuration Steps + + - Call the API and select the mode parameters + + .. code-block:: none + + typedef enum { + WIFI_PS_NONE, + WIFI_PS_MIN_MODEM, + WIFI_PS_MAX_MODEM, + } wifi_ps_type_t; + esp_err_t esp_wifi_set_ps(wifi_ps_type_t type); + + If WIFI_PS_MAX_MODEM is selected, the listen interval also needs to be configured. An example is provided below:: + + #define LISTEN_INTERVAL 3 + wifi_config_t wifi_config = { + .sta = { + .ssid = "SSID", + .password = "Password", + .listen_interval = LISTEN_INTERVAL, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + +- Recommended Configuration + + The recommended configuration provided here is for Min Modem-sleep mode + DFS. + + .. list-table:: + :header-rows: 1 + :widths: 20 15 + + * - Configuration Name + - Configuration Status + + * - WIFI_PS_MIN_MODEM + - ON + + * - CONFIG_PM_ENABLE + - ON + + * - RTOS Tick rate (Hz) + - 1000 + + * - ``max_freq_mhz`` + - 160 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - false + +- Configuration Performance + + .. todo - add sleep-current/esp32c5_modem_sleep.inc + + .. only:: not esp32c5 + + .. include:: ../sleep-current/{IDF_TARGET_PATH_NAME}_modem_sleep.inc + + +Auto Light-sleep Mode + Wi-Fi Scenario Configuration ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Auto Light-sleep mode in Wi-Fi scenarios does not require wake-up source configuration compared with a pure system. But the remaining part of configuration is basically the same in the two operation scenarios. Therefore, detailed introduction of configurable options, configuration steps, and recommended configurations can be found in the previous section :ref:`Deep-sleep Mode`, with the Wi-Fi-related configurations set to default. + +- Configuration Performance + + The configuration performance mirrors that of the recommended Auto Light-sleep mode configuration in a pure system, combined with the default Wi-Fi-related configurations in the Wi-Fi environment. + + .. todo - add sleep-current/esp32c5_light_sleep.inc + + .. only:: not esp32c5 + + .. include:: ../sleep-current/{IDF_TARGET_PATH_NAME}_light_sleep.inc + +Deep-sleep Mode + Wi-Fi Scenario Configuration +++++++++++++++++++++++++++++++++++++++++++++++++ + +Deep-sleep mode configuration in Wi-Fi scenarios is essentially the same as in a pure system. Therefore, detailed introduction of configurable options, configuration steps, and recommended configurations can be found in the previous section :ref:`Deep-sleep Mode`, with the Wi-Fi-related configurations set to default. + +- Configuration Performance + + The performance of this configuration mirrors that of the recommended Deep-sleep mode configuration in a pure system, combined with the default Wi-Fi-related configurations in the Wi-Fi environment. + + .. only:: esp32 + + Average current approximately 5.0 μA + + .. only:: esp32s2 + + Average current approximately 5.0 μA + + .. only:: esp32s3 + + Average current approximately 6.9 μA + + .. only:: esp32c3 + + Average current approximately 4.8 μA + + .. only:: esp32c2 + + Average current approximately 4.9 μA diff --git a/docs/en/api-guides/sleep-current/esp32_light_sleep.inc b/docs/en/api-guides/sleep-current/esp32_light_sleep.inc index 6ab92a2d773..83885a187ec 100644 --- a/docs/en/api-guides/sleep-current/esp32_light_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32_light_sleep.inc @@ -1 +1,27 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32_light_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 20 20 20 + + * - CPU frequency + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - 1 + - 3.34 + - 129.36 + - 1.35 + + * - 160 MHz + - 3 + - 2.33 + - 130.17 + - 1.33 + + * - 160 MHz + - 10 + - 2.19 + - 129.87 + - 1.32 diff --git a/docs/en/api-guides/sleep-current/esp32_modem_sleep.inc b/docs/en/api-guides/sleep-current/esp32_modem_sleep.inc index b5f2fc45d0a..28f0b8cd2cf 100644 --- a/docs/en/api-guides/sleep-current/esp32_modem_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32_modem_sleep.inc @@ -1 +1,52 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32_modem_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 10 20 20 20 + + * - CPU frequency + - DFS + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - ON + - 1 + - 22.65 + - 133.03 + - 5.48 + + * - 160 MHz + - OFF + - 1 + - 31.12 + - 253.74 + - 27.18 + + * - 160 MHz + - ON + - 3 + - 21.89 + - 247.68 + - 5.25 + + * - 160 MHz + - OFF + - 3 + - 28.81 + - 209.42 + - 27.77 + + * - 160 MHz + - ON + - 10 + - 20.01 + - 216.51 + - 6.02 + + * - 160 MHz + - OFF + - 10 + - 29.66 + - 114.17 + - 27.77 diff --git a/docs/en/api-guides/sleep-current/esp32_summary.inc b/docs/en/api-guides/sleep-current/esp32_summary.inc index 4fe70a27105..b355d04a528 100644 --- a/docs/en/api-guides/sleep-current/esp32_summary.inc +++ b/docs/en/api-guides/sleep-current/esp32_summary.inc @@ -1 +1,69 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32_summary.inc +.. list-table:: + :header-rows: 1 + :widths: 20 20 30 20 20 + + * - Item + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep + + * - Sleep + - Automatic + - Automatic + - Automatic + - Manual + + * - Wake-up + - Automatic + - Automatic + - Automatic + - Configure Wake-up Source + + * - Wi-Fi Connection + - Maintain + - Maintain + - Maintain + - Disconnect + + * - CPU + - On + - On/Throttled + - Paused + - Off + + * - System Clock + - On + - On + - Off + - Off + + * - Peripherals + - On + - On + - On + - Off + + * - DTIM1 + - 31.12 mA + - 22.65 mA + - 3.34 mA + - / + + * - DTIM3 + - 28.81 mA + - 21.89 mA + - 2.33 mA + - / + + * - DTIM10 + - 29.66 mA + - 20.01 mA + - 2.19 mA + - / + + * - Average Current + - / + - / + - / + - 5 μA diff --git a/docs/en/api-guides/sleep-current/esp32c2_light_sleep.inc b/docs/en/api-guides/sleep-current/esp32c2_light_sleep.inc index eb64d575141..baeb860a5b2 100644 --- a/docs/en/api-guides/sleep-current/esp32c2_light_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32c2_light_sleep.inc @@ -1 +1,27 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c2_light_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 20 20 20 + + * - CPU frequency + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 120 MHz + - 1 + - 1.6 + - 67.8 + - 0.12 + + * - 120 MHz + - 3 + - 0.71 + - 66.5 + - 0.12 + + * - 120 MHz + - 10 + - 0.39 + - 64.8 + - 0.12 diff --git a/docs/en/api-guides/sleep-current/esp32c2_modem_sleep.inc b/docs/en/api-guides/sleep-current/esp32c2_modem_sleep.inc index 4df53ed0b4a..2756825ce1c 100644 --- a/docs/en/api-guides/sleep-current/esp32c2_modem_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32c2_modem_sleep.inc @@ -1 +1,52 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c2_modem_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 10 20 20 20 + + * - CPU frequency + - DFS + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 120 MHz + - ON + - 1 + - 7.5 + - 65.9 + - 6.0 + + * - 120 MHz + - OFF + - 1 + - 13.6 + - 221.5 + - 12.6 + + * - 120 MHz + - ON + - 3 + - 6.9 + - 65.4 + - 6.0 + + * - 120 MHz + - OFF + - 3 + - 13.0 + - 220.2 + - 12.6 + + * - 120 MHz + - ON + - 10 + - 6.6 + - 64.9 + - 6.0 + + * - 120 MHz + - OFF + - 10 + - 12.9 + - 216.8 + - 12.6 diff --git a/docs/en/api-guides/sleep-current/esp32c2_summary.inc b/docs/en/api-guides/sleep-current/esp32c2_summary.inc index c7c272ab737..1b7b9054595 100644 --- a/docs/en/api-guides/sleep-current/esp32c2_summary.inc +++ b/docs/en/api-guides/sleep-current/esp32c2_summary.inc @@ -1 +1,69 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c2_summary.inc +.. list-table:: + :header-rows: 1 + :widths: 20 20 30 20 20 + + * - Item + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep + + * - Sleep + - Automatic + - Automatic + - Automatic + - Manual + + * - Wake-up + - Automatic + - Automatic + - Automatic + - Configure Wake-up Source + + * - Wi-Fi Connection + - Maintain + - Maintain + - Maintain + - Disconnect + + * - CPU + - On + - On/Throttled + - Paused + - Off + + * - System Clock + - On + - On + - Off + - Off + + * - Peripherals + - On + - On + - On + - Off + + * - DTIM1 + - 13.6 + - 7.5 + - 1.6 + - / + + * - DTIM3 + - 13.0 + - 6.9 + - 0.71 + - / + + * - DTIM10 + - 12.9 + - 6.6 + - 0.39 + - / + + * - Average Current + - / + - / + - / + - 4.9 μA diff --git a/docs/en/api-guides/sleep-current/esp32c3_light_sleep.inc b/docs/en/api-guides/sleep-current/esp32c3_light_sleep.inc index 40bdf50d444..483ff33d389 100644 --- a/docs/en/api-guides/sleep-current/esp32c3_light_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32c3_light_sleep.inc @@ -1 +1,27 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c3_light_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 20 20 20 + + * - CPU frequency + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - 1 + - 1.4 + - 87.26 + - 0.14 + + * - 160 MHz + - 3 + - 0.62 + - 86.33 + - 0.14 + + * - 160 MHz + - 10 + - 0.31 + - 86.11 + - 0.14 diff --git a/docs/en/api-guides/sleep-current/esp32c3_modem_sleep.inc b/docs/en/api-guides/sleep-current/esp32c3_modem_sleep.inc index 89ee0eca2f0..276d7493932 100644 --- a/docs/en/api-guides/sleep-current/esp32c3_modem_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32c3_modem_sleep.inc @@ -1 +1,52 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c3_modem_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 10 20 20 20 + + * - CPU frequency + - DFS + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - ON + - 1 + - 11.35 + - 83.31 + - 5.03 + + * - 160 MHz + - OFF + - 1 + - 21.47 + - 191.53 + - 20.58 + + * - 160 MHz + - ON + - 3 + - 10.71 + - 82.82 + - 5.09 + + * - 160 MHz + - OFF + - 3 + - 20.82 + - 82.98 + - 20.48 + + * - 160 MHz + - ON + - 10 + - 10.32 + - 81.05 + - 5.74 + + * - 160 MHz + - OFF + - 10 + - 20.67 + - 229.83 + - 20.48 diff --git a/docs/en/api-guides/sleep-current/esp32c3_summary.inc b/docs/en/api-guides/sleep-current/esp32c3_summary.inc index b0d5b07fe78..d53be086c4a 100644 --- a/docs/en/api-guides/sleep-current/esp32c3_summary.inc +++ b/docs/en/api-guides/sleep-current/esp32c3_summary.inc @@ -1 +1,69 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c3_summary.inc +.. list-table:: + :header-rows: 1 + :widths: 20 20 30 20 20 + + * - Item + - Modem-sleep + - Modem-sleep+DFS + - Auto Ligh-sleep + - Deep-sleep + + * - Sleep + - Automatic + - Automatic + - Automatic + - Manual + + * - Wake-up + - Automatic + - Automatic + - Automatic + - Configure Wake-up Source + + * - Wi-Fi Connection + - Maintain + - Maintain + - Maintain + - Disconnect + + * - CPU + - On + - On/Throttled + - Paused + - Off + + * - System Clock + - On + - On + - Off + - Off + + * - Peripherals + - On + - On + - On + - Off + + * - DTIM1 + - 21.47 mA + - 11.35 mA + - 1.4 mA + - / + + * - DTIM3 + - 20.82 mA + - 10.71 mA + - 0.62 mA + - / + + * - DTIM10 + - 20.67 mA + - 10.32 mA + - 0.31 mA + - / + + * - Average Current + - / + - / + - / + - 4.8 μA diff --git a/docs/en/api-guides/sleep-current/esp32c6_light_sleep.inc b/docs/en/api-guides/sleep-current/esp32c6_light_sleep.inc index d24f1d2a054..7164ca9083f 100644 --- a/docs/en/api-guides/sleep-current/esp32c6_light_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32c6_light_sleep.inc @@ -1 +1,27 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c6_light_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 20 20 20 + + * - CPU frequency + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - 1 + - 0.919 + - 103.149 + - 0.053 + + * - 160 MHz + - 3 + - 0.368 + - 102.428 + - 0.052 + + * - 160 MHz + - 10 + - 0.172 + - 102.087 + - 0.052 diff --git a/docs/en/api-guides/sleep-current/esp32c6_modem_sleep.inc b/docs/en/api-guides/sleep-current/esp32c6_modem_sleep.inc index d60b3c02b28..a615c029a45 100644 --- a/docs/en/api-guides/sleep-current/esp32c6_modem_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32c6_modem_sleep.inc @@ -1 +1,52 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c6_modem_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 10 20 20 20 + + * - CPU frequency + - DFS + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - ON + - 1 + - 14.37 + - 84.40 + - 10.02 + + * - 160 MHz + - OFF + - 1 + - 27.48 + - 87.55 + - 26.92 + + * - 160 MHz + - ON + - 3 + - 13.9 + - 83.9 + - 10.13 + + * - 160 MHz + - OFF + - 3 + - 27.08 + - 87.74 + - 26.91 + + * - 160 MHz + - ON + - 10 + - 13.71 + - 82.77 + - 10.04 + + * - 160 MHz + - OFF + - 10 + - 26.85 + - 88.07 + - 26.7 diff --git a/docs/en/api-guides/sleep-current/esp32c6_summary.inc b/docs/en/api-guides/sleep-current/esp32c6_summary.inc index 647ed8401c9..690d2d8fa0f 100644 --- a/docs/en/api-guides/sleep-current/esp32c6_summary.inc +++ b/docs/en/api-guides/sleep-current/esp32c6_summary.inc @@ -1 +1,69 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32c6_summary.inc +.. list-table:: + :header-rows: 1 + :widths: 20 20 30 20 20 + + * - Item + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep + + * - Sleep + - Automatic + - Automatic + - Automatic + - Manual + + * - Wake-up + - Automatic + - Automatic + - Automatic + - Configure Wake-up Source + + * - Wi-Fi Connection + - Maintain + - Maintain + - Maintain + - Disconnect + + * - CPU + - On + - On/Throttled + - Paused + - Off + + * - System Clock + - On + - On + - Off + - Off + + * - Peripherals + - On + - On + - On + - Off + + * - DTIM1 + - 27.48 mA + - 14.37 mA + - 0.919 mA + - / + + * - DTIM3 + - 27.08 mA + - 13.9 mA + - 0.368 mA + - / + + * - DTIM10 + - 26.85 mA + - 13.71 mA + - 0.172 mA + - / + + * - Average Current + - / + - / + - / + - 6.7 μA diff --git a/docs/en/api-guides/sleep-current/esp32s2_light_sleep.inc b/docs/en/api-guides/sleep-current/esp32s2_light_sleep.inc index 8d2da161f55..1a9de382eb4 100644 --- a/docs/en/api-guides/sleep-current/esp32s2_light_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32s2_light_sleep.inc @@ -1 +1,27 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32s2_light_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 20 20 20 + + * - CPU frequency + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - 1 + - 2.48 + - 94.88 + - 0.96 + + * - 160 MHz + - 3 + - 2.96 + - 97.15 + - 2.25 + + * - 160 MHz + - 10 + - 2.69 + - 98.66 + - 2.25 diff --git a/docs/en/api-guides/sleep-current/esp32s2_modem_sleep.inc b/docs/en/api-guides/sleep-current/esp32s2_modem_sleep.inc index d0377f0ffa7..ce2d7ce4d2d 100644 --- a/docs/en/api-guides/sleep-current/esp32s2_modem_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32s2_modem_sleep.inc @@ -1 +1,52 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32s2_modem_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 10 20 20 20 + + * - CPU frequency + - DFS + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - ON + - 1 + - 11.71 + - 83.87 + - 5.04 + + * - 160 MHz + - OFF + - 1 + - 31.14 + - 160.26 + - 29.04 + + * - 160 MHz + - ON + - 3 + - 12.4 + - 84.85 + - 10.0 + + * - 160 MHz + - OFF + - 3 + - 29.06 + - 178.67 + - 28.25 + + * - 160 MHz + - ON + - 10 + - 12.15 + - 84.18 + - 10.01 + + * - 160 MHz + - OFF + - 10 + - 28.5 + - 176.69 + - 28.21 diff --git a/docs/en/api-guides/sleep-current/esp32s2_summary.inc b/docs/en/api-guides/sleep-current/esp32s2_summary.inc index 8cc02219cc0..85f3049df53 100644 --- a/docs/en/api-guides/sleep-current/esp32s2_summary.inc +++ b/docs/en/api-guides/sleep-current/esp32s2_summary.inc @@ -1 +1,69 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32s2_summary.inc +.. list-table:: + :header-rows: 1 + :widths: 20 20 30 20 20 + + * - Item + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep + + * - Sleep + - Automatic + - Automatic + - Automatic + - Manual + + * - Wake-up + - Automatic + - Automatic + - Automatic + - Configure Wake-up Source + + * - Wi-Fi Connection + - Maintain + - Maintain + - Maintain + - Disconnect + + * - CPU + - On + - On/Throttled + - Paused + - Off + + * - System Clock + - On + - On + - Off + - Off + + * - Peripherals + - On + - On + - On + - Off + + * - DTIM1 + - 31.14 mA + - 11.71 mA + - 2.48 mA + - / + + * - DTIM3 + - 29.06 mA + - 12.4 mA + - 2.96 mA + - / + + * - DTIM10 + - 28.5 mA + - 12.15 mA + - 2.69 mA + - / + + * - Average Current + - / + - / + - / + - 5 μA diff --git a/docs/en/api-guides/sleep-current/esp32s3_light_sleep.inc b/docs/en/api-guides/sleep-current/esp32s3_light_sleep.inc index 2f26974c402..167e2fe9208 100644 --- a/docs/en/api-guides/sleep-current/esp32s3_light_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32s3_light_sleep.inc @@ -1 +1,27 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32s3_light_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 20 20 20 + + * - CPU frequency + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - 1 + - 2.45 + - 120.21 + - 0.28 + + * - 160 MHz + - 3 + - 1.33 + - 120.25 + - 0.28 + + * - 160 MHz + - 10 + - 0.93 + - 120.04 + - 0.28 diff --git a/docs/en/api-guides/sleep-current/esp32s3_modem_sleep.inc b/docs/en/api-guides/sleep-current/esp32s3_modem_sleep.inc index 3360edd5c9c..4050018da5d 100644 --- a/docs/en/api-guides/sleep-current/esp32s3_modem_sleep.inc +++ b/docs/en/api-guides/sleep-current/esp32s3_modem_sleep.inc @@ -1 +1,52 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32s3_modem_sleep.inc +.. list-table:: + :header-rows: 1 + :widths: 20 10 10 20 20 20 + + * - CPU frequency + - DFS + - DTIM + - Average current (mA) + - Max current (mA) + - Min current (mA) + + * - 160 MHz + - ON + - 1 + - 20.7 + - 113.5 + - 15.0 + + * - 160 MHz + - OFF + - 1 + - 40.1 + - 235.8 + - 37.8 + + * - 160 MHz + - ON + - 3 + - 19.9 + - 113.4 + - 15.0 + + * - 160 MHz + - OFF + - 3 + - 38.7 + - 267.2 + - 37.9 + + * - 160 MHz + - ON + - 10 + - 19.5 + - 113.4 + - 15.0 + + * - 160 MHz + - OFF + - 10 + - 38.2 + - 259.7 + - 37.9 diff --git a/docs/en/api-guides/sleep-current/esp32s3_summary.inc b/docs/en/api-guides/sleep-current/esp32s3_summary.inc index 2dc1dc6a525..54e417b7ad2 100644 --- a/docs/en/api-guides/sleep-current/esp32s3_summary.inc +++ b/docs/en/api-guides/sleep-current/esp32s3_summary.inc @@ -1 +1,69 @@ -.. include:: ../../../zh_CN/api-guides/sleep-current/esp32s3_summary.inc +.. list-table:: + :header-rows: 1 + :widths: 20 20 30 20 20 + + * - Item + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep + + * - Sleep + - Automatic + - Automatic + - Automatic + - Manual + + * - Wake-up + - Automatic + - Automatic + - Automatic + - Configure Wake-up Source + + * - Wi-Fi Connection + - Maintain + - Maintain + - Maintain + - Disconnect + + * - CPU + - On + - On/Throttled + - Paused + - Off + + * - System Clock + - On + - On + - Off + - Off + + * - Peripherals + - On + - On + - On + - Off + + * - DTIM1 + - 40.1 + - 20.7 + - 2.45 + - / + + * - DTIM3 + - 38.7 + - 19.9 + - 1.33 + - / + + * - DTIM10 + - 38.2 + - 19.5 + - 0.93 + - / + + * - Average Current + - / + - / + - / + - 6.8 μA diff --git a/docs/en/api-guides/wifi.rst b/docs/en/api-guides/wifi.rst index 345fe090538..17219ccb7c5 100644 --- a/docs/en/api-guides/wifi.rst +++ b/docs/en/api-guides/wifi.rst @@ -1759,7 +1759,7 @@ A config option :ref:`CONFIG_ESP_WIFI_11R_SUPPORT` and configuration parameter : {IDF_TARGET_NAME} Wi-Fi Power-saving Mode ----------------------------------------- -This subsection will briefly introduce the concepts and usage related to Wi-Fi Power Saving Mode, for a more detailed introduction please refer to the :doc:`Low Power Mode User Guide <../api-guides/low-power-mode>` +This subsection will briefly introduce the concepts and usage related to Wi-Fi Power Saving Mode, for a more detailed introduction please refer to the :doc:`Low Power Mode User Guide <../api-guides/low-power-mode/index>` Station Sleep ++++++++++++++++++++++ diff --git a/docs/zh_CN/api-guides/index.rst b/docs/zh_CN/api-guides/index.rst index 74f41e5ae66..c99ad1d9f3f 100644 --- a/docs/zh_CN/api-guides/index.rst +++ b/docs/zh_CN/api-guides/index.rst @@ -29,6 +29,7 @@ API 指南 :CONFIG_IDF_TARGET_ARCH_XTENSA: hlinterrupts jtag-debugging/index linker-script-generation + low-power-mode/index lwip memory-types openthread @@ -45,5 +46,4 @@ API 指南 :SOC_USB_SERIAL_JTAG_SUPPORTED: usb-serial-jtag-console :SOC_WIFI_SUPPORTED: wifi :SOC_WIFI_SUPPORTED: wifi-security - low-power-mode :SOC_WIFI_SUPPORTED or SOC_BT_SUPPORTED or SOC_IEEE802154_SUPPORTED: phy diff --git a/docs/zh_CN/api-guides/low-power-mode.rst b/docs/zh_CN/api-guides/low-power-mode.rst deleted file mode 100644 index a1fd881f0fe..00000000000 --- a/docs/zh_CN/api-guides/low-power-mode.rst +++ /dev/null @@ -1,1035 +0,0 @@ -低功耗模式使用指南 -================== - -:link_to_translation:`en:[English]` - -对于物联网应用场景,终端的待机性能表现十分重要,本文档旨在介绍 {IDF_TARGET_NAME} 低功耗的基本原理,同时介绍 {IDF_TARGET_NAME} 支持的低功耗模式,需注意本文档主要针对 station mode。文档还会具体给出每种模式的配置步骤、推荐配置和功耗表现,以帮助用户根据实际需求快速配置适合的低功耗模式。 - -系统低功耗模式介绍 ----------------------------------- - -低功耗模式不仅涉及到系统相关问题,还涉及到芯片具体的工作场景,如处在 Wi-Fi 工作场景就会与处在蓝牙工作场景时产生不同。为此本节将首先介绍纯系统角度,即不涉及具体场景的低功耗模式,主要有 DFS、Light-sleep、Deep-sleep。纯系统下的低功耗模式主要思想就是在休眠时关闭或门控一些功能模块来降低功耗。 - -DFS -++++++++++++++++++++++++++++++++++ - -DFS (Dynamic frequency scaling) 即动态频率切换,是 ESP-IDF 中集成的电源管理机制的基础功能。DFS 可以根据应用程序持有电源锁的情况,调整外围总线 (APB) 频率和 CPU 频率。持有高性能锁就使用高频,空闲状态不持有电源锁时则使用低频来降低功耗,以此来尽可能减少运行应用程序的功耗。 - -DFS 的调频机制即根据持有电源锁的最大频率需求来调整频率,同时,freertos tick rates 的数值也会对 DFS 调频产生影响。系统任务调度的灵敏度越大,则意味着系统能更及时的根据需求调整频率。有关调频机制的详细信息,请参见 :doc:`电源管理 <../api-reference/system/power_management>`。 - -下图为 DFS 调频机制运行的理想电流情况。 - -.. figure:: ../../_static/Low-power-DFS-current.png - :align: center - - 理想 DFS 机制调频电流图 - -DFS 适用于 CPU 必须处于工作状态但是对低功耗有需求的场景,因此 DFS 经常与其他低功耗模式共同开启,下文会详细介绍。 - -Light-sleep -++++++++++++++++++++++++++++++++++ - -Light-sleep 模式是 {IDF_TARGET_NAME} 预设的一种低功耗模式,其核心思想就是在休眠时关闭或门控一些功能模块来降低功耗。从纯系统方面来说,Light-sleep 模式有两种进入方式,一种是通过 API 调用进入休眠,一种是自动进入的 auto 模式。两种模式都需要配置唤醒源进行唤醒,同时在进入休眠后会门控或关闭一些模块。这里主要介绍 Auto Light-sleep 模式。 - -Auto Light-sleep 模式是 ESP-IDF 电源管理机制和 Light-sleep 模式的结合。开启电源管理机制是其前置条件,auto 体现在系统进入空闲状态 (IDLE) 超过设定时间后,自动进入 Light-sleep。空闲状态下,应用程序释放所有电源锁,此时,DFS 将降频以减小功耗。 - -Auto Light-sleep 依赖于电源管理机制,系统经过提前判断,发现空闲时间超过设定时间时,则直接进入休眠。该过程为自动进行。休眠时会自动关闭 RF、8 MHz 振荡器、40 MHz 高速晶振、PLL、门控数字内核时钟,暂停 CPU 工作。 - -Auto Light-sleep 模式需配置唤醒源。该模式拥有多种唤醒源,支持相互组合,此时任何一个唤醒源都可以触发唤醒。唤醒后,会从进入休眠的位置继续执行程序。若不配置唤醒源,进入 Light-sleep 休眠后,芯片将一直处在睡眠状态,直到外部复位。具体唤醒源有 RTC 定时器、触摸传感器、外部唤醒 (ext0)、外部唤醒 (ext1)、ULP 协处理器、SDIO、GPIO、UART、Wi-Fi、BT 唤醒等。 - -Auto Light-sleep 模式工作流程相对复杂,但是进入休眠状态是自动进行,同时需注意在进入前配置好唤醒源,防止芯片一直处在休眠状态。 - -.. figure:: ../../_static/Low-power-auto-light-sleep-process.png - :align: center - - Auto Light-sleep 模式工作流程图 - -根据 Auto Light-sleep 的工作流程可得其理想电流图,关键节点均在图上标出。 - -.. figure:: ../../_static/Low-power-auto-light-sleep-current.png - :align: center - - Auto Light-sleep 模式模式理想电流图 - -.. note:: - 为更加清晰地展现出 Auto Light-sleep 的主要变化,图中省略了 DFS 降频过程。 - -Auto Light-sleep 模式适用于不需要实时响应外界需求的场景。 - -Deep-sleep -++++++++++++++++++++++++++++++++++ - -Deep-sleep 模式是为了追求更好的功耗表现所设计,休眠时仅保留 RTC 控制器、RTC 外设(可配置)、ULP 协处理器、RTC 高速内存、RTC 低速内存,其余模块全部关闭。与 Light-sleep 类似,Deep-sleep 同样通过 API 进入,且需要配置唤醒源进行唤醒。 - -Deep-sleep 通过调用 API 进入,休眠时会关闭除 RTC 控制器、RTC 外设、ULP 协处理器、RTC 高速内存、RTC 低速内存外的所有模块。 - -Deep-sleep 模式需配置唤醒源,其拥有多种唤醒源,这些唤醒源也可以组合在一起,此时任何一个唤醒源都可以触发唤醒。若不配置唤醒源进入 Deep-sleep 模式,芯片将一直处在睡眠状态,直到外部复位。具体唤醒源有 RTC 定时器、触摸传感器、外部唤醒 (ext0)、外部唤醒 (ext1)、ULP 协处理器、GPIO 唤醒等。 - -Deep-sleep 模式工作流程如下图所示: - -.. figure:: ../../_static/Low-power-deep-sleep-process.png - :align: center - - Deep-sleep 模式工作流程图 - -Deep-sleep 模式主要应用场景决定了系统很长时间才会苏醒一次,完成工作后又会继续进入 Deep-sleep,所以其理想电流图如下。 - -.. figure:: ../../_static/Low-power-deep-sleep-current.png - :align: center - - Deep-sleep 模式理想电流图 - -Deep-sleep 可以用于低功耗的传感器应用,或是大部分时间都不需要进行数据传输的情况,也就是通常所说的待机模式。设备可以每隔一段时间从 Deep-sleep 状态醒来测量数据并上传,之后重新进入 Deep-sleep;也可以将多个数据存储于 RTC memory,然后一次性发送出去。 - -如何配置纯系统下低功耗模式 -+++++++++++++++++++++++++++++++++++++ - -介绍完纯系统下的低功耗模式后,本节将介绍公共配置选项、每种模式独有的配置选项,以及相应低功耗模式 API 的使用说明,同时给出相应模式推荐的配置。 - -公共配置选项 -+++++++++++++ - -.. only:: esp32 or esp32s3 - - - 单双核工作模式 - 对于多核心芯片,可以选择单核工作模式。 - - - - RTOS Tick rate (Hz) - 该参数表示系统周期任务调度的频率。例如,当 RTOS Tick rate 配置为 1000 时,系统每毫秒都会进行一次任务调度;空闲时,系统也能够更敏锐的感知到空闲状态。 - - -DFS 配置 -+++++++++++++++++++++++ - -DFS 有如下可配置选项: - -- max_freq_mhz - 该参数表示最大 CPU 频率 (MHz),即 CPU 最高性能工作时候的频率,一般设置为芯片参数的最大值。 - -- min_freq_mhz - 该参数表示最小 CPU 频率 (MHz),即系统处在空闲状态时 CPU 的工作频率。该字段可设置为晶振 (XTAL) 频率值,或者 XTAL 频率值除以整数。 - -- light_sleep_enable - 使能该选项,系统将在空闲状态下自动进入 Light-sleep 状态,即 Auto Light-sleep 使能,上文已经具体介绍。 - -具体配置方法如下: - -- 1. 使能 CONFIG_PM_ENABLE -- 2. 配置 max_freq_mhz 和 min_freq_mhz,方式如下: - - :: - - esp_pm_config_t pm_config = { - .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, - .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, - .light_sleep_enable = false - }; - ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); - -推荐配置: - -.. list-table:: - :header-rows: 1 - :widths: 20 20 - - * - 配置名称 - - 设置情况 - - * - CONFIG_PM_ENABLE - - ON - - * - RTOS Tick rate (Hz) - - 1000 - - * - max_freq_mhz - - 160 - - * - min_freq_mhz - - 40 - - * - light_sleep_enable - - false - -.. note:: - 上表中不涉及的配置均是默认。 - - -Light-sleep 配置 -+++++++++++++++++++ - -本节介绍 Auto Light-sleep 的推荐配置和配置步骤。 - -Auto Light-sleep 有如下可配置选项: - -- Minimum step to enter sleep mode - 该参数表示系统自动进入休眠的阈值。该参数单位为 RTOS Tick,故其表示的时间与 RTOS Tick rate 相关,例该参数值为 3,RTOS Tick rate 配置为 1000 Hz 时,即当系统空闲时间大于等于 3 ms 时进入 休眠。 - -- Put light sleep related codes in internal RAM - 如果使能该选项,一些 light-sleep 功能将被移至 IRAM,减少代码运行时间,降低系统功耗,IRAM 使用量将增加 1.8 kB。 - -- Put RTOS IDLE related codes in internal RAM - 如果使能该选项,一些 RTOS IDLE 功能将被移至 IRAM,减少代码运行时间,降低系统功耗,IRAM 使用量将增加 260 B。 - -- RTC slow clock source - 该参数表表示 RTC 慢速时钟源。系统休眠时计时器模块的时钟被门控,此时使用 RTC Timer 进行计时,唤醒后使用 RTC Timer 的计数值对系统时间进行补偿。 - -.. list-table:: - :header-rows: 1 - :widths: 20 20 20 - - * - 时钟源 - - 精度 - - 频偏 - - * - Internal 150 kHz OSC - - 约 6.7 us/cycle - - 大 - - * - External 32 kHz XTAL - - 约 30.5 us/cycle - - 小 - -- Disable all GPIO when chip at sleep - 如果使能该选项,系统将在休眠过程中禁用所有 GPIO 管脚,消除 GPIO 漏电,降低功耗,但是休眠过程中 GPIO 无法进行信号输入和输出。 - -.. only:: esp32c3 or esp32s3 - - - Power down MAC and baseband - 如果使能该选项,系统将在休眠时关闭 Wi-Fi 和蓝牙的 MAC 和 baseband 来降低功耗,休眠电流约降低 100 uA, 但是为保存上下文信息,将额外消耗 5.3 K DRAM。 - - - Power down CPU - 如果使能该选项,系统将在休眠时将关闭 CPU 来降低功耗,对于 ESP32-C3,休眠电流减小 100 uA 左右,对于 ESP32-S3,休眠电流减小 650 uA 左右。但是为保存上下文信息,对于 ESP32-C3,将消耗 1.6 KB 的 DRAM 空间,对于 ESP32-S3,将消耗 8.58 KB 的 DRAM 空间。 - - - Power down I/D-cache tag memory - 如果使能该选项,系统将在休眠时关闭 I/D cache tag memory 来降低功耗, 但是为保存 tag memory 信息,将额外消耗最大约 9 KB DRAM,同时因为 tag memory 信息特殊性,如需打开该选项,建议多进行测试。 - - - Power down flash in Light-sleep - 如果使能该选项,系统将在 Light-sleep 休眠时关闭 flash,降低系统功耗,该选项的前提是系统没有使用 PSRAM。 - -唤醒源: - -- RTC Timer Wakeup -- GPIO Wakeup -- UART Wakeup -- Touchpad Wakeup -- External Wakeup (ext0) -- External Wakeup (ext1) -- ULP Coprocessor Wakeup - -.. note:: - 以上仅列出可配置唤醒源,详细介绍请参考 :doc:`睡眠模式 <../api-reference/system/sleep_modes>`。 - -配置方法: - -- 1. 配置唤醒源 -- 2. 使能 CONFIG_PM_ENABLE -- 3. 使能 CONFIG_FREERTOS_USE_TICKLESS_IDLE -- 4. 配置 DFS 参数 -- 5. light_sleep_enable = true,具体如下: - - :: - - esp_pm_config_t pm_config = { - .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, - .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, - #if CONFIG_FREERTOS_USE_TICKLESS_IDLE - .light_sleep_enable = true - #endif - }; - ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); - -- 6. 配置介绍的其余相关参数 - -推荐配置: - -.. only:: esp32c3 or esp32s3 - - .. list-table:: - :header-rows: 1 - :widths: 30 15 - - * - 配置名称 - - 设置情况 - - * - CONFIG_PM_ENABLE - - ON - - * - CONFIG_FREERTOS_USE_TICKLESS_IDLE - - ON - - * - max_freq_mhz - - 160 - - * - min_freq_mhz - - 40 - - * - RTOS Tick rate (Hz) - - 1000 - - * - light_sleep_enable - - true - - * - Minimum step to enter sleep mode - - 3 - - * - Put light sleep codes in IRAM - - OFF - - * - Put RTOS IDLE codes in IRAM - - OFF - - * - RTC slow clock source - - Internal 150 kHz OSC - - * - Disable all GPIO when chip at sleep - - ON - - * - Power down MAC and baseband - - ON - - * - Power down I/D-cache tag memory - - ON - - * - Power down CPU - - ON - - * - Power down flash in light sleep - - OFF - - .. note:: - 上表中不涉及的配置均是默认 - -.. only:: esp32 or esp32s2 - - .. list-table:: - :header-rows: 1 - :widths: 30 15 - - * - 配置名称 - - 设置情况 - - * - CONFIG_PM_ENABLE - - ON - - * - CONFIG_FREERTOS_USE_TICKLESS_IDLE - - ON - - * - max_freq_mhz - - 160 - - * - min_freq_mhz - - 40 - - * - RTOS Tick rate (Hz) - - 1000 - - * - light_sleep_enable - - true - - * - Minimum step to enter sleep mode - - 3 - - * - Put light sleep codes in IRAM - - OFF - - * - Put RTOS IDLE codes in IRAM - - OFF - - * - RTC slow clock source - - Internal 150 kHz OSC - - * - Disable all GPIO when chip at sleep - - ON - - .. note:: - 上表中不涉及的配置均是默认 - -.. only:: esp32c2 - - .. list-table:: - :header-rows: 1 - :widths: 30 15 - - * - 配置名称 - - 设置情况 - - * - CONFIG_PM_ENABLE - - ON - - * - CONFIG_FREERTOS_USE_TICKLESS_IDLE - - ON - - * - max_freq_mhz - - 120 - - * - min_freq_mhz - - 40 - - * - RTOS Tick rate (Hz) - - 1000 - - * - light_sleep_enable - - true - - * - Minimum step to enter sleep mode - - 3 - - * - Put light sleep codes in IRAM - - OFF - - * - Put RTOS IDLE codes in IRAM - - OFF - - * - RTC slow clock source - - Internal 150 kHz OSC - - * - Disable all GPIO when chip at sleep - - ON - - * - Power down MAC and baseband - - ON - - * - Power down I/D-cache tag memory - - ON - - * - Power down CPU - - ON - - * - Power down flash in light sleep - - OFF - - .. note:: - 上表中不涉及的配置均是默认 - -Deep-sleep 配置 -++++++++++++++++++ - -对 Deep-sleep 模式来说,除了唤醒源相关配置,其余配置意义已经不大。 - -Deep-sleep 有如下可配置选项: - -- RTC Timer wakeup -- EXT0/1 wakeup -- Touchpad wakeup -- ULP wakeup - -.. note:: - 以上仅列出可配置唤醒源,详细介绍请参考 :doc:`睡眠模式 <../api-reference/system/sleep_modes>`。 - -配置步骤: - -- 配置唤醒源 -- 调用 API,具体如下:: - - /* Enter deep sleep */ - esp_deep_sleep_start(); - -用户可以通过下列配置选项,让一些特定模块在休眠时保持开启状态: - -- Power up External 40 MHz XTAL - 在一些特殊应用中,部分模块对休眠时的时钟精度及稳定度有很高要求(例如 BT)。这种情况下,可以考虑在休眠过程中打开 External 40 MHz XTAL。 - 打开和关闭代码如下:: - - ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_ON)); - ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_OFF)); - -- Power up Internal 8 MHz OSC - 在一些特殊应用中,部分模块(例如 LEDC)将 Internal 8 MHz OSC 作为时钟源,并且希望在 Light-sleep 休眠过程中也可以正常使用。这种情况下,可以考虑在休眠过程中打开 Internal 8 MHz OSC。 - 打开和关闭代码如下:: - - ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_RTC8M, ESP_PD_OPTION_ON)); - ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_RTC8M, ESP_PD_OPTION_OFF)); - -.. only:: SOC_WIFI_SUPPORTED - - Wi-Fi 场景下低功耗模式介绍 - ---------------------------------- - - 上文介绍了纯系统方向下的低功耗模式,但在实际应用中还需结合具体应用场景。本节将结合纯系统下的功耗模式来介绍在 Wi-Fi 场景下的低功耗模式。因为 Wi-Fi 场景的复杂性,本节会会首先介绍 Wi-Fi 省电的基本原理,然后再介绍具体的低功耗模式,同时本节主要针对 station 模式。 - - Wi-Fi 场景如何选择低功耗模式 - ++++++++++++++++++++++++++++++++++ - - 为方便用户选择合适的低功耗模式,在介绍具体内容前先给出 Wi-Fi 场景下低功耗模式总结表,以方便用户根据需求快速选择想要了解的内容。 - - .. todo - add sleep-current/esp32c5_summary.inc - - .. only:: not esp32c5 - - .. include:: sleep-current/{IDF_TARGET_PATH_NAME}_summary.inc - - .. note:: - - 上表中所有电流均为平均电流,表中术语在下文均有介绍,用户可根据需求进行查看 - - - Wi-Fi 省电的基本原理 - +++++++++++++++++++++ - - 首先,在 station 的工作过程中,为在接收发送过程中避免冲突,需要长时间监听信道,能耗较大的 RF 模块会一直处于工作中,浪费电量。为此,Wi-Fi 协议引入省电模式。 - - 省电模式的基本原理是通过减少不必要的监听时间来降低耗能。AP 会缓存进入省电模式的 station 的包,同时周期发送包含 TIM 信息的 Beacon 帧,TIM 会指示 AP 缓存的单播包。TIM 中,DTIM 较为特殊,其会缓存广播包,并以 n 个(由 AP 决定)TIM 为周期发送。对 station 来说,TIM 非必听,而 DTIM 为必听。因此,station 可以选择只在每一个 DTIM 帧前醒来打开 Wi-Fi 相关模块(RF 模块),而不必时刻处于监听状态,这样就能有效降低功耗。 - - .. figure:: ../../_static/Low-power-DTIM4.png - :align: center - - DTIM4 省电模式示意图 - - 其次,station 从打开到再次关闭 Wi-Fi 相关模块的时间也会影响功耗。除必要的数据传输处理时间外,主要有四项配置会影响时间长短: - - - 时钟准确性导致的 time offset,主要原因是时钟或多或少都会与理想的时间存在偏移,同时偏移的正负不定。 - - 处理 Beacon 漏听后的时间,如漏听后持续监听时间、允许最多丢失 Beacon 数目等,这段时间存不存在以及存在多久都不定,但是可以配置范围。 - - 为了确保能够接受突发数据包而添加的 active 时间,可由配置决定。 - - ILDE 时间是具体某些功耗模式进入条件要求。因此在满足通信需求的情况下,降低工作时间可以改善功耗表现。 - - .. figure:: ../../_static/Low-power-time.png - :align: center - - 芯片工作时间组成图 - - 此外,在 station 没有处于 Wi-Fi 接收或发送状态时,影响功耗的因素变成了芯片的其他模块。不同的功耗模式会配置不同的时钟源,或者动态调整一些模块的工作频率如 CPU,同时还会关闭不同数量的功能模块,这将有效降低芯片的功耗。其实也就是纯系统相关的模式,用户可根据需求自己选择合适的配置。 - - 如果以时间为横轴,电流大小为纵轴建立坐标轴,那么处在低功耗模式下芯片的理想工作电流图可以简化成下图: - - .. figure:: ../../_static/Low-power-WiFi-base-current.png - :align: center - - 理想情况下 Wi-Fi 场景低功耗模式电流图 - - 其中 station 要进行 Wi-Fi 通信时,Wi-Fi 相关模块 (PHY) 开启,电流会显著上升,在工作完成前,电流会一直维持在一个较高的水平。工作完成后,芯片会关闭 Wi-Fi 相关模块,这时电流又会降低到一个较低水平。 - - 可以看出影响功耗表现的主要有三点:interval、period 和 base current。 - - - Interval 是 station Wi-Fi 相关模块工作的间隔,既可以由低功耗模式自定义,也可根据 Wi-Fi 协议省电机制(3.1 第一点介绍),由 DTIM 周期决定。可以看出在同等情下,interval 越大,功耗表现会更好,但是响应会更慢,影响通信的及时性。 - - - Period 可以看作每次 station Wi-Fi 工作的时间,这段时间的长度也会影响功耗的表现。period 不是一个固定的时长(3.1 第二点介绍),在保证 Wi-Fi 通信正常的情况下,period 持续时间越短,功耗表现越好。但是减少 period 时间,必然会影响通信的可靠性。 - - - Base current 是 Wi-Fi 相关模块不工作时芯片的电流,影响其大小的因素很多,不同的功耗模式下休眠策略不同。所以,在满足功能的情况下,优化配置降低该电流大小可以提高功耗表现,但同时关闭其余模块会影响相关功能和芯片的唤醒时间。 - - 知道了影响功耗的三点因素之后,要想降低功耗应从这三点入手,接下来介绍两种低功耗模式,Modem sleep、Auto Light-sleep。两种模式主要区别就是对三点因素的优化不同。 - - - Modem-sleep Mode - ++++++++++++++++++ - - Modem-sleep 模式主要工作原理基于 DTIM 机制,周期性的醒来处理 Wi-Fi 相关工作,又在周期间隔之间进入休眠,关闭 PHY(RF 模块)来降低功耗。同时通过 DTIM 机制,station 可以与 AP 保持 Wi-Fi 连接,数据传输。 - - Modem-sleep 模式会在 Wi-Fi task 结束后自动进入休眠无需调用 API,休眠时仅会关闭 Wi-Fi 相关模块 (PHY),其余模块均处在正常上电状态。 - - Modem-sleep 模式默认会根据 DTIM 周期或 listen interval(下文介绍)醒来,相当于系统自动设置了一个 Wi-Fi 唤醒源,因此用户无需再配置唤醒源,同时系统主动发包时也可以唤醒。 - - Modem-sleep 是一个开关型的模式,调用 API 开启后一直自动运行,其工作流程十分简单,具体如下图。 - - .. figure:: ../../_static/Low-power-modem-process.png - :align: center - - Modem sleep 工作流程图 - - - 根据上文的基本电流图,结合 Modem-sleep 的工作原理,以 Min Modem(下文介绍)为例可得理想情况下电流变化图。 - - .. figure:: ../../_static/Low-power-modem-current.png - :align: center - - Min Modem-sleep 理想电流图 - - Modem-sleep 一般用于 CPU 持续处于工作状态并需要保持 Wi-Fi 连接的应用场景,例如,使用 {IDF_TARGET_NAME} 本地语音唤醒功能,CPU 需要持续采集和处理音频数据。 - - DFS + Modem sleep - ++++++++++++++++++ - - Modem sleep 模式休眠状态中 CPU 仍处在工作状态,而 DFS 机制主要作用于 CPU 和 APB 工作频率来降低功耗,因此 DFS + Modem sleep 可以进一步优化功耗表现,又因为 Wi-Fi task 会申请 ESP_PM_CPU_FREQ_MAX 电源锁来保证 Wi-Fi 任务快速运行,所以 DFS + Modem sleep 产生调频只会发生在 base current 阶段,即 Wi-Fi task 结束后。 - - 在 Wi-Fi 场景下,为了介绍的简化,让用户抓住主要的变化,DFS 可以进行一定的状态简化。具体来说,虽然 DFS 主要根据 CPU 和 APB 两把锁的最高需求来调频,但是 Wi-Fi 场景都需要 CPU 的频率最大化来工作,同时 Wi-Fi task 结束后,也可以理想化的认为,没有其余的工作要完成,这样就可以简单认为经过一段时间会释放两把锁进入空闲状态(IDLE 状态),也同时忽略这段时间锁的变化导致的电流变化,简化状态。 - - 在 Wi-Fi 场景下,DFS 最终简化为如下流程: - - .. figure:: ../../_static/Low-power-DFS-process.png - :align: center - - Wi-Fi 场景 DFS 简化流程图 - - 在 Wi-Fi 工作的 active 状态与系统空闲的 IDLE 状态转换,Wi-Fi task 结束后,系统经过一段时间释放了所有锁进入 IDLE 状态,此时 DFS 机制降低频率到设定最低值,忽略了转换状态期间的调频动作,方便理解。 - - 简化过后的 DFS + Modem sleep 模式理想状态下的电流大小如下图所示: - - .. figure:: ../../_static/Low-power-DFS-modem-current.png - :align: center - - DFS + Modem sleep 模式理想电流图 - - - Auto Light-sleep + Wi-Fi 场景 - +++++++++++++++++++++++++++++++ - - Auto Light-sleep 模式在 Wi-Fi 场景下是 ESP-IDF 电源管理机制、DTIM 机制和 light-sleep 的结合。开启电源管理是其前置条件,auto 体现在系统进入 IDLE 状态超过设定值后自动进入 light-sleep。同时 auto light sleep 模式同样遵循 DTIM 机制,会自动苏醒,可以与 AP 保持 Wi-Fi 连接。 - - Auto Light-sleep 模式在 Wi-Fi 场景下休眠机制与纯系统下一样,仍然依赖于电源管理机制,进入休眠的条件为系统处于 IDLE 状态的时间超过设定时间,并且系统会提前判断空闲时间是否满足条件,若满足直接休眠。该过程为自动进行。休眠时会自动关闭 RF、8 MHz 振荡器、40 MHz 高速晶振、PLL,门控数字内核时钟,暂停 CPU 工作。 - - Auto Light-sleep 模式在 Wi-Fi 场景下遵循 DTIM 机制,自动在 DTIM 帧到来前苏醒,相当于系统自动设置了一个 Wi-Fi 唤醒源,因此用户无需再配置唤醒源。同时系统主动发包时也可以唤醒。 - - Auto Light-sleep 模式在 Wi-Fi 场景下工作流程较为复杂,但全程都是自动进行,具体如下图所示。 - - .. figure:: ../../_static/Low-power-wifi-auto-light-process.png - :align: center - - Auto Light-sleep 工作流程图 - - Auto Light-sleep 模式在 Wi-Fi 场景下经常与 modem sleep 同时开启,这里给出 modem + auto light-sleep 模式的理想电流图,关键节点均在图上标出。 - - .. figure:: ../../_static/Low-power-wifi-auto-light-current.png - :align: center - - modem + auto light-sleep 模式理想电流图 - - Auto Light-sleep 模式在 Wi-Fi 场景下可用于需要保持 Wi-Fi 连接,可以实时响应 AP 发来数据的场景。并且在未接收到命令时,CPU 可以处于空闲状态。比如 Wi-Fi 开关的应用,大部分时间 CPU 都是空闲的,直到收到控制命令,CPU 才需要进行 GPIO 的操作。 - - - Deep-sleep + Wi-Fi 场景 - +++++++++++++++++++++++++++++++++ - - Deep-sleep 模式在 Wi-Fi 场景下与纯系统下基本相同,详情可以参考 `Deep-sleep`_ 这里不再介绍。 - - - 如何配置 Wi-Fi 场景下低功耗模式 - +++++++++++++++++++++++++++++++++++++ - - 介绍完 Wi-Fi 场景下低功耗模式后,本节将介绍公共配置选项、每种模式独有的配置选项,以及相应低功耗模式 API 的使用说明,同时给出相应模式推荐的配置(包含纯系统下的低功耗推荐配置)以及该配置的具体表现。 - - 公共配置选项: - - - 功耗类: - - - Max Wi-Fi TX power (dBm) - 该参数表示最大 TX 功率,降低该参数会减小发包功耗,但会影响 Wi-Fi 性能,默认设置最大 20。 - - - IRAM 类: - - - Wi-Fi IRAM speed optimization - 如果使能该选项,一些 Wi-Fi 功能将被移至 IRAM,减少代码运行时间,降低系统功耗,IRAM 使用量将增加,默认开启。 - - - Wi-Fi RX IRAM speed optimization - 如果使能该选项,一些 Wi-Fi RX 功能将被移至 IRAM,减少代码运行时间,降低系统功耗,IRAM 使用量将增加,默认开启。 - - - Wi-Fi Sleep IRAM speed optimization - 如果使能该选项,一些 Wi-Fi sleep 功能将被移至 IRAM,减少代码运行时间,降低系统功耗,IRAM 使用量将增加,默认关闭。 - - - Wi-Fi 协议类: - - - Minimum active time - 该参数表示 Station 接收完一次数据后需要等待时间。当终端与 AP 进行通信时,AP 发送到终端的数据经常是突发形式的,为确保后续的突发数据能够正常接收到,需要等待一段时间。默认 50。 - - - Maximum keep alive time - 该参数表示周期性的发送 sleep null data 来通告 AP 维持连接的时间。在 DTIM 机制下,若 AP 长时间没有某个 station 的包,可能会断开连接,因此需要 station 需要周期发送 sleep null data 维持连接。默认 10。 - - - Send gratuitous ARP periodically - 如果使能该选项,Station 将周期性的发送 gratuitous ARP 请求更新 AP ARP 缓存表。如无该需求,可以关闭。 - - - Wi-Fi sleep optimize when beacon lost - 如果使能该选项,Station 在检测到已经错过或者丢失 beacon 时,会立即关闭 RF 进入低功耗状态。 - - Modem sleep 配置方法如下: - - - 可配置选项 - - - Min Modem - 该参数表示 station 按照 DTIM 周期工作,在每个 DTIM 前醒来接收 Beacon,这样不会漏掉广播信息,但是 DTIM 周期由 AP 决定,如果 DTIM 周期较短,省电效果会降低。 - - - Max Modem - 该参数表示 station 会自定义一个 listen interval,并以 listen interval 为周期醒来接受 Beacon。这样在 listen interval 较大时会省电,但是容易漏听 DTIM,错过广播数据。 - - - - 配置方法: - - - 调用 API,选择模式参数:: - - typedef enum { - WIFI_PS_NONE, - WIFI_PS_MIN_MODEM, - WIFI_PS_MAX_MODEM, - } wifi_ps_type_t; - esp_err_t esp_wifi_set_ps(wifi_ps_type_t type); - - 若选择 WIFI_PS_MAX_MODEM,还需配置 listen interval,示例如下:: - - #define LISTEN_INTERVAL 3 - wifi_config_t wifi_config = { - .sta = { - .ssid = "SSID", - .password = "Password", - .listen_interval = LISTEN_INTERVAL, - }, - }; - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); - ESP_ERROR_CHECK(esp_wifi_start()); - - 配置推荐: - - 这里给出的配置推荐是 Min Modem sleep + DFS 开启的配置 - - .. list-table:: - :header-rows: 1 - :widths: 20 15 - - * - 配置名称 - - 设置情况 - - * - WIFI_PS_MIN_MODEM - - ON - - * - CONFIG_PM_ENABLE - - ON - - * - RTOS Tick rate (Hz) - - 1000 - - * - max_freq_mhz - - 160 - - * - min_freq_mhz - - 40 - - * - light_sleep_enable - - false - - 配置表现: - - .. todo - add sleep-current/esp32c5_modem_sleep.inc - - .. only:: not esp32c5 - - .. include:: sleep-current/{IDF_TARGET_PATH_NAME}_modem_sleep.inc - - Auto Light-sleep + Wi-Fi 场景配置: - - Auto Light-sleep 在 Wi-Fi 场景下的配置比纯系统下少了唤醒源的配置要求,其余几乎与纯系统下配置一致,因此可配置选项、配置步骤、推荐配置的详细介绍可以参考上文 `Light-sleep`_。同时 Wi-Fi 相关配置保持默认。 - - 配置表现: - - 该配置表现为 Auto Light-sleep 纯系统推荐配置 + 默认的 Wi-Fi 相关配置在 Wi-Fi 场景的表现。 - - .. todo - add sleep-current/esp32c5_light_sleep.inc - - .. only:: not esp32c5 - - .. include:: sleep-current/{IDF_TARGET_PATH_NAME}_light_sleep.inc - - Deep-sleep + Wi-Fi 场景配置: - - Deep-sleep 模式在 Wi-Fi 场景下的配置与纯系统下配置基本一致,因此可配置选项、配置步骤、推荐配置的详细介绍可以参考上文 `Deep-sleep`_。同时 Wi-Fi 相关配置保持默认。 - - 配置表现: - - 该配置表现为 Deep-sleep 纯系统推荐配置 + 默认的 Wi-Fi 相关配置在 Wi-Fi 场景的表现。 - - .. only:: esp32 - - 平均电流约 5.0 μA - - .. only:: esp32s2 - - 平均电流约 5.0 μA - - .. only:: esp32s3 - - 平均电流约 6.9 μA - - .. only:: esp32c3 - - 平均电流约 4.8 μA - - .. only:: esp32c2 - - 平均电流约 4.9 μA - -.. only:: esp32c6 - - 目标唤醒时间 (TWT) - ---------------------------------- - - 目标唤醒时间 (Target Wake Time, TWT) 是 Wi-Fi 6 中引入的一项特性,旨在降低设备功耗和提高网络效率。 - - 在以往的 Wi-Fi 节能机制中,设备可能需要在每个 DTIM 周期醒来与 AP 交换数据,而在 TWT 机制中支持 AP 和设备协商得到特定的唤醒时间,设备会在这些时间点醒来与 AP 进行数据交换,而其余时间则处于休眠状态。TWT 协商的唤醒和休眠时间取决于设备具体的应用需求。例如,有些传感器设备需要定时上传数据,在该场景下设备可以与 AP 建立 TWT 协商,相隔多个小时交换一次数据。实际应用中可根据具体需求定制唤醒时间,在不影响设备正常工作的情况下降低功耗。 - - AP 可以与多个设备建立 TWT 协商。利用 Wi-Fi 6 的多用户特性,AP 可以对上行和下行数据传输做出合理协调,从而减少信道竞争,提高传输效率。 - - TWT 类型 - ++++++++++ - - 根据协商类型和工作模式,可以把 TWT 分为: - - - **Individual TWT (iTWT)** - - iTWT 模式下,AP 与终端设备建立的是一对一的 TWT 协商。 - - - **Broadcast TWT (bTWT)** - - 在 bTWT 模式下,AP 通过 Beacon 帧广播 TWT 信息,以组的形式来管理多个终端设备的 TWT 过程。终端设备可以根据 Beacon 中的 TWT 信息选择执行加组操作。 - - .. note:: - 在建立 TWT 协商前,需要确认 AP 是否支持并开启了 TWT 功能。{IDF_TARGET_NAME} 当前只支持 iTWT 模式。 - - TWT 工作流程 - ++++++++++++ - TWT 工作流程一般分为 TWT 协商建立、TWT 协商暂停/恢复、TWT 协商终止。TWT 协商建立后,Station 就可以按照协商的参数进入休眠状态,直到约定好的下一个 TWT 时间点到来时苏醒。 - 对已经建立的 TWT,用户可以根据需求协商暂停/恢复 TWT 或者终止 TWT。 - - - TWT 协商建立 - - - Individual TWT 协商建立 - - 在 iTWT 协商建立过程中,通常由 Station 充当请求发起方发送 TWT 请求,而后 AP 作为接收方对该请求做出回应。AP 也可以主动向 Station 发起 TWT 协商建立过程。 - 在成功建立起 iTWT 协商后,Station 可以进入休眠状态,直到约定好的下一个 TWT 时间点到来时苏醒,该时间点通过和 AP 间的协商得到。Station 醒来后和 AP 进行数据交换,这段时间被称为 TWT 服务时间 (Service Period, SP)。 - TWT SP 的持续时间被称为 TWT Wake Duration,其最小值为 256 微秒。当一次 TWT SP 结束后,Station 进入休眠状态直到下次 TWT SP 醒来进行数据传输。本次 TWT SP 的起始到下次 TWT SP 的起始的时间间隔被称为 TWT Wake Interval。下图为基本的 iTWT 示例: - - .. figure:: ../../_static/itwt_setup.png - :align: center - - Individual TWT 协商建立过程示例 - - Station 在 iTWT 协商建立时可以发送不同类型的请求,AP 会根据请求类型及参数做出对应的回复。用户需要根据 AP 回复中的类型和具体参数决定后续的操作逻辑。Station 所发送的请求类型有 ``Request``、``Suggest`` 和 ``Demand``。 - AP 的回复类型可分为 ``Accept``、``Alternate`` 和 ``Dictate``。下表描述了发送不同请求时 AP 可能的回复以及不同情况下对应的含义: - - .. list-table:: - :header-rows: 1 - :widths: 20 10 40 - - * - 请求类型 - - AP 回复 - - 含义 - * - Request, Suggest or Demand - - No response - - 在该情况下 AP 不会与 Station 建立 iTWT 协商。 - * - Suggest or Request - - Accept - - AP 同意建立 iTWT 协商,其使用的参数以回复中 TWT 参数为准。回复中的 TWT 参数有可能与请求中不一致。 - * - Demand - - Accept - - AP 同意建立 iTWT 协商,且回复中的 TWT 参数与请求中的一致。 - * - Demand or Suggest - - Alternate - - AP 使用该回复类型代表给 Station提供一组备选 TWT 参数,此时不会建立 iTWT 协商。后续 Station 可以发送新的请求,但 AP 仍有可能使用该组参数。 - * - Demand or Suggest - - Dictate - - AP 使用该回复类型代表给 Station 提供一组备选 TWT 参数,此时不会建立 iTWT 协商,同时也表明 AP 不接受除该组参数以外的其他参数。后续 Station 可以发送新的请求,但只有参数与所提供的备选参数一致才会收到 Accept 回复。 - * - Request, Suggest or Demand - - Reject - - 在该情况下 AP 不会与 station 建立 iTWT 协商。后续 Station 可以更改 TWT 参数发送新的请求。 - - 在 TWT SP 中依照数据交互时的操作可以将 TWT 进一步地细分为多种类型,下表描述了这些类型间的差异: - - .. list-table:: - :header-rows: 1 - :widths: 10 20 - - * - Types - - 含义 - * - Trigger-enabled - - AP 会在 SP 中使用 Trigger 帧来协调 Station 的数据传输。 - * - Non trigger-enabled - - 在 SP 中不需要使用 Trigger 帧。 - * - Announced - - Station 会发送 QoS Null 帧告知 AP 其唤醒状态。 - * - Unannounced - - 不需要发送 QoS Null 帧。 - - - Broadcast TWT 协商建立 - - 与 iTWT 不同的是,在 bTWT 模式下 AP 将 TWT 信息放在 Beacon 帧中进行广播宣告。Station 接收到 Beacon 后,可以向 AP 发送请求申请选择加入某个 TWT。 - 当建立起 bTWT 协商后, Station 和 AP 会在协商好的 TWT SP 中进行数据传输。 - - 与 iTWT 类似,可以把 bTWT 进一步分成 Trigger-enabled 和 Non trigger-enabled 类型,以及 Announced 和 Unannounced 类型,具体的行为差异可以参考 iTWT 中的描述。 - - - TWT 协商暂停/恢复 - - 建立起 TWT 协商后, Station 可以通过向 AP 发送 TWT Information 帧暂停或者恢复指定的 TWT 协商。由 flow_id 来标识需要暂停或者恢复的 TWT 协商,具体可以参考 TWT 参数配置。 - - .. figure:: ../../_static/itwt_suspend.png - :align: center - - Individual TWT 协商暂停/恢复过程示例 - - - TWT 协商终止 - - 建立起 TWT 协商后, Station 可以通过向 AP 发送 TWT Teardown 帧终止指定的 TWT 协商。由 flow_id 来标识需要终止的 TWT 协商,具体可以参考 TWT 参数配置。 - - .. figure:: ../../_static/itwt_teardown.png - :align: center - - Individual TWT 协商终止过程示例 - - TWT 参数配置 - ++++++++++++ - - 在使用过程中,需要配置 TWT 和低功耗模式的相关参数,其中低功耗模式相关参数决定了设备在休眠状态下的行为模式。本小节将主要阐述如何配置 TWT,有关低功耗模式下的参数配置,请参考 `如何配置 Wi-Fi 场景下低功耗模式`_。 - - - Individual TWT 参数配置 - - 在建立 Station 和 AP 间的 iTWT 时,使用 :component_file:`esp_wifi/include/esp_wifi_he_types.h` 中定义的结构体 :cpp:type:`wifi_twt_setup_config_t` 来配置 TWT 的相关参数,其定义如下: - - .. code-block:: C - - typedef struct - { - wifi_twt_setup_cmds_t setup_cmd; - uint16_t trigger :1; - uint16_t flow_type :1; - uint16_t flow_id :3; - uint16_t wake_invl_expn :5; - uint16_t wake_duration_unit :1; - uint16_t reserved :5; - uint8_t min_wake_dura; - uint16_t wake_invl_mant; - uint16_t twt_id; - uint16_t timeout_time_ms; - } wifi_twt_setup_config_t; - - :cpp:type:`wifi_twt_setup_config_t` 中各个字段的含义如下: - - .. list-table:: - :header-rows: 1 - :widths: 15 45 - :align: center - - * - 字段 - - 描述 - * - setup_cmd - - 指示了 TWT 建立时请求和回复使用的命令类型,具体类型请参阅 :cpp:type:`wifi_twt_setup_cmds_t` 。 - * - trigger - - 值为 1 时配置 TWT 类型为 Trigger-enabled,值为 0 时配置为 Non trigger-enabled。 - * - flow_type - - 值为 1 时配置 TWT 类型为 Unannounced,值为 0 时配置为 Announced。 - * - flow_id - - 当建立起一个 iTWT 协商后,AP 会为其分配 flow_id。Station 在协商建立请求中可以指定 flow_id,但在 AP 的回复中该字段可能会被改变。 - * - wake_invl_expn - - TWT Wake Interval 指数部分。 - * - wake_duration_unit - - TWT Wake Duration 计数单元。为 0 代表 256 微秒,为 1 代表以 TU (1024 微秒) 为单位。 - * - reserved - - 保留字段。 - * - min_wake_dura - - 该字段代表 Station 期望处于唤醒状态的时间,以 ``wake_duration_unit`` 作为基本单位。 - * - wake_invl_mant - - TWT Wake Interval 尾数部分。 - * - twt_id - - TWT 配置标识。在发起多个 TWT 请求时,该字段用于在 handler 中区分不同的 TWT 参数配置。 - * - timeout_time_ms - - TWT 请求超时时间,单位为毫秒。 - - 需要指出的是,Station 在协商中所期望的 TWT Wake Interval 为 wake_invl_mant * 2\ :sup:`wake_invl_expn`\,单位是微秒。 - 而所期望的 TWT Wake Duration 为 min_wake_dura * wake_duration_unit。 - - .. note:: - 注意, TWT Wake Interval 和 TWT Wake Duration 的差值需要大于 10 毫秒。 - - 配置示例如下: - - .. code-block:: C - - wifi_twt_setup_config_t setup_config = { - .setup_cmd = TWT_REQUEST, - .flow_id = 0, - .twt_id = 0, - .flow_type = 0, - .min_wake_dura = 255, - .wake_duration_unit = 0, - .wake_invl_expn = 10, - .wake_invl_mant = 512, - .trigger = 1, - .timeout_time_ms = 5000, - }; - - 以上配置指定建立 TWT 请求时使用的类型为 Trigger-enabled,Announced,期望的 TWT Wake Interval 为 524288 微秒, TWT Wake Duration 为 65280 微秒。配置好 :cpp:type:`wifi_twt_setup_config_t` 后,调用 API :cpp:func:`esp_wifi_sta_itwt_setup` 向 AP 发起 iTWT 建立请求。 - - .. note:: - {IDF_TARGET_NAME} 支持用户调用 API :cpp:func:`esp_wifi_sta_itwt_set_target_wake_time_offset` 配置相对于目标唤醒时间的偏移时间。 - - TWT 事件 - ++++++++++ - - - WIFI_EVENT_ITWT_SETUP - - 发送请求后,用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_SETUP` 事件的对应处理程序中获取请求结果并自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_itwt_setup_t` 结构体中,其成员变量 status 指示了此次事件的状态。 - 当 status 为 :c:macro:`ITWT_SETUP_SUCCESS` 时代表请求成功收到了对应回复,为其他值代表请求失败。在得到请求成功的状态后,用户可以从该结构体中的 config 成员变量中得到 AP 回复中的具体参数,并根据具体参数决定后续的处理逻辑。 - 例如,Station 发送了类型为 Demand 的 TWT 请求,收到 AP 的回复类型为 Dictate,用户此时可以考察回复中的 TWT 参数是否可行,若可行便可以发送一个新的 TWT 请求与 AP 继续建立 TWT 协商,并且该请求中的 TWT 参数需要与 AP 回复中一致。 - - 在 Station 未主动发送请求时也有可能触发 :cpp:enumerator:`WIFI_EVENT_ITWT_SETUP` 事件,这种情况下对应的是 AP 主动向 Station 发起 iTWT 协商建立过程,此时 AP 向 Station 发送的帧中会带有 TWT 参数。同样地,用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_SETUP` 事件的对应处理程序中获取结果并自定义处理逻辑。 - 用户需要检查 config 成员变量中 AP 发送的 TWT 参数类型,一般有两种情况: - 1. AP 发送的 TWT 参数为 Accept 类型,此时 Station 会与 AP 建立起使用该 TWT 参数的 iTWT 协商。若用户不希望建立此 iTWT 协商,可以向 AP 发送 Teardown 帧。 - 2. AP 发送的 TWT 参数为 Alternate 或 Dictate 类型,此时 Station 不会与 AP 建立起 iTWT 协商,但可以在接下来使用该参数向 AP 发起 iTWT 协商建立请求。 - - - WIFI_EVENT_ITWT_SUSPEND - - 在调用 API :cpp:func:`esp_wifi_sta_itwt_suspend` 请求暂停已经建立的 iTWT 协商时, 用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_SUSPEND` 事件的对应处理程序中获取请求结果并自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_itwt_suspend_t` 结构体中,其成员变量 status 指示了此次事件的状态。 - 当 status 为 :c:macro:`ESP_OK` 时代表成功暂停了指定的 iTWT 协商,为其他值代表请求暂停失败。 - - .. note:: - 注意,调用 API :cpp:func:`esp_wifi_sta_itwt_suspend` 请求暂停 iTWT 时,用户需要指定对应 iTWT 的 flow_id 以及暂停时间。需要注意的是,当暂停时间大于 0 时,对应 iTWT 会在暂停指定时间后恢复,而当暂停时间为 0 时,对应的 iTWT 会暂停,直到被用户调用 API 手动恢复为止。 - - - WIFI_EVENT_ITWT_TEARDOWN - - 在调用 API :cpp:func:`esp_wifi_sta_itwt_teardown` 请求终止 iTWT 时,用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_TEARDOWN` 事件的对应处理程序中获取请求结果并自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_itwt_teardown_t` 结构体中,其成员变量 status 指示了此次事件的状态。 - 当 status 为 :cpp:enumerator:`ITWT_TEARDOWN_SUCCESS` 时代表成功终止了指定的 iTWT 协商,为其他值代表终止 iTWT 失败。调用 API 时用户需要指定需要终止的 iTWT 的 flow_id。 - - - WIFI_EVENT_TWT_WAKEUP - - 当 Station 在休眠中醒来时,Wi-Fi 驱动程序将会上报 :cpp:enumerator:`WIFI_EVENT_TWT_WAKEUP` 事件,用户可以在该事件的对应处理程序中自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_twt_wakeup_t` 结构体中,成员变量 twt_type 指示了此次事件 TWT 的类型,成员变量 flow_id 指示了此次醒来的具体的 TWT。 - - - WIFI_EVENT_ITWT_PROBE - - 调用 API :cpp:func:`esp_wifi_sta_itwt_send_probe_req` 在 iTWT 期间发送 probe request 时,用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_PROBE` 事件的对应处理程序中获取请求结果并自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_itwt_probe_t` 结构体中,其成员变量 status 指示了此次事件的状态。 - 当 status 为 :cpp:enumerator:`ITWT_PROBE_SUCCESS` 时代表成功发送 probe request 并且接收到 AP 回复的 probe response,为其他值代表发送或者接收 probe 失败。 - - - 有关 iTWT 使用的更多信息,可以参考示例 :example:`wifi/itwt` 。 - - TWT 功耗分析 - +++++++++++++ - - 为了展现 TWT 在节省设备功耗方面的优势,我们使用功率分析仪追踪了 {IDF_TARGET_NAME} 在不同模式下的电流情况。如下图所示,{IDF_TARGET_NAME} 首先处于 DTIM 模式,接着与 AP 建立起 iTWT 协商,TWT Wake Interval 为 10 s,在 TWT SP 结束后,{IDF_TARGET_NAME} 会进入 Light-sleep 状态直到下个 SP 到来时唤醒。 - 其中 :cpp:type:`wifi_twt_setup_config_t` 配置示例如下: - - .. code-block:: C - - wifi_twt_setup_config_t setup_config = { - .setup_cmd = TWT_REQUEST, - .flow_id = 0, - .twt_id = 0, - .flow_type = 0, - .min_wake_dura = 255, - .wake_duration_unit = 0, - .wake_invl_expn = 10, - .wake_invl_mant = 10000, - .trigger = 1, - .timeout_time_ms = 5000, - }; - - .. figure:: ../../_static/itwt_10s_current.png - :align: center - - DTIM 与 iTWT 模式下的电流图 - - 进一步,将 TWT 协商中的 TWT Wake Interval 参数更改为 30 s,下图展现了参数变化对于电流的影响。 - 其中 :cpp:type:`wifi_twt_setup_config_t` 配置示例如下: - - .. code-block:: C - - wifi_twt_setup_config_t setup_config = { - .setup_cmd = TWT_REQUEST, - .flow_id = 0, - .twt_id = 0, - .flow_type = 0, - .min_wake_dura = 255, - .wake_duration_unit = 0, - .wake_invl_expn = 10, - .wake_invl_mant = 30000, - .trigger = 1, - .timeout_time_ms = 5000, - }; - - .. figure:: ../../_static/itwt_30s_current.png - :align: center - - 更改参数后的 DTIM 与 iTWT 模式下的电流图 diff --git a/docs/zh_CN/api-guides/low-power-mode/index.rst b/docs/zh_CN/api-guides/low-power-mode/index.rst new file mode 100644 index 00000000000..8c1d526cfe4 --- /dev/null +++ b/docs/zh_CN/api-guides/low-power-mode/index.rst @@ -0,0 +1,15 @@ +低功耗模式 +============ + +:link_to_translation:`en:[English]` + +概述 +------ + +在嵌入式物联网应用场中,待机性能表现十分重要。本指南旨在介绍 {IDF_TARGET_NAME} 低功耗的基本原理,同时介绍 {IDF_TARGET_NAME} 支持的低功耗模式。文档还会具体给出推荐配置、配置步骤和每种模式下的功耗表现,以帮助用户根据实际需求快速配置适合的低功耗模式。 + +.. toctree:: + :maxdepth: 2 + + low-power-mode-soc + :SOC_WIFI_SUPPORTED: low-power-mode-wifi diff --git a/docs/zh_CN/api-guides/low-power-mode/low-power-mode-soc.rst b/docs/zh_CN/api-guides/low-power-mode/low-power-mode-soc.rst new file mode 100644 index 00000000000..24c36f23d4c --- /dev/null +++ b/docs/zh_CN/api-guides/low-power-mode/low-power-mode-soc.rst @@ -0,0 +1,495 @@ +系统低功耗模式介绍 +=================== + +:link_to_translation:`en:[English]` + +{IDF_TARGET_NAME} 支持多种低功耗模式,从系统功耗管理角度来看,主要有 DFS、Light-sleep 模式和 Deep-sleep 模式。这些模式降低功耗的主要策略是在不影响系统功能的前提下,尽可能降低时钟频率 (DFS) 或进入睡眠状态,在睡眠状态下关闭不必要的电源域或对不使用的外设进行时钟门控以降低功耗。根据关闭电源域的等级是否会破坏程序运行上下文又细分为 Light-sleep 模式和 Deep-sleep 模式。 + +.. only:: SOC_WIFI_SUPPORTED or SOC_BLE_SUPPORTED + + 其次地,对于 {IDF_TARGET_NAME} 常用的工作场景,如 Wi-Fi/蓝牙工作时,基于上述的几种低功耗模式,ESP-IDF 还提供了进行过针对性优化的细分低功耗模式,将在后续章节介绍。 + +本节将首先从纯系统角度介绍,不涉及具体工作场景的低功耗模式。 + +DFS +------ + +Dynamic Frequency Scaling (DFS) 即动态频率切换,是 ESP-IDF 中集成的电源管理机制的基础功能。DFS 可以根据应用程序持有电源锁的情况,调整外围总线 (APB) 频率和 CPU 频率。持有高性能锁就使用高频,空闲状态不持有电源锁时则使用低频来降低功耗,以此来尽可能减少运行应用程序的功耗。 + +DFS 的调频机制即根据持有电源锁的最大频率需求来调整频率,同时,`CONFIG_FREERTOS_HZ` 的数值也会对 DFS 调频产生影响。:ref:`CONFIG_FREERTOS_HZ` 值越大,即系统任务调度的频率越高,意味着系统能更及时地根据需求调整频率。有关调频机制的详细信息,请参见 :doc:`电源管理 <../../api-reference/system/power_management>`。 + +下图为 DFS 调频机制运行的理想电流情况。 + +.. code-block:: text + + 持有 CPU 和 APB MAX 锁 + │ + │ 释放 CPU MAX 锁 + ▲ │ / + 电流大小 │ ▼ / + │ ──────────┐ 释放 APB MAX 锁 + │ │ / + │ │ / + │ └─────────┐ + │ ▲ │ + │ │ │ + │ 第 m 个 tick │ └─────────── + │ ▲ + │ │ + │ 第 n 个 tick │ + └──────────────────────────────────────► + 时间 + 理想 DFS 机制调频电流图 + +DFS 适用于 CPU 必须处于工作状态但是对低功耗有需求的场景,因此 DFS 通常与其他低功耗模式共同开启,下文会详细介绍。 + +.. _Light-sleep 模式: + +Light-sleep 模式 +------------------- + +Light-sleep 模式是 {IDF_TARGET_NAME} 预设的一种低功耗模式,用户可以通过调用 :cpp:func:`esp_light_sleep_start` 接口主动切换至 Light-sleep 模式,进入睡眠后,芯片将根据当前各外设的工作状态,关闭不必要的电源域和对睡眠期间不使用的模块进行时钟门控。{IDF_TARGET_NAME} 支持多种唤醒源,详见 :doc:`睡眠模式 <../../api-reference/system/sleep_modes>`,当芯片从 Light-sleep 模式唤醒后,CPU 会接着入睡时的上下文继续运行,外设的工作状态也不会被破坏。为充分利用 Light-sleep 模式以降低芯片功耗,更推荐用户使用下述的 Auto Light-sleep 模式。 + +Auto Light-sleep 模式是 ESP-IDF :doc:`电源管理 <../../api-reference/system/power_management>` 组件基于 FreeRTOS 的 Tickless IDLE 功能提供的一种低功耗模式。当应用程序释放所有电源锁,FreeRTOS 的所有任务都进入阻塞态或挂起态时,系统会自动获取下一个有就绪事件需要唤醒操作系统的时间点,当判定此时间点距当前超过设定时间(:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`)后,``esp_pm`` 组件会自动配置定时器唤醒源并进入 light sleep 以降低功耗。用户在配置 DFS 时置真 :cpp:type:`esp_pm_config_t` 中的 ``light_sleep_enable`` 字段即可启用该模式,详见下文中的 `DFS 配置`_。 + +.. code-block:: text + + ┌────────┐ + │ │ + │ DFS │ + │ │ + └───┬────┘ + │ + ▼ + ┌──────────┐ 系统空闲 ┌──────────┐ 超过设定时间 ┌──────────┐ + │ │ ─────────────► │ │ ────────────► │ │ + │ │ │ │ │ auto │ + │ active │ │ IDLE │ │ light │ + │ │ │ │ │ sleep │ + │ │ ◄───────────── │ │ │ │ + └──────────┘ 系统非空闲 └──────────┘ └────┬────┘ + ▲ │ + │ 配置唤醒源唤醒 │ + └──────────────────────────────────────────────────────────────┘ + + Auto Light-sleep 模式工作流程图 + +根据 Auto Light-sleep 模式的工作流程可得其理想电流图,关键节点均在图上标出。 + +.. code-block:: text + + 电流 ▲ 系统 IDLE DFS 降频 + 大小 | │ 系统判断空闲时间超过设定值 + | ▼ / light sleep + | ┌──┐ / ┌──┐ + | │ └──┐ │ └──┐ + | | │ | │ + | │ │ │ │ + | ───┘ └────────┘ └──── + | \ + │ 唤醒源唤醒 + └───────────────────────────────► + 时间 + Auto Light-sleep 模式理想电流图 + +.. note:: + + - 为更加清晰地展现出 Auto Light-sleep 模式的主要变化,上图中省略了 DFS 降频过程。 + + - Auto Light-sleep 模式适用于不需要实时响应外界需求的场景。 + + - Auto Light-sleep 功能基于定时器唤醒源实现,所以用户应用程序中不可以再主动配置定时器唤醒源。 + + +.. _Deep-sleep 模式: + +Deep-sleep 模式 +----------------- + +Deep-sleep 模式是为了追求更好的功耗表现所设计,休眠时仅保留 RTC/LP 相关内存及外设,其余模块全部关闭。与 Light-sleep 模式类似,Deep-sleep 模式同样通过 API 进入,且需要配置唤醒源进行唤醒,用户可以通过调用 :cpp:func:`esp_deep_sleep_start` 接口主动切换至 Deep-sleep 模式。 + +Deep-sleep 模式需配置唤醒源,{IDF_TARGET_NAME} 支持多种唤醒源,完整唤醒源列表详见 :doc:`睡眠模式 <../../api-reference/system/sleep_modes>`。这些唤醒源也可以组合在一起,此时任何一个唤醒源都可以触发唤醒。若不配置唤醒源进入 Deep-sleep 模式,芯片将一直处在睡眠状态,直到外部复位。与 Light-sleep 模式不同,Deep-sleep 模式唤醒后会丢失睡眠前的 CPU 运行上下文,因此,唤醒后需要重新运行引导加载程序才可进入用户程序。 + +Deep-sleep 模式工作流程如下图所示: + +.. code-block:: text + + ┌───────┐ 调用 API ┌───────┐ + │ ├───────────►│ deep │ + │active │ │ sleep │ + │ │ │ │ + └───────┘ └───┬───┘ + ▲ │ + └────────────────────┘ + 配置的唤醒源唤醒 + Deep-sleep 模式工作流程图 + +Deep-sleep 模式主要应用场景决定了系统很长时间才会苏醒一次,完成工作后又会继续进入 deep sleep 状态,所以其理想电流图如下。 + +.. code-block:: text + + 电流 ▲ + 大小 | + | 调用 API + | │ + | ▼ + | ┌────┐ + | │ │ + | 唤醒源唤醒 | | + | \ | | + | \ │ │ + │ ──────────┘ └──────────────── + │ + └──────────────────────────────────────────► + 时间 + Deep-sleep 模式理想电流图 + +Deep-sleep 模式可以用于低功耗的传感器应用,或是大部分时间都不需要进行数据传输的情况,也就是通常所说的待机模式。 + + +.. only:: ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB + + 设备也可以每隔一段时间从 deep sleep 状态醒来测量数据并上传,之后重新进入 deep sleep;也可以将多个数据存储于 RTC 内存,然后在下次唤醒时一次性发送。此特性可借助 deep-sleep-stub 功能实现,详见 :doc:`Deep-sleep 唤醒存根 <../../api-guides/deep-sleep-stub>`。 + +如何配置纯系统下低功耗模式 +------------------------------ + +介绍完纯系统下的低功耗模式后,本节将介绍公共配置选项、每种模式的推荐配置以及配置方法。 + +公共配置选项 +------------ + +.. note:: + + 下文为公共配置选项的简单介绍,点击相应链接获取详细内容。 + +.. only:: esp32 or esp32s3 + + - 单双核工作模式 (:ref:`CONFIG_FREERTOS_UNICORE`) + 对于多核心芯片,可以选择单核工作模式。 + + + - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + 该参数表示系统周期任务调度的频率。 + + +DFS 配置 +------------ + +DFS 有如下可配置选项: + +- ``max_freq_mhz`` + 该参数表示最大 CPU 频率 (MHz),即 CPU 最高性能工作时候的频率,一般设置为芯片参数的最大值。 + +- ``min_freq_mhz`` + 该参数表示最小 CPU 频率 (MHz),即系统处在空闲状态时 CPU 的工作频率。该字段可设置为晶振 (XTAL) 频率值,或者 XTAL 频率值除以整数。 + +- ``light_sleep_enable`` + 使能该选项,系统将在空闲状态下自动进入 light sleep 状态,即 Auto Light-sleep 模式使能,上文已经具体介绍。 + +具体配置方法如下: + +1. 使能 :ref:`CONFIG_PM_ENABLE` +2. 配置 ``max_freq_mhz`` 和 ``min_freq_mhz``,方式如下: + + :: + + esp_pm_config_t pm_config = { + .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, + .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, + .light_sleep_enable = false + }; + ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); + +推荐配置 +++++++++++++++ + +.. list-table:: + :header-rows: 1 + :widths: 40 20 + + * - 配置名称 + - 设置情况 + + * - 启用电源管理组件 (:ref:`CONFIG_PM_ENABLE`) + - ON + + * - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + - 1000 + + * - ``max_freq_mhz`` + - 160 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - false + +.. note:: + 上表中不涉及的配置均是默认。 + + +Light-sleep 模式配置 +--------------------- + +本节介绍 Auto Light-sleep 模式的推荐配置和配置步骤。 + +.. note:: + + 下文为 Auto Light-sleep 模式配置选项的简单介绍,点击相应链接获取详细内容。 + +- 进入睡眠模式前最小 IDLE Tick 数 (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`) +- 将 light sleep 相关代码放置在片内 RAM 中 (:ref:`CONFIG_PM_SLP_IRAM_OPT`) +- 将 RTOS IDLE 相关代码放置在片内 RAM 中 (:ref:`CONFIG_PM_RTOS_IDLE_OPT`) +- RTC 慢速时钟源 (:ref:`CONFIG_RTC_CLK_SRC`) + + .. list-table:: + :header-rows: 1 + :widths: 40 40 20 + + * - 时钟源 + - 定时精度 + - 频偏 + + * - RTC_CLK_SRC_INT_RC + - 高 + - 大 + + * - RTC_CLK_SRC_EXT_CRYS + - 低 + - 小 + +- 芯片休眠时禁用所有 GPIO (:ref:`CONFIG_PM_SLP_DISABLE_GPIO`) + +.. only:: SOC_PM_SUPPORT_MAC_BB_PD + + - 关闭 MAC 和基带 (:ref:`CONFIG_ESP_PHY_MAC_BB_PD`) + + +.. only:: SOC_PM_SUPPORT_CPU_PD + + - 关闭 CPU (:ref:`CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP`) + + +.. only:: SOC_PM_SUPPORT_TAGMEM_PD + + - 关闭指令和数据缓存中的标签存储器 (I/D-cache tag memory) (:ref:`CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP`) + + +.. only:: SOC_PM_SUPPORT_VDDSDIO_PD + + - 在 light sleep 状态关闭 flash 供电 (:ref:`CONFIG_ESP_SLEEP_POWER_DOWN_FLASH`) + + .. only:: SOC_SPIRAM_SUPPORTED + + 由于 flash 和 PSRAM 共用供电管脚,PSRAM 关闭供电将会导致数据丢失,因此,为保证 light sleep 不破坏程序运行状态,启用该选项的前提是系统没有使用 PSRAM。 + + +配置方法: + +1. 配置唤醒源(详见 :doc:`睡眠模式 <../../api-reference/system/sleep_modes>`) +2. 使能 :ref:`CONFIG_PM_ENABLE` +3. 使能 :ref:`CONFIG_FREERTOS_USE_TICKLESS_IDLE` +4. 配置 DFS 参数 +5. ``light_sleep_enable`` = true,具体如下: + + :: + + esp_pm_config_t pm_config = { + .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, + .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, + #if CONFIG_FREERTOS_USE_TICKLESS_IDLE + .light_sleep_enable = true + #endif + }; + ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); + +6. 配置介绍的其余相关参数 + +推荐配置 ++++++++++ + +.. only:: esp32c3 or esp32s3 + + .. list-table:: + :header-rows: 1 + :widths: 30 15 + + * - 配置名称 + - 设置情况 + + * - 启用电源管理组件 (:ref:`CONFIG_PM_ENABLE`) + - ON + + * - 启用 Tickless IDLE 模式 (:ref:`CONFIG_FREERTOS_USE_TICKLESS_IDLE`) + - ON + + * - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + - 1000 + + * - 进入睡眠模式前最小 IDLE Tick 数 (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`) + - 3 + + * - 将 light sleep 相关代码放置在片内 RAM 中 (:ref:`CONFIG_PM_SLP_IRAM_OPT`) + - OFF + + * - 将 RTOS IDLE 相关代码放置在片内 RAM 中 (:ref:`CONFIG_PM_RTOS_IDLE_OPT`) + - OFF + + * - RTC 慢速时钟源 (:ref:`CONFIG_RTC_CLK_SRC`) + - 内部 150 kHz 振荡器 + + * - 芯片休眠时禁用所有 GPIO (:ref:`CONFIG_PM_SLP_DISABLE_GPIO`) + - ON + + * - 关闭 MAC 和基带 (:ref:`CONFIG_ESP_PHY_MAC_BB_PD`) + - ON + + * - 关闭 CPU (:ref:`CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP`) + - ON + +.. only:: SOC_PM_SUPPORT_TAGMEM_PD + + * - 关闭指令和数据缓存中的标签存储器 (I/D-cache tag memory) (:ref:`CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP`) + - ON + + + * - 在 light sleep 状态关闭 flash 供电 (:ref:`CONFIG_ESP_SLEEP_POWER_DOWN_FLASH`) + - OFF + + * - ``max_freq_mhz`` + - 160 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - true + + .. note:: + 上表中不涉及的配置均是默认。 + +.. only:: esp32 or esp32s2 + + .. list-table:: + :header-rows: 1 + :widths: 30 15 + + * - 配置名称 + - 设置情况 + + * - 启用电源管理组件 (:ref:`CONFIG_PM_ENABLE`) + - ON + + * - 启用 Tickless IDLE 模式 (:ref:`CONFIG_FREERTOS_USE_TICKLESS_IDLE`) + - ON + + * - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + - 1000 + + * - 进入睡眠模式前最小 IDLE Tick 数 (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`) + - 3 + + * - 将 light sleep 相关代码放置在片内 RAM 中 (:ref:`CONFIG_PM_SLP_IRAM_OPT`) + - OFF + + * - 将 RTOS IDLE 相关代码放置在片内 RAM 中 (:ref:`CONFIG_PM_RTOS_IDLE_OPT`) + - OFF + + * - RTC 慢速时钟源 (:ref:`CONFIG_RTC_CLK_SRC`) + - 内部 150 kHz 振荡器 + + * - 芯片休眠时禁用所有 GPIO (:ref:`CONFIG_PM_SLP_DISABLE_GPIO`) + - ON + + * - ``max_freq_mhz`` + - 160 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - true + + .. note:: + 上表中不涉及的配置均是默认。 + +.. only:: esp32c2 + + .. list-table:: + :header-rows: 1 + :widths: 30 15 + + * - 配置名称 + - 设置情况 + + * - 启用电源管理组件 (:ref:`CONFIG_PM_ENABLE`) + - ON + + * - 启用 Tickless IDLE 模式 (:ref:`CONFIG_FREERTOS_USE_TICKLESS_IDLE`) + - ON + + * - RTOS Tick rate (Hz) (:ref:`CONFIG_FREERTOS_HZ`) + - 1000 + + * - 进入睡眠模式前最小 IDLE Tick 数 (:ref:`CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP`) + - 3 + + * - 将 light sleep 相关代码放置在片内 RAM 中 (:ref:`CONFIG_PM_SLP_IRAM_OPT`) + - OFF + + * - 将 RTOS IDLE 相关代码放置在片内 RAM 中 (:ref:`CONFIG_PM_RTOS_IDLE_OPT`) + - OFF + + * - RTC 慢速时钟源 (:ref:`CONFIG_RTC_CLK_SRC`) + - 内部 150 kHz 振荡器 + + * - 芯片休眠时禁用所有 GPIO (:ref:`CONFIG_PM_SLP_DISABLE_GPIO`) + - ON + + * - 在 light sleep 状态关闭 flash 供电 (:ref:`CONFIG_ESP_SLEEP_POWER_DOWN_FLASH`) + - OFF + + * - ``max_freq_mhz`` + - 120 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - true + + .. note:: + 上表中不涉及的配置均是默认。 + +Deep-sleep 模式配置 +--------------------- + +对 Deep-sleep 模式来说,除了唤醒源相关配置,其余配置意义已经不大。 + +配置方法: + +1. 配置唤醒源(详见 :doc:`睡眠模式 <../../api-reference/system/sleep_modes>`) +2. 调用 API,具体如下 + +.. code-block:: none + + /* Enter deep sleep */ + esp_deep_sleep_start(); + +用户可以通过下列配置选项,让一些特定模块在休眠时保持开启状态: + +- 打开外部 40 MHz 晶振 (XTAL) + 在一些特殊应用中,部分模块对休眠时的时钟精度及稳定度有很高要求(例如蓝牙模块)。这种情况下,可以考虑在休眠过程中打开 外部 40 MHz 晶振。 + 打开和关闭代码如下:: + + ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_ON)); + ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_OFF)); + +- 打开内部 8 MHz 振荡器 (OSC) + 在一些特殊应用中,部分模块(例如 LEDC 模块)将 内部 8 MHz 振荡器作为时钟源,并且希望在 light sleep 状态也可以正常使用。这种情况下,可以考虑在休眠过程中打开内部 8 MHz 振荡器。 + 打开和关闭代码如下:: + + ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_RTC8M, ESP_PD_OPTION_ON)); + ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_RTC8M, ESP_PD_OPTION_OFF)); diff --git a/docs/zh_CN/api-guides/low-power-mode/low-power-mode-wifi.rst b/docs/zh_CN/api-guides/low-power-mode/low-power-mode-wifi.rst new file mode 100644 index 00000000000..01681e2b075 --- /dev/null +++ b/docs/zh_CN/api-guides/low-power-mode/low-power-mode-wifi.rst @@ -0,0 +1,417 @@ +Wi-Fi 场景下低功耗模式介绍 +========================== + +:link_to_translation:`en:[English]` + +本节将结合纯系统下的功耗模式来介绍 Wi-Fi 场景下的低功耗模式。因为 Wi-Fi 场景的复杂性,本节会首先介绍 Wi-Fi 省电的基本原理,然后再介绍具体的低功耗模式。本节主要针对 station 模式。 + +Wi-Fi 场景如何选择低功耗模式 +-------------------------------------- + +在介绍具体内容前先给出 Wi-Fi 场景下低功耗模式总结表,以方便用户根据需求快速选择想要了解的内容,选择合适的低功耗模式。 + +.. todo - add sleep-current/esp32c5_summary.inc + +.. only:: not esp32c5 + + .. include:: ../sleep-current/{IDF_TARGET_PATH_NAME}_summary.inc + +.. note:: + + 上表中所有电流均为平均电流,表中术语在下文均有介绍,用户可根据需求进行查看。 + +.. _Wi-Fi 省电的基本原理: + +Wi-Fi 省电的基本原理 +--------------------- + +首先,在 station 的工作过程中,为在接收发送过程中避免冲突,需要长时间监听信道,能耗较大的 RF 模块会一直处于工作中,浪费电量。为此,Wi-Fi 协议引入省电模式。 + +省电模式的基本原理是通过减少不必要的监听时间来降低耗能。AP 会缓存进入省电模式的 station 的包,同时周期发送包含 TIM 信息的 beacon 帧,TIM 会指示 AP 缓存的单播包。TIM 中,DTIM 较为特殊,其会缓存广播包,并以 n 个(由 AP 决定)TIM 为周期发送。对 station 来说,TIM 非必听,而 DTIM 为必听。因此,station 可以选择只在每一个 DTIM 帧前醒来打开 Wi-Fi 相关模块(RF 模块),而不必时刻处于监听状态,这样就能有效降低功耗。 + +.. code-block:: text + + DTIM DTIM + TIM │ │ + │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ + AP ───┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴──── + + + ┌────┐ ┌────┐ + │ │ │ │ + │ │ │ │ + │ │ │ │ + Sta ────────────────┴────┴─────────────┴────┴───────────────── + + DTIM4 省电模式示意图 + +其次,station 从打开到再次关闭 Wi-Fi 相关模块的时间也会影响功耗。除必要的数据传输处理时间外,主要有四项配置会影响时间长短: + + - 时钟准确性导致的 time offset,主要原因是时钟或多或少都会与理想的时间存在偏移,同时偏移的正负不定。 + - 处理 beacon 漏听后的时间,如漏听后持续监听时间、允许最多丢失 beacon 数目等,这段时间存不存在以及存在多久都不定,但是可以配置范围。 + - 为了确保能够接受突发数据包而添加的 active 时间,可由配置决定。 + - ILDE 时间是具体某些功耗模式进入条件要求。因此在满足通信需求的情况下,降低工作时间可以改善功耗表现。 + +.. code-block:: text + + ┌────────────┬────────────┬────────────┬────────────┬────────────┐ + │ │ │ │ │ │ + │time offset │ 必要处理时间 │ beacon │ active │ IDLE │ + │ │ │ 漏听处理时间 │ 时间 │ 时间 │ + │ │ │ │ │ │ + └────────────┴────────────┴────────────┴────────────┴────────────┘ + 芯片工作时间组成图 + +此外,在 station 没有处于 Wi-Fi 接收或发送状态时,影响功耗的因素变成了芯片的其他模块。不同的功耗模式会配置不同的时钟源,或者动态调整一些模块的工作频率如 CPU,同时还会关闭不同数量的功能模块,这将有效降低芯片的功耗。用户可根据需求自己选择合适的配置。 + +如果以时间为横轴,电流大小为纵轴建立坐标轴,那么处在低功耗模式下芯片的理想工作电流图可以简化成下图: + +.. code-block:: text + + ▲ + 电流 | + 大小 | + | interval period + | │ ◄──────────► │ │ ◄─► │ + | ┌─────┐ ┌─────┐ ┌─────┐ + | │ │ │ │ │ │ + | | | | | | | base current + | | | | | | | | + | | | | | | | ▼ + | ───┘ └────────┘ └────────┘ └────── + | + └───────────────────────────────────────────────► + 时间 + 理想情况下 Wi-Fi 场景低功耗模式电流图 + +其中 station 要进行 Wi-Fi 通信时,Wi-Fi 相关模块 (PHY) 开启,电流会显著上升,在工作完成前,电流会一直维持在一个较高的水平。工作完成后,芯片会关闭 Wi-Fi 相关模块,这时电流又会降低到一个较低水平。 + +可以看出影响功耗表现的主要有三点:interval、period 和 base current。 + + - **interval** 是 station Wi-Fi 相关模块工作的间隔,既可以由低功耗模式自定义,也可根据 Wi-Fi 协议省电机制(详细内容请见 :ref:`Wi-Fi 省电的基本原理`),由 DTIM 周期决定。可以看出在同等情下,interval 越大,功耗表现会更好,但是响应会更慢,影响通信的及时性。 + + - **period** 可以看作每次 station Wi-Fi 工作的时间,这段时间的长度也会影响功耗的表现。period 不是一个固定的时长(详细内容请见 :ref:`Wi-Fi 省电的基本原理`),在保证 Wi-Fi 通信正常的情况下,period 持续时间越短,功耗表现越好。但是减少 period 时间,必然会影响通信的可靠性。 + + - **base current** 是 Wi-Fi 相关模块不工作时芯片的电流,影响其大小的因素很多,不同的功耗模式下休眠策略不同。所以,在满足功能的情况下,优化配置降低该电流大小可以提高功耗表现,但同时关闭其余模块会影响相关功能和芯片的唤醒时间。 + +知道了影响功耗的三点因素之后,要想降低功耗应从这三点入手,接下来介绍两种低功耗模式,Modem-sleep 模式、Auto Light-sleep 模式。两种模式主要区别就是对三点因素的优化不同。 + + +Modem-sleep 模式 +------------------ + +Modem-sleep 模式主要工作原理基于 DTIM 机制,周期性的醒来处理 Wi-Fi 相关工作,又在周期间隔之间进入休眠,关闭 PHY(RF 模块)来降低功耗。同时通过 DTIM 机制,station 可以与 AP 保持 Wi-Fi 连接,数据传输。 + +Modem-sleep 模式会在 Wi-Fi 任务结束后自动进入休眠无需调用 API,休眠时仅会关闭 Wi-Fi 相关模块 (PHY),其余模块均处在正常上电状态。 + +Modem-sleep 模式默认会根据 DTIM 周期或 listen interval(于 :ref:`Modem-sleep 模式配置` 中介绍)醒来,相当于系统自动设置了一个 Wi-Fi 唤醒源,因此用户无需再配置唤醒源,同时系统主动发包时也可以唤醒。 + +Modem-sleep 模式是一个开关型的模式,调用 API 开启后一直自动运行,其工作流程十分简单,具体如下图。 + +.. code-block:: text + + ┌───────────┐ Wi-Fi 任务结束 ┌───────────┐ + │ ├────────────────────────►│ modem │ + │ active │ │ sleep │ + │ │◄────────────────────────┤ │ + └───────────┘ DTIM 周期到来 └───────────┘ + / 主动发包 + + Modem-sleep 模式工作流程图 + +根据上文的基本电流图,结合 Modem-sleep 模式的工作原理,以 Min Modem 模式(于 :ref:`Modem-sleep 模式配置` 中介绍)为例可得理想情况下电流变化图。 + +.. code-block:: text + + 电流 ▲ + 大小 | + | DTIM 周期 + | │ ◄──────────► │ + | ┌─────┐ ┌─────┐ ┌─────┐ + | │ │ │ │ │ │ + | DTIM | | | | | | + | 到来前 | | | | | | Wi-Fi 任务结束 + | \ | | | | | | / + | \ │ │ │ │ │ │/ + | ────────┘ └────────┘ └────────┘ └────── + | + └─────────────────────────────────────────────────────► + 时间 + Min Modem-sleep 模式理想电流图 + +Modem-sleep 模式一般用于 CPU 持续处于工作状态并需要保持 Wi-Fi 连接的应用场景,例如,使用 {IDF_TARGET_NAME} 本地语音唤醒功能,CPU 需要持续采集和处理音频数据。 + +DFS + Modem-sleep 模式 +------------------------- + +Modem-sleep 模式休眠状态中 CPU 仍处在工作状态,而 DFS 机制主要作用于 CPU 和 APB 工作频率来降低功耗,因此 DFS + Modem sleep 模式可以进一步优化功耗表现,又因为 Wi-Fi 任务会申请 :cpp:enumerator:`ESP_PM_CPU_FREQ_MAX` 电源锁来保证 Wi-Fi 任务快速运行,所以 DFS + Modem-sleep 模式产生调频只会发生在 base current 阶段,即 Wi-Fi 任务结束后。 + +在 Wi-Fi 场景下,为了让用户抓住主要的变化,DFS 可以进行一定的状态简化。具体来说,虽然 DFS 主要根据 CPU 和 APB 两把锁的最高需求来调频,但是 Wi-Fi 场景都需要 CPU 的频率最大化来工作,同时 Wi-Fi 任务结束后,也可以理想化的认为,没有其余的工作要完成,这样就可以简单认为经过一段时间会释放两把锁进入空闲状态(IDLE 状态),也同时忽略这段时间锁的变化导致的电流变化,简化状态。 + +在 Wi-Fi 场景下,DFS 最终简化为如下流程: + +.. code-block:: text + + ┌────────┐ + │ │ + │ DFS │ + │ │ + └───┬────┘ + │ + ▼ + ┌──────────┐ 系统空闲 ┌──────────┐ + │ │ ─────────────► │ │ + │ │ │ │ + │ active │ │ IDLE │ + │ │ │ │ + │ │ ◄───────────── │ │ + └──────────┘ 系统非空闲 └──────────┘ + + Wi-Fi 场景 DFS 简化流程图 + +在 Wi-Fi 工作的 active 状态与系统空闲的 IDLE 状态转换,Wi-Fi 任务结束后,系统经过一段时间释放了所有锁进入 IDLE 状态,此时 DFS 机制降低频率到设定最低值,忽略了转换状态期间的调频动作,方便理解。 + +简化过后的 DFS + Modem sleep 模式理想状态下的电流大小如下图所示: + +.. code-block:: text + + 电流 ▲ Wi-Fi 任务结束 + 大小 | / modem sleep + | / + | ┌─────┐ ┌─────┐ + | │ │ │ │ + | | | | | 锁释放完 + | | | | | DFS 降频 + | | | | | IDLE + | | | | | / + | | | | | / + | | │ | │ / + | │ └─┐ │ └─┐ + | ────────┘ └───────────────┘ └───────── + | + └─────────────────────────────────────────────────────► + 时间 + DFS + Modem sleep 模式理想电流图 + +Auto Light-sleep 模式 + Wi-Fi 场景 +------------------------------------ + +Auto Light-sleep 模式在 Wi-Fi 场景下是 ESP-IDF 电源管理机制、DTIM 机制和 Light-sleep 模式的结合。开启电源管理是其前置条件,auto 体现在系统进入 IDLE 状态超过设定值后自动进入 light sleep。同时 Auto Light-sleep 模式同样遵循 DTIM 机制,会自动苏醒,可以与 AP 保持 Wi-Fi 连接。 + +Auto Light-sleep 模式在 Wi-Fi 场景下休眠机制与纯系统下一样,仍然依赖于电源管理机制,进入休眠的条件为系统处于 IDLE 状态的时间超过设定时间,并且系统会提前判断空闲时间是否满足条件,若满足直接休眠。该过程为自动进行。休眠时会自动关闭 RF、8 MHz 振荡器、40 MHz 高速晶振、PLL,门控数字内核时钟,暂停 CPU 工作。 + +Auto Light-sleep 模式在 Wi-Fi 场景下遵循 DTIM 机制,自动在 DTIM 帧到来前苏醒,相当于系统自动设置了一个 Wi-Fi 唤醒源,因此用户无需再配置唤醒源。同时系统主动发包时也可以唤醒。 + +Auto Light-sleep 模式在 Wi-Fi 场景下工作流程较为复杂,但全程都是自动进行,具体如下图所示: + +.. code-block:: text + + ┌────────┐ + │ │ + │ DFS │ + │ │ + └───┬────┘ + │ + ▼ + ┌──────────┐ 系统空闲 ┌──────────┐ 超过设定时间 ┌──────────┐ + │ │ ─────────────► │ │ ────────────► │ │ + │ │ │ │ │ auto │ + │ active │ │ IDLE │ │ light │ + │ │ │ │ │ sleep │ + │ │ ◄───────────── │ │ │ │ + └──────────┘ 系统非空闲 └──────────┘ └────┬────┘ + ▲ │ + │ DTIM 周期到来 / 主动发包 │ + └──────────────────────────────────────────────────────────────┘ + + Auto Light-sleep 模式工作流程图 + +Auto Light-sleep 模式在 Wi-Fi 场景下经常与 Modem-sleep 模式同时开启,这里给出 Modem + Auto Light-sleep 模式的理想电流图,关键节点均在图上标出。 + +.. code-block:: text + + DTIM 周期 + 电流 ▲ │ ◄───────────────────► │ + 大小 | ┌─────┐ ┌─────┐ + | │ │ \ │ │ + | | | \ | | + | | | Wi-Fi 任务结束 | | + | | | modem sleep | | + | | | | | + | | | | | 系统判断空闲 + | DTIM | | 系统 IDLE | | 时间超过设定值 + | 到来前 | │ DFS 降频 | │ light sleep + | \ | └─┐ / | └─┐ / + | \ │ └─┐ / │ └─┐ / + | ────────┘ └─────────────┘ └───────── + | + └─────────────────────────────────────────────────────► + 时间 + Modem + Auto Light-sleep 模式理想电流图 + +Auto Light-sleep 模式在 Wi-Fi 场景下可用于需要保持 Wi-Fi 连接,可以实时响应 AP 发来数据的场景。并且在未接收到命令时,CPU 可以处于空闲状态。比如 Wi-Fi 开关的应用,大部分时间 CPU 都是空闲的,直到收到控制命令,CPU 才需要进行 GPIO 的操作。 + + +Deep-sleep 模式 + Wi-Fi 场景 +------------------------------ + +Deep-sleep 模式在 Wi-Fi 场景下与纯系统下基本相同,详情可以参考 :ref:`Deep-sleep 模式`,这里不再介绍。 + + +如何配置 Wi-Fi 场景下低功耗模式 +---------------------------------------- + +介绍完 Wi-Fi 场景下低功耗模式后,本节将介绍公共配置选项、每种模式独有的配置选项,以及相应低功耗模式 API 的使用说明,同时给出相应模式推荐的配置(包含纯系统下的低功耗推荐配置)以及该配置的具体表现。 + +.. note:: + + 下文为配置选项的简单介绍,点击相应链接获取详细内容。 + +公共配置选项 +++++++++++++++ + +- 功耗类: + + - Max Wi-Fi TX power (dBm) (:ref:`CONFIG_ESP_PHY_MAX_WIFI_TX_POWER`) + +- 速度优化类: + + - Wi-Fi IRAM 速度优化 (:ref:`CONFIG_ESP_WIFI_IRAM_OPT`) + - Wi-Fi RX IRAM 速度优化 (:ref:`CONFIG_ESP_WIFI_RX_IRAM_OPT`) + - Wi-Fi Sleep IRAM 速度优化 (:ref:`CONFIG_ESP_WIFI_SLP_IRAM_OPT`) + + +- Wi-Fi 协议类: + + - Minimum active time (:ref:`CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME`) + + - Maximum keep alive time (:ref:`CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME`) + + - 周期性发送无条件 ARP (:ref:`CONFIG_LWIP_ESP_GRATUITOUS_ARP`) + + - 丢失 beacon 时睡眠优化 (:ref:`CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT`) + + +.. _Modem-sleep 模式配置: + +Modem-sleep 模式配置 ++++++++++++++++++++++++ + +- 可配置选项 + + - Min Modem + 该参数表示 station 按照 DTIM 周期工作,在每个 DTIM 前醒来接收 beacon,这样不会漏掉广播信息,但是 DTIM 周期由 AP 决定,如果 DTIM 周期较短,省电效果会降低。 + + - Max Modem + 该参数表示 station 会自定义一个 listen interval,并以 listen interval 为周期醒来接受 beacon。这样在 listen interval 较大时会省电,但是容易漏听 DTIM,错过广播数据。 + + +- 配置方法 + + - 调用 API,选择模式参数 + + .. code-block:: none + + typedef enum { + WIFI_PS_NONE, + WIFI_PS_MIN_MODEM, + WIFI_PS_MAX_MODEM, + } wifi_ps_type_t; + esp_err_t esp_wifi_set_ps(wifi_ps_type_t type); + + 若选择 WIFI_PS_MAX_MODEM,还需配置 listen interval,示例如下:: + + #define LISTEN_INTERVAL 3 + wifi_config_t wifi_config = { + .sta = { + .ssid = "SSID", + .password = "Password", + .listen_interval = LISTEN_INTERVAL, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + +- 推荐配置 + + 这里给出的推荐配置是 Min Modem-sleep 模式 + DFS 开启的配置 + + .. list-table:: + :header-rows: 1 + :widths: 20 15 + + * - 配置名称 + - 设置情况 + + * - WIFI_PS_MIN_MODEM + - ON + + * - CONFIG_PM_ENABLE + - ON + + * - RTOS Tick rate (Hz) + - 1000 + + * - ``max_freq_mhz`` + - 160 + + * - ``min_freq_mhz`` + - 40 + + * - ``light_sleep_enable`` + - false + +- 配置表现 + + .. todo - add sleep-current/esp32c5_modem_sleep.inc + + .. only:: not esp32c5 + + .. include:: ../sleep-current/{IDF_TARGET_PATH_NAME}_modem_sleep.inc + + +Auto Light-sleep 模式 + Wi-Fi 场景配置 ++++++++++++++++++++++++++++++++++++++++++ + +Auto Light-sleep 在 Wi-Fi 场景下的配置比纯系统下少了唤醒源的配置要求,其余几乎与纯系统下配置一致,因此可配置选项、配置步骤、推荐配置的详细介绍可以参考上文 :ref:`Deep-sleep 模式`。同时 Wi-Fi 相关配置保持默认。 + +- 配置表现 + + 该配置表现为 Auto Light-sleep 模式纯系统推荐配置 + 默认的 Wi-Fi 相关配置在 Wi-Fi 场景的表现。 + + .. todo - add sleep-current/esp32c5_light_sleep.inc + + .. only:: not esp32c5 + + .. include:: ../sleep-current/{IDF_TARGET_PATH_NAME}_light_sleep.inc + +Deep-sleep 模式 + Wi-Fi 场景配置 ++++++++++++++++++++++++++++++++++++ + +Deep-sleep 模式在 Wi-Fi 场景下的配置与纯系统下配置基本一致,因此可配置选项、配置步骤、推荐配置的详细介绍可以参考上文 :ref:`Deep-sleep 模式`。同时 Wi-Fi 相关配置保持默认。 + +- 配置表现 + + 该配置表现为 Deep-sleep 模式纯系统推荐配置 + 默认的 Wi-Fi 相关配置在 Wi-Fi 场景的表现。 + + .. only:: esp32 + + 平均电流约 5.0 μA + + .. only:: esp32s2 + + 平均电流约 5.0 μA + + .. only:: esp32s3 + + 平均电流约 6.9 μA + + .. only:: esp32c3 + + 平均电流约 4.8 μA + + .. only:: esp32c2 + + 平均电流约 4.9 μA diff --git a/docs/zh_CN/api-guides/sleep-current/esp32_light_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32_light_sleep.inc index 42f805079a4..802eeb4ff5e 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32_light_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32_light_sleep.inc @@ -2,11 +2,11 @@ :header-rows: 1 :widths: 20 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - 1 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32_modem_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32_modem_sleep.inc index b35e5478b67..2777ce0b827 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32_modem_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32_modem_sleep.inc @@ -2,12 +2,12 @@ :header-rows: 1 :widths: 20 10 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DFS - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - ON diff --git a/docs/zh_CN/api-guides/sleep-current/esp32_summary.inc b/docs/zh_CN/api-guides/sleep-current/esp32_summary.inc index b264dae15bc..40ea647ba68 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32_summary.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32_summary.inc @@ -3,10 +3,10 @@ :widths: 20 20 30 20 20 * - 项目 - - Modem Sleep - - Modem Sleep+DFS - - auto light Sleep - - Deep Sleep + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep * - 休眠 - 自动 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c2_light_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32c2_light_sleep.inc index 050ffeabbfd..b63da54ebc7 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c2_light_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c2_light_sleep.inc @@ -2,11 +2,11 @@ :header-rows: 1 :widths: 20 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 120 MHz - 1 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c2_modem_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32c2_modem_sleep.inc index 814808725ca..762b649a95d 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c2_modem_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c2_modem_sleep.inc @@ -2,12 +2,12 @@ :header-rows: 1 :widths: 20 10 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DFS - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 120 MHz - ON diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c2_summary.inc b/docs/zh_CN/api-guides/sleep-current/esp32c2_summary.inc index 70357324d49..9767d4c9b3e 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c2_summary.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c2_summary.inc @@ -3,10 +3,10 @@ :widths: 20 20 30 20 20 * - 项目 - - Modem Sleep - - Modem Sleep+DFS - - auto light Sleep - - Deep Sleep + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep * - 休眠 - 自动 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c3_light_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32c3_light_sleep.inc index a36ad970257..3321f15b449 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c3_light_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c3_light_sleep.inc @@ -2,11 +2,11 @@ :header-rows: 1 :widths: 20 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - 1 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c3_modem_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32c3_modem_sleep.inc index 81128a9967c..632fe362e5f 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c3_modem_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c3_modem_sleep.inc @@ -2,12 +2,12 @@ :header-rows: 1 :widths: 20 10 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DFS - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - ON diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c3_summary.inc b/docs/zh_CN/api-guides/sleep-current/esp32c3_summary.inc index 48168ce2a10..279fb9f023c 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c3_summary.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c3_summary.inc @@ -3,10 +3,10 @@ :widths: 20 20 30 20 20 * - 项目 - - Modem Sleep - - Modem Sleep+DFS - - auto light Sleep - - Deep Sleep + - Modem-sleep + - Modem-sleep+DFS + - Auto Ligh-sleep + - Deep-sleep * - 休眠 - 自动 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c6_light_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32c6_light_sleep.inc index 5e8500b6517..5540f34a3e2 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c6_light_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c6_light_sleep.inc @@ -2,11 +2,11 @@ :header-rows: 1 :widths: 20 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - 1 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c6_modem_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32c6_modem_sleep.inc index e1c06637ae4..e2b1588cd2b 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c6_modem_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c6_modem_sleep.inc @@ -2,12 +2,12 @@ :header-rows: 1 :widths: 20 10 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DFS - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - ON diff --git a/docs/zh_CN/api-guides/sleep-current/esp32c6_summary.inc b/docs/zh_CN/api-guides/sleep-current/esp32c6_summary.inc index e865abc938d..5357fabe16d 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32c6_summary.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32c6_summary.inc @@ -3,10 +3,10 @@ :widths: 20 20 30 20 20 * - 项目 - - Modem Sleep - - Modem Sleep+DFS - - auto light Sleep - - Deep Sleep + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep * - 休眠 - 自动 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32s2_light_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32s2_light_sleep.inc index 64c8b09d864..3a03a846504 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32s2_light_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32s2_light_sleep.inc @@ -2,11 +2,11 @@ :header-rows: 1 :widths: 20 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - 1 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32s2_modem_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32s2_modem_sleep.inc index 81eae107f39..0724a6e88c6 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32s2_modem_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32s2_modem_sleep.inc @@ -2,12 +2,12 @@ :header-rows: 1 :widths: 20 10 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DFS - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - ON diff --git a/docs/zh_CN/api-guides/sleep-current/esp32s2_summary.inc b/docs/zh_CN/api-guides/sleep-current/esp32s2_summary.inc index 4481b3a9f13..f43c1672a1b 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32s2_summary.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32s2_summary.inc @@ -3,10 +3,10 @@ :widths: 20 20 30 20 20 * - 项目 - - Modem Sleep - - Modem Sleep+DFS - - auto light Sleep - - Deep Sleep + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep * - 休眠 - 自动 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32s3_light_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32s3_light_sleep.inc index 62fca14049d..cb09ce347dc 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32s3_light_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32s3_light_sleep.inc @@ -2,11 +2,11 @@ :header-rows: 1 :widths: 20 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - 1 diff --git a/docs/zh_CN/api-guides/sleep-current/esp32s3_modem_sleep.inc b/docs/zh_CN/api-guides/sleep-current/esp32s3_modem_sleep.inc index ac94c917c44..4e91fa4caa7 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32s3_modem_sleep.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32s3_modem_sleep.inc @@ -2,12 +2,12 @@ :header-rows: 1 :widths: 20 10 10 20 20 20 - * - CPU frequency + * - CPU 频率 - DFS - DTIM - - Average current(mA) - - Max current(mA) - - Min current(mA) + - 平均电流 (mA) + - 最大电流 (mA) + - 最小电流 (mA) * - 160 MHz - ON diff --git a/docs/zh_CN/api-guides/sleep-current/esp32s3_summary.inc b/docs/zh_CN/api-guides/sleep-current/esp32s3_summary.inc index 69d9394cb65..e9131c91133 100644 --- a/docs/zh_CN/api-guides/sleep-current/esp32s3_summary.inc +++ b/docs/zh_CN/api-guides/sleep-current/esp32s3_summary.inc @@ -3,10 +3,10 @@ :widths: 20 20 30 20 20 * - 项目 - - Modem Sleep - - Modem Sleep+DFS - - auto light Sleep - - Deep Sleep + - Modem-sleep + - Modem-sleep+DFS + - Auto Light-sleep + - Deep-sleep * - 休眠 - 自动 diff --git a/docs/zh_CN/api-guides/wifi.rst b/docs/zh_CN/api-guides/wifi.rst index 6f37da81af2..581cf1cd43f 100644 --- a/docs/zh_CN/api-guides/wifi.rst +++ b/docs/zh_CN/api-guides/wifi.rst @@ -1727,7 +1727,7 @@ WPA2-Enterprise 是企业无线网络的安全认证机制。在连接到接入 {IDF_TARGET_NAME} Wi-Fi 节能模式 ----------------------------------------- -本小节将简单介绍Wi-Fi节能模式相关的概念和使用方式,更加详细的介绍请参考 :doc:`低功耗模式使用指南 <../api-guides/low-power-mode>`。 +本小节将简单介绍Wi-Fi节能模式相关的概念和使用方式,更加详细的介绍请参考 :doc:`低功耗模式使用指南 <../api-guides/low-power-mode/index>`。 station 睡眠 ++++++++++++++++++++++ From 28a3227b2f7dedec437ca39f40584c9935c6d206 Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 1 Jul 2024 17:11:33 +0800 Subject: [PATCH 104/113] feat(mipi_dsi): update low level functions to include underrun interrupt --- components/esp_lcd/dsi/esp_lcd_panel_dpi.c | 29 ++++----- components/esp_lcd/dsi/mipi_dsi_priv.h | 5 +- .../mipi_dsi_lcd/main/test_mipi_dsi_panel.c | 6 +- .../hal/esp32p4/include/hal/mipi_dsi_brg_ll.h | 59 ++++++++++++++++++- components/soc/esp32p4/include/soc/reg_base.h | 2 + 5 files changed, 78 insertions(+), 23 deletions(-) diff --git a/components/esp_lcd/dsi/esp_lcd_panel_dpi.c b/components/esp_lcd/dsi/esp_lcd_panel_dpi.c index e3d0e8a8b93..e4fcdc7e543 100644 --- a/components/esp_lcd/dsi/esp_lcd_panel_dpi.c +++ b/components/esp_lcd/dsi/esp_lcd_panel_dpi.c @@ -32,12 +32,12 @@ struct esp_lcd_dpi_panel_t { esp_lcd_panel_t base; // Base class of generic lcd panel esp_lcd_dsi_bus_handle_t bus; // DSI bus handle uint8_t virtual_channel; // Virtual channel ID, index from 0 - uint8_t cur_fb_index; // Current frame buffer index - uint8_t num_fbs; // Number of frame buffers + uint8_t cur_fb_index; // Current frame buffer index + uint8_t num_fbs; // Number of frame buffers uint8_t *fbs[DPI_PANEL_MAX_FB_NUM]; // Frame buffers uint32_t h_pixels; // Horizontal pixels uint32_t v_pixels; // Vertical pixels - size_t frame_buffer_size; // Frame buffer size + size_t fb_size; // Frame buffer size, in bytes size_t bits_per_pixel; // Bits per pixel lcd_color_rgb_pixel_format_t pixel_format; // RGB Pixel format dw_gdma_channel_handle_t dma_chan; // DMA channel @@ -126,7 +126,7 @@ static esp_err_t dpi_panel_create_dma_link(esp_lcd_dpi_panel_t *dpi_panel) // create DMA link lists dw_gdma_link_list_config_t link_list_config = { - .num_items = DPI_PANEL_LLI_PER_FRAME, + .num_items = DPI_PANEL_MIN_DMA_NODES_PER_LINK, .link_type = DW_GDMA_LINKED_LIST_TYPE_SINGLY, }; for (int i = 0; i < dpi_panel->num_fbs; i++) { @@ -191,21 +191,21 @@ esp_err_t esp_lcd_new_panel_dpi(esp_lcd_dsi_bus_handle_t bus, const esp_lcd_dpi_ uint32_t cache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_DATA); // DMA doesn't have requirement on the buffer alignment, but the cache does uint32_t alignment = cache_line_size; - size_t frame_buffer_size = panel_config->video_timing.h_size * panel_config->video_timing.v_size * bits_per_pixel / 8; + size_t fb_size = panel_config->video_timing.h_size * panel_config->video_timing.v_size * bits_per_pixel / 8; uint8_t *frame_buffer = NULL; for (int i = 0; i < num_fbs; i++) { - frame_buffer = heap_caps_aligned_calloc(alignment, 1, frame_buffer_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + frame_buffer = heap_caps_aligned_calloc(alignment, 1, fb_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); ESP_GOTO_ON_FALSE(frame_buffer, ESP_ERR_NO_MEM, err, TAG, "no memory for frame buffer"); dpi_panel->fbs[i] = frame_buffer; ESP_LOGD(TAG, "fb[%d] @%p", i, frame_buffer); // preset the frame buffer with black color // the frame buffer address alignment is ensured by `heap_caps_aligned_calloc` - // while the value of the frame_buffer_size may not be aligned to the cache line size + // while the value of the fb_size may not be aligned to the cache line size // but that's not a problem because the `heap_caps_aligned_calloc` internally allocated a buffer whose size is aligned up to the cache line size - ESP_GOTO_ON_ERROR(esp_cache_msync(frame_buffer, frame_buffer_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED), + ESP_GOTO_ON_ERROR(esp_cache_msync(frame_buffer, fb_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED), err, TAG, "cache write back failed"); } - dpi_panel->frame_buffer_size = frame_buffer_size; + dpi_panel->fb_size = fb_size; dpi_panel->bits_per_pixel = bits_per_pixel; dpi_panel->h_pixels = panel_config->video_timing.h_size; dpi_panel->v_pixels = panel_config->video_timing.v_size; @@ -282,6 +282,7 @@ esp_err_t esp_lcd_new_panel_dpi(esp_lcd_dsi_bus_handle_t bus, const esp_lcd_dpi_ mipi_dsi_brg_ll_set_underrun_discard_count(hal->bridge, panel_config->video_timing.h_size); // use the DW_GDMA as the flow controller mipi_dsi_brg_ll_set_flow_controller(hal->bridge, MIPI_DSI_LL_FLOW_CONTROLLER_DMA); + mipi_dsi_brg_ll_set_multi_block_number(hal->bridge, DPI_PANEL_MIN_DMA_NODES_PER_LINK); mipi_dsi_brg_ll_set_burst_len(hal->bridge, 256); mipi_dsi_brg_ll_set_empty_threshold(hal->bridge, 1024 - 256); // enable DSI bridge @@ -381,7 +382,7 @@ static esp_err_t dpi_panel_init(esp_lcd_panel_t *panel) .burst_len = 16, .width = DW_GDMA_TRANS_WIDTH_64, }, - .size = dpi_panel->frame_buffer_size * 8 / 64, + .size = dpi_panel->fb_size * 8 / 64, }; for (int i = 0; i < dpi_panel->num_fbs; i++) { link_list = dpi_panel->link_lists[i]; @@ -419,7 +420,7 @@ static esp_err_t dpi_panel_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int uint8_t cur_fb_index = dpi_panel->cur_fb_index; uint8_t *frame_buffer = dpi_panel->fbs[cur_fb_index]; uint8_t *draw_buffer = (uint8_t *)color_data; - size_t frame_buffer_size = dpi_panel->frame_buffer_size; + size_t fb_size = dpi_panel->fb_size; size_t bits_per_pixel = dpi_panel->bits_per_pixel; // clip to boundaries @@ -434,11 +435,11 @@ static esp_err_t dpi_panel_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int uint8_t draw_buf_fb_index = 0; // check if the user draw buffer resides in any frame buffer's memory range // if so, we don't need to copy the data, just do cache write back - if (draw_buffer >= dpi_panel->fbs[0] && draw_buffer < dpi_panel->fbs[0] + frame_buffer_size) { + if (draw_buffer >= dpi_panel->fbs[0] && draw_buffer < dpi_panel->fbs[0] + fb_size) { draw_buf_fb_index = 0; - } else if (draw_buffer >= dpi_panel->fbs[1] && draw_buffer < dpi_panel->fbs[1] + frame_buffer_size) { + } else if (draw_buffer >= dpi_panel->fbs[1] && draw_buffer < dpi_panel->fbs[1] + fb_size) { draw_buf_fb_index = 1; - } else if (draw_buffer >= dpi_panel->fbs[2] && draw_buffer < dpi_panel->fbs[2] + frame_buffer_size) { + } else if (draw_buffer >= dpi_panel->fbs[2] && draw_buffer < dpi_panel->fbs[2] + fb_size) { draw_buf_fb_index = 2; } else { do_copy = true; diff --git a/components/esp_lcd/dsi/mipi_dsi_priv.h b/components/esp_lcd/dsi/mipi_dsi_priv.h index eebf93e2e89..bb6fd2fe63c 100644 --- a/components/esp_lcd/dsi/mipi_dsi_priv.h +++ b/components/esp_lcd/dsi/mipi_dsi_priv.h @@ -29,9 +29,8 @@ #define DSI_MEM_ALLOC_CAPS MALLOC_CAP_DEFAULT #endif -#define DPI_PANEL_MAX_FB_NUM 3 // maximum number of supported frame buffers for DPI panel - -#define DPI_PANEL_LLI_PER_FRAME 1 // NOTE: we assume ONE DMA link item can carry the WHOLE image (1920*1080) +#define DPI_PANEL_MAX_FB_NUM 3 // maximum number of frame buffers that can be maintained by the driver +#define DPI_PANEL_MIN_DMA_NODES_PER_LINK 1 // NOTE: we assume 1 DMA link item can carry the WHOLE image #ifdef __cplusplus extern "C" { diff --git a/components/esp_lcd/test_apps/mipi_dsi_lcd/main/test_mipi_dsi_panel.c b/components/esp_lcd/test_apps/mipi_dsi_lcd/main/test_mipi_dsi_panel.c index eec61a14b7f..a31d26e01fd 100644 --- a/components/esp_lcd/test_apps/mipi_dsi_lcd/main/test_mipi_dsi_panel.c +++ b/components/esp_lcd/test_apps/mipi_dsi_lcd/main/test_mipi_dsi_panel.c @@ -222,16 +222,16 @@ TEST_CASE("MIPI DSI with multiple frame buffers (ILI9881C)", "[mipi_dsi]") uint16_t *fbs[3]; TEST_ESP_OK(esp_lcd_dpi_panel_get_frame_buffer(mipi_dpi_panel, 3, (void **)&fbs[0], (void **)&fbs[1], (void **)&fbs[2])); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 9; i++) { uint16_t color_byte = rand() & 0xFFFF; int x_start = rand() % (MIPI_DSI_LCD_H_RES - 100); int y_start = rand() % (MIPI_DSI_LCD_V_RES - 100); for (int j = y_start; j < y_start + 100; j++) { for (int k = x_start; k < x_start + 100; k++) { - fbs[i][j * MIPI_DSI_LCD_H_RES + k] = color_byte; + fbs[i % 3][j * MIPI_DSI_LCD_H_RES + k] = color_byte; } } - esp_lcd_panel_draw_bitmap(mipi_dpi_panel, x_start, y_start, x_start + 100, y_start + 100, fbs[i]); + esp_lcd_panel_draw_bitmap(mipi_dpi_panel, x_start, y_start, x_start + 100, y_start + 100, fbs[i % 3]); vTaskDelay(pdMS_TO_TICKS(1000)); } diff --git a/components/hal/esp32p4/include/hal/mipi_dsi_brg_ll.h b/components/hal/esp32p4/include/hal/mipi_dsi_brg_ll.h index 7c399550bbc..adfdacad701 100644 --- a/components/hal/esp32p4/include/hal/mipi_dsi_brg_ll.h +++ b/components/hal/esp32p4/include/hal/mipi_dsi_brg_ll.h @@ -14,6 +14,7 @@ #include "hal/lcd_types.h" #define MIPI_DSI_LL_GET_BRG(bus_id) (bus_id == 0 ? &MIPI_DSI_BRIDGE : NULL) +#define MIPI_DSI_LL_EVENT_UNDERRUN (1 << 0) #ifdef __cplusplus extern "C" { @@ -35,6 +36,46 @@ static inline void mipi_dsi_brg_ll_enable(dsi_brg_dev_t *dev, bool en) dev->en.dsi_en = en; } +/** + * @brief Enable DSI bridge interrupt for specific event mask + * + * @param dev Pointer to the DSI bridge controller register base address + * @param mask Event mask + * @param enable True to enable, False to disable + */ +static inline void mipi_dsi_brg_ll_enable_interrupt(dsi_brg_dev_t *dev, uint32_t mask, bool enable) +{ + if (enable) { + dev->int_ena.val |= mask; + } else { + dev->int_ena.val &= ~mask; + } +} + +/** + * @brief Clear DSI bridge interrupt for specific event mask + * + * @param dev Pointer to the DSI bridge controller register base address + * @param mask Event mask + */ +__attribute__((always_inline)) +static inline void mipi_dsi_brg_ll_clear_interrupt_status(dsi_brg_dev_t *dev, uint32_t mask) +{ + dev->int_clr.val = mask; +} + +/** + * @brief Get interrupt status for DSI bridge + * + * @param dev Pointer to the DSI bridge controller register base address + * @return Interrupt status + */ +__attribute__((always_inline)) +static inline uint32_t mipi_dsi_brg_ll_get_interrupt_status(dsi_brg_dev_t *dev) +{ + return dev->int_st.val; +} + /** * @brief Set the number of 64-bit words in one dma burst transfer * @@ -242,7 +283,7 @@ static inline void mipi_dsi_brg_ll_enable_ref_clock(dsi_brg_dev_t *dev, bool en) * @param dev Pointer to the DSI bridge controller register base address * @param controller Flow controller */ -static inline void mipi_dsi_brg_ll_set_flow_controller(dsi_brg_dev_t* dev, mipi_dsi_ll_flow_controller_t controller) +static inline void mipi_dsi_brg_ll_set_flow_controller(dsi_brg_dev_t *dev, mipi_dsi_ll_flow_controller_t controller) { dev->dma_flow_ctrl.dsi_dma_flow_controller = controller; } @@ -255,9 +296,21 @@ static inline void mipi_dsi_brg_ll_set_flow_controller(dsi_brg_dev_t* dev, mipi_ * @param dev Pointer to the DSI bridge controller register base address * @param number Number of blocks */ -static inline void mipi_dsi_brg_ll_set_multi_block_number(dsi_brg_dev_t* dev, uint32_t number) +static inline void mipi_dsi_brg_ll_set_multi_block_number(dsi_brg_dev_t *dev, uint32_t number) { dev->dma_flow_ctrl.dma_flow_multiblk_num = number; + dev->dma_frame_interval.dma_multiblk_en = number > 1; +} + +/** + * @brief Get the FIFO depth of the DSI bridge + * + * @param dev Pointer to the DSI bridge controller register base address + * @return FIFO depth + */ +static inline uint32_t mipi_dsi_brg_ll_get_fifo_depth(dsi_brg_dev_t *dev) +{ + return dev->fifo_flow_status.raw_buf_depth; } /** @@ -266,7 +319,7 @@ static inline void mipi_dsi_brg_ll_set_multi_block_number(dsi_brg_dev_t* dev, ui * @param dev Pointer to the DSI bridge controller register base address * @param std YUV-RGB conversion standard */ -static inline void mipi_dsi_brg_ll_set_yuv_convert_std(dsi_brg_dev_t* dev, lcd_yuv_conv_std_t std) +static inline void mipi_dsi_brg_ll_set_yuv_convert_std(dsi_brg_dev_t *dev, lcd_yuv_conv_std_t std) { switch (std) { case LCD_YUV_CONV_STD_BT601: diff --git a/components/soc/esp32p4/include/soc/reg_base.h b/components/soc/esp32p4/include/soc/reg_base.h index 4c2bbc2c7eb..9a4b6fc0654 100644 --- a/components/soc/esp32p4/include/soc/reg_base.h +++ b/components/soc/esp32p4/include/soc/reg_base.h @@ -59,7 +59,9 @@ #define DR_REG_DDRPHY_BASE (DR_REG_HPPERIPH0_BASE + 0x9D000) #define DR_REG_PVT_BASE (DR_REG_HPPERIPH0_BASE + 0x9E000) #define DR_REG_CSI_HOST_BASE (DR_REG_HPPERIPH0_BASE + 0x9F000) +#define DR_REG_CSI_BRG_BASE (DR_REG_HPPERIPH0_BASE + 0x9F800) #define DR_REG_DSI_HOST_BASE (DR_REG_HPPERIPH0_BASE + 0xA0000) +#define DR_REG_DSI_BRG_BASE (DR_REG_HPPERIPH0_BASE + 0xA0800) #define DR_REG_ISP_BASE (DR_REG_HPPERIPH0_BASE + 0xA1000) #define DR_REG_RMT_BASE (DR_REG_HPPERIPH0_BASE + 0xA2000) #define DR_REG_BITSCRAM_BASE (DR_REG_HPPERIPH0_BASE + 0xA3000) From 943033f9d60869a73d187f20a10a92929ac29076 Mon Sep 17 00:00:00 2001 From: zwx Date: Tue, 9 Jul 2024 11:12:31 +0800 Subject: [PATCH 105/113] fix(openthread): make ot task queue sending non-permanent blocking --- components/openthread/lib | 2 +- .../openthread/src/esp_openthread_cli.c | 7 +- .../src/esp_openthread_lwip_netif.c | 6 ++ .../src/esp_openthread_task_queue.c | 4 +- examples/openthread/ot_br/main/esp_ot_br.c | 84 ++++++++++--------- examples/openthread/ot_br/sdkconfig.defaults | 2 +- 6 files changed, 60 insertions(+), 45 deletions(-) diff --git a/components/openthread/lib b/components/openthread/lib index 34d698a2749..203c78501e9 160000 --- a/components/openthread/lib +++ b/components/openthread/lib @@ -1 +1 @@ -Subproject commit 34d698a274940730901b934caa023a3281aca53e +Subproject commit 203c78501e9a6ea9ca3a929e6f9b6b9691ef16ee diff --git a/components/openthread/src/esp_openthread_cli.c b/components/openthread/src/esp_openthread_cli.c index 6ce998a4305..b2a76a4df0c 100644 --- a/components/openthread/src/esp_openthread_cli.c +++ b/components/openthread/src/esp_openthread_cli.c @@ -99,8 +99,11 @@ static void ot_cli_loop(void *context) printf("Internal error: %s\n", esp_err_to_name(err)); } } else { - esp_openthread_cli_input(line); - xTaskNotifyWait(0, 0, NULL, portMAX_DELAY); + if (esp_openthread_cli_input(line) == ESP_OK) { + xTaskNotifyWait(0, 0, NULL, portMAX_DELAY); + } else { + printf("Openthread task is busy, failed to run command: %s\n", line); + } } linenoiseHistoryAdd(line); } diff --git a/components/openthread/src/esp_openthread_lwip_netif.c b/components/openthread/src/esp_openthread_lwip_netif.c index 29be440ae09..94c8e16861e 100644 --- a/components/openthread/src/esp_openthread_lwip_netif.c +++ b/components/openthread/src/esp_openthread_lwip_netif.c @@ -23,6 +23,12 @@ #define OPENTHREAD_IP6_MTU 1280 +#if CONFIG_OPENTHREAD_BORDER_ROUTER +#if CONFIG_LWIP_IPV6_NUM_ADDRESSES != 12 +#error CONFIG_LWIP_IPV6_NUM_ADDRESSES should be set to 12, please configure it using `idf.py menuconfig` +#endif +#endif + static err_t openthread_netif_init(struct netif *netif); static void openthread_netif_input(void *h, void *buffer, size_t len, void *eb); diff --git a/components/openthread/src/esp_openthread_task_queue.c b/components/openthread/src/esp_openthread_task_queue.c index 32bb4f20020..9d9bf87e6f3 100644 --- a/components/openthread/src/esp_openthread_task_queue.c +++ b/components/openthread/src/esp_openthread_task_queue.c @@ -21,6 +21,8 @@ static QueueHandle_t s_task_queue = NULL; static int s_task_queue_event_fd = -1; static const char *task_queue_workflow = "task_queue"; +#define OT_TASK_QUEUE_SENDING_WAIT_TIME pdMS_TO_TICKS(100) + typedef struct { esp_openthread_task_t task; void *arg; @@ -60,7 +62,7 @@ esp_err_t IRAM_ATTR esp_openthread_task_queue_post(esp_openthread_task_t task, v ESP_RETURN_ON_FALSE_ISR(xQueueSendFromISR(s_task_queue, &task_storage, &task_woken), ESP_FAIL, OT_PLAT_LOG_TAG, "Failed to post task to OpenThread task queue"); } else { - ESP_RETURN_ON_FALSE(xQueueSend(s_task_queue, &task_storage, portMAX_DELAY), ESP_FAIL, OT_PLAT_LOG_TAG, + ESP_RETURN_ON_FALSE(xQueueSend(s_task_queue, &task_storage, OT_TASK_QUEUE_SENDING_WAIT_TIME), ESP_FAIL, OT_PLAT_LOG_TAG, "Failed to post task to OpenThread task queue"); } ret = write(s_task_queue_event_fd, &val, sizeof(val)); diff --git a/examples/openthread/ot_br/main/esp_ot_br.c b/examples/openthread/ot_br/main/esp_ot_br.c index d29718c4aeb..bf887803a93 100644 --- a/examples/openthread/ot_br/main/esp_ot_br.c +++ b/examples/openthread/ot_br/main/esp_ot_br.c @@ -73,29 +73,15 @@ static void ot_task_worker(void *aContext) // Initialize the OpenThread stack ESP_ERROR_CHECK(esp_openthread_init(&config)); - - // Initialize border routing features - esp_openthread_lock_acquire(portMAX_DELAY); -#if CONFIG_OPENTHREAD_STATE_INDICATOR_ENABLE - ESP_ERROR_CHECK(esp_openthread_state_indicator_init(esp_openthread_get_instance())); -#endif ESP_ERROR_CHECK(esp_netif_attach(openthread_netif, esp_openthread_netif_glue_init(&config))); - + esp_openthread_lock_acquire(portMAX_DELAY); (void)otLoggingSetLevel(CONFIG_LOG_DEFAULT_LEVEL); esp_openthread_cli_init(); - -#if CONFIG_OPENTHREAD_BR_AUTO_START - ESP_ERROR_CHECK(esp_openthread_border_router_init()); - otOperationalDatasetTlvs dataset; - otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset); - ESP_ERROR_CHECK(esp_openthread_auto_start((error == OT_ERROR_NONE) ? &dataset : NULL)); -#endif // CONFIG_OPENTHREAD_BR_AUTO_START - esp_cli_custom_command_init(); + esp_openthread_cli_create_task(); esp_openthread_lock_release(); // Run the main loop - esp_openthread_cli_create_task(); esp_openthread_launch_mainloop(); // Clean up @@ -105,36 +91,15 @@ static void ot_task_worker(void *aContext) vTaskDelete(NULL); } -void app_main(void) +void ot_br_init(void *ctx) { - // Used eventfds: - // * netif - // * task queue - // * border router - esp_vfs_eventfd_config_t eventfd_config = { -#if CONFIG_OPENTHREAD_RADIO_NATIVE || CONFIG_OPENTHREAD_RADIO_SPINEL_SPI - // * radio driver (A native radio device needs a eventfd for radio driver.) - // * SpiSpinelInterface (The Spi Spinel Interface needs a eventfd.) - // The above will not exist at the same time. - .max_fds = 4, -#else - .max_fds = 3, -#endif - }; - ESP_ERROR_CHECK(esp_vfs_eventfd_register(&eventfd_config)); - - ESP_ERROR_CHECK(nvs_flash_init()); - ESP_ERROR_CHECK(esp_netif_init()); - ESP_ERROR_CHECK(esp_event_loop_create_default()); - #if CONFIG_EXAMPLE_CONNECT_WIFI #if CONFIG_OPENTHREAD_BR_AUTO_START ESP_ERROR_CHECK(example_connect()); + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_MAX_MODEM)); #if CONFIG_ESP_COEX_SW_COEXIST_ENABLE && CONFIG_OPENTHREAD_RADIO_NATIVE - ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_MIN_MODEM)); ESP_ERROR_CHECK(esp_coex_wifi_i154_enable()); #else - ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); #if CONFIG_EXTERNAL_COEX_ENABLE ot_br_external_coexist_init(); @@ -155,5 +120,44 @@ void app_main(void) ESP_ERROR_CHECK(mdns_init()); ESP_ERROR_CHECK(mdns_hostname_set("esp-ot-br")); - xTaskCreate(ot_task_worker, "ot_br_main", 20480, xTaskGetCurrentTaskHandle(), 5, NULL); + + // Initialize border routing features + esp_openthread_lock_acquire(portMAX_DELAY); +#if CONFIG_OPENTHREAD_STATE_INDICATOR_ENABLE + ESP_ERROR_CHECK(esp_openthread_state_indicator_init(esp_openthread_get_instance())); +#endif + +#if CONFIG_OPENTHREAD_BR_AUTO_START + ESP_ERROR_CHECK(esp_openthread_border_router_init()); + otOperationalDatasetTlvs dataset; + otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset); + ESP_ERROR_CHECK(esp_openthread_auto_start((error == OT_ERROR_NONE) ? &dataset : NULL)); +#endif // CONFIG_OPENTHREAD_BR_AUTO_START + + esp_openthread_lock_release(); + vTaskDelete(NULL); +} + +void app_main(void) +{ + // Used eventfds: + // * netif + // * task queue + // * border router + esp_vfs_eventfd_config_t eventfd_config = { +#if CONFIG_OPENTHREAD_RADIO_NATIVE || CONFIG_OPENTHREAD_RADIO_SPINEL_SPI + // * radio driver (A native radio device needs a eventfd for radio driver.) + // * SpiSpinelInterface (The Spi Spinel Interface needs a eventfd.) + // The above will not exist at the same time. + .max_fds = 4, +#else + .max_fds = 3, +#endif + }; + ESP_ERROR_CHECK(esp_vfs_eventfd_register(&eventfd_config)); + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + xTaskCreate(ot_task_worker, "ot_br_main", 8192, xTaskGetCurrentTaskHandle(), 5, NULL); + xTaskCreate(ot_br_init, "ot_br_init", 6144, NULL, 4, NULL); } diff --git a/examples/openthread/ot_br/sdkconfig.defaults b/examples/openthread/ot_br/sdkconfig.defaults index 6620bfa46b1..619ab0f7e78 100644 --- a/examples/openthread/ot_br/sdkconfig.defaults +++ b/examples/openthread/ot_br/sdkconfig.defaults @@ -31,7 +31,7 @@ CONFIG_OPENTHREAD_RADIO_SPINEL_UART=y # lwIP # CONFIG_LWIP_IPV6_FORWARD=y -CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 +CONFIG_LWIP_IPV6_NUM_ADDRESSES=12 CONFIG_LWIP_MULTICAST_PING=y CONFIG_LWIP_NETIF_STATUS_CALLBACK=y CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y From 348d834f9765ad555a5818774d45f6e0b5bb3666 Mon Sep 17 00:00:00 2001 From: Zhang Shuxian Date: Fri, 12 Jul 2024 15:36:07 +0800 Subject: [PATCH 106/113] docs: Update cn trans and provide proper indentation for 2 files --- .../en/contribute/install-pre-commit-hook.rst | 22 +++++++++---------- .../release-5.x/5.4/system.rst | 7 +++--- .../contribute/install-pre-commit-hook.rst | 7 +++--- .../release-5.x/5.4/system.rst | 10 +++++++-- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/docs/en/contribute/install-pre-commit-hook.rst b/docs/en/contribute/install-pre-commit-hook.rst index 98d76a84a36..17a69bd6efb 100644 --- a/docs/en/contribute/install-pre-commit-hook.rst +++ b/docs/en/contribute/install-pre-commit-hook.rst @@ -6,7 +6,7 @@ Install Pre-commit Hook for ESP-IDF Project Install ``pre-commit`` ---------------------- -Run ``pip install pre-commit`` +Run ``pip install pre-commit``. Install ``pre-commit`` Hook --------------------------- @@ -20,10 +20,10 @@ Install ``pre-commit`` Hook Uninstall ``pre-commit`` Hook ----------------------------- -Run ``pre-commit uninstall`` +Run ``pre-commit uninstall``. -What Is More? -------------- +Related Documents +------------------- For detailed usage, please refer to the documentation of pre-commit_. @@ -34,17 +34,17 @@ Common Problems For Windows Users ``/usr/bin/env: python: Permission denied.`` - If you are in Git Bash, please check the python executable location by run ``which python``. + If you are in Git Bash, please check the python executable location by run ``which python``. - If the executable is under ``~/AppData/Local/Microsoft/WindowsApps/``, then it is a link to Windows AppStore, not a real one. + If the executable is under ``~/AppData/Local/Microsoft/WindowsApps/``, then it is a link to Windows AppStore, not a real one. - Please install Python manually and update this in your ``PATH`` environment variable. + Please install Python manually and update this in your ``PATH`` environment variable. Your ``USERPROFILE`` contains non-ASCII characters - ``pre-commit`` may fail when initializing an environment for a particular hook when the path of ``pre-commit``'s cache contains non-ASCII characters. The solution is to set ``PRE_COMMIT_HOME`` to a path containing only standard characters before running pre-commit. + ``pre-commit`` may fail when initializing an environment for a particular hook when the path of ``pre-commit``'s cache contains non-ASCII characters. The solution is to set ``PRE_COMMIT_HOME`` to a path containing only standard characters before running pre-commit. - - CMD: ``set PRE_COMMIT_HOME=C:\somepath\pre-commit`` - - PowerShell: ``$Env:PRE_COMMIT_HOME = "C:\somepath\pre-commit"`` - - git bash: ``export PRE_COMMIT_HOME="/c/somepath/pre-commit"`` + - CMD: ``set PRE_COMMIT_HOME=C:\somepath\pre-commit`` + - PowerShell: ``$Env:PRE_COMMIT_HOME = "C:\somepath\pre-commit"`` + - git bash: ``export PRE_COMMIT_HOME="/c/somepath/pre-commit"`` diff --git a/docs/en/migration-guides/release-5.x/5.4/system.rst b/docs/en/migration-guides/release-5.x/5.4/system.rst index ae7414bf5d1..e6e0ede0156 100644 --- a/docs/en/migration-guides/release-5.x/5.4/system.rst +++ b/docs/en/migration-guides/release-5.x/5.4/system.rst @@ -9,9 +9,8 @@ Log - `esp_log_buffer_hex` is deprecated, use `ESP_LOG_BUFFER_HEX` instead. - `esp_log_buffer_char` is deprecated, use `ESP_LOG_BUFFER_CHAR` instead. -ESP rom ---- +ESP ROM +--------- -- All target-specific header files has been moved from `components/esp_rom/include/{target}/` to `/esp_rom/{target}/include/{target}/`, and `components/esp_rom/CMakeLists.txt` has been modified accordingly. If you encounter an error indicating a missing header file, such as ``fatal error: esp32s3/rom/efuse.h: No such file or directory``, try removing the leading relative path from the header file include statement. In your current and future development, when including any header files from the components/esp_rom folder, directly include the header file name without the target-specific relative folder path. +- All target-specific header files has been moved from `components/esp_rom/include/{target}/` to `/esp_rom/{target}/include/{target}/`, and `components/esp_rom/CMakeLists.txt` has been modified accordingly. If you encounter an error indicating a missing header file, such as ``fatal error: esp32s3/rom/efuse.h: No such file or directory``, try removing the leading relative path from the header file include command. In your current and future development, when including any header files located in `components/esp_rom` path, directly use the header file name without the chip-specific relative folder path. - All target-specific `rom/miniz.h` files are removed because they are deprecated. - diff --git a/docs/zh_CN/contribute/install-pre-commit-hook.rst b/docs/zh_CN/contribute/install-pre-commit-hook.rst index bf4fec4bb27..cf87e210fa5 100644 --- a/docs/zh_CN/contribute/install-pre-commit-hook.rst +++ b/docs/zh_CN/contribute/install-pre-commit-hook.rst @@ -1,9 +1,8 @@ 为 ESP-IDF 安装 pre-commit 钩子 -========================================== +=================================== :link_to_translation:`en:[English]` - 安装 ``pre-commit`` 工具 --------------------------- @@ -23,7 +22,7 @@ 运行 ``pre-commit uninstall`` 。 -更多 +相关文档 --------- 更多详细使用方法,请参考 pre-commit_ 文档。 @@ -31,7 +30,7 @@ .. _pre-commit: https://pre-commit.com/ Windows 用户常见问题 --------------------------------- +----------------------- ``/usr/bin/env: python: Permission denied.`` diff --git a/docs/zh_CN/migration-guides/release-5.x/5.4/system.rst b/docs/zh_CN/migration-guides/release-5.x/5.4/system.rst index 3644a6ea439..dbe6984ddd7 100644 --- a/docs/zh_CN/migration-guides/release-5.x/5.4/system.rst +++ b/docs/zh_CN/migration-guides/release-5.x/5.4/system.rst @@ -3,8 +3,14 @@ :link_to_translation:`en:[English]` -Log ---- +日志 +------ - `esp_log_buffer_hex` 已弃用,应使用 `ESP_LOG_BUFFER_HEX` 替代。 - `esp_log_buffer_char` 已弃用,应使用 `ESP_LOG_BUFFER_CHAR` 替代。 + +ESP ROM +--------- + +- 针对特定目标的头文件已从 `components/esp_rom/include/{target}/` 移至 `/esp_rom/{target}/include/{target}/`,`components/esp_rom/CMakeLists.txt` 文件已相应更新。如果遇到报错提示缺少头文件,例如 ``fatal error: esp32s3/rom/efuse.h: No such file or directory``,请在头文件包含命令中删除前导的相对路径。在今后的开发中,如果需要包含 `components/esp_rom` 路径下的任何头文件,请直接使用头文件名,无需包含特定芯片的相对文件夹路径。 +- 所有特定目标的 `rom/miniz.h` 文件已移除,因为它们已经被弃用。 From d562f9f4f0010eddb5d2ed092ce8194526be6a6d Mon Sep 17 00:00:00 2001 From: liuning Date: Fri, 19 Jul 2024 19:23:58 +0800 Subject: [PATCH 107/113] fix(coex): fix esp32 crash issue, fix esp32c6 rx issue --- components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld | 2 +- components/esp_wifi/lib | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld b/components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld index 3a6126a9079..54d3ae9e75f 100644 --- a/components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld +++ b/components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld @@ -260,7 +260,7 @@ trcAmpduSetState = 0x40000fa0; trc_set_bf_report_rate = 0x40000fa4; trc_onPPTxDone = 0x40000fa8; wDevCheckBlockError = 0x40000fac; -wDev_AppendRxBlocks = 0x40000fb0; +/*wDev_AppendRxBlocks = 0x40000fb0;*/ wDev_DiscardFrame = 0x40000fb4; wDev_GetNoiseFloor = 0x40000fb8; wDev_IndicateAmpdu = 0x40000fbc; diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index eff8552fc2c..ce181b3e947 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit eff8552fc2c890de9304250192e542d7a38c3480 +Subproject commit ce181b3e947d3d8495c17b9881930816bb94ed58 From 2bf74cf86d9203deba2aaf2ebdefb36d07d1e89d Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Fri, 7 Jun 2024 16:19:42 +0530 Subject: [PATCH 108/113] feat: enable flash encyption support in esp32c61 This commit add support for flash ecnyrption in ESP32C61. --- .../bootloader_support/src/flash_encrypt.c | 2 -- .../include/hal/spi_flash_encrypted_ll.h | 26 +++++++++---------- .../soc/esp32c61/include/soc/soc_caps.h | 2 +- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/components/bootloader_support/src/flash_encrypt.c b/components/bootloader_support/src/flash_encrypt.c index 4f568cea1c2..da57e4189a5 100644 --- a/components/bootloader_support/src/flash_encrypt.c +++ b/components/bootloader_support/src/flash_encrypt.c @@ -13,8 +13,6 @@ #include "esp_secure_boot.h" #include "hal/efuse_hal.h" -//TODO:[ESP32C61] IDf-9232 - #if CONFIG_IDF_TARGET_ESP32 #define CRYPT_CNT ESP_EFUSE_FLASH_CRYPT_CNT #define WR_DIS_CRYPT_CNT ESP_EFUSE_WR_DIS_FLASH_CRYPT_CNT diff --git a/components/hal/esp32c61/include/hal/spi_flash_encrypted_ll.h b/components/hal/esp32c61/include/hal/spi_flash_encrypted_ll.h index 82b2b1d47f4..d35c179cbd7 100644 --- a/components/hal/esp32c61/include/hal/spi_flash_encrypted_ll.h +++ b/components/hal/esp32c61/include/hal/spi_flash_encrypted_ll.h @@ -15,18 +15,16 @@ #include #include #include "soc/hp_system_reg.h" -#include "soc/xts_aes_reg.h" +#include "soc/spi_mem_reg.h" #include "soc/soc.h" #include "soc/soc_caps.h" #include "hal/assert.h" -// TODO: [ESP32C61] IDF-9232, inherit from c6 - #ifdef __cplusplus extern "C" { #endif -/// Choose type of chip you want to encrypt manully +/// Choose type of chip you want to encrypt manually typedef enum { FLASH_ENCRYPTION_MANU = 0, ///!< Manually encrypt the flash chip. @@ -53,7 +51,7 @@ static inline void spi_flash_encrypt_ll_disable(void) } /** - * Choose type of chip you want to encrypt manully + * Choose type of chip you want to encrypt manually * * @param type The type of chip to be encrypted * @@ -63,7 +61,7 @@ static inline void spi_flash_encrypt_ll_type(flash_encrypt_ll_type_t type) { // Our hardware only support flash encryption HAL_ASSERT(type == FLASH_ENCRYPTION_MANU); - REG_SET_FIELD(XTS_AES_DESTINATION_REG(0), XTS_AES_DESTINATION, type); + REG_SET_FIELD(SPI_MEM_XTS_DESTINATION_REG(0), SPI_MEM_XTS_DESTINATION, type); } /** @@ -74,7 +72,7 @@ static inline void spi_flash_encrypt_ll_type(flash_encrypt_ll_type_t type) static inline void spi_flash_encrypt_ll_buffer_length(uint32_t size) { // Desired block should not be larger than the block size. - REG_SET_FIELD(XTS_AES_LINESIZE_REG(0), XTS_AES_LINESIZE, size >> 5); + REG_SET_FIELD(SPI_MEM_XTS_LINESIZE_REG(0), SPI_MEM_XTS_LINESIZE, size >> 5); } /** @@ -89,7 +87,7 @@ static inline void spi_flash_encrypt_ll_plaintext_save(uint32_t address, const u { uint32_t plaintext_offs = (address % SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX); HAL_ASSERT(plaintext_offs + size <= SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX); - memcpy((void *)(XTS_AES_PLAIN_MEM(0) + plaintext_offs), buffer, size); + memcpy((void *)(SPI_MEM_XTS_PLAIN_BASE_REG(0) + plaintext_offs), buffer, size); } /** @@ -99,7 +97,7 @@ static inline void spi_flash_encrypt_ll_plaintext_save(uint32_t address, const u */ static inline void spi_flash_encrypt_ll_address_save(uint32_t flash_addr) { - REG_SET_FIELD(XTS_AES_PHYSICAL_ADDRESS_REG(0), XTS_AES_PHYSICAL_ADDRESS, flash_addr); + REG_SET_FIELD(SPI_MEM_XTS_PHYSICAL_ADDRESS_REG(0), SPI_MEM_XTS_PHYSICAL_ADDRESS, flash_addr); } /** @@ -107,7 +105,7 @@ static inline void spi_flash_encrypt_ll_address_save(uint32_t flash_addr) */ static inline void spi_flash_encrypt_ll_calculate_start(void) { - REG_SET_FIELD(XTS_AES_TRIGGER_REG(0), XTS_AES_TRIGGER, 1); + REG_SET_FIELD(SPI_MEM_XTS_TRIGGER_REG(0), SPI_MEM_XTS_TRIGGER, 1); } /** @@ -115,7 +113,7 @@ static inline void spi_flash_encrypt_ll_calculate_start(void) */ static inline void spi_flash_encrypt_ll_calculate_wait_idle(void) { - while(REG_GET_FIELD(XTS_AES_STATE_REG(0), XTS_AES_STATE) == 0x1) { + while(REG_GET_FIELD(SPI_MEM_XTS_STATE_REG(0), SPI_MEM_XTS_STATE) == 0x1) { } } @@ -124,8 +122,8 @@ static inline void spi_flash_encrypt_ll_calculate_wait_idle(void) */ static inline void spi_flash_encrypt_ll_done(void) { - REG_SET_BIT(XTS_AES_RELEASE_REG(0), XTS_AES_RELEASE); - while(REG_GET_FIELD(XTS_AES_STATE_REG(0), XTS_AES_STATE) != 0x3) { + REG_SET_BIT(SPI_MEM_XTS_RELEASE_REG(0), SPI_MEM_XTS_RELEASE); + while(REG_GET_FIELD(SPI_MEM_XTS_STATE_REG(0), SPI_MEM_XTS_STATE) != 0x3) { } } @@ -134,7 +132,7 @@ static inline void spi_flash_encrypt_ll_done(void) */ static inline void spi_flash_encrypt_ll_destroy(void) { - REG_SET_BIT(XTS_AES_DESTROY_REG(0), XTS_AES_DESTROY); + REG_SET_BIT(SPI_MEM_XTS_DESTROY_REG(0), SPI_MEM_XTS_DESTROY); } /** diff --git a/components/soc/esp32c61/include/soc/soc_caps.h b/components/soc/esp32c61/include/soc/soc_caps.h index 812cb484c4d..47ac1eed8b0 100644 --- a/components/soc/esp32c61/include/soc/soc_caps.h +++ b/components/soc/esp32c61/include/soc/soc_caps.h @@ -47,7 +47,7 @@ // \#define SOC_DIG_SIGN_SUPPORTED 1 //TODO: [ESP32C61] IDF-9325 #define SOC_ECC_SUPPORTED 1 #define SOC_ECC_EXTENDED_MODES_SUPPORTED 1 -#define SOC_FLASH_ENC_SUPPORTED 1 //TODO: [ESP32C61] IDF-9232 +#define SOC_FLASH_ENC_SUPPORTED 1 // \#define SOC_SECURE_BOOT_SUPPORTED 1 //TODO: [ESP32C61] IDF-9233 // \#define SOC_BOD_SUPPORTED 1 //TODO: [ESP32C61] IDF-9254 // \#define SOC_APM_SUPPORTED 1 //TODO: [ESP32C61] IDF-9230 From 33e7f004e37ee81f500494ec4eb3422b6f96fa39 Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Wed, 26 Jun 2024 19:55:10 +0800 Subject: [PATCH 109/113] fix(common_components): unregister event handler if wifi disconnect and stop reconnecting --- .../include/protocol_examples_common.h | 32 +++++++++++++++++ .../protocol_examples_common/wifi_connect.c | 35 ++----------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/examples/common_components/protocol_examples_common/include/protocol_examples_common.h b/examples/common_components/protocol_examples_common/include/protocol_examples_common.h index fc2e54cd352..b23f452acc7 100644 --- a/examples/common_components/protocol_examples_common/include/protocol_examples_common.h +++ b/examples/common_components/protocol_examples_common/include/protocol_examples_common.h @@ -35,6 +35,38 @@ extern "C" { #define EXAMPLE_NETIF_DESC_PPP "example_netif_ppp" #endif +#if CONFIG_EXAMPLE_WIFI_SCAN_METHOD_FAST +#define EXAMPLE_WIFI_SCAN_METHOD WIFI_FAST_SCAN +#elif CONFIG_EXAMPLE_WIFI_SCAN_METHOD_ALL_CHANNEL +#define EXAMPLE_WIFI_SCAN_METHOD WIFI_ALL_CHANNEL_SCAN +#endif + +#if CONFIG_EXAMPLE_WIFI_CONNECT_AP_BY_SIGNAL +#define EXAMPLE_WIFI_CONNECT_AP_SORT_METHOD WIFI_CONNECT_AP_BY_SIGNAL +#elif CONFIG_EXAMPLE_WIFI_CONNECT_AP_BY_SECURITY +#define EXAMPLE_WIFI_CONNECT_AP_SORT_METHOD WIFI_CONNECT_AP_BY_SECURITY +#endif + +#if CONFIG_EXAMPLE_WIFI_AUTH_OPEN +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_OPEN +#elif CONFIG_EXAMPLE_WIFI_AUTH_WEP +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WEP +#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA_PSK +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_PSK +#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA2_PSK +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_PSK +#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA_WPA2_PSK +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_WPA2_PSK +#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA2_ENTERPRISE +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_ENTERPRISE +#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA3_PSK +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA3_PSK +#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA2_WPA3_PSK +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_WPA3_PSK +#elif CONFIG_EXAMPLE_WIFI_AUTH_WAPI_PSK +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WAPI_PSK +#endif + /* Example default interface, prefer the ethernet one if running in example-test (CI) configuration */ #if CONFIG_EXAMPLE_CONNECT_ETHERNET #define EXAMPLE_INTERFACE get_example_netif_from_desc(EXAMPLE_NETIF_DESC_ETH) diff --git a/examples/common_components/protocol_examples_common/wifi_connect.c b/examples/common_components/protocol_examples_common/wifi_connect.c index e4e14686887..ed95bccb2fe 100644 --- a/examples/common_components/protocol_examples_common/wifi_connect.c +++ b/examples/common_components/protocol_examples_common/wifi_connect.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -26,38 +26,6 @@ static SemaphoreHandle_t s_semph_get_ip_addrs = NULL; static SemaphoreHandle_t s_semph_get_ip6_addrs = NULL; #endif -#if CONFIG_EXAMPLE_WIFI_SCAN_METHOD_FAST -#define EXAMPLE_WIFI_SCAN_METHOD WIFI_FAST_SCAN -#elif CONFIG_EXAMPLE_WIFI_SCAN_METHOD_ALL_CHANNEL -#define EXAMPLE_WIFI_SCAN_METHOD WIFI_ALL_CHANNEL_SCAN -#endif - -#if CONFIG_EXAMPLE_WIFI_CONNECT_AP_BY_SIGNAL -#define EXAMPLE_WIFI_CONNECT_AP_SORT_METHOD WIFI_CONNECT_AP_BY_SIGNAL -#elif CONFIG_EXAMPLE_WIFI_CONNECT_AP_BY_SECURITY -#define EXAMPLE_WIFI_CONNECT_AP_SORT_METHOD WIFI_CONNECT_AP_BY_SECURITY -#endif - -#if CONFIG_EXAMPLE_WIFI_AUTH_OPEN -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_OPEN -#elif CONFIG_EXAMPLE_WIFI_AUTH_WEP -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WEP -#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA_PSK -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_PSK -#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA2_PSK -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_PSK -#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA_WPA2_PSK -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_WPA2_PSK -#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA2_ENTERPRISE -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_ENTERPRISE -#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA3_PSK -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA3_PSK -#elif CONFIG_EXAMPLE_WIFI_AUTH_WPA2_WPA3_PSK -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_WPA3_PSK -#elif CONFIG_EXAMPLE_WIFI_AUTH_WAPI_PSK -#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WAPI_PSK -#endif - static int s_retry_num = 0; static void example_handler_on_wifi_disconnect(void *arg, esp_event_base_t event_base, @@ -75,6 +43,7 @@ static void example_handler_on_wifi_disconnect(void *arg, esp_event_base_t event xSemaphoreGive(s_semph_get_ip6_addrs); } #endif + example_wifi_sta_do_disconnect(); return; } ESP_LOGI(TAG, "Wi-Fi disconnected, trying to reconnect..."); From f92efd98e9c008e494a3d8e5990fcd88d5abe24b Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Mon, 22 Jul 2024 15:05:59 +0530 Subject: [PATCH 110/113] fix(nimble): Increase Timer stack size for nimble application --- examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults | 1 + examples/bluetooth/nimble/blehr/sdkconfig.defaults | 1 + examples/bluetooth/nimble/power_save/sdkconfig.defaults | 1 + 3 files changed, 3 insertions(+) diff --git a/examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults b/examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults index c829fc5c002..09631ee6856 100644 --- a/examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults +++ b/examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults @@ -10,3 +10,4 @@ CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n CONFIG_BTDM_CTRL_MODE_BTDM=n CONFIG_BT_BLUEDROID_ENABLED=n CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=4000 diff --git a/examples/bluetooth/nimble/blehr/sdkconfig.defaults b/examples/bluetooth/nimble/blehr/sdkconfig.defaults index c829fc5c002..09631ee6856 100644 --- a/examples/bluetooth/nimble/blehr/sdkconfig.defaults +++ b/examples/bluetooth/nimble/blehr/sdkconfig.defaults @@ -10,3 +10,4 @@ CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n CONFIG_BTDM_CTRL_MODE_BTDM=n CONFIG_BT_BLUEDROID_ENABLED=n CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=4000 diff --git a/examples/bluetooth/nimble/power_save/sdkconfig.defaults b/examples/bluetooth/nimble/power_save/sdkconfig.defaults index 8b57fab433b..7f51e2e7a5c 100644 --- a/examples/bluetooth/nimble/power_save/sdkconfig.defaults +++ b/examples/bluetooth/nimble/power_save/sdkconfig.defaults @@ -19,3 +19,4 @@ CONFIG_FREERTOS_USE_TICKLESS_IDLE=y CONFIG_FREERTOS_HZ=1000 # Minimum number of ticks to enter sleep mode for CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP=3 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=4000 From 893bd25c0b0c9a66da4cb6e8621682fbd2e85e27 Mon Sep 17 00:00:00 2001 From: Armando Date: Tue, 23 Jul 2024 10:00:24 +0800 Subject: [PATCH 111/113] fix(psram): corrected psram early stage function name --- components/esp_psram/esp_psram.c | 2 +- components/esp_system/system_init_fn.txt | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/components/esp_psram/esp_psram.c b/components/esp_psram/esp_psram.c index debbf9de31b..59176e7c74e 100644 --- a/components/esp_psram/esp_psram.c +++ b/components/esp_psram/esp_psram.c @@ -90,7 +90,7 @@ typedef struct { static psram_ctx_t s_psram_ctx; static const DRAM_ATTR char TAG[] = "esp_psram"; -ESP_SYSTEM_INIT_FN(init_psram, CORE, BIT(0), 103) +ESP_SYSTEM_INIT_FN(add_psram_to_heap, CORE, BIT(0), 103) { #if CONFIG_SPIRAM_BOOT_INIT && (CONFIG_SPIRAM_USE_CAPS_ALLOC || CONFIG_SPIRAM_USE_MALLOC) if (esp_psram_is_initialized()) { diff --git a/components/esp_system/system_init_fn.txt b/components/esp_system/system_init_fn.txt index 1ba1dcc6dca..0af7db87331 100644 --- a/components/esp_system/system_init_fn.txt +++ b/components/esp_system/system_init_fn.txt @@ -41,7 +41,12 @@ CORE: 100: init_heap in components/heap/heap_caps_init.c on BIT(0) CORE: 101: esp_timer_init_nonos in components/esp_timer/src/esp_timer_init.c on BIT(0) CORE: 102: init_newlib in components/newlib/newlib_init.c on BIT(0) -CORE: 103: init_psram in components/esp_psram/esp_psram.c on BIT(0) + +# Add the psram to heap, psram vaddr region is reserved when initialising the heap, after +# psram is initialised (and necessary reservation for psram usage), the rest of the psram +# will be added to the heap +CORE: 103: add_psram_to_heap in components/esp_psram/esp_psram.c on BIT(0) + CORE: 104: init_brownout in components/esp_system/startup_funcs.c on BIT(0) CORE: 105: init_newlib_time in components/esp_system/startup_funcs.c on BIT(0) From e06d0134f2473d786b822dbb0ccabb1b4901e0c3 Mon Sep 17 00:00:00 2001 From: Armando Date: Tue, 23 Jul 2024 10:50:14 +0800 Subject: [PATCH 112/113] fix(camera): fixed c2m cache ops --- components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c | 2 +- components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c b/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c index 21b09869dc1..ebfcdb3fccc 100644 --- a/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c +++ b/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c @@ -350,7 +350,7 @@ IRAM_ATTR static bool csi_dma_trans_done_callback(dw_gdma_channel_handle_t chan, dw_gdma_channel_enable_ctrl(chan, true); if ((ctlr->trans.buffer != ctlr->backup_buffer) || ctlr->bk_buffer_exposed) { - esp_err_t ret = esp_cache_msync((void *)(ctlr->trans.buffer), ctlr->trans.received_size, ESP_CACHE_MSYNC_FLAG_INVALIDATE); + esp_err_t ret = esp_cache_msync((void *)(ctlr->trans.buffer), ctlr->trans.received_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C); assert(ret == ESP_OK); assert(ctlr->cbs.on_trans_finished); if (ctlr->cbs.on_trans_finished) { diff --git a/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c b/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c index 852b35aba1f..10446d3749c 100644 --- a/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c +++ b/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c @@ -469,7 +469,7 @@ IRAM_ATTR static bool s_dvp_dma_trans_done_callback(dw_gdma_channel_handle_t cha dw_gdma_channel_enable_ctrl(chan, true); if ((dvp_ctlr->trans.buffer != dvp_ctlr->backup_buffer) || dvp_ctlr->bk_buffer_exposed) { - esp_err_t ret = esp_cache_msync((void *)(dvp_ctlr->trans.buffer), dvp_ctlr->trans.received_size, ESP_CACHE_MSYNC_FLAG_INVALIDATE); + esp_err_t ret = esp_cache_msync((void *)(dvp_ctlr->trans.buffer), dvp_ctlr->trans.received_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C); assert(ret == ESP_OK); assert(dvp_ctlr->cbs.on_trans_finished); if (dvp_ctlr->cbs.on_trans_finished) { From fdffa19958c20c7210e3d3ffe01daa48d474fe49 Mon Sep 17 00:00:00 2001 From: Jan Beran Date: Tue, 23 Jul 2024 17:26:42 +0800 Subject: [PATCH 113/113] Docs: document inversion in kconfig --- docs/en/api-reference/kconfig.rst | 7 +++++++ docs/zh_CN/api-reference/kconfig.rst | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/docs/en/api-reference/kconfig.rst b/docs/en/api-reference/kconfig.rst index 71fe9ce7eb4..19ca3e0f97e 100644 --- a/docs/en/api-reference/kconfig.rst +++ b/docs/en/api-reference/kconfig.rst @@ -61,6 +61,13 @@ The standard Kconfig_ tools ignore unknown options in ``sdkconfig``. So if a dev 3. ``kconfgen`` post-processes ``sdkconfig`` files and generates all build outputs (``sdkconfig.h``, ``sdkconfig.cmake``, and ``auto.conf``) by adding a list of compatibility statements, i.e., the values of old options are set for new options after modification. If users still use old options in their code, this will prevent it from breaking. 4. :ref:`configuration-deprecated-options` are automatically generated by ``kconfgen``. +The structure of the ``sdkconfig.rename`` file is as follows: + +* Lines starting with ``#`` and empty lines will be ignored. +* All other lines should follow one of these formats: + * ``CONFIG_DEPRECATED_NAME CONFIG_NEW_NAME``, where ``CONFIG_DEPRECATED_NAME`` is the old config name which was renamed in a newer ESP-IDF version to ``CONFIG_NEW_NAME``. + * ``CONFIG_DEPRECATED_NAME !CONFIG_NEW_INVERTED_NAME`` where ``CONFIG_NEW_INVERTED_NAME`` was introduced in a newer ESP-IDF version by Boolean inversion of the logic value of ``CONFIG_DEPRECATED_NAME``. + .. _configuration-options-reference: Configuration Options Reference diff --git a/docs/zh_CN/api-reference/kconfig.rst b/docs/zh_CN/api-reference/kconfig.rst index 7590f27b40e..1da2defaf6e 100644 --- a/docs/zh_CN/api-reference/kconfig.rst +++ b/docs/zh_CN/api-reference/kconfig.rst @@ -61,6 +61,13 @@ Kconfig 选项的向后兼容性 3. ``kconfgen`` 通过添加兼容性语句列表(即经过修改后,将旧选项的值设置为新选项的值),后处理 ``sdkconfig`` 文件,并生成所有构建结果( ``sdkconfig.h``、 ``sdkconfig.cmake`` 以及 ``auto.conf``)。如果用户在其代码中仍然使用旧选项,此举可以防止用户代码出现问题。 4. ``kconfgen`` 会自动生成 :ref:`configuration-deprecated-options`。 +``sdkconfig.rename`` 文件的结构如下: + +* 以 ``#`` 开头的行和空行将被忽略。 +* 其他所有行应遵循以下格式之一: + * ``CONFIG_DEPRECATED_NAME CONFIG_NEW_NAME``,其中 ``CONFIG_DEPRECATED_NAME`` 是旧配置名称,在较新的 ESP-IDF 版本中已更名为 ``CONFIG_NEW_NAME``。 + * ``CONFIG_DEPRECATED_NAME !CONFIG_NEW_INVERTED_NAME``,其中 ``CONFIG_NEW_INVERTED_NAME`` 是在较新的 ESP-IDF 版本中通过布尔反转 ``CONFIG_DEPRECATED_NAME`` 的逻辑值而引入的新配置名称。 + .. _configuration-options-reference: 配置选项参考