diff --git a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/Debug/debug.c b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/Debug/debug.c index 766bb6cef..35d7aaa02 100644 --- a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/Debug/debug.c +++ b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/Debug/debug.c @@ -52,6 +52,11 @@ void Delay_Init(void) */ void Delay_Us(uint32_t n) { + // 保存SysTick所有相关状态 + u32 systick_ctlr = SysTick->CTLR; + u64 systick_cmp = SysTick->CMP; + u32 systick_sr = SysTick->SR; + uint32_t i; SysTick->SR &= ~(1 << 0); @@ -63,6 +68,11 @@ void Delay_Us(uint32_t n) while((SysTick->SR & (1 << 0)) != (1 << 0)); SysTick->CTLR &= ~(1 << 0); + + // 恢复SysTick所有状态 + SysTick->CTLR = systick_ctlr; // 恢复控制寄存器状态,包括中断使能、计数器使能等 + SysTick->CMP = systick_cmp; // 恢复比较值 + SysTick->SR = systick_sr; // 恢复状态寄存器状态,注意清中断位的操作应根据实际情况调整 } /********************************************************************* @@ -78,12 +88,10 @@ void Delay_Ms(uint32_t n) { uint32_t i; - // 保存原始状态 - if (originalSysTickState.SR == 0) { - originalSysTickState.SR = SysTick->SR; - originalSysTickState.CMP = SysTick->CMP; - originalSysTickState.CTLR = SysTick->CTLR; - } + // 保存SysTick所有相关状态 + u32 systick_ctlr = SysTick->CTLR; + u64 systick_cmp = SysTick->CMP; + u32 systick_sr = SysTick->SR; SysTick->SR &= ~(1 << 0); i = (uint32_t)n * p_ms; @@ -94,10 +102,11 @@ void Delay_Ms(uint32_t n) while((SysTick->SR & (1 << 0)) != (1 << 0)); SysTick->CTLR &= ~(1 << 0); - // 恢复原始状态 - SysTick->SR = originalSysTickState.SR; - SysTick->CMP = originalSysTickState.CMP; - SysTick->CTLR = originalSysTickState.CTLR; + + // 恢复SysTick所有状态 + SysTick->CTLR = systick_ctlr; // 恢复控制寄存器状态,包括中断使能、计数器使能等 + SysTick->CMP = systick_cmp; // 恢复比较值 + SysTick->SR = systick_sr; // 恢复状态寄存器状态,注意清中断位的操作应根据实际情况调整 } /********************************************************************* diff --git a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/Makefile b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/Makefile index a2aae14fe..ca8a90e5a 100644 --- a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/Makefile +++ b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/Makefile @@ -1,4 +1,4 @@ -SRC_FILES := boot.S interrupt.c tick.c switch.S prepare_rhwstack.c interrupt_switch.S +SRC_FILES := boot.S interrupt.c tick.c switch.S prepare_rhwstack.c interrupt_switch.S ble_task_scheduler.S SRC_DIR := Core User Debug # interrupt_switch.S include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/ch32v20x_it.c b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/ch32v20x_it.c index 38cc8d7ce..781f9afce 100644 --- a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/ch32v20x_it.c +++ b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/ch32v20x_it.c @@ -15,12 +15,13 @@ #include "ch32v20x_tim.h" #include "eth_driver.h" #include +#include "wchble.h" void NMI_Handler(void) __attribute__((interrupt())); void HardFault_Handler(void) __attribute__((interrupt())); void ETH_IRQHandler(void) __attribute__((interrupt())); void TIM2_IRQHandler(void) __attribute__((interrupt())); - +void BB_IRQHandler(void) __attribute__((interrupt())); /********************************************************************* * @fn NMI_Handler * @@ -67,6 +68,7 @@ void HardFault_Handler(void) * * @return none */ +#ifdef BSP_USING_ETH void ETH_IRQHandler(void) { WCHNET_ETHIsr(); @@ -86,5 +88,18 @@ void TIM2_IRQHandler(void) WCHNET_TimeIsr(WCHNETTIMERPERIOD); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } +#endif - +/********************************************************************* + * @fn BB_IRQHandler + * + * @brief BB Interrupt for BLE. + * + * @return None + */ +#ifdef BSP_USING_BLE +void BB_IRQHandler(void) +{ + BB_IRQLibHandler(); +} +#endif \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/system_ch32v20x.c b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/system_ch32v20x.c index 0b5283b76..74cc9e907 100644 --- a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/system_ch32v20x.c +++ b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/system_ch32v20x.c @@ -23,14 +23,14 @@ //#define SYSCLK_FREQ_56MHz_HSE 56000000 //#define SYSCLK_FREQ_72MHz_HSE 72000000 //#define SYSCLK_FREQ_96MHz_HSE 96000000 -//#define SYSCLK_FREQ_120MHz_HSE 120000000 +#define SYSCLK_FREQ_120MHz_HSE 120000000 //#define SYSCLK_FREQ_144MHz_HSE 144000000 //#define SYSCLK_FREQ_HSI HSI_VALUE //#define SYSCLK_FREQ_48MHz_HSI 48000000 //#define SYSCLK_FREQ_56MHz_HSI 56000000 //#define SYSCLK_FREQ_72MHz_HSI 72000000 // #define SYSCLK_FREQ_96MHz_HSI 96000000 -#define SYSCLK_FREQ_120MHz_HSI 120000000 +// #define SYSCLK_FREQ_120MHz_HSI 120000000 //#define SYSCLK_FREQ_144MHz_HSI 144000000 /* Clock Definitions */ diff --git a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/ble_task_scheduler.S b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/ble_task_scheduler.S new file mode 100755 index 000000000..b1585be82 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/ble_task_scheduler.S @@ -0,0 +1,127 @@ +.global Ecall_M_Mode_Handler +.global Ecall_U_Mode_Handler +.global LLE_IRQHandler + +.extern g_LLE_IRQLibHandlerLocation + +.section .highcode,"ax",@progbits +.align 2 +.func +Ecall_M_Mode_Handler: +Ecall_U_Mode_Handler: + + addi a1, x0, 0x20 + csrs 0x804, a1 + + lw a1, 0 * 4( sp ) + csrw mepc, a1 + + lw x1, 1 * 4( sp ) + lw x4, 2 * 4( sp ) + lw x5, 3 * 4( sp ) + lw x6, 4 * 4( sp ) + lw x7, 5 * 4( sp ) + lw x8, 6 * 4( sp ) + lw x9, 7 * 4( sp ) + lw x10, 8 * 4( sp ) + lw x11, 9 * 4( sp ) + lw x12, 10 * 4( sp ) + lw x13, 11 * 4( sp ) + lw x14, 12 * 4( sp ) + lw x15, 13 * 4( sp ) + lw x16, 14 * 4( sp ) + lw x17, 15 * 4( sp ) + lw x18, 16 * 4( sp ) + lw x19, 17 * 4( sp ) + lw x20, 18 * 4( sp ) + lw x21, 19 * 4( sp ) + lw x22, 20 * 4( sp ) + lw x23, 21 * 4( sp ) + lw x24, 22 * 4( sp ) + lw x25, 23 * 4( sp ) + lw x26, 24 * 4( sp ) + lw x27, 25 * 4( sp ) + lw x28, 26 * 4( sp ) + lw x29, 27 * 4( sp ) + lw x30, 28 * 4( sp ) + lw x31, 29 * 4( sp ) + + addi sp, sp, 32*4 + + mret + .endfunc + +.section .highcode.LLE_IRQHandler,"ax",@progbits +.align 2 +.func +LLE_IRQHandler: + addi sp, sp, -32*4 + + sw x1, 1 * 4( sp ) + sw x4, 2 * 4( sp ) + sw x5, 3 * 4( sp ) + sw x6, 4 * 4( sp ) + sw x7, 5 * 4( sp ) + sw x8, 6 * 4( sp ) + sw x9, 7 * 4( sp ) + sw x10, 8 * 4( sp ) + sw x11, 9 * 4( sp ) + sw x12, 10 * 4( sp ) + sw x13, 11 * 4( sp ) + sw x14, 12 * 4( sp ) + sw x15, 13 * 4( sp ) + sw x16, 14 * 4( sp ) + sw x17, 15 * 4( sp ) + sw x18, 16 * 4( sp ) + sw x19, 17 * 4( sp ) + sw x20, 18 * 4( sp ) + sw x21, 19 * 4( sp ) + sw x22, 20 * 4( sp ) + sw x23, 21 * 4( sp ) + sw x24, 22 * 4( sp ) + sw x25, 23 * 4( sp ) + sw x26, 24 * 4( sp ) + sw x27, 25 * 4( sp ) + sw x28, 26 * 4( sp ) + sw x29, 27 * 4( sp ) + sw x30, 28 * 4( sp ) + sw x31, 29 * 4( sp ) + + la a1, g_LLE_IRQLibHandlerLocation + lw a0, 0(a1) + jalr x1, 0(a0) + + lw x1, 1 * 4( sp ) + lw x4, 2 * 4( sp ) + lw x5, 3 * 4( sp ) + lw x6, 4 * 4( sp ) + lw x7, 5 * 4( sp ) + lw x8, 6 * 4( sp ) + lw x9, 7 * 4( sp ) + lw x10, 8 * 4( sp ) + lw x11, 9 * 4( sp ) + lw x12, 10 * 4( sp ) + lw x13, 11 * 4( sp ) + lw x14, 12 * 4( sp ) + lw x15, 13 * 4( sp ) + lw x16, 14 * 4( sp ) + lw x17, 15 * 4( sp ) + lw x18, 16 * 4( sp ) + lw x19, 17 * 4( sp ) + lw x20, 18 * 4( sp ) + lw x21, 19 * 4( sp ) + lw x22, 20 * 4( sp ) + lw x23, 21 * 4( sp ) + lw x24, 22 * 4( sp ) + lw x25, 23 * 4( sp ) + lw x26, 24 * 4( sp ) + lw x27, 25 * 4( sp ) + lw x28, 26 * 4( sp ) + lw x29, 27 * 4( sp ) + lw x30, 28 * 4( sp ) + lw x31, 29 * 4( sp ) + + addi sp, sp, 32*4 + + mret + .endfunc diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.c index 8a66700c2..ceae24365 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.c +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.c @@ -38,6 +38,8 @@ #include #include "connect_ether.h" #include "adc.h" +#include "third_party_driver/ble/inc/wchble.h" +#include "third_party_driver/ble/inc/HAL.h" // core clock. extern uint32_t SystemCoreClock; @@ -67,14 +69,24 @@ void InitBoardHardware() _SysTick_Config(SystemCoreClock / TICK_PER_SECOND); /* initialize memory system */ InitBoardMemory(MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); + +#ifdef BSP_USING_UART InitHwUart(); InstallConsole("uart1", SERIAL_DRV_NAME_1, SERIAL_1_DEVICE_NAME_0); +#endif + #ifdef BSP_USING_ETH InitHwEth(); #endif + #ifdef BSP_USING_ADC ADC_Function_Init(); #endif + +#ifdef BSP_USING_BLE + WCHBLE_Init(); + HAL_Init(); +#endif KPrintf("consle init completed.\n"); KPrintf("board initialization......\n"); // KPrintf("memory address range: [0x%08x - 0x%08x], size: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, gd32vf103_SRAM_SIZE); diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.h index 874d047fb..d50e481ba 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.h +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.h @@ -36,12 +36,12 @@ Modification: #define ch32v20x_PIN_NUMBERS 48 /* board configuration */ -#define SRAM_SIZE 48 +#define SRAM_SIZE 64 #define EUSR_STACK_SIZE 2048 // #define SRAM_END (0x20000000 + SRAM_SIZE * 0x400) // #define SRAM_END (0x20008000) -#define SRAM_END (0x2000C000) +#define SRAM_END (0x20010000) extern int _ebss; extern int __stack_size; #define MEMORY_START_ADDRESS ((void *)&_ebss) diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/config.mk b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/config.mk index 0855c54f6..71507b771 100755 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/config.mk +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/config.mk @@ -16,6 +16,7 @@ export CROSS_COMPILE ?=/opt/riscv64-toolchain/bin/riscv64-unknown-elf- export DEFINES := -DHAVE_CCONFIG_H -DHAVE_SIGINFO export LINK_WCH_NET := $(KERNEL_ROOT)/board/ch32v208rbt6/third_party_driver/ethernet/libwchnet.a +export LINK_WCH_BLE := $(KERNEL_ROOT)/board/ch32v208rbt6/third_party_driver/ble/lib/libwchble.a export ARCH = risc-v export MCU = CH32V208 diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/link.ld b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/link.ld index 112504256..37d556ce3 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/link.ld +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/link.ld @@ -17,7 +17,7 @@ MEMORY /* FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K - */ +*/ /* CH32V20x_D8 - CH32V203RB CH32V20x_D8W - CH32V208x @@ -26,8 +26,8 @@ MEMORY FLASH-144K + RAM-48K FLASH-160K + RAM-32K */ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 144K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 448K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K } @@ -48,14 +48,26 @@ SECTIONS *(.vector); . = ALIGN(64); } >FLASH AT>FLASH - + + .highcode : + { + . = ALIGN(4); + *(.highcode); + *(.highcode.*); + . = ALIGN(4); + } >FLASH AT>FLASH + .text : { . = ALIGN(4); + EXCLUDE_FILE (*wchble.a) *(.text .text*) *(.text) *(.text.*) *(.rodata) *(.rodata*) + *(.sdata2.*) + *(.glue_7) + *(.glue_7t) *(.gnu.linkonce.t.*) . = ALIGN(4); diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Kconfig b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Kconfig index 9dd39483c..a431fca48 100755 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Kconfig +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Kconfig @@ -1,4 +1,3 @@ - menuconfig BSP_USING_UART bool "Using UART device" default y @@ -14,4 +13,8 @@ menuconfig BSP_USING_ETH menuconfig BSP_USING_ADC bool "Using ADC" default y + +menuconfig BSP_USING_BLE + bool "Using BLE" + default y \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Makefile index 2e6e56216..583632455 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Makefile +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Makefile @@ -10,4 +10,7 @@ endif ifeq ($(CONFIG_BSP_USING_ADC),y) SRC_DIR += adc endif +ifeq ($(CONFIG_BSP_USING_BLE),y) + SRC_DIR += ble +endif include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Makefile new file mode 100644 index 000000000..b0a357d2b --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := +SRC_DIR := test Profile src +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/Makefile new file mode 100644 index 000000000..22adaad85 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := devinfoservice.c gattprofile.c + +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/devinfoservice.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/devinfoservice.c new file mode 100755 index 000000000..608dc7db1 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/devinfoservice.c @@ -0,0 +1,588 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : devinfoservice.c + * Author : WCH + * Version : V1.0 + * Date : 2018/12/10 + * Description : Device information service + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "../inc/config.h" +#include "devinfoservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Device information service +const uint8_t devInfoServUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(DEVINFO_SERV_UUID), HI_UINT16(DEVINFO_SERV_UUID)}; + +// System ID +const uint8_t devInfoSystemIdUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SYSTEM_ID_UUID), HI_UINT16(SYSTEM_ID_UUID)}; + +// Model Number String +const uint8_t devInfoModelNumberUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(MODEL_NUMBER_UUID), HI_UINT16(MODEL_NUMBER_UUID)}; + +// Serial Number String +const uint8_t devInfoSerialNumberUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SERIAL_NUMBER_UUID), HI_UINT16(SERIAL_NUMBER_UUID)}; + +// Firmware Revision String +const uint8_t devInfoFirmwareRevUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(FIRMWARE_REV_UUID), HI_UINT16(FIRMWARE_REV_UUID)}; + +// Hardware Revision String +const uint8_t devInfoHardwareRevUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(HARDWARE_REV_UUID), HI_UINT16(HARDWARE_REV_UUID)}; + +// Software Revision String +const uint8_t devInfoSoftwareRevUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SOFTWARE_REV_UUID), HI_UINT16(SOFTWARE_REV_UUID)}; + +// Manufacturer Name String +const uint8_t devInfoMfrNameUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(MANUFACTURER_NAME_UUID), HI_UINT16(MANUFACTURER_NAME_UUID)}; + +// IEEE 11073-20601 Regulatory Certification Data List +const uint8_t devInfo11073CertUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(IEEE_11073_CERT_DATA_UUID), HI_UINT16(IEEE_11073_CERT_DATA_UUID)}; + +// PnP ID +const uint8_t devInfoPnpIdUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(PNP_ID_UUID), HI_UINT16(PNP_ID_UUID)}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * Profile Attributes - variables + */ + +// Device Information Service attribute +static const gattAttrType_t devInfoService = {ATT_BT_UUID_SIZE, devInfoServUUID}; + +// System ID characteristic +static uint8_t devInfoSystemIdProps = GATT_PROP_READ; +static uint8_t devInfoSystemId[DEVINFO_SYSTEM_ID_LEN] = {0, 0, 0, 0, 0, 0, 0, 0}; + +// Model Number String characteristic +static uint8_t devInfoModelNumberProps = GATT_PROP_READ; +static const uint8_t devInfoModelNumber[] = "Model Number"; + +// Serial Number String characteristic +static uint8_t devInfoSerialNumberProps = GATT_PROP_READ; +static const uint8_t devInfoSerialNumber[] = "Serial Number"; + +// Firmware Revision String characteristic +static uint8_t devInfoFirmwareRevProps = GATT_PROP_READ; +static const uint8_t devInfoFirmwareRev[] = "Firmware Revision"; + +// Hardware Revision String characteristic +static uint8_t devInfoHardwareRevProps = GATT_PROP_READ; +static const uint8_t devInfoHardwareRev[] = "Hardware Revision"; + +// Software Revision String characteristic +static uint8_t devInfoSoftwareRevProps = GATT_PROP_READ; +static const uint8_t devInfoSoftwareRev[] = "Software Revision"; + +// Manufacturer Name String characteristic +static uint8_t devInfoMfrNameProps = GATT_PROP_READ; +static const uint8_t devInfoMfrName[] = "Manufacturer Name"; + +// IEEE 11073-20601 Regulatory Certification Data List characteristic +static uint8_t devInfo11073CertProps = GATT_PROP_READ; +static const uint8_t devInfo11073Cert[] = { + DEVINFO_11073_BODY_EXP, // authoritative body type + 0x00, // authoritative body structure type + // authoritative body data follows below: + 'e', 'x', 'p', 'e', 'r', 'i', 'm', 'e', 'n', 't', 'a', 'l'}; + +// System ID characteristic +static uint8_t devInfoPnpIdProps = GATT_PROP_READ; +static uint8_t devInfoPnpId[DEVINFO_PNP_ID_LEN] = { + 1, // Vendor ID source (1=Bluetooth SIG) + LO_UINT16(0x07D7), HI_UINT16(0x07D7), // Vendor ID (WCH) + LO_UINT16(0x0000), HI_UINT16(0x0000), // Product ID (vendor-specific) + LO_UINT16(0x0110), HI_UINT16(0x0110) // Product version (JJ.M.N) +}; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t devInfoAttrTbl[] = { + // Device Information Service + { + {ATT_BT_UUID_SIZE, primaryServiceUUID}, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8_t *)&devInfoService /* pValue */ + }, + + // System ID Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfoSystemIdProps}, + + // System ID Value + { + {ATT_BT_UUID_SIZE, devInfoSystemIdUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfoSystemId}, + + // Model Number String Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfoModelNumberProps}, + + // Model Number Value + { + {ATT_BT_UUID_SIZE, devInfoModelNumberUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfoModelNumber}, + + // Serial Number String Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfoSerialNumberProps}, + + // Serial Number Value + { + {ATT_BT_UUID_SIZE, devInfoSerialNumberUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfoSerialNumber}, + + // Firmware Revision String Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfoFirmwareRevProps}, + + // Firmware Revision Value + { + {ATT_BT_UUID_SIZE, devInfoFirmwareRevUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfoFirmwareRev}, + + // Hardware Revision String Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfoHardwareRevProps}, + + // Hardware Revision Value + { + {ATT_BT_UUID_SIZE, devInfoHardwareRevUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfoHardwareRev}, + + // Software Revision String Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfoSoftwareRevProps}, + + // Software Revision Value + { + {ATT_BT_UUID_SIZE, devInfoSoftwareRevUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfoSoftwareRev}, + + // Manufacturer Name String Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfoMfrNameProps}, + + // Manufacturer Name Value + { + {ATT_BT_UUID_SIZE, devInfoMfrNameUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfoMfrName}, + + // IEEE 11073-20601 Regulatory Certification Data List Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfo11073CertProps}, + + // IEEE 11073-20601 Regulatory Certification Data List Value + { + {ATT_BT_UUID_SIZE, devInfo11073CertUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfo11073Cert}, + + // PnP ID Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &devInfoPnpIdProps}, + + // PnP ID Value + { + {ATT_BT_UUID_SIZE, devInfoPnpIdUUID}, + GATT_PERMIT_READ, + 0, + (uint8_t *)devInfoPnpId}}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static bStatus_t devInfo_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Device Info Service Callbacks +gattServiceCBs_t devInfoCBs = { + devInfo_ReadAttrCB, // Read callback function pointer + NULL, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn DevInfo_AddService + * + * @brief Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t DevInfo_AddService(void) +{ + // Register GATT attribute list and CBs with GATT Server App + return GATTServApp_RegisterService(devInfoAttrTbl, + GATT_NUM_ATTRS(devInfoAttrTbl), + GATT_MAX_ENCRYPT_KEY_SIZE, + &devInfoCBs); +} + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to write + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter(uint8_t param, uint8_t len, void *value) +{ + bStatus_t ret = SUCCESS; + + switch(param) + { + case DEVINFO_SYSTEM_ID: + tmos_memcpy(devInfoSystemId, value, len); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return (ret); +} + +/********************************************************************* + * @fn DevInfo_GetParameter + * + * @brief Get a Device Information parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_GetParameter(uint8_t param, void *value) +{ + bStatus_t ret = SUCCESS; + + switch(param) + { + case DEVINFO_SYSTEM_ID: + tmos_memcpy(value, devInfoSystemId, sizeof(devInfoSystemId)); + break; + + case DEVINFO_MODEL_NUMBER: + tmos_memcpy(value, devInfoModelNumber, sizeof(devInfoModelNumber)); + break; + case DEVINFO_SERIAL_NUMBER: + tmos_memcpy(value, devInfoSerialNumber, sizeof(devInfoSerialNumber)); + break; + + case DEVINFO_FIRMWARE_REV: + tmos_memcpy(value, devInfoFirmwareRev, sizeof(devInfoFirmwareRev)); + break; + + case DEVINFO_HARDWARE_REV: + tmos_memcpy(value, devInfoHardwareRev, sizeof(devInfoHardwareRev)); + break; + + case DEVINFO_SOFTWARE_REV: + tmos_memcpy(value, devInfoSoftwareRev, sizeof(devInfoSoftwareRev)); + break; + + case DEVINFO_MANUFACTURER_NAME: + tmos_memcpy(value, devInfoMfrName, sizeof(devInfoMfrName)); + break; + + case DEVINFO_11073_CERT_DATA: + tmos_memcpy(value, devInfo11073Cert, sizeof(devInfo11073Cert)); + break; + + case DEVINFO_PNP_ID: + tmos_memcpy(value, devInfoPnpId, sizeof(devInfoPnpId)); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return (ret); +} + +/********************************************************************* + * @fn devInfo_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static bStatus_t devInfo_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method) +{ + bStatus_t status = SUCCESS; + uint16_t uuid = BUILD_UINT16(pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch(uuid) + { + case SYSTEM_ID_UUID: + // verify offset + if(offset >= sizeof(devInfoSystemId)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoSystemId) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfoSystemId[offset], *pLen); + } + break; + + case MODEL_NUMBER_UUID: + // verify offset + if(offset >= (sizeof(devInfoModelNumber) - 1)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length (exclude null terminating character) + *pLen = MIN(maxLen, ((sizeof(devInfoModelNumber) - 1) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfoModelNumber[offset], *pLen); + } + break; + + case SERIAL_NUMBER_UUID: + // verify offset + if(offset >= (sizeof(devInfoSerialNumber) - 1)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length (exclude null terminating character) + *pLen = MIN(maxLen, ((sizeof(devInfoSerialNumber) - 1) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfoSerialNumber[offset], *pLen); + } + break; + + case FIRMWARE_REV_UUID: + // verify offset + if(offset >= (sizeof(devInfoFirmwareRev) - 1)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length (exclude null terminating character) + *pLen = MIN(maxLen, ((sizeof(devInfoFirmwareRev) - 1) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfoFirmwareRev[offset], *pLen); + } + break; + + case HARDWARE_REV_UUID: + // verify offset + if(offset >= (sizeof(devInfoHardwareRev) - 1)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length (exclude null terminating character) + *pLen = MIN(maxLen, ((sizeof(devInfoHardwareRev) - 1) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfoHardwareRev[offset], *pLen); + } + break; + + case SOFTWARE_REV_UUID: + // verify offset + if(offset >= (sizeof(devInfoSoftwareRev) - 1)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length (exclude null terminating character) + *pLen = MIN(maxLen, ((sizeof(devInfoSoftwareRev) - 1) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfoSoftwareRev[offset], *pLen); + } + break; + + case MANUFACTURER_NAME_UUID: + // verify offset + if(offset >= (sizeof(devInfoMfrName) - 1)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length (exclude null terminating character) + *pLen = MIN(maxLen, ((sizeof(devInfoMfrName) - 1) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfoMfrName[offset], *pLen); + } + break; + + case IEEE_11073_CERT_DATA_UUID: + // verify offset + if(offset >= sizeof(devInfo11073Cert)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfo11073Cert) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfo11073Cert[offset], *pLen); + } + break; + + case PNP_ID_UUID: + // verify offset + if(offset >= sizeof(devInfoPnpId)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoPnpId) - offset)); + + // copy data + tmos_memcpy(pValue, &devInfoPnpId[offset], *pLen); + } + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return (status); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/devinfoservice.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/devinfoservice.h new file mode 100755 index 000000000..eadfa9d81 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/devinfoservice.h @@ -0,0 +1,109 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : devinfoservice.h + * Author : WCH + * Version : V1.0 + * Date : 2018/12/11 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +#ifndef DEVINFOSERVICE_H +#define DEVINFOSERVICE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Device Information Service Parameters +#define DEVINFO_SYSTEM_ID 0 +#define DEVINFO_MODEL_NUMBER 1 +#define DEVINFO_SERIAL_NUMBER 2 +#define DEVINFO_FIRMWARE_REV 3 +#define DEVINFO_HARDWARE_REV 4 +#define DEVINFO_SOFTWARE_REV 5 +#define DEVINFO_MANUFACTURER_NAME 6 +#define DEVINFO_11073_CERT_DATA 7 +#define DEVINFO_PNP_ID 8 + +// IEEE 11073 authoritative body values +#define DEVINFO_11073_BODY_EMPTY 0 +#define DEVINFO_11073_BODY_IEEE 1 +#define DEVINFO_11073_BODY_CONTINUA 2 +#define DEVINFO_11073_BODY_EXP 254 + +// System ID length +#define DEVINFO_SYSTEM_ID_LEN 8 + +// PnP ID length +#define DEVINFO_PNP_ID_LEN 7 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * DevInfo_AddService- Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + */ + +extern bStatus_t DevInfo_AddService(void); + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter(uint8_t param, uint8_t len, void *value); + +/* + * DevInfo_GetParameter - Get a Device Information parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + */ +extern bStatus_t DevInfo_GetParameter(uint8_t param, void *value); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* DEVINFOSERVICE_H */ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/gattprofile.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/gattprofile.c new file mode 100755 index 000000000..323e9af46 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/gattprofile.c @@ -0,0 +1,703 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : gattprofile.C + * Author : WCH + * Version : V1.0 + * Date : 2018/12/10 + * Description : Customized services containing five different attributes, + * including readable, written, notified, readable, readable, + * safe readable available + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "../inc/config.h" +#include "gattprofile.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Position of simpleProfilechar4 value in attribute array +#define SIMPLEPROFILE_CHAR4_VALUE_POS 11 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Simple GATT Profile Service UUID: 0xFFF0 +const uint8_t simpleProfileServUUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID)}; + +// Characteristic 1 UUID: 0xFFF1 +const uint8_t simpleProfilechar1UUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SIMPLEPROFILE_CHAR1_UUID), HI_UINT16(SIMPLEPROFILE_CHAR1_UUID)}; + +// Characteristic 2 UUID: 0xFFF2 +const uint8_t simpleProfilechar2UUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SIMPLEPROFILE_CHAR2_UUID), HI_UINT16(SIMPLEPROFILE_CHAR2_UUID)}; + +// Characteristic 3 UUID: 0xFFF3 +const uint8_t simpleProfilechar3UUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SIMPLEPROFILE_CHAR3_UUID), HI_UINT16(SIMPLEPROFILE_CHAR3_UUID)}; + +// Characteristic 4 UUID: 0xFFF4 +const uint8_t simpleProfilechar4UUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SIMPLEPROFILE_CHAR4_UUID), HI_UINT16(SIMPLEPROFILE_CHAR4_UUID)}; + +// Characteristic 5 UUID: 0xFFF5 +const uint8_t simpleProfilechar5UUID[ATT_BT_UUID_SIZE] = { + LO_UINT16(SIMPLEPROFILE_CHAR5_UUID), HI_UINT16(SIMPLEPROFILE_CHAR5_UUID)}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static simpleProfileCBs_t *simpleProfile_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Simple Profile Service attribute +static const gattAttrType_t simpleProfileService = {ATT_BT_UUID_SIZE, simpleProfileServUUID}; + +// Simple Profile Characteristic 1 Properties +static uint8_t simpleProfileChar1Props = GATT_PROP_READ | GATT_PROP_WRITE; + +// Characteristic 1 Value +static uint8_t simpleProfileChar1[SIMPLEPROFILE_CHAR1_LEN] = {0}; + +// Simple Profile Characteristic 1 User Description +static uint8_t simpleProfileChar1UserDesp[] = "Characteristic 1\0"; + +// Simple Profile Characteristic 2 Properties +static uint8_t simpleProfileChar2Props = GATT_PROP_READ; + +// Characteristic 2 Value +static uint8_t simpleProfileChar2[SIMPLEPROFILE_CHAR2_LEN] = {0}; + +// Simple Profile Characteristic 2 User Description +static uint8_t simpleProfileChar2UserDesp[] = "Characteristic 2\0"; + +// Simple Profile Characteristic 3 Properties +static uint8_t simpleProfileChar3Props = GATT_PROP_WRITE; + +// Characteristic 3 Value +static uint8_t simpleProfileChar3[SIMPLEPROFILE_CHAR3_LEN] = {0}; + +// Simple Profile Characteristic 3 User Description +static uint8_t simpleProfileChar3UserDesp[] = "Characteristic 3\0"; + +// Simple Profile Characteristic 4 Properties +static uint8_t simpleProfileChar4Props = GATT_PROP_NOTIFY; + +// Characteristic 4 Value +static uint8_t simpleProfileChar4[SIMPLEPROFILE_CHAR4_LEN] = {0}; + +// Simple Profile Characteristic 4 Configuration Each client has its own +// instantiation of the Client Characteristic Configuration. Reads of the +// Client Characteristic Configuration only shows the configuration for +// that client and writes only affect the configuration of that client. +static gattCharCfg_t simpleProfileChar4Config[4]; + +// Simple Profile Characteristic 4 User Description +static uint8_t simpleProfileChar4UserDesp[] = "Characteristic 4\0"; + +// Simple Profile Characteristic 5 Properties +static uint8_t simpleProfileChar5Props = GATT_PROP_READ; + +// Characteristic 5 Value +static uint8_t simpleProfileChar5[SIMPLEPROFILE_CHAR5_LEN] = {0}; + +// Simple Profile Characteristic 5 User Description +static uint8_t simpleProfileChar5UserDesp[] = "Characteristic 5\0"; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t simpleProfileAttrTbl[] = { + // Simple Profile Service + { + {ATT_BT_UUID_SIZE, primaryServiceUUID}, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8_t *)&simpleProfileService /* pValue */ + }, + + // Characteristic 1 Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &simpleProfileChar1Props}, + + // Characteristic Value 1 + { + {ATT_BT_UUID_SIZE, simpleProfilechar1UUID}, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + simpleProfileChar1}, + + // Characteristic 1 User Description + { + {ATT_BT_UUID_SIZE, charUserDescUUID}, + GATT_PERMIT_READ, + 0, + simpleProfileChar1UserDesp}, + + // Characteristic 2 Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &simpleProfileChar2Props}, + + // Characteristic Value 2 + { + {ATT_BT_UUID_SIZE, simpleProfilechar2UUID}, + GATT_PERMIT_READ, + 0, + simpleProfileChar2}, + + // Characteristic 2 User Description + { + {ATT_BT_UUID_SIZE, charUserDescUUID}, + GATT_PERMIT_READ, + 0, + simpleProfileChar2UserDesp}, + + // Characteristic 3 Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &simpleProfileChar3Props}, + + // Characteristic Value 3 + { + {ATT_BT_UUID_SIZE, simpleProfilechar3UUID}, + GATT_PERMIT_WRITE, + 0, + simpleProfileChar3}, + + // Characteristic 3 User Description + { + {ATT_BT_UUID_SIZE, charUserDescUUID}, + GATT_PERMIT_READ, + 0, + simpleProfileChar3UserDesp}, + + // Characteristic 4 Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &simpleProfileChar4Props}, + + // Characteristic Value 4 + { + {ATT_BT_UUID_SIZE, simpleProfilechar4UUID}, + 0, + 0, + simpleProfileChar4}, + + // Characteristic 4 configuration + { + {ATT_BT_UUID_SIZE, clientCharCfgUUID}, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8_t *)simpleProfileChar4Config}, + + // Characteristic 4 User Description + { + {ATT_BT_UUID_SIZE, charUserDescUUID}, + GATT_PERMIT_READ, + 0, + simpleProfileChar4UserDesp}, + + // Characteristic 5 Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &simpleProfileChar5Props}, + + // Characteristic Value 5 + { + {ATT_BT_UUID_SIZE, simpleProfilechar5UUID}, + GATT_PERMIT_AUTHEN_READ, + 0, + simpleProfileChar5}, + + // Characteristic 5 User Description + { + {ATT_BT_UUID_SIZE, charUserDescUUID}, + GATT_PERMIT_READ, + 0, + simpleProfileChar5UserDesp}, +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static bStatus_t simpleProfile_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method); +static bStatus_t simpleProfile_WriteAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t len, uint16_t offset, uint8_t method); + +static void simpleProfile_HandleConnStatusCB(uint16_t connHandle, uint8_t changeType); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +gattServiceCBs_t simpleProfileCBs = { + simpleProfile_ReadAttrCB, // Read callback function pointer + simpleProfile_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn SimpleProfile_AddService + * + * @brief Initializes the Simple Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t SimpleProfile_AddService(uint32_t services) +{ + uint8_t status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg(INVALID_CONNHANDLE, simpleProfileChar4Config); + + // Register with Link DB to receive link status change callback + linkDB_Register(simpleProfile_HandleConnStatusCB); + + if(services & SIMPLEPROFILE_SERVICE) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService(simpleProfileAttrTbl, + GATT_NUM_ATTRS(simpleProfileAttrTbl), + GATT_MAX_ENCRYPT_KEY_SIZE, + &simpleProfileCBs); + } + + return (status); +} + +/********************************************************************* + * @fn SimpleProfile_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t SimpleProfile_RegisterAppCBs(simpleProfileCBs_t *appCallbacks) +{ + if(appCallbacks) + { + simpleProfile_AppCBs = appCallbacks; + + return (SUCCESS); + } + else + { + return (bleAlreadyInRequestedMode); + } +} + +/********************************************************************* + * @fn SimpleProfile_SetParameter + * + * @brief Set a Simple Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return bStatus_t + */ +bStatus_t SimpleProfile_SetParameter(uint8_t param, uint8_t len, void *value) +{ + bStatus_t ret = SUCCESS; + switch(param) + { + case SIMPLEPROFILE_CHAR1: + if(len == SIMPLEPROFILE_CHAR1_LEN) + { + tmos_memcpy(simpleProfileChar1, value, SIMPLEPROFILE_CHAR1_LEN); + } + else + { + ret = bleInvalidRange; + } + break; + + case SIMPLEPROFILE_CHAR2: + if(len == SIMPLEPROFILE_CHAR2_LEN) + { + tmos_memcpy(simpleProfileChar2, value, SIMPLEPROFILE_CHAR2_LEN); + } + else + { + ret = bleInvalidRange; + } + break; + + case SIMPLEPROFILE_CHAR3: + if(len == SIMPLEPROFILE_CHAR3_LEN) + { + tmos_memcpy(simpleProfileChar3, value, SIMPLEPROFILE_CHAR3_LEN); + } + else + { + ret = bleInvalidRange; + } + break; + + case SIMPLEPROFILE_CHAR4: + if(len == SIMPLEPROFILE_CHAR4_LEN) + { + tmos_memcpy(simpleProfileChar4, value, SIMPLEPROFILE_CHAR4_LEN); + } + else + { + ret = bleInvalidRange; + } + break; + + case SIMPLEPROFILE_CHAR5: + if(len == SIMPLEPROFILE_CHAR5_LEN) + { + tmos_memcpy(simpleProfileChar5, value, SIMPLEPROFILE_CHAR5_LEN); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return (ret); +} + +/********************************************************************* + * @fn SimpleProfile_GetParameter + * + * @brief Get a Simple Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return bStatus_t + */ +bStatus_t SimpleProfile_GetParameter(uint8_t param, void *value) +{ + bStatus_t ret = SUCCESS; + switch(param) + { + case SIMPLEPROFILE_CHAR1: + tmos_memcpy(value, simpleProfileChar1, SIMPLEPROFILE_CHAR1_LEN); + break; + + case SIMPLEPROFILE_CHAR2: + tmos_memcpy(value, simpleProfileChar2, SIMPLEPROFILE_CHAR2_LEN); + break; + + case SIMPLEPROFILE_CHAR3: + tmos_memcpy(value, simpleProfileChar3, SIMPLEPROFILE_CHAR3_LEN); + break; + + case SIMPLEPROFILE_CHAR4: + tmos_memcpy(value, simpleProfileChar4, SIMPLEPROFILE_CHAR4_LEN); + break; + + case SIMPLEPROFILE_CHAR5: + tmos_memcpy(value, simpleProfileChar5, SIMPLEPROFILE_CHAR5_LEN); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return (ret); +} + +/********************************************************************* + * @fn simpleProfile_Notify + * + * @brief Send a notification containing a heart rate + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t simpleProfile_Notify(uint16_t connHandle, attHandleValueNoti_t *pNoti) +{ + uint16_t value = GATTServApp_ReadCharCfg(connHandle, simpleProfileChar4Config); + + // If notifications enabled + if(value & GATT_CLIENT_CFG_NOTIFY) + { + // Set the handle + pNoti->handle = simpleProfileAttrTbl[SIMPLEPROFILE_CHAR4_VALUE_POS].handle; + + // Send the notification + return GATT_Notification(connHandle, pNoti, FALSE); + } + return bleIncorrectMode; +} + +/********************************************************************* + * @fn simpleProfile_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static bStatus_t simpleProfile_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if(offset > 0) + { + return (ATT_ERR_ATTR_NOT_LONG); + } + + if(pAttr->type.len == ATT_BT_UUID_SIZE) + { + // 16-bit UUID + uint16_t uuid = BUILD_UINT16(pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch(uuid) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + + // characteristics 1 and 2 have read permissions + // characteritisc 3 does not have read permissions; therefore it is not + // included here + // characteristic 4 does not have read permissions, but because it + // can be sent as a notification, it is included here + case SIMPLEPROFILE_CHAR1_UUID: + *pLen = SIMPLEPROFILE_CHAR1_LEN; + tmos_memcpy(pValue, pAttr->pValue, SIMPLEPROFILE_CHAR1_LEN); + break; + + case SIMPLEPROFILE_CHAR2_UUID: + *pLen = SIMPLEPROFILE_CHAR2_LEN; + tmos_memcpy(pValue, pAttr->pValue, SIMPLEPROFILE_CHAR2_LEN); + break; + + case SIMPLEPROFILE_CHAR4_UUID: + *pLen = SIMPLEPROFILE_CHAR4_LEN; + tmos_memcpy(pValue, pAttr->pValue, SIMPLEPROFILE_CHAR4_LEN); + break; + + case SIMPLEPROFILE_CHAR5_UUID: + *pLen = SIMPLEPROFILE_CHAR5_LEN; + tmos_memcpy(pValue, pAttr->pValue, SIMPLEPROFILE_CHAR5_LEN); + break; + + default: + // Should never get here! (characteristics 3 and 4 do not have read permissions) + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + return (status); +} + +/********************************************************************* + * @fn simpleProfile_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t simpleProfile_WriteAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t len, uint16_t offset, uint8_t method) +{ + bStatus_t status = SUCCESS; + uint8_t notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if(gattPermitAuthorWrite(pAttr->permissions)) + { + // Insufficient authorization + return (ATT_ERR_INSUFFICIENT_AUTHOR); + } + + if(pAttr->type.len == ATT_BT_UUID_SIZE) + { + // 16-bit UUID + uint16_t uuid = BUILD_UINT16(pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch(uuid) + { + case SIMPLEPROFILE_CHAR1_UUID: + //Validate the value + // Make sure it's not a blob oper + if(offset == 0) + { + if(len > SIMPLEPROFILE_CHAR1_LEN) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if(status == SUCCESS) + { + tmos_memcpy(pAttr->pValue, pValue, SIMPLEPROFILE_CHAR1_LEN); + notifyApp = SIMPLEPROFILE_CHAR1; + } + break; + + case SIMPLEPROFILE_CHAR3_UUID: + //Validate the value + // Make sure it's not a blob oper + if(offset == 0) + { + if(len > SIMPLEPROFILE_CHAR3_LEN) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if(status == SUCCESS) + { + tmos_memcpy(pAttr->pValue, pValue, SIMPLEPROFILE_CHAR3_LEN); + notifyApp = SIMPLEPROFILE_CHAR3; + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq(connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY); + break; + + default: + // Should never get here! (characteristics 2 and 4 do not have write permissions) + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + status = ATT_ERR_INVALID_HANDLE; + } + + // If a charactersitic value changed then callback function to notify application of change + if((notifyApp != 0xFF) && simpleProfile_AppCBs && simpleProfile_AppCBs->pfnSimpleProfileChange) + { + simpleProfile_AppCBs->pfnSimpleProfileChange(notifyApp); + } + + return (status); +} + +/********************************************************************* + * @fn simpleProfile_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void simpleProfile_HandleConnStatusCB(uint16_t connHandle, uint8_t changeType) +{ + // Make sure this is not loopback connection + if(connHandle != LOOPBACK_CONNHANDLE) + { + // Reset Client Char Config if connection has dropped + if((changeType == LINKDB_STATUS_UPDATE_REMOVED) || + ((changeType == LINKDB_STATUS_UPDATE_STATEFLAGS) && + (!linkDB_Up(connHandle)))) + { + GATTServApp_InitCharCfg(connHandle, simpleProfileChar4Config); + } + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/gattprofile.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/gattprofile.h new file mode 100755 index 000000000..f03314fb1 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/Profile/gattprofile.h @@ -0,0 +1,135 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : gattprofile.h + * Author : WCH + * Version : V1.0 + * Date : 2018/12/11 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +#ifndef GATTPROFILE_H +#define GATTPROFILE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define SIMPLEPROFILE_CHAR1 0 // RW uint8_t - Profile Characteristic 1 value +#define SIMPLEPROFILE_CHAR2 1 // RW uint8_t - Profile Characteristic 2 value +#define SIMPLEPROFILE_CHAR3 2 // RW uint8_t - Profile Characteristic 3 value +#define SIMPLEPROFILE_CHAR4 3 // RW uint8_t - Profile Characteristic 4 value +#define SIMPLEPROFILE_CHAR5 4 // RW uint8_t - Profile Characteristic 4 value + +// Simple Profile Service UUID +#define SIMPLEPROFILE_SERV_UUID 0xFFE0 + +// Key Pressed UUID +#define SIMPLEPROFILE_CHAR1_UUID 0xFFE1 +#define SIMPLEPROFILE_CHAR2_UUID 0xFFE2 +#define SIMPLEPROFILE_CHAR3_UUID 0xFFE3 +#define SIMPLEPROFILE_CHAR4_UUID 0xFFE4 +#define SIMPLEPROFILE_CHAR5_UUID 0xFFE5 + +// Simple Keys Profile Services bit fields +#define SIMPLEPROFILE_SERVICE 0x00000001 + +// Length of characteristic in bytes ( Default MTU is 23 ) +#define SIMPLEPROFILE_CHAR1_LEN 1 +#define SIMPLEPROFILE_CHAR2_LEN 1 +#define SIMPLEPROFILE_CHAR3_LEN 1 +#define SIMPLEPROFILE_CHAR4_LEN 1 +#define SIMPLEPROFILE_CHAR5_LEN 5 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef void (*simpleProfileChange_t)(uint8_t paramID); + +typedef struct +{ + simpleProfileChange_t pfnSimpleProfileChange; // Called when characteristic value changes +} simpleProfileCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * SimpleProfile_AddService- Initializes the Simple GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t SimpleProfile_AddService(uint32_t services); + +/* + * SimpleProfile_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t SimpleProfile_RegisterAppCBs(simpleProfileCBs_t *appCallbacks); + +/* + * SimpleProfile_SetParameter - Set a Simple GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + */ +extern bStatus_t SimpleProfile_SetParameter(uint8_t param, uint8_t len, void *value); + +/* + * SimpleProfile_GetParameter - Get a Simple GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + */ +extern bStatus_t SimpleProfile_GetParameter(uint8_t param, void *value); + +/* + * simpleProfile_Notify - Send notification. + * + * connHandle - connect handle + * pNoti - pointer to structure to notify. + */ +extern bStatus_t simpleProfile_Notify(uint16_t connHandle, attHandleValueNoti_t *pNoti); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/HAL.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/HAL.h new file mode 100755 index 000000000..27a2a0faa --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/HAL.h @@ -0,0 +1,82 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : HAL.h + * Author : WCH + * Version : V1.0 + * Date : 2016/05/05 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +#ifndef __HAL_H +#define __HAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "config.h" +#include "RTC.h" +#include "SLEEP.h" +#include "KEY.h" +#include "LED.h" + +/* hal task Event */ +#define LED_BLINK_EVENT 0x0001 +#define HAL_KEY_EVENT 0x0002 +#define HAL_REG_INIT_EVENT 0x2000 +#define HAL_TEST_EVENT 0x4000 + +/********************************************************************* + * GLOBAL VARIABLES + */ +extern tmosTaskID halTaskID; + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +/** + * @brief Hardware initialization + */ +extern void HAL_Init(void); + +/** + * @brief HAL processing + * + * @param task_id - The TMOS assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + */ +extern tmosEvents HAL_ProcessEvent(tmosTaskID task_id, tmosEvents events); + +/** + * @brief Initialization of the BLE library + */ +extern void WCHBLE_Init(void); + +/** + * @brief Get the internal temperature sampling value. + * If the ADC interrupt sampling is used, + * the interrupt is temporarily shielded in this function. + * + * @return Internal temperature sampling value. + */ +extern uint16_t HAL_GetInterTempValue(void); + +/** + * @brief Internal 32K calibration + */ +extern void Lib_Calibration_LSI(void); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/KEY.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/KEY.h new file mode 100755 index 000000000..6d93d4071 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/KEY.h @@ -0,0 +1,112 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : KEY.h + * Author : WCH + * Version : V1.0 + * Date : 2016/04/12 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +#ifndef __KEY_H +#define __KEY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ +#define HAL_KEY_POLLING_VALUE 100 + +/* Switches (keys) */ +#define HAL_KEY_SW_1 0x01 // key1 +#define HAL_KEY_SW_2 0x02 // key2 +#define HAL_KEY_SW_3 0x04 // key3 +#define HAL_KEY_SW_4 0x08 // key4 + +/* Key definition */ + +/* 1 - KEY */ +#define KEY1_PCENR (RCC_APB2Periph_GPIOB) +#define KEY2_PCENR () +#define KEY3_PCENR () +#define KEY4_PCENR () + +#define KEY1_GPIO (GPIOB) +#define KEY2_GPIO () +#define KEY3_GPIO () +#define KEY4_GPIO () + +#define KEY1_BV BV(13) +#define KEY2_BV () +#define KEY3_BV () +#define KEY4_BV () + +#define KEY1_IN (GPIO_ReadInputDataBit(KEY1_GPIO, KEY1_BV)==0) +#define KEY2_IN () +#define KEY3_IN () +#define KEY4_IN () + +#define HAL_PUSH_BUTTON1() (KEY1_IN) //Add custom button +#define HAL_PUSH_BUTTON2() (0) +#define HAL_PUSH_BUTTON3() (0) +#define HAL_PUSH_BUTTON4() (0) + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t)(uint8_t keys); + +typedef struct +{ + uint8_t keys; // keys +} keyChange_t; + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +/********************************************************************* + * FUNCTIONS + */ + +/** + * @brief Initialize the Key Service + */ +void HAL_KeyInit(void); + +/** + * @brief This is for internal used by hal_driver + */ +void HAL_KeyPoll(void); + +/** + * @brief Configure the Key serivce + * + * @param cback - pointer to the CallBack function + */ +void HalKeyConfig(const halKeyCBack_t cback); + +/** + * @brief Read the Key callback + */ +void HalKeyCallback(uint8_t keys); + +/** + * @brief Read the Key status + */ +uint8_t HalKeyRead(void); + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/LED.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/LED.h new file mode 100755 index 000000000..0b190ddcb --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/LED.h @@ -0,0 +1,133 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : LED.h + * Author : WCH + * Version : V1.0 + * Date : 2016/04/12 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +#ifndef __LED_H +#define __LED_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ +#define HAL_LED_1 0x01 +#define HAL_LED_2 0x02 +#define HAL_LED_3 0x04 +#define HAL_LED_4 0x08 +#define HAL_LED_ALL (HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4) + +/* Modes */ +#define HAL_LED_MODE_OFF 0x00 +#define HAL_LED_MODE_ON 0x01 +#define HAL_LED_MODE_BLINK 0x02 +#define HAL_LED_MODE_FLASH 0x04 +#define HAL_LED_MODE_TOGGLE 0x08 + +/* Defaults */ +#define HAL_LED_DEFAULT_MAX_LEDS 4 +#define HAL_LED_DEFAULT_DUTY_CYCLE 5 +#define HAL_LED_DEFAULT_FLASH_COUNT 50 +#define HAL_LED_DEFAULT_FLASH_TIME 1000 + +/********************************************************************* + * TYPEDEFS + */ + +/* Connect an LED to monitor the progress of the demo program, the low-level LED is on */ + +/* 1 - LED */ +#define LED1_PCENR (RCC_APB2Periph_GPIOB) +#define LED2_PCENR +#define LED3_PCENR + +#define LED1_GPIO (GPIOB) +#define LED2_GPIO +#define LED3_GPIO + +#define LED1_BV BV(15) +#define LED2_BV +#define LED3_BV + +#define HAL_TURN_OFF_LED1() (GPIO_WriteBit(LED1_GPIO, LED1_BV, Bit_SET)) +#define HAL_TURN_OFF_LED2() +#define HAL_TURN_OFF_LED3() +#define HAL_TURN_OFF_LED4() + +#define HAL_TURN_ON_LED1() (GPIO_WriteBit(LED1_GPIO, LED1_BV, Bit_RESET)) +#define HAL_TURN_ON_LED2() +#define HAL_TURN_ON_LED3() +#define HAL_TURN_ON_LED4() + +#define HAL_STATE_LED1() 0 +#define HAL_STATE_LED2() 0 +#define HAL_STATE_LED3() 0 +#define HAL_STATE_LED4() 0 + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/** + * @brief Initialize LED Service. + */ +void HAL_LedInit(void); + +/** + * @brief update time LED Service. + */ +void HalLedUpdate(void); + +/** + * @brief Turn ON/OFF/TOGGLE given LEDs + * + * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE + * @param mode - BLINK, FLASH, TOGGLE, ON, OFF + */ +extern uint8_t HalLedSet(uint8_t led, uint8_t mode); + +/** + * @brief Blink the leds + * + * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE + * @param numBlinks - number of blinks + * @param percent - the percentage in each period where the led will be on + * @param period - length of each cycle in milliseconds + */ +extern void HalLedBlink(uint8_t leds, uint8_t cnt, uint8_t duty, uint16_t time); + +/** + * @brief Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep(void); + +/** + * @brief Retore LEDs from sleep state + */ +extern void HalLedExitSleep(void); + +/** + * @brief Return LED state + */ +extern uint8_t HalLedGetState(void); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/RTC.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/RTC.h new file mode 100755 index 000000000..6d20441a5 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/RTC.h @@ -0,0 +1,40 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : RTC.h + * Author : WCH + * Version : V1.0 + * Date : 2016/04/12 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +#ifndef __RTC_H +#define __RTC_H + +#ifdef __cplusplus +extern "C" { +#endif + + +extern volatile uint32_t RTCTigFlag; + +/** + * @brief Initialize time Service. + */ +void HAL_TimeInit(void); + +/** + * @brief Configure RTC trigger time + * + * @param time - Trigger time. + */ +extern void RTC_SetTignTime(uint32_t time); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/SLEEP.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/SLEEP.h new file mode 100755 index 000000000..2b8303071 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/SLEEP.h @@ -0,0 +1,50 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : SLEEP.h + * Author : WCH + * Version : V1.0 + * Date : 2018/11/12 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +#ifndef __SLEEP_H +#define __SLEEP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/** + * @brief Configure sleep Wake-up source - RTC wake up, trigger mode + */ +extern void HAL_SleepInit(void); + +/** + * @brief Start sleep + * + * @param time - Wake-up time (RTC absolute value) + * + * @return state. + */ +extern uint32_t BLE_LowPower(uint32_t time); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/app_drv_fifo.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/app_drv_fifo.h new file mode 100755 index 000000000..44ca68dc9 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/app_drv_fifo.h @@ -0,0 +1,133 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : app_drv_fifo.h + * Author : WCH + * Version : V1.1 + * Date : 2022/01/19 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +#ifndef __APP_DRV_FIFO_H__ +#define __APP_DRV_FIFO_H__ + +#include +#include + +#ifndef BV + #define BV(n) (1 << (n)) +#endif + +#ifndef BF + #define BF(x, b, s) (((x) & (b)) >> (s)) +#endif + +#ifndef MIN + #define MIN(n, m) (((n) < (m)) ? (n) : (m)) +#endif + +#ifndef MAX + #define MAX(n, m) (((n) < (m)) ? (m) : (n)) +#endif + +#ifndef ABS + #define ABS(n) (((n) < 0) ? -(n) : (n)) +#endif + +typedef enum +{ + APP_DRV_FIFO_RESULT_SUCCESS = 0, + APP_DRV_FIFO_RESULT_LENGTH_ERROR, + APP_DRV_FIFO_RESULT_NOT_FOUND, + APP_DRV_FIFO_RESULT_NOT_MEM, + APP_DRV_FIFO_RESULT_NULL, + +} app_drv_fifo_result_t; + +#ifndef NULL + #define NULL 0 +#endif + +/*! + * FIFO structure + */ +typedef struct Fifo_s +{ + uint16_t begin; + uint16_t end; + uint8_t *data; + uint16_t size; + uint16_t size_mask; +} app_drv_fifo_t; + +//__inline uint16_t app_drv_fifo_length(app_drv_fifo_t *fifo); + +uint16_t app_drv_fifo_length(app_drv_fifo_t *fifo); + +/*! + * Initializes the FIFO structure + * + * \param [IN] fifo Pointer to the FIFO object + * \param [IN] buffer Buffer to be used as FIFO + * \param [IN] size size of the buffer + */ +app_drv_fifo_result_t +app_drv_fifo_init(app_drv_fifo_t *fifo, uint8_t *buffer, uint16_t buffer_size); + +/*! + * Pushes data to the FIFO + * + * \param [IN] fifo Pointer to the FIFO object + * \param [IN] data data to be pushed into the FIFO + */ +void app_drv_fifo_push(app_drv_fifo_t *fifo, uint8_t data); + +/*! + * Pops data from the FIFO + * + * \param [IN] fifo Pointer to the FIFO object + * \retval data data popped from the FIFO + */ +uint8_t app_drv_fifo_pop(app_drv_fifo_t *fifo); + +/*! + * Flushes the FIFO + * + * \param [IN] fifo Pointer to the FIFO object + */ +void app_drv_fifo_flush(app_drv_fifo_t *fifo); + +/*! + * Checks if the FIFO is empty + * + * \param [IN] fifo Pointer to the FIFO object + * \retval isEmpty true: FIFO is empty, false FIFO is not empty + */ +bool app_drv_fifo_is_empty(app_drv_fifo_t *fifo); + +/*! + * Checks if the FIFO is full + * + * \param [IN] fifo Pointer to the FIFO object + * \retval isFull true: FIFO is full, false FIFO is not full + */ +bool app_drv_fifo_is_full(app_drv_fifo_t *fifo); + +app_drv_fifo_result_t +app_drv_fifo_write(app_drv_fifo_t *fifo, uint8_t *data, + uint16_t *p_write_length); + +app_drv_fifo_result_t +app_drv_fifo_write_from_same_addr(app_drv_fifo_t *fifo, uint8_t *data, + uint16_t write_length); + +app_drv_fifo_result_t +app_drv_fifo_read(app_drv_fifo_t *fifo, uint8_t *data, uint16_t *p_read_length); + +app_drv_fifo_result_t +app_drv_fifo_read_to_same_addr(app_drv_fifo_t *fifo, uint8_t *data, + uint16_t read_length); + +#endif // __APP_DRV_FIFO_H__ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/app_uart.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/app_uart.h new file mode 100755 index 000000000..0b894f1f0 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/app_uart.h @@ -0,0 +1,66 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : app_uart.h + * Author : WCH + * Version : V1.0 + * Date : 2018/12/11 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +#ifndef app_uart_H +#define app_uart_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "app_drv_fifo.h" +#include "ble_uart_service.h" + +/********************************************************************* + * CONSTANTS + */ + +extern uint8_t to_test_buffer[BLE_BUFF_MAX_LEN - 4 - 3]; + +extern app_drv_fifo_t app_uart_tx_fifo; +extern app_drv_fifo_t app_uart_rx_fifo; + +//interupt uart rx flag ,clear at main loop +extern bool uart_rx_flag; + +//for interrupt rx blcak hole ,when uart rx fifo full +extern uint8_t for_uart_rx_black_hole; + +//fifo length less that MTU-3, retry times +extern uint32_t uart_to_ble_send_evt_cnt; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * FUNCTIONS + */ + +extern void app_uart_process(void); + +extern void app_uart_init(void); + +extern void on_bleuartServiceEvt(uint16_t connection_handle, ble_uart_evt_t *p_evt); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/ble_uart_service.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/ble_uart_service.h new file mode 100755 index 000000000..76d35b110 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/ble_uart_service.h @@ -0,0 +1,70 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : simpleGATTprofile.h + * Author : WCH + * Version : V1.1 + * Date : 2022/01/19 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +#ifndef _BLE_UART_SERVICE_H +#define _BLE_UART_SERVICE_H + +#ifdef __cplusplus +extern "C" { +#endif + +//#include "att.h" +#include "stdint.h" + +#define BLE_UART_RX_BUFF_SIZE 1 + +typedef enum +{ + BLE_UART_EVT_TX_NOTI_DISABLED = 1, + BLE_UART_EVT_TX_NOTI_ENABLED, + BLE_UART_EVT_BLE_DATA_RECIEVED, +} ble_uart_evt_type_t; + +typedef struct +{ + uint8_t const *p_data; /**< A pointer to the buffer with received data. */ + uint16_t length; /**< Length of received data. */ +} ble_uart_evt_rx_data_t; + +typedef struct +{ + ble_uart_evt_type_t type; + ble_uart_evt_rx_data_t data; +} ble_uart_evt_t; + +typedef void (*ble_uart_ProfileChangeCB_t)(uint16_t connection_handle, ble_uart_evt_t *p_evt); + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * ble_uart_AddService- Initializes the raw pass GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t ble_uart_add_service(ble_uart_ProfileChangeCB_t cb); + +extern uint8_t ble_uart_notify_is_ready(uint16_t connHandle); + +extern bStatus_t ble_uart_notify(uint16_t connHandle, attHandleValueNoti_t *pNoti, uint8_t taskId); +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* _BLE_UART_SERVICE_H */ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/config.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/config.h new file mode 100755 index 000000000..34ba7bc3f --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/config.h @@ -0,0 +1,137 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : CONFIG.h + * Author : WCH + * Version : V1.2 + * Date : 2022/01/18 + * Description : Configuration description and default value, + * it is recommended to modify the current value in the + * pre-processing of the engineering configuration + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +#ifndef __CONFIG_H +#define __CONFIG_H + +#define ID_CH32V208 0x0208 + +#define CHIP_ID ID_CH32V208 + +#ifdef WCHBLE_ROM +#include "WCHBLE_ROM.H" +#else +#include "wchble.h" +#endif + +#include "ch32v20x.h" + +/********************************************************************* + MAC + BLE_MAC - ǷԶMacַ ( Ĭ:FALSE - ʹоƬMacַ )Ҫmain.c޸Macַ + + SLEEP + HAL_SLEEP - Ƿ˯߹ ( Ĭ:FALSE ) + WAKE_UP_MAX_TIME_US - ǰʱ䣬ϵͳʱȶҪʱ + ͣģʽ - 45 + ģʽ - 5 + + TEMPERATION + TEM_SAMPLE - Ƿ򿪸¶ȱ仯У׼ĹܣУ׼ʱС10ms( Ĭ:TRUE ) + + CALIBRATION + BLE_CALIBRATION_ENABLE - Ƿ򿪶ʱУ׼ĹܣУ׼ʱС10ms( Ĭ:TRUE ) + BLE_CALIBRATION_PERIOD - ʱУ׼ڣλms( Ĭ:120000 ) + + SNV + BLE_SNV - ǷSNVܣڴϢ( Ĭ:TRUE ) + BLE_SNV_ADDR - SNVϢַʹdata flash( Ĭ:0x77E00 ) + BLE_SNV_NUM - SNVϢ洢ڿɴ洢İ( Ĭ:3 ) + - SNVNumҪӦ޸Lib_Write_FlashڲflashССΪSNVBlock*SNVNum + + RTC + CLK_OSC32K - RTCʱѡɫʹⲿ32K( 0 ⲿ(32768Hz)Ĭ:1ڲ(32000Hz)2ڲ(32768Hz) ) + + MEMORY + BLE_MEMHEAP_SIZE - ЭջʹõRAMСС6K ( Ĭ:(1024*6) ) + + DATA + BLE_BUFF_MAX_LEN - ( Ĭ:27 (ATT_MTU=23)ȡֵΧ[27~251] ) + BLE_BUFF_NUM - İ( Ĭ:5 ) + BLE_TX_NUM_EVENT - ¼Էٸݰ( Ĭ:1 ) + BLE_TX_POWER - 书( Ĭ:LL_TX_POWEER_0_DBM (0dBm) ) + + MULTICONN + PERIPHERAL_MAX_CONNECTION - ͬʱٴӻɫ( Ĭ:1 ) + CENTRAL_MAX_CONNECTION - ͬʱɫ( Ĭ:3 ) + + **********************************************************************/ + +/********************************************************************* + * Ĭֵ + */ +#ifndef BLE_MAC +#define BLE_MAC FALSE +#endif +#ifndef HAL_SLEEP +#define HAL_SLEEP FALSE +#endif +#ifndef WAKE_UP_MAX_TIME_US +#define WAKE_UP_MAX_TIME_US 2400 +#endif +#ifndef HAL_KEY +#define HAL_KEY FALSE +#endif +#ifndef HAL_LED +#define HAL_LED FALSE +#endif +#ifndef TEM_SAMPLE +#define TEM_SAMPLE TRUE +#endif +#ifndef BLE_CALIBRATION_ENABLE +#define BLE_CALIBRATION_ENABLE TRUE +#endif +#ifndef BLE_CALIBRATION_PERIOD +#define BLE_CALIBRATION_PERIOD 120000 +#endif +#ifndef BLE_SNV +#define BLE_SNV TRUE +#endif +#ifndef BLE_SNV_ADDR +#define BLE_SNV_ADDR 0x08077C00 +#endif +#ifndef BLE_SNV_NUM +#define BLE_SNV_NUM 3 +#endif +#ifndef CLK_OSC32K +#define CLK_OSC32K 1 // ڴ޸ģڹԤ޸ģɫʹⲿ32K +#endif +#ifndef BLE_MEMHEAP_SIZE +#define BLE_MEMHEAP_SIZE (1024*7) +#endif +#ifndef BLE_BUFF_MAX_LEN +#define BLE_BUFF_MAX_LEN 27 +#endif +#ifndef BLE_BUFF_NUM +#define BLE_BUFF_NUM 5 +#endif +#ifndef BLE_TX_NUM_EVENT +#define BLE_TX_NUM_EVENT 1 +#endif +#ifndef BLE_TX_POWER +#define BLE_TX_POWER LL_TX_POWEER_0_DBM +#endif +#ifndef PERIPHERAL_MAX_CONNECTION +#define PERIPHERAL_MAX_CONNECTION 1 +#endif +#ifndef CENTRAL_MAX_CONNECTION +#define CENTRAL_MAX_CONNECTION 3 +#endif + +extern uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4]; +extern const uint8_t MacAddr[6]; + +#endif + diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/peripheral.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/peripheral.h new file mode 100755 index 000000000..7fd48b7fa --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/peripheral.h @@ -0,0 +1,68 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : peripheral.h + * Author : WCH + * Version : V1.0 + * Date : 2018/12/11 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +#ifndef PERIPHERAL_H +#define PERIPHERAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Peripheral Task Events +#define SBP_START_DEVICE_EVT 0x0001 + +#define SBP_READ_RSSI_EVT 0x0004 +#define SBP_PARAM_UPDATE_EVT 0x0008 +#define UART_TO_BLE_SEND_EVT 0x0010 + +/********************************************************************* + * MACROS + */ +typedef struct +{ + uint16_t connHandle; // Connection handle of current connection + uint16_t connInterval; + uint16_t connSlaveLatency; + uint16_t connTimeout; +} peripheralConnItem_t; + +extern uint8_t Peripheral_TaskID; +/********************************************************************* + * FUNCTIONS + */ + +/* + * Task Initialization for the BLE Application + */ +extern void Peripheral_Init(void); + +/* + * Task Event Processor for the BLE Application + */ +extern uint16_t Peripheral_ProcessEvent(uint8_t task_id, uint16_t events); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/wchble.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/wchble.h new file mode 100755 index 000000000..5e0c38c90 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/inc/wchble.h @@ -0,0 +1,4910 @@ +/********************************** (C) COPYRIGHT ****************************** + * File Name : wchble.h + * Author : WCH + * Version : V1.40 + * Date : 2024/01/02 + * Description : head file + * Copyright (c) 2022 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + + +/******************************************************************************/ +#ifndef __WCHBLE_H +#define __WCHBLE_H + +#ifdef __cplusplus +extern "C" +{ +#endif +#include "stdint.h" + + +#ifndef BOOL +typedef unsigned char BOOL; +#endif +#ifndef TRUE + #define TRUE 1 +#endif +#ifndef FALSE + #define FALSE 0 +#endif +#ifndef NULL + #define NULL 0 +#endif +#ifndef SUCCESS +#define SUCCESS 0x00 +#endif +#ifndef bStatus_t +typedef uint8_t bStatus_t; +#endif +#ifndef tmosTaskID +typedef uint8_t tmosTaskID; +#endif +#ifndef tmosEvents +typedef uint16_t tmosEvents; +#endif +#ifndef tmosTimer +typedef uint32_t tmosTimer; +#endif +#ifndef tmosSnvId_t +typedef uint16_t tmosSnvId_t; +#endif +#ifndef tmosSnvLen_t +typedef uint16_t tmosSnvLen_t; +#endif + +// Define function type that generate a random seed callback +typedef uint32_t (*pfnSrandCB)( void ); +// Define function type that switch to idle mode callback +typedef uint32_t (*pfnIdleCB)( uint32_t ); +// Define function type that run LSI clock calibration callback +typedef void (*pfnLSICalibrationCB)( void ); +// Define function type that get temperature callback +typedef uint16_t (*pfnTempSampleCB)( void ); +// Define function type that connect/advertise event complete callback. +typedef void (*pfnEventCB)( uint32_t timeUs ); +// Define function type that library status callback. +typedef void (*pfnLibStatusErrorCB)( uint8_t code, uint32_t status ); +// Define function type that process event +typedef tmosEvents (*pTaskEventHandlerFn)( tmosTaskID taskID, tmosEvents event ); +// Define function type that read flash +typedef uint32_t (*pfnFlashReadCB)( uint32_t addr, uint32_t num, uint32_t *pBuf ); +// Define function type that write flash +typedef uint32_t (*pfnFlashWriteCB)( uint32_t addr, uint32_t num, uint32_t *pBuf ); +// Define function type that get system clock count +typedef uint32_t (*pfnGetSysClock)( void ); + +/* BLE library config struct */ +typedef struct tag_ble_config +{ + uint32_t MEMAddr; // library memory start address + uint16_t MEMLen; // library memory size + uint32_t SNVAddr; // SNV flash start address( if NULL,bonding information will not be saved ) + uint16_t SNVBlock; // SNV flash block size ( default 256 ) + uint8_t SNVNum; // SNV flash block number ( default 1 ) + uint8_t BufNumber; // Maximum number of sent and received packages cached by the controller( default 5 ) + // Must be greater than the number of connections. + uint16_t BufMaxLen; // Maximum length (in octets) of the data portion of each HCI data packet( default 27 ) + // SC enable,must be greater than 69 + // ATT_MTU = BufMaxLen-4,Range[23,ATT_MAX_MTU_SIZE] + uint8_t TxNumEvent; // Maximum number of TX data in a connection event ( default 1 ) + uint8_t RxNumEvent; // Maximum number of RX data in a connection event ( default equal to BufNumber ) + uint8_t TxPower; // Transmit power level( default LL_TX_POWEER_0_DBM(0dBm) ) + uint8_t ConnectNumber; // Connect number,lower two bits are peripheral number,followed by central number + + uint8_t WindowWidening; // Wait rf start window(us) + uint8_t WaitWindow; // Wait event arrive window in one system clock + uint8_t MacAddr[6]; // MAC address,little-endian + uint16_t ClockFrequency; // The timing clock frequency(Hz) + uint16_t ClockAccuracy; // The timing clock accuracy(ppm) + pfnSrandCB srandCB; // Register a program that generate a random seed + pfnIdleCB idleCB; // Register a program that set idle + pfnTempSampleCB tsCB; // Register a program that read the current temperature,determine whether calibration is need + pfnLSICalibrationCB rcCB; // Register a program that LSI clock calibration + pfnLibStatusErrorCB staCB; // Register a program that library status callback + pfnFlashReadCB readFlashCB; // Register a program that read flash + pfnFlashWriteCB writeFlashCB; // Register a program that write flash +} bleConfig_t; // Library initialization call BLE_LibInit function + +/* BLE pa control config struct */ +typedef struct tag_ble_clock_config +{ + pfnGetSysClock getClockValue; + uint32_t ClockMaxCount; // The maximum count value + uint16_t ClockFrequency; // The timing clock frequency(Hz) + uint16_t ClockAccuracy; // The timing clock accuracy(ppm) + uint8_t irqEnable; // resv +}bleClockConfig_t; + +/* BLE pa control config struct */ +typedef struct tag_ble_pa_control_config +{ + uint32_t txEnableGPIO; // tx enable gpio register + uint32_t txDisableGPIO; // tx disable gpio register + uint32_t tx_pin; // tx pin define + uint32_t rxEnableGPIO; // rx enable gpio register + uint32_t rxDisableGPIO; // rx disable gpio register + uint32_t rx_pin; // tx pin define +} blePaControlConfig_t; + +// defined for all task +#define SYS_EVENT_MSG (0x8000) // A message is waiting event +#define INVALID_TASK_ID 0xFF // Task ID isn't setup properly +#define TASK_NO_TASK 0xFF + +typedef struct +{ + uint8_t event; + uint8_t status; +} tmos_event_hdr_t; + +/********************************************************************* + * GLOBAL MACROS + */ +#define VER_FILE "CH32V20x_BLE_LIB_V1.4" +extern const uint8_t VER_LIB[]; // LIB version +#define SYSTEM_TIME_MICROSEN 625 // unit of process event timer is 625us +#define MS1_TO_SYSTEM_TIME(x) ((x)*1000/SYSTEM_TIME_MICROSEN) // transform unit in ms to unit in 625us ( attentional bias ) +#define TMOS_TIME_VALID (30*1000*1000) // the maximum task time = RTC MAX clock - TMOS_TIME_VALID + +/* takes a byte out of a uint32_t : var - uint32_t, ByteNum - byte to take out (0 - 3) */ +#define BREAK_UINT32( var, ByteNum ) (uint8_t)((uint32_t)(((var) >>((ByteNum) * 8)) & 0x00FF)) +#define HI_UINT16(a) (((a) >> 8) & 0xFF) +#define LO_UINT16(a) ((a) & 0xFF) +#define HI_UINT8(a) (((a) >> 4) & 0x0F) +#define LO_UINT8(a) ((a) & 0x0F) +#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) \ + ((uint32_t)(((uint32_t)(Byte0) & 0x00FF) \ + + (((uint32_t)(Byte1) & 0x00FF) << 8) \ + + (((uint32_t)(Byte2) & 0x00FF) << 16) \ + + (((uint32_t)(Byte3) & 0x00FF) << 24))) +#define BUILD_UINT16(loByte, hiByte) ((uint16_t)(((loByte) & 0x00FF)|(((hiByte) & 0x00FF)<<8))) + +#define ACTIVE_LOW ! +#define ACTIVE_HIGH !! // double negation forces result to be '1' + +#ifndef BV +#define BV(n) (1 << (n)) +#endif + +#ifndef BF +#define BF(x,b,s) (((x) & (b)) >> (s)) +#endif + +#ifndef MIN +#define MIN(n,m) (((n) < (m)) ? (n) : (m)) +#endif + +#ifndef MAX +#define MAX(n,m) (((n) < (m)) ? (m) : (n)) +#endif + +#ifndef ABS +#define ABS(n) (((n) < 0) ? -(n) : (n)) +#endif + +/* Tx_POWER define(Accuracy:卤2dBm) */ +#define LL_TX_POWEER_MINUS_18_DBM 0x01 +#define LL_TX_POWEER_MINUS_10_DBM 0x03 +#define LL_TX_POWEER_MINUS_5_DBM 0x05 +#define LL_TX_POWEER_MINUS_3_DBM 0x07 +#define LL_TX_POWEER_0_DBM 0x09 +#define LL_TX_POWEER_1_DBM 0x0B +#define LL_TX_POWEER_2_DBM 0x0D +#define LL_TX_POWEER_3_DBM 0x11 +#define LL_TX_POWEER_4_DBM 0x15 +#define LL_TX_POWEER_5_DBM 0x1B +#define LL_TX_POWEER_6_DBM 0x25 +#define LL_TX_POWEER_7_DBM 0x3F + +/* ERR_LIB_INIT define */ +#define ERR_LLE_IRQ_HANDLE 0x01 +#define ERR_MEM_ALLOCATE_SIZE 0x02 +#define ERR_SET_MAC_ADDR 0x03 +#define ERR_GAP_ROLE_CONFIG 0x04 +#define ERR_CONNECT_NUMBER_CONFIG 0x05 +#define ERR_SNV_ADDR_CONFIG 0x06 +#define ERR_CLOCK_SELECT_CONFIG 0x07 + +//! Default Public and Random Address Length +#define B_ADDR_LEN 6 +//! Random Number Size +#define B_RANDOM_NUM_SIZE 8 +//! Default key length +#define KEYLEN 16 +#define PUBLIC_KEY_LEN 64 + +//! Maximum Advertising Packet Length +#define B_MAX_ADV_LEN 31 // maximum legacy advertising packet length +#define B_MAX_ADV_EXT_LEN 460 // maximum extended advertising packet length +#define B_MAX_ADV_PERIODIC_LEN 460 // maximum periodic advertising packet length + +#define FAILURE 0x01 //!< Failure +#define INVALIDPARAMETER 0x02 //!< Invalid request field +#define INVALID_TASK 0x03 //!< Task ID isn't setup properly +#define MSG_BUFFER_NOT_AVAIL 0x04 //!< No buffer is available. +#define INVALID_MSG_POINTER 0x05 //!< No message pointer. +#define INVALID_EVENT_ID 0x06 //!< Invalid event id. +#define INVALID_TIMEOUT 0x07 //!< Invalid timeout. +#define NO_TIMER_AVAIL 0x08 //!< No event is available. +#define NV_OPER_FAILED 0x0A //!< read a data item to NV failed. +#define INVALID_MEM_SIZE 0x0B //!< The tokens take up too much space and don't fit into Advertisement data and Scan Response Data + +/** BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + */ +#define bleInvalidTaskID INVALID_TASK //!< Task ID isn't setup properly +#define bleEecKeyRequestRejected 0x06 //!< key missing +#define bleNotReady 0x10 //!< Not ready to perform task +#define bleAlreadyInRequestedMode 0x11 //!< Already performing that task +#define bleIncorrectMode 0x12 //!< Not setup properly to perform that task +#define bleMemAllocError 0x13 //!< Memory allocation error occurred +#define bleNotConnected 0x14 //!< Can't perform function when not in a connection +#define bleNoResources 0x15 //!< There are no resource available +#define blePending 0x16 //!< Waiting +#define bleTimeout 0x17 //!< Timed out performing function +#define bleInvalidRange 0x18 //!< A parameter is out of range +#define bleLinkEncrypted 0x19 //!< The link is already encrypted +#define bleProcedureComplete 0x1A //!< The Procedure is completed +#define bleInvalidMtuSize 0x1B //!< SDU size is larger than peer MTU. + +/********************************LinkDB****************************************/ +// Special case connection handles +#define INVALID_CONNHANDLE 0xFFFF // Invalid connection handle, used for no connection handle +#define LOOPBACK_CONNHANDLE 0xFFFE // Loopback connection handle, used to loopback a message +// Link state flags +#define LINK_NOT_CONNECTED 0x00 // Link isn't connected +#define LINK_CONNECTED 0x01 // Link is connected +#define LINK_AUTHENTICATED 0x02 // Link is authenticated +#define LINK_BOUND 0x04 // Link is bonded +#define LINK_ENCRYPTED 0x10 // Link is encrypted +// Link Database Status callback changeTypes +#define LINKDB_STATUS_UPDATE_NEW 0 // New connection created +#define LINKDB_STATUS_UPDATE_REMOVED 1 // Connection was removed +#define LINKDB_STATUS_UPDATE_STATEFLAGS 2 // Connection state flag changed +/*******************************gattUUID***************************************/ +/** + * GATT Services + */ +#define GAP_SERVICE_UUID 0x1800 // Generic Access Profile +#define GATT_SERVICE_UUID 0x1801 // Generic Attribute Profile + +/** + * GATT Declarations + */ +#define GATT_PRIMARY_SERVICE_UUID 0x2800 // Primary Service +#define GATT_SECONDARY_SERVICE_UUID 0x2801 // Secondary Service +#define GATT_INCLUDE_UUID 0x2802 // Include +#define GATT_CHARACTER_UUID 0x2803 // Characteristic + +/** + * GATT Descriptors + */ +#define GATT_CHAR_EXT_PROPS_UUID 0x2900 // Characteristic Extended Properties +#define GATT_CHAR_USER_DESC_UUID 0x2901 // Characteristic User Description +#define GATT_CLIENT_CHAR_CFG_UUID 0x2902 // Client Characteristic Configuration +#define GATT_SERV_CHAR_CFG_UUID 0x2903 // Server Characteristic Configuration +#define GATT_CHAR_FORMAT_UUID 0x2904 // Characteristic Presentation Format +#define GATT_CHAR_AGG_FORMAT_UUID 0x2905 // Characteristic Aggregate Format +#define GATT_VALID_RANGE_UUID 0x2906 // Valid Range +#define GATT_EXT_REPORT_REF_UUID 0x2907 // External Report Reference Descriptor +#define GATT_REPORT_REF_UUID 0x2908 // Report Reference Descriptor + +/** + * GATT Characteristics + */ +#define DEVICE_NAME_UUID 0x2A00 // Device Name +#define APPEARANCE_UUID 0x2A01 // Appearance +#define PERI_PRIVACY_FLAG_UUID 0x2A02 // Peripheral Privacy Flag +#define RECONNECT_ADDR_UUID 0x2A03 // Reconnection Address +#define PERI_CONN_PARAM_UUID 0x2A04 // Peripheral Preferred Connection Parameters +#define SERVICE_CHANGED_UUID 0x2A05 // Service Changed +#define CENTRAL_ADDRESS_RESOLUTION_UUID 0x2AA6 // Central Address Resolution +#define RL_PRIVATE_ADDR_ONLY_UUID 0x2AC9 // Resolvable Private Address Only +#define ENC_DATA_KEY_MATERIAL_UUID 0x2B88 // Encrypted Data Key Material +#define LE_GATT_SEC_LEVELS_UUID 0x2BF5 // LE GATT Security Levels + +/** + * GATT Service UUIDs + */ +#define IMMEDIATE_ALERT_SERV_UUID 0x1802 // Immediate Alert +#define LINK_LOSS_SERV_UUID 0x1803 // Link Loss +#define TX_PWR_LEVEL_SERV_UUID 0x1804 // Tx Power +#define CURRENT_TIME_SERV_UUID 0x1805 // Current Time Service +#define REF_TIME_UPDATE_SERV_UUID 0x1806 // Reference Time Update Service +#define NEXT_DST_CHANGE_SERV_UUID 0x1807 // Next DST Change Service +#define GLUCOSE_SERV_UUID 0x1808 // Glucose +#define THERMOMETER_SERV_UUID 0x1809 // Health Thermometer +#define DEVINFO_SERV_UUID 0x180A // Device Information +#define NWA_SERV_UUID 0x180B // Network Availability +#define HEARTRATE_SERV_UUID 0x180D // Heart Rate +#define PHONE_ALERT_STS_SERV_UUID 0x180E // Phone Alert Status Service +#define BATT_SERV_UUID 0x180F // Battery Service +#define BLOODPRESSURE_SERV_UUID 0x1810 // Blood Pressure +#define ALERT_NOTIF_SERV_UUID 0x1811 // Alert Notification Service +#define HID_SERV_UUID 0x1812 // Human Interface Device +#define SCAN_PARAM_SERV_UUID 0x1813 // Scan Parameters +#define RSC_SERV_UUID 0x1814 // Running Speed and Cadence +#define CSC_SERV_UUID 0x1816 // Cycling Speed and Cadence +#define CYCPWR_SERV_UUID 0x1818 // Cycling Power +#define LOC_NAV_SERV_UUID 0x1819 // Location and Navigation + +/** + * GATT Characteristic UUIDs + */ +#define ALERT_LEVEL_UUID 0x2A06 // Alert Level +#define TX_PWR_LEVEL_UUID 0x2A07 // Tx Power Level +#define DATE_TIME_UUID 0x2A08 // Date Time +#define DAY_OF_WEEK_UUID 0x2A09 // Day of Week +#define DAY_DATE_TIME_UUID 0x2A0A // Day Date Time +#define EXACT_TIME_256_UUID 0x2A0C // Exact Time 256 +#define DST_OFFSET_UUID 0x2A0D // DST Offset +#define TIME_ZONE_UUID 0x2A0E // Time Zone +#define LOCAL_TIME_INFO_UUID 0x2A0F // Local Time Information +#define TIME_WITH_DST_UUID 0x2A11 // Time with DST +#define TIME_ACCURACY_UUID 0x2A12 // Time Accuracy +#define TIME_SOURCE_UUID 0x2A13 // Time Source +#define REF_TIME_INFO_UUID 0x2A14 // Reference Time Information +#define TIME_UPDATE_CTRL_PT_UUID 0x2A16 // Time Update Control Point +#define TIME_UPDATE_STATE_UUID 0x2A17 // Time Update State +#define GLUCOSE_MEAS_UUID 0x2A18 // Glucose Measurement +#define BATT_LEVEL_UUID 0x2A19 // Battery Level +#define TEMP_MEAS_UUID 0x2A1C // Temperature Measurement +#define TEMP_TYPE_UUID 0x2A1D // Temperature Type +#define IMEDIATE_TEMP_UUID 0x2A1E // Intermediate Temperature +#define MEAS_INTERVAL_UUID 0x2A21 // Measurement Interval +#define BOOT_KEY_INPUT_UUID 0x2A22 // Boot Keyboard Input Report +#define SYSTEM_ID_UUID 0x2A23 // System ID +#define MODEL_NUMBER_UUID 0x2A24 // Model Number String +#define SERIAL_NUMBER_UUID 0x2A25 // Serial Number String +#define FIRMWARE_REV_UUID 0x2A26 // Firmware Revision String +#define HARDWARE_REV_UUID 0x2A27 // Hardware Revision String +#define SOFTWARE_REV_UUID 0x2A28 // Software Revision String +#define MANUFACTURER_NAME_UUID 0x2A29 // Manufacturer Name String +#define IEEE_11073_CERT_DATA_UUID 0x2A2A // IEEE 11073-20601 Regulatory Certification Data List +#define CURRENT_TIME_UUID 0x2A2B // Current Time +#define SCAN_REFRESH_UUID 0x2A31 // Scan Refresh +#define BOOT_KEY_OUTPUT_UUID 0x2A32 // Boot Keyboard Output Report +#define BOOT_MOUSE_INPUT_UUID 0x2A33 // Boot Mouse Input Report +#define GLUCOSE_CONTEXT_UUID 0x2A34 // Glucose Measurement Context +#define BLOODPRESSURE_MEAS_UUID 0x2A35 // Blood Pressure Measurement +#define IMEDIATE_CUFF_PRESSURE_UUID 0x2A36 // Intermediate Cuff Pressure +#define HEARTRATE_MEAS_UUID 0x2A37 // Heart Rate Measurement +#define BODY_SENSOR_LOC_UUID 0x2A38 // Body Sensor Location +#define HEARTRATE_CTRL_PT_UUID 0x2A39 // Heart Rate Control Point +#define NETWORK_AVAIL_UUID 0x2A3E // Network Availability +#define ALERT_STATUS_UUID 0x2A3F // Alert Status +#define RINGER_CTRL_PT_UUID 0x2A40 // Ringer Control Point +#define RINGER_SETTING_UUID 0x2A41 // Ringer Setting +#define ALERT_CAT_ID_BMASK_UUID 0x2A42 // Alert Category ID Bit Mask +#define ALERT_CAT_ID_UUID 0x2A43 // Alert Category ID +#define ALERT_NOTIF_CTRL_PT_UUID 0x2A44 // Alert Notification Control Point +#define UNREAD_ALERT_STATUS_UUID 0x2A45 // Unread Alert Status +#define NEW_ALERT_UUID 0x2A46 // New Alert +#define SUP_NEW_ALERT_CAT_UUID 0x2A47 // Supported New Alert Category +#define SUP_UNREAD_ALERT_CAT_UUID 0x2A48 // Supported Unread Alert Category +#define BLOODPRESSURE_FEATURE_UUID 0x2A49 // Blood Pressure Feature +#define HID_INFORMATION_UUID 0x2A4A // HID Information +#define REPORT_MAP_UUID 0x2A4B // Report Map +#define HID_CTRL_PT_UUID 0x2A4C // HID Control Point +#define REPORT_UUID 0x2A4D // Report +#define PROTOCOL_MODE_UUID 0x2A4E // Protocol Mode +#define SCAN_INTERVAL_WINDOW_UUID 0x2A4F // Scan Interval Window +#define PNP_ID_UUID 0x2A50 // PnP ID +#define GLUCOSE_FEATURE_UUID 0x2A51 // Glucose Feature +#define RECORD_CTRL_PT_UUID 0x2A52 // Record Access Control Point +#define RSC_MEAS_UUID 0x2A53 // RSC Measurement +#define RSC_FEATURE_UUID 0x2A54 // RSC Feature +#define SC_CTRL_PT_UUID 0x2A55 // SC Control Point +#define CSC_MEAS_UUID 0x2A5B // CSC Measurement +#define CSC_FEATURE_UUID 0x2A5C // CSC Feature +#define SENSOR_LOC_UUID 0x2A5D // Sensor Location +#define CYCPWR_MEAS_UUID 0x2A63 // Cycling Power Measurement +#define CYCPWR_VECTOR_UUID 0x2A64 // Cycling Power Vector +#define CYCPWR_FEATURE_UUID 0x2A65 // Cycling Power Feature +#define CYCPWR_CTRL_PT_UUID 0x2A66 // Cycling Power Control Point +#define LOC_SPEED_UUID 0x2A67 // Location and Speed +#define NAV_UUID 0x2A68 // Navigation +#define POS_QUALITY_UUID 0x2A69 // Position Quality +#define LN_FEATURE_UUID 0x2A6A // LN Feature +#define LN_CTRL_PT_UUID 0x2A6B // LN Control Point +#define ELE_UUID 0x2A6C // Elevation +#define PRESSURE_UUID 0x2A6D // Pressure +#define TEMP_UUID 0x2A6E // Temperature +#define HUMI_UUID 0x2A6F // Humidity +#define TRUE_WIND_SPEED_UUID 0x2A70 // True Wind Speed +#define TRUE_WIND_DIRECTION_UUID 0x2A71 // True Wind Direction +#define URI_UUID 0x2AB6 // URI +#define MEDIA_STATE_UUID 0x2BA3 // Media State +#define MEDIA_CTRL_PT_UUID 0x2BA4 // Media Control Point +#define MEDIA_CTRL_PT_OS_UUID 0x2BA5 // Media Control Point Opcodes Supported +#define CALL_STATE_UUID 0x2BBD // Call State +#define CALL_CTRL_PT_UUID 0x2BBE // Call Control Point +#define CALL_CTRL_PT_OO_UUID 0x2BBF // Call Control Point Optional Opcodes +#define TERM_REASON_UUID 0x2BC0 // Termination Reason +#define INCOMING_CALL_UUID 0x2BC1 // Incoming Call +#define MUTE_UUID 0x2BC3 // Mute +#define ESL_ADDR_UUID 0x2BF6 // ESL Address +#define AP_SYNC_KEY_MATERIAL_UUID 0x2BF7 // AP Sync Key Material +#define ESL_RSP_KEY_MATERIAL_UUID 0x2BF8 // ESL Response Key Material +#define ESL_CURR_ABS_TIME_UUID 0x2BF9 // ESL Current Absolute Time +#define ESL_DISPLAY_INFO_UUID 0x2BFA // ESL Display Information +#define ESL_IMAGE_INFO_UUID 0x2BFB // ESL Image Information +#define ESL_SENSOR_INFO_UUID 0x2BFC // ESL Sensor Information +#define ESL_LED_INFO_UUID 0x2BFD // ESL LED Information +#define ESL_CTL_POINT_UUID 0x2BFE // ESL Control Point + +/** + * GATT Unit UUIDs + */ +#define GATT_UNITLESS_UUID 0x2700 // unitless +#define GATT_UNIT_LENGTH_METER_UUID 0x2701 // m, m +#define GATT_UNIT_MASS_KGRAM_UUID 0x2702 // kg, kg +#define GATT_UNIT_TIME_SECOND_UUID 0x2703 // s, s +#define GATT_UNIT_ELECTRIC_CURRENT_A_UUID 0x2704 // A, A +#define GATT_UNIT_THERMODYN_TEMP_K_UUID 0x2705 // K, K +#define GATT_UNIT_AMOUNT_SUBSTANCE_M_UUID 0x2706 // mol, mol +#define GATT_UNIT_LUMINOUS_INTENSITY_C_UUID 0x2707 // cd, cd + +#define GATT_UNIT_AREA_SQ_MTR_UUID 0x2710 // m^2, m^2 +#define GATT_UNIT_VOLUME_CUBIC_MTR_UUID 0x2711 // m^3, m^3 +#define GATT_UNIT_VELOCITY_MPS_UUID 0x2712 // m/s, m s^-1 +#define GATT_UNIT_ACCELERATION_MPS_SQ_UUID 0x2713 // m/s^2, m s^-2 +#define GATT_UNIT_WAVENUMBER_RM_UUID 0x2714 // ? m^-1 +#define GATT_UNIT_DENSITY_KGPCM_UUID 0x2715 // p, kg m^-3 +#define GATT_UNIT_SURFACE_DENSITY_KGPSM_UUID 0x2716 // pA, kg m^-2 +#define GATT_UNIT_SPECIFIC_VOLUME_CMPKG_UUID 0x2717 // v, m^3 kg^-1 +#define GATT_UNIT_CURRENT_DENSITY_APSM_UUID 0x2718 // j, A m^-2 +#define GATT_UNIT_MAG_FIELD_STRENGTH_UUID 0x2719 // H, A m +#define GATT_UNIT_AMOUNT_CONC_MPCM_UUID 0x271A // c, mol m^-3 +#define GATT_UNIT_MASS_CONC_KGPCM_UUID 0x271B // c, kg m^-3 +#define GATT_UNIT_LUMINANCE_CPSM_UUID 0x271C // Lv, cd m^-2 +#define GATT_UNIT_REFRACTIVE_INDEX_UUID 0x271D // n, 1 +#define GATT_UNIT_RELATIVE_PERMEABLILTY_UUID 0x271E // u, 1 +#define GATT_UNIT_PLANE_ANGLE_RAD_UUID 0x2720 // rad, m m-1 +#define GATT_UNIT_SOLID_ANGLE_STERAD_UUID 0x2721 // sr, m2 m-2 +#define GATT_UNIT_FREQUENCY_HTZ_UUID 0x2722 // Hz, s-1 +#define GATT_UNIT_FORCE_NEWTON_UUID 0x2723 // N, m kg s-2 +#define GATT_UNIT_PRESSURE_PASCAL_UUID 0x2724 // Pa, N/m2 = m2 kg s-2 +#define GATT_UNIT_ENERGY_JOULE_UUID 0x2725 // J, N m = m2 kg s-2 +#define GATT_UNIT_POWER_WATT_UUID 0x2726 // W, J/s = m2 kg s-3 +#define GATT_UNIT_E_CHARGE_C_UUID 0x2727 // C, sA +#define GATT_UNIT_E_POTENTIAL_DIF_V_UUID 0x2728 // V, W/A = m2 kg s-3 A-1 + +#define GATT_UNIT_CELSIUS_TEMP_DC_UUID 0x272F // oC, t/oC = T/K - 273.15 + +#define GATT_UNIT_TIME_MINUTE_UUID 0x2760 // min, 60 s +#define GATT_UNIT_TIME_HOUR_UUID 0x2761 // h, 3600 s +#define GATT_UNIT_TIME_DAY_UUID 0x2762 // d, 86400 s +#define GATT_UNIT_PLANE_ANGLE_DEGREE_UUID 0x2763 // o, (pi/180) rad +#define GATT_UNIT_PLANE_ANGLE_MINUTE_UUID 0x2764 // ', (pi/10800) rad +#define GATT_UNIT_PLANE_ANGLE_SECOND_UUID 0x2765 // '', (pi/648000) rad +#define GATT_UNIT_AREA_HECTARE_UUID 0x2766 // ha, 10^4 m^2 +#define GATT_UNIT_VOLUME_LITRE_UUID 0x2767 // l, 10^-3 m^3 +#define GATT_UNIT_MASS_TONNE_UUID 0x2768 // t, 10^3 kg + +#define GATT_UINT_LENGTH_YARD_UUID 0x27A0 // yd, 0.9144 m +#define GATT_UNIT_LENGTH_PARSEC_UUID 0x27A1 // pc, 3.085678 ?1016 m +#define GATT_UNIT_LENGTH_INCH_UUID 0x27A2 // in, 0.0254 m +#define GATT_UNIT_LENGTH_FOOT_UUID 0x27A3 // ft, 0.3048 m +#define GATT_UNIT_LENGTH_MILE_UUID 0x27A4 // mi, 1609.347 m +#define GATT_UNIT_PRESSURE_PFPSI_UUID 0x27A5 // psi, 6.894757 ?103 Pa +#define GATT_UNIT_VELOCITY_KMPH_UUID 0x27A6 // km/h, 0.2777778 m^s-1 +#define GATT_UNIT_VELOCITY_MPH_UUID 0x27A7 // mi/h, 0.44704 m^ s-1 +#define GATT_UNIT_ANGULAR_VELOCITY_RPM_UUID 0x27A8 // r/min, 0.1047198 rad s-1 +#define GATT_UNIT_ENERGY_GCAL_UUID 0x27A9 // energy (gram calorie) +#define GATT_UNIT_ENERGY_KCAL_UUID 0x27AA // kcal, 4190.02 J +#define GATT_UNIT_ENERGY_KWH_UUID 0x27AB // kWh, 3600000 J +#define GATT_UNIT_THERMODYN_TEMP_DF_UUID 0x27AC // oF, t/oF = T/K ?1.8 - 459.67 +#define GATT_UNIT_PERCENTAGE_UUID 0x27AD // percentage,% +#define GATT_UNIT_PER_MILE_UUID 0x27AE // per mille +#define GATT_UNIT_PERIOD_BPM_UUID 0x27AF // period (beats per minute),BPM +#define GATT_UNIT_E_CHARGE_AH_UUID 0x27B0 // electric charge (ampere hours) +#define GATT_UNIT_MASS_DENSITY_MGPD_UUID 0x27B1 // mass density (milligram per decilitre) +#define GATT_UNIT_MASS_DENSITY_MMPL_UUID 0x27B2 // mass density (millimole per litre) +#define GATT_UNIT_TIME_YEAR_UUID 0x27B3 // time (year) +#define GATT_UNIT_TIME_MONTH_UUID 0x27B4 // time (month) + +/*********************************Messages IDs*********************************/ +// GATT - Messages IDs +#define GATT_MSG_EVENT 0xB0 //!< Incoming GATT message +#define GATT_SERV_MSG_EVENT 0xB1 //!< Incoming GATT ServApp message +// GAP - Messages IDs +#define GAP_MSG_EVENT 0xD0 //!< Incoming GAP message +/************************************ATT***************************************/ +#define ATT_MTU_SIZE 23 //!< Minimum ATT MTU size +#define ATT_MAX_MTU_SIZE 512 //!< Maximum ATT MTU size +// ATT Methods +#define ATT_ERROR_RSP 0x01 //!< ATT Error Response +#define ATT_EXCHANGE_MTU_REQ 0x02 //!< ATT Exchange MTU Request +#define ATT_EXCHANGE_MTU_RSP 0x03 //!< ATT Exchange MTU Response +#define ATT_FIND_INFO_REQ 0x04 //!< ATT Find Information Request +#define ATT_FIND_INFO_RSP 0x05 //!< ATT Find Information Response +#define ATT_FIND_BY_TYPE_VALUE_REQ 0x06 //!< ATT Find By Type Value Request +#define ATT_FIND_BY_TYPE_VALUE_RSP 0x07 //!< ATT Find By Type Value Response +#define ATT_READ_BY_TYPE_REQ 0x08 //!< ATT Read By Type Request +#define ATT_READ_BY_TYPE_RSP 0x09 //!< ATT Read By Type Response +#define ATT_READ_REQ 0x0a //!< ATT Read Request +#define ATT_READ_RSP 0x0b //!< ATT Read Response +#define ATT_READ_BLOB_REQ 0x0c //!< ATT Read Blob Request +#define ATT_READ_BLOB_RSP 0x0d //!< ATT Read Blob Response +#define ATT_READ_MULTI_REQ 0x0e //!< ATT Read Multiple Request +#define ATT_READ_MULTI_RSP 0x0f //!< ATT Read Multiple Response +#define ATT_READ_BY_GRP_TYPE_REQ 0x10 //!< ATT Read By Group Type Request +#define ATT_READ_BY_GRP_TYPE_RSP 0x11 //!< ATT Read By Group Type Response +#define ATT_WRITE_REQ 0x12 //!< ATT Write Request +#define ATT_WRITE_RSP 0x13 //!< ATT Write Response +#define ATT_PREPARE_WRITE_REQ 0x16 //!< ATT Prepare Write Request +#define ATT_PREPARE_WRITE_RSP 0x17 //!< ATT Prepare Write Response +#define ATT_EXECUTE_WRITE_REQ 0x18 //!< ATT Execute Write Request +#define ATT_EXECUTE_WRITE_RSP 0x19 //!< ATT Execute Write Response +#define ATT_HANDLE_VALUE_NOTI 0x1b //!< ATT Handle Value Notification +#define ATT_HANDLE_VALUE_IND 0x1d //!< ATT Handle Value Indication +#define ATT_HANDLE_VALUE_CFM 0x1e //!< ATT Handle Value Confirmation + +#define ATT_WRITE_CMD 0x52 //!< ATT Write Command +#define ATT_SIGNED_WRITE_CMD 0xD2 //!< ATT Signed Write Command + +// ATT Error Codes +#define ATT_ERR_INVALID_HANDLE 0x01 //!< The attribute handle given was not valid on this server +#define ATT_ERR_READ_NOT_PERMITTED 0x02 //!< The attribute cannot be read +#define ATT_ERR_WRITE_NOT_PERMITTED 0x03 //!< The attribute cannot be written +#define ATT_ERR_INVALID_PDU 0x04 //!< The attribute PDU was invalid +#define ATT_ERR_INSUFFICIENT_AUTHEN 0x05 //!< The attribute requires authentication before it can be read or written +#define ATT_ERR_UNSUPPORTED_REQ 0x06 //!< Attribute server does not support the request received from the client +#define ATT_ERR_INVALID_OFFSET 0x07 //!< Offset specified was past the end of the attribute +#define ATT_ERR_INSUFFICIENT_AUTHOR 0x08 //!< The attribute requires authorization before it can be read or written +#define ATT_ERR_PREPARE_QUEUE_FULL 0x09 //!< Too many prepare writes have been queued +#define ATT_ERR_ATTR_NOT_FOUND 0x0a //!< No attribute found within the given attribute handle range +#define ATT_ERR_ATTR_NOT_LONG 0x0b //!< The attribute cannot be read using the Read Blob Request +#define ATT_ERR_INSUFFICIENT_KEY_SIZE 0x0c //!< The Encryption Key Size used for encrypting this link is insufficient +#define ATT_ERR_INVALID_VALUE_SIZE 0x0d //!< The attribute value length is invalid for the operation +#define ATT_ERR_UNLIKELY 0x0e //!< The attribute request that was requested has encountered an error that was very unlikely, and therefore could not be completed as requested +#define ATT_ERR_INSUFFICIENT_ENCRYPT 0x0f //!< The attribute requires encryption before it can be read or written +#define ATT_ERR_UNSUPPORTED_GRP_TYPE 0x10 //!< The attribute type is not a supported grouping attribute as defined by a higher layer specification +#define ATT_ERR_INSUFFICIENT_RESOURCES 0x11 //!< Insufficient Resources to complete the request +#define ATT_ERR_INVALID_VALUE 0x80 //!< The attribute value is invalid for the operation + +/********************************************************************* + * ATT Find By Type Value Response macros + */ +// Attribute Handle and Group End Handle pair indexes +#define ATT_ATTR_HANDLE_IDX( i ) ( (i) * (2 + 2) ) +#define ATT_GRP_END_HANDLE_IDX( i ) ( ATT_ATTR_HANDLE_IDX( (i) ) + 2 ) + +#define ATT_ATTR_HANDLE( info, i ) ( BUILD_UINT16( (info)[ATT_ATTR_HANDLE_IDX((i))], \ + (info)[ATT_ATTR_HANDLE_IDX((i))+1] ) ) +#define ATT_GRP_END_HANDLE( info, i ) ( BUILD_UINT16( (info)[ATT_GRP_END_HANDLE_IDX((i))], \ + (info)[ATT_GRP_END_HANDLE_IDX((i))+1] ) ) +/** @defgroup ATT_MSG_EVENT_DEFINES ATT Message Event IDs + * @{ + */ +#define ATT_FLOW_CTRL_VIOLATED_EVENT 0x7E //!< Sent when ATT flow control is violated on a connection. This event is sent as an TMOS message defined as attFlowCtrlViolatedEvt_t. +#define ATT_MTU_UPDATED_EVENT 0x7F //!< Sent when MTU is updated for a connection. This event is sent as an TMOS message defined as attMtuUpdatedEvt_t. +/** @} End ATT_MSG_EVENT_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Size of 16-bit Bluetooth UUID +#define ATT_BT_UUID_SIZE 2 +// Size of 128-bit UUID +#define ATT_UUID_SIZE 16 + +/******************************** GATT ***********************************/ + +// GATT Attribute Access Permissions Bit Fields +#define GATT_PERMIT_READ 0x01 //!< Attribute is Readable +#define GATT_PERMIT_WRITE 0x02 //!< Attribute is Writable +#define GATT_PERMIT_AUTHEN_READ 0x04 //!< Read requires Authentication +#define GATT_PERMIT_AUTHEN_WRITE 0x08 //!< Write requires Authentication +#define GATT_PERMIT_AUTHOR_READ 0x10 //!< Read requires Authorization +#define GATT_PERMIT_AUTHOR_WRITE 0x20 //!< Write requires Authorization +#define GATT_PERMIT_ENCRYPT_READ 0x40 //!< Read requires Encryption +#define GATT_PERMIT_ENCRYPT_WRITE 0x80 //!< Write requires Encryption + +// GATT Characteristic Properties Bit Fields +#define GATT_PROP_BCAST 0x01 //!< Permits broadcasts of the Characteristic Value +#define GATT_PROP_READ 0x02 //!< Permits reads of the Characteristic Value +#define GATT_PROP_WRITE_NO_RSP 0x04 //!< Permits writes of the Characteristic Value without response +#define GATT_PROP_WRITE 0x08 //!< Permits writes of the Characteristic Value with response +#define GATT_PROP_NOTIFY 0x10 //!< Permits notifications of a Characteristic Value without acknowledgement +#define GATT_PROP_INDICATE 0x20 //!< Permits indications of a Characteristic Value with acknowledgement +#define GATT_PROP_AUTHEN 0x40 //!< Permits signed writes to the Characteristic Value +#define GATT_PROP_EXTENDED 0x80 //!< Additional characteristic properties are defined in the Characteristic Extended Properties Descriptor + +// GATT local read or write operation +#define GATT_LOCAL_READ 0xFF +#define GATT_LOCAL_WRITE 0xFE + +// GATT Encryption Key Size Limits +#define GATT_MIN_ENCRYPT_KEY_SIZE 7 //!< GATT Minimum Encryption Key Size +#define GATT_MAX_ENCRYPT_KEY_SIZE 16 //!< GATT Maximum Encryption Key Size + +// Attribute handle definitions +#define GATT_INVALID_HANDLE 0x0000 // Invalid attribute handle +#define GATT_MIN_HANDLE 0x0001 // Minimum attribute handle +#define GATT_MAX_HANDLE 0xFFFF // Maximum attribute handle + +#define GATT_MAX_MTU 0xFFFF // Maximum MTU size + +// Attribute Access Permissions +#define gattPermitRead( a ) ( (a) & GATT_PERMIT_READ ) +#define gattPermitWrite( a ) ( (a) & GATT_PERMIT_WRITE ) +#define gattPermitAuthenRead( a ) ( (a) & GATT_PERMIT_AUTHEN_READ ) +#define gattPermitAuthenWrite( a ) ( (a) & GATT_PERMIT_AUTHEN_WRITE ) +#define gattPermitAuthorRead( a ) ( (a) & GATT_PERMIT_AUTHOR_READ ) +#define gattPermitAuthorWrite( a ) ( (a) & GATT_PERMIT_AUTHOR_WRITE ) +#define gattPermitEncryptRead( a ) ( (a) & GATT_PERMIT_ENCRYPT_READ ) +#define gattPermitEncryptWrite( a ) ( (a) & GATT_PERMIT_ENCRYPT_WRITE ) + +// Check for different UUID types +#define gattPrimaryServiceType( t ) ( ATT_CompareUUID( primaryServiceUUID, ATT_BT_UUID_SIZE, (t).uuid, (t).len ) ) +#define gattSecondaryServiceType( t ) ( ATT_CompareUUID( secondaryServiceUUID, ATT_BT_UUID_SIZE, (t).uuid, (t).len ) ) +#define gattCharacterType( t ) ( ATT_CompareUUID( characterUUID, ATT_BT_UUID_SIZE, (t).uuid, (t).len ) ) +#define gattIncludeType( t ) ( ATT_CompareUUID( includeUUID, ATT_BT_UUID_SIZE, (t).uuid, (t).len ) ) +#define gattServiceType( t ) ( gattPrimaryServiceType( (t) ) || gattSecondaryServiceType( (t) ) ) +#define GATT_MAX_NUM_CONN (4) + +// GATT Client Characteristic Configuration Bit Fields +#define GATT_CLIENT_CFG_NOTIFY 0x0001 //!< The Characteristic Value shall be notified +#define GATT_CLIENT_CFG_INDICATE 0x0002 //!< The Characteristic Value shall be indicated + +#define GATT_CFG_NO_OPERATION 0x0000 // No operation + +// All profile services bit fields +#define GATT_SERVICE_DEVICE_NAME (1<<0) //!< Device Name +#define GATT_SERVICE_APPEARANCE (1<<1) //!< Appearance +#define GATT_SERVICE_PRIVACY_FLAG (1<<2) //!< Peripheral Privacy Flag +#define GATT_SERVICE_RECONN_ADDR (1<<3) //!< Reconnection Address +#define GATT_SERVICE_PERI_CONN_PARAM (1<<4) //!< Peripheral Preferred Connection Parameters (PPCP) +#define GATT_SERVICE_CENTRAL_ADDR_RL (1<<5) //!< Central Address Resolution +#define GATT_SERVICE_PRIV_ADDR_ONLY (1<<6) //!< Resolvable Private Address Only +#define GATT_SERVICE_ENCY_DATA_KEY (1<<7) //!< Encrypted Data Key Material +#define GATT_SERVICE_LE_GATT_SECU (1<<8) //!< LE GATT Security Levels + +#define GATT_SERVICES_DEFS (GATT_SERVICE_DEVICE_NAME|GATT_SERVICE_APPEARANCE|GATT_SERVICE_PERI_CONN_PARAM|GATT_SERVICE_CENTRAL_ADDR_RL) +#define GATT_ALL_SERVICES GATT_SERVICES_DEFS + +// The number of attribute records in a given attribute table +#define GATT_NUM_ATTRS( attrs ) ( sizeof( attrs ) / sizeof( gattAttribute_t ) ) + +// The handle of a service is the handle of the first attribute +#define GATT_SERVICE_HANDLE( attrs ) ( (attrs)[0].handle ) + +// The handle of the first included service (i = 1) is the value of the second attribute +#define GATT_INCLUDED_HANDLE( attrs, i ) ( *((uint16_t *)((attrs)[(i)].pValue)) ) + +// Client Characteristic Configuration table (from CCC attribute value pointer) +#define GATT_CCC_TBL( pValue ) ( (gattCharCfg_t *)(*((PTR_TYPE)(&pValue)))) + +/************************************ GAP *************************************/ +#define GAP_MSG_EVENT_DEFINES //!< GAP type of command +#define GAP_DEVICE_INIT_DONE_EVENT 0x00 //!< Sent when the Device Initialization is complete. This event is sent as an tmos message defined as gapDeviceInitDoneEvent_t. +#define GAP_DEVICE_DISCOVERY_EVENT 0x01 //!< Sent when the Device Discovery Process is complete. This event is sent as an tmos message defined as gapDevDiscEvent_t. +#define GAP_ADV_DATA_UPDATE_DONE_EVENT 0x02 //!< Sent when the Advertising Data or SCAN_RSP Data has been updated. This event is sent as an tmos message defined as gapAdvDataUpdateEvent_t. +#define GAP_MAKE_DISCOVERABLE_DONE_EVENT 0x03 //!< Sent when the Make Discoverable Request is complete. This event is sent as an tmos message defined as gapMakeDiscoverableRspEvent_t. +#define GAP_END_DISCOVERABLE_DONE_EVENT 0x04 //!< Sent when the Advertising has ended. This event is sent as an tmos message defined as gapEndDiscoverableRspEvent_t. +#define GAP_LINK_ESTABLISHED_EVENT 0x05 //!< Sent when the Establish Link Request is complete. This event is sent as an tmos message defined as gapEstLinkReqEvent_t. +#define GAP_LINK_TERMINATED_EVENT 0x06 //!< Sent when a connection was terminated. This event is sent as an tmos message defined as gapTerminateLinkEvent_t. +#define GAP_LINK_PARAM_UPDATE_EVENT 0x07 //!< Sent when an Update Parameters Event is received. This event is sent as an tmos message defined as gapLinkUpdateEvent_t. +#define GAP_RANDOM_ADDR_CHANGED_EVENT 0x08 //!< Sent when a random address was changed. This event is sent as an tmos message defined as gapRandomAddrEvent_t. +#define GAP_SIGNATURE_UPDATED_EVENT 0x09 //!< Sent when the device's signature counter is updated. This event is sent as an tmos message defined as gapSignUpdateEvent_t. +#define GAP_AUTHENTICATION_COMPLETE_EVENT 0x0A //!< Sent when the Authentication (pairing) process is complete. This event is sent as an tmos message defined as gapAuthCompleteEvent_t. +#define GAP_PASSKEY_NEEDED_EVENT 0x0B //!< Sent when a Passkey is needed. This is part of the pairing process. This event is sent as an tmos message defined as gapPasskeyNeededEvent_t. +#define GAP_SLAVE_REQUESTED_SECURITY_EVENT 0x0C //!< Sent when a Slave Security Request is received. This event is sent as an tmos message defined as gapSlaveSecurityReqEvent_t. +#define GAP_DEVICE_INFO_EVENT 0x0D //!< Sent during the Device Discovery Process when a device is discovered. This event is sent as an tmos message defined as gapDeviceInfoEvent_t. +#define GAP_BOND_COMPLETE_EVENT 0x0E //!< Sent when the bonding process is complete. This event is sent as an tmos message defined as gapBondCompleteEvent_t. +#define GAP_PAIRING_REQ_EVENT 0x0F //!< Sent when an unexpected Pairing Request is received. This event is sent as an tmos message defined as gapPairingReqEvent_t. +#define GAP_DIRECT_DEVICE_INFO_EVENT 0x10 //!< Sent when a direct Advertising Data is received. This event is sent as an tmos message defined as gapDirectDeviceInfoEvent_t. +#define GAP_PHY_UPDATE_EVENT 0x11 //!< Sent when a PHY Update Event is received. This event is sent as an tmos message defined as gapLinkUpdateEvent_t. +#define GAP_EXT_ADV_DEVICE_INFO_EVENT 0x12 //!< Sent when a Extended Advertising Data is received. This event is sent as an tmos message defined as gapExtAdvDeviceInfoEvent_t. +#define GAP_MAKE_PERIODIC_ADV_DONE_EVENT 0x13 //!< Sent when the Set Periodic Advertising enable is complete. This event is sent as an tmos message defined as gapMakePeriodicRspEvent_t. +#define GAP_END_PERIODIC_ADV_DONE_EVENT 0x14 //!< Sent when the Set Periodic Advertising disable is complete. This event is sent as an tmos message defined as gapEndPeriodicRspEvent_t. +#define GAP_SYNC_ESTABLISHED_EVENT 0x15 //!< Sent when a Periodic Advertising Sync Establish is complete. This event is sent as an tmos message defined as gapSyncEstablishedEvent_t. +#define GAP_PERIODIC_ADV_DEVICE_INFO_EVENT 0x16 //!< Sent when a Periodic Advertising Data is received. This event is sent as an tmos message defined as gapPeriodicAdvDeviceInfoEvent_t. +#define GAP_SYNC_LOST_EVENT 0x17 //!< Sent when a Periodic Advertising Sync was lost. This event is sent as an tmos message defined as gapSyncLostEvent_t. +#define GAP_SCAN_REQUEST_EVENT 0x19 //!< Sent when a SCAN_REQ PDU or an AUX_SCAN_REQ PDU has been received by the advertiser. This event is sent as an tmos message defined as gapScanReqReseiveEvent_t. +#define GAP_OOB_NEEDED_EVENT 0x1A //!< resv +#define GAP_MAKE_CONNECTIONESS_CTE_DONE_EVENT 0x1B //!< Sent when the Set Connectionless CTE Transmit enable is complete. This event is sent as an tmos message defined as gapMakeConnectionlessCTERspEvent_t. +#define GAP_END_CONNECTIONESS_CTE_DONE_EVENT 0x1C //!< Sent when the Set Connectionless CTE Transmit disable is complete. This event is sent as an tmos message defined as gapEndConnectionlessCTERspEvent_t. +#define GAP_PERI_ADV_SYNC_TRAN_RECEIVED_EVENT 0x1D //!< Sent when the periodic advertising sync transfer received. This event is sent as an tmos message defined as gapPeriodicTranReceivec_t. + + +#define GAP_PERI_ADV_SUBEVENT_DATA_REQ_EVENT 0x27 //!< Sent when the Controller +#define GAP_PERI_ADV_RESPONSE_REPORT_EVENT 0x28 //!< Sent when one or more devices have responded to a periodic advertising subevent during a PAwR train. This event is sent as an tmos message defined as gapPeriodicAdvResponseEvent_t. + + +// GAP_PROFILE_ROLE_DEFINES GAP Profile Roles +#define GAP_PROFILE_BROADCASTER 0x01 //!< A device that sends advertising events only. +#define GAP_PROFILE_OBSERVER 0x02 //!< A device that receives advertising events only. +#define GAP_PROFILE_PERIPHERAL 0x04 //!< A device that accepts the establishment of an LE physical link using the connection establishment procedure +#define GAP_PROFILE_CENTRAL 0x08 //!< A device that supports the Central role initiates the establishment of a physical connection + +// GAP Status Return Values - returned as bStatus_t +#define bleGAPUserCanceled 0x30 //!< The user canceled the task +#define bleGAPConnNotAcceptable 0x31 //!< The connection was not accepted +#define bleGAPBondRejected 0x32 //!< The bond information was rejected. +#define bleGAPExpiredCanceled 0x33 //!< The duration has expired + +#define GAP_DEVICE_NAME_LEN 21 //!< Excluding null-terminate char +#define GAP_DEVICE_NAME_MAX_LEN 248 //!< maximum length of device name + +// option defined +#define LISTEN_PERIODIC_ADVERTISING_MODE (1<<0) //!< used to determine whether the Periodic Advertiser List is used +#define REPORTING_INITIALLY_DISABLED (1<<1) //!< 0: Reporting initially enabled 1: Reporting initially disabled +#define DUPLICATE_FILTERING_INITIALLY_ENABLED (1<<2) //!< 0: Duplicate filtering initially disabled 1: Duplicate filtering initially enabled + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ +#define GAP_CONNHANDLE_INIT 0xFFFE //!< terminates a link create +#define GAP_CONNHANDLE_ALL 0xFFFF //!< terminates all links for the matching task ID. +/** @} End GAP_CONN_HANDLE_DEFINES */ + +// Privacy Flag States +#define GAP_PRIVACY_DISABLED 0x00 +#define GAP_PRIVACY_ENABLED 0x01 + +// GAP GATT Server Parameters used with GGS Get/Set Parameter and Application's Callback functions +#define GGS_DEVICE_NAME_ATT 0 //!< RW uint8_t[GAP_DEVICE_NAME_LEN] +#define GGS_APPEARANCE_ATT 1 //!< RW uint16_t +#define GGS_PERI_PRIVACY_FLAG_ATT 2 //!< RW uint8_t +#define GGS_RECONNCT_ADDR_ATT 3 //!< RW uint8_t[B_ADDR_LEN] +#define GGS_PERI_CONN_PARAM_ATT 4 //!< RW sizeof(gapPeriConnectParams_t) +#define GGS_CENT_ADDR_RES_ATT 5 //!< RW uint8_t +#define GGS_RL_PRIVATE_ADDR_ONLY 6 //!< RW uint8_t +#define GGS_ENC_DATA_KEY_MATERIAL 7 //!< RW sizeof(gapEncDataKey_t) +#define GGS_LE_GATT_SEC_LEVELS 8 //!< RW uint8_t + +#define GGS_PERI_PRIVACY_FLAG_PROPS 0X42 //!< RW uint8_t + +#define GGS_W_PERMIT_DEVICE_NAME_ATT 0x80 //!< W uint8_t +#define GGS_W_PERMIT_APPEARANCE_ATT 0x81 //!< W uint8_t +#define GGS_W_PERMIT_PRIVACY_FLAG_ATT 0x82 //!< W uint8_t + +// GAP_PARAMETER_ID_DEFINES GAP Parameter IDs +// Timers +#define TGAP_GEN_DISC_ADV_MIN 0 //!< Minimum time to remain advertising, when in Discoverable mode.Default 0-turns off the timeout. (n * 0.625 mSec). +#define TGAP_LIM_ADV_TIMEOUT 1 //!< Maximum time to remain advertising, when in Limited Discoverable mode.Default 180 seconds. (n * 1 seconds) +#define TGAP_DISC_SCAN 2 //!< Minimum time to perform scanning,Setting this parameter to 0 turns off the timeout.Default 10.24seconds. (n * 0.625 mSec) + +// when in General Discovery process +#define TGAP_DISC_ADV_INT_MIN 3 //!< Minimum advertising interval.Default 160. (n * 0.625 mSec) +#define TGAP_DISC_ADV_INT_MAX 4 //!< Maximum advertising interval.Default 160. (n * 0.625 mSec) +#define TGAP_DISC_SCAN_INT 5 //!< Scan interval used during Link Layer Scanning state.Default 16. (n * 0.625 mSec) +#define TGAP_DISC_SCAN_WIND 6 //!< Scan window used during Link Layer Scanning state.Default 16. (n * 0.625 mSec) + +// when in Connection Establishment process(1M PHY) +#define TGAP_CONN_EST_INT_MIN 7 //!< Minimum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_INT_MAX 8 //!< Maximum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_SCAN_INT 9 //!< Scan interval used during Link Layer Initiating state.Default 16. (n * 0.625 mSec) +#define TGAP_CONN_EST_SCAN_WIND 10 //!< Scan window used during Link Layer Initiating state.Default 16. (n * 0.625 mSec) +#define TGAP_CONN_EST_HIGH_SCAN_INT 11 //!< Scan interval used during Link Layer Initiating state, high duty scan cycle scan parameters (n * 0.625 mSec) +#define TGAP_CONN_EST_HIGH_SCAN_WIND 12 //!< Scan window used during Link Layer Initiating state, high duty scan cycle scan parameters (n * 0.625 mSec) +#define TGAP_CONN_EST_SUPERV_TIMEOUT 13 //!< Link Layer connection supervision timeout.Default 2000. (n * 10 mSec) +#define TGAP_CONN_EST_LATENCY 14 //!< Link Layer connection slave latency.Default 0. (in number of connection events) +#define TGAP_CONN_EST_MIN_CE_LEN 15 //!< Local informational parameter about minimum length of connection needed.Default 0. (n * 0.625 mSec) +#define TGAP_CONN_EST_MAX_CE_LEN 16 //!< Local informational parameter about maximum length of connection needed.Default 0. (n * 0.625 mSec) + +// Proprietary +#define TGAP_PRIVATE_ADDR_INT 17 //!< Minimum Time Interval between private (resolvable) address changes.Default 900. (n * 1 seconds) +#define TGAP_SM_TIMEOUT 18 //!< SM Message Timeout (milliseconds). Default 30 seconds. +#define TGAP_SM_MIN_KEY_LEN 19 //!< SM Minimum Key Length supported. Default 7. +#define TGAP_SM_MAX_KEY_LEN 20 //!< SM Maximum Key Length supported. Default 16. +#define TGAP_FILTER_ADV_REPORTS 21 //!< Filter duplicate advertising reports. Default TRUE. +#define TGAP_SCAN_RSSI_MIN 22 //!< Minimum RSSI required for scan advertising to be reported to the app. Default -127. +#define TGAP_REJECT_CONN_PARAMS 23 //!< Whether or not to reject Connection Parameter Update Request received on Central device. Default FALSE. +#define TGAP_AUTH_TASK_ID 24 //!< Task ID override for Task Authentication control (for stack internal use only) + +// v5.x +#define TGAP_ADV_TX_POWER 25 //!< Indicates the maximum power level Range: -127 ≤ N ≤ +126 Units: dBm.Default 127(Host has no preference). +#define TGAP_ADV_PRIMARY_PHY 26 //!< Indicates the PHY on which the advertising packets are transmitted on the primary advertising channel.LE 1M/LE Coded.Default GAP_PHY_VAL_LE_1M. +#define TGAP_ADV_SECONDARY_PHY 27 //!< LE 1M/LE 2M/LE Coded. Default GAP_PHY_VAL_LE_1M. +#define TGAP_ADV_SECONDARY_MAX_SKIP 28 //!< Maximum advertising events the Controller can skip before sending the AUX_ADV_IND packets on the secondary advertising channel. Default 0. +#define TGAP_ADV_ADVERTISING_SID 29 //!< Value of the Advertising SID subfield in the ADI field of the PDU Range:0-15. Default 0. +#define TGAP_ADV_SCAN_REQ_NOTIFY 30 //!< Scan request notifications enabled.Default 0-disabled. +#define TGAP_ADV_ADVERTISING_DURATION 31 //!< Advertising duration Range: 0x0001 - 0xFFFF Time = N * 10ms. Default 0-No advertising duration. +#define TGAP_ADV_MAX_EVENTS 32 //!< indicates the maximum number of extended advertising events.Range: 0x00 - 0xFF. Default 0(No maximum number of advertising events). + +// when in General Discovery process +#define TGAP_DISC_SCAN_PHY 33 //!< LE 1M/LE Coded. Default GAP_PHY_BIT_LE_1M. +#define TGAP_DISC_SCAN_CODED_INT 34 //!< Scan interval used during Link Layer coded Scanning state, when in General Discovery process (n * 0.625 mSec) +#define TGAP_DISC_SCAN_CODED_WIND 35 //!< Scan window used during Link Layer coded Scanning state, when in General Discovery process (n * 0.625 mSec) +#define TGAP_DISC_SCAN_DURATION 36 //!< Scan duration Range: 0x0001 - 0xFFFF Time = N * 10 ms. Default 0-Scan continuously until explicitly disable. +#define TGAP_DISC_SCAN_PERIOD 37 //!< resv. + +// when in Connection Establishment process(2M PHY) +#define TGAP_CONN_EST_INT_PHY 38 //!< LE 1M/LE Coded. Default GAP_PHY_BIT_LE_1M. +#define TGAP_CONN_EST_2M_INT_MIN 39 //!< Minimum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_2M_INT_MAX 40 //!< Maximum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_2M_SUPERV_TIMEOUT 41 //!< Link Layer connection supervision timeout.Default 2000. (n * 10 mSec) +#define TGAP_CONN_EST_2M_LATENCY 42 //!< Link Layer connection slave latency.Default 0. (in number of connection events) +#define TGAP_CONN_EST_2M_MIN_CE_LEN 43 //!< Local informational parameter about minimum length of connection needed.Default 0. (n * 0.625 mSec) +#define TGAP_CONN_EST_2M_MAX_CE_LEN 44 //!< Local informational parameter about maximum length of connection needed.Default 0. (n * 0.625 mSec) + +// when in Connection Establishment process(Coded PHY) +#define TGAP_CONN_EST_CODED_INT_MIN 45 //!< Minimum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_CODED_INT_MAX 46 //!< Maximum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_CODED_SCAN_INT 47 //!< Scan interval used during Link Layer Initiating state.Default 16. (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_SCAN_WIND 48 //!< Scan window used during Link Layer Initiating state.Default 16. (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_HIGH_SCAN_INT 49 //!< Scan interval used during Link Layer Initiating state, high duty scan cycle scan parameters (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_HIGH_SCAN_WIND 50 //!< Scan window used during Link Layer Initiating state, high duty scan cycle scan parameters (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_SUPERV_TIMEOUT 51 //!< Link Layer connection supervision timeout.Default 2000. (n * 10 mSec) +#define TGAP_CONN_EST_CODED_LATENCY 52 //!< Link Layer connection slave latency.Default 0. (in number of connection events) +#define TGAP_CONN_EST_CODED_MIN_CE_LEN 53 //!< Local informational parameter about minimum length of connection needed.Default 0. (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_MAX_CE_LEN 54 //!< Local informational parameter about maximum length of connection needed.Default 0. (n * 0.625 mSec) + +// periodic advertising +#define TGAP_PERIODIC_ADV_INT_MIN 55 //!< Minimum periodic advertising interval.Range: 0x0006 to 0xFFFF.Default 160. (n * 1.25 mSec) +#define TGAP_PERIODIC_ADV_INT_MAX 56 //!< Maximum periodic advertising interval.Range: 0x0006 to 0xFFFF.Default 160. (n * 1.25 mSec) +#define TGAP_PERIODIC_ADV_PROPERTIES 57 //!< Include TxPower in the periodic advertising PDU. + +#define TGAP_SCAN_MAX_LENGTH 58 //!< Extended scan maximum data length.Default 460 +#define TGAP_AFH_CHANNEL_MDOE 59 //!< whether t he Controller's channel assessment scheme is enabled or disabled.Default disabled. + +// Constant Tone Extension Transmit +#define TGAP_CTE_TYPE 60 //!< The type of Constant Tone Extension.Default GAP_CTE_TYPE_AOA. +#define TGAP_CTE_LENGTH 61 //!< The type of Constant Tone Extension.Default 20.Range[2,20] +#define TGAP_CTE_COUNT 62 //!< resv +#define TGAP_LENGTH_OF_SWITCHING_PATTERN 63 //!< The number of Antenna IDs in the pattern,only used when transmitting an AoD Constant Tone Extension.Default 0. + +// Advertising Coding Selection +#define TGAP_ADV_PRIMARY_PHY_OPTIONS 64 //!< Indicate the Host's preference or requirement concerning coding scheme.Default GAP_PHY_OPTIONS_NOPRE. +#define TGAP_ADV_SECONDARY_PHY_OPTIONS 65 //!< indicate the Host's preference or requirement concerning coding scheme (including for periodic advertising).Default GAP_PHY_OPTIONS_NOPRE. + +#define TGAP_ADV_RSP_RSSI_MIN 66 //!< The minimum RSSI for advertising to send scanning response. Default -127. + +#define TGAP_PARAMID_MAX 67 //!< ID MAX-valid Parameter ID + +// GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes +#define DEVDISC_MODE_NONDISCOVERABLE 0x00 //!< No discoverable setting +#define DEVDISC_MODE_GENERAL 0x01 //!< General Discoverable devices +#define DEVDISC_MODE_LIMITED 0x02 //!< Limited Discoverable devices +#define DEVDISC_MODE_ALL 0x03 //!< Not filtered + +// GAP_ADDR_TYPE_DEFINES GAP Address Types +#define ADDRTYPE_PUBLIC 0x00 //!< Use the BD_ADDR +#define ADDRTYPE_STATIC 0x01 //!< Static address +#define ADDRTYPE_PRIVATE_NONRESOLVE 0x02 //!< Generate Non-Resolvable Private Address +#define ADDRTYPE_PRIVATE_RESOLVE 0x03 //!< Generate Resolvable Private Address + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertising Event Types +#define GAP_ADTYPE_ADV_IND 0x00 //!< Connectable undirected event typet +#define GAP_ADTYPE_ADV_HDC_DIRECT_IND 0x01 //!< Connectable high duty cycle directed event type +#define GAP_ADTYPE_ADV_SCAN_IND 0x02 //!< Scannable undirected event type +#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected event type +#define GAP_ADTYPE_ADV_LDC_DIRECT_IND 0x04 //!< Connectable low duty cycle directed event type +//v5.x +#define GAP_ADTYPE_EXT_CONN_DIRECT 0x05 //!< extend Connectable directed event type +#define GAP_ADTYPE_EXT_SCAN_UNDIRECT 0x06 //!< extend Scannable undirected event type +#define GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT 0x07 //!< extend Non-Connectable and Non-Scannable undirected event type +#define GAP_ADTYPE_EXT_CONN_UNDIRECT 0x08 //!< extend Connectable undirected event type +#define GAP_ADTYPE_EXT_SCAN_DIRECT 0x09 //!< extend Scannable directed event type +#define GAP_ADTYPE_EXT_NONCONN_NONSCAN_DIRECT 0x0A //!< extend Non-Connectable and Non-Scannable directed event type + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertising PHY VAL TYPE(GAP_PHY_VAL_TYPE) +#define GAP_PHY_VAL_TYPE +#define GAP_PHY_VAL_LE_1M 0x01 +#define GAP_PHY_VAL_LE_2M 0x02 +#define GAP_PHY_VAL_LE_CODED 0x03 + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Scan PHY VAL TYPE(GAP_PHY_BIT_TYPE) +#define GAP_PHY_BIT_TYPE +#define GAP_PHY_BIT_LE_1M (1<<0) +#define GAP_PHY_BIT_LE_2M (1<<1) +#define GAP_PHY_BIT_LE_CODED (1<<2) +#define GAP_PHY_BIT_ALL (GAP_PHY_BIT_LE_1M|GAP_PHY_BIT_LE_2M|GAP_PHY_BIT_LE_CODED) +#define GAP_PHY_BIT_LE_CODED_S2 (1<<3) + +// PHY_OPTIONS preferred coding when transmitting on the LE Coded PHY +#define GAP_PHY_OPTIONS_TYPE +#define GAP_PHY_OPTIONS_NOPRE 0x00 //!< 0:no preferred +#define GAP_PHY_OPTIONS_S2 0x01 //!< prefers that S=2 coding be used when transmitting on the LE Coded PHY +#define GAP_PHY_OPTIONS_S8 0x02 //!< prefers that S=8 coding be used when transmitting on the LE Coded PHY +#define GAP_PHY_OPTIONS_S2_REQUIRES 0x03 //!< requires that S=2 coding be used when transmitting on the LE Coded PHY +#define GAP_PHY_OPTIONS_S8_REQUIRES 0x04 //!< requires that S=8 coding be used when transmitting on the LE Coded PHY + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Periodic Advertising Properties +#define GAP_PERI_PROPERTIES_INCLUDE_TXPOWER (1<<6) + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Connectionless CTE Transmit CTE type +#define GAP_CTE_TYPE_AOA 0x00 //!< AoA Constant Tone Extension +#define GAP_CTE_TYPE_AOD_1US 0x01 //!< AoD Constant Tone Extension with 1us slots +#define GAP_CTE_TYPE_AOD_2US 0x02 //!< AoD Constant Tone Extension with 2us slots + +// GAP Advertising Report Event Types +#define GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES +// bit0 to 4 ADVERTISEMENT_TYPE:defined for gapExtAdvDeviceInfoEvent_t Advertisement data type +#define GAP_ADRPT_ADV_IND 0x00 //!< Connectable undirected advertisement +#define GAP_ADRPT_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement +#define GAP_ADRPT_ADV_SCAN_IND 0x02 //!< Scannable undirected advertisement +#define GAP_ADRPT_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected advertisement +#define GAP_ADRPT_SCAN_RSP 0x04 //!< Scan Response +#define GAP_ADRPT_EXT_CONN_DIRECT 0x05 //!< extend Connectable directed report type +#define GAP_ADRPT_EXT_SCAN_UNDIRECT 0x06 //!< extend Scannable undirected report type +#define GAP_ADRPT_EXT_NONCONN_NONSCAN_UNDIRECT 0x07 //!< extend Non-Connectable and Non-Scannable undirected report type +#define GAP_ADRPT_EXT_CONN_UNDIRECT 0x08 //!< extend Connectable undirected report type +#define GAP_ADRPT_EXT_SCAN_DIRECT 0x09 //!< extend Scannable directed report type +#define GAP_ADRPT_EXT_NONCONN_NONSCAN_DIRECT 0x0A //!< extend Non-Connectable and Non-Scannable directed report type +#define GAP_ADRPT_EXT_SCAN_RESPONSE 0x0B //!< extend Scan Response report type +// bit5 to 6 Data status:defined for gapExtAdvDeviceInfoEvent_t Advertisement data type +#define GAP_ADRPT_EXT_DATA_MASK (3<<5) +#define GAP_ADRPT_EXT_DATA_COMPLETE (0<<5) //!< Complete +#define GAP_ADRPT_EXT_DATA_INCOMPLETE (1<<5) //!< more data to come +#define GAP_ADRPT_EXT_DATA_LAST (2<<5) //!< Incomplete, data truncated, no more to come + +// GAP_EXTEND_ADVERTISEMENT_REPORT_TYPE_DEFINES GAP Extend Advertising Report Event Types +#define GAP_ADRPT_ADV_CONNECTABLE (1<<0) +#define GAP_ADRPT_ADV_SCANNABLE (1<<1) +#define GAP_ADRPT_ADV_DITECTED (1<<2) +#define GAP_ADRPT_SCAN_RESPONSE (1<<3) + +// GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters +#define GAP_FILTER_POLICY_ALL 0x00 //!< Allow Scan Request from Any, Allow Connect Request from Any (default). +#define GAP_FILTER_POLICY_WHITE_SCAN 0x01 //!< Allow Scan Request from White List Only, Allow Connect from Any +#define GAP_FILTER_POLICY_WHITE_CON 0x02 //!< Allow Scan Request from Any, Connect from White List Only +#define GAP_FILTER_POLICY_WHITE 0x03 //!< Allow Scan Request and Connect from White List Only + +// Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. +#define GAP_PASSCODE_MAX 999999 + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ +#define GAP_INIT_SIGN_COUNTER 0xFFFFFFFF + +// GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map +#define GAP_ADVCHAN_37 0x01 //!< Advertisement Channel 37 +#define GAP_ADVCHAN_38 0x02 //!< Advertisement Channel 38 +#define GAP_ADVCHAN_39 0x04 //!< Advertisement Channel 39 +#define GAP_ADVCHAN_ALL (GAP_ADVCHAN_37 | GAP_ADVCHAN_38 | GAP_ADVCHAN_39) //!< All Advertisement Channels Enabled + +// GAP_ADTYPE_DEFINES GAP Advertisement Data Types +#define GAP_ADTYPE_FLAGS 0x01 //!< Discovery Mode: @ref GAP_ADTYPE_FLAGS_MODES +#define GAP_ADTYPE_16BIT_MORE 0x02 //!< Service: More 16-bit UUIDs available +#define GAP_ADTYPE_16BIT_COMPLETE 0x03 //!< Service: Complete list of 16-bit UUIDs +#define GAP_ADTYPE_32BIT_MORE 0x04 //!< Service: More 32-bit UUIDs available +#define GAP_ADTYPE_32BIT_COMPLETE 0x05 //!< Service: Complete list of 32-bit UUIDs +#define GAP_ADTYPE_128BIT_MORE 0x06 //!< Service: More 128-bit UUIDs available +#define GAP_ADTYPE_128BIT_COMPLETE 0x07 //!< Service: Complete list of 128-bit UUIDs +#define GAP_ADTYPE_LOCAL_NAME_SHORT 0x08 //!< Shortened local name +#define GAP_ADTYPE_LOCAL_NAME_COMPLETE 0x09 //!< Complete local name +#define GAP_ADTYPE_POWER_LEVEL 0x0A //!< TX Power Level: -127 to +127 dBm +#define GAP_ADTYPE_OOB_CLASS_OF_DEVICE 0x0D //!< Simple Pairing OOB Tag: Class of device (3 octets) +#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_HASHC 0x0E //!< Simple Pairing OOB Tag: Simple Pairing Hash C (16 octets) +#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_RANDR 0x0F //!< Simple Pairing OOB Tag: Simple Pairing Randomizer R (16 octets) +#define GAP_ADTYPE_SM_TK 0x10 //!< Security Manager TK Value +#define GAP_ADTYPE_SM_OOB_FLAG 0x11 //!< Security Manager OOB Flags +#define GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE 0x12 //!< Min and Max values of the connection interval (2 octets Min, 2 octets Max) (0xFFFF indicates no conn interval min or max) +#define GAP_ADTYPE_SIGNED_DATA 0x13 //!< Signed Data field +#define GAP_ADTYPE_SERVICES_LIST_16BIT 0x14 //!< Service Solicitation: list of 16-bit Service UUIDs +#define GAP_ADTYPE_SERVICES_LIST_128BIT 0x15 //!< Service Solicitation: list of 128-bit Service UUIDs +#define GAP_ADTYPE_SERVICE_DATA 0x16 //!< Service Data - 16-bit UUID +#define GAP_ADTYPE_PUBLIC_TARGET_ADDR 0x17 //!< Public Target Address +#define GAP_ADTYPE_RANDOM_TARGET_ADDR 0x18 //!< Random Target Address +#define GAP_ADTYPE_APPEARANCE 0x19 //!< Appearance +#define GAP_ADTYPE_ADV_INTERVAL 0x1A //!< Advertising Interval +#define GAP_ADTYPE_LE_BD_ADDR 0x1B //!< LE Bluetooth Device Address +#define GAP_ADTYPE_LE_ROLE 0x1C //!< LE Role +#define GAP_ADTYPE_SIMPLE_PAIRING_HASHC_256 0x1D //!< Simple Pairing Hash C-256 +#define GAP_ADTYPE_SIMPLE_PAIRING_RANDR_256 0x1E //!< Simple Pairing Randomizer R-256 +#define GAP_ADTYPE_SERVICE_DATA_32BIT 0x20 //!< Service Data - 32-bit UUID +#define GAP_ADTYPE_SERVICE_DATA_128BIT 0x21 //!< Service Data - 128-bit UUID +#define GAP_ADTYPE_LE_SC_CONFIRMATION_VALUE 0x22 //!< LE Secure Connections Confirmation Value +#define GAP_ADTYPE_LE_SC_RANDOM_VALUE 0x23 //!< LE Secure Connections Random Value +#define GAP_ADTYPE_URI 0x24 //!< URI +#define GAP_ADTYPE_INDOOR_POSITION 0x25 //!< Indoor Positioning Service v1.0 or later +#define GAP_ADTYPE_TRAN_DISCOVERY_DATA 0x26 //!< Transport Discovery Service v1.0 or later +#define GAP_ADTYPE_SUPPORTED_FEATURES 0x27 //!< LE Supported Features +#define GAP_ADTYPE_CHANNEL_MAP_UPDATE 0x28 //!< Channel Map Update Indication +#define GAP_ADTYPE_PB_ADV 0x29 //!< PB-ADV. Mesh Profile Specification Section 5.2.1 +#define GAP_ADTYPE_MESH_MESSAGE 0x2A //!< Mesh Message. Mesh Profile Specification Section 3.3.1 +#define GAP_ADTYPE_MESH_BEACON 0x2B //!< Mesh Beacon. Mesh Profile Specification Section 3.9 +#define GAP_ADTYPE_BIG_INFO 0x2C //!< BIGInfo +#define GAP_ADTYPE_BROADCAST_CODE 0x2D //!< Broadcast_Code +#define GAP_ADTYPE_RSL_SET_IDENT 0x2E //!< Resolvable Set Identifier.Coordinated Set Identification Profile 1.0 +#define GAP_ADTYPE_ADV_INTERVAL_LONG 0x2F //!< Advertising Interval - long +#define GAP_ADTYPE_BROADCAST_NAME 0x30 //!< Public Broadcast Profile v1.0 or later +#define GAP_ADTYPE_ENCRYPTED_ADV_DATA 0x31 //!< Core Specification Supplement, Part A, Section 1.23 +#define GAP_ADTYPE_PERI_ADV_RSP_TIMING_INFO 0x32 //!< Periodic Advertising Response Timing Information +#define GAP_ADTYPE_ELECTRONIC_SHELF_LABEL 0x34 //!< ESL Profile +#define GAP_ADTYPE_3D_INFO_DATA 0x3D //!< 3D Information Data +#define GAP_ADTYPE_MANUFACTURER_SPECIFIC 0xFF //!< Manufacturer Specific Data: first 2 octets contain the Company Identifier Code followed by the additional manufacturer specific data + +// GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes +#define GAP_ADTYPE_FLAGS_LIMITED 0x01 //!< Discovery Mode: LE Limited Discoverable Mode +#define GAP_ADTYPE_FLAGS_GENERAL 0x02 //!< Discovery Mode: LE General Discoverable Mode +#define GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED 0x04 //!< Discovery Mode: BR/EDR Not Supported + +// GAP_APPEARANCE_VALUES GAP Appearance Values +#define GAP_APPEARE_UNKNOWN 0x0000 //!< Unknown +#define GAP_APPEARE_GENERIC_PHONE 0x0040 //!< Generic Phone +#define GAP_APPEARE_GENERIC_COMPUTER 0x0080 //!< Generic Computer +#define GAP_APPEARE_GENERIC_WATCH 0x00C0 //!< Generic Watch +#define GAP_APPEARE_WATCH_SPORTS 0x00C1 //!< Watch: Sports Watch +#define GAP_APPEARE_GENERIC_CLOCK 0x0100 //!< Generic Clock +#define GAP_APPEARE_GENERIC_DISPLAY 0x0140 //!< Generic Display +#define GAP_APPEARE_GENERIC_RC 0x0180 //!< Generic Remote Control +#define GAP_APPEARE_GENERIC_EYE_GALSSES 0x01C0 //!< Generic Eye-glasses +#define GAP_APPEARE_GENERIC_TAG 0x0200 //!< Generic Tag +#define GAP_APPEARE_GENERIC_KEYRING 0x0240 //!< Generic Keyring +#define GAP_APPEARE_GENERIC_MEDIA_PLAYER 0x0280 //!< Generic Media Player +#define GAP_APPEARE_GENERIC_BARCODE_SCANNER 0x02C0 //!< Generic Barcode Scanner +#define GAP_APPEARE_GENERIC_THERMOMETER 0x0300 //!< Generic Thermometer +#define GAP_APPEARE_GENERIC_THERMO_EAR 0x0301 //!< Thermometer: Ear +#define GAP_APPEARE_GENERIC_HR_SENSOR 0x0340 //!< Generic Heart rate Sensor +#define GAP_APPEARE_GENERIC_HRS_BELT 0x0341 //!< Heart Rate Sensor: Heart Rate Belt +#define GAP_APPEARE_GENERIC_BLOOD_PRESSURE 0x0380 //!< Generic Blood Pressure +#define GAP_APPEARE_GENERIC_BP_ARM 0x0381 //!< Blood Pressure: Arm +#define GAP_APPEARE_GENERIC_BP_WRIST 0x0382 //!< Blood Pressure: Wrist +#define GAP_APPEARE_GENERIC_HID 0x03C0 //!< Generic Human Interface Device (HID) +#define GAP_APPEARE_HID_KEYBOARD 0x03C1 //!< HID Keyboard +#define GAP_APPEARE_HID_MOUSE 0x03C2 //!< HID Mouse +#define GAP_APPEARE_HID_JOYSTIC 0x03C3 //!< HID Joystick +#define GAP_APPEARE_HID_GAMEPAD 0x03C4 //!< HID Gamepad +#define GAP_APPEARE_HID_DIGITIZER_TYABLET 0x03C5 //!< HID Digitizer Tablet +#define GAP_APPEARE_HID_DIGITAL_CARDREADER 0x03C6 //!< HID Card Reader +#define GAP_APPEARE_HID_DIGITAL_PEN 0x03C7 //!< HID Digital Pen +#define GAP_APPEARE_HID_BARCODE_SCANNER 0x03C8 //!< HID Barcode Scanner + +/************************************gapRole***********************************/ +// GAPROLE_PROFILE_PARAMETERS GAP Role Manager Parameters +#define GAPROLE_PROFILEROLE 0x300 //!< Reading this parameter will return GAP Role type. Read Only. Size is uint8_t. +#define GAPROLE_IRK 0x301 //!< Identity Resolving Key. Read/Write. Size is uint8_t[KEYLEN]. Default is all 0, which means that the IRK will be randomly generated. +#define GAPROLE_SRK 0x302 //!< Signature Resolving Key. Read/Write. Size is uint8_t[KEYLEN]. Default is all 0, which means that the SRK will be randomly generated. +#define GAPROLE_SIGNCOUNTER 0x303 //!< Sign Counter. Read/Write. Size is uint32_t. Default is 0. +#define GAPROLE_BD_ADDR 0x304 //!< Device's Address. Read Only. Size is uint8_t[B_ADDR_LEN]. This item is read from the controller. +#define GAPROLE_ADVERT_ENABLED 0x305 //!< Enable/Disable Advertising. Read/Write. Size is uint8_t. Default is TRUE=Enabled. +#define GAPROLE_ADVERT_DATA 0x306 //!< Advertisement Data. Read/Write. Max size is B_MAX_ADV_EXT_LEN. Default to all 0. +#define GAPROLE_SCAN_RSP_DATA 0x307 //!< Scan Response Data. Read/Write. Max size is B_MAX_ADV_EXT_LEN. Defaults to all 0. +#define GAPROLE_ADV_EVENT_TYPE 0x308 //!< Advertisement Type. Read/Write. Size is uint8_t. Default is GAP_ADTYPE_ADV_IND. +#define GAPROLE_ADV_DIRECT_TYPE 0x309 //!< Direct Advertisement Address Type. Read/Write. Size is uint8_t. Default is ADDRTYPE_PUBLIC. +#define GAPROLE_ADV_DIRECT_ADDR 0x30A //!< Direct Advertisement Address. Read/Write. Size is uint8_t[B_ADDR_LEN]. Default is NULL. +#define GAPROLE_ADV_CHANNEL_MAP 0x30B //!< Which channels to advertise on. Read/Write Size is uint8_t. Default is GAP_ADVCHAN_ALL +#define GAPROLE_ADV_FILTER_POLICY 0x30C //!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8_t. Default is GAP_FILTER_POLICY_ALL. +#define GAPROLE_STATE 0x30D //!< Reading this parameter will return GAP Peripheral Role State. Read Only. Size is uint8_t. +#define GAPROLE_MAX_SCAN_RES 0x30E //!< Maximum number of discover scan results to receive. Default is 0 = unlimited. +#define GAPROLE_MIN_CONN_INTERVAL 0x311 //!< Minimum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16_t. Default is 7.5 milliseconds (0x0006). +#define GAPROLE_MAX_CONN_INTERVAL 0x312 //!< Maximum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16_t. Default is 4 seconds (0x0C80). +// v5.x +#define GAPROLE_PHY_TX_SUPPORTED 0x313 //!< The transmitter PHYs that the Host prefers the Controller to use.Default is GAP_PHY_BIT_ALL +#define GAPROLE_PHY_RX_SUPPORTED 0x314 //!< The receiver PHYs that the Host prefers the Controller to use.Default is GAP_PHY_BIT_ALL +#define GAPROLE_PERIODIC_ADVERT_DATA 0x315 //!< Periodic advertisement Data. Read/Write. Max size is B_MAX_ADV_PERIODIC_LEN. Default to all 0. +#define GAPROLE_PERIODIC_ADVERT_ENABLED 0x316 //!< bit0:Enable/Disable Periodic Advertising. Read/Write. Size is uint8_t. Default is FALSE=Disable. + //!< bit1:Include the ADI field in AUX_SYNC_IND PDUs +#define GAPROLE_CTE_CONNECTIONLESS_ENABLED 0x317 //!< Enable/Disable Connectionless CTE Transmit. Read/Write. Size is uint8_t. Default is FALSE=Disable. + +/************************************GAPBOND***********************************/ +// GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters +#define GAPBOND_PERI_PAIRING_MODE 0x400 //!< Pairing Mode: @ref GAPBOND_PAIRING_MODE_DEFINES. Read/Write. Size is uint8_t. Default is GAPBOND_PAIRING_MODE_WAIT_FOR_REQ. +#define GAPBOND_PERI_MITM_PROTECTION 0x401 //!< Man-In-The-Middle (MITM) basically turns on Passkey protection in the pairing algorithm. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_PERI_IO_CAPABILITIES 0x402 //!< I/O capabilities. Read/Write. Size is uint8_t. Default is GAPBOND_IO_CAP_DISPLAY_ONLY @ref GAPBOND_IO_CAP_DEFINES. +#define GAPBOND_PERI_OOB_ENABLED 0x403 //!< OOB data available for pairing algorithm. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_PERI_OOB_DATA 0x404 //!< OOB Data. Read/Write. size uint8_t[16]. Default is all 0's. +#define GAPBOND_PERI_BONDING_ENABLED 0x405 //!< Request Bonding during the pairing process if enabled. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_PERI_KEY_DIST_LIST 0x406 //!< The key distribution list for bonding. size is uint8_t. @ref GAPBOND_KEY_DIST_DEFINES. Default is 0x77. +#define GAPBOND_PERI_DEFAULT_PASSCODE 0x407 //!< The default passcode for MITM protection. size is uint32_t. Range is 0 - 999,999. Default is 0. +#define GAPBOND_CENT_PAIRING_MODE 0x408 //!< Pairing Mode: @ref GAPBOND_PAIRING_MODE_DEFINES. Read/Write. Size is uint8_t. Default is GAPBOND_PAIRING_MODE_WAIT_FOR_REQ. +#define GAPBOND_CENT_MITM_PROTECTION 0x409 //!< Man-In-The-Middle (MITM) basically turns on Passkey protection in the pairing algorithm. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_CENT_IO_CAPABILITIES 0x40A //!< I/O capabilities. Read/Write. Size is uint8_t. Default is GAPBOND_IO_CAP_DISPLAY_ONLY @ref GAPBOND_IO_CAP_DEFINES. +#define GAPBOND_CENT_OOB_ENABLED 0x40B //!< OOB data available for pairing algorithm. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_CENT_OOB_DATA 0x40C //!< OOB Data. Read/Write. size uint8_t[16]. Default is all 0's. +#define GAPBOND_CENT_BONDING_ENABLED 0x40D //!< Request Bonding during the pairing process if enabled. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_CENT_KEY_DIST_LIST 0x40E //!< The key distribution list for bonding. size is uint8_t. @ref GAPBOND_KEY_DIST_DEFINES. Default is 0x77. +#define GAPBOND_CENT_DEFAULT_PASSCODE 0x40F //!< The default passcode for MITM protection. size is uint32_t. Range is 0 - 999,999. Default is 0. +#define GAPBOND_ERASE_ALLBONDS 0x410 //!< Erase all of the bonded devices. Write Only. No Size. +#define GAPBOND_AUTO_FAIL_PAIRING 0x411 //!< TEST MODE (DO NOT USE) to automatically send a Pairing Fail when a Pairing Request is received. Read/Write. size is uint8_t. Default is 0 (disabled). +#define GAPBOND_AUTO_FAIL_REASON 0x412 //!< TEST MODE (DO NOT USE) Pairing Fail reason when auto failing. Read/Write. size is uint8_t. Default is 0x05 (SMP_PAIRING_FAILED_NOT_SUPPORTED). +#define GAPBOND_KEYSIZE 0x413 //!< Key Size used in pairing. Read/Write. size is uint8_t. Default is 16. +#define GAPBOND_AUTO_SYNC_WL 0x414 //!< Clears the White List adds to it each unique address stored by bonds in NV. Read/Write. Size is uint8_t. Default is FALSE. +#define GAPBOND_BOND_COUNT 0x415 //!< Gets the total number of bonds stored in NV. Read Only. Size is uint8_t. Default is 0 (no bonds). +#define GAPBOND_BOND_FAIL_ACTION 0x416 //!< Possible actions Central may take upon an unsuccessful bonding. Write Only. Size is uint8_t. Default is 0x02 (Terminate link upon unsuccessful bonding). +#define GAPBOND_ERASE_SINGLEBOND 0x417 //!< Erase a single bonded device. Write only. Must provide address type followed by device address. +#define GAPBOND_BOND_AUTO 0x418 //!< Auto save bonds into FLASH. Write Only. size is uint8_t. Default is 1(enabled). +#define GAPBOND_BOND_UPDATE 0x419 //!< Save current bonds into FLASH. Write Only. No Size. +#define GAPBOND_DISABLE_SINGLEBOND 0x41A //!< Disable a single bonded device. Write only. Must provide address type followed by device address. +#define GAPBOND_ENABLE_SINGLEBOND 0x41B //!< Ensable a single bonded device. Write only. Must provide address type followed by device address. +#define GAPBOND_DISABLE_ALLBONDS 0x41C //!< Disable all of the bonded devices. Write Only. No Size. +#define GAPBOND_ENABLE_ALLBONDS 0x41D //!< Ensable all of the bonded devices. Write Only. No Size. +#define GAPBOND_ERASE_AUTO 0x41E //!< Auto erase all of the bonded devices when the maximum number is reached.Size is uint8_t. Default is 1(enabled). +#define GAPBOND_AUTO_SYNC_RL 0x41F //!< Clears the Resolving List adds to it each unique address stored by bonds in NV. Read/Write. Size is uint8_t. Default is FALSE. +#define GAPBOND_SET_ENC_PARAMS 0x420 //!< Set bonding parameters.size is bondEncParams_t. +#define GAPBOND_PERI_SC_PROTECTION 0x421 //!< Set peripheral sc enable. Default is FALSE. +#define GAPBOND_CENT_SC_PROTECTION 0x422 //!< Set central sc enable. Default is FALSE. + +// GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes +#define GAPBOND_PAIRING_MODE_NO_PAIRING 0x00 //!< Pairing is not allowed +#define GAPBOND_PAIRING_MODE_WAIT_FOR_REQ 0x01 //!< Wait for a pairing request or slave security request +#define GAPBOND_PAIRING_MODE_INITIATE 0x02 //!< Don't wait, initiate a pairing request or slave security request + +// GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities +#define GAPBOND_IO_CAP_DISPLAY_ONLY 0x00 //!< Display Only Device +#define GAPBOND_IO_CAP_DISPLAY_YES_NO 0x01 //!< Display and Yes and No Capable +#define GAPBOND_IO_CAP_KEYBOARD_ONLY 0x02 //!< Keyboard Only +#define GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT 0x03 //!< No Display or Input Device +#define GAPBOND_IO_CAP_KEYBOARD_DISPLAY 0x04 //!< Both Keyboard and Display Capable + +// GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution +#define GAPBOND_KEYDIST_SENCKEY 0x01 //!< Slave Encryption Key +#define GAPBOND_KEYDIST_SIDKEY 0x02 //!< Slave IRK and ID information +#define GAPBOND_KEYDIST_SSIGN 0x04 //!< Slave CSRK +#define GAPBOND_KEYDIST_SLINK 0x08 //!< Slave Link Key +#define GAPBOND_KEYDIST_MENCKEY 0x10 //!< Master Encrypton Key +#define GAPBOND_KEYDIST_MIDKEY 0x20 //!< Master IRK and ID information +#define GAPBOND_KEYDIST_MSIGN 0x40 //!< Master CSRK +#define GAPBOND_KEYDIST_MLINK 0x80 //!< Master Link Key + +// GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States +#define GAPBOND_PAIRING_STATE_STARTED 0x00 //!< Pairing started +#define GAPBOND_PAIRING_STATE_COMPLETE 0x01 //!< Pairing complete +#define GAPBOND_PAIRING_STATE_BONDED 0x02 //!< Devices bonded +#define GAPBOND_PAIRING_STATE_BOND_SAVED 0x03 //!< Bonding record saved in NV + +// SMP_PAIRING_FAILED_DEFINES Pairing failure status values +#define SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED 0x01 //!< The user input of the passkey failed, for example, the user cancelled the operation. +#define SMP_PAIRING_FAILED_OOB_NOT_AVAIL 0x02 //!< The OOB data is not available +#define SMP_PAIRING_FAILED_AUTH_REQ 0x03 //!< The pairing procedure can't be performed as authentication requirements can't be met due to IO capabilities of one or both devices +#define SMP_PAIRING_FAILED_CONFIRM_VALUE 0x04 //!< The confirm value doesn't match the calculated compare value +#define SMP_PAIRING_FAILED_NOT_SUPPORTED 0x05 //!< Pairing isn't supported by the device +#define SMP_PAIRING_FAILED_ENC_KEY_SIZE 0x06 //!< The resultant encryption key size is insufficient for the security requirements of this device. +#define SMP_PAIRING_FAILED_CMD_NOT_SUPPORTED 0x07 //!< The SMP command received is not supported on this device. +#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason +#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authentication procedure is disallowed because too little time has elapsed since the last pairing request or security request. +#define SMP_PAIRING_FAILED_INVALID_PARAMERERS 0x0A //!< The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range. +#define SMP_PAIRING_FAILED_DHKEY_CHECK_FAILED 0x0B //!< Indicates to the remote device that the DHKey Check value received doesn’t match the one calculated by the local device. +#define SMP_PAIRING_FAILED_NUMERIC_COMPARISON 0x0C //!< Indicates that the confirm values in the numeric comparison protocol do not match. +#define SMP_PAIRING_FAILED_KEY_REJECTED 0x0F //!< Indicates that the device chose not to accept a distributed key. + +// GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions +#define GAPBOND_FAIL_NO_ACTION 0x00 //!< Take no action upon unsuccessful bonding +#define GAPBOND_FAIL_INITIATE_PAIRING 0x01 //!< Initiate pairing upon unsuccessful bonding +#define GAPBOND_FAIL_TERMINATE_LINK 0x02 //!< Terminate link upon unsuccessful bonding +#define GAPBOND_FAIL_TERMINATE_ERASE_BONDS 0x03 //!< Terminate link and erase all existing bonds on device upon unsuccessful bonding + +// Device NV Items +#define BLE_NVID_IRK 0x0002 //!< The Device's IRK +#define BLE_NVID_CSRK 0x0003 //!< The Device's CSRK +#define BLE_NVID_SIGNCOUNTER 0x0004 //!< The Device's Sign Counter + +//!< RF Mode BOND NV IDs +#define BLE_NVID_BOND_RF_START 0x0100 //!< Start of the RF BOND NV IDs + +// Bonding NV Items - Range 0x0200 - 0x6FFF +#define BLE_NVID_GAP_BOND_START 0x0200 //!< Start of the GAP Bond Manager's NV IDs + +// GAP BOND Items +#define GAP_BOND_REC_ID_OFFSET 0 //!< NV ID for the main bonding record +#define GAP_BOND_LOCAL_LTK_OFFSET 1 //!< NV ID for the bonding record's local LTK information +#define GAP_BOND_DEV_LTK_OFFSET 2 //!< NV ID for the bonding records' device LTK information +#define GAP_BOND_DEV_IRK_OFFSET 3 //!< NV ID for the bonding records' device IRK +#define GAP_BOND_DEV_CSRK_OFFSET 4 //!< NV ID for the bonding records' device CSRK +#define GAP_BOND_DEV_SIGN_COUNTER_OFFSET 5 //!< NV ID for the bonding records' device Sign Counter +#define GAP_BOND_REC_IDS 6 + +// Macros to calculate the index/offset in to NV space +#define calcNvID(Idx, offset) (((((Idx) * GAP_BOND_REC_IDS) + (offset))) + BLE_NVID_GAP_BOND_START) +#define mainRecordNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_REC_ID_OFFSET)) +#define localLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_LOCAL_LTK_OFFSET)) +#define devLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_LTK_OFFSET)) +#define devIRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_IRK_OFFSET)) +#define devCSRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_CSRK_OFFSET)) +#define devSignCounterNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_SIGN_COUNTER_OFFSET)) + +// GATT Configuration NV Items -Range 0x7000 - 0x7FFF +#define BLE_NVID_GATT_CFG_START 0x7000 //!< Start of the GATT Configuration NV IDs + +// Macros to calculate the GATT index/offset in to NV space +// Six characteristic configuration can be saved in NV. +#define gattCfgNvID(Idx) ((Idx) + BLE_NVID_GATT_CFG_START) + +#define BLE_NVID_MAX_VAL 0x7FFF + +// Structure of NV data for the connected device's encryption information +typedef struct +{ + uint8_t LTK[KEYLEN]; //!< Long Term Key (LTK) + uint16_t div; //!< LTK eDiv + uint8_t rand[B_RANDOM_NUM_SIZE]; //!< LTK random number + uint8_t keySize; //!< LTK key size +} gapBondLTK_t; + +// Structure of NV data for the connected device's address information +typedef struct +{ + uint8_t publicAddr[B_ADDR_LEN]; //!< Central's address + uint8_t reconnectAddr[B_ADDR_LEN]; //!< Privacy Reconnection Address + uint16_t stateFlags; //!< State flags: SM_AUTH_STATE_AUTHENTICATED & SM_AUTH_STATE_BONDING + uint8_t bondsToDelete; + uint8_t publicAddrType; //!< Central's address type +} gapBondRec_t; + +// Structure of NV data for the connected device's characteristic configuration +typedef struct +{ + uint16_t attrHandle; //!< attribute handle + uint8_t value; //!< attribute value for this device +} gapBondCharCfg_t; + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + uint8_t srk[KEYLEN]; //!< Signature Resolving Key + uint32_t signCounter; //!< Sign Counter +} linkSec_t; + +typedef struct +{ + uint8_t ltk[KEYLEN]; //!< Long Term Key + uint16_t div; //!< Diversifier + uint8_t rand[B_RANDOM_NUM_SIZE]; //!< random number + uint8_t keySize; //!< LTK Key Size + uint8_t gapBondInvalid; +} encParams_t; + +typedef struct +{ + uint8_t connRole; //!< GAP Profile Roles @GAP_PROFILE_ROLE_DEFINES + uint8_t addrType; //!< Address type of connected device + uint8_t addr[B_ADDR_LEN]; //!< Other Device's address + encParams_t encParams; +} bondEncParams_t; + +typedef struct +{ + uint8_t taskID; //!< Application that controls the link + uint16_t connectionHandle; //!< Controller connection handle + uint8_t stateFlags; //!< LINK_CONNECTED, LINK_AUTHENTICATED... + uint8_t addrType; //!< Address type of connected device + uint8_t addr[B_ADDR_LEN]; //!< Other Device's address + uint8_t connRole; //!< Connection formed as central or peripheral + uint16_t connInterval; //!< The connection's interval (n * 1.25ms) + uint16_t connLatency; + uint16_t connTimeout; + uint16_t MTU; //!< The connection's MTU size + linkSec_t sec; //!< Connection Security related items + encParams_t *pEncParams; //!< pointer to LTK, ediv, rand. if needed. + uint16_t smEvtID; + void *pPairingParams; + void *pAuthLink; +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16_t connectionHandle, uint8_t changeType ); +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8_t len; //!< Length of UUID (2 or 16) + uint8_t uuid[ATT_UUID_SIZE]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8_t len; //!< Length of UUID (2) + uint8_t uuid[ATT_BT_UUID_SIZE]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8_t reqOpcode; //!< Request that generated this error response + uint16_t handle; //!< Attribute handle that generated error response + uint8_t errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16_t clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16_t serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint16_t numInfo; //!< Number of attribute handle-UUID pairs found + uint8_t format; //!< Format of information data + uint8_t *pInfo; //!< Information data whose format is determined by format field (4 to ATT_MTU_SIZE-2) +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Attribute value to find (0 to ATT_MTU_SIZE-7) +} attFindByTypeValueReq_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint16_t numInfo; //!< Number of handles information found + uint8_t *pHandlesInfo; //!< List of 1 or more handles information (4 to ATT_MTU_SIZE-1) +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint16_t numPairs; //!< Number of attribute handle-UUID pairs found + uint16_t len; //!< Size of each attribute handle-value pair + uint8_t *pDataList; //!< List of 1 or more attribute handle-value pairs (2 to ATT_MTU_SIZE-2) +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Value of the attribute with the handle given (0 to ATT_MTU_SIZE-1) +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute to be read (must be first field) + uint16_t offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Part of the value of the attribute with the handle given (0 to ATT_MTU_SIZE-1) +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint8_t *pHandles; //!< Set of two or more attribute handles (4 to ATT_MTU_SIZE-1) - must be first field + uint16_t numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint16_t len; //!< Length of values + uint8_t *pValues; //!< Set of two or more values (0 to ATT_MTU_SIZE-1) +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint16_t numGrps; //!< Number of attribute handle, end group handle and value sets found + uint16_t len; //!< Length of each attribute handle, end group handle and value set + uint8_t *pDataList; //!< List of 1 or more attribute handle, end group handle and value (4 to ATT_MTU_SIZE-2) +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute to be written (must be first field) + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Value of the attribute to be written (0 to ATT_MTU_SIZE-3) + uint8_t sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8_t cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute to be written (must be first field) + uint16_t offset; //!< Offset of the first octet to be written + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Part of the value of the attribute to be written (0 to ATT_MTU_SIZE-5) - must be allocated +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute that has been read + uint16_t offset; //!< Offset of the first octet to be written + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Part of the value of the attribute to be written (0 to ATT_MTU_SIZE-5) +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8_t flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute that has been changed (must be first field) + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Current value of the attribute (0 to ATT_MTU_SIZE-3) +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute that has been changed (must be first field) + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Current value of the attribute (0 to ATT_MTU_SIZE-3) +} attHandleValueInd_t; + +/** + * ATT Flow Control Violated Event message format. This message is sent to the + * app by the local ATT Server or Client when a sequential ATT Request-Response + * or Indication-Confirmation protocol flow control is violated for a connection. + * All subsequent ATT Requests and Indications received by the local ATT Server + * and Client respectively will be dropped. + * + * This message is to inform the app (that has registered with GAP by calling + * GAP_RegisterForMsgs()) in case it wants to drop the connection. + */ +typedef struct +{ + uint8_t opcode; //!< opcode of message that caused flow control violation + uint8_t pendingOpcode; //!< opcode of pending message +} attFlowCtrlViolatedEvt_t; + +/** + * ATT MTU Updated Event message format. This message is sent to the app + * by the local ATT Server or Client when the ATT MTU size is updated for a + * connection. The default ATT MTU size is 23 octets. + * + * This message is to inform the app (that has registered with GAP by calling + * GAP_RegisterForMsgs()) about the new ATT MTU size negotiated for a connection. + */ +typedef struct +{ + uint16_t MTU; //!< new MTU size +} attMtuUpdatedEvt_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages and + * locally-generated events used between the attribute protocol and upper + * layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Value Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Value Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication + + // Locally-generated event messages + attFlowCtrlViolatedEvt_t flowCtrlEvt; //!< ATT Flow Control Violated Event + attMtuUpdatedEvt_t mtuEvt; //!< ATT MTU Updated Event +} attMsg_t; + +/** + * GATT Find By Type Value Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number + attAttrType_t value; //!< Primary service UUID value (2 or 16 octets) +} gattFindByTypeValueReq_t; + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8_t discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8_t reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + attPrepareWriteReq_t req; //!< ATT Prepare Write Request + uint16_t lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8_t reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Array of Prepare Write Requests (must be allocated) + uint8_t numReqs; //!< Number of Prepare Write Requests + uint8_t index; //!< Index of last Prepare Write Request sent + uint8_t flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * and locally-generated events used between the attribute protocol/profile and + * upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Value Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattFindByTypeValueReq_t gattFindByTypeValueReq;//!< GATT Find By Type Value Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Value Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication + + // Locally-generated event messages + attFlowCtrlViolatedEvt_t flowCtrlEvt; //!< ATT Flow Control Violated Event + attMtuUpdatedEvt_t mtuEvt; //!< ATT MTU Updated Event +} gattMsg_t; + +/** + * GATT tmos GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16_t connHandle; //!< Connection message was received on + uint8_t method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8_t len; //!< Length of UUID (2 or 16) + const uint8_t *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8_t permissions; //!< Attribute permissions + uint16_t handle; //!< Attribute handle - assigned internally by attribute server + uint8_t *pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16_t numAttrs; //!< Number of attributes in attrs + uint8_t encKeySize; //!< Minimum encryption key size required by service (7-16 bytes) + + /** Array of attribute records. + * note: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/** + * @brief Callback function prototype to read an attribute value. + * + * @note blePending can be returned ONLY for the following + * read operations: + * - Read Request: ATT_READ_REQ + * - Read Blob Request: ATT_READ_BLOB_REQ + * + * @note If blePending is returned then it's the responsibility of the application to respond to + * ATT_READ_REQ and ATT_READ_BLOB_REQ message with ATT_READ_RSP and ATT_READ_BLOB_RSP + * message respectively. + * + * @note Payload 'pValue' used with ATT_READ_RSP and ATT_READ_BLOB_RSP must be allocated using GATT_bm_alloc(). + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * @param method - type of read message + * + * @return SUCCESS: Read was successfully.
+ * blePending: A response is pending for this client.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef uint8_t (*pfnGATTReadAttrCB_t)( uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, + uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method ); + +/** + * @brief Callback function prototype to write an attribute value. + * + * @note blePending can be returned ONLY for the following + * write operations: + * - Write Request: ATT_WRITE_REQ + * - Write Command: ATT_WRITE_CMD + * - Write Long: ATT_EXECUTE_WRITE_REQ + * - Reliable Writes: Multiple ATT_PREPARE_WRITE_REQ followed by one final ATT_EXECUTE_WRITE_REQ + * + * @note If blePending is returned then it's the responsibility of the application to 1) respond to + * ATT_WRITE_REQ and ATT_EXECUTE_WRITE_REQ message with ATT_WRITE_RSP and ATT_EXECUTE_WRITE_RSP + * message respectively, and 2) free each request payload 'pValue' using BM_free(). + * + * @note Write Command (ATT_WRITE_CMD) does NOT require a response message. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * @param method - type of write message + * + * @return SUCCESS: Write was successfully.
+ * blePending: A response is pending for this client.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef uint8_t (*pfnGATTWriteAttrCB_t)( uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, + uint16_t len, uint16_t offset, uint8_t method ); + +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t opcode ); + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16_t connHandle; //!< Client connection handle + uint8_t value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/*************************************gap**************************************/ +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the central. + */ +typedef struct +{ + uint16_t intervalMin; //!< Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25ms) + uint16_t intervalMax; //!< Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25ms) + uint16_t latency; //!< Number of LL latency connection events (0x0000 - 0x03e8) + uint16_t timeout; //!< Connection Timeout (0x000A - 0x0C80 * 10ms) +} gapPeriConnectParams_t; + +typedef struct +{ + uint8_t sessionKey[16]; //!< The shared session key. + uint8_t IV[8]; //!< The initialization vector. +} gapEncDataKey_t; + +/** + * GAP event header format. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8_t devAddr[B_ADDR_LEN]; //!< Device's BD_ADDR + uint16_t dataPktLen; //!< HC_LE_Data_Packet_Length + uint8_t numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8_t addrType; //!< Device's address type for devAddr + uint8_t devAddr[B_ADDR_LEN]; //!< Device's BD_ADDR, could be own address + uint32_t signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_DEVICE_INFO_EVENT + uint8_t eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP + int8_t rssi; //!< Advertisement or SCAN_RSP RSSI + uint8_t dataLen; //!< Length (in bytes) of the data field (evtData) + uint8_t *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/** + * GAP_DIRECT_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_DIRECT_DEVICE_INFO_EVENT + uint8_t eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP + uint8_t directAddrType; //!< public or random address type + uint8_t directAddr[B_ADDR_LEN]; //!< device address + int8_t rssi; //!< Advertisement or SCAN_RSP RSSI +} gapDirectDeviceInfoEvent_t; + +/** + * GAP_EXT_ADV_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_EXT_ADV_DEVICE_INFO_EVENT + uint8_t eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP + uint8_t primaryPHY; //!< Advertiser PHY on the primary advertising channel + uint8_t secondaryPHY; //!< Advertiser PHY on the secondary advertising channel + uint8_t advertisingSID; //!< Value of the Advertising SID subfield in the ADI field of the PDU + int8_t txPower; //!< Advertisement or SCAN_RSP power + int8_t rssi; //!< Advertisement or SCAN_RSP RSSI + uint16_t periodicAdvInterval; //!< the interval of periodic advertising + uint8_t directAddressType; //!< public or random address type + uint8_t directAddress[B_ADDR_LEN]; //!< device address + uint8_t dataLen; //!< Length (in bytes) of the data field (evtData) + uint8_t *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapExtAdvDeviceInfoEvent_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8_t taskID; //!< Requesting App's Task ID, used to return results + uint8_t mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8_t activeScan; //!< TRUE for active scanning + uint8_t whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device. + */ +typedef struct +{ + uint8_t eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8_t numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_PERIODIC_ADVERTISING_DONE_EVENT message format. This message is sent to the + * app when the Periodic Advertising config is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERIODIC_ADVERTISING_DONE_EVENT +} gapMakePeriodicRspEvent_t; + +/** + * GAP_END_PERIODIC_ADV_DONE_EVENT message format. This message is sent to the + * app when the Periodic Advertising disable is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_END_PERIODIC_ADV_DONE_EVENT +} gapEndPeriodicRspEvent_t; + +/** + * GAP_SYNC_ESTABLISHED_EVENT message format. This message is sent to the + * app when the Periodic Advertising Sync Establish is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_SYNC_ESTABLISHED_EVENT + uint8_t status; //!< Periodic advertising sync status + uint16_t syncHandle; //!< Identifying the periodic advertising train + uint8_t advertisingSID; //!< Value of the Advertising SID subfield in the ADI field of the PDU + uint8_t devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t devAddr[B_ADDR_LEN]; //!< Device address of sync + uint8_t advertisingPHY; //!< Advertiser PHY + uint16_t periodicInterval; //!< Periodic advertising interval + uint8_t clockAccuracy; //!< Clock Accuracy + uint8_t numSubevents; //!< Number of subevents.0x00-No subevents + uint8_t subInterval; //!< Subevent interval.0x00-No subevents + uint8_t rspSlotDelay; //!< Response slot delay.0x00-No response slots + uint8_t rspSlotSpacing; //!< Response slot spacing.0x00-No response slots +} gapSyncEstablishedEvent_t; + +/** + * GAP_PERIODIC_ADV_DEVICE_INFO_EVENT message format. This message is sent to the + * app during Periodic Advertising Sync, when received a Periodic Advertising packet + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERIODIC_ADV_DEVICE_INFO_EVENT + uint16_t syncHandle; //!< Identifying the periodic advertising train + int8_t txPower; //!< Periodic advertising tx power,Units: dBm + int8_t rssi; //!< Periodic advertising rssi,Units: dBm + uint8_t unUsed; + uint16_t eventCounter; //!< The value of paEventCounter for the reported periodic advertising packet + uint8_t subevent; //!< The subevent number. 0xFF: No subevents + uint8_t dataStatus; //!< Data complete + uint8_t dataLength; //!< Length (in bytes) of the data field (evtData) + uint8_t *pEvtData; //!< Data field of periodic advertising data +} gapPeriodicAdvDeviceInfoEvent_t; + +/** + * GAP_SYNC_LOST_EVENT message format. This message is sent to the + * app when the Periodic Advertising Sync timeout period. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_SYNC_LOST_EVENT + uint16_t syncHandle; //!< Identifying the periodic advertising train +} gapSyncLostEvent_t; + +#define PKT_TRANSMITTED 0x00 +#define PKT_NOT_TRANSMITTED 0x01 + +typedef struct +{ + uint8_t taskID; //!< set periodic advertising task ID + uint8_t enable; //!< bit0 Enable periodic advertising + //!< bit1 Include the ADI field in AUX_SYNC_IND PDUs + uint8_t advHandle; //!< Used to identify a periodic advertising train + uint16_t advIntervalMin; //!< Minimum advertising interval for periodic advertising.Time = N × 1.25ms.Time Range: 7.5ms to 81.91875s + uint16_t advIntervalMax; //!< Maximum advertising interval for periodic advertising.Time = N × 1.25ms.Time Range: 7.5ms to 81.91875s + uint16_t advProperties; //!< bit6 Include TxPower in the advertising PDU + uint8_t numSubevents; //!< Number of subevents. + uint8_t subInterval; //!< Interval between subevents.Time = N × 1.25ms.Time Range: 7.5 ms to 318.75 ms + uint8_t rspSlotDelay; //!< Time between the advertising packet in a subevent and the first response slot.Time = N × 1.25 ms.Time Range: 1.25ms to 317.5ms + uint8_t rspSlotSpacing; //!< Time between response slots.Time = N × 0.125ms.Time Range: 0.25ms to 31.875ms + uint8_t numRspSlots; //!< Number of subevent response slots.Range: 0x01 to 0xFF +}gapPawrSetParam_t; + +typedef struct +{ + uint8_t subevent; //!< The subevent index of the data contained in this command. + uint8_t rspSlotStart; //!< The first response slots to be used in this subevent. + uint8_t rspSlotCount; //!< The number of response slots to be used. + uint8_t dataLength; //!< The number of octets in the Subevent_Data parameter. + uint16_t rspMaxLength; //!< + uint8_t *pData; //!< Advertising data +}gapPawrSetData_t; + +typedef struct +{ + uint16_t syncHandle; //!< identifying the PAwR train + uint16_t reqEvent; //!< The value of paEventCounter the periodic advertising packet that the Host is responding to + uint8_t reqSubevent; //!< The subevent for the periodic advertising packet that the Host is responding to + uint8_t rspSubevent; //!< Used to identify the subevent of the PAwR train. + uint8_t rspSlot; //!< Used to identify the response slot of the PAwR train. + uint8_t rspDataLength;//!< The number of octets in the Response_Data parameter. + uint8_t *pRspData; //!< Response data +} gapPawrSetResponseData_t; + +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERI_ADV_SUBEVENT_DATA_REQ_EVENT + uint8_t advHandle; + uint8_t subeventStart; + uint8_t subeventDataCount; +} gapPawrDataRequestEvent_t; + +typedef struct +{ + uint8_t txPower; + int8_t rssi; + uint8_t cteType; + uint8_t rspSlot; + uint8_t dataStatus; + uint8_t dataLength; + uint8_t *pData; +}pawrResponseInfo_t; + +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERI_ADV_RESPONSE_REPORT_EVENT + uint8_t advHandle; + uint8_t subevent; + uint8_t txStatus; //!< 0x00 packet was transmitted. 0x01 packet was not transmitted. + uint8_t numResponses; + pawrResponseInfo_t *pList; +} gapPawrResponseEvent_t; + +typedef struct +{ + uint8_t advHandle; //!< Used to identify a periodic advertising train + uint8_t subevent; //!< Subevent where the connection request is to be sent. + uint8_t ownAddrType; + uint8_t peerAddrType; + uint8_t peerAddr[6]; + uint16_t connIntervalMin; + uint16_t connIntervalMax; + uint16_t maxLatency; + uint16_t supervisionTimeout; +} gapPawrCreateConnection_t; + +/** + * GAP_SCAN_REQUEST_EVENT message format. This message is sent to the + * app when the advertiser receives a SCAN_REQ PDU or an AUX_SCAN_REQ PDU + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_SCAN_REQUEST_EVENT + uint8_t advHandle; //!< identifying the periodic advertising train + uint8_t scannerAddrType; //!< the type of the address + uint8_t scannerAddr[B_ADDR_LEN];//!< the address of scanner device +} gapScanReqReseiveEvent_t; + +/** + * GAP_CONNECTIONESS_CTE_DONE_EVENT message format. This message is sent to the + * app when the Connectionless CTE Transmit config is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_CONNECTIONESS_CTE_DONE_EVENT +} gapMakeConnectionlessCTERspEvent_t; + +/** + * GAP_END_PERIODIC_ADV_DONE_EVENT message format. This message is sent to the + * app when the Periodic Advertising disable is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_END_CONNECTIONESS_CTE_DONE_EVENT +} gapEndConnectionlessCTERspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8_t adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8_t devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t devAddr[B_ADDR_LEN]; //!< Device address of link + uint16_t connectionHandle; //!< Connection Handle from controller used to ref the device + uint8_t connRole; //!< Connection formed as Central or Peripheral + uint16_t connInterval; //!< Connection Interval + uint16_t connLatency; //!< Connection Latency + uint16_t connTimeout; //!< Connection Timeout + uint8_t clockAccuracy; //!< Clock Accuracy + uint8_t advHandle; //!< Used to identify an advertising set + uint16_t syncHandle; //!< Identifying the periodic advertising train +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8_t status; //!< bStatus_t + uint16_t connectionHandle; //!< Connection handle of the update + uint16_t connInterval; //!< Requested connection interval + uint16_t connLatency; //!< Requested connection latency + uint16_t connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16_t connectionHandle; //!< connection Handle + uint8_t reason; //!< termination reason from LL + uint8_t connRole; +} gapTerminateLinkEvent_t; + +/** + * GAP_PHY_UPDATE_EVENT message format. This message is sent to the app(GAP_MSG_EVENT) + * when the PHY update request is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PHY_UPDATE_EVENT + uint8_t status; //!< bStatus_t + uint16_t connectionHandle; //!< Connection handle of the update + uint8_t connTxPHYS; //!< tx phy(GAP_PHY_VAL_TYPE) + uint8_t connRxPHYS; //!< rx phy(GAP_PHY_VAL_TYPE) +} gapPhyUpdateEvent_t; + +/** + * GAP_PERI_ADV_SYNC_TRAN_RECEIVED_EVENT message format. This message is sent to the app(GAP_MSG_EVENT) + * when the periodic advertising sync transfer received. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERI_ADV_SYNC_TRAN_RECEIVED_EVENT + uint8_t status; //!< bStatus_t + uint16_t connectionHandle; //!< Connection handle of the update + uint16_t serviceData; //!< A value provided by the peer device + uint16_t syncHandle; //!< Identifying the periodic advertising train + uint8_t advertisingSID; //!< Value of the Advertising SID used to advertise the periodic advertising + uint8_t devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t devAddr[B_ADDR_LEN]; //!< Device address of periodic advertising + uint8_t advertisingPHY; //!< the PHY used for the periodic advertising + uint16_t periodicInterval; //!< Periodic advertising interval + uint8_t clockAccuracy; //!< Clock Accuracy + uint8_t numSubevents; //!< Number of subevents + uint8_t subInterval; //!< Subevent interval + uint8_t rspSlotDelay; //!< Response slot delay + uint8_t rspSlotSpacing; //!< Response slot spacing +} gapPeriodicTranReceivec_t; + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8_t deviceAddr[B_ADDR_LEN]; //!< address of device to pair with, and could be either public or random. + uint16_t connectionHandle; //!< Connection handle + uint8_t uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8_t uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t)( uint8_t *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16_t connectionHandle, //!< Connection handle + uint8_t uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8_t uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t)( uint16_t connectionHandle, //!< Connection handle + uint8_t state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8_t status //!< Pairing status + ); + +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_O0B_NEEDED_EVENT + uint8_t deviceAddr[B_ADDR_LEN]; //!< address of device to pair with, and could be either public or random. + uint16_t connectionHandle; //!< Connection handle + uint8_t r_local[16]; + uint8_t c_local[16]; +} gapOobNeededEvent_t; + +/** + * OOB Callback Function + */ +typedef void (*pfnOobCB_t)( uint8_t *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16_t connectionHandle, //!< Connection handle + uint8_t* r_local, //!< local rand + uint8_t *c_local //!< local confirm + ); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback + pfnOobCB_t oobCB; //!< oob callback +} gapBondCBs_t; + +typedef int (*pfnEcc_key_t)( uint8_t *pub, uint8_t *priv); + +typedef int (*pfnEcc_dhkey_t)( uint8_t *peer_pub_key_x, uint8_t *peer_pub_key_y, + uint8_t *our_priv_key, uint8_t *out_dhkey ); + +typedef int (*pfnEcc_alg_f4_t)( uint8_t *u, uint8_t *v, uint8_t *x, uint8_t z, + uint8_t *out_enc_data ); + +typedef int (*pfnEcc_alg_g2_t)( uint8_t *u, uint8_t *v, uint8_t *x, uint8_t *y, + uint32_t *passkey ); + +typedef int (*pfnEcc_alg_f5_t)( uint8_t *w, uint8_t *n1, uint8_t *n2, + uint8_t a1t, uint8_t *a1, uint8_t a2t, uint8_t *a2, uint8_t *mackey, uint8_t *ltk ); + +typedef int (*pfnEcc_alg_f6_t)( uint8_t *w, uint8_t *n1, uint8_t *n2, uint8_t *r, + uint8_t *iocap, uint8_t a1t, uint8_t *a1, uint8_t a2t, uint8_t *a2, uint8_t *check ); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnEcc_key_t gen_key_pair; + pfnEcc_dhkey_t gen_dhkey; + pfnEcc_alg_f4_t alg_f4; //!< LE Secure Connections confirm value generation function f4 + pfnEcc_alg_g2_t alg_g2; //!< LE Secure Connections numeric comparison value generation function g2 + pfnEcc_alg_f5_t alg_f5; //!< LE Secure Connect ions key generation function f5 + pfnEcc_alg_f6_t alg_f6; //!< LE Secure Connections check value generation function f6 +} gapEccCBs_t; + +/** + * gapRole_States_t defined + */ +typedef uint32_t gapRole_States_t; + +// gapRole_States_t @ 4b'[3-0]-advertising states +#define GAPROLE_STATE_ADV_MASK (0xF) //!< advertising states mask +#define GAPROLE_STATE_ADV_SHIFT (0x0) //!< advertising states shift +#define GAPROLE_INIT 0 //!< Waiting to be started +#define GAPROLE_STARTED 1 //!< Started but not advertising +#define GAPROLE_ADVERTISING 2 //!< Currently Advertising +#define GAPROLE_WAITING 3 //!< Device is started but not advertising, is in waiting period before advertising again +#define GAPROLE_CONNECTED 4 //!< In a connection +#define GAPROLE_CONNECTED_ADV 5 //!< In a connection + advertising +#define GAPROLE_ERROR 6 //!< Error occurred - invalid state + +// gapRole_States_t @ 4b'[7-4]-Periodic advertising states +// Periodic advertising Enable,only effective when GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT advertising event enable +#define GAPROLE_STATE_PERIODIC_MASK (0xF0) //!< Periodic advertising states mask +#define GAPROLE_STATE_PERIODIC_SHIFT (4) //!< Periodic advertising states shift +#define GAPROLE_PERIODIC_INVALID (0<<4) //!< Periodic advertising Waiting to be started +#define GAPROLE_PERIODIC_ENABLE (1<<4) //!< Periodic advertising Enable +#define GAPROLE_PERIODIC_WAIT (2<<4) //!< Periodic advertising is started but disable +#define GAPROLE_PERIODIC_ERROR (3<<4) //!< Periodic advertising error occurred + +// gapRole_States_t @ 4b'[11-8]-Connectionless CTE Transmit states +// Connectionless CTE Transmit Enable,only effective when Periodic advertising valid +#define GAPROLE_STATE_CTE_MASK (0xF00) //!< gapRole_States_t Connectionless CTE defined +#define GAPROLE_STATE_CTE_SHIFT (8) //!< Connectionless CTE Transmit states shift +#define GAPROLE_CONNECTIONLESS_CTE_INVALID (0<<8) //!< Connectionless CTE Transmit Waiting to be started +#define GAPROLE_CONNECTIONLESS_CTE_ENABLE (1<<8) //!< Connectionless CTE Transmit Enable +#define GAPROLE_CONNECTIONLESS_CTE_WAIT (2<<8) //!< Connectionless CTE Transmit is started but disable +#define GAPROLE_CONNECTIONLESS_CTE_ERROR (3<<8) //!< Connectionless CTE Transmit error occurred +// gapRole_States_t @ 12b'[23-12]- Reserved for future use + +// gapRole_States_t @ 8b'[31-24] - indicates which fields change +#define GAPROLE_PERIODIC_STATE_VALID (1<<24) //!< indicates periodic advertising states change +#define GAPROLE_CTE_T_STATE_VALID (1<<25) //!< indicates Connectionless CTE Transmit states change + +typedef union { + struct { + uint32_t advState : 4; + uint32_t periState : 4; + uint32_t cteState : 4; + uint32_t Reserved0 : 12; + uint32_t periValid : 1; + uint32_t cteValid : 1; + uint32_t Reserved1 : 6; + }; + uint32_t gapRoleStates; +} gapRoleStates_t; + +/** + * gapRole Event Structure + */ +typedef union +{ + gapEventHdr_t gap; //!< GAP_MSG_EVENT and status. + gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. + gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure. + gapDirectDeviceInfoEvent_t deviceDirectInfo; //!< Discovery direct device information event structure. + gapAdvDataUpdateEvent_t dataUpdate; //!< Advertising Data Update is complete. + gapPeriodicAdvDeviceInfoEvent_t devicePeriodicInfo; //!< Discovery periodic device information event structure. + gapExtAdvDeviceInfoEvent_t deviceExtAdvInfo; //!< Discovery extend advertising device information event structure. + gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure. + gapSyncEstablishedEvent_t syncEstEvt; //!< sync established event structure. + gapSyncLostEvent_t syncLostEvt; //!< sync lost event structure. + gapScanReqReseiveEvent_t scanReqEvt; //!< Scan_Request_Received event structure. + + gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure. + gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure. + gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure. + gapPhyUpdateEvent_t linkPhyUpdate; //!< Link phy update event structure. + gapPeriodicTranReceivec_t syncTran; +} gapRoleEvent_t; + +/** + * Type of device. + */ +typedef struct +{ + uint8_t eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< Scan Address Type:0x00-Public Device Address or Public Identity Address 0x01-Random Device Address or Random (static) Identity Address + uint8_t addr[B_ADDR_LEN]; //!< Device's Address + int8_t rssi; +} gapScanRec_t; + +/** + * Type of GAPRole_CreateSync command parameters. + */ +typedef struct +{ + uint8_t options; + /* + bit0: used to determine whether the Periodic Advertiser List is used + 0: Use the Advertising_SID, Advertisier_Address_Type, and Advertiser_Address parameters to determine which advertiser to listen to. + 1: Use the Periodic Advertiser List to determine which advertiser to listen to. + bit1: whether GAP_PERIODIC_ADV_DEVICE_INFO_EVENT events for this periodic advertising train are initially enabled or disabled. + 0: Reporting initially enabled + 1: Reporting initially disabled + bit2: + 0: Duplicate filtering initially disabled + 1: Duplicate filtering initially enabled */ + uint8_t advertising_SID; //!< if used, specifies the value that must match the Advertising SID + uint8_t addrType; //!< Scan Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Device's Address + uint16_t skip; //!< the maximum number of consecutive periodic advertising events that the receiver may skip after + //!< successfully receiving a periodic advertising packet.Range: 0x0000 to 0x01F3 + uint16_t syncTimeout; //!< the maximum permitted time between successful receives. If this time is exceeded, synchronization is lost. + //!< Time = N*10 ms.Range: 0x000A to 0x4000 + uint8_t syncCTEType; //!< specifies whether to only synchronize to periodic advertising with certain types of Constant Tone Extension + //!< (a value of 0 indicates that the presence or absence of a Constant Tone Extension is irrelevant). +} gapCreateSync_t; + +/** + * Type of GAPRole_SyncTransferParameters command parameters. + */ +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + uint8_t mode; //!< specifies the action to be taken when periodic advertising synchronization information is received +#define MODE_0 0 //!< No attempt is made to synchronize to the periodic advertising and no + //!< gapPeriodicTranReceivec_t event is sent to the APP. +#define MODE_1 1 //!< An gapPeriodicTranReceivec_t event is sent to the APP. + //!< gapPeriodicAdvDeviceInfoEvent_t events will be disabled. +#define MODE_2 2 //!< An gapPeriodicTranReceivec_t event is sent to the APP. + //!< gapPeriodicAdvDeviceInfoEvent_t events will be enabled with duplicate filtering disabled. +#define MODE_3 3 //!< An gapPeriodicTranReceivec_t event is sent to the APP. + //!< gapPeriodicAdvDeviceInfoEvent_t events will be enabled with duplicate filtering enabled. + uint16_t skip; //!< resv(The number of periodic advertising packets that can be skipped after a successful receive). + uint16_t syncTimeout; //!< Synchronization timeout for the periodic advertising train.Time = N*10 ms.Range: 0x000A to 0x4000 + uint8_t cteType; //!< Reserved for future use. +} gapSyncTransferParam_t; + +/** + * Type of GAPRole_SyncTransferSync command parameters. + */ +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + uint16_t serviceData; //!< A value provided by the Host for use by the Host of the peer device. + uint16_t syncHandle; //!< Identifier of the periodic advertising train to a connected device. +} gapSyncTransferSync_t; + +/** + * Type of GAPRole_SyncTransferAdvertising command parameters. + */ +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + uint16_t serviceData; //!< A value provided by the Host for use by the Host of the peer device. + uint8_t advHandle; //!< Identifier of the periodic advertising in an advertising set to a connected device. +} gapSyncTransferAdvertising_t; + +/** + * Type of GAPRole_SetPathLossReporting command parameters. + */ +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + int8_t highThreshold; //!< High threshold for the path loss.Units: dB + int8_t highHysteresis; //!< Hysteresis value for the high threshold.Units: dB + int8_t lowThreshold; //!< High threshold for the path loss.Units: dB + int8_t lowHysteresis; //!< Hysteresis value for the high threshold.Units: dB + uint16_t minTimeSpent; //!< Minimum time in number of connection events to be observed + //!< once the path crosses the threshold before an event is generated. + uint8_t enable; //!< 0x00:Reporting disabled 0x01:Reporting enabled +} gapRoleSetPathLossReporting_t; + +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + int8_t lowRxThreshold; //!< High threshold for the peer power levels.Units: dB + int8_t highRxThreshold; //!< High threshold for the peer power levels.Units: dB + int8_t minTxPower; //!< Minimum transmit power level.Units: dB + int8_t maxTxPower; //!< Maximum transmit power level.Units: dB +} gapRolePowerlevelManagement_t; + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesBroadcasterStateNotify_t)( gapRole_States_t newState ); + +typedef void (*gapRolesScanReqRecv_t)( gapScanRec_t * pEvent ); + +typedef struct +{ + gapRolesBroadcasterStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesScanReqRecv_t pfnScanRecv; +} gapRolesBroadcasterCBs_t; + +/** + * Observer Event Callback Function + */ +typedef void (*pfnGapObserverRoleEventCB_t)( gapRoleEvent_t *pEvent //!< Pointer to event structure. + ); + +/** + * Observer Callback Structure + */ +typedef struct +{ + pfnGapObserverRoleEventCB_t eventCB; //!< Event callback. +} gapRoleObserverCB_t; + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( uint16_t connHandle, int8_t newRSSI ); + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gapRole_States_t newState, gapRoleEvent_t * pEvent ); + +/** + * Callback when the connection parameteres are updated. + */ +typedef void (*gapRolesParamUpdateCB_t)( uint16_t connHandle, uint16_t connInterval, + uint16_t connSlaveLatency, uint16_t connTimeout ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller + gapRolesParamUpdateCB_t pfnParamUpdate; //!< When the connection parameteres are updated +} gapRolesCBs_t; + +/** + * Central Event Callback Function + */ +typedef void (*pfnGapCentralRoleEventCB_t)( gapRoleEvent_t *pEvent ); //!< Pointer to event structure. + +/** + * HCI Data Length Change Event Callback Function + */ +typedef void (*pfnHciDataLenChangeEvCB_t)( uint16_t connHandle, uint16_t maxTxOctets, + uint16_t maxRxOctets ); + +/** + * Central Callback Structure + */ +typedef struct +{ + gapRolesRssiRead_t rssiCB; //!< RSSI callback. + pfnGapCentralRoleEventCB_t eventCB; //!< Event callback. + pfnHciDataLenChangeEvCB_t ChangCB; //!< Length Change Event Callback . +} gapCentralRoleCB_t; // gapCentralRoleCB_t + +/* RF-PHY define */ + +/* + * RF_ROLE_STATUS_TYPE pfnRFStatusCB_t state defined + */ +// TX_MODE call RF_Tx +#define TX_MODE_TX_FINISH 0x01 //!< basic or auto tx mode sends data successfully + //!< if it is in basic mode,it will enter idle state; + //!< if it is in auto mode,it will wait for receiving +#define TX_MODE_TX_FAIL 0x11 //!< basic or auto tx mode fail to send data and enter idle state +#define TX_MODE_TX_TIMEOUT TX_MODE_TX_FAIL //!< time of data transmission +#define TX_MODE_RX_DATA 0x02 //!< auto tx mode receive data(ack) and enter idle state +#define TX_MODE_RX_TIMEOUT 0x12 //!< auto tx mode receive timeout and enter idle state +#define TX_MODE_HOP_SHUT 0x22 + +// RX_MODE call RF_Rx +#define RX_MODE_RX_DATA 0x03 //!< basic or auto rx mode receive data + //!< if it is in basic mode,it will enter idle state; + //!< if it is in auto mode,it will judge whether the type matches; + //!< if it matches,it will send data(ack),otherwise(rsr=2), it will restart receiving +#define RX_MODE_TX_FINISH 0x04 //!< auto rx mode sends data(ack) successfully and enters idle state +#define RX_MODE_TX_FAIL 0x14 //!< auto rx mode fail to send data and enter idle state +#define RX_MODE_TX_TIMEOUT RX_MODE_TX_FAIL //!< time of data transmission +#define RX_MODE_HOP_SHUT 0x24 + +// LLE_MODE_TYPE +#define LLE_MODE_BASIC (0) //!< basic mode, enter idle state after sending or receive +#define LLE_MODE_AUTO (1) //!< auto mode, auto swtich to the receiving status after sending and the sending status after receiving + +// LLE_WHITENING_TYPE +#define LLE_WHITENING_ON (0<<1) +#define LLE_WHITENING_OFF (1<<1) + +// LLE_PHY_TYPE +#define LLE_MODE_PHY_MODE_MASK (0x30) +#define LLE_MODE_PHY_1M (0<<4) +#define LLE_MODE_PHY_2M (1<<4) +#define LLE_MODE_PHY_CODED_S8 (2<<4) +#define LLE_MODE_PHY_CODED_S2 (3<<4) + +#define LLE_MODE_EX_CHANNEL (1<<6) + +#define LLE_MODE_NON_RSSI (1<<7) + +/** + * RFRole Event Callback Function + */ +typedef void (*pfnRFStatusCB_t)( uint8_t sta, uint8_t rsr, uint8_t *rxBuf ); +// sta - current status@ref RF_ROLE_STATUS_TYPE +// rsr - receive status: bit0- crc check result,bit1- type matching result +// rxBuf - receive data buffer + +typedef struct tag_rf_config +{ + uint8_t LLEMode; //!< BIT0 0=basic, 1=auto def@LLE_MODE_TYPE + //!< BIT1 0=whitening on, 1=whitening off def@LLE_WHITENING_TYPE + //!< BIT4-5 00-1M 01-2M 10-coded(S8) 11-coded(S2) def@LLE_PHY_TYPE + //!< BIT6 0=data channel(0-39) + //!< 1=rf frequency (2400000kHz-2483500kHz) + //!< BIT7 0=the first byte of the receive buffer is rssi + //!< 1=the first byte of the receive buffer is package type + uint8_t Channel; //!< rf channel(0-39) + uint32_t Frequency; //!< rf frequency (2400000kHz-2483500kHz) + uint32_t accessAddress; //!< access address,32bit PHY address + uint32_t CRCInit; //!< crc initial value + pfnRFStatusCB_t rfStatusCB; //!< status call back + uint32_t ChannelMap; //!< indicating Used and Unused data channels.Every channel is represented with a + //!< bit positioned as per the data channel index,The LSB represents data channel index 0 + uint8_t Resv; + uint8_t HeartPeriod; //!< The heart package interval shall be an integer multiple of 100ms + uint8_t HopPeriod; //!< hop period( T=32n*RTC clock ),default is 8 + uint8_t HopIndex; //!< indicate the hopIncrement used in the data channel selection algorithm,default is 17 + uint8_t RxMaxlen; //!< Maximum data length received in rf-mode(default 251) + uint8_t TxMaxlen; //!< Maximum data length transmit in rf-mode(default 251) +} rfConfig_t; + +/* end define@RF-PHY */ + +/******************************************************************************* + * UUID defined + */ +/** + * GATT Services + */ +extern const uint8_t gapServiceUUID[]; +extern const uint8_t gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8_t primaryServiceUUID[]; +extern const uint8_t secondaryServiceUUID[]; +extern const uint8_t includeUUID[]; +extern const uint8_t characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8_t charExtPropsUUID[]; +extern const uint8_t charUserDescUUID[]; +extern const uint8_t clientCharCfgUUID[]; +extern const uint8_t servCharCfgUUID[]; +extern const uint8_t charFormatUUID[]; +extern const uint8_t charAggFormatUUID[]; +extern const uint8_t validRangeUUID[]; +extern const uint8_t extReportRefUUID[]; +extern const uint8_t reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8_t deviceNameUUID[]; +extern const uint8_t appearanceUUID[]; +extern const uint8_t periPrivacyFlagUUID[]; +extern const uint8_t reconnectAddrUUID[]; +extern const uint8_t periConnParamUUID[]; +extern const uint8_t serviceChangedUUID[]; +extern const uint8_t centAddrResUUID[]; + +/******************************************************************************* + * PUBLIC FUNCTIONS + */ +extern uint32_t tmos_rand( void ); // pseudo-random number +extern BOOL tmos_memcmp( const void *src1, const void *src2, uint32_t len ); // TRUE - same, FALSE - different +extern BOOL tmos_isbufset( uint8_t *buf, uint8_t val, uint32_t len ); // TRUE if all "val",FALSE otherwise +extern uint32_t tmos_strlen( char *pString ); +extern void tmos_memset( void * pDst, uint8_t Value, uint32_t len ); +extern void tmos_memcpy( void *dst, const void *src, uint32_t len ); // Generic memory copy. + +/** + * @brief start a event immediately + * + * @param taskID - task ID of event + * @param event - event value + * + * @return 0 - SUCCESS. + */ +extern bStatus_t tmos_set_event( tmosTaskID taskID, tmosEvents event ); + +/** + * @brief clear a event already timeout, cannot be used in it own event function. + * + * @param taskID - task ID of event + * @param event - event value + * + * @return 0 - SUCCESS. + */ +extern bStatus_t tmos_clear_event( tmosTaskID taskID, tmosEvents event ); + +/** + * @brief start a event after period of time + * + * @param taskID - task ID to set event for + * @param event - event to be notified with + * @param time - timeout value + * + * @return TRUE,FALSE. + */ +extern BOOL tmos_start_task( tmosTaskID taskID, tmosEvents event, tmosTimer time ); + +/** + * @brief This function is called to start a timer to expire in n system clock time. + * When the timer expires, the calling task will get the specified event + * and the timer will be reloaded with the timeout value. + * + * @param taskID - task ID to set timer for + * @param event - event to be notified with + * @param time - timeout value + * + * @return SUCCESS, or NO_TIMER_AVAIL. + */ +extern bStatus_t tmos_start_reload_task( tmosTaskID taskID, tmosEvents event, tmosTimer time ); + +/** + * @brief stop a event + * + * @param taskID - task ID of event + * @param event - event value + * + * @param None. + * + * @return SUCCESS. + */ +extern bStatus_t tmos_stop_task( tmosTaskID taskID, tmosEvents event ); + +/** + * @brief get last period of time for this event + * + * @param taskID - task ID of event + * @param event - event value + * + * @return the timer's tick count if found, zero otherwise. + */ +extern tmosTimer tmos_get_task_timer( tmosTaskID taskID, tmosEvents event ); + +/** + * @brief send msg to a task,callback events&SYS_EVENT_MSG + * + * @param taskID - task ID of task need to send msg + * @param *msg_ptr - point of msg + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +extern bStatus_t tmos_msg_send( tmosTaskID taskID, uint8_t *msg_ptr ); + +/** + * @brief delete a msg + * + * @param *msg_ptr - point of msg + * + * @return SUCCESS. + */ +extern bStatus_t tmos_msg_deallocate( uint8_t *msg_ptr ); + +/** + * @brief receive a msg + * + * @param taskID - task ID of task need to receive msg + * + * @return *uint8_t - message information or NULL if no message + */ +extern uint8_t *tmos_msg_receive( tmosTaskID taskID ); + +/** + * @brief allocate buffer for msg when need to send msg + * + * @param len - length of msg + * + * @return pointer to allocated buffer or NULL if allocation failed. + */ +extern uint8_t *tmos_msg_allocate( uint16_t len ); + +/** + * @brief read a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data to read. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +extern bStatus_t tmos_snv_read( tmosSnvId_t id, tmosSnvLen_t len, void *pBuf ); + +/** + * @brief tmos system timer initialization + * + * @note must initialization before call tmos task + * + * @param fnGetClock - system clock select extend input,if NULL select HSE as the clock source + * + * @return SUCCESS if successful, FAILURE if failed. + */ +extern bStatus_t TMOS_TimerInit( bleClockConfig_t *pClockConfig ); + +/** + * @brief interrupt handler. + * + * @param None + * + * @return None + */ +extern bStatus_t TMOS_TimerIRQHandler( uint32_t *time ); + +/** + * @brief Process system + * + * @param None. + * + * @return None. + */ +extern void TMOS_SystemProcess( void ); + +/** + * @brief Get current system clock + * + * @param None. + * + * @return current system clock (in 0.625ms) + */ +extern uint32_t TMOS_GetSystemClock( void ); + +/** + * @brief register process event callback function + * + * @param eventCb-events callback function + * + * @return 0xFF - error,others-task id + */ +extern tmosTaskID TMOS_ProcessEventRegister( pTaskEventHandlerFn eventCb ); + +/** + * @brief Add a device address into white list ( support SNVNum MAX ) + * + * @param addrType - Type of device address + * @param devAddr - first address of device address + * + * @return Command Status. + */ +extern bStatus_t LL_AddWhiteListDevice( uint8_t addrType, uint8_t *devAddr ); + +/** + * @brief Remove a device address from white list + * + * @param addrType - Type of device address + * @param devAddr - first address of device address + * + * @return Command Status. + */ +extern bStatus_t LL_RemoveWhiteListDevice( uint8_t addrType, uint8_t *devAddr ); + +/** + * @brief Clear white list + * + * @param None + * + * @return Command Status. + */ +extern bStatus_t LL_ClearWhiteList( void ); + +/** + * @brief Encrypt data + * + * @param key - key + * @param plaintextData - original data + * @param encryptData - encrypted data + * + * @return Command Status. + */ +extern bStatus_t LL_Encrypt( uint8_t *key, uint8_t *plaintextData, uint8_t *encryptData ); + +/** + * @brief Decrypt data + * + * @param key - key + * @param plaintextData - original data + * @param decryptData - decrypted data + * + * @return Command Status. + */ +extern bStatus_t LL_Decrypt( uint8_t *key, uint8_t *plaintextData, uint8_t *decryptData ); + +/** + * @brief get number of unAck packet in current connect buffer + * + * @param handle - connect handle + * + * @return 0xFFFFFFFF-handle error,number of packets not receiving ack + */ +extern uint32_t LL_GetNumberOfUnAckPacket( uint16_t handle ); + +/** + * @brief Register a callback function will be called after each connect event. + * Only effect in single connection + * + * @param connEventCB - callback function + * + * @return None. + */ +extern void LL_ConnectEventRegister( pfnEventCB connEventCB ); + +/** + * @brief Register a callback function will be called after each advertise event. + * + * @param advEventCB - callback function + * + * @return None. + */ +extern void LL_AdvertiseEventRegister( pfnEventCB advEventCB ); + +/** + * @brief set tx power level + * + * @param power - tx power level + * + * @return Command Status. + */ +extern bStatus_t LL_SetTxPowerLevel( uint8_t power ); + +/** + * @brief read rssi + * + * @param None. + * + * @return the value of rssi. + */ +extern int8_t BLE_ReadRssi( void ); + +/** + * @brief read cfo + * + * @param None. + * + * @return the value of cfo. + */ +extern int16_t BLE_ReadCfo( void ); + +/** + * @brief pa control init + * + * @note Can't be called until role Init + * + * @param paControl - pa control parameters(global variable) + * + * @return Command Status. + */ +extern void BLE_PAControlInit( blePaControlConfig_t *paControl ); + +/** + * @brief ble register reset and rf calibration + * + * @param None + * + * @return None + */ +extern void BLE_RegInit( void ); + +/** + * @brief Init BLE lib. RTC will be occupied at the same time. + * + * @param pCfg - config of BLE lib + * + * @return 0-success. error defined @ ERR_LIB_INIT + */ +extern bStatus_t BLE_LibInit( bleConfig_t* pCfg ); + +/** + * @brief interrupt handler. + * + * @param None + * + * @return None + */ +extern void BB_IRQLibHandler( void ); + +/** + * @brief interrupt handler. + * + * @param None + * + * @return None + */ +extern void LLE_IRQLibHandler( void ); + +/** + * @brief generate a valid access address + * + * @param None. + * + * @return access address + * the Access Address meets the following requirements: + * It shall have no more than six consecutive zeros or ones. + * It shall not be t he advertising channel packets’ Access Address. + * It shall not be a sequence that differ s from the advertising channel packets' Access Address by only one bit. + * It shall not have all four octets equal. + * It shall have no more than 24 transitions. + * It shall have a minimum of two transitions in the most significant six bits. + */ +extern uint32_t BLE_AccessAddressGenerate( void ); + +/* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ +extern uint8_t linkDB_Register( pfnLinkDBCB_t pFunc ); + +/* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ +extern uint8_t linkDB_State( uint16_t connectionHandle, uint8_t state ); + +/* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ +extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); +/* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8_t linkDB_Up( uint16_t connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ +#define linkDB_Up( connectionHandle ) linkDB_State( (connectionHandle), LINK_CONNECTED ) + +/** + * @brief This function is used to get the MTU size of a connection. + * + * @param connHandle - connection handle. + * + * @return connection MTU size.
+ */ +extern uint16_t ATT_GetMTU( uint16_t connHandle ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16_t connHandle ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8_t ATT_CompareUUID( const uint8_t *pUUID1, uint16_t len1, const uint8_t *pUUID2, uint16_t len2 ); + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS: Client initialized successfully.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId ?task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8_t taskId ); + +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16_t handle, uint16_t *pHandle ); + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * @note This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeoutstatus) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16_t connHandle, attHandleValueInd_t *pInd, uint8_t authenticated, uint8_t taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * @note A notification may be sent at any time and does not invoke a confirmation. + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16_t connHandle, attHandleValueNoti_t *pNoti, uint8_t authenticated ); + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16_t connHandle, attExchangeMTUReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16_t connHandle, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pUUID - pointer to service UUID to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16_t connHandle, uint8_t *pUUID, uint8_t len, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureCompleteor bleTimeout status)or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16_t connHandle, uint16_t startHandle, uint16_t endHandle, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status)or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16_t connHandle, uint16_t startHandle, uint16_t endHandle, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16_t connHandle, attReadByTypeReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptors Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16_t connHandle, uint16_t startHandle, uint16_t endHandle, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU ?1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU - 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16_t connHandle, attReadReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16_t connHandle, attReadByTypeReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16_t connHandle, attReadBlobReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16_t connHandle, attReadMultiReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU ?3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16_t connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU ?15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16_t connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16_t connHandle, attWriteReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * @note This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP + * (with SUCCESS or bleTimeout status), or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @note The 'pReq->pValue' pointer will be freed when the sub-procedure is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16_t connHandle, attPrepareWriteReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * @note This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP + * (with SUCCESS or bleTimeout status), or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @note The 'pReqs' pointer will be freed when the sub-procedure is complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16_t connHandle, attPrepareWriteReq_t *pReqs, uint8_t numReqs, + uint8_t flags, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration's Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16_t connHandle, attReadReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration's Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16_t connHandle, attReadBlobReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16_t connHandle, attWriteReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * @note This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP + * (with SUCCESS or bleTimeout status), or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @note The 'pReq->pValue' pointer will be freed when the sub-procedure is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16_t connHandle, attPrepareWriteReq_t *pReq, uint8_t taskId ); + +/** + * @brief GATT implementation of the allocator functionality. + * + * @note This function should only be called by GATT and the upper layer protocol/application. + * + * @param connHandle - connection that message is to be sent on. + * @param opcode - opcode of message that buffer to be allocated for. + * @param size - number of bytes to allocate from the heap. + * @param pSizeAlloc - number of bytes allocated for the caller from the heap. + * @param flag - . + * + * @return pointer to the heap allocation; NULL if error or failure. + */ +extern void *GATT_bm_alloc( uint16_t connHandle, uint8_t opcode, uint16_t size, uint16_t *pSizeAlloc, uint8_t flag ); + +/** + * @brief GATT implementation of the de-allocator functionality. + * + * @param pMsg - pointer to GATT message containing the memory to free. + * @param opcode - opcode of the message + * + * @return none + */ +extern void GATT_bm_free( gattMsg_t *pMsg, uint8_t opcode ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param encKeySize - Minimum encryption key size required by service (7-16 bytes) + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service fields.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleInvalidRange: Encryption key size's out of range.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16_t numAttrs, + uint8_t encKeySize, gattServiceCBs_t *pServiceCBs ); + +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32_t services ); + +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * @note It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DeregisterService( uint16_t handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * @note Each client has its own instantiation of the ClientCharacteristic Configuration. + * Reads/Writes of the Client Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16_t connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16_t connHandle, uint8_t taskId ); + +/** + * @brief Read the client characteristic configuration for a given client. + * + * @note Each client has its own instantiation of the Client Characteristic Configuration. + * Reads of the Client Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16_t GATTServApp_ReadCharCfg( uint16_t connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given client. + * + * @note Each client has its own instantiation of the Client Characteristic Configuration. + * Writes of the Client Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8_t GATTServApp_WriteCharCfg( uint16_t connHandle, gattCharCfg_t *charCfgTbl, uint16_t value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t len, uint16_t offset, uint16_t validCfg ); + +/** + * @brief Set a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_SetParameter( uint8_t param, uint8_t len, void *value ); + +/** + * @brief Get a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_GetParameter( uint8_t param, void *value ); + +/** + * @brief Add function for the GAP GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GGS_AddService( uint32_t services ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuration + */ + +/** + * @brief Set a GAP Parameter value. Use this function to change the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAP_SetParamValue( uint16_t paramID, uint16_t paramValue ); + +/** + * @brief Get a GAP Parameter value. + * + * @note This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ +extern uint16_t GAP_GetParamValue( uint16_t paramID ); + +/** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE is selected, + * the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC or ADDRTYPE_PRIVATE_NONRESOLVE type + * NULL to auto generate otherwise the application can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed + * bleIncorrectMode: can't change with an active connection,or INVALIDPARAMETER + * If return value isn't SUCCESS, the address type remains the same as before this call. + */ +extern bStatus_t GAP_ConfigDeviceAddr( uint8_t addrType, uint8_t *pStaticAddr ); + +/** + * @brief Resolves a private address against an IRK. + * + * @param(in) pIRK - pointer to the IRK + * @param(in) pAddr - pointer to the Resolvable Private address + * + * @param(out) pIRK + * @param(out) pAddr + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ +extern bStatus_t GAP_ResolvePrivateAddr( uint8_t *pIRK, uint8_t *pAddr ); + +/** + * @brief Setup or change advertising and scan response data. + * + * @note if the return status from this function is SUCCESS,the task isn't complete + * until the GAP_ADV_DATA_UPDATE_DONE_EVENT is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted + * bleIncorrectMode: invalid profile role + */ +extern bStatus_t GAP_UpdateAdvertisingData( uint8_t taskID, uint8_t adType, uint16_t dataLen, uint8_t *pAdvertData ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GAP Bond API + */ +/** + * @brief Set a GAP Bond Manager parameter. + * + * @note You can call this function with a GAP Parameter ID and it will set the GAP Parameter. + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16_t param, uint8_t len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * @note You can call this function with a GAP Parameter ID and it will get a GAP Parameter. + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate data type. + * (example: data type of uint16_t will be cast to uint16_t pointer) + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16_t param, void *pValue ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed + * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16_t connectionHandle, uint8_t status, uint32_t passcode ); + +/** + * @brief Respond to a passcode request. + * + * @param connHandle - connection handle of the connected device or 0xFFFF if all devices in database. + * @param status - SUCCESS if oob data is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param oob - containing the oob data. + * @param c_peer - containing the peer confirm. + * + * @return SUCCESS - bond record found and changed + * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_OobRsp( uint16_t connHandle, uint8_t status, uint8_t *oob, uint8_t * c_peer ); + +/** + * @brief Initialization function for the ecc-function callback. + * + * @param pEcc - callback registration Structure @ref gapEccCBs_t. + * + * @return null. + */ +extern void GAPBondMgr_EccInit( gapEccCBs_t *pEcc ); + +/** + * @brief Send a security request + * + * @param connHandle - connection handle + * + * @return SUCCESS: will send + * bleNotConnected: Link not found + * bleIncorrectMode: wrong GAP role, must be a Peripheral Role + */ +extern bStatus_t GAPBondMgr_PeriSecurityReq( uint16_t connHandle ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GAPRole API + */ +/** + * @brief Set a GAP Role parameter. + * + * @note You can call this function with a GAP Parameter ID and it will set a GAP Parameter. + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on the parameter ID and + * WILL be cast to the appropriate data type (example: data type of uint16_t + * will be cast to uint16_t pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16_t param, uint16_t len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * @note You can call this function with a GAP Parameter ID and it will get a GAP Parameter. + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16_t param, void *pValue ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateLink( uint16_t connHandle ); + +/** + * @brief Read Rssi Cmd. + * + * @param connHandle - connection handle + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_ReadRssiCmd( uint16_t connHandle ); + +/** + * @brief used to synchronize with a periodic advertising train from an advertiser and + * begin receiving periodic advertising packets. + * + * @param pSync - sync parameters@ gapCreateSync_t + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_CreateSync( gapCreateSync_t *pSync ); + +/** + * @brief used to cancel the HCI_LE_Periodic_Advertising_Create_Sync command while + * it is pending. + * + * @param None. + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_CancelSync( void ); + +/** + * @brief used to stop reception of the periodic advertising train identified + * by the Sync_Handle parameter. + * + * @param syncHandle-identifying the periodic advertising train + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_TerminateSync( uint16_t syncHandle ); + +/** + * @brief used to instruct the Controller to send synchronization information about the periodic + * advertising in an advertising set to a connected device. + * + * @param pSync - sync parameters@ gapSyncTransferParam_t + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_SyncTransferParameters( gapSyncTransferParam_t *pSync ); + +/** + * @brief used to instruct the Controller to send synchronization information about the periodic + * advertising train identified by the Sync_Handle parameter to a connected device. + * + * @param pSync - sync parameters@ gapSyncTransferSync_t + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_SyncTransferSync( gapSyncTransferSync_t *pSync ); + +/** + * @brief used to instruct the Controller to send synchronization information about the periodic + * advertising in an advertising set to a connected device. + * + * @param pSync - sync parameters@ gapSyncTransferAdvertising_t + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_SyncTransferAdvertising( gapSyncTransferAdvertising_t *pSync ); + +/** + * @brief Update the link connection parameters. + * + * @param connHandle - connection handle + * @param connIntervalMin - minimum connection interval in 1.25ms units + * @param connIntervalMax - maximum connection interval in 1.25ms units + * @param connLatency - number of LL latency connection events + * @param connTimeout - connection timeout in 10ms units + * + * @return SUCCESS: Connection update started started.
+ * bleIncorrectMode: No connection to update.
+ */ +extern bStatus_t GAPRole_UpdateLink( uint16_t connHandle, uint16_t connIntervalMin, + uint16_t connIntervalMax, uint16_t connLatency, uint16_t connTimeout ); + +/** + * @brief Update the connection phy. + * + * @param connHandle - connection handle + * @param all_phys - a bit field that allows the Host to specify, for each direction + * set BIT0:The Host has no preference among the transmitter PHYs supported by the Controller + * set BIT1:The Host has no preference among the receiver PHYs supported by the Controller + * @param tx_phys - a bit field that indicates the transmitter PHYs.(GAP_PHY_BIT_TYPE) + * @param rx_phys - a bit field that indicates the receiver PHYs.(GAP_PHY_BIT_TYPE) + * @param phy_options - preferred coding when transmitting on the LE Coded PHY(GAP_PHY_OPTIONS_TYPE) + * + * @return SUCCESS: PHY update started started .
+ * bleIncorrectMode: No connection to update.
+ */ +extern bStatus_t GAPRole_UpdatePHY( uint16_t connHandle, uint8_t all_phys, uint8_t tx_phys,\ + uint8_t rx_phys, uint16_t phy_options ); + +/** + * @brief used to allow the Host to specify the privacy mode to be used for a given entry on the resolving list. + * + * @note This command shall not be used when address resolution is enabled in the Controller and: + * Advertising (other than periodic advertising) is enabled, + * Scanning is enabled, or + * an GAPRole_CentralEstablishLink, or GAPRole_CreateSync command is pending. + * + * @param addrTypePeer - 0x00:Public Identity Address 0x01:Random (static) Identity Address + * @param peerAddr - Public Identity Address or Random (static) Identity Address of the advertiser + * @param privacyMode - 0x00:Use Network Privacy Mode for this peer device (default) + * 0x01:Use Device Privacy Mode for this peer device + * + * @return Command Status. + * + */ +extern bStatus_t GAPRole_SetPrivacyMode( uint8_t addrTypePeer, uint8_t *peerAddr, uint8_t privacyMode ); + +/** + * @brief used to set the path loss threshold reporting parameters. + * + * @param pParm - set path loss parameters@ gapRoleSetPathLossReporting_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPRole_SetPathLossReporting( gapRoleSetPathLossReporting_t *pParm ); + +/** + * @brief used to set power level management. + * + * @param pParm - set power level parameters@ gapRolePowerlevelManagement_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPRole_SetPowerlevel( gapRolePowerlevelManagement_t *pParm ); + +/** + * @brief used to set the parameters for pawr advertising.. + * + * @param pParm - set pawr parameters@ gapPawrSetParam_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPPawr_SetParameters( gapPawrSetParam_t *pParm ); + +/** + * @brief used to set the data for one or more subevents of PAwR in reply to an + * HCI_LE_Periodic_Advertising_Subevent_Data_Request event. + * + * @param advHandle - advertising handle + * @param numSubevents - the number of subevent data contained in the parameter arrays. + * @param pParm - The arrayed parameter @ gapPawrSetResponseData_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPPawr_SetSubeventData( uint8_t advHandle, uint8_t numSubevents, gapPawrSetData_t *pParm ); + +/** + * @brief used by the Host to set the data for a response slot in a specific subevent + * of the PAwR identified by the Sync_Handle. + * + * @param pParm - The parameter @ gapPawrSetResponseData_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPPawr_SetResponseData( gapPawrSetResponseData_t *pParm ); + +/** + * @brief used to create an ACL connection between a periodic advertiser and a synchronized device. + * + * @param pParm - The parameter @ gapPawrCreateConnection_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPPawr_CreatConnection( gapPawrCreateConnection_t *pParm ); + +/*------------------------------------------------------------------- + * FUNCTIONS - BROADCASTER_PROFILE_API Broadcaster Profile API + */ +/** + * + * @brief Initialization function for the GAP Role Task. + * + * @param None. + * + * @return SUCCESS,bleInvalidRange + */ +extern bStatus_t GAPRole_BroadcasterInit( void ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_BroadcasterStartDevice( gapRolesBroadcasterCBs_t *pAppCallbacks ); + +/** + * @brief Does the Broadcaster receive scan request call initialization. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return None + */ +extern void GAPRole_BroadcasterSetCB( gapRolesBroadcasterCBs_t *pAppCallbacks ); + +/*------------------------------------------------------------------- + * FUNCTIONS - OBSERVER_PROFILE_API Observer Profile API + */ +/** + * @internal + * + * @brief Observer Profile Task initialization function. + * + * @param None. + * + * @return SUCCESS,bleInvalidRange + */ +extern bStatus_t GAPRole_ObserverInit( void ); + +/** + * @brief Start the device in Observer role. This function is typically + * called once during system startup. + * + * @param pAppCallbacks - pointer to application callbacks + * + * @return SUCCESS: Operation successful.
+ * bleAlreadyInRequestedMode: Device already started.
+ */ +extern bStatus_t GAPRole_ObserverStartDevice( gapRoleObserverCB_t *pAppCallbacks ); + +/** + * @brief Start a device discovery scan. + * + * @param mode - discovery mode: @ref GAP_DEVDISC_MODE_DEFINES + * @param activeScan - TRUE to perform active scan + * @param whiteList - TRUE to only scan for devices in the white list + * + * @return SUCCESS: Discovery scan started.
+ * bleIncorrectMode: Invalid profile role.
+ * bleAlreadyInRequestedMode: Not available.
+ */ +extern bStatus_t GAPRole_ObserverStartDiscovery( uint8_t mode, uint8_t activeScan, uint8_t whiteList ); + +/** + * @brief Cancel a device discovery scan. + * + * @return SUCCESS: Cancel started.
+ * bleInvalidTaskID: Not the task that started discovery.
+ * bleIncorrectMode: Not in discovery mode.
+ */ +extern bStatus_t GAPRole_ObserverCancelDiscovery( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - PERIPHERAL_PROFILE_API Peripheral Profile API + */ +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param None. + * + * @return SUCCESS,bleInvalidRange + */ +extern bStatus_t GAPRole_PeripheralInit( void ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_PeripheralStartDevice( uint8_t taskid, gapBondCBs_t *pCB, gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Update the parameters of an existing connection + * + * @param connHandle - the connection Handle + * @param connIntervalMin - minimum connection interval in 1.25ms units + * @param connIntervalMax - maximum connection interval in 1.25ms units + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param taskId - taskID will recv L2CAP_SIGNAL_EVENT message + * + * @return SUCCESS, bleNotConnected or bleInvalidRange + */ +extern bStatus_t GAPRole_PeripheralConnParamUpdateReq( uint16_t connHandle, uint16_t connIntervalMin, + uint16_t connIntervalMax, uint16_t latency, uint16_t connTimeout, uint8_t taskId ); + +/*------------------------------------------------------------------- + * FUNCTIONS - CENTRAL_PROFILE_API Central Profile API + */ +/** + * @internal + * + * @brief Central Profile Task initialization function. + * + * @param None. + * + * @return SUCCESS,bleInvalidRange + */ +extern bStatus_t GAPRole_CentralInit( void ); + +/** + * @brief Start the device in Central role. This function is typically + * called once during system startup. + * + * @param pAppCallbacks - pointer to application callbacks + * + * @return SUCCESS: Operation successful.
+ * bleAlreadyInRequestedMode: Device already started.
+ */ +extern bStatus_t GAPRole_CentralStartDevice( uint8_t taskid, gapBondCBs_t *pCB, gapCentralRoleCB_t *pAppCallbacks ); + +/** + * @brief Start a device discovery scan. + * + * @param mode - discovery mode: @ref GAP_DEVDISC_MODE_DEFINES + * @param activeScan - TRUE to perform active scan + * @param whiteList - TRUE to only scan for devices in the white list + * + * @return SUCCESS: Discovery scan started.
+ * bleIncorrectMode: Invalid profile role.
+ * bleAlreadyInRequestedMode: Not available.
+ */ +extern bStatus_t GAPRole_CentralStartDiscovery( uint8_t mode, uint8_t activeScan, uint8_t whiteList ); + +/** + * @brief Cancel a device discovery scan. + * + * @return SUCCESS: Cancel started.
+ * bleInvalidTaskID: Not the task that started discovery.
+ * bleIncorrectMode: Not in discovery mode.
+ */ +extern bStatus_t GAPRole_CentralCancelDiscovery( void ); + +/** + * @brief This API is called by the Central to update the Host data channels + * initiating an Update Data Channel control procedure. + * + * @note While it isn't specified,it is assumed that the Host expects an + * update channel map on all active connections and periodic advertise. + * + * input parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used". + * + * @return SUCCESS + */ +extern void GAPRole_SetHostChanClassification( uint8_t *chanMap ); + +/** + * @brief Establish a link to a peer device. + * + * @param highDutyCycle - TRUE to high duty cycle scan, FALSE if not + * @param whiteList - determines use of the white list: TRUE-enable + * @param addrTypePeer - address type of the peer device: @ref GAP_ADDR_TYPE_DEFINES + * @param peerAddr - peer device address + * + * @return SUCCESS: started establish link process.
+ * bleIncorrectMode: invalid profile role.
+ * bleNotReady: a scan is in progress.
+ * bleAlreadyInRequestedMode: can't process now.
+ * bleNoResources: too many links.
+ */ +extern bStatus_t GAPRole_CentralEstablishLink( uint8_t highDutyCycle, uint8_t whiteList, uint8_t addrTypePeer, uint8_t *peerAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - RF_PHY Profile API + */ + +/** + * @brief RF_PHY Profile Task initialization function. + * + * @param None. + * + * @return 0 - success. + */ +extern bStatus_t RF_RoleInit( void ); + +/** + * @brief rf config. + * + * @param pConfig - rf config parameters + * + * @return 0 - success. + */ +extern bStatus_t RF_Config( rfConfig_t *pConfig ); + +/** + * @brief rx mode. + * + * @param txBuf - rx mode tx data + * @param txLen - rx mode tx length(0-251) + * @param pktRxType - rx mode rx package type + * broadcast type(0xFF):receive all matching types, + * others:receive match type or broadcast type + * @param pktTxType - rx mode tx package type(auto mode) + * broadcast type(0xFF):received by all matching types; + * others:only received by matching type + * + * @return 0 - success. 1-access address error 2-busy + */ +extern bStatus_t RF_Rx( uint8_t *txBuf, uint8_t txLen, uint8_t pktRxType, uint8_t pktTxType ); + +/** + * @brief tx mode. + * + * @param txBuf - tx mode tx data + * @param txLen - tx mode tx length(0-251) + * @param pktTxType - tx mode tx package type + * broadcast type(0xFF):received by all matching types; + * others:only received by matching type + * @param pktRxType - tx mode rx package type(auto mode) + * broadcast type(0xFF):receive all matching types, + * others:receive match type or broadcast type + * + * @return 0 - success. 1-access address error 2-busy + */ +extern bStatus_t RF_Tx( uint8_t *txBuf, uint8_t txLen, uint8_t pktTxType, uint8_t pktRxType ); + +/** + * @brief shut down,stop tx/rx mode. + * + * @param None. + * + * @return 0 - success. + */ +extern bStatus_t RF_Shut( void ); + +/** + * @brief rf mode set radio channel/frequency. + * + * @param channel. + * + * @return 0 - success. + */ +extern void RF_SetChannel( uint32_t channel ); + +/** + * @brief rf mode set radio frequency and whitening channel index + * note: LLEMode bit6 set 1 + * + * @param frequency - + * @param ch - the whitening channel index + * + * @return 0 - success. + */ +extern bStatus_t RF_SetFrequency( uint32_t frequency, uint8_t ch ); + +/** + * @brief shut down rf frequency hopping + * + * @param None. + * + * @return None. + */ +extern void RF_FrequencyHoppingShut( void ); + +/** + * @brief + * + * @param resendCount - Maximum count of sending HOP_TX pdu,0 = unlimited. + * + * @return 0 - success. + */ +extern uint8_t RF_FrequencyHoppingTx( uint8_t resendCount ); + +/** + * @brief + * + * @param timeoutMS - Maximum time to wait for receiving HOP_TX pdu(Time = n * 1mSec),0 = unlimited. + * + * @return 0 - success.1-fail.2-LLEMode error(shall AUTO) + */ +extern uint8_t RF_FrequencyHoppingRx( uint32_t timeoutMS ); + +/** + * @brief Erase FH bonded device + * + * @param None. + * + * @return None. + */ +extern void RF_BondingErase( void ); + +/** + * @brief single channel mode. + * + * @param ch - rf channel,f=2402+ch*2 MHz, ch=0,...,39 + * + * @return 0 - success. + */ +extern bStatus_t LL_SingleChannel( uint8_t ch ); + +/** + * @brief used to stop any test which is in progress. + * + * @param(in) pPktNum - null + * + * @param(out) the number of received packets. + * + * @return 0 - success. + */ +extern bStatus_t LL_TestEnd( uint8_t *pPktNum ); + +/** + * @brief used to start a test where the DUT receives test reference packets at a fixed interval + * + * input parameters + * + * @param opcode = 0x201D + * pParm0 - RX_Channel + * + * opcode = 0x2033 + * pParm0 - RX_Channel + * pParm1 - PHY + * pParm2 - Modulation_Index + * + * @return 0 - success. + */ +extern bStatus_t API_LE_ReceiverTestCmd( uint8_t *pParm, uint16_t opcode ); + +/** + * @brief used to start a test where the DUT generates test reference packets at a fixed interval + * + * @param opcode = 0x201E + * pParm 0 - TX_Channel + * pParm 1 - Test_Data_Length + * pParm 2 - Packet_Payload + * + * opcode = 0x2034 + * pParm 0 - TX_Channel + * pParm 1 - Test_Data_Length + * pParm 2 - Packet_Payload + * pParm 3 - PHY + * + * @return 0 - success. + */ +extern bStatus_t API_LE_TransmitterTestCmd( uint8_t *pParm, uint16_t opcode ); + +/** + * @brief used to stop any test which is in progress + * + * @param None + * + * @return 0 - success. + */ +extern bStatus_t API_LE_TestEndCmd( void ); + +/** + * @brief used to set sensitivity level + * + * @param None + * + * @return None. + */ +extern void RFEND_SetSensitivity( void ); + +/** + * @brief used to set rf TxCtune value + * + * @param pParm(in) - Must provide length of parameter followed by 6 bytes parameter + * + * @return Command Status. + */ +extern bStatus_t RFEND_TXCtuneSet( uint8_t *pParm ); + +/** + * @brief used to get rf TxCtune value + * + * @param pParm(out) - length of parameter(6) followed by 6 bytes parameter + * + * @return Command Status. + */ +extern bStatus_t RFEND_TXCtuneGet( uint8_t *pParm ); + +/* + * END @ Profile API + */ +/******************************************************************************/ +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/lib/libwchble.a b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/lib/libwchble.a new file mode 100755 index 000000000..57da5ba23 Binary files /dev/null and b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/lib/libwchble.a differ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/lib/wchble_rom.hex b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/lib/wchble_rom.hex new file mode 100755 index 000000000..0ea28aca8 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/lib/wchble_rom.hex @@ -0,0 +1,12005 @@ +:020000024000BC +:100000006FE0E20600000000001801180028012837 +:100010000228032800290129022903290429052986 +:10002000062907290829002A012A022A032A042A64 +:10003000052AA62A90E80600343404004204002071 +:10004000BC040020CA0300209C03002032030020CF +:10005000D635040016360400B4370400343A0400E0 +:10006000183B040094320400463204008C02002045 +:1000700036020020D23F0400D0070020AC35040037 +:10008000DA3C04007A8406005C860600C886060016 +:100090007A390600B2390600146A0500885D050049 +:1000A000D87E06000A3D0400C24106007AF0040032 +:1000B0000AF1040064F10400FA470400384804001F +:1000C000B8460400A2B20400BEAD0400480A0020F5 +:1000D000F6BE04005CC20400DEA0040080A00400A0 +:1000E00042A404002AA104005EA00400D6A00400DB +:1000F00014A00400A4A10400FCA10400ACA104000D +:10010000B0A1040046A2040004A2040034A204002A +:10011000F4A60400F8A60400A0A10400A8A104000D +:1001200044A20400F6A60400F2A2040052A80400AF +:10013000BACF04002ED0040068D00400EEB404004E +:1001400004B504003CB5040086950400AC97040097 +:10015000889804009E650400346004009A8B0400B3 +:10016000B0600400E2860400C2C5060012BE0600AC +:10017000FEC2060020DA0600ECD806004ADD0600C2 +:1001800006DD060042DD060096DE0600EEAC060047 +:1001900026DE06007CD00600A2D00600C2D00600F3 +:1001A00006DF0600F2D6060090D6060076DF0600CF +:1001B00072AF060006B0060026B00600D8AF0600F3 +:1001C00094610600984C0600EE4F0600D64D0600DE +:1001D000B0570600307F0600727E060022AD060092 +:1001E00056410400C2390600A24106009A420600A8 +:1001F0003A750600C675060048770600C8B80400C0 +:100200007E60060044580600744A0600025B060041 +:10021000484C0600BA0900202E3A060070DD0600A0 +:100220000ADD06003EDD06003ADD0600BE390400A8 +:1002300032B6040078DD060080630600E464060040 +:100240005065060064C3060074DD0600BEDD0600CE +:10025000145D0500C2DD060068250020802E002008 +:1002600044C30600E2C40600C6DD06001ADE06002E +:100270001EDE06007CDD0600B6DD0600BADD0600E7 +:1002800022DE0600406106000000000000000000C1 +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C0006373B60082801C419105110523AEF5FED3 +:1002D000C5BFB737002037370020938787F413074F +:1002E00047666373F700828023A007009107D5BF9C +:1002F000411122C4B747024006C603A4C72023A663 +:1003000007200F10000011C199E5B747024023A64E +:100310008720014545A093073500C207C183F19BA3 +:10032000C207C183130740036366F7023737002013 +:100330000325471E373700208326C71D6391A60279 +:10034000373700200327072769D3C207DD8D05450E +:10035000029765BF373700200325071EE1BF7A21CA +:1003600031EF5A21636CF704B73600203306F740AB +:1003700021489386C61E6375C8028328050003D8EA +:100380006600138687001D8F2A9661175AA22320C4 +:1003900016012313060010C15EA1130788FFFAA2FD +:1003A0006EA1EE222105B387F540FEA2B7470240B9 +:1003B00023A68720B2402244410182800841BDBF6C +:1003C000B747024003A8C72023A607200F1000004C +:1003D00001E523A607218280B737002003AE471E20 +:1003E000B737002003A3C71D8146F28763FE670865 +:1003F00083A80700636DF50863EBA80813878700DF +:100400006364E508F223216705076319E6003736C0 +:100410000020034746FF0507230AE6FE3736002083 +:100420001305C61ECE237A21239307001306C61E8A +:100430002E97420741837AA16383C7033735002093 +:100440000325051E630DF500EA2211E9DE2223A033 +:1004500016012107BE95A105CEA27AA2B6879843C0 +:1004600063046702B736002083A6061E630ED7001A +:10047000762399EAD6234E231843A106AE96D6A337 +:1004800098C37E22A1077EA2B747024099B7BE86D5 +:10049000C687A9BFB7370020B736002083A7471EFD +:1004A00003A6C61D2A87B305B5406314F6003A8536 +:1004B00029A8938687009C43E369D7FEE377F7FE7C +:1004C0002E85E3E4D5FEE3F2F5FE828023AC05FE43 +:1004D0001C4181E70CC18280BA8703A787FF6DFFAB +:1004E00023ACB7FE8280411126C24AC0B744024005 +:1004F00006C622C403A9C42023A604200F100000AE +:1005000009E923A62421B240224492440249410130 +:1005100082802A842105BD654205C18D4181C93B88 +:1005200011C9FD572320050042A17CA123A6242147 +:100530002105D1BF23A624210145F1B701114AC8E5 +:100540004EC6B747024006CE22CC26CA83A9C72092 +:100550002A8923A607200F10000037350020032426 +:10056000851E8144014609E889ECA1654A859730DA +:1005700004E0E780607725A08347E4FF639D2703BD +:10058000A1C0A6851305851E973004E0E78000F51D +:1005900069DCA1654A85973004E0E780002FF240CE +:1005A0006244B747024023A6372126854249D244F8 +:1005B000B2490561828091E02286032484FF65B7F9 +:1005C000A284E5BFB737002083A7872399E33E8540 +:1005D0008280BA236315B7009823E30AA7FEDC479D +:1005E000F5B7B747024003A7C72023A607200F107F +:1005F000000001C599C1814711E6B747024023A613 +:10060000E7208280B386F50003C80600B306F50034 +:10061000850723800601E317F6FEC5B7374702407A +:100620008327C720232607200F10000019C191C17E +:1006300011E6374702402326F7208280910503A761 +:10064000C5FF11057D16232EE5FEDDB737470240B5 +:100650008327C720232607200F10000001C533077A +:10066000C50011E6374702402326F72082800505A2 +:10067000A30FB5FEE31DE5FEF5B7B747024083A61D +:10068000C72023A607200F10000081473307F5007D +:100690000307070019E7374702402326D7203E8586 +:1006A00082808507E5B7011126CA4AC8B7470240CC +:1006B00006CE22CC83A4C7202A892E8623A6072013 +:1006C0000F100000131506019305F004418132C696 +:1006D00005312A8401C53246CA8521372285F24078 +:1006E0006244B747024023A697204249D24405619D +:1006F0008280B747024003A7C72023A607200F1018 +:10070000000001C599C1814711EAB747024023A6FD +:10071000E720054582808507E309F6FE3308F500EA +:10072000B386F500034808009422E306D8FEB747D5 +:10073000024023A6E72001458280B747024003A775 +:10074000C72023A607200F1000009307F6FFBE95D1 +:100750002A966317C500B747024023A6E720828088 +:10076000FD159C310505A30FF5FEE5B7374702409F +:100770008327C720232607200F10000001C5330759 +:10078000C50019E6374702402326F720014582803D +:1007900005058346F5FFE397B6FEE31BE5FE374705 +:1007A00002402326F72005458280797126D2B7348E +:1007B000002022D403A4842306D64AD04ECE52CCA5 +:1007C00056CA5AC85EC662C455C4373A0020373983 +:1007D0000020B7390020814BB73A002037CBC90140 +:1007E000130ACA231309C91E938949283E2099EF89 +:1007F0005C44639A0B0023ACF422032CC4002285D2 +:10080000C1366284A9A823A6FB00C5BF83A70A231B +:1008100082971C443307F5406376F50003A749002F +:100820001D8F2A979306FB3763EAE6062328090003 +:100830002E200820973004E0E78020055C405844D3 +:10084000B1C70C4403A64900AE97BE8663E4B70067 +:1008500063E4C700B386C74014C4A28B3A8459F43A +:10086000B73700209387C71E984B854663FCE60484 +:100870007D1798CBB250225492540259F249624AE1 +:10088000D24A424BB24B224C4561828063950B00A9 +:1008900023ACE4229DB723A6EB0085B703278A0289 +:1008A00019CB63EDA7003385A74083270901637443 +:1008B000F5002328A900A28B404455B703A749009F +:1008C000BA97D5B723A8070075B701114EC6B74729 +:1008D000024006CE22CC26CA4AC852C483A9C720E9 +:1008E00023A607200F100000373400209307442868 +:1008F000C843DC2713044428B9CFB73700209387B7 +:10090000874003D7470B21CB83A4070B6385A4043F +:10091000B73700201387C71E184B138AC71E630FF3 +:10092000A70E3739002083270923829763E5A40E99 +:1009300083270923898C829703270A0163F3E40044 +:100940002687B307A7003E85544063E4E70063E4CD +:10095000D7003385D740B747024023A637215C40F4 +:10096000639DA702B73400209384C41E9848B7370C +:10097000002083A707236315A70A82975440B7472F +:1009800036FE938707C8B6973387A7003A85636416 +:10099000F7006364D7003305D740B734002093874E +:1009A0004456DC539384445699CBB737002083A632 +:1009B000075E3707CDFF7D179C46F98F9CC611E176 +:1009C00048408547DCC4B737002083A74726829775 +:1009D00005E1DC5089CFDC4499CB974006E0E78005 +:1009E000E0CC973006E0E780202A23A60400753B80 +:1009F000DC5091CBB737002003A7075EB706330062 +:100A00001C47D58F1CC7F2406244D2444249B249C8 +:100A1000224A056182805C40BE9419BF268525BFAD +:100A2000829794485840B387A6003E8563E4D70078 +:100A3000E3E5E7F63385E7408DB7B737002023A419 +:100A4000A7F411C5B737002005472386E7F4828055 +:100A5000B737002003A787F4411122C406C61384C8 +:100A600087F411C30297B737002083C7C7F493F701 +:100A7000F70F99E323200400B24022444101828011 +:100A8000011126CAB734002022CC4AC893874428D3 +:100A900006CE4EC652C456C2DC2737390020938496 +:100AA00044281304892195E3B737002093874756DC +:100AB000D833058B19CBF8339946639BE60AA3829A +:100AC0000700EF10B0645C4482971C4491C3829786 +:100AD00037340020B73900209307C41E03A74923E9 +:100AE0009033130AC41E8347C41E93961700BA9608 +:100AF0009622C9CA8347C41E63EEC7082306041E94 +:100B000037340020930744569C37130444566391AE +:100B10000710B737002083A70723F5C3DC4023283D +:100B2000FA006131B737002083A74726E9CB7C3034 +:100B300011476366F70CB73700209387075BDC2704 +:100B4000918BD5EFB737002083C7C7F493F7F70F22 +:100B5000DDE783461A0003A6492363C7D70C624426 +:100B6000F240D2444249B249224A924A0561B1BB9D +:100B7000F8339D46E39BE6F4A3820700EF1010597B +:100B80001C4899B7850793F7F70F2306F41EE3EC8B +:100B9000C7F48DB786073E970E2323100700034541 +:100BA000C41EB737002083A7472113172500B73A83 +:100BB0000020BA979C4323960A22829783D7CA22A1 +:100BC0000347C41E93C7F7FF7D8D9317170003A734 +:100BD00049233E971E235D8D0AA38347C41E81C708 +:100BE00085072306F41E8327892181C78297232C3A +:100BF00009200347C41E83471A00E371F7F0F2404F +:100C00006244D2444249B249224A924A05618280F2 +:100C10007C3093F7F70FE39E07EEA30404009730B0 +:100C200006E0E780C054F5B51397170032971A23F2 +:100C300079F785071DB7374702408326C720F1772C +:100C4000FD17F58F2326F72001000100B73700209C +:100C50009387C71EC84F832787262326D7206A0578 +:100C600093C7F7FF99835D8D8280B737002083C7D4 +:100C7000F71E89CFB737002083C7072991CBB73735 +:100C8000002003A3472963070300028305458280F0 +:100C9000094582801305F00F8280B737002003C614 +:100CA0004740B737002003A747FC81476315F6008C +:100CB000814636858280BA8613078702835587FD71 +:100CC000E389A5FE850793F7F70FCDB7B737002067 +:100CD00003C75740B737002083A707FE2A860507BA +:100CE00081463E859E236388C7008506930765007D +:100CF000E3E9E6FE01458280B737002003A787FDC0 +:100D000019E3014615A81C4703D8A700636B05012A +:100D100083584700B38608016355D5008146639424 +:100D200016011843F1BF3E86C10703D3A7FF63171F +:100D3000A30099C123900501328582808506C206F1 +:100D4000C182F1BFB737002003C64740B737002044 +:100D500003A7473A81476315F600814636858280AE +:100D6000BA861307C703835567FCE389A5FE850789 +:100D700093F7F70FCDB7032785116DCB411122C42F +:100D800006C65C258345E5042A8493F7C70F5CA556 +:100D90001437522713958601618563F7C5066351A1 +:100DA0000506082793F6F60714B7054693E62700CD +:100DB0006314C50093E6170054A45C4389075CC321 +:100DC0004CB8032504112E864C430905EFF07F81B2 +:100DD000832784115038D443DA27B296118FD4C3B5 +:100DE000DAA789473CBCB73700200347640383C7B1 +:100DF000E7246371F7045C2493E707015CA41DA852 +:100E000093E717005CA46DBF9376F60F6359050254 +:100E10000827854513E627006314B50013E617007D +:100E200050A454B8A304070085473CBC8327841111 +:100E30009C43D5FBB240224401454101828093E7A7 +:100E400017005CA454B8A3040700032504114C4305 +:100E50000905EFF00FF9832784115038D443DA27BE +:100E6000B296118FD4C3DAA78D47C1B705458280EA +:100E7000B737002083A74753411122C406C6858B8C +:100E80002A84D5E34165130525F5977005E0E780D1 +:100E900080DC51C93C253EA583270412ADE3232005 +:100EA000A4122322A41285472311F4042320050051 +:100EB0007C2854415EA5583418A5054718B5373726 +:100EC0000020032787581385170215811C437D15C1 +:100ED0001375F50F9CC25C43DCC21C479CC65C4783 +:100EE000DCC61C4B9CCA5C4BDCCA1C4F9CCE5C4FC6 +:100EF000DCCE19CD9386060213070702C1BF8327F4 +:100F0000441288C3835724042322A412850769BF8F +:100F1000B7370020938787409A2705079AA7B240E2 +:100F20002244410182805C2423090400054593C7C3 +:100F300047005CA4EDB71C2D93F7E70FC5EB1C3DF4 +:100F4000D5E73029542509CA373700208345650382 +:100F50000347F72463E7E50013F7060149CB014790 +:100F600009C6C18A0357251E81C68356651E36975A +:100F70003DCFB737002003D5C7281307C712374620 +:100F80000F00B335A702411113060624814622C47F +:100F900026C206C67D543305A70297D006E0E78037 +:100FA0000042B737002083C73725B384A700B7377F +:100FB000002003A7474A8327070963F387003E847D +:100FC000184375FBB737002083A707238297814713 +:100FD0006364A400B307A440B2402244B3B79700AF +:100FE00093C7170092443E854101828081473E8528 +:100FF0008280B737002003A7C7587C53FDFF82804B +:1010000001114EC6B73900209387894022CC03A432 +:10101000470A26CAB7340020938744289E274AC827 +:10102000035964080325040906CE3309F902B747BA +:101030000F001387F7239387072452C456C25AC060 +:1010400093898940938444283A993359F902636D0E +:101050002503373A002083270A2333092541829745 +:101060006367A9023309A940634609028357040450 +:10107000A30F040085072310F4048347041463942A +:1010800007102285CD2D11A2DC403E95D9B7DC405A +:101090003E99C9BF83270A23829703278408636F79 +:1010A000E508198D7E3C9A248E07B387E702130763 +:1010B000003293870719B3D7E70263E5A708B74A59 +:1010C0000F00138BFA23938A0A248357040485079D +:1010D0002310F4048347041499E32285692D2285A3 +:1010E000976005E0E78020C8631D05248326040976 +:1010F0008327C408D840B6973E8563E4D70063E4ED +:10110000E7003385E7407C3C035964082328A408A2 +:1011100085077CBC9E243309F9025A993359590337 +:10112000636C25053309254183270A238297636968 +:10113000A9043305A940E34A05F80DBFDC40998FA7 +:101140003E958DB7A1452285976005E0E780E0B91F +:10115000A305A402B737002003A307276303031ED8 +:101160006244F240D2444249B249224A924A024B76 +:101170008945154505610283330927412A996DB7D1 +:10118000DC403E997DB72285512D2285976005E090 +:10119000E78060BD6317051A8A2483576408B74641 +:1011A0000F001386F623B387A7029386062403272E +:1011B0000409230B040283AA4400B297B3D7D702D1 +:1011C000636BF718B307F7408326C4082324F40899 +:1011D000014BB387E6003E8963E4D70063E457011F +:1011E000338957411E3023282409A1CB8356040498 +:1011F0005A3037460F0056B03387E640B387E702D0 +:101200003A301306062481468145BA97C207C18346 +:101210003385A7023EB097D006E0E780401A11CD93 +:101220004A95333925012E99AA8763142B016364EB +:101230005501B30755412328F40883270A238297D1 +:101240002A8983270A238297E30D25FF83270A2310 +:101250000329840882976365A9103305A9406302B6 +:10126000051283DA84008357640837490F00130797 +:10127000F923B387570313090924BA97B3D7270370 +:101280003737002003473725BA9763ECA70EB335ED +:101290002503035A2402568681463305250397D039 +:1012A00006E0E780C011330BAA0033055A03374626 +:1012B0000F00130606248146814597D006E0E7809B +:1012C00000100DC1B337250356868146B305B90218 +:1012D0003305A902BE9597D006E0E780400E33059E +:1012E000AA402AB03545973006E0E780E0F823A20F +:1012F000890A383485476318F706930700FD7CA4F4 +:10130000B737002003A5C754DC24B5C7EFF0EFF2D0 +:10131000B736002003A6C658B73700209387475634 +:101320001547F8B35846F977FD17F98F5CC60F10CB +:10133000000083A7C6588966060B94C723A26707D7 +:10134000D8C7F2406244D2444249B249224A924A42 +:10135000024B05618280B3065701B387F640ADB5F5 +:10136000DC403E99DDBD930710FC7CA4B73700201C +:1013700003A5475451BF8145973004E0E780C0AED4 +:1013800041BFDC2423A2090A85C3B737002003A587 +:10139000C753973004E0E780C0E7B7E700E03707BE +:1013A000000223A2E72071BF83479402854562446F +:1013B000F240D2444249B249224A924A024BB39582 +:1013C000F500C205C18101450561172304E06700EE +:1013D000C34B011122CC4AC84EC606CE26CA52C4FF +:1013E00056C25AC0383585472A842E898329050973 +:1013F0006315F71E83570508035BC503373A0020C2 +:1014000093064A2883DA8600130A4A2863FF67197D +:101410001429639CE618032785116318071803270E +:10142000450A6314071874351D476390E6182A3D72 +:10143000330BFB409307204E330565038324440997 +:1014400037460F001306062481463305F502B737E9 +:10145000002083C72725B3549502B3B5AA02BE94D2 +:10146000C204C180231394083385AA0297D006E0F2 +:10147000E780E0F4AA9933B5A9002E954E8783271B +:101480004A0019E163E4F9003387F940B384540357 +:10149000B7460F009387F623938606242320E9009E +:1014A000BE94B3D4D40293171B00A6976369F70EBA +:1014B0001D8F2320E900B739002083A70923832447 +:1014C0000900829763EEA4103385A440635D050A8A +:1014D00083A70923373B0020130B4B288297032750 +:1014E00009006365E510198D7E3C03578B008E075C +:1014F000B387E7021307003293870719B3D7E702D0 +:1015000063EBA70E374A0F00930AFA23130A0A2443 +:101510008357040485072310F4048347041499E3D4 +:101520002285912C2285976005E0E780C0836DE1DC +:10153000832604098327C40803274B00B6973E85FA +:1015400063E4D70063E4E7003385E7407C3C8354E1 +:1015500064082328A40885077CBC83578B00B384C8 +:10156000F402D694B3D444036363950CB30495405A +:1015700083A7092323209900829763EEA40A338569 +:10158000A440E34705F8B737002083C7372563E257 +:10159000A708B737002023A6874A01459DA88326C0 +:1015A0004A00B387F6403E9729B783576408374708 +:1015B0000F00B38457039307F723A69793040724D8 +:1015C000B3D4970263E79900B3849940232099002C +:1015D000DDB583274A00BE99C5BF23A03501E1BD13 +:1015E000B737002083A78728BE94F9BD83274B0017 +:1015F000998F3E95D5BDA1452285975005E0E7809E +:10160000C06EA305A402B737002083A7072781EF88 +:101610007D55F2406244D2444249B249224A924A3C +:10162000024B05618280894515458297D5B7B30481 +:101630009740AA9435BF83274B00BE9489B721CD2C +:1016400001116C0022CC06CE2A84613339C1FD57CA +:101650006307F502B73600209386C623FC3A9456FA +:10166000324791C285836360F702B307F7403EC6F5 +:10167000B24503459402972004E0E780E036F2404B +:10168000624405618280B736002083A6862836979B +:10169000E9BFBD32EDB78280B7370020797113877B +:1016A00087404AD00329C70906D622D426D24ECE77 +:1016B00052CC56CA094763000906B7340020938A02 +:1016C000874093874456FC339546938444560D4790 +:1016D0006383F604DC442A8A99CB973006E0E780DE +:1016E000E0FC972006E0E780205A23A60400FD597D +:1016F0006C004A85F93915E937150020130505D521 +:10170000EFF0AFB3A147DCA0B737002083A7C758DD +:101710000947F8D30D47B250225492540259F24966 +:10172000624AD24A3A854561828063743501324407 +:10173000AA8903290900E31D09FAFD571307F00FD1 +:10174000E38BF9FC914763F187029307B4FF2320F1 +:10175000FA0023A8FA0A0147DDFFB737002083A764 +:1017600087282320FA0045BFB737002083A78728A2 +:10177000ED17A297E9BF797126D206D622D44AD0B6 +:101780004ECE52CC56CA5AC85EC683475503034450 +:101790007513AA843E941374F40F9307400263F602 +:1017A00087001304B4FD1374F40F03AA841383AAEF +:1017B000C413A38B841222865285D68597D006E067 +:1017C000E78060BA058915E503CBD4120149814948 +:1017D000337B6403930B50024A865285D68597D09B +:1017E00006E0E78040B8058915C563916903137465 +:1017F000F90F238B8412B250225492540259F249A9 +:10180000624AD24A424BB24B456182808509E20965 +:1018100093D989410509E31179FDE1BF8327850942 +:1018200003560504797193D60701BD8EC206C182A5 +:10183000358E1357764093575640898B058B5D8FB5 +:1018400093573640918B5D8F93571640A18B5D8FD8 +:1018500093171600C18B5D8F9317360093F707021D +:101860005D8F931756009355860093F707041E0665 +:101870005D8F1376F60F518F93D7554013D63540B1 +:10188000118A898BD18F13D67540D18F13D615400D +:10189000218AD18F13961500418AD18F1396350076 +:1018A00013760602D18F13965500137606049E0513 +:1018B000D18F93F5F50FCD8FA20745465D8F330786 +:1018C000C70222D42A8426D252CC56CA032A8413B1 +:1018D000832AC4135AC806D63697420741839357C2 +:1018E0007740135557400989858BC98F1355374069 +:1018F0001189C98F135517402189C98F13151700F6 +:101900004189C98F1315370013750502C98F131547 +:10191000570093558700137505041E07C98F137769 +:10192000F70FD98F13D5354013D755401189098B3F +:10193000498F13D57540498F13D515402189498F9B +:10194000139515004189498F1395350013750502CC +:10195000498F13955500137505049E05498F93F51E +:10196000F50F4D8F2207D98FB387C7024AD04ECECD +:101970005EC662C4B697C207C18313D7774013D53A +:1019800057400989058B498F13D537401189498FF5 +:1019900013D517402189498F139517004189498F25 +:1019A0001395370013750502498F1395570093D58A +:1019B0008700137505049E07498F93F7F70FD98F9A +:1019C00013D5354013D755401189098B498F13D54D +:1019D0007540498F13D515402189498F13951500FE +:1019E0004189498F1395350013750502498F139569 +:1019F0005500137505049E05498F93F5F50F4D8F1E +:101A00002207D98FB387C702130650025285D685A5 +:101A1000B697BD8E93940601C18033F6C402137B42 +:101A2000F60F97D006E0E780009405890DED834717 +:101A3000D41201498149B3849702130C5002C1802A +:101A40004A865285D68597D006E0E780C091058901 +:101A5000937BF90F11C563863403850993F9F90F58 +:101A60000509E31F89FD230B6413B25022549254DD +:101A70000259F249624AD24A424BB24B224C45616A +:101A800082805E8BCDB78327C508035685087971A0 +:101A900093D60701BD8EC206C182358E135776409C +:101AA00093575640898B058B5D8F93573640918BAA +:101AB0005D8F93571640A18B5D8F93171600C18BD6 +:101AC0005D8F9317360093F707025D8F93175600CB +:101AD0009355860093F707041E065D8F1376F60F65 +:101AE000518F93D7554013D63540118A898BD18FAA +:101AF00013D67540D18F13D61540218AD18F1396F6 +:101B00001500418AD18F1396350013760602D18FC6 +:101B100013965500137606049E05D18F93F5F50FA5 +:101B2000CD8FA20745465D8F3307C70222D42A8492 +:101B300026D252CC56CA032A040A832A440A5AC817 +:101B400006D636974207418393577740135557403F +:101B50000989858BC98F135537401189C98F135552 +:101B600017402189C98F131517004189C98F131593 +:101B7000370013750502C98F131557009355870059 +:101B8000137505041E07C98F1377F70FD98F13D567 +:101B9000354013D755401189098B498F13D57540AE +:101BA000498F13D515402189498F13951500418917 +:101BB000498F1395350013750502498F139555000C +:101BC000137505049E05498F93F5F50F4D8F220778 +:101BD000D98FB387C7024AD04ECE5EC662C4B697CD +:101BE000C207C18313D7774013D557400989058BA6 +:101BF000498F13D537401189498F13D51740218953 +:101C0000498F139517004189498F13953700137534 +:101C10000502498F1395570093D587001375050466 +:101C20009E07498F93F7F70FD98F13D5354013D7F8 +:101C300055401189098B498F13D57540498F13D5AC +:101C400015402189498F139515004189498F1395B6 +:101C5000350013750502498F13955500137505045A +:101C60009E05498F93F5F50F4D8F2207D98FB387C6 +:101C7000C702130650025285D685B697BD8E93943F +:101C80000601C18033F6C402137BF60F97C006E04D +:101C9000E780606D05890DED83471408014981498E +:101CA000B3849702130C5002C1804A865285D685B0 +:101CB00097C006E0E780206B0589937BF90F11C57B +:101CC00063863403850993F9F90F0509E31F89FD3C +:101CD000230F6407B250225492540259F249624AC7 +:101CE000D24A424BB24B224C456182805E8BCDB7CB +:101CF0008327450903568508797193D60701BD8E60 +:101D0000C206C182358E1357764093575640898B51 +:101D1000058B5D8F93573640918B5D8F935716409F +:101D2000A18B5D8F93171600C18B5D8F93173600C3 +:101D300093F707025D8F931756009355860093F72C +:101D400007041E065D8F1376F60F518F93D755400B +:101D500013D63540118A898BD18F13D67540D18F18 +:101D600013D61540218AD18F13961500418AD18F41 +:101D70001396350013760602D18F1396550013760D +:101D800006049E05D18F93F5F50FCD8FA20745462A +:101D90005D8F3307C70222D42A8426D252CC56CA7A +:101DA000032A040B832A440B5AC806D636974207E7 +:101DB000418393577740135557400989858BC98FC5 +:101DC000135537401189C98F135517402189C98F81 +:101DD000131517004189C98F1315370013750502B4 +:101DE000C98F1315570093558700137505041E07F7 +:101DF000C98F1377F70FD98F13D5354013D75540B7 +:101E00001189098B498F13D57540498F13D515401A +:101E10002189498F139515004189498F1395350004 +:101E200013750502498F13955500137505049E051A +:101E3000498F93F5F50F4D8F2207D98FB387C702CE +:101E40004AD04ECE5EC662C4B697C207C18313D7CE +:101E5000774013D557400989058B498F13D53740F3 +:101E60001189498F13D517402189498F1395170080 +:101E70004189498F1395370013750502498F1395D2 +:101E8000570093D58700137505049E07498F93F774 +:101E9000F70FD98F13D5354013D755401189098BCA +:101EA000498F13D57540498F13D515402189498F26 +:101EB000139515004189498F139535001375050257 +:101EC000498F13955500137505049E05498F93F5A9 +:101ED000F50F4D8F2207D98FB387C7021306500223 +:101EE0005285D685B697BD8E93940601C18033F690 +:101EF000C402137BF60F97C006E0E780C046058951 +:101F00000DED8347F40801498149B3849702130C0E +:101F10005002C1804A865285D68597C006E0E78088 +:101F200080440589937BF90F11C5638634038509C5 +:101F300093F9F90F0509E31F89FD230F6407B250D8 +:101F4000225492540259F249624AD24A424BB24B4D +:101F5000224C456182805E8BCDB74111B73700209E +:101F600026C283A4074606C622C44AC08547C1C408 +:101F700003A4C40A854741C03C241307700A639335 +:101F8000E70858301C34B736002013864628B3873C +:101F9000E7021A265042B387E702130700329387FD +:101FA0000719B3D7E70203A74409938446283E974D +:101FB0003A896364F7006364C7003309C740B737E1 +:101FC000002083A70723232025018297B307A94078 +:101FD0006374A900D840BA9781E79307F00F21A84E +:101FE00058309306204E3307D702E3F8E7FE9307F5 +:101FF00080FA3CA48147B2402244924402493E8583 +:10200000410182801307800AE399E7FCB73700207B +:1020100083A7072382972A893545972006E0E78022 +:10202000A025B7370020938747562D47F8B358307F +:102030001C34B736002093864628B387E7029A26D9 +:10204000D442B387E7021307003293870719B3D747 +:10205000E70203A744093E973A866364F700636486 +:10206000D7003306D740E31AC9F637D50500130564 +:10207000C5AFEFE09F9CB737002083A7C75809473B +:10208000F8D7A1BF397122DC3734002093074456BA +:102090009C4F06DE26DA4AD84ED652D456D25AD0B3 +:1020A0005ECE62CC66CA6AC86EC613970701635DCE +:1020B000071EB737002083A4074683A9C40A83C735 +:1020C000990003A7C9009207330CF70003452C00C1 +:1020D000314705053305E50203574C003A954205A3 +:1020E0004181EFE04FC0AA8B630B051C130DC500A7 +:1020F0002324A50103462C00B145F97A3306B60224 +:102100001304445623130C000149373A0020373B8F +:102110000020B73C0020930D9005FD1A6A962326F7 +:10212000CC0003C679009307D0070325CA583306AD +:10213000F60285671CC5B7073300060630D10326B3 +:102140008B550C4293F5F5E70CC20C4293F5F5E77D +:1021500093E505100CC203A80C5E83258800DD8D75 +:102160002324B80083A509002328B5050CC6835590 +:102170006C000326CC002E962324CD0003461C00C1 +:10218000930550024A96A301CD0003C504080146F9 +:10219000A3000400972006E0E780A0E50326CA58C4 +:1021A0004846B37555014CC60F1000000326CA58A7 +:1021B000896503288B550CC6930500F84CA0832530 +:1021C0000800B1818D89E1E1930560196CD248C6A0 +:1021D000A30204008545A30004000CC2052F97202C +:1021E00006E0E78040011030058A5DCAEA85268551 +:1021F00097C005E0E78040BB0DED03465D004DC292 +:1022000083556C0003554C00B29563DBA508AC28E0 +:10221000A848918D8905AA9503258D00EFE06FBC34 +:1022200023020D0083455D0003566C002E96231398 +:10223000CC008325CA58310DB0517DFE03462C00D9 +:1022400005091379F90FE36EC9EC98245E85A38123 +:10225000EB0083470C00A3820B002383CB00238277 +:10226000FB006254F250D2544259B259225A925A47 +:10227000025BF24B624CD24C424DB24D21611713BE +:1022800005E0670083EB832508000948B1818D894B +:10229000639505019305E04315BF9305E01B3DB72A +:1022A0007D562302CD0071B7B737002083A7C758EA +:1022B000FC5791C7B737002005472386E7F4F25053 +:1022C0006254D2544259B259225A925A025BF24B8A +:1022D000624CD24C424DB24D21618280797122D440 +:1022E00006D6BC312E8423160100DC87DC211008C1 +:1022F00002C05C87DC318A8502C2DC8602C402C867 +:1023000002CA02CC02CE552C0347F1011C20014524 +:10231000631EF7000347E1011C3001456318F70015 +:102320000345D1013C201D8D13351500B2502254B8 +:10233000456182800111B737002022CC03A4474DAC +:1023400026CA4AC84EC606CEAA8413092500854966 +:1023500005C09C303830858B6304F700405CCDBFEE +:102360001946930544004A85EFE0AFB8E31835FFFE +:102370002285F2406244D2444249B24905618280DA +:102380004111B737002022C403A4474D26C24AC0DA +:1023900006C693042500054901E82285B24022447F +:1023A0009244024941018280A6851305A4023D376B +:1023B000E30525FF405CCDB74111B737002022C4AB +:1023C00003A4474D26C24AC006C69304250005490A +:1023D00001E82285B24022449244024941018280B0 +:1023E000A6851305A401DD3DE30525FF405CCDB7BF +:1023F000011122CC604126CA4AC84EC652C406CE3C +:10240000AA841D4A130965058549BC446364F40028 +:10241000054591A0D8345C206317470503C78402A3 +:102420006304F7000040D5B7583083C75405E31B59 +:10243000F7FE1946CA8513056400EFE08FABE3137E +:1024400035FF582483C79402E31EF7FC7A24BE3478 +:10245000E31AF7FC0145F2406244D2444249B249D2 +:10246000224A05618280E31FF7FA583083C754057A +:10247000E31AF7FA1946CA8513056400EFE06FA75F +:10248000E31235FBC1BF4111B737002022C403A4BA +:10249000874806C626C24AC079C88347840B1307FB +:1024A000700A6393E70A0347140E8347A40BB736F9 +:1024B000002013864628B387E7021A26938446280D +:1024C0005042B387E7021307003293870719B3D747 +:1024D000E7020327440A3E973A896364F70063647E +:1024E000C7003309C740B737002083A7072323203D +:1024F00025018297B307A9406374A900D840BA9711 +:102500008DC70347140E9306204E3307D70263FE90 +:10251000E700930780FA230CF40A01442285B240B5 +:102520002244924402494101828037350600130556 +:10253000E5A0EFE08FD0B737002083A7C758094741 +:102540001304F00FF8D7D9BF1307800A1304F00F54 +:10255000E396E7FC373506001305E5A0EFE0EFCD85 +:10256000B737002083A7C7580947F8D745BF0544A8 +:1025700075B70111B737002022CC03A4C74C26CA77 +:1025800006CE2AC42EC6854419E40145F2406244B1 +:10259000D244056182809C841830858B6304F700E7 +:1025A0000044DDB719469305A10013052400EFE0B0 +:1025B0004F94E31795FE0545D1BFB736002083A79A +:1025C00046551307001098C323A00700183103488D +:1025D0002500220742084297034805004297034816 +:1025E00035006208429798D75831034865002207A2 +:1025F0004208429703484500429703487500620825 +:102600004297D8D718350348A500220742084297B9 +:102610000348850042970348B5006208429798DB5B +:1026200058350348E5002207420842970348C50091 +:102630006835429762052A97D8DB9831A82122078E +:1026400042052A9788212A97A83162052A9798CFB0 +:10265000D831E821220742052A97C8212A97E83174 +:1026600062052A97D8CF9835A825220742052A97D0 +:1026700088252A97A83562052A9798D3D835E82562 +:10268000220742052A97C825EC352A97E2052E979E +:10269000D8D3D843759BD8C3D84313671700D8C382 +:1026A00098431367170098C303A746555C43858B6F +:1026B000BDE71C4F01451CA283A746559C4FA18333 +:1026C0001CB283A746559C4FC1833CA283A74655A5 +:1026D0009C4FE1833CB283A74655D84F58A2D84FB0 +:1026E000218358B2D84F418378A2D84F618378B202 +:1026F000985318A69853218318B69853418338A647 +:102700009853618338B6D85358A6D853218358B606 +:10271000D853418378A6DC53E1837CB682800100E4 +:1027200061B7B737002003A7C7581605136505081A +:102730003C4B93E707083CCBB737002083A74755AE +:1027400003A7450E88C398CB03A7850E0145D8CBB8 +:1027500003A7C50B98CF03A7050CD8CF03A7450C3B +:1027600098D303A7850CD8D303A7C50C98D703A784 +:10277000050DD8D703A7450D98DB03A7850DD8DB3A +:1027800003A7C50D98C703A7050ED8C798431367BD +:10279000070498C38280B737002003A7C7581605DF +:1027A000136505083C4B93E707083CCBB73700207F +:1027B00083A7475503A7C50E88C398CB03A7050F6A +:1027C0000145D8CB03A7C50B98CF03A7050CD8CFDD +:1027D00003A7450C98D303A7850CD8D303A7C50C32 +:1027E00098D703A7050DD8D703A7450D98DB03A7F6 +:1027F000850DD8DB03A7C50D98C703A7050ED8C75D +:1028000098431367070498C3B73700209387475648 +:10281000130700F8F8A38280B736002003A7865577 +:1028200041114AC01C5F06C622C4998326C2858B0B +:102830003689B5CF93070006373400201CDF834765 +:1028400044569304445693F7070489CFB7370020C2 +:1028500083A707238297C8CC8347445693F7F70B87 +:102860002302F4568347445693F7070285C38347F0 +:102870004456373700200327C75893F7F70D230234 +:10288000F456DC48A16614C786077CD7DC2093F792 +:10289000070491EF8547DCB0B737002083A7C758FE +:1028A000096798C7130700FCD8A09848F8D30327F6 +:1028B00089551C5F9183858B89CBC1471CDFB73756 +:1028C0000020938747568546D4A31C5F9D83858B44 +:1028D00091CB930700081CDFB7370020938747563A +:1028E0000547D8A3B737002083A74755D8430583AA +:1028F000058B19C7D843759BD8C3D843799BD8C3D8 +:10290000B24022449244024941018280B7370020FC +:10291000B736002003A6C7589387465603C74656C6 +:10292000058B19E79833058B01E7785265FBD8339F +:10293000A3820700828037380020032788551C5F58 +:102940009583858BBDE701C61C5BBD831CA29DC61C +:1029500083278855985B460793576701635607009E +:1029600093E707C0C207C18303970600C207C18768 +:1029700009C7BA970947B3C7E7029EA285C11C31B0 +:1029800091CF3E951C350547194593F6F70663939D +:10299000E602E207E187394563CE070083278855C1 +:1029A0003737002001459C5FED838D8BA307F756D9 +:1029B000828005458280411122C406C6373400203A +:1029C00026C20327C4583DE5AE877453FDFEB734D5 +:1029D0000020938444563E85B285238104009710DD +:1029E00006E0E780A04CB737002083A78755B706DD +:1029F00080009843558F98C3D857719BD8D78327A9 +:102A0000C458A3820400A3800400094798C3832606 +:102A1000C458B737002093874756B823058B11E772 +:102A2000B833058B19E3F8526DFBB240224492444F +:102A3000410182808D47631FF500B737002083A7CF +:102A40008755B70680009843558F98C3D857719B18 +:102A5000D8D775BF8547E31CF5FA5447F977FD17BA +:102A6000F58F5CC70F1000008327C4580967130651 +:102A700000F898C7373700201307475650A3373759 +:102A8000002003268755184231830D8B11E7130769 +:102A90006019F8D3D4C7A5BF1842094631830D8BFE +:102AA0006315C7001307E043EDB71307E01BD5B765 +:102AB0005D7152DC373A002003278A5586C6A2C4CE +:102AC000A6C2CAC04EDE1C43B739002037390020E9 +:102AD00093F7F7E793E707081CC383A6095E370758 +:102AE000CEFF7D179C46130680022A84F98F9CC670 +:102AF0008327C9582800AE8423A80704930510082B +:102B0000EFD0DFB43545971006E0E780E076832705 +:102B10008A559376F41F3706330023A40700984B99 +:102B2000370FFCFF4E881367F70398CBF84FCA881E +:102B3000130510F8137707E0558FF8CF9843F57613 +:102B4000FD16758F98C3373700208326C9581307A1 +:102B50004756A3020700A3000700054798C2984301 +:102B6000D285B70204001377F7E798C3984393031D +:102B7000802511491377F7E71367071098C303A758 +:102B8000095E7D1F85491C47930F8002D18F1CC7AA +:102B900093079005BCCA01473400135337002693AE +:102BA0008347030013767700B3D7C740858BE1C313 +:102BB00083A78555832E085E239C07042390070670 +:102BC00003AECE02137EDEFF23A6CE0383AE070044 +:102BD000137EF70793FE0EF833EECE0123A0C70154 +:102BE00003AE4702336E5E0023A2C70383AEC8580C +:102BF000014E23A27E0603DA070663074E0303AEE7 +:102C00000703038A0600135EFE00620E135E8E4108 +:102C10006358CA0103AE0703135EFE002380C6019A +:102C200003DE0706137EFE0F03AA4E0663060A00A4 +:102C300003DA8705E37F49FB03AE4702337EEE01EB +:102C400023A2C70383870600635CF400034E0300DE +:102C50003396C9001346F6FF3376C6012300C3003E +:102C60003E8663D3A7002A86131586016185050772 +:102C70001377F70F8506E312F7F3B6402644964420 +:102C80000649F259625A61618280B737002083A7F2 +:102C9000C758D8479316170163D206029847931670 +:102CA000170163DD06007D57B8D7373700201307BB +:102CB000C71E544F850654CF116798C798470D8398 +:102CC000058B11CF3737002013074756342393E67F +:102CD000160034A3930600F854A3214798C79847D9 +:102CE000058B19CB3737002013074756143393E66B +:102CF000160014B3054798C798470983058B09E761 +:102D000098470583058B31CB37370020130647568C +:102D1000A30206009447B735002083A58555898214 +:102D2000858AE5C69441B1828D8AE9EEA84B54525A +:102D30001376050294324DC2F9E29306D005D4CF42 +:102D40008346475693E616002302D756114798C785 +:102D5000D855719B13671700D8D59847931637013C +:102D600063D40602373700209306874003C6C607A0 +:102D700013078740418A45C203C7C6071367070286 +:102D8000238EE606056798C798479316270163DFE9 +:102D9000060037370020130747565423E206E18622 +:102DA00063D40600854654A3096798C798479316CD +:102DB000070163D206023737002013078740834696 +:102DC000D707858AADCA8346D70793E62600A30EA8 +:102DD000D706216798C78280ADD205466395C600A5 +:102DE00093061006A9BF09466395C60093065006D0 +:102DF000B9B70D466395C6009306900689B793064A +:102E0000B00635BF9306C0061DBF383213671700E2 +:102E100038B209472DBF8346C7070946BD8A638874 +:102E2000C6008346C7070D46BD8AE39DC6F491469A +:102E3000230ED70681BF8346D707918AD9DA834606 +:102E4000D70793E6860061B7B737002083A7C75836 +:102E5000B736002013874656904710CF90470D8213 +:102E6000058A11CA30231366160030A3130600F832 +:102E700050A3214690C79047058A19C610331366A0 +:102E8000160010B3054690C790470982058A09E6E7 +:102E900090470582058A31C6A30207009047B735DF +:102EA000002083A585550982058A59CA904131823F +:102EB0000D8A41E6A84B505313750502103221C903 +:102EC00035EA1306D005D0CF03C646561366160062 +:102ED0002382C656914694C7D455F19A93E61600BC +:102EE000D4D5944713962601635B06005423E2066B +:102EF000E18663D40600854654A3096798C79847BE +:102F00009316070163D40600216798C7828055DABB +:102F100005456315A6001306100675B70945631528 +:102F2000A6001306500645B70D456315A600130607 +:102F3000900651BF1306B00679B71306C00661B7F5 +:102F4000343393E6160034B3894671B7373700201F +:102F5000B7360020138606591307075B5C372C3EF3 +:102F6000484AAE97FD8BB355F5001CB25CB7858916 +:102F70008DE9183B814613080002B3F7E7020147C9 +:102F8000B355E50085899378F70F89C96395D70014 +:102F9000A30016018280850693F6F60F0507E3115C +:102FA00007FF8280B737002093874756DC3393F7BB +:102FB000F70FD1EBB737002083A70723411122C4B5 +:102FC0004AC006C626C28297373900209307095B9C +:102FD00080471309095B6302A40663688504018DB9 +:102FE000B734002093870459BC2F135455009384A1 +:102FF00004596364F40485676371F404813FBC2C55 +:10300000032789009396570036971D8C2324E900E7 +:10301000E376F4FE22448830B2409244024981456E +:103020004101171306E06700236CB737002083A720 +:10303000872833848740229565B7B2402244924462 +:103040000249410182808280B737002083A707238D +:10305000011122CC26CA52C406CE4AC84EC6829757 +:10306000B73400209387045B8047014A6300A406BD +:103070009384045B63658506018D373700209307D1 +:103080000759BC2F13545500137AF501130907593A +:10309000636BF402B739002093894928453D834684 +:1030A000A90103A8840083A54900139756004297FD +:1030B000158C3A86636407016364B7003306B74032 +:1030C00090C4E37DD4FC1604336A4401F2406244A8 +:1030D0005285D2444249B249224A05618280B737BB +:1030E000002083A7872833848740229579B7B73794 +:1030F000002003A7C7588567938707777CD3B73726 +:10310000002083A7075E83A607091396560063581D +:10311000060083A6070913966600634406007453ED +:10312000FDF28280EFD0DF9273000000000000000B +:10313000970200009382C20C0383020023800200E6 +:10314000630F0300F32510342EC09705000093850C +:10315000A5FD73901534EFF03FCF7300203086DC6F +:0C316000EFF0BFB2E650828000000000DB +:10316C00B73700203737002083A7471E0327C71D1A +:10317C0001456313F7008280F62399E2D623369536 +:10318C009C43C5BFB737002083A5C7233737002022 +:10319C009387C723138605222322C71EDA2393871E +:1031AC0085FFB73600204111BA97056523AEF61C92 +:1031BC0006C61D05935637006374E5009306002080 +:1031CC003307D600373500202320E51E23A0E52247 +:1031DC00E11656A2231306001CC3998FE1175EA3B8 +:1031EC0023130700B53FB240B73700202399A71E21 +:1031FC0041018280B73700203737002083A7471E54 +:10320C008326C71D01456393F6008280FA2309E7E4 +:10321C00DA236373E5003A859C43F5B7184183A71D +:10322C0085FF6319B7001CC1FD5723AC05FE238F26 +:10323C00F5FE8280232CF6FEC5BF411122C426C2A6 +:10324C003744024006C68324C420232604200F10D2 +:10325C00000009E9232694201545B24022449244EB +:10326C00410182800347E5FF9307F00F6306F700E7 +:10327C00232694201145D5B797D0FB1FE780C0E8D3 +:10328C00014523269420D1BF411126C24AC0B74420 +:10329C00024006C622C403A9C42023A604200F1092 +:1032AC00000089E523A62421154515A0B737002079 +:1032BC0083C7D71E2A842E856375F400894763EE75 +:1032CC008700A53FB747024023A627210D45B240F2 +:1032DC002244924402494101828083A785FF99E7E9 +:1032EC0003C7E5FF9307F00F6308F700B937B7473B +:1032FC00024023A627214DBF37350020238F85FEA2 +:10330C001305851E97D0FB1FE780C0F0A1652285B1 +:10331C006D2C014523A624215DBFB737002023A4C3 +:10332C00071E8280BDCD797122D406D626D24AD012 +:10333C004ECE01444147B3D78540858BB1CF1205A2 +:10334C00314722953305E502B737002003A9C7277B +:10335C008544B3948400C204C180BE892A99032792 +:10336C00090011C7032549002EC60297B245314703 +:10337C003304E40283A7C9273E941C4489E7232025 +:10338C00090023220900B2502254A58D02599254EF +:10339C00F2492E85456182800504E31EE4F88144E0 +:1033AC00DDB72E85828041111397050122C406C614 +:1033BC0026C24AC041872E846351070297D0FB1F57 +:1033CC00E78040EC11C1953DA1673D8C2285B24050 +:1033DC0022449244024941018280EDD9AA870147D7 +:1033EC004146B356E440858A9DCA9207BA97B146C6 +:1033FC00B387D702B736002003A9C6278544B394F8 +:10340C00E400C204C1803E998327090003254900CA +:10341C0082972320090023220900258C45BF05072C +:10342C00E311C7FC8144D5BF411126C2B747024006 +:10343C0006C622C483A4C72023A607200F100000B1 +:10344C00B737002083A7072637340020130484F1F4 +:10345C0091C782971C403E9508C031A0B737002019 +:10346C0083A70723FDF71C40374703001307D73FFB +:10347C00B387E70237A72600130737ECB240BA9799 +:10348C001CC0B747024023A6972008402244924410 +:10349C0041018280797126D2B747024006D622D4E8 +:1034AC004AD04ECE52CC56CA5AC85EC662C483A409 +:1034BC00C72023A607200F10000005E123A69720A4 +:1034CC000945B250225492540259F249624AD24AE6 +:1034DC00424BB24B224C45618280B737002083A708 +:1034EC000723BA8A368AB28B2E8BAA898297B73772 +:1034FC00002003A7C7273E890144B146C147330CBE +:10350C00D40233068701104259E2C165938505F058 +:10351C00414597D0FB1FE78020B219EDB73700204B +:10352C0083A7072781C7814511458297B74702407A +:10353C0023A697202D4571B7B737002003A7872303 +:10354C0039E323ACA722230005008327C9270547AD +:10355C003317870023260500232475013AA1232263 +:10356C005501E29723A0370123A2670123A4570139 +:10357C0063040A0023008A00B747024023A6972061 +:10358C00014581B73E875C47F5FF48C76DBF050411 +:10359C00E317F4F6B747024023A69720214515B749 +:1035AC00B737002083A70728411122C406C6373439 +:1035BC0000201304C41E89C782975C483E9548C8F6 +:1035CC004848B240224441018280B747024083A65A +:1035DC00C72023A607200F10000037370020034711 +:1035EC00D71E6370E502373600201317150003252C +:1035FC0046233A951A21D98D0EA123A6D720014531 +:10360C00828023A6D7200D458280B747024083A62F +:10361C00C72023A607200F100000373700200347D0 +:10362C00D71E6372E50237360020131715000325E9 +:10363C00462393C5F5FF3A951A21F98D0EA123A6C1 +:10364C00D7200145828023A6D7200D458280011109 +:10365C004AC83747024006CE22CC26CA4EC652C4B0 +:10366C000329C720232607200F100000130705FF8E +:10367C001377F70FFD4763E3E70AB146B306D502AC +:10368C00B737002003A7C72736971C43C1CB9354E9 +:10369C00450005443D893315A400131405014180F0 +:1036AC00AE892685A28597D0FB1FE78020C62A8A83 +:1036BC0029C9A2852685913FB737002083A7072308 +:1036CC00B73400209384442882979E242A84814610 +:1036DC00B385370313060064B3B73703138505327C +:1036EC00B335B500BE95EFA09221B30785003E8798 +:1036FC00D44063E4A70063E4D7003387D740232486 +:10370C00EA00B747024023A627210145F240624454 +:10371C00D2444249B249224A05618280B7470240ED +:10372C0023A627210945DDB701114AC8B747024036 +:10373C0006CE22CC26CA4EC603A9C72023A6072034 +:10374C000F100000BD4763EBA70431473307E502B8 +:10375C00B737002083A7C727BA979C43A1C305445A +:10376C003314A40042044180AE840145A28597D055 +:10377C00FB1FE780A0B9AA8911C5A2850145713547 +:10378C0023A49900B747024023A627210145F24004 +:10379C006244D2444249B24905618280B747024033 +:1037AC0023A627210945E5B7797126D252CCB74417 +:1037BC00024006D622D44AD04ECE56CA5AC85EC64D +:1037CC0003AAC42023A604200F100000B737002042 +:1037DC0083C7D71E6378F500B737002083AB072368 +:1037EC0063970B00B747024023A6472199A03739AE +:1037FC00002013094928AE8A032B49008355890000 +:10380C00B74736FE938707C83E9BB387C5022A8409 +:10381C00B2898146B3B5C50213850732B337F500BB +:10382C0013060064BE95EFA0920D6370AB0223A645 +:10383C0044210145B250225492540259F249624A31 +:10384C00D24A424BB24B45618280829B83558900A0 +:10385C00AA8413060064B38735038146B3B53503D8 +:10386C0013850732B337F500BE95EFA05209B307A5 +:10387C009500BE840327490063E4A70063E4E700D6 +:10388C00B384E740D685228597D0FB1FE78000A83C +:10389C0001C904C5B747024023A64721054559BFB6 +:1038AC00936504F0C205C181414597C0FB1FE780B9 +:1038BC00A07811E9B737002083A7072785D7A28501 +:1038CC001145829705B7373700208327872399EF57 +:1038DC00232CA72285472326050004C52311550157 +:1038EC0000A11CB12322050075B7BA87D84775FF14 +:1038FC00C8C7CDB779714ECEB747024006D622D491 +:10390C0026D24AD052CC56CA5AC85EC662C466C2C7 +:10391C006AC083A9C72023A607200F10000025C169 +:10392C0041443689B28A2E8AAA84B14C373B002096 +:10393C00054D130C0003B30B94030327CB275E97A1 +:10394C001C43B9EF9375F400B315BD0013554440F7 +:10395C00C2055686C1811375F50FB93531C1832760 +:10396C00CB27DE9784C323A24701630409002300FD +:10397C008900B747024023A63721014521A023A681 +:10398C0037210945B250225492540259F249624AE5 +:10399C00D24A424BB24B224C924C024D4561828032 +:1039AC000504E31A84F9B747024023A637212145C1 +:1039BC00D1BF011122CC26CA4AC84EC6B747024015 +:1039CC0006CE03A9C7202A84AE89B28423A6072079 +:1039DC000F100000D13B2285CE8597D0FB1FE780CE +:1039EC00E0922A8405C5B737002083D5C728130673 +:1039FC0000648146B3879502B3B5950213850732EF +:103A0C00B337F500BE95EFA0826F48C01335140094 +:103A1C00F2406244B747024023A62721D2444249D0 +:103A2C00B2490E0505618280011122CC4AC84EC6EE +:103A3C00B747024006CE26CA83A9C7202A892E84FE +:103A4C0023A607200F10000097D0FB1FE780008CE7 +:103A5C00AA8419C123110500A2854A857D36B73782 +:103A6C00002083C7C71E63992701B737002003D7EF +:103A7C00C722598C23968722B747024023A63721A9 +:103A8C00014591E01945F2406244D2444249B249A1 +:103A9C0005618280011126CA4AC8B744024006CE8D +:103AAC0022CC4EC603A9C42023A604200F1000006C +:103ABC009307F00263E6A704B1473304F502B73964 +:103ACC00002083A7C927A2979C439DCB9377F50031 +:103ADC008545B395F500C205C1811181B13783A726 +:103AEC00C9270145A29723A0070023A2070023A6FC +:103AFC002421F2406244D2444249B2490561828099 +:103B0C00B747024023A627210945E5B7411126C234 +:103B1C0006C622C4B747024083A4C72023A60720A9 +:103B2C000F10000097C0FB1FE780407E19E901458C +:103B3C00B2402244B747024023A697209244410149 +:103B4C008280B737002083A7072300458297B737B9 +:103B5C000020938747286367A402D843B74636FEF4 +:103B6C00938606C83305A4403697E372E5FC130729 +:103B7C000064B335E502922781463305E502EFA0D8 +:103B8C0002587DB7D8433A94C9BF4111B7370020CA +:103B9C0006C623A0A7280295B240B737002023A25F +:103BAC00A720014541018280914763E9B700B737EF +:103BBC0000208A0593878721BE9588C18280B737FC +:103BCC00002023AC072237350020B73700204111E5 +:103BDC0023A007285146B7370020814513058521BE +:103BEC0006C623A8072222C426C23734002097C059 +:103BFC00FB1FE780207A1305C41E13068002814543 +:103C0C0097C0FB1FE7800079EFF0CFD7B7370020C4 +:103C1C0083C717251304C41E854513D527008D8B28 +:103C2C003E958D473305F5029947B7340020390589 +:103C3C001375F50F28A03305F5021305052497C05D +:103C4C00FB1FE780603F23AEA4262DCD3020994783 +:103C5C0081453306F6021306062497C0FB1FE78046 +:103C6C00607383A7C4273820B734002093870724B8 +:103C7C000A0723AAF420BA9737370020232AF72201 +:103C8C00EFF0AFE91D211C3083A644213736040028 +:103C9C001397270036971306063310C313871700A4 +:103CAC001377F70F0A073736040036971306263BAF +:103CBC0010C313873700890793F7F70F8A0718B0DB +:103CCC00B69790C3B2402244924441018280373768 +:103CDC0000201307C71E1C33342363FFD700B736ED +:103CEC00002083A646211386170010B313972700D4 +:103CFC00369708C33E8582809307F00FE5BF1C41C1 +:103D0C00F1CF41777D8FB706002089476319D70C17 +:103D1C005A2171C7411126C21946AA849305F00F86 +:103D2C00610506C622C497C0FB1FE780A078054733 +:103D3C008D47630FE5089C4491C7985C994749CB24 +:103D4C00D85C59C73734002013060004814513058D +:103D5C00C42397C0FB1FE780E06313060004A6850D +:103D6C001305C42397C0FB1FE780205C9307C42373 +:103D7C00DA2701E713070010DAA7F82719E305473C +:103D8C00F8A79A2B19E36D479AABF83719E3154747 +:103D9C00F8B7B82B19E30547B8ABB83B19E3F837BC +:103DAC00B8BBD82B19E32547D8ABF82801E7130784 +:103DBC00C003F8ABDC5791C78297B7370020239A22 +:103DCC00A71EB73700207D57A382E764CD3B814700 +:103DDC00B240224492443E854101828089473E850F +:103DEC00828001114AC8373900208327492806CE22 +:103DFC0022CC26CA52C456C24EC68297130A0064FD +:103E0C00B335450313094928835A890081465686E0 +:103E1C0033054503EFA0A22EB73700201387C71E2A +:103E2C00004FAA840145630694029389C71E33850B +:103E3C008440636E94000325490056868146B33551 +:103E4C00AA023305AA02EFA0822B018D269523AC82 +:103E5C009900F2406244D2444249B249224A924A01 +:103E6C0005618280011122CC2E84B7E506000A85FB +:103E7C0041469385055506CEEFA0826118080604CD +:103E8C003A94B7370020035504FF83D7E728F24054 +:103E9C006244AA9737450F00130505243355F502E4 +:103EAC0005618280B737002083D7E72851471D452D +:103EBC00637CF702794719456378F70213072003EF +:103ECC0015456373F7021307B0041145637EF700C1 +:103EDC00130740060D456379F70013076009094580 +:103EEC006374F70013B5B70F8280011122CC06CE94 +:103EFC002A842EC6EFF04FD3B245F240818D33A504 +:103F0C00A502229562441375F50F0561828001119B +:103F1C0022CC06CE2A842EC6EFF00FD1B245F24049 +:103F2C00818D33A5A502229562444205418105612C +:103F3C008280011122CC06CE2A842EC6EFF0CFCE81 +:103F4C00B245F240818D33B5A502229562440561DC +:103F5C008280B737002023AAA7288280B737002099 +:103F6C001387C723585739CF411122C426C24AC0E0 +:103F7C0006C61389C7230297B73700201387C71EBD +:103F8C001A272A849384C71E05CBBA876373A700AC +:103F9C00AA87C207C183BA866373E400A286C206ED +:103FAC00C182958F51476359F7008327090391C349 +:103FBC008297EF00C22D82A4B2402244924402495F +:103FCC004101828082800111B737002022CC373426 +:103FDC00002023AA07289307C4239C5B06CEAA853E +:103FEC001304C42381C72AC68297B245C9C19C4118 +:103FFC000545B5CBDC41A5CB9E25B5C7BE25A5C7D0 +:10400C00DC2589CB5C3813F737008983BA970947CD +:10401C00634BF7043735002041461305452897C0FC +:10402C00FB1FE7808030B737002083A6472837373F +:10403C0000202328D72278380DE3938747288A2736 +:10404C009307805737460F003305F50213060624F5 +:10405C0081468145EFA0A20A68B8374504001305D4 +:10406C00E5DE25360145F240624405618280B737B2 +:10407C0000209387C71E3717002023AE07001307B5 +:10408C006798B737002023A2E72837873200938739 +:10409C004728FD56130727A1D4C398C723860700CA +:1040AC00B747024023A4D726BDBF011122CC373419 +:1040BC0000209307C423884706CE26CA4AC801E9C4 +:1040CC000545F2406244D2444249056182801304A2 +:1040DC00C4231C5CF5D7585C65D770008545829766 +:1040EC001844B247E30EF7FC4A249305E004B734B6 +:1040FC00002097C0FB1FE78020F41387C41E08D351 +:10410C009384C41E55DD52249305F00F014997C0CA +:10411C00FB1FE78020287C249050634DF9003285EA +:10412C0097C0FB1FE78040FE014523A0040223A299 +:10413C00040241BF4E240844585CB387250389818F +:10414C0005093E9508C20297F9B701114EC6B73959 +:10415C0000209387C9239C4726CA4AC852C406CE5E +:10416C0022CC56C25AC02A8AAE8432896388071E72 +:10417C009389C92303A78903630207121307F01F4E +:10418C006360A712373400201307C41E832A07026A +:10419C001304C41E63980A0803D5C900956593855A +:1041AC0015E097C0FB1FE78020E908D02A867DC563 +:1041BC0083D5C90083A7890303A5890089818297C8 +:1041CC0083A78900832A04025CD089476314FA0808 +:1041DC00C1476395F40C83D5C9009147938505FCC1 +:1041EC00B3C5F5028A05D695B8219307A0056313CC +:1041FC00F70A9E216390470B4A852686910597C046 +:10420C00FB1FE78080121C505685639157130145A4 +:10421C00F2406244D2444249B249224A924A024B89 +:10422C00056182805850E382E7FA03D5C900956591 +:10423C00938525E097C0FB1FE78000E0AA8A39CD63 +:10424C0083D5C9002A8683A7890303A589008981A0 +:10425C008297A5BF8D47631BFA00C1476390F40496 +:10426C0083D5C900938545FDF199B5BF9147631876 +:10427C00FA006395440383D5C900A115F5B79307DC +:10428C000010631DFA00A14763EA970083D5C900AB +:10429C00C115D9BF1C505685639D570B29458DBF41 +:1042AC009D6A637A5509930A05E01947B3CAEA0275 +:1042BC0003D7C900373B0020B38AEA02BE9A9307A2 +:1042CC00CB1EDC53130BCB1E6395570103240B023F +:1042DC001DE003D5C9009305E00497C0FB1FE780E0 +:1042EC00A0D52A8445DD83D5C90083A789032A86F6 +:1042FC0089815685829791451307A00589819397EB +:10430C002500A297B4236391E6049623639C46038D +:10431C0085058A052686A2954A8597C0FB1FE780EE +:10432C00C00083270B02E38487EE228597C0FB1F16 +:10433C00E78080DDE9BD21677917E361A7F6B30A51 +:10434C005541BDB7AC335DBF83270B02E38887F4BF +:10435C00228597C0FB1FE78020DB89B7B737002089 +:10436C0083A5C72085DD91479306A0058983139704 +:10437C0027002E973023E313D6F21223631C460139 +:10438C0085078A072686BE954A8597C0FB1FE7805E +:10439C00C0F9B5BD3C33D9BFB73700209387C723CD +:1043AC00984721C3D85F15CF8546631CD5024111B0 +:1043BC0022C4373400201304C41E105006C611CE7C +:1043CC00CE27485089810297085097C0FB1FE78081 +:1043DC00A0D32320040223220402B2402244410130 +:1043EC0082808280011122CC373400209307C423B1 +:1043FC0056C283AA870026CA4AC84EC606CE52C4E5 +:10440C002A89AE84B2891304C423638D0A1A5C5CB6 +:10441C0099EB2945F2406244D2444249B249224ABE +:10442C00924A056182801C5CEDD79307F01F63E113 +:10443C00A70C373A00209307CA1E9C53130ACA1EB6 +:10444C00A9C7084483274A02639CA70489476313BE +:10445C00F906C147E39FF4FA4A249147130505FC7A +:10446C003345F5029317250003250A022686CE85CF +:10447C003E959307A0053CA123102501110597C07B +:10448C00FB1FE78080EA014571B74A249305E004DD +:10449C0097C0FB1FE78040BA2320AA025DF195BFAD +:1044AC004E241C5C03260A02898182971C44232219 +:1044BC00FA0269BF8D47631BF900C147E39BF4F413 +:1044CC004A24130545FD9377C5FF79BF91476317C0 +:1044DC00F900E39024F54A242115F5B79307001051 +:1044EC00E319F9F2A147E3E697F24A244115E1BF3B +:1044FC009D676375F506930705E01947B3C7E70297 +:10450C005A24373A0020B387E702BE9A9307CA1E93 +:10451C009C53130ACA1EB1CB83274A0263925707D6 +:10452C0003250A0291461308A0059305F00F93D7B3 +:10453C002600139727002A97302363120607835807 +:10454C000700303363992805B306D64063C496043C +:10455C0085078A072686CE853E9515B7216779177C +:10456C00E369A7EAB307F54061BF4A249305E00469 +:10457C0097C0FB1FE78040AC2320AA0251FD51BD20 +:10458C004E241C5C03260A028981568582972322BD +:10459C005A0379B70EA393160601C18249BF522460 +:1045AC00B38596009105130606FCE3F4C5E6138665 +:1045BC003400719A1106B2962301070123102701CA +:1045CC0034B379B7373A00209307CA1E9C53130AA9 +:1045DC00CA1E95CF03250A0291461308A005930520 +:1045EC00F00F93D72600139727002A9730236310D8 +:1045FC00060583580700303363972801B306D6406D +:10460C00E3D896F40EA393160601C182D9BF682491 +:10461C005E249305E0043305F5024205418197C001 +:10462C00FB1FE78060A12320AA024DF5DDB35224C5 +:10463C006C24B385C502338696001106E3EBC5DC0A +:10464C00BDB7014582809C211CA1BE211CB1BE219D +:10465C00A1833CA1DC213CB111458280B7370020FD +:10466C0023AA07F4B737002023A807F482800DCDC6 +:10467C00411126C206C622C4AA8401458DC12E84CE +:10468C00B7E50600228541469385055697C0FB1F6A +:10469C00E780A0C99C2005455CA49C305CB4B2406A +:1046AC00224492444101828001458280011122CC36 +:1046BC0026CA06CE0947AA8432846381E5044146A2 +:1046CC008147639BC500638FE6006397B6000DA816 +:1046DC0041478147638EE600F2406244D2443E85F6 +:1046EC00056182808A852285593741468A8519A8B9 +:1046FC008A85B53F41468A85228531A0E39AB6FC6E +:10470C002E86A285268597C0FB1FE78000D3AA873B +:10471C00E1B7B737002023A8A7F48280B737002071 +:10472C0023AAA7F48280011122CC622106CE26CACC +:10473C004AC84EC62DCC83298500AE842A8803C96D +:10474C000900814713178901618763550702B14737 +:10475C00054563F787045114420403552800418032 +:10476C0033878900A2864E868545EFB05028B33733 +:10477C00A00085077D14135569004204058913793F +:10478C00F90341809CA088B023812401C2A0014779 +:10479C0019C01387190098C409476383E7000145C2 +:1047AC00F2406244D2444249B249056182800545D7 +:1047BC00C5BFC167F917630AF502D94763F7B7029A +:1047CC00011122CC2EC606CE2A84EF90A021B24530 +:1047DC006368B50022856244F24005616FA05015F4 +:1047EC00F240624405450561828005458280C167BF +:1047FC00F9176314F5006F90E01E411106C6EFA087 +:10480C00B00111E15D45B240410182809147639D49 +:10481C00F5001C211CA23C211831A207D98F3EA205 +:10482C003C3101455CA28280114582804111814559 +:10483C0022C426C206C6AA84BD232A8409E9B73736 +:10484C00002083A707F581C7F94526858297228525 +:10485C00B240224492444101828039714ED656D2E4 +:10486C005AD006DE22DC26DA4AD852D4AA8A2E8BFB +:10487C00B28951EB36C6A53F9145EF904025AA84ED +:10488C004D493DC5B246054A238034010544630AAF +:10489C000B00B68513851400029B05051314050146 +:1048AC004180E20993D9894163D30902C1455685F8 +:1048BC00EFA0F004654915E533868400A2852685B2 +:1048CC00EFB0E0582A8911ED310442044180914740 +:1048DC002C085685FC8426CEE085EFA0A01B2A89E7 +:1048EC0001C963070A00268597C0FB1FE780C081BA +:1048FC00F25062544A85D2544259B259225A925AB1 +:10490C00025B21618280BA84014ABDBF011122CCB5 +:10491C0026CA4AC84EC606CE2A893284B689353F85 +:10492C00AA840DE1B737002083A747F581CF05474F +:10493C006317E40003C4090005041374F40FA28583 +:10494C004A858297F240624426854249D244B24954 +:10495C0005618280AE86B745040001470546938504 +:10496C0025656DB79E211CA19E21A1831CB1094513 +:10497C0082809E211CA19E21A1831CB1BE213CA141 +:10498C00BE21A1833CB1114582809E211CA19E2198 +:10499C00A1831CB1BE213CA1BE21A1833CB1DC3161 +:1049AC005CA1FC215CB18A251905420541818280FC +:1049BC009E211CA19E21A1831CB1094582809E21B0 +:1049CC001CA19E21A1831CB1BE213CA1BE21A183AF +:1049DC003CB111458280CA21060542054181828085 +:1049EC009E211CA19E21A1831CB1AA21090542056F +:1049FC00418182809E211CA19E21A1831CB1BE21DC +:104A0C003CA1BE21A1833CB1CA21110542054181C3 +:104A1C0082809C211CA1054582809E21411122C4CB +:104A2C0006C61CA19E212E841105A183A30EF5FEA2 +:104A3C00BE219505230FF5FE83D7D5FFA183A30FC8 +:104A4C00F5FE03C6F5FF97C0FB1FE780008E4820DC +:104A5C00B240224411054101828089476399F500D7 +:104A6C001C3118210145A207D98F1EA28280114545 +:104A7C0082809A21D94763FDE702011122CC06CE30 +:104A8C002EC62A84EF801076B2469E22636DF50006 +:104A9C0022856244F240B7550400014709469385CC +:104AAC00059705615DBBF240624409450561828052 +:104ABC0009458280914785C51421FD15C20585479E +:104ACC00C1816390F60213D725008D89914781E946 +:104ADC00914711C7050534A21AA248C281473E85E9 +:104AEC00828009479147E39CE6FEC94733D7F5021C +:104AFC00B3F5F502E1BFAE86B75504000147114688 +:104B0C009385E59799BB93F7350089EB898191479C +:104B1C0081C50EA248C281473E8582809147EDBF78 +:104B2C00D8218947631CF702011122CC2A84C8457D +:104B3C0006CEAE86014709C92EC69D4597B0FB1F10 +:104B4C00E780C069B2462A8722856244F240B75595 +:104B5C000400194693856599056101B30945828066 +:104B6C0099E1114582801C2105473EA2E37BF7FEAB +:104B7C00FD1593F5F50F33D7F502B387E702E392F2 +:104B8C00F5FE050548C21AA201458280DC210947C1 +:104B9C00AE866385E70041476399E700B75504008B +:104BAC0001472146938565A24DB9094582800EA225 +:104BBC0091E1014548C201458280AE86B75504009B +:104BCC00014729469385C59B49B90EA291E1014540 +:104BDC0048C201458280AE86B75504000147314674 +:104BEC009385A59C9DB90EA291E1014548C2014552 +:104BFC008280DA21854763FFE702011122CC2A84E7 +:104C0C00884106CE1DC12EC6854597B0FB1FE78097 +:104C1C00E05C2A8722856244B246F240B755040014 +:104C2C0039469385259E05610DB9F24062440945CC +:104C3C000561828009458280914785C518218D4682 +:104C4C00914763F0E602FD15C205C181B3C6E502CA +:104C5C003308D70263970501050516A23AA248C28C +:104C6C0081473E858280DC210947AE866385E7005B +:104C7C0041476399E700B7550400014741469385C6 +:104C8C0065A2E1BE09458280B335B00013952500BD +:104C9C008280011122CC26CA06CE98258547AA848B +:104CAC002E844946631FF70099363E20491513069A +:104CBC00200963C8A700F2406244D244094505614B +:104CCC008280183485476314F70013660604484045 +:104CDC0001C98D4532C697B0FB1FE7802050324684 +:104CEC00A2866244F2402A872685D244B755040036 +:104CFC009385C59E056195B68D4763F8B7021C3147 +:104D0C001821F115A207D98F1EA23C313821C205FA +:104D1C00A207C181D98F3EA24EA289C5110508C632 +:104D2C000145828023240600E5BF114582800111D4 +:104D3C0022CC2A84884506CEAE8601C92EC695455E +:104D4C0097B0FB1FE7808049B2462A8722856244D0 +:104D5C00F240B75504005946938505A00561F5BC92 +:104D6C00B335B000139525008280AE86B75504008C +:104D7C00014761469385E5A1CDB48547114563F0A4 +:104D8C00D7021C320C22A207CD8F1EA39387E6FFFD +:104D9C003EA389476386F600090650C3014582800D +:104DAC0023220700E5BF014781467946814575B44A +:104DBC009E211CA19E21A1831CB109458280BC218E +:104DCC0005471CA18A216397E7000A0505054205E2 +:104DDC0041818280C9473305F502CDBF8A210A057E +:104DEC00420541818280BE211CA18A21BE2133054E +:104DFC00F50205054205418182808A2182808A2143 +:104E0C0082808A218280BE211CA18A21BE21330589 +:104E1C00F50205054205418182809E211CA19E213F +:104E2C00A1831CB1BE213CA1BE21A1833CB1CA21EE +:104E3C0011054205418182809E211CA19E21A183E6 +:104E4C001CB1AA210905420541818280894711457F +:104E5C006398F6001C3214220145A207D58F1EA3BD +:104E6C0082809A21D947AE8663F9E700B7550400D2 +:104E7C0001470D469385C5DB51BC09458280114520 +:104E8C00639DA6001C3214220145A207D58F1EA3D8 +:104E9C003C323422A207D58F3EA38280BC21054729 +:104EAC00FD1793F7F70F6361F7049E2195CF01115E +:104EBC0022CC2A84C84106CE1DC12EC6894597B086 +:104ECC00FB1FE780A0312A8722856244B246F2405C +:104EDC00B755040015469385A5DC056105BCF24069 +:104EEC0062440945056182800945828095471145D8 +:104EFC0063F1D706411122C426C24AC006C61C3231 +:104F0C00BA841822A2073284D98F9EA03C32382250 +:104F1C0093054400A207D98FBEA08947DCA009469F +:104F2C0013855400368997B0FB1FE7800040930728 +:104F3C00A9FF9EA49947631BF90023A60400B24065 +:104F4C002244924402490145410182801904C0C4A3 +:104F5C00FDB782809E2195CF011122CC2A84C841B5 +:104F6C0006CE1DC12EC6854597B0FB1FE7800027D6 +:104F7C002A8722856244B246F240B75504001D468A +:104F8C00938585DE056159B2F2406244094505619D +:104F9C008280094582809947639DF60289474111B9 +:104FAC0006C65CA31C321422B285A207D58F1EA3A1 +:104FBC003C3234225023A207D58F130557003EA351 +:104FCC00910597B0FB1FE7804036B2400145410187 +:104FDC008280D14711456394F600C147C9B78280DE +:104FEC009E219DCF011122CC2A84C84106CE05C535 +:104FFC002EC6894597B0FB1FE780401E2A87228565 +:10500C006244B246F240B75504002546938525DF2D +:10501C0005616FF0BF8FF2406244094505618280E3 +:10502C0009458280894711456398F6001C32142289 +:10503C000145A207D58F1EA38280011122CC2A84A0 +:10504C00C84106CEAE86014709C92EC6854597B024 +:10505C00FB1FE780A018B2462A8722856244F240E3 +:10506C00B75504002D46938565E005616FF01F8AE6 +:10507C001145639DA6001C3214220145A207D58F51 +:10508C001EA33C323422A207D58F3EA3828001118D +:10509C0022CC2A84C84106CEAE8601C92EC68545CF +:1050AC0097B0FB1FE7808013B2462A8722856244A3 +:1050BC00F240B755040035469385A5E005616FF0C5 +:1050CC00FF8493F71600114581EB89476386F60040 +:1050DC00858256A310C301458280011122CC2A84FB +:1050EC00C84106CE05C52EC6854597B0FB1FE78087 +:1050FC00E00E2A8722856244B246F240B75504007E +:10510C003D469385E5E005616FF05F80F2406244B7 +:10511C000945056182809E219DCF011122CC2A84F4 +:10512C00C84106CE05C52EC6894597B0FB1FE78042 +:10513C00E00A2A8722856244B246F240B755040041 +:10514C004546938525E105616FF04FFCF2406244C2 +:10515C0009450561828009458280854763F6D7023F +:10516C0008A70CB71C320C22A207CD8F1EA3938765 +:10517C00E6FF3EA389476386F600090650C3014546 +:10518C00828023220700E5BF1145828001478146BA +:10519C004D4681456FF08FF78D47114563F4D7026B +:1051AC001C320C22A207CD8F1EA33C322C22A2074C +:1051BC00CD8F3EA39387C6FF5EA36386A600110620 +:1051CC0010C70145828023240700E5BF011122CCC2 +:1051DC002A84884506CEAE8601C92EC6954597B061 +:1051EC00FB1FE780A0FFB2462A8722856244F2406B +:1051FC00B75504005D46938565E205616FF00FF1CC +:10520C00854711456395F6001C2201451CA382803D +:10521C0001478146654681456FF04FEF011122CC65 +:10522C002A84C84106CEAE86014709C92EC68D45D3 +:10523C0097B0FB1FE78080FAB2462A87228562442A +:10524C00F240B75504006D46938545E405616FF057 +:10525C00CFE0011122CC2A84C84106CEAE8601478C +:10526C0009C92EC68D4597B0FB1FE78020F7B246C3 +:10527C002A8722856244F240B7550400754693850F +:10528C0045E405616FF06FDD011106CE2EC6EF907F +:10529C00D05419C5B245F2402A2105616FE00015C2 +:1052AC00F240494505618280B7370020A38007F89A +:1052BC00B7370020238007F8B737002023A407F660 +:1052CC00B737002023A607F6B737002023A807F628 +:1052DC00B737002023AA07F6B737002023A207F61A +:1052EC00B737002023A007F6B7370020239C072AE6 +:1052FC00930640389387872BB6B3F1761307400B90 +:10530C00938606B8BAA3D6B311679D46130600055B +:10531C009305000A1305007DDAA3F6B341478546D1 +:10532C00130810F8BAA7DAA7BAABDAABFAAB9AAF94 +:10533C009AB7EEA38EA7F2A792ABAAAF239E070053 +:10534C00239F070023900702B6B7239607032397E2 +:10535C0007029308F007239807022392E70423938C +:10536C00E704239FE7042390E7062391E7062392A3 +:10537C00E706239917031307C01CD6BBF6BB239C67 +:10538C000702239D0702239E0702239F07022390F7 +:10539C0007042391D7042394070423950704239629 +:1053AC00D7042397C7042398C7042399A704239AE7 +:1053BC000704239B0704239C0704239DC704239EF7 +:1053CC00C7042393A7062394070623950706239661 +:1053DC0007062397B7062398B70623990706239A3F +:1053EC00E7065147239DE7067D57239B0706239C21 +:1053FC000706239ED706239F0706239007082391B1 +:10540C000708239207092393E7088280011126CA13 +:10541C00AA84214522CC06CE2E8432C636C43AC28A +:10542C0097B0FB1FE780A0E00DC5A246124732469D +:10543C00930700FD1CA1994704B13CA174A178B15C +:10544C0052A1AA8522856244F240D24405616FD0F4 +:10545C00BFE3F2406244D24405618280B73700203A +:10546C0023A4A7F68280B737002023A6A7F6828054 +:10547C00B737002023A8A7F68280B737002023AACD +:10548C00A7F68280011122CC4AC806CE26CA2A89E8 +:10549C000144B30489006368B400F2406244D2440E +:1054AC004249056182802EC6EFD01FF89317050183 +:1054BC00C183A183B2459CA09307140093F7F70F07 +:1054CC00850463F8B700CA97090488A31374F40F12 +:1054DC00C9B73E84C9B7411122C437340020130424 +:1054EC0084296A20C16706C6FD17630EF500B7371D +:1054FC00002003C6C73FB7350020938585F7EF9092 +:10550C00F00FFD577EA0B24022444101828009C9B0 +:10551C0025151375F50F1335850E1345150082806F +:10552C000145828023900500C1C6797122D426D210 +:10553C004ECE52CC5AC806D64AD056CA5EC636840F +:10554C00328AAE892A8B814463F24407B3079400F4 +:10555C009C23138914004209939A070193DA0A01D8 +:10556C001359090163840A04CA976341FA04B30707 +:10557C00240183CB07005E85593F0DC99387FAFF41 +:10558C002390F90063906B03130519002295B25018 +:10559C00225492540259F249624AD24A424BB24BBB +:1055AC0045618280D694C204C18079BF0145C5B7DC +:1055BC0001458280011122CC3734002026CA4AC80A +:1055CC004EC69307842906CE2E89D0CB8CCBC8C768 +:1055DC00AA8441469305F00F4A8597B0FB1FE780DC +:1055EC0060ED854913048429631935030848C145C6 +:1055FC00513D41469305F00F268597B0FB1FE78080 +:10560C0060EB05496315250348446244F240D244DB +:10561C004249B249C1450561B5B5414681454A8506 +:10562C0097B0FB1FE78000E9E31535FDC1B7414694 +:10563C008145268597B0FB1FE780C0E7E30625FD73 +:10564C00F2406244D2444249B24905618280411120 +:10565C0022C43734002026C24AC0AE842A891306DD +:10566C00000281451305842906C697B0FB1FE7800D +:10567C0060D293078429A3812701B73700202380A8 +:10568C009740EFD0F058854719C181474945230C05 +:10569C00F428B2402244924402494101828081475D +:1056AC0091C909C985476319F500DC3193E707FCFB +:1056BC00DCB185473E85828089476316F500DC3175 +:1056CC0093F7F703F5B70D478547E315E5FED8319A +:1056DC001377F70313670704D8B1E9BF814785C176 +:1056EC0019CDD8319306000C85471377070C630846 +:1056FC00D700930600048D476303D70089473E8586 +:10570C008280411122C4005D06C626C21DC8AA842F +:10571C00085009C597B0FB1FE780009F485009C58A +:10572C0097B0FB1FE780409E085409C597B0FB1F3C +:10573C00E780809D228597B0FB1FE780E09C23AC1F +:10574C000402B240224492444101828019E9B737E5 +:10575C00002083C7A72991C737350020130585F58D +:10576C008280373500201305052B8280B737002047 +:10577C0003C5A7298280B737002003A5472A82805A +:10578C00B737002003A5872A8280B737002083A76C +:10579C00C72A88438280B737002093878729D44B48 +:1057AC009842050798C2A8339307F00F6305F500DC +:1057BC0091656FD09FE18280011122CC06CE2E84A0 +:1057CC0032C6EF9030129147B2456310F502B737ED +:1057DC00002083A747F795C303A30700630F0300BB +:1057EC0022856244F24005610283B737002083A70B +:1057FC00C7F681C703A34700D5B7F24062440545FD +:10580C0005618280011122CC2A844A2106CE26CA47 +:10581C004AC84EC697B0FB1FE78040272DC52A8982 +:10582C0004218349C500F13D4A85EF90F0494A2097 +:10583C00EF90900637390020130909F883470900C7 +:10584C00B9C763969704B737002083C517F8268528 +:10585C00253C19E1230009004A20EF90B00891473C +:10586C00631CF500B7370020938787295620FA234D +:10587C006394E6007D57FAA3F2406244D244424955 +:10588C00B2490561828081499304F00F65B7930793 +:10589C00F00FE383F4FC7420522028204E87A68559 +:1058AC00B5365DBF79715EC6AA8B2E8552CC56CAB1 +:1058BC005AC806D622D426D24AD04ECEAE8A328BC5 +:1058CC00368A97B0FB1FE780601C7DC1045D2A8976 +:1058DC00E5C09C50614599C3130540039C5481C796 +:1058EC0051054205418163050A007105420541815C +:1058FC00DC5081C75D054205418197B0FB1FE780F5 +:10590C0000932A8455C56146814597B0FB1FE780FB +:10591C0060A8B737002083C9872E63940900834998 +:10592C000900930700FD1CA0A947A30074013CA02B +:10593C00230364018C50231254011305840191C973 +:10594C0008C47146930A440397B0FB1FE780E09D9F +:10595C0056858C5491C948C45146930A450197B059 +:10596C00FB1FE780809C5685630C0A0008C87146B3 +:10597C00D285930AC50197B0FB1FE780009B568523 +:10598C00CC5099C548C85D4697B0FB1FE780E0999D +:10599C00A2854E85EFD05F8F2254B2509254F249BB +:1059AC00624AD24A424BB24B4A850259456191BB7D +:1059BC00B250225492540259F249624AD24A424B92 +:1059CC00B24B4561828001114EC6AA892E854AC808 +:1059DC0006CE22CC26CA2E8997B0FB1FE780000B7F +:1059EC0039C5B737002083C4872E91E004211945AF +:1059FC0097B0FB1FE780A0832A8415C981451946FF +:105A0C0097B0FB1FE7800099930700FD1CA0B947D6 +:105A1C00A30034013CA023122401A2856244F2406D +:105A2C004249B2492685D24405616FD0FF85F240C8 +:105A3C006244D2444249B2490561828039715ECEDA +:105A4C00AA8B2E8526DA4ED652D456D25AD006DEE2 +:105A5C0022DC4AD8AE84328BB68A3A8ABE8942C6D8 +:105A6C0097B0FB1FE780800239C92A89414597A06E +:105A7C00FB1FE780C07B2A8439C14146814597B022 +:105A8C00FB1FE7802091B737002003C5872E19E153 +:105A9C0003450900930700FD1CA0BD473CA0B2477D +:105AAC00A300740146A023046401A304540123053C +:105ABC004401A30534015CC4A285EFD0EFFCF25085 +:105ACC006254D2544259B259225A925A025BF24B46 +:105ADC0021618280797126D2AA8439454AD04ECE72 +:105AEC0006D622D42EC6B289368997A0FB1FE78032 +:105AFC0000740DCDB2459307000D1EA1B1472A8449 +:105B0C004EA13CA1CE851905194697B0FB1FE78025 +:105B1C00C08123062401A2852254B2500259F249B5 +:105B2C0013F5F40F925445616FD00FF6B250225416 +:105B3C0092540259F24945618280411126C2B73410 +:105B4C00002093848429B83006C622C44AC0930727 +:105B5C00F00F6308F7042A89394597A0FB1FE780EB +:105B6C00006D2A841DCD930700FDB73500201CA1C4 +:105B7C00A3002501230105009385052B0D0519466E +:105B8C0097A0FB1FE780607A9E24A285A8303EA4D4 +:105B9C009C305CA42244B2409244024941016FD033 +:105BAC00AFEEB2402244924402494101828001117D +:105BBC005AC02A8B314526CA4EC652C456C206CE8E +:105BCC0022CC4AC8AE84B28A368ABA8997A0FB1F07 +:105BDC00E780E0652DCD2A84268597B0FB1FE780F2 +:105BEC00E0EA09C55825A1476311F704B73700202F +:105BFC0003C9B729930700FD1CA09D47A3006401AE +:105C0C003CA046A023135401231444012315340152 +:105C1C00A2856244F240D244B249224A924A024BD3 +:105C2C004A85424905616FD02FE6B737002003C97A +:105C3C001740E3110BFCB737002083A707049C47E0 +:105C4C00D5DBCE865286D6852685829765B7F240FF +:105C5C006244D2444249B249224A924A024B0561FB +:105C6C008280011122CC2A84214506CE2EC697A013 +:105C7C00FB1FE780C05B15C5B245930700FD1CA157 +:105C8C00C5473CA1BC313CB1DE215EA1FC217CA10D +:105C9C00FC31AA857CB122856244F24005616FD04B +:105CAC00AFDEF24062440561828041114AC02A890C +:105CBC00714526C206C622C4AE8497A0FB1FE7809E +:105CCC0000573DC5930700FD1CA1F5473CA1BC3016 +:105CDC002A849385C4003CB1DE2031051946231C6F +:105CEC00F5FEFE20231DF5FE9E24231EF5FEBC248E +:105CFC00230FF5FEBC34A30FF5FE97A0FB1FE78026 +:105D0C00C062BC28A2854A853CA8DE285EA8FC2877 +:105D1C007CA8FC387CB89C2C1CAC9C3C1CBCBC2CC3 +:105D2C003CAC2244B2409244024941016FD0CFD5E1 +:105D3C00B2402244924402494101828001114AC876 +:105D4C002A89614526CA4EC606CE22CCAE89B284BB +:105D5C0097A0FB1FE780A04D25C1930700FD1CA158 +:105D6C00BC302A84938584001CB195473CA1FC303F +:105D7C0011051946A30FF5FE97A0FB1FE780E05A0B +:105D8C00DE2023063401A2853EA4BE2C4A857EA4C7 +:105D9C00DE2C1EA8FE2C3EA883C704025CA883C779 +:105DAC0014025CB8BE30F240D2447EA86244424930 +:105DBC00B24905616FD04FCDF2406244D2444249A2 +:105DCC00B24905618280411122C43734002013048A +:105DDC0084293C2006C626C285CBB7340020AA8570 +:105DEC001946138584F597A0FB1FE78000542820E3 +:105DFC00938584F5EFF0BF8A2244B240138584F575 +:105E0C00924441016FD08061B240224492440145DA +:105E1C0041018280411126C2B73400209387842926 +:105E2C0006C622C44AC0B8339307F00F9384842962 +:105E3C006301F7042A89294597A0FB1FE780203FBF +:105E4C002A8405C9930700FD1CA1A147A3002501C5 +:105E5C003CA1BC20B7350020938585F53CB1194693 +:105E6C00110597A0FB1FE780404CA830A285EFD00E +:105E7C00AFC1B8208D476311F702B737002083A755 +:105E8C0007F799CB03A38700630803002244B240B1 +:105E9C009244024941010283B24022449244024995 +:105EAC0041018280797122D406D626D24AD04ECEB8 +:105EBC0052CC56CA09444DCD2A890A21AE89514487 +:105ECC0097B0FB1FE78080BCAA845DC137370020E8 +:105EDC009307C73FDC238546BA8AFD1793F7F70F64 +:105EEC00494463F7F6085825A1476314F7006391FA +:105EFC0009089C5C4544ADEF91659385457113058C +:105F0C00C00297A0FB1FE780201388DC2A8A4D442F +:105F1C0025C11306C002814597A0FB1FE78080476F +:105F2C008357090093064A0036852311FA007146FF +:105F3C009305490036C697A0FB1FE780003F8947B1 +:105F4C002300FA00C824B2460356090083C5CA3F91 +:105F5C00611513351500EFA0201D2A8463860900F6 +:105F6C00CE852685EF90300401C42685EFF06FF9BD +:105F7C002285B250225492540259F249624AD24AB2 +:105F8C0045618280B737002083C707400547FD175E +:105F9C0093F7F70F6377F708894749C6011122CCAD +:105FAC0026CA4AC84EC652C406CEAA89368AB284BC +:105FBC002E8997B0FB1FE78060AD2A84D14731C58D +:105FCC00485509C597A0FB1FE7800014F1452685AD +:105FDC0097A0FB1FE780A04148D4CD471DC5542492 +:105FEC0021478147639DE600630B0A00382D122977 +:105FFC0093062501AA854E85EF905001AA8758205B +:10600C00630E09001367670058A0F2406244D24443 +:10601C004249B249224A3E85056182801367470096 +:10602C00E5B7C9473E8582809307200463EAA70041 +:10603C00B73700209387872B06053E950A2182806F +:10604C0041657D158280011122CC2A842E8526CAB9 +:10605C0006CEAE8497B0FB1FE78040A30DCDB747AB +:10606C000F009387F723094563E2870281450A8570 +:10607C00414697A0FB1FE780E031A68560800A852A +:10608C0041804081A3010100EF90D06AF24062444C +:10609C00D244056182804945D5BFB7370020238F94 +:1060AC00A73E82806FA0A002797152CC2A8A3285D9 +:1060BC0022D426D24AD04ECE56CA5AC85EC606D66E +:1060CC0062C4AE8BB28A368BBA843E89C28946844E +:1060DC0097B0FB1FE780809B0DC92A8C63130A02C3 +:1060EC0013774B005C2115CF93E727012302FC00AB +:1060FC008DEC631C0902639A090205E8ED9B2302EF +:10610C00FC00832B8C0363910B08B25022549254E5 +:10611C000259F249624AD24A424BB24B224C456177 +:10612C008280F59B93E70701D1B793E747002302E1 +:10613C00FC0001CC1C484146A2852324FC0213051B +:10614C008C0197A0FB1FE780401E63930B02D5D8F0 +:10615C000325CC0209C597A0FB1FE780E0FAF145A7 +:10616C00268597A0FB1FE78080282326AC0251BF11 +:10617C00E30909F80325CC0209C597A0FB1FE780AA +:10618C00A0F8F1454A85F1BF9DC483A70B0299EB9A +:10619C00916593853571714597A0FB1FE780C0E928 +:1061AC0023A0AB0203A50B0219C57146A68597A0C7 +:1061BC00FB1FE78080176388090283A74B0299EBCA +:1061CC009165938525715D4597A0FB1FE780C0E61F +:1061DC0023A2AB0203A54B0219C55D46CE8597A041 +:1061EC00FB1FE78080141DC483A78B0299EB91657C +:1061FC0093851571514597A0FB1FE780E0E323A41D +:10620C00AB0203A58B0219C55146A28597A0FB1FB3 +:10621C00E780A0112254B2509254F249B24B224C56 +:10622C00CA865A860259424BD6855285D24A624A50 +:10623C0045616FF02FE7011126CA52C406CE22CC5D +:10624C004AC84EC62A8AAE8497B0FB1FE7800084EA +:10625C0035C1AA89394597A0FB1FE78040FD2A84E8 +:10626C0031C9B737002003C9872E6314090003C94D +:10627C0009009307000D1EA0AD473CA09385690053 +:10628C0013053400194697A0FB1FE780000A93F70B +:10629C001400858085885CA444B423154401A28530 +:1062AC006244F240D244B249224A4A8542490561CD +:1062BC006FC09FFDF2406244D2444249B249224A27 +:1062CC000561828001114EC652C456C206CE22CC44 +:1062DC0026CA4AC8AA8A2E8AB28997A0FB1FE780D1 +:1062EC00E07A2DCD2A891305C00297A0FB1FE78009 +:1062FC0000F42A8425C5B737002083C4872E99E083 +:10630C00834409009307000D1EA0E9473CA09305A8 +:10631C00690013053400194697A0FB1FE780E000C5 +:10632C00D285231554011305C400414697A0FB1FC9 +:10633C00E780A0FFCE851305C401414697A0FB1F43 +:10634C00E780A0FEA2856244F2404249B249224A4B +:10635C00924A2685D24405616FC01FF3F240624415 +:10636C00D2444249B249224A924A05618280411183 +:10637C0022C437340020130404F6084006C619C59D +:10638C0097A0FB1FE78040D823200400B240224492 +:10639C0041018280011106CE22CC26CA4AC82EC6E3 +:1063AC0097A0FB1FE780806E31CDB245B737002038 +:1063BC0003C9872E0CD5AA84631409000349050070 +:1063CC00414597A0FB1FE78080E62A8405CD930703 +:1063DC00000D1EA1A5473CA1DC309385640011057E +:1063EC00A30FF5FE194697A0FB1FE78000F49C5401 +:1063FC00A285F2405CC46244D2444A85424905619C +:10640C006FC09FE8F2406244D244424905618280E9 +:10641C001D71A2CC86CE2A842EC697A0FB1FE780C6 +:10642C00E06615C954251147AA8749456391E602D0 +:10643C009C5FB24591C3EC2BB71605002308B10045 +:10644C009386E6FE100889452285EF90E02CF640F5 +:10645C006644256182805145DDBFB737002083C774 +:10646C0007400547FD1793F7F70F637AF704894741 +:10647C0021CA411122C426C24AC006C6B2842E8942 +:10648C0097A0FB1FE78080602A84D14715C1630663 +:10649C0009005C2193E727005CA14146A685130502 +:1064AC00840197A0FB1FE78040E89C481CD48147DF +:1064BC00B2402244924402493E8541018280C94740 +:1064CC003E858280797122D406D62A842EC697A066 +:1064DC00FB1FE780A05B01CDB2452285230EB100E6 +:1064EC006C08EF90E028B2502254456182805145EF +:1064FC00DDBF6F801034C1671387E7FF6395E5023A +:10650C00B737002083A7C7F691EB494582804945F0 +:10651C00B2402244924402494101828003A3070005 +:10652C00E30503FE0283411122C426C24AC006C6FB +:10653C00FD172A892E84B284639AF502B73700209E +:10654C0083A7C7F691CF9C4381CF829711E9B737C8 +:10655C000020238027F9B7370020A38097F84DBF80 +:10656C00A6854A85EFE05FD245F5D5B72E8597A075 +:10657C00FB1FE780A05141DD1C210D45E39A27F953 +:10658C0022852244B2400249A685924441016FC043 +:10659C00F0659307200463E1A7064111C16722C48B +:1065AC0006C626C2FD172A8409456381F502C54734 +:1065BC00AE846312F4022E85EFC0D06A373500200A +:1065CC001305852B06042A9406A00145B2402244EB +:1065DC009244410182809307A0036316F4002E8538 +:1065EC00EFC09061E1BF9307B003E319F4FC13F51E +:1065FC00F50FEFC0B060D9B709458280011106CE06 +:10660C002AC6EFE07FCAEF20C06DEF10F012EF70DA +:10661C004225B737002093878729130700F0BAA3C8 +:10662C0023820700B737002032451387C73FFD563A +:10663C0034A3F240238EA73E954505616F70C0438D +:10664C007571939705014AC106C722C526C3CEDED4 +:10665C00D2DCD6DADAD8DED6E2D4E6D2EAD0EECE86 +:10666C00C1872E8963D30754B734002003C5C43FB8 +:10667C00B7390020373B002097A0FB1FE78080C074 +:10668C002A8426CCB73A0020B73B0020373D0020A7 +:10669C0093848929B73C00201DE021653345A9006E +:1066AC00BA402A449A440A49F659665AD65A465B65 +:1066BC00B65B265C965C065DF64D496182801C20BB +:1066CC001307200A639BE70003CA34002A20C16524 +:1066DC002286FD15EFF04F8EA1AA62471307C73F24 +:1066EC00034A270013071009639FE7141C30154752 +:1066FC006391E7022285EFF0EF902285EFC0FFB3A4 +:10670C00E24703C5C73F97A0FB1FE780A0B72A84C9 +:10671C0061B739476391E7164A208567A50763156A +:10672C00F5040C4403CC0500631D0C00850591C9D0 +:10673C003735002019461305052B97A0FB1FE78062 +:10674C00C0BE03C789298547631FF70E63080C0079 +:10675C00238C09286285EFF04FBE45B78947238CFF +:10676C00F928EFC0704B51BF896713872700631856 +:10677C00E504032C840063080C0C83470C0099EB94 +:10678C0083472C0003471C00A207D98F9EA4834784 +:10679C003C009CB003C7892989476316F70A8347D5 +:1067AC000C0091C7238C092803450C006DB78C3065 +:1067BC008A248D47238CF928EF70C02EF5B79507E6 +:1067CC006317F5001C448823EFF0CFE43DB7F9774D +:1067DC001387A7FF2A9742074183914663F1E6048A +:1067EC009387A7FCAA97C207C18371476371F7020D +:1067FC0089671387B7006310E50483A78AF6E38ED5 +:10680C0007EE9C43A285E38A07EE829715A0370713 +:10681C0000181307F770B357F700858BB9C7832798 +:10682C000BF7E38C07EC9C43E38907EC22858297FA +:10683C00E31505EC09A81387C700631FE5001C448A +:10684C009C23E38C07EA9307F00FE308FAEAA2858E +:10685C005285EFC07FA36DB5B9076318F50083A708 +:10686C00CCF6E38C07E8DC4371BF89679387170488 +:10687C00E305F5F8C9BF3D476397E7044A208967EC +:10688C001387D700E30DE5FC13879701E309E5FCBB +:10689C00CD07E31AF5FAFA20C167FD17631DF7005F +:1068AC0083A7CCF6E38B07E4DC43E38807E40965B4 +:1068BC00A2854D0599BFB737002083A747F7E38E14 +:1068CC0007E29C43DDB71307E003E39EE7F63C20A9 +:1068DC000547639BE7107C2037370020930D07F6A4 +:1068EC006397070E83A70D00E5C303CC0700214A6D +:1068FC00683013078400BA853ACEEFE03FDE68B00B +:10690C00130640028145681097A0FB1FE78080A802 +:10691C003C3072471946A307F1027C30BA854818FF +:10692C00A309F10297A0FB1FE78020A05E20701046 +:10693C00D2852318F1027E2462852313F1041E28CC +:10694C002314F1043E282315F1045C282306F104DA +:10695C00FD57A306F104FD572317F104EFF00FBE0A +:10696C003C3072478DE3DD47835804010358E40043 +:10697C0074304E203EC23E283EC00546D28762850A +:10698C00EF80300D28B083A70D0081C71145EFF0C3 +:10699C001F9E03C50BF8138C0BF8E30005D683453B +:1069AC001DF8EFE07F8EE30A05D434309307100313 +:1069BC006389F600522083450C0052873685EFE040 +:1069CC00FFA423000C0015BB03CC34000DB78327A8 +:1069DC000BF703CC3400114A81DFDC43E38A07F068 +:1069EC0081450145829729B7130790026390E70808 +:1069FC007C2037370020930D07F6A9E783A70D00FD +:106A0C009DCF03CC0700214A683093772500B9C786 +:106A1C0005891307440168B02286D28562853ACE77 +:106A2C00EFF0CFB13C307247B9FFDD478358C4015A +:106A3C000358A40174304E203EC27E2C35BF03CCCB +:106A4C003400D1B783270BF703CC3400114ACDDFC8 +:106A5C00DC43DDDB8145014582977DB7130784005C +:106A6C00BA853ACEEFE09FC7724775B70947639C6A +:106A7C00E70083A78AF6E38207C8DC43E38F07C6E7 +:106A8C00228582979DB92D476398E70083A78AF6E4 +:106A9C00E38507C69C47DDB70D476396E700228662 +:106AAC008D454A2005B91947639CE7049305A1025B +:106ABC0013051031EF60D2626C1013052031EF60BA +:106ACC00326272208357C1024A2063E7C700162442 +:106ADC000357A10263F7E60093050002EFC090177D +:106AEC0029B96373E6007AA063F3D7001EA45A2475 +:106AFC00362412246E2001488147EFC07015F5BE74 +:106B0C001D47E382E7D431476395E7002286B14500 +:106B1C0049BF35476398E70083A78AF6E38F07BC24 +:106B2C00DC47A9BF130740026396E7002285EF00FC +:106B3C00407EE1B6130750026398E70083A78AF6FC +:106B4C00E38D07BA9C4B1DBF41476396E700228536 +:106B5C00EF0090065DB645476396E7000145EF00F0 +:106B6C00701561BE4947639DE70083270BF7E38CE3 +:106B7C0007CCDC43E38907CC814505458297E1B11D +:106B8C004D47639CE70083270BF7E38E07CADC4372 +:106B9C00E38B07CAA2850945D5B713076002E394B6 +:106BAC00E7CA228693056002EDBD93F7150089CFE5 +:106BBC00B737002083A787F689C7DC4399C3014503 +:106BCC00829713451900E9BC93F7250091CFB7378D +:106BDC00002083A707F791C7DC4381C78145054592 +:106BEC008297134529006DBC93F745000145E38955 +:106BFC0007AAB737002083A747F6373400201304C1 +:106C0C00842989CF85475CA0B737002083A707F775 +:106C1C0091C7DC4381C781450545829748446C1078 +:106C2C00EF90E01D6810EFF00F9AB737002083D774 +:106C3C00A72D81CF130600643386C702B737002017 +:106C4C0003C5C73F9145EFC03FB61345490089BC0A +:106C5C00011122CC2A84554506CE26CAEFF0CFBCB2 +:106C6C00AA8413054002EFF02FBC2AC6130550026C +:106C7C00EFF08FBBAA86228562443246F240B335D0 +:106C8C009000D24405616FC0D004397122DC06DE5D +:106C9C008D472E84631AF500BA259625F2212830EB +:106CAC00CE21EFE0DFF001A889671387D700631DC1 +:106CBC00E504BC2199E78547F25062543E85216179 +:106CCC00828037340020832504F6F5D5DC87BC316F +:106CDC00480819469105A309F1009790FB1FE7801E +:106CEC00C064930700F03ED6832704F623180100F6 +:106CFC002313010202D4882370008145EFF00F8426 +:106D0C000545EFF0CFE645BF1387E700E305E5FA4D +:106D1C00138737016319E500A82151DD014781462E +:106D2C0001468145BDBFE507E307F5F8B147631997 +:106D3C00F500B737002003C5B729EFE09FF2A5BFD8 +:106D4C00930760026319F500B737002003C5B72914 +:106D5C00EFE0BFF58DB741677D178147E31EE5F482 +:106D6C00D831C947E319F7F4F625D2250A24AE2504 +:106D7C00EFC0C07D2DC55D45EFF00FAB3335A000E6 +:106D8C0068844C202A203000EF80A0083C8485F7D2 +:106D9C009305A10013051031EF6092346C001305BC +:106DAC002031EF60F2333C851A246373F7001EA484 +:106DBC003C863A2463F3E7003EA41E243A24637312 +:106DCC00F7003EA42A20EF30411B7A2456243224AB +:106DDC000E242A2001488147EFC08065E9BD854714 +:106DEC007C8445B7B73700201387C73F743313072C +:106DFC00F00F638FE6062DCD411122C426C24AC086 +:106E0C0006C6AA8468251389C73F51059790FB1FB6 +:106E1C00E780E0412A8439C59307000D1EA1D947AC +:106E2C003CA1DE205EA1FC207CA1FC307CB19C242A +:106E3C001CA5DC345CB5F02470A515C28C4851053A +:106E4C0008C89790FB1FE780404EA285224403455B +:106E5C007900B2409244024941016FC0EFC223282D +:106E6C000500E5B7B24022449244024941018280B8 +:106E7C008280C1671387E7FF639DE500B737002069 +:106E8C0083A707F695C39C230D47639DA7006FC08E +:106E9C006059FD1749476397F500B737002083A762 +:106EAC0007F6F5F73A8582804947EDBF397122DC48 +:106EBC0006DE26DA4AD84ED652D456D25AD05ECEF8 +:106ECC0062CC182185472A846309F70410259306A0 +:106EDC0095009305E1000545EFE0CFE4814711C132 +:106EEC001C21142011476382E60437370020032746 +:106EFC0047F88D461833630AD70285CB1DC70DE1C1 +:106F0C000145F2506254D2544259B259225A925A03 +:106F1C00025BF24B624C2161828081470145D1B703 +:106F2C008546631ED7088D8BE1DF0830130A2400D9 +:106F3C00D285EFE0AFFA3739002008B0832789F803 +:106F4C002A8B130989F88149C1C3B73A00209304ED +:106F5C00F00F83C72AF8138C2AF863FAF902032579 +:106F6C000900939B49005E951C21638197061C3197 +:106F7C00639E67051946D28509059790FB1FE7802C +:106F8C00C04B29C5832409001820DE94B1E41420D9 +:106F9C009147E387F6F683270900BDD303460C001F +:106FAC0001479305F00FE30DE6F4BE84C10703C55A +:106FBC0007FF6301B50C05071377F70FEDB789468B +:106FCC00E310D7F4858B8DB7054525BF850993F95B +:106FDC00F90F41B788C4C9A891476312F706C84492 +:106FEC000DC11C241021630EF60418209147631860 +:106FFC00F706C84419C59790FB1FE780E01023A63D +:10700C000400082491659385E57105059790FB1F95 +:10701C00E78080020DC118209147631BF704C8C498 +:10702C001C24930594000505A30FF5FE10249790DE +:10703C00FB1FE780802F08243335A000D9B5884486 +:10704C0045B79305940005059790FB1FE780E03E3C +:10705C008547E31CF5F85545EFE01FFDADA08844CE +:10706C004DD19790FB1FE780200A23A4040051BF49 +:10707C0088C47DB794A01C30D285138524009CB0A5 +:10708C0019469790FB1FE780402A08249165938549 +:10709C00F57105059790FB1FE78000FA0DC11820CC +:1070AC009147E319F7F2C8C41C2493059400050515 +:1070BC00A30FF5FE10249790FB1FE78000271C24DC +:1070CC0081F708207D151335150025BD397122DC9B +:1070DC0026DA4ED652D406DE4AD856D25AD05ECED6 +:1070EC002A84930925000831CE85B7340020EFE0BF +:1070FC00EFDE08B0938444F89C400D472A8A9C33F9 +:10710C006390E70437390020832789F8814A1309F3 +:10711C0089F863810714B73B002003C72BF89397BA +:10712C000A01C18303250900138B2BF863E0E70CDC +:10713C0083460B000327090081471306F00FBDAAF5 +:10714C00F1D3144C70389305E1000545EFE08FBD89 +:10715C0015C9984085461C2118336310D7028D8BB6 +:10716C00D5F30145F2506254D2544259B259225AC5 +:10717C00925A025BF24B216182808946858BE31324 +:10718C00D7F8F9BF1C2011476385E7002D47E39A18 +:10719C00E7FCB734002083A784F8938484F8F1D3F8 +:1071AC00814A0149B73B002005A88840139B4A003F +:1071BC001C205A9518216310F7021C31639D47015E +:1071CC001946CE8509059790FB1FE780002701C55E +:1071DC0003A904005A99850A03C72BF893970A014F +:1071EC00C183E3E4E7FCE31F09F0A5BF93944A00D5 +:1071FC00269518211C206318F70A1C316395470B40 +:10720C001946CE8509059790FB1FE780002341CDD9 +:10721C00832709001147BE941C206385E7002D4786 +:10722C00639CE70203AAC4007C3803460A00630887 +:10723C00F60252859790FB1FE78000ED6838916548 +:10724C009385E57105059790FB1FE780E0DE1DE552 +:10725C00E38004EE054539B703AA8400F1B70C4C62 +:10726C0013051A009790FB1FE780201D8547E3123A +:10727C00F5FC5545EFE05FDB61DDE5B51C20114702 +:10728C006385E7002D47639EE700C8C47C3805057D +:10729C00A30FF5FE70380C4C9790FB1FE780E008AD +:1072AC0045BF88C4E5B7850A8DBDBA8441078345BF +:1072BC0007FF638AC5008507C207C183E3E7D7FED2 +:1072CC0051BF88C425A81C20CE85138524009CA002 +:1072DC001C3019469CB09790FB1FE780000568385E +:1072EC0091659385F57105059790FB1FE780C0D4D8 +:1072FC0035D118209147E316F7FCC8C47C38050536 +:10730C00A30FF5FE70380C4C9790FB1FE780E00143 +:10731C0091B701114AC8373900201309C93F0347F7 +:10732C00790006CE22CC26CA4EC69307F00F630E08 +:10733C00F70625CDAA8461459790FB1FE78020EFC7 +:10734C002A8425C59307000D1EA1D5473CA1BC304E +:10735C0093898400CE853CB1DE205EA1FC207CA10B +:10736C00E830EFE0AFB768B0CE851305840019465E +:10737C009790FB1FE78060FBFC24A28503457900F6 +:10738C007CA49E281EA8BC283CA8BC383CB8DC2891 +:10739C005CA8DC385CB8FC287CA86244F240D2447F +:1073AC004249B24905616FB03FEEF2406244D244AB +:1073BC004249B24905618280411122C43734002010 +:1073CC001304C43F783006C626C29307F00F630936 +:1073DC00F7021DC5AA8419459790FB1FE78020E58D +:1073EC00AA8519CD9307000D1EA1DD473CA1DE2017 +:1073FC00B24092445EA16830224441016FB0DFE894 +:10740C00B2402244924441018280011122CC373493 +:10741C000020832784F806CE26CA4AC84EC652C41A +:10742C008DC3130484F82E8AAA8401490840631280 +:10743C009902630C0A049790FB1FE780E0CC232091 +:10744C000400F2406244D2444249B249224A0561E6 +:10745C00828093194900B3073501884709C9979071 +:10746C00FB1FE78060CA1C40CE9723A407001C407A +:10747C00CE97C84709C99790FB1FE780E0C81C400E +:10748C00BE9923A60900050955B745DD139644009E +:10749C0081459790FB1FE780E0EF144081477D56B4 +:1074AC0013F7F70FE37F97F813974700369710A35E +:1074BC008507FDB779714AD037390020832749F801 +:1074CC0006D622D426D24ECE52CC56CA5AC85EC646 +:1074DC00C5C7B73A0020AA89130949F8938A2AF834 +:1074EC00014405E1B737002083A687F899CA03C683 +:1074FC000A002A8481479305F00F13F7F70F63688E +:10750C00C7081315340021059790FB1FE78020D284 +:10751C00AA8411E921459790FB1FE78040D1AA84EA +:10752C0021C10144CD49930700FD9CA08547A38050 +:10753C003401BCA0A0B045C49389840023A23401BB +:10754C00014A373B0020930BF00F83C70A0063738B +:10755C00FA0029E883270900A6858823EFB0DFD23B +:10756C0003C50A0081455535032509009790FB1F7B +:10757C00E78080B923200900B2502254925402595A +:10758C00F249624AD24A424BB24B45618280139710 +:10759C004700369718236305B70005041374F40FDE +:1075AC008507A1BF83278BF893154A00BE959C21B4 +:1075BC00638377032380F9009C31138529007D14A4 +:1075CC00A380F900194689051374F40F9790FB1FDB +:1075DC00E780A0D5A109050A137AFA0FBDB723A23B +:1075EC0004008DBFB737002083A747F8B1C74111FE +:1075FC0022C406C62A841DE10945EFE0FFA22A86B3 +:10760C0001C9B737002003C5C73F8545EFC0CF99E7 +:10761C000545EFF0EFE32A84054519C8B73700207C +:10762C0003C5C73F8545EFC02FC022856135054591 +:10763C00B240224441018280014582808967938651 +:10764C00B7006315D5009C45882369BF9386C70096 +:10765C006317D5009C458546882319C9FDB79386C9 +:10766C001704E302D5FE938727048146E304F5FE55 +:10767C0036858280797106D622D426D24AD04ECE57 +:10768C0052CC56CA5AC85EC662C479C53C31AA8966 +:10769C0085C7404115C05945EFE01F99931A8501E4 +:1076AC0093DA8A410149373A0020130B000DB54B90 +:1076BC0083C73900636EF900B250225492540259B8 +:1076CC00F249624AD24A424BB24B224C456182800B +:1076DC008307840263C9570783274AF8130C4AF8B7 +:1076EC00BDC32285EFF08FFC39CD0824510597904E +:1076FC00FB1FE780C0B3AA8439C5231065012301A1 +:10770C0075011C201946930524003CB183078402A3 +:10771C0015057CA11C30A30FF5FE9790FB1FE7808D +:10772C00C0C01024D0A415C61385440188C8930585 +:10773C0094009790FB1FE78040BF83270C00A68521 +:10774C008823EFB07FB40509130494021379F90F61 +:10775C0085B723A80400D5B7B737002083A747F80F +:10776C00A1DF893B2254B25092540259F249624A29 +:10777C00D24A424BB24B224C014545616FF04FCD82 +:10778C00797106D622D426D24AD04ECE52CC56CAC5 +:10779C005AC85EC662C45DCD3C31AA8985C74441D6 +:1077AC0095C05945EFE05F88931A850193DA8A41B9 +:1077BC000149373B0020930B00FD414C83C7390036 +:1077CC00636EF900B250225492540259F249624A43 +:1077DC00D24A424BB24B224C456182808387F400E3 +:1077EC0063C55707130A4BF883270A00B9CF5145D5 +:1077FC009790FB1FE780A0A32A8421C92300750161 +:10780C00A3000500230185019C20194693852400C3 +:10781C003CB18387F40015055CB59C30A30FF5FED5 +:10782C009790FB1FE78060B09C2493859400130510 +:10783C00C4003CB419469790FB1FE78000AF832728 +:10784C000A00A2858823EFB03FA40509C10413796F +:10785C00F90FADB7B737002083A747F8A5D79939EB +:10786C002254B25092540259F249624AD24A424BC3 +:10787C00B24B224C014545616FF08FBD5D7186C6E0 +:10788C00A2C4A6C2CAC04EDE52DC56DA5AD85ED6A4 +:10789C0062D466D26AD06ECE630E05263C31AA84C1 +:1078AC008DCB832A450063860A025945EFE0CFF75A +:1078BC0093178501E1873EC60144B7390020130AAE +:1078CC00000D054CB54C130D00FDC14DB830636176 +:1078DC00E402B640264496440649F259625AD25AFA +:1078EC00425BB25B225C925C025DF24D6161828014 +:1078FC000387CA00B2476348F71603A749F81389F0 +:10790C0049F86302071683CB0A0013F70B014DCF1E +:10791C004D47639EEB0623800A005685EFF00FFB64 +:10792C006303051403C70A00914763E3E714631963 +:10793C00870D51459790FB1FE780608F2A8B63045E +:10794C0005122300A501A30005002301B50183C680 +:10795C000A00194693852A0034B18386CA0015059E +:10796C0054B583C61A00A30FD5FE9790FB1FE78072 +:10797C00C09B83C60A01194693851A01A305DB0037 +:10798C001305CB009790FB1FE780209AF9A0554771 +:10799C006398EB0005472380EA00A38B0A00B5BF70 +:1079AC007547E389EBFE49476396EB000947238053 +:1079BC00EA00A5B741476394EB000D47CDBF6D4777 +:1079CC00E39DEBF41147E5B713F78B0019C32D4773 +:1079DC00F9BF13F61B0013F74B0011C619C315475B +:1079EC005DBF2147E9B713F62B0011C619C3254714 +:1079FC005DB719476DBF19C3294755BF1D4745BF13 +:107A0C0003C57A0151059790FB1FE78040822A8BB2 +:107A1C0039C9231045012301950183C60A00194673 +:107A2C0093852A0034B18386CA00150574A183C6D8 +:107A3C001A00A30FD5FE9790FB1FE780008F03C69B +:107A4C007A012306CB0001CA13054B012328AB0096 +:107A5C0083A58A0105BF23280B0083260900DA853C +:107A6C008822EFB07F820504F10A1374F40FB9BDBC +:107A7C0003C57A01130505029780FB1FE780207B65 +:107A8C002A8B75D1C9473CA12310450103C60A00B6 +:107A9C0093F60B0693852A00D18E34B183C61A0057 +:107AAC0019461505A30FD5FE9790FB1FE780E087BD +:107ABC0083C68A00194693851A01A305DB0083C689 +:107ACC009A0013053B012306DB0083C6AA00A3061C +:107ADC00DB0083C6BA002307DB008386CA00A3073A +:107AEC00DB0083D6EA002318DB0083C60A012309D6 +:107AFC00DB009790FB1FE780408303C67A01A30C41 +:107B0C00CB0011C613050B02232EAB0091B7232E0D +:107B1C000B00A1B7B737002083A747F8E38B07DA30 +:107B2C00EFF05F992644B64096440649F259625AE2 +:107B3C00D25A425BB25B225C925C025DF24D014513 +:107B4C0061616FF0EF90B737002083A747F89DC7AE +:107B5C0098238D476315A702B737002003C5C73F8D +:107B6C004111854506C6EFB03FEC13050003EFF05D +:107B7C007F94B240014541016FF08F8DC9473E851E +:107B8C00828079714AD037390020130949F883274C +:107B9C00090006D622D426D24ECE6398070E37346F +:107BAC0000201304C43F5820C947298B5DC7916539 +:107BBC00AA849385D57111459780FB1FE780C04738 +:107BCC002320A900CD4751C978309307F00F6314D7 +:107BDC00F7009C207CB01146A6859780FB1FE780A0 +:107BEC00C074930531001305F041EF40C221B73743 +:107BFC00002093878729A02398813334800011C3F8 +:107C0C00090413051002EFE02FC21379F50F9377D7 +:107C1C00190093794900B1CB1545EFE0EFC0BC20BA +:107C2C00688419455C82EFE02FC06886638E09007A +:107C3C00BC2013052002DC82EFE00FBF6885130522 +:107C4C003002EFE06FBE6887AC307C003800540027 +:107C5C004A862285EFB0B007AA87B25022549254BC +:107C6C000259F2493E8545618280E147E38709FE6E +:107C7C00BC20130520025C82EFE00FBB6884130567 +:107C8C003002EFE06FBA6886C1B7C547F9B77571B6 +:107C9C0026C3B734002022C506C74AC1CEDED2DCCB +:107CAC009384C43FDC204944A18B63810724B737FC +:107CBC00002083A747F84144639A0722AA89EFE082 +:107CCC005F839C2455446373F522B734002083A74B +:107CDC0004F626894544639B072091659385C571FD +:107CEC0029459780FB1FE780203523A0A4F64D443F +:107CFC00630E051E2946CE859780FB1FE780E06248 +:107D0C0013056002EFE04FB2137AF50F93775A0028 +:107D1C006144638D071C130600038145880097801E +:107D2C00FB1FE780206793771A0093692A000144B0 +:107D3C00B9CF4145EFE04FAF2316A1043D45EFE02D +:107D4C00AFAE2319A1043545EFE00FAE231CA104FF +:107D5C003945EFE06FAD231FA1042145EFE0CFAC17 +:107D6C002312A1061D45EFE02FAC83A704F62315C3 +:107D7C00A1069C33638507182D45EFE0EFAA23106D +:107D8C00A1043145EFE04FAA2313A10405441305C8 +:107D9C00C002EFE06FA9981893171400BA97239EAE +:107DAC00A7FC1305B002EFE02FA8930484009C18E5 +:107DBC008604BE942399A4FC13059002EFE0CFA691 +:107DCC00239CA4FC1305A002EFE00FA6239FA4FCA8 +:107DDC0013058002EFE04FA5930404019C18860460 +:107DEC00BE94239AA4FC13057002EFE0EFA3239D2D +:107DFC00A4FC137A4A0063040A0813056003EFE03D +:107E0C00AFA205049C1893141400BE94239EA4FCEA +:107E1C0013055003EFE04FA1130A84009C18060AC7 +:107E2C003E9A2319AAFC13053003EFE0EF9F231CA5 +:107E3C00AAFC13054003EFE02F9F231FAAFC130598 +:107E4C00E002EFE06F9E41049C1806043E94231A56 +:107E5C00A4FC1305D002EFE02F9D832709F6231D08 +:107E6C00A4FC9C33C5C713051003EFE0EF9B2398CC +:107E7C00A4FC13052003EFE02F9B239BA4FC83277A +:107E8C0009F6A83393854700EFD07F812AD6930556 +:107E9C00F1031305F041EF301277B73700209387C9 +:107EAC008729AC230347F1033256B335B00011C315 +:107EBC008905832609F6FC009308A106A8223EC872 +:107ECC00930721053EC6BC083EC49307E1053EC29C +:107EDC00DC103EC0130861049C004E879106EFB085 +:107EEC00805F2A8401C50D45EFE06FC82285BA403A +:107EFC002A449A440A49F659665A496182802545B2 +:107F0C00EFE08F922310A1042945ADBD1305F002BB +:107F1C00EFE08F912398A4FC13050003A9BFB7379A +:107F2C00002083C707400145A18B89C73735002046 +:107F3C00130545356FD02FD3B73700207D572381DC +:107F4C0007F8B7370020A381E740B737002023A4F8 +:107F5C0007F837770400B73700201307876423A28C +:107F6C0007F8B737002023A0E7343777040093874E +:107F7C00073413070768D8C3377704001307C7788B +:107F8C0098C73787040013078788D8C7377704004A +:107F9C00130707DF98CB37770400B7370020130798 +:107FAC00E7E723AAE73437770400938747351307AD +:107FBC0067C9D8C38280411122C43734002013040E +:107FCC0024F826C2AA840820854506C6EFF0EFC324 +:107FDC00B737002083C70740A98BBDC737350020B2 +:107FEC0004A013050534B7340020EFD02FC79384B9 +:107FFC0084F89C4099C74D45B240224492444101BB +:10800C008280082019E10145C5BF91659385B57142 +:10801C0012059780FB1FE780200288C069DD1020C5 +:10802C00814512069780FB1FE780C03614209040D4 +:10803C008147FD5513F7F70FE377D7FC13974700EC +:10804C0032970CA38507FDB7014523000400EFD040 +:10805C00EFC055BF411122C437340020032544F62C +:10806C0006C619C59780FB1FE780000A232204F679 +:10807C00B24022444101828001111305700306CEE7 +:10808C00EFD09FFA2AC613058003EFD0FFF92AC45C +:10809C0013059003EFD05FF92246B245F240AA8651 +:1080AC00054505616FB0E0415D711305D00386C6CF +:1080BC00A2C4A6C2CAC0EFD03FF72A841305C003DE +:1080CC00EFD09FF6AA841305E003EFD0FFF52A89C1 +:1080DC001305F003EFD05FF58A871377F50F9376CE +:1080EC00F90F13F6F40F9375F40F0545EFB0A03F9D +:1080FC00B64026449644064961618280757122C55A +:10810C0037340020832744F606C726C34AC1CEDE87 +:10811C00D2DCD6DADAD8DED6E2D405456389070E8E +:10812C009305F1051305F041EF30F24D9305F10580 +:10813C001305F041EF30324DB73700209387872974 +:10814C00BC230347F105B337F00011C3890703279C +:10815C0044F6BEC6283393054700EFD04FD403270F +:10816C0044F6AAC40D452C23AEC2EFD0FFEBAAC037 +:10817C001145EFD07FEB032444F62ADE6545382405 +:10818C00034CB4003ADCEFD03FEAAA846945EFD047 +:10819C00BFE92A897145EFD03FE9AA896D45EFD037 +:1081AC00BFE82A8A7545EFD03FE8AA8A7945EFD017 +:1081BC00BFE72A8B13050004EFD01FE7AA8B13052A +:1081CC001004EFD07FE6E2042648B6476257F25619 +:1081DC00064696451375F50F93FBFB0F137BFB0FB0 +:1081EC0093FAFA0F137AFA0F93F9F90F1379F90F2F +:1081FC00E1842AD05ECE5ACC56CA52C84EC64AC466 +:10820C0026C262C0930844000545EFB06026BA4010 +:10821C002A449A440A49F659665AD65A465BB65BC2 +:10822C00265C49618280011122CC06CE26CA8D477C +:10823C002E84631AF504B831B7340020E947CA21FB +:10824C00938484296315F700FE206389A704979013 +:10825C00FB1FE780A08319C17E207EA53A2416243B +:10826C0072204E202830EFD09F945A20FE206309B4 +:10827C00F7008547F2406244D2443E850561828016 +:10828C00FD57FEA0FDB78967CD07631CF500BC2127 +:10829C0031476385E7004547E39DE7FCEFD0AFA38B +:1082AC00C9BFB1476319F500B737002003C51740A4 +:1082BC00EFD03F9B7DBF930760026319F500B73782 +:1082CC00002003C51740EFD05F9E65B741677D174F +:1082DC008147E311E5FAD4314947E39DE6F8CC2117 +:1082EC002A20300023140100EF60B02D59B7411142 +:1082FC0022C4373400208347C4F826C206C64AC0BD +:10830C001307E00FAE846382E7041307F00F130426 +:10831C00C4F86384E70211459780FB1FE78020F1C6 +:10832C0009CD930700FD1CA189473CA1854704B1E9 +:10833C003CB1AA850820EFA03FF5F9571CA0B2402C +:10834C00224492440249410182802A891145978036 +:10835C00FB1FE780C0ED65D5930700FD1CA1894785 +:10836C003CA104B1A30125012244B7370020B2403F +:10837C0092440249AA8503C5D7F841016FA0DFF0EA +:10838C0079714AD037390020832749F622D406D692 +:10839C0026D24ECE52CC56CA4544C5EBB73400203B +:1083AC009387C43FDC234944958BC5C3B737002062 +:1083BC002E8A9165A386A7F8AA8993857571314594 +:1083CC009780FB1FE78040C72322A9F64D4435CD8B +:1083DC0023003501A30005002946D28509059780A5 +:1083EC00FB1FE78080F4832749F69146B82363E9A5 +:1083FC00E60835E74D47B8A3B82313670701B8A3C0 +:10840C00930571001305F041EF30F21F9C83F1E7E7 +:10841C00B737002003C7A7298D476310F70CEFD09F +:10842C008FB52C00EF70B01D2800EFD0DF994545BB +:10843C00EFD09FBF014411C9130600643306C50277 +:10844C0003C5C43F9145EFB02FB62285B2502254DC +:10845C0092540259F249624AD24A45618280854659 +:10846C006314D700754741BF89466314D700494749 +:10847C0059B78D466314D7004147B5BF5547A5BFC3 +:10848C009546CA8A630DD70099466315D7000947EC +:10849C00B8A331A01D466312C702238107006545AE +:1084AC00EFD09FB89307F007E30CF5F403A74AF657 +:1084BC003C2393E707043CA3A1B721466314C700F0 +:1084CC000547F9B725466314C700B4A3C9BFA9462D +:1084DC000544E31CD7F6114765BFEFF03FC22A8471 +:1084EC002DD5EFF03FB795B7011126CAB734002050 +:1084FC0083A744F622CC06CE4AC84944B9C39C2370 +:10850C000D446390A704373900200345C93F8945C2 +:10851C00EFB08FD10345C93FB73700209145239861 +:10852C0007F8EFB06FD083A744F60147814680B3BC +:10853C001306F100854785450145DC87EFA03078AF +:10854C002A842285F2406244D244424905618280E9 +:10855C00011106CE22CC26CA4AC88547631AF506F5 +:10856C0037340020130404F91E20B9C73737002014 +:10857C000347C72931E31307B003636BF702B73422 +:10858C00002003C5C43F8945EFB00FCA12209307E2 +:10859C00006403C5C43F3306F6028945EFB0CFA093 +:1085AC0023100400F2406244D244424905618280A7 +:1085BC00938747FC1EA0FDB7B737002083A747F66B +:1085CC00F5D36244F240D24442498823056129BF65 +:1085DC00B734002083A744F6F1D7373700201309AE +:1085EC00C73F83474900918BD5DF89476310F50658 +:1085FC002D452EC69780FB1FE78060C32A845DD172 +:10860C00B245930700FD1CA1E547A30005003CA162 +:10861C00BC3115051946230FF5FEDC219505A30F7A +:10862C00F5FE9780FB1FE78040D003455900930768 +:10863C00F00F6315F50083A744F68823A2856244E6 +:10864C00F240D244424905616FA01FC40345C73FA5 +:10865C008945EFB06FBD6244F240D2444249B7370E +:10866C000020239807F805616FF0DF9EB7370020D4 +:10867C0083C70740958B89CFB737002083A7C7F9ED +:10868C0091CBB73700200547238EE7346FF0DF9E80 +:10869C004945828041458280B73700208545014598 +:1086AC00238E07346FA07062B737002083C7074052 +:1086BC00958B81CBB737002005472387E7F86FF000 +:1086CC00BF9E49458280B7370020814505452387E9 +:1086DC0007F86FA09061B737002083C70740958BD0 +:1086EC00638C07129307C01C63FCC700094582808A +:1086FC00F2406244D2444249B24909450561828044 +:10870C00B737002083A747F663880710B7370020D8 +:10871C009387C7F803C807001307E00F631EE80E22 +:10872C00011122CC4AC806CE26CA4EC688A3130510 +:10873C0086004205368932844181A5C991659385AD +:10874C0065719780FB1FE780208FAA8955D1B734BC +:10875C00002003A584F9938484F909C59780FB1F35 +:10876C00E780809A1385890023A0A9002286814581 +:10877C0023A034019780FB1FE780C0C19C40228658 +:10878C00CA8588439780FB1FE78020BA9C40A2864D +:10879C00F240C2A36244D2444249B24998430546CE +:1087AC008D45054505616FA01051916593855571F7 +:1087BC009780FB1FE7804088AA891DD9B734002019 +:1087CC0003A504FA938404FA09C59780FB1FE7807C +:1087DC00A0931385890023A0A9002286814523A09C +:1087EC0034019780FB1FE780E0BA9C402286CA8543 +:1087FC0088439780FB1FE78040B39C40A286F240E1 +:10880C00C2A36244D2444249B249984305468D45BD +:10881C00054505616FA0704A494582809307C01CCD +:10882C0063FCA700094582800945F2406244D244AA +:10883C004249B2490561828055C9011122CC2A8472 +:10884C0021054EC64205AE899165938565714181BE +:10885C004AC806CE26CA9770FB1FE780E07D2A899E +:10886C0061D5B734002003A584F9938484F909C534 +:10887C009780FB1FE7804089130589002320A900FE +:10888C002286814523A024019780FB1FE78080B0BE +:10889C009C402286CE8588439780FB1FE780E0A80A +:1088AC009C40C2A3B737002083A747F685CFB737C4 +:1088BC00002083C70740958B85CBB737002083A753 +:1088CC0087F991CF9843D6236244F240D24442496F +:1088DC00B24905468D45054505616FA0D03D014760 +:1088EC008146DDB7014591B7494581B7B7370020BF +:1088FC0083A747F68DC7B737002083C70740958BF2 +:10890C008DC3B737002083A787F999C79843D6231F +:10891C0005468D450545D1B701478146D5BF014573 +:10892C008280494582809307C01C63FCA7000945DF +:10893C0082800945F2406244D2444249B249056101 +:10894C00828055C9011122CC2A8421054EC64205CC +:10895C00AE8991659385557141814AC806CE26CA68 +:10896C009770FB1FE780406D2A8961D5B7340020D2 +:10897C0003A504FA938404FA09C59770FB1FE780DA +:10898C00A078130589002320A9002286814523A005 +:10899C0024019780FB1FE780E09F9C402286CE85B8 +:1089AC0088439780FB1FE78040989C40C2A3B73751 +:1089BC00002083A747F685CFB737002083C7074031 +:1089CC00958B85CBB737002083A707FA91CF9843B7 +:1089DC00D6236244F240D2444249B24905468D4501 +:1089EC00054505616FA0702D01478146DDB7014536 +:1089FC0091B7494581B7B737002083A747F68DC794 +:108A0C00B737002083C70740958B8DC3B73700203D +:108A1C0083A707FA99C79843D62305468D45054584 +:108A2C00D1B701478146D5BF014582804945828037 +:108A3C009307C01C63F4A70009458280797122D486 +:108A4C004ECE06D626D24AD0AE892A8425C121051F +:108A5C00916542059385757141819770FB1FE78085 +:108A6C00A05D2A89094563040908B734002003A5D1 +:108A7C00C4F99384C4F909C59770FB1FE780C068DB +:108A8C00130589002320A9002286814523A02401F7 +:108A9C009780FB1FE78000909C402286CE85884300 +:108AAC009780FB1FE78060889C40C2A3B7370020EB +:108ABC0083A747F6014585CFB737002083C707400A +:108ACC004945958B8DC76C001305D030EF40526132 +:108ADC00B247014593F7070F99CBB737002083A70F +:108AEC00C7F98D4505459443D223EFA0D01DB25054 +:108AFC00225492540259F24945618280B7370020C2 +:108B0C0083A787F989CFD2238C43411106C697805E +:108B1C00FB1FE7808081B2400145410182800945FD +:108B2C008280B737002083A787F985C7B737002025 +:108B3C0003A707FA894719CF52230C43411106C6E4 +:108B4C009770FB1FE780607EB24081473E854101F4 +:108B5C00828089473E858280B737002083A787F9BA +:108B6C0085C7B737002003A7C7F9894719CF522308 +:108B7C000C43411106C69770FB1FE780007BB24087 +:108B8C0081473E854101828089473E85828079718B +:108B9C0006D622D426D24AD04ECE52CC8D4763FC78 +:108BAC00A7008944B2502254268502599254F249A6 +:108BBC00624A456182803739002003478929C144C4 +:108BCC00E312F7FE9307F5FF9309892993F7F70F43 +:108BDC008546AE842A8403CA29001309892963EACD +:108BEC00F6068DE199452800EFC0DF89B7390020E2 +:108BFC0003C5C93F914523018900EFA0FFE235E48D +:108C0C0081444DB71946814528009770FB1FE780BA +:108C1C00607819462C0026859780FB1FE780E08141 +:108C2C0049F119469305F00F28009770FB1FE78058 +:108C3C00607619462C0026859770FB1FE780E07F35 +:108C4C002DF11946A68528009770FB1FE780E06D73 +:108C5C0071BFE31DE5F803A5C9002C00EF70201AC5 +:108C6C00AA8449D52381490135BF2800EFD0AF959F +:108C7C00AA8405ED930571001305F041EF30A2189D +:108C8C008483BDFC8D47E31DF4F64545EFD0CFB989 +:108C9C0025D9B7771800938707A03306F50203C5CB +:108CAC00C93F9145EFA0FFD0F5BD23014901DDBDC2 +:108CBC00B737002083C70740918B8DC33735002011 +:108CCC004111130545F906C6EFC02FFBB240B7376B +:108CDC0000207D57239FE7284101828001456FC00A +:108CEC00CFF9B73700207D57A386E7F8B7370020B8 +:108CFC0079572386E7F8B7370020238E0734B73728 +:108D0C000020238707F8B7370020239807F8B737D8 +:108D1C00002023AC07F8B737002023A007FAB73799 +:108D2C00002023AE07F837970400B737002093874D +:108D3C0087041307E7F498C3378704001307C75554 +:108D4C00D8C3378704001307871098C737870400E8 +:108D5C0013074708D8C7378704001307470B98CB6E +:108D6C00B78704003737002093872723232AF7F887 +:108D7C008280411126C2B734002083A744F606C670 +:108D8C0022C49DCB2A840D459770FB1FE780204A97 +:108D9C00AA8501CD930700FD1CA18D4700B13CA114 +:108DAC0083A744F68823EFA02FCE19C42244B240E7 +:108DBC00924441016FF00FAAB24022449244410107 +:108DCC008280797152CC373A002083274AF64AD0F8 +:108DDC0006D622D426D24ECE56CA0149A1C703C903 +:108DEC001700B73400208547AA899384842963052A +:108DFC00F904DC2005499DE70D459770FB1FE780C2 +:108E0C000043AA8509CD930700FD1CA19147A3003F +:108E1C0035013CA183274AF68823EFA0EFC6EFF07B +:108E2C006FA30549B25022544A8592540259F24913 +:108E3C00624AD24A45618280B737002083A787F9FE +:108E4C00D28A85E30145EFD02F9E2A8601CAB73717 +:108E5C00002003C5C73F8945EFA01F9583A74AF69D +:108E6C00B1A09443D2239305E1000545EFC08FEBED +:108E7C0071D91C21858BF9D70545EFD0EF9A930753 +:108E8C00B0032A8463FEA702B737002003C5C73F8F +:108E9C005D66130606708945EFA0BFB1B737002099 +:108EAC00130444FC239887F883274AF6094798B3A0 +:108EBC00DC2081C723820400B5B74E855D3D9DB78C +:108ECC00130600643306C50251B7411122C42A842B +:108EDC000D4506C69770FB1FE78060350DC19307E3 +:108EEC0000FD1CA1CD473CA100B12244B7370020A6 +:108EFC00B240AA8503C5D7F841016FA0EFB8B240C4 +:108F0C00224441018280411122C42A840D4506C6A7 +:108F1C009770FB1FE780A0310DC1930700FD1CA1CA +:108F2C00ED473CA100B12244B7370020B240AA85DE +:108F3C0003C5D7F841016FA02FB5B24022444101BF +:108F4C0082805A210111896606CE22CC26CA13864C +:108F5C006600AA876316C7009C4701458C2301A8AD +:108F6C00138686006319C7009C4705458C23EFF0D8 +:108F7C000FB805451DA8138696006311C702373735 +:108F8C000020032747F601450DC39C47882369E55C +:108F9C0085471CB30545EFA0A048E1BF1386A6008A +:108FAC00631AC7009C478823293DF2406244D2448F +:108FBC000561828013866603E300C7FA1386760385 +:108FCC00E304C7FA13868603631BC7081C453734B2 +:108FDC0000201307E00F84238347C4F81304C4F85C +:108FEC00638BE7021307F00F6384E7021145977058 +:108FFC00FB1FE780C023AA8501CD930700FD1CA1B0 +:10900C00894704B13CA1A30105000820EFA0CFA71C +:10901C00F9571CA0B9BFB737002003A747F63E8409 +:10902C00014541D78DE885447D454485EFC0DFFF80 +:10903C00688613050002EFC03FFF832744F6C885FE +:10904C001307B10084B374001306A10085450545D0 +:10905C00EFA0E04639BF2685EFF0BFD119BF1386CC +:10906C009603E301C7F41386E6036316C7001C4599 +:10907C0009458C23EDBD9386F603631BD7021C4573 +:10908C00882335E96C001305D030EF407205B247E8 +:10909C00414793F7070FE38EE7EC9305B1001305F7 +:1090AC006031EF40F20388858545EFA00042D1B5D1 +:1090BC008966138606046312C7041C458023B737E0 +:1090CC00002083C7C73522859DE70D459770FB1F90 +:1090DC00E780E015AA85E30E05E8930700FD1CA1C7 +:1090EC00D1473CA100B1B737002083A747F68823AE +:1090FC00EFA08F99BDBDD13BADBD13861605631A8C +:10910C00C7001C45882331E585450545EFA0E03DAA +:10911C008DB5938626050145E319D7E89C47802336 +:10912C00B737002083C7E7F8228585E70D45977090 +:10913C00FB1FE780C00FAA85E30D05E2930700FD36 +:10914C001CA1F1473CA1B737002000B103C5D7F8EB +:10915C0045B7553B39BDB737002083C70740411190 +:10916C0006C6958B99CB3735002013058504EFC0C7 +:10917C002FB04D45B240410182800145EFC04FAF49 +:10918C000145CDBF9821937625009377D70F99C2CF +:10919C0093672700131885011358884113F7F707B5 +:1091AC006354080013E70708937685009377770FCD +:1091BC0099C2936787001377050293F6F70D19C3CD +:1091CC0093E6070294A1634508009377A50291C723 +:1091DC001C2293E7C7001CA282807DFD1C22CD9B24 +:1091EC00DDBF2D45631B0710882109476313E5106C +:1091FC0001114EC6BE89DC4122CC26CA4AC806CE15 +:10920C0098339C23B68422075D8F42078D66418775 +:10921C00938736A032842E89630BF70A63C0E7026A +:10922C00938716A06307F70863CAE70A938606A01C +:10923C00630BD70423900400054559A0938766AAB5 +:10924C00630EF708938786B86301F70A938646A0E6 +:10925C00E312D7FEDC45C1C321479AA09A2318A27A +:10926C009A23218318B2BA2338A2BA23218338B2A5 +:10927C00DA2358A2DA23218358B2FA2378A2FE23E8 +:10928C00A1837CB22DA8C8459770FB1FE7806013A3 +:10929C00420541814E86637335012A8692A04206AF +:1092AC0041828325C90022859770FB1FE780E00768 +:1092BC0039A0DC459E238AA01CA2A1831CB20145C7 +:1092CC00F2406244D2444249B249056182809947D6 +:1092DC009EA01946F9B723900400D5B785479EA0E8 +:1092EC008327C9009C231CA0D9BFE1479EA06146DF +:1092FC004DBF2390060005458280828083C80500FF +:10930C008947639BF816DC41797122D406D626D2A4 +:10931C004AD04ECE52CC56CA03C817009C232E847A +:10932C0022083368F80042088D67135808411383EC +:10933C0027A0630F68102A8A3A89B684B285634CD9 +:10934C000301138707A0630BE802938717A063013F +:10935C00F80A854711A8138737A06300E80C138718 +:10936C0067AA8D47E317E8FEB25022549254025973 +:10937C00F249624AD24A3E8545618280484432C6EF +:10938C009770FB1FE780E003420541819D47E36D29 +:10939C0025FDB73A0020938A7AFA83C70A00B309ED +:1093AC009900B24563D43701B5477DBF4844268642 +:1093BC00C2094A959770FB1FE78020F703C60A0085 +:1093CC00484493D9090105063306364181454E952B +:1093DC009770FB1FE78000FCB737002083A7C7FA04 +:1093EC0099E3814751B79C438145E5DF528525A020 +:1093FC00AD47E31B09F6E39916FB1C3214225844C3 +:10940C00A207D58F1EA3B737002083A7C7FAF1DBBD +:10941C009C43E1DB85458297E9B7B737002003C74A +:10942C0007FB8D4731D3AD47E31009F49947E39D12 +:10943C00F6F6484419469770FB1FE78000EFB737E4 +:10944C00002083A7C7FAD1DF9C43C1DF8D4579BFCC +:10945C00B737002083C5C7F28D47A18991D5AD4799 +:10946C0001F78547E392F6F4182293070008E3ED21 +:10947C00E6EE5C4498A3B5B785473E858280B73746 +:10948C000020411123A607FAB737002022C42385F8 +:10949C0007FA0944B7370020A38F87F0B7370020AD +:1094AC00A38307FAB7370020238E87F0B737002045 +:1094BC00239207FAB7370020238687F2373500202E +:1094CC00B73700202147238807FA1946B737002001 +:1094DC008145130545FB06C6A386E7F29770FB1F73 +:1094EC00E78040EBB7370020238187F23707A000D5 +:1094FC00B7370020938747F21307070598C3370740 +:10950C00E803D8C3B7370020238F87F00547B73758 +:10951C000020A38EE7F0B7370020238787F237357A +:10952C000020B7370020238D07FA6146B73700209B +:10953C0081451305C505238087F29770FB1FE780D3 +:10954C0060E5B7370020A38087F2B7370020A384EB +:10955C0007FA37970400B73700209387C7EB130738 +:10956C00E71E98C3B2402244379704001307873094 +:10957C00D8C323A407004101828095476302F51AE2 +:10958C00797122D426D206D64AD04ECE52CCB28491 +:10959C002E8463E4A7048947630DF51463EFA700D9 +:1095AC004DC50547630FE5120945B250225492543C +:1095BC000259F249624A456182808D476304F51471 +:1095CC009147E313F5FEA1476395F5083735002065 +:1095DC002146A685130545F23DAA93072004630591 +:1095EC00F51663E1A7029D476306F514A147E31D39 +:1095FC00F5FA8547639FF5041822B7370020A3843A +:10960C00E7FAF1A8930710086309F51493072008EB +:10961C00630DF51493070008E318F5F88547639A72 +:10962C00F502B737002083C787FA1387F7FFB735E2 +:10963C0000209385450712072E97920750478820E4 +:10964C00A107BE95EFF01FB459A89307800F63F4E0 +:10965C00B700614599BF373A002083468AFAB7377D +:10966C000020138747079206369748479389470788 +:10967C00130A8AFA09C99770FB1FE780E0A8B7376D +:10968C000020A38307FA13061400916593850571D6 +:10969C00328503490A0032C69770FB1FE780C099D8 +:1096AC0083470A0012094E9992072326A900CE97E8 +:1096BC00C84745D1324681459770FB1FE78080CD66 +:1096CC0083470A002286A6859207CE97C8479770D3 +:1096DC00FB1FE78080C5B7370020A38387FA0145BD +:1096EC00E9B5E398F5F61A22B73700202392E7FA8A +:1096FC00FDB78547E39FF5F41822B7370020238880 +:10970C00E7FAF1BF9947E396F5F43735002019468F +:10971C00A685130545FB9770FB1FE78000C1C1B7F9 +:10972C008547639DF5061822B73700200145A38EA7 +:10973C00E7F08280E147E39EF5F037350020614683 +:10974C00A6851305C505C1BF8547E394F5F018221E +:10975C00B73700202386E7F259B78547E39BF5EE30 +:10976C00B737002083C767FAC9B58547E393F5EE91 +:10977C00082293772500E39E07ECB737002083C7B8 +:10978C0017FBB7350020938545071387F7FF1207A2 +:10979C0092072E97A1075047BE956DB56145828003 +:1097AC004111AA8706C611472E856386E70A6361B5 +:1097BC00F7020547638EE706A9C709476381E708E7 +:1097CC000D476384E7088947B2403E85410182809A +:1097DC001D47638AE708636AF7001547E395E7FEC0 +:1097EC00B737002083C7D7F1B9A821476383E708AF +:1097FC0013072004E399E7FCB737002083C7C7F2AF +:10980C0099A0B737002083C787FA13974700B7375B +:10981C00002093874707BA97CC478947D5D5B737E8 +:10982C00002003C677FA9770FB1FE78000B031A0C9 +:10983C00B737002083D747FA9EA1814771B7B73756 +:10984C00002083C707FB1CA1CDBFB73500201946EC +:10985C00938545FBC9BFB73500202146938545F25A +:10986C00EF401243D9BFB735002061469385C5053B +:10987C005DBFB737002083C797FAF1B7630F053880 +:10988C00B73700209387A7FA9823631807388546C3 +:10989C003738002094A309479307480798A337F754 +:1098AC000600130707C8D8C337F706001307C7C449 +:1098BC00D8C794A7239507007D57630DE53413771C +:1098CC001500854539C3B7F606009386C6C5D4CBBB +:1098DC00B73600209386F6F10947D4CFB73600206F +:1098EC0098AB2384E6FA2380E70237F70600054697 +:1098FC00130747C690AF239D0700D8D32384C70214 +:10990C002395070223A607028D45137725002DC347 +:10991C0013974500B7F606003E979386C6C554C309 +:10992C00B7360020894805469386C6F154C72300F4 +:10993C00170110A723150700138715004207418351 +:10994C00B73600202383E6FA1207B7F606003E97D7 +:10995C00938646C554C38905B7360020938646FACC +:10996C00C2052300170110A72315070054C7C18196 +:10997C00137745002DC313974500B7F606003E97A5 +:10998C009386C6C554C3B7360020894805469386CE +:10999C00C6F254C72300170110A72315070013871D +:1099AC00150042074183B7360020A388E6FA120758 +:1099BC00B7F606003E979386C6C754C38905B736DB +:1099CC000020938606FBC2052300170110A7231560 +:1099DC00070054C7C1811377850021CF1397450029 +:1099EC00B7F606003E979386C6C554C3854614A7A2 +:1099FC00B736002009469386D6F254C710A3231518 +:109A0C00070013871500420741831207B7F60600BB +:109A1C003E97938686C854C3A14614A78905B736CA +:109A2C000020938646FBC20510A32315070054C7DC +:109A3C00C1811377050129CF13974500B7F60600AE +:109A4C003E979386C6C554C3B73600208948054651 +:109A5C00938626F254C72300170110A7231507007D +:109A6C0013871500420741831207B7F606003E978D +:109A7C00938686C754C38905B7360020938646F271 +:109A8C00C2052300170110A72315070054C7C18175 +:109A9C001377050229CF13974500B7F606003E97BA +:109AAC009386C6C554C3B7360020894805469386AD +:109ABC00E6F154C72300170110A7231507001387DD +:109ACC001500420741831207B7F606003E979386AE +:109ADC0086C554C38905B73600209386D6F1C205D6 +:109AEC002300170110A72315070054C7C181137752 +:109AFC00050429CF13974500B7F606003E979386C9 +:109B0C00C6C554C3B7360020894805469386E6F28D +:109B1C0054C72300170110A723150700138715003E +:109B2C00420741831207B7F606003E97938646C854 +:109B3C0054C38905B73600209386A6FBC2052300C3 +:109B4C00170110A72315070054C7C1811377050807 +:109B5C0021CF13974500B7F606003E979386C6C5EE +:109B6C0054C3D14614A7B73600200946938606F293 +:109B7C0054C710A323150700138715004207418310 +:109B8C001207B7F606003E97938686C654C38546E1 +:109B9C0014A78905B73600209386C605C20510A305 +:109BAC002315070054C7C1811375051039C91397C4 +:109BBC004500B7F606003E979386C6C554C3B73624 +:109BCC00002009450546938616F208A310A7231515 +:109BDC00070054C713871500420741831207BA9731 +:109BEC0037F70600130787C6D8C389053737002017 +:109BFC00130797FAC20588A390A723950700D8C727 +:109C0C00C181B73600209386C6EB41461305480741 +:109C1C006F30E039130530037DB1014582800111AD +:109C2C001388F5FF06CE22CC26CA4AC84EC652C4AB +:109C3C001378F80FAD4563ED050BB7E506000A0880 +:109C4C00938505572E983E8A83270800BA89368952 +:109C5C00B28482878545EFB09F9F2A8419E1EFF08B +:109C6C008FCF2285F2406244D2444249B249224A03 +:109C7C00056182808945EFB09F9D2A847DF1268500 +:109C8C00EFE06FB3F9BF9145EFB07F9C2A8471F977 +:109C9C005286CE854A85EFB0FF91EFF0CFCBEFF037 +:109CAC002F81EF60E07D75BFA145EFB05F9A2A84EC +:109CBC004DF95286CE854A85EFB0DF8F2685EFE0D1 +:109CCC008FAFEFE0CFA5EF60A07961BFB145EFB0EA +:109CDC001F982A8459F55286CE854A85EFB09F8D00 +:109CEC002685EFE04FADEFE08FA3EF60607775B79F +:109CFC00094485BF79714ECEAE896C0022D426D230 +:109D0C004AD006D62A89B284EF0070692A840DE104 +:109D1C00CE854A85EFA07FEA2A8419E93245B756E9 +:109D2C00040026879386A6BB2D468145EF10400183 +:109D3C002285B250225492540259F24945618280D4 +:109D4C0079714ECEAE896C0022D426D24AD006D67A +:109D5C002A89B284EF00B0642A840DE1CE854A854D +:109D6C00EFA03FF32A8419E93245B7560400268741 +:109D7C00938646C94D468145EF00907C2285B250B2 +:109D8C00225492540259F24945618280397126DA83 +:109D9C00AE844C0022DC4AD84ED652D406DEAA89B8 +:109DAC003289368AEF00B05F2A8421E9A685630DDB +:109DBC0009009E202C007C84BE207C8593072030DB +:109DCC007C86930780025C874E85EFA03FDC2A845B +:109DDC000DE55946A6851305A100230421019760C2 +:109DEC00FB1FE78080541245B756040052879386B8 +:109DFC00C6B625462C00EF00B0742285F250625492 +:109E0C00D2544259B259225A21618280797126D298 +:109E1C00AE846C0022D44AD04ECE06D6AA893289A2 +:109E2C00EF00F0572A840DE1A6854E85EFA0BFDA2E +:109E3C002A8419E93245B75604004A87938666BDD1 +:109E4C003546A685EF00D06F2285B250225492542D +:109E5C000259F24945618280BD47638CF50663E97E +:109E6C00B702A5476387F50663EDB7009947638C86 +:109E7C00F5049D47638FF5049547638CF504014504 +:109E8C008280B5476387F50463E1B704AD47F5B746 +:109E9C00DD47638EF50263EAB700C947638BF502B1 +:109EAC00D9476386F502C547C9BFF5476383F502F9 +:109EBC0063E4B700ED47D1B793072005638BF5003A +:109ECC009307200D5DBF484582800841828008457C +:109EDC008280484182809307F00F630FF5060111D1 +:109EEC0026CAAA841305000222CC4AC84EC652C404 +:109EFC0056C206CE3A89B689B28A2E8A9760FB1F63 +:109F0C00E780E0322A844D450DC8930700FB1CA066 +:109F1C00A3005401231144012302340113058400CE +:109F2C00614663050902CA859760FB1FE780E03F25 +:109F3C00A2852685EF904FB50145F2406244D2448C +:109F4C004249B249224A924A056182808145976012 +:109F5C00FB1FE7802044E9BF09458280011122CC18 +:109F6C0006CE2A844C86D0869770FB1FE78000B201 +:109F7C0005C15425B737002021479387C73F639D00 +:109F8C00E600E82378009306E0070146A285A13796 +:109F9C00F24062440561828078009306E007014636 +:109FAC00A285C833EDB7930700643306F6026F90B1 +:109FBC007F9415C5182185469307270093F7F70F53 +:109FCC0063FFF600411122C42A843A8506C6EF903D +:109FDC007FACFD571CA0B24022444101828082809C +:109FEC001A219307000B6310F7025C214947639A0F +:109FFC00E700183985476398E7002A2185456F30BB +:10A00C00101F6D47CDBF828001116C846C0022CC77 +:10A01C0026CA4AC806CE2A89B6847085EF00303825 +:10A02C002A840DE12C004A85EFA0FFAC2A8419E9A3 +:10A03C003245B75604002687938606AC15462C008D +:10A04C00EF0010502285F2406244D244424905612F +:10A05C0082807971930720306C8470857C862C000B +:10A06C0093078002014606D65C87EFF03FD2B250D0 +:10A07C0045618280C177797185073EC4894726D2B4 +:10A08C007C86AE84930780024C0022D44AD006D63C +:10A09C002A895C87EF00B0302A840DE12C004A85B8 +:10A0AC00EFA07FBC2A8419E91245B7560400268715 +:10A0BC00938646C445462C00EF0090482285B2504A +:10A0CC0022549254025945618280B28605466FF043 +:10A0DC00FFCB797126D2AE846C0022D44AD04ECEFE +:10A0EC0006D6AA893289EF00902B2A840DE1A68529 +:10A0FC004E85EFA01F982A8419E93245B756040003 +:10A10C004A87938666A60D46A685EF007043228586 +:10A11C00B250225492540259F249456182807971AD +:10A12C00930720206C8470857C862C00930780021A +:10A13C00014606D65C87EFF07FC5B2504561828040 +:10A14C00011122CC06CE2A842EC632C436C2977098 +:10A15C00FB1FE780A09315C94825B7370020A146FF +:10A16C009387C73F12472246B245631BD500E823AD +:10A17C00B2862E86A2856244F24005616FF0BFD58F +:10A18C00B286C8332E86A285FDB7F24062440545DF +:10A19C00056182806FF01FB66FF0DFB56FF01FC7DF +:10A1AC006FF0DFC679714ECEAE896C0022D426D208 +:10A1BC004AD006D62A89B284EF00701E2A840DE19B +:10A1CC00CE854A85EFA0FFA22A8419E93245B756FD +:10A1DC0004002687938626BF3D468145EF00503606 +:10A1EC002285B250225492540259F2494561828020 +:10A1FC00B28601466FF09FB9011122CC2E846C00FF +:10A20C0026CA06CEAA84EF009019DD476309F50033 +:10A21C00930710101EA4A2852685EFA09FA7F240DD +:10A22C006244D24405618280239405009E2599E303 +:10A23C006FF01FB109458280C5BFB737002003C737 +:10A24C0027FF854763F8E702011122CC2E846C00AE +:10A25C0026CA06CEAA84EF00901401E993070010D9 +:10A26C001EA4A2852685EFA0DFA2F2406244D24450 +:10A27C000561828059458280B737002023AEA7FA4A +:10A28C008280B737002023A0A7FC8280011122CC4A +:10A29C0026CA06CE2A84AE849760FB1FE780007F17 +:10A2AC00A6852285EFA0EFD005E92285648697600C +:10A2BC00FB1FE780A07D0DC15425B7370020214737 +:10A2CC009387C73F639FE600E82378009306F00767 +:10A2DC000146A285EFF03FC0F2406244D2440561D2 +:10A2EC008280C833DDB7011126CA06CEB68422CCD3 +:10A2FC00DD4663E3B608D94663FFD50AA5466382FB +:10A30C00D50A63EFB6049546638DD50899466388E4 +:10A31C00D50A054441687D18631706093AC6EFA0B3 +:10A32C000FCD3306854032474206418242044180BC +:10A33C003305C4004205BA85418132C6EF3020791D +:10A34C00AA8751C199C0324692A0B305804062449D +:10A35C00F240D2443E8505611763FB1F670003E89A +:10A36C00C5466380D504C9460D44E394D5FAC1674C +:10A37C00FD17E31DF6FA5DB7F5466380D50463E47B +:10A38C00B600ED46D5B7930620056388D502930633 +:10A39C00200DE390D5F8C167FD170D446319F60045 +:10A3AC00B5BF094485BF9306200DE391D5F831065E +:10A3BC0042064182A5BF15445DBF0D444DBFC16728 +:10A3CC00FD171D447DB7F2406244D2440561828082 +:10A3DC00011122CC26CA06CED0212E8413070002EE +:10A3EC0081469945AA8401372AC621C51E205020D2 +:10A3FC00930554007C803E207C8189477C829307A6 +:10A40C0080025C839760FB1FE78020F25C208A85CA +:10A41C0026857C84EFA0CFF02A8411C53245976045 +:10A42C00FB1FE78060CE2285F2406244D244056176 +:10A43C0082804D44CDBF5D7186C6A2C4A6C2CAC07F +:10A44C004EDE89476306F600C14709446318F604DB +:10A45C000144A9C52E894C0832C6B689AA84812725 +:10A46C002A84324605EDC1778507CA851305D101CB +:10A47C003ECC230EC1009760FB1FE78000EB2C083D +:10A48C002685B9372A8419E95245B75604004E87F8 +:10A49C00938626B11D462C08EF00900A2285B64003 +:10A4AC00264496440649F25961618280797122D41E +:10A4BC0036844AD04ECE52CCB2892E8A3A89814605 +:10A4CC00130710022286D94526D206D6AA84EFF0AD +:10A4DC009FE12AC621C12286CA85608423124101CC +:10A4EC00231331019760FB1FE78020E44C00268585 +:10A4FC00EFA0FF832A8411C532459760FB1FE780CC +:10A50C00A0C02285B250225492540259F249624A98 +:10A51C00456182804D44F5B7011122CC26CA06CE86 +:10A52C004AC8DD472A84AE846389F50281470A2034 +:10A53C006C005C86EFA07F8305456380A40808242B +:10A54C00B165938505B8EF908F90E5473CA0B75760 +:10A55C0004009387C7D65CC085A058393149B286B0 +:10A56C003306270318499C4232971043E310F6FC3C +:10A57C00DE225223E31CF6FA8C4608479760FB1F39 +:10A58C00E780A0EB45D55C385828850793F7F70F83 +:10A59C005CB863FAE702B387270318480A20BA9716 +:10A5AC009847D623B2238E23113749F10824B1657D +:10A5BC00938505B8EF90AF895945F2406244D24477 +:10A5CC004249056182807C289DB7011122CC26CAA4 +:10A5DC0006CEDD472A84AE846394F5060A21EFA0EB +:10A5EC000FA1522C36285A286D162A964206418203 +:10A5FC00B307D640C20752ACC18363FAE706930592 +:10A60C00C5FF3308F7406359B802BA96918EC2065B +:10A61C00184C0E280A20C1823E97EFF03FE90DE15D +:10A62C000824B165938505B8EF906F825945F240C7 +:10A63C006244D244056182806D1593160501C9BF31 +:10A64C0081470A206C005C86EFA02FF20545E38061 +:10A65C00A4FE0824B165938505B8EF805FFFE5473C +:10A66C003CA0B75704009387C7D65CC0C1B78547D9 +:10A67C00C9BF397126DAAE842C0022DC4AD84ED6FA +:10A68C0006DE2A89B289212B2A8439E54A85EFA076 +:10A69C000F96D6206D1563C5A60093160501C182D1 +:10A6AC009844B2208E204A85EFF05FE02A840DE5B5 +:10A6BC003146A6850808230601009760FB1FE7803A +:10A6CC00C0C6BE202245B75604004E87938646D09E +:10A6DC005D466C00FC86AD252285F2506254D25446 +:10A6EC004259B2592161828069B761B7797126D21A +:10A6FC0006D622D44AD04ECE52CC56CA5AC8894419 +:10A70C00D9C951CA2E842A89BA8A368B328AEFA0CB +:10A71C000F8E93054400814771159A21635EA7083B +:10A72C00850793F7F70FB105E319FAFE8A854A8579 +:10A73C00BD21AA842DE131453305AA02916593858B +:10A74C001570CD449760FB1FE780008FAA8921C547 +:10A75C0031463306CA02A2859760FB1FE780E0BC36 +:10A76C001844562032200E204A85EFF03FD4AA849C +:10A77C0015ED0245B756040085475687938646D09B +:10A78C005D464C005C824EC423064101A3060100C9 +:10A79C00230761017523B250225426850259925425 +:10A7AC00F249624AD24A424B456182804E8597609B +:10A7BC00FB1FE7806095C5B7ED44F1BF79714ECEB4 +:10A7CC0037F60600AE89C16526D20147AA848946B0 +:10A7DC00130606C9FD15054522D406D64AD0EF103E +:10A7EC00407B054429C92A8913073002814611464A +:10A7FC00F5452685EFF03FAF2AC655440DCD83575E +:10A80C00A900CE8601467C8491477C8585471CA196 +:10A81C00B2472C002685A38007003247FD573CA386 +:10A82C0032473CB3EF10606C2A8411C532459760F7 +:10A83C00FB1FE780608D2285B2502254925402593E +:10A84C00F24945618280411106C6EFF0EFE019C56F +:10A85C00B24041011763FB1F6700038BB2404101FB +:10A86C008280011106CE2AC6EF905FDF3245B737E2 +:10A87C00002023AE07FAB737002023A007FC914530 +:10A88C00B7370020A38EA73EEF30001FF2400561C2 +:10A89C006F2050067971939705014AD006D622D4C1 +:10A8AC0026D2C187014963DB070AB737002003C5ED +:10A8BC00D73F2E899760FB1FE780C09C2A8441CD2F +:10A8CC0018219307000A6315F70885474C08DC85A7 +:10A8DC00EF907FE5AA8405ED8347610171476376AC +:10A8EC00F708138717FE1377F70F9306000263F52B +:10A8FC00E608858BCDC7B737002083A7C7FB9944E3 +:10A90C0099C72A201306B1004C088297AA849C850B +:10A91C0099C7084409C59750FB1FE780E07E95E076 +:10A92C005247B7070001938707F07D8FB7071200D6 +:10A93C0093870710630EF70003476101ED47631916 +:10A94C00F7002A208545EF30800ACD476388F40054 +:10A95C002285EF809F8EA1673349F900B2502254B3 +:10A96C004A85925402594561828037073014050795 +:10A97C003357F700058B35DF37370020032707FCEB +:10A98C0059D70347510141F75C8699472308F100D9 +:10A99C002A206C0023170100EF90DFFB8DBFB73727 +:10A9AC00002083A707FC8DC32A201306B1004C0896 +:10A9BC00829731DDAA8483475101B1FB8347610142 +:10A9CC00230891005C86E9B79944F5B7397122DC0C +:10A9DC0026DA06DE4AD84ED652D456D25AD0A547DD +:10A9EC002A84B2846398F50E834745021A22835A4F +:10A9FC00260085072302F5029307F7FFB387FA02B7 +:10AA0C005442C207C183B69703C917009C2354252F +:10AA1C0022093369F90085476390F602330757031F +:10AA2C00231006008149014A130B3501931A0701C3 +:10AA3C0093DA0A0163EA5905C167FD176303F90A42 +:10AA4C001E286370F90A0509420954241359090197 +:10AA5C002317240105470A209305E400639CE600B4 +:10AA6C007C85930720307C86930780022314210178 +:10AA7C005C872C00EFA08F910824B165938505B8F5 +:10AA8C00EF80FFBC5945B9A8B620DC402C28ED1648 +:10AA9C0013865900C206C1823E965A85EF901FC19B +:10AAAC0005C5630B3A01C840B220B3053501529578 +:10AABC009760FB1FE7806087BE203E9A9E20420A6B +:10AACC00135A0A0185079EA0BE20BE99C20993D9CC +:10AADC0009018DB75822A9476310F7028347450235 +:10AAEC0081CF0145F2506254D2544259B259225A84 +:10AAFC00925A025B2161828034281309340137F5A4 +:10AB0C0006004A868945130505C8EF903FBA19C15E +:10AB1C000545C9BF342837F506004A868945130513 +:10AB2C00C5C8EF90BFB86DF5342837F506004A86D6 +:10AB3C008945130545C7EF907FB779F9342837F568 +:10AB4C0006004A8689451305C5C5EF903FB669F1E5 +:10AB5C00D820BD47E3EEE7FAA56793874712B3D732 +:10AB6C00E700858BD5D78347440285072302F4027F +:10AB7C0003D92400D1B5011106CE2EC69760FB1F58 +:10AB8C00E78020E611C93C25B24513871700639571 +:10AB9C00E50093F707F83CA5F240056182800111AE +:10ABAC0006CE2EC69760FB1FE780A0E31DC1B24501 +:10ABBC0091C188C11C251307E00F5D456388E70030 +:10ABCC001307F00F01456383E7005945F240056117 +:10ABDC0082800945E5BF411122C42A84210506C69D +:10ABEC0026C24AC0EFF0EFBC3C20A51793F7D70F55 +:10ABFC0089EB58248547631EF7041C48814431496E +:10AC0C00A1E3FD57230104001CB423020402130525 +:10AC1C00C4002244B240924402496146814541013C +:10AC2C001753FB1F67000377B38724033E95084532 +:10AC3C0009C59750FB1FE780204D850493F4F40F52 +:10AC4C005C280848E3E2F4FE9750FB1FE780C04BFA +:10AC5C004DBF084C75F975B7411122C4416406C645 +:10AC6C0026C29307E4FF6301F502AA849DE1976075 +:10AC7C00FB1FE78000D709E91305F4FF9760FB1F62 +:10AC8C00E78020D611C106A1B24022449244410172 +:10AC9C00828085476392F5049760FB1FE78060D440 +:10ACAC002A847DD1FD571EA11C241307F00F63824B +:10ACBC00E7021307E00F6389E700342008340147EB +:10ACCC005146A685EFF02FA12285EFF0DFF0FD575E +:10ACDC001CA4230504004DBF8947E397F5FA85456D +:10ACEC00EF40E04155F126859760FB1FE78060CF70 +:10ACFC002A845DF951BF21C518259307F00F630015 +:10AD0C00F704011122CC06CE2A8434210E210835F9 +:10AD1C0001475D46EFF02F9C3820E1476318F700A0 +:10AD2C000A206C0023060100EFA02F84F9571CA405 +:10AD3C002285EFF05FEAF2406244056182808280F6 +:10AD4C009307F00F6306F706011122CC26CA2A845A +:10AD5C004EC6AE84B689AA859306850037B5040025 +:10AD6C004AC852C43A89328A130525D0794606CE90 +:10AD7C00EFF06FA3A3042401230144012322340127 +:10AD8C0085C01305C4006244F2404249B249224ACC +:10AD9C00A685D244614605611753FB1F6700E35833 +:10ADAC00F2406244D2444249B249224A056182804F +:10ADBC008280B73700202384A7FC82809547639458 +:10ADCC00F50683474502854685072302F5021E22B8 +:10ADDC0058423022FD17C207C1836312D6048A077A +:10ADEC00BA9798339C232207D98F7A2563F5E70409 +:10ADFC00411106C622C485075EA52A849305C500A9 +:10AE0C000A21EF905FCF0824B165938505B8EF80D8 +:10AE1C001F84B2402244D9473E8541018280C946F5 +:10AE2C00B387D70275BF5422294785476396E6003E +:10AE3C000347450211C381473E8582809D47639B32 +:10AE4C00F50483474502762585072302F5021E2269 +:10AE5C005842FD178A073E971C331823A207D98F37 +:10AE6C00014763F2D704411106C622C485072A8420 +:10AE7C005EA59305C5000A21EFF08FD50824B165B6 +:10AE8C00938505B8EF80AFFCB240224459473A8510 +:10AE9C00410182805422A94705476396F600034777 +:10AEAC004502133717003A858280411122C406C629 +:10AEBC0026C2B5472A846395F50483474502B284BC +:10AECC0085072302F5020A21EF907F929E2013073B +:10AEDC00F5FF014563C1E7027A240A209305C400FB +:10AEEC00BA977EA4EF903FCF0824B165938505B83F +:10AEFC00EF80EFF55945B2402244924441018280E3 +:10AF0C0058229D470545E318F7FE034544021335C7 +:10AF1C001500D5B7C5476396F5061E223A22FD17D4 +:10AF2C00B387E7020347450205072302E5025842AF +:10AF3C00C207C1833E973C333823A207D98F4167A0 +:10AF4C007D176395E70081473E8582801387170044 +:10AF5C005AA57A25E3F9E7FE411122C49305C500F1 +:10AF6C002A840A2106C6EF901FD00824B165938568 +:10AF7C0005B8EF80CFEDB2402244D9473E85410160 +:10AF8C008280542229478547E390E6FC034745021B +:10AF9C005DFB5DBF011122CC26CA4AC852C406CE45 +:10AFAC004EC6BC2115472A8AAE8432843689639AF0 +:10AFBC00E7043686A2852685EFF05FE0AA8955E581 +:10AFCC0085476314F40A03474900A9476300F70255 +:10AFDC0088344A8785460146D285EFE0DFEF19E5D4 +:10AFEC0085454A85EFE05FE713341500B4208834BB +:10AFFC0001476946D285EFE01FEE2685EFF0BFBD15 +:10B00C0049A01D476398E7003686A2852685EFF098 +:10B01C00FFE26DB725476398E7003686A285268543 +:10B02C00EFF0DF9A61BF35476398E7003686A2855B +:10B03C002685EFF09FE759B745476398E7003686BA +:10B04C00A2852685EFF01FED95BF5D47639EE70057 +:10B05C00D82585473686A2852685631DF702EFF035 +:10B06C00AFCB8547631AF5048549A5476317F402EE +:10B07C00835709009DE30544E38A09F6D947E39E0B +:10B08C00F9F62285F2406244D2444249B249224A3E +:10B09C0005618280EFF06FD3E9B788344A87A286C6 +:10B0AC000146D285EFE03FE379F5A2854A85EFE0D2 +:10B0BC00BFDA13341500C9B70544E1B7397122DC86 +:10B0CC0006DE26DA4AD84ED652D456D29E211944E0 +:10B0DC00B9E783C925002A89328A938759FE93F7E9 +:10B0EC00D70FAE84DDE3B737002083C687FC130788 +:10B0FC00F00F938A87FC19446383E602F547639546 +:10B10C00F9049760FB1FE780C08DAA891DCD3025FF +:10B11C000DCE93178601E18763DD0700014422857C +:10B12C00F2506254D2544259B259225A925A216165 +:10B13C008280F5454A85EFE07FE283C7A90093E75B +:10B14C0007F82385F900D9BF8149D62090448C306B +:10B15C0088203800EF907FC22A8471F1B42003C597 +:10B16C000A0038000146CA85EFE0FFD62A8445F96B +:10B17C00B24799C323000A00BC207547E390E7FA55 +:10B18C00E38E09F82385F90059BF9760FB1FE78010 +:10B19C004085AA8A41D58547639FF908CE2088440B +:10B1AC003000EF90AFE62A843DF903C72A00C5476B +:10B1BC0063FFE708DD47630DF70AB737002003C5C7 +:10B1CC009A0083C7D73F6398A70A014403C72A0094 +:10B1DC008D47631EF7043C8403D7CA0063F4E70071 +:10B1EC002396FA0083D5CA004A85EFF02F8AB73729 +:10B1FC00002083D7C7246D47637BF70283D5CA0031 +:10B20C005D476376B7021387350091056349F700F4 +:10B21C001307B00FBE856374F7009305B00F11666A +:10B22C00C20513060629C1814A85EF80A01C5685EC +:10B23C00EFF07F9AEDB53C211144E39237EF5C417E +:10B24C00E38F07ECCE20884430008297A9BFB72744 +:10B25C0002009387072AB3D7E700858BB9DFB020AC +:10B26C003400D6854A85EFF0FFD22300AA0045BDF5 +:10B27C0083A70A01E5B7B42038000146CA85EFE080 +:10B28C009FC52A8421F5AC202800EFE0FFBC15DD1A +:10B29C0023000A0025BF011122CC3734002006CE32 +:10B2AC0026CA4AC84EC652C49309C43F03C5890076 +:10B2BC009307800291653305F502938565703739E4 +:10B2CC000020930449FC9750FB1FE780E0D603C68F +:10B2DC0089009307800281453306F60288C0975097 +:10B2EC00FB1FE780200B9C404D459DCF9304C43F32 +:10B2FC00130949FC0144130A8002FD599C24636D17 +:10B30C00F40237B504001305850CEFE0FFF637B5F2 +:10B31C000400130525B8EF90CFBF37B50400130513 +:10B32C0045C6EF30D0540145F2406244D244424904 +:10B33C00B249224A05618280B30744030325090000 +:10B34C006146814505041374F40F3E9523103501B5 +:10B35C0023010500231435012305050023020502F2 +:10B36C0031059750FB1FE780E00249BF0145828001 +:10B37C00B737002083C65740814763E5D7000147A4 +:10B38C003A8582802E87910503D6C5FFE30AA6FE77 +:10B39C008507E5B70DC93C210547890793F7F70FDA +:10B3AC006373F702411122C406C62A840E21283188 +:10B3BC000147F9465D46EFE01FB2F9573EA0B24097 +:10B3CC002244410182808280B737002003C7574056 +:10B3DC00FD56814763E3E700828016A12301050037 +:10B3EC0085071105C5BF014582803736002013063D +:10B3FC00F6F3930700021CA237370020FD57230FEA +:10B40C00F7F2373700202308F7F237370020A3076D +:10B41C00F7F28545B7370020239EB7F2B7370020E7 +:10B42C00239507FCB737002023AA07FCB737002069 +:10B43C0023A207FEB737002023AC07FCB736002049 +:10B44C00B7F70600938646F3938707C7DCC2B73776 +:10B45C000020238607FCB7370020938787EC094729 +:10B46C0098A298A398AB2380E7022388E70237F7CA +:10B47C000600130707C6D4C7D8DBB7F606000D477E +:10B48C00238CE7029386C6C537370020D4CB03271D +:10B49C0007FD37F50600B7F60600130505C89386B9 +:10B4AC0006C9C8C38CA7239507008CAF239D070042 +:10B4BC00D0CFD4D3238407022395070223A60702F7 +:10B4CC00239D0702D8DFB737002037B704009387D6 +:10B4DC0087F01307875923A00700D8C323A40700BC +:10B4EC008280411106C6EFF0BFE809C52821B240A1 +:10B4FC00410182800145E5BF411122C426C24AC0E8 +:10B50C0006C6AA842E893284EFF09FE609E94165CC +:10B51C00CA857D15EFF0DFE5C54701C506A120A161 +:10B52C008147B2402244924402493E8541018280C7 +:10B53C0039E38948354763911605011106CE22CCB3 +:10B54C0026CA1832102293C7F7FF2207598EF18FA3 +:10B55C0032C68DE7C4452A84A685EFF09FF83246A3 +:10B56C000147630FA60022856244F240A685D244AF +:10B57C0005616FF07FF82D473A858280130700082C +:10B58C00F2406244D2443A850561828083C805004A +:10B59C0009486395080303A845008347180003482E +:10B5AC000800A207B3E70701C2070D68C18713089B +:10B5BC0028906395070189476FF09FF705458280B6 +:10B5CC00011122CC37340020130404F3182006CECA +:10B5DC0026CA4AC84EC69307F00F630FF702AA8912 +:10B5EC002945B2842E899750FB1FE78040C40DC5B6 +:10B5FC009307100B1EA12302050023113501231301 +:10B60C00250106A5AA8508206244F240D24442498D +:10B61C00B24905616F705FC7F2406244D24442493F +:10B62C00B249056182804111B737002026C2AE8431 +:10B63C0083A507FD22C406C62A84EFF09FEA098978 +:10B64C0009C922852244B240A685924441016FF07B +:10B65C00EF96B2402244924405454101828041114B +:10B66C0022C426C24AC006C6AA8413044500130984 +:10B67C00850B1E209DC3084409C59750FB1FE7800E +:10B68C00A0A82285314681459750FB1FE78080D0CA +:10B69C003104231A04FEE31E24FDB2402244FD575C +:10B6AC009EA00249924441018280B737002003C614 +:10B6BC005740B737002003A7C7FD81476315F60035 +:10B6CC00814636858280BA861307870B835587F4AB +:10B6DC00E389A5FE850793F7F70FCDB7B7370020A1 +:10B6EC0083A747FE81CBDA236314A70088478280A7 +:10B6FC009C43CDBF01458280411106C6EFF01FFE71 +:10B70C0009C50845B240410182800145E5BF0111E0 +:10B71C0026CA9384450022CC4EC606CE4AC852C4D3 +:10B72C0056C25AC0268781490144814681473D450E +:10B73C00122345CABDEE42233E23B286A297C2070E +:10B74C00C18385093107E395A9FE35C42E8991651E +:10B75C009385457022859750FB1FE780E08D2A8BDF +:10B76C0039C9814A014A8C4495C1D22033054B0119 +:10B77C009750FB1FE78060BBDE2088443E9A420A4C +:10B78C00135A0A019750FB1FE780009863890A003F +:10B79C003146814526859750FB1FE780A0BF850A5F +:10B7AC00B104E3E23AFD232669012314890005451F +:10B7BC0021A0630DD6000145F2406244D2444249B7 +:10B7CC00B249224A924A024B056182803223E31429 +:10B7DC00F6FE52233294B2974204C2074180C183D1 +:10B7EC008DB70545E37A35FD8DB7B737002083A7B4 +:10B7FC0087FD99E30145828098473A276315A70096 +:10B80C001385470082809C43EDB7411106C6EFF0CB +:10B81C00DFFD09C50A21B240410182800145E5BF27 +:10B82C00411106C6EFF07FFC09C52821B240410149 +:10B83C0082804145E5BF411122C42A842E8506C66B +:10B84C00EFF01FFEAA8505462285EF30406B954729 +:10B85C006305F500BD476313F5002145B240224452 +:10B86C00410182804111B737002022C406C603A4CF +:10B87C0087FD8146938787FD21C0184432271840E5 +:10B88C006317A60285CA98C22E8581C921469305E5 +:10B89C0044009750FB1FE78040A922859750FB1F5F +:10B8AC00E78080860145B240224441018280A28615 +:10B8BC003A84D9B798C3C9BF0545F5B737370020C7 +:10B8CC00832747FE0146130747FEA9C703D8470045 +:10B8DC009443631CA802011106CE22CC26CA0DCAC1 +:10B8EC0014C2AA843E852E849750FB1FE780C0812A +:10B8FC002C002685EFF01FF701E519C0B2471CC0DC +:10B90C00F2406244D244056182803E86B68775BFA0 +:10B91C0014C3C1BF05458280411122C42A84090584 +:10B92C0006C6EFE00FE9FD573CB0B240224441019E +:10B93C008280411122C4416406C626C29307E4FFEB +:10B94C006301F502AA849DE19750FB1FE780800CF0 +:10B95C0009E91305F4FF9750FB1FE780A00B11C1F9 +:10B96C0006A1B240224492444101828085476392F1 +:10B97C00F5049750FB1FE780E0092A847DD1FD5721 +:10B98C001EA13C201307F00F6382E7021307E00FA0 +:10B99C006389E70028300147F9465146A685EFE058 +:10B9AC008FD32285EFF05FF7FD573CA023020400F4 +:10B9BC004DBF8947E397F5FA8545EF30407455F153 +:10B9CC0026859750FB1FE780E0042A845DF951BF60 +:10B9DC001D71A6CACEC686CEA2CCCAC8D2C4D6C247 +:10B9EC00DAC05EDEAE84AC21F947AA896397F50410 +:10B9FC009750FB1FE78000022A8411ED0144228539 +:10BA0C00F6406644D6444649B649264A964A064B01 +:10BA1C00F25B256182803C210547890793F7F70F7C +:10BA2C00E37EF7FC28310147F9460146CE85EFE06D +:10BA3C008FCA2285EFF05FEED1B703AB0400B707D6 +:10BA4C000001938707F037071200B377FB00130749 +:10BA5C000710B28A0149638BE7022EC69750FB1F71 +:10BA6C00E78040FB2A89B24515C1502105C29317C6 +:10BA7C008601E187E3C407F84E85EFE02FCE8347BC +:10BA8C00490093E707F82302F9008DBF373A0020ED +:10BA9C000347EAF39307F00F130AEAF31944E300A0 +:10BAAC00F7F6E147E3EDB7F493D71500FD171397BD +:10BABC003700B7E706009387075ABA9703A8070021 +:10BACC00E30F08F283AB4700E38B0BF2420B135BE3 +:10BADC000B0163050B00C947E393F5F2D6209044A4 +:10BAEC008C308820380802982A8411F92C084E854D +:10BAFC00829B2A8431C19C30E39307F0BC20230A3B +:10BB0C00A10039472308F1006396E70262471C3312 +:10BB1C001823A207D98F0C084E85FC81EF809FE378 +:10BB2C00E30E05EC14080546D9454E85EFE04FE1D0 +:10BB3C002A84F1B5BC84C5B7B4209147E380F6ECF8 +:10BB4C0003450A0038080146CE85EFE0CFB82A84B9 +:10BB5C00E31705EAAC202808EFE00FB019C12380E9 +:10BB6C000A009840B7070001938707F07D8FB7074D +:10BB7C00120093870710E303F7E8E30109E8BC2000 +:10BB8C002302F900ADBD011106CE2EC69750FB1F46 +:10BB9C00E78040E811C95C21B24513871700639513 +:10BBAC00E50093F707F85CA1F240056182803971DA +:10BBBC0052D42E8A4ED69305E101AA89528522DCF5 +:10BBCC004AD856D206DE26DA328936C63AC4BE8A3E +:10BBDC009750FB1FE780C0E6054435C1AA84A887AF +:10BBEC003944EFF0BFAF21CD0328450063090804A9 +:10BBFC002247B246D6874A86A6854E8502982A8465 +:10BC0C001DED9307E00F638CFA02982089476318A7 +:10BC1C00F702D8401C331823A207D98FC2070D672F +:10BC2C00C18713072790639CE700834719000346DD +:10BC3C000900D285A2075D8E4E85EFF07F98228594 +:10BC4C00F2506254D2544259B259225A925A21613A +:10BC5C008280797122D422214ECEAA89228556CA9D +:10BC6C0006D626D24AD052CC5AC85EC662C4AE8A18 +:10BC7C00EFF0BFA301E92285EF908FD9594431E54C +:10BC8C000144A1A003C789008547AA840144631716 +:10BC9C00F702AA8513858900EFF07FA729C9FA203E +:10BCAC009624D044CE2003D52900E147EFF03FF095 +:10BCBC00D9472A846318F50223A604002685EFF0E1 +:10BCCC001F9A41C0D947E30DF4FA2285B250225491 +:10BCDC0092540259F249624AD24A424BB24B224C1C +:10BCEC004561828061DDDE202390FA00C1BF13899B +:10BCFC004400014AB94B594C3D4B83550900DDDDDD +:10BD0C00E14763067A010357C90011C3D9470357AA +:10BD1C002900835649000326890003D52900EFF03A +:10BD2C001FE92A846319850123240900050A3109B6 +:10BD3C00E3156AFD61B77DD9835709002390FA009A +:10BD4C00F5B703D529000DBF011170879307E00FDC +:10BD5C001306E1000147894606CEEFF05FE5F2409D +:10BD6C0005618280797122D42A840A2526D2AE8478 +:10BD7C009305210106D64AD09750FB1FE78040CC93 +:10BD8C0079C51C252AC693F707029DC7A881EFF039 +:10BD9C00BF96AA87B24511E91E2439459EA0B25020 +:10BDAC00225492540259456182802A204946829736 +:10BDBC0001C51E249EA0E5B7035924004A85EFF067 +:10BDCC00DF8E01ED41657D15EFF03F8E09E51E24F8 +:10BDDC0025459EA0E9B7231025011307450081478F +:10BDEC00BD46122339EE3147B387E70213098400AD +:10BDFC003146CA8591073E959740FB1FE780E0527C +:10BE0C003146CA8548089740FB1FE78000525224F0 +:10BE1C002A2041478146DD45EFE0EFCC2ACE09E5EB +:10BE2C001E2445459EA0A5BF0C4852249740FB1FDD +:10BE3C00E780A04F2A204C08EF904FB92DD15945DF +:10BE4C00B9BF85073107E39ED7F825459DB7054552 +:10BE5C008DB7797122D42A840A2526D2AE84930513 +:10BE6C00E1014AD006D632899750FB1FE78040BDCE +:10BE7C002DC91C2593F7070295EF18389307200559 +:10BE8C0011E35C20362450440E242A200147EFF0A5 +:10BE9C001FD2AA8729E11C3891E72A20EF900FAF17 +:10BEAC00D94711E18147B2502254925402593E8530 +:10BEBC00456182802AC6A887EFF01F84AA8705C532 +:10BECC00B2452A2049468297AA8745D91A249AA0B6 +:10BEDC00183869FBC9BF5947E31AE5FE230009006E +:10BEEC00D1B78547E5B7B947D5B7397122DC4AD800 +:10BEFC004ED652D406DE26DAAA892E8A32C6368966 +:10BF0C009750FB1FE78000B109440DC53C21130776 +:10BF1C00E00FAA845D44638FE7001307F00F5944C8 +:10BF2C00639AE700324605E2D2854E85EF906FB2F8 +:10BF3C002A841DCD2285F2506254D2544259B259F2 +:10BF4C00225A2161828003550A009305E101231FC7 +:10BF5C0001009750FB1FE780A0AEA887EFF05F8C25 +:10BF6C00AA8505464E85EF2090792A8455DDD9B7F0 +:10BF7C009307F00FE300F9FC37B504009386240017 +:10BF8C007946A6851305053AEFE0EF81A3812401DC +:10BF9C0055B73971B737002026DA83A487FD52D400 +:10BFAC005AD05ECE62CC06DE22DC4AD84ED656D2B1 +:10BFBC0066CA2A8BAE8B328C368A99E08149A9A04D +:10BFCC00804483DC44000149835AA4006314990122 +:10BFDC008440E5B73E24A28963F86701050942094C +:10BFEC00135909014104DDB7E3EAFBFE630B0A00B8 +:10BFFC000C204840D28662863AC6EF802FEB32473F +:10C00C0071DD19C323105701F25062544E85D2547E +:10C01C004259B259225A925A025BF24B624CD24CA0 +:10C02C00216182809A21B621854763E5E60439C3F4 +:10C03C004111D42126C237F506009384550022C441 +:10C04C0026862E84130505C8894506C6EF800FE6A3 +:10C05C00C14719C954202E200A2001472686EFF02B +:10C06C005FF3814711E1A947B240224492443E85D7 +:10C07C00410182803E8582802E860A22AE21854730 +:10C08C0063E1A50219CD542241110147150606C6DC +:10C09C00EFF03FF0814711E1A947B2403E854101E5 +:10C0AC0082803E8582802E860A22AE21854763E1FE +:10C0BC00A50219CD542241110147150606C6EFF011 +:10C0CC005FED814711E1A947B2403E854101828075 +:10C0DC003E85828039714ED6BE2183D9050006DE9D +:10C0EC0022DC26DA4AD852D456D25AD05ECE62CC52 +:10C0FC0066CA6AC863EA3715854763880912416BBB +:10C10C00AE8A2A8A2314010002C6014401497D1B10 +:10C11C00894B054CC94C054D83D52A0001478146F6 +:10C12C0001464E8523130100EFF0BFE6AA84630B92 +:10C13C00050E09EC13072002930661005A869545FB +:10C14C005285EFE04F9A2A846302051038849C20B4 +:10C15C0041CB18856305A70741476385E7022C008F +:10C16C005285EF80BFD309CD34001546D945528591 +:10C17C00EFD01FFD11C532459740FB1FE780C0F87B +:10C18C00814765A0BE244146130524001CA0BE2493 +:10C19C00A1831CB0CC409740FB1FE78000194904D9 +:10C1AC003C848507C207C1837C8463FD2707BE24BA +:10C1BC00638A67078509C20993D90901B1BFE39066 +:10C1CC0077FBBE240946130524001CA0BE24A183C2 +:10C1DC001CB0CC409740FB1FE78020151104C9B759 +:10C1EC0022C603596100B82413052400638F77011C +:10C1FC00335999032305710118A0BE244146A1832C +:10C20C001CB0CC401379F90F79B72305810118A024 +:10C21C00BE24135929001379F90FA1831CB00946C8 +:10C22C00CC404DBF3C8485FFA947F2506254D25498 +:10C23C004259B259225A925A025BF24B624CD24C7E +:10C24C00424D3E85216182808547C5B7C547F1BF08 +:10C25C00B737002003C727FF854763F4E7060111B2 +:10C26C0022CC26CA4AC806CE2A843289AE8497408C +:10C27C00FB1FE780207A19C538219307E00F5D4535 +:10C28C006308F700631C0900A6852285EF801FF95F +:10C29C00F2406244D2444249056182808A2093056F +:10C2AC00E100231701009740FB1FE7806079288786 +:10C2BC00EFF00FD7AA8505462285EF20504469D5AB +:10C2CC00C1BF5945828013F7050201C7B2856FF0D3 +:10C2DC008FD6411126C24AC006C622C413F9850066 +:10C2EC00AA8463170900139785016187635B0702B2 +:10C2FC0032853684EFF0CFD2AA8505466313090048 +:10C30C0001462685EF20B03F01E90145B2402244A9 +:10C31C0092440249410182801C34EDDB1C24F5F768 +:10C32C00F5B793F72500F5F30D45CDB77971AE86CA +:10C33C0022D42A848A229305E10106D636C6974078 +:10C34C00FB1FE780E06F19C90C25B246B087228528 +:10C35C00EFF07FF7B2502254456182800545DDBF76 +:10C36C0013F7050201C7B2856FF0EFCC411122C45F +:10C37C0026C206C693F485002A8491E4139785019E +:10C38C006187635007023285EFF08FC9AA85054695 +:10C39C0091E0014622852244B240924441016F2033 +:10C3AC00103693F72500014591E30D45B240224428 +:10C3BC009244410182807971AE8622D42A848A22E9 +:10C3CC009305E10136C606D69740FB1FE780406710 +:10C3DC00B24611C90C25B0872285EFF07FF8B25018 +:10C3EC002254456182800545DDBF797126D2AA842D +:10C3FC002A25C16722D44AD04ECE06D62317010077 +:10C40C00FD173284B6890149630CF50005059420AB +:10C41C00D04042051307E1004181EFF09FB72A8914 +:10C42C009420D04037F506008945130505C8EF80E8 +:10C43C00EFA715C5A2242285EFF02FBD09C57D14E9 +:10C44C002A94420441806384090023908900B250ED +:10C45C0022544A8592540259F249456182809420B3 +:10C46C00D04037F5060089451305C5C8EF800FA4E9 +:10C47C0071F19420D04037F5060089451305C5C5E8 +:10C48C00EF80CFA211C9E30809FA3C87E39587FA3C +:10C49C000354A9007D1475B7A22475B7397122DC39 +:10C4AC0026DA4AD84ED652D456D25AD062CC06DEB0 +:10C4BC005ECEBE899C252A8AAE84C18B328C368492 +:10C4CC003A89C28A468B9DE783CB04008947638BEC +:10C4DC00FB046285EFF08FA01DC1832805006380EB +:10C4EC0008025A88D6874E87CA862286A685528528 +:10C4FC00829839A03285EFF02FA0AA8711ED39452B +:10C50C00F2506254D2544259B259225A925A025B96 +:10C51C00F24B624C216182802946A6855285829716 +:10C52C0045D5F9BFD8401C331823A207D98FC207B1 +:10C53C000D67C187930607906383D71E63CCF606FD +:10C54C0093062780638ED70A63C0F6021307078011 +:10C55C00E3C1E7F82D45E39509FADC449023CC437D +:10C56C002310C9002285B9A213073780E393E7F69D +:10C57C002D45E39709F885472310F900DC448145E4 +:10C58C009C231CA0AA240505420541819740FB1F52 +:10C59C00E780004B835709006310051091072310A7 +:10C5AC00F90011468145130514009740FB1FE780E5 +:10C5BC0060DEF1A8930627906386D71463C1D71069 +:10C5CC0093063790638DD71413074790E393E7F0E6 +:10C5DC002D45E39709F2DC441D472310E90098230D +:10C5EC0018A0983318B0BA2338A0BA23218338B0D6 +:10C5FC00D82358A0FA2358B0FE23A1837CA041A8CD +:10C60C002D45E39F09EEDC446C0083C91700982389 +:10C61C00A209B3E9E90011472310E9009C234E85D8 +:10C62C001CA0DC449C331CB09740FB1FE7804041AE +:10C63C00AA8425C13086C1659306E100FD158329C6 +:10C64C00C500EFF09FDA09ED9420D04037F50600D5 +:10C65C0089451305C5C8EF806F8519E1FD577C87A7 +:10C66C0003C7090089476310F70283A549000946EF +:10C67C00130544009740FB1FE78020CB835709002C +:10C68C0089072310F9003C873CA0A1833CB00145ED +:10C69C0085BD23173101C5BF18218907BA9723100F +:10C6AC00F9003E251CB03E25A1833CA010214C4135 +:10C6BC00130534009740FB1FE78020C7C9BFC8444F +:10C6CC009740FB1FE780E0CF93170501C1832A87B2 +:10C6DC001D45E3E737E36399F90023100900CC44C7 +:10C6EC0003560900CE95BDBD4207B3863A0141837E +:10C6FC0063C7E600B38737412310F900CDB7231089 +:10C70C005901F1BF2D45E39D09DECC445285EFE084 +:10C71C005FDD2310790108A0218108B08DBF2D4564 +:10C72C00E39009DEDC44231079019C231CA0DC443B +:10C73C009C331CB0A9BF1D71CAC82A892A21A2CC5E +:10C74C00CEC6D2C4D6C2DAC05EDE62DC66DA6ED683 +:10C75C0086CEA6CA6AD8AE8AEF806F89130CF5FF15 +:10C76C0093170C01B73B0020C1832A8A814913849B +:10C77C004B1A3EC6373B0020B73C0020C16D835797 +:10C78C00C90063F5F9001E2063CC8701035529000D +:10C79C0093854B1AEF807F942A8D15CD594D25A882 +:10C7AC0083278900139719009305E101BA97843305 +:10C7BC009C23A204DD8C26859740FB1FE780402834 +:10C7CC00AA8515E923909A004840054D09C5974064 +:10C7DC00FB1FE7806093F64066446A85D644464961 +:10C7EC00B649264A964A064BF25B625CD25C425DC5 +:10C7FC00B25D2561828032488348490083A64CFD96 +:10C80C00B0870355290081471307ABFCEFF01FC914 +:10C81C002A8D13884CFD09C523909A0048407DB79A +:10C82C005C4085E703552900514781461386FDFF7F +:10C83C00BD45EFD05FABB737002048C0138847FD2C +:10C84C0009E523909A00454D79B71E200357ABFCA0 +:10C85C009304ABFC3E976346470113C7F7FF52970F +:10C86C009AA048409220832508003E958509974060 +:10C87C00FB1FE78080AB1E209A20C20993D90901C7 +:10C88C00BA971EA0EDBD397122DC2A842A2106DE5E +:10C89C0026DA4AD84ED652D45AD05ECE62CC66CA6C +:10C8AC002E8B56D26AC8EF709FF42A8A54242E24F9 +:10C8BC000A2478001306D400130CBAFF651AEFF0A3 +:10C8CC004FED420A37390020AA898144135A0A01D4 +:10C8DC00B73B0020B73C00201309491A63820904B6 +:10C8EC0063D08405938A4CFD8348440083A60A00D8 +:10C8FC0030862A20528881471387ABFCCE85138D56 +:10C90C00ABFCEFF0BFB91DC1814A30862E244E8599 +:10C91C009306E100EFF07FADAA8963990A065DFDED +:10C92C00F1E41E2429452310FB0035A883570D0084 +:10C93C001228E31BF6FC83A50A0048489740FB1F0E +:10C94C00E780A0AF71D18327490095EF2A2041667B +:10C95C00454781467D169D45EFD0FF981DE11E246D +:10C96C0045452310FB00F2506254D2544259B2593F +:10C97C00225A925A025BF24B624CD24C424D2161CC +:10C98C0082802322A90083DAA90041B783274900BA +:10C99C00A6972380570193871400139707018327C9 +:10C9AC004900418393DA8A00BA9723805701138791 +:10C9BC002400832649009387340042079104418365 +:10C9CC00C207C204C183C180369711C9348714A32E +:10C9DC0003274900BA973887218398A301B7FD56DE +:10C9EC0014A303274900BA9794A31DBF2A20B73577 +:10C9FC00002089802392951A9385451AEF808FD554 +:10CA0C003DD159458DB7411122C406C693F7050196 +:10CA1C002A84328585C3EFE0BFE0AA8505462285CE +:10CA2C00EF20E04D95476305F500BD47631DF5020A +:10CA3C00214515A893F7450099CBEFE07FDE05461D +:10CA4C00AA8522852244B24041016F20404B93F7C6 +:10CA5C00050489C7EFE0DFDC0146DDB713F51500EF +:10CA6C00133515000605B2402244410182807971CC +:10CA7C004AD04ECE52CC06D622D426D22A8AAE89A1 +:10CA8C00014983D749006364F900014581A083A75C +:10CA9C00090013141900930414003387970018230A +:10CAAC00A297882322079305E100598D9740FB1F1D +:10CABC00E78000F905E583A7090005453E94182099 +:10CACC0098A383A70900BE94982098B3B25022541F +:10CADC0092540259F249624A456182800C25308792 +:10CAEC005285EFF05FF201CD83A709003E94182028 +:10CAFC0098A383A70900BE94982098B3C1BF0509D9 +:10CB0C00420913590901B5BF011122CC2A848A218B +:10CB1C009305E10006CE9740FB1FE78060F211C938 +:10CB2C000C2530872285EFF01FEEF2406244056140 +:10CB3C0082800545DDBF1D71CAC82A892A2186CE8F +:10CB4C00A2CCA6CAD2C4D6C2DAC05EDE62DC66DA79 +:10CB5C002E8ACEC66AD86ED6EF707FC92AC6834697 +:10CB6C00C9008355A9000355890078081306D9001C +:10CB7C00EFF02FC2B247B7340020416B938AA7FF66 +:10CB8C00C20AAA8B014493DA0A01373C0020B73C55 +:10CB9C0000209384441A7D1B63820B18B08683C5D6 +:10CBAC008B0003552900EFF01FE6AA8D63130516C1 +:10CBBC008348490083A64CFDB0860355290056884E +:10CBCC0081471307ACFCDE85EFF05F8DAA8D9309CE +:10CBDC00ACFC138D4CFD631E051215CC03D709005C +:10CBEC00BE2011076397E7003247A2976D1763C702 +:10CBFC00E706B73500209387451ABA230355290059 +:10CC0C009385451A3354E40282A3EF80CFD0AA8DCA +:10CC1C0015C1D94D05A003552900494781465A86AF +:10CC2C00C545EFD04FECC8C015E583D7AB00C54D5B +:10CC3C002310FA00F64066446E85D6444649B64940 +:10CC4C00264A964A064BF25B625CD25C425DB25D50 +:10CC5C002561828083D709009107BEA0DC4003D7F1 +:10CC6C00AB009306E101A29798A3930714001397C6 +:10CC7C000701DC4041835E85BA9703D7AB00218363 +:10CC8C0098A3B0868355A900EFF02FF61307240064 +:10CC9C00D44093073400420711044183C207420475 +:10CCAC00AA8BC1834180369715EDFD5614A3D8404D +:10CCBC0083250D00BA9794A3C84003D6090022958A +:10CCCC009730FB1FE780606683D709003E944204CF +:10CCDC00418005F0835789002310FA00E39C0DF482 +:10CCEC00A94D89BFB48783250D0014A3D840BA97EA +:10CCFC00B887218398A3C84003D6090022959730A2 +:10CD0C00FB1FE780806283D709003E944204418078 +:10CD1C0061B583D7AB002310FA0065BF814D55BFB9 +:10CD2C005D71A6C2CAC0AA84035985002A21A2C477 +:10CD3C004EDE52DC5AD85ED662D466D286C656DA3D +:10CD4C006AD06ECE2E8BEF709FAA930BD5FF711508 +:10CD5C00131A0501B73900200144135A0A01373C54 +:10CD6C000020B73C00209389491A635B7413D424C8 +:10CD7C00AE241307E1001386D4004A85EFF06FA1AF +:10CD8C002A8D630F05100359A5000C253087AA20A6 +:10CD9C00EFF07FC7631B051083C8440083A64CFDCE +:10CDAC003087AA20528881471307ACFCEA85EFF044 +:10CDBC00EFEE930DACFC13884CFD65E905C883D7E9 +:10CDCC000D0003D7290089076308F706B735002043 +:10CDDC001387451A3E23AA209385451A3354F4022F +:10CDEC0002A3EF80EF9F0DC559451DA0AA204166F7 +:10CDFC004D4781467D16A545EFD0EFCEB7370020C5 +:10CE0C0023A2A900138847FD1DE123102B014545E2 +:10CE1C00B640264496440649F259625AD25A425BAD +:10CE2C00B25B225C925C025DF24D6161828083D7C1 +:10CE3C000D0089072391F90083D70D00A29763D1C8 +:10CE4C00770783A749000357AD00930A2400A297E4 +:10CE5C0098A305049317040103A44900C183C20AD3 +:10CE6C003E948357AD008325080093DA0A01A18311 +:10CE7C001CA003A5490003D60D0056959730FB1F47 +:10CE8C00E780A04A03D40D00C167FD1756944204F5 +:10CE9C004180E30CF9EC0509420913590901F1B57C +:10CEAC0029450DF423102B01A5B76DDC05B71E2108 +:10CEBC0081E789473E858280411126C2444122C4C4 +:10CECC0006C64AC09420D0402A8437F5060089450E +:10CEDC00130505C8EF708FFD11C93C202547E517D8 +:10CEEC0093F7F70F6376F702E14721A89420D0401F +:10CEFC0037F5060089451305C5C8EF702FFB71FD8A +:10CF0C008947B2402244924402493E8541018280C5 +:10CF1C00373900208356C9F385471309C9F3F5D275 +:10CF2C001A203697C166E3CEE6FC91659385257091 +:10CF3C0031459730FB1FE7802010AA84CD4771D173 +:10CF4C00314681459730FB1FE780C0441E20835536 +:10CF5C00090001460147B386E500C206C182636B36 +:10CF6C00F702AE97C207C18319C22310F90023A0A0 +:10CF7C0004002146A285138544009730FB1FE780EF +:10CF8C00C03AB7370020938787FD984309EF84C3D5 +:10CF9C00814785BF50401315470005072A9636A6D2 +:10CFAC00054655BF3E871C43F5FF04C399BF0111CD +:10CFBC0006CE22CC26CA4AC809E98944F24062440A +:10CFCC0026854249D244056182802AC62A842800DB +:10CFDC0036896C845085EFF09FEDAA8465F1E30FE0 +:10CFEC0009FC3E24F9DB91659385557031459730EA +:10CFFC00FB1FE780600405C53E2423200500232485 +:10D00C0025015EA1B7370020938747FE984301E7BF +:10D01C0088C36DB73E871C43F5FF08C345B7CD44A5 +:10D02C0071BFB73700209387C7FC98230DE30547E2 +:10D03C0098A3058909CDB736002037350020938693 +:10D04C0086F041469145130585EC6FF05FF601457E +:10D05C008280B73700202388A7F28280C167FD1732 +:10D06C006315F5002E856FE02FB6411106C6EFE073 +:10D07C002FB009C5FD571EA123010500B240410187 +:10D08C00828001114AC806CE22CC26CA85472A893D +:10D09C006392F5044A85EFE04FE131E9C16437F65C +:10D0AC0006009385F4FF1307E1008946130606C6B4 +:10D0BC000545EFE01FEE2A84FD1405C44C444A8557 +:10D0CC00EFF0DFF9308722858146A685EFF0EFB1CE +:10D0DC002A84E5B789476396F5008545EF20200241 +:10D0EC0055D9F2406244D244424905618280EFE056 +:10D0FC000FD76DB7011126CAB73400209384C43FF3 +:10D10C0022CC8834373400201304C4FDB7370020F8 +:10D11C003737002006CE4AC84EC62320040023A071 +:10D12C0007FE232807FC59C1138907FE9307200C1F +:10D13C003305F502916593851570930907FD190563 +:10D14C00420541819730FB1FE78000EF9034930735 +:10D15C00200C81453306F60208C019069730FB1FD8 +:10D16C00E78040231C40983481459386870B7D557E +:10D17C0063E8E5069306800BB306D7020146FD551E +:10D18C000507B6972320F900BE868EA2ACB2ACA2DE +:10D19C002382060005069906E369E6FEF95696A376 +:10D1AC0099463307D702BA9723A0F90037C5040074 +:10D1BC001305C59DEFD0EF8C37C50400130525B9B9 +:10D1CC00EF70CFD537C504001305E593EF10306A27 +:10D1DC00F2406244D2444249B24901450561828021 +:10D1EC002394A6F41386C6F4231006002324060009 +:10D1FC003106E31BD6FE85059386860B95BF411140 +:10D20C0006C622C42A84EFC08FA7EFE00F9EB73763 +:10D21C000020A38787F2B737002003A507FDEFE0B6 +:10D22C00AF9AB7370020238F87F22244B24037D50C +:10D23C0004001305E50841016F1070639397050115 +:10D24C00C18763D10730B737002003C5F7F2797176 +:10D25C0022D45AC806D626D24AD04ECE52CC56CA62 +:10D26C002E8B9730FB1FE780E0012A8429C51821FB +:10D27C009307000B631EF702B73400208547938495 +:10D28C0044FDDC849C4023150100B9E3EF0080755C +:10D29C009165938535709730FB1FE780E0D988C086 +:10D2AC0005E99C8491C74C2013058400EFD0AFD9BD +:10D2BC002285EF509FF8B250225421653345AB00C4 +:10D2CC0092540259F249624AD24A424B45618280D9 +:10D2DC00373A00206146814513054A1A9730FB1FE7 +:10D2EC00E780400B03494400894793044A1AD289CA +:10D2FC00930A4A1A631AF904F5258AA02A20930581 +:10D30C004A1AEF701FB63A209E20162401ED63E3F3 +:10D31C00F6001EA40E243A85EFC05FF72285EFC0FD +:10D32C003FCC41B763E3F6001EA41E24D945938677 +:10D33C00491A0D463A852390FA00EFC07FE08D45DF +:10D34C0071DD1385491A65A899476319F90293058C +:10D35C00A1002285EFF02FD3AA8469D1D947639E0F +:10D36C00F40C05092A201379F90FD9459386491A2B +:10D37C004A86EFC0FFDCCA8555D1E1B7A1476318D7 +:10D38C00F9009305A1002285EFF09F99F1B7A94709 +:10D39C00631AF9060A246C009730FB1FE780406A79 +:10D3AC002A89630905122A2041669306E100554734 +:10D3BC007D16AD45EFC03FF3C8C0AA8625CD834886 +:10D3CC0044000358E10030862A20814713074A1A8B +:10D3DC00CA85EFF0AF8CAA84631F050C2A20930535 +:10D3EC004A1AEF709FC51DD92A2093064A1A2D465A +:10D3FC00D945EFC0FFD41DD1AD4513054A1AEFD066 +:10D40C008FC429BFB147631BF90C0A246C009730F9 +:10D41C00FB1FE780E062AA8455CD2A204166930663 +:10D42C00E10059477D16B545EFC0FFEB23A2AA00DA +:10D43C00AA8631E11E24C5447C851830D147E30F00 +:10D44C00F7EC5C202A209385491A2380FA003C854E +:10D45C0023829A002391FA00EF70CFCFE30005EC02 +:10D46C002A209386491A0546D945EFC07FCDE3079C +:10D47C0005EA8545F9B5834844000358E1003E248C +:10D48C0030862A20A68513074A1AEFF02F81AA842A +:10D49C001DE12A2093054A1AEF707FBFE30005E8CF +:10D4AC002A20D94593064A1A3546EFC07FC9B5459F +:10D4BC00E30605E679B5D9476393F400814403A5E7 +:10D4CC004A009730FB1FE78020C4E38904E41E2444 +:10D4DC007C85A5B71E2485447C8585B7B947631820 +:10D4EC00F9009305A1002285EFF0EFA4B5B5C14773 +:10D4FC006318F9009305A1002285EFF0CFE3A9BDD5 +:10D50C00C947631AF900130691009305A1002285FF +:10D51C00EFE03F9491B5D947631DF9009305A10045 +:10D52C002285EFE03F84AA84E31A05E2A3040100FC +:10D53C00F5B3E147E314F9DE9305A1002285EFE092 +:10D54C004FF119BD01458280F9CE011152C42E8ACA +:10D55C00854522CC4EC656C206CE26CA4AC8AA8AD1 +:10D56C00B6893284EF10B039D1471DC5B7370020CA +:10D57C003737002083C707FF834617FF814419E024 +:10D58C00B684BE8637370020032787FE9397440066 +:10D59C00BA9763EDD400D547F2406244D244424975 +:10D5AC00B249224A924A3E85056182803E89C10772 +:10D5BC0003D727FF09C7850493F4F40FD9BF31CCE7 +:10D5CC009565938525C0130500029730FB1FE780F6 +:10D5DC00A0A62326A90061D11306000281459384DD +:10D5EC0004049730FB1FE780E0DA23119900230035 +:10D5FC000900231359010DC4373700201C340326AE +:10D60C0007362304F900118C8327C900118411807B +:10D61C00C0AF23A02901814741B723260900C1BF10 +:10D62C0023044901FDB785473E858280B73700202A +:10D63C0083C507FFB737002003A787FE8147639593 +:10D64C00F5008146368582803223BA8619C2E30BF7 +:10D65C00A6FE850793F7F70F4107D5B7B73700201C +:10D66C0003C607FFB737002003A787FE8147631562 +:10D67C00F6008146368582802E23BA8681C54C23DE +:10D68C00E38AA5FE850793F7F70F4107CDB7B737A8 +:10D69C00002083C537FFB737002003A70736814723 +:10D6AC006395F5008146368582801223BA8619C2AD +:10D6BC00E30BA6FE850793F7F70F4107D5B7B737EE +:10D6CC00002003C817FFB737002083A787FE014748 +:10D6DC006315E800814636858280B223BE8609CA6E +:10D6EC00F2236317A600D04701C63222E305B6FE2B +:10D6FC0005071377F70FC107E1BF411122C440455D +:10D70C0026C206C6AA8415C0484409C59730FB1F1B +:10D71C00E780809F484809C59730FB1FE780C09E73 +:10D72C0022859730FB1FE780209E26854146814548 +:10D73C009730FB1FE78000C6B2402244FD579CB4D3 +:10D74C00924441018280011122CC2A842A2106CEE6 +:10D75C002EC6EF102068324622858145EF00F05628 +:10D76C0022856244F24005616FF03FF905C53A210C +:10D77C00411122C406C62A8411CBDD45EF00F057B7 +:10D78C0022852244B24041016FF03FF7B24022445F +:10D79C00410182808280411126C2B1469304C5FFAB +:10D7AC00B386D402B73700201387073706C622C4C6 +:10D7BC00369736276397B602484305C51384073757 +:10D7CC009307F00F6305F6001C21639CC70097308C +:10D7DC00FB1FE7806093B147B387F402A29723A2A3 +:10D7EC000700B2402244924441018280411122C47C +:10D7FC002E8426C24946AA848145228506C69730C6 +:10D80C00FB1FE78020B995CCDC2C13974700B7376A +:10D81C00002083A70736BA979A231AA0BA23FE23AF +:10D82C003AA0373700200357E7FE5AA09A207AA077 +:10D83C00BA201AA4DA203AA4FA205AA49A241EA8D0 +:10D84C007AA4B2402244924441018280B73700202E +:10D85C0083C507FFB737002003A80736B73700206A +:10D86C0003A687FE014781476394E5003E858280CD +:10D87C00142299CA544689CAD42E9206C2966315AC +:10D88C00D500850793F7F70F05071377F70F4106B8 +:10D89C00E1BF130600643386C50293069500AA8582 +:10D8AC0037D50400130585776F60CF84411122C4EE +:10D8BC0006C62A840835EF60EF9DFD571CB4B240B4 +:10D8CC00224441018280011122CC4AC84EC652C466 +:10D8DC0056C25AC006CE26CA2A89AE890144373AA6 +:10D8EC000020B73A00201D4B83471AFF6365F404F0 +:10D8FC0063990902B7390020373A0020930AF00FD8 +:10D90C0083C709FF6364F4061144A144228505040E +:10D91C0042041306F00FCA854180EFF0DFE7E317EE +:10D92C0094FEF2406244D2444249B249224A924A9D +:10D93C00024B0561828083A78AFE93144400BE9437 +:10D94C009C208DC3FE20639F270163956901AA204B +:10D95C00EF10404826854E868145EF00103726850E +:10D96C00EFF0BFD905041374F40FBDBF83278AFEF3 +:10D97C0093144400BE949C208DC39C34638F570138 +:10D98C00FE20639C27012685EFF05FF22685D145AA +:10D99C00EF00B0362685EFF05FD605041374F40F54 +:10D9AC0085B741677917630BE502411122C406C69E +:10D9BC0085472A846399F50022852244B24081452B +:10D9CC0041016FF05FF089476396F5008545EF10D4 +:10D9DC0000737DD1B24022444101828082809D45FA +:10D9EC006FF07FEEB737002003D5E7FE8280B737A4 +:10D9FC00002003C7C7FE011106CE68876C868547D9 +:10DA0C006318F70070009305E1000545EF50501FB7 +:10DA1C00F24005618280A947631DF6029C31982172 +:10DA2C00A207D98F1EA1BC31B821A207D98F3EA164 +:10DA3C00DC31D821A207D98F5EA1FC31F821A207D5 +:10DA4C00D98F7EA19C359825A207D98F1EA501459B +:10DA5C008280054582809147631EF6009C31982197 +:10DA6C00A207D98F1EA1BC31B821A207D98F3EA124 +:10DA7C0001458280054582809387C5FF93960701F7 +:10DA8C00C1820D47636ED7003147B387E702373742 +:10DA9C00002013070737BA97A8A38EA301458280ED +:10DAAC00094582809306402037370020AA8763F40B +:10DABC00A60093074020F1172317F7FEB737002075 +:10DACC002389B7FEB7370020238AB7FE8280190559 +:10DADC00956542054111938535C0418106C6972055 +:10DAEC00FB1FE780605501C9B240E955410117237E +:10DAFC00FB1F6700A36EB24041018280B737002044 +:10DB0C00238907FEB737002079710547238607FE66 +:10DB1C00B73700202386E7364ECEB7370020B7390B +:10DB2C00002022D426D24AD037340020B73400202B +:10DB3C00A38A07FE37390020B7370020938939FFB5 +:10DB4C0006D652CC2AC6230804FEA38804FE2397CB +:10DB5C0007FE232409FE23800900EF1040303245D4 +:10DB6C00B7370020130600032382A7363735002071 +:10DB7C001305053781459730FB1FE780A081373AA5 +:10DB8C00002003450A3A130404FF938414FF13097D +:10DB9C0089FE05CD9565938545C012059720FB1F21 +:10DBAC00E7808049373700202320A73619CD03465C +:10DBBC000A3A93070A3A9C332380C900814512061E +:10DBCC009CA09720FB1FE780E07CB737002003C5A3 +:10DBDC0047409C209565938555C03E951375F50F70 +:10DBEC0008A012059720FB1FE78000452320A90001 +:10DBFC0051C11020814512069720FB1FE7808079C8 +:10DC0C00032709001420814725077D56639EF604DF +:10DC1C00EF104045B1473305F5029565938565C016 +:10DC2C00420541819720FB1FE7800041B737002058 +:10DC3C0023A4A7362A8401CDEF10C0423146330607 +:10DC4C00C502814522859720FB1FE780A0742254D2 +:10DC5C00B25092540259F249624A37E50400130556 +:10DC6C00E59A45616F10A040850710A393F7F70F55 +:10DC7C00410769BF230004002380040051BF4111F8 +:10DC8C009397050126C206C622C44AC0C187AE843A +:10DC9C0063DE070837390020034549369720FB1F00 +:10DCAC00E780405E2A8429C9182193070009631272 +:10DCBC00F7041831CD476319F706B736002003482F +:10DCCC00250003C5B62437370020834727FF1306EA +:10DCDC00640081458146130727FFAA886316D80282 +:10DCEC0091C11CA31C2391C7034549368545EF50B0 +:10DCFC00DF8D2285EF506FD42165258DB2402244F3 +:10DD0C0092440249410182800C22AE9793F5F70FA1 +:10DD1C0093F7F80F63F4A50093F7F50F850693F6C8 +:10DD2C00F60F090685455DBF092BE1B793F7150082 +:10DD3C000145E9D7EF00305209CDB737002083C732 +:10DD4C0027FF81CBB737002003C547368545EF50F9 +:10DD5C00DF8713C514005DB785462A8763FFC602AB +:10DD6C009C319021A207D18F1EA16399D700BC31A1 +:10DD7C00B421A207D58F3EA1014582808946014579 +:10DD8C00639ED700BC31B421A207D58F3EA3DC31F2 +:10DD9C00D421A207D58F5EA382800545828091474E +:10DDAC00631EF6009C319821A207D98F1EA1BC31AD +:10DDBC00B821A207D98F3EA10145828005458280FA +:10DDCC009147631EF6009C319821A207D98F1EA1A2 +:10DDDC00BC31B821A207D98F3EA1014582800545EF +:10DDEC008280A1476318F6029C319821A207D98F33 +:10DDFC001EA1BC31B821A207D98F3EA1DC31D8219C +:10DE0C00A207D98F5EA1FC31F821A207D98F7EA180 +:10DE1C00014582800545828089476319F6009C3153 +:10DE2C009821A207D98F1EA10145828005458280C9 +:10DE3C003E2279714ECE06D622D426D24AD0130772 +:10DE4C00F007AE896371F70209473AC47C8630004B +:10DE5C0093F5F50FEF00F076B2502254925402591C +:10DE6C00F249456182805A22D9462A89328463F765 +:10DE7C00E6007E2263F4F6006379F70023140100B8 +:10DE8C00300093F5F90F4A85F1B70A2202C4EFF07E +:10DE9C001F80AA8435C5EFF07F9B9C246369F50035 +:10DEAC001146A246CE854A85EF00706875B73400DE +:10DEBC0026869305F00F4A85EFF00FE975F1A2471E +:10DECC001A24DC479AA33A20BAA35A20DAA37A2060 +:10DEDC00FAA3DA209AA7DC4495C793F4F90F2286AB +:10DEEC00A6854A858297C167FD172A86E31BF5FA3A +:10DEFC0022459947F9451CA144A1EFF09F99A9BF70 +:10DF0C00094645B7014671BFA947631DF6029C310E +:10DF1C009821A207D98F1EA1BC31B821A207D98F95 +:10DF2C003EA1DC31D821A207D98F5EA1FC31F821AA +:10DF3C00A207D98F7EA19C359825A207D98F1EA543 +:10DF4C0001458280054582809C211CA19C311CB11D +:10DF5C00BC31B821A207D98F3EA1828023220500B3 +:10DF6C00D82189476304F70005458280F6210D47C7 +:10DF7C00E37CD7FE9C45011106CE22CC26CA4AC8AA +:10DF8C004EC684339023A204D18C138644006311B3 +:10DF9C00D604A033BC23AE8922045D8C9307C4FF46 +:10DFAC00C207C1832A896361F70203A58900231183 +:10DFBC00990023108900F1559720FB1FE780002260 +:10DFCC002322A900014531A02285EFF02FE671FD37 +:10DFDC000545F2406244D2444249B249056182800F +:10DFEC00397122DC2E841C204AD806DE26DA4ED665 +:10DFFC0019472A89B2856392E70630202800EFF092 +:10E00C001FDAAA8405E92884EFF04FE2AA890C30C4 +:10E01C0015C937F704002E86130727D234009D4507 +:10E02C004A85EF00702F4E850946814579294E852A +:10E03C00EFF0AFECF250625426854259D254B259EB +:10E04C002161828089477C803C840A867C813C8566 +:10E05C007C824A85EF00F056F1BF49476398E7028E +:10E06C0032202800EFF0FFD7AA8469F5373500205D +:10E07C00130505375E2599E381446DBF18301420D4 +:10E08C0068253C000146CA85CD2C6DB75147639E6F +:10E09C00E70032202800EFF01F98AA8441FD0C30D5 +:10E0AC0030004A85EFF0DFD871B75947639BE7041E +:10E0BC0032202800EFF03F9AAA842DFD2C844A854B +:10E0CC00EFF0EFDF05C9584534851E23B697C2071C +:10E0DC00C1831EA3D5D35C47C5D3B737002083C7F4 +:10E0EC0027FFD9DBB737002003C547368545EF50EE +:10E0FC00CFCD89B789473EC03C840A860C307C82E0 +:10E10C0089BF0C300A8623100100EF00904BADB78D +:10E11C005D71A6C256DA86C6A2C4CAC04EDE52DCF7 +:10E12C00AA8A8831AE8432C6EFF04FD3B24501EDE6 +:10E13C008144B6402644268506499644F259625AD3 +:10E14C00D25A61618280230205002311050083C924 +:10E15C00040085472A846399F900B0202808EFF061 +:10E16C00BFBFAA8405491DA09D476391F9041821DE +:10E17C008D47E31FF7FAB02028080549EFF05FC47C +:10E18C00AA8409E505468145228581262285EFF082 +:10E19C00EFF108243C080147CE862686D685F12A65 +:10E1AC00E30909F82285EFF04FD561B7CD47639BA2 +:10E1BC00F90018219147E31DF7F6B0202808EFF07D +:10E1CC00BFC545B7D547E395F9F6034A050089471E +:10E1DC00E310FAF6B02028080549EFF0FFD2AA8424 +:10E1EC0055F583570102A1EBB8841306F0035C4488 +:10E1FC00930607FCC206C182636AD600B085D94675 +:10E20C0063F6C600B486D94563EDD5002A20BAA3BF +:10E21C000549EF00303C03560102D2852285A92C1A +:10E22C00B5B7AC87BAA3D2A38EA3F6A385471CA01F +:10E23C00014A0149CDB7014AF9BF7971AA8522D4A7 +:10E24C0026D22221AA84280806D6EFF03FD1F24527 +:10E25C0099E53DE185452285EFF06FF975A0BC8409 +:10E26C0015476395E706B8858D4763F7E7046800A3 +:10E27C00EFF09FCD3887DD4763FBE7008C86B7074F +:10E28C0017008507100822853EC8EF0090333C87A5 +:10E29C00B88591076305F7002285EFF04FF41C86D3 +:10E2AC0072466C00858B1106228591CFEFF05FE6EC +:10E2BC0001C52285EFF0AFF2884449DD9720FB1FA2 +:10E2CC00E78080E441BFEFF0BFD1DDB71147638930 +:10E2DC00E7001387A7FF42074183854663EBE602FD +:10E2EC003147F117B387E702373700201307073799 +:10E2FC00BA979A2371D3A8233008A28505204DFD27 +:10E30C00B8849147E318F7F4B25022549254456103 +:10E31C0082802C082285FD2445F1FDB701114AC8E5 +:10E32C002A89314526CA06CE22CC2EC6B284972025 +:10E33C00FB1FE780C0EF21C1B2459307000A1EA165 +:10E34C002EA12A84214611058DC0A6859720FB1F7E +:10E35C00E780A0FDA2854A85EF401FF30145F240FE +:10E36C006244D24442490561828081459720FB1F5B +:10E37C00E7804002C5B70545DDB7797126D2AA847E +:10E38C001305000206D622D42ECE32CC36CA3AC899 +:10E39C003EC69720FB1FE78080E929C56246F245FF +:10E3AC004247D246B2472A84130520FA08A010B07F +:10E3BC002EA058A054B013058400614691CFBE85A1 +:10E3CC009720FB1FE78060F6A2852254B250268569 +:10E3DC00925445616F405FEB81459720FB1FE780AE +:10E3EC0060FBDDB7B250225492544561828058458F +:10E3FC00797122D406D62A84AE862DC73E23FC859D +:10E40C00930720066397F504B737002003D6E7FE81 +:10E41C007E236373F600B28713F6F70F2E2B1C2B9B +:10E42C008D8F93F7F70F81E5890793F7F70FB29765 +:10E43C00FD17B3C7C702FC863E206E200824FC845F +:10E44C0001473C080146EFF05FF3B250225445619E +:10E45C008280582FB737002083A707361207BA9748 +:10E46C00FE23D1BF2EC61946814528089720FB1FD5 +:10E47C00E78040F2B246C9B7797122D406D626D2CB +:10E48C002A8499CD81470147930600062E866E207B +:10E49C000824EFF09FEEB2502254925445618280D2 +:10E4AC00B284280059469720FB1FE780A0EE6484B5 +:10E4BC0099E43E2048446C007C85EFF02FB33C007F +:10E4CC000147930600060146D9B7797106D68147F4 +:10E4DC0091E93E21584570867C843C0001C73E235F +:10E4EC007C853C002E866E2108250147930600068C +:10E4FC00EFF0BFE8B25045618280411122C406C6DC +:10E50C001C2111472A846392E7022E866E2108256E +:10E51C0081470147CD46EFF05FE649466E20224425 +:10E52C00B240154541016FF00FA713F7B70F89469D +:10E53C006317D7000146EFF03FF45146C5B70D47BE +:10E54C006398E7002244B240014641016FF0FFF7A7 +:10E55C00B2402244410182809A21B146B737002053 +:10E56C0071173307D70293870737BA97D84301EB54 +:10E57C00D841AAA70145D8C3BA219AA78280594588 +:10E58C008280797122D4404526D24AD006D6AA84FC +:10E59C002E8931C4484419C59720FB1FE780C0B6AB +:10E5AC00232604001E20EE2088247C853E20014773 +:10E5BC00930640067C861E244A867C871C483EC8EF +:10E5CC00BE207C843C00EFF05FDBA30E24012328EB +:10E5DC000400B250225492540259456182802800A2 +:10E5EC00314681459720FB1FE780C0DABE20EE2024 +:10E5FC0088247C8401473C00930640064A86EFF051 +:10E60C00DFD7C1BF797152CC2A8A8A2126D206D68D +:10E61C0022D44AD04ECE56CAAE84EFF02F8119E1E7 +:10E62C00854795A84045AA8965DC7E21E39A47FF7A +:10E63C001E2463890710542CB73A002003A70A360E +:10E64C009206FD173697C2077A23C1831EA4631660 +:10E65C00F70093053006EFF09FD95C48A5EFC84052 +:10E66C00034915001C2122093369F900BE20130748 +:10E67C002900631CF702F9559720FB1FE78000B6B1 +:10E68C00C8C02391240103C589002686D285EFF0EA +:10E69C00FFC8814721E1B250225492540259F249E9 +:10E6AC00624AD24A3E85456182809565938515C044 +:10E6BC004A859720FB1FE780209848C8C840231C38 +:10E6CC002401F9559720FB1FE78040B1BE20C8C03C +:10E6DC00F917BEA0484825CDB220362C1E2C330885 +:10E6EC00D60063C80707582C83A70A36954512072E +:10E6FC00BA97BE2363C90705CC4036959720FB1FFC +:10E70C00E780A0C23A2CBE20BA97C2071A2CC1834C +:10E71C003EACE397E7F003D7290003C5890030002E +:10E72C0078845848D2857C853AC6EFF03FBF11C536 +:10E73C0048489720FB1FE780209D232A0400232CA8 +:10E74C000400F9BD99454E85EFE0FFFFD1BDA5450D +:10E75C00DDBF9145CDBFBA2171CBB737002083D631 +:10E76C00E7FEED4763E5E60C011122CC2E8426CAA8 +:10E77C00AA844840914506CE9720FB1FE78000A64F +:10E78C003E20AA861CA13E20A1831CB11E203CA1C8 +:10E79C001E20A1833CB13220C167F9171106420635 +:10E7AC0041826394F4042AC4314532C69720FB1F7E +:10E7BC00E780E0A7AA85CD471DC1930700F91CA1EE +:10E7CC003246F957A2463EA189475CA1B7370020D3 +:10E7DC0072A114C503C54736EF401FAB8147F24009 +:10E7EC006244D2443E850561828081452685EF4096 +:10E7FC00B055AA8711E9B736002003C726FF65D3A9 +:10E80C007D172389E6FEE1BF09476304E5021D4736 +:10E81C006303E50249476302E5027D47E311E5FC2A +:10E82C00B736002003C726FF8147D1BFED473E8591 +:10E83C008280D1476DB791475DB789474DB70111BC +:10E84C004AC831471309C5FF3307E902B73700201F +:10E85C0026CA9384073706CE22CCBA94D84029C74F +:10E86C0013840737B737002083C627FF854795C623 +:10E87C0068849E24AA242C003AC67C85EFF0BFED58 +:10E88C0011C5C8409720FB1FE7800088B147B3072C +:10E89C00F902A29723A207008547F2406244D244B2 +:10E8AC0042493E85056182808147C5BF797126D278 +:10E8BC004445373700204AD0FE200359E7FE52CC9E +:10E8CC0006D622D44ECE56CA2A8A63F327013E8935 +:10E8DC00BA284209135909019E2835CF998F4A84C9 +:10E8EC0063D5270113940701418089452285EFF0F8 +:10E8FC000F9EAA89CD4A31C5BE202AC660857C846C +:10E90C00BE2899EB9E28930925001CA19E28A18363 +:10E91C001CB1637424058228BE28CC4422864E8503 +:10E92C00BE959720FB1FE78040A003556A002C0082 +:10E93C00EFF07FE2AA8A15C54E859710FB1FE78082 +:10E94C00A07CB2502254568592540259F249624A24 +:10E95C00D24A45618280890759B7791442044180B3 +:10E96C0065BFBA289E203A94FD17C20742049A2824 +:10E97C00C18341809EA0A2A86376E400F9F3FD5701 +:10E98C00DCBCC1B781455285EFF0BFBF5DBF79716B +:10E99C004AD03739002052CC034A59FF22D456CAE8 +:10E9AC005AC85EC662C406D626D24ECE5284B73A38 +:10E9BC000020054B930BF00F373C002083A78AFEF9 +:10E9CC0093144400BE9483C90400639B6907DC4420 +:10E9DC00A5CBD84735C79A2329CBB737002083C797 +:10E9EC0027FF99CF2685EFF07FECAA8515E9B7377D +:10E9FC00002083C717FF05046351F402A30A89FEA4 +:10EA0C00B25022544E8592540259F249624AD24A6B +:10EA1C00424BB24B224C45618280A30A09FECDB712 +:10EA2C002685EFF01FB68149E1BFDC3F639A770181 +:10EA3C00930520062685EFF09F9BDC44A38E0700F0 +:10EA4C0083471CFF05041374F40F6363F400014443 +:10EA5C00E31644F7C9BF4111154506C6EFF03FDE7A +:10EA6C0009C50545B240410182801945EFF03FDDF3 +:10EA7C006DF91145EFF0BFDC6DF51D45EFF03FDC96 +:10EA8C006DF1B737002083C717FFE9DFB2404101B2 +:10EA9C006FF0FFEF9E210D47F117C207C18363632F +:10EAAC00F706DC41A5C3411122C42E84854526C23C +:10EABC0006C6AA84A92529C92685B92BC167F917C9 +:10EACC00638FF40009ED3E2099CB16201947639310 +:10EADC00E604373700200357E7FE63FDE702B7373C +:10EAEC00002083C727FFA285268599C72244B24000 +:10EAFC00924441016FF03FC62244B240924441011E +:10EB0C006FF09FA5094582805145B2402244924442 +:10EB1C00410182806D45D5BF397126DA4ED6AA8463 +:10EB2C00AE895D4589454AD806DE22DC328936C677 +:10EB3C003AC4EFE0DFF935C122472A84014511C7F9 +:10EB4C00B24613054400B6850297935785002300FF +:10EB5C003401A30024013CB09547FC84B737002056 +:10EB6C0083C727FF28A01105E88522CE2C0826850F +:10EB7C0095C3EFF05FBEAA8411C522859710FB1FC9 +:10EB8C00E7808058F250625426854259D254B259CB +:10EB9C0021618280EFF05F9CF9BFCD44E5B77971BC +:10EBAC0026D24AD052CC56CA06D6BA8A22D44ECED7 +:10EBBC0019472E89B284368A6395E5062A220944C0 +:10EBCC00EFE0DFA62AC635C55C4583596500BE2338 +:10EBDC009EA0B247B736002015472380570103C6C5 +:10EBEC00C636BAA3130716001377F70F2386E6363B +:10EBFC00D0A301E705472386E63651476317E900A2 +:10EC0C001547BAA0DC479A249AA75287A686CA85CC +:10EC1C004E85EFF07FF02A84324515C4EFE0FFAD4E +:10EC2C0009A842867400BE85AA89EFE0FF912A8468 +:10EC3C004DD12285B250225492540259F249624A63 +:10EC4C00D24A45618280F945EFE0BFC4DDB79E2111 +:10EC5C001CA19E21A1831CB1BE213CA1BE21A1837C +:10EC6C003CB1114582809E211CA19E21A1831CB127 +:10EC7C00BE213CA1BE21A1833CB1DE215CA1DE21E1 +:10EC8C00A1835CB1FE217CA1FE21A1837CB1214535 +:10EC9C0082809E211CA19E21A1831CB109458280EA +:10ECAC009E211CA19E21A1831CB1BE213CA1BE2191 +:10ECBC00A1833CB1DE215CA1DE21A1835CB1FE21EC +:10ECCC007CA1FE21A1837CB19E251CA59E25A18340 +:10ECDC001CB5294582809A218546AA8718A19A21BC +:10ECEC00218318B19A216319D700BA2138A1BA210E +:10ECFC00218338B1114582800945631DA700BA21D3 +:10ED0C001945B8A3BA212183B8B3DA21D8A3DA21E3 +:10ED1C002183D8B382809E211CA19E21A1831CB18A +:10ED2C00BE213CA1BE21A1833CB1114582807971E9 +:10ED3C0026D24AD04ECEB2842A89AE892946814544 +:10ED4C00480022D406D636849710FB1FE7808064D7 +:10ED5C0064868DE43E207C82B737002083D7E7FEA3 +:10ED6C007C845C4481CFD42F3737002003270736AF +:10ED7C0092069E2736973A237C85788337F70400D2 +:10ED8C004A851307C7CA540013F6F90FD545EFF09F +:10ED9C00BFD82A8911C195E085471CA02302040025 +:10EDAC00014681452285EFF02FEDB25022544A8561 +:10EDBC0092540259F249456182802285EFE0FF931B +:10EDCC00EDB737F70400B286130727CE2E8685459C +:10EDDC006FF09FD401116887B7F60400416570008D +:10EDEC0001489307F00F0D479386A6C599457D15ED +:10EDFC0006CEEFF0DFDAF24005618280B7F6040050 +:10EE0C00B28701482E861147938626C7C9456FF0F5 +:10EE1C001FD937F70400B2861307E7C92E86CD45F4 +:10EE2C006FF09FCF011122CC373400201304843AA9 +:10EE3C0026CA4AC84EC606CE2A89AE899304040354 +:10EE4C001C4081C7CE854A8582971104E31A94FE33 +:10EE5C00F2406244D2444249B24905618280B737DC +:10EE6C00002003C51725411122C4373400209377A5 +:10EE7C0035001304C43F09811CB4AA9706C626C2E8 +:10EE8C001CA4ADCB1305C0033385A702A56585056E +:10EE9C00B73400209710FB1FE780001A102493074B +:10EEAC00C00381453306F60223A2A43A9710FB1F38 +:10EEBC00E780404E83A7443A1424014789077D56C6 +:10EECC006341D7022244B2409244373500201306E6 +:10EEDC00000381451305853A41011713FB1F670099 +:10EEEC00634B92A32381070023A507020507938791 +:10EEFC00C703F9B7B2402244924441018280011108 +:10EF0C0022CC2EC632C406CE2A849720FB1FE78063 +:10EF1C00E0B72246B24511E9C167F9176303F40063 +:10EF2C005145F24062440561828054555C218DC28A +:10EF3C0013F7270141456314A70015457DF2C18BDA +:10EF4C003D45E5D3BC2E0145E3FDB7FC3145D1BFB2 +:10EF5C00C18B0145F9F71545E9B7797126D24AD02D +:10EF6C00B7340020416922D44ECE52CC56CA5AC86E +:10EF7C0006D6AA8901449384C43F373A0020930AE9 +:10EF8C00C0037D19054B9C246364F400014525A83E +:10EF9C00B307540303274A3ABA97BA2363162701D7 +:10EFAC0005041374F40FC5B7C8333000938567009C +:10EFBC00EFD041061946CE8528009710FB1FE7803D +:10EFCC00C047E31F65FDB250225492540259F249D6 +:10EFDC00624AD24A424B45618280B737002083C5D2 +:10EFEC004740C166B737002003A7473AFD16814753 +:10EFFC006395F500014632858280035827003A86D6 +:10F00C006306D80003480700E307A8FE850793F7BB +:10F01C00F70F1307C703E9BF411106C69720FB1F63 +:10F02C00E780C0A609C54A29B2404101828001454A +:10F03C00E5BFB737002083C64740B737002003A78A +:10F04C00473A0145814711076393F60082801023EC +:10F05C0001C605051375F50F850793F7F70F130711 +:10F06C00C703DDB7B737002003C547408280373769 +:10F07C0000209306873A81471307873A31468C4222 +:10F08C0091E58A07BA9788C3014582808507910666 +:10F09C00E397C7FE4D458280411106C622C49720D6 +:10F0AC00FB1FE780A09E0DCD2A842A218545EFF019 +:10F0BC007FD7485409C59710FB1FE780E0042285D1 +:10F0CC001306C00381459710FB1FE780A02CFD574A +:10F0DC003EA0230204000145B2402244410182803B +:10F0EC000945DDBF411106C69720FB1FE780009A3A +:10F0FC0009C54825B240410182800145E5BFC16781 +:10F10C00F9176305F502411122C406C62E84972017 +:10F11C00FB1FE780A097AA87014589C7C823698C84 +:10F12C0033358000B2402244410182800545828003 +:10F13C00011106CE2EC69720FB1FE7802095854730 +:10F14C0001C95A29B24585476304B7004EA98147C6 +:10F15C00F2403E850561828029CD01114AC84EC618 +:10F16C0037390020C16922CC26CA52C456C206CEF9 +:10F17C000144AA841309C93F373A0020930AC003FB +:10F18C00FD1983478900634BF400F2406244D2447A +:10F19C004249B249224A924A05618280330554039E +:10F1AC0083274A3A3E953E216383370182940504B6 +:10F1BC00C9BF8280B737002003C64740B73700204D +:10F1CC0083A7473AC166014589070147FD1691455A +:10F1DC006313E600828003D807006309D80003C8D4 +:10F1EC00A7006315B80005051375F50F0507137710 +:10F1FC00F70F9387C703E9BFB737002003C6474013 +:10F20C00B737002083A6473A014781479106631020 +:10F21C00E602858393C7F7FFC207C1830545636286 +:10F22C00E50285473395A7004205418182808C22F7 +:10F23C0099C1CE36CD8F05071377F70F9386C6038A +:10F24C00F9B793F61700F1FE050585831375F50FD5 +:10F25C00F9B7797156CAAA8A2E8526D24AD04ECED3 +:10F26C0052CC5AC85EC662C406D622D4AE84328B47 +:10F27C00368CBA8B3E8AC28946899720FB1FE78061 +:10F28C00E0803DED41657D159720FB1FE7800080F8 +:10F29C002A84554531C81946DE8513056400A3023E +:10F2AC0084019710FB1FE78040088357010326A0B9 +:10F2BC00230264013EA883574103230054012326F3 +:10F2CC0004025EA8230644012317340123182401E9 +:10F2DC00EFF09FF20AB8232A04022685232C04029D +:10F2EC008145EFF03FB40145B2502254925402597B +:10F2FC00F249624AD24A424BB24B224C456182805F +:10F30C004545DDB7B737002083C64740B7370020E7 +:10F31C0003A7473A81476395F60041657D158280C6 +:10F32C003A861307C703835547FF6394A5002A2227 +:10F33C008280850793F7F70FF9BFB737002003C812 +:10F34C004740B737002083A6473A416601477D16F0 +:10F35C00954811436314E80001458280BE2236852E +:10F36C00638EC702CC5A9DC9BC31AC2189CD938523 +:10F37C0097FD93F5F50FE372B3FE9387D7FA93F7E6 +:10F38C00D70F89EF82809385F7FD93F5F50FE3F6A0 +:10F39C00B8FC9387D7FA93F7D70FE1D30507137708 +:10F3AC00F70F9386C6037DB7B737002083C5474058 +:10F3BC004166B737002003A7473A7D168147254899 +:10F3CC006394F5000145828036233A85638BC60031 +:10F3DC00545B81CAB4329386E6FD93F6F60FE37460 +:10F3EC00D8FE850793F7F70F1307C703D1BF011199 +:10F3FC0022CC2A84494506CEEF601FC31DC12AC604 +:10F40C0022859710FB1FE780606801CD6244B737F7 +:10F41C00002032460E39F24003C5F73F05616F40BC +:10F42C00AFB8F24062440561828039714ED652D435 +:10F43C00AE892A8A93053005414526DA4AD856D238 +:10F44C0006DE22DC32C63689BA8A9710FB1FE780AB +:10F45C00A0BECD4429C92A8489446381090432465B +:10F46C008145F08241469710FB1FE780A0F256863B +:10F47C00CE8522859710FB1FE78020EB2146630E7B +:10F48C000902CA8528089710FB1FE78000EAA286AC +:10F49C0050082C085285EF30707AAA842285971078 +:10F4AC00FB1FE78060C6F250625426854259D25445 +:10F4BC00B259225A925A21618280814528089710AC +:10F4CC00FB1FE78020EDE1B7411122C4405926C251 +:10F4DC0006C6AA8429CC085409C59710FB1FE780DF +:10F4EC00A0C2285809C59710FB1FE780E0C16858D7 +:10F4FC0009C59710FB1FE78020C1285C09C5971030 +:10F50C00FB1FE78060C0685C09C59710FB1FE78094 +:10F51C00A0BF0325040809C59710FB1FE780C0BED8 +:10F52C0022859710FB1FE78020BE23AA04022244E9 +:10F53C00B73700208E38B240924403C5F73F4101E3 +:10F54C006F408FCE411126C206C622C4AE849710DE +:10F55C00FB1FE780A05329C14C592A8495CD83A861 +:10F56C00C50703A88507FC59B859F4219221AC2191 +:10F57C002685EF607FB32285EFF01FF5EFF0DFE219 +:10F58C0001CD2244B7370020B240924403C5F73F67 +:10F59C00854541016F406F83B24022449244410142 +:10F5AC008280011122CC06CE2A842EC69710FB1F16 +:10F5BC00E780C04D5C5989CF9E23B245639A870082 +:10F5CC0085476397F5006244F24005616FF0DFEF09 +:10F5DC00F240624405618280411106C622C426C2F3 +:10F5EC00EFF0BFD529C14059AA8415CC3C209DC74A +:10F5FC00B737002083A7C73D89C7DC4399C3228551 +:10F60C00829738309307F002631FF7002244AA2038 +:10F61C00B2409244814541016FF0DFF2B7370020D0 +:10F62C0083A7873DD1BFB2402244924441018280DE +:10F63C00411126C24AC006C622C4AA842E8997103C +:10F64C00FB1FE780A04405CD405955C41E20639490 +:10F65C00970A3C30130710026395E7083C20ADCFA6 +:10F66C007C5403270408DE2B15E313F7170019CF7E +:10F67C0018545A23058B19CB930720023CB0B24087 +:10F68C0022449244024905454101828013F7270028 +:10F69C0001CB18545A23098B01C793074002F9BFB9 +:10F6AC00918B81CB1C54DE23918B81C79307600215 +:10F6BC00F1B7B737002083A7C73DF1D3DC43E1D3C3 +:10F6CC002285829738309307F0028145E319F7FAC7 +:10F6DC002685EFF03FE765B7B737002083A7873D56 +:10F6EC00E9BF1307A0026398E7006304090013093C +:10F6FC002003CA85F1BF631C090026859710FB1FE8 +:10F70C00E780C03809C55C2193E707015CA1A68599 +:10F71C004A85EF604FABA5B7797126D29947EC8536 +:10F72C00AA842E858D4522D406D632C636C4FC84D6 +:10F73C00EFE0EFB92ACE4D441DC13246A246AA8550 +:10F74C00328582962A8419E52C082685EFF08FB431 +:10F75C002A8411C572459710FB1FE780E09A268515 +:10F76C00EFF0FFC82285B25022549254456182803A +:10F77C004111B716050022C42E862E849386A6FD51 +:10F78C00894506C626C24AC02A89EFF0FFF80C202C +:10F79C00AA844A85EFF01FDBB24022442685024939 +:10F7AC00924441018280B737002083A7873D85CBE7 +:10F7BC009C4395C71D71A2CC86CE984110082A8413 +:10F7CC003AC8D84185453ACA829711C548862A203D +:10F7DC006C00EFF0FFF9F640664425618280828070 +:10F7EC00AE8711CD785501CF142394A1143394B165 +:10F7FC00342BB4A1142F584BB4B1D8C182804146DC +:10F80C0081453E851713FB1F6700C3B8B73700202F +:10F81C0083A7C73D91C703A387006303030002833B +:10F82C0009458280373700200327875E1DC7584360 +:10F83C00AA8705450DC703A50708411106C69306FF +:10F84C0005021306050C930505061305050402971E +:10F85C00B2401375F50F410182800545828082808C +:10F86C004DC9357122CD2A840A2126CB4AC94EC7EF +:10F87C0056C306CF52C55AC1DEDEB68AB2892E896E +:10F88C009710FB1FE7808020AA8431C50C182285B5 +:10F89C00EFF01FF53C20138A6400A9CBEF501FED4D +:10F8AC002A8B014583CB5400EF505FEAAA840C10DD +:10F8BC000818EF10605508542C10EF108055D288A2 +:10F8CC00268A56C05E88D2875A8714103010CE858F +:10F8DC004A85EF20207DFA406A44DA444A49BA4905 +:10F8EC002A4A9A4A0A4BF65B0D618280EF501FE858 +:10F8FC00AA8B014503CB5400EF505FE52ACE085488 +:10F90C000C10EF1060502C100818EF108050F248BB +:10F91C004DBF8280C14719C91455C14781CA78555A +:10F92C0011C7BC32BD4663F3F6001C2F3E858280A6 +:10F93C00894779C9F1C9411106C622C426C21C31B6 +:10F94C002E849CA13C219CB13C31BCA15C21BCB15E +:10F95C005C31858B93968700DE2193F7F7EFD58F7B +:10F96C00DEA1543193F7F7DFA20693F60620DD8E65 +:10F97C00D6A1583193F6F6BF220713770740558F5F +:10F98C00DAA15C31FD769386F67F8D87858B758F3A +:10F99C00AE07D98FDEA17421F99B858ADD8ED6A1A5 +:10F9AC0078219377270013F7D6FF5D8FDAA17C219E +:10F9BC0093F647009377B7FFD58FDEA17821DD9BB7 +:10F9CC004D45218BD98FDEA1EF600FE6AA845145FE +:10F9DC00EF608FE5383093F4F40FC94763609702FA +:10F9EC001375F50F636CE50014201147E14763674D +:10F9FC00D700143005476363D7008147B2402244D7 +:10FA0C0092443E85410182803E85828015C1AA8741 +:10FA1C0009458DC141112E8541469385170006C6B7 +:10FA2C009710FB1FE7806090B24001454101828036 +:10FA3C0009458280828089470DC585C5411106C65E +:10FA4C001831AE87194698A1930525001385170028 +:10FA5C009710FB1FE780608DB24081473E854101C6 +:10FA6C0082803E85828015C1AA8709458DC14111CE +:10FA7C002E8541469385170006C69710FB1FE7801D +:10FA8C00C08AB24001454101828009458280828052 +:10FA9C00894705C99DC5411106C638211431AE8769 +:10FAAC002207558F9AA1214693053500138527000F +:10FABC009710FB1FE7806087B24081473E8541016C +:10FACC0082803E85828015C1AA8709458DC141116E +:10FADC002E8541469385170006C69710FB1FE780BD +:10FAEC00C084B240014541018280094582808280F8 +:10FAFC00894709C981C91831BD46E14763E4E6006D +:10FB0C0098A181473E85828015C1AA8709458DC180 +:10FB1C0041112E8541469385170006C69710FB1F91 +:10FB2C00E780A080B2400145410182800945828076 +:10FB3C00828015C1AA8709458DC141112E85414688 +:10FB4C009385170006C69700FB1FE780007EB24026 +:10FB5C000145410182800945828082801DC1AA87AE +:10FB6C00094595C141112E85130600049385170094 +:10FB7C0006C69700FB1FE780407BB2400145410160 +:10FB8C00828009458280828015C1AA8709458DC172 +:10FB9C0041112E8541469385170006C69700FB1F21 +:10FBAC00E780A078B24001454101828009458280FE +:10FBBC0082801D71A2CC2A84084586CEA6CA230653 +:10FBCC000100042135479387F4FF93F7F70F636423 +:10FBDC00F70C37E706008A0713070760BA979C43B0 +:10FBEC0082870C08EFF0DFD4C9476310F502994700 +:10FBFC005C862A206C00EFF0BFB7F6406644D64412 +:10FC0C00256182800C08EFF01FEC31C51C86F5F3E2 +:10FC1C002A20EFF0CFFDD5B70C08EFF0FFEEF5B7CB +:10FC2C000C08EFF0FFECD5B70C08EFF03FDEF1BF9E +:10FC3C000C08EFF0FFE5D1BF0C08EFF0DFE2F1B7F5 +:10FC4C000C08EFF05FDFD1B70C08EFF09FEE75BF3B +:10FC5C001C312308F1002A209710FB1FE78000E3DA +:10FC6C00A14705C15825631AF702B737002003A72F +:10FC7C00C73D9D4719C7184309C71008A6850297A9 +:10FC8C00AA875C8661B70C08EFF05FEDBDBF0C086E +:10FC9C00EFF09FEF9DBF9D47A1BFB737002003A793 +:10FCAC00873DC1BF011122CC06CE26CA4AC84EC61A +:10FCBC001821930720092A846313F7121C31394742 +:10FCCC006393E70A56210967610781476391E61040 +:10FCDC00B739002003A5C93ECE84630A050E0C4437 +:10FCEC0003C90500631E09001C2185052146A9CF07 +:10FCFC0029059700FB1FE780406383A7C43EB5C36B +:10FD0C0049459700FB1FE78080522A840DC5930755 +:10FD1C0010FC1CA1A300250183A5C43E0905414686 +:10FD2C0089059700FB1FE780406083A7C43EA2852E +:10FD3C008833EF306FD503A5C43E9700FB1FE780D7 +:10FD4C00A03C23A6043E31A809059700FB1FE780C1 +:10FD5C00C05DEF30606E05494DF183A7C93E23802D +:10FD6C0027018547ADA01307E0036398E708382106 +:10FD7C009547631CF7024A21EFF0CFB69147E31287 +:10FD8C00F5FEB737002083A7873DE1DF03A387008B +:10FD9C00E30903FC72244A20930564006244F24098 +:10FDAC00D2444249B24905610283A147631CF70062 +:10FDBC006C204A206244F240D2444249B249056167 +:10FDCC006FF01F87930600038147E303D7FEF240D1 +:10FDDC006244D2444249B2493E8505618280930611 +:10FDEC00000A8147E315D7FEEFF0BFDC084435D994 +:10FDFC009700FB1FE7804031ADB78147C9BF0111A8 +:10FE0C0026CA06CE22CC89440DCD85CDAA842E845B +:10FE1C0068008D45EF500FE71C872685228693F7E7 +:10FE2C00F70393E707046C005C87EF20A01EAA84FD +:10FE3C0009E90D466C00130534009700FB1FE780A1 +:10FE4C00C04EF24062442685D244056182805D71C9 +:10FE5C004EDE86C6A2C4A6C2CAC052DC56DA5AD836 +:10FE6C005ED6894945CD5DCA138B4500420B135BA9 +:10FE7C000B01AE8A2A8A930530055A85B284970005 +:10FE8C00FB1FE780601B2A84CD4949C9EF50FF8FC7 +:10FE9C002A895686D285935A8900135A0901937B75 +:10FEAC00F90F1305440093FAFA0F137AFA0F13594A +:10FEBC0089019700FB1FE780C05CA301740123013B +:10FECC005401A300440123002401EF507F8BAA8529 +:10FEDC00414608089700FB1FE780A05A21473400D1 +:10FEEC005A86A2850808EF206039AA891DE12146AF +:10FEFC002C0023807401A380540123814401A3812D +:10FF0C002401138544009700FB1FE7808057EF50B6 +:10FF1C009F8822859700FB1FE780001FB640264470 +:10FF2C004E8596440649F259625AD25A425BB25BEC +:10FF3C006161828001114AC82A892E8506CE22CCA5 +:10FF4C0026CA2EC69710FB1FE78040B45DCD4059E2 +:10FF5C005DCC5C300947B24593F6B70F6387E6007A +:10FF6C0011471305E00F639DE7061E2009456399B1 +:10FF7C00B706930484004146CA8526859700FB1F6B +:10FF8C00E780A03A4146CA85130584019700FB1F00 +:10FF9C00E780A039383085469307F7FE93F7F70FC3 +:10FFAC0063E6F6041306C4033285C14532C6EF502E +:10FFBC006FCD32469306C402A6852285EFF05F8A88 +:10FFCC003C2089CB22856244F240D24442490561EF +:10FFDC006F1020083830C947E306F7FE3CB00145E6 +:10FFEC00F2406244D2444249056182809307100575 +:04FFFC000145E317C1 +:020000025000AC +:10000000F7FE3C20E5D722856244F240D2444249C3 +:1000100005616F10000B0945D1BF4945C1BF39715A +:1000200052D42A8A328526DA4ED606DE22DC4AD817 +:10003000AE8932C69710FB1FE78000A6C94451C1A4 +:100040004059C9443DCC1E203246639CC7065C30F3 +:10005000A18BB1CB373900208327895E9304E00F51 +:10006000ADC39C47B9CF9304840126854146D28510 +:100070009700FB1FE780202C8327895E83250408D7 +:1000800026869C4793850504180881462E8582970D +:10009000AA844146CE8508089700FB1FE780A03A56 +:1000A00093F4F40F11E1894438309307B005631AD3 +:1000B000F7002285EF00D07D3C2089CF9307C00553 +:1000C0003CB0F250625426854259D254B259225A59 +:1000D000216182809307E005E5B739C9011126CA7D +:1000E00006CE22CCAA8409459DCD0D4628002E843B +:1000F0008D059700FB1FE78000241C8570002C00F5 +:1001000093F7F70393E7070426855C85EF1050719A +:1001100019E90D46A28568009700FB1FE780A03211 +:100120007D153335A000F2406244D24405618280DF +:1001300009458280011152C42A8A32854EC656C2B0 +:100140005AC006CE22CC26CA4AC82E8BB28AB6899D +:100150009710FB1FE780409409ED8944F240624408 +:1001600026854249D244B249224A924A024B05614D +:1001700082805C592A89C544F5F34D45EF509FEBC9 +:100180001374F50F5145EF50FFEAE38809FC83C76C +:100190008901E3E487FC1375F50FE360F5FC930533 +:1001A0003005130540089700FB1FE780A0E9232ACC +:1001B000A9022A84CD445DD11306400881459700E9 +:1001C000FB1FE780E01DA30104002301440123027B +:1001D0006401231054012326340723240402A302BC +:1001E00004008144E30C0AF62285EF009061AA84A2 +:1001F00035D54A85EFF00FAE95B7397122DC06DEB2 +:1002000026DA4AD84ED652D456D25AD05ECE62CCD6 +:1002100066CA0944630D0610630B0710AA8B3A895E +:10022000368BB28A2E8C9710FB1FE780E0862A8AD5 +:100230005144630E050E9305300541459700FB1FA1 +:10024000E78040E0AA894D447DC18344190083477B +:100250002900A204C207BE9483470900BE948347C5 +:100260003900E207BE9483278A0263E697007D5730 +:1002700009446399E70A63070C0083474A00054471 +:10028000898BCDC3930C4B00214681450A85C20C56 +:100290009700FB1FE780C01093DC0C01930530052D +:1002A00066859700FB1FE780E0D92A8C4D443DC945 +:1002B0005A86D68511059700FB1FE780401D114621 +:1002C000CA8562859700FB1FE780601C4146930545 +:1002D0008A014E859700FB1FE780601B21478A86B5 +:1002E0006686E2854E85EF10307A2A841DE5214628 +:1002F0008A8528009700FB1FE78060192146930537 +:10030000490028009700FB1FE780E0138547631E24 +:10031000F502A6855E85EF60AF8862859700FB1FBA +:10032000E78040DF4E859700FB1FE780A0DE228537 +:10033000F2506254D2544259B259225A925A025B34 +:10034000F24B624CD24C216182800544F9B779713D +:100350009397050122D406D626D24AD04ECEC18725 +:100360002E8463D50704B73400209384C43FA8309B +:100370009700FB1FE780C0F12AC609CDEFF05F931D +:10038000B24511E5A8209307F00F631EF5002E85F6 +:10039000EF207FEB2165218DB250225492540259F7 +:1003A000F24945618280EF20FFEEEDB793F715002B +:1003B00091C7EFF02FA313451400F9BFA1E1014548 +:1003C000E1BF850493F4F40FEFE09FCAE3F9A4FEC4 +:1003D000339599001319050113590901B3772401C5 +:1003E000EDD34A85EFE0DFF2C167FD176305F50045 +:1003F000DD45EFF0EF953345240179BF854485490C +:10040000E1B7B737002023A6073EB737002023AE59 +:10041000073C37170500B73700201307A79B23AC0D +:10042000073CB737002023A8E73E3707050093872E +:10043000073F13078770D8C337F7040013076743D4 +:1004400098C737270500B73700201307078423A074 +:10045000E73E371705009387073E1307E73ED8C3EB +:10046000371705001307E76898C78280B737002061 +:1004700083C70740A18B89C7B73700209387073F01 +:1004800037370020232EF73C01458280B737002004 +:1004900083C70740918B89C7B73700209387073EF2 +:1004A00037370020232CF73C01458280011106CE0E +:1004B0002AC6EFF01FF53245B73700209945A38FC4 +:1004C000A73EEFD02FDCF24037F504001305E55AC4 +:1004D00005616FE09FBA1C5581C7A1473E858280A8 +:1004E000011122CC26CA2A84AE8413050004930588 +:1004F000300506CE9700FB1FE780C0B408D475C155 +:1005000013060004A6859700FB1FE780C0E278541D +:100510003C2B93F68700F5CA1454B422A18AF5C681 +:1005200083270408DDEF93053005130500109700BD +:10053000FB1FE78020B12320A4088D4745C5A302F7 +:10054000040078549C30143391EB91EABC20918BD9 +:10055000C5E33C2B918BC9EF854701A881C6214794 +:1005600058B089C75C3093E707015CB06C54BC2974 +:10057000858B99CB1C540547BC238D8B6396E70074 +:100580007C2093E717007CA08327040889C77C2080 +:1005900093E787007CA05C300547639EE70A9304DD +:1005A00084004146814526859700FB1FE78040DF98 +:1005B00041468145130584019700FB1FE78040DE1B +:1005C0001306C4033285C14532C6EF407FEC832752 +:1005D00004083246B9CF2285EF00B02E93070005FC +:1005E00025C5A147F2406244D2443E850561828020 +:1005F0009C2014231547B387E70237E7060013074B +:100600004765BA97B6979C238DB7943089C6143343 +:1006100099C2E14799BFB420D58F918B95DF9C207B +:1006200014231547B387E70237E7060013078763EC +:10063000C9BF22859306C402A685EFF02FA32285A9 +:10064000EF00F02159FDC1470A203CB08145EF5031 +:100650005FBF814741BF13F7870135CFC18B93043B +:1006600084004146B1C7890526859700FB1FE780B6 +:1006700080CC41468145130584019700FB1FE7802C +:1006800020D27C201306C403328593E747007CA068 +:10069000C14532C6EF40DFDF83270408324685C3F9 +:1006A0002285EF0010229307200505FD3CB055B7C9 +:1006B000814526859700FB1FE78080CE5DBF9306AE +:1006C000C402A6852285EFF06F9A2285EF003019CB +:1006D000CD4769DD39B7094785456388E70093F75A +:1006E000D70F11476396E70089450A20EF507FB581 +:1006F0007C2093E747007CA08327040881C79307E9 +:1007000010056DB7C5475DB73C21638B0722797132 +:1007100022D406D626D24AD03C31130750052A846B +:10072000639DE706034975001306C503C14593574A +:100730003900AA973285842732C6EF407FD5B73774 +:10074000002083A7875EA1C79C47B1C30325040887 +:1007500093767900B3D6D4403246858A9305050452 +:10076000180893E606081305050882971375F50F18 +:1007700019ED41460C081305C4029700FB1FE780E2 +:1007800080BB2285EF00B00D930760053CB0B250EE +:1007900022549254025945618280130710026392D9 +:1007A000E7021C5503270508DE2361E313F7071052 +:1007B0004DCF78555A2B1377071045CB930770020E +:1007C0003CB03C30130770026397E70C3C5885E35C +:1007D0009305300571459700FB1FE780A08628D858 +:1007E00019C5714681459700FB1FE78060BB2458FF +:1007F000B1C4BC2C89E72285EFF08F92A8AC2858B1 +:10080000814541469700FB1FE78080B928583D4746 +:100810002C2D9387F5FF93F7F70F6364F700EF40F4 +:100820003FC7EF203FC13C58A1458AAB1385270144 +:10083000EF401FC62C580A20EF00B031930780020A +:100840000A203CB09700FB1FE7800025414609C500 +:100850007E2513D617003E96B737002003C5F73F15 +:1008600006068545EF201FF51DB713F7072009CBB6 +:1008700078545A2B1377072001C79307900289B742 +:1008800093F707409DDF7C54DE2B93F7074095DB01 +:100890009307B00235B7130780026397E7023C580D +:1008A00099C78E2B0A2013862701EF00F02F1C54C6 +:1008B000DE2313F7072029CF78545A2B137707200C +:1008C00021CB93079002ADBF13079002639BE70013 +:1008D000EF403FEBAA850A20EF00102C9307A002FF +:1008E00085B71307A0026390E704EF40FFE8AA85ED +:1008F000854701456384F500814505452EC6EF40D7 +:10090000BFE52A86B2450A20EF00B0251C54DE233D +:1009100093F707409DC37C54DE2B93F7074091CF9C +:100920009307B00231BF1307B0026398E700EF40AE +:10093000FFE5AA850A20EF00902A9307F002B9B5D7 +:100940008280411122C4405926C206C67C54AA8422 +:10095000DE2B13F7071011C718545A23137707100B +:100960000DE313F7072011C718545A2313770720F4 +:1009700009EB93F707408DCB1C54DE2393F7074018 +:1009800085C7930710023CB02285EFF0FFD73830BF +:100990009307F002631EF7002244AA20B24092445B +:1009A000814541016FE0DFBA9307F0023CB0EDB73B +:1009B000B2402244924441018280397122DC405984 +:1009C00026DA4AD84ED606DEAA89AE843289630278 +:1009D000043A2A211E206384A700A14421A03C20C0 +:1009E00091EB9D44F250625426854259D254B2593B +:1009F000216182809387E5FF93F7F70F2D47E3622C +:100A0000F7FE37E706008A0713070767BA979C4384 +:100A10008287B2852285EFF01FACAA84E1B74146F8 +:100A2000CA851305C4049700FB1FE780C090228588 +:100A30008525AA8411C1A1443C3013074005639663 +:100A4000E700930790053CB071BF130760056395FD +:100A5000E7009307A005C5BFD147F5B79309C405C3 +:100A60004E854146CA859700FB1FE780C08C032551 +:100A7000040845C53C30130790056398E7002285BC +:100A80004D259307E0053CB079A01307A0056390BE +:100A9000E7087C3013D73700229714279D8BB3D6F5 +:100AA000F640B737002083A7875E858A93E606F86D +:100AB00093F6F60F9DD39C478DD393050508180830 +:100AC0004E861305050482979374F50FE39704F09F +:100AD00041460C081305C4049700FB1FE780A0964D +:100AE0007C304D47850793F7F70F7CB06377F700AD +:100AF0002285052D9307E005B9B7B737002003C558 +:100B0000F73F8545EF203FAD930750052DBF1307F5 +:100B1000C005E386E7F68144F1B5130984004E86EB +:100B2000CA8522851408EFE07FD441469305C404AA +:100B300008089700FB1FE7800091E30505EA8A8615 +:100B40001306C403CE854A85EF10A06A05E122850D +:100B5000EFE01FDDB73700202A8783A7873F0A20F1 +:100B6000814601468A858297AA8411C1A1449307D0 +:100B70002002D1BD0C22EFE0BF9D71BF383093073A +:100B80002002E310F7E67C5889EB930530057145A8 +:100B900097F0FA1FE780004B68D86858E30305E434 +:100BA0004146CA8597F0FA1FE780E07864582285AD +:100BB000EFE01FD7A8AC93073002F1B538309307A8 +:100BC0003002E310F7E21E226858214693052900FF +:100BD0001EA9490597F0FA1FE780E0757C54DE2BCB +:100BE00013F727002DC718545A23098B2DC39307D9 +:100BF000400251BD383093074002E314F7DE3C5CFD +:100C000081EB85455D4597F0FA1FE780A04328DC1E +:100C1000285CE30205F0834709004146CA857CA9A8 +:100C200097F0FA1FE780207193075002A9BD383072 +:100C300093075002E317F7DA285C19469305190069 +:100C4000410597F0FA1FE780006F7C54DE2B918BF3 +:100C500095CF1C54DE23918B95CB9307600225B56D +:100C60007C5C89EB93053005514597F0FA1FE780CE +:100C7000603D68DC685CE30205D64146CA8597F0B2 +:100C8000FA1FE780406B7C5C7D5798CB4E85EFF078 +:100C90005FCB51B50325040813060004CA8513056C +:100CA000050497F0FA1FE78000692285EFE05FB83E +:100CB0003C30130700056395E70093074005E1B357 +:100CC00013071005639CE700B737002003C5F73F03 +:100CD0008545EF205F909307500575B313072005F6 +:100CE000E39BE7E2B737002083A7875EE38707CE61 +:100CF0009C47E38407CE83250408930484001808E6 +:100D000093850508814626862E8582970A2010083D +:100D1000A685EF50EFDB9307B005B5B338309307E6 +:100D2000E005E310F7CC8325040841464A8597F097 +:100D3000FA1FE7804071AD44E30605CA03250408A5 +:100D40004146CA8597F0FA1FE780E05E2285EFE012 +:100D50003FBDB73700202A8783A7873F2C580A203A +:100D6000814601468297AA8411C1A14493071002CB +:100D7000D9B9AD47E391F5DA14222E2113066500A7 +:100D80000821EF40FFD541BB894759C2D1C108A214 +:100D90009C211CB29C313CA2BC213CB2BC31A302C0 +:100DA00006005CA2DE21A183858B5CB2DA21137779 +:100DB000072001C793E727005CB2DE2193F70740C5 +:100DC00089C75C3293E747005CB2DE211397470185 +:100DD000635607005C3293E787005CB2230306008A +:100DE000DC21858B7CA2DA21098B01C793E72700E0 +:100DF0007CA2DE21918B89C77C2293E747007CA2ED +:100E0000DA218147218B09C778221367870078A2EE +:100E10003E8582802E86AA8505456FF0FFF62E86D8 +:100E2000AA8509456FF05FF6894785C51DC1411147 +:100E300006C6AE870D47AA8598A3138517004146BD +:100E400097F0FA1FE780204FB24081473E8541016D +:100E500082803E858280894785C51DC1411106C6B5 +:100E6000AE871147AA8598A313851700414697F0CE +:100E7000FA1FE780404CB24081473E8541018280A5 +:100E80003E858280894785C51DC1411106C6AE8752 +:100E90001947AA8598A313851700414697F0FA1FB2 +:100EA000E7806049B24081473E85410182803E85AE +:100EB0008280894795C90DC9411106C61D4798A171 +:100EC0001A21AE87214698B11A212183B8A1930532 +:100ED00025001385370097F0FA1FE780C045B24020 +:100EE00081473E85410182803E858280894785C554 +:100EF0001DC1411106C6AE872147AA8598A3138557 +:100F00001700414697F0FA1FE780E042B240814760 +:100F10003E85410182803E85828089479DC515C5F9 +:100F2000411106C6254798A11821AE87194698B1E8 +:100F3000930515001385270097F0FA1FE780A03F5F +:100F4000B24081473E85410182803E85828089474B +:100F500085C51DC1411106C6AE872947AA8598A33C +:100F600013851700414697F0FA1FE780C03CB24056 +:100F700081473E85410182803E85828089478DC5BB +:100F800005C5411106C6AE873147AA8598A31385CA +:100F900017001306000497F0FA1FE780C039B2402B +:100FA00081473E85410182803E858280894785C593 +:100FB0001DC1411106C6AE873547AA8598A3138582 +:100FC0001700414697F0FA1FE780E036B2408147AC +:100FD0003E85410182803E858280894799C511C541 +:100FE00095479CA11C219CB181473E858280894701 +:100FF00099C511C5AD479CA11C219CB181473E8577 +:1010000082800DC55D718A8586C6A2C42A84EFE000 +:10101000EFFD0A20B71605000A86938646E19D4536 +:10102000EFE04FF0B6402644616182800545828042 +:101030000DC55D718A8586C6A2C42A84EFE00FFBC8 +:101040000A20B71605000A869386E6E19D45EFE083 +:101050006FEDB640264461618280054582805D71F6 +:10106000A2C49305C5022A8441460A8586C697F024 +:10107000FA1FE780402C0A20B71605000A869386DF +:1010800086E2C545EFE00FEAB64026446161828002 +:101090005D71A2C49305C5032A8441460A8586C6AC +:1010A00097F0FA1FE78020290A20B71605000A8664 +:1010B000938666E5C545EFE0EFE6B64026446161FC +:1010C0008280B737002083A7875EA9CB9C435D71E0 +:1010D000A2C486C62A841305E00F8DCF0325040819 +:1010E0009305050C1305050882978325040813064C +:1010F00000040A859385050897F0FA1FE780A0236E +:101100000A20B71605009386C6F70A8693051004D1 +:10111000EFE04FE1B6402644616182801305E00FA5 +:101120008280317122DD2A840A2126DB06DF4AD93A +:101130004ED752D556D35AD15ECF62CD9700FB1F02 +:10114000E78080953C58AA8489EB9305300571456A +:1011500097F0FA1FE78000EF28D82858CD4705C937 +:101160007146814597F0FA1FE78080230329040721 +:101170002285EFE0EFFA230DA9003C20373900204B +:10118000638107128327895E85E39307E00FFA5096 +:101190006A54DA544A59BA592A5A9A5A0A5BFA4B8B +:1011A0006A4C3E852961828083AB0701E38F0BFC8B +:1011B000032B0408EF404FDC2A8C0145EF40CFD9C8 +:1011C000DC303858130B0B029309C403130AC4050F +:1011D000938A64003AC0B337F0002A879308010469 +:1011E0005688B33680015286CE855A85829B1C5420 +:1011F000B8232307E1029833A306E1029C232306C8 +:10120000F1028327895ED1D303AB4701E30F0BF6CD +:10121000DC30B337F0003ECEEF400FD6AA8B01454D +:10122000EF408FD303270408F2472AC03AC2B338ED +:10123000700156887810930684004E86D285880007 +:10124000029B7C54B82B2305E1029833A304E102EE +:101250009C232304F1028327895E03A94701EF4001 +:10126000AFD12A8B0145EF402FCF83C854009C0893 +:101270002A883EC2B3381001B33760013810930694 +:1012800084015286CE8556C0880002990A20B7167E +:1012900005009386C6FA9008C545EFE0AFC8AA8757 +:1012A000FDB5D4308327895E032B0408B336D00004 +:1012B00083AB070136CEEF402FCC2A8C0145EF409F +:1012C000AFC93C58F246130B0B02130AC40593092D +:1012D000C403938A64002A88930801044E86D28549 +:1012E0003EC05687B33780015A85829B1C54130B2E +:1012F0000103B8232307E1029833A306E1029C23EC +:101300002306F1028327895E83AB4701DC30B337C4 +:10131000F0003ECEEF404FC62A8C0145EF40CFC3D0 +:10132000F2472AC0B33880015688781093068400AB +:101330004E86D2855AC28800829B83250408414686 +:101340005A8597F0FA1FE7800010AD47E31B05EEC2 +:101350003DBDB71605002E86938646E8C5456FE06D +:101360006FBC5D71B287A2C44C802A84BE85130510 +:101370001100194686C697F0FA1FE780C0FBB71622 +:1013800005000A8622859386A6F1A145EFE08FB974 +:10139000B640264461618280B71605002E8693868A +:1013A000C6EEC5456FE00FB85D71B287A2C46C8010 +:1013B0002A84BE8513052100214686C697F0FA1FB0 +:1013C000E78060F7B71605000A862285938626EB2C +:1013D000AD45EFE02FB5B640264461618280B71677 +:1013E00005002E869386E6F4C5456FE0AFB37971AC +:1013F00022D406D626D23C31130730052A846381D5 +:10140000E708130750056392E7089307A0053CB16E +:101410007C31C14513D737002A9714279D8B1305BC +:10142000C503B3D6F640858A93E606F893F6F60F21 +:1014300036C6EF40EF85B246B737002083A7875EF8 +:101440009DCB9C478DCB0325040818081306C403C5 +:10145000930505041305050882971375F50F01ED33 +:101460001305C40241460C0897F0FA1FE780A0EC70 +:101470002285EFF0DFBEB250225492544561828043 +:10148000930790053CB1814645BF13071002639155 +:10149000E7027C5503270508DE2B61EF13F71700E1 +:1014A00069CB18555A23058B69C7930720023CB0B6 +:1014B0003C30130720026394E70E3C5889EB9305F8 +:1014C0003005714597F0FA1FE780C0B728D8245837 +:1014D000ADCC2285EFE0CFC4A8AC28588145414669 +:1014E00097F0FA1FE780C0EB28583D472C2D9387D3 +:1014F000F5FF93F7F70F636DF702B737002083C747 +:10150000375FD9CB41468145080897F0FA1FE7803D +:1015100020E9B735002019469385052B080897F078 +:10152000FA1FE78040E130580C082E85EF20E14497 +:10153000EF105FF03C58A1458AAB13852701EF30CF +:101540003FF52C580A20EFF0DFE0930730020A2025 +:101550003CB097F0FA1FE7802054414611C1722534 +:10156000B737002003C5F73F06068545EF208FA457 +:1015700019B713F7270001CB18545A23098B01C759 +:10158000930740022DB7918B85D71C54DE23918B96 +:1015900085D39307600221BFEF309FEF51BF130740 +:1015A00030026396E7023C5899C78E2B0A201386B7 +:1015B0002701EFF07FDF7C54DE2B13F7270021CBD0 +:1015C00018545A23098B21C79307400249B71307C0 +:1015D0004002639BE700EF40CF9AAA850A20EFF014 +:1015E000BFDB93075002A5B713075002639DE702C4 +:1015F000EF408F9815E5814505452EC6EF40CF9504 +:101600002A86B2450A20EFF0DFD57C54DE2B918B81 +:101610008DC71C54DE23918B8DC39307600205BFD9 +:1016200085450145D9BF130760026398E700EF4085 +:10163000EF95AA850A20EFF09FDA7C54032704086F +:10164000DE2B09EF13F7071011CB18545A23137729 +:10165000071009C7930770023CB031BD13F707208C +:1016600009CB18545A231377072001C79307900218 +:10167000E5B793F7074089CB1C54DE2393F7074067 +:1016800081C79307B002C9BF9307F002F1B7397160 +:1016900022DC26DA4ED652D406DE4AD8AE89328A09 +:1016A000AA8497F0FA1FE780203F405941468145C0 +:1016B0000A8597F0FA1FE780A0CE35C403590400CD +:1016C00063139906383093071002631FF7028327CC +:1016D000040899CF2C58A1C94A85EF10B057054589 +:1016E000F2506254D2544259B259225A2161828036 +:1016F0008A861306C4059305C40313058400EF000E +:10170000502F15E18A85C9BF2C5891CD9E29639C25 +:1017100047012146C9054E8597F0FA1FE780A0D200 +:1017200019C12C5855BF268597F0FA1FE780C0369F +:101730002A84054555D44C54B1C59E296394470568 +:101740002146C9054E8597F0FA1FE780C0CF85472F +:10175000631AF502B737002083C777F489C74C5462 +:10176000BC3D639AA70CBD452685EF103049B737BD +:10177000002083A707270145A5D71D4589458297E6 +:101780000145B9BFB737002003C7475FB73900200D +:101790009389C923058B3E8929C3B7370020583068 +:1017A00083C7C75E631BF702B735002019469385D0 +:1017B000D55E1305640097F0FA1FE780C0C885471F +:1017C000631DF50083A7490381C791451D45829795 +:1017D000BD452685EF10904219B7373700200347E3 +:1017E000375F83A7490331CB0347495F098B09CB97 +:1017F00081C795451D4582972685EF10F045C5B5F3 +:1018000081C78D451D45829741468145080897F05F +:10181000FA1FE780E0B8B735002019469385052BFD +:10182000080897F0FA1FE78000B10C082E850A8699 +:10183000EF20A1148A8526854DB58545C5FF6DBF6E +:10184000797122D440594AD04ECE52CC06D626D2F7 +:10185000AA892E8A3289630A04622A211E20638C97 +:10186000A700A144B2502254268502599254F2494D +:10187000624A45618280242099C09D44E5B79387E0 +:10188000F5FF93F7F70F3147E369F7FE37E70600F7 +:101890008A071307076ABA979C4382871C54F1F39F +:1018A000930530051305000497E0FA1FE78080795F +:1018B00008D445D903470900914763F4E7008D44F4 +:1018C00055B7034719008547E3EBE7FE130600040D +:1018D000CA8597F0FA1FE78000A60C547054A30243 +:1018E0000400D4415C4A858AFD8E5E2AF99BD58F1F +:1018F0005EAAD841544AF59B0583058B8582F98EF3 +:101900008606DD8E56AADC41584AED9A8983858B7E +:1019100009837D8F0A07558F5AAAD4415C4A5D9B83 +:101920008D82858A8D83F58F8E07D98F5EAAD841E7 +:10193000544A93F7F7EF2183058BA182F98EA20613 +:10194000DD8E56AADC41584AA583858B25837D8F81 +:101950009317970013F7F6DF5D8F5AAAD4415C4ABC +:10196000A982858AA983F58F9396A7009377F7BFFD +:10197000D58F5EAAD441584AAD82858A2D83758F52 +:10198000FD769386F67F2E07F58FD98F5EAA3C2AC7 +:1019900003250408A18BFDC3BC21A18BE5C3E31281 +:1019A00005EC930530051305001097E0FA1FE7805A +:1019B00060692320A40801D57C54A30204000347D6 +:1019C0001900943399E641C75C3093E707015CB096 +:1019D00021A0A1475CB06DFB2285EFF06FE56C5450 +:1019E000BC29858B89CB1C54BC238D8B89C77C205B +:1019F00093E717007CA08327040889C77C2093E71E +:101A000087007CA05C300547639BE70A414681451F +:101A10001305840097F0FA1FE780809841468145BE +:101A20001305840197F0FA1FE7808097C1451305DD +:101A3000C403EF30FFA5032704089307000511E353 +:101A4000C1470A203CB08145EF40AFFF21BDB82B14 +:101A5000118B19E703472900118B19E3854785BFCF +:101A60009C23154783460900B387E70237E7060042 +:101A700013074765BA97B6979C2391BF19C597E09E +:101A8000FA1FE7802069232004087C54983311C78B +:101A90000347190019C3E1471DBFB82B118B09E794 +:101AA00003472900118B5DDB9C2315478346090002 +:101AB000B387E70237E706001307876365BF13F7AD +:101AC000870139CBC18B13058400414695CF890529 +:101AD00097F0FA1FE780208641468145130584016F +:101AE00097F0FA1FE780C08B7C20C1451305C40323 +:101AF00093E747007CA0EF30BF998327040899CB78 +:101B0000930720053CB0B9BB814597F0FA1FE780E9 +:101B10002089D9B7CD47FDB7094789456386E700D6 +:101B200011476397E70085450A20EF408FF121A018 +:101B30001947E38AE7FE7C2093E747007CA08327D0 +:101B4000040881C79307100575BFC54765BF4146A7 +:101B5000CA851305C40497E0FA1FE780C07D3C30B6 +:101B600013076005639CE700B737002003C5F73F04 +:101B70008545EF105FA69307500569B74547638316 +:101B8000E7029306C4021306C4039305840022856A +:101B9000EFD0DFCD2285EFF08FCCAA8411C1A14414 +:101BA000D1478DB7C947B9BF9309C4054E85414692 +:101BB000CA8597E0FA1FE78000780325040869C505 +:101BC0003C30130790056398E7002285EFF04FCC77 +:101BD0009307E00505BF1307A0056399E706B7372C +:101BE000002083A7875EE38A07C803A88700E3066F +:101BF00008C87C30930505084E8613D73700229716 +:101C000014279D8B0A87B3D6F640858A93E606088B +:101C100013050504029841468A851305C40497F00C +:101C2000FA1FE780408211E1D2842285EFF04FC68F +:101C30007C30CD461307E005850793F7F70F7CB09E +:101C400063E4F6001307600538B029B91307C0052F +:101C5000E39AE7C0B737002083A7875EE38F07C00A +:101C60009C47E38C07C093050508130984000A8785 +:101C700081464A862E8582970A200A86CA85EF40C9 +:101C80002FE59307B005BDBD8A864E869305840077 +:101C90002285EFD0BFBD41469305C4040A8597E075 +:101CA000FA1FE780407A8547D284E31DF5BA228582 +:101CB000EFF00FBEAA84E31605BA9307100299B598 +:101CC000383093077002E31AF7BA7C5889EB930512 +:101CD0003005714597E0FA1FE780C03668D868582C +:101CE000E30D05B8CA85414697E0FA1FE780A06476 +:101CF000032944072285EFD0BFC2230DA900930713 +:101D0000800209B5383093078002E318F7B61E2227 +:101D100068582146930529001EA9490597E0FA1F36 +:101D2000E78060617C54DE2B13F7072035C7185419 +:101D30005A23137707202DC393079002E1B338305D +:101D400093079002E31BF7B23C5C89EB93053005E7 +:101D50005D4597E0FA1FE780E02E28DC285CE30E63 +:101D600005B04146CA8597E0FA1FE780C05C93073B +:101D7000A00249BB38309307A002E310F7B01C2241 +:101D8000285C1946930519007CA9410597E0FA1FC4 +:101D9000E780605A7C54DE2B93F70740A1C71C54A0 +:101DA000DE2393F707409DCF9307B002A1BB3830E5 +:101DB0009307B002E313F7AC7C5C89EB9305300525 +:101DC000514597E0FA1FE780E02768DC685CE30A8A +:101DD00005A84146CA8597E0FA1FE780C0557C5C9C +:101DE0007D5798CB03D529008145EFD06FF69DBC78 +:101DF00038309307F004E3F6E7A603250408E3026E +:101E000005A613060004CA851305050497E0FA1F0A +:101E1000E78060522285EFF0CFAAAA842285EFD016 +:101E20003FA13C3013070005639FE700B737002050 +:101E300003D6E90003C5F73F85450606EF109F97D7 +:101E400093073005C1B1130710056395E7009307A9 +:101E500060054DB913072005E396E7A09307C00579 +:101E600055B138309307E005E31DF79E03250408BC +:101E70004146CA8597E0FA1FE780E04B2285EFF0E4 +:101E80004FAAAA841DBD0C228DB785478144E39BD0 +:101E9000F59C032846003C32382214322E211022B1 +:101EA0000145EF307FBA7DBA8147C1463307F5005F +:101EB000B388F500182383C808003308F6008507A7 +:101EC000334717012300E800E392D7FE82800147E1 +:101ED000BD471308F00F3306F5001422B388F50050 +:101EE000FD178606558F2380E800182293F7F70F19 +:101EF0001D83E39207FF82808147930800F84148E1 +:101F000093F6F70F3387F50063FAC600B306F500C2 +:101F1000942214A38507E39507FF82806395C6008A +:101F200023001701C5BF23000700EDB701114AC800 +:101F300056C22E89AA8A93053005414506CE22CC89 +:101F400026CA4EC652C4328A97E0FA1FE780800F35 +:101F5000AA8493053005414597E0FA1FE780800E7B +:101F60002A84CD49A5C431CD4146814597E0FA1F69 +:101F7000E78000432686A2855685EF101120AA89A6 +:101F800029E18387040063D30706A2852685EFF045 +:101F90001FF4B7E506004A869385456D2285EFF06C +:101FA000BFF08307090063D80704A2854A85EFF0D4 +:101FB0001FF2B7E5060052869385456D2285EFF046 +:101FC000BFEE268597E0FA1FE780C01411C4228572 +:101FD00097E0FA1FE7800014F24062444E85D24435 +:101FE0004249B249224A924A05618280CA852685C1 +:101FF000EFF0FFED7DB7D2854A85EFF05FEDD1B709 +:1020000081474146B306F5003387F500182303C81E +:10201000060085073347070198A2E395C7FE828033 +:10202000011126CA4EC6AE84AA8993053005130550 +:1020300000034AC806CE22CC328997E0FA1FE78017 +:1020400060002DC51306000381452A8497E0FA1F1E +:10205000E78000354146CE85228597E0FA1FE7806C +:102060000043A6850D461305D40197E0FA1FE780CB +:10207000004213060402930504012285EF10F10FBC +:10208000AA840D469305D4024A8597E0FA1FE7809B +:102090000040228597E0FA1FE780C007F2406244C3 +:1020A00026854249D244B24905618280CD44FDB7BC +:1020B0005D714EDE62D4AE892A8C9305300513051E +:1020C0000003A6C2CAC052DC56DA5AD85ED686C60B +:1020D000A2C4B28B368BBA84BE8A4289468A97E004 +:1020E000FA1FE78020F663040510130600038145FC +:1020F0002A8497E0FA1FE780A02A4146E2852285DC +:1021000097E0FA1FE780A038414681450A8597E0AD +:10211000FA1FE780E0281D46DE850A8597E0FA1F52 +:10212000E780E0361D46DA851305710097E0FA1F57 +:10213000E780E03533392001B334900041468145D2 +:10214000080823072101C48797E0FA1FE78040258C +:102150001946D685480897E0FA1FE78040331946AC +:10216000D2851305A10197E0FA1FE780403293045E +:1021700004014146CE85268597E0FA1FE78020318D +:102180008A852685EFF0DFE7930904024E86A6854F +:102190002285EF10817E2A890DE94146CE8526856C +:1021A00097E0FA1FE78020190C082685EFF05FE51D +:1021B0004E86A6852285EF10417C2A8946454146F8 +:1021C000CE8597E0FA1FE780802C228597E0FA1FE2 +:1021D000E78040F4B64026444A8596440649F259C1 +:1021E000625AD25A425BB25B225C616182804D4985 +:1021F000D5B7011126CA52C4AA842E8A130500033A +:10220000930530054AC84EC606CE22CC3289B6891F +:1022100097E0FA1FE78000E335C52A84A68541468A +:1022200097E0FA1FE780A026930404012146D28597 +:10223000268597E0FA1FE7808025CA852146130589 +:10224000840197E0FA1FE780802413090402A68521 +:102250004A862285EF106172AA844146CA854E855E +:1022600097E0FA1FE780A022228597E0FA1FE78017 +:1022700060EAF240624426854249D244B249224A89 +:1022800005618280CD44F5B739715AD05ECE2A8B74 +:10229000AE8B41459305300506DE26DA52D456D280 +:1022A00062CC66CA6AC8368C328DBA8C22DC4AD8B7 +:1022B0004ED697E0FA1FE780E0D8AA8A930530054A +:1022C000414597E0FA1FE780E0D72A8ACD44638E24 +:1022D0000A0859C52A86D6855A85EFF03FC5AA84D3 +:1022E00041E193053005414597E0FA1FE78080D52D +:1022F0002A8993053005414597E0FA1FE78080D48D +:10230000AA89630A090E6306050E1304FD001184F1 +:102310001376FD0049C07D144204418035EE13154B +:1023200044004E86D6855E95EFF01FB84146814544 +:102330004A8597E0FA1FE780A006014D93170D012B +:10234000C18363F48708BDC04A8597E0FA1FE78020 +:1023500060DC638709004E8597E0FA1FE78080DB29 +:10236000568597E0FA1FE780E0DA63070A00528596 +:1023700097E0FA1FE78000DAF2506254268542594E +:10238000D254B259225A925A025BF24B624CD24C4E +:10239000424D216182800144131544008A855E9577 +:1023A000EFF09FB54E86D2850A85BDBF93154D00CF +:1023B0000A86DE954A85EFF03FAF4A868A855A85C0 +:1023C000EF10A15BAA84050D95BFBDFC0A86CE85E2 +:1023D0004A85EFF07FAD4A868A855A85EF10E1592C +:1023E000AA846686CA85628597E0FA1FE780A0F412 +:1023F000A1BFCD4491BFCD44A9BF397162CC2A8C15 +:10240000594526DA4AD84ED652D456D25AD05ECE44 +:1024100006DE22DCAE8B328BB68A3AC63E8AC28991 +:1024200046898344010497E0FA1FE78000E12DCD3F +:102430009167938717E91EA185473CA12A843247FB +:102440002105630A0C04930710033CB0194681452B +:1024500097E0FA1FE780C0F423036401A30354014B +:1024600044A82312740123174401231834012319AB +:102470002401A285B73700206254F250D254425949 +:10248000B259225A925A025BF24B624C03C5C73FC3 +:1024900021616F003FE0A30104001946BA8597E06F +:1024A000FA1FE78040E94DBFF2506254D2544259BE +:1024B000B259225A925A025BF24B624C21618280DD +:1024C000797156CAAA8A1305100326D24AD04ECE75 +:1024D00052CC06D622D42EC6328AB684BA893E8918 +:1024E00097E0FA1FE78060D539CDB2453746020143 +:1024F00093078500130616E92A845CC110C12304E2 +:1025000055010CB51946D285290597E0FA1FE780D9 +:1025100080E2CE8504A813051401268697E0FA1FF1 +:10252000E78060E123082403A285B7370020225406 +:10253000B25092540259F249624AD24A03C5C73F87 +:1025400045616F003FD5B250225492540259F2496E +:10255000624AD24A45618280011122CC2A843145E7 +:1025600006CE2EC632C436C23AC097E0FA1FE780C4 +:10257000C0CC15C99167938717E91EA1B2452246C1 +:10258000924602478D473CA120B16244B7370020F4 +:102590004EA172A116A53AA5F240AA8503C5C73F70 +:1025A00005616F003FCFF2406244056182800111F6 +:1025B0004AC82A89394526CA06CE22CC2EC6B284FC +:1025C00097E0FA1FE78060C71DCDB24591679387FA +:1025D00027E91EA191473CA1A30125014EA12A8410 +:1025E000A6851905214697E0FA1FE780C0D4A28589 +:1025F000B73700206244F240D244424903C5C73F86 +:1026000005616F003FC9F2406244D244424905610E +:10261000828001114AC82A89414526CA06CE22CCA9 +:102620002EC6B28497E0FA1FE78020C115CD9167CE +:10263000B245938727E91EA195472A843CA123121E +:1026400025012146190597E0FA1FE780C0CEA28533 +:1026500066A4B73700206244F240D244424903C521 +:10266000F73F05616F001FC3F2406244D244424904 +:1026700005618280011122CC2A84394506CE2EC6FE +:1026800032C436C23AC097E0FA1FE78000BB15C9D2 +:102690009167938717E91EA1B245224692460247E9 +:1026A00099473CA142A1B737002062446EA112A510 +:1026B00036A55AA5F240AA8503C5C73F05616F003C +:1026C0007FBDF240624405618280797122D406D6D2 +:1026D0002A842EC632C436C23AC097E0FA1FE78079 +:1026E000A03B19CDB245224692460247EC84F085C4 +:1026F0002C081306F00F2285F486F887EFC0CFF080 +:10270000B250225445618280011122CC2A8439457D +:1027100006CE2EC632C436C23AC097E0FA1FE78012 +:10272000C0B115C99167938717E91EA1B24522462A +:10273000924602479D473CA142A1B7370020624420 +:102740006EA112A536A55AA5F240AA8503C5C73FBA +:1027500005616F003FB4F2406244056182805D71A3 +:102760003EC2835701062AC6130540024EDE52DCE4 +:1027700056DA5AD85ED662D466D26AD06ECE86C693 +:10278000A2C4A6C2CAC02E8DB28C368C3AC4C28DE9 +:10279000C68B035B0105835A4105034A81058349C2 +:1027A000C1053EC097E0FA1FE78020A961CD116600 +:1027B000130616E9324312A1130690022A8930A1AA +:1027C0009304E9002105130449019247224763025B +:1027D000030893071003A301F9001946814597E008 +:1027E000FA1FE780E0BB19468145268597E0FA1F6E +:1027F000E78000BB19468145228597E0FA1FE780F4 +:1028000020BA824723039901A303890123004903C6 +:10281000A30039032311F9022644B73700202312FD +:10282000A901231D7901231E6901231F5901B64007 +:102830009644F259625AD25A425BB25B225C925C75 +:10284000025DF24DCA8503C5C73F064961616F004D +:102850007FA4BA85A301090019463EC297E0FA1F7A +:10286000E78060AD924726851946BE8597E0FA1F3E +:10287000E78060AC1946EE85228597E0FA1FE78075 +:1028800080AB41B7B640264496440649F259625A95 +:10289000D25A425BB25B225C925C025DF24D616196 +:1028A000828079715EC6AA8B61454ECE52CC56CAE3 +:1028B0005AC862C406D622D426D24AD02E8BB28AF7 +:1028C000368ABA893E8C97E0FA1FE780009725CDBB +:1028D00037470B01130717E913048500AA8418C1B1 +:1028E00040C101491305240023007401A3006401C1 +:1028F0001946D68597E0FA1FE780E0A313059400F8 +:10290000230444011946CE8597E0FA1FE780A0A270 +:10291000A3078401B83005091379F90F4104E36373 +:10292000E9FC2254B7370020B2500259F249624AFA +:10293000D24A424BB24B224CA68503C5C73F9254A4 +:1029400045616F003F95B250225492540259F249AA +:10295000624AD24A424BB24B224C456182800111FD +:1029600022CC2A84214506CE2EC632C436C297E038 +:10297000FA1FE780808C05C92246924691679387AB +:1029800017E91EA1B245B1473CA120B170A174B1B5 +:102990006244B73700204EA1F240AA8503C5C73F65 +:1029A00005616F003F8FF2406244056182805D7176 +:1029B000A6C28344C1052AC6CAC0138544024EDE9E +:1029C00052DC56DA5AD85ED662D466D26AD06ECE5F +:1029D00086C6A2C42EC4B28D368DBA8C3E8CC28BF4 +:1029E000468B835A0105034A4105E649065997E09B +:1029F000FA1FE780808459C93243A24537460D014A +:102A000093078500130616E92A845CC12304650038 +:102A100010C10CB51946EE85290597E0FA1FE7802D +:102A20008091CE852308A401A30894012309840181 +:102A3000A3097401230A6401231B5401230C4401DC +:102A400013059401194697E0FA1FE780C08E13051D +:102A5000440264BC08D0CA85268697E0FA1FE78046 +:102A6000808DA285B73700202644B640964406499B +:102A7000F259625AD25A425BB25B225C925C025DAE +:102A8000F24D03C5C73F61616F00DF80B640264449 +:102A900096440649F259625AD25A425BB25B225CB2 +:102AA000925C025DF24D61618280411126C2AA846E +:102AB000614506C622C497D0FA1FE78000783DC959 +:102AC0009167938717E91EA1930740023CA19C30B0 +:102AD0002A84938564003CB1BC30B8202105A2074C +:102AE000D98F231EF5FEDC201946230FF5FEDC30BE +:102AF000A30FF5FE97E0FA1FE780E083DC24A285B0 +:102B00007CA4FC24D834A207D98F1EA8FC343CA88E +:102B10009C283CB89C385CA8BC285CB8BC387CA815 +:102B20002244B7370020B240924403C5C73F410159 +:102B30006F004FF6B2402244924441018280797185 +:102B40004AD0373900206AC01303C93F06D622D4C1 +:102B500026D24ECE52CC56CA5AC85EC662C466C28F +:102B6000034E73001303F00F425D63066E08AA8CD8 +:102B700013854801C684C2893E8ABA8A368BB28BD5 +:102B80002E8C97D0FA1FE780406B2A842DC59307BF +:102B9000000D1EA1D9473CA12312950123038501F5 +:102BA000A30375012304650123155501230645017F +:102BB000A306350164A51309C93F9DC8510508C87E +:102BC0002686EA8597D0FA1FE780E076A285225410 +:102BD00003457900B25092540259F249624AD24AEE +:102BE000424BB24B224C924C024D45616F008FEA32 +:102BF00023280500E1BFB250225492540259F249F1 +:102C0000624AD24A424BB24B224C924C024D456131 +:102C10008280411122C42A84194506C697D0FA1F22 +:102C2000E780A06115C19167938717E91EA1C1478D +:102C30003CA142A1B73700202244B240AA8503C577 +:102C4000C73F41016F000FE5B2402244410182803D +:102C500041110D4506C697D0FA1FE780005E15C1E9 +:102C6000930710F91CA19307E0031CB1C5473CA1D1 +:102C7000B7370020B240AA8503C5C73F41016F00A6 +:102C80006FE1B24041018280011122CC2A842945A2 +:102C900006CE2EC632C436C297D0FA1FE780E0595E +:102CA00005C9B24592469167938717E91EA122464E +:102CB000C9473CA14CA120B114A56244B7370020FC +:102CC00072A1F240AA8503C5C73F05616F008FDC82 +:102CD000F24062440561828001114AC82A892D456B +:102CE00026CA06CE22CC2EC6B28497D0FA1FE78021 +:102CF000C05429C1B245930710F91CA19307E00302 +:102D00001CB1CD473CA1A30125014CA12A84A68575 +:102D10001505194697D0FA1FE780E061A285B737FD +:102D200000206244F240D244424903C5C73F0561D6 +:102D30006F004FD6F2406244D2444249056182801E +:102D4000011122CC2A84214506CE2EC697D0FA1F27 +:102D5000E780A04E05C5B2459167938717E91EA18C +:102D6000D1473CA16CA142A1B73700206244F24098 +:102D7000AA8503C5C73F05616F00CFD1F240624409 +:102D800005618280411126C2AA84714506C622C40B +:102D900097D0FA1FE780604A59C19167938717E976 +:102DA0001EA1930760023CA19C302A849385A40055 +:102DB0003CB1BC30B8203105A207D98F231CF5FEE9 +:102DC000DC30D8201946A207D98F231DF5FEFC3030 +:102DD000F820A207D98F231EF5FE9C24230FF5FEB1 +:102DE0009C34A30FF5FE97D0FA1FE780C0549C28AF +:102DF000A2853CA8BC289838A207D98F5EA8BC3809 +:102E0000A30B0400230C04007CA82244B737002045 +:102E1000B240924403C5C73F41016F00AFC7B24003 +:102E20002244924441018280411126C2B7340020DD +:102E30009384C43FF83006C622C49307F00F630F93 +:102E4000F7022A84194597D0FA1FE780003FAA8528 +:102E500015C5930700FD1CA193077002A300050090 +:102E60003CA11C303CB13C205CA13C305CB1224414 +:102E7000E830B240924441016F00CFC1B2402244D9 +:102E8000924441018280B737002083C7374013073F +:102E9000F00FAA856396E70017D3FA1F6700832710 +:102EA0001307000D1AA11307800238A13E856F0099 +:102EB0006FBE411126C2AA84714506C622C497D0AE +:102EC000FA1FE780803759C59167938717E91EA1DC +:102ED000930760023CA19C302A849385A4003CB1F6 +:102EE000BC30B8203105A207D98F231CF5FEDC3099 +:102EF000D8201946A207D98F231DF5FEFC30F820F3 +:102F0000A207D98F231EF5FE9C24230FF5FE9C34C7 +:102F1000A30FF5FE97D0FA1FE780E0419C28A28519 +:102F20003CA8BC289838A207D98F5EA8BC387CA8DA +:102F3000DC287CB8DC381CACFC281CBCFC383CAC65 +:102F40002244B7370020B240924403C5C73F410135 +:102F50006F004FB4B240224492444101828001117B +:102F600022CC2A84214506CE2EC632C497D0FA1F21 +:102F7000E780A02C1DC12246B245930710591EA11F +:102F800020A170A16244B73700204EA1F240AA856B +:102F900003C5C73F05616F00EFAFF24062440561B2 +:102FA0008280011122CC2A84214506CE2EC632C44D +:102FB00097D0FA1FE780602815C52246916793874E +:102FC00027E91EA1B245A1473CA160A170B16244AE +:102FD000B73700204EA1F240AA8503C5F73F05612F +:102FE0006F004FABF240624405618280011122CC38 +:102FF0002A84314506CE2EC632C436C23AC097D096 +:10300000FA1FE780802305C922468567B2459246AC +:103010000247938717C91EA120A170A16244B73748 +:1030200000204EA116A53AA5F240AA8503C5C73FC8 +:1030300005616F002FA6F240624405618280011194 +:1030400026CAAE844AC82A891385C40006CE22CC7B +:1030500032C697D0FA1FE780401E0DCD8567938753 +:1030600017E9B2451EA124A1231225012A843105A6 +:1030700008C4268697D0FA1FE780E02BA285B737D1 +:1030800000206244F240D244424903C5C73F056173 +:103090006F004FA0F2406244D244424905618280F1 +:1030A000011122CC2A84194506CE2EC697D0FA1FCC +:1030B000E780A01805C58567938717F91EA1B2455B +:1030C00085473CB120A16244B73700204EA1F240B1 +:1030D000AA8503C5C73F05616F00CF9BF2406244DC +:1030E00005618280411122C42A840D4506C697D00D +:1030F000FA1FE78080140DC1930710F91CA1E9475E +:103100001CB120A12244B7370020B240AA8503C5D4 +:10311000C73F41016F000F98B240224441018280B5 +:10312000011122CC2A84214506CE2EC697D0FA1F43 +:10313000E780A0100DC59167938727E91EA1B245CE +:10314000930700033CA160A16244B73700204EA161 +:10315000F240AA8503C5F73F05616F00AF93F240C7 +:103160006244056182800111214506CE2EC632C41B +:1031700097D0FA1FE780600C05C58567B2452246E7 +:10318000938707391EA185473CA1B73700204EA180 +:1031900072A1F240AA8503C5473605616F008F8F83 +:1031A000F24005618280397122DC1304F5FF4AD8B0 +:1031B00052D456D25ECE420406DE26DA4ED65AD01D +:1031C000894B2A8A3289B68A418063937515B73B49 +:1031D000002083C74BFF5E8B894495CF83C91600BF +:1031E0009C229144A209B3E9F900B737002083D7A4 +:1031F000C724F51763D1F9029307C6FF639DF90849 +:1032000031452EC697D0FA1FE78020032A84B245A5 +:1032100019ED9304F00FF250625426854259D254AE +:10322000B259225A925A025BF24B216182804209C2 +:10323000135909014CA123132501930700F915091E +:10324000A1651EA12311450185054A8597D0FA1F66 +:10325000E78040DF08C415C983C74BFF9385EAFFA9 +:1032600013562900FD17238AFBFE97D0FA1FE7802B +:1032700020101C44A28589071CC4B737002003C551 +:103280004736EF002F81814479B7228597D0FA1F06 +:10329000E78040E8BDBF9307D6FFE3CCF9F6B1471E +:1032A0003304F402B734002083A78436A297B827EA +:1032B00019C7884309C597D0FA1FE780A0E5138591 +:1032C0004900A16542058505418103AA843697D04E +:1032D000FA1FE78020D783A78436229A2320AA00EA +:1032E000A29788431DD50547B8A783474BFF4A8659 +:1032F000D685FD17230AFBFE97D0FA1FE780A003AF +:1033000083A784363E942313240123123401A5BFDE +:103310008547E390F5F0B1473304F402373B0020D2 +:1033200083278B36DA89A297FA2388435DC3DE238D +:10333000B306C700910763CED7083A95D68597D0D4 +:10334000FA1FE78040FF03278B36814422977E23B4 +:10335000CA97C207C1837EA35A231107E39DE7EAF8 +:10336000314597D0FA1FE78040EDAA850DCD930730 +:1033700000F91EA183278B36230275012311450115 +:10338000A297FA239C437AA11CC5B737002003C536 +:103390004736EFF03EF083278B363E94231304002C +:1033A000230504008DBD83278B36A297884311C95E +:1033B00097D0FA1FE78000D683278B36A29723A0E9 +:1033C000070083A789363E942313040023050400D5 +:1033D0005DBD11C997D0FA1FE780C0D383A7893696 +:1033E000A29723A0070083A7893685443E94231320 +:1033F00004002305040005B56F30116F6F30517064 +:103400006F40613F6F4041636F30B172411106C63A +:10341000EF30516FB2400145410182806F30F1734E +:103420006F30D1756F3091786F30717A6F30317C39 +:103430006F30F17D6F30B17F6F4061016F402103CC +:103440006F40C1046F4081061C321022A2075D8EBE +:103450006F40E1076F4021096F40810B6F402134BD +:103460006F40A1366F40E13B6F40C13D6F40A13FCF +:103470006F4081416F4061436F404145411122C619 +:103480000344C10226C48344010303430101030E24 +:103490004101834E8101034FC101834F01028342E9 +:1034A00041028343810222D6324426D8A2441ED44C +:1034B00016D27ED07ACE76CC72CA1AC841016F403D +:1034C000E1646F40A1426F4081446F4061466F40AC +:1034D00041486F40014B6F40E14C6F40C14E6F401F +:1034E000A1506F4081526F6031316F60B1416F60A8 +:1034F00031446F4021556F40015752212E210A213E +:103500006F40815850212E210A216F40A15A182561 +:10351000762152212C210A216F40815C6F60714914 +:10352000411122C406C62A847E21582154313021FB +:103530002C310A21EF60B17601E90C240A202244E3 +:10354000B24041016F70A101B2402244410182802A +:103550006F60717B6F70612B1307A5FF4207856752 +:103560002A8841831385A7C7636CE502138707C8C0 +:1035700001456368B70263E605031307301F636202 +:10358000C702138766FF42074183938767C763EAD1 +:10359000E70005063306B6028E063325D600828084 +:1035A00001458280B7E6060081479386466E130880 +:1035B000F00F3387F600102313170601418363646D +:1035C000E50063130601828092216364C7009AA11B +:1035D0008280850793F7F70FE9BF411193970501A3 +:1035E00022C406C626C2C1872E8463D6070297D09E +:1035F000FA1FE780E0C9AA8401CD1C21054793C7C3 +:1036000007086364F700EFA030572685EFF0BEC3CC +:103610002165218D21A893F7150091CFB7370020A0 +:1036200083A7874791C3829713451400B240224471 +:1036300092444101828093F7250091CBB737002057 +:1036400083A7C74791C3829713452400C5B793F753 +:10365000850099CBB737002083A78748BC5B91C30F +:10366000829713458400D9B793F7450099CBB737B4 +:10367000002083A78748FC5791C3829713454400D5 +:1036800075B793F7050281CFB737002083A7C749E5 +:1036900083A7070991C382971345040241BF93F79B +:1036A000050181CFB737002083A7C74983A7C70883 +:1036B00091C382971345040195BF93972501014556 +:1036C000E3D607F6B737002093878740F433F0231B +:1036D000CC33C823EF408167096525BF411126C25D +:1036E000B7340020B737002013068012814522C46A +:1036F0002A841385844006C623AA07524AC097D05D +:10370000FA1FE780E0C90145EF20C0600145EF20C6 +:10371000A067B7370020A387871EB707D707138492 +:103720008440B5075CC8B7B70D0D938707141CCC50 +:10373000B7B7D707938707145CCCED779387071447 +:103740007D471EB02320E40E81470327040D23226A +:10375000F40EB7872D079387F79F5D8F8327440D5E +:1037600089669386E6B937390020D58F1309C923B6 +:10377000232AF40C232EF40C8347E9002328E40CBD +:10378000232CE40CA300F40CA304F40CF977FD172C +:103790002313F4102314F410FD472305F410856758 +:1037A0009387F7F03EBC5EBCA30C0402EF004FF021 +:1037B0009307C01C231FF4068547A30FF402835709 +:1037C00049000357090128B0A983A304F4088D47D1 +:1037D0002311F404B7170706938707443CC4232238 +:1037E00004049306B00F9387844063F4E600130744 +:1037F000B00F93150701BAB7FAB703C7C703C18162 +:103800001386E500118B35CB1387A5080E0783C6F9 +:10381000D70342074183DAB7918ABDC29386A508D0 +:103820008E06C206C18296BB6D4593848440AE86E7 +:1038300063F3A500ED46B6B093058014BA866374B1 +:10384000B700930680141307C01C2390E7043707C2 +:1038500016000E0613070790D6B3F2B396B7D8DB5F +:10386000EF003132EF40003AEFF070782244B2407E +:103870009244024941016FA0D07C1317360041BF2A +:103880009316360079BF397122DC3704400026DAFE +:103890004ED6AE84AA899305E4FF054506DE4AD8D4 +:1038A000EF00EFE9498C131704014183218393173B +:1038B000840013590401D98F231601001379F90FDD +:1038C00010088A854E857C87A306210102C002C2AA +:1038D00002C402C802CA02CC02CEEF00010A83472A +:1038E000E1010347D101A0B0A2074207BA970347FD +:1038F000F1012180C0A0BA97F25062549CA013D766 +:103900008700C183A382240198B0BCA04259D2543D +:10391000B25921618280B73500203735002001116E +:103920001946938545251305054F06CE22CC26CA98 +:103930004AC891644EC697D0FA1FE780C09F93850E +:10394000F4FF0145EF006FDD2A84FD550145EF00CE +:103950000FDFA287FD147D5933F79700B366E500AA +:10396000D5CA631425016307970A3734002013076B +:103970008440230CF70EA18393E707FC9169C1648F +:10398000232AA70EA30CF70E13048440FD19FD147F +:10399000CE850145EF006FD82A89FD550145EF001E +:1039A0000FDAB3672501EDD7FD576314F500E30186 +:1039B00039FF93570501230EF40E93578501A30E8B +:1039C000F40E8317840E231DA40E230F240F42052B +:1039D000135989001379F9034185A30F240F658DCD +:1039E000E58F6312F5020317C40F8317A40E658FCA +:1039F000E58F631AF7000317E40F8317C40E658F72 +:103A0000E58FE307F7F8F2406244D2444249B249F5 +:103A100005618280A6850145EF002FD02A84FD55DF +:103A20000145EF00CFD1A28705BF411126C2B734AF +:103A3000002006C622C44AC09387844003C7E70318 +:103A400083C7F703636AF70001442285B24022442A +:103A500092440249410182802A899305102413056A +:103A6000000C97C0FA1FE780E05D2A8471DD130621 +:103A7000000C81459384844097D0FA1FE7804092E0 +:103A800063140900C1571CA4FC4CA1EBA0CCE0CCF2 +:103A9000A0D0232004008547238FF40285471CB45F +:103AA000930700F93CB4B7370020938747569853E3 +:103AB000DC5378C43CC8FD577CA8A30EF40683C72A +:103AC000A404230AF40AB737002003C507252304FA +:103AD000A406EFF0F07748B88DBFBC5080C3A0D0EB +:103AE0002320040083C7E40385077DB77C2D4111A3 +:103AF00022C406C699071CB97C45114718A998A38A +:103B00007C4518392A8498B383475503858B91E700 +:103B10000347450389476317F70078441C2393E75D +:103B200007041CA36844930564031946090597D04C +:103B3000FA1FE78040806844722C4C54210597C0DE +:103B4000FA1FE780407F930730F93CB4B24022442B +:103B50004101828041114AC03739002093078940D2 +:103B600083A7870B06C622C426C299E3054531AA5E +:103B7000AA8413098940EF00C13C8327890B8297EF +:103B8000EF30B0602A847DD1DC50AC482324F508A6 +:103B9000B8349307A0096310F71085472300F51484 +:103BA00083C734062303F514A303F514FC359829C1 +:103BB0000148A2074207BA97F8251546F905BA97B2 +:103BC00003C735FF130584136207BA97232CF40843 +:103BD00083C755FF03C765FFA2074207BA9703C70C +:103BE00045FFBA97232EF40883C775FFA30BF40291 +:103BF00083C795FF03C785FFA207D98F1EBC83C764 +:103C0000B5FF03C7A5FFA207D98F3EBC83C7D5FF69 +:103C100003C7C5FFA207D98F5EBC83C7F5FF03C7E3 +:103C2000E5FF232E0413A207D98F7EBC8147232CE6 +:103C3000F41297C0FA1FE7800070B8488347370234 +:103C4000FD8BA30AF40203473702ED1793F7F70F32 +:103C500015832308E4022D476365F7023E3C0567A0 +:103C60009306A7C7E917C207C18363ECF600563C69 +:103C70009307301F63E7D7007E3C130707C8637BB9 +:103C8000F7020A24EF3070700145B240224492449A +:103C90000249410182808327890D13971701E35759 +:103CA00007F0FC4498239C21F98F9583858B230092 +:103CB000F514EDBD8327C90B228582978327090E52 +:103CC0000A24294693F7072091E305469305000847 +:103CD000EFA010028327890D13971701635807007F +:103CE0000A24514693050008EFA090008327890518 +:103CF000FC4B13974700E35B07E68824A38B040083 +:103D0000494693050008EFA0A07E8DB5B737002087 +:103D100083C79740411122C406C626C24AC02A84DE +:103D200085EB182885476314F70E8347D4030347B0 +:103D30005404858B631BF70C194693056404130523 +:103D4000E40397C0FA1FE7800070B334A00099A87D +:103D500083475504C5C78347B5041307000493F789 +:103D6000070C639DE708085929C513096404CA852F +:103D70001305A50297E0FA1FE780802B8547AA84E8 +:103D80006319F502085889472302F4043C311946A7 +:103D9000CA8593E72700A302F404510597C0FA1FD0 +:103DA000E7806059B240224426850249924441018D +:103DB0008280182885476303F70483470406918BA4 +:103DC00095EF8347C4039DEB1305440497E0FA1F66 +:103DD000E780403008D81DC189472302F4043C31F4 +:103DE00019469305640493E72700A302F4045105E0 +:103DF00097C0FA1FE780205485446DB78347C403FA +:103E0000898B85D31C589C3389FF814461BF8347CC +:103E10000406918B99FB5C3413F7170005C3343803 +:103E20000D47639DE60068402C442244B240924412 +:103E30000249410117E3FA1F6700E348898BCDDF90 +:103E400038389547E31AF7FAF9BF4111B737002020 +:103E500022C406C693878740238E0706930710F96E +:103E60003CB5B737002003A407530DC0B737002077 +:103E700003C5F71E8545EFF03ECA930710273305AB +:103E8000F50222832244B24041010283B24022441F +:103E9000410182803C2D91C738256314F7006FF0F3 +:103EA000DFFA183D01CF3425638FE60038A5B73718 +:103EB000002003C5F71E89456FF0EEF1EDD33825DC +:103EC00079FF3CA5EDB7E1DFEDBF2C4931479C31CF +:103ED00093F7F7033CA96386E700930700083E8544 +:103EE00082809C210D47BD8B3CB9E398E7FE4111D0 +:103EF0004AC01309650322C419462A84A1054A85CC +:103F000006C626C297C0FA1FE780E05391476307B1 +:103F1000051E2C481946130564049C2189059987C0 +:103F2000858BA302F40497C0FA1FE780C040228566 +:103F3000EFF0DFDDA1476303051C130520048304B4 +:103F40004401EF202F8F620561859307000863C746 +:103F5000A41A64449D471CA89CA08547BCA0BCB083 +:103F6000CA8519461385440097C0FA1FE780A03C14 +:103F7000BC20B8300149990793F7F70F1367870002 +:103F8000BCA0B8B07844BA970357C406B8B3BC20F5 +:103F90007844834614063E978357C4069206A1834D +:103FA000BD8BD58F5CA3B82009071377F70FB8A096 +:103FB000762CDDC683470406795993F7070491C32D +:103FC00075593309E9401379F90F637BD9088346A2 +:103FD0003406751989471379F90F6398F6128347E8 +:103FE000B406639D0712916793870729F946938763 +:103FF000771BB3C7D70237360020130686408345A8 +:10400000C60793E50501230EB606373600200326C2 +:10401000C65885650CC6B386D702860634D2B4303E +:1040200093E60601B4B0744403462406369730B3D1 +:10403000B420784436975CA3B8207444A187BA961C +:10404000034734061607D98FDCB2BC208D07BCA00D +:104050005C54CA973CDC7E2CB38727412319F406B5 +:104060008347040693F7070489CFB8307C44B42013 +:1040700013670704B8B05838B697B8B3BC208507A3 +:10408000BCA0A820722C4C549307350068443E9580 +:1040900051CA6369C90897C0FA1FE780C02903495C +:1040A000E401B8209377F70385073E99A30824011C +:1040B000B8A083475403858B91E70347440389479E +:1040C0006317F70078441C2393E707041CA37C4480 +:1040D0000C388CB3930790F93CB4034534068347FE +:1040E000B4065D8DEFF05031014681450D4597E0F6 +:1040F000FA1FE7808061EFF0D0648147B24022442C +:10410000924402493E8541018280054693078042E0 +:10411000E38EC6EC856793878784C9BD85679387DF +:10412000E71BE9B54A8697C0FA1FE780C02095BF14 +:104130002C49130720029C3193F7F7033CA9639C99 +:10414000E710411122C406C626C29C2115472A84C5 +:10415000BD8B3CB9639AE7021946A10513056503B7 +:1041600097C0FA1FE780202E914765C12C48194659 +:10417000130564049C2189059987858BA302F404A7 +:1041800097C0FA1FE780201B2285EFF03FB8A147B8 +:104190004DCDB737002083A7072382976444A147FA +:1041A00048D01CA89CA08547BCA0BCB0194693056C +:1041B00064031385440097C0FA1FE780C017BC2032 +:1041C0009907BCA0BC3093E72700BCB083475404D8 +:1041D00091C778441C2393E707F81CA3194693055D +:1041E00064041385A40097C0FA1FE780C014BC20A4 +:1041F000990793F7F70F13F7F703050718B8BCA053 +:1042000083475403858B91E703474403894763172A +:10421000F70078441C2393E707041CA37C440C3864 +:104220008CB39307A0F93CB4034534068347B40626 +:104230005D8DEFF0701C014681450D4597E0FA1F3A +:10424000E780A04CEFF0F04F8147B2402244924407 +:104250003E8541018280930700083E85828041119E +:104260004AC0373900208327C95822C426C2130701 +:10427000000A06C62A84F8D30945EFF0B054B737D0 +:10428000002083A78755B7050082FD15D857719B7D +:1042900013671700D8D70326C95858421367170069 +:1042A00058C2034784061377F70393169701D8572C +:1042B0006D8F558FD8D79843B70533001377F7E73D +:1042C00098C398431377F7E71367071098C33737F6 +:1042D00000200327075E1447CD8E14C79306A00560 +:1042E00034CA5457F59A54D7034724069376F707F0 +:1042F0009843137707F8558F98C337C7898E1307EC +:1043000067ED98C737575500644413075755D8C30E +:104310009D471CA89CA08547BCA0A147BCB00357E3 +:10432000C4067C44D8A3BC207844834614063E9738 +:104330008357C4069206A183BD8BD58F5CA3A820AA +:104340009307E00F09051375F50FA8A0035624077E +:10435000898F63C7C7047C442C5C0D053E9597C0CC +:10436000FA1FE78040FDB820834724079376F703C0 +:104370008507B6971CB8B8A083475403858B91E78F +:104380000347440389476317F70078441C2393E7E6 +:1043900007041CA37C44183898B3930780F93CB4F5 +:1043A0008327C9587844B8DBB737002083C707296B +:1043B00081EB3755050081451305E555EFF08EFF7C +:1043C000B737002093874756A381070083453406FB +:1043D0008347B40610382244B24092440249DD8D2E +:1043E0000145410117E3FA1F67002332397152D4A6 +:1043F000373A00208326CA5822DC26DA56D206DE57 +:104400004AD84ED69307000AFCD2B737002083A7BC +:104410008755B7053300B73A0020D8572A84938AC6 +:104420004A28719B13671700D8D798431377F7E78B +:1044300098C398431377F7E71367071098C3373784 +:1044400000200327075E10474D8E10C71306A005F6 +:10445000B0CA5057759A50D7034725061376F70709 +:104460009843137707F8518F98C3DC420D4793E7C1 +:104470001700DCC264459D471CA985469CA0A3810A +:104480000400B4A08347F5056385E7001947639DE1 +:10449000E7488547BCB0194693056403138544007B +:1044A00097C0FA1FE78020E9BC209907BCA003470A +:1044B000F4059947631FF702BC301385A40093E706 +:1044C0002700BCB083475403898B638107320C58A3 +:1044D000BC29638D07301946D10597C0FA1FE780C4 +:1044E00080E578441C2393E707F81CA3BC209907B8 +:1044F000BCA0BC30B82093E78700BCB07C44BA971E +:104500000357C406B8B3BC207844834614063E97CC +:104510008357C4069206A183BD8BD58F5CA3B420BC +:10452000890693F6F60FB4A05A2C630E072E834724 +:104530000406795993F7070491C375597C483309E8 +:10454000D9401379F90F918B81C739191379F90F74 +:104550008149637BE9088347340675190947137954 +:10456000F90F6395E72A8347B406639A072A91698E +:1045700093890929F9479389791BB3C9F902373718 +:104580000020130787400346C70713660601230E62 +:10459000C7060327CA58056610C7B387F9028607FE +:1045A0003CD3BC3093E70701BCB07C4403472406EE +:1045B000BE96B8B2B8207C4493D68940BA9723827D +:1045C0003701BC2078443E97834734069607D58F41 +:1045D0005CB3BC208D07BCA01C54CA973CDC5E2C8D +:1045E000B38727412319F4067C48914613F7C70087 +:1045F000630BD700B146631BD70E834614060347EF +:10460000F4076395E60EA18B63860722B737002077 +:1046100083A7072383298409829763E9A920B747E1 +:104620000F00938707243385A940B335F50203D6DD +:104630008A0081463305F502EF90312D9307B012C1 +:10464000AA8963D5A70A49468145680097C0FA1F21 +:10465000E78000D5B7C70300938747FC63DA3729A3 +:10466000938969099306C012B3C9D902B247096791 +:10467000D98F7D17B3F9E9007977F98FB3E937015D +:10468000835764084EC66844139707013C866C0044 +:10469000D98F3EC68327040A0327C4083EC8832750 +:1046A000440A13168700618393F6F701B737002099 +:1046B00083C7B7409D8B9607D58FD18F3ECA83277E +:1046C00004094946A2075D8F835784083ACCFC86CB +:1046D000BC208D073E9597C0FA1FE780C0C5BC304F +:1046E00093E70702BCB0BC20C907BCA083470406FF +:1046F00093F7070489CFB8307C44B42013670704CC +:10470000B8B05838B697B8B3BC208507BCA0BC3049 +:10471000684493F707029DCF0327C40A05CFB4204E +:10472000254693873600AA9790A31306200390B3DB +:104730001023A906B0A31033B0B33023D0A3303375 +:10474000D0B35023F0A35033F0B3702390A7783345 +:1047500098B7B4A0522C6316061A0149B4208347B7 +:10476000E40513F7F60305073A999A07D58FA308CE +:104770002401BCA083475403858B91E7034744037E +:1047800089476317F70078441C2393E707041CA3A9 +:104790007C44183898B3930760F93CB47844832775 +:1047A000CA58B8DB83C7CA0081EB3755050081457D +:1047B0001305E555EFF00EC0B73700209387475635 +:1047C00083453406A38107008347B40610380145AA +:1047D000DD8D97E0FA1FE78040F3F2506254D25427 +:1047E0004259B259225A925A216182808347D40396 +:1047F00091C778441C2393E707F81CA31946930537 +:10480000E40397C0FA1FE78000B3CDB105479309D1 +:104810008042E381E7D6856993898984A1BB856954 +:104820009389E91B81BB814901497DBB83A74A006C +:10483000BE99F5B3BC3083463406C18BA9C3F94792 +:104840000947B389F902835724076390E6020347B7 +:10485000B40601CB938777108607BE9993894929BF +:10486000DDB39387A7078E07CDBF05476396E600A4 +:10487000938787078587D5B793870707F9BFBC203C +:104880005A2C3E978947639CF6048347B406A1C718 +:1048900093077718860737370020130787400346AA +:1048A000D707938987529387575413661600A30E30 +:1048B000C7060327CA58216610C77946B3C7C7027F +:1048C000B387C70286077CD7834714062300D40822 +:1048D000A30FF4068DBB9307A70F8E076DBF054688 +:1048E0009307070FE399C6FA9307870F858765B784 +:1048F000F947BD09B3C9F902B247CE0993D93901C5 +:10490000A5BBBC200C548D073E956369C90097C0B8 +:10491000FA1FE78040A20349C40189B54A8697C0BF +:10492000FA1FE78040A11DBD1387E7FF1377D70F5C +:10493000631E0718B4B09305650319461385440038 +:1049400097C0FA1FE780209FBC20B830B7390020FD +:10495000990793F7F70F13678700BCA0B8B07844A6 +:10496000938989400149BA970357C406B8B3BC205C +:104970007844834614063E978357C4069206A18363 +:10498000BD8BD58F5CA3B820914709071377F70F2C +:10499000B8A08346F4056392F60A83470406795962 +:1049A00093F7070491C375595E2C3309E9401379D5 +:1049B000F90F6374F908834634067519894713792A +:1049C000F90F6390F60E8347B406EDE7916793877E +:1049D0000729F9469387771BB3C7D70203C6C907D0 +:1049E000856513660601238EC9060326CA580CC6C0 +:1049F000B386D702860634D2B43093E60601B4B04B +:104A0000744403462406369730B3B420784436976E +:104A10005CA3B8207444A187BA96034734061607EE +:104A2000D98FDCB2BC208D07BCA01C54CA973CDCDB +:104A30005E2CB38727412319F4068347040693F7B6 +:104A4000070489CFBC30B82093E70704BCB07C448E +:104A5000BA975838B8B3BC208507BCA00347F40503 +:104A600091476313F706522C25C2A8200C549307D4 +:104A7000350068443E956363C90497C0FA1FE78018 +:104A8000808B0349C4010347F4059147631CF72257 +:104A900083C7C90793F7070F93E75700238EF906DB +:104AA00075B9054693078042E385C6F2856793870B +:104AB000878405B785679387E71B21BF4A8697C020 +:104AC000FA1FE7804087C1B7014975BF93F7B70F59 +:104AD0000547E394E7C8BCB0930565031946138501 +:104AE000440097C0FA1FE7800085BC209907BCA04E +:104AF000BC3093E72700BCB08347D40391C7784408 +:104B00001C2393E707F81CA3834754031385A400D1 +:104B1000898B638407160C58BC29638007161946D5 +:104B2000D10597C0FA1FE780008178441C2393E7E2 +:104B300007F81CA3BC20B830B7390020990793F7B9 +:104B4000F70F13678700BCA0B8B0784493898940F9 +:104B50000149BA970357C406B8B3BC2078448346CA +:104B600014063E978357C4069206A183BD8BD58F4A +:104B70005CA3B820854709071377F70FB8A08346D1 +:104B8000F4056392F60A83470406795993F70704FC +:104B900091C375595E2C3309E9401379F90F637499 +:104BA000F90883463406751989471379F90F639616 +:104BB000F60E8347B406FDEB916793870729F94604 +:104BC0009387771BB3C7D70203C6C90785651366EA +:104BD0000601238EC9060326CA580CC6B386D7021F +:104BE000860634D2B43093E60601B4B0744403466A +:104BF0002406369730B3B420784436975CA3B820A7 +:104C00007444A187BA96034734061607D98FDCB2DD +:104C1000BC208D07BCA01C54CA973CDC5E2CB3871B +:104C200027412319F4068347040693F7070489CF25 +:104C3000BC30B82093E70704BCB07C44BA9758381E +:104C4000B8B3BC208507BCA00347F40585476319AA +:104C5000F706522C35C6A8200C549307350068443B +:104C60003E956369C90497B0FA1FE780C06C034999 +:104C7000C4010347F405854711BD8347D40391C799 +:104C800078441C2393E707F81CA319469305E40313 +:104C900097B0FA1FE780206A71BD054693078042EE +:104CA000E38FC6F085679387878411BF85679387F5 +:104CB000E71B31B74A8697B0FA1FE780C06755BF38 +:104CC000014945BF83C7C90793F7070F93E76700FB +:104CD000F1B3011152C4373A002056C2930A8A40F8 +:104CE00083A78A0A06CE22CC26CA4AC84EC6639437 +:104CF000071E2A840945EFF0E02C373900200326EF +:104D0000C9589307000AB73900207CD283A7895578 +:104D1000B7053300130A8A40D857719B13671700F1 +:104D2000D8D798431377F7E798C398431377F7E7F3 +:104D30001367071098C3373700200327075E14470F +:104D4000CD8E14C79306A00534CA5457F59A54D78C +:104D500038249376F7079843137707F8558F98C34D +:104D60007C247844BD8B1CA81CA31D47644463901D +:104D7000E7368547A3810400BCA00347F4058D45B1 +:104D8000631AB7245E2C639107167C481147B18BD8 +:104D9000638CE71431476398E700034714068347A1 +:104DA000F4076303F7148547BCB019469305640301 +:104DB0001385440097B0FA1FE780E057BC2099079D +:104DC00093F7F70FBCA0034704061377070401CF3E +:104DD000B83013670704B8B07844BA975838B8B3F6 +:104DE000BC208507BCA0230E0A06B4208347E40537 +:104DF00013F7F60305079A07D58F18B8BCA09307D9 +:104E000040F93CB483475403858B91E7034744033F +:104E100089476317F70078441C2393E707041CA312 +:104E20007C440C38370500827D158CB38326C95825 +:104E3000B7340020DC4293E71700DCC283478406C6 +:104E400003A6895593F7F703139797015C56E98FEB +:104E5000D98F5CD6B7C7898E938767ED1CC6B757C5 +:104E60005500938757555CC28347A406034A4406FE +:104E70000947336AFA0093874456F8B3A3810700C1 +:104E80007C4493844456BCDAB737002083C7072993 +:104E9000638D072CFC52FDFF528523810400EFE057 +:104EA000B055375505001305E55597C0FA1FE78043 +:104EB000008E83A78955B70680009843558F98C305 +:104EC000D857719BD8D78327C958A3820400A380E1 +:104ED0000400094798C3F2406244D2444249B249AF +:104EE000224A924A05618280A147BCB08357C4061A +:104EF000DCA08357C406034714067444A183120739 +:104F0000BD8BD98FDCB2B4200547890693F6F60F26 +:104F1000B4A08347CA070326C9586310F70603479E +:104F2000440689476312F71A0347A406938766006D +:104F30008E07630707189387770D8607231AF406F1 +:104F400083574407182CF9459387070AB387E7026C +:104F50000945230EAA06056508C6938707FBC20705 +:104F6000C18393877716B3C7B70213970701B38737 +:104F7000B702418386073CD20DA03852F94705831A +:104F80003357F7023C526C528583FD8BAE977CD22F +:104F90008D47230EFA0642074183BC3093E7070191 +:104FA000BCB07C44BE968347240693E70704BCB29A +:104FB000B4207C44B697D8A3B4207C4421837D8B55 +:104FC000B697834634069606558FD8B3BC208D0716 +:104FD000BCA021BD9946631AD7085A2C59E7BCB02A +:104FE0001385440019469305640397B0FA1FE780C0 +:104FF0008034BC201385A4009907BCA0BC3093E783 +:105000002700BCB083475403898BA1C30C58BC292B +:105010008DCF1946D10597B0FA1FE780C03178448B +:105020001C2393E707F81CA3BC20990793F7F70FFD +:10503000BCA00347040613770704E30607DAB4307D +:10504000784493E60604B4B049BB8347D40391C7C0 +:1050500078441C2393E707F81CA319469305E4033F +:1050600097B0FA1FE780202DC1B7A147BCB0835786 +:10507000C406DCA08357C406034714067444A18306 +:105080001207BD8BD98FDCB2B4200547890693F691 +:10509000F60FB4A08347CA070326C958E301F7E80F +:1050A0003852F94705833357F7023C5268528583DB +:1050B000FD8BAA977CD2238EBA0642074183F1BDAD +:1050C0009387A7048E079DBD9387E600E5BF05473C +:1050D0006393E708B1471CB883475403898BB9CB66 +:1050E0000C58BC29A1CB1946D1051385840097B073 +:1050F000FA1FE780402478441C2393E707F81CA399 +:105100006844194693056403090597B0FA1FE780C0 +:10511000802283278A0D13971701635A07007C2486 +:10512000B98B91E778441C2393E707021CA39307EC +:1051300020F9C1B98347D40389C79C2093E707F8B6 +:105140009CA0684419469305E403210597B0FA1F13 +:10515000E780601E75B7522C0C54138584009307AA +:10516000660093F7F7031CB8D5B73755050081459E +:105170001305E555EFE01EA410386244F240D24416 +:105180004249B249924AD285224A0145056117D364 +:10519000FA1F67008357B737002041119387874074 +:1051A00022C4E05306C6054754246390E60283C731 +:1051B000C70711476315F7002285EFE01FC9228555 +:1051C0002244B24041016FF0DFB0B24022444101BD +:1051D0008280B737002083A7474699E33E858280C7 +:1051E0009827E30DA7FE9C43CDBF011106CE22CC2C +:1051F00026CA4AC84EC6EFF0DFFD11E98144F240ED +:10520000624426854249D244B2490561828083477F +:105210005503373900202A849304894089EFB73534 +:10522000002019469385054F1305640397B0FA1FB4 +:10523000E7806010B5A005476397E700BC20639C3A +:105240000716C9446DBF1C59B9E78347C503230A34 +:10525000050291EB034754038547230AF40289476B +:10526000E31EF7FC6DBF1305C50397D0FA1FE78057 +:10527000A0E108D80DC1EF9020380C58BC2581CF93 +:105280008947230AF4021946B1051305640397B050 +:10529000FA1FE780400A034744038947E31CF7FAF3 +:1052A0009C3095CB8347C4039DC7834734041307C1 +:1052B00000041305C40393F7070C6394E71097D019 +:1052C000FA1FE78020E108D81C5891C7BC2B81C782 +:1052D0008947230EF402442495F085475CA41CB44E +:1052E000B737002003C73725230409400349E400EA +:1052F00093170701231BE4069376F9001947C1832E +:105300006379D70683464406094793894700639427 +:10531000E6009389C703B737002003C7E756562C2A +:10532000834534061305A00F373600209307E70B9B +:10533000231B340713872600B3D6A6020355C628BD +:1053400009460E076394C5081307A7040E073E9786 +:105350009397A600BA9737460F0013060624814696 +:10536000B3A5A7023305F502EF80315A4E95231BF2 +:10537000A4068357E40623180406B1CF68289307D0 +:10538000F00F6306F500EFE0AEF1FD577CA8035681 +:10539000E40693066401120637650500A28513052D +:1053A00025C8EFE0EED5B737002003C5F71E8545C9 +:1053B000EFE06EA2A9B5B735002019469385654F79 +:1053C000A5B597D0FA1FE78020CCF5BD6D073E97B5 +:1053D0009397960041B78547E317F9FC6828930730 +:1053E000F00F6306F500EFE0AEEBFD577CA8056615 +:1053F000930664011306068045B7411106C622C410 +:1054000026C22A84EFE0F033228523060400A30598 +:105410000400A3040400B7340020EFE01FA393842A +:10542000C41EA8308545EFE0EEE0A8308945EFE0E6 +:105430006EE068289307F00F6306F500EFE04EE694 +:10544000FD577CA8B24022449244410182802C49FD +:10545000411106C622C426C24AC09C317D4793F73B +:10546000F7033CA9E91793F7F70F637BF700930461 +:105470000008B240224426850249924441018280BC +:105480009C21BD8B3CB9F51793F7D70FEDF32A8418 +:105490001946A1051305650397B0FA1FE780A0FA26 +:1054A000914461D92C4885472302F4049C21194674 +:1054B00089059987858BA302F4041305640497B0CA +:1054C000FA1FE78040E72285EFE05F8485472A895D +:1054D000E31FF5F838389547631EF702EF001060B8 +:1054E000B737002083C717258D8B6375F5021C28FD +:1054F000E36FF9F6B737002083A70723814482972B +:1055000048D02285EFE00FE5E31525F72285EFF07F +:10551000DFEE85B71C2881C71947E39AE7F4130526 +:10552000200483044401EF00FFB062056185E3C0FD +:10553000A4F42285EFE08FDB8347A40603454406ED +:105540000C3881445D8DEFE0206B014681450D45AF +:1055500097D0FA1FE780601BEFE0B01E19BF79718A +:1055600026D2B73400209387844022D4E0534AD017 +:1055700052CC56CA37EA060037390020B73A002025 +:105580004ECE5AC806D693848440130ACA6F1309B4 +:105590004956B7390020938ACA23130B44013C347F +:1055A00031479387E70693F7F70F6368F7168A0783 +:1055B000D2979C438287114783C7C407E31EF7FE37 +:1055C0002285EFE0BFE2E1BF0146930550020145AD +:1055D000EFE0E076130650028145054597D0FA1FAB +:1055E000E780A01283473900858B85C7284881460C +:1055F0005A868145A301090097D0FA1FE780E00889 +:1056000001E52285EFF0BFE4383493073009E30861 +:10561000F7F8EFE010132285EFE0DF87B250225455 +:1056200092540259F249624AD24A424B4561828001 +:1056300083472900858B91CF1C282301090005474A +:105640006375F7001947E396E7FC9307B0F93CB49C +:10565000B9B783A7C958FC53B9F365BF834729007D +:10566000858B6383073423010900B7340020EFE002 +:10567000500D83A7C4FF85CBDC4395C789475C8267 +:1056800083475404130561001946DC825C289305A6 +:1056900064045C8697B0FA1FE780E0C983A7C4FF63 +:1056A0004800DC4382978347740681CF83455404C6 +:1056B000082413066404EF50E12F83477406898B96 +:1056C000B9FB2285EFE06FF891BF8347B40603452D +:1056D00034060146930550025D8DEFE040660146B9 +:1056E0008145054597D0FA1FE7802002834739009E +:1056F000858B85C7284881465A868145A3010900C4 +:1057000097D0FA1FE78060F801E52285EFE05FA2FD +:1057100038349307A009E304F7E8EFE0900255B7A7 +:105720008347B406034534060146930550025D8D58 +:10573000EFE0E06001468145054597D0FA1FE7801C +:10574000C0FC83473900858BE9DB284881465A86AF +:105750008145A301090097D0FA1FE78000F301E516 +:105760002285EFE08FF63834930790096DB78347B1 +:105770002900858B638A072223010900EFE0607C02 +:1057800083C7C40709476307F70083C7C4070D47EA +:105790006314F70283A6C95803574407BC52130782 +:1057A000C712858363FAE700930750F93CB4BC52F3 +:1057B0008583E39607DE31B7183C3C2C0DCF3424AB +:1057C000630DD7206386F60038A42285EFF06FD0F2 +:1057D0008347790093F7F70FE39307DC83C7C40788 +:1057E00009476307F70083C7C4070D47E31BF7ECBE +:1057F000930750F9A9BDE9DF382479FB3CA4F1B740 +:1058000083472900858B6381071A2301090083C719 +:10581000C407C18B95C3EFE0C07283C7C40793F779 +:105820000702E5DF83C7C407228593F7F70C238EB1 +:10583000F406EFE0DFA2A5B383C7D407858B91C739 +:10584000EFE020709307E0F919B583C7C407154747 +:10585000BD8B639CE700EF00702883C75A018D8BD6 +:10586000E37DF5EA9307D0F9DDB383C7C407194791 +:10587000BD8BE394E7EA9307C0F9D1BB83472900C6 +:10588000858BE38E07D02301090083C7C407C18B32 +:1058900089CBEFE0006B83C7C40793F70702E5DF0E +:1058A00051B783C7D407858BC1FF83C7C40715478A +:1058B000BD8BE389E7FA83C7C4071947BD8BE38C27 +:1058C000E7FAEFE0006899BB8D47230EF406BC5C55 +:1058D00022858297383493077009E302F7CC3DBBE9 +:1058E00083473900858B8DC7EFE0A065B73700206F +:1058F00003A787557C53ED9B7CD3230509003727ED +:1059000002408347870493F7D70F2304F70455BB5E +:1059100083A7C958FC53E39407C8F9B78347290004 +:10592000858BD9C32301090083C7C407C18B8DC3ED +:1059300083C7C40793F70702E5DF2285EFE03F92B4 +:1059400083C7C40793F7F70C238EF406EFE0605F7C +:105950002285EFE08FCFB734002083A7C4FF85CB2B +:10596000DC4395C789475C82834754041305610073 +:105970001946DC825C28930564045C8697B0FA1FA4 +:10598000E780609B83A7C4FF4800DC43829783477E +:105990007406858BE38407C88345540408241306E2 +:1059A0006404EF5021019DB983A7C958FC53E398C3 +:1059B00007BEA5B3B737002093874756B823058B9A +:1059C000E30D07D423810700EFE0A0572285EFE025 +:1059D0006F982285EFF07FA291B1E38B07DE39BD8E +:1059E000411126C2B73400209387844022C4A04FBF +:1059F00006C64AC0630F042458248547631BF72456 +:105A0000B737002093874756F8339546638AE600F8 +:105A1000F8338D466386E600FC332D47631EF7009E +:105A20002244B7370020B2409244024903C5F71E12 +:105A3000854541016FD03EBA16301307006483C715 +:105A400084403347D70213898440850793F7F70FC3 +:105A5000232289062384F44063C6E700EFE0CED01A +:105A60002384044078249D476316F70483479406F3 +:105A70009DCB8356040763E5F6020C24930730049C +:105A80007CB81305300493F6F60F0146EF405172CF +:105A900022852244B2409244024941016FF0FF95B1 +:105AA00085062318D406930530020545EFE0AEC401 +:105AB0002301A4068547230EF906182C8D47631190 +:105AC000F70AEFD03E970D8911E9930770023CA4C5 +:105AD000930750021CBC9307600221A88547631BF3 +:105AE000F506930760023CA4930750021CBC930781 +:105AF00070023CAC7824B737002083C4F71E85477A +:105B0000631DF70C123085452685EFD0BECA83474A +:105B10005403898BF1CB8347C403F9C70C58E9C5FB +:105B2000BC25F9C38947230AF4021946B1051305B8 +:105B3000640397B0FA1FE78000800347C4078947D2 +:105B400063E8E70A22852244B240924402494101B7 +:105B50006FF02F98930750023CA4930770029DBFEB +:105B600089467C346316D70213F7170001CF130759 +:105B7000500238A4898B91CB930760021CBC230D83 +:105B800004008DBF930760023CA493077002FDB729 +:105B900095C313F7170019C7930750023CA4A30C31 +:105BA0000400F1BF898B81C793076002C5BF9307CB +:105BB0007002EDB71C3C130740026365F7009307C2 +:105BC000500201A8850793F7F70F13077002E368E7 +:105BD000F7FE1CBC1C3C3CA45DB7B9450545EFE095 +:105BE0008EB112302A9605B78547230AF402B1B761 +:105BF0000327C40AB737002003A607233C27A5C301 +:105C00001C375833B736002093854628B387E70200 +:105C10009A2593844628CC41B387E70213070032C4 +:105C200093870719B3D7E702032744093E973A89B8 +:105C30006364F7006364B7003309B7400296B307A3 +:105C4000A9406374A900D840BA9703576407E3FBDF +:105C5000E7EEB2402244924402494101828083240B +:105C60008409029663E9A400835764073385A4403E +:105C7000E37AF5ECF9BFB737002083A78728BE94F5 +:105C8000E5B7011122CCFD5706CE7CA98357E50666 +:105C90002A848DC7834605070C259307C0037CB96A +:105CA00001461305C003EF40B1500945EFE08031D4 +:105CB00022856244F24005616FF02FF47C25054790 +:105CC000BD8B6386E70083470506918BF9DFB73705 +:105CD000002083A7874E93F7072085C302C402C222 +:105CE00002C08148014881470147814605468145F8 +:105CF0001305C003EF40D1434DBF02C081480148A6 +:105D0000814701478146054681451305C003EF40A1 +:105D1000D13F61BFB737002023A8A7528280B73791 +:105D2000002083C7F71E411106C689EB37350500F1 +:105D30001305A55DEFD07EFAEFD05F9AB73700204C +:105D400037470500938787401307A7A2B8D737576F +:105D500005001307A71EF8D7376705001307079E2E +:105D6000B8DBB2403757050013076719F8DB41016C +:105D7000828011C98327050A93E707082320F50AC3 +:105D8000FD572303F5028280B737002023ACA752CA +:105D90008280B737002083A7C7459C5799E33E858B +:105DA00082809A2FE30DA7FE93878705C5BF011157 +:105DB00022CC06CE2A84034565029307F00F2E8677 +:105DC0006309F5002EC6EFD0BECD3246FD57230342 +:105DD000F4028347A402035784049306640293E702 +:105DE00007062305F40283570404A285F240BA97FC +:105DF0002313F404624437650500130525D70561B4 +:105E00006FD01EB0011122CC06CE2A840345750244 +:105E10009307F00F2E866309F5002EC6EFD05EC8FB +:105E20003246FD57A303F40293067402A28562442E +:105E3000F24037750500130525DF05616FD05EACB4 +:105E4000011122CC06CE2A84034585029307F00F68 +:105E50002E866309F5002EC6EFD09EC43246FD574C +:105E60002304F40293068402A2856244F24037754B +:105E700005001305C5E105616FD09EA837370020E6 +:105E800093078740ED46AE33F237231ED51C231C03 +:105E9000D51C963B03487514231AB51C2318C51C42 +:105EA0002319D51C8947130787406306F806930713 +:105EB000801483486514231FF51C09486391080763 +:105EC0001A37231BE51C0567130707A9231DE51CCB +:105ED0006D482E876373B8006D4793150701231231 +:105EE000E51E6D48C18132876373C8006D4723107A +:105EF000E51E0356651D0357A51D6373E600328733 +:105F00002313E51E368763F3D7003E872311E51E72 +:105F10002307B50482808567938707A959BF7A3321 +:105F2000231BE51C1307801455B7034765148946E6 +:105F30008357651E631ED70283568514938787E8AF +:105F400099C6B3C7E702938757FD214731A0214780 +:105F5000B3C7E702938757FDB3C7E7020357451E50 +:105F6000C207C18363F3E7003E872307E50482800D +:105F700085466316D7009387C7FB1147F1BF938708 +:105F800007FBE1B78357051D0357C51D411106C621 +:105F900063F3E7003E87931807018357E51D035716 +:105FA000251D93D808016373F700BA87139807017A +:105FB0008356851D8357451D1358080163F3D70089 +:105FC000BE860357651D8357A51D13930601135302 +:105FD00003016373F700BA8783467514C207094744 +:105FE000C183639AE6000566130606A942876370BB +:105FF000C802328729A8032705109316470163CCEE +:1060000006000566130686844287E36406FF1318BC +:10601000070113580801834665140947639DE60686 +:106020003A3D9306204E3307D70293F6F80F9A06AF +:106030001386F63C9386C64F634406019306C81246 +:10604000158F63D3E7003E87420705664183130639 +:1060500006A9BA876373C700B287C207C183035614 +:10606000051E13F7F80F9376F30F6316E604035635 +:10607000251E631206050356451E631ED6020356EF +:10608000651E631AF602230E0506EFF01FEA0945A6 +:10609000B240410182800327051093164701E3C0F7 +:1060A00006FC056613068684BE856373F600B2851A +:1060B0009397050165B70546230EC5062310E51E17 +:1060C0002311051F2312D51E2313F51EEFF0FFE544 +:1060D00001457DBF0357651D8357A51D411106C6A8 +:1060E0006373F700BA87034665141397070189465F +:1060F0004183631BD6068566938606A96373D70022 +:10610000B6871397070141838357651E6387E700AE +:1061100085472313E51E230EF5060357251D8357D8 +:10612000E51D6373F700BA870346751413970701DB +:10613000894641836317D6048566938606A96373EF +:10614000D700B6871397070141838357251E6387BE +:10615000E70085472311E51E230EF506EFF0FFDC6F +:10616000B240014541018280856713868784E37DC3 +:10617000E6F88326051093870780F58FD1F73287DD +:1061800061B7856713868784E371E6FC8326051073 +:1061900093870780F58FD5FB328745BF0357A5044A +:1061A0009547723DB307F702363D93D537406355A7 +:1061B000B600118F93173700B3C7D702C207C18348 +:1061C0002314F5048280832745110D469306F00FB2 +:1061D00098230D8B58B56313C700B42374B9982363 +:1061E000418B38A99C337CA982805C25CD9B5CA522 +:1061F00082808327451158259C23935637408987F1 +:10620000B58F858B91C71347870058A501458280BC +:10621000054582808327451158259C2393562740A6 +:106220008D87B58F858B91E71347470058A50145AA +:106230008280054582808327450E85072322F50E3F +:1062400091E78327850E85072324F50E8327850E86 +:1062500093F7070891C785472322F50E2324050EDF +:106260008347A50293F7070491CF8357050403578B +:106270008504BA972313F5048327450A93F7F7BFDC +:106280002322F50A82808327C50E85072326F50E73 +:1062900091E78327050F85072328F50E8327050F30 +:1062A00093F7070891C785472326F50E2328050E87 +:1062B0008347A50213F7070409C793E707022305DD +:1062C000F5028280B737002083A7474A014591E352 +:1062D0008280B83711E305059C43D5BFB73700204E +:1062E00083A7474A0145054791E38280B43763930A +:1062F000E60005059C43CDBF411122C426C22A8475 +:1063000091450145B734002006C693848440EFD000 +:106310009EBE03D7440B231BA404854763FDE704FB +:106320000355641E8357241E3737002037460F005D +:10633000AA970355C7289387172713060624B3A5E2 +:10634000A70281463305F502EF70315C83570404E0 +:106350000357E4058355840583A8C4091D8F3307BB +:10636000B7028327040905461383F5FF130E800245 +:106370003E9763676600B2402244924441018280A6 +:106380003308C603C687FD563A9881E7231BC40429 +:10639000DDB76314F4001C40F5DB83AEC7086398D7 +:1063A000BE0083A60709B306D840B3F6B60263E47D +:1063B000A6009C43D9BF09066DBF411126C2B73460 +:1063C00000209384844003D7440B06C622C485472B +:1063D00063F3E7042A848357251E0355651E373768 +:1063E000002037460F00AA970355C7289387172721 +:1063F00013060624B3A5A70281463305F502EF7004 +:10640000D1500346540583A8C40985467D1613035D +:10641000800263E7C600B240224492444101828078 +:106420003387660283270409FD553E97C68781E7B7 +:10643000231BD404CDB76314F4001C40F5DB03AE7A +:10644000C7080328C408631A0E0103A80709B30587 +:10645000E84063640701B305074163E4A5009C437A +:10646000F9B785067DB71E3D79714ECE938617002C +:10647000B73700209387472856CA83D9870083AA55 +:106480004700B7370020138687408355460B06D652 +:1064900022D426D24AD052CC5AC85EC6054603271B +:1064A0008508637BB60EB3863603938487409307D3 +:1064B0000032014A93860619B3D6F60236973A8916 +:1064C0006364D70063645701330957412A84232842 +:1064D00025098357641E0355251E37460F001306F2 +:1064E00006243E9513051527B325350381463385CC +:1064F000A902EF709141AA8B03ABC4098144B38711 +:106500009902130600648146B3B5990213850732D8 +:10651000B337F500BE95EF70513F4A955A87FD5746 +:1065200031E733879902130600648146B3B59902B7 +:10653000130507323337E500BA95EF70113D2A99FC +:106540003335A900CA876314AA0063645901B307ED +:1065500059412328F408B250225492540259F24966 +:10656000624AD24A424BB24B456182806314870033 +:10657000184345DB0326C7088326C408631AD600E0 +:1065800083260709B387A6406364D500B307D540C7 +:1065900063EE7703184369B78347750393B7270002 +:1065A00093C71700B697B3873703930600329387D4 +:1065B0000719B3D7D7023E97BA866364F7006364BE +:1065C0005701B30657412328D50871B78347740391 +:1065D00085048607FD17E3E4F4F2A1B7B73700207E +:1065E0009387874083D6470B05476372D70C4111C9 +:1065F00022C403A4C70906C626C2A28789EB01EC00 +:10660000230E0500B2402244924441018280D83FCB +:1066100075FB9C43E5B76314A400004075D03C347F +:10662000C9E70327C4088327C5086300F708582D66 +:1066300093070008AA846316F7043E3C19469305A5 +:106640000008231AF506231BF5065E3C231DF504FE +:106650007E3C231EF5040A25EF7090698547DCBC5B +:10666000DC2C93F7F707DCAC130584062244B24018 +:10667000924431469305F00F410117A3FA1F6700BA +:1066800023D23E3D194693050008231AF406231B26 +:10669000F4065E3D231DF4047E3D0A24231EF4040B +:1066A000EF70106589475CBCC1B7004089BF230EFD +:1066B00005008280B73700209387874083D6470B39 +:1066C000411126C206C622C40547AA846372D718A0 +:1066D00003278510098B630D071683A7C709BE859D +:1066E000BDE503D6441E01447D58130626020586E7 +:1066F0002D067D55ADE3630204103C343A3CCDE7F2 +:106700008947231CE404A30AF404035704068357AF +:1067100004042285BA97C1071D8B998F231FF404A7 +:106720005E3C231DF4047E3C231EF404EFF0DFBC2A +:106730008327440A93E717002322F40A85475CA8BD +:106740008D475CBCB2402244924441018280D83DD6 +:1067500075FB8C4171B798436394970049DFBA8702 +:1067600083A6070903A7040963E2E6023387E6402C +:1067700083A6C40863F4E6003377D7026376A700E4 +:106780003A856373C700BE859C43ADB7158F83A65A +:10679000C70863F4E6003377D702E37707FF3A8848 +:1067A000E374C7FE3E84CDB7BE3CB3F7E702D9FB26 +:1067B0009D46994763F5E600935717008D070567D7 +:1067C000231AF406130707C88A076353F700BA872A +:1067D000231BF4065E3C0A241306C002231DF404A6 +:1067E0007E3C93050008231EF404C9475CBC224488 +:1067F000B240924441016F70B04FB9C9BA3CBE3D3E +:10680000B3F7E702B1E78387C40163D307049D466A +:10681000994763F5E600935717008D070567239A9C +:10682000F406130707C88A076353F700BA87239B48 +:10683000F406DE3C8A241306C002239DF404FE3CC9 +:1068400093050008239EF404CD47DCBCEF70504A4A +:10685000238E0400C5BD3737002013074728502773 +:10686000B7370020B73600209387874015CE03A6A0 +:10687000C653411106C611EA584323A8E70A371741 +:1068800000201307873E23AEE65203A5C65323A27A +:10689000070AEFD0CEECB240B7E700E037070002BE +:1068A00023A2E72041018280122723A2070A8357EF +:1068B0006508AA8523AE0652B387C70237460F0084 +:1068C000832605091305F62313060624AA97B3D7D2 +:1068D000C70237360020034636253E9663EEC600D3 +:1068E00003A7C508371500203386C6401305E538D1 +:1068F000938695026FC0DEBA5C43BE96D5B7B737B4 +:10690000002003A78753011126CA4AC8B7340020C4 +:1069100006CE22CC4EC62A89938444283DCFBE8918 +:10692000B737002003D7C74B85476318F7069E2467 +:1069300003546908032505093304F402B7470F001F +:106940001387F723938707243A943354F402636838 +:106950008508B737002083A7072333048540829733 +:106960006362A408B307A4403737002003443725E7 +:1069700083A98953014505806370F40237450F00F0 +:106980003384874013050524B335A402922481463D +:106990003305A402EF7061778299930700FB230708 +:1069A000F900DC24A1CB014597A0FA1FE78020DE87 +:1069B000B737002023A6074AB737002003A5C753DF +:1069C000EFD0EED9F2406244B7E700E037070002AB +:1069D00023A2E720D2444249B24905618280DC40CB +:1069E0003E9585BF330785408147E35F07F6DC406E +:1069F0003E948DBF8347990262448545F240D2445C +:106A00004249B249B395F500C205C181014505610E +:106A10006FC07EBC411106C6EF00307719C98327CD +:106A20008511014581E7B240410182809C43050503 +:106A3000D5BF7D55CDBFB73700209387874003A7CB +:106A4000870A411122C426C206C62A84AE84631472 +:106A5000A70023A4070A8327041299C70A24014622 +:106A600093050008EF70D0288357440499C70A247F +:106A70004D4693051008EF70B0270A24154693057C +:106A80001008EF70F026B737002093874756F83389 +:106A90002305040023080400230A94049546639404 +:106AA000E600A3830700B24022449244014541011D +:106AB00082803C25638D073283570508411122C42B +:106AC00006C626C285072310F5087C35230C050071 +:106AD0002A8413F7270005E703570504954763E465 +:106AE000E700014501A89305E003EFF0DFF4A305FB +:106AF000A4020945B240224492444101828013F726 +:106B0000070221CF93F7F7FD7CB58327050A3835B7 +:106B1000A305050293E747002320F50A8547631E76 +:106B2000F7023E3D1306204E03274509B387C702EF +:106B3000B3D7E7023737002083462725034775037D +:106B4000938606053307C702B697C207C18323128F +:106B5000F5088607BA972311F5081C38858BE9C715 +:106B60008357E405035704046396E7245E3C83558A +:106B7000C405034584022310F406834754056EBC04 +:106B80009205A30BF40283576405F915B73400206E +:106B90001EBC8357A405938444285EBCEFC0FEABA3 +:106BA0003834231004081E3C631A071A9A24D04074 +:106BB000B387E7021307003293870719B3D7E702B9 +:106BC00003270409D1073E97BA866364F70063641C +:106BD000C700B306C740835784052328D4083EBCAA +:106BE0005C3C81C72285EFF04FFD9A243E3C930622 +:106BF000003223110402B387E70233D6D702B3F77A +:106C0000D7029306204E2326C408B387D702B3C702 +:106C1000E7021EB0835704045EB07C3493E707029A +:106C20007CB41C38F99B1CB81C38898BA9C7035746 +:106C3000E41283570404B306F74013960601634039 +:106C40000618631AF7028147014893048413232C22 +:106C5000F412232E0413154693058412268597906B +:106C6000FA1FE780406D2685EF00107B1C38A306D5 +:106C7000A412F59B1CB81C3813F707013DC78356B7 +:106C8000C414035704043386E6409315060163C811 +:106C90000512639CE604BD9B1CB88347A41481CBFA +:106CA00013F727006307071285472303F41483476C +:106CB000B41481CB13F72700630407128547A3039D +:106CC000F4142285EFF00FC18347C40799C78327C7 +:106CD000040A93E707102320F40A8327040AA30574 +:106CE000040293E707202320F40A1C3813F7070255 +:106CF00005CF373700200327C745130680055423E7 +:106D00001857B386C6023697562F035704043387A5 +:106D1000E64013160701634906000357C4146315C0 +:106D2000D70093F7F7FD1CB88347A40293F7070435 +:106D3000E38907DA0357640483570404E313F7DA9B +:106D400018289307A0046314F70085471CA883271D +:106D5000440A93E707402322F40A61B30347E41887 +:106D600003568405218B11CF83560404035704195D +:106D70002E3C158F3307B7023347C70236972318C7 +:106D8000E4189DC79A24CC40B307F70213070032DA +:106D900093870719B3D7E702032704093E97BA86FA +:106DA0006364F7006364B700B306B7402328D408D0 +:106DB00032BC25BD998F13970701E35707E693056A +:106DC00080022285EFF03FC7A305A40213058002CD +:106DD00015B3918B99C38947C9BD23030414C1BD61 +:106DE000918B99C38947E1BDA3030414D9BD05451F +:106DF000828005C541119305200222C406C62A845B +:106E0000EFF07FC3FD57A305A40223080400A303EA +:106E1000F402B240224441018280828005C94111BE +:106E200022C406C67C352A849305E003898B91C36E +:106E3000A145EFF05FC0FD57A305A402230804009D +:106E40002304F402B24022444101828082808327DD +:106E5000050A797122D406D626D24AD04ECE52CC1B +:106E600056CA2A846380074A13F7270011CBF59B83 +:106E70002320F50A0A25194693050008EF7040679C +:106E80008327040A13F7470041CFED9B2320F40A20 +:106E90008347A40293F7070491CB8327440A2285F2 +:106EA00093E707402322F40AEFF04FAF38348547C9 +:106EB0005028835624066314F77E3E3C1307204E69 +:106EC000B387E70203274409B3D7E7023737002027 +:106ED0000347272513070705BA97C207C18303474E +:106EE000B4022312F40886072311F408930700085C +:106EF00019C3930700045CAC19E68347A40293E727 +:106F000017002305F40299E60A240D4693050008AC +:106F1000EF70005E23110406230A0400A30E040090 +:106F20008327040A13F7870005C30A24DD9B232067 +:106F3000F40A154693050008EF70805B8347A402AE +:106F400093E747002305F4028327040A13F7070198 +:106F500031C7BD9B2320F40A8347D4040A24214669 +:106F600089C7A30604041306000393051008EF70F5 +:106F700020588347C40489CF83278410C18B89CBD1 +:106F80008355A40422859205C205C181EFE03FE24A +:106F90008347A40293E717002305F4028327040A1A +:106FA00013F7070405CB0347F40493F7F7FB2320FB +:106FB000F40AA14763FAE7003C3499E78327440ABF +:106FC00093E707012322F40A0A24314693051008A7 +:106FD000EF7000528327040A13F7070255C73434B1 +:106FE00093F7F7FD2320F40A0327C41083278410A6 +:106FF00099EA1377070801CB0327440A37064000B4 +:10700000518F2322E40A93F707026384076CADE2F1 +:107010008357241D0357241E6304F7028346741408 +:1070200009476392E66A0567130707A9637AF700C1 +:107030008327440A056713070780D98F2322F40AA0 +:107040008357641D0357641E6304F7028346641468 +:107050000947639DE6660567130707A9637AF7008A +:107060008327440A056713070780D98F2322F40A70 +:107070000A24114693050008EF7080478347A40255 +:1070800093E717002305F4028327040A13F7071078 +:107090001DC30A2493F7F7EF2320F40A230E0406F6 +:1070A0001D4693050008EF70A0448347A40293E7B0 +:1070B00017002305F4028327040A13F7070801CFFA +:1070C0000A2493F7F7F72320F40A130670059305B3 +:1070D0001008EF70E0418327040A13F7072029C343 +:1070E00093F7F7DF2320F40A83476414230F040087 +:1070F000A29703850718A301A414EFC0B01B2301B6 +:10710000A4142285EFE07FE20A24314693050008AB +:10711000EF70003E8347A40293E717002305F402B3 +:107120008327040A13971701635D071271777D1790 +:10713000F98F2320F40AB737002003AA8748630792 +:107140000A548357441513953701139717014D813E +:1071500063580758C2079305C012C187B305B5022B +:1071600063D50700B7872500BE950358040403576D +:1071700084153739002093064928832704090326FC +:10718000C40883AA460081491309492803554408C5 +:10719000631EE85463EAC754B384C7408357890029 +:1071A0002E9537460F00B335F502130606248146A7 +:1071B0003305F502EF607175B307950033B5A7008D +:1071C0002E95BE846394A90063E45701B3845741AC +:1071D000B739002083A709238297CE8763E3A4549D +:1071E0003385A440B73900209389C92303C77901A7 +:1071F0000607637EE5520327CA0D8356890083572D +:1072000064152183420741833307D7029306003276 +:107210008507C207C183032649001307071933579F +:10722000D702B3069700B68463ECE65663FAC656F7 +:107230002314FA0823209A0A0347E4148546834757 +:107240002A08631ED75C93E727002301FA085285BA +:10725000EFC040240A241306600293050008EF7073 +:1072600020298327040A139727016357070079779A +:107270007D17F98F2320F40A8327040A1397070147 +:1072800063590704B737002003C5B740834504039B +:10729000EFC01EBE3E3C1307204E232AA408B3872E +:1072A000E70237370020B3D7A702034527256177C8 +:1072B0007D1713050505AA972312F4088347A40236 +:1072C00093E717002305F4028327040AF98F23208C +:1072D000F40A8327040A858B91CF8347A402834550 +:1072E0004405228593E717002305F402EFF0AFF47D +:1072F000A305A4028327040A63D6070086078583B3 +:107300002320F40A8307B41785C70307440399466B +:107310003306F74063DEC6508327440AB7061000E1 +:10732000D58F2322F40AED57A30FF416A30DE4160C +:107330008347441813F7270059CF830644030307F4 +:10734000C41763DCE6000327440A37061000518F98 +:107350002322E40A1147A30FE4160307D417635C42 +:10736000D7000327440A37061000518F2322E40A6E +:107370007157A30FE4160307A4171306F007630C55 +:10738000C7020346741803458418158F6207618786 +:10739000B306A640635AD74A93F607016396064A96 +:1073A00093F7F7F893E707012302F4188357A4181B +:1073B00085072316F4188357C41891CFFD17C20709 +:1073C000C1832316F41881EB0A24130600029305E7 +:1073D0000008EF70E0113C249DCF8327041281CF79 +:1073E0003C2C91EB0A24014693050008EF704010F5 +:1073F00019E185473CAC8357440491CF834714037C +:1074000099EB0A244D4693051008EF70600E01E5D4 +:107410008547A308F4028347E41813F7070179C7E7 +:10742000BD9B2307F4188327440A898BE1E31828BE +:10743000D547630DF70A1C38898BCDEB8144814910 +:1074400001498D4A130A500213978401618793778B +:10745000370009872297034777198607B397FA0001 +:107460007D8F638BE700268605458145EF603147B8 +:10747000B3E9A9003369B9008504E39744FD032506 +:1074800084138325C413337535012AC4B3F525014C +:1074900028002EC6EF0040788347541363E0A7020C +:1074A000034544037D578547591562052C006185C6 +:1074B0003AC43EC697B0FA1FE780C034032784134E +:1074C000A2476317F7000327C413B2476300F7020C +:1074D00015462C00130584129790FA1FE780A0E54B +:1074E0008327440A93E727002322F40A8346E418FB +:1074F000A54713F796006315F70403570404835751 +:107500000419636FF702B307F74013960701634945 +:1075100006028347F4181306000A0507B387C7025B +:10752000323CDD9A2307D418B3C7C702BA97231891 +:10753000F4188327440A37078000D98F2322F40ADE +:107540008347A402E9C7918B89CF1028C165938531 +:1075500005A02285EFE01F8B8347A402ED9B230546 +:10756000F4028347A402858B8DC3034574029307FD +:10757000F00F6307F500EFC0AED2FD57A303F4028E +:107580008347A402F99B2305F4028347A402898B55 +:1075900089CF6E3C034584029205F915EFC0EE8B4E +:1075A0008347A402F59B2305F4028347A402A18B21 +:1075B00099CF6E3C0D4622859205F915C205C18111 +:1075C000EFE05F848347A402DD9B2305F402834739 +:1075D000A40213F7070101CF0345640293F7F7F8FC +:1075E0002305F402EFC0CECBFD572303F4028347FB +:1075F000A40213F7070201CF8355A40403456402D4 +:1076000093F7F7FD2305F4029205EFC00E855C2C7D +:1076100093F7070C81CB3834854722856316F7260C +:10762000EFF04F8983570404B5C313074006B3F73F +:10763000E702A9EFB737002083A74753B7340020EC +:1076400093848440898B9DCF373900201309C92347 +:107650000327490305CB9E28AE282545C207DD8DAB +:10766000029783274903EE242945829783274903FC +:10767000831524032D4582978327490383054403FB +:10768000314582972397040023A80400B250225466 +:1076900092540259F249624AD24A45618280930764 +:1076A00000045CAC19E68347A40293E717002305A6 +:1076B000F402E39306860A240D4693050008EF6062 +:1076C00030636FF07F85130780148DB21307801429 +:1076D00071B28327440A7D771307F77FF98F79B258 +:1076E000F945B305B50251B4D6977DB49306180099 +:1076F000637D07013387E6403307C70263E5E70090 +:10770000B384E74061BCD697E5BF158F3307C70246 +:10771000BA97BE8463E4E700E3E257A9B384574114 +:10772000B5BC0327490026973305A74065BC83A74E +:107730000723635E0506829703C779010326490084 +:10774000814506073A95AA876364E5006364C5002E +:10775000B307C54063E99704858F0327CA0D035516 +:107760008900835664152183420741833307A702AA +:1077700013050032130707193357A70213851600A4 +:10778000B3D7E702AA97C207C183B386D74033872E +:10779000E602B306970033B7E600B684E388E5A8AF +:1077A000B384C64071B433079640BA977DB78297C9 +:1077B00003C779018325490006073A95AA876364C0 +:1077C000E5006364B500B307B54063E3F404B38731 +:1077D000F4400327CA0D035689008356641521839C +:1077E000420741833307C702130600321307071904 +:1077F0003356C702B3D7C702B387F640C207C18367 +:107800003387F6403307C70263E9E400998C0DB46F +:107810003387B400B307F7406DBFAE94C5BF894648 +:107820006314D700E59B15B4F59B93E7470031BC83 +:10783000998FE3DFF6AE8327440AB7061000D58F91 +:107840002322F40A9547CDB483465418834564181F +:107850003388B600635BE80013F807046317080079 +:1078600093F7F7F893E7070481B62A96E345C7B480 +:107870008D8EE3C2E6B413F70702E31E07B293F757 +:10788000F7F893E707020DB6EFE05FD561BB411152 +:1078900022C406C62A8483278411C5EB83270412D9 +:1078A000E9E70325041109C59790FA1FE780808650 +:1078B000034574029307F00F6304F500EFC04E9E7A +:1078C000034564029307F00F6304F500EFC04E9D7B +:1078D000034584029307F00F6304F500EFC04E9C4C +:1078E000034594029307F00F6307F500EFC04E9B2A +:1078F000FD57A304F4020A24492CB73700209387CC +:10790000874003D7470B15EF37370020232E075248 +:10791000373700200327872823A8E70AB737002036 +:1079200083A7472499CF373400201304C41E08507E +:1079300009C99780FA1FE780E07D232004022322F3 +:107940000402B240224441018280C84309C59780A5 +:10795000FA1FE780207C83278411BA27136707F07A +:10796000BAA79C43232CF4103DB7C84309C59780A0 +:10797000FA1FE780207A83270412BA27136707F0DB +:10798000BAA79C432320F41211BFB737002083A766 +:10799000474A99E33E8582809A27E30DA7FE9C43E0 +:1079A000CDBF373700208346B72437370020034642 +:1079B0000729B737002083A7474B1387160019C242 +:1079C000139716001207C1663E97FD166315F70060 +:1079D00081473E858280B227E30DA6FEE30BD6FEEB +:1079E000C107EDB701114EC6B73900209387894012 +:1079F00083A7C70A06CE22CC26CA4AC852C4B5EB12 +:107A0000373700209307C723B7360020FC3783C6DB +:107A1000062993898940130AC7231389170099C23D +:107A20001399170003D4E9023305F9409314490070 +:107A30001304140215841604420441803305A40281 +:107A4000930540242695420541819780FA1FE780DF +:107A5000605F05C18346FA0023A6A90A3307950093 +:107A6000B306D9408147130640F5930520F563EA34 +:107A70002701F2406244D2444249B249224A056198 +:107A8000828063FCD70058C12EA522978507C207C4 +:107A9000A3040500C1834105D9BF32A523220500F7 +:107AA000F5B74111930530261305801E06C622C482 +:107AB00026C29780FA1FE780E0581306801E814592 +:107AC0002A849790FA1FE780A08D01450DC8B7342E +:107AD00000209387844083A6C709938484409DC671 +:107AE0003687854712276301F606184365FF1EA4F3 +:107AF000A9E322859780FA1FE780C0610A24B2407B +:107B000022449244410182803687E9BF85471EA402 +:107B100023AE840823A0840A239AF40AEFF09FEC92 +:107B200083A7040A23A007002305040023070400F9 +:107B3000F1B783A7040A80C383D7440B23A0840A28 +:107B40008507239AF40AE9BF1387170093170701E3 +:107B500013160701C183E35906FA814749BFB737B6 +:107B60000020138787400325C70A411122C406C697 +:107B70001384874009C59780FA1FE780A059232600 +:107B8000040AB240224441018280411122C43734A8 +:107B900000209307844083A6C70906C60147B6871D +:107BA00013048440A9CB9227631BA60405EB9842DB +:107BB000232EE4083E859780FA1FE780A05583278F +:107BC000040A23A007008357440B9DE3EFF03FF91D +:107BD000232E0408B2402244410182808326040AF5 +:107BE0006395F6002320E40AF1B7944314C3D9B790 +:107BF000FD17231AF40A8357440BE9FFC1BF3E87E0 +:107C00009C434DB737350020714681451305454AE1 +:107C10001783FA1F6700C3781C3138215421A2074B +:107C20004207BA971821FD8A0548BA97383193055B +:107C3000000201456207BA9701473316E8007D8EBE +:107C400001C605051375F50F0507E318B7FE814753 +:107C5000214633D7F640058B01C705051375F50F8F +:107C60008507E398C7FE8280011152C656C4032AD5 +:107C70008513832AC51322CC26CA4AC806CE2A8475 +:107C8000A30B0512A3060512814413095002268690 +:107C90005285D685EF60E141058911C58347D4122D +:107CA0008507A306F4128504E39324FFF24062449F +:107CB000D2444249324AA24A05618280411126C219 +:107CC000B73400201387844022C40324470906C622 +:107CD0004AC0834754062302040685E38547B73527 +:107CE00000202302F40619469385054F1305640608 +:107CF0009780FA1FE780206451A08546639BD700D8 +:107D000038230DEB4945B2402244924402494101D7 +:107D100082808325440813898440DDED8347C406AF +:107D200095E3034754068947E30AF7FA8347290096 +:107D3000F1DB8547B73500202302F4061946938509 +:107D4000654F6DB71305C40697A0FA1FE780C033CF +:107D50002322A40819CD3C2589CF89472302F406A4 +:107D600019469305C500130564069780FA1FE7803E +:107D7000805C034744068947E315F7FAB70500011D +:107D8000FD150145EFC0AE9B68CCEFC0804328CC09 +:107D9000C1451545EFC02E9685477CB08D475CA048 +:107DA000834784033739002048A40D471309C91EAF +:107DB000639CE70252388357640403453900C14588 +:107DC0003E96EFB0DEBF03453900C145EFB0BE803F +:107DD00001452384044005BFBC25A1D78947230260 +:107DE000F4061946B10541B70947034539006396C2 +:107DF000E70003566404C145E9B75238EDBF4111AD +:107E0000930590241305000A22C406C69780FA1F22 +:107E1000E78040232A8425CD1306000A81459780F8 +:107E2000FA1FE780E057B737002023AE8748B737FF +:107E30000020938747569853DC5323020400232ADB +:107E4000E408232CF408FD572300F404930710FBE7 +:107E50007CA0B78705009387C7CB2324F408B78796 +:107E60000500938767172326F408B78705009387D3 +:107E7000A7022328F408B737002083C7072981EB1E +:107E8000B737002003A507549145EFB0BED2228535 +:107E9000B240224441018280411106C622C426C25A +:107EA000AA84EFC0000A930700FBFCA0B7370020AC +:107EB00003C5F71E9305000237340020EFB09EB7CC +:107EC000D63813070064834784403347D7028507B9 +:107ED00093F7F70F2304F44063C6E700EFC0CE88A2 +:107EE00023040440B24022449244410182800111A3 +:107EF0004EC6B739002026CA06CE22CC4AC852C484 +:107F000093874956FC331547938449566306F70017 +:107F1000FC300D47631FF7009C3481E79307701016 +:107F20009EA4F2406244D2444249B249224A0561C9 +:107F30008280B73700200D4503A4C7493739002098 +:107F4000EFC0400803278955B7C7898E938767ED2F +:107F50001CC7B7575500938757555CC38347A40385 +:107F60001307F00F6387E700A30CF402FD57230DFE +:107F7000F4020345940389476306F5008547A30C83 +:107F8000F4020145373A00200327CA5801469305F9 +:107F900050025C4393E717005CC3930720FB7CA06F +:107FA0009D47FCB023820956EFB070593737002047 +:107FB0008326075EBA890145DC56F59BDCD65C302A +:107FC0000326895593F6F7071C4293F707F8D58FD8 +:107FD0001CC2B737002083C7072989C7B7370020DD +:107FE00003A507549780FA1FE780607A0327895515 +:107FF000B70633001C4393F7F7E71CC31C4393F702 +:10800000F7E793E707101CC303A7095E1C47D58F4A +:108010001CC78327CA5813079005B8CBA382040056 +:10802000A3800400054798C3EDBD4111B737002078 +:1080300022C403A4C74906C626C283479403214726 +:108040006388E70A894458306399970A9307700256 +:10805000630CF71093075002130560026304F700E6 +:1080600013057002B737002083A7875548B037063D +:10807000CEFF98437D161377F7E71367070898C379 +:10808000373700200327075E1447F18E14C7B73631 +:10809000002083A5C658B736002023A805042382F4 +:1080A000065693864656238206005057759A50D737 +:1080B0009043137606F8498E90C3A3820600A380EE +:1080C0000600854694C1944393F6F6E794C394431F +:1080D00093F6F6E793E6061094C31C47B706330001 +:1080E000D58F1CC793079005BCC9930720FB7CA0C4 +:1080F000B240224492444101828093077002630C93 +:10810000F70293075002930660026304F700930698 +:108110007002B737002003A7075E54B05C57F59B89 +:108120005CD7B737002003A787551C4393F707F8A0 +:10813000D58F1CC35DBF83478403898B95C7B73731 +:1081400000200356A40403C5F71E93050002EFB0F8 +:108150001E8793075002A30C94025CB02244B240E5 +:10816000924441016FF0BFD822852244B24092442C +:1081700041016FF07FD2B73700209387874003A774 +:10818000870A25E3411122C403A4470906C69307C1 +:10819000000B78206304F700EFB0B05A83478403E4 +:1081A000373700200345F71E13F7170011C785471F +:1081B000A30CF402323801A8898BF5DB0356A40422 +:1081C0008947A30CF40293050002EFB04EFF93071A +:1081D0005002230F04025CB02244B24041016FF010 +:1081E0001FD1828001114EC6B739002083A7C9581C +:1081F00022CC26CA4AC806CED843373900202A8462 +:1082000013671700D8C38326895537C7898E13078C +:1082100067ED98C63757550013075755D8C2D8434E +:1082200001469305F00F13671700D8C3930730FB7F +:108230007CA1B73700200345C503938447561D47EB +:10824000F8B023820756EFB0902F03A6C958A38237 +:108250000400A380040085471CC283278955B70505 +:10826000330098431377F7E798C398431377F7E7FA +:108270001367071098C3373700200327075E14479A +:10828000CD8E14C79306900534CA5457F59A54D727 +:108290000347B4039376F7079843137707F8558F8E +:1082A00098C3F2406244D2444249B2490561828097 +:1082B0007D572300E50403479503411106C6230DAE +:1082C000E5022147A30CE5020347B50358B1EFF0DF +:1082D0007FF1373700200326C758F977FD1754463A +:1082E000F58F5CC6010001008327C7580967130694 +:1082F00000F898C7373700201307475650A3056783 +:10830000B240130727D1F8D3D4C7410182800111AD +:1083100026CA06CE22CC4AC84EC652C4034795038D +:10832000A147AA846314F720930750FB7CA103455F +:10833000C50393052002EFB0300C03C9C40389477D +:1083400063F3270109491379F90F03A4440993073B +:1083500020029CA495471CA0F820B7390020930761 +:10836000400B93898940631BF70083A7890D1397FE +:10837000170163550700930750021CA093072002C2 +:108380001CB003C744068947138A6406631BF700C1 +:1083900083A5440819465285B1059780FA1FE780E6 +:1083A00080F983C75406858B91E703C74406894744 +:1083B0006316F7001C2093E707041CA01946D2851A +:1083C000130524009780FA1FE780E0F683C754075F +:1083D00089C71C2093E707F81CA0194693856407FA +:1083E000130584009780FA1FE780E0F483C78405B3 +:1083F0007CA483C794057CB483C7A4051CA883C749 +:10840000B4051CB8FC4C13D787003CA8C1835CA8FA +:1084100038B889476313F9008D475CB89317190082 +:10842000A69703C7070583A5440918AC03D707051A +:10843000218318BCB82F38ACBA2F218338BC03C7AE +:1084400007029E3358ACA1835CBC83D7490B638C75 +:1084500007128D472397F404B737002093874728E6 +:1084600083DE87009306003203D7A90213860E1914 +:108470003356D602B4501307270283A2C90903AFAB +:10848000470005872D07814313090032954F369623 +:1084900016857D5383D7E40445E563696700850746 +:1084A000C207C1832397F404E3F4FFFE83C7E40407 +:1084B000B7060082FD167CA883D7E404A1837CB8AC +:1084C00083C769107CAC83C779107CBC83C78910D3 +:1084D0002300F40283C79910A300F40283C7A910F4 +:1084E0002301F402DC24FD8BA301F40283C73900CD +:1084F00003C735029607D98FA381F502B73700204D +:1085000003A68755B737002083C7072593F7F703DE +:10851000139797015C56F58FD98F5CD6F240624471 +:10852000D2444249B249224A05618280930740FB06 +:108530007CA1930520020145EFB0006C014931B5E3 +:10854000B386D703032E050993860619B3D62603EF +:10855000B388C600B3B6D80046886394D30063E4FA +:10856000E8013388E841B306C84163690E01B306E8 +:108570000E4163F5E60085072397F40463F3660074 +:108580003683084101BF9C3D982D9946A207D98F9B +:108590008D838D073E8763F3F60019472397E40424 +:1085A00031B7411122C4373400201304C41E26C23F +:1085B000AA842830C14506C6EFB0CEC7283093053F +:1085C0000002EFB02EC7B24022442382040023935E +:1085D0000400924441018280411106C626C222C491 +:1085E0004AC0AA84EF10901CEFF02FBA6301051067 +:1085F000B85083A7440901482324E508B84CB7358F +:1086000000202A84232CE508F84C15469385E55074 +:10861000232EE508D83B1305851337390020A30F17 +:10862000E5EEF83BF42B130989402207558F231000 +:10863000E5F0983F942F2207558F2311E5F0B83FBE +:10864000B42F2207558F2312E5F0D82FDC3FA20765 +:10865000D98F2313F5F0DC2423220501A30EF5EEB8 +:1086600081471CC19780FA1FE780E0CCF820930770 +:10867000600B6312F70285472300F41483C7C40319 +:108680000D47639EE706930720202313F4148547C4 +:108690002314F41415A08327890D13971701635D24 +:1086A000070083A74409982383A784099C23F98F93 +:1086B0009583858B2300F4142285EF10C07C8327DB +:1086C000090E0A24294693F7072091E305469305EE +:1086D0000008EF50F0618327890D13971701635845 +:1086E00007000A24514693050008EF5070602244A9 +:1086F000B24002492685924441016FF09FEA23036C +:10870000F414A303F4144DBF011122CC06CE26CAE3 +:108710004AC84EC68347C5072A8499EB03254408F7 +:1087200045E5583485476311F71468582C5C31A22D +:108730000325450831C53C25A1C78347D407D1C3CC +:10874000834734081307000493F7070C639BE7067D +:108750009304E407A685690597A0FA1FE780408D7A +:10876000054783274408631DE5020947230EE406F5 +:108770001946A6851385C7009780FA1FE780A0BB1E +:108780000347C4078947E30BF7F819469305E40745 +:10879000130564069780FA1FE780E0CA41F119A02B +:1087A0009C3391EB8144F240624426854249D24495 +:1087B000B24905618280B737002083C79740E9D36B +:1087C000D5B71C31D5FFF9BF3C29A1DF834754073A +:1087D000C1CB8347B4071307000493F7070C6391D9 +:1087E000E70893096407CE851305A50297A0FA1F31 +:1087F000E78000842A898547AA84032544086318F2 +:10880000F9041946CE8551059780FA1FE780A0B27A +:10881000B737002083C7974089D78947230AF406D2 +:108820005C34E39227F983274408AA23DA23EE2352 +:108830009E274207598DC207DD8D6244F240D24423 +:108840004249B249056117A3FA1F6700C3A71C314B +:10885000B1DBB737002083C79740E38407EC99B7B3 +:108860001C31E39007EC3DBF0347D4068347540710 +:10887000E31AF7F21946930564071305E406978097 +:10888000FA1FE78040BCB334A00031BF411106C6D7 +:1088900022C42A84EFF0BFA7B7370020032744097A +:1088A00083A7C758B7068000B8DBB737002083A777 +:1088B00087559843558F98C3D857719BD8D797A0A1 +:1088C000FA1FE780E0D9B24022440145410182808D +:1088D000411122C42A840325850981460146814528 +:1088E00006C626C24AC097A0FA1FE78000DA631DB9 +:1088F000050E832484099D469C20BD8B1CB49830B2 +:1089000038A46395D70EBC200346D40393D66700E2 +:108910006310D60E93F7F7031389440063FCE70C4A +:10892000230A0406BC30858B9DC38547230AF406C1 +:108930009C20CA8519469987858BA30AF4061305DE +:1089400064079780FA1FE780009F1389A400230E15 +:108950000406BC30898B9DC38547230EF40683270C +:108960008409CA8519469C231305E40719099D83C8 +:10897000A30EF4069780FA1FE780E09BBC30A18B22 +:1089800081CB834719000347F40391836316F706ED +:108990002285EFF07FD785479304F007631AF5002F +:1089A0008347E40389CFFD17230FF402EFB060592A +:1089B000B240224426850249924441018280034705 +:1089C000C4038947631AF700B737002083C7F756F7 +:1089D00081C78D47230EF40222852244B24092447F +:1089E000024941016FF09FEA8544D9B79D44C9B758 +:1089F00095447DBF8D446DBFD1445DBF011126CA32 +:108A0000AA840325850981460146814522CC06CEEC +:108A10004AC84EC697A0FA1FE78020C7054459E50B +:108A200003A984092147034409003D8880B4834792 +:108A30001900BCA46314E4088349290013D7690012 +:108A400041E313871900639FE706034739008D4709 +:108A5000631CF70683470900194693054900998767 +:108A6000858BA38AF406138564079780FA1FE78035 +:108A7000808C8547238EF40683A7840919469305C5 +:108A8000A9009C231385E4079D83A38EF406978099 +:108A9000FA1FE780408AB547639AF9022685EFF00E +:108AA000BFC609C52685EFF03FB301442285F240D9 +:108AB0006244D2444249B249056182801D44FDB7F7 +:108AC0001544EDB76544DDB74544CDB76144F9BF02 +:108AD000011122CC2A84032585098146014681455E +:108AE00006CE26CA4AC84EC652C497A0FA1FE780CF +:108AF000C0B963140528832484091D469820937601 +:108B0000F70014B49C3093F7F7033CA46395C61E9A +:108B10007D57230DE402B820054693566700A30E47 +:108B2000D402639EC6241377F7030507639BE724EB +:108B3000B830E1479376F7FB6397F6249377870085 +:108B40002A89938944008DC3DC308566938606F0BC +:108B5000A207F58FD42093896400D58F2312F404E3 +:108B6000DC309183A30FF402418B014641C7EFB083 +:108B7000403D83C7090093F7F703A30DF40203C632 +:108B800029008967938707F022067D8E83C7190025 +:108B90005D8E420641862311C40483C72900958354 +:108BA000230EF4028387090063DF07009307C012D6 +:108BB0008346940305473306F6023C246397E60098 +:108BC000A9078E0729A8F947E5B7373700200347DB +:108BD000F75689078E076DC39387770D86071D8E1D +:108BE000B7070080130746ED93C737ED63EFE7182B +:108BF000230DD402BC3093F7070491C703479403B5 +:108C000089476307F7180347A4039307F00F630B23 +:108C1000F70C130700506364C70AB737002083A519 +:108C2000C75879777D17D445758FD8C501000100E5 +:108C300003A7C7588965B73400200CC7130500F88F +:108C400093854456130656EDC8A1060670D354C743 +:108C5000138A4456BE897C53FDFFA147A30CF4023E +:108C60002285EFF02FD883A6C958F977FD17D8468B +:108C7000F98FDCC60100010083A7C958896694C733 +:108C8000930600F82302DA0093062059F4D3D8C7DC +:108C900097A0FA1FE780C09C83C74456858BB9C351 +:108CA0002285624423820456F240D2444249B249AA +:108CB000224A05616FF0DFC19387A70419B7034704 +:108CC00004046311F7021306F6D8930710273356EE +:108CD000F6023785050093060404A2851305052BCB +:108CE000EFA01EC2F24062444A85D2444249B249D2 +:108CF000224A05618280398B51EFE91793F7F70F0C +:108D00007D4713090008E36FF7FC8547230AF40643 +:108D10009C201946938524009987858BA30AF40625 +:108D2000130564079770FA1FE780E0601C34230E78 +:108D3000040605476392E70283258409230EF4069F +:108D400019469C211305E407A1059D83A30EF40693 +:108D50009770FA1FE780205E2285EFF0FF9A854723 +:108D60002149E311F5F822856244F240D244424998 +:108D7000B249224A05616FF07FB10549A5B715498F +:108D800095B70D4985B70949B1BF1309100299BFBD +:108D90005D4989BF13090008B1B73971B7370020A1 +:108DA00022DC03A4C7494AD856D237390020B73A43 +:108DB00000204ED652D45AD05ECE62CC66CA06DEB1 +:108DC00026DA6AC8130B200B930B400B130C600BB5 +:108DD000930C300B130A495693894A287C20639DD3 +:108DE000670183474956858BB5CF228523020956F3 +:108DF000EFF01FCE65D5BDA063987709B737002087 +:108E0000938747569833058B31CFB73900201389A4 +:108E1000492803558900A38007009307800F330575 +:108E2000F50237460F008146130606248145EF50B0 +:108E3000C12D83A74928AA842EC68297B245B307BD +:108E4000950033B5A7002E953E878326490019E18A +:108E500063E4D7003387D74038D0EFB0800E228547 +:108E6000EFF08FF75C20638007146254F250D25405 +:108E70004259B259225A925A025BF24B624CD24C7E +:108E8000424D21616FF0AF86639687093737002026 +:108E90000326C758F977FD175446F58F5CC60F10A7 +:108EA00000008327C758B7340020096798C7130606 +:108EB00000F81387445650A3373700200326875500 +:108EC000184231830D8B1DEB13076019F8D3D4C7FB +:108ED0009790FA1FE780C07883C74456858B89CB6B +:108EE00023820456EFB0E0052285EFF03FB13DD973 +:108EF0008347E4038507230FF402ADB71842094600 +:108F000031830D8B6315C7001307E043C1B7130707 +:108F1000E01B6DBF639C970183474956858BB9D38E +:108F2000228523020956EFF0BF9AE9B51307500BCB +:108F3000E39AE7F283471A00858B8DD78346C403F3 +:108F4000A3000A00054783A74A2803DD890063724E +:108F5000D704829737460F00AA8413060624814659 +:108F60001305804D3305AD028145EF50011AB3075B +:108F7000950033B5A7002E953E8783A6490019E1D9 +:108F800063E4D7003387D740930760FB38D07CA0D9 +:108F9000B1B5829737460F00AA841306062481468E +:108FA0001305800FC1B7F2506254D2544259B259DE +:108FB000225A925A025BF24B624CD24C424D2161D2 +:108FC00082804111B737002022C403A4C749B737B4 +:108FD00000201387475606C618379387475619C788 +:108FE00094270D476394E600A3840700F833A14655 +:108FF0006386E600F83399466396E600F83398A74F +:10900000054798B7EFA0F0732285EFF08FD91306CC +:10901000A002930500080145EF50804D034504046C +:109020009307F00F6307F500EFA09EA7FD572300FD +:10903000F404B240224441018280B78705003737EB +:1090400000209387E7DF2320F74AB79705003737DB +:1090500000209387A7D92320F75482808347651384 +:1090600093D63700AA9683C5061313F7770033D635 +:10907000E540058A630306101C39898B6396071047 +:109080008327450A898B63910710011122CC2A841A +:109090001305851306CEEFE03FB80347541383470B +:1090A00044036360A70A138567FF62057D56FD468A +:1090B0002C00618532C436C69790FA1FE780807411 +:1090C0000326841322478326C413B247718FF58F7A +:1090D0006314E600638AF6002800EFE0FFB3A547BB +:1090E00063EFA702A30AA4128347E4188DE703469F +:1090F00064132245B245EF40D17B058909CD832712 +:10910000C41093F7070881CB8327440A3707400030 +:10911000D98F2322F40AF2406244056182806D15E2 +:10912000A30AA41215462C00130584129770FA1F87 +:10913000E78060208327440A93E727002322F40A6C +:1091400065B7138547FF8345641362056185EFA00A +:10915000901C59F90346641305458145EF40317869 +:10916000032784138327C4131345F5FF93C5F5FF25 +:10917000698FED8F3AC43EC675B78547B397E70050 +:10918000CD8F2388F61282808280411122C426C2AC +:1091900006C64AC0834765032A84B7340020850782 +:1091A000230BF5023C39639507545C251307000433 +:1091B00038B91839B19B93E737005CA5931787013D +:1091C000A30D0500E18763D807001377F70718B9E7 +:1091D000EF30007939A88327850A93F62700B9C6AE +:1091E000F59B2324F50A83270510918B8DCFEF1073 +:1091F0000028383C85476317F70E832784115824CD +:10920000DC4398A3832784115838DC4398B30327A1 +:10921000841183A7C4585843B2402244B8DB924417 +:10922000024941018280EF108022E1B793F61700D6 +:1092300099C6F99B2324F50AEF10E0145DBF1429A9 +:10924000054963972627C5CF13F7070119C7BD9BAB +:109250002324F50AEF10806F69BF13F7070401CBD1 +:1092600093F7F7FB2324F50AEF10002559B713F7FE +:10927000070801CB93F7F7F72324F50AEF203034E2 +:109280008DBF13F7071009CB93F7F7EF2324F50AE7 +:109290002285EF104034B1BF13F7074001CB93F79D +:1092A000F7BF2324F50AEF107061A1B713974701A8 +:1092B000635C07007D771307F77FF98F2324F50A96 +:1092C0002285EF10E04035B713972701635A070056 +:1092D00079777D17F98F2324F50AEF10404F11BFDE +:1092E0002324050A83270411582498A383270411F3 +:1092F000583898B383A7C4580327041131BF832774 +:10930000450A638B073C93F6070199C6BD9B232250 +:10931000F50AEF10005FF1BD93F6070481CA93F7D9 +:10932000F7FB2322F50AEF10400CE1B593F6072076 +:109330008DCA4D8B6317071A8327451A89EF832738 +:10934000440A2322041A228593F7F7DF2322F40A22 +:10935000EF10006979BD9770FA1FE780007765F11B +:1093600049BD93F6170099CA4D8B631C0716F99BEC +:109370002322F50A2285EF00306FA5BD93F6270062 +:1093800091CA4D8B631F0714F59B2322F50AEF103A +:10939000604C85B593F6074081CA93F7F7BF232247 +:1093A000F50AEF10E00EB1B59396470163DB0600B6 +:1093B0007D771307F77FF98F2322F50AEF20F0144A +:1093C0000DBD93F607028DC29770FA1FE780E06F1C +:1093D000E30105E28327440A228593F7F7FD232260 +:1093E000F40AEF00507C31B593F6870081CADD9B0B +:1093F0002322F50A2285EF10903AE5BB63DD0700D2 +:10940000860785832322F50A8327050A93E7270029 +:109410002320F50AC1BD9396370163DC06004D8B0E +:1094200069E37D777D17F98F2322F50AEF10200A73 +:10943000C9B3139727016358070079777D17F98F10 +:109440002322F50AB1B51397F700635A0700417755 +:109450007D17F98F2322F50AEF10C06959BB1397C6 +:10946000E700635A070001777D17F98F2322F50A79 +:10947000EF100024BDBB1397B700635B07003707ED +:10948000F0FF7D17F98F2322F50AEF10202D95B3F9 +:1094900013979700635B07003707C0FF7D17F98FAD +:1094A0002322F50AEF104038A9B32322050A1DBD77 +:1094B0008DCA930770046380F61A63EDD70A930789 +:1094C000E002638EF60263E9D70493073002638AF1 +:1094D000F60063EAD700E947638AF61AF547638D19 +:1094E000F61A2285F5B1930770026387F61A93077F +:1094F000C0026382F61C93076002E394F6FE2285A5 +:10950000EF3000461C38DD9B1CB88327040A93E724 +:1095100007012320F40A19A293078003638AF6182F +:1095200063E7D70293071003E386F6D2930770032D +:10953000E399F6FA8547A306F5049305C50A414663 +:109540001305C50C9770FA1FE780E0DE65B5930739 +:1095500010046387F60AE3E6F6F893075004E3E2A3 +:10956000F6F88357450703576507BA978587231C85 +:10957000F50411AA930760066387F61663EDD70218 +:1095800093075005638AF61463EBD7009307B00482 +:109590006381F61493071005E382F6CE99B793071B +:1095A0007005E3F7D7CE93071006E39CF6F2228509 +:1095B000EF30003BA5A09307200763E8D70293078D +:1095C0001007E3F6F6FE938766F993F7F70F054960 +:1095D000E369F9F0EF30C0388327040A0567130701 +:1095E0000780D98F2320F40A09A293076007E38933 +:1095F000F6CC93076008E396F6EEEF10401D39A80D +:109600008347B50279476391E70283270510918B61 +:1096100089CBBD472306F502EF00706585471CA87E +:10962000C9BEEF00D062DDBF0549639B27018357A8 +:10963000450703576507BA978587231CF5041DBBAB +:10964000EF3000328327040A2308240193E7270020 +:109650002320F40A79BE0347B502F947631DF700DA +:10966000EF00F05E230824018347A40293E717006C +:109670002305F402BDBE8357450703576507BA9714 +:109680008587231CF504EF00303EF9BFEF009049B9 +:10969000D947230AF404B1BE2285EF30602C83271A +:1096A000040A2308040093E717002320F40A91B664 +:1096B000EF00F0513DBE8D472306F5042322050E31 +:1096C0002324050E2326050E2328050EEF00F0495E +:1096D0000DB6EF00705E99B79770FA1FE780E03E15 +:1096E000E30905B0FDBBEF10701D2308240111B67E +:1096F000B7370020938787409A2B05079AABD5BCD4 +:1097000079714AD0373900209307894022D403A4C5 +:10971000470A26D256CA5AC8B7340020B73A0020A2 +:1097200037EB06004ECE52CC06D65EC613098940F2 +:1097300093844456B7390020373A0020938A4A2848 +:10974000130B0B737C241307100C6391E71683A78C +:10975000C95898430D8B05C737370020230607F4F7 +:10976000B84B619BB8CB98431367870098C39C4361 +:109770008D83858B89C7010001000100010083C72B +:10978000CA0089E79770FA1FE780E05B03A6C95813 +:109790009307000AB70500827CD283278A55FD15FE +:1097A000B73B0020D8572285719B13671700D8D785 +:1097B000034724141377F70393169701D8576D8F37 +:1097C000558FD8D70327840998C70327C409D8C35E +:1097D00058421367170058C283A60B5ED856759B74 +:1097E000D8D6034764139376F7079843137707F89F +:1097F000558F98C3EFF07F995C38DE86C1C38347ED +:10980000C404898BA5CFA28505459790FA1FE780F0 +:1098100080C601C5EFA0E0723DA303278A55B706B5 +:1098200033001C4393F7F7E71CC31C4393F7F7E798 +:1098300093E707101CC303A70B5E1C47D58F1CC7FB +:1098400083A7C9581307A007B8CB5038930700F86F +:1098500083456414BCB0930730FC7CA423830400CC +:10986000894711066396F5008345841493E5250026 +:1098700001459790FA1FE78040E9E9B503278A552B +:109880001C4393F7F7E71CC31C4393F7F7E793E7F1 +:1098900007101CC303A7065EB70633001C47D58F0D +:1098A0001CC783A7C9581307A00579BF1307400C2D +:1098B0006394E74EBC30858B6384074ABC30E20773 +:1098C000E18763D307028347641313D7370093F606 +:1098D000770022978547B397D7008346071393C72E +:1098E000F7FFF58F2308F7127C3413F7270009EBF5 +:1098F000130700F893E7270058AC7CB42324090A27 +:109900008345C4040325441193062403130644032A +:1099100085899790FA1FE78040D783474403034720 +:109920006904E8A0998F230AF402FC20858B6395D3 +:1099300007348347A402A30C04002310040893E710 +:1099400027002305F4022285EFC0BF8A29ED832773 +:109950008411A30904009DCF383C0DCF9837058BA7 +:1099600015EBBA27C843136707F0BAA79760FA1F29 +:10997000E780407A8357440485072312F404832741 +:1099800084119C43232CF4108327441A81C7FD17AC +:109990002322F41A5C3881CB8347C404898B81C7A6 +:1099A0002285EFC05F89FC20898B63830710834782 +:1099B000C404858B638E070E1C3C85071CBC228566 +:1099C000A38104009770FA1FE780202C8547631855 +:1099D000F52E2285EFF06FFB8347C404898B6386E5 +:1099E000072A5C386383072AA28505459790FA1FEA +:1099F000E78060A8E31005E203278A55B706330025 +:109A00001C4393F7F7E71CC31C4393F7F7E793E76F +:109A100007101CC3B737002003A7075E1C47D58F6C +:109A20001CC783A7C9581307A007B8CB4C380345F8 +:109A30006414894791056316F50003458414136582 +:109A40002500EFA0601B83278A55B7068000984346 +:109A5000558F98C3D857719BD8D7930730FC7CA4F7 +:109A600083C7CA00A1E3832704128DCF7834058B06 +:109A700015CBD443D0278C270A248906EF00B16880 +:109A800015E183270412BA27A3840700136707F0A0 +:109A9000BAA79C432320F4128357240481C7FD17DF +:109AA0002311F40450388345641409451106D1B3D9 +:109AB0002285EFC02FF6E31405F02285EFC0AFF04A +:109AC0001C3813F7870031C3782821C37438454701 +:109AD000636AD70037270200130747063357D700BA +:109AE000058B05E79307D003230AF404930770025C +:109AF0001CA88347C404858BE38307EC7C28E380A0 +:109B000007EC2285EFC02FF85DBD54340D47639BF1 +:109B1000E6027C381307A002637FF7007C381D47FC +:109B2000E389E7FCA306F4028327840A93E717007E +:109B30002324F40A7DBF8A07DA979C432285829703 +:109B400071FD45BF383805EF1828C1466318D700A6 +:109B500093E717001CB885471CA815A0D5466315C8 +:109B6000D70093E72700FDB7F1466314D702832798 +:109B7000040A2308040093E717002320F40A7C2832 +:109B8000ADDB22859770FA1FE780C003E31905E279 +:109B90008DB793069005631ED7080347A41401CB25 +:109BA000034664148546B396C600631CD70003467B +:109BB000B4140DCE834574148546B396B60063077E +:109BC000D60293E707011CB859D79376470083570D +:109BD000641EB9C603578414938787E80DC30947E9 +:109BE000B3C7E702938757FD214739A87C2CE9DFEB +:109BF0008327040A93E707202320F40AF1B72147BB +:109C0000B3C7E702938757FDB3C7E7020357441E64 +:109C1000C207C18363F3E7003E872307E40425BF3F +:109C2000058B01C7938707FBC1B79387C7FB114714 +:109C3000E1BF930770066316F70203278A55238551 +:109C400004007C53ED9B7CD3372702408347870475 +:109C500093F7D70F2304F7045C2493F7F7FD5CA474 +:109C6000DDBD93075009E31CF7F08347E41893E741 +:109C700047002307F418C5B51C2C85071CAC835777 +:109C8000E90085072317F9001DBB03278A55B7068E +:109C900033001C4393F7F7E71CC31C4393F7F7E724 +:109CA00093E707101CC3B737002003A7075E1C47C4 +:109CB000D58F1CC783A7C9581307A005BDB3EFA054 +:109CC0004028B737002083C7072995EF8327041260 +:109CD0009DCB7834058B05CBD443D0278C270A2421 +:109CE0008906EF00514205E183270412BA27136762 +:109CF00007F0BAA79C432320F4128357240481C79A +:109D0000FD172311F4042285EFD06F941C3C85C706 +:109D100093F7070F81CB9305D0032285EFC0BFD106 +:109D2000A305A402B737002083A7072789C7954555 +:109D30001305600882971C2C99C78347290581C7A2 +:109D40002285EFF0AFB122852254B25092540259CD +:109D5000F249624AD24A424BB24B45616FC03FBAA8 +:109D600083A7C958FC53E39F079CEFA0801DBC301C +:109D7000E207E18763D70700835729018507231985 +:109D8000F9002285EFD0AF8CBC30E207E187E3DC3D +:109D900007FAEFA06E9D55B71307300CE39CE7A6BA +:109DA000BC20858BF9CB8327040A23810400858B93 +:109DB00095C3EFA0001903457402EF907ECE834552 +:109DC0004405FD57A303F4022285EFC0DFC6A305B7 +:109DD000A40295BF8355041E0356241E0345741424 +:109DE0009105C205C181EF9090758347C404B73BCC +:109DF0000020858BB9CBA28501459780FA1FE780AB +:109E0000C06E03278A55B70633001C4393F7F7E764 +:109E10001CC31C4393F7F7E793E707101CC303A782 +:109E20000B5E1C47D58F1CC783A7C9581307900723 +:109E30000356041EB8CB930740FC110642067CA4CF +:109E400041828345741405452DB403278A55B7060E +:109E500033001C4393F7F7E71CC31C4393F7F7E762 +:109E600093E707101CC303A70B5E1C47D58F1CC7C5 +:109E700083A7C9581307900565BF83A7C958FC532A +:109E8000E392078C41BA011126CAB73400204EC6AE +:109E90009389844083C739004AC83739002006CEE9 +:109EA00022CC52C4130949283A3DA307F50283572F +:109EB0008900130A00322A843307F70237460F005D +:109EC0001306062481468145938484403357470313 +:109ED0002326E5081305C0123385A702EF40E122CF +:109EE0002312A4082285EFC00FD8035789003E3CF7 +:109EF0009306204E2285B387E702B3F74703B38763 +:109F0000D702B3C7E7021EB0835744088607231160 +:109F1000F408EFB0BFF62285EFC04FA86E3C228553 +:109F20009205F915C205C181EFB09FF12285EFD0EE +:109F3000BFD3E147A30AF412B737002083A74753E2 +:109F400023A4890A898B95C3373900201309C923B3 +:109F50008327490399CB8325840935458297832735 +:109F600049038325C4093945829722856244239792 +:109F7000040023A80400F240D2444249B249224AD4 +:109F800005616FC05F8D411126C206C622C4AA8436 +:109F9000EFD0BF9F19C52A842685EFC0BFA7232213 +:109FA000A41AB240224492444101828001114EC65B +:109FB00006CE22CC26CA4AC8EFD0BFAEAA892DC58C +:109FC000EFD0BF9C2A8463010518C1473EA59307C3 +:109FD00000FB7CA53739002085471CA99307C923BE +:109FE0009E2B130740101309C92395073E85C2070E +:109FF000C1836374F70013054010131705014183F3 +:10A00000930700046374F7001305000442059305E9 +:10A01000D02441819760FA1FE780C0022328A41052 +:10A0200001ED0A24EFD07FB6F24062444E85D2445F +:10A030004249B24905618280B737002083A787581B +:10A04000B7340020138784408326C70D232AF410D9 +:10A050008327870D1833232ED40E232CF40E9384DC +:10A06000844009E793F7F7F3232CF40E8327C40FFA +:10A070000327840F231304142326F410BE3C232447 +:10A08000E4100347E4022312F41483C7A404136703 +:10A0900017FC2307E402A304F4168327440A03A74A +:10A0A000040D93E607042322D40A9316670063D6AF +:10A0B000060093E707052322F40A83C7240581CB12 +:10A0C0008327440A37074000D98F2322F40AFD571B +:10A0D0002310F4047EB02304F4028567938787BBC2 +:10A0E0002315F4042285EFC04F9003454901230155 +:10A0F000A414EF90F015D147A303F418930780023E +:10A10000A302F4189307006F231CF4169307F007BB +:10A11000230DF416F5779387A7EB231EF4168327F8 +:10A12000C40FA301A4142300A418A300A41823019E +:10A13000A418A301A41893F7070881C7854723072C +:10A14000F41823940400CDB58549F9BD411106C624 +:10A15000EF60007FEFE07FEEB240B7970500373742 +:10A160000020938707702322F754410182807429CD +:10A170000D47AA876384E6000545828003274511C1 +:10A180005023A305C50238336313D70238356DF762 +:10A190001829930600026307D70093063002014591 +:10A1A0006316D7001307600298AB01458280BD4655 +:10A1B000631ED70018299306000401451377B70FD3 +:10A1C000E316D7FE1307500498AB8280B946631993 +:10A1D000D700142913070003E390E6FA0547E9B70F +:10A1E000D1466316D700142913070005F5B7D946E1 +:10A1F0006314D702142913075005E39FE6F60327DB +:10A20000050A136707202320E50A054718A9983B8C +:10A21000136707F898BB51BFE946631AD7001429A2 +:10A2200013075006E39AE6F41307A006B5BFFD46F0 +:10A23000631AD70014291307A007E39FE6F2130758 +:10A2400010F89DB793063002E318D7F214291307CC +:10A250005008E393E6F2054718A90347A5021367E0 +:10A2600017002305E50265B7B1475CB983270511DF +:10A27000C5CB0947A30AE5048356E5050357050442 +:10A280008355050663E7E60013865500998E634300 +:10A29000D602B736002083D6C64B0D4811466365FB +:10A2A000D800850613F6F60F2E972107A30AC504DA +:10A2B000231FE5042381070003475505B8B303476F +:10A2C0006505035685058356A505D8A3035765057F +:10A2D000F0A394A72183D8B313578600F8B313D7FC +:10A2E000860098B70357C50593558700ACB78345DB +:10A2F000E505B8A7CCA78355E505A181CCB72E3DD0 +:10A3000081476399C500523D6316D6007E3D998F03 +:10A3100093B717002311F506C1471CA90145828098 +:10A320000545828083270511094758B999CFB8A3FD +:10A3300003474505B8B38347A50293E78700230584 +:10A34000F502F1471CA9014582801D4582808547A1 +:10A350005CB98327051181CB1547B8A39307B002D9 +:10A360001CA9014582800545828085475CB9832709 +:10A37000051181CB1947B8A39307D0021CA9014549 +:10A3800082800545828089475CB98327051191CB7E +:10A390001D47B8A3832705110347D5020145B8B36C +:10A3A00082800545828085475CB98327051191CF5E +:10A3B0002947B8A38347A50293E747002305F50281 +:10A3C000930750031CA9014582800545828085477B +:10A3D0005CB98327051181CB2D47B8A39307700380 +:10A3E0001CA90145828005458280032705119947F4 +:10A3F0005CB9B1473CA3B737002093878740D62B81 +:10A4000034B3F42B54A3F62BA18254B3942F74A32A +:10A410009C3F7CB38347E50213F7070401CF930702 +:10A42000A0031CA98347E50293F7F7072307F5026A +:10A4300001458280858BFDD78327050AA305050288 +:10A440002307050293E707042320F50AE1BF8947A4 +:10A450005CB98327051191CB3547B8A38327051134 +:10A460000347B5020145B8B38280054582808D4718 +:10A470005CB98327051199CB4547B8A30347C502AB +:10A48000B8B30347B5020145D8A382800545828051 +:10A4900085475CB98327051191CF4947B8A3930736 +:10A4A000A0041CA98347A50293E747002305F502F2 +:10A4B000014582800545828085475CB98327051167 +:10A4C00089C74D47B8A3014582800545828003278F +:10A4D00005118D475CB9D9473CA38346451434B375 +:10A4E00083475514918A5CA30357651EA9C693063A +:10A4F000F034814763FDE600930787E8035785142E +:10A500000DCB8587938757FD8D87C207C18303577E +:10A51000451E63F3E7003E878347A5022307E50452 +:10A5200093E747002305F502930750051CA9014551 +:10A5300082808D87C1BF858B99C7930707FB214711 +:10A54000B3C7E702D9B79307C7FB1147D5BF0327A6 +:10A5500005118D475CB9DD473CA3834745143CB3E7 +:10A560008346551454A30347B514F98F93F6470057 +:10A570000357651EA9C69306F034814763FDE600C4 +:10A58000930787E8035785140DCB8587938757FD7D +:10A590008D87C207C1830357451E63F3E7003E87DB +:10A5A000930780051CA98347A5022307E50493E7C9 +:10A5B00047002305F502014582808D87C1BF858B49 +:10A5C00099C7930707FB2147B3C7E702D9B793079A +:10A5D000C7FB1147D5BF95475CB9835705040327CF +:10A5E0000511E146A107C207C1832316F51434A360 +:10A5F0008346A51434B30346B514A302070023030E +:10A60000070050A38325851441766D8E01C65CB387 +:10A61000A1837CA393F746000357651E9DCF930645 +:10A62000F034814763FDE600930787E803578514FC +:10A630001DC38587938757FD8D87C207C183035745 +:10A64000451E63F3E7003E87930790052307E50463 +:10A650001CA9014582808D87F1BF858A99C6930721 +:10A6600007FB2147B3C7E702C9BF9307C7FB1147E1 +:10A67000D5BF832605118D475CB9E547BCA283474A +:10A680007514034665140547B317F7003317C70061 +:10A69000D98FBCB283471514DCA28347A50293E788 +:10A6A00047002305F502930700061CA90145828097 +:10A6B00089475CB9832705117547B8A33737002050 +:10A6C0000347B740B8B3930750071CA901458280E0 +:10A6D00089475CB9832705117947B8A30347F50279 +:10A6E000B8B38327050A2167D98F2320F50A854748 +:10A6F0001CA901458280B737002003A7C7459307EF +:10A7000080055423B387F602145703270511BE961C +:10A71000A5475CB9930700023CA30356651E835707 +:10A72000251EB297D05A9387C71263F3C700B2872A +:10A730003CB313D68700C18350A35CB39C5E7CA35B +:10A7400013D68700C18370B31CA7DC2E1CB7DC3E78 +:10A750003CA79307C0071CA90145828083270511E8 +:10A7600011461307300250B9B8A303472517118BC0 +:10A770000DCB03474517238207009306F7FF0547D4 +:10A780003317D700B8B303473514D8B38347A502AE +:10A7900093E747002305F502930750F81CA90145EC +:10A7A0008280834675140947639FE600373700208F +:10A7B0000347F75601C72147B8B311A0B0B3034709 +:10A7C000F517D8A3C9B705473317D700F5B795478D +:10A7D0005CB98327051113074002B8A3A3810700C2 +:10A7E00003073514830695176394E6008946B4B3CE +:10A7F000830685176396E600B43393E61600B4B378 +:10A8000083067517D4A303466517D8B3F0A383470F +:10A810002517858B81CB99C68327050A4167D98F78 +:10A820002320F50A0145828091475CB983270511F1 +:10A8300013078002B8A3373700200347A745B8B3F2 +:10A840002947D8A313072003D8B3930750F91CA9AD +:10A8500001458280411126C28324051106C622C407 +:10A86000A1475CB9A1C483570504035705062A8490 +:10A8700093058512BA97A9072317F5128547BCA03F +:10A880001385340015469760FA1FE780C0AA8347F6 +:10A89000E41201459CA48357E412A1839CB4D547DC +:10A8A0001CA8B24022449244410182800545D5BF94 +:10A8B000411126C28324051106C622C4B5475CB9DE +:10A8C0009DCC91472A84BCA09305451C2146138545 +:10A8D00034009760FA1FE78000A61385B400114684 +:10A8E0009305C41C9760FA1FE780E0A49307200239 +:10A8F0001CA80145B2402244924441018280054592 +:10A90000D5BFA5475CB9832705119DCF411122C44E +:10A9100006C62147B8A32A84032505119305840F91 +:10A9200021460D059760FA1FE780E0A08347A40247 +:10A93000014593E747002305F402930700031CA891 +:10A94000B24022444101828005458280832705115F +:10A95000A9C3411122C406C6254758B9B8A32A8401 +:10A96000032505119305840F21460D059760FA1FF5 +:10A97000E780609C8327040AA3050402014593E74E +:10A9800007022320F40A85471CA8B2402244410153 +:10A99000828005458280A5475CB9832705119DCF3C +:10A9A000411122C406C63947B8A32A8403250511DC +:10A9B0009305840F21460D059760FA1FE780A09745 +:10A9C0008347A402014593E747002305F402930758 +:10A9D00000031CA8B24022444101828005458280C8 +:10A9E000E1475CB983270511D1C3411122C406C6D2 +:10A9F0003D47B8A3034745072A8493058506B8B3A6 +:10AA0000034755073146D8A303476507D8B3035713 +:10AA100065072183F8A30347A505F8B30357A505E8 +:10AA2000218398A70347C50598B70347D505B8A75D +:10AA300003574506B8B703476506D8A70357650609 +:10AA40001385E7002183D8B79760FA1FE780A08EAF +:10AA50008347A402014593E747002305F4029307C7 +:10AA600000041CA8B2402244410182800545828036 +:10AA7000E1475CB983270511A5CF411122C406C661 +:10AA80004147B8A3034745072A8493058506B8B311 +:10AA9000034755073146D8A303476507D8B3035783 +:10AAA00065072183F8A30347A505F8B30357A50558 +:10AAB000218398A70347C50598B70347D505B8A7CD +:10AAC00003574506B8B703476506D8A70357650679 +:10AAD0001385E7002183D8B79760FA1FE780A08528 +:10AAE000930740041CA8B2402244014541018280E2 +:10AAF00005458280411122C40324051126C24AC0A3 +:10AB000006C6930730025CB9F1473CA083470515A0 +:10AB1000832405162A893CB0834715155CA0638CF5 +:10AB2000041C032705090325C508B73700209387B0 +:10AB300047286362A71A3305A74003A7040A636F77 +:10AB4000A7183305A74037470F0013070724B3356D +:10AB5000E502922781463305E502EF30015B37C7F6 +:10AB60000300130747FC7C20637DA7161307C01260 +:10AB70003355E502819B48B021817D895D8D136548 +:10AB8000050268A07C2019469385640D93F7F703AE +:10AB90007CA083A7C40D1305D401A183C207C18380 +:10ABA0007CB0A1831CA483C7040B1CB483C7140B03 +:10ABB0003CA483C7240B3CB483C7340B5CA483A799 +:10ABC000440B13F7F7015C34819BD98F5CB403C746 +:10ABD000F40DFD8B1607D98F5CB483C744097CA4A0 +:10ABE00083C754097CB483C764091CA883C774094C +:10ABF0001CB883C784093CA883C794093CB883C7A1 +:10AC0000A4095CA803D7840893071700C207C1836F +:10AC10005CB8A1837CA8834709047CB883471904E6 +:10AC200018BC21831CAC38AC8347F90203C7440D20 +:10AC30009607D98F03C7540D1207D98F3CBC83C721 +:10AC4000C40D1387F7FF8547B397E7005CAC9750B7 +:10AC5000FA1FE780406E83C7040EB1C71307B00226 +:10AC6000A30AE9001307A00238A003C7040CA3023B +:10AC7000E40203C7140C2303E40203C7240CA30358 +:10AC8000E40203C7340CA304F4022304E40283C7E0 +:10AC9000140E2305F40283C7240EA305F40283C710 +:10ACA000340E2306F402232009168327090A3707E6 +:10ACB00000800145D98F2320F90A83470904A301A5 +:10ACC000F402834719042302F402B240224492445E +:10ACD000024941018280D4433697B1BDD4433697AF +:10ACE0008DB579473355E50293F7070C48B02181BC +:10ACF0007D895D8D79B5832445160545F9D40327F3 +:10AD000009090325C908B7370020938747286361DD +:10AD1000A7163305A74003A78409636EA71433055C +:10AD2000A74037470F0013070724B335E5029227E2 +:10AD300081463305E502EF30413D37C70300130775 +:10AD400047FC7C20637CA7121307C0123355E50231 +:10AD5000819B48B021817D895D8D1365050268A0C6 +:10AD60007C2019469385640393F7F7037CA083C77F +:10AD700064081305D4017CB083D76408A1831CA4A4 +:10AD800083C7040A1CB483C7140A3CA483C7240ADB +:10AD90003CB483C7340A5CA483A7440A13F7F701C1 +:10ADA0005C34819BD98F5CB40347F902FD8B160795 +:10ADB000D98F5CB483C7C4087CA483C7D4087CB48F +:10ADC00083C7E4081CA883C7F4081CB883C7040918 +:10ADD0003CA883C714093CB883C724095CA883D75F +:10ADE000840893D687005CB874A883460904FD17CD +:10ADF000C20774B883461904C1831CBCA18314AC78 +:10AE00003CAC83C7F4075D8F83C7540392075D8F03 +:10AE100038BC03C704088547B397E7005CAC97507C +:10AE2000FA1FE780405183A7C40AA1C31307B002E9 +:10AE3000A30AE9001307A00238A09823A302E402A2 +:10AE400098332303E402B823A303E402B8332304B2 +:10AE5000E402D823A304E402D8332305E402F82350 +:10AE6000A305E402FC332306F4022322091635BDB0 +:10AE7000D443369779BDD443369755B57947335582 +:10AE8000E50293F7070C48B021817D895D8DC1BD36 +:10AE9000411106C6AD475CB983270511130790021F +:10AEA00093057519B8A31385370029469750FA1FE3 +:10AEB000E7806048B2400145410182808325451109 +:10AEC000411126C206C622C4DC21B8310568A2079A +:10AED000D98F1387A7FF420741839306A8C7F94478 +:10AEE00063E9E60AF821D431130808C82207558F10 +:10AEF000F9446360E80A636EF7089025F43122068E +:10AF0000558E9306301F63E6C608B42583C89500A6 +:10AF1000A206B3E61601636ED806130816003308BE +:10AF2000F802939836006356180783C8B500139843 +:10AF300008011358080163840800636C07058358EF +:10AF4000A5038144639C1701631AF7008358C50366 +:10AF50006396C800663D958C93B41400231DC50408 +:10AF6000231AF506231BE506231ED5042312050725 +:10AF7000DC35D8252A84A207D98F2313F50631465C +:10AF8000B905130585069750FA1FE780C03A914727 +:10AF90005CBCB24022442685924441018280797192 +:10AFA00026D28324051106D622D44AD04ECEDD47C0 +:10AFB0005CB9638304108D47BCA02A84EF808EC7E0 +:10AFC0001309541B2AC4EF80EEC621462C002AC662 +:10AFD0004A859750FA1FE78000368347741B034762 +:10AFE000641B9309D41BA2074207BA970347841B2B +:10AFF000BA970347541B6207BA972324F40C0347FC +:10B00000A41B8347B41B4207A207BA970347C41B7C +:10B01000BA970347941B6207BA972322F40CEF8078 +:10B020006EC12AC411462C004E859750FA1FE78046 +:10B0300080308347E41B0347F41B2146A2074207E5 +:10B04000BA970347D41B9305B41A13853400BA97F3 +:10B050000347041C6207BA97232EF40C9750FA1F7B +:10B06000E780602D8347441B0347341B2146A2071A +:10B07000D98FBCB4A183DCA4CA851385D4009750B2 +:10B08000FA1FE780402B138554011146CE85975057 +:10B09000FA1FE780402A8347A402014593E747004F +:10B0A0002305F402930700021CA8B25022549254C4 +:10B0B0000259F249456182800545C5BF411122C44C +:10B0C00006C685475CB92A848345D5160327051132 +:10B0D0000345E516854693176500CD8F3CA3ED47E4 +:10B0E0003CB35C240346C41693E707025CA4EF80DC +:10B0F0007056930770061CA8B240224401454101D6 +:10B100008280832745111303000ED023B833220613 +:10B11000598E130756FE420741836363E306F42307 +:10B12000D8331168A206D98E138786EB4207418374 +:10B13000130888146366E804982783C877002207F9 +:10B1400033671701930857FEC20893D80801636953 +:10B15000130383C89700BC27A207B3E7170193889E +:10B1600087EBC20893D80801636C1801231CC51C27 +:10B17000231DD51C231EE51C231FF51C6FA09FE07B +:10B180000545828034350547AA8705456391E60A5F +:10B19000F42B31470545639CE60803A74711343378 +:10B1A000A38AD70454335023A206D18E239BD704FD +:10B1B0006C337423A205D58D239CB7041037142754 +:10B1C0002206558E239DC70434372827A206C98E30 +:10B1D000239ED704482758372207498FAA3F239F29 +:10B1E000E70401476319B500CE3F6396C500FA3FF7 +:10B1F000158F133717002391E706982B9306000449 +:10B200006300D702930640046314D700054798AB48 +:10B21000983B9546D4BF136717F898BB01458280C9 +:10B2200003C7A702136717002385E702C5B782800B +:10B2300078298947631BF70083274511BC33230A0C +:10B24000F504F5471CA9014582801D4582803C35E7 +:10B250002A87B5EB7429B54705456397F606142B85 +:10B26000930700026392F606832747110145D43302 +:10B27000D023A2064206B296F023B296B0336206FD +:10B28000B2962320D70C94379027A2064206B29696 +:10B29000B027B296F0336206B296232ED70AD4278F +:10B2A000D037A2064206B296B037FC27B296E20724 +:10B2B000B6972320F70E1C3B93E787001CBB930730 +:10B2C00030021CAB8280054582803C3585E37829BD +:10B2D0008547631BF7001429130730026396E600C5 +:10B2E0009307C0021CA981473E8582808547EDBF38 +:10B2F00074290547AA8705456399E602982B9306AA +:10B30000B0026319D7001307E00298ABA3850702C8 +:10B31000014582809306D00205456318D7001307C4 +:10B32000E002A385070298ABE5B7828078298947B8 +:10B330006319F704E947A305F50283274511394747 +:10B34000BC336390E702182993070003631BF702DD +:10B350008327050A93E707022320F50A85471CA9DE +:10B3600099A03D476391E702832785101829F59B33 +:10B370002324F510930700046315F7009307600476 +:10B380001CA90145828049476394E7021829930765 +:10B39000A004E318F7FE85471CA98347A50293E79D +:10B3A00017002305F5021C3993E707F81CB9D1BF34 +:10B3B00051476390E702182993070005E313F7FC50 +:10B3C00085471CA98327050A93E707102320F50A60 +:10B3D000D9BF5947639CE700182993075005E3122A +:10B3E000F7FA8327050A93E70720BDB76947639EED +:10B3F000E700182993075006E315F7F88327050A95 +:10B40000056713070780D98F81BF7147E38BE7F684 +:10B410007547639BE700182993075007E313F7F676 +:10B420008327050A2167C5B713073002E39BE7F4BA +:10B43000182993075008B1BF38358547631EF700B8 +:10B4400078296319F70018296316F700930760033A +:10B450001CA981473E8582808547EDBF7429054739 +:10B46000AA8705456390E606982B9306700363143C +:10B47000D70203C7A702238607049376070499C659 +:10B480001377F7FB136707012385E7021307800390 +:10B4900098AB014582809306500305456314D7029B +:10B4A0001307800398AB03C7A7022386070401454F +:10B4B0009376070481CA1377F7FB13670701238587 +:10B4C000E70282808280782999476315F70803276D +:10B4D00045113C33A307F5045C335423A207D58FF1 +:10B4E0002318F5047C3374231307A003A207D58F18 +:10B4F00014292319F5048347E5026392E604858B3A +:10B5000099CB8327050AA30505022307050293E7C4 +:10B5100007042320F50A8347A50293E717002305B4 +:10B52000F50285471CA91C3993E707F81CB9834726 +:10B53000E50293F7F7FB2307F50201458280E20756 +:10B54000E187E3D207FE8327450A93E70704232216 +:10B55000F50AD1BF05458280782989476304F70041 +:10B56000054582808327451113070004BC33A305DA +:10B57000F5021C2993F6B70F6396E6009307500473 +:10B580001CA90DA0130750056390E7028327050A45 +:10B5900093E707202320F50A85471CA91C3993E768 +:10B5A00007F81CB901458280130750066395E70030 +:10B5B0009307A006F1B713075008639BE700854780 +:10B5C0001CA98347A50293E717002305F502F9B7E5 +:10B5D000383559F7130700026386E7001307300276 +:10B5E0006395E7009307600261BF1307A007E39923 +:10B5F000E7F6930710F869B774290547AA87054548 +:10B600006391E60403A787100545418B1DCB982B5A +:10B610006317A7001307B00498AB01458280130697 +:10B62000A0046319C70003C7A70294AB13671700F0 +:10B630002385E70203A7870A1367070423A4E70A01 +:10B64000E9BF828074290547AA8705456391E60210 +:10B65000942B1307A0040545639BE60003C7A702CC +:10B6600088AB0145136717002385E702828082803B +:10B6700078298D476318F7181C398D8B89EB1429AD +:10B680002147938706FC93F7F70F6361F702D947C9 +:10B690002306F5029307A002A305F5028327850A76 +:10B6A00093E727002324F50A014582803C350326D1 +:10B6B0004511639D0712930750056398F600D9471B +:10B6C0002306F50293073002C1BFB73700209387E6 +:10B6D00087404C2203C7A70383C7B7038348651479 +:10B6E0006D8F2305E5143032F18F0546A305F5145F +:10B6F000331616016314C700230505140348751497 +:10B700008545B39505016394B700A3050514034768 +:10B71000A5148347B51455CFD1CB93752700A9C184 +:10B7200013F6270015CE930720202315F5140347A1 +:10B73000A5148547B39717016314F7002305051473 +:10B740000347B5148547B39707016314F700A305B2 +:10B75000051485476397F608930760051CA9A9B7E8 +:10B760001376470001CA13F34700630503009307EC +:10B77000404065BF058B19C713F7170001C7930732 +:10B78000101065B7094781E5114711E20547230508 +:10B79000E51413F7270009C78947A305F51441BF2E +:10B7A000918B99C39147D5BF8547C5BFB357074113 +:10B7B000858B81C72305B5149DBF9377270089C763 +:10B7C00089472305F514A5B7118B91477DFB854764 +:10B7D000CDBFB1DF33D71741058B45DFA305C514B6 +:10B7E000B9B78327850A93E707106DBD8547639630 +:10B7F000F6005C22A305F51485B78327850A93E735 +:10B8000007204DB50545828074290D47AA87054557 +:10B81000639EE612942B1307500505456398E612C4 +:10B82000B8376315071283C6471403C7571403A616 +:10B83000471133F5E6004C2209ED6395B600283236 +:10B840006309E500239507141307700598AB0145BC +:10B850008280ED8E2385D714303203C86714718F30 +:10B860000546A385E714331606016394C6002385B5 +:10B87000071403C577148545B395A5006314B70075 +:10B88000A385071483C6A71403C7B714C5CA41C745 +:10B8900093F526009DC91376270005CA13072020BB +:10B8A0002395E71483C6A71405473317070163944C +:10B8B000E6002385071483C6B71405473317A7008E +:10B8C000E394E6F8A385071441B713F6460001CACE +:10B8D000937847006385080013074040D1B7858AF5 +:10B8E00099C69376170081C61307101055BF894675 +:10B8F00081E5914611E285462385D714937627008A +:10B9000089C60947A385E71471BF118B19C3114775 +:10B91000D5BF0547C5BF33D7A640058B01C72385D3 +:10B92000B71449B713F7260009C709472385E71459 +:10B9300095BF918A1147FDFA0547CDBF25D7B3566C +:10B940000741858AC5DEA385C714A9BF8280343527 +:10B950000547AA8705456398E606F42B1547054574 +:10B960006393E606982B930650056306D70093066B +:10B970008005631AD70403C7A70283A5471113677D +:10B9800017002385E702D0211147636DC700B4314A +:10B99000636AD7001307F6FF1385F6FF718F758D65 +:10B9A000498F09C7054798AB01458280F821C83106 +:10B9B0002385C7142207498F2396E714A385D7143C +:10B9C0001307A005CDB782803C3599EF74290D4748 +:10B9D00085476399E60018296316F7009307100658 +:10B9E0001CA981473E8582808547EDBF782989471C +:10B9F000631FF70483274511B736002093868640DE +:10BA0000BC3383C5A60413F6F70113D7670083C7B9 +:10BA1000960463EAC70083468516A18A89C6B3D611 +:10BA2000E540858A9DE6E9472306F5028547B397F9 +:10BA3000E700ED8F8D8B794799C3130700028327A9 +:10BA4000850AA305E50293E727002324F50A0545A7 +:10BA500082802307E5161829A306C51685476317B4 +:10BA6000F700930760061CA9014582808327850A99 +:10BA700093E707402324F50AC5BF7829894763194E +:10BA8000F702832745111829BC332308F50285479F +:10BA90006317F700930760071CA90145828083277D +:10BAA000850A056713070780D98F2324F50AF5B7A0 +:10BAB0000545828074290947AA870545639AE602ED +:10BAC000942B1307500701456394E60203A747111F +:10BAD000A16638332388E70203A7070A558F23A0FE +:10BAE000E70A054798AB983B136707F898BB828035 +:10BAF000828074291547AA8705456391E60C942B2B +:10BB0000130750080545639BE60A03A74711343322 +:10BB1000A38AD71683064700A38FD71603065700BC +:10BB2000238DC7167823238FE71603C7271793752E +:10BB30004700ADC98946A389D71683A6070AC16500 +:10BB40006D9BCD8E23A0D70A2389E71603C747181C +:10BB50009376170085C29306F0076306D600136735 +:10BB600027002382E71803A7070AB7060200558FAC +:10BB700023A0E70A373700200347B7400145A387D2 +:10BB8000E70203C74703A38DE716054798AB03C732 +:10BB9000A702136717002385E702983B136707F88E +:10BBA00098BB8280098B5DD3D5D203A7070AC166F3 +:10BBB000A389A716558F23A0E70A49BF828074295D +:10BBC0001547AA870545639DE60883A647110145E9 +:10BBD000B0321377060F49E7373700200347574441 +:10BBE000718F3DCFF8221148238DE71683855600CB +:10BBF0000147A38FB716130517003357E640058B8F +:10BC00009378F50F0DCF238A1717D822A38AE7164A +:10BC100003C72717937647009DC68946A389D71681 +:10BC200083A6070A41666D9BD18E23A0D70A23897C +:10BC3000E71603C747030145A38DE71682802A87CD +:10BC4000E31B05FBD9B7098B6DD7E5D50547A3895C +:10BC5000E71603A7070AC166558F23A0E70AD1BFDD +:10BC6000828074291147AA870545639FE608AC378F +:10BC70000545639BA50883A6471103C83600636486 +:10BC80000503D822130510091306B7FF1376F60F24 +:10BC9000636BC500D0329306B6FF93F6F60F63646C +:10BCA000D5006371E6027947A385E7021307800296 +:10BCB0002386E70203A7870A01451367270023A409 +:10BCC000E70A828083A6C710014593F606088DCE49 +:10BCD00083C6E7186316B80293E616002387D718C1 +:10BCE0009306000AA387E7183307D702B63F334706 +:10BCF000D70283D60704850636972398E7188280F3 +:10BD0000D99A2387D7188280828083270511D5C7C7 +:10BD1000254758B95147B8A30347051D8355251D2D +:10BD20000356651DB8B30347151DCCB3D8A313D76D +:10BD30008500F8A30347451DF8B30347551D90B789 +:10BD400098A713578600B8A78346751409476384DC +:10BD5000E602032705109316470163CE06008566A9 +:10BD6000938686842E8763F3B60036874207418325 +:10BD7000D8B32183F8A38346651409476384E60298 +:10BD8000032705109316470163CE06008566938648 +:10BD90008684328763F3C60036874207418398B7AB +:10BDA0002183B8A78347A50293E747002305F5023F +:10BDB000930700051CA901458280054582808327E1 +:10BDC0000511D5CB254758B95547B8A30347051DDD +:10BDD0008355251D0356651DB8B30347151DCCB308 +:10BDE000D8A313D78500F8A30347451DF8B303472D +:10BDF000551D90B798A713578600B8A783467514AA +:10BE00000947638EE6008566938686842E8763F3F2 +:10BE1000B600368742074183D8B32183F8A383460F +:10BE200065140947638EE6008566938686843287AB +:10BE300063F3C60036874207418398B72183B8A7CA +:10BE40008347C507A305050299C78327050A93E71A +:10BE500007102320F50A8327450A139747016358E3 +:10BE600007007D771307F77FF98F2322F50A8547AF +:10BE70001CA9014582800545828078299307B0027C +:10BE80006319F71E0357051E1306A002814763734B +:10BE9000E61E4111B737002026C283A4874806C694 +:10BEA00022C44AC085476387041AD84C398B631370 +:10BEB000071A032445118147582C630D0718930670 +:10BEC000F7FF93E686FFF98E639606188345E5141F +:10BED000B687638105181429930700046393F6025B +:10BEE0008327050AA305C50293E747002320F50A27 +:10BEF000930720071CA98347A50293E71700230592 +:10BF0000F50293774700638E07148D47238EF40C58 +:10BF10003C3C2A89194613F7F7009183858B238AC5 +:10BF2000E40CA38AF40C9305D4011385640D9740A7 +:10BF3000FA1FE78040405C349583A38FF40C1C24E7 +:10BF40007830A207D98FA38EF40C7834A183238F85 +:10BF5000F40C7C2422075D8F1C28C2075D8F1C38DF +:10BF6000E207D98F23AAF4083C383828A2075D8F4E +:10BF70005C28C207D98F382423ACF4081C3422076C +:10BF80005D8F3C34C2075D8F5C24E207D98F583443 +:10BF900023A8F40A7D8B23AAE40A0347640283479B +:10BFA000540222075D8F83477402C2075D8F834767 +:10BFB0008402E207D98F23A0F40C834794022380E4 +:10BFC000F40E8347A402A380F40E8347B4022381B6 +:10BFD000F40E8347C402A381F40E5C203830A2071C +:10BFE000D98F2319F9147C205830FD8BA207D98FE3 +:10BFF0007820231AF9149376070281CA137707046D +:10C000003DE71167D98F231AF9147C285838A20705 +:10C01000D98F231BF9141C2C7838A207D98F231C25 +:10C02000F9143C2C183CA207D98F231DF91483471F +:10C03000440203473402A207D98F231EF914832731 +:10C04000090A1167D98F2320F90A930710072308DB +:10C05000F9008147B2402244924402493E854101A1 +:10C060008280098B8947E31307EA854745B57177D5 +:10C0700051BF85473E8582807829AD476318F70216 +:10C08000411106C68347E51883254511294693E7E4 +:10C0900007012307F5188D05130575199740FA1F39 +:10C0A000E7806029B24001454101828005458280D8 +:10C0B000782993073002631BF71A8356051E13076E +:10C0C000200281476375D71A4111B737002026C275 +:10C0D00083A4874806C622C44AC0854763890416DC +:10C0E000D84C398B63150716032445118147582C0A +:10C0F000630F07149306F7FF93E686FFF98E6398A4 +:10C1000006140346E514B68763030614142993073F +:10C1100000046395F6029307A002A305F5028327A6 +:10C12000050A93E747002320F50A930720071CA977 +:10C130008347A50293E717002305F502937747008D +:10C14000638E07108D47238EF40C3C3C2A891946D8 +:10C1500013F7F7009183858B238AE40CA38AF40CF0 +:10C160009305D4011385640D9740FA1FE780A01C46 +:10C170005C349583A38FF40C1C247830A207D98FEC +:10C18000A38EF40C7834A183238FF40C7C24220733 +:10C190005D8F1C28C2075D8F1C38E207D98F23AA48 +:10C1A000F4083C383828A2075D8F5C28C207D98F75 +:10C1B000382423ACF4081C3422075D8F3C34C207BA +:10C1C0005D8F5C24E207D98F583423A8F40A7D8B55 +:10C1D00023AAE40A5C203830A207D98F2319F91466 +:10C1E0007C205830FD8BA207D98F7820231AF914B0 +:10C1F0009376070281CA137707043DE71167D98F49 +:10C20000231AF9147C285838A207D98F231BF91454 +:10C210001C2C7838A207D98F231CF9143C2C183C0D +:10C22000A207D98F231DF914834744020347340220 +:10C23000A207D98F231EF9148327090A1167D98F02 +:10C240002320F90A930710072308F9008147B24019 +:10C250002244924402493E8541018280098B8947EC +:10C26000E31307EE8547C5B5717751BF85473E8516 +:10C2700082803C35E9EB411122C406C67829E147AA +:10C280002A840545631DF70A1828930700046318DC +:10C29000F70A8325441105659306A5C7D821BC314B +:10C2A00022075D8F9307A7FFC207C18363E5F608E6 +:10C2B000FC21D431130505C8A207D58F636DF5069F +:10C2C00063EBE7069025F4312206558E9306301F66 +:10C2D00063E3C606B42503C89500A206B3E60601CB +:10C2E000636BD504130516003305E5021398360079 +:10C2F0006343A80403C8B500131508014181630412 +:10C30000080063EAA702231DC4042312A406231A0B +:10C31000E406231BF406231ED404DC35D82531465D +:10C32000A207D98F2313F406B90513058406974095 +:10C33000FA1FE7804000930770041CA80145B24033 +:10C3400022444101828005458280411126C206C6F1 +:10C3500022C47829E14785446314F70483278510B4 +:10C360002A848544898B8DCF3C35639C9704EFE00C +:10C37000FFB41C28A305A40263969700930710043A +:10C380001CA831A8130700046392E7029307100466 +:10C390001CA88347A40293E717002305F4028144F5 +:10C3A000B240224426859244410182808327040AB8 +:10C3B00093E727002320F40A1C3893E707F81CB8FA +:10C3C000F9BF1C398D8B99CF9307A002A305F40206 +:10C3D000BD472306F4028327840A93E7270023241A +:10C3E000F40A75BF1C2963979700EFE03FADA305E2 +:10C3F000A40269B7130700026390E702EFE01FACE5 +:10C40000A305A402814449FD8327440A370700801D +:10C41000D98F2322F40A69B713070004E392E7F8DF +:10C420009307300265B7411126C206C622C43C35C7 +:10C430008544ADE37829A5478544631DF704832728 +:10C44000850FA18BA1CB832545112A8421468D051B +:10C45000130505109740FA1FE780E0ED83270410CD +:10C46000B73678089386060DDD8E8327441013E7D0 +:10C4700007018327840FF58F2324F4108327C40F2B +:10C48000F98F2326F4101C28639C97009307100350 +:10C490001CA88144B24022442685924441018280F6 +:10C4A0008327840A93E707012324F40ADDB74111A7 +:10C4B00026C206C622C47829A54785446316F70616 +:10C4C00018299307000385446310F7068325451157 +:10C4D0002A8421468D05130505109740FA1FE78031 +:10C4E00080E583270410B73678089386060DDD8E25 +:10C4F0008327441004A8A305040213E70701832738 +:10C50000840F8144F58F2324F4108327C40FF98FFF +:10C510002326F4108327040A93E707022320F40A52 +:10C520001C3893E707F81CB8B24022442685924491 +:10C53000410182803C3505476390E708411122C4E0 +:10C5400006C6742925472A840545639CE6041828F5 +:10C55000631DF704832544112146130504108D053E +:10C560009740FA1FE78020DD83270410B73678084C +:10C570009386060DDD8E8327441013E7070183277A +:10C58000840FF58F2324F4108327C40FF98F2326FB +:10C59000F410930710031CA81C38014593E707F813 +:10C5A0001CB8B2402244410182808327840A93E769 +:10C5B00007012324F40ACDB7054582803835854725 +:10C5C0006317F704411122C406C626C27829A14781 +:10C5D0002A8405456318F702832444111305841245 +:10C5E0001546938534009740FA1FE780C0D49C34E9 +:10C5F00098240145A207D98F2317F4121C3893E71A +:10C6000027F81CB8B240224492444101828005457B +:10C610008280383585476310F71474295D47639D20 +:10C62000E612011126CA8324451122CC21462A8410 +:10C63000938534001305B51A06CE9740FA1FE7809C +:10C6400080CFDC24B834A207D98FA309F41AA183C0 +:10C65000230AF41AEF601EDE2AC4EF60BEDD2AC68C +:10C660002C001305441C21469740FA1FE780A0CCFC +:10C67000FC34F8241305C41CA2074207BA97982873 +:10C680002C001146BA97D8346207BA972324F40CC9 +:10C69000BC38B828A2074207BA97D828BA97983862 +:10C6A0006207BA972322F40C0347541C8347641C87 +:10C6B0004207A207BA970347741CBA970347441C62 +:10C6C0006207BA972320F40C0347941C8347A41CE9 +:10C6D0004207A207BA970347B41CBA970347841CC2 +:10C6E0006207BA97232EF40AA247374703001307BD +:10C6F000D73FB387E70237A72600130737ECBA976F +:10C700003EC49740FA1FE78000C3FC28F838A20710 +:10C710004207BA97D838BA97982C6207BA97232E4F +:10C72000F40C0347E41C8347D41C4207A207BA97C2 +:10C730000347C41CBA970347F41C6207BA97232027 +:10C74000F40E930710021CA8F24062448147D244C1 +:10C750003E850561828085473E85828078299147A4 +:10C760006319F712411126C28324451106C622C45B +:10C77000B83001CB9307F7FFF98F81E79377070F65 +:10C780008DC793070002A305F50293073002230625 +:10C79000F5028327850A93E727002324F50AB24090 +:10C7A00022449244014541018280CC309306E00747 +:10C7B000814711466397D500F947F1B7B687638C77 +:10C7C000C60093861700B357F740858B93F5F60F95 +:10C7D000F5D7230AB516838744002A84ADC7A30B77 +:10C7E000F516030535143387A7001375F50F635A43 +:10C7F000F0008307941763DAE700898FA30BF41620 +:10C8000029A083078417E34AF7FE834774173E95F0 +:10C8100062056185EF70002A2301A414EF704023A4 +:10C8200083473414A301A414B307F540A30BF416F3 +:10C83000EF70402883474417034734142301A4149E +:10C84000A297A38FE716830744038306C417014703 +:10C8500063D5F600958F13F7F70F230BE416DC3042 +:10C860000547230DF4161C286396E700930760F82C +:10C870001CA835B7130750086396E700FD57230B34 +:10C88000F416EDB78327840A0967D98F2324F40AA5 +:10C8900039B7054582807829A547631AF704411105 +:10C8A00022C406C61429130700052A848547639409 +:10C8B000E602EFE01F850DE58327040AA3050402C5 +:10C8C00093E707102320F40A1C3893E707F81CB8F5 +:10C8D00085471CA88147B24022443E8541018280A1 +:10C8E0008347A40293E717002305F402F1BF8547AD +:10C8F0003E8582807829A5476309F7000545828037 +:10C900000545B240224441018280832785104111B0 +:10C9100022C406C693F707022A84FDD3EFE06FFE18 +:10C920008547E30FF5FC18286317F70093071005F8 +:10C930001CA80145F9B78327840A93E70708232435 +:10C94000F40AC5BF05458280054582800545828081 +:10C9500005458280054582800545828005458280A7 +:10C960005C25A30A0500F19B93E717005CA503254E +:10C970000511133515008280011126CAAA842849A1 +:10C980008146014681454AC806CE22CC4EC69760F4 +:10C99000FA1FE78080CF054915E9A048A1461D4947 +:10C9A0001C20BD8BBCB81830B8A86391D70283494E +:10C9B000240013D96900631B0912938719006319B6 +:10C9C000F71238308D47630BF7004549F240624457 +:10C9D0004A85D2444249B2490561828003A5040BCD +:10C9E00019469305440011059740FA1FE780A0A55A +:10C9F00069DD19469305A400138564039740FA1F67 +:10CA0000E78060A46308050EB5476397F90EEFD081 +:10CA1000EFD9EFA09FF72A8469C583A6040BD850ED +:10CA2000FC4401482324E508984EB735002093853F +:10CA3000E550232CE508D84A130585132322E5F693 +:10CA4000D83BA30FE5EEF83BF02B2207518F2310C4 +:10CA5000E5F0983F902F2207518F2311E5F0B83F62 +:10CA6000B02F2207518F2312E5F0D82FDC3F154657 +:10CA7000A207D98F2313F5F0DC2E23220501A30E84 +:10CA8000F5EE81471CC19740FA1FE780C08A8547B1 +:10CA90002300F41483C7040822852303F414A3039A +:10CAA000F414EFD04FBEB737002013878740032719 +:10CAB000070E938987401377072001CB0A241306BA +:10CAC000900293050008EF10B02283A7890D1397F9 +:10CAD0001701635807000A24514693050008EF1018 +:10CAE000302183A7C40A0D47B8B7CDB51549F9BDA4 +:10CAF0006549E9BD4949D9BD6149C9BD397152D4BA +:10CB0000373A002093074A569C4F56D206DEB73A72 +:10CB1000002022DC26DA4AD84ED65AD05ECE62CC2D +:10CB20009396070103A7CA5863C506027C5791C7AD +:10CB3000B737002005472386E7F4F2506254D254F9 +:10CB40004259B259225A925A025BF24B624C21610D +:10CB50008280B73B002093878B40A04F9307000A49 +:10CB60007CD38329C40A130A4A56938B8B4003CC87 +:10CB7000990093174C0003ACC9003E9C83472C00DE +:10CB80008DCB83C769009306204E03461C00B387F4 +:10CB9000D702938787FD11CA83C67900B386C60280 +:10CBA0001306D007B386C602B697A16614C78607D8 +:10CBB0007CD71C438D8B81C70945EF70A040373B64 +:10CBC000002083278B5537063300B7050082D857DE +:10CBD000FD15719B13671700D8D798431377F7E7B4 +:10CBE00098C398431377F7E71367071098C337374D +:10CBF00000208326075E9846518F98C603A7CA581F +:10CC00001306A00530CBD056759AD0D68346E407DC +:10CC100013F6F607944393F606F8D18E94C3834631 +:10CC2000840693F6F60313969601D457ED8ED18EB3 +:10CC3000D4D7832604096444D4C38326C40894C784 +:10CC40008327C40AB43785476399F6240329040B64 +:10CC500083C69900834719006391F62423260706AB +:10CC6000A1671CC7232A0A005C4393E717005CC333 +:10CC7000930720021CB8154798A09CB08347540323 +:10CC8000858B91E70347440389476315F7009307B2 +:10CC900050049CA019469305640313852400973023 +:10CCA000FA1FE78040698347390089C79C2093E7D2 +:10CCB00007F89CA019469305490013858400973016 +:10CCC000FA1FE780406783478901FCA483479901E5 +:10CCD000FCB48347A9019CA88347B9019CB883276A +:10CCE000490113D78700BCA8C183B8B8DCA8834624 +:10CCF000040809478D476383E6008947DCB803577A +:10CD0000C9008357A9009946BA97858313D787002E +:10CD100098BC0347E9009CAC8D83B8AC0357E9008D +:10CD20008D072183B8BC03470901D8AC034719011B +:10CD3000D8BC3E8763F3F600194793170701C183F8 +:10CD4000FCA8A183FCB883C76B1003268B55014553 +:10CD5000FCAC83C77B10FCBC83C78B102380F40220 +:10CD600083C79B10A380F40283C7AB102381F40216 +:10CD70008347C901FD8BA381F402784483C73B003C +:10CD8000834637029607D58FA301F702B7370020F5 +:10CD900083C70725B7060082FD1693F7F70313979D +:10CDA00097015C56F58FD98F5CD6103883450408FF +:10CDB000A3010A009760FA1FE780209583472A00A5 +:10CDC000858BA5CF8346040837390020832749285F +:10CDD00023010A00130949280547035B890063748E +:10CDE000D70A829737460F00AA8413060624814685 +:10CDF0001305804D3305AB028145EF100131B307B8 +:10CE0000950033B5A7002E953E878326490019E18A +:10CE100063E4D7003387D74058D0014681450545A4 +:10CE20009760FA1FE780608EEF70A01183473A0089 +:10CE3000858B81C72285EFF03FB483C7990003C774 +:10CE40004900850793F7F70FA384F90063FDE72AEC +:10CE5000B734002093874428DC27938444286387D1 +:10CE600007208327C40A130770FA37250020B8A7C4 +:10CE70001305A5CAEF70AE8EB7E700E037070002D2 +:10CE800023A2E7205DB9829737460F00AA841306D4 +:10CE9000062481461305800FB1BF5C43F99B5CC338 +:10CEA0009D47832B8C0003493C001CA89CA0854710 +:10CEB000A3810400BCA07C4893F707209DC791473D +:10CEC000BCB08347640B8346540B78449A07D58FD4 +:10CED0005CA3BC2081468507BCA00346840B834528 +:10CEE000540B0345640BEF60F0767C4893F70740E2 +:10CEF00095CBB8307C44B42013678700B8B0035793 +:10CF0000A408B697B8B3BC2078448346F4073E978C +:10CF10008357A4089206A183BD8BD58F5CA3BC2048 +:10CF20008907BCA08347040693F7070489CFB8306C +:10CF30007C44B42013670704B8B05838B697B8B328 +:10CF4000BC208507BCA08347C4070547C11793F7DA +:10CF5000F70F6364F70603CB2400B73500201546AE +:10CF600093073B00032BC4049385E5503E9BA147E8 +:10CF70002300FB0093078002A300FB0013052B0096 +:10CF80009730FA1FE780203B0347C407C14763156A +:10CF9000F70C83578408A1072311F408C547230E13 +:10CFA000F40683472408A303FB0083572408A183C6 +:10CFB0002304FB00BC20A507BCA0638C0B00BC2095 +:10CFC00068444A868D07DE853E959730FA1FE780D4 +:10CFD0008036B82001459377F70385073E9913798A +:10CFE000F90FA3082401B8A07C44A380270193076C +:10CFF00070F978443CB483A7CA58B8DB103883452D +:10D000000408A3010A009750FA1FE7800070EF6040 +:10D01000507383A7CA58096723A2070698C723023B +:10D020000A0003473A0003472C00E30807E0FC57D7 +:10D03000E38507E037250020130545DD9730FA1F0B +:10D04000E780E07403A7CA587C57FDFF014597307D +:10D05000FA1FE780C073D5B30357840883572408A9 +:10D06000998F0947E34FF7F2C94715BF37390020B9 +:10D070008327092382972A8B832709238297E30D2D +:10D0800065FF03C7590083C79900D440B387E702FF +:10D090009A24B387E7021307003293870719B3D79F +:10D0A000E702032744093E973A846364F700636408 +:10D0B000D7003304D740832709238297B307A440BE +:10D0C0006374A400C840AA9737450F0013050524D0 +:10D0D000B3B5A702922481463385A702EF10E1027F +:10D0E0002A8437D50500AD471305C5AFA303FA0061 +:10D0F0009730FA1FE780A06983A7CA582167060402 +:10D1000098C7E0D71DBC83A7C900884719ED1C2428 +:10D11000680023070100DC868327C40ADC23DC8740 +:10D12000EF509FD02385090009BC9730FA1FE78094 +:10D1300060FE03A7C90083C64900814763C5D700C5 +:10D140001C47EDF3E9B7232407008507C5BF5D71D0 +:10D15000A6C2B7340020CAC083A6C45837390020FD +:10D160000326895586C64EDE52DC56DA62D4A2C446 +:10D170005AD85ED666D26AD06ECE1307000AF8D2AD +:10D180005856B73900202A8C719B1367170058D660 +:10D19000184237053300373A00201377F7E718C2F3 +:10D1A00018421377F7E71367071018C203A7095E41 +:10D1B0000C47C98D0CC79305A005ACCA4C57054553 +:10D1C000F5994CD70347EC079375F7071842137787 +:10D1D00007F84D8F18C2D842B7050082FD15799B1C +:10D1E000D8C203478C061377F70393169701585656 +:10D1F0006D8F558F58D60327CC089305300218C67B +:10D2000003270C0958C213074A56A3010700EF6011 +:10D210009ECE832ACC041D472308EC00230FAC06C6 +:10D220002380EA000547A3810A002381EA0003273F +:10D230004C05130A4A56137707201DCB1147A381CB +:10D24000EA0003476C0B03465C0B8326CC041A07E9 +:10D25000518FD8A203C72A00814605072381EA001F +:10D2600003468C0B83455C0B03456C0BEF60903ED3 +:10D2700003274C051377074031C383C63A000327C1 +:10D28000CC0403C62A0093E68600A381DA00835605 +:10D29000AC08329734B303C72A008326CC04034674 +:10D2A000FC07BA960357AC08120621833D8B518FB9 +:10D2B000D8A203C72A0009072381EA0083C52A00F0 +:10D2C00083564C081307D00F373400200D8F1304FA +:10D2D00084406359D72083460C0809476380E620C1 +:10D2E0000546130780426385C600056713078784D8 +:10D2F000F9461307771B3347D7020346C407056572 +:10D3000013660601230EC40603A6C45808C6B30656 +:10D31000D702860634D203C63A0013660601A381FB +:10D32000CA008326CC040346EC07AE96B0B203C60F +:10D330002A008326CC04B296D8A283C62A000326EC +:10D34000CC042187369683460C089606558F58B232 +:10D3500003C72A000D072381EA0003470C06137751 +:10D36000070405C783C63A000327CC0403C62A0076 +:10D3700093E60604A381DA0083465C01329734B356 +:10D3800003C72A0005072381EA000347CC07854627 +:10D3900041171377F70F63E6E60603CB2A00B7358C +:10D3A0000020154613073B00032BCC049385E55062 +:10D3B0003A9B21472300EB0013078002A300EB00F8 +:10D3C00013052B009730FA1FE780E0F68346CC0761 +:10D3D00041476390E61203578C0821072311EC089C +:10D3E0004547230EEC0603472C08A303EB00035725 +:10D3F0002C0821832304EB0003C72A00250723817F +:10D40000EA0003564C08014B39C283C62A000325A3 +:10D41000CC0483258C0A138736003A9503C73A005B +:10D42000418B75C3795B330BDB40137BFB0F5A8653 +:10D430009730FA1FE78020F003278C0A5A97232C95 +:10D44000EC0603574C08330767412319EC0683C6E3 +:10D450002A0037550500814513F7F60305073A9B67 +:10D46000137BFB0FA3086C012381DA000327CC0494 +:10D470001305E555856BA3006701130770F9832633 +:10D48000CC04A305EC0003A7C458916A130DA005B2 +:10D4900034DBEF602EF203461C0183450C08014586 +:10D4A0001D4B9750FA1FE7804026938A0A29EF60A8 +:10D4B0005029938D8B840347C407418B21EFB640DD +:10D4C000264496440649F259625AD25A425BB25BEC +:10D4D000225C925C025DF24D6161828011671307EC +:10D4E000072939B50347C4071377F70E230EE4065F +:10D4F000ADB583568C0803572C08158F8946E3C4B5 +:10D50000E6EE4947F9BD9730FA1FE780C0E2034BCA +:10D510004C0835BF0347C4071377070265DF03478D +:10D52000C40783A5C458832689551377F70C230EA7 +:10D53000E4069307000AFCD1D856B7073300719B65 +:10D5400013671700D8D698421377F7E798C2984226 +:10D550001377F7E71367071098C203A7095E104710 +:10D560005D8E10C723A8A5055057759A50D703475D +:10D57000EC071376F7079842137707F8518F98C294 +:10D58000832CCC0423086C01854623806C01A38185 +:10D590000C002381DC0083264C0593F6064085CEE3 +:10D5A000A146A381DC008326CC040356AC08D0A29C +:10D5B00083C62C000326CC048345FC07369683568D +:10D5C000AC089205A182BD8ACD8E54A283C62C00E0 +:10D5D00089062381DC0003C52C0083562C07130623 +:10D5E000E00F098E6353D60803460C088945D6869A +:10D5F0006308B6008545930680426303B600EE8655 +:10D600001386761BF9463346D6028345C40793E555 +:10D610000501230EB40683A5C45823A47501B306DF +:10D62000D6028606B4D183C53C0093E50501A381EB +:10D63000BC008326CC048345EC07AA96ACB283C514 +:10D640002C008326CC04AE96D0A283C62C00832562 +:10D65000CC042186B69583460C089606D18ED4B1AB +:10D6600083C62C008D062381DC0003562C078146DF +:10D6700031C683C82C0003C83C000325CC04938624 +:10D68000380013780801369583258C076307080650 +:10D69000F956B386164193F6F60F368636C697309E +:10D6A000FA1FE78040C903268C07B2463696232C22 +:10D6B000CC0603562C07158E2319CC0683C52C00E7 +:10D6C000014513F6F5030506B29693F6F60FA30887 +:10D6D000DC002381BC000327CC0414B303461C01E7 +:10D6E00083450C08130770F9A305EC00A3010A0099 +:10D6F0009750FA1FE78060017DBB9730FA1FE780E3 +:10D7000080C383462C0723190C064DBF8347C507EA +:10D710006381073E011122CC06CE26CA4AC84EC6F6 +:10D7200052C449472A84639CE7020357250883575C +:10D7300085086316F7029304050AB73500201546DD +:10D740009385E55026859730FA1FE780C0BE268571 +:10D75000EFA08FCC9147A300A408230EF4062285E6 +:10D760009740FA1FE78060070945EF60B00503277F +:10D77000C40A373900208347C4078326092363047A +:10D7800007200D476399E70C9147230EF4067C4868 +:10D7900093E787007CC8B73700209387874003C78B +:10D7A000D707098B6DDF03C7D7071377C70FA38E82 +:10D7B000E7068296B73700209387472896270357B6 +:10D7C0006408232AA408DC433307D70293060032F7 +:10D7D000130707193357D702B306E500368663E40B +:10D7E000A60063E4F6003386F640B736002083C611 +:10D7F0003625232CC408636DD604158E37D5050055 +:10D800009306D407A2851305C570EF507EC9B737BC +:10D81000002037D50500938747562D471305C5AF20 +:10D82000F8B39730FA1FE78080F6B737002083A758 +:10D83000C7580947F8D783578408F240D244850770 +:10D840002314F40862444249B249224A05618280A5 +:10D85000958F3E9665B783298409B7340020829658 +:10D860009384442863E6A904B737002083C737258B +:10D870003385A94063E5A700854763EEA702835778 +:10D8800064089A24B387E7021307003293870719C5 +:10D89000D040B3D7E702032784093E97BA86636472 +:10D8A000F7006364C700B306C740232CD40861B7F0 +:10D8B000DC40BE9955BF8326C40ACC40A384060031 +:10D8C00092248357640803278409B387C702130689 +:10D8D0000032232AE40893870719B3D7C7023E977B +:10D8E0003A866364F7006364B7003306B740DC240C +:10D8F000232CC4088DC3930770FA37250020BCA6DB +:10D900001305A5CAEF60AEE5B7E700E037070002F0 +:10D9100023A2E7200DB7832709238297AA898327AB +:10D9200009238297E38DA9FE8327092383294409CC +:10D93000829763E7A904B73700202D47938747569E +:10D94000F8B3B7470F00938707243385A940B33551 +:10D95000F502922481463305F502EF00017BB737CB +:10D96000002083A7C7582167060598C7E8D737D591 +:10D9700005001305C5AF9730FA1FE78040E165BD8C +:10D98000DC40BE994DBF0D47639CE7089147230ECD +:10D99000F4067C4893E787007CC8B737002093875C +:10D9A000874003C7D707098B6DDF03C7D7071377F6 +:10D9B000C70FA38EE7068296B737002093874728C4 +:10D9C000962703576408232AA408DC433307D702A9 +:10D9D00093060032130707193357D702B306E50041 +:10D9E000368663E4A60063E4F6003386F640B73675 +:10D9F000002083C63625232CC4086360D602158E0A +:10DA000037D505009306D407A2851305C570EF50DE +:10DA10003EA92285EFF0AFF339BD958F3E96CDB785 +:10DA20008296AA84832709238297E38DA4FE832705 +:10DA3000092383298409B7340020829793844428DA +:10DA400063E2A902B737002083C737253385A94091 +:10DA500083D9840063E3A70009E983576408B38787 +:10DA600037031DB5DC40BE99F1BF373900201307DD +:10DA700089408347D7074E86814693E71700A30E58 +:10DA8000F70637470F0013070724B335E502B7370A +:10DA9000002003AAC758A1672324FA003305E50232 +:10DAA000EF00A16606052326AA06130789408347CF +:10DAB000D707898BEDDF8347D707D04093F7C70F90 +:10DAC000A30EF7068357640813070032B3873703A2 +:10DAD00093870719B3D7E702032784093E97BA86CD +:10DAE0006364F7006364C700B306C740232CD408FF +:10DAF0000DB78280411126C2AA84284922C4138608 +:10DB000015002E848146814506C69750FA1FE7808E +:10DB1000C0B751E1BC481D461D459423BD8AB4B829 +:10DB20009833B8A8639DC604B4230D4513D6660088 +:10DB300093F6F60363F5E604154531E27D17158F7C +:10DB400058B0B83345459376270095EA9376470059 +:10DB500085EE91079306F00F34A093768700514528 +:10DB600099EE93760701554599EA93760702594550 +:10DB700099E61377070409CF9C231CA00145B24006 +:10DB80002244924441018280D42395078D8AE9B7CB +:10DB90009307F007DDB70545DDB7B7D70500373781 +:10DBA00000209387C7702320F74882800145828038 +:10DBB000411106C6EF907FDDB24013351500060512 +:10DBC000410182806FF0DFFE411106C6EF90FFDB5E +:10DBD00005C10357C5058356A5050356650783553B +:10DBE00045070A25EFC050540145B24041018280EB +:10DBF0000945E5BF011106CE22CCEF901FD925CDF6 +:10DC00003035B737002005472A8493878740631251 +:10DC1000E604F853094515CB03460403834657042D +:10DC20008358E4030358C4033E3C0E240345B40266 +:10DC30001307670432C00546EFC0304D7C34A3059E +:10DC40000402014593E717007CB4F2406244056189 +:10DC5000828003A7470909456DDB83465707835830 +:10DC6000E4030358C4033E3C0E240345B4021307E7 +:10DC7000670702C0D1B70945C9BF397106DE22DC8A +:10DC800026DAEF909FD079C93835B73700202A843B +:10DC9000938787402DEBE4530945ADC01946814574 +:10DCA00008109720FA1FE780A06F194681452810B9 +:10DCB0009720FA1FE780C06EC167FD178358A40341 +:10DCC00083C6540430340E240345B4023EC89C2459 +:10DCD00013088102138764043EC6834704033EC4CD +:10DCE0007E3C3EC25E3C3EC01C10EFC0F0467C3421 +:10DCF000A3050402014593E717007CB4F250625477 +:10DD0000D2542161828083A407080945E5D81946C9 +:10DD1000814508109720FA1FE780806819468145E1 +:10DD200028109720FA1FE780A06783D7240D835817 +:10DD3000A40383C6540530340E240345B4023EC800 +:10DD40009307F00F3EC602C47E3C1308810213877E +:10DD500064053EC25E3C3EC01C1041BF094579BF10 +:10DD6000397106DE22DC26DA4AD8EF901FC2630F33 +:10DD700005143435B737002005472A849387874038 +:10DD8000639AE60AE4530945C1C083C744041946AF +:10DD9000898BC9C38C58BC25B5CFB10528089720FD +:10DDA000FA1FE780405983C7540413896404194655 +:10DDB000898BA5CBCA8508109720FA1FE780A0574A +:10DDC0008C581946910528109720FA1FE780A05615 +:10DDD000834704038358A40383C6540430340E24B9 +:10DDE0000345B4023EC47E3C1308010238103EC213 +:10DDF0005E3C3EC03C08EFC0B0337C34A305040257 +:10DE0000014593E717007CB4F2506254D254425952 +:10DE100021618280814528089720FA1FE7804058B9 +:10DE200059B7814508109720FA1FE78060571946B7 +:10DE3000CA8551BF83A447090945F9D483C744065D +:10DE40001946898BB9CF9385640628089720FA1F55 +:10DE5000E780604E83C74407138964071946898B9E +:10DE6000A1CBCA8508109720FA1FE780C04C83A574 +:10DE700044081946281091059720FA1FE780A04B07 +:10DE800083A74408BC3393E72700A38AF40683588A +:10DE9000A40383C6540730340E240345B40202C4DD +:10DEA00099B7814528089720FA1FE780604F5DB732 +:10DEB000081081459720FA1FE780804E1946CA85D1 +:10DEC00028109720FA1FE7800047D1B709452DBFDA +:10DED000797122D426D206D6AA84EF901FABB73729 +:10DEE000002003A48748894721C11DCC83572515ED +:10DEF00019469305640D7C8685477C878357440DBE +:10DF000013052101A3040100FC8064859720FA1FFA +:10DF1000E78060428327C40D28003ECC8327040E8F +:10DF20003ECEEFC0302A8147B250225492543E85F3 +:10DF300045618280011122CC06CE2A84EF90FFA495 +:10DF40003DC18347B502034745176083DC828347A1 +:10DF50003517D8845C8495EF8347751703079517A9 +:10DF60005C86830735145C85631CF7008947DC8574 +:10DF70004800EFC010250145F240624405618280EF +:10DF8000030785176314F7008547D5B7A30501007C +:10DF9000C5B78347A5175C8583475517DC8583473D +:10DFA000F5175C86F1B70945C1BF011122CC06CE39 +:10DFB0002A84EF909F9D21C98307A517C0842180E3 +:10DFC00040851307F007638DE70203474503998FE8 +:10DFD000DC858347451813F7070101C723060100B5 +:10DFE00031A093F7070299CB85475C862800EFC0E4 +:10DFF000301D0145F2406244056182808947F5B7D2 +:10E00000FD57DC85E1BF0945F5B7797122D426D2E9 +:10E0100006D6AA84EF907F97B737002003A48748DD +:10E0200089470DCD05CC8357251519469305640DF9 +:10E03000FC808547FC818357440D13056101A306CD +:10E040000100FC8264879720FA1FE780C02E832797 +:10E05000C40D68003ECEEFC070168147B250225406 +:10E0600092543E8545618280411106C6EF90FF9132 +:10E0700011C9834505140A25EFC010140145B240AB +:10E08000410182800945E5BF9375F50F01112E8589 +:10E0900006CE22CC2EC6EF70CF9305C12A848346CC +:10E0A0000507B24568390546EFC090100145A30B3E +:10E0B0000400F2406244056182800945DDBF4111E0 +:10E0C00006C6EFC0B00EB240014541018280411149 +:10E0D000B737002022C403A4874826C206C6894455 +:10E0E0000DC00355240D8144EFC0100C0325C40C52 +:10E0F0009307F00F2319F40C09C59720FA1FE78046 +:10E100006001B24022442685924441018280B737A3 +:10E11000002083A7874899CB41111385070D06C6B8 +:10E12000EFC01008B240014541018280094582805C +:10E13000411106C622C4EF905F8505C98346751458 +:10E14000034665142A840E250345B5028506050697 +:10E1500093F6F60F1376F60FEFC070020145A30594 +:10E160000402B2402244410182800945DDBF4111D1 +:10E1700006C6EF909F8105C10357251E8356051ED5 +:10E180000356651E8355451E0A25EFC0207A0145BA +:10E19000B240410182800945E5BF411106C622C453 +:10E1A000EF90AFFE15C52A840357C5058356A50514 +:10E1B00003566507835545070A25EFC0A0761C382E +:10E1C000014593E747001CB8B240224441018280D8 +:10E1D0000945DDBF411106C6EF902FFB05C18347FE +:10E1E000451B0346351B9305B51A0A25A2075D8E0C +:10E1F000EFC000730145B240410182800945E5BF8F +:10E20000411106C622C4EF904FF805C12A841306B7 +:10E2100005100E250345B502EFC040700145A3056A +:10E220000402B2402244410182800945DDBF411110 +:10E2300006C622C4EF906FF505C52A840357C505AD +:10E240008356A505035685050E250345B502EFC087 +:10E25000A06C0145A3050402B24022444101828022 +:10E260000945DDBF01111375F50F06CEEF607FF68E +:10E2700029C9B737002083A7874E93F707209DC38E +:10E2800002C402C202C08148014881470147814659 +:10E29000054681451305C003EFC080690145F24082 +:10E2A000056182808346D5031307E50302C08148D8 +:10E2B00001488147054681451305C003EFC0E0646E +:10E2C000F1BF0945E9BFB73700209387874003A70F +:10E2D0004709094529CB83A7070E011106CE93F7FD +:10E2E00007208DC302C402C202C081480148814791 +:10E2F0000147814601468145EFC08063F2400145F8 +:10E3000005618280835807020358A70183570705D8 +:10E3100083465707014602C0130767078145094531 +:10E32000EFC0A05EE1BF828001458280014582800E +:10E3300001458280014582800145828001458280BD +:10E3400001458280014582800145828001458280AD +:10E35000014582800145828001458280014582809D +:10E36000014582800145828001458280014582808D +:10E370000145828001458280411106C622C41821D0 +:10E38000930700086313F70218319306C00285470C +:10E3900063E1E606B7E706000A079387C77DBA97E9 +:10E3A0009C432A2182978147A9A09306100885479C +:10E3B0006311D7041831CD466301D70E63E2E6023C +:10E3C000A146630AD708B1466308D70A9546631287 +:10E3D000D7022A21EF906FDB2A8415E9894711A81B +:10E3E000930600036306D70E63EAE600E946630777 +:10E3F000D70CB24022443E854101828093077005CC +:10E400006304F70E930717F0B337F000DDB78327E7 +:10E4100085118DC7035645040506420641829C437B +:10E4200013071600420741838DE72312C40419C65F +:10E430000E240545EFC0404C231204040345B402EA +:10E44000034644050E24EFC0E0492285EF902FC417 +:10E4500099BF3A86E9B72A21EF902FD32A843DDD70 +:10E460000346C5040E250345B5023336C000EFC090 +:10E47000A047A305040205BF2A21EF900FD12A84EB +:10E4800031DD03572505835605050346F5040E25A2 +:10E490000345B502EFC08045E9BF2A21EF90EFCEDA +:10E4A0002A840DDD0356450419C60E250545EFC027 +:10E4B000A04423120404A3080402F5B52A21EF9016 +:10E4C000CFCCE30D05F00345B502EFC02043E1BD1D +:10E4D0002A21EF908FCB2A84E30205F00E25034515 +:10E4E000B502EFC0E04171B72A21EFC0A04165BD80 +:10E4F000011122CC26CA4AC806CE374402402EC695 +:10E5000032C48324C4202A89232604200F1000004B +:10E5100011459720FA1FE78040D20DC5B24522462B +:10E52000231125010CA110B123269420B737002018 +:10E530006244F240D2444249AA8503C5F71E0561F0 +:10E540006F405ED523269420F2406244D244424973 +:10E55000114505618280411126C24AC006C622C407 +:10E56000B744024003A9C42023A604200F100000D2 +:10E57000EF90AFC111E923A624210945B2402244FE +:10E58000924402494101828083270512230D050030 +:10E590002A84A9CF7835058B11EF0A24014693050B +:10E5A0000008EFF0FFF431C5B747024023A627214A +:10E5B0000145E9B7D443D0278C270A258906EFC047 +:10E5C000803415E183270412BA27A3840700136758 +:10E5D00007F0BAA79C432320F4128357240481C771 +:10E5E000FD172311F40483270412C5FB231104042F +:10E5F00065BF85473CAC4DBFB737002083A7474D6B +:10E6000091E382806384A700DC5FDDBF411122C4F7 +:10E6100006C63C252A8491C79305C5006905EF50BD +:10E620008FA63C2891CB930544011305A4022244F4 +:10E63000B24041016F502FA5B24022444101828077 +:10E64000AA862E86AA8537E50500130525656F5035 +:10E650002EABB7370020138787400327C70C411123 +:10E6600026C206C622C49384874011E7B2402244E2 +:10E670009244410182806304A700585FFDB73C25A6 +:10E680002A8491C79305C5006905EF50CF9F3C28A8 +:10E6900099C7930544011305A402EF50CF9E22852C +:10E6A0002244CC58B240924441016FF07FF90111ED +:10E6B0004AC8373900209307894022CC03A4C70CED +:10E6C00026CA4EC652C456C206CEAA84014A1309AF +:10E6D000894093094500854A65E093052025130587 +:10E6E00000049720FA1FE780E0952A841D4545CC59 +:10E6F000BC30194693854400130544003CB0972074 +:10E70000FA1FE78040C3938AA4014146814556859C +:10E710009720FA1FE780C0DA79E19309A401D68532 +:10E7200041464E859720FA1FE78060D685473CA476 +:10E730003C309305C4004E8593E727003CB4EF506E +:10E740008F949384A4024146814526859720FA1F21 +:10E75000E78000D741E99307A402A6853E8541469C +:10E76000BE849720FA1FE78080D285473CA83C30C2 +:10E7700093054401268593E727003CB8EF50AF90FE +:10E78000A3000400832549032285EFF07FEB631E7D +:10E790000A042326890C232E04028347890C014591 +:10E7A00085072304F90CF2406244D2444249B2493D +:10E7B000224A924A056182803830BC306305F700F6 +:10E7C000228A405C11BF4146CE8513054400972044 +:10E7D000FA1FE78040C7E31555FF4945E9B7230510 +:10E7E000040085B72309040061BF232E8A0265B7A0 +:10E7F000011126CAB73400209387844022CC03A499 +:10E80000C70C4AC806CE4EC6938484407D5901EC9D +:10E81000F240624423A6040C2384040C4249D244EF +:10E82000B249056182800820EF508EA78329C40376 +:10E830002300240122859720FA1FE780A08D4E84B3 +:10E84000F9B7B7370020938787402384070C23A6A6 +:10E85000070C6F504F8C41114AC037390020930785 +:10E86000894026C283A4070822C406C683C7D404ED +:10E8700013048940858BB1C73C2049458DCFB735FE +:10E88000002019469385654F1385E4049720FA1FED +:10E89000E78060AA8547BCB49CB8BCB8BC280947CF +:10E8A00098A4C9CBEF409E8C3C4C85C79307004091 +:10E8B00063EFA7001D45B240224492440249410142 +:10E8C0008280B735002019469385054F75BF130523 +:10E8D00005C08357440B81CF373700201307C72368 +:10E8E0001E2B7837B387E702E3F6A7FC1D8D8D4713 +:10E8F0003354F502EF40DE90A28763738500AA8748 +:10E900009183C207C1832391F404CDD79207139555 +:10E91000070141819305E0249710FA1FE780807278 +:10E9200003D62404E8C02A871308F6FF814763C989 +:10E93000C704A8C4B737002003C704029386C71EC4 +:10E94000A8328D461384C71E6318D704F228BE3838 +:10E950003E969145EF50AE8628309145EF40BEC7B8 +:10E96000923C19CA37150600938614031206A68531 +:10E9700013052592EF40DEF823040940014525BF29 +:10E9800063D9070193060701B6850CC3850736874F +:10E9900079BFBA868145D5BF89476314F700B2387D +:10E9A0004DBFF2287DB741119305E0261305800E77 +:10E9B00022C406C69710FA1FE780C0682A842DC9B2 +:10E9C0001306800E81459720FA1FE780609DB737B8 +:10E9D000002023A48748B737002023050400230420 +:10E9E0000400938747569853DC5378D83CDCFD5796 +:10E9F0001EB8A30EF406A300F408B7F7050093872A +:10EA000067853CD4B7070600938707597CD4B707BE +:10EA100006009387A7433CD8B737002083C7072950 +:10EA200081EBB737002003A587548D45EF508E98B2 +:10EA30002285B240224441018280411122C406C68F +:10EA400026C28347C5052A84A5C79305E50519464F +:10EA50001305E5049720FA1FE780E09EAA8429E9C0 +:10EA60001C28898BA5E3B737002083C7974085CF43 +:10EA70008347D4058DCB834734061307000493F7EF +:10EA8000070C6392E7021305C4059730FA1FE7806D +:10EA9000E06768D009C98947230EF4048347D4048A +:10EAA00093E7270089A80347C40589476316F70041 +:10EAB00083474405A1E78544B24022442685924419 +:10EAC000410182808347D405E5DB83473406130781 +:10EAD000000493F7070CE391E7FEB737002083C7E4 +:10EAE0009740F9D71305C4059730FA1FE7800062F5 +:10EAF00068D0F9574DF1A30EF4045DBFB73700207D +:10EB000083C79740CDDB8347540513054405A9CB44 +:10EB10008347B4051307000493F7070C6392E704D7 +:10EB20009730FA1FE780005B68D051D593046405E5 +:10EB3000A685194651059710FA1FE780C07F6C50D3 +:10EB40008D47230AF404BC311946910593E7270049 +:10EB5000A30AF40426859710FA1FE780C07DA1BFA1 +:10EB60009730FA1FE780405268D031D58947230A91 +:10EB7000F4043C29A9D38D47230AF4040431B334A7 +:10EB800090001DBF034745051DC31829AA870545E9 +:10EB9000058B05C3E84BAC4F411106C69730FA1FF1 +:10EBA000E7806072B2403335A000410182800545A4 +:10EBB00082808280797122D406D63C292A84BDC302 +:10EBC0000357050483572504637EF7049730FA1F23 +:10EBD000E780405785476307F5000145B25022544E +:10EBE000456182805C341D4728446394E700834775 +:10EBF00084025CA1834754051946930564055CB102 +:10EC00008347940219057CA13E341EA59710FA1F74 +:10EC1000E78060728357040485072310F4043C44A2 +:10EC20009C433CC45C4C483413970701635B070C5E +:10EC300019476367A7027C2493065002E3EFF6F8B6 +:10EC400059E54D472304E4027D57A304E402231F42 +:10EC50000402A30604020547631EE5082307040215 +:10EC6000034EE4020143630B0E000343E40033034D +:10EC7000C34193072300032384073E93834E8402FA +:10EC80008346C4021AC813950E01850693FE4E00F2 +:10EC900072C613066405418193F6F60F0347D4024A +:10ECA0008347940203083402035FE4038345540559 +:10ECB0008308540163840E041303E4051AC4034358 +:10ECC000D4051AC27AC0EFB0D04B054501BF8546C6 +:10ECD0006314D5005547BDB789466314D500414735 +:10ECE00095B791466314D5006D47A9BFE31EE5F4BF +:10ECF000494789BFE9172307F4029DB702C402C23E +:10ED0000D1B785476316F5043737002003278748B6 +:10ED10001306640583455405182B83075401098B9A +:10ED200015C38346D40599CE034734061305000462 +:10ED30001377070C6318A7001307E4050545EFB028 +:10ED4000D04361B7014781460545EFB0B03CB5BF40 +:10ED5000742493075002E3E2D7E889476307F5007C +:10ED600099476315F500094511A00D45E91693F67D +:10ED7000F60F2307D402014799C2385C21078307A5 +:10ED800054011306640583455405C1B7411106C6F5 +:10ED900022C426C2AA84EF50C01A930700FABCA46A +:10EDA000B737002003C5F71EA14537340020EF40D8 +:10EDB0007EC8F62813070064834784403347D70290 +:10EDC000850793F7F70F2304F44063C6E700EF507D +:10EDD000AE9923040440B24022449244410182800F +:10EDE000411122C406C6B1475CA57C590D472A844F +:10EDF00098A35C25785993F7F7031CB38347D50490 +:10EE000023060504898BA1C383474505898BA1C7C8 +:10EE10006C5189ED6C50BC299DCB68581946D105C1 +:10EE200021059710FA1FE780005115A0BC25FDD3DE +:10EE300089472306F50468591946B1050905971055 +:10EE4000FA1FE780404F83474405898BE1F78347EA +:10EE5000C404898B91EB685819469305E4040905AD +:10EE60009710FA1FE780204D034744058D47630B39 +:10EE7000F700685819469305640521059710FA1F95 +:10EE8000E780604B8347D404858B91E70347C40434 +:10EE900089476317F70078581C2393E707041CA3DE +:10EEA00083475405858B91E7034744058D476317D6 +:10EEB000F70078581C2393E707F81CA358349D47A4 +:10EEC0004C24631CF70003455402930760FA3CA4EA +:10EED0002244B24041016F4030520347140293076D +:10EEE00020FA3CA489470945E304F7FE0145CDB764 +:10EEF0004111B737002026C293844756A3800400EF +:10EF000023820756B73700204AC083C70725373901 +:10EF100000200326895506C622C493F7F7031397EA +:10EF200097015C56B7060082FD16F58FD98F5CD627 +:10EF30002A84EFF0FFEAB737002083A7C758785834 +:10EF4000B70680002285B8DB832789559843558F03 +:10EF500098C3D857719BD8D7EFF0DFC59730FA1F09 +:10EF6000E78000709C30858B89CBA3800400B24081 +:10EF700022449244024941018280930700FA3CA452 +:10EF8000FDB7797122D4130655012A84285D814684 +:10EF9000814506D69730FA1FE780206F631E052053 +:10EFA000032884079D461D45034708003D8B58B440 +:10EFB000834718007CA46318D71A034728000D451F +:10EFC000935667001377F703637FF7181545639C23 +:10EFD00006189388F7FFB388E84093F8F80F2307E3 +:10EFE000140383453800454593F63500639D0616A6 +:10EFF00093F6450063910612130648007D17937639 +:10F00000F70F13F7850015CB1832034E94025145C4 +:10F010001353470063196E140565130505F02207A5 +:10F02000698F08220353A402498F5145631DE312DF +:10F030001387E6FF09069376F70FC189BDC518222D +:10F040001377F7032302E4022C220967130707F062 +:10F05000A205F98D1832D98DC205C1851397050116 +:10F0600041837AB095CD8305060063DA050A9305DE +:10F07000C0123307B7028345540205456393A50ABE +:10F08000AD078A07B307F740938547ED1305405155 +:10F0900003478402637BB50A136707042304E40271 +:10F0A0001387D6FF0D069376F70F8347380059452F +:10F0B00013F707024DEB93F7070481CB1C2213874C +:10F0C000F6FF9376F70FA301F4026145C9EE0346FC +:10F0D000E4027C24385C8346C402918F8907BA9786 +:10F0E0003EC87E3C03458402830854013EC00308A9 +:10F0F0003402834794020347D402834554058506AE +:10F1000032C602C402C293F6F60F13066405EFB0CE +:10F110005007014589A8130658007917CDB5F94560 +:10F1200089BF09456391A502B735002083C5F5560F +:10F1300089078E0789C59387770D8607A1B79387BF +:10F14000A7048E0781B7A907EDBF4E3CAE98B7352F +:10F15000002083D5854463DC15011367070423046D +:10F16000E40213050002B250225445618280B73593 +:10F170000020231E140383A8C55813670702230425 +:10F18000E40203A5C80079777D17698F23A6E800FC +:10F190000100010003A7C5588965930800F80CC752 +:10F1A000B735002093854556938757ED2382150187 +:10F1B00086077CD348C7EDB5054575B75D71B73790 +:10F1C0000020A2C403A48748A6C25ED6F974B73B48 +:10F1D0000020CAC04EDE52DC56DA5AD862D486C647 +:10F1E00037390020FD148969138C4B56130A00F837 +:10F1F000B73A0020373B00208327C958F8537DFFDA +:10F20000D44733F79600D8C7010001000327C95837 +:10F2100093072059B70533002324370123024C01FB +:10F220007CD354C78347840223820B56A3020C006D +:10F2300093F7F7F92304F402A3000C0085471CC3DD +:10F2400083A78A55944393F6F6E794C3944393F6C1 +:10F25000F6E793E6061094C383260B5E90464D8E28 +:10F2600090C61306900530CBD856759BD8D6034769 +:10F2700044029376F7079843137707F8558F98C39E +:10F280009730FA1FE780C03DEF40B04B83C74B5625 +:10F29000858B99C7228523820B56EFF09FCE31C50F +:10F2A000930700FA3CA4034584028346C402830802 +:10F2B00054011375F5F9136505042304A40203082A +:10F2C0003402834794020347D4028345540502C89D +:10F2D00002C602C402C2723C850693F6F60F32C023 +:10F2E00013066405EFB0E06909A883478402130799 +:10F2F000000293F70706638EE700B6402644964463 +:10F300000649F259625AD25A425BB25B225C616191 +:10F31000828038249307500AE300F7EE69B75971E9 +:10F32000A2D4130655012A84285D8146814586D6DC +:10F33000A6D2CAD0CECED2CCD6CADAC8DEC6E2C4F5 +:10F34000E6C2EAC06EDE9730FA1FE7800034054758 +:10F3500059ED032A84071D461307000883460A0057 +:10F36000BD8A54B483471A007CA46392C6088344C0 +:10F370002A000D4793DA64002304540393F4F40342 +:10F3800063F7F406138714006356F70089461547A0 +:10F39000638FDA04FD17858F2307F40283473A0051 +:10F3A00013094A00858B9DE7FD1483473A0093F4C7 +:10F3B000F40F898BC5CB0347C4053C5C6307072466 +:10F3C00089469C236318D706E207E18763C90706CD +:10F3D000494731A883474405130564058DCB194679 +:10F3E000CA859710FA1FE7800006454721E1B6500D +:10F3F000265496540659F649664AD64A464BB64BA9 +:10F40000264C964C064DF25D3A85656182808547B3 +:10F41000230AF40483470A001946CA859987858B15 +:10F42000A30AF4049710FA1FE780E0F01309AA007A +:10F43000E514A5BF0347D4059D83E31BF7F81946E0 +:10F44000CA851305E4059710FA1FE780C0FF49D16C +:10F4500083478402E914190993E7470093F4F40FF2 +:10F460002304F4022285EFF04FDD214749D1834682 +:10F470003A0093F7460089C7FD14050993F4F40F89 +:10F4800093F7860095CB8347190083459402514733 +:10F4900013D64700E39DC5F40567130707F0A207DD +:10F4A000F98F03470900D98F3A346303F7003EB45C +:10F4B000F914090993F4F40F93F70601A1CB55470A +:10F4C000E3970AF2834709000967130707F093F7E8 +:10F4D000F7032302F40283472900A207F98F0347A9 +:10F4E0001900D98F7EB003070900635507006177C3 +:10F4F000D98F7EB07E30F5140D0993F4F40F99C7BF +:10F500008347840293E707022304F40293F606027A +:10F51000638F06425947E39C0AEC4946CA8568084E +:10F520009710FA1FE78020E1BC8709477EBC5C4C3E +:10F53000B98B6394E70283472408858B6384071C97 +:10F54000B737002083A94749130B6405854B639E99 +:10F55000090C8347C407639A0712B914490993F445 +:10F56000F40F83473A0093F7070489CB83470900D8 +:10F57000FD140509A301F40293F4F40FBDCC1306A6 +:10F580002003A5450545094803471900834709009D +:10F59000631AC7046398B7040347C4076314A70436 +:10F5A0008346390003472900A206D98E0347490044 +:10F5B0004207D98E034759006207558F2320E40C78 +:10F5C000034769002300E40E03477900A300E40E1B +:10F5D000034789002301E40E03479900230E040723 +:10F5E000A301E40E63FB97001387170093C7F7FF8F +:10F5F000BE9493F4F40F3A99C1F82285EFF08FD8B6 +:10F6000085476309F5340147DDB30547230EE4045C +:10F610009C231946CA859D83A30EF4041305E405B3 +:10F620009710FA1FE78020D125B503C7490083470B +:10F6300094026316F70C8347540503C75900858B62 +:10F64000631FF70A1946DA85138569009710FA1FB8 +:10F65000E78060DF6315750B83479402A308040CF1 +:10F660002319740D230AF40C834754051946DA85CF +:10F67000A30AF40C1305640D9710FA1FE780A0CBC2 +:10F6800085472320040E230EF40692571305040B1E +:10F6900013D757001D8BA30FE40C0347540213D656 +:10F6A0008700FD8B0507230EE40C7A3C232AF40A1D +:10F6B000A30EE40C2183230FE40C22579316870139 +:10F6C0002183232CE4080357C102D18E232AD408B6 +:10F6D0002314E40802572328E40AEF80EFD383477A +:10F6E000D101A307A408096513F70702F2497D15A4 +:10F6F00031EBB3F9A9007945B389A90285A083A9A3 +:10F700000900B1B50347440D83479402E313F7E4BE +:10F71000834754050347540D858BE31CF7E21946D4 +:10F72000930564051305640D9710FA1FE780A0D1B7 +:10F730008547E310F5E2A308040C2319A40C232049 +:10F74000040E91B7B3F9A90093F707041305C0128B +:10F75000B389A90281C7B7872500BE990347540220 +:10F7600089467C246316D71A373700200347F7569B +:10F7700089078E07630A07189387770D8607B38971 +:10F78000F940B7074B00138749ED938777DAE3E633 +:10F79000E7DC373C0020930B4C2803D58B00374621 +:10F7A0000F008146B33535031306062423000408F1 +:10F7B00033053503EFE0701583274C282A8B2EC6BE +:10F7C0008297B245B307650133B5A7002E953E87F2 +:10F7D00083A64B00130C4C2819E163E4D700338750 +:10F7E000D740B737002083A707232320E40AB74D6B +:10F7F0000F0082971307204EB3CBE902B7370020E2 +:10F8000023A8A7540355AC00938D0D24B7370020CF +:10F810001305451F03CB3725035D8C0081468145C9 +:10F820006A8633C5AD02B38CEB02B3DCAC023305A0 +:10F83000BB03135B1B00EFE0500DB3077D03930B7D +:10F8400000321307204E66956A8681468145B3F7DC +:10F850007703B387E702B3C7A703C207C183B30B1C +:10F86000F5003305BB03EFE0500A5E95637A350B74 +:10F870002326740BDA890325C40A032B040A3746AE +:10F880000F00B335AD021306062481463305AD02E1 +:10F89000EFE0B0076365AB0A3305AB402322A40A4F +:10F8A0000345D4079307F00F6304F500EF404E9F24 +:10F8B0000326440AB737002003A587496365360944 +:10F8C0008327C40D03578C0033063641A183C2073A +:10F8D000C183B387E702130700329306D407A285DA +:10F8E0009387071933D7E702EF309EBB0347D4074E +:10F8F0009307F00FE303F7C6FD572319F4085C4C98 +:10F9000093E747005CCC91B99387A7048E0785BD28 +:10F9100085466315D700AD078A0795B5A907FDB7DA +:10F9200037153D006A868146130505908145EFE055 +:10F93000C07D3385A9402326A40A8D492DBF832786 +:10F940004C003E9B91BF83274C003E9695BF231FE2 +:10F95000040201B98947639CFA007C34858B81CB12 +:10F960008347440589C71C38D5CFFD171CB8EF4025 +:10F97000405D2285EFF00FA48347840293F70702CE +:10F98000E38307C87E30F945139707014187635623 +:10F990000700CE07CD839305C01203475402894662 +:10F9A000B385B7027C24631AD70837370020034792 +:10F9B000F75689078E073DCB9387770D139617006F +:10F9C000B387C540B7064B00138647ED938686DAAA +:10F9D00013071002E3EDC6A013070064E365F7C246 +:10F9E000B736002083A5C65879777D17D045718F2B +:10F9F000D8C50100010003A7C6588966930500F821 +:10FA000014C7B736002093864656938757EDCCA28D +:10FA100086077CD350C7930750FA3CA48347E4027F +:10FA20005EBCD5B62285EFF0AFCCF1BE9387A704BC +:10FA300093963700B387D54071B785466318D700D2 +:10FA4000AD0713972700B387E540ADBFA9078E0721 +:10FA5000B387F54085BFB737002083A7874839466D +:10FA600093050008D84F0145459BD8CF13074004A4 +:10FA7000A388E70C6FE0DFA7411122C413065501EC +:10FA80002A84285D8146814506C626C29730FA1F22 +:10FA9000E780A0BF85472DE1245C1D469307000841 +:10FAA0009420BD8A54B4983078A46397C6048347E1 +:10FAB000840293E787002304F402BC2093D66700F6 +:10FAC00013F6F70395478DEA930616008D4763D525 +:10FAD000E6027D17118F2307E402BC3093854400B2 +:10FAE000858B9DCB834644050D479C206397E6128A +:10FAF00093F7070481EBC547B240224492443E8508 +:10FB0000410182806850194651059710FA1FE7801D +:10FB100080939385A40065D1B830C94793762700B8 +:10FB2000E1FE230E040493764700CD47F1F6937669 +:10FB30000702D947F1F29377870085C39C31856628 +:10FB4000938606F0A207F58F94218905D58F3EB4E0 +:10FB500083C7F5FF9183A304F402418B3DC79C2129 +:10FB60000967130707F093F7F7032302F402BC2198 +:10FB7000A207F98F9831D98FC207C1877EB003875A +:10FB800005006356070A1307C0128346540209464C +:10FB9000B387E70278246392C60AB736002083C68B +:10FBA000F65609070E07D1C61307770D0607998F7A +:10FBB000138747ED9306405163F9E60883478402B3 +:10FBC00093E707042304F4028D05BC3093F7070480 +:10FBD00081C79C21A301F402830744016347F00A13 +:10FBE00085475CA82C380545EF40EEB008B8228563 +:10FBF000EFE05FFC05478147E310E5F0034784022F +:10FC00009306000213770706E318D7EE130750FA9E +:10FC100038A40347E4025ABCC5B503475405998785 +:10FC2000858BE31AF7EC194613056405F9BD79478E +:10FC3000A9BF1307A7040E079DBF05466395C6001D +:10FC40002D070A07ADB72907FDB7B736002003A572 +:10FC5000C65879777D175045718F58C5010001004E +:10FC600003A7C6588966130500F814C7B7360020E5 +:10FC700093864656938757EDC8A286077CD350C714 +:10FC80008347840293E7070235BF3C38858399C3D5 +:10FC90003CB889BF8547EDBF011126CAB7340020A3 +:10FCA00003A7045E22CC4AC84EC606CE5C5737393D +:10FCB0000020B7390020F59B5CD70327895583477F +:10FCC000450237340020014693F6F7071C4393059D +:10FCD000F00F93F707F8D58F1CC3B7C7898E9387AA +:10FCE00067ED1CC7B7575500938757555CC303A7EB +:10FCF000C9585C4393E717005CC3930710FA3CA50F +:10FD0000034555022302045613044456EF402003D2 +:10FD100083A6C958A302040003278955A300040041 +:10FD200085479CC21C433706330093F7F7E71CC393 +:10FD30001C4393F7F7E793E707101CC303A7045E80 +:10FD4000F24062441C47D2444249D18F1CC79307FA +:10FD50009005BCCAB24905618280411106C622C421 +:10FD6000FD572308F502834715022A842301F50273 +:10FD7000A147A300F5023545EF40C0242285EFF0EE +:10FD8000BFF1373700200326C758F977FD175446CF +:10FD9000F58F5CC6010001008327C7580967130669 +:10FDA00000F898C7373700201307475650A3056758 +:10FDB000130727D1F8D3D4C7930740FA3CA4B24025 +:10FDC000224441018280011122CC130655012A846C +:10FDD000285D8146814506CE26CA4AC84EC652C411 +:10FDE0009730FA1FE780608A63170542032A840769 +:10FDF0009306F00703470A003D8B58B483471A0067 +:10FE0000A301D402230A040493F7F7037CA4230E6E +:10FE100004049D46631FD732584C9316170163CED6 +:10FE2000063E03492A009374F90313871400638C78 +:10FE3000E7008D44F240624426854249D244B249EB +:10FE4000224A0561828013596900230424038347F1 +:10FE50003A0093094A0013F717004DE3FD14834756 +:10FE60003A0093F4F40F13F7270021C7E31309FCBA +:10FE7000C18B91C7034714028947E30CF7FA854702 +:10FE8000230EF4043C5CCE8519469C231305E4053F +:10FE9000E9149D83A30EF4049700FA1FE780A0499C +:10FEA00083478402990993F4F40F93E747002304EE +:10FEB000F40203473A0093774700639407361376BA +:10FEC00087003DCA83C719008566938606F0A2079E +:10FED000F58F83C60900F9148909D58F3EB483C70D +:10FEE000F9FF93F4F40F9183A304F402FD57230167 +:10FEF000F402418B6DC729E6D5442DBF6311093249 +:10FF0000C18B91C7034714028947630AF7308547BD +:10FF1000230AF40483470A00CE8519469987858B06 +:10FF2000A30AF404130564059700FA1FE780A040B4 +:10FF30009309AA00E51425B7FD57A304F4027DB781 +:10FF4000EF40200083C709000967130707F093F704 +:10FF5000F7032302F40283C72900A207F98F03C71E +:10FF60001900D98F7EB003870900635507006177B8 +:10FF7000D98F7EB083C7290009479583A302F40275 +:10FF8000E36CF7F6F5148D0993F4F40F83473A0008 +:10FF900013F707026319072813F7070419CFC18B5A +:10FFA00091C70347140289476301F72883C70900F3 +:10FFB000FD1493F4F40FA301F402639A042663037F +:10FFC000090283473A00C18B8DEBEF309077E31540 +:10FFD00009F2230704022285EFE0DFBD31BFA3064B +:10FFE00004026DB72285EFE05FA519E1A14499B540 +:10FFF0002285EFE03FB971F5D5BF03471402894769 +:0200000260009C +:100000006313F70089448347540272302306940235 +:100010008507A306F40293170601C18763DF070073 +:100020004E064D829307C01285463306F6027C24A5 +:100030006317D700A9078E0729A8F947F5B73737FF +:1000400000200347F75689078E0779C79387770DF6 +:1000500086071D8EB7074B00130746ED938787DA97 +:1000600063E9E71C9307005063EBC70AB73700202A +:1000700083A5C75879777D17D445758FD8C50100FA +:10008000010003A7C7588965373900200CC713053D +:1000900000F893054956130656EDC8A1060670D31D +:1000A00054C793094956BE847C53FDFF834714020D +:1000B00022852301F402A147A300F402EFF0DFBD83 +:1000C00083A6C458F977FD17D846F98FDCC601001E +:1000D000010083A7C45889669304000294C793065D +:1000E00000F82382D9009306A05BF4D3D8C79720E9 +:1000F000FA1FE780E05683474956858BE38C07D289 +:100100002285624423020956F240D2444249B24950 +:10011000224A05616FF0AFA09387A70429BF034768 +:1001200004039307F00F93041002E315F7D093072D +:1001300010271306F6D83356F60237050600930645 +:100140000403A2851305A5D59304F007EF304EFBF9 +:10015000D5B1894663F7E600994693040008E31B8E +:10016000D7CCE91793F7F70F7D4793040008E363B3 +:10017000F7CC8547230AF40483470A001946930500 +:100180002A009987858BA30AF40413056405970058 +:10019000FA1FE780401A5C34230E0404054763917C +:1001A000E7022C5C230EF40419469C211305E40598 +:1001B000A1059D83A30EF4049700FA1FE780A01702 +:1001C0002285EFE09F878547AA84E311F5E2228527 +:1001D000EFE05F9BE31C95E05C3481C71947639CAB +:1001E000E7007C34858B81CB8347440589C71C3865 +:1001F00091CFFD171CB8EF30D05458349147994433 +:10020000E30AF7C22285EFE0FF9A2DB12285EFE0E5 +:100210003FCE814405B1854431B99D4421B9C544DF +:1002200011B9CD4401B9D94431B1DD4421B1E14422 +:1002300011B193041002FDBE411122C413065501F1 +:100240002A84285D8146814506C69720FA1FE780EB +:10025000C04359ED2C5C7D470D459C31230E0404B1 +:1002600093F7F7037CA4E91793F7F70F6363F7029B +:100270009C2111471D45BD8B5CB4639CE700834600 +:1002800044050D479C216393E60493F7070491E727 +:100290004545B24022444101828068501946890593 +:1002A00051059700FA1FE780001A7DD183074401AA +:1002B0006349F00285475CA82C380545EF30BEC382 +:1002C00008B82285EFE01F8F0145E1B703475405C9 +:1002D0009987858BE31EF7FA19468905130564058E +:1002E000C9B73C38858399C33CB8F9B78547EDBF9A +:1002F000054545B7011152C4373A002022CC06CE3D +:1003000026CA4AC84EC693074A56FC3315471304FB +:100310004A566306F7007C300D47631FF7001C3414 +:1003200081E7930760101EA4F2406244D244424920 +:10033000B249224A05618280B737002083A48748EA +:10034000373900207C308327C9580967194523A213 +:10035000070698C723020400B7390020EF30904603 +:1003600003A78955B7C7898E938767ED1CC7B75711 +:100370005500938757555CC383C724021307F00FBA +:100380006387E700A380F402FD572381F40203C5CD +:10039000140289476303F50001450327C958014644 +:1003A0009305F00F5C4393E717005CC3930710FAC3 +:1003B000BCA499477CB023020A56EF305018373757 +:1003C00000208326075EDC56F59BDCD69C3403A612 +:1003D0008955BA8493F6F7071C4293F707F8D58F2F +:1003E0001CC2B737002083C7072989CBB737002045 +:1003F00003A587549700FA1FE780603903A7895542 +:10040000B70633001C4393F7F7E71CC31C4393F76D +:10041000F7E793E707101CC303A7045E1C47D58FBB +:100420001CC78327C95813079005B8CBA302040043 +:10043000A3000400054798C3C5BD4111B73700208C +:1004400022C403A4874806C626C283471402214754 +:10045000638FE70AB736002013874656783319466C +:10046000138546566315E60A894410346396970A45 +:10047000930770026307F61093075002930560021A +:100480006304F60093057002B737002083A78755F1 +:100490000CB43737002090433708CEFF7D18137611 +:1004A000F6E71366060890C30327075E1047337606 +:1004B000060110C7373600200326C6582328060435 +:1004C0002382065623020500A3020500A3000500AF +:1004D000854614C294433705330093F6F6E794C378 +:1004E000944393F6F6E793E6061094C31447C98E37 +:1004F00014C79306900534CA5457F59A54D79843B5 +:10050000137707F84D8F98C3930710FA3CA4B240B5 +:10051000224492444101828093077002630CF602E8 +:1005200093075002130760026304F600130770027A +:10053000B737002083A6075E18B4DC56F59BDCD6DF +:10054000B737002083A687559C4293F707F8D98FC9 +:100550009CC25DBF83470402898B85C7B7370020E3 +:10056000723803C5F71EA145EF306EC593075002E0 +:10057000A30094021CB42244B240924441016FF0A3 +:100580007FD722852244B240924441016FE01F8010 +:10059000B73700209387874003A7870A2DE33737B3 +:1005A00000201307475674332946630AD60478336C +:1005B000AD466386E604411122C403A4070806C6BB +:1005C00037370020834704020345F71E13F717004F +:1005D00011C78547A300F402322C39A0898BF5DBC3 +:1005E00072388947A300F402A145EF304EBD93074E +:1005F00050021CB42244B24041016FF0BFCF828050 +:100600000111B737002022CC03A4874826CA4AC864 +:100610004EC652C456C25AC006CE930A200A930947 +:10062000100A1309600A130B400A130A500AB73460 +:1006300000203C246392570D373700200326C7580B +:10064000F977FD175446F58F5CC60F10000083271D +:10065000C758B7340020096798C7130600F81387F6 +:10066000445650A33737002003268755184231835C +:100670000D8B31EF13076019F8D3D4C79720FA1FF9 +:10068000E78000FE83C74456858B85C723820456C6 +:10069000EF30300B2285EFF03FBA01CD83074401E4 +:1006A00063C30704FD575CA82C380545EF30BE84B2 +:1006B00008B81C24638807146244F240D2444249BB +:1006C000B249224A924A024B05616FF0BFC21842FA +:1006D000094631830D8B6315C7001307E04369BFDB +:1006E0001307E01B51BF3C38860793F7F70F99C3F8 +:1006F0003CB85DBFFD57EDBF639F370183C74456CC +:10070000858BC5DB228523820456EFF0CFEB3C249A +:10071000E39137F379BF639C270B3737002003261B +:10072000C758F977FD175446F58F5CC60F100000C7 +:100730008327C758B7340020096798C7130600F805 +:100740001387445650A33737002003268755184295 +:1007500031830D8B21EB13076019F8D3D4C7972091 +:10076000FA1FE780E0EF83C74456858B89CB23824D +:100770000456EF30007D2285EFF00FB001CD8307E6 +:10078000440163CD0702FD575CA82C380545EF30C6 +:100790008EF608B838249307500AE31CF7F0EFE010 +:1007A000FFA101BF1842094631830D8B6315C700B5 +:1007B0001307E0435DB71307E01B45B73C388607D6 +:1007C00093F7F70F99C33CB8C9B7FD57EDBF6398CE +:1007D00067039720FA1FE780A0E883C74456858BFC +:1007E00091C7228523820456EFE07FB33C246394B3 +:1007F0004701EFE0BF9C3C24E38D27E35DBDE38A26 +:1008000047FF45BDB737002083C7072999CF62440A +:10081000F240D2444249B249224A924A024B01452F +:1008200005611703FA1F670083F6F2406244D24461 +:100830004249B249224A924A024B056182804111E3 +:100840004AC0B747024006C622C426C203A9C72031 +:1008500023A607200F100000B73700201387475644 +:1008600018379387475619C7942709476394E600BA +:10087000A3840700F833A1466386E600F8339D465B +:100880006396E600F83398A7054798B7EF30606B9A +:10089000B737002003A48748B73400209384C41ED0 +:1008A000684023150400230404009700FA1FE78022 +:1008B0006086A830914523100404232204042324D5 +:1008C0000404EF302E97A830A145EF30AE960345D3 +:1008D00014039307F00F6307F500EF306E9CFD578C +:1008E000A308F402034504039307F00F6307F50020 +:1008F000EF300E9BFD572308F402B737002083C763 +:10090000072991C701459700FA1FE78040E8B240E8 +:100910002244B747024023A62721924402494101BD +:100920008280411106C6FD57A308F502454693058E +:1009300000080145EFD0DFBBB24041016FF03FF04E +:10094000B737002083C7F71E411106C689EB37353C +:1009500005001305A55DEF304EB8EF203FD8B7F77F +:100960000500373700209387679A2326F748B2405F +:10097000B707060037370020938707602324F75412 +:100980004101828001114EC606CE22CC26CA4AC839 +:10099000EF702F91AA8935C5EF603FFF2A8463036A +:1009A0000512930710113EA5930700FB7CA537396C +:1009B000002085471CA99307C9239E2B13074010CD +:1009C0001309C923A5073E85C207C1836374F700D5 +:1009D0001305401013170501418393070004637446 +:1009E000F70013050004420593053025418197F077 +:1009F000F91FE78020652328A41001ED0A24EF7079 +:100A0000CF98F24062444E85D2444249B2490561D2 +:100A10008280B737002083A78758B734002093849B +:100A20008440232AF41083A7C40D03A7840D2285D4 +:100A3000232EF40E2326F410BE3C232CE40E232494 +:100A4000E4102312F41483C7A40423130414A3048E +:100A5000F416FD572310F4047EB01EB48347E4025D +:100A600093E707FC2307F4028567938787BB231569 +:100A7000F404EF508FF7034549012301A414EF203C +:100A8000307DD147A303F41893078002A302F41822 +:100A90009307006F231CF4169307F007230DF41639 +:100AA000F5779387A7EBA301A4142300A418A30050 +:100AB000A4182301A418A301A418231EF416239438 +:100AC000040081B7854935BF01114AC83739002074 +:100AD0009307894006CE22CC26CA4EC652C42A8429 +:100AE000A83383450403373A0020A307A402EF305C +:100AF0002EB8130A4A2803588A003E3C9306003257 +:100B0000B73900203307F802232AA40813098940C3 +:100B10003356D7023377D7029306204E2326C408D4 +:100B200037460F00130606243307D702B387D702D0 +:100B300033470703B3D7A7021AB01387C923642B1F +:100B40009389C923BE941E3C9384C417C2048507AD +:100B5000B387D702C180814623129408858FB3B52D +:100B6000070333850703EFD0405A83278408832681 +:100B70004A00AA9733B5A7002E9501E53E8763E4A6 +:100B8000D7003387D740834774032328E40813072B +:100B9000204EB387E70286042285BE942311940871 +:100BA000EF50CFAD2285EF506FDF6E3C228592056E +:100BB000F915C205C181EF50AFA82285EF70CF8A29 +:100BC000B737002083A747532324890A898B91CF05 +:100BD00083A7490399CB832584093545829783A749 +:100BE00049038325C4093945829722856244231726 +:100BF000090023280900F240D2444249B249224A5E +:100C000005616F505FC5035705088946835745083E +:100C100063F3E6000947B397E7002313F5086F3045 +:100C2000AEB4011122CC26CA4AC806CE4EC652C462 +:100C3000834765032A84373900208507230BF50293 +:100C40003C39B7340020639E075A5C251307000423 +:100C500038B91839BD9B93E737005CA59317870116 +:100C6000A30D0500E18763D807001377F70718B9CC +:100C7000EFB01FCF39A88327850A93F62700BDC29E +:100C8000F59B2324F50A83270510918BA9CBEF90C0 +:100C90000FFE383C8547631DF704832784115824D1 +:100CA000DC4398A3832784115838DC4398B3032787 +:100CB00084118327C9585843B8DB83A78455B706E6 +:100CC00080009843558F98C3D857719BD8D7F2406E +:100CD0006244D2444249B249224A05618280EF907F +:100CE0000FF745BF93F617008DC2F99B2324F50A31 +:100CF00083270411582498A383270411583898B3E4 +:100D00008327C9580327041145BF83490501054AB4 +:100D10006394491FF9C713F7070119C7BD9B232423 +:100D2000F50AEF90BFC2B5B713F7070201CB93F7EF +:100D3000F7FD2324F50AEF90BFD3A1BF13F70704F3 +:100D400001CB93F7F7FB2324F50AEF90EFF691B769 +:100D500013F7070809CB93F7F7F72324F50A228541 +:100D6000EFB0EF853DB713F7072009CB93F7F7DF17 +:100D70002324F50A2285EF908FFD21BF13F707404A +:100D800001CB93F7F7BF2324F50AEFA02FB311B7D8 +:100D900013974701635C07007D771307F77FF98F8F +:100DA0002324F50A2285EF90BF92E5B5139737010A +:100DB000635A07007D777D17F98F2324F50AEF909A +:100DC0009F93C1BD13972701635A070079777D1759 +:100DD000F98F2324F50AEF909F9F65BD2324050A10 +:100DE00001BF8327450A6389073893F6070481CA40 +:100DF00093F7F7FB2322F50AEF902FDF59BD93F607 +:100E0000071081CA93F7F7EF2322F50AEF90BFB8D6 +:100E100049B593F6072099CA4D8B631B071093F7CA +:100E2000F7DF2322F50AEF90BFBBA5B593F6074085 +:100E300081CA93F7F7BF2322F50AEF906FE591BDC2 +:100E40009396470163DB06007D771307F77FF98FE1 +:100E50002322F50AEFA07FEB2DBD9396370163DCCB +:100E600006004D8B71E77D777D17F98F2322F50AF8 +:100E7000EF90EFE539BD13971701635A07007177BB +:100E80007D17F98F2322F50AEF90AFFE19B513975E +:100E9000F700635A070041777D17F98F2322F50A7F +:100EA000EF905FC5FDB31397E700635A0700017722 +:100EB0007D17F98F2322F50AEF908FFFD9BB139787 +:100EC000B700635B07003707F0FF7D17F98F232218 +:100ED000F50AEF90BF8875BB13978700635B070027 +:100EE000370780FF7D17F98F2322F50AEF905FFA0D +:100EF0004DB32322050AEDBB638C090293066004FF +:100F000063EF36071307500463F0E9161307A002D6 +:100F10006381E91E63673703930710026387F91A39 +:100F200063EA3701ED47638EF914F5476381F916DB +:100F300022853DBB930750026386F91E930770021A +:100F4000F5B7130760036380E916636B37019307F6 +:100F5000E0026389F91E93071003E384F9DCC9BF3B +:100F6000130700046384E90A93071004638FF90AE6 +:100F700093078003E39EF9FAEFB09F9E15A29307B3 +:100F80006006638BF92663EE37039307500563848D +:100F9000F91E63EB37019307B004638BF91C9307C9 +:100FA0001005E38EF9DA69B7930780056385F91CAC +:100FB0009307A0056389F91C93076005E39AF9F686 +:100FC00055BB9307200763E837039307100763F2C5 +:100FD000F920938969F993F9F90F054AE36A3AF51B +:100FE000EFB01F988327040A056713070780D98F7E +:100FF0002320F40A21A493076007E385F9DA930715 +:101000006008E397F9F2EF908FFC05A8139747016A +:10101000E35007F27D771307F77FF98F2324F50A52 +:10102000EF900FEB23083401ADB18347B50285C7BC +:1010300005476397E700EF90BFA385471CA891B9C8 +:1010400083270510918BD5C3BD472306F402228563 +:10105000EF90EFC1DDB7EFB0BF908327040A93E7AD +:1010600027002320F40AD1BFEFB09F8F8327040A03 +:10107000230844012311040693E747002320F40AC0 +:1010800009B9EF902FAAD947230AF40419B1228590 +:10109000EFB01F8D8327040A93E717002320F40A7B +:1010A00023080400FDB69700FA1FE78000A2E302C0 +:1010B00005BE8547A306F4042285EF904FB1834710 +:1010C000C404F99B2306F404E9B683278510858BB5 +:1010D00081C7EF90EFFD75BEE947A305F5028327B1 +:1010E0000510918B99C38D478DB72285EF902FB650 +:1010F000A9B7EF90CFA58347D40491CB4146930580 +:10110000C40A1305C40C97F0F91FE780C022834777 +:10111000C4042326040E2328040E93E71700230695 +:10112000F40485BE83270510918B91CB8D47230650 +:10113000F502EF90CFB31C38DD9B1CB8FDBDEF90DE +:101140000FB1D5BF8347C5042322050E2324050E06 +:1011500093E727002306F504EF902FA11C38A30581 +:101160000402DD9B1CB88327040A93E70701D5BD61 +:10117000EF908FB4D9B522859700FA1FE780E094ED +:10118000E30905B075B38346A51499CA03466514EF +:101190008547B397C7006385D7001367070118B960 +:1011A0000347B41401CF834674148547B397D7001F +:1011B0006386E7001C3893E707011CB87C2C91CFAD +:1011C0001C38C18B99EB8327040A93E7072023205F +:1011D000F40A2285EFB0CFF88DB58307B417F5DB9D +:1011E00083274410898BF5D78327440A37071000DB +:1011F000D98F2322F40AF1BFEF905FEC230844015A +:1012000049BCB7370020938787409A2B05079AABD4 +:1012100049B48347E518858B6382071083476513BC +:1012200093D63700AA9683C5061313F7770033D6F3 +:10123000E540058A69CE397122DC06DE26DA4AD815 +:101240004ED652D456D25AD05ECE62CC66CA2A84CA +:10125000034545037D57FD47591562052C006185FF +:101260003AC43EC69710FA1FE780C059032684137C +:1012700022478326C413B247718FF58F6314E600AB +:101280006387F6062800EF603F99894763F1A70658 +:10129000294681451305741997F0F91FE78040101E +:1012A000224AB24A81490D4C854C930B50029394CB +:1012B0008901E1844E865285D68513DB2440EFC038 +:1012C000505F8D88229B0589860403097B190DCD0B +:1012D000B3949C00B3649900A30B9B188509E39811 +:1012E00079FD8347E41893E787002307F418F25049 +:1012F0006254D2544259B259225A925A025BF24B6A +:10130000624CD24C21618280B3149C00E1B78547C6 +:10131000B397E700CD8F2388F612828082805D71BB +:10132000A6C2B7340020938784405AD837EB060012 +:10133000A2C44EDE52DC56DA03A4470AB7390020B5 +:10134000373A0020B73A002093070B73CAC05ED625 +:1013500086C662D466D26AD06ECE814B93848440B6 +:1013600013894956130A4A28938ACA233EC67C2405 +:101370001307000D6391E71E373C00208327CC58EC +:1013800098430D8B05C737370020230607F4B84B69 +:10139000619BB8CB98431367870098C39C438D83A8 +:1013A000858B89C701000100010001008347CA0045 +:1013B00089E79700FA1FE78000998347C404858B6B +:1013C00099C7A28505459710FA1FE7800012834749 +:1013D0002414B73C002083A68C5593F7F70313978A +:1013E0009701DC56370600827D16F18FD98FDCD647 +:1013F000832784090327CC589CC68327C409DCC2F1 +:101400005C4393E717005CC38355041E0356241EF8 +:10141000034574149105930710FDC2057CA4C18196 +:10142000930700FC2382F956EF20701103457414D2 +:10143000054766868357240883566408631FE508BA +:101440008325CC58860693875703B697D44579777A +:101450007D17758FD8C5010001000327CC58896519 +:1014600086070CC7930500F82302B9007CD354C744 +:10147000B737002083A6075EDC56F59BDCD6032732 +:1014800086558347641313F6F7071C4393F707F851 +:10149000D18F1CC38347C4040326CC58858BD1CB82 +:1014A0001C4393F7F7E71CC31C4393F7F7E793E755 +:1014B00007101CC39C4637073300D98F9CC693077F +:1014C00090073CCAA3020900A300090085471CC27B +:1014D0009710FA1FE780C01859BD7977094886062A +:1014E0008325CC587D1763160503C845698FD8C579 +:1014F000010001000327CC588965938797180CC712 +:10150000930500F82302B900B69786077CD348C735 +:1015100085B7C845698FD8C5010001000327CC589D +:101520008965938797040CC7930500F82302B900D7 +:10153000E1BF1C4393F7F7E71CC31C4393F7F7E79E +:1015400093E707101CC39C4637073300D98F9CC60E +:1015500093079005BDB71307100D6392E75483C737 +:101560004956858B6384074883C74956E207E1875C +:1015700063DB070C7C3493F707028DC33E3C1307F3 +:10158000204EB387E70203274409B3D7E70203C716 +:101590006A0113070705BA972312F408B73700202A +:1015A00083A78755035D440809479C43832DC901E0 +:1015B000832CC408B1838D8B035B8A00032C4A0003 +:1015C00013059D186384E70013059D04B325650387 +:1015D00037460F008146130606243305AB02EFC0E1 +:1015E000D0323385AC40B306B501B68763E4A600BC +:1015F00063E48601B38786418326040963E3F61416 +:1016000003566408035724089D8E931516002E97E1 +:1016100033076703B7450F001385F523938505242A +:101620002A973357B70263E6E6003307EC4063744A +:10163000D7002328F4089357160063E6A711231355 +:10164000F408231004088345C404032544119306B9 +:1016500024031306440385899710FA1FE780E002EC +:101660008347440303C764042303A900998F230A13 +:10167000F40283476900858B639007288347A4029F +:1016800093E727002305F40283C74956E207E18761 +:1016900063D307028347641313D7370093F67700A9 +:1016A00022978547B397D7008346071393C7F7FF61 +:1016B000F58F2308F7127C34898BCDC72285EF4044 +:1016C0005FB34DE17C34A309040093E747007CB489 +:1016D000832784118DCB383C1DC79837058B05E7D0 +:1016E000BA27C843136707F0BAA797F0F91FE78036 +:1016F00060A28357440485072312F40483278411CE +:101700009C43232CF4105C3881CB8347C404898B21 +:1017100081C72285EF403FB21C2813072002639740 +:10172000E7028327040AA305040293E78700232026 +:10173000F40A1C3893E787001CB8930740021CA8E2 +:1017400015A0E29675BD2313A409E5BD1307000695 +:10175000639BE70A85471CA88347A40293E7170009 +:101760002305F40283476900898BFDC38347C404C2 +:10177000858BF9CF1C3C85071CBC7C3413F72700F4 +:1017800015EF93E727007CB4930700F85CAC3E3C70 +:101790001307204EB387E70203274409B3D7E702B4 +:1017A00003C76A0113070705BA97C207C18323124B +:1017B000F40886072311F40823A4040A228523824F +:1017C0000956EFF00FC60345641489474C38631C73 +:1017D000F51203458414910513652500EF20C041DF +:1017E0005C386387071C8347C404898B6382071CAA +:1017F000A28501459710FA1FE780E0C7630705102F +:10180000EF202074A5AC130770066399E702B73781 +:10181000002003A78755230509007C53ED9B7CD34B +:10182000372702408347870493F7D70F2304F70431 +:101830005C2493F7F7FD5CA4854711B77147E393E8 +:10184000E7F28327040A93E717002320F40A19BF5D +:101850002285EF403F9C15F1A30C04002285EF4048 +:101860009F961C38A18B8DCB7C289DC77C3809475F +:1018700093F7B70F6382E7029307D003230AF404B8 +:10188000930770021CA88347C404858BE38707EE87 +:101890002285EF405F9FD5B55C340D476391E70427 +:1018A0007C381307A0026372F7027C381D476385FA +:1018B000E702A306F4028327840A228593E7170030 +:1018C0002324F40AEF803FAC01A832478A0722851F +:1018D000BA979C43829771F97C28D5F779BD91CB53 +:1018E0007C28E38C07E8228597F0F91FE780802D9C +:1018F000AA8BE3940BE8CDB71C2C85071CACFE2407 +:101900008507FEA49DBD9105D1BDB737002003A773 +:101910008755B70633001C4393F7F7E71CC31C43F6 +:1019200093F7F7E793E707101CC3B737002003A727 +:10193000075E1C47D58F1CC7B737002083A7C75841 +:101940001307A007B8CBB737002083A78755B70682 +:1019500080009843558F98C3D857719BD8D7930769 +:1019600020FD7CA48347CA00E39407B683270412B2 +:10197000E38007B67834058BE30C07B4D443D02753 +:101980008C270A248906EF801078E31305B4832797 +:101990000412BA27136707F0BAA79C432320F41256 +:1019A00083572404E38607B2FD172311F4040DB610 +:1019B000B737002003A78755B70633001C4393F7BA +:1019C000F7E71CC31C4393F7F7E793E707101CC323 +:1019D000B737002003A7075E1C47D58F1CC7B73752 +:1019E000002083A7C7581307A005A9BFB737002059 +:1019F00083A7C758FC53E39C0796EF20805483C706 +:101A000049562285E207E18763D2071EEFF0AF9FB8 +:101A1000BE2822858507BEA8EFF0AFFF83570404D8 +:101A2000B1CF13074006B3F7E702A9EBB7370020A1 +:101A300083A74753898B9DCF373900201309C923CA +:101A40000327490305CB9E28AE282545C207DD8D17 +:101A5000029783274903EE24294582978327490368 +:101A6000831524032D458297832749038305440367 +:101A7000314582972397040023A804002285264439 +:101A8000B64096440649F259625AD25A425BB25B5A +:101A9000225C925C025DF24D61616F405FE613076C +:101AA000200DE39FE7D483471900858B63830714D8 +:101AB0008327040AA3000900139727016340071036 +:101AC000228597F0F91FE780401C85476318F50EC3 +:101AD0008355041E0356241E034574149105C20544 +:101AE000C181EF20C0258347C404373C0020B73CA8 +:101AF0000020858B373D0020B5CFA2850545971086 +:101B0000FA1FE780809E03A78C55B70633001C435D +:101B100093F7F7E71CC31C4393F7F7E793E7071026 +:101B20001CC303270D5E1C47D58F1CC78327CC58C9 +:101B300013079007B8CB0327CC58930710FD7CA45C +:101B40005447F977FD17F58F5CC70F100000832706 +:101B5000CC58096703A68C5598C7130700F82302D1 +:101B6000E900184231830D8B15EF13076019F8D384 +:101B7000D4C7B9BA03A78C55B70633001C4393F7F3 +:101B8000F7E71CC31C4393F7F7E793E707101CC361 +:101B900003270D5E1C47D58F1CC78327CC5813071E +:101BA000900549BF1842094631830D8B6315C70064 +:101BB0001307E0436DBF1307E01B55BFEF206038EC +:101BC0001C3C85C793F7070F81CB9305D003228573 +:101BD000EF407FE6A305A402B737002083A70727BD +:101BE00089C795451305500882972285EF502FA687 +:101BF00071B5B737002083A7C758FC53639907F620 +:101C0000EF202034DDB7411106C6EF404F91B737C2 +:101C1000002037170600938787401307479823ACA7 +:101C2000E70A37170600130787AC23AEE70AB2406E +:101C3000B7170600373700209387E7312326F7547C +:101C400041018280411122C406C62A840345D5077A +:101C50009307F00F6307F500EF109EE4FD57A30E06 +:101C6000F406FD57A300F40841469305000801451A +:101C7000EFC01F885C4CB240C59B5CCC2244410144 +:101C80008280411122C4130655012A84285D8146B1 +:101C9000814506C69710FA1FE780209F631D051A2D +:101CA0002C5C9D461D4598213D8B58B49C317CA4ED +:101CB000631ED710B8210D45935667001377F703BD +:101CC0006376F7101545639306109388F7FFB38882 +:101CD000E84093F8F80F23071403B0314545937695 +:101CE0003600EDE693764600F5E6138845007D174D +:101CF0009376F70F1377860005CF03471800034E3E +:101D0000940251451353470063126E0C0565130589 +:101D100005F02207698F034508000353A402498F89 +:101D200051456315E30A1387E6FF09089376F70F19 +:101D3000418A35CE034708001377F7032302E402F4 +:101D4000034628000967130707F02206798E034728 +:101D50001800598E420641861317060141837AB056 +:101D600039C203060800635B06061306C012330778 +:101D7000C7020346C40D0D456318A606373600207A +:101D80000346F65689078E0721CE9387770D86077F +:101D9000B307F740138747ED13064051637EE6040F +:101DA00089472304F4021387D6FF9376F70FBC31DB +:101DB000594513F7070219EB93F7070489C71387EF +:101DC000F6FF9376F70F014591C26145B240224478 +:101DD0004101828013885500791719BF794641BFA8 +:101DE0009387A7048E076DB709456315A600AD0755 +:101DF0008A0779BFA907FDB75A3CBA983737002040 +:101E000003578744635517012307040251BF373630 +:101E100000200328C65805472304E4020325C80010 +:101E200079777D17231E1403698F2326E8000100AC +:101E300001000327C6580966130800F810C7373693 +:101E4000002013064656938757ED230206018607A6 +:101E50007CD348C789BF054595BF411126C2645947 +:101E600022C406C69D479CA08547A3810400BCA050 +:101E70008347950B2A8493F7070489CF93070004BF +:101E8000BCB0373700207C5903470725D8A3BC20B6 +:101E90008507BCA00346940C19CABC20685883254A +:101EA000C40C8D073E9597E0F91FE780C048B82025 +:101EB0008347940C9376F7038507B69793F7F70F4C +:101EC0005CA4B8A078581CB3B240224492444101AB +:101ED0008280411126C2B7340020938444569C4C22 +:101EE0004AC006C63739002022C49396070103274B +:101EF000C95863D3060CB737002003A4874893075B +:101F0000000A7CD3B737002083A78755B705330075 +:101F10002285D457F19A93E61600D4D7944393F6CA +:101F2000F6E794C3944393F6F6E793E6061094C35A +:101F3000B736002083A6065E90464D8E90C61306E7 +:101F4000A00530CBD056759AD0D68346E40713F659 +:101F5000F607944393F606F8D18E94C3832684093A +:101F6000D4C38326040C94C75C43F99B5CC3EFF095 +:101F7000DFEE8327C9587858375505008145B8DB0F +:101F80001305E555EF101EC38345C40D50240145CC +:101F9000FD1593F5F50FA38104009700FA1FE78064 +:101FA000C076EF10107ABC30A304040CB240224477 +:101FB00092440249410182807C57EDDBB737002013 +:101FC00005472386E7F4DDB7397122DC1306550196 +:101FD0002A84285D8146814506DE26DA4AD84ED617 +:101FE00052D456D25AD05ECE9700FA1FE780E069ED +:101FF0006310053C305C9D461305000818223D8B9C +:1020000058B41C32230A0404230E04047CA4631B6A +:10201000D7182422230404020D4513D7640093F437 +:10202000F40363F1F4181545631E07169385F7FF53 +:10203000858D93F5F50F2307B4023432454513F728 +:1020400016006311071613F726004945631C071491 +:1020500013F746006313071613094600FD1413F720 +:10206000860093F4F40F854915CF584C218B1DC77A +:10207000034719000565130505F02207698F03451D +:102080000900498F03552409631DE512834924087B +:1020900093D9290093C9190093F91900F914090972 +:1020A00093F4F40FC18AB5C6034709001377F70309 +:1020B0002302E402834629000967130707F0A206FA +:1020C000F98E03471900D98EC206C18613970601FF +:1020D00041837AB09DCA8306090063D7060E930632 +:1020E000C0123307D7028346C40D09456390A60E7C +:1020F000AD078A07B307F740138747ED93064051B2 +:1021000063FAE60E89472304F402F5140D0993F4EB +:10211000F40F3C32594513F7070249E793F70704D8 +:1021200089CB83470900FD140509A301F40293F448 +:10213000F40FB1CC130A8002A14A494B930BA408B7 +:102140008347190063984703834709006394570343 +:10215000230E640783478900034779001546A207C9 +:10216000D98F2318F408930529005E8597E0F91F9D +:10217000E780601C8347090063FB97001387170003 +:1021800093C7F7FFBE9493F4F40F3A99D5F863938D +:10219000090A0347C4078947014563E5E7008D47FE +:1021A000230EF406F2506254D2544259B259225AC4 +:1021B000925A025BF24B2161828013095600F91496 +:1021C00079BD2319E408D9BDF94621BF0D456391B6 +:1021D000A602B736002083C6F65689078E0789C641 +:1021E0009387770D860739B79387A7048E0719B7AA +:1021F000A907EDBFB736002003A5C658054723043D +:10220000E4024EBC4C4579777D176D8F58C50100AF +:10221000010003A7C6588966130500F814C7B7362E +:10222000002093864656938757EDC8A286077CD335 +:102230004CC7E1BD5C4CA18BA9DF83472408898B87 +:10224000A9FB8348E4027C24385C03488402B387FA +:1022500017418907BA970306540103578408830579 +:1022600034020355240D3EC09306F00F9307F00F80 +:102270007979B73A0020EF80E0728549373A00203B +:102280007D1993844A56373B0020B73B0020834793 +:102290008402E39037F18327CA58F8537DFFD4476F +:1022A00033F72601D8C7010001000327CA58896700 +:1022B000B70533001CC7930700F8DCA0930720592B +:1022C0007CD354C723820A56A382040083278B55EC +:1022D00023040402A380040023203701944393F6CF +:1022E000F6E794C3944393F6F6E793E6061094C397 +:1022F00083A60B5E90464D8E90C61306900530CB9C +:10230000D856759BD8D6034744029376F70798436F +:10231000137707F8558F98C39700FA1FE78040346A +:10232000EF1030429C30858BA5C72285A380040026 +:10233000EFF03F95035784080353240D11E503483C +:10234000840289476311F80202C081480948930753 +:10235000F00F9306F00F1306F0079305F0071A85A8 +:10236000EF8040643DB58348E4027C24345C03067E +:102370005401B3871741890783053402B6973EC0DD +:102380009306F00F9307F00F1A85EF80A06101B755 +:1023900002C0814809489307F00F03578408930649 +:1023A000F00F1306F0079305F0070355240D4DBFFA +:1023B0000545CDBB411126C2B7340020938484402B +:1023C00083A7840B06C622C44AC099E3054505A22B +:1023D0002A89EF10103783A7840B8297EF50EFDA2A +:1023E0002A846DD58327C90B8325890701482324B7 +:1023F000F508FC3598291546A2074207BA97F82533 +:1024000013058513F905BA9703C735FF6207BA9715 +:102410002320F5F683C755FF03C765FFA2074207D0 +:10242000BA9703C745FFBA972322F5F683C775FF0E +:10243000A30FF5EE83C795FF03C785FFA207D98FCA +:102440002310F5F083C7B5FF03C7A5FFA207D98FF7 +:102450002311F5F083C7D5FF03C7C5FFA207D98FA6 +:102460002312F5F083C7F5FF03C7E5FF232205011B +:10247000A207D98F2313F5F081471CC197E0F91FFC +:10248000E78060EB83268907054783C73602230070 +:10249000E414FD8BA30AF4020347C90DED1793F76B +:1024A000F70F7D171377F70F2303E414A303E41446 +:1024B00003C7360215832308E4022D476365F7023C +:1024C0003E3C05679306A7C7E917C207C18363ECC3 +:1024D000F600563C9307301F63E7D7007E3C130796 +:1024E00007C8637CF7000A24EF502FEA0145B24089 +:1024F0002244924402494101828083A7C40B228571 +:1025000082970A241306900293050008EFB05FFE3D +:1025100083A7840D13971701E35A07EA0A2451464B +:1025200093050008EFB0DFFC55B5397122DC1306C6 +:1025300055012A84285D8146814506DE26DA4AD87F +:102540004ED652D456D25AD05ECE9700FA1FE780AC +:10255000C01385476314051A2C5C9C21BD8B5CB4A9 +:102560009831230A0404230E040478A41D476392BF +:10257000E718EF10101D0329840778248D47834442 +:1025800029002304040293D6640093F4F40363F750 +:10259000E4169547639406167D17058F2307E4021A +:1025A00003473900C547937617006399061493765D +:1025B0002700C9476394061493774700E5E31109A0 +:1025C000FD149377870093F4F40F854995CF5C4C05 +:1025D000A18B9DC7834719008566938606F0A207E5 +:1025E000F58F83460900D58F83562409639BF60A2D +:1025F0008349240893D9290093C9190093F9190034 +:10260000F914090993F4F40F93760701D547FDE611 +:1026100093760702D947FDE21377070409CB834776 +:102620000900FD140509A301F40293F4F40FB1CCE1 +:10263000130A8002A14A494B930BA408834719004F +:10264000639847038347090063945703230E640785 +:1026500083478900034779001546A207D98F2318BD +:10266000F408930529005E8597E0F91FE780A0CC68 +:102670008347090063FB97001387170093C7F7FF91 +:10268000BE9493F4F40F3A99D5F8639F0900034779 +:10269000C407894763FBE70481478DA01509F91436 +:1026A0000DB72319F408A9BF5C4CA18BEDD3834768 +:1026B0002408898BE9FF8348E4027C24385C0348C2 +:1026C0008402B38717418907BA973EC0035784082D +:1026D0008347A40B03065401830534020355240DDC +:1026E0009306F00FEF80002C5DB78D47230EF406A4 +:1026F00065B715476380E70293070008F2506254FC +:10270000D2544259B259225A925A025BF24B3E8538 +:1027100021618280B737002083A7C75821673739E6 +:10272000002023A6070698C79307495623AA070047 +:102730009C31130720021309495693F7F7037CA431 +:10274000E39CE7FA130AE4041946A105528597E0D1 +:10275000F91FE78040CF914755D12C5C9309640560 +:1027600019469C214E8589059987858BA30AF40417 +:1027700097E0F91FE78020BCB737002083A7072325 +:1027800082976458232EA40AA1479CA08547BCA029 +:10279000BCB01946D2851385440097E0F91FE78045 +:1027A00080B9BC209907BCA0BC3093E72700BCB01F +:1027B0008347540591C778581C2393E707F81CA357 +:1027C0001946CE851385A40097E0F91FE780A0B6CF +:1027D000BC20990793F7F70F13F7F703050758A4E1 +:1027E000BCA08347D404858B91E70347C404894781 +:1027F0006317F70078581C2393E707041CA34C24A5 +:102800007C588CB30345C40D9307A0F93CA47D15F7 +:102810001375F50FEF10403EB737002083A787559B +:10282000B70680009843558F98C3D857719BD8D767 +:102830009700FA1FE780C0E2EF10A07083471900ED +:10284000858BE38B07E42285EFF0DFB6B1B57971B4 +:1028500022D406D626D24AD04ECE52CC56CA5AC818 +:102860005EC6034B05082A8463060B12373A002024 +:1028700013074A28835A87003A27B737002003C92D +:1028800037258327C50D37450F001305052413078A +:10289000471F3347E502A183C207C18393041B008E +:1028A000930B204E568681468145B384F40233054E +:1028B000A902B3897403B3D9E902EFB01005374612 +:1028C0000F00130606248146B3879A029304003250 +:1028D0004E95B3F797028324040AB3877703B3C7EF +:1028E0005703C207C1833E952326A40AB3B5AA02A3 +:1028F0003385AA02EFB0700193074A28B385A4403C +:1029000063F5A400CC43A695898D584C2322B40AC4 +:102910000345D40793768700A1C61359190063E6CF +:102920002507B3852541EF00FEE0B737002083A7D8 +:1029300007238297B737002023A8A754835784081A +:10294000230C040AB25085072314F408225492542D +:102950000259F249624AD24A424BB24B45618280E7 +:102960009546E3FC66FB459B9307E003A308F40C44 +:1029700058CCEF10EE92FD57A30EF406394693059E +:1029800000080145EFB0DFB64DB7DC43338927417E +:10299000CA9551BF0347C5078947E3F8E7F8B7343D +:1029A0000020938744280329050A8A278327C40A1D +:1029B00037460F0013060624B335F502814693848B +:1029C00044283305F502EFB04074B305A9406375A0 +:1029D000A900CC40CA95898DB737002083C7372519 +:1029E0002322B40A0345D407858363EDF5009D8D4A +:1029F000EF005ED483556408034514089205EF0088 +:102A0000DEC525B7D840B307F740BE95D5B7797175 +:102A10004AD037390020930749569C4F4ECE06D6F0 +:102A200022D426D252CC56CA5AC85EC662C4139764 +:102A30000701B73900206347070283A7C958FC572D +:102A400091C7B737002005472386E7F4B2502254D8 +:102A500092540259F249624AD24A424BB24B224C3A +:102A600045618280B7370020294503A48748373A5B +:102A70000020EF10205503270A5E93044956A9470A +:102A8000FCB05C57B73A0020F59B5CD78347E4075E +:102A900003A78A5593F6F7071C4393F707F8D58FDA +:102AA0001CC3A3800400930700042302F956834744 +:102AB000940C23AA0400B5C78356440C835784089A +:102AC0006391F6068346740C8347A40B639BF6045C +:102AD0008347C40D0D46930670E76389C700094616 +:102AE0009306B0FC6384C700930670FB0346840C16 +:102AF0008347340E9305204EB387C7021306D007D1 +:102B0000B387C7020346240E3306B602B2979387F3 +:102B1000E7F8B697DCC88347495693E707022302D4 +:102B2000F9568327840983A6C95801465CC3DC4251 +:102B30009305F00F93E71700DCC2832744091CC7F5 +:102B40000345C40D7D151375F50FEF10401F03A647 +:102B5000C958F977FD1754460327840AF58F5CC6D8 +:102B60000100010083A7C9580966060790C713062C +:102B700000F8D0A0F8D3D4C7A382040083A68A5556 +:102B8000A3800400054798C39842370633001377A3 +:102B9000F7E798C298421377F7E71367071098C2D0 +:102BA00083260A5E9846518F98C613079005B8CBC6 +:102BB0009700FA1FE780C0AA83474956858B638038 +:102BC000071A9307F007A301F4022285230209568E +:102BD000EFF0BF9583470408EDCBB73A0020834759 +:102BE000C40D13874A28835B8700032A47000D47DB +:102BF000938A4A286399E71A03A9C40137460F004C +:102C0000130606248146130590183385AB028145CF +:102C1000EFB0A04F6368A91A3305A940C8CC834719 +:102C2000A40B9DC30347140ED44C3307F70293073C +:102C300000323307770313070719B357F70263E529 +:102C4000F618B387F640DCCC83D7AA0037470F00CD +:102C5000130707249387471FB347F7020325C40DC3 +:102C6000130C204E5E8621814205418181468145BB +:102C7000330985033359F902B7370020330B750345 +:102C800003C5372505813305E502EFB0004813077A +:102C900000324A953379EB02130B0B19DC4C3309E4 +:102CA000890333497903335BEB0242091359090164 +:102CB0004A952326A40ADA973E8763E4670163E412 +:102CC0004701338747412320E40A0347C4078D4760 +:102CD000631AF7043946930500080145EFB05F8198 +:102CE000930500251305001097D0F91FE780803564 +:102CF0005C4C035664082326A40CED9B3725060084 +:102D00005CCCA304040C930614081206A2851305D8 +:102D100045C4EF00FEBE5C4C93E787005CCC914756 +:102D2000230EF406DC482300040895CB83A7C9587A +:102D300009673725060023A2070698C7130525ED66 +:102D40002382040097E0F91FE78060A403A7C95815 +:102D50007C57FDFF014597E0F91FE78040A38347BB +:102D6000A40B850713F7F70F8347040E230DE40A1E +:102D7000637EF710B734002093874428DC279384C0 +:102D80004428A9C7930770FA37250020230CF40ABA +:102D90001305651DEF10AE9CB7E700E03707000292 +:102DA00023A2E72065B103A9C40137460F000947F4 +:102DB00013060624814613055003E388E7E4130550 +:102DC0009004A1B5529989BDD296A5BD8347140E32 +:102DD000D440B387E7029A24B387E702130700328F +:102DE00093870719B3D7E7020327440A3E973A8926 +:102DF0006364F7006364D7003309D740B737002016 +:102E000083A707238297B307A9406374A900C8402A +:102E1000AA9737390600A5C392240347140E9306D8 +:102E200000323307C702130707193357D70263F479 +:102E3000E70437450F0013050524B3B5A70203A423 +:102E4000C9582167814618C43385A702EFB0E02B2B +:102E5000060568D42254B2509254F249624AD24ACA +:102E6000424BB24B224C1305E9A00259456117E3CE +:102E7000F91F6700C3911305E9A097E0F91FE780E8 +:102E8000009183A7C9580947F8D7C9B622852254AB +:102E9000B25092540259F249624AD24A424BB24B62 +:102EA000224C45616FF0BF9AB737002083A7875542 +:102EB000011122CC26CA4AC806CE4EC652C456C2FA +:102EC0005AC0984337063300B73400201377F7E72A +:102ED00098C398432A84373900201377F7E713679C +:102EE000071098C3373700200327075E9305F00FBC +:102EF0001447D18E14C783A6C45813069005B0CAD0 +:102F00000326450990C703268509D0C35057759AF3 +:102F100050D70347E5071376F7079843137707F869 +:102F2000518F98C3DC420146F99BDCC20345C50DB5 +:102F3000930700042302F9567D151375F50FEF0072 +:102F4000106003A6C458F977FD1754460327840A76 +:102F5000F58F5CC60100010083A7C458096693047D +:102F6000495690C7130600F8D0A00607F8D3D4C777 +:102F7000A38204000547A380040098C397F0F91FBB +:102F8000E780006EEF00F07B9C30858B6385071235 +:102F90000347C40DB73900201309495693874928C0 +:102FA000A30009008D469E27938949286311D712F3 +:102FB0008324C90137460F001306062481461305F2 +:102FC00090183385A7028145EFB0201463E2A41264 +:102FD0003385A440232EA9009307F007A301F40230 +:102FE0002285EFE07FFE0347C4078D47631EF7028B +:102FF0003946930500080145EFB08FCF5C4C03566E +:10300000640837250600ED9B5CCC93061408120675 +:10301000A285130545C4EF00BE8E5C4C93E7870084 +:103020005CCC9147230EF40683D7A90037470F00E5 +:10303000130707249387471FB347F7020325C40DDF +:10304000130B204E83DA890021814205418181469C +:1030500056868145B3046503B3D4F402B737002024 +:10306000338AAA0203C5372505813305E502EFB08F +:10307000C009130700322695B374EA02130A0A192D +:103080008327C90183A64900B3846403B3C45403EE +:10309000335AEA02C204C18026952326A40AD29795 +:1030A0003E8763E4470163E4D7003387D74023209A +:1030B000E40A2300040822856244F240D2444249D3 +:1030C000B249224A924A024B05616FF04FF88324BD +:1030D000C90137460F008946130606246316D70038 +:1030E000814613055003F1BD814613059004D1BDFF +:1030F00083A74900BE94E9BD5C4D797122D406D600 +:1031000026D24AD04ECE52CC56CA5AC85EC662C4E7 +:1031100066C2B98B2A846387073637390020832734 +:1031200009238324450A373A00208297130A4A2844 +:1031300063E3A414B73A00209387CA2303CC770132 +:10314000898C8547935B1C00035B8A00938ACA23A2 +:1031500063D297020325C40A37460F0013060624DC +:10316000B335AB0281463305AB02EFA0107A5E9512 +:10317000637B95108324C40D130700328347040832 +:10318000A180C204C180B3866403850793F7F70F5B +:103190002300F408832A4A0093860619B3D6E60270 +:1031A0000327040A3697BA896364D700636457011A +:1031B000B3095741035AAA0037450F0013050524E8 +:1031C000130A4A1F334A45038507930C204E5A863B +:1031D00081462320340B8145B38497023305AC022A +:1031E00033879403335A4703EFA0307237460F00FA +:1031F000130606248146B3079B02930400325295BE +:10320000B3F79702B3879703B3C76703C207C183B6 +:103210003E952326A40AB335AB023305AB02EFA0DB +:10322000D06E63EEA904B389A94083578408232292 +:10323000340B0345D40785072314F408B38579417B +:1032400063F57901B3857A41CE95EF00AECE832741 +:1032500009238297B737002023A8A754B2502254DD +:1032600092540259F249624AD24A424BB24B224C22 +:10327000924C4561828083274A00BE9465BD3385A8 +:10328000AA40AA995DB72945EF00D053B73700206F +:10329000938747562947F8B30347C407C947631ABA +:1032A000F70203570409835784086314F702930451 +:1032B000040B15469305A408268597D0F91FE780CF +:1032C00080072685EF405F959147A307A408230E4A +:1032D000F406228597E0F91FE780C0768327C40AA9 +:1032E00003578A0003264A0086079387F721232481 +:1032F000F40A8347040885072300F4088327C40DD4 +:10330000A183C207C183B387E70213070032938703 +:103310000719B3D7E7020327040A3E97BA86636406 +:10332000F7006364C700B306C7408347040E232039 +:10333000D40AF1C78347CA00230D040A95C3930733 +:1033400070FA37250020230CF40A1305651DEF00E1 +:103350001EC1B7E700E03707000223A2E720FDBD4A +:10336000832709230324440A8297636BA406098CEC +:1033700037390020B739060025C803C57A01B7449C +:103380000F009384042433059502035A8A00814672 +:1033900081455286EFA070576378A404B335940238 +:1033A0000329C958A16752862324F90081463305B1 +:1033B0009402EFA09055060522542326A906B25088 +:1033C00092540259624AD24A424BB24B224C924C1E +:1033D0001385E9A0F249456117D3F91F6700233B24 +:1033E00083274A003E9461B71385E9A097D0F91F5F +:1033F000E780E0398327C9580947F8D785B583277F +:1034000009238324440A829763E3A402898C85E418 +:1034100022852254B25092540259F249624AD24A49 +:10342000424BB24B224C924C45616FF0FFA7832771 +:103430004A00BE94E1BF03C57A0137490F00130962 +:10344000092433052503035A8A00814681455286A3 +:10345000EFA0B04BE3FEA4FAB3B52403B7370020C6 +:1034600083A9C758A167528623A4F90081463385F2 +:103470002403EFA09049060523A6A90683A7C90641 +:10348000F5FF79B70345D507EF008EE1FD57A30E91 +:10349000F406E9B3797122D42A841305050B06D604 +:1034A00026D24AD052CC4ECE56CA5AC85EC662C444 +:1034B00037390020EF404FF6832709238324040A7D +:1034C000A307A408373A00208297130A4A2863EF1B +:1034D000A414B74B0F00938B0B243385A440B33552 +:1034E000750303568A008146130C204E330575037D +:1034F000EFA0B0418327092323000408AA898297FB +:10350000B737002023A8A7540355AA008324C40D6D +:10351000B73700201305451F33C5AB02A180C20495 +:10352000C18003C93725035B8A00814681455A86DD +:10353000B38A8403B3DAAA0233057903EFA0F03C1F +:10354000B3079B0293040032AA9A5A8681468145AA +:10355000B3F7970293541900B3878703B3C7670380 +:1035600033857403C207C183BE9AEFA0103A569503 +:103570006372350D2326540B0325C40A0329040A5C +:1035800037460F00B335AB021306062481463305D8 +:10359000AB02EFA09037636EA90A3305A94023223E +:1035A000A40A0345D4079307F00F6304F500EF0066 +:1035B0002ECF0326440AB737002003A58749636E40 +:1035C00096088327C40D03578A00058EA183C2077E +:1035D000C183B387E702130700329306D407A2859D +:1035E0009387071933D7E702EFF09DEB0347D40722 +:1035F0009307F00F630FF7005C4C054723000408A6 +:1036000093E76700A308040C2319E40C5CCC230E99 +:10361000E406B250225492540259F249624AD24A04 +:10362000424BB24B224C01454561828083274A00C0 +:10363000BE9445B537153D005A8681461305059061 +:103640008145EFA0902C3385A9402326A40A8D4400 +:1036500025B783274A003E9989B783274A003E96BB +:103660008DB7B7370600373700209387870F232C95 +:10367000F7488280011122CC373400209307844020 +:1036800026CA83A4470C4AC84EC652C456C206CEA8 +:103690002A89814913048440130A2500854AA1E43C +:1036A00093057025314597D0F91FE780A099AA842A +:1036B0000145A9CC834719001946930529009CB000 +:1036C0001385240097D0F91FE780E0C68327440CB8 +:1036D000B9E72322940C23A404008347040C850734 +:1036E0002300F40C1DA09830834719006305F700F0 +:1036F000A68984446DB71946D2851385240097D0D6 +:10370000F91FE78040D4E31555FF0545F2406244B8 +:10371000D2444249B249224A924A05618280E38CEE +:1037200009FA23A4990045BF011126CAB734002025 +:103730009387844022CC03A4470C4AC84EC652C487 +:1037400056C206CEAA89014993848440130A2500F3 +:10375000854A19E80145F2406244D2444249B249DF +:10376000224A924A05618280183083C71900630596 +:10377000F70022890044F1BF1946D28513052400C1 +:1037800097D0F91FE78020CCE31555FF1C44631543 +:10379000090023A2F40C19A02324F900228597D054 +:1037A000F91FE780209783C7040C0545FD17238088 +:1037B000F40C55B7411122C43734002093078440DC +:1037C00003A5470C06C626C21304844011E9232230 +:1037D000040C2300040CB240224492444101828034 +:1037E000044597D0F91FE780E0922685C5B7B73723 +:1037F00000209387874023A2070C2380070C828038 +:10380000B737002003A7C758011122CC2EC632C4F7 +:1038100006CE3C4B2A84354593E707083CCB5D2711 +:10382000B736002083A746550947B24598C31830DC +:103830002820220742052A9708202A972830620567 +:103840002A9798D758306820220742052A9748209F +:103850002A97683062052A97D8D718342824220777 +:1038600042052A9708242A97283462052A9798DB6C +:1038700058346824220742052A9748242A97683436 +:1038800062052A97D8DB9831A821220742052A979A +:1038900088212A97A83162052A9798CFD831E82144 +:1038A000220742052A97C8212A97E83162052A97FC +:1038B000D8CF9835A825220742052A9788252A9728 +:1038C000A83562052A9798D3D835E82522074205FE +:1038D0002A97C825EC352A97E2052E97D8D3D843E6 +:1038E000759BD8C3D84313671700D8C39843136791 +:1038F000170098C3224683A74655D843058B25EF6A +:1039000023A007009C4F01451CA283A746559C4F4E +:10391000A1831CB283A746559C4FC1833CA283A7B9 +:1039200046559C4FE1833CB283A74655D84F58A2D9 +:10393000D84F218358B2D84F418378A2D84F6183A2 +:1039400078B2985318A69853218318B69853418398 +:1039500038A69853618338B6D85358A6D8532183D4 +:1039600058B6D853418378A6DC53E1837CB6F24045 +:103970006244056182800100BDBFB737002003A704 +:10398000C758011106CE22CC2EC632C43C4B2A8425 +:10399000354593E707083CCB35252246B2452285BD +:1039A00097F0F91FE780A096F24062440145056157 +:1039B0008280411106C6EFF0BFE4B24001454101EB +:1039C0008280B737002083A78755885B3D816205D9 +:1039D00061858280B737002083A78755B7068000AE +:1039E000371601809843130686EC558F98C3984389 +:1039F000B7060010558F98C31307001DD8DB373763 +:103A000000200347072593169701D18ED4D7D457AA +:103A1000370600821377F7037D166607F18E558F00 +:103A2000D8D7370709001307370898D38280B737EC +:103A3000002083A787559C5BC60713D5670163D613 +:103A40000700136505C0420541814205418582801A +:103A50009307E00363EEA7041307400299476367E7 +:103A6000A704694795476363A70451479147636F6C +:103A7000A70241478D47636BA702314789476367B8 +:103A8000A702294785476363A70221478147636FE0 +:103A9000A7001947F557636BA7001147ED576367F8 +:103AA000A7000947B9576373A700D9573E8582809D +:103AB0009D47EDBFBD57634EF5045D578D47634885 +:103AC000E504715795476344E50479579D47634082 +:103AD000E504A547635DA0020547AD476309E5021C +:103AE0000947B5476305E5020D47C5476301E50290 +:103AF0001147D547630DE5001547ED476309E5001C +:103B000019479307F0036314E500930750023E85BD +:103B100082808547EDBFB737002083A787553706DA +:103B2000CEFF7D16984375787D181377F7E71367F6 +:103B3000070898C3373700200327075E1375F51F62 +:103B400093F5F5071447F18E14C7B736002083A606 +:103B5000C65823A8060423A40700904B1366F60357 +:103B600090CB90433376060190C3F04F137606E076 +:103B7000498EF0CF239C0704239007065057759A6F +:103B800050D79043137606F84D8E90C313068025C8 +:103B9000F0D23736002013064656A3020600A300D3 +:103BA0000600054690C29043B70533001376F6E74A +:103BB00090C390431376F6E71366061090C3104740 +:103BC0004D8E10C713079005B8CAD85337060400A6 +:103BD000518FD8D32546F85209C703D78705E37C10 +:103BE000E6FED853B706FCFFFD16758FD8D303D574 +:103BF0000706133545008280B737002083A7C755D5 +:103C000099CB944BD04B9842518F98C294439C4788 +:103C10009842D98F9CC237360020B7370020130650 +:103C2000465637380020854883A78755382683268F +:103C3000C858631015058843F578FD1833751501CC +:103C400088C3C846F977FD17E98FDCC6010001007B +:103C50008326C8588967AD059CC6930700F85CA207 +:103C6000939725009305E709BE958605ECD2C8C653 +:103C70008280F578137E25001383F8FF63070E0812 +:103C800083A8070089050D4EB3F868000963B3E8FF +:103C9000680023A01701D1781307E70B8E05FD18E4 +:103CA000631FC5038843337515019168336515019A +:103CB00088C3C846F977FD17E98FDCC6010001000B +:103CC0008327C858930600F89385750D23A46700D1 +:103CD00054A28605BA958605ECD3C8C7828088436E +:103CE0003375150188C3C846F977FD17E98FDCC61F +:103CF000010001008327C858930600F89385A504A6 +:103D000023A4670054A28E05F1B7884385683375F4 +:103D100065003365150188C3C846F977FD17E98F3B +:103D2000DCC6010001008327C8588966A90594C72D +:103D3000930600F854A28E051307E70961BFB73751 +:103D4000002083A7C75589CFD44303A88700984292 +:103D50003367070198C2D447DC4B9842D98F9CC285 +:103D60003737002003480756B73700203737002081 +:103D70009376250083A787551378180013074756B5 +:103D8000B5C2944375757D15E98E0965C98E94C3D6 +:103D9000B70609009386660894D3B7263008C5167F +:103DA000D4CBB71603009386966194CF8D66938625 +:103DB000E68D94D7B766000193860631D4D3B7A6B3 +:103DC0003F0063140800B7A634009386F64D9E05A5 +:103DD00094CB938545360CCB19C2060610CB230233 +:103DE00007008280B70609009386360894D3B72669 +:103DF000100893861690D4CBB716030093864662BC +:103E000094CF8D669386E68B94D7B7660001938630 +:103E10000631D4D363060802B7A63F009386E62C8A +:103E200094CBF5761388F6FF944385489505B3F651 +:103E30000601631C150194C38E059385C50361BFFC +:103E4000B72632009386062DE1BF0565C98E94C35F +:103E50009205E5B709C9372702408347870493E7EE +:103E600027002304F7048E05B73700202387B756B1 +:103E7000B737002083A787552206D18DC98DECD393 +:103E8000F853370688FF7D16718F37062800518F4B +:103E9000F8D3F85313674700F8D3984391C6B70691 +:103EA0000020558F98C38280B7060020F98E984372 +:103EB000370600E07D16718FEDB7411122C437340B +:103EC00000209307445606C69827A147130444567A +:103ED0006317F7023737002003470759B737002029 +:103EE0009387075B058BB033B42329C7C84339C117 +:103EF0000C310905EF10A00F19C185471CB4182417 +:103F00009947631AF700B737002083A78748BC3763 +:103F10008DC7EFC02FBE18249D476310F702B73737 +:103F2000002083A7C749FC3389CB2244B24041011A +:103F30006F30FFFB8145014575BFB240224441010E +:103F40008280373700208327C758B44BE19AB4CB1F +:103F5000944393E6860094C39C438D83858B89C7E5 +:103F60000100010001000100B737002083A687553A +:103F70009C4293F7F7E793E707089CC2B737002006 +:103F800003A6075EB706CEFFFD161C46F58F1CC6BE +:103F90008327C75823A80704B737002083A7C7552E +:103FA00099CBD44390479842518F98C2944BDC4BA5 +:103FB0009842D98F9CC2B737002093874756A38376 +:103FC0000700828041114AC0B747024006C622C49A +:103FD00026C203A9C72023A607200F100000B73769 +:103FE000002083A7C7589C438D8BB9CB3734002062 +:103FF00093074456FC330D47AA8413044456631AAE +:10400000F700B737002083A7075A01468145454589 +:10401000829719476390E4041C3491C71C2463946D +:104020009700A30404007C3021476315F700930731 +:1040300080101EA4B7370020238607F4EFF07FF02E +:10404000B2402244B747024023A6272192440249A6 +:10405000410182809D476399F4001C34E9D71824FC +:104060008D47E312F7FC75BF74306309D7007830D1 +:104070006386E7007C302147E31EF7FA1C34DDFB42 +:104080007C301CA485471CB475B7011122CC2A844E +:1040900011452EC632C436C206CEEFF0BFF2B73796 +:1040A000002083A78755B7083300D857719B136743 +:1040B0001700D8D7373700200325C7581307000A41 +:1040C00078D198431377F7E798C398431377F7E7C6 +:1040D0001367071098C3373700200327075EB245E0 +:1040E00092460328870022463368180123240701DB +:1040F0001308A00523280505D1C54C5713640404F3 +:10410000F5994CD71377F4078043137404F8598C4E +:104110003747767180C31307971298C737575500F2 +:104120001307575537340020D8C393074456985384 +:10413000B6851304445638D923810700A3810700AC +:104140005841799B58C111470145F8B397E0F91FD1 +:10415000E780A05BB737002003A7C75511C75443BA +:1041600018479C42D98F9CC23C30858B81CBB73796 +:104170000020938787409A2705079AA7F240624458 +:10418000056182804C57F5994CD71377F40780432B +:10419000137404F8598C37C7898E80C3130767EDF1 +:1041A000ADBFB737002023AEA75419C958415449B1 +:1041B0001C43D58F1CC3184914451C43D58F1CC301 +:1041C0008280011126CA4AC84EC6C1643709006AF6 +:1041D000B70900AC22CC52C406CE0544FD14130925 +:1041E000690E9389E90C130A000205E49305000F98 +:1041F0004145EFF05DD0B7B7006A4205938767CEBF +:104200005D8DF2406244D2444249B249224A05617E +:104210008280A6850145EFF05DD09317850013F7E6 +:10422000071033E5270119C333E5370181470147FB +:10423000E145B356F50085073356F500858A058AB2 +:104240006307D60005071377F70F63E4E504E392ED +:1042500047FF81471306F003ED463357F500137708 +:10426000F70305CB6307C7028507E398D7FE13570B +:1042700085009377F50F1377F70FE394E7F813575B +:1042800005011377F70FE39EE7F613578501E39ACD +:10429000E7F605041374F40F89BF011122CC3734FB +:1042A000002013044456783006CE26CA4AC84EC6AB +:1042B00052C456C29147638DE70A7830638AE70A91 +:1042C000B737002003A74755B7440240938704300F +:1042D0006310F70A03AAC42023A604200F100000CD +:1042E0003545EFF03FCEB73A002083A78A55F576E3 +:1042F000FD169843B739002037390020758F856641 +:10430000558F98C39843B70633001377F7E798C3E0 +:1043100098431377F7E71367071098C303A7095E5D +:104320001C47D58F1CC78327C9581307D005B8CBA6 +:10433000EF20A026EF20307AEF20000EEF200017AC +:1043400003A78A551C4393F7F7E793E707081CC3B5 +:1043500083A6095E3707CEFF7D179C46F98F9CC662 +:104360008327C95823A80704A303040023A64421D4 +:10437000F2406244D2444249B249224A924A05611B +:104380008280B737002023800756B737002023AE3E +:104390000754B74702409386073037370020232A57 +:1043A000D75493860720373700202326D758B7568F +:1043B0000240373700202320D75E93870710373716 +:1043C00000204111232CF754B737002006C69387ED +:1043D00047560547F8B3373700200327C723D8D3FC +:1043E0001307071198D30928EF105062EFF08FDE02 +:1043F000B24041016FF07FEAB737002083A7C7586A +:104400001307C0089306C006D8CBD4CFD8D3130661 +:10441000C003D0D7D8DBD0DFF8C33737002003275D +:104420008758F4C7F8DB41677D1798C73D673D079C +:10443000D8C78280B73700203735002003A7075E32 +:1044400013060559B737002083A687551C3213F889 +:10445000F707D9C55C429042137606F83366060129 +:1044600090C213F6150001CA93F505034146638611 +:10447000C506938787C150574168130808A0136683 +:10448000260050D733D60703B70810FEFD18B3F740 +:1044900007037D8A931546017043337616014D8ECE +:1044A00070C31306A00FB705FCFFAA07B3D7C70256 +:1044B00070436D8EBA07B983D18F7CC3834705598A +:1044C000898B99CB9C4293F7F70713E707049C422B +:1044D00093F707F8D98F9CC282809387078361BFC7 +:1044E0005C57F59B5CD79C4293F707F8B3E707014D +:1044F0009CC2E9B74111B737002006C6238F075A7F +:10450000EFF03FA4B240014541018280411122C435 +:1045100037340020130444563C3006C6858B85C3CF +:10452000EFF05FFDB737002003A3075AA301040093 +:104530000146814505452244B24041010283B73717 +:10454000002083A7C758FC5399EBEFF0BFFAB737A9 +:10455000002003A3075A014681454545E9BF7C3049 +:104560000D476317F700B737002005472386E7F4A8 +:10457000B240224441018280411126C2B73400205A +:104580004AC006C622C4138744563C23373900204C +:10459000858BEDCFB737002003A7075E9384445681 +:1045A000238104005C573734002003450459858378 +:1045B000858B13040459B1CB504093760503C14554 +:1045C000930786C16394B60093070683C1659385FC +:1045D00005A0B3D6B702370810FE7D18B3F7B702AF +:1045E000FD8A139646017443B3F60601D18E74C357 +:1045F0009306A00F3706FCFFAA07B3D7D702744370 +:10460000F18EBA07B983D58F7CC34C2C1185014636 +:104610000D89EFF0CFF2374506001305656C97C0A2 +:10462000F91FE780C0160327C958F977FD175447CB +:10463000F58F5CC70F1000008327C958096798C71A +:10464000130700F8D8A037370020032687551842F3 +:1046500031830D8B05E31307601903230401F8D39D +:10466000D4C70146814505452244B24092440249DF +:10467000410102831842094631830D8B6315C7003F +:104680001307E043D9BF1307E01BC1BF8327C958F5 +:10469000FC5399EBEFF01FE6B737002003A3075A4E +:1046A000014681454545C9B77C330D476317F7007F +:1046B000B737002005472386E7F4B24022449244EE +:1046C000024941018280011122CC3734002006CEFC +:1046D00026CA130744563C33858BC9C3EFF09FE1CC +:1046E000130444564850814581461306F100A30146 +:1046F000040097E0F91FE78040F993158501B7346E +:104700000020E1859384045B89ED5C509306F00FF3 +:1047100098236308D7009C306385D7006303F700B4 +:104720008945B7370020038707596345070058506C +:10473000948714A3938707599C4B505093F5F50F1A +:1047400009458297DC24898B89C788288545EFE055 +:104750009DE8F2406244D24405618280B737002070 +:1047600083A7C758FC5381EFEFF0DFD8B73700209D +:1047700083A7075A0146814549458297D9BF7C33B3 +:104780000D47E318F7FCB737002005472386E7F409 +:10479000C9B7011126CAB734002006CE22CC4AC8B8 +:1047A0004EC652C456C213840459AE89B28A2A8AAC +:1047B000EFF02FF90830814537390020EFF09FC71F +:1047C00003C504594C2C014611850D89EFF02FD7F4 +:1047D000B737002083A7875518448326C958B734B4 +:1047E000002098C758443706330013844456D8C372 +:1047F000D842D28513671700D8C298431377F7E7DA +:1048000098C398431377F7E71367071098C3B73730 +:10481000002003A7075E08501C470905D18F1CC75D +:1048200093079005BCCA230F55FFA30F35FF4E8693 +:1048300097C0F91FE78020B0B73700209387075B48 +:10484000F82713674700F8A78327C958096723A2E9 +:10485000070698C723020400130700042382E456C6 +:10486000A3020400A3000400F2406244054798C379 +:10487000D2444249B249224A924A05618280397142 +:1048800026DA5AD05ECE06DE22DC4AD84ED652D484 +:1048900056D293070008AA8BAE84328B6319F602B6 +:1048A000373400203D491304045997E0F91FE7808D +:1048B000E04EE37CA9FE3C2C9607C117E3E7A7FE78 +:1048C000B737002083A7C7581307000AF8D3373A31 +:1048D000002003278A55B73A002013840A595C57F1 +:1048E0008145B7390020F19B93E717005CD708306A +:1048F00037390020EFF01FB483278A55370633007D +:1049000098431377F7E798C398431377F7E713674C +:10491000071098C3373700208326075E9846518FCB +:1049200098C603A7C9589306A00534CB144494C76E +:1049300054443734002013044456D4C35C4393E7F3 +:1049400017005CC31307095B7C271309095B93E716 +:1049500027007CA79307FBFF93F7F70F05476366D4 +:10496000F70A08502686DE852300650104B1090593 +:1049700097C0F91FE780209C185083A7C9589395CA +:104980000401C181B8DB230104000D47A301040029 +:1049900078B0130700086317EB08F8537DFFB737AB +:1049A000002083A707232EC6829703278900B245DC +:1049B0006363E506198D1C50B70480000D811387D1 +:1049C000F42F6205598D88C303C50A5911850D89D5 +:1049D000EFF08FA283278A559843458F98C3D85705 +:1049E000719BD8D783A7C958A3020400A300040071 +:1049F000094798C3F2506254D2544259B259225ACC +:104A0000925A025BF24B2161828093070008E31502 +:104A1000FBF6894495B7B737002083A78728998F7D +:104A20003E9551BF03C50A5911850D89EFF0CF9C02 +:104A300083278A55B706800037650600984313051B +:104A400005ED558F98C3D857719BD8D797C0F91FDC +:104A5000E780E0D383A7C95823060900A302040016 +:104A6000A3000400094798C38347C90093F7F70FD1 +:104A7000E5DF49B7B737002083C7C7F4797106D699 +:104A800022D426D24AD04ECE52CC56CA5AC893F718 +:104A9000F70F63910712AA843545EFF0AFD21306E2 +:104AA000710099451305001037340020EFF0ADEA8E +:104AB000373900201304C42361E519469305F00F2C +:104AC0001305710097C0F91FE780809F8547630930 +:104AD000F50A89475C80194693054925130511009D +:104AE00097C0F91FE78020854828373400209309B4 +:104AF000045BEFE0FFF503C7F900B73700209387A9 +:104B0000075998B303A7490137390020C88698C7C9 +:104B100083270923797AB73A00208297373B002010 +:104B200023ACA9001304045BB73900207D1A938AD3 +:104B30004A56130B4B281080B9450A85EFF03FD435 +:104B40005C2409476311F706188085470144631EFA +:104B5000F700373600201306C65C99451305001090 +:104B6000EFF01D890545EFF0FD832285B2502254F8 +:104B700092540259F249624AD24A424B45618280BC +:104B80008547194693054925130511005C8097B0A8 +:104B9000F91FE780407AB7F5060019469385858AA4 +:104BA0001305710035BF89C8FD1493F4F40F89E42F +:104BB00023060400054455BF1480094783A7C9583C +:104BC000639BE604D847B3764701D4C701000100D0 +:104BD00083A7C958896694C7930600F82382DA0030 +:104BE0009306E06EF4D3D8C703A7C9587C53FDFFE2 +:104BF000832709238297184C6363E504198DA16705 +:104C0000938707D0E3F9A7F2EFF00DB683270923C6 +:104C1000829708CC0DB7D44733F74601D8C70100B7 +:104C2000010083A7C958096798C7130700F82382B2 +:104C3000EA0005671307E7EBF8D3D4C775B78327F6 +:104C40004B00998F3E9565BF0111300099451305C2 +:104C5000001006CEEFF02DD00DED19469305F00FA4 +:104C6000280097C0F91FE780A08585476303F502F8 +:104C700019469305F00F280097B0F91FE78040729E +:104C80003000994513050010EFF08DF60545EFF063 +:104C90006DF1F240056182801C49638C071241115D +:104CA00026C206C622C44AC01C21AA8493F7070460 +:104CB00081C75C410945C5CF373900201306000282 +:104CC00081451305095997B0F91FE780606D1306F8 +:104CD0000002A6851305095997B0F91FE780A06562 +:104CE000930709599C3F1304095981E793078002F0 +:104CF0001CBC3C2C99E3A1473CAC3C3C99E3C54728 +:104D00003CBC5C2C99E3ED575CAC5C3C99E3ED5703 +:104D10005CBC9C2093F7070499CB5C4037B7240018 +:104D20001307F7E9636BF704930750021CB0B7341D +:104D300000209387045BC8439384045B09C597B044 +:104D4000F91FE780203D8347095923A20400858B82 +:104D500091CB483C93059004090597B0F91FE78073 +:104D6000602EC8C01C300145FCB41C44DCC8B240F5 +:104D7000224492440249410182803707250093066C +:104D8000F74863EDF6003767DBFF13070793BA9721 +:104D90001307007DB3D7E702FD1749BF1307074983 +:104DA0006395E7009307600251B737D725001307D3 +:104DB000F777636DF7003767DBFF13070793BA9741 +:104DC0001307007DB3D7E702F9178DB79307700279 +:104DD000B1BF0545828079714AD0373900209307E9 +:104DE00009599C4706D622D426D24ECE52CC56CA5A +:104DF0005AC85EC662C466C26AC06388071E37347A +:104E0000002093074456FC3315472A8C130444565C +:104E10000945630AF7180D45373B0020AE84B28B75 +:104E2000B68CEFF02F9A93070B5BDC27130D095913 +:104E300093090B5B898B8DC73D4A97E0F91FE7808B +:104E4000E0F5E37CAAFE8347AD019607C117E3E6D0 +:104E5000A7FEB737002083A7C7581307000AF8D367 +:104E6000B73A002003A78A555C57F19B93E71700D8 +:104E70005CD783C7C900898B99E78347095993F7A2 +:104E800007046390071403451D008145EFF08FDA96 +:104E900083A78A5537063300373A002098431377A3 +:104EA000F7E798C398431377F7E71367071098C39A +:104EB000373700208326075E9846518F98C6032710 +:104EC000CA589306A00534CB83268D0094C7832649 +:104ED000CD00D4C38347095993F617005C43F99B6F +:104EE000D58F5CC383C7E90023087B5BA38099014E +:104EF00093E727002387F900085063080C0C230070 +:104F0000750104B12686E285090597B0F91FE7808F +:104F100080421C500327CA583CDB23010400A30134 +:104F200004008D477CB083C7C900898B9DC77C5323 +:104F3000FDFFB737002083A70723829703A78900C7 +:104F40006369E508198D1C50890493F4F40F84B348 +:104F50000D81A6972380070088B303450959A685CC +:104F600011850D89EFE05FC983470959858BADCB6A +:104F7000374506001305855797C0F91FE780208144 +:104F800083A78A55B706800001459843558F98C37B +:104F9000D857719BD8D78327CA58A3020400A3000F +:104FA0000400094798C3B250225492540259F2495E +:104FB000624AD24A424BB24B224C924C024D45615E +:104FC0008280894503254D00D1B523207501814498 +:104FD00089B7B737002083A78728998F3E95A5B753 +:104FE000374506001305C55041BF05456DBF3971F2 +:104FF00056D2B747024006DE22DC26DA4AD84ED621 +:1050000052D45AD05ECE62CC83AAC72023A60720F2 +:105010000F100000B734002013870459184705E328 +:1050200023A657210545F2506254D2544259B25931 +:10503000225A925A025BF24B624C216182803737CE +:1050400000200327074B09C723A657210945E1BFC5 +:1050500083C70459328C138A0459858BB68B2E86EC +:105060002A89B9CB373400209307045BDC4313044F +:10507000045B89EF0345DA012EC693059004090508 +:1050800097B0F91FE78000FC324648C05C4099E7C2 +:10509000B747024023A657210D4571B7382098A382 +:1050A0005C40630A090421CA90B34840CA850905D7 +:1050B00097B0F91FE7802028373B002093074B5615 +:1050C000FC33154713094B56630AF70083478900E1 +:1050D00019476385E7000D476392E702834799000C +:1050E00089E7930780102314F900B747024023A6ED +:1050F000572101450DBFA38007007DBFB7390020B0 +:1051000083A7C95898430D8B05C73737002023065E +:1051100007F4B84B619BB8CB98431367870098C3DB +:105120009C438D83858B89C701000100010001002C +:1051300083A7C95809673734002023A2070698C7F8 +:10514000230209009307045BDC271304045B918BA3 +:1051500091E783C5045993F70504F1EF03451A005D +:105160008145EFF02FAD03C504598345CA010146BF +:1051700011850D89EFE0BFBC3737002083278755A5 +:1051800083268A0094C78326CA00D4C383C70459E0 +:1051900083A6C958BA8413F61700DC42F99BD18F55 +:1051A000DCC25C40A301840123017401BCDA7C24CD +:1051B00093E747007CA4930700042302FB56A14712 +:1051C000A303F900B737002083A7872699C70828CB +:1051D00013060064C145EFE0EDDD83A7C958DC4349 +:1051E000858BADC3375506001305A54897B0F91F49 +:1051F000E780E05903A78455B70633001C4393F7B3 +:10520000F7E71CC31C4393F7F7E793E707101CC3AA +:10521000B737002003A7075E1C47D58F1CC783A79D +:10522000C95813079005B8CBA3020900A3000900D1 +:10523000054798C35DBD93F5050393E51500032568 +:105240004A0005B7375506001305E52445B77971BF +:1052500022D43734002006D626D24AD04ECE1307A9 +:1052600044561C33858B6380071E13044456B734A1 +:105270000020A307010083294402A3000400EFF0EB +:105280006FA79387045BDC279384045B3739002086 +:10529000918B6389071483C71900CE9798239307CE +:1052A00000086318F7008347095993E7870023082C +:1052B000F9585C4C0D47637CF70CF1175CCC5C4CE7 +:1052C000984463ECE70C3387E74083C71900D42484 +:1052D000CE979C33E206E1868E0763DF060C63F40B +:1052E000E70C1D8F9306000263E8E600584C636FDD +:1052F000F70AB307F7409CC488288945EFE0ADADB5 +:1053000083470959A18BF1CBB737002083A6C75833 +:105310009307800C1307F00FFCD21C5037063300A4 +:10532000014598C323010400B7370020A3010400FE +:1053300003A78755A3020400230204001C4393F72C +:10534000F7E71CC31C4393F7F7E793E707101CC369 +:10535000B737002003A7075E834509591C4791858D +:105360008D89D18F1CC79307A005BCCA054697D06D +:10537000F91FE780803983470959B420B030DD9B9D +:105380002308F95881450145EFF07FC675A03737EE +:10539000002003278728BA970DB7B736002083A6C9 +:1053A0008628B6970DB73387E7402DBFB736002064 +:1053B00083A68628369735BF584C636AF700B30733 +:1053C000F7409CC4DC2493E70708DCA435B7B73664 +:1053D000002083A686283697DDB783C71900F91702 +:1053E000A380F9004850814681451306F10097D00B +:1053F000F91FE78080295C50931585019306F00F13 +:105400009823E1856309D700BC306386D700630425 +:10541000F70093E525008307095963C6070081E576 +:105420009C872380F90013090959832709015050EB +:1054300093F5F50F0D458297B250225492540259BC +:10544000F24945618280B737002083A7C758FC53D3 +:105450009DE3EFF02F8AB737002083A7072789C77E +:105460008545130510088297B73700209387075B9F +:10547000B423B03301BF7C332147E31FF7FAB737BA +:10548000002005472386E7F445BF797122D43734DD +:1054900000208347445606D626D24AD04ECE52CC60 +:1054A000858B638F07209307445683A94702814663 +:1054B0001306F10081454E8523020456A30701001F +:1054C00097D0F91FE780601C131A8501B7340020BC +:1054D000135A8A41130444569384045B631E0A00E2 +:1054E000BC309306F00F6389D7005850182363052A +:1054F000D7006303F700094A3739002083070959A9 +:1055000063C6071263160A129C872380F900DC2405 +:10551000918BBDCB5C4C0D47637AF714F1175CCCD3 +:105520005C4C984463EAE7143387E74083C719006B +:10553000D424CE979C33E206E1868E0763DD061401 +:1055400063F2E7141D8F9306000263E8E600584CEF +:10555000636DF712B307F7409CC488288945EFE0D4 +:105560008D8783C719003387F900142313070008B8 +:105570006394E6141C501307F00F98C3834709592E +:1055800093E787002308F958B737002003A7075E81 +:105590005C578583858BB1C393070959DC43C1658B +:1055A000938505A0B3D6B702370510FE7D15B3F776 +:1055B000B702FD8A139646017443E98ED18E74C3F7 +:1055C0009306A00F3706FCFFAA07B3D7D702744390 +:1055D000F18EBA07B983D58F7CC3DC4003450959E6 +:1055E0008C3311850D89EFE02FE137550600130547 +:1055F000A57097B0F91FE7808019B737002083A7FF +:105600008755B70680009843558F98C3D857719B2C +:10561000D8D783470959A18BB1E3130909598327C7 +:105620000901505081450D4582970DA8E3010AEE0E +:10563000EFE03F91130909595050832709010D45A7 +:105640009375FA0F8297C840B420B03001C50C3171 +:10565000090519A081450145EFF07F99B250225408 +:1056600092540259F249624A4561828037370020DC +:1056700003278728BA975DB5B736002083A686280A +:10568000B6975DB53387E7407DBDB736002083A66A +:1056900086283697C1B5584C636AF700B307F740C0 +:1056A0009CC4DC2493E70708DCA445BDB736002082 +:1056B00083A686283697DDB7F917A380F900E9B5E8 +:1056C000B737002083A7C758FC5385E7EFE09FE278 +:1056D000B737002083A7072789C789451305100816 +:1056E0008297B73700209387075BC843B033B42352 +:1056F000B1BF130444567C302147E311F7F6B737A6 +:10570000002005472386E7F491BF4111B7370020F9 +:1057100006C622C4938747569833058B1DC7A380BE +:105720000700EFE03FDDB737002003C707593E848D +:10573000218B29E39387075903A30701014681457C +:1057400011452244B24041010283B737002083A7AC +:10575000C758FC53A1EBB737002003C707593E8455 +:10576000218B09EB9387075903A307010146814564 +:105770005145C1BFB73700209387075BC843B0339B +:10578000B42311CD0C310905EFF07F86834704590E +:10579000DD9B2308F458B2402244410182808145B8 +:1057A0000145DDB7B737002005472386E7F4E5B7A5 +:1057B000411126C2B747024006C622C483A4C720AF +:1057C00023A607200F100000373400209307045B46 +:1057D000C843238707001304045B09C597B0F91F6A +:1057E000E7804093B73700201387475618372322A6 +:1057F00004009387475619C7942721476394E6000E +:10580000A3840700F83399466386E600F8339D4683 +:105810006396E600F83398A7054798B7EFE06FF274 +:105820000828B7370020C145238607F4EFE08DA094 +:10583000B2402244B747024023A697200145924434 +:1058400041018280411126C2B734002006C622C41D +:105850004AC0EFF0FFF51389045B8347F900373442 +:105860000020130404591CB0034509018327490192 +:10587000A1459384045B1CC4EFE0CD9B0345090163 +:105880009145EFE02D9B8347C900898B95C31C4848 +:105890000146814513052002829722442386040095 +:1058A000B240924402498945014541016FE08DB003 +:1058B000DC24918BFDD31C48014681451305400231 +:1058C000E1BF797126D2B734002006D622D44AD05F +:1058D0004ECE52CC56CA5AC85EC662C41387045B09 +:1058E0005C27898B63870710373400209307445661 +:1058F000FC338D46130444566391F602082B914500 +:105900002254B25092540259F249624AD24A424B4E +:10591000B24B224C45616FD01DCC3545797A9384CA +:10592000045BEFE02FEAA149373B00203739002024 +:105930007D1A896B1306000881450145856AEFE0F1 +:105940001FF4130C00F8938A2AF93C20858B8DE70D +:105950008327C958FC53F5FBFD19E39D09FC22542C +:10596000B25092540259F249624AD24A424BB24B67 +:10597000224C45616FF01FED03450B59014693051D +:10598000F00F11850D8923010400EFE04FBB834523 +:105990000B591306F00F054591858D8997D0F91F96 +:1059A000E780A0D63C30858B81CFA3010400EFE0D7 +:1059B0007FB4DC248545882893E70708DCA489B7F1 +:1059C000EFE05FB38327C958D847B3764701D4C700 +:1059D000010001008327C95823A477012302840111 +:1059E00023A25707D8C78327C958FC53B5D3010052 +:1059F000DDBFB250225492540259F249624AD24A4F +:105A0000424BB24B224C45618280411122C406C6F2 +:105A100093F715002E84B1C3B73700209387075B37 +:105A2000D827098B0DC7D827882B13060005931795 +:105A30008701E18763DA0700B737002003C6975A6A +:105A40009307000A3306F6029145EFD0BDD6134501 +:105A50001400B24022444101828093F72500A9C37B +:105A6000B73700209387075BD827118B1DC7D8272E +:105A7000882B1306000A93178701E18763DC070070 +:105A8000B737002003C6975A9307000A3306F60279 +:105A900013068602A145EFD0FDD11345240055BF62 +:105AA00093F7450091C7EFF0DFE11345440055B788 +:105AB00093F7850089CFB73700209387075BDC27F2 +:105AC000918B99C3EFF01FD81345840059B793F712 +:105AD00005010145BDDFEFE02DC9B73700209387F1 +:105AE0004756FC332147631BF700B737002003C537 +:105AF000075C13060064C145EFD0DDCB13450401FC +:105B000089BFB737002083A7074B1971CED686DE31 +:105B1000A2DCA6DACAD8D2D4D6D2DAD0DECEE2CC93 +:105B2000E6CAEAC8EEC685496399072AB737002056 +:105B30001387075918473EC6138907598549630ECD +:105B40000728B73A002093874A56FC3319479384B5 +:105B50004A5689496303F728FC301D47630FF7262F +:105B6000FC302147630BF7269C34639807262A8A6A +:105B700037340020EFE0EFBC9307045BF83723864F +:105B80000700DC4BB73900209385492519462324AB +:105B9000F900130551029547A300E9002302F10221 +:105BA00097A0F91FE7802079EFE0AFE193578500D8 +:105BB0002309F10293570501A309F10283479901D3 +:105BC000A308A1026181A30AF1028357A901230A54 +:105BD000A1021304045B231BF10283274901373B15 +:105BE00000203EDC83478901230EF102B7370020F5 +:105BF00003C50725EFD0DFE5A30EA1024ECA8149F8 +:105C000063040A0283270B23829713175A003A95DD +:105C1000B73700202A8A83A787286364E500636476 +:105C2000F500330AF540854983270B23373C0020D4 +:105C3000B73C002082978327CC58985008CC154653 +:105C4000B8DBE9454810EFE0DFB4F977FD173ECC4B +:105C5000938C4C28A167938707D0B73D00203ECE98 +:105C6000DC30858B6380071CA382040097D0F91F6A +:105C7000E780009F83C74A56858B6380071A03AD70 +:105C800044029C5081461306310281456A853EC814 +:105C9000A301010223820A5697D0F91FE780E09EF4 +:105CA000AA8B631C051683462D0005476397E614EF +:105CB000625763070718C247194693053D001385CD +:105CC000970097A0F91FE7800067B247E94503C531 +:105CD000075911850D89EFD03FF2B737002083A710 +:105CE0008755B70680009843558F98C3D857719B46 +:105CF000D8D797D0F91FE780A0969C30858B638E0C +:105D00000710A380040023820A56130D40060100E9 +:105D10007D1DE31E0DFE0327CC58E2475047B376A6 +:105D2000F60054C70F1000000327CC58B7370020E7 +:105D3000896683A5875514C7930600F8D4A09441BB +:105D4000B1828D8A639B06129306601974D350C783 +:105D500097D0F91FE780C09003C74A56058B55CFEF +:105D6000D85023820A56142319476398E60A03275A +:105D70000B23029708C4EFF0BFA34257373500202A +:105D800089459356870003474103130545CFA30078 +:105D900009006207558F2324E9001147A306040078 +:105DA00058A4EFD03DE183254901A30804008146B2 +:105DB0001306000233D7A501058B09C7850B93FB9A +:105DC000FB0F8546050DE317CDFE99C2A3087401AC +:105DD000082889458149EFD01D80F65066544E85CC +:105DE000D6544659B659265A965A065BF64B664C17 +:105DF000D64C464DB64D096182800946639FC60068 +:105E0000D247194613059D009385472597A0F91F92 +:105E1000E78060630547E30DE5E81546E94548106E +:105E2000EFE03F97638B090683270B23829763621A +:105E300045073305454163420506EFF07F9771BF83 +:105E4000EFE02F9003453102FD5793854D5A5915C8 +:105E500062056185232AF90097D0F91FE780809AAF +:105E600013854D5AEF105FDB914763F6A700832738 +:105E700049013EDC5DB77C34EDBF94418945B18278 +:105E80008D8A6395B6009306E043C9B59306E01B7F +:105E900075BD3305AA40E34205FA83270B23829799 +:105EA000184C6362E502198DF247E3FBA7DAEFE0D5 +:105EB000AD8B83270B23829708CC1546E945481004 +:105EC000EFE03F8D41BB83A74C00998F3E95E9BF22 +:105ED000011126CAB734002093844456BC204AC816 +:105EE00006CE3739002022CC4EC652C4858B13090A +:105EF000095B63890716B739002003C509590146B4 +:105F00009305000211850D8923810400EFD03FE342 +:105F100083C509591306F00F054591858D8997C0F2 +:105F2000F91FE780807EBC30858B638D0712C850D7 +:105F3000A38104008146014681452381040097C066 +:105F4000F91FE78080742A8A631E0510C0509547A8 +:105F500038206319F710B735002019469385452579 +:105F60001305940097A0F91FE780E04D8547631B58 +:105F7000F50E9C501947814598C303C509591185F1 +:105F80000D89EFD07FC783C5095901460D4591851D +:105F90008D8997C0F91FE7804077BC20858BF9C3B6 +:105FA000B737002083A70723238104008297232487 +:105FB000A900EFF0EFFF3C3813870959A300070051 +:105FC0001CBF5C28A306090001463CAF5C389389DE +:105FD0000959930500023CBF14287C34A206DD8ECB +:105FE0001C38C207DD8E3C28E207D58F1CC77438E9 +:105FF0007C28A206DD8E1C2CC207DD8E1C3CA3086B +:106000000900E207D58F5CCB0147B3D6E700858A4C +:1060100089C6050A137AFA0F05460507E317B7FE86 +:1060200019C2A30849013C2C3735002093053400E0 +:10603000238CF900194689471305C55C2306F9002E +:1060400097A0F91FE780202F624403450901F24021 +:10605000D2444249B249224A130680029145056161 +:106060006FD04DF5EFD0FFEDF2406244FD572306AF +:10607000F900D2444249B249224A05618280B737C9 +:1060800000209386075BD8269387075B1377F70F6B +:106090005DE7D426373600201307065993F6F60F2E +:1060A000C1EA8346065993F60604D9C2B7B724005D +:1060B00048C39387F7E963E1A702930750021CB333 +:1060C000B737002093874756FC330D478945630354 +:1060D000F70085456FE00FB6B70725009386F748B0 +:1060E00063EDA600B767DBFF93870793AA97930634 +:1060F000007DB3D7D702FD17D9B79387074963153A +:10610000F5009307600265BFB7D725009387F7773F +:1061100063EDA700B767DBFF93870793AA97930602 +:10612000007DB3D7D702F91759BF9307700241BF5B +:106130009376F50F14B3F4B78145368561BF82803D +:10614000B73700209387075BDC2793F7F70FA1E3AE +:10615000B737002003C607590547137606040DCA52 +:10616000411106C693870759C8C38CB3B7370020BF +:1061700093874756FC330D4789456303F7008545F0 +:10618000EFE04FABB24001473A85410182800547BD +:106190003A858280411106C622C4EFE08F9E3734D3 +:1061A00000201305045B13064002814597A0F91FE8 +:1061B000E780001F37650600FD571305A5A02328BB +:1061C000F45AEFD09DB11304045B08A8B2402244F6 +:1061D000014541018280B737002083A6075E05672D +:1061E00013071710D8C6514701007D1775FF03A785 +:1061F000075E23260700514701007D1775FF03A79F +:10620000075E8567938717105CC78280411106C6B9 +:10621000EFF07FFCB737002083A7075E1307004825 +:106220003703009098D7B8477D13370E0020337797 +:1062300067003367C701B8C7B847B70600F9FD164E +:10624000758F37060004518FB8C7B8473706F9FF76 +:106250007D16419B13679700B8C7B847B708008001 +:10626000B70E0002718FB8C7B847370600FF7D161A +:1062700033671701B8C7F84745757D1E619B1367E3 +:106280003700F8C7F8471377F7F813670703F8C71D +:10629000EC4793F5F58F93E50530ECC7F847718F20 +:1062A000F8C7F84711663367D701F8C703A8070591 +:1062B0001307F5FF7D753378E8003368C80023A81D +:1062C000070503A847057D15137808FF1368C80064 +:1062D00023AA0705F04B13660608F0CBF04B698E36 +:1062E000F0CBC85F798D2167598DC8DFCC5F370748 +:1062F0000040F58DB3E5D501CCDFD05FB705700068 +:106300003376C601598ED0DFD05709674D8ED0D76E +:10631000D057F18ED4D7D45775767D16F18ED98E9D +:10632000D4D7D4573706FDFF7D1637070200F18E0C +:10633000D98ED4D7945BC19A94DB945B93F6F6F034 +:1063400094DB945B93F6F68F94DB985BB706005072 +:106350004D8F98DB985B33776700558F98DB985F9C +:10636000B70608FFFD16758FB7061000558F98DF2A +:10637000985FB368170123AC1703B24041018280D4 +:10638000B737002083A7075EB7060090FD16F84FC9 +:10639000758FF8CFF84FB70690FFFD16758FF8CFC1 +:1063A000F84FB706F9FFFD16758FF8CFB44B457758 +:1063B0001306F7FFF18E2567D98EB4CBB847B70621 +:1063C0000007558FB8C7B847B7060070558FB8C7D4 +:1063D000B847B70607001367F700B8C7B847558F27 +:1063E000B8C7B8479D66718F558FB8C7B847B7060D +:1063F000000113670730B8C7F84713670770F8C77D +:10640000F847558FF8C7F8471377F7F8F8C7F847F4 +:1064100013677700F8C78280373700208327075E2D +:1064200041767D16B44BF18EB4CB944737062000ED +:10643000D18E94C7D44793E60601D4C7D447BD9AFA +:10644000D4C701000100010001008326075E056634 +:10645000DC4693E70701DCC6DC42D18FDCC2B737EC +:10646000002003A6C758930700057CD27C5291C731 +:1064700083A7C609A183858BF5DB0100010001001C +:1064800001008327075E416603A7C709B44BD18E7D +:10649000B4CB9376F701B84B019B558FB8CB984797 +:1064A000B706E0FFFD16758F98C78280B7370020CA +:1064B00083A7075E41777D17B44F4166F98EB4CF4D +:1064C0009447D18E94C7D44793F6F6EFD4C7D443FC +:1064D000758FD8C3D44793E60610D4C7D843518FDD +:1064E000D8C38280AA873DC114211947054563900E +:1064F000E6069033B423AC3337370020230BC7FEB6 +:1065000037370020A30BD7FE373700202302B75EB2 +:10651000CC2337370020230AB75CCC333737002031 +:10652000A302B75EF823B7370020238EE75C373726 +:10653000002011CA89CAB757341293878767232C62 +:10654000F75C01458280232C075CE5BF054582800E +:1065500039C199471CA1B737002083C767FF1CB119 +:10656000B737002083C777FF3CA1B737002083C728 +:10657000475E3CB1B737002083C7475D5CA1B737A2 +:10658000002083C7575E5CB1B737002083C7C75D63 +:106590007CA101458280054582805D71A2C43734AB +:1065A00000208327045EA6C24EDE86C6CAC052DC27 +:1065B00056DA5AD85ED662D466D26AD06ECED84346 +:1065C000FD76FD161377F7EFD8C39857B73500203F +:1065D000938575FF758F98D7D857B7060200B734E3 +:1065E00000203D9BD8D79847938464FFB73900209B +:1065F000558F98C7D843B736002013670701D8C313 +:1066000003A6865D37573412130787672EC6E3004B +:10661000E64CD84301791309F90F799BD8C3985FE9 +:10662000B166938606F033772701558F98DFD843FC +:1066300013671700D8C397D0F91FE780808083279E +:10664000045EB24603A707091377F70398A003A7D0 +:10665000470929831377F70798A2D843B966938629 +:106660000670799BD8C3985F33772701558F98DFE1 +:10667000D84313671700D8C397C0F91FE780607C21 +:106680008327045EB736002003A707091377F703B3 +:10669000A382E65E03A74709B73600202983137754 +:1066A000F707238EE65CD843B56693860630799B60 +:1066B000D8C3985F33772701558F98DFD843136786 +:1066C0001700D8C397C0F91FE780A0770327045E9F +:1066D0008327070993F7F7032382F95E8327470986 +:1066E00037370020A98393F7F707230AF75C83C79E +:1066F000495E94207D7E3EC422478327045E130EAC +:10670000FE0F998E03A7070A13F6F6001305400241 +:10671000419B518F23A0E70A130760023387E602EB +:106720001306700283A5070A45737D1393F5F5F0F0 +:1067300013043002B708F1FFFD1813082002334795 +:10674000C702930E10027D4FF94FF542F1436D4D94 +:10675000514CC944C54B3D49B949B14A2D4B354A05 +:106760003D8B12074D8F9305500223A0E70A338714 +:10677000B60283A5070AB3F5C5013347C7023D8BAF +:1067800022074D8F23A0E70A3387A60283A5070AB5 +:10679000370500F17D15B3F565003347C7023D8B22 +:1067A00032074D8F23A0E70A3387860283A5070AA5 +:1067B0006144B3F515013347C7023D8B42074D8F46 +:1067C00023A0E70A3387060383A5070A370810FFCB +:1067D0007D18B3F505013347C7023D8B52074D8F36 +:1067E00023A0E70A3387D60383A5070AB70E001054 +:1067F000FD1EE98D3347C7023D8B62074D8F23A0F5 +:10680000E70A139756003347C7029315C70103A73A +:10681000070A3377D7014D8F23A0E70A3387E603B2 +:106820005D4F3347C7029375F70003A7470A419BA3 +:106830004D8F23A2E70A3387F60383A5470AD94F72 +:1068400093F5F5F03347C7023D8B12074D8F23A216 +:10685000E70A3387560283A5470AD542B3F5C50137 +:106860003347C7023D8B22074D8F23A2E70A3387A8 +:10687000760283A5470ACD43B3F565003347C702C7 +:106880003D8B32074D8F23A2E70A3387A60383A5EA +:10689000470A294DB3F515013347C7023D8B42071F +:1068A0004D8F23A2E70A69473387E60283A5470A8B +:1068B000B3F505013347C7023D8B52074D8FE545C0 +:1068C00023A2E70A3387B60283A5470AE98D334737 +:1068D000C7023D8B62074D8F23A2E70A33878602EA +:1068E0000D443347C7029315C70103A7470A3377FF +:1068F000D7014D8FB385E60323A2E70A03A7870AD2 +:10690000254F419BB3C5C502BD894D8F23A4E70A1E +:106910003387F60383A5870A9D4F93F5F5F0334738 +:10692000C7023D8B12074D8F23A4E70A3387560217 +:1069300083A5870A9942B3F5C5013347C7023D8B4A +:1069400022074D8F23A4E70A3387860383A5870A8E +:10695000B3F565003347C7023D8B32074D8F23A443 +:10696000E70A3387760283A5870A9543B3F51501B5 +:106970003347C7023D8B42074D8F23A4E70A338775 +:10698000960283A5870AB3F505013347C7023D8BFD +:1069900052074D8F23A4E70A3387760383A5870A1E +:1069A000E98D3347C7023D8B62074D8F93954600B3 +:1069B000B3C5C50223A4E70A03A7870A3377D70123 +:1069C000F2054D8FB385260323A4E70A03A7C70A60 +:1069D000419BB3C5C502BD894D8F23A6E70A338706 +:1069E000360383A5C70A93F5F5F03347C7023D8BFD +:1069F00012074D8FB3C5860223A6E70A03A7C70A6D +:106A00003377C701BD89A2054D8F23A6E70A3387D7 +:106A1000560383A5C70AB3F565003347C7023D8B0C +:106A200032074D8F23A6E70A3387660383A5C70A7B +:106A3000B3F515013347C7023D8B42074D8F23A69F +:106A4000E70A3387A60383A5C70AB3F505013347D1 +:106A5000C7023D8B52074D8F23A6E70A3387E60313 +:106A600083A5C70AE98D3347C7023D8B62074D8F67 +:106A700093953600B3C5C50223A6E70A03A7C70A44 +:106A80003377D701F2054D8FB385F60323A6E70AC6 +:106A900003A7070B419BB3C5C502BD894D8F23A832 +:106AA000E70A3387560283A5070B93F5F5F03347C2 +:106AB000C7023D8B12074D8F23A8E70A3387760262 +:106AC00083A5070BB3F5C5013347C7023D8B2207EA +:106AD0004D8F23A8E70A139726003347C70283A5E3 +:106AE000070BB3F565003D8B32074D8FB3C54603E9 +:106AF00023A8E70A03A7070B33771701BD89C2054F +:106B00004D8F23A8E70A139716003347C70283A5C2 +:106B1000070BB3F505013D8B52074D8FB3C5C60278 +:106B200023A8E70A03A7070B698FBD89E2054D8FEC +:106B300023A8E70A03A7070B930580023377D70141 +:106B400023A8E70A37370020A24C0347575E338754 +:106B5000EC40B34DB70283AC470B93FC0CFF334CB6 +:106B6000870393FDFD00B3ECBC0123AA970B83AC14 +:106B7000470BF14D93FCFCF0137CFC00120C33EC42 +:106B80008C0123AA870B330C870283AC470BB3FC21 +:106B9000CC01334CBC02137CFC00220C33EC8C0186 +:106BA000B34CA70323AA870B03AC470B337C6C00C1 +:106BB00093FCFC00B20C336C9C0123AA870B214C84 +:106BC000334C870383AC470BB3FC1C01137CFC00E4 +:106BD000420C33EC8C0123AA870B330C570283AC95 +:106BE000470BB3FC0C01334CBC02137CFC00520C71 +:106BF00033EC8C0123AA870B330CF70383AC470BD0 +:106C0000B3FCAC00334CBC02137CFC00620C33ECD4 +:106C10008C01B34C770223AA870B03AC470B337C60 +:106C2000DC01F20C336C9C01B30CE70323AA870B45 +:106C300003AC870B137C0CFFB3CCBC02330B670394 +:106C400093FCFC00336C9C0123AC870B114C83AC90 +:106C5000870B93FCFCF0334C8703B30A5703137C78 +:106C6000FC00120C33EC8C0123AC870B03AC870BBC +:106C7000F54C337CCC01334BBB02330A4703137B07 +:106C8000FB00220B336B6C0123AC670B03AB870B50 +:106C90004D4C337B6B00B3CABA02B309370393FA86 +:106CA000FA00B20AB36A5B0123AC570B83AA870BC5 +:106CB000594BB3FA1A01334ABA0233092703137A3C +:106CC000FA00420A33EA4A0123AC470B03AA870BB6 +:106CD000DD4A337A0A01B3C9B9023349B90293F9DB +:106CE000F900D209B3693A0123AC370B83A9870BAA +:106CF000614AB3F9A900B30B77031379F90062096C +:106D000033E929019319470023AC270B03A9870B0B +:106D10003379D901B3C9B902B3049702F2093369CF +:106D2000390123AC270B03A9C70BE549137909FFE8 +:106D3000B3CBBB02B3C4B40293FBFB00B36B7901CA +:106D400023AE770B03A9C70BD54B1379F9F0BD8898 +:106D50009204B364990023AE970AB304870303A98E +:106D6000C70B794C3379C901B3C4B402BD88A204FE +:106D7000B364990023AE970A8944B344970203A9E8 +:106D8000C70B33796900BD88B204B364990023AEA0 +:106D9000970AB304770303A9C70BFD4B3379190195 +:106DA000B3C4B402BD88C204B364990023AE970A89 +:106DB000B304670303A9C70B130B1002337909014E +:106DC000B3C4B402BD88D204B364990023AE970A59 +:106DD000B304570303A9C70B930A20023379A90010 +:106DE000B3C4B402BD88E204B364990023AE970A29 +:106DF000B304470303A9C70B130A30023379D9013F +:106E0000B3C4B402F204B364990023AE970AB30486 +:106E1000370303A9070C93094002137909FFB3C490 +:106E2000B402BD88B3649900694923A0970CB304E8 +:106E3000270303A9070C1379F9F0B3C4B402BD8882 +:106E40009204B364990023A0970CED44B304970215 +:106E500003A9070C3379C901B3C4B402BD88A204E5 +:106E6000B364990023A0970CB304B70303A9070CDC +:106E700033796900B3C4B402BD88B204B364990025 +:106E800023A0970CB304970303A9070C33791901C6 +:106E9000B3C4B402BD88C204B364990023A0970CA4 +:106EA000B304870303A9070C33790901B3C4B402FF +:106EB000BD88D204B364990023A0970CB304770370 +:106EC00003A9070C3379A900B3C4B402BD88E20456 +:106ED000B364990023A0970C93145700B3C4B40271 +:106EE0001399C40183A4070C3306C702B3F4D40179 +:106EF000B3E4240123A0970C03A9470C137909FFDD +:106F0000B3046703B3C4B402BD88B364990023A279 +:106F1000970CB304570303A9470C1379F9F0B3C4D2 +:106F2000B402BD889204B364990023A2970CB30401 +:106F3000470303A9470C3379C901B3C4B402BD8820 +:106F4000A204B364990023A2970CB304370303A9E6 +:106F5000470C33796900B3C4B402BD88B204B3648A +:106F600099001309500223A2970CB304270303A925 +:106F7000470C33791901B3C4B402BD88C204B364A9 +:106F8000990023A2970C93046002B304970203A90B +:106F9000470C33790901B3C4B4023346B602BD8845 +:106FA000D204B364990023A2970C83A4470CE98C04 +:106FB0003D8A6206458E23A2C70C03A6470C931494 +:106FC000C7013376D601458E23A2C70C1306900263 +:106FD0003306C70283A4870CC1983346B6023D8AA4 +:106FE000458E23A4C70C1306A0023306C702B3457F +:106FF000B60203A6870C1376F6F0BD899205D18DF3 +:1070000023A4B70C373600208345465D3736002071 +:107010000346C65D03A9870C3386C540B304A603A7 +:107020003379C901B3C4E40293E48400BD88A204A7 +:10703000B364990023A4970CB304E60303A9870C57 +:1070400033796900B3C4E40293E48400BD88B204D8 +:10705000B364990023A4970C93143600B3C4E402DC +:1070600003A9870C3379190193E48400BD88C20415 +:10707000B364990023A4970CB304F60303A9870C07 +:1070800033790901B3C4E40293E48400BD88D204D7 +:10709000B364990023A4970CB304560203A9870C88 +:1070A0003379A900B3C4E40293E48400BD88E20408 +:1070B000B364990023A4970CB304760203A9870C48 +:1070C0003379D901B3C4E40293E48400F204B364D5 +:1070D000990023A4970C93142600B3C4E40203A9D7 +:1070E000C70C137909FF93E48400BD88B364990049 +:1070F00023A6970CB304860203A9C70C1379F9F0F1 +:10710000B3C4E40293E48400BD889204B36499009C +:1071100023A6970C93141600B3C4E40203A9C70C6A +:107120003379C9013347E60293E48400BD88A204A1 +:10713000B364990023A6970C03A6C70C33766600A8 +:10714000136787003D8B3207518F23A6E70C03A7F7 +:10715000C70C3377170123A6E70C324718230D8F8E +:107160003346D70293F5F507E2053D8A93144601AD +:1071700003A6C70C3304870233760601458E23A687 +:10718000C70C1316170083A4C70CE98C3346D6022C +:107190003D8A6206458E23A6C70C03A6C70C33445E +:1071A000D402B37ED60113162700B303770272040C +:1071B00033E48E0023A6870C3346D602B30257026F +:1071C000937EF60003A6070D419A3366D60123A8E5 +:1071D000C70C03A6070DB3C3D3021376F6F0B3C2F0 +:1071E000D20293F3F3009203B363760023A8770CE3 +:1071F00003A6070D337EC601B30FF70393F2F20027 +:10720000A202B3625E0023A8570C03A6070D3373D6 +:10721000660013163700B3CFDF02330FE70393FF87 +:10722000FF00B20FB36FF30123A8F70D03A3070DFF +:10723000B37813013346D602330DA7033D8A4206C5 +:1072400033E6C80023A8C70C03A6070D3378060150 +:10725000334FDF02B346DD02137FFF00520F336F5F +:10726000E80123A8E70D03A7070D798DBD8AE20683 +:10727000C98E23A8D70CD84385663D9BD8C3D84375 +:10728000799BD8C39857558F98D7D857136707015C +:10729000D8D722479376F703985F137707FC558F6B +:1072A00098DF985FB7060081FD16758FD98D8CDF4A +:1072B000B640264496440649F259625AD25A425B75 +:1072C000B25B225C925C025DF24D6161828023AC14 +:1072D000065C6FF0CFC1B737002003A7075E5C43A1 +:1072E00093E707105CC38280411106C6EF00D04EC1 +:1072F00093056040EF300060B2400145410182805B +:107300006F00B05211C589C501C61E2201458DE32B +:1073100001110565C9471306F100130555C38545DD +:1073200006CEDC87EF30C05CF24088870561828042 +:107330008280B73700200111238DA744056513060D +:10734000F100130595C4854506CEA3070100EF3073 +:10735000205AF2408887056182800111130591004F +:1073600006CEEF00104F48840565300025059D4589 +:10737000EF300058F24008840561828001119305C6 +:10738000F10006CE22CC2A84EF00D04E4886056557 +:10739000C086700021801305554091454087EF302D +:1073A0002055F24062440886056182800111130570 +:1073B000D10006CEEF00104E488609657000090521 +:1073C0009145EF30E052F24008860561828001115C +:1073D00006CEEF00D04DC88709651306F1001505EC +:1073E0008545EF30E050F2408887056182800111C9 +:1073F00006CEEF005056C88709651306F10029052F +:107400008545EF30E04EF2408887056182800111AA +:1074100006CEEF00F062C88709651306F100390552 +:107420008545EF30E04CF240014505618280011155 +:1074300006CEEF106029C88709651306F1004105E3 +:107440008545EF30E04AF24088870561828001116E +:1074500006CEEF108002C88709651306F1004505C6 +:107460008545EF30E048F240888705618280411110 +:1074700006C622C4EF1000088965CD052A84EF30C6 +:1074800060472285B240224441018280011106CE2C +:10749000EF106028C88709651306F100510585457E +:1074A000EF300045F24088870561828001111305A5 +:1074B000510006CEEF104038488209655000610542 +:1074C000A545EF30E042F24001450561828041115F +:1074D00006C6EF10A0398965E505EF30A041B2403E +:1074E000014541018280011106CE22CC2A84EF1091 +:1074F000404948860965C0867000218069058D4530 +:107500004087EF30E03EF2406244014505618280F1 +:10751000011106CE22CC2A84EF10605548860965F9 +:10752000C086700021806D058D454087EF30403C5E +:10753000F2406244014505618280B73700208386AE +:107540000756011122CC06CE2A872E8463C5060079 +:1075500085462380D75689679386D701631ED40258 +:10756000B737002093878740239407000823130729 +:10757000F01F238C0702C8A3FAA3014685455125B5 +:10758000C88722851306F1008545EF306036F2404A +:107590006244888705618280938737036312F4020F +:1075A000B737002093878740239407000823C8A398 +:1075B0000C33ECB330237D57F8A3238CC702C1B73B +:1075C000C947DC877DBF011126CAB734002006CE2B +:1075D00022CC4AC89387C41EBC3363850716B736CE +:1075E000002083C706569384C41E93F7070481E7DF +:1075F00089472380F65689679386E7012E842A8778 +:10760000639DD504B73700209387874023940700F4 +:1076100008218546C8A30C33CCB330230547F8B303 +:10762000F0A3EF00A072C8879C87D1E7B73700208E +:1076300093878740F833D03385476315F70E0E06DE +:107640001306963B930710273346F602A830896548 +:107650001376F60FEFC0ADB6B9A8938647036391D2 +:10766000D502B7370020938787402394070008216D +:10767000C8A30C33CCB33023F0A33433F4B355B7E1 +:10768000938607056396D504B73700209387874014 +:1076900023940700082193087700C8A30C33CCB3C8 +:1076A0003023F0A33433F4B3034867005C3358232A +:1076B000EF207036C88722851306F1008545EF302C +:1076C00020238887F2406244D24442490561828087 +:1076D0009387B7076395F50437390020130989406C +:1076E000231409001C212302F9001C31A302F90014 +:1076F0003C212303F9003C31A303F90068212A97B8 +:1077000003057700EFC00FBBEF00007D83467900D3 +:1077100003466900834559000345490019B7B1473D +:10772000DC8751BF8947E30CF7F009068D470E0649 +:107730006316F7000E061306965B29B706061306B6 +:10774000765109B73145BDBFB737002023800756B2 +:10775000B737002003C7E740011106CE9307F00FAB +:107760006317F7021305D1002927488609657000C1 +:107770008D457D05EF30C017B737002003C5F71ED4 +:107780008965EFC02DABF24001450561828001455E +:10779000CD254886A306010023070100C1BF0111C2 +:1077A00006CE22CC2A84EF00D02B48860965C086FD +:1077B00070002180130505028D454087EF3040138E +:1077C000F2406244014505618280011106CE22CC5F +:1077D0002A84EF00703D48860965C08670002180CC +:1077E000130515028D454087EF308010F24062444A +:1077F000014505618280011106CE22CC2A84EF006A +:10780000703E48860965C0867000218013052502F8 +:107810008D454087EF30C00DF2406244014505615F +:107820008280011106CEEF102029C8870965130652 +:10783000F100130575028545EF30800BF240888713 +:1078400005618280011106CEEF10A031C88709655D +:107850001306F100130595028545EF306009F240EB +:10786000888705618280011106CEEF10C033C8877A +:1078700009651306F1001305D5028545EF30400771 +:10788000F240888705618280011106CEEF108036B4 +:10789000C88709651306F1001305E5028545EF3039 +:1078A0002005F240888705618280011106CEEF1025 +:1078B000E038C88709651306F100130515038545EF +:1078C000EF300003F240888705618280411106C6CF +:1078D00022C4EF10A03A8965938525032A84EF30EE +:1078E00060012285B240224441018280011106CE0E +:1078F000EF102073C88709651306F100130575039F +:107900008545EF20F07EF240888705618280011175 +:1079100006CEEF10F007C88709651306F1001305BE +:1079200085038545EF20D07CF24088870561828001 +:10793000011106CEEF10901FC88709651306F100EC +:10794000130595038545EF20B07AF24088870561DD +:107950008280797102C0814801488147014706D67B +:10796000EF105037A30FA10009651306F1011305AD +:10797000E5038545EF20D077B2500345F10145611D +:107980008280011106CEEF10D050C887096513061A +:10799000F1001305F5038545EF209075F2408887C7 +:1079A00005618280011106CEEF105068C887096515 +:1079B0001306F100130505048545EF207073F240AE +:1079C000888705618280011106CEEF107077C88725 +:1079D00009651306F100130515048545EF20507164 +:1079E000F240888705618280011106CEEF20600A8F +:1079F000C88709651306F100130525048545EF20A6 +:107A0000306FF2408887056182807971064306D61F +:107A10001AC872531AC662531AC452531AC2425336 +:107A20001AC0EF208011896593853504EF20906C92 +:107A3000B250014545618280B73700202394A744A6 +:107A400001458280011106CEEF20407EC88709657E +:107A50001306F100130515058545EF207069F24006 +:107A6000888705618280011106CEEF20D004C88787 +:107A700009651306F100130525058545EF205067BC +:107A8000F240888705618280011106CE22CC2A84CB +:107A9000EF20B00548860965C08670002180130577 +:107AA000A5058D454087EF20B064F240624408860A +:107AB00005618280011106CE22CC2A84EF20B00914 +:107AC00048860965C086700021801305B5058D457F +:107AD0004087EF20F061F2406244088605618280B1 +:107AE000011106CE22CC2A84EF20900D488609652C +:107AF000C086700021801305C5058D454087EF20A5 +:107B0000305FF24062440886056182805D71130334 +:107B1000D1031AD20343010786C61AD00343C10614 +:107B20001ACE034381061ACC034341061ACA034303 +:107B300001061AC80343C1051AC6034381051AC4C6 +:107B4000030341051AC2034301051AC0EF10601A6E +:107B5000230EA10209657018130565038945EF20FE +:107B60003059B6400345C103616182803737002038 +:107B700093078740BE271307874081E79307F01FCD +:107B80003EA73E272146014593F607108607C20708 +:107B9000B3D6C640C183558D93D5574093D69740F1 +:107BA000AD8E858A7D161375F50FD58F71FE3EA7B4 +:107BB00082803737002093078740DE2713078740EE +:107BC00089E7E17793C7F7FF5EA75E27394601454E +:107BD00091689945B3F617018607C207B3D6C64028 +:107BE000C183558D93D6E74013D8F700858AB3C675 +:107BF00006017D161375F50FD58FE31DB6FC5EA744 +:107C00008280011106CE22CC26CA4AC84EC66DCD4E +:107C1000AD472A8463E4A70C1304F5FF1374F40F33 +:107C20001385F5FF01469305F00F1375F50FEFC0AF +:107C30000F91B734002003A7045E37390020136486 +:107C400004045C571374F407B7390020F59B5CD724 +:107C50000327895537850600130545D11C4393F743 +:107C600007F85D8CB747767100C3938797121CC7DE +:107C7000B7575500938757555CC303A7C958373486 +:107C80000020230204565C4313044456F99B5CC352 +:107C9000A5477CB09790F91FE78060AF83A6C958CD +:107CA000A302040003278955A300040085479CC252 +:107CB0001C4337063300014593F7F7E71CC31C4309 +:107CC00093F7F7E793E707101CC303A7045E1C476D +:107CD000D18F1CC793079005BCCA05A0B1476308A4 +:107CE000F5029307600263E5A7001304E5FF3DB7C3 +:107CF000930770024945E305F4F2F2406244D2442E +:107D00004249B249056182801304500211BF130435 +:107D1000600239B7B7370020938747569833B73793 +:107D2000002093878740058B01CF3737002003273A +:107D30008755185F1583058B01E79A2705079AA7D2 +:107D400003C68703EC33C8236FF0BFEB011126CACB +:107D50004AC84EC656C2B737002006CE22CC52C4FF +:107D60005AC0AE893289B68A83A4475835C9AD470F +:107D70002A8463EEA7021304F5FF1374F40F631D46 +:107D80000906268A338B990063124B071379F90091 +:107D90009386FAFF228523802401A380340193F681 +:107DA000F60F4E868545EFC04FAE014505A0B147A1 +:107DB000630BF5029307600263E5A7001304E5FF78 +:107DC0006DBF930770024945E30BF4FAF240624439 +:107DD000D2444249B249224A924A024B056182800A +:107DE0001304500269BF1304600251BFEFF01FD8A3 +:107DF0002301AA00050A49BF8547631CF9004E8686 +:107E00009305000F138524009780F91FE7804059E0 +:107E1000B5BF89476316F9004E869305A00ADDB702 +:107E20008D47631DF900268A338B9900E3004BF7D9 +:107E3000EFF03FD82301AA00050ACDBF9147631692 +:107E4000F9004E869305F00F75BF95476315F9004D +:107E50004E86814545BF99476315F9004E86BD455D +:107E600055B79D474945E313F9F64E8693055005EE +:107E700051BF411122C42A84354506C6EFC08F94F4 +:107E8000B73700209387874011C49A2718A09A27F4 +:107E9000218318B023940700B737002083A7075E1B +:107EA000984B9316E70063D40602371701141307A3 +:107EB000F78F98CB37071104F8CF09671307879F0F +:107EC00098C7B737002093874756A3830700B2406F +:107ED00022440145410182809307F00363E8A7042F +:107EE000B73700202388A724B737002003A687557B +:107EF000B70600829377F5035856FD1693959701C0 +:107F0000758F4D8F58D6373700208326075E014581 +:107F1000984A1316E700635C0600984A71761306C8 +:107F2000F60F718FA207D98F9CCA82804945828043 +:107F3000AA8749CD2D47636BA7069307F5FF93F7F3 +:107F4000F70F373700200327075EB70600C1FD167D +:107F5000084B93F7F703E207758DC98F1CCBB73732 +:107F6000002083C7072571761306F60F93F7F703F2 +:107F7000939687001C4B0145F18FD58F1CCB7C4F0E +:107F8000B706F9FFFD1693E747007CCF1C4BF58F32 +:107F9000B7060200D58F1CCB9386864FB7370020DB +:107FA00014C7938747563147F8B38280314763023D +:107FB000E502130760026365A7009307E5FF41B779 +:107FC000130770024945E38EE7F68280930750025B +:107FD0008DBF93076002B5B7011106CE9317450117 +:107FE00063D20702EFD0FEDA894709C9142111478D +:107FF000B1476395E60095471CA1C947F2403E850D +:10800000056182802EC6EFF05E98C94765D9382594 +:10801000418B6DD7B2453C35230AB50489E7E94762 +:108020001CA98147E1BFED47E5BF011106CE22CC77 +:108030002EC6EFF09E9501CDB2452A84EFE0BE9F9B +:10804000A305A4020145F2406244056182804945CE +:10805000DDBFB7370020938787400147994683C526 +:10806000870E3306E50005070CA28507E319D7FE46 +:1080700001458280011106CE2EC6EFF01E9109C97E +:1080800083074503B24501459CA1F240056182800A +:108090000945E5BFB73700209387C7239A2B18A15E +:1080A0009A2B218318B1FC373CA10145828019E14C +:1080B00049458280B737002013878740384F4111E8 +:1080C00022C406C62A849387874001C758273145B2 +:1080D00039EB03A7070801C73837314529E703A75C +:1080E000470901C7783331451DEF37350020054773 +:1080F0001946A2851305654FB8A39780F91FE7803D +:1081000080235C301307000C93F7070C6391E702A0 +:10811000373500201946A2851305C54F9780F91FF2 +:10812000E78060210145B24022444101828081EB19 +:10813000373500201946A28513052550C5B713070A +:1081400000044945E391E7FE373500201946A28532 +:1081500013058550E1B7411126C2B734002093873B +:10816000844022C4A04F06C69384844011C47C4836 +:10817000139747006342070CBC5499E74945B24046 +:10818000224492444101828001ED1305000FEFD09B +:108190004E846DD55C25FDD3EFD02EA60145C5B725 +:1081A0000547E31DE5FC1DE8014582972A8459C572 +:1081B0008567938707801EB1930700707EA5B7354A +:1081C00000208D471CADA30A050219469385054F73 +:1081D000130565039780F91FE780E015582485474C +:1081E000E30EF7F87C24B98B85C3782485476317A1 +:1081F000F70289471EB0224403A3C406B24092444A +:108200001305000F41010283EFE04E8DB7370020C8 +:1082100083C717258D8BE31AF5FC8DB71E301167C8 +:108220006374F7001AB0C1BF930600023E87E3FBF8 +:10823000D7FE13070002FDB7314591B71D4581B741 +:10824000B737002083A7C749314599CBFC3389CB89 +:10825000411106C6EF00FFD6B240014541018280C0 +:108260008280011126CA4AC84EC652C456C25AC09C +:108270002E89368BBA89BE8A06CE22CCB284428A37 +:10828000EFF0AEF01307A9FF42078567418393869D +:10829000A7C763E9E610938707C82A84494563E3C3 +:1082A000970A63E1240B1307301F636D670963EBC3 +:1082B000370993071B00B387970213973900860786 +:1082C00063D2E70841C01C3813F747003DC3ED9B5C +:1082D0001CB83C34231A2407231B9406C5EF03570C +:1082E0008406C167FD176309F706631799063E3CCC +:1082F000231BE404231CF404B737002083D7C74BA7 +:108300008D46114763E5F600850713F7F70FA30ABB +:10831000E4042285EFD05EFE83570404A907231FDF +:10832000F4048327440A93E717002322F40AC5477D +:108330005CBC231C5407231D4407231D6405231E16 +:1083400034050145F2406244D2444249B249224ACE +:10835000924A024B056182808357440691CFB3D481 +:10836000F4024A87B3879702C207C1836373F90097 +:108370003E87231CE40449B7B305990085814A85EB +:10838000EFB0BDB9231CA404930584052685EFB086 +:108390006EA19DB78327840A93E707022324F40A7A +:1083A000C14779B7494579BF01112EC606CEEFF016 +:1083B000CEDDB24509E54945F240056182801C39B0 +:1083C000A305B50213F747007DD7ED9B1CB9BD4748 +:1083D0002306F5028327850A93E727002324F50A5D +:1083E0000145D9BF011106CE2EC632C4EFF0EED939 +:1083F00003278510137707023DCFB2459306000E81 +:10840000AA87138755FE42074183494563E2E60682 +:108410002246116713078714930686EBC206C182B2 +:108420006368D70403D7471E01456303B704373792 +:10843000002093068740B636A38EB706239FC70653 +:1084400093F5F50F1307874063F3D500AE865A37CF +:10845000239AD71C6373E6003287239BE71C03A78C +:10846000470A856693860680558F23A2E70A014551 +:10847000F240056182804545E5BFB737002013878C +:108480008740384F9387874011C7542781C6543798 +:1084900049478DEA03A7070819C7343789C6142B43 +:1084A0004947858A85E203A7470911C7743381C606 +:1084B0005437494781EA03C7070C83C7170C636524 +:1084C000F7001D473A8582800111C88419461305BB +:1084D000A10006CE9780F91FE780E0E52800EFB005 +:1084E0006F9985471D476313F5000147F2403A85B0 +:1084F00005618280797126D24AD04ECE06D622D42A +:108500002E89B28936C63AC43EC242C0EFF0EEC7E9 +:10851000C94455C59305A9FFC20505662A84C181D2 +:108520001305A6C7C944636CB508130606C863687B +:10853000360963E62909B2469305301F63E1D50881 +:108540002247636EE606138616003306260393154C +:1085500037006356B6061038B144058A2DE203266B +:10856000440A1376162021EE92470248231EE404A3 +:108570003834231CF406231A2407231B3407231D35 +:108580000407231DD4045C3C814451EF8DEB832709 +:108590000410898B8DCF31469305F00F13058406A7 +:1085A0009780F91FE780C0DF8327440A231404065D +:1085B00093E707202322F40AC9475CBC8144B250E8 +:1085C0002254268502599254F249456182806309FA +:1085D0003905B385290185814A85EFB01D94231C97 +:1085E000A404930584054E85EFA0DEFBB737002079 +:1085F00083D7C74B8D46114763E5F600850713F710 +:10860000F70FA30AE4042285EFD01ECF835704049A +:10861000A907231FF4048327440A93E7170059BFCF +:10862000231C2405E1B7C1FF83278410898B8DC7E4 +:1086300031469305F00F130584069780F91FE780F4 +:1086400020D68327440A2314040693E70720232215 +:10865000F40ACD475CBCA5B7E94495B7373700208D +:1086600093078740BC4F1307874091C7D42781C623 +:10867000D437C947A1EA8327070899C7B43789C601 +:10868000942BC947858A9DEE8327470991C7F83304 +:1086900001C7D837C9471DE70111C884194613051A +:1086A000A10006CE9780F91FE780E0C82800EFB050 +:1086B000AF870547B1476313E5008147F2403E8528 +:1086C000056182803E858280B7370020138787400E +:1086D000384F9387874011C7542781C6583749457B +:1086E00015EB03A7070819C7343789C6182B494566 +:1086F000058B0DE383A7470991C7F83301C7DC3722 +:10870000494589EB411106C6EFB0CF8AB240014519 +:10871000410182808280630F051079714AD0373918 +:10872000002022D426D24ECE52CC56CA5AC8930725 +:10873000894006D65EC603A4C7095C21AA84130932 +:108740008940FD8B5CA18D49054AA14A294B05EC66 +:108750008327C9051147C146F1E737350020A685B3 +:108760001305E55015469780F91FE780C0BCB2504D +:10877000225492540259F249624AD24A424BB24BB5 +:108780000145456182803C348DE38327440A1546C8 +:10879000A68593E727002322F40A13058412978005 +:1087A000F91FE78040B900405DB78347E418858B27 +:1087B0009DCF2688014581468345080013D72600B2 +:1087C0002A97B3D5D54093F7360022978589860737 +:1087D00003067719A9C5B317FA00D18FA30BF718B1 +:1087E0008506E39B56FD09050508E31665FD930B19 +:1087F00024191546A6855E859780F91FE780A0C4D9 +:108800005DF11546A6855E859780F91FE780A0B2C9 +:108810008347E41893E787002307F41869B7B397F1 +:10882000F90065BF03C6C7076314E600238ED706A9 +:108830009C431DB749458280411122C426C24AC0CB +:1088400006C62A890144A1449305F00F0545EFB0FF +:108850008DEAB307890088A30504E31794FEB240AC +:10886000224492440249014541018280011122CCF7 +:108870004AC806CE26CA2EC632893684EFF0EE905C +:108880007DCD3C35AA84B2450945D9EB21461385F7 +:10889000B41A9780F91FE78000AAA389241B1359F3 +:1088A0008900238A241B7C2450346C345424A2076E +:1088B000420603C5C404B297AE97E20603A7440A72 +:1088C000B6972DC523A6F40A3C2414341367070277 +:1088D000A207C206B6973434B6971424E206B697B8 +:1088E00023A8F40A7C205430A207C206B69774303D +:1088F000B6975420E206B69723AAF40A3C20143017 +:10890000A207C206B6973430B6971420E206B6978F +:1089100023ACF40A8547A386F40423A2E40A0145A4 +:10892000F2406244D24442490561828023A6F40C9D +:108930003C24143413678700A207C206B697343468 +:10894000B6971424E206B69723A8F40C7C20543082 +:10895000A207C206B6977430B6975420E206B697BF +:1089600023AAF40C3C201430A207C206B697343078 +:10897000B6971420E206B69723ACF40C79BF0945EC +:1089800045B7011106CE2EC6EFF02E8079CD3435D5 +:108990000547AA87B2450545639FE606942B130752 +:1089A000400201456399E606F825D4352207C20640 +:1089B0003697F4353697D425E206369783C6D70422 +:1089C000B1CE23A6E70AB82594352207C20636970A +:1089D000B43536979425E206369723A8E70AF8219E +:1089E000D4312207C2063697F4313697D421E206F5 +:1089F000369723AAE70AB82194312207C206369790 +:108A0000B43136979421E206369723ACE70A130770 +:108A1000A00298AB0145F2400561828023A6E70CD5 +:108A2000B82594352207C2063697B4353697942573 +:108A3000E206369723A8E70CF821D4312207C206B4 +:108A40003697F4313697D421E206369723AAE70CFD +:108A5000B82194312207C2063697B4313697942153 +:108A6000E206369723ACE70C5DB705456DB74111BB +:108A700006C6EFE09EF11DCD34350547AA870945AE +:108A80006397E602942B130740026392E6020D47B8 +:108A90002386E7021947A385E7021307500298AB24 +:108AA00003C7A7020145136717002385E702B240F9 +:108AB000410182800945E5BFB73700202A87138529 +:108AC0008740034815009387874063090802284DB3 +:108AD00011C50348C50031456314080803A50708FC +:108AE00011C50348B5003145631C080603A54709B5 +:108AF00011C50348750031456314080683C8870C07 +:108B000003C8970C1D4563FD080583A7870D4945DC +:108B100093F70704B1C75D71A6C22800B284194655 +:108B200086C6A2C4D88336849780F91FE780A080C8 +:108B3000A6851305E10241469770F91FE780A07FE3 +:108B4000A2851305E10141469770F91FE780A07ED9 +:108B50004800EF50DFB5B6402644964461618280FC +:108B60008280B737002013878740143385C6384F7B +:108B70009387874001C7582749450DE703A7070892 +:108B800001C73837494519EF83A7470981C7FC3327 +:108B9000494589EB411106C6EF509FC5B2400145DA +:108BA000410182808280B7370020138787401433C9 +:108BB0009387874095C2384F01C75427494795E6A8 +:108BC00003A7070801C73437494785E203A74709C8 +:108BD00001C77433494791EA88B303A7070E01C957 +:108BE0001367076023A0E70E01473A858280137759 +:108BF000F79FCDBF130700643305E502B7370020A8 +:108C000041119386874022C403A4C60C26C24AC0E1 +:108C100006C693848740C8DA1309F00F01E8B24012 +:108C200022449244024901454101828008206305A3 +:108C30002501CC58EFA07DA2405CCDB7B73700200E +:108C400013878740A30CA7021377150093878740EB +:108C500011EB03C7C7036D8F6304B70049458280DA +:108C6000238DE70213772500014501EB03C7D703E6 +:108C7000718FE315C7FEA38DC7028280011106CE56 +:108C80002EC632C436C23AC0EFE03ED02DC1B24546 +:108C90000247924693F7150099EB22469D4763F6EB +:108CA000C7004545F240056182802302C5148989C9 +:108CB00091E59D47E3E7D7FEA302D51401CFB7376F +:108CC000002083D7A7447D8F0D8B8547631EF70057 +:108CD0002314E51485477CAD8327450A0567D98FA2 +:108CE0002322F50A01457DBF23140514E5B7494544 +:108CF00055BF5D71A6C2B73400201383844003239F +:108D00008305CAC04EDE62D466D26AD086C6A2C4CB +:108D100052DC56DA5AD85ED66ECE030C4105834932 +:108D2000810503490106834CC106034D0107938465 +:108D30008440630903020323430513145300635360 +:108D400004023143B640264496440649F259625A19 +:108D5000D25A425BB25B225C925C025DF24D1A8594 +:108D6000616182800D4E4943E36EFEFC93FD050177 +:108D7000638C0D08054EE397C9FD3AC6468B42C485 +:108D80003EC2B68BB28A2E842AC0EFC08EC42A8A15 +:108D9000324711E9BC54054582972A8A1D435DD1AB +:108DA000824732471CA5930500026391BB028D45A3 +:108DB0006310B90A0355CA019305900F13035004B9 +:108DC000E3E2A5F80355EA01E3EEA5F69375F40F87 +:108DD0002300BA06638D0D1A3D8815456312A40859 +:108DE000130510F82307AA004543E3ED5BF57D4525 +:108DF0004543E37955F51165E36675F533865B0107 +:108E000005822310CA02B5A093FE35004943E38BC7 +:108E1000CEF393FE8500E3970EF26392C90303C37A +:108E2000C40313734300E30E03F0E30839F5094369 +:108E3000E31569F403C3C4031373230039A0E318D3 +:108E4000C9FF03C3C40313734300E31803F2D5BD82 +:108E50008545E31DB9F60355CA019305D02EB9BF68 +:108E60003545631CA41085462307DA008946231084 +:108E7000DA02A307EA00631107160547230CEA008C +:108E800093F5050281E59247A30AFA021946814546 +:108E90005A859770F91FE780A06263100516A247F4 +:108EA0000547230EEA02A30EFA021946DA851305D6 +:108EB000EA039770F91FE780004803470105A306FE +:108EC000EA001307F007631DEC1237370020034751 +:108ED0000725D65798A303055A01EFA0BFBD230469 +:108EE000AA06EFA0FFB6D657A30AAA000D4788A38B +:108EF0006391E912638D0C0093F61C0099C603C7B9 +:108F0000C403218B19E3E38E3CE32305DA0609470A +:108F10002302EA060347C105A302EA0603470A063D +:108F2000418B1DEB1307F9FF1377F70F8946494370 +:108F3000E3EAE6E08D466313D90E630D0D00137668 +:108F40001D0019C683C6C403A18A99E2E30B2DDF75 +:108F5000A305CA06A301EA0603474106B7060008AF +:108F60000143A300EA0603478106A303EA06032799 +:108F70004A05558F232AEA04F1B309456314A40076 +:108F800019458DB5E30004E623070A00B1BD1D4570 +:108F90002307AA0013F8150013F54500630B08001A +:108FA000114811C10548A30F0A050545230FAA045E +:108FB00025BD13F8250063090800094811C11548AB +:108FC000A30F0A050945DDB70D4811C11948A30FC4 +:108FD0000A05230F0A0409BD230C0A0081460D452A +:108FE0003356D740058A11C603468A010506230C6D +:108FF000CA008506E396A6FE61B5230E0A0275BD7A +:10900000194763458701A30A8A01F1B5A30AEA005B +:10901000D9B523050A0623020A06EDBDA3050A06F3 +:1090200015BF01114EC6B739002093878940BC4F48 +:1090300006CE22CC26CA4AC852C49389894091C719 +:10904000FC4B13965700634E06003A8AB6842E896D +:10905000EFC02E982A8419ED83A7890513052004F3 +:1090600091C33145F2406244D2444249B249224A56 +:10907000056182807825854701453D8BE304F7FE35 +:1090800003470406418B59CB8D476304F9004945DA +:10909000D1BFFD47E3ED97FE231E04008D47631704 +:1090A000F90CCDCC5E2C03D7E9071D45B38697009C +:1090B000E34AD7FA582405C7163013070002639015 +:1090C000E602034734068D46631ED70A1307900F46 +:1090D00013055004E368F7F87E2CE365F7F88D4735 +:1090E0001D45E311F9F8374902408329C920232699 +:1090F00009200F1000009305800C0545EFA0BDDF8F +:109100008357C4061205232444038507BD8BC98FEA +:109110002316F40646AC23263921B9A01377D90FBC +:10912000E30CF7F611476313E904784893167700C8 +:10913000E3CF06F45824E31CF7F45E2CA9DBA1F876 +:109140009305800C0545EFA01DDB8357C40612056F +:109150008507BD8BC98F2316F40639A07C483707D5 +:1091600000FF7D17F98F7CC80145EDBD9307D9FF3E +:1091700093F7F70F0547E377F7F291D85C24E39371 +:10918000E7F2C5B58546E31CD7F41307D02E89B79F +:1091900001114EC6B739002093878940BC4F06CED7 +:1091A00022CC26CA4AC852C49389894091C7FC4B35 +:1091B00013965700634E06003A8AB6842E89EFC094 +:1091C0004E812A8419ED83A789051305200491C3D4 +:1091D0003145F2406244D2444249B249224A0561D3 +:1091E00082807825854701453D8BE304F7FE0347E0 +:1091F0000406418B61C38D476304F9004945D1BF23 +:10920000FD47E3ED97FE231F04008D47631CF90E15 +:10921000F5C07E2C03D7E9071D45B3869700E34AC6 +:10922000D7FA582405C71630130700026390E602E8 +:10923000034734068D466314D70E562C1307900F40 +:1092400013055004E367D7F8E365F7F88D471D452C +:10925000E311F9F85C5485C783476406898B85C39D +:10926000085811CD3C2581CFEF50AFBE0C581946A0 +:1092700013056403B1059770F91FE780C00B3749E8 +:1092800002408329C920232609200F1000009305DE +:10929000800C0545EFA03DC68357C4061205232662 +:1092A00044038507BD8BC98F2316F40666AC2326BD +:1092B0003921B9A01377D90FE307F7F411476313E6 +:1092C000E904784893166700E3CA06F25824E317C6 +:1092D000F7F27E2C85D79DF09305800C0545EFA015 +:1092E0009DC18357C40612058507BD8BC98F231600 +:1092F000F40639A07C48370700FE7D17F98F7CC83B +:109300000145C1BD9307D9FF93F7F70F0547E372F6 +:10931000F7F0E38504EE5C24E39DE7EE55BD85465A +:10932000E316D7F2562C1307D02E19BF5D71A6C2D3 +:10933000B73400209387844003A8870586C6A2C45B +:10934000CAC04EDE52DC56DA5AD85ED662D466D235 +:109350006AD06ECE93848440630808028327480550 +:1093600013945700635204023145B6402644964494 +:109370000649F259625AD25A425BB25B225C925C55 +:10938000025DF24D616182803AC632C49377150066 +:10939000B68989C7639105104945C1BF91E9E04C81 +:1093A00019E00145D9B72285EFC02E850040CDBF19 +:1093B000E30908FE4285EFC04E84E5B77849B70758 +:1093C00000037D8F55F30347F5056304870163159B +:1093D000970103D7EA0149DB03C75A036300270952 +:1093E00003C7EA0063182701131714004E971A23C6 +:1093F000E3E4EDFAF8547D141374F40F5DC793168B +:109400001A00B69903D70900B2479305800C239739 +:10941000EA063E9A03470A00054523980A06A384F4 +:10942000EA06EFA05DAD03D7CA061205264405077C +:109430003D8B498F2396EA0603A3C40603C50B00A0 +:10944000B64096440649F259625AD25A425BB25B20 +:10945000225C925C025DF24D61610283138B8A058E +:10946000194681455A859770F91FE7806005631A90 +:109470002501194693056D4F5A859770F91FE780AE +:1094800080EB194681455A859770F91FE7804003A4 +:10949000E31825F511B7FD1513F4F50F094C954C9C +:1094A0000549373D0020930D00089307F00FE305B1 +:1094B000F4EEA247228AB38B870003C50B00EFB0FE +:1094C0005ED1AA8AE31C05EEBC4C13052004E39D83 +:1094D00007E861BD373300200323034639714ED6B8 +:1094E00006DE22DC26DA4AD852D456D25AD05ECED4 +:1094F00062CC66CA83490104630603020323430561 +:1095000013145300635004023145F2506254D25494 +:109510004259B259225A925A025BF24B624CD24CD7 +:1095200021618280468C428BBE8A3A8AB68C32890F +:10953000AE84EFB01ECA2A841305200479D4637464 +:1095400099004945D9B79547E3FD97FE834704063F +:1095500093F73703FDF78347E405DDF77C48918BEC +:10956000C5F7EF90FDC9F94763E4A7001D4571BF3A +:109570008347340609476396E70C8357440813076B +:10958000D02E6373F7029307C00213055004E3FE65 +:1095900027F7F94713055004E3F927F7C1471305E7 +:1095A000500463EB270195B71307301FE363F7FE01 +:1095B0001307900FE364F7FE630B0A06B3C7440377 +:1095C000E3C157F963800902E37D5BF7854763FBDD +:1095D0003701B3876A412947B387E702B3C7370327 +:1095E000E3C187F78327C40AA1E313061A00120612 +:1095F0009305E010328532C69770F91FE78080A48A +:10960000AA8B2DD5324681459770F91FE78040D946 +:10961000B7C7898E2326740B938767ED23A0FB00C1 +:1096200093870B0123A6FB000326C40A05E6032546 +:10963000C40A21C19770F91FE780C0AD2326040A30 +:109640000DA8BDFB035744089307D02EE3F6E7F6B9 +:109650009947B1B72302460163890900854763F43E +:109660003701A30386012303660123043601A30205 +:1096700056017C4883460406CA9493E727008584F4 +:10968000B3ECDC007CC82313940823009407014545 +:10969000ADBDB737002083A7074681CBFC4B13979E +:1096A00057006354070031458280011122CC26CA3D +:1096B0004AC84EC606CE52C4B6893289AE84EFB0CF +:1096C0005EB12A8413052004630304147C48898B4B +:1096D000B9CB834734060947639DE70E8357440897 +:1096E0001307D02E6379F702035764089307C0026B +:1096F0001305500463FDE71003576408F947130589 +:10970000500463F6E71003576408C147130550047B +:1097100063EBE700EDA81307301FE36FF7FC1307B7 +:10972000900FE362F7FE93F7D40F05476399E70EB6 +:10973000B747024003AAC72023A607200F10000046 +:109740000325840A19C59770F91FE780A09C23247C +:10975000040A23120408B747024023A647216305E1 +:1097600009087C48918BC1EF8D476391F40A9305FA +:1097700050104A859770F91FE780C08C2324A40AF3 +:1097800051C5B747024083A4C72023A607200F1066 +:1097900000007C4893F7074091CF9305800C054566 +:1097A000EFA06DF58357A40812058507BD8BC98FFF +:1097B0002315F4080325840A4A86CE859770F91F7D +:1097C000E78060B7B74702402312240923A69720F9 +:1097D0002DA0B1FB035744089307D02EE3F5E7F41F +:1097E0000357640899471DB78D4749456391F402B3 +:1097F0007C4823120408F99B7CC8014509A893877B +:10980000D4FF93F7F70F0547E370F7F63145F240C1 +:109810006244D2444249B249224A05618280E3123D +:1098200009F491474945E38EF4F2D5B7B7370020E4 +:1098300013878740384F411126C24AC006C622C44A +:10984000AA841389874009CF7C4B1397570063592B +:1098500007003145B24022449244024941018280CE +:109860002E85EFB01E972A841305200465D413F7C4 +:1098700014007C485DCB13F7170061FF0347040613 +:109880001377370379F78988D1CC0327C90D45456C +:1098900093E70740418B5DDFC1657CC8FD1501453D +:1098A000EFA0ADE72314A408EFA0BF91B705000116 +:1098B0002326A408FD150145EFA06DE89304040AD2 +:1098C000B735002015462328A4089385E550268542 +:1098D0009770F91FE78020A6A6851305B0FA979028 +:1098E000F91FE78020F22685EFE00EB37C4858246C +:1098F000A300A408DD9B93E747007CC88547631F4E +:10990000F7009305800C0545EFA0EDDE8357C406F4 +:1099100012058507BD8BC98F2316F406EF40EFA70C +:1099200001450DBF93F7F7BF85BF0345D407CD9B16 +:109930007CC89307F00FE303F5FEEFA06D96F9BF27 +:10994000B73800201388884003280808011106CE84 +:1099500022CC26CA4AC84EC652C456C21383884077 +:1099600063090800032EC801B14813141E01634D9A +:109970000402032E4308B14863080E021373A6FFC6 +:10998000C5486313030213735600B148630E030006 +:10999000BE843A89B6893284AE8A2A8A6310080264 +:1099A000029E2A888D4819EDF2406244D244424911 +:1099B000B249224A924A4685056182808347B800AF +:1099C000B148FDF38D47C948E3E047FFA3064805CA +:1099D000230858012300080213771400814729C384 +:1099E00083C70900A307F80083570900231BF80069 +:1099F0009A2063F3E7003E8793160701C18263E470 +:109A0000D708231CE8008357880113075005B38744 +:109A1000E702A187231DF80085472300F802854748 +:109A20001376440029CABE9903C7090086073E99E8 +:109A3000A307E800A307E80203570900A697231924 +:109A4000E8029E236373F700BA8793960701C182E9 +:109A5000636ED702231AF802835748031307500591 +:109A6000B387E702A187231BF8028347080293E725 +:109A700027002300F8028327C80121678148D98F76 +:109A8000232EF80015B7231CF800B5BF231AE802EF +:109A9000E1B7373700209307874083A707084111B4 +:109AA00006C622C426C24AC01307874099C703A826 +:109AB000C70113141801634B0406032747083DC769 +:109AC0003684B2842E8909ED81EB4945B2402244A7 +:109AD0009244024941018280EF607FD60145FDB783 +:109AE0008546E314D5FE95EF0297AA8729C511474D +:109AF000A30605047AA91AADB4370547E387E6FC47 +:109B000085C886BFA2BF01C41E04E3D084FC23899C +:109B100027012244B2409244024903A3870641012F +:109B20000283D84F93161701E3D806FC314579BF5D +:109B300023AC0702E9BF0D4551BF5D7166D26AD003 +:109B40006ECED084AA8D2E8DB28CB68519461305A3 +:109B5000A100A2C4A6C24EDE52DC56DA5AD85ED6A6 +:109B600062D4BE8B3734002086C6CAC0368CBA8415 +:109B7000428BC68A464AD6499760F91FE780A07B88 +:109B80009307844083A707081304844095C7DC4FDC +:109B900013971701635207023145B6402644964495 +:109BA0000649F259625AD25A425BB25B225C925C1D +:109BB000025DF24D6161828083278409F1DFEFC08D +:109BC0006EF0B737002083C717258983E306F5FCBD +:109BD00093F784FF4545F1F393F7540099E3494522 +:109BE0006DBF8327040881CBD84F93161701E3C5B7 +:109BF00006FABC37D5F303294409631E093A8327C3 +:109C0000840982972A8949D90D47E36AA7FDA306EB +:109C1000B901A302A9071946814562859770F91F0A +:109C2000E780008A631F053805472306E906A30677 +:109C300099071946E2851305E9069760F91FE78041 +:109C4000806F230C090213FC1400014D630C0C10EF +:109C500083D60B00114763F3E6009146231AD9021D +:109C600003570B001396060141826373E6003687A3 +:109C700093160701C182114663F3C600114793167C +:109C80000701231BE902C182130750053387E6024F +:109C90009305090521872319E9020547230CE902E9 +:109CA00003D70A002317E90003550A002A970587FE +:109CB0002318E904231AA900EF90DE8E83560905C4 +:109CC0000567130707C86373D700BA8613970601A1 +:109CD000418319466373C70099462318D904139525 +:109CE000060183D609001307301F41816374D70032 +:109CF0009306301F93950601C18113871500330722 +:109D0000A702E647231DD900962309876353D7008E +:109D10003687F647420741832310E9029623865788 +:109D200005662313D9029623130606C82316D90203 +:109D3000BA866373E600B28613960601418229470C +:109D40006373E600A9461397060141830A07334768 +:109D5000A7022310D9027D1763D3E5002E87231DA8 +:109D6000E900054D93FC240063830C0E931D1D0038 +:109D70003387BA011A23B306BA01930529052318BC +:109D8000E9008A222A9705872319E904231BA900E1 +:109D9000EF905E81835629050567130707C8637333 +:109DA000D700BA8613970601418319466373C7002B +:109DB00099462319D9043387B9011A23139506014B +:109DC0009306301F418163F4E6001307301F93159B +:109DD0000701C181231EE900138715003307A7027D +:109DE000E647B386B701962209876353D7003687C3 +:109DF000F64742074183B386B7012311E902962251 +:109E0000865705662314D902BE9D83D60D0013061E +:109E100006C82317D902BA866373E600B286139781 +:109E20000601418329466373C700A94613970601BB +:109E300041830A073347A7022311D9027D1763D351 +:109E4000E5002E87050D231EE900137DFD0F918887 +:109E5000638C041693141D00A69B83D60B00114738 +:109E600063F3E60091462313D904269B03570B00A6 +:109E70001396060141826373E60036879316070145 +:109E8000C182114663F3C6001147931607012314DC +:109E9000E904C182130750053387E602A69A269A81 +:109EA0009305490521872315E904034789031367AF +:109EB0002700230CE90203D70A002319E900035500 +:109EC0000A002A970587231AE904231CA900EF90AA +:109ED0006EED835649050567130707C86373D700FE +:109EE000BA8613970601418319466373C7009946E2 +:109EF000231AD904A6991395060183D609001307DE +:109F0000301F41816374D7009306301F939506017B +:109F1000C181138715003307A702E647231FD90025 +:109F2000A697962309876353D7003687F6474207DB +:109F30004183B38697002312E9029622865705666D +:109F40002315D902BE949620130606C82318D902F9 +:109F5000BA866373E600B2861396060141822947EA +:109F60006373E600A9461397060141830A07334746 +:109F7000A7022312D9027D1763D3E5002E87231F82 +:109F8000E90063900C02630E0C04035709052319C2 +:109F9000E9040357A901231EE9000357090223110D +:109FA000E9020327040E832789081367072023206B +:109FB000E40E8297DDB6834679000547E396E6C452 +:109FC000E1BE23060906B5B903570905231AE904BA +:109FD0000357A901231FE900035709022312E902CD +:109FE0004DB7035749052319E9040357E901231E17 +:109FF000E9000357490265B741114AC037390020CB +:10A000009307894083A7070806C622C426C21309FE +:10A01000894091CFD84F9316170163DA0600B147F4 +:10A02000B2402244924402493E8541018280032786 +:10A03000490875D7AA8499EB02978D4775D1914746 +:10A040007EA91EAD8547A30605043CB5FC241D472B +:10A05000032409089D8BE384E7FC9C20858BA5CB1A +:10A060005C4C898BCDFF982091479376670063976E +:10A07000F6008326490DC547C18ADDD2058B05E36D +:10A080009C30194693853400230AF40CBC20130538 +:10A09000640DA30AF40C9760F91FE780C0299C2087 +:10A0A0002301F408BE242312F408DE242313F40849 +:10A0B000FC24A301F408FD57A30EF4065C4CC59BD9 +:10A0C00093E727005CCCEF90CFD9814791BF5C4CE0 +:10A0D000898BD1DB0347440D9C30E312F7F403472F +:10A0E000540DBC20E31DF7F2194693853400130587 +:10A0F000640D9760F91FE78000350547AD47E31110 +:10A10000E5F639BFB737002083A78748314585C3B7 +:10A11000DC4F13971701634C0700898B89CB4111E2 +:10A1200006C6EF505F93B2400145410182808280B4 +:10A130004111B737002022C403A4874826C206C6AF +:10A14000B14435C05C4CB14413971701634D07040B +:10A150000357240D930420046317A7040345D40771 +:10A16000C59B5CCC230E04069307F00F6307F50034 +:10A17000EF901D93FD57A30EF406034514089307B3 +:10A18000F00F6307F500EF90BD91FD57A300F408B1 +:10A19000BD67938707A60100FD17F5FF3C34814496 +:10A1A00099C33C548297B24022442685924441018F +:10A1B0008280B737002013878740183305CB9387F9 +:10A1C0008740B84F11CB582701CB4945828049457C +:10A1D000F24062440561828003A7070819C338373B +:10A1E0006DF783A7470999C3FC33E5F3011122CC2E +:10A1F000C88432841305A100194606CE9760F91F62 +:10A20000E780601328009780F91FE780E0E761D1BD +:10A2100000B1014575BF3737002003472745014589 +:10A22000B357F740858B91E345458280011106CEF7 +:10A230002EC632C436C23AC0EFA0BEF935C90323D8 +:10A240004505AA873145137803206310080637387F +:10A2500000201308884083489804B245454563E6CA +:10A26000B80483C8470B2246B3D8C84093F81800F7 +:10A27000638D08028328880D1397C800635707026F +:10A280000348880402476362E8029246238BC70AA8 +:10A29000A38AB70AA38BD70A11E2014713630310FD +:10A2A000238CE70A23AA67040145F24005618280F6 +:10A2B00013052004DDBF011106CE2EC6EFA07EF1EE +:10A2C0001307200401CD7C49314793F6270099C636 +:10A2D000B24589C993E707207CC90147F2403A8516 +:10A2E0000561828093F7F7DFC5BF011106CE2EC648 +:10A2F00032C4EFD08EE9373700200327874829CBB7 +:10A300008356270D2246AA8713052004639FC602A1 +:10A31000094585CF83A607106945139666006356E5 +:10A32000060203C6E7049306200263F0C60223A0D8 +:10A33000E71603A7470AB245C166558F2398B7149D +:10A3400023A2071623A2E70A0145F2400561828095 +:10A3500013052004DDBF011106CE22CC2EC632C467 +:10A36000EFD0AEE222462A843285EFA09EE68947EE +:10A3700039C003270410E9479316670063DD06021E +:10A380008346E404130720026377D702930720046F +:10A390001DC17849B147218B19CF8327440AB245A3 +:10A3A0004167D98F2322F40A2318B4142322A41658 +:10A3B000232004168147F24062443E850561828075 +:10A3C000011122CC26CA4EC652C456C25AC006CE6D +:10A3D0004AC8AE89328BB68A3A8AB7340020EFD0A9 +:10A3E000CEDA9387844003A4070845C99384844048 +:10A3F00083A744082A8999E3EF608FD40DE883A7E7 +:10A40000440882972A840D4535C48347D404858B3C +:10A41000A5CFBC204945B9CFB73500201946938553 +:10A42000654F1305E4049760F91FE780C0F05C4CAA +:10A4300013F7270015C313F7E700A146631CD704E1 +:10A440000345D407C59B5CCC230E04069307F00F8D +:10A450006304F500EF90CDE4FD57A30EF40623123C +:10A46000640923135409A301440923073915EF9004 +:10A470004F9F0145F2406244D2444249B249224AC8 +:10A48000924A024B05618280B735002019469385B8 +:10A49000054F41BFEF502FDCC1B70945E1BF7971CE +:10A4A00006D62ECE32CC36CA3AC83EC6EFD0EECD56 +:10A4B000094831C56246F2451303F00F4948B38895 +:10A4C000C500634E130363ECC5024247D246B3880E +:10A4D000C5403383E60063C4680203484518B247A9 +:10A4E000A302B51813684800230205192303C518F1 +:10A4F000A303D5182304E5182315F5180148B25015 +:10A50000428545618280411122C42A840A2106C6FF +:10A51000EFD0AEC789471DCD03063400C947634B52 +:10A52000C00283052400130710FA63C5E502030780 +:10A530005400994663C0E60283064400415863CB49 +:10A540000601230EB516A30EC516230CD516A30CB3 +:10A55000E5168147B24022443E85410182800111C7 +:10A5600006CE2EC6EFD06EC231C903474518AA8762 +:10A570003145937647009DCAB24585CD8386A7179E +:10A58000136717002382E7181307F0070145639F3D +:10A59000E60003A7470A9316B70063C90600B7068B +:10A5A0001000558FA38F071623A2E70AF24005611A +:10A5B0008280799B2382E7180145CDBF0945FDB70D +:10A5C000B737002083A70746011122CCFC4B52C4A9 +:10A5D00006CE26CA4AC84EC656C2139757002E8AC0 +:10A5E0003284635407001305000FEFA09EBE93074B +:10A5F000200429CD0327C50AB14729CB5447B9C642 +:10A60000582363654705B747024083AAC72023A69E +:10A6100007200F1000008327C50A22878146C44700 +:10A620000145A68763CE460342059305001141818B +:10A630009760F91FE78000A12A890D04814963C74B +:10A640004905B747024023A657218147F24062449B +:10A65000D2444249B249224A924A3E8505618280EB +:10A660001023C10785062388C7FE10333107A3884E +:10A67000C7FE034667FF2389C7FE034677FFA3890A +:10A68000C7FE4E203295239AB7FE69BF23A424014A +:10A690001020832554004A85C1049760F91FE78084 +:10A6A00080C983C734FF850931043E9949BF4111F0 +:10A6B00026C2B734002093878440BC4F4AC006C6E8 +:10A6C000FC4B22C42A8913975700938484401305B6 +:10A6D000000F6344070003450900EFA09EAF2A84E2 +:10A6E0001305200409C48327C40A81EB3145B24015 +:10A6F00022449244024941018280D84765DB0347E6 +:10A700001900DC23E3E4E7FE8327040B99EB9305B0 +:10A71000F010130500029760F91FE780A09223282C +:10A72000A40A0325040B79D18327C40A05474946A7 +:10A73000B8B7CA859760F91FE780E0BFB705000189 +:10A740000329040BFD150145EF906DFF232AA90095 +:10A750000329040BEF90FFA60324040B232CA9006C +:10A76000C1451545EF902DF948AC83A7040E01456E +:10A7700093E7072023A0F40E9DBFB737002083A7DF +:10A780008748C9C3D44F314713961601634D060657 +:10A7900003D6270D1621130720046316D606411190 +:10A7A00022C43747024006C60324C72023260720B9 +:10A7B0000F10000083C6970C89CA232687205947AB +:10A7C000B24022443A85410182803A212392E70C2B +:10A7D00058212383E70C5831A383E70C7821238485 +:10A7E000E70C7031A384C70C01CA0C4503A5C70C44 +:10A7F0009760F91FE78020B4B747024023A687205F +:10A8000001477DBF31473A858280011126CA4EC675 +:10A8100052C406CE22CC4AC8AE89328AB684EFD062 +:10A82000CE965DCDB7370020938787FF631D0A0062 +:10A83000054798A30145F2406244D2444249B249D7 +:10A84000224A05618280942305472A846395E600A5 +:10A85000238007008949B747024003A9C72023A6E0 +:10A8600007200F1000004165130545F5EFD06E93EA +:10A8700021C93C253EA5832784119DEF232CA410DC +:10A88000232EA410930710F8F91423200500231693 +:10A8900045011CB52304350144C183479402854515 +:10A8A0000145B395F500C205C181EF80DDD2B74700 +:10A8B000024023A62721BDBF8327C41188C3C9B77F +:10A8C000B737002083A7072791C79565938555550E +:10A8D00005458297B747024023A627211D45A1BF02 +:10A8E000094591BF6F80AEE76F80AEEB6F800EF0D1 +:10A8F0006F80EEF46F80CEFA6F80FE866F808EFEE2 +:10A900006F801E8282806F801E8A034301001AC0FE +:10A910006F70BEAE6F70DEBA6F701EC46F703EC9CE +:10A920006F703ECF6F701ED56F703EDA6F70DEDDD8 +:10A9300079711303F00F1AC81AC60343810306D6B0 +:10A940001AC4035341031AC2035301031AC0EF7020 +:10A950001EE1B2504561828003530100035E410055 +:10A96000834E8100034FC100835F010176C47AC624 +:10A970007EC872C21AC06F709EDE6F709EF26F70DA +:10A980001EFE03530100034E4100834EC10093F8A5 +:10A99000F80F1378F80F76C672C21AC06F802E8136 +:10A9A0006F80AE906F80AE996F80AEA66F804EAA1A +:10A9B0006F808EAD6F804EB26F808EB86F808EBC10 +:10A9C000828082806F80EECE79719397050126D2C6 +:10A9D00006D622D44AD04ECEC187AE8463D9071E94 +:10A9E000B739002003C559649760F91FE780408A92 +:10A9F0002A8405C518219307000D631DF7003C212B +:10AA000011476365F7028D4663F7D710A5C709475D +:10AA1000638DE7082285EF801D832165258DB25067 +:10AA2000225492540259F24945618280CD46E3E3B3 +:10AA3000D7FE51476379F712138757FE1377F70F45 +:10AA40008546E3E9E6FCB736002003A7C6617D76BC +:10AA50001306F60F718F1031631806166D46639258 +:10AA6000C7161367071023AEE66083A7C6613705D4 +:10AA7000000235AA1C31373900206396072693055A +:10AA800035003735002019461305C5659760F91F55 +:10AA9000E780608A8547232EF960854503C55964A0 +:10AAA000EF807DB30325C961A1A81431383195EE3B +:10AAB0006312F702373700208327C76181450145BC +:10AAC00093F7F7F093E70702232EF760EFD01DF717 +:10AAD00008B089B78547814501456315F700EFD078 +:10AAE0005DE5FDB7EFD05DD4E5B7E305F7F2B73725 +:10AAF000002003A5C76141991365650023AEA760D7 +:10AB0000B737002083A7C7FFE38607F09C43E383A2 +:10AB100007F0829701B7373900200327C961103148 +:10AB2000419B1DEE6395D70213672700232EE96032 +:10AB3000373700208347C75F93968701E186E3D3C9 +:10AB400006F693F7F707230EF75E894581BFB737FF +:10AB50000020238C075E13673700232EE96099B726 +:10AB600013676700DDBF373900200327C961103143 +:10AB70001377F7F021E6639ED70213670701232EB0 +:10AB8000E960373700208347376693968701E1866F +:10AB900063DB060003C5596493F7F7079145A301EA +:10ABA000F766EF805DA38327C961370500015D8DDE +:10ABB00081BF13670702232EE960F5B71367070308 +:10ABC000DDBF1367072045B51367073069BD93F7ED +:10ABD0001500C9C3B737002083C7875FADCBB73730 +:10ABE000002083C7A75FB7350020938505605C828E +:10ABF000B737002083C70762130561001946DC825E +:10AC00009750F91FE7802073B737002083C7975FFD +:10AC10004C005C86B737002083C78765DC86B73772 +:10AC2000002003C55764EFD06DF615C1B73700207B +:10AC300003A5C76141991365650023AEA760B737C7 +:10AC4000002083A7C7FF81C79C4391C3829713C588 +:10AC50001400F1B393F72500A9C3B737002083C7C9 +:10AC6000C75F858B85CBB737002003C55764EFD00E +:10AC7000BDA00DC1B737002003A5C7611375F5F05E +:10AC800023AEA760B737002083A7C7FF81C79C43C7 +:10AC900091C3829713C5240059B393F7450001452A +:10ACA000E38F07D6B737002083C7376695CBB73712 +:10ACB000002003C55764EFD0FD9F1DC1373700202A +:10ACC0000325C761FD779387F70F7D8DB737002088 +:10ACD00083A7C7FF232EA76081C79C4391C3829798 +:10ACE00013C544002DBB9947232EF96065BBB737C8 +:10ACF000002083A7C76185E709C5B737002023AEC9 +:10AD0000A7FEB73500203735002083C545640345CD +:10AD1000556481470147814601466FE01DF1454575 +:10AD20008280B737002023AEA7FE8280411126C261 +:10AD3000B734002022C403C4546406C69307F00F3E +:10AD40006308F4006145B24022449244410182808C +:10AD500037B506001305859CEF803DF8A382A464F7 +:10AD6000E30285FEB737002023AE07FEB737002089 +:10AD700023AE07600547B73700202382E764B73763 +:10AD800000200D47238DE75EB73700202380076240 +:10AD90001D47B7370020A38CE75EB7370020238C10 +:10ADA0000764EFB04DB0014579BF011193970501DC +:10ADB00026CA06CE22CC4AC84EC6C187AE8463D509 +:10ADC0000718B737002003C507009750F91FE78021 +:10ADD000204C2A8409CD1C21130710096382E70245 +:10ADE0001307000D638CE7082285EF80CDC5216530 +:10ADF000258DF2406244D2444249B24905618280C5 +:10AE00001C3139476398E7025A2185679387574079 +:10AE1000E31CF7FCB737002083A74700F1D7944322 +:10AE2000E1D618453C23083383053700A2075D8D22 +:10AE300082965DBF1307E003E398E7FA38219D4748 +:10AE4000E314F7FA4A219760F91FE780E0C449DD6F +:10AE50005825A147E31AF7F8B737002083A7470022 +:10AE6000C1D79C47D1D332246E204A207116F115E8 +:10AE70004206C2054182C1818297BDB73C21154778 +:10AE8000638AE70A636DF70085C7B737002083A799 +:10AE90004700B9DBDC43A9DB22858297B1B71947AC +:10AEA0006385E7003147E392E7FEEF10704AF1BF98 +:10AEB0001C31E1FFB737002083C7B75FB9E3B7356F +:10AEC0000020373900204146938585641305496287 +:10AED0009750F91FE7802057B73900201DED130662 +:10AEE0004962C1450945EF90ADD013864963C1451C +:10AEF0000D45EF90EDCFB737002003C507F4EF9075 +:10AF00006DCA373500201946930534001305C56511 +:10AF10009750F91FE78020428DBFB735002041468A +:10AF200093858560138549639750F91FE780A05189 +:10AF30005DD5C1BF1C31B1FB3225930545002831D9 +:10AF4000A146EF10E04391B7939715010145E3D275 +:10AF500007EA373600201306460491451145EF9065 +:10AF60002DC9B737002003C507F4EF90ADC31165B5 +:10AF700041B50111B737002006CE2381A74091C506 +:10AF80002E8532C6EF100035324609C6B73700208D +:10AF900023A2C700B737002083C7B75F95EB3736CA +:10AFA000002037350020F2400346E65F03450500E8 +:10AFB000B737002037370020B73600209387470483 +:10AFC0001307476393864662A14505616FE0FDC59F +:10AFD000F240014505618280B737002083C7070032 +:10AFE0000111C8824C83D08328001946B68506CE4D +:10AFF0005C829750F91FE78000344800EFC0FDC91C +:10B00000F24005618280B737002083C70700011135 +:10B01000C886680006CE5C864C87D087EFC03DB7F7 +:10B02000F24005618280B737002003C507006FC07A +:10B030005DB2B73700202381A766B737002003C76A +:10B0400057649307F00F630CF700B73700200547EC +:10B05000A38DE75EB737002031472382E764828003 +:10B06000B737002083C71725011106CE22CC26CA88 +:10B070004AC84EC6F19B91EBE144F24062442685FA +:10B080004249D244B2490561828037B506001305B2 +:10B09000A5DA37340020EF805DC41304040008A053 +:10B0A0001307F00FE30AE5FCB7370020214723829E +:10B0B000E764EFF01FF8B737002083C7B75F81441C +:10B0C000CDFFB739002013864962C1450945EF908D +:10B0D0008D883739002013064963C1450D45EF902F +:10B0E0008D87373500209385496241461305856475 +:10B0F0009750F91FE78020243735002093054963D6 +:10B100004146130585609750F91FE780C022373606 +:10B1100000201306460491451145EF90CD83082089 +:10B12000EFA07DF899BF130705041E21110593C7F1 +:10B13000F7FF231EF5FE8347E5FF93C7F7FF230FB5 +:10B14000F5FEE314E5FE828099473305F50201110F +:10B150000A86C14506CE13050520EF80DDFF09E50F +:10B160000886F240056182800145E5BF011122CCCD +:10B1700026CA4AC84EC606CE81440144373900204B +:10B18000B739002083471901636AF400F240624432 +:10B1900026854249D244B2490561828083A7C9000D +:10B1A0001315440019469305F00F3E959750F91F6B +:10B1B000E780003101E5850493F4F40F050413746E +:10B1C000F40FC9B7411122C4373400201304C4025C +:10B1D000084006C609C5EF800D8723200400B73755 +:10B1E000002003C71701B2402244B737002023854F +:10B1F000E70041018280B737002083C7A70019719B +:10B20000A6DA86DEA2DCCAD8AA846390A702373405 +:10B2100000201304240108208545EF80CDBF0820BD +:10B220008945EF804DBFEFF0FFF9C204C180194995 +:10B23000338924035000C145130409202285EF807F +:10B240009DF109C901442285F6506654D6544659E9 +:10B250000961828019469305F00F48009750F91F45 +:10B26000E780002665F1480041469305F00F9750AE +:10B27000F91FE780E012480871469305F00F9750D8 +:10B28000F91FE780E0110818130600049305F00F7A +:10B290009750F91FE780C0105000C1452285EF90FC +:10B2A0002D9550082A84F14513051920EF904D94EF +:10B2B0005008498CF14513052920EF906D931374C4 +:10B2C000F40F5008498CC14513053920EF904D9279 +:10B2D0001374F40F5008498CC14513054920EF90B1 +:10B2E0002D911374F40F5008498C91451305592082 +:10B2F000EF900D901374F40F498C1D651018930591 +:10B3000000042695EF90CD8EB73700201374F40F0C +:10B31000498C03C507F41374F40FEF90AD8825B77B +:10B32000411122C426C206C601450144B73400209B +:10B3300083C714016373F40011C5B24022449244E0 +:10B340004101828022850504EFF0FFEA1374F40FB7 +:10B35000C5B7011122CC4EC652C406CE26CA4AC871 +:10B360000144EF802E8DB7390020373A002083C783 +:10B370001901636AF400F2406244D2444249B2497E +:10B38000224A056182801309CA000325090093142B +:10B39000440019469305F00F26959750F91FE78052 +:10B3A000201219E583250900A695E835EF80CE889F +:10B3B00005041374F40F65BF397122DC4ED652D4E4 +:10B3C00056D206DE26DA4AD80144EF80EE89B73934 +:10B3D0000020373A0020994A83C71901636BF400B3 +:10B3E000F2506254D2544259B259225A925A2161AF +:10B3F00082801309CA0003250900931444001946EA +:10B400009305F00F26959750F91FE780600B15E51F +:10B41000330554030A86C14513053520EF80BDD39B +:10B420001008C1450945EF801DD383250900140884 +:10B430000A86A695E835EF80EE8205041374F40FB2 +:10B4400061BF011106CEEFF07FD20547A9476373B4 +:10B45000A70089471306F100854513052004DC8702 +:10B46000EFE06D92F24005618280011122CC4EC660 +:10B4700052C456C206CE26CA4AC80144B739002073 +:10B48000373A0020994A83C71901636CF402EFF040 +:10B49000FFCDB737002083C7970099C3EFF07FEB4C +:10B4A000B737002083C7870099C3EFF0FFF06244ED +:10B4B000F240D2444249B249224A924A05616FF0B1 +:10B4C0005FF8330554031309CA00032609009314D7 +:10B4D0004400C145269613050520EF80DDC71DC930 +:10B4E0000325090019469305F00F26959750F91F7B +:10B4F000E78000EB0325090019469305F00F269518 +:10B5000019059750F91FE780A0E983270900BE9429 +:10B510002396040005041374F40FB5B7B737002061 +:10B5200083C527012A216F00CE909947B385F50284 +:10B53000397122DC26DA4AD806DEA147AA8432898C +:10B54000138425206384F6001384152071468145F9 +:10B5500048083AC69750F91FE78080E45008F14543 +:10B560002285EF805DBF0DE18347E102A5463247AA +:10B57000E51793F7F70F63E9F600BA86500893755D +:10B5800019002685EFA0DDA0F2506254D254425932 +:10B5900021618280797122D426D24AD0AE842A8950 +:10B5A00032848145130600020A8506D69750F91F9A +:10B5B000E78000DFB737002083C757F4231021014D +:10B5C000230EF100BC8455C4373700200347D70150 +:10B5D000F99BB73500205882373700200347F70121 +:10B5E00041469385C51CD882373700200347E701C1 +:10B5F0001305610093761700D58FF59B937627008E +:10B60000D58FED9B93764700D58F9316470093F621 +:10B61000061093F7F7EFD58F9316470093F60620A1 +:10B6200093F7F7DFD58F12071377074093F7F7BF2C +:10B63000D98FFC849750F91FE780E0CFB7370020FF +:10B6400083C7C70113F7170011C789C4B8841367EC +:10B650002700F88403476101A2850A85D98F230B4F +:10B66000F100EFA0FD84B25022549254025945617A +:10B6700082803737002003475701F99BB7350020F8 +:10B680005882373700200347770141469385C51B11 +:10B69000D88237370020034767011305610093768E +:10B6A0001700D58FF59B93762700D58FED9B93766A +:10B6B0004700D58F9316470093F6061093F7F7EFE0 +:10B6C000D58F9316470093F6062093F7F7DFD58FB3 +:10B6D00012071377074093F7F7BFD98FFC84975071 +:10B6E000F91FE78040C5B737002083C7470199BFDE +:10B6F000011122CC26CA4AC84EC606CE2A89014468 +:10B70000B7340020B739002083C71401636BF400FD +:10B710003E842285F2406244D2444249B2490561E6 +:10B72000828083A7C900131544001946CA853E9537 +:10B730009750F91FE78020D169FD05041374F40FB9 +:10B74000E1B71D71A2CC373400208327C402D2C4D4 +:10B75000D6C286CEA6CACAC8CEC6DAC02A8AAE8AE1 +:10B760001304C402A5E319E10545F9A8F5DDEFF0DE +:10B770003FF83737002083461701B737002023856D +:10B78000A7001389A70093091701636DD5028144AF +:10B79000373B00200DA08327CB00139544001946AA +:10B7A0009305F00F3E959750F91FE78060D109E9A6 +:10B7B000850493F4F40F83C70900E3EEF4FCBE8420 +:10B7C00023009900B73400201389A400B737002064 +:10B7D0000345090083C717019384A400E376F5F8B5 +:10B7E0001C40ADEF99473305F5025286C14513055C +:10B7F0000520EF80FDBF130600049305F00F0A85B6 +:10B800009750F91FE780C0B9034509009D670A8674 +:10B81000930500043E95EF80BDBD8347090037378F +:10B8200000200325C70092074146D2853E959750D8 +:10B83000F91FE78040B023205401B737002003C52B +:10B8400007F4EF803DB60145F6406644D6444649CC +:10B85000B649264A964A064B256182809047814721 +:10B8600009CE99473305F502F14513051520EF8000 +:10B870003DB81C4023A4070085471840104B11CE4B +:10B8800088209947F1453305F50213052520EF80FF +:10B890003DB61C4023A8070085471840504B11CEE9 +:10B8A00088209947C1453305F50213053520EF80FF +:10B8B0003DB41C4023AA07008547184050470DCAD5 +:10B8C00088201949C1453305250313054520EF801C +:10B8D0003DB288201C40914533052503D0474106E1 +:10B8E00013055520EF80DDB01C4023A60700B1B73B +:10B8F000A9F7B737002083C7970099C3EFF07FA55A +:10B90000B737002083C7870099C3EFF0FFAAEFF095 +:10B910005FB399BDB737002083C71701011122CC4F +:10B9200006CE26CA09446376F50285C599473305D4 +:10B93000F502AE840A86C14513050520EF80BD815E +:10B940002A8401E919468A8526859750F91FE780E0 +:10B95000809E2285F2406244D244056182800111BA +:10B9600022CC06CE2A842EC632C49750F91FE78017 +:10B97000A01215C95825A1472246B2456310F70207 +:10B98000B737002083A7070399CF03A34700630CB1 +:10B99000030022856244F24005610283B73700202C +:10B9A00083A74703D5B7F240624405618280011145 +:10B9B00022CC19443304850226CA0A86AE84C145C6 +:10B9C00006CE130404202285EF80EDF801C98144DE +:10B9D000F24062442685D24405618280194693056F +:10B9E000F00F0A859750F91FE78080AD6DF138861A +:10B9F0009377D70F89C49377F70F93E72700C20790 +:10BA0000C1838544E306F7FC0A86C14522857C860E +:10BA1000EF801D9EB737002003C507F4EF809D9887 +:10BA200045BF1D71A2CC2A8419453305A402A6CABC +:10BA3000CAC8B2842E890A86C14586CE1305052060 +:10BA4000EF806DF101C90145F6406644D644464990 +:10BA50002561828019469305F00F0A859750F91FDA +:10BA6000E78000A66DF19D673E94100893050004E1 +:10BA70002285EF804DEE19C10545F9B70808EFF0B2 +:10BA80008FEA6318090413060004814508089750DB +:10BA9000F91FE780E0A26DF1130600048145080854 +:10BAA0009750F91FE780C08FB73700200547080877 +:10BAB0002382E702EFF02FE71008930500042285A8 +:10BAC000EF801D93B737002003C507F4EF809D8DED +:10BAD00065B71C089008BE868E22368763802503D2 +:10BAE0009106E31BD6FE0145A5D096233E8789C665 +:10BAF0009107E31CF6FE81BF239027013C23E38DD1 +:10BB000097F624A3D5F02310070079BF01114EC684 +:10BB1000B73700207D57B739002022CC26CA4AC843 +:10BB200006CE52C42389E7009387C923E827373913 +:10BB30000020373400209304C90093052004120527 +:10BB4000A308040023A004009740F91FE780804F5A +:10BB500088C01304140105C59389C92383C7E9006C +:10BB60001309C90081441CA01C2063E5F41203A73B +:10BB70008900B737002063010716A389075E1820E4 +:10BB8000B737002005442385E700B737002023A6F8 +:10BB90000702B7370020238387F437350020B737F3 +:10BBA0000020A38E07004146B737002081451305CA +:10BBB000C51CA38F07009740F91FE780607EB73749 +:10BBC000002093047007238E0700B7370020238FCF +:10BBD0009700B737002023A00702B7370020A381C2 +:10BBE00087F4B7370020238A070037350020B7379E +:10BBF0000020A38A07004146B7370020814513057E +:10BC0000C51BA38B07009740F91FE7806079B73702 +:10BC10000020238B9700B737002023AC0700B737ED +:10BC20000020A38907001547B7370020A380E7F459 +:10BC3000B73700204147A382E7F4B73700202382BB +:10BC400007020947B73700202381E7F4B737002000 +:10BC500023AA0702B737002023A80702B73700201E +:10BC6000A3840700B737002023880700B7370020D8 +:10BC7000238087F4B7370020A38387F4B7370020E9 +:10BC8000238287F4F2406244D2444249B249224AB4 +:10BC90000561828003250900139A44001946930523 +:10BCA000F00F52959740F91FE780806F0325090038 +:10BCB00019469305F00F529519059740F91FE78033 +:10BCC000206E83270900850493F4F40FD2972396FE +:10BCD00007002387070049BD130700F8A389E75E23 +:10BCE00079BD757122C5CEDED2DCD6DADAD806C7C8 +:10BCF00026C34AC10144B73A0020373B0020994986 +:10BD00001D6A93841A019C206367F402B7370020F0 +:10BD100003C507F4EF800DE99820BA402A44B737ED +:10BD200000202385E7009A440A49F659665AD65AF4 +:10BD3000465B496182801309CB00032509009314F7 +:10BD40004400194626959305F00F9740F91FE780A8 +:10BD500020650325090019469305F00F269519055E +:10BD60009740F91FE780C063832709001319040176 +:10BD700013590901A697B3043903239607002387B3 +:10BD8000070041469305F00F48009740F91FE780F0 +:10BD9000206171469305F00F48089740F91FE7802E +:10BDA0002060130600049305F00F08189740F91F50 +:10BDB000E780005F5000C14513850420EF804DE30C +:10BDC0005008F14513851420EF808DE25008F145AD +:10BDD00013852420EF80CDE15008C1451385342020 +:10BDE000EF800DE15008C14513854420EF804DE000 +:10BDF0005008914513855420EF808DDF101893056E +:10BE00000004330549010504EF808DDE1374F40F3F +:10BE1000CDBD930705C04111C20722C406C6C18328 +:10BE2000130720022E846367F71237F706008A078C +:10BE30001307078BBA979C438287B737002083C7C5 +:10BE400067F41CA01DA8B737002083C7C7018987E6 +:10BE50003DA8B737002083C7D701E5B7B737002023 +:10BE600083C7F701F9BFB735002041469385C51C4C +:10BE700022859740F91FE780004C8147B240224459 +:10BE80003E8541018280B737002083C7C701858B7B +:10BE90004DBFB737002083C7E70165B7B73700202C +:10BEA00083A707021CC0D1BFB737002083C737F470 +:10BEB00049BFB737002083C7470151BFB7370020BC +:10BEC00083C75701BDBFB737002083C7770195BF30 +:10BED000B735002041469385C51B59BFB7370020B1 +:10BEE00083C747016DB7B737002083C7670191BF8C +:10BEF000B737002083A7870175B7B737002083C7FE +:10BF0000370181B7B737002083C717F41DBFB73794 +:10BF1000002083C757F435B7B737002083C7970091 +:10BF20000DB7B737002083C7870021BFEFF00FA4FC +:10BF300008A0A1B7B737002083C747F419B7B737B0 +:10BF4000002083C7C7018D8799B7B737002083C703 +:10BF50004701D5BF130720048947E361A7F2EFA08B +:10BF60006D8D0AA019BF011106CE22CC26CA4AC87F +:10BF70004EC652C456C2EFA08DD851E937390020C1 +:10BF80001309090103470900B734002085472A84B3 +:10BF900093841401630EF702373A0020854A9C20EF +:10BFA0006374F4049309CA0003A709001319440039 +:10BFB0004A977C27639A57012285EFF0CFA383A786 +:10BFC0000900CA972387070005041374F40FC1BF43 +:10BFD000EFF00FB5B737002083A7C70098202300E4 +:10BFE0000900B907631EE400EF806DE66244F24089 +:10BFF000D2444249B249224A924A05616FF0EFC6E3 +:10C000000504238007001374F40FC107E1BFF24059 +:10C010006244D2444249B249224A924A056182802E +:10C02000797126D24AD04ECEB734002006D622D41B +:10C0300052CC8947AE893289938414016307F5068F +:10C04000636FF5008D47630FF50A80202285B2509B +:10C05000225492540259F249624A456182802E85E7 +:10C06000EFF00FE99C202A84E372F5FEE30009FE5D +:10C070001946CE854A859740F91FE780C02BF9B74E +:10C080008327CA001315440019463E95CE8519052D +:10C090009740F91FE780203B21ED05041374F40F4E +:10C0A0009C20E36FF4FC3E8455B70144373A0020EE +:10C0B000C5BF05041374F40F9C20E376F4FE33052A +:10C0C00044030A86C1451305352042054181EF80AE +:10C0D0008D8865F141469305F00F0A859740F91F59 +:10C0E000E780003E79F5CE850A85EF907DFC71F101 +:10C0F0009C20E37DF4F4E30B09F4CA852285EFF07C +:10C100007F81A9B70144194A45BF79714AD006D643 +:10C1100022D426D22A8902CC231E01009750F91F6F +:10C12000E780809721C1B7340020938434F49820AD +:10C1300089476309F702930565002A84483130086E +:10C14000EFF01FEEB737002083C717016372F502C7 +:10C150002AC6EFE07FFFB2452A860547A1464A85F9 +:10C16000EFF0AFBCB2502254925402594561828024 +:10C170009C2091E795454A85EFA08DB5E5B7054729 +:10C18000E392E7FE4C3001464A85EFF0AFC0D9BFDD +:10C190000111C1674AC806CE22CC26CA4EC6FD1779 +:10C1A0002E89630DF5069750F91FE780E08E2A84EB +:10C1B000D14429CD9305650048310146D544EFF0BF +:10C1C0003FE6B737002083C717016376F500CA85BD +:10C1D000EFF0EFFD8144630B09022285EFF00FB40D +:10C1E00035A0CA852285EFF08FFC11C1814405047A +:10C1F0001374F40F83C71901E365F4FE63080900A3 +:10C2000037B506001305C551EF20DEF5F240624454 +:10C2100026854249D244B249056182800144D54411 +:10C22000B7390020C1BF0111C1674AC84EC606CE4A +:10C2300022CC26CA52C4FD172E89B2896302F506A4 +:10C240009750F91FE7804085D14431C193056500BF +:10C2500048310146D544EFF0BFDCB737002083C733 +:10C2600017016376F5024E86CA85EFF08FFB814495 +:10C2700039A84E86CA852285EFF0AFFA11C18144F4 +:10C2800005041374F40F83471A01E364F4FEF240CB +:10C29000624426854249D244B249224A05618280DD +:10C2A0000144D544373A0020F9BF411122C4373444 +:10C2B0000020130424010C20B737002023AAA70272 +:10C2C000614506C6EFA0ADAD08202244B240410151 +:10C2D0006F00FED8411122C437340020130424011A +:10C2E0000C20B737002023A8A702614506C6EFA09F +:10C2F0000DAB08202244B24041016F005ED64111CF +:10C3000006C622C426C29DE9AA85AA8437450F0025 +:10C31000130505243375A602EF90BDD32A8409C9FD +:10C320009307E00F6306F50085452685EFA04D9A3B +:10C330002285B2402244924441018280EFA04D996F +:10C340000144FDB7411106C699E9B287B6852A8630 +:10C350003E85EF30DECCB240014541018280EFA046 +:10C360002D97D5BFB7370020938767F498231367BD +:10C3700007F898A3B737002083C5C7016FA00D8ABF +:10C380001971A6DAB2845000CAD8D2D486DEA2DCF3 +:10C39000CED62A89368A02C223140100EFF05FC884 +:10C3A000B737002083C717016370F5102A84EFE0C8 +:10C3B000BFD99147AA896310FA0EB737002003C787 +:10C3C00067F49146791713371700A285420441801C +:10C3D0001949330924034E862685EFF00F955146FF +:10C3E000814568009740F91FE78080FB7000C145D8 +:10C3F0004209135909011305492042054181EF7093 +:10C400009DD505E941469305F00F68009740F91F57 +:10C41000E780000B19ED130559204205700891457E +:10C420004181EF705DD3700093F519002685EFA070 +:10C430008D831D65229542051010930500044181EE +:10C44000EF707DD105E10810EFE0FFCD001013097A +:10C4500001060E2089C530202685EFF0BD8F11041E +:10C46000E31989FE93F9290063890900B737002091 +:10C4700083C527012685EFF0CD9B9147631AFA0407 +:10C48000B737002003C767F489476313F70426858D +:10C49000EFF05FED35A8B737002003C737F4D28639 +:10C4A00079171337170015B7A147E318FAFCB73708 +:10C4B000002003C737F48947631CF7000146CA858B +:10C4C0002685EFF02F8D014681452685EFF02FC997 +:10C4D000F6506654D6544659B659265A0145096154 +:10C4E0008280B737002023A4A75E8280011106CE88 +:10C4F0002AC6EFF0AFE13245F240B737002023897A +:10C50000A70005616FE07FF61D7186CEA2CCA6CA9A +:10C51000CAC8CEC6D2C4D6C2DAC0EF60FEF4B737FE +:10C52000002083C777F499CB0144373A0020B73A0B +:10C530000020194B83471A01636CF400F6406644EF +:10C54000D6444649B649264A964A064B256182801A +:10C550009389CA0003A509001319440019469305DD +:10C56000F00F4A959740F91FE78080F539E5B3044D +:10C5700064035010F1451385142042054181EF708A +:10C580009DBD05ED0347F1039307F00F6317F70215 +:10C590001385342042055000C1454181EF70BDBB79 +:10C5A0005008C1450945EF701DBB83A5090054081B +:10C5B0005000CA95E835EF60FEEA05041374F40FE5 +:10C5C00095BF930705C05D71C207A6C2CAC086C6E3 +:10C5D000A2C44EDE52DC56DA5AD8C18313072002B9 +:10C5E0002A89B2846369F75437F706008A0713076C +:10C5F000C793BA979C43828785476384F50061445B +:10C6000011A81C220947E36CF7FE373700202303EB +:10C61000F7F401442285B640264496440649F2596F +:10C62000625AD25A425B616182808547E399F5FC88 +:10C630001422E3E6D5FC373700201307C7011C237B +:10C64000E1CA93E747001CA3E9B78547E399F5FAE8 +:10C650001C221147E365F7FA37370020A30EF700D5 +:10C660004DBF8547E39DF5F81C22E3EAF5F837371F +:10C670000020A30FF70071BFC147E392F5F83735EB +:10C6800000204146A6851305C51C9740F91FE78089 +:10C6900080CA41B78547E394F5F61422E3E1D5F665 +:10C6A000373700201307C7011C23E9C293E717009F +:10C6B00059BF8547E395F5F41822B7370020238F3B +:10C6C000E70081BF9147E39CF5F21842B7470F009E +:10C6D0009387F723E3E5E7F2B737002023A0E702CB +:10C6E0000DBF8547E39DF5F01C220947E369F7F08C +:10C6F00037370020A301F7F429BF8547E391F5F010 +:10C700001422E3EED5EE373700201307470105BFAB +:10C71000ED9B15BF8547E394F5EE1C221147E360BE +:10C72000F7EE37370020A30AF700E5B58547E39811 +:10C73000F5EC1C22E3E5F5EC37370020A30BF700FE +:10C74000C9BDC147E39DF5EA373500204146A685BE +:10C750001305C51B1DBF8547E393F5EA1422E3E0EB +:10C76000D5EA37370020130747013DBFF99BE1BDEC +:10C770008547E396F5E81822B7370020238BE700BA +:10C7800049BD9147E39DF5E61842B7470F009387EF +:10C79000F723E3E6E7E6B737002023ACE70095BDD3 +:10C7A000E39F05E4EF90BDD501E9EFE07FB7EF70BF +:10C7B0001DEAEFE09FCBB1BDB737002005472388C6 +:10C7C000E70081BD9D47E39CF5E29385140019467F +:10C7D00068009740F91FE78000B6882050086C0079 +:10C7E000EFF01F84B737002083C71701AA840944DC +:10C7F000E372F5E24808EF200EF709E52685EFE041 +:10C800009F9F75B7B737002083A7C700920459448C +:10C81000BE948547FCA4FDBB9D47639AF50A194663 +:10C820009385140068009740F91FE780C0B0882006 +:10C8300001466C00EFF0CFFEB737002083C7170129 +:10C840006379F5049944B30495025008F145938443 +:10C850001420C204C1802685EF70FD8F2A8405E96B +:10C860001307A04185476304E9009307F00F5008C0 +:10C87000F1452685A307F102EF709DB7B737002079 +:10C8800003C507F4EF701DB2EFF01FC861B3094490 +:10C89000E5BFB737002083C7375F0944E38C07D66D +:10C8A000373700209306A0418347475F631DD900B7 +:10C8B00093E7170037350020230AF75E1D46A6854B +:10C8C0001305C55ED9B3F99B230AF75E99B3854773 +:10C8D000E397F5D2373700209306A0418347475F9F +:10C8E0006315D50093E72700C5B7F59BF1BFB737B0 +:10C8F0000020A38307F4EFF03FC121BBB73700202E +:10C900000547A383E7F40144373900209949130A06 +:10C91000F00FFD5A373B002083471901E37DF4FCFB +:10C92000B30434035008F145938414202685EF7036 +:10C930009D8205E18347F102638D47015008F1456F +:10C940002685A3075103EF70BDAA03450BF4EF70D2 +:10C950007DA505041374F40FC1B78547E391F5CAAB +:10C960001C22E3EEF5C837370020A309F70055B1C4 +:10C970008547E396F5C81C222547E362F7C8373799 +:10C980000020A300F7F471B18547E39AF5C6182299 +:10C99000A546930797FF93F7F70FE3E2F6C6B7377D +:10C9A0000020A382E7F4B5B18547E39AF5C4B73711 +:10C9B00000209387970018229423014498A3E39BB7 +:10C9C00006C4E319B7C4EFE05FAAA9B18547E398AD +:10C9D000F5C2B737002093868700982090221384F1 +:10C9E000870098A209E66314B700EFE01FA80820AB +:10C9F000EF60DEA739B98547E393F5C01C220D47E8 +:10CA0000E36FF7BE373700202301F7F419B18547EC +:10CA1000E397F5BE1822B73700202380E7F4D5BE90 +:10CA20000545EF703D98F5B68547E39AF5BC1822A9 +:10CA3000B73700202382E7F4E9BE93074002E39072 +:10CA4000F5BC8830014693852400EFF06FDDB737E1 +:10CA5000002083C71701E374F5BA19443304850233 +:10CA60009820A1471374F40F6312F7040904137498 +:10CA7000F40F420441805008F1452285EF70ADED7E +:10CA8000E31F05B69385840048086D469740F91F5B +:10CA9000E780608A5008F1452285EF707D95B737B1 +:10CAA000002003C507F4EF70FD8F91BE0504C1B7E8 +:10CAB000B737002003D7C724930740046D44E3FB36 +:10CAC000E7B48547E39DF5B21C22E3EAF5B285C3DE +:10CAD000B737002083A7875E5544E38D07B2B73789 +:10CAE00000209387C70198231367870039A0B737C1 +:10CAF00000209387C70198235D9B98A319BEB73781 +:10CB0000002003D7C724930740046D44E3F4E7B043 +:10CB10008547E396F5AE1C22E3E3F5AEE9DBB737D4 +:10CB2000002083A7875E5544E38607AEB737002011 +:10CB3000938747014DBF930720040944E3EC27ADD9 +:10CB4000E39A85AC8E204A85EF907DA52A84D9B4DE +:10CB5000797106D622D426D24AD03C215147E91712 +:10CB600093F7F70F6369F70237F706008A07130791 +:10CB7000879CBA979C432A84828726255025543562 +:10CB8000268532C636C49740F91FE780E0F0AA87B1 +:10CB9000A246324619E185443DA2D827A147130594 +:10CBA00034006318F702B737002083A70703A68570 +:10CBB00089C79C4399C38297F9BFB737002003A563 +:10CBC0008701EF900DC961D985452685EF905D906D +:10CBD000D9B7B737002083A74703A68599C39C43DD +:10CBE000F9FBB737002003A50702E1BF2E252E85EC +:10CBF0002EC49740F91FE78020EAAA8749DDD8278D +:10CC0000A147130534001306C4009306C401A245CE +:10CC1000631BF700B737002083A70703ADDF9C47EE +:10CC2000BDDB82978DBFB737002083A74703FDB7D1 +:10CC30001C31DDEF7C21858BC5CFB737002083A762 +:10CC4000C7020149DDE78145414608089730F91FD1 +:10CC5000E78000754C48BDCDFC291946C105A30FDE +:10CC6000F10008089730F91FE780E06C7C20B88657 +:10CC70008987858BD98FFC86EFE04FCFB7370020AF +:10CC800083C717016391A702B737002083C747F412 +:10CC900099C3EFF00F85B737002083A7072781C717 +:10CCA000854521458297EFE06FCCA2850808EFE02B +:10CCB0005FA9AA84554915EDB737002003C52701A0 +:10CCC0008945EF605D91B2502254268502599254F5 +:10CCD000456182804A2085449740F91FE780C0DB88 +:10CCE0007DD15C31194693056500A30FF10095BF16 +:10CCF000014910304A208545EFE07FC6E30D09E881 +:10CD00004A868D454A20EFE09FC571B51831994795 +:10CD1000631BF7024A219740F91FE780E0D7AA84F6 +:10CD20001DC1B737002083C727F409476386E70290 +:10CD30000D47638DE70005476397E7004C314A20B4 +:10CD40000146EFE03F85103089456DBF01468145C2 +:10CD500013050041EFF0FF864E2088201546EF9026 +:10CD60004DFAD5B79305450028310146EFF04FAB9A +:10CD7000B737002083C71701E37FF5E099473305F4 +:10CD8000F5021306C4009145130555204205418163 +:10CD9000EF700DE6B737002003C507F4EF708DE0A4 +:10CDA000DDBBB737002083C737014A2191C7B737AA +:10CDB000002083C517F419BDB737002083C767F477 +:10CDC00099E3954521B59740F91FE780E0CCAA8407 +:10CDD000E30305DC3C24858B9DC74831854763F41C +:10CDE000A7025E2493F7072099EF1008938564004B +:10CDF000EFF00FA3B737002083C717016395A70093 +:10CE00008D454A20E1B3CC304A2013068400EFE080 +:10CE10006FF801468145FDB54A21EFF00FAFA5BB84 +:10CE20004A21EFF04F94B7370020938767F4982397 +:10CE30001377F70798A385B379719397050122D4E7 +:10CE400006D626D24AD04ECE52CCC1872E8463D18C +:10CE5000070AB737002003C527019730F91FE7807D +:10CE60002043AA8431C11C211307100B6389E704F6 +:10CE70001307000D6384E7021307000B6393E702B7 +:10CE80005821F9476316F7002A218145EFF04FB08A +:10CE9000CC2013858400EFD0DD9B21A0EFF05FCB89 +:10CEA00001C52685EF602DBAA164A18CB250225431 +:10CEB000268502599254F249624A456182805C217A +:10CEC000EDF312256E212A2137390020130949027A +:10CED00023000900EFF02FB583470900F9D3B737D6 +:10CEE000002003C507F423000900EF70ADCB55BF48 +:10CEF00093F7250095C381450145EFE09F84B7373F +:10CF000000209344240093872701854511E189453A +:10CF10008823EF604DEC59BF93F71500F9CBB73973 +:10CF2000002083A7C902B73400209389C90203DA1D +:10CF3000470083A784029384840285E33737002067 +:10CF400037F60600C165130787038946130606C630 +:10CF5000FD150545EFF0AD8488C08C4013441400E6 +:10CF60009DE983A7090001468545CA23931404015E +:10CF7000C180EFE0DF9E83A7090001468D45CA23EB +:10CF8000EFE0FF9DB737002003C507F4EF708DC1B8 +:10CF9000EFE04FA321BF37390020035689039308E0 +:10CFA000F00F094881471307E10074005285EFF044 +:10CFB000ADCF1309890319E990861C8622065D8E80 +:10CFC00011C69C405285AE27EFF0EFA5884003566E +:10CFD0000900C1658146FD15EFF0EDC188C09314CD +:10CFE0000401C1803DDDB7370020854503C5270119 +:10CFF0000DB793F745008144E38A07EA93C44500DF +:10D0000075B593970501C18763D80706B737002028 +:10D0100003C55764411122C426C206C6AE849730A8 +:10D02000F91FE780E0262A8429C118219307000D03 +:10D03000631AF7023C2191EF1C3181EF9305350013 +:10D040003735002019461305C5659730F91FE7806D +:10D05000802EB737002083A7C70389C79C4399C395 +:10D06000228582972285EF600D9EB2402244216581 +:10D07000258D9244410182800145828009C5B737E0 +:10D08000002023AEA70237360020373500200346A4 +:10D09000E65F0345556481470147814689456FC076 +:10D0A000DDB8B737002083C757640111C886680010 +:10D0B00006CE5C864C87D087EFA07DADF24005613F +:10D0C0008280B737002003C557646FA09DA8411127 +:10D0D00026C2B734002022C403C4546406C6930792 +:10D0E000F00F6308F4006145B240224492444101CC +:10D0F000828037D5060013052500EF601DBEA38290 +:10D10000A464E30285FEB737002023AE0702094777 +:10D11000B73700202382E764EF80FDF80145E9B7C7 +:10D120003421F14763EDD72C37F70600939726009B +:10D130001307C7A1BA979C43011122CC06CE26CA79 +:10D140004AC84EC62A8482871C3137390020C5EB75 +:10D15000B7350020B7340020414693858564138598 +:10D1600044629730F91FE780002EB73900203DE96F +:10D1700013864462C1450945EF708DA71386496344 +:10D18000C1450D45EF70CDA6B737002003C507F4A4 +:10D19000EF704DA137350020930534001305C565A8 +:10D1A00019469730F91FE78000198547232EF9604B +:10D1B000B737002003C557648545EF60CDC103250F +:10D1C000C961B737002083A70704BDC303A30700C5 +:10D1D00063000306A2856244F240D2444249B24948 +:10D1E00005610283B735002041469385856013852C +:10D1F00049639730F91FE78000253DD961BF994702 +:10D20000232EF9606DBF18313C3129E70947639837 +:10D21000E702373700208327C7618145014593F72F +:10D22000F7F093E70702232EF760EFB03D8108B0D7 +:10D23000F2406244D2444249B249056182800547C6 +:10D24000814501456395E700EFB0ADEECDB7EFB096 +:10D25000ADDDF1BF0947E38DE7FCB737002003A53B +:10D26000C76141991365650023AEA76099BF1C3162 +:10D27000B7340020BDEB8D47639AF60437370020A2 +:10D280008347C75F93968701E18663DD060093F7C6 +:10D29000F707230EF75EB737002003C557648945AB +:10D2A000EF606DB383A7C461914613F7F70063186D +:10D2B000D700C19B93E7570023AEF4609DA0894639 +:10D2C000E308D7F6C19B93E72700FDB703A7C46126 +:10D2D000B7370020238C075E9546937707FF3D8B79 +:10D2E000631CD70493E74700C1BF83A7C461C19BF8 +:10D2F00093E76700D1B7B734002083A7C461183122 +:10D30000C19B1DE393E7470023AEF46032259305EC +:10D31000450028319146EFF0AF86B7370020238CC7 +:10D32000075E03A5C46171BD93061003E312D7FC29 +:10D3300037370020230C075E93E73700B5BFEFF0C7 +:10D340003F81373700208327C761954613F6F700E2 +:10D35000C19B13E537006314D60013E52700232E85 +:10D36000A76085B5B734002083A7C461183193F74F +:10D37000F7F039E74D476390E60493E70701373745 +:10D38000002023AEF4608347376693968701E186D9 +:10D3900063DD060093F7F707A301F766B7370020B0 +:10D3A00003C557649145EF600DA383A7C46137059A +:10D3B00000015D8D39B593E7070223AEF460F5B740 +:10D3C00093E70703DDBF373700208327C7617D76EA +:10D3D0001306F60FF18F103105E26D46639BC60010 +:10D3E00093E70710232EF7608327C76137050002F4 +:10D3F000C9B793E70720FDB793E70730E5B7828009 +:10D400001821930610096307D7009307000D6302E4 +:10D41000F704828014313947639FE602562105677D +:10D42000130757406399E60218459307F0078305F1 +:10D4300037006382F502B737002083A7070481CF46 +:10D4400003A34700630903003C230833A2075D8D53 +:10D4500002836FF0FFCC828001119397050126CAE9 +:10D4600006CE22CCC187AE8463D5070CB737002027 +:10D4700003C557649730F91FE78080E12A8419C9F2 +:10D48000B737002083C7B75F89EFEFF07FF72285BA +:10D49000EF507DDB2165258DF2406244D244056169 +:10D4A00082801C211307000D639DE7043C2181E766 +:10D4B000EFF01FF501A81547639EE7005825A14727 +:10D4C000E395E7FCB737002003C52766A285EF5038 +:10D4D0007DDCC9B72147E38DE7FC99466394D7000B +:10D4E0007C31F9BF1D47E392E7FA4A219730F91FD3 +:10D4F000E780805A49DD5825A1472285E317F7F8D0 +:10D50000D1B71307200AE382E7F813071009E39164 +:10D51000E7FA1831B947E31DF7F85A218567938771 +:10D520005740E317F7F818453C230833A2075D8DF1 +:10D5300075BF9397150163D2070237360020130693 +:10D54000460491451145EF60BDEAB737002003C599 +:10D5500007F4EF603DE511653DBF93F71500D1CFAE +:10D56000B737002083C7875FA5C3EF107EC5B737E5 +:10D57000002083C717258D8B636BF5048D475C8274 +:10D58000B737002083C7975F4C005C86B737002011 +:10D5900083C78765DC86B737002003C55764EFA0D3 +:10D5A000FDDE1DC1B737002003A5C7614199136592 +:10D5B000650023AEA760B737002083A7070489C79B +:10D5C0009C4399C38145829713C51400F1B5B737C1 +:10D5D000002083C7A75FB735002019465C82B737A4 +:10D5E000002083C707629385056013056100DC8214 +:10D5F0009730F91FE78020D461B793F72500B1C3B6 +:10D60000B737002083C7C75F858B8DCBB737002026 +:10D6100003C55764EFB04D8615C1B737002003A589 +:10D62000C7611375F5F023AEA760B737002083A755 +:10D63000070489C79C4399C38145829713C5240079 +:10D64000A1BD93F745000145E38807E4B737002003 +:10D6500083C737669DCBB737002003C55764EFB04B +:10D660006D8505C5373700200325C761FD77938792 +:10D67000F70F7D8DB737002083A70704232EA760FF +:10D6800089C79C4399C38145829713C5440029B536 +:10D69000797122D426D206D6AA842EC6328436C404 +:10D6A0003AC23EC09730F91FE780003F29C10358B6 +:10D6B000E500B24582471247A246636BB800636932 +:10D6C000040112296316D60032296145630CE60075 +:10D6D000EC843E862C082685E085F486F887EF10DA +:10D6E000AEF20145B25022549254456182805145B8 +:10D6F000D5BF0111B737002006CEA380A74091C542 +:10D700002E8532C6EFE07FBA3246B737002083A7B6 +:10D71000C761B1E309C6B737002023A0C704373675 +:10D720000020B735002037350020F2400346E65F81 +:10D7300083C5456403455564B7370020373700205B +:10D74000B7360020938747041307476393864662E2 +:10D7500005616FC08DCDF240454505618280B737C8 +:10D76000002083C717258D8B91EB61458280614531 +:10D77000B24022449244024941018280411126C2B2 +:10D78000B734002022C403C4546406C64AC09307B9 +:10D79000F00FE31EF4FC37D5060013058545EF6056 +:10D7A000CDD3A382A464E30485FCB737002023A073 +:10D7B0000704B7370020114723AE0760B7370020B2 +:10D7C0002382E764B7340020EF80FD8D4146814518 +:10D7D000138544629730F91FE78080BC37340020FE +:10D7E00041468145130544639730F91FE78040BBEC +:10D7F000B7370020238D075EB73700201D472380F1 +:10D800000762B7370020A38CE75E37390020B737AF +:10D81000002013864462C1450945238C07642322F6 +:10D820000904EF605D9313064463C1450D45EF6045 +:10D830009D923735002041469385446213058564E7 +:10D840009730F91FE78020AF373500204146930518 +:10D850004463130585609730F91FE780C0AD130658 +:10D86000490491451145EF601D8F014511B7B73748 +:10D8700000207D579387C73FD8B3F8A3B737002060 +:10D88000854623820764B7370020238CD75EB737DD +:10D890000020994623A20704B7370020239CD760B5 +:10D8A0008567938707C8B73600202391F662B7379C +:10D8B0000020238F075EB7370020A38D075EB737A0 +:10D8C00000202381E766373500209D473737002049 +:10D8D000A30EF75E19463737002081451305056012 +:10D8E0002303F7601733F91F670083AB930705D055 +:10D8F0004111C20722C406C6C1835D472E846368F6 +:10D90000F71037F706008A07130707A9BA979C4351 +:10D910008287B737002083C747641CA03DA0B73576 +:10D92000002041469385456222859730F91FE780A4 +:10D9300080A021A8B7350020414693854563EDB707 +:10D94000B737002083A747049CC18147B2402244D7 +:10D950003E8541018280B735002019469385C56513 +:10D96000E1B7B737002083C7875F45BF2E85EFB08B +:10D97000AD99E1BF2E85EFB08D9BC1BFB7370020B9 +:10D9800083C7A75F59BFB737002083C7076271B746 +:10D99000B735002019469385056079B7B737002061 +:10D9A00083C7975F9DBFB737002083C78765B5B72B +:10D9B000B737002083A7C7618DB7B737002083C76B +:10D9C000E75FA1BFB737002083D787611EA0B5BF2F +:10D9D000B737002083D72762D5BFB737002083C76A +:10D9E000D75F25BFB737002083C767603DB72E8557 +:10D9F000EFB04D9799BFB737002083C7C75F93F744 +:10DA0000F70721BFB737002083C7376639B7130739 +:10DA100020048947E36CA7F2EF80CDE10AA035B777 +:10DA20009307F5CFC207C183D9462A872E8863EFB3 +:10DA3000F62AB7F606008A07938606AFB6979C4388 +:10DA4000411106C6B285428582874147E14763108E +:10DA5000E804373500204146130545629730F91F29 +:10DA6000E780608D25A04147E1476312E802373522 +:10DA70000020414613054563D5B71147E1476318B8 +:10DA8000E8001842B737002023A2E7048147B240DC +:10DA90003E85410182800547E147E31AE8FEB7373A +:10DAA0000020182283C6875F238CE75E814785C6E6 +:10DAB00079FF373700200327C76189463D8B63050F +:10DAC000D7009546E315D7FCB737002003C5576448 +:10DAD000EFA05DA265BF45DF373700200327C76190 +:10DAE000630607013D8B7517E363E8FA8545B73791 +:10DAF000002003C55764EF501DAE49BF9307C01CFB +:10DB000063E2071F6300061EB24041016FA0DDD132 +:10DB10009307C01C63E8071D6306061CB240410161 +:10DB20006FA03DE10547E147E313E8F61822A94657 +:10DB3000E3EFE6F4B7370020238DE75E81BF0547AA +:10DB4000E147E316E8F418228D46E3E2E6F4B7373E +:10DB500000202380E7621DBF1947E147E319E8F27F +:10DB600037350020194613050560CDBD0547E1474F +:10DB7000E31FE8F018229D46E3EBE6F0B7370020FC +:10DB8000A38CE75E21B70547E147E312E8F01822CE +:10DB90008D46E3EEE6EEB7370020238CE764FDB553 +:10DBA0000547E147E315E8EE1822B7370020238F39 +:10DBB000E75EE9BD0947E147E31BE8EC1222056790 +:10DBC0001307A7C79306A6FFC206C182E361D7EC7D +:10DBD000B7370020239CC76055BD0947E147E318CC +:10DBE000E8EA122205671307A7C79306A6FFC20635 +:10DBF000C182E36ED7E8B73700202391C76279B5B9 +:10DC00000C22B7370020A38EB75EB737002003C6BB +:10DC100067600145EF501E8695BD1022B737002082 +:10DC20002383C760B737002083C5D75FDDB793076D +:10DC3000C01C63E9070B5DC6B24041016FA01DE047 +:10DC40000547E147E315E8E4373700208346C75F1F +:10DC50001C22858A230EF75E13F6170091C6E31780 +:10DC600006E2EFA03DA41DB5E30206E2B7360020B0 +:10DC700083A6C6618945B98AE39B06E693E707F860 +:10DC8000230EF75E21B50547E147E312E8E0373799 +:10DC900000201C2283463766A301F76691C6E397EE +:10DCA00007DEEFA01DA3DDB3E38207DEB736002059 +:10DCB00083A6C66193F6060F99C291450DBD93E701 +:10DCC00007F8A301F766D9B39307200463EEE700D2 +:10DCD00089468947E31DD8DAB2400E223A854101D0 +:10DCE0006F80FD8BE14765B3894755B393072004E7 +:10DCF00063E8A700894689476395D5000E22CDB712 +:10DD000089473E8582806F50AEF1011122CC414699 +:10DD10002A84AA850A8506CE9720F91FE780A0618C +:10DD2000282093053400EF705D9848810A85EF50F4 +:10DD30008EFBF2406244056182806F504EFB6F5053 +:10DD4000CEFA014881476F506EEF011106CE2AC608 +:10DD50009730F91FE78040D401C9B245F24008214D +:10DD60004D4605616F80EDF9F240494505618280BD +:10DD70006F508EF06F508EFA6F508EEC411122C4AE +:10DD80002A840A2106C69730F91FE780E0D019CD12 +:10DD9000B737002003C7276622852244B240B73731 +:10DDA0000020A381E74041016F506EF6B24022444B +:10DDB0000945410182806F504EF46F50AEF46F50B0 +:10DDC0002EF66F50EEF8011122CC06CE1C212A84CB +:10DDD00089C737370020A301F7401C3081EF083096 +:10DDE0002C206244F240B7370020238EA73405610F +:10DDF0006F506EEE7C248348D4000348C4003EC0BC +:10DE000038243C34162472204E202820EFB08FECAA +:10DE100079D5F2406244056182806FC06FFA6FC0AD +:10DE2000DF956FC0DF88411106C6EF207FB137E56F +:10DE300004001305A5C8EF505DEAEFF0FDCC37658F +:10DE400004001305C564EF505DE9EF80EDFB37B5C5 +:10DE500004001305058AEF505DE8EFC05DA13705AA +:10DE600005001305E534EF505DE7EF202EE437D5CC +:10DE70000600130585E3EF505DE6EFE02FE737D5A9 +:10DE8000040013058524EF505DE5EFF00DB8B240B6 +:10DE900041016FF0CFA3411106C6EF705EE837E590 +:10DEA00004001305A5C8EF505DE3EFF0FDC537652D +:10DEB00004001305C564EF505DE2EF80EDF437B563 +:10DEC00004001305058AEF505DE1EFC05D9A370548 +:10DED00005001305E534EF505DE0EF202EDD37D56A +:10DEE0000600130585E3EF505DDFEFE02FE037D547 +:10DEF000040013058524EF505DDEEFF00DB1B24054 +:10DF000041016FC0BFE2411106C6EF30DFCF37E5F8 +:10DF100004001305A5C8EF505DDCEFF0FDBE3765CA +:10DF200004001305C564EF505DDBEF80EDED37B500 +:10DF300004001305058AEF505DDAEFC05D933705E5 +:10DF400005001305E534EF505DD9EF202ED637D507 +:10DF50000600130585E3EF505DD8EFE02FD937D5E4 +:10DF6000040013058524EF505DD7EFF00DAAB240F1 +:10DF700041016FF0CFFE411106C6EFC02E9DB737AD +:10DF8000002083C757641307D00FFD1793F7F70FCF +:10DF90006372F70637E504001305A5C8EF50FDD3FB +:10DFA000EFF09DB6376504001305C564EF50FDD250 +:10DFB000EF808DE537B504001305058AEF50FDD1DC +:10DFC000EFC0FD8A370505001305E534EF50FDD09D +:10DFD000EF20CECD37D50600130585E3EF50FDCFFA +:10DFE000EFE0CFD037D5040013058524EF50FDCEE8 +:10DFF000EFF0ADA1B24041016FD08F8641113707DC +:10E00000002006C6B70700201307077D98C33727EF +:10E01000002013078756D8C337370020130707E8B7 +:10E0200037360020B70500203705040098C71306CF +:10E03000C6EB938505041305052F9720F91FE7808C +:10E0400060FD37360020B735002037F5060013068F +:10E0500086F49385C5EB130545C99720F91FE78022 +:10E0600060FBB24041011723F91F6700C3FB9761B2 +:10E07000F91F938121F91721FA1F1301A1F8172520 +:10E08000FDFF130525249725F91F9385A5F817266D +:10E09000F91F130626FB63FCC5008322050023A09D +:10E0A000550011059105E3EAC5FEEFF03FF5730059 +:10E0B000203011CE93070002918F635BF00033553F +:10E0C000C500B397F50033D6C5005D8DB28582805B +:10E0D000130506FE014633D5A500B285CDBF11CE8E +:10E0E00093070002918F635BF000B395C500B357AF +:10E0F000F5003316C500DD8D32858280930506FE5E +:10E100000146B315B5003285CDBFB687B2882A83E4 +:10E110002E88639B061463F8C50A4167636BE61A91 +:10E12000B70700016360F63493568601E14717177D +:10E1300000001307E7A136971823BA9713070002C8 +:10E140001D8F19CB3398E500B357F500B318E600DF +:10E1500033E807013313E50013D608013355C8022D +:10E1600093960801C182935703013377C802B385A0 +:10E17000A60242073368F700637AB800469893070F +:10E18000F5FF636418016365B8303E853308B84015 +:10E190003357C8024203135303013378C802B386CE +:10E1A000E602420833686800637BD800469893070C +:10E1B000F7FF6365180179176363D8003E8742054E +:10E1C000598D8145828001E60547B358C7024167F2 +:10E1D00063E8E80EB707000163EAF82893D68801E0 +:10E1E000E147171700001307A79636971423BE962A +:10E1F00093070002958FFDE7939E08013387154131 +:10E2000013DF080193DE0E01854593570301335553 +:10E21000E7033377E703B306D5034207D98F63FAE1 +:10E22000D700C6971307F5FF63E4170163E5D72608 +:10E230003A85958F33D7E703420313530301B3F7AE +:10E24000E703B30ED703C207B3E7670063FBD70149 +:10E25000C6979306F7FF63E51701791763E3D701C4 +:10E2600036874205598D828063E1D504C16763E139 +:10E27000F604B707000163E3F61E13D78601614871 +:10E28000971700009387C78CBA979823130E000244 +:10E290004297330EEE40631A0E0C63EDB61C333515 +:10E2A000C500134515008145828081450145828066 +:10E2B0009307F00F63F3D71C13D786002148C9B723 +:10E2C0001307F00FC686E37E17F193D68800A147A7 +:10E2D00009BF1307F00FB286E37BC7E493568600AD +:10E2E000A147B1B5B398F80033D6D50013DF0801C4 +:10E2F000335EE6033397F500B356D500558F939EF2 +:10E30000080193DE0E013313F50093550701B37630 +:10E31000E603B387CE03C206CD8E63FBF600C69636 +:10E320001306FEFF63E4161763F2F616791EC6960F +:10E330009D8E33D6E60393170701C183B3F6E60338 +:10E340003385CE02139706015D8F637BA700469746 +:10E350009307F6FF636817136376A712791646973B +:10E3600093150E01098FD18D4DB5B357E600B396C5 +:10E37000C601DD8E33D3E50013DF0601B357E30397 +:10E38000939E060193DE0E013398C5013357E500D5 +:10E3900033680701935808013316C6013373E3034A +:10E3A000B385FE024203B368130163FBB800B6985D +:10E3B0001387F7FF63EAD80C63F8B80CF917B6981F +:10E3C000B388B84033D7E803420813580801B3F8BC +:10E3D000E8033383EE02C208B3E5080163FB65007E +:10E3E000B6951308F7FF63EDD50863FB6508791749 +:10E3F000B695C207416FD98F1307FFFFB3F6E70049 +:10E4000093D80701718F4182B38EE602B3856540D0 +:10E41000B386C60213D80E013387E802BA96C296B5 +:10E420003386C80263F3E6007A9693D806014696CF +:10E4300063E2C5026385C5003E85814582804167F0 +:10E440007D17F98EC206B3FEEE003315C501F696B0 +:10E45000E374D5FE1385F7FF8145828013D706014B +:10E46000414839BD93560601C147D1B193D6080141 +:10E47000C14785BB8145054582803687014809B57E +:10E48000428785BF3E86E9BDBA871DBF328E4DB536 +:10E4900079154698E5B97915C69761BBB3C7A5004C +:10E4A0008D8B3307C50081E78D4763EDC700AA87D1 +:10E4B000637EE508942185078505A38FD7FEE3EBEE +:10E4C000E7FE828093763500AA8789CA9421850762 +:10E4D0008505A38FD7FE93F63700C5BF9376C7FF98 +:10E4E000138606FE63F0C70683A3050083A24500DA +:10E4F00083AF850003AFC50083AE050103AE4501C0 +:10E5000003A3850183A8C5019385450223A0770055 +:10E5100003A8C5FF23A2570023A4F70123A6E70100 +:10E5200023A8D70123AAC70123AC670023AE170194 +:10E530009387470223AE07FF75B790419107910576 +:10E5400023AEC7FEE3EBD7FEE3E6E7F682800000EA +:10E55000F401FA00960064004B0032001E00140023 +:10E56000FB349B5F80000080001000000000000072 +:10E57000609C0400809C0400FC9C0400929C0400AD +:10E58000FC9C0400FC9C0400FC9C0400B49C040063 +:10E59000FC9C0400FC9C0400FC9C0400D89C04002F +:10E5A000584E040078B304008A4E0400E0C0040012 +:10E5B000F84E0400B2C00400A24F040084C004005E +:10E5C0003050040014CB04007C50040014CB040031 +:10E5D000CE5004007ACA0400A24F040030C00400E8 +:10E5E0006651040038C30400000000000000000071 +:10E5F000A4510400C2C304000C520400F2B304008E +:10E60000EEFB0400EEFB040010FC040024FC0400FC +:10E610002CFC040034FC04003CFC040044FC04001A +:10E620004CFC040054FC04005CFC040092FC04005C +:10E630009AFC040062FC04000101020102010102D3 +:10E6400001020404060104010101010104040201A4 +:10E6500004000000010102010201010201010404A1 +:10E660000601040101010101040102010100000091 +:10E67000120A05001E0A05005C0A0500740B05005D +:10E680007C0B0500BC0B0500F40B05002E0C0500EF +:10E69000600C0500160B0500940C05001C0D050010 +:10E6A0009C1805007A1805004E1B0500A81B0500E4 +:10E6B000861E0500C01C0500041D05003E1D05004A +:10E6C000741D0500AE1D05007A180500F01D05003B +:10E6D000621E0500000000000000000000000000B5 +:10E6E00000000087070B0D1113171D1F25292B2F65 +:10E6F000353B3D4347494F535961FF0030560500B4 +:10E700005C5605006E570500B6550500005805001B +:10E71000E05805007C5805001C590500B459050057 +:10E72000C855050020570500CA560500C858050001 +:10E7300084B10500BCC5050030B2050012C6050055 +:10E740004EB20500CAB20500F0B205002CB30500B8 +:10E7500034C50500AEC4050038B405005CB405003E +:10E76000C6B4050058B5050026C405004AC3050017 +:10E7700072C205006EA10500F8B5050044B605009B +:10E78000F4C8050096C8050070B6050008B8050075 +:10E790004EB90500C8B90500ECB9050048C9050027 +:10E7A000B0C005007ABA0500B4BA05004CC905002E +:10E7B00050C9050054C9050058C905005CC70500CB +:10E7C000F2BA0500BEBB05005CC9050044C90500DE +:10E7D00062BC050078C005007ABE050056E505005C +:10E7E000F4DB0500ACDB05002EE2050000E20500CD +:10E7F000D4E105009AE105006EE1050030E3050073 +:10E8000034E3050060DD050038E3050030E1050074 +:10E810003CE305000EE1050040E30500CEE0050005 +:10E82000BEE0050088E0050044E3050068E005005F +:10E8300048E305004CE3050050E305000AE005004D +:10E84000B0DB0500C4DB050054E3050058E3050018 +:10E850005CE3050060E3050064E30500AADF050052 +:10E8600034DF050068E305006CE3050070E3050094 +:10E8700074E30500D0DE050028E305002CE3050065 +:10E880007ADC0500C6E2050064E20500C8DB05008D +:10E8900043483332563230785F424C455F4C4942F0 +:10E8A0005F56312E343000007266322E346700001D +:10E8B0003ABE060046BE060052BE06005CBE06001A +:10E8C00066BE060086BE060092BE06009CBE06001E +:10E8D000A8BE0600B2BE0600BCBE0600C6BE06004C +:10E8E000D0BE0600DCBE0600E6BE0600F0BE060096 +:10E8F00054BF0600FABE060004BF06000EBF0600A5 +:10E9000018BF06002CBF060054BF060054BF060007 +:10E9100054BF060054BF060054BF060054BF060093 +:10E9200054BF060054BF060034BF060022BF0600D5 +:10E9300054BF06003EBF06004ABF0600F8C50600E9 +:10E940002AC606004AC6060062C6060078C6060049 +:10E9500094C60600B2C60600C4C60600E2C606009B +:10E96000FAC6060014C706002CC7060042C70600F8 +:10E9700056C7060070C7060082C70600A0C706007B +:10E980005AC9060070C9060088C90600A8C9060051 +:10E9900036CB0600F6C90600C4C706000ECA06003C +:10E9A00020CA060018C8060018C80600EEC80600EF +:10E9B000FCC8060028CA0600CCC906003ACA0600F0 +:10E9C000B0CA0600FECA060020CE060096CB06009E +:10E9D00096CB060064CD060030CC06007ACB06004C +:10E9E00018CE060096CB06000CCD0600A2CD060080 +:10E9F00096CB060096CB060096CB060096CB06007B +:10EA000096CB060096CB060096CB060096CB06006A +:10EA100096CB060096CB0600ECCB060048D106004C +:10EA200030D2060006D206006ED206006ED2060074 +:10EA3000F6D206003ED3060030D2060030D20600E1 +:10EA400030D2060030D2060030D2060030D20600A6 +:10EA500030D2060030D2060030D2060030D2060096 +:10EA600030D2060030D2060064D3060064D306001C +:10EA700030D2060030D2060030D2060030D2060076 +:10EA800030D2060030D20600C6D30600C6D3060038 +:10EA900012D906001ED9060034D9060040D9060056 +:10EAA00056D9060062D906006CD9060074D9060052 +:10EAB0007CD9060086D9060090D906009CD90600AC +:10EAC000A6D90600B0D90600BAD906000EDA0600AB +:10EAD0000EDA0600C4D90600D0D90600DAD906003D +:10EAE000E4D90600EED90600F6D9060004DA0600DD +:10EAF0004ADA060066DA06007ADA0600C8DC0600A2 +:10EB000096DA0600FCDA060010DB060024DB0600BD +:10EB10003EDB060058DB06006CDB060086DB0600E9 +:10EB2000C8DC0600A0DB0600C8DC0600C8DC060066 +:10EB3000B4DB0600DADB060000DC06001ADC0600A7 +:10EB40002EDC060040DC060086DC06000001020226 +:10EB50000303030304040404040404040505050575 +:10EB60000505050505050505050505050606060651 +:10EB70000606060606060606060606060606060635 +:10EB80000606060606060606060606060707070721 +:10EB90000707070707070707070707070707070705 +:10EBA00007070707070707070707070707070707F5 +:10EBB00007070707070707070707070707070707E5 +:10EBC00007070707070707070707070708080808D1 +:10EBD00008080808080808080808080808080808B5 +:10EBE00008080808080808080808080808080808A5 +:10EBF0000808080808080808080808080808080895 +:10EC00000808080808080808080808080808080884 +:10EC10000808080808080808080808080808080874 +:10EC20000808080808080808080808080808080864 +:10EC30000808080808080808080808080808080854 +:0CEC400008080808080808080808080868 +:08EC4C00020000006CEC060060 +:02EC5400012A93 +:02EC5800A62AEA +:02EC5C0003288B +:02EC6000022987 +:02EC6400002A84 +:02EC6800882BF7 +:02EC6C0000188E +:02EC7000011889 +:02EC7400022874 +:02EC7800042A6C +:02EC7C00022A6A +:02EC800000286A +:02EC8400C92A9B +:02EC8800032A5D +:02EC8C0001285D +:02EC9000052A53 +:10EC9400EE9104000893040000000000020000004C +:10ECA40080EC060001000000342F00200200000068 +:10ECB4005CEC0600010000003F2F00200200000071 +:10ECC40090EC0600000000000000000002000000BC +:10ECD40060EC0600030000000000000000000000DB +:10ECE40098B504000000000000000000C3812F015B +:10ECF40002010202020202005000A0000000E80328 +:10ED0400020802FFFF0000000200000070EC060091 +:0CED14000100FF200105020101100101B7 +:0400000340000000B9 +:00000001FF diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/KEY.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/KEY.c new file mode 100755 index 000000000..1055635df --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/KEY.c @@ -0,0 +1,140 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : KEY.c + * Author : WCH + * Version : V1.2 + * Date : 2022/01/18 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +/* Header file contains */ +#include "../../inc/HAL.h" + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +static uint8_t halKeySavedKeys; /* Keep the last state of the button to query whether there is a key value change */ + +/************************************************************************************************** + * FUNCTIONS - Local + **************************************************************************************************/ +static halKeyCBack_t pHalKeyProcessFunction; /* callback function */ + +/************************************************************************************************** + * @fn HAL_KeyInit + * + * @brief Initilize Key Service + * + * @param none + * + * @return None + **************************************************************************************************/ +void HAL_KeyInit(void) +{ + /* Initialize previous key to 0 */ + halKeySavedKeys = 0; + /* Initialize callback function */ + pHalKeyProcessFunction = NULL; + + RCC_APB2PeriphClockCmd(KEY1_PCENR, ENABLE); + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = KEY1_BV; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(KEY1_GPIO, &GPIO_InitStructure); +} + +/************************************************************************************************** + * @fn HalKeyConfig + * + * @brief Configure the Key serivce + * + * @param cback - pointer to the CallBack function + * + * @return None + **************************************************************************************************/ +void HalKeyConfig(halKeyCBack_t cback) +{ + /* Register the callback fucntion */ + pHalKeyProcessFunction = cback; + tmos_start_task(halTaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); /* Kick off polling */ +} + +/************************************************************************************************** + * @fn HalKeyRead + * + * @brief Read the current value of a key + * + * @param None + * + * @return keys - current keys status + **************************************************************************************************/ +uint8_t HalKeyRead(void) +{ + uint8_t keys = 0; + + if(HAL_PUSH_BUTTON1()) + { //Read button 1 + keys |= HAL_KEY_SW_1; + } + if(HAL_PUSH_BUTTON2()) + { //Read button 1 + keys |= HAL_KEY_SW_2; + } + if(HAL_PUSH_BUTTON3()) + { //Read button 1 + keys |= HAL_KEY_SW_3; + } + if(HAL_PUSH_BUTTON4()) + { //Read button 1 + keys |= HAL_KEY_SW_4; + } + return keys; +} + +/************************************************************************************************** + * @fn HAL_KeyPoll + * + * @brief Called by hal_driver to poll the keys + * + * @param None + * + * @return None + **************************************************************************************************/ +void HAL_KeyPoll(void) +{ + uint8_t keys = 0; + if(HAL_PUSH_BUTTON1()) + { + keys |= HAL_KEY_SW_1; + } + if(HAL_PUSH_BUTTON2()) + { + keys |= HAL_KEY_SW_2; + } + if(HAL_PUSH_BUTTON3()) + { + keys |= HAL_KEY_SW_3; + } + if(HAL_PUSH_BUTTON4()) + { + keys |= HAL_KEY_SW_4; + } + if(keys == halKeySavedKeys) + { /* Exit - since no keys have changed */ + return; + } + halKeySavedKeys = keys; /* Store the current keys for comparation next time */ + /* Invoke Callback if new keys were depressed */ + if(keys && (pHalKeyProcessFunction)) + { + (pHalKeyProcessFunction)(keys); + } +} + +/******************************** endfile @ key ******************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/LED.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/LED.c new file mode 100755 index 000000000..b73a79a32 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/LED.c @@ -0,0 +1,366 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : LED.c + * Author : WCH + * Version : V1.2 + * Date : 2022/01/18 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +/* Header file contains */ +#include "../../inc/HAL.h" + +/* LED control structure */ +typedef struct +{ + uint8_t mode; /* Operation mode */ + uint8_t todo; /* Blink cycles left */ + uint8_t onPct; /* On cycle percentage */ + uint16_t time; /* On/off cycle time (msec) */ + uint32_t next; /* Time for next change */ +} HalLedControl_t; + +typedef struct +{ + HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS]; + uint8_t sleepActive; +} HalLedStatus_t; + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ +static uint8_t HalLedState; // LED state at last set/clr/blink update + +static uint8_t preBlinkState; // Original State before going to blink mode + // bit 0, 1, 2, 3 represent led 0, 1, 2, 3 +static HalLedStatus_t HalLedStatusControl; + +/*************************************************************************************************** + * LOCAL FUNCTION + ***************************************************************************************************/ +void HalLedOnOff(uint8_t leds, uint8_t mode); + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/********************************************************************* + * @fn HAL_LedInit + * + * @brief Initialize LED Service + * + * @return none + */ +void HAL_LedInit(void) +{ + /* Initialize all LEDs to OFF */ + RCC_APB2PeriphClockCmd(LED1_PCENR, ENABLE); + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = LED1_BV; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(LED1_GPIO, &GPIO_InitStructure); + HalLedSet(HAL_LED_ALL, HAL_LED_MODE_OFF); + // just test + HalLedBlink(HAL_LED_1, 10, 30, 4000); + /* Initialize sleepActive to FALSE */ + HalLedStatusControl.sleepActive = FALSE; +} + +/********************************************************************* + * @fn HalLedSet + * + * @brief Turn ON/OFF/TOGGLE given LEDs + * + * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE + * @param mode - BLINK, FLASH, TOGGLE, ON, OFF + * + * @return 0 + */ +uint8_t HalLedSet(uint8_t leds, uint8_t mode) +{ + uint8_t led; + HalLedControl_t *sts; + + switch(mode) + { + case HAL_LED_MODE_BLINK: + { + /* Default blink, 1 time, D% duty cycle */ + HalLedBlink(leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME); + break; + } + + case HAL_LED_MODE_FLASH: + { + /* Default flash, N times, D% duty cycle */ + HalLedBlink(leds, HAL_LED_DEFAULT_FLASH_COUNT, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME); + break; + } + + case HAL_LED_MODE_ON: + case HAL_LED_MODE_OFF: + case HAL_LED_MODE_TOGGLE: + { + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + while(leds) + { + if(leds & led) + { + if(mode != HAL_LED_MODE_TOGGLE) + { + sts->mode = mode; /* ON or OFF */ + } + else + { + sts->mode ^= HAL_LED_MODE_ON; /* Toggle */ + } + HalLedOnOff(led, sts->mode); + leds ^= led; + } + led <<= 1; + sts++; + } + break; + } + + default: + break; + } + return (0); +} + +/********************************************************************* + * @fn HalLedBlink + * + * @brief Blink the leds + * + * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE + * @param numBlinks - number of blinks + * @param percent - the percentage in each period where the led will be on + * @param period - length of each cycle in milliseconds + * + * @return none + */ +void HalLedBlink(uint8_t leds, uint8_t numBlinks, uint8_t percent, uint16_t period) +{ + uint8_t led; + HalLedControl_t *sts; + + if(leds && percent && period) + { + if(percent < 100) + { + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + while(leds) + { + if(leds & led) + { + /* Store the current state of the led before going to blinking */ + preBlinkState |= (led & HalLedState); + sts->mode = HAL_LED_MODE_OFF; /* Stop previous blink */ + sts->time = period; /* Time for one on/off cycle */ + sts->onPct = percent; /* % of cycle LED is on */ + sts->todo = numBlinks; /* Number of blink cycles */ + if(!numBlinks) + { + sts->mode |= HAL_LED_MODE_FLASH; /* Continuous */ + } + sts->next = TMOS_GetSystemClock(); /* Start now */ + sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ + leds ^= led; + } + led <<= 1; + sts++; + } + tmos_start_task(halTaskID, LED_BLINK_EVENT, 0); + } + else + { + HalLedSet(leds, HAL_LED_MODE_ON); /* >= 100%, turn on */ + } + } + else + { + HalLedSet(leds, HAL_LED_MODE_OFF); /* No on time, turn off */ + } +} + +/********************************************************************* + * @fn HalLedUpdate + * + * @brief Update leds to work with blink + * + * @return none + */ +void HalLedUpdate(void) +{ + uint8_t led, pct, leds; + uint16_t next, wait; + uint32_t time; + HalLedControl_t *sts; + + next = 0; + led = HAL_LED_1; + leds = HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + /* Check if sleep is active or not */ + if(!HalLedStatusControl.sleepActive) + { + while(leds) + { + if(leds & led) + { + if(sts->mode & HAL_LED_MODE_BLINK) + { + time = TMOS_GetSystemClock(); + if(time >= sts->next) + { + if(sts->mode & HAL_LED_MODE_ON) + { + pct = 100 - sts->onPct; /* Percentage of cycle for off */ + sts->mode &= ~HAL_LED_MODE_ON; /* Say it's not on */ + HalLedOnOff(led, HAL_LED_MODE_OFF); /* Turn it off */ + if(!(sts->mode & HAL_LED_MODE_FLASH)) + { + if(sts->todo != 0xff) + { + sts->todo--; /* Not continuous, reduce count */ + } + if(!sts->todo) + { + sts->mode ^= HAL_LED_MODE_BLINK; /* No more blinks */ + } + } + } + else + { + pct = sts->onPct; /* Percentage of cycle for on */ + sts->mode |= HAL_LED_MODE_ON; /* Say it's on */ + HalLedOnOff(led, HAL_LED_MODE_ON); /* Turn it on */ + } + if(sts->mode & HAL_LED_MODE_BLINK) + { + wait = (((uint32_t)pct * (uint32_t)sts->time) / 100); + sts->next = time + wait; + } + else + { + /* no more blink, no more wait */ + wait = 0; + /* After blinking, set the LED back to the state before it blinks */ + HalLedSet(led, ((preBlinkState & led) != 0) ? HAL_LED_MODE_ON : HAL_LED_MODE_OFF); + /* Clear the saved bit */ + preBlinkState &= (led ^ 0xFF); + } + } + else + { + wait = sts->next - time; /* Time left */ + } + if(!next || (wait && (wait < next))) + { + next = wait; + } + } + leds ^= led; + } + led <<= 1; + sts++; + } + if(next) + { + tmos_start_task(halTaskID, LED_BLINK_EVENT, next); /* Schedule event */ + } + } +} + +/********************************************************************* + * @fn HalLedOnOff + * + * @brief Turns specified LED ON or OFF + * + * @param led - LED bit mask + * @param mode - LED_ON,LED_OFF, + * + * @return none + */ +void HalLedOnOff(uint8_t leds, uint8_t mode) +{ + if(leds & HAL_LED_1) + { + if(mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + } + if(leds & HAL_LED_2) + { + if(mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED2(); + } + else + { + HAL_TURN_OFF_LED2(); + } + } + if(leds & HAL_LED_3) + { + if(mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED3(); + } + else + { + HAL_TURN_OFF_LED3(); + } + } + if(leds & HAL_LED_4) + { + if(mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED4(); + } + else + { + HAL_TURN_OFF_LED4(); + } + } + /* Remember current state */ + if(mode) + { + HalLedState |= leds; + } + else + { + HalLedState &= (leds ^ 0xFF); + } +} + +/*************************************************************************************************** + * @fn HalGetLedState + * + * @brief Dim LED2 - Dim (set level) of LED2 + * + * @return led state + */ +uint8_t HalLedGetState() +{ + return HalLedState; +} + +/******************************** endfile @ led ******************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/MCU.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/MCU.c new file mode 100755 index 000000000..6a410569a --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/MCU.c @@ -0,0 +1,328 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : MCU.c + * Author : WCH + * Version : V1.2 + * Date : 2022/01/18 + * Description : HAL task processing function and BLE and hardware initialization + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +/* Header file contains */ +#include "../../inc/HAL.h" +#include "string.h" +#include "xs_base.h" + +tmosTaskID halTaskID; +uint32_t g_LLE_IRQLibHandlerLocation; + +/******************************************************************************* + * @fn Lib_Calibration_LSI + * + * @brief Internal 32K calibration + * + * @param None. + * + * @return None. + */ +void Lib_Calibration_LSI(void) +{ + Calibration_LSI(Level_64); +} + +#if(defined(BLE_SNV)) && (BLE_SNV == TRUE) +/******************************************************************************* + * @fn Lib_Read_Flash + * + * @brief Callback function used for BLE lib. + * + * @param addr. + * @param num. + * @param pBuf. + * + * @return None. + */ +uint32_t Lib_Read_Flash(uint32_t addr, uint32_t num, uint32_t *pBuf) +{ + tmos_memcpy(pBuf, (uint32_t*)addr, num*4); + return 0; +} + +/******************************************************************************* + * @fn Lib_Write_Flash + * + * @brief Callback function used for BLE lib. + * + * @param addr. + * @param num. + * @param pBuf. + * + * @return None. + */ +uint32_t Lib_Write_Flash(uint32_t addr, uint32_t num, uint32_t *pBuf) +{ + FLASH_Unlock_Fast(); + FLASH_ErasePage_Fast( addr ); + FLASH_ProgramPage_Fast( addr, pBuf); + FLASH_Lock_Fast(); + Delay_Us(1); + return 0; +} +#endif + +/******************************************************************************* + * @fn WCHBLE_Init + * + * @brief BLE library initialization + * + * @param None. + * + * @return None. + */ +void WCHBLE_Init(void) +{ + uint8_t i; + bleConfig_t cfg; + + g_LLE_IRQLibHandlerLocation = (uint32_t)LLE_IRQLibHandler; + + if(!tmos_memcmp(VER_LIB, VER_FILE, strlen(VER_FILE))) + { + PRINT("head file error...\n"); + while(1); + } + + // 32M crystal capacitance and current + OSC->HSE_CAL_CTRL &= ~(0x07<<28); + OSC->HSE_CAL_CTRL |= 0x03<<28; + OSC->HSE_CAL_CTRL |= 3<<24; + + tmos_memset(&cfg, 0, sizeof(bleConfig_t)); + cfg.MEMAddr = (uint32_t)MEM_BUF; + cfg.MEMLen = (uint32_t)BLE_MEMHEAP_SIZE; + cfg.BufMaxLen = (uint32_t)BLE_BUFF_MAX_LEN; + cfg.BufNumber = (uint32_t)BLE_BUFF_NUM; + cfg.TxNumEvent = (uint32_t)BLE_TX_NUM_EVENT; + cfg.TxPower = (uint32_t)BLE_TX_POWER; +#if(defined(BLE_SNV)) && (BLE_SNV == TRUE) + cfg.SNVAddr = (uint32_t)BLE_SNV_ADDR; + cfg.SNVNum = (uint32_t)BLE_SNV_NUM; + cfg.readFlashCB = Lib_Read_Flash; + cfg.writeFlashCB = Lib_Write_Flash; +#endif + cfg.ClockFrequency = CAB_LSIFQ/2; +#if(CLK_OSC32K==0) + cfg.ClockAccuracy = 50; +#else + cfg.ClockAccuracy = 1000; +#endif + cfg.ConnectNumber = (PERIPHERAL_MAX_CONNECTION & 3) | (CENTRAL_MAX_CONNECTION << 2); +#if(defined TEM_SAMPLE) && (TEM_SAMPLE == TRUE) + // Calibrate RF and internal RC according to temperature changes (greater than 7 degrees Celsius) + cfg.tsCB = HAL_GetInterTempValue; + #if(CLK_OSC32K) + cfg.rcCB = Lib_Calibration_LSI; // Internal 32K clock calibration + #endif +#endif +#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) + cfg.idleCB = BLE_LowPower; // Enable sleep +#endif +#if(defined(BLE_MAC)) && (BLE_MAC == TRUE) + for(i = 0; i < 6; i++) + { + cfg.MacAddr[i] = MacAddr[5 - i]; + } +#else + { + uint8_t MacAddr[6]; + FLASH_GetMACAddress(MacAddr); + for(i = 0; i < 6; i++) + { + cfg.MacAddr[i] = MacAddr[i]; // Use chip mac address + } + } +#endif + if(!cfg.MEMAddr || cfg.MEMLen < 4 * 1024) + { + while(1); + } + i = BLE_LibInit(&cfg); + if(i) + { + KPrintf("LIB init error code: %x ...\n", i); + while(1); + } + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE ); + NVIC_EnableIRQ( BB_IRQn ); + NVIC_EnableIRQ( LLE_IRQn ); + KPrintf("WCHBLE_LibInit Success\n"); +} + +/******************************************************************************* + * @fn HAL_ProcessEvent + * + * @brief HAL processing + * + * @param task_id - The TMOS assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events. + */ +tmosEvents HAL_ProcessEvent(tmosTaskID task_id, tmosEvents events) +{ + uint8_t *msgPtr; + + if(events & SYS_EVENT_MSG) + { + /** + * Process the HAL layer message, call tmos_msg_receive to read the message, + * and delete the message after processing. + */ + msgPtr = tmos_msg_receive(task_id); + if(msgPtr) + { + /* De-allocate */ + tmos_msg_deallocate(msgPtr); + } + return events ^ SYS_EVENT_MSG; + } + if(events & LED_BLINK_EVENT) + { +#if(defined HAL_LED) && (HAL_LED == TRUE) + HalLedUpdate(); +#endif // HAL_LED + return events ^ LED_BLINK_EVENT; + } + if(events & HAL_KEY_EVENT) + { +#if(defined HAL_KEY) && (HAL_KEY == TRUE) + HAL_KeyPoll(); /* Check for keys */ + tmos_start_task(halTaskID, HAL_KEY_EVENT, MS1_TO_SYSTEM_TIME(100)); + return events ^ HAL_KEY_EVENT; +#endif + } + if(events & HAL_REG_INIT_EVENT) + { +#if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE) // Calibration tasks, a single time is less than 10ms + BLE_RegInit(); // Calibrate RF +#if(CLK_OSC32K) + Lib_Calibration_LSI(); // Calibrate internal RC +#endif + tmos_start_task(halTaskID, HAL_REG_INIT_EVENT, MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD)); + return events ^ HAL_REG_INIT_EVENT; +#endif + } + if(events & HAL_TEST_EVENT) + { + PRINT("* \n"); + tmos_start_task(halTaskID, HAL_TEST_EVENT, MS1_TO_SYSTEM_TIME(1000)); + return events ^ HAL_TEST_EVENT; + } + return 0; +} + +/******************************************************************************* + * @fn HAL_Init + * + * @brief 硬件初始化 + * + * @param None. + * + * @return None. + */ +void HAL_Init() +{ + halTaskID = TMOS_ProcessEventRegister(HAL_ProcessEvent); + HAL_TimeInit(); +#if(defined HAL_SLEEP) && (HAL_SLEEP == TRUE) + HAL_SleepInit(); +#endif +#if(defined HAL_LED) && (HAL_LED == TRUE) + HAL_LedInit(); +#endif +#if(defined HAL_KEY) && (HAL_KEY == TRUE) + HAL_KeyInit(); +#endif +#if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE) + // Add a calibration task, and a single calibration takes less than 10ms + tmos_start_task(halTaskID, HAL_REG_INIT_EVENT, MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD)); +#endif +// tmos_start_task(halTaskID, HAL_TEST_EVENT, MS1_TO_SYSTEM_TIME(1000)); // Add a test task +} + +/******************************************************************************* + * @fn HAL_GetInterTempValue + * + * @brief Get the internal temperature sampling value, if the ADC interrupt sampling is used, + * it is necessary to temporarily shield the interrupt in this function. + * + * @return Internal temperature sampling value. + */ +uint16_t HAL_GetInterTempValue(void) +{ + uint32_t rcc_apb2pcenr, rcc_cfgr0, adc1_ctrl1, adc1_ctrl2, adc1_rsqr1, adc1_rsqr2, adc1_rsqr3, adc1_samptr1, adc1_samptr2; + uint32_t adc1_iofr1, adc1_iofr2, adc1_iofr3, adc1_iofr4, adc1_wdhtr, adc1_wdltr, adc1_isqr; + ADC_InitTypeDef ADC_InitStructure = {0}; + uint16_t adc_data; + + rcc_apb2pcenr = RCC->APB2PCENR; + rcc_cfgr0 = RCC->CFGR0; + adc1_ctrl1 = ADC1->CTLR1; + adc1_ctrl2 = ADC1->CTLR2; + adc1_rsqr1 = ADC1->RSQR1; + adc1_rsqr2 = ADC1->RSQR2; + adc1_rsqr3 = ADC1->RSQR3; + adc1_samptr1 = ADC1->SAMPTR1; + adc1_samptr2 = ADC1->SAMPTR2; + adc1_iofr1 = ADC1->IOFR1; + adc1_iofr2 = ADC1->IOFR2; + adc1_iofr3 = ADC1->IOFR3; + adc1_iofr4 = ADC1->IOFR4; + adc1_wdhtr = ADC1->WDHTR; + adc1_wdltr = ADC1->WDLTR; + adc1_isqr = ADC1->ISQR; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); + RCC_ADCCLKConfig(RCC_PCLK2_Div8); + ADC_DeInit(ADC1); + ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; + ADC_InitStructure.ADC_ScanConvMode = DISABLE; + ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; + ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; + ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; + ADC_InitStructure.ADC_NbrOfChannel = 1; + ADC_Init(ADC1, &ADC_InitStructure); + + ADC_Cmd(ADC1, ENABLE); + ADC_BufferCmd(ADC1, ENABLE); //enable buffer + ADC_TempSensorVrefintCmd(ENABLE); + ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_239Cycles5); + ADC_SoftwareStartConvCmd(ADC1, ENABLE); + while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); + adc_data = ADC_GetConversionValue(ADC1); + + ADC_DeInit(ADC1); + RCC->APB2PCENR = rcc_apb2pcenr; + RCC->CFGR0 = rcc_cfgr0; + ADC1->CTLR1 = adc1_ctrl1; + ADC1->CTLR2 = adc1_ctrl2; + ADC1->RSQR1 = adc1_rsqr1; + ADC1->RSQR2 = adc1_rsqr2; + ADC1->RSQR3 = adc1_rsqr3; + ADC1->SAMPTR1 = adc1_samptr1; + ADC1->SAMPTR2 = adc1_samptr2; + ADC1->IOFR1 = adc1_iofr1; + ADC1->IOFR2 = adc1_iofr2; + ADC1->IOFR3 = adc1_iofr3; + ADC1->IOFR4 = adc1_iofr4; + ADC1->WDHTR = adc1_wdhtr; + ADC1->WDLTR = adc1_wdltr; + ADC1->ISQR = adc1_isqr; + return (adc_data); +} + +/******************************** endfile @ mcu ******************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/Makefile new file mode 100644 index 000000000..64474ec5c --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/Makefile @@ -0,0 +1,2 @@ +SRC_FILES := KEY.c LED.c MCU.c RTC.c SLEEP.c +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/RTC.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/RTC.c new file mode 100755 index 000000000..ea694df50 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/RTC.c @@ -0,0 +1,113 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : RTC.c + * Author : WCH + * Version : V1.2 + * Date : 2022/01/18 + * Description : RTC configuration and its initialization + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +/* Header file contains */ +#include "../../inc/HAL.h" + +/********************************************************************* + * CONSTANTS + */ +#define RTC_INIT_TIME_HOUR 0 +#define RTC_INIT_TIME_MINUTE 0 +#define RTC_INIT_TIME_SECEND 0 + +/*************************************************** + * Global variables + */ +volatile uint32_t RTCTigFlag; + +/******************************************************************************* + * @fn RTC_SetTignTime + * + * @brief Configure RTC trigger time + * + * @param time - Trigger time. + * + * @return None. + */ +void RTC_SetTignTime(uint32_t time) +{ + RTC_WaitForLastTask(); + RTC_SetAlarm(time); + RTC_WaitForLastTask(); + RTCTigFlag = 0; +} + +/******************************************************************************* + * @fn HAL_Time0Init + * + * @brief System timer initialization + * + * @param None. + * + * @return None. + */ +void HAL_TimeInit(void) +{ + uint16_t temp=0; + uint8_t state=0; + bleClockConfig_t conf={0}; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE); + PWR_BackupAccessCmd(ENABLE); +#if( CLK_OSC32K ) + RCC_LSICmd(ENABLE); + RCC_LSEConfig(RCC_LSE_OFF); + RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); +#else + RCC_LSEConfig(RCC_LSE_ON); + /* Check the specified RCC logo position settings or not, + * wait for the low-speed crystal oscillator to be ready */ + while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) + { + temp++; + Delay_Ms(10); + } + if(temp>=250) + { + printf("time error..\n"); + } + RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); +#endif + RCC_RTCCLKCmd(ENABLE); + RTC_WaitForLastTask(); + RTC_WaitForLastTask(); + RTC_SetPrescaler(1); + RTC_WaitForLastTask(); + RTC_SetCounter(0); + RTC_WaitForLastTask(); +#if( CLK_OSC32K ) + Lib_Calibration_LSI(); +#endif + conf.ClockAccuracy = CLK_OSC32K?1000:100; + conf.ClockFrequency = CAB_LSIFQ/2; + conf.ClockMaxCount = 0xFFFFFFFF; + conf.getClockValue = RTC_GetCounter; + state = TMOS_TimerInit( &conf ); + if(state) + { + PRINT("TMOS_TimerInit err %x\n",state); + } +} + + +__attribute__((interrupt())) +void RTCAlarm_IRQHandler(void) +{ + RTCTigFlag = 1; + EXTI_ClearITPendingBit(EXTI_Line17); + RTC_ClearITPendingBit(RTC_IT_ALR); + RTC_WaitForLastTask(); +} + +/******************************** endfile @ time ******************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/SLEEP.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/SLEEP.c new file mode 100755 index 000000000..366a27578 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/HAL/SLEEP.c @@ -0,0 +1,109 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : SLEEP.c + * Author : WCH + * Version : V1.2 + * Date : 2022/01/18 + * Description : Sleep configuration and its initialization + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +/* Header file contains */ +#include "../../inc/HAL.h" +#include "xs_base.h" + +#define US_TO_TICK(us) (uint32_t)((us) / (1000000 / ((CAB_LSIFQ / 2)))) + +#define SLEEP_PERIOD_MIN_US 200 +#define SLEEP_PERIOD_MAX_TICK 0xFFD2393F +#define SLEEP_PERIOD_MIN_TICK US_TO_TICK(SLEEP_PERIOD_MIN_US) +#define HESREADY_TICK US_TO_TICK(WAKE_UP_MAX_TIME_US) + +/******************************************************************************* + * @fn BLE_LowPower + * + * @brief ˯ + * + * @param time - ѵʱ㣨RTCֵ + * + * @return state. + */ +uint32_t BLE_LowPower(uint32_t time) +{ + KPrintf("%s %d\n", __FUNCTION__, __LINE__); +#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) + uint32_t current_time; + uint32_t sleep_period; + uint32_t wake_time; + + wake_time = time - HESREADY_TICK; + + __disable_irq(); + current_time = RTC_GetCounter(); + sleep_period = wake_time - current_time; + + if((sleep_period < SLEEP_PERIOD_MIN_TICK) || (sleep_period > SLEEP_PERIOD_MAX_TICK)) + { + __enable_irq(); + return 2; + } + + RTC_SetTignTime(wake_time); + __enable_irq(); + +#if(DEBUG == DEBUG_UART1) // To use other serial ports to output printing information, you need to modify this line of code + while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) + { + __NOP(); + } +#endif + // LOW POWER-sleep + if(!RTCTigFlag) + { + PWR_EnterSTOPMode_RAM_LV(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); + SystemInit(); + } + else + { + return 3; + } + +#endif + return 0; +} + +/******************************************************************************* + * @fn HAL_SleepInit + * + * @brief Configure sleep Wake-up source - RTC wake up, trigger mode + * + * @param None. + * + * @return None. + */ +void HAL_SleepInit(void) +{ +#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) + RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); + RTC_WaitForLastTask(); + + RTC_ITConfig(RTC_IT_ALR, ENABLE); + EXTI_InitTypeDef EXTI_InitStructure = {0}; + NVIC_InitTypeDef NVIC_InitStructure = {0}; + + EXTI_InitStructure.EXTI_Line = EXTI_Line17; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +#endif +} diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/Makefile new file mode 100644 index 000000000..1d6629d68 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := app_drv_fifo.c app_uart.c ble_uart_service.c +SRC_DIR := HAL +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/app_drv_fifo.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/app_drv_fifo.c new file mode 100755 index 000000000..31d0a997e --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/app_drv_fifo.c @@ -0,0 +1,191 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : app_drv_fifo.c + * Author : WCH + * Version : V1.1 + * Date : 2022/01/19 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +#include "../inc/app_drv_fifo.h" + +static __inline uint16_t fifo_length(app_drv_fifo_t *fifo) +{ + uint16_t tmp = fifo->begin; + return fifo->end - tmp; +} + +uint16_t app_drv_fifo_length(app_drv_fifo_t *fifo) +{ + return fifo_length(fifo); +} + +app_drv_fifo_result_t +app_drv_fifo_init(app_drv_fifo_t *fifo, uint8_t *buffer, uint16_t buffer_size) +{ + if(buffer_size == 0) + { + return APP_DRV_FIFO_RESULT_LENGTH_ERROR; + } + if(0 != ((buffer_size) & (buffer_size - 1))) + { + return APP_DRV_FIFO_RESULT_LENGTH_ERROR; + } + fifo->begin = 0; + fifo->end = 0; + fifo->data = buffer; + fifo->size = buffer_size; + fifo->size_mask = buffer_size - 1; + return APP_DRV_FIFO_RESULT_SUCCESS; +} + +void app_drv_fifo_push(app_drv_fifo_t *fifo, uint8_t data) +{ + fifo->data[fifo->end & fifo->size_mask] = data; + fifo->end++; +} + +uint8_t app_drv_fifo_pop(app_drv_fifo_t *fifo) +{ + uint8_t data = fifo->data[fifo->begin & fifo->size_mask]; + fifo->begin++; + return data; +} + +void app_drv_fifo_flush(app_drv_fifo_t *fifo) +{ + fifo->begin = 0; + fifo->end = 0; +} + +bool app_drv_fifo_is_empty(app_drv_fifo_t *fifo) +{ + return (fifo->begin == fifo->end); +} + +bool app_drv_fifo_is_full(app_drv_fifo_t *fifo) +{ + return (fifo_length(fifo) == fifo->size); +} + +app_drv_fifo_result_t +app_drv_fifo_write(app_drv_fifo_t *fifo, uint8_t *data, uint16_t *p_write_length) +{ + if(fifo == NULL) + { + return APP_DRV_FIFO_RESULT_NULL; + } + if(p_write_length == NULL) + { + return APP_DRV_FIFO_RESULT_NULL; + } + //PRINT("fifo_length = %d\r\n",fifo_length(fifo)); + const uint16_t available_count = fifo->size - fifo_length(fifo); + const uint16_t requested_len = (*p_write_length); + uint16_t index = 0; + uint16_t write_size = MIN(requested_len, available_count); + //PRINT("available_count %d\r\n",available_count); + // Check if the FIFO is FULL. + if(available_count == 0) + { + return APP_DRV_FIFO_RESULT_NOT_MEM; + } + + // Check if application has requested only the size. + if(data == NULL) + { + return APP_DRV_FIFO_RESULT_SUCCESS; + } + + for(index = 0; index < write_size; index++) + { + //push + fifo->data[fifo->end & fifo->size_mask] = data[index]; + fifo->end++; + } + (*p_write_length) = write_size; + return APP_DRV_FIFO_RESULT_SUCCESS; +} + +app_drv_fifo_result_t +app_drv_fifo_write_from_same_addr(app_drv_fifo_t *fifo, uint8_t *data, uint16_t write_length) +{ + if(fifo == NULL) + { + return APP_DRV_FIFO_RESULT_NULL; + } + const uint16_t available_count = fifo->size_mask - fifo_length(fifo) + 1; + const uint16_t requested_len = (write_length); + uint16_t index = 0; + uint16_t write_size = MIN(requested_len, available_count); + + // Check if the FIFO is FULL. + if(available_count == 0) + { + return APP_DRV_FIFO_RESULT_NOT_MEM; + } + + for(index = 0; index < write_size; index++) + { + //push + fifo->data[fifo->end & fifo->size_mask] = data[0]; + fifo->end++; + } + return APP_DRV_FIFO_RESULT_SUCCESS; +} + +app_drv_fifo_result_t +app_drv_fifo_read(app_drv_fifo_t *fifo, uint8_t *data, uint16_t *p_read_length) +{ + if(fifo == NULL) + { + return APP_DRV_FIFO_RESULT_NULL; + } + if(p_read_length == NULL) + { + return APP_DRV_FIFO_RESULT_NULL; + } + const uint16_t byte_count = fifo_length(fifo); + const uint16_t requested_len = (*p_read_length); + uint32_t index = 0; + uint32_t read_size = MIN(requested_len, byte_count); + + if(byte_count == 0) + { + return APP_DRV_FIFO_RESULT_NOT_FOUND; + } + //PRINT("read size = %d,byte_count = %d\r\n",read_size,byte_count); + for(index = 0; index < read_size; index++) + { + //pop + data[index] = fifo->data[fifo->begin & fifo->size_mask]; + fifo->begin++; + } + + (*p_read_length) = read_size; + return APP_DRV_FIFO_RESULT_SUCCESS; +} + +app_drv_fifo_result_t +app_drv_fifo_read_to_same_addr(app_drv_fifo_t *fifo, uint8_t *data, uint16_t read_length) +{ + if(fifo == NULL) + { + return APP_DRV_FIFO_RESULT_NULL; + } + const uint16_t byte_count = fifo_length(fifo); + const uint16_t requested_len = (read_length); + uint32_t index = 0; + uint32_t read_size = MIN(requested_len, byte_count); + + for(index = 0; index < read_size; index++) + { + //pop + data[0] = fifo->data[fifo->begin & fifo->size_mask]; + fifo->begin++; + } + return APP_DRV_FIFO_RESULT_SUCCESS; +} diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/app_uart.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/app_uart.c new file mode 100755 index 000000000..461c52bc5 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/app_uart.c @@ -0,0 +1,240 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : peripheral.C + * Author : WCH + * Version : v1.0 + * Date : 2020/11/26 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "../inc/config.h" +#include "../Profile/devinfoservice.h" +#include "../Profile/gattprofile.h" +#include "../inc/peripheral.h" +#include "../inc/app_uart.h" +#include "xs_base.h" + +/********************************************************************* + * MACROS + */ +//The buffer length should be a power of 2 +#define APP_UART_TX_BUFFER_LENGTH 512U +#define APP_UART_RX_BUFFER_LENGTH 2048U + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +uint8_t to_test_buffer[BLE_BUFF_MAX_LEN - 4 - 3]; + +app_drv_fifo_t app_uart_tx_fifo; +app_drv_fifo_t app_uart_rx_fifo; + +//interupt uart rx flag ,clear at main loop +bool uart_rx_flag = false; + +//for interrupt rx blcak hole ,when uart rx fifo full +uint8_t for_uart_rx_black_hole = 0; + +//fifo length less that MTU-3, retry times +uint32_t uart_to_ble_send_evt_cnt = 0; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// + +//The tx buffer and rx buffer for app_drv_fifo +//length should be a power of 2 +static uint8_t app_uart_tx_buffer[APP_UART_TX_BUFFER_LENGTH] = {0}; +static uint8_t app_uart_rx_buffer[APP_UART_RX_BUFFER_LENGTH] = {0}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * PROFILE CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn app_uart_process + * + * @brief process uart data + * + * @return NULL + */ +void app_uart_process(void) +{ + uint8_t data; + __disable_irq(); + if(uart_rx_flag) + { + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2); + uart_rx_flag = false; + } + __enable_irq(); + + while(app_drv_fifo_length(&app_uart_tx_fifo)) + { + app_drv_fifo_read_to_same_addr(&app_uart_tx_fifo, (uint8_t *)&data, 1); + // USART_SendData(USART, data); + KPrintf("%c", data); + while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) /* waiting for sending finish */ + { + } + } +} +/********************************************************************* + * @fn app_uart_init + * + * @brief init uart + * + * @return NULL + */ +void app_uart_init() +{ + //tx fifo and tx fifo + //The buffer length should be a power of 2 + app_drv_fifo_init(&app_uart_tx_fifo, app_uart_tx_buffer, APP_UART_TX_BUFFER_LENGTH); + app_drv_fifo_init(&app_uart_rx_fifo, app_uart_rx_buffer, APP_UART_RX_BUFFER_LENGTH); + + GPIO_InitTypeDef GPIO_InitStructure = {0}; + USART_InitTypeDef USART_InitStructure = {0}; + NVIC_InitTypeDef NVIC_InitStructure = {0}; + + //uart3 init + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + + /* USART3 TX-->B.10 RX-->B.11 */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + USART_InitStructure.USART_BaudRate = 115200; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; + + USART_Init(USART3, &USART_InitStructure); + USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); + + NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + USART_Cmd(USART3, ENABLE); +} + +/********************************************************************* + * @fn app_uart_tx_data + * + * @brief app_uart_tx_data + * + * @return NULL + */ +void app_uart_tx_data(uint8_t *data, uint16_t length) +{ + uint16_t write_length = length; + app_drv_fifo_write(&app_uart_tx_fifo, data, &write_length); +} + +/********************************************************************* + * @fn UART3_IRQHandler + * + * @brief Not every uart reception will end with a UART_II_RECV_TOUT + * UART_II_RECV_TOUT can only be triggered when R8_UARTx_RFC is not 0 + * Here we cannot rely UART_II_RECV_TOUT as the end of a uart reception + * + * @return NULL + */ +__attribute__((interrupt())) +void USART3_IRQHandler(void) +{ + uint16_t error; + uint8_t data; + if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) + { + data = USART_ReceiveData(USART3); + error = app_drv_fifo_write_from_same_addr(&app_uart_rx_fifo, (uint8_t *)&data, 1); + if(error != APP_DRV_FIFO_RESULT_SUCCESS) + { + KPrintf("APP_DRV_FIFO_RESULT_NOT_MEM\r\n"); + } + uart_rx_flag = true; + } +} + +/********************************************************************* + * @fn on_bleuartServiceEvTMOS_SystemProcesst + * + * @brief ble uart service callback handler + * + * @return NULL + */ +void on_bleuartServiceEvt(uint16_t connection_handle, ble_uart_evt_t *p_evt) +{ + switch(p_evt->type) + { + case BLE_UART_EVT_TX_NOTI_DISABLED: + KPrintf("%02x:bleuart_EVT_TX_NOTI_DISABLED\r\n", connection_handle); + break; + case BLE_UART_EVT_TX_NOTI_ENABLED: + KPrintf("%02x:bleuart_EVT_TX_NOTI_ENABLED\r\n", connection_handle); + break; + case BLE_UART_EVT_BLE_DATA_RECIEVED: + KPrintf("BLE RX DATA len:%d\r\n", p_evt->data.length); + + //for notify back test + //to ble + uint16_t to_write_length = p_evt->data.length; + app_drv_fifo_write(&app_uart_rx_fifo, (uint8_t *)p_evt->data.p_data, &to_write_length); + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2); + //end of nofify back test + + //ble to uart + app_uart_tx_data((uint8_t *)p_evt->data.p_data, p_evt->data.length); + + break; + default: + break; + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/ble_uart_service.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/ble_uart_service.c new file mode 100755 index 000000000..04c0c83e4 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/src/ble_uart_service.c @@ -0,0 +1,379 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ble_uart_service.c + * Author : WCH + * Version : V1.1 + * Date : 2022/01/19 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "../inc/config.h" +#include "../Profile/gattprofile.h" +#include "stdint.h" +#include "../inc/ble_uart_service.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +#define SERVAPP_NUM_ATTR_SUPPORTED 7 + +#define RAWPASS_TX_VALUE_HANDLE 4 +#define RAWPASS_RX_VALUE_HANDLE 2 +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +////ble_uart GATT Profile Service UUID +//const uint8_t ble_uart_ServiceUUID[ATT_UUID_SIZE] = +//{0x55, 0xe4,0x05,0xd2,0xaf,0x9f,0xa9,0x8f,0xe5,0x4a,0x7d,0xfe,0x43,0x53,0x53,0x49}; + +//// Characteristic rx uuid +//const uint8_t ble_uart_RxCharUUID[ATT_UUID_SIZE] = +//{0xb3,0x9b,0x72,0x34,0xbe,0xec, 0xd4,0xa8,0xf4,0x43,0x41,0x88,0x43,0x53,0x53,0x49}; + +//// Characteristic tx uuid +//const uint8_t ble_uart_TxCharUUID[ATT_UUID_SIZE] = +//{0x16,0x96,0x24,0x47,0xc6,0x23, 0x61,0xba,0xd9,0x4b,0x4d,0x1e,0x43,0x53,0x53,0x49}; + +// ble_uart GATT Profile Service UUID +const uint8_t ble_uart_ServiceUUID[ATT_UUID_SIZE] = + {0x9F, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E}; + +// Characteristic rx uuid +const uint8_t ble_uart_RxCharUUID[ATT_UUID_SIZE] = + {0x9F, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E}; + +// Characteristic tx uuid +const uint8_t ble_uart_TxCharUUID[ATT_UUID_SIZE] = + {0x9F, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static ble_uart_ProfileChangeCB_t ble_uart_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Profile Service attribute +static const gattAttrType_t ble_uart_Service = {ATT_UUID_SIZE, ble_uart_ServiceUUID}; + +// Profile Characteristic 1 Properties +//static uint8_t ble_uart_RxCharProps = GATT_PROP_WRITE_NO_RSP| GATT_PROP_WRITE; +static uint8_t ble_uart_RxCharProps = GATT_PROP_WRITE_NO_RSP; + +// Characteristic 1 Value +static uint8_t ble_uart_RxCharValue[BLE_UART_RX_BUFF_SIZE]; +//static uint8_t ble_uart_RxCharValue[1]; + +// Profile Characteristic 2 Properties +//static uint8_t ble_uart_TxCharProps = GATT_PROP_NOTIFY| GATT_PROP_INDICATE; +static uint8_t ble_uart_TxCharProps = GATT_PROP_NOTIFY; + +// Characteristic 2 Value +static uint8_t ble_uart_TxCharValue = 0; + +// Simple Profile Characteristic 2 User Description +static gattCharCfg_t ble_uart_TxCCCD[4]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t ble_uart_ProfileAttrTbl[] = { + // Simple Profile Service + { + {ATT_BT_UUID_SIZE, primaryServiceUUID}, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8_t *)&ble_uart_Service /* pValue */ + }, + + // Characteristic 1 Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &ble_uart_RxCharProps}, + + // Characteristic Value 1 + { + {ATT_UUID_SIZE, ble_uart_RxCharUUID}, + GATT_PERMIT_WRITE, + 0, + &ble_uart_RxCharValue[0]}, + + // Characteristic 2 Declaration + { + {ATT_BT_UUID_SIZE, characterUUID}, + GATT_PERMIT_READ, + 0, + &ble_uart_TxCharProps}, + + // Characteristic Value 2 + { + {ATT_UUID_SIZE, ble_uart_TxCharUUID}, + 0, + 0, + (uint8_t *)&ble_uart_TxCharValue}, + + // Characteristic 2 User Description + { + {ATT_BT_UUID_SIZE, clientCharCfgUUID}, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8_t *)ble_uart_TxCCCD}, + +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static bStatus_t ble_uart_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method); +static bStatus_t ble_uart_WriteAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t len, uint16_t offset, uint8_t method); + +static void ble_uart_HandleConnStatusCB(uint16_t connHandle, uint8_t changeType); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +gattServiceCBs_t ble_uart_ProfileCBs = { + ble_uart_ReadAttrCB, // Read callback function pointer + ble_uart_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn ble_uart_AddService + * + * @brief Initializes the Simple Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t ble_uart_add_service(ble_uart_ProfileChangeCB_t cb) +{ + uint8_t status = SUCCESS; + + GATTServApp_InitCharCfg(INVALID_CONNHANDLE, ble_uart_TxCCCD); + // Register with Link DB to receive link status change callback + linkDB_Register(ble_uart_HandleConnStatusCB); + + // ble_uart_TxCCCD.connHandle = INVALID_CONNHANDLE; + // ble_uart_TxCCCD.value = 0; + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService(ble_uart_ProfileAttrTbl, + GATT_NUM_ATTRS(ble_uart_ProfileAttrTbl), + GATT_MAX_ENCRYPT_KEY_SIZE, + &ble_uart_ProfileCBs); + if(status != SUCCESS) + PRINT("Add ble uart service failed!\n"); + ble_uart_AppCBs = cb; + + return (status); +} + +/********************************************************************* + * @fn ble_uart_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static bStatus_t ble_uart_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method) +{ + bStatus_t status = SUCCESS; + PRINT("ReadAttrCB\n"); + // Make sure it's not a blob operation (no attributes in the profile are long) + if(pAttr->type.len == ATT_BT_UUID_SIZE) + { + // 16-bit UUID + uint16_t uuid = BUILD_UINT16(pAttr->type.uuid[0], pAttr->type.uuid[1]); + if(uuid == GATT_CLIENT_CHAR_CFG_UUID) + { + *pLen = 2; + tmos_memcpy(pValue, pAttr->pValue, 2); + } + } + else + { + if(tmos_memcmp(pAttr->type.uuid, ble_uart_TxCharUUID, 16)) + { + *pLen = 1; + pValue[0] = '1'; + } + else if(tmos_memcmp(pAttr->type.uuid, ble_uart_RxCharUUID, 16)) + { + PRINT("read tx char\n"); + } + } + + return (status); +} + +/********************************************************************* + * @fn simpleProfile_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ + +static bStatus_t ble_uart_WriteAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t len, uint16_t offset, uint8_t method) +{ + bStatus_t status = SUCCESS; + //uint8_t notifyApp = 0xFF; + // If attribute permissions require authorization to write, return error + if(gattPermitAuthorWrite(pAttr->permissions)) + { + // Insufficient authorization + return (ATT_ERR_INSUFFICIENT_AUTHOR); + } + + if(pAttr->type.len == ATT_BT_UUID_SIZE) + { + // 16-bit UUID + uint16_t uuid = BUILD_UINT16(pAttr->type.uuid[0], pAttr->type.uuid[1]); + if(uuid == GATT_CLIENT_CHAR_CFG_UUID) + { + status = GATTServApp_ProcessCCCWriteReq(connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY); + if(status == SUCCESS && ble_uart_AppCBs) + { + uint16_t charCfg = BUILD_UINT16(pValue[0], pValue[1]); + ble_uart_evt_t evt; + + //PRINT("CCCD set: [%d]\n", charCfg); + evt.type = (charCfg == GATT_CFG_NO_OPERATION) ? BLE_UART_EVT_TX_NOTI_DISABLED : BLE_UART_EVT_TX_NOTI_ENABLED; + ble_uart_AppCBs(connHandle, &evt); + } + } + } + else + { + // 128-bit UUID + if(pAttr->handle == ble_uart_ProfileAttrTbl[RAWPASS_RX_VALUE_HANDLE].handle) + { + if(ble_uart_AppCBs) + { + ble_uart_evt_t evt; + evt.type = BLE_UART_EVT_BLE_DATA_RECIEVED; + evt.data.length = (uint16_t)len; + evt.data.p_data = pValue; + ble_uart_AppCBs(connHandle, &evt); + } + } + } + return (status); +} + +/********************************************************************* + * @fn simpleProfile_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void ble_uart_HandleConnStatusCB(uint16_t connHandle, uint8_t changeType) +{ + // Make sure this is not loopback connection + if(connHandle != LOOPBACK_CONNHANDLE) + { + // Reset Client Char Config if connection has dropped + if((changeType == LINKDB_STATUS_UPDATE_REMOVED) || + ((changeType == LINKDB_STATUS_UPDATE_STATEFLAGS) && + (!linkDB_Up(connHandle)))) + { + //ble_uart_TxCCCD[0].value = 0; + GATTServApp_InitCharCfg(connHandle, ble_uart_TxCCCD); + //PRINT("clear client configuration\n"); + } + } +} + +uint8_t ble_uart_notify_is_ready(uint16_t connHandle) +{ + return (GATT_CLIENT_CFG_NOTIFY == GATTServApp_ReadCharCfg(connHandle, ble_uart_TxCCCD)); +} +/********************************************************************* + * @fn BloodPressure_IMeasNotify + * + * @brief Send a notification containing a bloodPressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t ble_uart_notify(uint16_t connHandle, attHandleValueNoti_t *pNoti, uint8_t taskId) +{ + //uint16_t value = ble_uart_TxCCCD[0].value; + uint16_t value = GATTServApp_ReadCharCfg(connHandle, ble_uart_TxCCCD); + // If notifications enabled + if(value & GATT_CLIENT_CFG_NOTIFY) + { + // Set the handle + pNoti->handle = ble_uart_ProfileAttrTbl[RAWPASS_TX_VALUE_HANDLE].handle; + + // Send the Indication + return GATT_Notification(connHandle, pNoti, FALSE); + } + return bleIncorrectMode; +} + +/********************************************************************* +*********************************************************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/Makefile new file mode 100644 index 000000000..c07c5343d --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := peripheral_main.c peripheral.c + +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/peripheral.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/peripheral.c new file mode 100755 index 000000000..fea17b6d2 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/peripheral.c @@ -0,0 +1,651 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : peripheral.C + * Author : WCH + * Version : v1.0 + * Date : 2020/11/26 + * Description : + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "../inc/config.h" +#include "../Profile/devinfoservice.h" +#include "../Profile/gattprofile.h" +#include "../inc/peripheral.h" +#include "../inc/ble_uart_service.h" +#include "../inc/app_drv_fifo.h" +#include "../inc/app_uart.h" +#include "xs_base.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// How often to perform periodic event +#define SBP_PERIODIC_EVT_PERIOD 1600 + +// How often to perform read rssi event +#define SBP_READ_RSSI_EVT_PERIOD 3200 + +// Parameter update delay +#define SBP_PARAM_UPDATE_DELAY 6400 + +// What is the advertising interval when device is discoverable (units of 625us, 80=50ms) +#define DEFAULT_ADVERTISING_INTERVAL 160 + +// Limited discoverable mode advertises for 30.72s, and then stops +// General discoverable mode advertises indefinitely +#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL + +// Minimum connection interval (units of 1.25ms, 10=12.5ms) +#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 8 + +// Maximum connection interval (units of 1.25ms, 100=125ms) +#define DEFAULT_DESIRED_MAX_CONN_INTERVAL 20 + +// Slave latency to use parameter update +#define DEFAULT_DESIRED_SLAVE_LATENCY 0 + +// Supervision timeout value (units of 10ms, 100=1s) +#define DEFAULT_DESIRED_CONN_TIMEOUT 100 + +// Company Identifier: WCH +#define WCH_COMPANY_ID 0x07D7 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +uint8_t Peripheral_TaskID = INVALID_TASK_ID; // Task ID for internal task/event processing + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +//for send to ble +typedef enum +{ + SEND_TO_BLE_TO_SEND = 1, + SEND_TO_BLE_ALLOC_FAILED, + SEND_TO_BLE_SEND_FAILED, +} send_to_ble_state_t; +send_to_ble_state_t send_to_ble_state = SEND_TO_BLE_TO_SEND; + +blePaControlConfig_t pa_lna_ctl; + +//static uint8_t Peripheral_TaskID = INVALID_TASK_ID; // Task ID for internal task/event processing + +// GAP - SCAN RSP data (max size = 31 bytes) +static uint8_t scanRspData[] = { + // complete name + 13, // length of this data + GAP_ADTYPE_LOCAL_NAME_COMPLETE, + 'w', 'c', 'h', '_', 'b', 'l', 'e', '_', 'u', 'a', 'r', 't', + // connection interval range + 0x05, // length of this data + GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE, + LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), // 100ms + HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), + LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), // 1s + HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), + + // Tx power level + 0x02, // length of this data + GAP_ADTYPE_POWER_LEVEL, + 0 // 0dBm +}; + +// GAP - Advertisement data (max size = 31 bytes, though this is +// best kept short to conserve power while advertisting) +static uint8_t advertData[] = { + // Flags; this sets the device to use limited discoverable + // mode (advertises for 30 seconds at a time) instead of general + // discoverable mode (advertises indefinitely) + 0x02, // length of this data + GAP_ADTYPE_FLAGS, + DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, + + // service UUID, to notify central devices what services are included + // in this peripheral + 0x03, // length of this data + GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all + LO_UINT16(SIMPLEPROFILE_SERV_UUID), + HI_UINT16(SIMPLEPROFILE_SERV_UUID)}; + +// GAP GATT Attributes +static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "ch32v208_ble_uart"; + +// Connection item list +static peripheralConnItem_t peripheralConnList; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void Peripheral_ProcessTMOSMsg(tmos_event_hdr_t *pMsg); +static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEvent_t *pEvent); + +static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval, + uint16_t connSlaveLatency, uint16_t connTimeout); +static void peripheralInitConnItem(peripheralConnItem_t *peripheralConnList); +static void peripheralRssiCB(uint16_t connHandle, int8_t rssi); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// GAP Role Callbacks +static gapRolesCBs_t Peripheral_PeripheralCBs = { + peripheralStateNotificationCB, // Profile State Change Callbacks + peripheralRssiCB, // When a valid RSSI is read from controller (not used by application) + peripheralParamUpdateCB}; + +// Broadcast Callbacks +static gapRolesBroadcasterCBs_t Broadcaster_BroadcasterCBs = { + NULL, // Not used in peripheral role + NULL // Receive scan request callback +}; + +// GAP Bond Manager Callbacks +static gapBondCBs_t Peripheral_BondMgrCBs = { + NULL, // Passcode callback (not used by application) + NULL // Pairing / Bonding state Callback (not used by application) +}; + +extern uint8_t disconnectFlag; +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Peripheral_Init + * + * @brief Initialization function for the Peripheral App Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by TMOS. This ID should be + * used to send messages and set timers. + * + * @return none + */ +void Peripheral_Init() +{ + Peripheral_TaskID = TMOS_ProcessEventRegister(Peripheral_ProcessEvent); + + // Setup the GAP Peripheral Role Profile + { + uint8_t initial_advertising_enable = TRUE; + uint16_t desired_min_interval = 6; + uint16_t desired_max_interval = 1000; + + // Set the GAP Role Parameters + GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable); + GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData); + GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); + GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof(uint16_t), &desired_min_interval); + GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof(uint16_t), &desired_max_interval); + } + + // Set advertising interval + { + uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL; + + GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt); + GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt); + } + + // Setup the GAP Bond Manager + { + uint32_t passkey = 0; // passkey "000000" + uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; + uint8_t mitm = TRUE; + uint8_t bonding = TRUE; + uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; + GAPBondMgr_SetParameter(GAPBOND_PERI_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey); + GAPBondMgr_SetParameter(GAPBOND_PERI_PAIRING_MODE, sizeof(uint8_t), &pairMode); + GAPBondMgr_SetParameter(GAPBOND_PERI_MITM_PROTECTION, sizeof(uint8_t), &mitm); + GAPBondMgr_SetParameter(GAPBOND_PERI_IO_CAPABILITIES, sizeof(uint8_t), &ioCap); + GAPBondMgr_SetParameter(GAPBOND_PERI_BONDING_ENABLED, sizeof(uint8_t), &bonding); + } + + // Initialize GATT attributes + GGS_AddService(GATT_ALL_SERVICES); // GAP + GATTServApp_AddService(GATT_ALL_SERVICES); // GATT attributes + DevInfo_AddService(); // Device Information Service + ble_uart_add_service(on_bleuartServiceEvt); + + // Set the GAP Characteristics + GGS_SetParameter(GGS_DEVICE_NAME_ATT, sizeof(attDeviceName), attDeviceName); + + // Init Connection Item + peripheralInitConnItem(&peripheralConnList); + + // Register receive scan request callback + GAPRole_BroadcasterSetCB(&Broadcaster_BroadcasterCBs); + + // Setup a delayed profile startup + tmos_set_event(Peripheral_TaskID, SBP_START_DEVICE_EVT); +} + +/********************************************************************* + * @fn peripheralInitConnItem + * + * @brief Init Connection Item + * + * @param peripheralConnList - + * + * @return NULL + */ +static void peripheralInitConnItem(peripheralConnItem_t *peripheralConnList) +{ + peripheralConnList->connHandle = GAP_CONNHANDLE_INIT; + peripheralConnList->connInterval = 0; + peripheralConnList->connSlaveLatency = 0; + peripheralConnList->connTimeout = 0; +} + +uint32_t get_fattime(void) +{ + return 0; +} + +/********************************************************************* + * @fn Peripheral_ProcessEvent + * + * @brief Peripheral Application Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The TMOS assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +uint16_t Peripheral_ProcessEvent(uint8_t task_id, uint16_t events) +{ + static attHandleValueNoti_t noti; + // VOID task_id; // TMOS required parameter that isn't used in this function + + if(events & SYS_EVENT_MSG) + { + uint8_t *pMsg; + + if((pMsg = tmos_msg_receive(Peripheral_TaskID)) != NULL) + { + Peripheral_ProcessTMOSMsg((tmos_event_hdr_t *)pMsg); + // Release the TMOS message + tmos_msg_deallocate(pMsg); + } + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if(events & SBP_START_DEVICE_EVT) + { + // Start the Device + GAPRole_PeripheralStartDevice(Peripheral_TaskID, &Peripheral_BondMgrCBs, &Peripheral_PeripheralCBs); + return (events ^ SBP_START_DEVICE_EVT); + } + if(events & SBP_PARAM_UPDATE_EVT) + { + // Send connect param update request + GAPRole_PeripheralConnParamUpdateReq(peripheralConnList.connHandle, + DEFAULT_DESIRED_MIN_CONN_INTERVAL, + DEFAULT_DESIRED_MAX_CONN_INTERVAL, + DEFAULT_DESIRED_SLAVE_LATENCY, + DEFAULT_DESIRED_CONN_TIMEOUT, + Peripheral_TaskID); + + // GAPRole_PeripheralConnParamUpdateReq( peripheralConnList.connHandle, + // 10, + // 20, + // 0, + // 400, + // Peripheral_TaskID); + + return (events ^ SBP_PARAM_UPDATE_EVT); + } + + if(events & UART_TO_BLE_SEND_EVT) + { + static uint16_t read_length = 0; + ; + uint8_t result = 0xff; + switch(send_to_ble_state) + { + case SEND_TO_BLE_TO_SEND: + + //notify is not enabled + if(!ble_uart_notify_is_ready(peripheralConnList.connHandle)) + { + if(peripheralConnList.connHandle == GAP_CONNHANDLE_INIT) + { + //connection lost, flush rx fifo here + app_drv_fifo_flush(&app_uart_rx_fifo); + } + break; + } + read_length = ATT_GetMTU(peripheralConnList.connHandle) - 3; + + if(app_drv_fifo_length(&app_uart_rx_fifo) >= read_length) + { + KPrintf("FIFO_LEN:%d\r\n", app_drv_fifo_length(&app_uart_rx_fifo)); + result = app_drv_fifo_read(&app_uart_rx_fifo, to_test_buffer, &read_length); + uart_to_ble_send_evt_cnt = 0; + } + else + { + if(uart_to_ble_send_evt_cnt > 10) + { + result = app_drv_fifo_read(&app_uart_rx_fifo, to_test_buffer, &read_length); + uart_to_ble_send_evt_cnt = 0; + } + else + { + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 4); + uart_to_ble_send_evt_cnt++; + // KPrintf("NO TIME OUT\r\n"); + } + } + + if(APP_DRV_FIFO_RESULT_SUCCESS == result) + { + noti.len = read_length; + noti.pValue = GATT_bm_alloc(peripheralConnList.connHandle, ATT_HANDLE_VALUE_NOTI, noti.len, NULL, 0); + if(noti.pValue != NULL) + { + tmos_memcpy(noti.pValue, to_test_buffer, noti.len); + result = ble_uart_notify(peripheralConnList.connHandle, ¬i, 0); + if(result != SUCCESS) + { + KPrintf("R1:%02x\r\n", result); + send_to_ble_state = SEND_TO_BLE_SEND_FAILED; + GATT_bm_free((gattMsg_t *)¬i, ATT_HANDLE_VALUE_NOTI); + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2); + } + else + { + send_to_ble_state = SEND_TO_BLE_TO_SEND; + //app_fifo_write(&app_uart_tx_fifo,to_test_buffer,&read_length); + //app_drv_fifo_write(&app_uart_tx_fifo,to_test_buffer,&read_length); + read_length = 0; + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2); + } + } + else + { + send_to_ble_state = SEND_TO_BLE_ALLOC_FAILED; + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2); + } + } + else + { + //send_to_ble_state = SEND_TO_BLE_FIFO_EMPTY; + } + break; + case SEND_TO_BLE_ALLOC_FAILED: + case SEND_TO_BLE_SEND_FAILED: + + noti.len = read_length; + noti.pValue = GATT_bm_alloc(peripheralConnList.connHandle, ATT_HANDLE_VALUE_NOTI, noti.len, NULL, 0); + if(noti.pValue != NULL) + { + tmos_memcpy(noti.pValue, to_test_buffer, noti.len); + result = ble_uart_notify(peripheralConnList.connHandle, ¬i, 0); + if(result != SUCCESS) + { + KPrintf("R2:%02x\r\n", result); + send_to_ble_state = SEND_TO_BLE_SEND_FAILED; + GATT_bm_free((gattMsg_t *)¬i, ATT_HANDLE_VALUE_NOTI); + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2); + } + else + { + send_to_ble_state = SEND_TO_BLE_TO_SEND; + //app_drv_fifo_write(&app_uart_tx_fifo,to_test_buffer,&read_length); + read_length = 0; + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2); + } + } + else + { + send_to_ble_state = SEND_TO_BLE_ALLOC_FAILED; + tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2); + } + break; + default: + break; + } + return (events ^ UART_TO_BLE_SEND_EVT); + } + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn Peripheral_ProcessTMOSMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void Peripheral_ProcessTMOSMsg(tmos_event_hdr_t *pMsg) +{ + switch(pMsg->event) + { + default: + break; + } +} + +/********************************************************************* + * @fn Peripheral_LinkEstablished + * + * @brief Process link established. + * + * @param pEvent - event to process + * + * @return none + */ +static void Peripheral_LinkEstablished(gapRoleEvent_t *pEvent) +{ + gapEstLinkReqEvent_t *event = (gapEstLinkReqEvent_t *)pEvent; + + // See if already connected + if(peripheralConnList.connHandle != GAP_CONNHANDLE_INIT) + { + GAPRole_TerminateLink(pEvent->linkCmpl.connectionHandle); + KPrintf("Connection max...\n"); + } + else + { + peripheralConnList.connHandle = event->connectionHandle; + peripheralConnList.connInterval = event->connInterval; + peripheralConnList.connSlaveLatency = event->connLatency; + peripheralConnList.connTimeout = event->connTimeout; + + // Set timer for param update event + tmos_start_task(Peripheral_TaskID, SBP_PARAM_UPDATE_EVT, SBP_PARAM_UPDATE_DELAY); + + KPrintf("Conn %x - Int %x \n", event->connectionHandle, event->connInterval); + } +} + +/********************************************************************* + * @fn Peripheral_LinkTerminated + * + * @brief Process link terminated. + * + * @param pEvent - event to process + * + * @return none + */ +static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent) +{ + gapTerminateLinkEvent_t *event = (gapTerminateLinkEvent_t *)pEvent; + + if(event->connectionHandle == peripheralConnList.connHandle) + { + peripheralConnList.connHandle = GAP_CONNHANDLE_INIT; + peripheralConnList.connInterval = 0; + peripheralConnList.connSlaveLatency = 0; + peripheralConnList.connTimeout = 0; + + // Restart advertising + { + uint8_t advertising_enable = TRUE; + GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertising_enable); + } + } + else + { + KPrintf("ERR..\n"); + } +} + +/********************************************************************* + * @fn peripheralRssiCB + * + * @brief RSSI callback. + * + * @param connHandle - connection handle + * @param rssi - RSSI + * + * @return none + */ +static void peripheralRssiCB(uint16_t connHandle, int8_t rssi) +{ + KPrintf("RSSI -%d dB Conn %x \n", -rssi, connHandle); +} + +/********************************************************************* + * @fn peripheralParamUpdateCB + * + * @brief Parameter update complete callback + * + * @param connHandle - connect handle + * connInterval - connect interval + * connSlaveLatency - connect slave latency + * connTimeout - connect timeout + * + * @return none + */ +static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval, + uint16_t connSlaveLatency, uint16_t connTimeout) +{ + if(connHandle == peripheralConnList.connHandle) + { + peripheralConnList.connInterval = connInterval; + peripheralConnList.connSlaveLatency = connSlaveLatency; + peripheralConnList.connTimeout = connTimeout; + + KPrintf("Update %x - Int %x \n", connHandle, connInterval); + } + else + { + KPrintf("peripheralParamUpdateCB err..\n"); + } +} + +/********************************************************************* + * @fn peripheralStateNotificationCB + * + * @brief Notification from the profile of a state change. + * + * @param newState - new state + * + * @return none + */ +static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEvent_t *pEvent) +{ + switch(newState & GAPROLE_STATE_ADV_MASK) + { + case GAPROLE_STARTED: + KPrintf("Initialized..\n"); + break; + + case GAPROLE_ADVERTISING: + if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT) + { + Peripheral_LinkTerminated(pEvent); + } + KPrintf("Advertising..\n"); + break; + + case GAPROLE_CONNECTED: + if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT) + { + Peripheral_LinkEstablished(pEvent); + KPrintf("Connected..\n"); + } + break; + + case GAPROLE_CONNECTED_ADV: + KPrintf("Connected Advertising..\n"); + break; + + case GAPROLE_WAITING: + if(pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT) + { + KPrintf("Waiting for advertising..\n"); + } + else if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT) + { + Peripheral_LinkTerminated(pEvent); + disconnectFlag = 1; + KPrintf("Disconnected.. Reason:%x\n", pEvent->linkTerminate.reason); + } + else if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT) + { + if(pEvent->gap.hdr.status != SUCCESS) + { + KPrintf("Waiting for advertising..\n"); + } + else + { + KPrintf("Error..\n"); + } + } + else + { + KPrintf("Error..%x\n", pEvent->gap.opcode); + } + break; + + case GAPROLE_ERROR: + KPrintf("Error..\n"); + break; + + default: + break; + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/peripheral_main.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/peripheral_main.c new file mode 100755 index 000000000..77b8582ed --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ble/test/peripheral_main.c @@ -0,0 +1,73 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : main.c + * Author : WCH + * Version : V1.1 + * Date : 2020/08/06 + * Description : Peripheral slave application main function and task system initialization + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/******************************************************************************/ +/* Header file contains */ +#include "../inc/config.h" +#include "../inc/HAL.h" +#include "../Profile/gattprofile.h" +#include "../inc/peripheral.h" +#include "../inc/app_uart.h" +#include "shell.h" +#include "xs_base.h" +#include "debug.h" + +/********************************************************************* + * GLOBAL TYPEDEFS + */ +__attribute__((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4]; + +#if(defined(BLE_MAC)) && (BLE_MAC == TRUE) +uint8_t const MacAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02}; +#endif + +uint8_t disconnectFlag = 1; // ble disconnect flag +/********************************************************************* + * @fn Main_Circulation + * + * @brief Main loop + * + * @return none + */ +__attribute__((section(".highcode"))) +__attribute__((noinline)) +void Main_Circulation(void) +{ + while(1) + { + if (disconnectFlag) { + break; + } + TMOS_SystemProcess(); + app_uart_process(); + } +} + +/******************************************************************************* + * Function Name : main + * Description : Main function + * Input : None + * Output : None + * Return : None + *******************************************************************************/ +int test_ble(int argc, char *argv[]) +{ + KPrintf("%s\n", VER_LIB); + GAPRole_PeripheralInit(); + Peripheral_Init(); + KPrintf("BLE Peripheral Slave Init Success.\n"); + app_uart_init(); + disconnectFlag = 0; // reset disconnect flag + Main_Circulation(); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), + test_ble, test_ble, test test_ble command); \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/ping.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/ping.c index 3807840d1..12f051675 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/ping.c +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/ping.c @@ -400,6 +400,7 @@ int ping(int argc, char *argv[]) { } WCHNET_SocketClose(SocketId, TCP_CLOSE_NORMAL); ICMPCnt = 0; // restore the original ICMPCnt + return 0; } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/wchble.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/wchble.h new file mode 100755 index 000000000..5e0c38c90 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/wchble.h @@ -0,0 +1,4910 @@ +/********************************** (C) COPYRIGHT ****************************** + * File Name : wchble.h + * Author : WCH + * Version : V1.40 + * Date : 2024/01/02 + * Description : head file + * Copyright (c) 2022 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + + +/******************************************************************************/ +#ifndef __WCHBLE_H +#define __WCHBLE_H + +#ifdef __cplusplus +extern "C" +{ +#endif +#include "stdint.h" + + +#ifndef BOOL +typedef unsigned char BOOL; +#endif +#ifndef TRUE + #define TRUE 1 +#endif +#ifndef FALSE + #define FALSE 0 +#endif +#ifndef NULL + #define NULL 0 +#endif +#ifndef SUCCESS +#define SUCCESS 0x00 +#endif +#ifndef bStatus_t +typedef uint8_t bStatus_t; +#endif +#ifndef tmosTaskID +typedef uint8_t tmosTaskID; +#endif +#ifndef tmosEvents +typedef uint16_t tmosEvents; +#endif +#ifndef tmosTimer +typedef uint32_t tmosTimer; +#endif +#ifndef tmosSnvId_t +typedef uint16_t tmosSnvId_t; +#endif +#ifndef tmosSnvLen_t +typedef uint16_t tmosSnvLen_t; +#endif + +// Define function type that generate a random seed callback +typedef uint32_t (*pfnSrandCB)( void ); +// Define function type that switch to idle mode callback +typedef uint32_t (*pfnIdleCB)( uint32_t ); +// Define function type that run LSI clock calibration callback +typedef void (*pfnLSICalibrationCB)( void ); +// Define function type that get temperature callback +typedef uint16_t (*pfnTempSampleCB)( void ); +// Define function type that connect/advertise event complete callback. +typedef void (*pfnEventCB)( uint32_t timeUs ); +// Define function type that library status callback. +typedef void (*pfnLibStatusErrorCB)( uint8_t code, uint32_t status ); +// Define function type that process event +typedef tmosEvents (*pTaskEventHandlerFn)( tmosTaskID taskID, tmosEvents event ); +// Define function type that read flash +typedef uint32_t (*pfnFlashReadCB)( uint32_t addr, uint32_t num, uint32_t *pBuf ); +// Define function type that write flash +typedef uint32_t (*pfnFlashWriteCB)( uint32_t addr, uint32_t num, uint32_t *pBuf ); +// Define function type that get system clock count +typedef uint32_t (*pfnGetSysClock)( void ); + +/* BLE library config struct */ +typedef struct tag_ble_config +{ + uint32_t MEMAddr; // library memory start address + uint16_t MEMLen; // library memory size + uint32_t SNVAddr; // SNV flash start address( if NULL,bonding information will not be saved ) + uint16_t SNVBlock; // SNV flash block size ( default 256 ) + uint8_t SNVNum; // SNV flash block number ( default 1 ) + uint8_t BufNumber; // Maximum number of sent and received packages cached by the controller( default 5 ) + // Must be greater than the number of connections. + uint16_t BufMaxLen; // Maximum length (in octets) of the data portion of each HCI data packet( default 27 ) + // SC enable,must be greater than 69 + // ATT_MTU = BufMaxLen-4,Range[23,ATT_MAX_MTU_SIZE] + uint8_t TxNumEvent; // Maximum number of TX data in a connection event ( default 1 ) + uint8_t RxNumEvent; // Maximum number of RX data in a connection event ( default equal to BufNumber ) + uint8_t TxPower; // Transmit power level( default LL_TX_POWEER_0_DBM(0dBm) ) + uint8_t ConnectNumber; // Connect number,lower two bits are peripheral number,followed by central number + + uint8_t WindowWidening; // Wait rf start window(us) + uint8_t WaitWindow; // Wait event arrive window in one system clock + uint8_t MacAddr[6]; // MAC address,little-endian + uint16_t ClockFrequency; // The timing clock frequency(Hz) + uint16_t ClockAccuracy; // The timing clock accuracy(ppm) + pfnSrandCB srandCB; // Register a program that generate a random seed + pfnIdleCB idleCB; // Register a program that set idle + pfnTempSampleCB tsCB; // Register a program that read the current temperature,determine whether calibration is need + pfnLSICalibrationCB rcCB; // Register a program that LSI clock calibration + pfnLibStatusErrorCB staCB; // Register a program that library status callback + pfnFlashReadCB readFlashCB; // Register a program that read flash + pfnFlashWriteCB writeFlashCB; // Register a program that write flash +} bleConfig_t; // Library initialization call BLE_LibInit function + +/* BLE pa control config struct */ +typedef struct tag_ble_clock_config +{ + pfnGetSysClock getClockValue; + uint32_t ClockMaxCount; // The maximum count value + uint16_t ClockFrequency; // The timing clock frequency(Hz) + uint16_t ClockAccuracy; // The timing clock accuracy(ppm) + uint8_t irqEnable; // resv +}bleClockConfig_t; + +/* BLE pa control config struct */ +typedef struct tag_ble_pa_control_config +{ + uint32_t txEnableGPIO; // tx enable gpio register + uint32_t txDisableGPIO; // tx disable gpio register + uint32_t tx_pin; // tx pin define + uint32_t rxEnableGPIO; // rx enable gpio register + uint32_t rxDisableGPIO; // rx disable gpio register + uint32_t rx_pin; // tx pin define +} blePaControlConfig_t; + +// defined for all task +#define SYS_EVENT_MSG (0x8000) // A message is waiting event +#define INVALID_TASK_ID 0xFF // Task ID isn't setup properly +#define TASK_NO_TASK 0xFF + +typedef struct +{ + uint8_t event; + uint8_t status; +} tmos_event_hdr_t; + +/********************************************************************* + * GLOBAL MACROS + */ +#define VER_FILE "CH32V20x_BLE_LIB_V1.4" +extern const uint8_t VER_LIB[]; // LIB version +#define SYSTEM_TIME_MICROSEN 625 // unit of process event timer is 625us +#define MS1_TO_SYSTEM_TIME(x) ((x)*1000/SYSTEM_TIME_MICROSEN) // transform unit in ms to unit in 625us ( attentional bias ) +#define TMOS_TIME_VALID (30*1000*1000) // the maximum task time = RTC MAX clock - TMOS_TIME_VALID + +/* takes a byte out of a uint32_t : var - uint32_t, ByteNum - byte to take out (0 - 3) */ +#define BREAK_UINT32( var, ByteNum ) (uint8_t)((uint32_t)(((var) >>((ByteNum) * 8)) & 0x00FF)) +#define HI_UINT16(a) (((a) >> 8) & 0xFF) +#define LO_UINT16(a) ((a) & 0xFF) +#define HI_UINT8(a) (((a) >> 4) & 0x0F) +#define LO_UINT8(a) ((a) & 0x0F) +#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) \ + ((uint32_t)(((uint32_t)(Byte0) & 0x00FF) \ + + (((uint32_t)(Byte1) & 0x00FF) << 8) \ + + (((uint32_t)(Byte2) & 0x00FF) << 16) \ + + (((uint32_t)(Byte3) & 0x00FF) << 24))) +#define BUILD_UINT16(loByte, hiByte) ((uint16_t)(((loByte) & 0x00FF)|(((hiByte) & 0x00FF)<<8))) + +#define ACTIVE_LOW ! +#define ACTIVE_HIGH !! // double negation forces result to be '1' + +#ifndef BV +#define BV(n) (1 << (n)) +#endif + +#ifndef BF +#define BF(x,b,s) (((x) & (b)) >> (s)) +#endif + +#ifndef MIN +#define MIN(n,m) (((n) < (m)) ? (n) : (m)) +#endif + +#ifndef MAX +#define MAX(n,m) (((n) < (m)) ? (m) : (n)) +#endif + +#ifndef ABS +#define ABS(n) (((n) < 0) ? -(n) : (n)) +#endif + +/* Tx_POWER define(Accuracy:卤2dBm) */ +#define LL_TX_POWEER_MINUS_18_DBM 0x01 +#define LL_TX_POWEER_MINUS_10_DBM 0x03 +#define LL_TX_POWEER_MINUS_5_DBM 0x05 +#define LL_TX_POWEER_MINUS_3_DBM 0x07 +#define LL_TX_POWEER_0_DBM 0x09 +#define LL_TX_POWEER_1_DBM 0x0B +#define LL_TX_POWEER_2_DBM 0x0D +#define LL_TX_POWEER_3_DBM 0x11 +#define LL_TX_POWEER_4_DBM 0x15 +#define LL_TX_POWEER_5_DBM 0x1B +#define LL_TX_POWEER_6_DBM 0x25 +#define LL_TX_POWEER_7_DBM 0x3F + +/* ERR_LIB_INIT define */ +#define ERR_LLE_IRQ_HANDLE 0x01 +#define ERR_MEM_ALLOCATE_SIZE 0x02 +#define ERR_SET_MAC_ADDR 0x03 +#define ERR_GAP_ROLE_CONFIG 0x04 +#define ERR_CONNECT_NUMBER_CONFIG 0x05 +#define ERR_SNV_ADDR_CONFIG 0x06 +#define ERR_CLOCK_SELECT_CONFIG 0x07 + +//! Default Public and Random Address Length +#define B_ADDR_LEN 6 +//! Random Number Size +#define B_RANDOM_NUM_SIZE 8 +//! Default key length +#define KEYLEN 16 +#define PUBLIC_KEY_LEN 64 + +//! Maximum Advertising Packet Length +#define B_MAX_ADV_LEN 31 // maximum legacy advertising packet length +#define B_MAX_ADV_EXT_LEN 460 // maximum extended advertising packet length +#define B_MAX_ADV_PERIODIC_LEN 460 // maximum periodic advertising packet length + +#define FAILURE 0x01 //!< Failure +#define INVALIDPARAMETER 0x02 //!< Invalid request field +#define INVALID_TASK 0x03 //!< Task ID isn't setup properly +#define MSG_BUFFER_NOT_AVAIL 0x04 //!< No buffer is available. +#define INVALID_MSG_POINTER 0x05 //!< No message pointer. +#define INVALID_EVENT_ID 0x06 //!< Invalid event id. +#define INVALID_TIMEOUT 0x07 //!< Invalid timeout. +#define NO_TIMER_AVAIL 0x08 //!< No event is available. +#define NV_OPER_FAILED 0x0A //!< read a data item to NV failed. +#define INVALID_MEM_SIZE 0x0B //!< The tokens take up too much space and don't fit into Advertisement data and Scan Response Data + +/** BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + */ +#define bleInvalidTaskID INVALID_TASK //!< Task ID isn't setup properly +#define bleEecKeyRequestRejected 0x06 //!< key missing +#define bleNotReady 0x10 //!< Not ready to perform task +#define bleAlreadyInRequestedMode 0x11 //!< Already performing that task +#define bleIncorrectMode 0x12 //!< Not setup properly to perform that task +#define bleMemAllocError 0x13 //!< Memory allocation error occurred +#define bleNotConnected 0x14 //!< Can't perform function when not in a connection +#define bleNoResources 0x15 //!< There are no resource available +#define blePending 0x16 //!< Waiting +#define bleTimeout 0x17 //!< Timed out performing function +#define bleInvalidRange 0x18 //!< A parameter is out of range +#define bleLinkEncrypted 0x19 //!< The link is already encrypted +#define bleProcedureComplete 0x1A //!< The Procedure is completed +#define bleInvalidMtuSize 0x1B //!< SDU size is larger than peer MTU. + +/********************************LinkDB****************************************/ +// Special case connection handles +#define INVALID_CONNHANDLE 0xFFFF // Invalid connection handle, used for no connection handle +#define LOOPBACK_CONNHANDLE 0xFFFE // Loopback connection handle, used to loopback a message +// Link state flags +#define LINK_NOT_CONNECTED 0x00 // Link isn't connected +#define LINK_CONNECTED 0x01 // Link is connected +#define LINK_AUTHENTICATED 0x02 // Link is authenticated +#define LINK_BOUND 0x04 // Link is bonded +#define LINK_ENCRYPTED 0x10 // Link is encrypted +// Link Database Status callback changeTypes +#define LINKDB_STATUS_UPDATE_NEW 0 // New connection created +#define LINKDB_STATUS_UPDATE_REMOVED 1 // Connection was removed +#define LINKDB_STATUS_UPDATE_STATEFLAGS 2 // Connection state flag changed +/*******************************gattUUID***************************************/ +/** + * GATT Services + */ +#define GAP_SERVICE_UUID 0x1800 // Generic Access Profile +#define GATT_SERVICE_UUID 0x1801 // Generic Attribute Profile + +/** + * GATT Declarations + */ +#define GATT_PRIMARY_SERVICE_UUID 0x2800 // Primary Service +#define GATT_SECONDARY_SERVICE_UUID 0x2801 // Secondary Service +#define GATT_INCLUDE_UUID 0x2802 // Include +#define GATT_CHARACTER_UUID 0x2803 // Characteristic + +/** + * GATT Descriptors + */ +#define GATT_CHAR_EXT_PROPS_UUID 0x2900 // Characteristic Extended Properties +#define GATT_CHAR_USER_DESC_UUID 0x2901 // Characteristic User Description +#define GATT_CLIENT_CHAR_CFG_UUID 0x2902 // Client Characteristic Configuration +#define GATT_SERV_CHAR_CFG_UUID 0x2903 // Server Characteristic Configuration +#define GATT_CHAR_FORMAT_UUID 0x2904 // Characteristic Presentation Format +#define GATT_CHAR_AGG_FORMAT_UUID 0x2905 // Characteristic Aggregate Format +#define GATT_VALID_RANGE_UUID 0x2906 // Valid Range +#define GATT_EXT_REPORT_REF_UUID 0x2907 // External Report Reference Descriptor +#define GATT_REPORT_REF_UUID 0x2908 // Report Reference Descriptor + +/** + * GATT Characteristics + */ +#define DEVICE_NAME_UUID 0x2A00 // Device Name +#define APPEARANCE_UUID 0x2A01 // Appearance +#define PERI_PRIVACY_FLAG_UUID 0x2A02 // Peripheral Privacy Flag +#define RECONNECT_ADDR_UUID 0x2A03 // Reconnection Address +#define PERI_CONN_PARAM_UUID 0x2A04 // Peripheral Preferred Connection Parameters +#define SERVICE_CHANGED_UUID 0x2A05 // Service Changed +#define CENTRAL_ADDRESS_RESOLUTION_UUID 0x2AA6 // Central Address Resolution +#define RL_PRIVATE_ADDR_ONLY_UUID 0x2AC9 // Resolvable Private Address Only +#define ENC_DATA_KEY_MATERIAL_UUID 0x2B88 // Encrypted Data Key Material +#define LE_GATT_SEC_LEVELS_UUID 0x2BF5 // LE GATT Security Levels + +/** + * GATT Service UUIDs + */ +#define IMMEDIATE_ALERT_SERV_UUID 0x1802 // Immediate Alert +#define LINK_LOSS_SERV_UUID 0x1803 // Link Loss +#define TX_PWR_LEVEL_SERV_UUID 0x1804 // Tx Power +#define CURRENT_TIME_SERV_UUID 0x1805 // Current Time Service +#define REF_TIME_UPDATE_SERV_UUID 0x1806 // Reference Time Update Service +#define NEXT_DST_CHANGE_SERV_UUID 0x1807 // Next DST Change Service +#define GLUCOSE_SERV_UUID 0x1808 // Glucose +#define THERMOMETER_SERV_UUID 0x1809 // Health Thermometer +#define DEVINFO_SERV_UUID 0x180A // Device Information +#define NWA_SERV_UUID 0x180B // Network Availability +#define HEARTRATE_SERV_UUID 0x180D // Heart Rate +#define PHONE_ALERT_STS_SERV_UUID 0x180E // Phone Alert Status Service +#define BATT_SERV_UUID 0x180F // Battery Service +#define BLOODPRESSURE_SERV_UUID 0x1810 // Blood Pressure +#define ALERT_NOTIF_SERV_UUID 0x1811 // Alert Notification Service +#define HID_SERV_UUID 0x1812 // Human Interface Device +#define SCAN_PARAM_SERV_UUID 0x1813 // Scan Parameters +#define RSC_SERV_UUID 0x1814 // Running Speed and Cadence +#define CSC_SERV_UUID 0x1816 // Cycling Speed and Cadence +#define CYCPWR_SERV_UUID 0x1818 // Cycling Power +#define LOC_NAV_SERV_UUID 0x1819 // Location and Navigation + +/** + * GATT Characteristic UUIDs + */ +#define ALERT_LEVEL_UUID 0x2A06 // Alert Level +#define TX_PWR_LEVEL_UUID 0x2A07 // Tx Power Level +#define DATE_TIME_UUID 0x2A08 // Date Time +#define DAY_OF_WEEK_UUID 0x2A09 // Day of Week +#define DAY_DATE_TIME_UUID 0x2A0A // Day Date Time +#define EXACT_TIME_256_UUID 0x2A0C // Exact Time 256 +#define DST_OFFSET_UUID 0x2A0D // DST Offset +#define TIME_ZONE_UUID 0x2A0E // Time Zone +#define LOCAL_TIME_INFO_UUID 0x2A0F // Local Time Information +#define TIME_WITH_DST_UUID 0x2A11 // Time with DST +#define TIME_ACCURACY_UUID 0x2A12 // Time Accuracy +#define TIME_SOURCE_UUID 0x2A13 // Time Source +#define REF_TIME_INFO_UUID 0x2A14 // Reference Time Information +#define TIME_UPDATE_CTRL_PT_UUID 0x2A16 // Time Update Control Point +#define TIME_UPDATE_STATE_UUID 0x2A17 // Time Update State +#define GLUCOSE_MEAS_UUID 0x2A18 // Glucose Measurement +#define BATT_LEVEL_UUID 0x2A19 // Battery Level +#define TEMP_MEAS_UUID 0x2A1C // Temperature Measurement +#define TEMP_TYPE_UUID 0x2A1D // Temperature Type +#define IMEDIATE_TEMP_UUID 0x2A1E // Intermediate Temperature +#define MEAS_INTERVAL_UUID 0x2A21 // Measurement Interval +#define BOOT_KEY_INPUT_UUID 0x2A22 // Boot Keyboard Input Report +#define SYSTEM_ID_UUID 0x2A23 // System ID +#define MODEL_NUMBER_UUID 0x2A24 // Model Number String +#define SERIAL_NUMBER_UUID 0x2A25 // Serial Number String +#define FIRMWARE_REV_UUID 0x2A26 // Firmware Revision String +#define HARDWARE_REV_UUID 0x2A27 // Hardware Revision String +#define SOFTWARE_REV_UUID 0x2A28 // Software Revision String +#define MANUFACTURER_NAME_UUID 0x2A29 // Manufacturer Name String +#define IEEE_11073_CERT_DATA_UUID 0x2A2A // IEEE 11073-20601 Regulatory Certification Data List +#define CURRENT_TIME_UUID 0x2A2B // Current Time +#define SCAN_REFRESH_UUID 0x2A31 // Scan Refresh +#define BOOT_KEY_OUTPUT_UUID 0x2A32 // Boot Keyboard Output Report +#define BOOT_MOUSE_INPUT_UUID 0x2A33 // Boot Mouse Input Report +#define GLUCOSE_CONTEXT_UUID 0x2A34 // Glucose Measurement Context +#define BLOODPRESSURE_MEAS_UUID 0x2A35 // Blood Pressure Measurement +#define IMEDIATE_CUFF_PRESSURE_UUID 0x2A36 // Intermediate Cuff Pressure +#define HEARTRATE_MEAS_UUID 0x2A37 // Heart Rate Measurement +#define BODY_SENSOR_LOC_UUID 0x2A38 // Body Sensor Location +#define HEARTRATE_CTRL_PT_UUID 0x2A39 // Heart Rate Control Point +#define NETWORK_AVAIL_UUID 0x2A3E // Network Availability +#define ALERT_STATUS_UUID 0x2A3F // Alert Status +#define RINGER_CTRL_PT_UUID 0x2A40 // Ringer Control Point +#define RINGER_SETTING_UUID 0x2A41 // Ringer Setting +#define ALERT_CAT_ID_BMASK_UUID 0x2A42 // Alert Category ID Bit Mask +#define ALERT_CAT_ID_UUID 0x2A43 // Alert Category ID +#define ALERT_NOTIF_CTRL_PT_UUID 0x2A44 // Alert Notification Control Point +#define UNREAD_ALERT_STATUS_UUID 0x2A45 // Unread Alert Status +#define NEW_ALERT_UUID 0x2A46 // New Alert +#define SUP_NEW_ALERT_CAT_UUID 0x2A47 // Supported New Alert Category +#define SUP_UNREAD_ALERT_CAT_UUID 0x2A48 // Supported Unread Alert Category +#define BLOODPRESSURE_FEATURE_UUID 0x2A49 // Blood Pressure Feature +#define HID_INFORMATION_UUID 0x2A4A // HID Information +#define REPORT_MAP_UUID 0x2A4B // Report Map +#define HID_CTRL_PT_UUID 0x2A4C // HID Control Point +#define REPORT_UUID 0x2A4D // Report +#define PROTOCOL_MODE_UUID 0x2A4E // Protocol Mode +#define SCAN_INTERVAL_WINDOW_UUID 0x2A4F // Scan Interval Window +#define PNP_ID_UUID 0x2A50 // PnP ID +#define GLUCOSE_FEATURE_UUID 0x2A51 // Glucose Feature +#define RECORD_CTRL_PT_UUID 0x2A52 // Record Access Control Point +#define RSC_MEAS_UUID 0x2A53 // RSC Measurement +#define RSC_FEATURE_UUID 0x2A54 // RSC Feature +#define SC_CTRL_PT_UUID 0x2A55 // SC Control Point +#define CSC_MEAS_UUID 0x2A5B // CSC Measurement +#define CSC_FEATURE_UUID 0x2A5C // CSC Feature +#define SENSOR_LOC_UUID 0x2A5D // Sensor Location +#define CYCPWR_MEAS_UUID 0x2A63 // Cycling Power Measurement +#define CYCPWR_VECTOR_UUID 0x2A64 // Cycling Power Vector +#define CYCPWR_FEATURE_UUID 0x2A65 // Cycling Power Feature +#define CYCPWR_CTRL_PT_UUID 0x2A66 // Cycling Power Control Point +#define LOC_SPEED_UUID 0x2A67 // Location and Speed +#define NAV_UUID 0x2A68 // Navigation +#define POS_QUALITY_UUID 0x2A69 // Position Quality +#define LN_FEATURE_UUID 0x2A6A // LN Feature +#define LN_CTRL_PT_UUID 0x2A6B // LN Control Point +#define ELE_UUID 0x2A6C // Elevation +#define PRESSURE_UUID 0x2A6D // Pressure +#define TEMP_UUID 0x2A6E // Temperature +#define HUMI_UUID 0x2A6F // Humidity +#define TRUE_WIND_SPEED_UUID 0x2A70 // True Wind Speed +#define TRUE_WIND_DIRECTION_UUID 0x2A71 // True Wind Direction +#define URI_UUID 0x2AB6 // URI +#define MEDIA_STATE_UUID 0x2BA3 // Media State +#define MEDIA_CTRL_PT_UUID 0x2BA4 // Media Control Point +#define MEDIA_CTRL_PT_OS_UUID 0x2BA5 // Media Control Point Opcodes Supported +#define CALL_STATE_UUID 0x2BBD // Call State +#define CALL_CTRL_PT_UUID 0x2BBE // Call Control Point +#define CALL_CTRL_PT_OO_UUID 0x2BBF // Call Control Point Optional Opcodes +#define TERM_REASON_UUID 0x2BC0 // Termination Reason +#define INCOMING_CALL_UUID 0x2BC1 // Incoming Call +#define MUTE_UUID 0x2BC3 // Mute +#define ESL_ADDR_UUID 0x2BF6 // ESL Address +#define AP_SYNC_KEY_MATERIAL_UUID 0x2BF7 // AP Sync Key Material +#define ESL_RSP_KEY_MATERIAL_UUID 0x2BF8 // ESL Response Key Material +#define ESL_CURR_ABS_TIME_UUID 0x2BF9 // ESL Current Absolute Time +#define ESL_DISPLAY_INFO_UUID 0x2BFA // ESL Display Information +#define ESL_IMAGE_INFO_UUID 0x2BFB // ESL Image Information +#define ESL_SENSOR_INFO_UUID 0x2BFC // ESL Sensor Information +#define ESL_LED_INFO_UUID 0x2BFD // ESL LED Information +#define ESL_CTL_POINT_UUID 0x2BFE // ESL Control Point + +/** + * GATT Unit UUIDs + */ +#define GATT_UNITLESS_UUID 0x2700 // unitless +#define GATT_UNIT_LENGTH_METER_UUID 0x2701 // m, m +#define GATT_UNIT_MASS_KGRAM_UUID 0x2702 // kg, kg +#define GATT_UNIT_TIME_SECOND_UUID 0x2703 // s, s +#define GATT_UNIT_ELECTRIC_CURRENT_A_UUID 0x2704 // A, A +#define GATT_UNIT_THERMODYN_TEMP_K_UUID 0x2705 // K, K +#define GATT_UNIT_AMOUNT_SUBSTANCE_M_UUID 0x2706 // mol, mol +#define GATT_UNIT_LUMINOUS_INTENSITY_C_UUID 0x2707 // cd, cd + +#define GATT_UNIT_AREA_SQ_MTR_UUID 0x2710 // m^2, m^2 +#define GATT_UNIT_VOLUME_CUBIC_MTR_UUID 0x2711 // m^3, m^3 +#define GATT_UNIT_VELOCITY_MPS_UUID 0x2712 // m/s, m s^-1 +#define GATT_UNIT_ACCELERATION_MPS_SQ_UUID 0x2713 // m/s^2, m s^-2 +#define GATT_UNIT_WAVENUMBER_RM_UUID 0x2714 // ? m^-1 +#define GATT_UNIT_DENSITY_KGPCM_UUID 0x2715 // p, kg m^-3 +#define GATT_UNIT_SURFACE_DENSITY_KGPSM_UUID 0x2716 // pA, kg m^-2 +#define GATT_UNIT_SPECIFIC_VOLUME_CMPKG_UUID 0x2717 // v, m^3 kg^-1 +#define GATT_UNIT_CURRENT_DENSITY_APSM_UUID 0x2718 // j, A m^-2 +#define GATT_UNIT_MAG_FIELD_STRENGTH_UUID 0x2719 // H, A m +#define GATT_UNIT_AMOUNT_CONC_MPCM_UUID 0x271A // c, mol m^-3 +#define GATT_UNIT_MASS_CONC_KGPCM_UUID 0x271B // c, kg m^-3 +#define GATT_UNIT_LUMINANCE_CPSM_UUID 0x271C // Lv, cd m^-2 +#define GATT_UNIT_REFRACTIVE_INDEX_UUID 0x271D // n, 1 +#define GATT_UNIT_RELATIVE_PERMEABLILTY_UUID 0x271E // u, 1 +#define GATT_UNIT_PLANE_ANGLE_RAD_UUID 0x2720 // rad, m m-1 +#define GATT_UNIT_SOLID_ANGLE_STERAD_UUID 0x2721 // sr, m2 m-2 +#define GATT_UNIT_FREQUENCY_HTZ_UUID 0x2722 // Hz, s-1 +#define GATT_UNIT_FORCE_NEWTON_UUID 0x2723 // N, m kg s-2 +#define GATT_UNIT_PRESSURE_PASCAL_UUID 0x2724 // Pa, N/m2 = m2 kg s-2 +#define GATT_UNIT_ENERGY_JOULE_UUID 0x2725 // J, N m = m2 kg s-2 +#define GATT_UNIT_POWER_WATT_UUID 0x2726 // W, J/s = m2 kg s-3 +#define GATT_UNIT_E_CHARGE_C_UUID 0x2727 // C, sA +#define GATT_UNIT_E_POTENTIAL_DIF_V_UUID 0x2728 // V, W/A = m2 kg s-3 A-1 + +#define GATT_UNIT_CELSIUS_TEMP_DC_UUID 0x272F // oC, t/oC = T/K - 273.15 + +#define GATT_UNIT_TIME_MINUTE_UUID 0x2760 // min, 60 s +#define GATT_UNIT_TIME_HOUR_UUID 0x2761 // h, 3600 s +#define GATT_UNIT_TIME_DAY_UUID 0x2762 // d, 86400 s +#define GATT_UNIT_PLANE_ANGLE_DEGREE_UUID 0x2763 // o, (pi/180) rad +#define GATT_UNIT_PLANE_ANGLE_MINUTE_UUID 0x2764 // ', (pi/10800) rad +#define GATT_UNIT_PLANE_ANGLE_SECOND_UUID 0x2765 // '', (pi/648000) rad +#define GATT_UNIT_AREA_HECTARE_UUID 0x2766 // ha, 10^4 m^2 +#define GATT_UNIT_VOLUME_LITRE_UUID 0x2767 // l, 10^-3 m^3 +#define GATT_UNIT_MASS_TONNE_UUID 0x2768 // t, 10^3 kg + +#define GATT_UINT_LENGTH_YARD_UUID 0x27A0 // yd, 0.9144 m +#define GATT_UNIT_LENGTH_PARSEC_UUID 0x27A1 // pc, 3.085678 ?1016 m +#define GATT_UNIT_LENGTH_INCH_UUID 0x27A2 // in, 0.0254 m +#define GATT_UNIT_LENGTH_FOOT_UUID 0x27A3 // ft, 0.3048 m +#define GATT_UNIT_LENGTH_MILE_UUID 0x27A4 // mi, 1609.347 m +#define GATT_UNIT_PRESSURE_PFPSI_UUID 0x27A5 // psi, 6.894757 ?103 Pa +#define GATT_UNIT_VELOCITY_KMPH_UUID 0x27A6 // km/h, 0.2777778 m^s-1 +#define GATT_UNIT_VELOCITY_MPH_UUID 0x27A7 // mi/h, 0.44704 m^ s-1 +#define GATT_UNIT_ANGULAR_VELOCITY_RPM_UUID 0x27A8 // r/min, 0.1047198 rad s-1 +#define GATT_UNIT_ENERGY_GCAL_UUID 0x27A9 // energy (gram calorie) +#define GATT_UNIT_ENERGY_KCAL_UUID 0x27AA // kcal, 4190.02 J +#define GATT_UNIT_ENERGY_KWH_UUID 0x27AB // kWh, 3600000 J +#define GATT_UNIT_THERMODYN_TEMP_DF_UUID 0x27AC // oF, t/oF = T/K ?1.8 - 459.67 +#define GATT_UNIT_PERCENTAGE_UUID 0x27AD // percentage,% +#define GATT_UNIT_PER_MILE_UUID 0x27AE // per mille +#define GATT_UNIT_PERIOD_BPM_UUID 0x27AF // period (beats per minute),BPM +#define GATT_UNIT_E_CHARGE_AH_UUID 0x27B0 // electric charge (ampere hours) +#define GATT_UNIT_MASS_DENSITY_MGPD_UUID 0x27B1 // mass density (milligram per decilitre) +#define GATT_UNIT_MASS_DENSITY_MMPL_UUID 0x27B2 // mass density (millimole per litre) +#define GATT_UNIT_TIME_YEAR_UUID 0x27B3 // time (year) +#define GATT_UNIT_TIME_MONTH_UUID 0x27B4 // time (month) + +/*********************************Messages IDs*********************************/ +// GATT - Messages IDs +#define GATT_MSG_EVENT 0xB0 //!< Incoming GATT message +#define GATT_SERV_MSG_EVENT 0xB1 //!< Incoming GATT ServApp message +// GAP - Messages IDs +#define GAP_MSG_EVENT 0xD0 //!< Incoming GAP message +/************************************ATT***************************************/ +#define ATT_MTU_SIZE 23 //!< Minimum ATT MTU size +#define ATT_MAX_MTU_SIZE 512 //!< Maximum ATT MTU size +// ATT Methods +#define ATT_ERROR_RSP 0x01 //!< ATT Error Response +#define ATT_EXCHANGE_MTU_REQ 0x02 //!< ATT Exchange MTU Request +#define ATT_EXCHANGE_MTU_RSP 0x03 //!< ATT Exchange MTU Response +#define ATT_FIND_INFO_REQ 0x04 //!< ATT Find Information Request +#define ATT_FIND_INFO_RSP 0x05 //!< ATT Find Information Response +#define ATT_FIND_BY_TYPE_VALUE_REQ 0x06 //!< ATT Find By Type Value Request +#define ATT_FIND_BY_TYPE_VALUE_RSP 0x07 //!< ATT Find By Type Value Response +#define ATT_READ_BY_TYPE_REQ 0x08 //!< ATT Read By Type Request +#define ATT_READ_BY_TYPE_RSP 0x09 //!< ATT Read By Type Response +#define ATT_READ_REQ 0x0a //!< ATT Read Request +#define ATT_READ_RSP 0x0b //!< ATT Read Response +#define ATT_READ_BLOB_REQ 0x0c //!< ATT Read Blob Request +#define ATT_READ_BLOB_RSP 0x0d //!< ATT Read Blob Response +#define ATT_READ_MULTI_REQ 0x0e //!< ATT Read Multiple Request +#define ATT_READ_MULTI_RSP 0x0f //!< ATT Read Multiple Response +#define ATT_READ_BY_GRP_TYPE_REQ 0x10 //!< ATT Read By Group Type Request +#define ATT_READ_BY_GRP_TYPE_RSP 0x11 //!< ATT Read By Group Type Response +#define ATT_WRITE_REQ 0x12 //!< ATT Write Request +#define ATT_WRITE_RSP 0x13 //!< ATT Write Response +#define ATT_PREPARE_WRITE_REQ 0x16 //!< ATT Prepare Write Request +#define ATT_PREPARE_WRITE_RSP 0x17 //!< ATT Prepare Write Response +#define ATT_EXECUTE_WRITE_REQ 0x18 //!< ATT Execute Write Request +#define ATT_EXECUTE_WRITE_RSP 0x19 //!< ATT Execute Write Response +#define ATT_HANDLE_VALUE_NOTI 0x1b //!< ATT Handle Value Notification +#define ATT_HANDLE_VALUE_IND 0x1d //!< ATT Handle Value Indication +#define ATT_HANDLE_VALUE_CFM 0x1e //!< ATT Handle Value Confirmation + +#define ATT_WRITE_CMD 0x52 //!< ATT Write Command +#define ATT_SIGNED_WRITE_CMD 0xD2 //!< ATT Signed Write Command + +// ATT Error Codes +#define ATT_ERR_INVALID_HANDLE 0x01 //!< The attribute handle given was not valid on this server +#define ATT_ERR_READ_NOT_PERMITTED 0x02 //!< The attribute cannot be read +#define ATT_ERR_WRITE_NOT_PERMITTED 0x03 //!< The attribute cannot be written +#define ATT_ERR_INVALID_PDU 0x04 //!< The attribute PDU was invalid +#define ATT_ERR_INSUFFICIENT_AUTHEN 0x05 //!< The attribute requires authentication before it can be read or written +#define ATT_ERR_UNSUPPORTED_REQ 0x06 //!< Attribute server does not support the request received from the client +#define ATT_ERR_INVALID_OFFSET 0x07 //!< Offset specified was past the end of the attribute +#define ATT_ERR_INSUFFICIENT_AUTHOR 0x08 //!< The attribute requires authorization before it can be read or written +#define ATT_ERR_PREPARE_QUEUE_FULL 0x09 //!< Too many prepare writes have been queued +#define ATT_ERR_ATTR_NOT_FOUND 0x0a //!< No attribute found within the given attribute handle range +#define ATT_ERR_ATTR_NOT_LONG 0x0b //!< The attribute cannot be read using the Read Blob Request +#define ATT_ERR_INSUFFICIENT_KEY_SIZE 0x0c //!< The Encryption Key Size used for encrypting this link is insufficient +#define ATT_ERR_INVALID_VALUE_SIZE 0x0d //!< The attribute value length is invalid for the operation +#define ATT_ERR_UNLIKELY 0x0e //!< The attribute request that was requested has encountered an error that was very unlikely, and therefore could not be completed as requested +#define ATT_ERR_INSUFFICIENT_ENCRYPT 0x0f //!< The attribute requires encryption before it can be read or written +#define ATT_ERR_UNSUPPORTED_GRP_TYPE 0x10 //!< The attribute type is not a supported grouping attribute as defined by a higher layer specification +#define ATT_ERR_INSUFFICIENT_RESOURCES 0x11 //!< Insufficient Resources to complete the request +#define ATT_ERR_INVALID_VALUE 0x80 //!< The attribute value is invalid for the operation + +/********************************************************************* + * ATT Find By Type Value Response macros + */ +// Attribute Handle and Group End Handle pair indexes +#define ATT_ATTR_HANDLE_IDX( i ) ( (i) * (2 + 2) ) +#define ATT_GRP_END_HANDLE_IDX( i ) ( ATT_ATTR_HANDLE_IDX( (i) ) + 2 ) + +#define ATT_ATTR_HANDLE( info, i ) ( BUILD_UINT16( (info)[ATT_ATTR_HANDLE_IDX((i))], \ + (info)[ATT_ATTR_HANDLE_IDX((i))+1] ) ) +#define ATT_GRP_END_HANDLE( info, i ) ( BUILD_UINT16( (info)[ATT_GRP_END_HANDLE_IDX((i))], \ + (info)[ATT_GRP_END_HANDLE_IDX((i))+1] ) ) +/** @defgroup ATT_MSG_EVENT_DEFINES ATT Message Event IDs + * @{ + */ +#define ATT_FLOW_CTRL_VIOLATED_EVENT 0x7E //!< Sent when ATT flow control is violated on a connection. This event is sent as an TMOS message defined as attFlowCtrlViolatedEvt_t. +#define ATT_MTU_UPDATED_EVENT 0x7F //!< Sent when MTU is updated for a connection. This event is sent as an TMOS message defined as attMtuUpdatedEvt_t. +/** @} End ATT_MSG_EVENT_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Size of 16-bit Bluetooth UUID +#define ATT_BT_UUID_SIZE 2 +// Size of 128-bit UUID +#define ATT_UUID_SIZE 16 + +/******************************** GATT ***********************************/ + +// GATT Attribute Access Permissions Bit Fields +#define GATT_PERMIT_READ 0x01 //!< Attribute is Readable +#define GATT_PERMIT_WRITE 0x02 //!< Attribute is Writable +#define GATT_PERMIT_AUTHEN_READ 0x04 //!< Read requires Authentication +#define GATT_PERMIT_AUTHEN_WRITE 0x08 //!< Write requires Authentication +#define GATT_PERMIT_AUTHOR_READ 0x10 //!< Read requires Authorization +#define GATT_PERMIT_AUTHOR_WRITE 0x20 //!< Write requires Authorization +#define GATT_PERMIT_ENCRYPT_READ 0x40 //!< Read requires Encryption +#define GATT_PERMIT_ENCRYPT_WRITE 0x80 //!< Write requires Encryption + +// GATT Characteristic Properties Bit Fields +#define GATT_PROP_BCAST 0x01 //!< Permits broadcasts of the Characteristic Value +#define GATT_PROP_READ 0x02 //!< Permits reads of the Characteristic Value +#define GATT_PROP_WRITE_NO_RSP 0x04 //!< Permits writes of the Characteristic Value without response +#define GATT_PROP_WRITE 0x08 //!< Permits writes of the Characteristic Value with response +#define GATT_PROP_NOTIFY 0x10 //!< Permits notifications of a Characteristic Value without acknowledgement +#define GATT_PROP_INDICATE 0x20 //!< Permits indications of a Characteristic Value with acknowledgement +#define GATT_PROP_AUTHEN 0x40 //!< Permits signed writes to the Characteristic Value +#define GATT_PROP_EXTENDED 0x80 //!< Additional characteristic properties are defined in the Characteristic Extended Properties Descriptor + +// GATT local read or write operation +#define GATT_LOCAL_READ 0xFF +#define GATT_LOCAL_WRITE 0xFE + +// GATT Encryption Key Size Limits +#define GATT_MIN_ENCRYPT_KEY_SIZE 7 //!< GATT Minimum Encryption Key Size +#define GATT_MAX_ENCRYPT_KEY_SIZE 16 //!< GATT Maximum Encryption Key Size + +// Attribute handle definitions +#define GATT_INVALID_HANDLE 0x0000 // Invalid attribute handle +#define GATT_MIN_HANDLE 0x0001 // Minimum attribute handle +#define GATT_MAX_HANDLE 0xFFFF // Maximum attribute handle + +#define GATT_MAX_MTU 0xFFFF // Maximum MTU size + +// Attribute Access Permissions +#define gattPermitRead( a ) ( (a) & GATT_PERMIT_READ ) +#define gattPermitWrite( a ) ( (a) & GATT_PERMIT_WRITE ) +#define gattPermitAuthenRead( a ) ( (a) & GATT_PERMIT_AUTHEN_READ ) +#define gattPermitAuthenWrite( a ) ( (a) & GATT_PERMIT_AUTHEN_WRITE ) +#define gattPermitAuthorRead( a ) ( (a) & GATT_PERMIT_AUTHOR_READ ) +#define gattPermitAuthorWrite( a ) ( (a) & GATT_PERMIT_AUTHOR_WRITE ) +#define gattPermitEncryptRead( a ) ( (a) & GATT_PERMIT_ENCRYPT_READ ) +#define gattPermitEncryptWrite( a ) ( (a) & GATT_PERMIT_ENCRYPT_WRITE ) + +// Check for different UUID types +#define gattPrimaryServiceType( t ) ( ATT_CompareUUID( primaryServiceUUID, ATT_BT_UUID_SIZE, (t).uuid, (t).len ) ) +#define gattSecondaryServiceType( t ) ( ATT_CompareUUID( secondaryServiceUUID, ATT_BT_UUID_SIZE, (t).uuid, (t).len ) ) +#define gattCharacterType( t ) ( ATT_CompareUUID( characterUUID, ATT_BT_UUID_SIZE, (t).uuid, (t).len ) ) +#define gattIncludeType( t ) ( ATT_CompareUUID( includeUUID, ATT_BT_UUID_SIZE, (t).uuid, (t).len ) ) +#define gattServiceType( t ) ( gattPrimaryServiceType( (t) ) || gattSecondaryServiceType( (t) ) ) +#define GATT_MAX_NUM_CONN (4) + +// GATT Client Characteristic Configuration Bit Fields +#define GATT_CLIENT_CFG_NOTIFY 0x0001 //!< The Characteristic Value shall be notified +#define GATT_CLIENT_CFG_INDICATE 0x0002 //!< The Characteristic Value shall be indicated + +#define GATT_CFG_NO_OPERATION 0x0000 // No operation + +// All profile services bit fields +#define GATT_SERVICE_DEVICE_NAME (1<<0) //!< Device Name +#define GATT_SERVICE_APPEARANCE (1<<1) //!< Appearance +#define GATT_SERVICE_PRIVACY_FLAG (1<<2) //!< Peripheral Privacy Flag +#define GATT_SERVICE_RECONN_ADDR (1<<3) //!< Reconnection Address +#define GATT_SERVICE_PERI_CONN_PARAM (1<<4) //!< Peripheral Preferred Connection Parameters (PPCP) +#define GATT_SERVICE_CENTRAL_ADDR_RL (1<<5) //!< Central Address Resolution +#define GATT_SERVICE_PRIV_ADDR_ONLY (1<<6) //!< Resolvable Private Address Only +#define GATT_SERVICE_ENCY_DATA_KEY (1<<7) //!< Encrypted Data Key Material +#define GATT_SERVICE_LE_GATT_SECU (1<<8) //!< LE GATT Security Levels + +#define GATT_SERVICES_DEFS (GATT_SERVICE_DEVICE_NAME|GATT_SERVICE_APPEARANCE|GATT_SERVICE_PERI_CONN_PARAM|GATT_SERVICE_CENTRAL_ADDR_RL) +#define GATT_ALL_SERVICES GATT_SERVICES_DEFS + +// The number of attribute records in a given attribute table +#define GATT_NUM_ATTRS( attrs ) ( sizeof( attrs ) / sizeof( gattAttribute_t ) ) + +// The handle of a service is the handle of the first attribute +#define GATT_SERVICE_HANDLE( attrs ) ( (attrs)[0].handle ) + +// The handle of the first included service (i = 1) is the value of the second attribute +#define GATT_INCLUDED_HANDLE( attrs, i ) ( *((uint16_t *)((attrs)[(i)].pValue)) ) + +// Client Characteristic Configuration table (from CCC attribute value pointer) +#define GATT_CCC_TBL( pValue ) ( (gattCharCfg_t *)(*((PTR_TYPE)(&pValue)))) + +/************************************ GAP *************************************/ +#define GAP_MSG_EVENT_DEFINES //!< GAP type of command +#define GAP_DEVICE_INIT_DONE_EVENT 0x00 //!< Sent when the Device Initialization is complete. This event is sent as an tmos message defined as gapDeviceInitDoneEvent_t. +#define GAP_DEVICE_DISCOVERY_EVENT 0x01 //!< Sent when the Device Discovery Process is complete. This event is sent as an tmos message defined as gapDevDiscEvent_t. +#define GAP_ADV_DATA_UPDATE_DONE_EVENT 0x02 //!< Sent when the Advertising Data or SCAN_RSP Data has been updated. This event is sent as an tmos message defined as gapAdvDataUpdateEvent_t. +#define GAP_MAKE_DISCOVERABLE_DONE_EVENT 0x03 //!< Sent when the Make Discoverable Request is complete. This event is sent as an tmos message defined as gapMakeDiscoverableRspEvent_t. +#define GAP_END_DISCOVERABLE_DONE_EVENT 0x04 //!< Sent when the Advertising has ended. This event is sent as an tmos message defined as gapEndDiscoverableRspEvent_t. +#define GAP_LINK_ESTABLISHED_EVENT 0x05 //!< Sent when the Establish Link Request is complete. This event is sent as an tmos message defined as gapEstLinkReqEvent_t. +#define GAP_LINK_TERMINATED_EVENT 0x06 //!< Sent when a connection was terminated. This event is sent as an tmos message defined as gapTerminateLinkEvent_t. +#define GAP_LINK_PARAM_UPDATE_EVENT 0x07 //!< Sent when an Update Parameters Event is received. This event is sent as an tmos message defined as gapLinkUpdateEvent_t. +#define GAP_RANDOM_ADDR_CHANGED_EVENT 0x08 //!< Sent when a random address was changed. This event is sent as an tmos message defined as gapRandomAddrEvent_t. +#define GAP_SIGNATURE_UPDATED_EVENT 0x09 //!< Sent when the device's signature counter is updated. This event is sent as an tmos message defined as gapSignUpdateEvent_t. +#define GAP_AUTHENTICATION_COMPLETE_EVENT 0x0A //!< Sent when the Authentication (pairing) process is complete. This event is sent as an tmos message defined as gapAuthCompleteEvent_t. +#define GAP_PASSKEY_NEEDED_EVENT 0x0B //!< Sent when a Passkey is needed. This is part of the pairing process. This event is sent as an tmos message defined as gapPasskeyNeededEvent_t. +#define GAP_SLAVE_REQUESTED_SECURITY_EVENT 0x0C //!< Sent when a Slave Security Request is received. This event is sent as an tmos message defined as gapSlaveSecurityReqEvent_t. +#define GAP_DEVICE_INFO_EVENT 0x0D //!< Sent during the Device Discovery Process when a device is discovered. This event is sent as an tmos message defined as gapDeviceInfoEvent_t. +#define GAP_BOND_COMPLETE_EVENT 0x0E //!< Sent when the bonding process is complete. This event is sent as an tmos message defined as gapBondCompleteEvent_t. +#define GAP_PAIRING_REQ_EVENT 0x0F //!< Sent when an unexpected Pairing Request is received. This event is sent as an tmos message defined as gapPairingReqEvent_t. +#define GAP_DIRECT_DEVICE_INFO_EVENT 0x10 //!< Sent when a direct Advertising Data is received. This event is sent as an tmos message defined as gapDirectDeviceInfoEvent_t. +#define GAP_PHY_UPDATE_EVENT 0x11 //!< Sent when a PHY Update Event is received. This event is sent as an tmos message defined as gapLinkUpdateEvent_t. +#define GAP_EXT_ADV_DEVICE_INFO_EVENT 0x12 //!< Sent when a Extended Advertising Data is received. This event is sent as an tmos message defined as gapExtAdvDeviceInfoEvent_t. +#define GAP_MAKE_PERIODIC_ADV_DONE_EVENT 0x13 //!< Sent when the Set Periodic Advertising enable is complete. This event is sent as an tmos message defined as gapMakePeriodicRspEvent_t. +#define GAP_END_PERIODIC_ADV_DONE_EVENT 0x14 //!< Sent when the Set Periodic Advertising disable is complete. This event is sent as an tmos message defined as gapEndPeriodicRspEvent_t. +#define GAP_SYNC_ESTABLISHED_EVENT 0x15 //!< Sent when a Periodic Advertising Sync Establish is complete. This event is sent as an tmos message defined as gapSyncEstablishedEvent_t. +#define GAP_PERIODIC_ADV_DEVICE_INFO_EVENT 0x16 //!< Sent when a Periodic Advertising Data is received. This event is sent as an tmos message defined as gapPeriodicAdvDeviceInfoEvent_t. +#define GAP_SYNC_LOST_EVENT 0x17 //!< Sent when a Periodic Advertising Sync was lost. This event is sent as an tmos message defined as gapSyncLostEvent_t. +#define GAP_SCAN_REQUEST_EVENT 0x19 //!< Sent when a SCAN_REQ PDU or an AUX_SCAN_REQ PDU has been received by the advertiser. This event is sent as an tmos message defined as gapScanReqReseiveEvent_t. +#define GAP_OOB_NEEDED_EVENT 0x1A //!< resv +#define GAP_MAKE_CONNECTIONESS_CTE_DONE_EVENT 0x1B //!< Sent when the Set Connectionless CTE Transmit enable is complete. This event is sent as an tmos message defined as gapMakeConnectionlessCTERspEvent_t. +#define GAP_END_CONNECTIONESS_CTE_DONE_EVENT 0x1C //!< Sent when the Set Connectionless CTE Transmit disable is complete. This event is sent as an tmos message defined as gapEndConnectionlessCTERspEvent_t. +#define GAP_PERI_ADV_SYNC_TRAN_RECEIVED_EVENT 0x1D //!< Sent when the periodic advertising sync transfer received. This event is sent as an tmos message defined as gapPeriodicTranReceivec_t. + + +#define GAP_PERI_ADV_SUBEVENT_DATA_REQ_EVENT 0x27 //!< Sent when the Controller +#define GAP_PERI_ADV_RESPONSE_REPORT_EVENT 0x28 //!< Sent when one or more devices have responded to a periodic advertising subevent during a PAwR train. This event is sent as an tmos message defined as gapPeriodicAdvResponseEvent_t. + + +// GAP_PROFILE_ROLE_DEFINES GAP Profile Roles +#define GAP_PROFILE_BROADCASTER 0x01 //!< A device that sends advertising events only. +#define GAP_PROFILE_OBSERVER 0x02 //!< A device that receives advertising events only. +#define GAP_PROFILE_PERIPHERAL 0x04 //!< A device that accepts the establishment of an LE physical link using the connection establishment procedure +#define GAP_PROFILE_CENTRAL 0x08 //!< A device that supports the Central role initiates the establishment of a physical connection + +// GAP Status Return Values - returned as bStatus_t +#define bleGAPUserCanceled 0x30 //!< The user canceled the task +#define bleGAPConnNotAcceptable 0x31 //!< The connection was not accepted +#define bleGAPBondRejected 0x32 //!< The bond information was rejected. +#define bleGAPExpiredCanceled 0x33 //!< The duration has expired + +#define GAP_DEVICE_NAME_LEN 21 //!< Excluding null-terminate char +#define GAP_DEVICE_NAME_MAX_LEN 248 //!< maximum length of device name + +// option defined +#define LISTEN_PERIODIC_ADVERTISING_MODE (1<<0) //!< used to determine whether the Periodic Advertiser List is used +#define REPORTING_INITIALLY_DISABLED (1<<1) //!< 0: Reporting initially enabled 1: Reporting initially disabled +#define DUPLICATE_FILTERING_INITIALLY_ENABLED (1<<2) //!< 0: Duplicate filtering initially disabled 1: Duplicate filtering initially enabled + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ +#define GAP_CONNHANDLE_INIT 0xFFFE //!< terminates a link create +#define GAP_CONNHANDLE_ALL 0xFFFF //!< terminates all links for the matching task ID. +/** @} End GAP_CONN_HANDLE_DEFINES */ + +// Privacy Flag States +#define GAP_PRIVACY_DISABLED 0x00 +#define GAP_PRIVACY_ENABLED 0x01 + +// GAP GATT Server Parameters used with GGS Get/Set Parameter and Application's Callback functions +#define GGS_DEVICE_NAME_ATT 0 //!< RW uint8_t[GAP_DEVICE_NAME_LEN] +#define GGS_APPEARANCE_ATT 1 //!< RW uint16_t +#define GGS_PERI_PRIVACY_FLAG_ATT 2 //!< RW uint8_t +#define GGS_RECONNCT_ADDR_ATT 3 //!< RW uint8_t[B_ADDR_LEN] +#define GGS_PERI_CONN_PARAM_ATT 4 //!< RW sizeof(gapPeriConnectParams_t) +#define GGS_CENT_ADDR_RES_ATT 5 //!< RW uint8_t +#define GGS_RL_PRIVATE_ADDR_ONLY 6 //!< RW uint8_t +#define GGS_ENC_DATA_KEY_MATERIAL 7 //!< RW sizeof(gapEncDataKey_t) +#define GGS_LE_GATT_SEC_LEVELS 8 //!< RW uint8_t + +#define GGS_PERI_PRIVACY_FLAG_PROPS 0X42 //!< RW uint8_t + +#define GGS_W_PERMIT_DEVICE_NAME_ATT 0x80 //!< W uint8_t +#define GGS_W_PERMIT_APPEARANCE_ATT 0x81 //!< W uint8_t +#define GGS_W_PERMIT_PRIVACY_FLAG_ATT 0x82 //!< W uint8_t + +// GAP_PARAMETER_ID_DEFINES GAP Parameter IDs +// Timers +#define TGAP_GEN_DISC_ADV_MIN 0 //!< Minimum time to remain advertising, when in Discoverable mode.Default 0-turns off the timeout. (n * 0.625 mSec). +#define TGAP_LIM_ADV_TIMEOUT 1 //!< Maximum time to remain advertising, when in Limited Discoverable mode.Default 180 seconds. (n * 1 seconds) +#define TGAP_DISC_SCAN 2 //!< Minimum time to perform scanning,Setting this parameter to 0 turns off the timeout.Default 10.24seconds. (n * 0.625 mSec) + +// when in General Discovery process +#define TGAP_DISC_ADV_INT_MIN 3 //!< Minimum advertising interval.Default 160. (n * 0.625 mSec) +#define TGAP_DISC_ADV_INT_MAX 4 //!< Maximum advertising interval.Default 160. (n * 0.625 mSec) +#define TGAP_DISC_SCAN_INT 5 //!< Scan interval used during Link Layer Scanning state.Default 16. (n * 0.625 mSec) +#define TGAP_DISC_SCAN_WIND 6 //!< Scan window used during Link Layer Scanning state.Default 16. (n * 0.625 mSec) + +// when in Connection Establishment process(1M PHY) +#define TGAP_CONN_EST_INT_MIN 7 //!< Minimum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_INT_MAX 8 //!< Maximum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_SCAN_INT 9 //!< Scan interval used during Link Layer Initiating state.Default 16. (n * 0.625 mSec) +#define TGAP_CONN_EST_SCAN_WIND 10 //!< Scan window used during Link Layer Initiating state.Default 16. (n * 0.625 mSec) +#define TGAP_CONN_EST_HIGH_SCAN_INT 11 //!< Scan interval used during Link Layer Initiating state, high duty scan cycle scan parameters (n * 0.625 mSec) +#define TGAP_CONN_EST_HIGH_SCAN_WIND 12 //!< Scan window used during Link Layer Initiating state, high duty scan cycle scan parameters (n * 0.625 mSec) +#define TGAP_CONN_EST_SUPERV_TIMEOUT 13 //!< Link Layer connection supervision timeout.Default 2000. (n * 10 mSec) +#define TGAP_CONN_EST_LATENCY 14 //!< Link Layer connection slave latency.Default 0. (in number of connection events) +#define TGAP_CONN_EST_MIN_CE_LEN 15 //!< Local informational parameter about minimum length of connection needed.Default 0. (n * 0.625 mSec) +#define TGAP_CONN_EST_MAX_CE_LEN 16 //!< Local informational parameter about maximum length of connection needed.Default 0. (n * 0.625 mSec) + +// Proprietary +#define TGAP_PRIVATE_ADDR_INT 17 //!< Minimum Time Interval between private (resolvable) address changes.Default 900. (n * 1 seconds) +#define TGAP_SM_TIMEOUT 18 //!< SM Message Timeout (milliseconds). Default 30 seconds. +#define TGAP_SM_MIN_KEY_LEN 19 //!< SM Minimum Key Length supported. Default 7. +#define TGAP_SM_MAX_KEY_LEN 20 //!< SM Maximum Key Length supported. Default 16. +#define TGAP_FILTER_ADV_REPORTS 21 //!< Filter duplicate advertising reports. Default TRUE. +#define TGAP_SCAN_RSSI_MIN 22 //!< Minimum RSSI required for scan advertising to be reported to the app. Default -127. +#define TGAP_REJECT_CONN_PARAMS 23 //!< Whether or not to reject Connection Parameter Update Request received on Central device. Default FALSE. +#define TGAP_AUTH_TASK_ID 24 //!< Task ID override for Task Authentication control (for stack internal use only) + +// v5.x +#define TGAP_ADV_TX_POWER 25 //!< Indicates the maximum power level Range: -127 ≤ N ≤ +126 Units: dBm.Default 127(Host has no preference). +#define TGAP_ADV_PRIMARY_PHY 26 //!< Indicates the PHY on which the advertising packets are transmitted on the primary advertising channel.LE 1M/LE Coded.Default GAP_PHY_VAL_LE_1M. +#define TGAP_ADV_SECONDARY_PHY 27 //!< LE 1M/LE 2M/LE Coded. Default GAP_PHY_VAL_LE_1M. +#define TGAP_ADV_SECONDARY_MAX_SKIP 28 //!< Maximum advertising events the Controller can skip before sending the AUX_ADV_IND packets on the secondary advertising channel. Default 0. +#define TGAP_ADV_ADVERTISING_SID 29 //!< Value of the Advertising SID subfield in the ADI field of the PDU Range:0-15. Default 0. +#define TGAP_ADV_SCAN_REQ_NOTIFY 30 //!< Scan request notifications enabled.Default 0-disabled. +#define TGAP_ADV_ADVERTISING_DURATION 31 //!< Advertising duration Range: 0x0001 - 0xFFFF Time = N * 10ms. Default 0-No advertising duration. +#define TGAP_ADV_MAX_EVENTS 32 //!< indicates the maximum number of extended advertising events.Range: 0x00 - 0xFF. Default 0(No maximum number of advertising events). + +// when in General Discovery process +#define TGAP_DISC_SCAN_PHY 33 //!< LE 1M/LE Coded. Default GAP_PHY_BIT_LE_1M. +#define TGAP_DISC_SCAN_CODED_INT 34 //!< Scan interval used during Link Layer coded Scanning state, when in General Discovery process (n * 0.625 mSec) +#define TGAP_DISC_SCAN_CODED_WIND 35 //!< Scan window used during Link Layer coded Scanning state, when in General Discovery process (n * 0.625 mSec) +#define TGAP_DISC_SCAN_DURATION 36 //!< Scan duration Range: 0x0001 - 0xFFFF Time = N * 10 ms. Default 0-Scan continuously until explicitly disable. +#define TGAP_DISC_SCAN_PERIOD 37 //!< resv. + +// when in Connection Establishment process(2M PHY) +#define TGAP_CONN_EST_INT_PHY 38 //!< LE 1M/LE Coded. Default GAP_PHY_BIT_LE_1M. +#define TGAP_CONN_EST_2M_INT_MIN 39 //!< Minimum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_2M_INT_MAX 40 //!< Maximum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_2M_SUPERV_TIMEOUT 41 //!< Link Layer connection supervision timeout.Default 2000. (n * 10 mSec) +#define TGAP_CONN_EST_2M_LATENCY 42 //!< Link Layer connection slave latency.Default 0. (in number of connection events) +#define TGAP_CONN_EST_2M_MIN_CE_LEN 43 //!< Local informational parameter about minimum length of connection needed.Default 0. (n * 0.625 mSec) +#define TGAP_CONN_EST_2M_MAX_CE_LEN 44 //!< Local informational parameter about maximum length of connection needed.Default 0. (n * 0.625 mSec) + +// when in Connection Establishment process(Coded PHY) +#define TGAP_CONN_EST_CODED_INT_MIN 45 //!< Minimum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_CODED_INT_MAX 46 //!< Maximum Link Layer connection interval.Default 80. (n * 1.25 mSec) +#define TGAP_CONN_EST_CODED_SCAN_INT 47 //!< Scan interval used during Link Layer Initiating state.Default 16. (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_SCAN_WIND 48 //!< Scan window used during Link Layer Initiating state.Default 16. (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_HIGH_SCAN_INT 49 //!< Scan interval used during Link Layer Initiating state, high duty scan cycle scan parameters (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_HIGH_SCAN_WIND 50 //!< Scan window used during Link Layer Initiating state, high duty scan cycle scan parameters (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_SUPERV_TIMEOUT 51 //!< Link Layer connection supervision timeout.Default 2000. (n * 10 mSec) +#define TGAP_CONN_EST_CODED_LATENCY 52 //!< Link Layer connection slave latency.Default 0. (in number of connection events) +#define TGAP_CONN_EST_CODED_MIN_CE_LEN 53 //!< Local informational parameter about minimum length of connection needed.Default 0. (n * 0.625 mSec) +#define TGAP_CONN_EST_CODED_MAX_CE_LEN 54 //!< Local informational parameter about maximum length of connection needed.Default 0. (n * 0.625 mSec) + +// periodic advertising +#define TGAP_PERIODIC_ADV_INT_MIN 55 //!< Minimum periodic advertising interval.Range: 0x0006 to 0xFFFF.Default 160. (n * 1.25 mSec) +#define TGAP_PERIODIC_ADV_INT_MAX 56 //!< Maximum periodic advertising interval.Range: 0x0006 to 0xFFFF.Default 160. (n * 1.25 mSec) +#define TGAP_PERIODIC_ADV_PROPERTIES 57 //!< Include TxPower in the periodic advertising PDU. + +#define TGAP_SCAN_MAX_LENGTH 58 //!< Extended scan maximum data length.Default 460 +#define TGAP_AFH_CHANNEL_MDOE 59 //!< whether t he Controller's channel assessment scheme is enabled or disabled.Default disabled. + +// Constant Tone Extension Transmit +#define TGAP_CTE_TYPE 60 //!< The type of Constant Tone Extension.Default GAP_CTE_TYPE_AOA. +#define TGAP_CTE_LENGTH 61 //!< The type of Constant Tone Extension.Default 20.Range[2,20] +#define TGAP_CTE_COUNT 62 //!< resv +#define TGAP_LENGTH_OF_SWITCHING_PATTERN 63 //!< The number of Antenna IDs in the pattern,only used when transmitting an AoD Constant Tone Extension.Default 0. + +// Advertising Coding Selection +#define TGAP_ADV_PRIMARY_PHY_OPTIONS 64 //!< Indicate the Host's preference or requirement concerning coding scheme.Default GAP_PHY_OPTIONS_NOPRE. +#define TGAP_ADV_SECONDARY_PHY_OPTIONS 65 //!< indicate the Host's preference or requirement concerning coding scheme (including for periodic advertising).Default GAP_PHY_OPTIONS_NOPRE. + +#define TGAP_ADV_RSP_RSSI_MIN 66 //!< The minimum RSSI for advertising to send scanning response. Default -127. + +#define TGAP_PARAMID_MAX 67 //!< ID MAX-valid Parameter ID + +// GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes +#define DEVDISC_MODE_NONDISCOVERABLE 0x00 //!< No discoverable setting +#define DEVDISC_MODE_GENERAL 0x01 //!< General Discoverable devices +#define DEVDISC_MODE_LIMITED 0x02 //!< Limited Discoverable devices +#define DEVDISC_MODE_ALL 0x03 //!< Not filtered + +// GAP_ADDR_TYPE_DEFINES GAP Address Types +#define ADDRTYPE_PUBLIC 0x00 //!< Use the BD_ADDR +#define ADDRTYPE_STATIC 0x01 //!< Static address +#define ADDRTYPE_PRIVATE_NONRESOLVE 0x02 //!< Generate Non-Resolvable Private Address +#define ADDRTYPE_PRIVATE_RESOLVE 0x03 //!< Generate Resolvable Private Address + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertising Event Types +#define GAP_ADTYPE_ADV_IND 0x00 //!< Connectable undirected event typet +#define GAP_ADTYPE_ADV_HDC_DIRECT_IND 0x01 //!< Connectable high duty cycle directed event type +#define GAP_ADTYPE_ADV_SCAN_IND 0x02 //!< Scannable undirected event type +#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected event type +#define GAP_ADTYPE_ADV_LDC_DIRECT_IND 0x04 //!< Connectable low duty cycle directed event type +//v5.x +#define GAP_ADTYPE_EXT_CONN_DIRECT 0x05 //!< extend Connectable directed event type +#define GAP_ADTYPE_EXT_SCAN_UNDIRECT 0x06 //!< extend Scannable undirected event type +#define GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT 0x07 //!< extend Non-Connectable and Non-Scannable undirected event type +#define GAP_ADTYPE_EXT_CONN_UNDIRECT 0x08 //!< extend Connectable undirected event type +#define GAP_ADTYPE_EXT_SCAN_DIRECT 0x09 //!< extend Scannable directed event type +#define GAP_ADTYPE_EXT_NONCONN_NONSCAN_DIRECT 0x0A //!< extend Non-Connectable and Non-Scannable directed event type + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertising PHY VAL TYPE(GAP_PHY_VAL_TYPE) +#define GAP_PHY_VAL_TYPE +#define GAP_PHY_VAL_LE_1M 0x01 +#define GAP_PHY_VAL_LE_2M 0x02 +#define GAP_PHY_VAL_LE_CODED 0x03 + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Scan PHY VAL TYPE(GAP_PHY_BIT_TYPE) +#define GAP_PHY_BIT_TYPE +#define GAP_PHY_BIT_LE_1M (1<<0) +#define GAP_PHY_BIT_LE_2M (1<<1) +#define GAP_PHY_BIT_LE_CODED (1<<2) +#define GAP_PHY_BIT_ALL (GAP_PHY_BIT_LE_1M|GAP_PHY_BIT_LE_2M|GAP_PHY_BIT_LE_CODED) +#define GAP_PHY_BIT_LE_CODED_S2 (1<<3) + +// PHY_OPTIONS preferred coding when transmitting on the LE Coded PHY +#define GAP_PHY_OPTIONS_TYPE +#define GAP_PHY_OPTIONS_NOPRE 0x00 //!< 0:no preferred +#define GAP_PHY_OPTIONS_S2 0x01 //!< prefers that S=2 coding be used when transmitting on the LE Coded PHY +#define GAP_PHY_OPTIONS_S8 0x02 //!< prefers that S=8 coding be used when transmitting on the LE Coded PHY +#define GAP_PHY_OPTIONS_S2_REQUIRES 0x03 //!< requires that S=2 coding be used when transmitting on the LE Coded PHY +#define GAP_PHY_OPTIONS_S8_REQUIRES 0x04 //!< requires that S=8 coding be used when transmitting on the LE Coded PHY + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Periodic Advertising Properties +#define GAP_PERI_PROPERTIES_INCLUDE_TXPOWER (1<<6) + +// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Connectionless CTE Transmit CTE type +#define GAP_CTE_TYPE_AOA 0x00 //!< AoA Constant Tone Extension +#define GAP_CTE_TYPE_AOD_1US 0x01 //!< AoD Constant Tone Extension with 1us slots +#define GAP_CTE_TYPE_AOD_2US 0x02 //!< AoD Constant Tone Extension with 2us slots + +// GAP Advertising Report Event Types +#define GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES +// bit0 to 4 ADVERTISEMENT_TYPE:defined for gapExtAdvDeviceInfoEvent_t Advertisement data type +#define GAP_ADRPT_ADV_IND 0x00 //!< Connectable undirected advertisement +#define GAP_ADRPT_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement +#define GAP_ADRPT_ADV_SCAN_IND 0x02 //!< Scannable undirected advertisement +#define GAP_ADRPT_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected advertisement +#define GAP_ADRPT_SCAN_RSP 0x04 //!< Scan Response +#define GAP_ADRPT_EXT_CONN_DIRECT 0x05 //!< extend Connectable directed report type +#define GAP_ADRPT_EXT_SCAN_UNDIRECT 0x06 //!< extend Scannable undirected report type +#define GAP_ADRPT_EXT_NONCONN_NONSCAN_UNDIRECT 0x07 //!< extend Non-Connectable and Non-Scannable undirected report type +#define GAP_ADRPT_EXT_CONN_UNDIRECT 0x08 //!< extend Connectable undirected report type +#define GAP_ADRPT_EXT_SCAN_DIRECT 0x09 //!< extend Scannable directed report type +#define GAP_ADRPT_EXT_NONCONN_NONSCAN_DIRECT 0x0A //!< extend Non-Connectable and Non-Scannable directed report type +#define GAP_ADRPT_EXT_SCAN_RESPONSE 0x0B //!< extend Scan Response report type +// bit5 to 6 Data status:defined for gapExtAdvDeviceInfoEvent_t Advertisement data type +#define GAP_ADRPT_EXT_DATA_MASK (3<<5) +#define GAP_ADRPT_EXT_DATA_COMPLETE (0<<5) //!< Complete +#define GAP_ADRPT_EXT_DATA_INCOMPLETE (1<<5) //!< more data to come +#define GAP_ADRPT_EXT_DATA_LAST (2<<5) //!< Incomplete, data truncated, no more to come + +// GAP_EXTEND_ADVERTISEMENT_REPORT_TYPE_DEFINES GAP Extend Advertising Report Event Types +#define GAP_ADRPT_ADV_CONNECTABLE (1<<0) +#define GAP_ADRPT_ADV_SCANNABLE (1<<1) +#define GAP_ADRPT_ADV_DITECTED (1<<2) +#define GAP_ADRPT_SCAN_RESPONSE (1<<3) + +// GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters +#define GAP_FILTER_POLICY_ALL 0x00 //!< Allow Scan Request from Any, Allow Connect Request from Any (default). +#define GAP_FILTER_POLICY_WHITE_SCAN 0x01 //!< Allow Scan Request from White List Only, Allow Connect from Any +#define GAP_FILTER_POLICY_WHITE_CON 0x02 //!< Allow Scan Request from Any, Connect from White List Only +#define GAP_FILTER_POLICY_WHITE 0x03 //!< Allow Scan Request and Connect from White List Only + +// Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. +#define GAP_PASSCODE_MAX 999999 + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ +#define GAP_INIT_SIGN_COUNTER 0xFFFFFFFF + +// GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map +#define GAP_ADVCHAN_37 0x01 //!< Advertisement Channel 37 +#define GAP_ADVCHAN_38 0x02 //!< Advertisement Channel 38 +#define GAP_ADVCHAN_39 0x04 //!< Advertisement Channel 39 +#define GAP_ADVCHAN_ALL (GAP_ADVCHAN_37 | GAP_ADVCHAN_38 | GAP_ADVCHAN_39) //!< All Advertisement Channels Enabled + +// GAP_ADTYPE_DEFINES GAP Advertisement Data Types +#define GAP_ADTYPE_FLAGS 0x01 //!< Discovery Mode: @ref GAP_ADTYPE_FLAGS_MODES +#define GAP_ADTYPE_16BIT_MORE 0x02 //!< Service: More 16-bit UUIDs available +#define GAP_ADTYPE_16BIT_COMPLETE 0x03 //!< Service: Complete list of 16-bit UUIDs +#define GAP_ADTYPE_32BIT_MORE 0x04 //!< Service: More 32-bit UUIDs available +#define GAP_ADTYPE_32BIT_COMPLETE 0x05 //!< Service: Complete list of 32-bit UUIDs +#define GAP_ADTYPE_128BIT_MORE 0x06 //!< Service: More 128-bit UUIDs available +#define GAP_ADTYPE_128BIT_COMPLETE 0x07 //!< Service: Complete list of 128-bit UUIDs +#define GAP_ADTYPE_LOCAL_NAME_SHORT 0x08 //!< Shortened local name +#define GAP_ADTYPE_LOCAL_NAME_COMPLETE 0x09 //!< Complete local name +#define GAP_ADTYPE_POWER_LEVEL 0x0A //!< TX Power Level: -127 to +127 dBm +#define GAP_ADTYPE_OOB_CLASS_OF_DEVICE 0x0D //!< Simple Pairing OOB Tag: Class of device (3 octets) +#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_HASHC 0x0E //!< Simple Pairing OOB Tag: Simple Pairing Hash C (16 octets) +#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_RANDR 0x0F //!< Simple Pairing OOB Tag: Simple Pairing Randomizer R (16 octets) +#define GAP_ADTYPE_SM_TK 0x10 //!< Security Manager TK Value +#define GAP_ADTYPE_SM_OOB_FLAG 0x11 //!< Security Manager OOB Flags +#define GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE 0x12 //!< Min and Max values of the connection interval (2 octets Min, 2 octets Max) (0xFFFF indicates no conn interval min or max) +#define GAP_ADTYPE_SIGNED_DATA 0x13 //!< Signed Data field +#define GAP_ADTYPE_SERVICES_LIST_16BIT 0x14 //!< Service Solicitation: list of 16-bit Service UUIDs +#define GAP_ADTYPE_SERVICES_LIST_128BIT 0x15 //!< Service Solicitation: list of 128-bit Service UUIDs +#define GAP_ADTYPE_SERVICE_DATA 0x16 //!< Service Data - 16-bit UUID +#define GAP_ADTYPE_PUBLIC_TARGET_ADDR 0x17 //!< Public Target Address +#define GAP_ADTYPE_RANDOM_TARGET_ADDR 0x18 //!< Random Target Address +#define GAP_ADTYPE_APPEARANCE 0x19 //!< Appearance +#define GAP_ADTYPE_ADV_INTERVAL 0x1A //!< Advertising Interval +#define GAP_ADTYPE_LE_BD_ADDR 0x1B //!< LE Bluetooth Device Address +#define GAP_ADTYPE_LE_ROLE 0x1C //!< LE Role +#define GAP_ADTYPE_SIMPLE_PAIRING_HASHC_256 0x1D //!< Simple Pairing Hash C-256 +#define GAP_ADTYPE_SIMPLE_PAIRING_RANDR_256 0x1E //!< Simple Pairing Randomizer R-256 +#define GAP_ADTYPE_SERVICE_DATA_32BIT 0x20 //!< Service Data - 32-bit UUID +#define GAP_ADTYPE_SERVICE_DATA_128BIT 0x21 //!< Service Data - 128-bit UUID +#define GAP_ADTYPE_LE_SC_CONFIRMATION_VALUE 0x22 //!< LE Secure Connections Confirmation Value +#define GAP_ADTYPE_LE_SC_RANDOM_VALUE 0x23 //!< LE Secure Connections Random Value +#define GAP_ADTYPE_URI 0x24 //!< URI +#define GAP_ADTYPE_INDOOR_POSITION 0x25 //!< Indoor Positioning Service v1.0 or later +#define GAP_ADTYPE_TRAN_DISCOVERY_DATA 0x26 //!< Transport Discovery Service v1.0 or later +#define GAP_ADTYPE_SUPPORTED_FEATURES 0x27 //!< LE Supported Features +#define GAP_ADTYPE_CHANNEL_MAP_UPDATE 0x28 //!< Channel Map Update Indication +#define GAP_ADTYPE_PB_ADV 0x29 //!< PB-ADV. Mesh Profile Specification Section 5.2.1 +#define GAP_ADTYPE_MESH_MESSAGE 0x2A //!< Mesh Message. Mesh Profile Specification Section 3.3.1 +#define GAP_ADTYPE_MESH_BEACON 0x2B //!< Mesh Beacon. Mesh Profile Specification Section 3.9 +#define GAP_ADTYPE_BIG_INFO 0x2C //!< BIGInfo +#define GAP_ADTYPE_BROADCAST_CODE 0x2D //!< Broadcast_Code +#define GAP_ADTYPE_RSL_SET_IDENT 0x2E //!< Resolvable Set Identifier.Coordinated Set Identification Profile 1.0 +#define GAP_ADTYPE_ADV_INTERVAL_LONG 0x2F //!< Advertising Interval - long +#define GAP_ADTYPE_BROADCAST_NAME 0x30 //!< Public Broadcast Profile v1.0 or later +#define GAP_ADTYPE_ENCRYPTED_ADV_DATA 0x31 //!< Core Specification Supplement, Part A, Section 1.23 +#define GAP_ADTYPE_PERI_ADV_RSP_TIMING_INFO 0x32 //!< Periodic Advertising Response Timing Information +#define GAP_ADTYPE_ELECTRONIC_SHELF_LABEL 0x34 //!< ESL Profile +#define GAP_ADTYPE_3D_INFO_DATA 0x3D //!< 3D Information Data +#define GAP_ADTYPE_MANUFACTURER_SPECIFIC 0xFF //!< Manufacturer Specific Data: first 2 octets contain the Company Identifier Code followed by the additional manufacturer specific data + +// GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes +#define GAP_ADTYPE_FLAGS_LIMITED 0x01 //!< Discovery Mode: LE Limited Discoverable Mode +#define GAP_ADTYPE_FLAGS_GENERAL 0x02 //!< Discovery Mode: LE General Discoverable Mode +#define GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED 0x04 //!< Discovery Mode: BR/EDR Not Supported + +// GAP_APPEARANCE_VALUES GAP Appearance Values +#define GAP_APPEARE_UNKNOWN 0x0000 //!< Unknown +#define GAP_APPEARE_GENERIC_PHONE 0x0040 //!< Generic Phone +#define GAP_APPEARE_GENERIC_COMPUTER 0x0080 //!< Generic Computer +#define GAP_APPEARE_GENERIC_WATCH 0x00C0 //!< Generic Watch +#define GAP_APPEARE_WATCH_SPORTS 0x00C1 //!< Watch: Sports Watch +#define GAP_APPEARE_GENERIC_CLOCK 0x0100 //!< Generic Clock +#define GAP_APPEARE_GENERIC_DISPLAY 0x0140 //!< Generic Display +#define GAP_APPEARE_GENERIC_RC 0x0180 //!< Generic Remote Control +#define GAP_APPEARE_GENERIC_EYE_GALSSES 0x01C0 //!< Generic Eye-glasses +#define GAP_APPEARE_GENERIC_TAG 0x0200 //!< Generic Tag +#define GAP_APPEARE_GENERIC_KEYRING 0x0240 //!< Generic Keyring +#define GAP_APPEARE_GENERIC_MEDIA_PLAYER 0x0280 //!< Generic Media Player +#define GAP_APPEARE_GENERIC_BARCODE_SCANNER 0x02C0 //!< Generic Barcode Scanner +#define GAP_APPEARE_GENERIC_THERMOMETER 0x0300 //!< Generic Thermometer +#define GAP_APPEARE_GENERIC_THERMO_EAR 0x0301 //!< Thermometer: Ear +#define GAP_APPEARE_GENERIC_HR_SENSOR 0x0340 //!< Generic Heart rate Sensor +#define GAP_APPEARE_GENERIC_HRS_BELT 0x0341 //!< Heart Rate Sensor: Heart Rate Belt +#define GAP_APPEARE_GENERIC_BLOOD_PRESSURE 0x0380 //!< Generic Blood Pressure +#define GAP_APPEARE_GENERIC_BP_ARM 0x0381 //!< Blood Pressure: Arm +#define GAP_APPEARE_GENERIC_BP_WRIST 0x0382 //!< Blood Pressure: Wrist +#define GAP_APPEARE_GENERIC_HID 0x03C0 //!< Generic Human Interface Device (HID) +#define GAP_APPEARE_HID_KEYBOARD 0x03C1 //!< HID Keyboard +#define GAP_APPEARE_HID_MOUSE 0x03C2 //!< HID Mouse +#define GAP_APPEARE_HID_JOYSTIC 0x03C3 //!< HID Joystick +#define GAP_APPEARE_HID_GAMEPAD 0x03C4 //!< HID Gamepad +#define GAP_APPEARE_HID_DIGITIZER_TYABLET 0x03C5 //!< HID Digitizer Tablet +#define GAP_APPEARE_HID_DIGITAL_CARDREADER 0x03C6 //!< HID Card Reader +#define GAP_APPEARE_HID_DIGITAL_PEN 0x03C7 //!< HID Digital Pen +#define GAP_APPEARE_HID_BARCODE_SCANNER 0x03C8 //!< HID Barcode Scanner + +/************************************gapRole***********************************/ +// GAPROLE_PROFILE_PARAMETERS GAP Role Manager Parameters +#define GAPROLE_PROFILEROLE 0x300 //!< Reading this parameter will return GAP Role type. Read Only. Size is uint8_t. +#define GAPROLE_IRK 0x301 //!< Identity Resolving Key. Read/Write. Size is uint8_t[KEYLEN]. Default is all 0, which means that the IRK will be randomly generated. +#define GAPROLE_SRK 0x302 //!< Signature Resolving Key. Read/Write. Size is uint8_t[KEYLEN]. Default is all 0, which means that the SRK will be randomly generated. +#define GAPROLE_SIGNCOUNTER 0x303 //!< Sign Counter. Read/Write. Size is uint32_t. Default is 0. +#define GAPROLE_BD_ADDR 0x304 //!< Device's Address. Read Only. Size is uint8_t[B_ADDR_LEN]. This item is read from the controller. +#define GAPROLE_ADVERT_ENABLED 0x305 //!< Enable/Disable Advertising. Read/Write. Size is uint8_t. Default is TRUE=Enabled. +#define GAPROLE_ADVERT_DATA 0x306 //!< Advertisement Data. Read/Write. Max size is B_MAX_ADV_EXT_LEN. Default to all 0. +#define GAPROLE_SCAN_RSP_DATA 0x307 //!< Scan Response Data. Read/Write. Max size is B_MAX_ADV_EXT_LEN. Defaults to all 0. +#define GAPROLE_ADV_EVENT_TYPE 0x308 //!< Advertisement Type. Read/Write. Size is uint8_t. Default is GAP_ADTYPE_ADV_IND. +#define GAPROLE_ADV_DIRECT_TYPE 0x309 //!< Direct Advertisement Address Type. Read/Write. Size is uint8_t. Default is ADDRTYPE_PUBLIC. +#define GAPROLE_ADV_DIRECT_ADDR 0x30A //!< Direct Advertisement Address. Read/Write. Size is uint8_t[B_ADDR_LEN]. Default is NULL. +#define GAPROLE_ADV_CHANNEL_MAP 0x30B //!< Which channels to advertise on. Read/Write Size is uint8_t. Default is GAP_ADVCHAN_ALL +#define GAPROLE_ADV_FILTER_POLICY 0x30C //!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8_t. Default is GAP_FILTER_POLICY_ALL. +#define GAPROLE_STATE 0x30D //!< Reading this parameter will return GAP Peripheral Role State. Read Only. Size is uint8_t. +#define GAPROLE_MAX_SCAN_RES 0x30E //!< Maximum number of discover scan results to receive. Default is 0 = unlimited. +#define GAPROLE_MIN_CONN_INTERVAL 0x311 //!< Minimum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16_t. Default is 7.5 milliseconds (0x0006). +#define GAPROLE_MAX_CONN_INTERVAL 0x312 //!< Maximum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16_t. Default is 4 seconds (0x0C80). +// v5.x +#define GAPROLE_PHY_TX_SUPPORTED 0x313 //!< The transmitter PHYs that the Host prefers the Controller to use.Default is GAP_PHY_BIT_ALL +#define GAPROLE_PHY_RX_SUPPORTED 0x314 //!< The receiver PHYs that the Host prefers the Controller to use.Default is GAP_PHY_BIT_ALL +#define GAPROLE_PERIODIC_ADVERT_DATA 0x315 //!< Periodic advertisement Data. Read/Write. Max size is B_MAX_ADV_PERIODIC_LEN. Default to all 0. +#define GAPROLE_PERIODIC_ADVERT_ENABLED 0x316 //!< bit0:Enable/Disable Periodic Advertising. Read/Write. Size is uint8_t. Default is FALSE=Disable. + //!< bit1:Include the ADI field in AUX_SYNC_IND PDUs +#define GAPROLE_CTE_CONNECTIONLESS_ENABLED 0x317 //!< Enable/Disable Connectionless CTE Transmit. Read/Write. Size is uint8_t. Default is FALSE=Disable. + +/************************************GAPBOND***********************************/ +// GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters +#define GAPBOND_PERI_PAIRING_MODE 0x400 //!< Pairing Mode: @ref GAPBOND_PAIRING_MODE_DEFINES. Read/Write. Size is uint8_t. Default is GAPBOND_PAIRING_MODE_WAIT_FOR_REQ. +#define GAPBOND_PERI_MITM_PROTECTION 0x401 //!< Man-In-The-Middle (MITM) basically turns on Passkey protection in the pairing algorithm. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_PERI_IO_CAPABILITIES 0x402 //!< I/O capabilities. Read/Write. Size is uint8_t. Default is GAPBOND_IO_CAP_DISPLAY_ONLY @ref GAPBOND_IO_CAP_DEFINES. +#define GAPBOND_PERI_OOB_ENABLED 0x403 //!< OOB data available for pairing algorithm. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_PERI_OOB_DATA 0x404 //!< OOB Data. Read/Write. size uint8_t[16]. Default is all 0's. +#define GAPBOND_PERI_BONDING_ENABLED 0x405 //!< Request Bonding during the pairing process if enabled. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_PERI_KEY_DIST_LIST 0x406 //!< The key distribution list for bonding. size is uint8_t. @ref GAPBOND_KEY_DIST_DEFINES. Default is 0x77. +#define GAPBOND_PERI_DEFAULT_PASSCODE 0x407 //!< The default passcode for MITM protection. size is uint32_t. Range is 0 - 999,999. Default is 0. +#define GAPBOND_CENT_PAIRING_MODE 0x408 //!< Pairing Mode: @ref GAPBOND_PAIRING_MODE_DEFINES. Read/Write. Size is uint8_t. Default is GAPBOND_PAIRING_MODE_WAIT_FOR_REQ. +#define GAPBOND_CENT_MITM_PROTECTION 0x409 //!< Man-In-The-Middle (MITM) basically turns on Passkey protection in the pairing algorithm. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_CENT_IO_CAPABILITIES 0x40A //!< I/O capabilities. Read/Write. Size is uint8_t. Default is GAPBOND_IO_CAP_DISPLAY_ONLY @ref GAPBOND_IO_CAP_DEFINES. +#define GAPBOND_CENT_OOB_ENABLED 0x40B //!< OOB data available for pairing algorithm. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_CENT_OOB_DATA 0x40C //!< OOB Data. Read/Write. size uint8_t[16]. Default is all 0's. +#define GAPBOND_CENT_BONDING_ENABLED 0x40D //!< Request Bonding during the pairing process if enabled. Read/Write. Size is uint8_t. Default is 0(disabled). +#define GAPBOND_CENT_KEY_DIST_LIST 0x40E //!< The key distribution list for bonding. size is uint8_t. @ref GAPBOND_KEY_DIST_DEFINES. Default is 0x77. +#define GAPBOND_CENT_DEFAULT_PASSCODE 0x40F //!< The default passcode for MITM protection. size is uint32_t. Range is 0 - 999,999. Default is 0. +#define GAPBOND_ERASE_ALLBONDS 0x410 //!< Erase all of the bonded devices. Write Only. No Size. +#define GAPBOND_AUTO_FAIL_PAIRING 0x411 //!< TEST MODE (DO NOT USE) to automatically send a Pairing Fail when a Pairing Request is received. Read/Write. size is uint8_t. Default is 0 (disabled). +#define GAPBOND_AUTO_FAIL_REASON 0x412 //!< TEST MODE (DO NOT USE) Pairing Fail reason when auto failing. Read/Write. size is uint8_t. Default is 0x05 (SMP_PAIRING_FAILED_NOT_SUPPORTED). +#define GAPBOND_KEYSIZE 0x413 //!< Key Size used in pairing. Read/Write. size is uint8_t. Default is 16. +#define GAPBOND_AUTO_SYNC_WL 0x414 //!< Clears the White List adds to it each unique address stored by bonds in NV. Read/Write. Size is uint8_t. Default is FALSE. +#define GAPBOND_BOND_COUNT 0x415 //!< Gets the total number of bonds stored in NV. Read Only. Size is uint8_t. Default is 0 (no bonds). +#define GAPBOND_BOND_FAIL_ACTION 0x416 //!< Possible actions Central may take upon an unsuccessful bonding. Write Only. Size is uint8_t. Default is 0x02 (Terminate link upon unsuccessful bonding). +#define GAPBOND_ERASE_SINGLEBOND 0x417 //!< Erase a single bonded device. Write only. Must provide address type followed by device address. +#define GAPBOND_BOND_AUTO 0x418 //!< Auto save bonds into FLASH. Write Only. size is uint8_t. Default is 1(enabled). +#define GAPBOND_BOND_UPDATE 0x419 //!< Save current bonds into FLASH. Write Only. No Size. +#define GAPBOND_DISABLE_SINGLEBOND 0x41A //!< Disable a single bonded device. Write only. Must provide address type followed by device address. +#define GAPBOND_ENABLE_SINGLEBOND 0x41B //!< Ensable a single bonded device. Write only. Must provide address type followed by device address. +#define GAPBOND_DISABLE_ALLBONDS 0x41C //!< Disable all of the bonded devices. Write Only. No Size. +#define GAPBOND_ENABLE_ALLBONDS 0x41D //!< Ensable all of the bonded devices. Write Only. No Size. +#define GAPBOND_ERASE_AUTO 0x41E //!< Auto erase all of the bonded devices when the maximum number is reached.Size is uint8_t. Default is 1(enabled). +#define GAPBOND_AUTO_SYNC_RL 0x41F //!< Clears the Resolving List adds to it each unique address stored by bonds in NV. Read/Write. Size is uint8_t. Default is FALSE. +#define GAPBOND_SET_ENC_PARAMS 0x420 //!< Set bonding parameters.size is bondEncParams_t. +#define GAPBOND_PERI_SC_PROTECTION 0x421 //!< Set peripheral sc enable. Default is FALSE. +#define GAPBOND_CENT_SC_PROTECTION 0x422 //!< Set central sc enable. Default is FALSE. + +// GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes +#define GAPBOND_PAIRING_MODE_NO_PAIRING 0x00 //!< Pairing is not allowed +#define GAPBOND_PAIRING_MODE_WAIT_FOR_REQ 0x01 //!< Wait for a pairing request or slave security request +#define GAPBOND_PAIRING_MODE_INITIATE 0x02 //!< Don't wait, initiate a pairing request or slave security request + +// GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities +#define GAPBOND_IO_CAP_DISPLAY_ONLY 0x00 //!< Display Only Device +#define GAPBOND_IO_CAP_DISPLAY_YES_NO 0x01 //!< Display and Yes and No Capable +#define GAPBOND_IO_CAP_KEYBOARD_ONLY 0x02 //!< Keyboard Only +#define GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT 0x03 //!< No Display or Input Device +#define GAPBOND_IO_CAP_KEYBOARD_DISPLAY 0x04 //!< Both Keyboard and Display Capable + +// GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution +#define GAPBOND_KEYDIST_SENCKEY 0x01 //!< Slave Encryption Key +#define GAPBOND_KEYDIST_SIDKEY 0x02 //!< Slave IRK and ID information +#define GAPBOND_KEYDIST_SSIGN 0x04 //!< Slave CSRK +#define GAPBOND_KEYDIST_SLINK 0x08 //!< Slave Link Key +#define GAPBOND_KEYDIST_MENCKEY 0x10 //!< Master Encrypton Key +#define GAPBOND_KEYDIST_MIDKEY 0x20 //!< Master IRK and ID information +#define GAPBOND_KEYDIST_MSIGN 0x40 //!< Master CSRK +#define GAPBOND_KEYDIST_MLINK 0x80 //!< Master Link Key + +// GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States +#define GAPBOND_PAIRING_STATE_STARTED 0x00 //!< Pairing started +#define GAPBOND_PAIRING_STATE_COMPLETE 0x01 //!< Pairing complete +#define GAPBOND_PAIRING_STATE_BONDED 0x02 //!< Devices bonded +#define GAPBOND_PAIRING_STATE_BOND_SAVED 0x03 //!< Bonding record saved in NV + +// SMP_PAIRING_FAILED_DEFINES Pairing failure status values +#define SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED 0x01 //!< The user input of the passkey failed, for example, the user cancelled the operation. +#define SMP_PAIRING_FAILED_OOB_NOT_AVAIL 0x02 //!< The OOB data is not available +#define SMP_PAIRING_FAILED_AUTH_REQ 0x03 //!< The pairing procedure can't be performed as authentication requirements can't be met due to IO capabilities of one or both devices +#define SMP_PAIRING_FAILED_CONFIRM_VALUE 0x04 //!< The confirm value doesn't match the calculated compare value +#define SMP_PAIRING_FAILED_NOT_SUPPORTED 0x05 //!< Pairing isn't supported by the device +#define SMP_PAIRING_FAILED_ENC_KEY_SIZE 0x06 //!< The resultant encryption key size is insufficient for the security requirements of this device. +#define SMP_PAIRING_FAILED_CMD_NOT_SUPPORTED 0x07 //!< The SMP command received is not supported on this device. +#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason +#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authentication procedure is disallowed because too little time has elapsed since the last pairing request or security request. +#define SMP_PAIRING_FAILED_INVALID_PARAMERERS 0x0A //!< The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range. +#define SMP_PAIRING_FAILED_DHKEY_CHECK_FAILED 0x0B //!< Indicates to the remote device that the DHKey Check value received doesn’t match the one calculated by the local device. +#define SMP_PAIRING_FAILED_NUMERIC_COMPARISON 0x0C //!< Indicates that the confirm values in the numeric comparison protocol do not match. +#define SMP_PAIRING_FAILED_KEY_REJECTED 0x0F //!< Indicates that the device chose not to accept a distributed key. + +// GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions +#define GAPBOND_FAIL_NO_ACTION 0x00 //!< Take no action upon unsuccessful bonding +#define GAPBOND_FAIL_INITIATE_PAIRING 0x01 //!< Initiate pairing upon unsuccessful bonding +#define GAPBOND_FAIL_TERMINATE_LINK 0x02 //!< Terminate link upon unsuccessful bonding +#define GAPBOND_FAIL_TERMINATE_ERASE_BONDS 0x03 //!< Terminate link and erase all existing bonds on device upon unsuccessful bonding + +// Device NV Items +#define BLE_NVID_IRK 0x0002 //!< The Device's IRK +#define BLE_NVID_CSRK 0x0003 //!< The Device's CSRK +#define BLE_NVID_SIGNCOUNTER 0x0004 //!< The Device's Sign Counter + +//!< RF Mode BOND NV IDs +#define BLE_NVID_BOND_RF_START 0x0100 //!< Start of the RF BOND NV IDs + +// Bonding NV Items - Range 0x0200 - 0x6FFF +#define BLE_NVID_GAP_BOND_START 0x0200 //!< Start of the GAP Bond Manager's NV IDs + +// GAP BOND Items +#define GAP_BOND_REC_ID_OFFSET 0 //!< NV ID for the main bonding record +#define GAP_BOND_LOCAL_LTK_OFFSET 1 //!< NV ID for the bonding record's local LTK information +#define GAP_BOND_DEV_LTK_OFFSET 2 //!< NV ID for the bonding records' device LTK information +#define GAP_BOND_DEV_IRK_OFFSET 3 //!< NV ID for the bonding records' device IRK +#define GAP_BOND_DEV_CSRK_OFFSET 4 //!< NV ID for the bonding records' device CSRK +#define GAP_BOND_DEV_SIGN_COUNTER_OFFSET 5 //!< NV ID for the bonding records' device Sign Counter +#define GAP_BOND_REC_IDS 6 + +// Macros to calculate the index/offset in to NV space +#define calcNvID(Idx, offset) (((((Idx) * GAP_BOND_REC_IDS) + (offset))) + BLE_NVID_GAP_BOND_START) +#define mainRecordNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_REC_ID_OFFSET)) +#define localLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_LOCAL_LTK_OFFSET)) +#define devLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_LTK_OFFSET)) +#define devIRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_IRK_OFFSET)) +#define devCSRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_CSRK_OFFSET)) +#define devSignCounterNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_SIGN_COUNTER_OFFSET)) + +// GATT Configuration NV Items -Range 0x7000 - 0x7FFF +#define BLE_NVID_GATT_CFG_START 0x7000 //!< Start of the GATT Configuration NV IDs + +// Macros to calculate the GATT index/offset in to NV space +// Six characteristic configuration can be saved in NV. +#define gattCfgNvID(Idx) ((Idx) + BLE_NVID_GATT_CFG_START) + +#define BLE_NVID_MAX_VAL 0x7FFF + +// Structure of NV data for the connected device's encryption information +typedef struct +{ + uint8_t LTK[KEYLEN]; //!< Long Term Key (LTK) + uint16_t div; //!< LTK eDiv + uint8_t rand[B_RANDOM_NUM_SIZE]; //!< LTK random number + uint8_t keySize; //!< LTK key size +} gapBondLTK_t; + +// Structure of NV data for the connected device's address information +typedef struct +{ + uint8_t publicAddr[B_ADDR_LEN]; //!< Central's address + uint8_t reconnectAddr[B_ADDR_LEN]; //!< Privacy Reconnection Address + uint16_t stateFlags; //!< State flags: SM_AUTH_STATE_AUTHENTICATED & SM_AUTH_STATE_BONDING + uint8_t bondsToDelete; + uint8_t publicAddrType; //!< Central's address type +} gapBondRec_t; + +// Structure of NV data for the connected device's characteristic configuration +typedef struct +{ + uint16_t attrHandle; //!< attribute handle + uint8_t value; //!< attribute value for this device +} gapBondCharCfg_t; + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + uint8_t srk[KEYLEN]; //!< Signature Resolving Key + uint32_t signCounter; //!< Sign Counter +} linkSec_t; + +typedef struct +{ + uint8_t ltk[KEYLEN]; //!< Long Term Key + uint16_t div; //!< Diversifier + uint8_t rand[B_RANDOM_NUM_SIZE]; //!< random number + uint8_t keySize; //!< LTK Key Size + uint8_t gapBondInvalid; +} encParams_t; + +typedef struct +{ + uint8_t connRole; //!< GAP Profile Roles @GAP_PROFILE_ROLE_DEFINES + uint8_t addrType; //!< Address type of connected device + uint8_t addr[B_ADDR_LEN]; //!< Other Device's address + encParams_t encParams; +} bondEncParams_t; + +typedef struct +{ + uint8_t taskID; //!< Application that controls the link + uint16_t connectionHandle; //!< Controller connection handle + uint8_t stateFlags; //!< LINK_CONNECTED, LINK_AUTHENTICATED... + uint8_t addrType; //!< Address type of connected device + uint8_t addr[B_ADDR_LEN]; //!< Other Device's address + uint8_t connRole; //!< Connection formed as central or peripheral + uint16_t connInterval; //!< The connection's interval (n * 1.25ms) + uint16_t connLatency; + uint16_t connTimeout; + uint16_t MTU; //!< The connection's MTU size + linkSec_t sec; //!< Connection Security related items + encParams_t *pEncParams; //!< pointer to LTK, ediv, rand. if needed. + uint16_t smEvtID; + void *pPairingParams; + void *pAuthLink; +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16_t connectionHandle, uint8_t changeType ); +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8_t len; //!< Length of UUID (2 or 16) + uint8_t uuid[ATT_UUID_SIZE]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8_t len; //!< Length of UUID (2) + uint8_t uuid[ATT_BT_UUID_SIZE]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8_t reqOpcode; //!< Request that generated this error response + uint16_t handle; //!< Attribute handle that generated error response + uint8_t errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16_t clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16_t serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint16_t numInfo; //!< Number of attribute handle-UUID pairs found + uint8_t format; //!< Format of information data + uint8_t *pInfo; //!< Information data whose format is determined by format field (4 to ATT_MTU_SIZE-2) +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Attribute value to find (0 to ATT_MTU_SIZE-7) +} attFindByTypeValueReq_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint16_t numInfo; //!< Number of handles information found + uint8_t *pHandlesInfo; //!< List of 1 or more handles information (4 to ATT_MTU_SIZE-1) +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint16_t numPairs; //!< Number of attribute handle-UUID pairs found + uint16_t len; //!< Size of each attribute handle-value pair + uint8_t *pDataList; //!< List of 1 or more attribute handle-value pairs (2 to ATT_MTU_SIZE-2) +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Value of the attribute with the handle given (0 to ATT_MTU_SIZE-1) +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute to be read (must be first field) + uint16_t offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Part of the value of the attribute with the handle given (0 to ATT_MTU_SIZE-1) +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint8_t *pHandles; //!< Set of two or more attribute handles (4 to ATT_MTU_SIZE-1) - must be first field + uint16_t numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint16_t len; //!< Length of values + uint8_t *pValues; //!< Set of two or more values (0 to ATT_MTU_SIZE-1) +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint16_t numGrps; //!< Number of attribute handle, end group handle and value sets found + uint16_t len; //!< Length of each attribute handle, end group handle and value set + uint8_t *pDataList; //!< List of 1 or more attribute handle, end group handle and value (4 to ATT_MTU_SIZE-2) +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute to be written (must be first field) + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Value of the attribute to be written (0 to ATT_MTU_SIZE-3) + uint8_t sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8_t cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute to be written (must be first field) + uint16_t offset; //!< Offset of the first octet to be written + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Part of the value of the attribute to be written (0 to ATT_MTU_SIZE-5) - must be allocated +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute that has been read + uint16_t offset; //!< Offset of the first octet to be written + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Part of the value of the attribute to be written (0 to ATT_MTU_SIZE-5) +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8_t flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute that has been changed (must be first field) + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Current value of the attribute (0 to ATT_MTU_SIZE-3) +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16_t handle; //!< Handle of the attribute that has been changed (must be first field) + uint16_t len; //!< Length of value + uint8_t *pValue; //!< Current value of the attribute (0 to ATT_MTU_SIZE-3) +} attHandleValueInd_t; + +/** + * ATT Flow Control Violated Event message format. This message is sent to the + * app by the local ATT Server or Client when a sequential ATT Request-Response + * or Indication-Confirmation protocol flow control is violated for a connection. + * All subsequent ATT Requests and Indications received by the local ATT Server + * and Client respectively will be dropped. + * + * This message is to inform the app (that has registered with GAP by calling + * GAP_RegisterForMsgs()) in case it wants to drop the connection. + */ +typedef struct +{ + uint8_t opcode; //!< opcode of message that caused flow control violation + uint8_t pendingOpcode; //!< opcode of pending message +} attFlowCtrlViolatedEvt_t; + +/** + * ATT MTU Updated Event message format. This message is sent to the app + * by the local ATT Server or Client when the ATT MTU size is updated for a + * connection. The default ATT MTU size is 23 octets. + * + * This message is to inform the app (that has registered with GAP by calling + * GAP_RegisterForMsgs()) about the new ATT MTU size negotiated for a connection. + */ +typedef struct +{ + uint16_t MTU; //!< new MTU size +} attMtuUpdatedEvt_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages and + * locally-generated events used between the attribute protocol and upper + * layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Value Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Value Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication + + // Locally-generated event messages + attFlowCtrlViolatedEvt_t flowCtrlEvt; //!< ATT Flow Control Violated Event + attMtuUpdatedEvt_t mtuEvt; //!< ATT MTU Updated Event +} attMsg_t; + +/** + * GATT Find By Type Value Request format. + */ +typedef struct +{ + uint16_t startHandle; //!< First requested handle number (must be first field) + uint16_t endHandle; //!< Last requested handle number + attAttrType_t value; //!< Primary service UUID value (2 or 16 octets) +} gattFindByTypeValueReq_t; + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8_t discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8_t reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + attPrepareWriteReq_t req; //!< ATT Prepare Write Request + uint16_t lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8_t reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Array of Prepare Write Requests (must be allocated) + uint8_t numReqs; //!< Number of Prepare Write Requests + uint8_t index; //!< Index of last Prepare Write Request sent + uint8_t flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * and locally-generated events used between the attribute protocol/profile and + * upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Value Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattFindByTypeValueReq_t gattFindByTypeValueReq;//!< GATT Find By Type Value Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Value Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication + + // Locally-generated event messages + attFlowCtrlViolatedEvt_t flowCtrlEvt; //!< ATT Flow Control Violated Event + attMtuUpdatedEvt_t mtuEvt; //!< ATT MTU Updated Event +} gattMsg_t; + +/** + * GATT tmos GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16_t connHandle; //!< Connection message was received on + uint8_t method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8_t len; //!< Length of UUID (2 or 16) + const uint8_t *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8_t permissions; //!< Attribute permissions + uint16_t handle; //!< Attribute handle - assigned internally by attribute server + uint8_t *pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16_t numAttrs; //!< Number of attributes in attrs + uint8_t encKeySize; //!< Minimum encryption key size required by service (7-16 bytes) + + /** Array of attribute records. + * note: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/** + * @brief Callback function prototype to read an attribute value. + * + * @note blePending can be returned ONLY for the following + * read operations: + * - Read Request: ATT_READ_REQ + * - Read Blob Request: ATT_READ_BLOB_REQ + * + * @note If blePending is returned then it's the responsibility of the application to respond to + * ATT_READ_REQ and ATT_READ_BLOB_REQ message with ATT_READ_RSP and ATT_READ_BLOB_RSP + * message respectively. + * + * @note Payload 'pValue' used with ATT_READ_RSP and ATT_READ_BLOB_RSP must be allocated using GATT_bm_alloc(). + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * @param method - type of read message + * + * @return SUCCESS: Read was successfully.
+ * blePending: A response is pending for this client.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef uint8_t (*pfnGATTReadAttrCB_t)( uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, + uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method ); + +/** + * @brief Callback function prototype to write an attribute value. + * + * @note blePending can be returned ONLY for the following + * write operations: + * - Write Request: ATT_WRITE_REQ + * - Write Command: ATT_WRITE_CMD + * - Write Long: ATT_EXECUTE_WRITE_REQ + * - Reliable Writes: Multiple ATT_PREPARE_WRITE_REQ followed by one final ATT_EXECUTE_WRITE_REQ + * + * @note If blePending is returned then it's the responsibility of the application to 1) respond to + * ATT_WRITE_REQ and ATT_EXECUTE_WRITE_REQ message with ATT_WRITE_RSP and ATT_EXECUTE_WRITE_RSP + * message respectively, and 2) free each request payload 'pValue' using BM_free(). + * + * @note Write Command (ATT_WRITE_CMD) does NOT require a response message. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * @param method - type of write message + * + * @return SUCCESS: Write was successfully.
+ * blePending: A response is pending for this client.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef uint8_t (*pfnGATTWriteAttrCB_t)( uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, + uint16_t len, uint16_t offset, uint8_t method ); + +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t opcode ); + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16_t connHandle; //!< Client connection handle + uint8_t value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/*************************************gap**************************************/ +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the central. + */ +typedef struct +{ + uint16_t intervalMin; //!< Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25ms) + uint16_t intervalMax; //!< Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25ms) + uint16_t latency; //!< Number of LL latency connection events (0x0000 - 0x03e8) + uint16_t timeout; //!< Connection Timeout (0x000A - 0x0C80 * 10ms) +} gapPeriConnectParams_t; + +typedef struct +{ + uint8_t sessionKey[16]; //!< The shared session key. + uint8_t IV[8]; //!< The initialization vector. +} gapEncDataKey_t; + +/** + * GAP event header format. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8_t devAddr[B_ADDR_LEN]; //!< Device's BD_ADDR + uint16_t dataPktLen; //!< HC_LE_Data_Packet_Length + uint8_t numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8_t addrType; //!< Device's address type for devAddr + uint8_t devAddr[B_ADDR_LEN]; //!< Device's BD_ADDR, could be own address + uint32_t signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_DEVICE_INFO_EVENT + uint8_t eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP + int8_t rssi; //!< Advertisement or SCAN_RSP RSSI + uint8_t dataLen; //!< Length (in bytes) of the data field (evtData) + uint8_t *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/** + * GAP_DIRECT_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_DIRECT_DEVICE_INFO_EVENT + uint8_t eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP + uint8_t directAddrType; //!< public or random address type + uint8_t directAddr[B_ADDR_LEN]; //!< device address + int8_t rssi; //!< Advertisement or SCAN_RSP RSSI +} gapDirectDeviceInfoEvent_t; + +/** + * GAP_EXT_ADV_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_EXT_ADV_DEVICE_INFO_EVENT + uint8_t eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP + uint8_t primaryPHY; //!< Advertiser PHY on the primary advertising channel + uint8_t secondaryPHY; //!< Advertiser PHY on the secondary advertising channel + uint8_t advertisingSID; //!< Value of the Advertising SID subfield in the ADI field of the PDU + int8_t txPower; //!< Advertisement or SCAN_RSP power + int8_t rssi; //!< Advertisement or SCAN_RSP RSSI + uint16_t periodicAdvInterval; //!< the interval of periodic advertising + uint8_t directAddressType; //!< public or random address type + uint8_t directAddress[B_ADDR_LEN]; //!< device address + uint8_t dataLen; //!< Length (in bytes) of the data field (evtData) + uint8_t *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapExtAdvDeviceInfoEvent_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8_t taskID; //!< Requesting App's Task ID, used to return results + uint8_t mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8_t activeScan; //!< TRUE for active scanning + uint8_t whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device. + */ +typedef struct +{ + uint8_t eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8_t numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_PERIODIC_ADVERTISING_DONE_EVENT message format. This message is sent to the + * app when the Periodic Advertising config is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERIODIC_ADVERTISING_DONE_EVENT +} gapMakePeriodicRspEvent_t; + +/** + * GAP_END_PERIODIC_ADV_DONE_EVENT message format. This message is sent to the + * app when the Periodic Advertising disable is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_END_PERIODIC_ADV_DONE_EVENT +} gapEndPeriodicRspEvent_t; + +/** + * GAP_SYNC_ESTABLISHED_EVENT message format. This message is sent to the + * app when the Periodic Advertising Sync Establish is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_SYNC_ESTABLISHED_EVENT + uint8_t status; //!< Periodic advertising sync status + uint16_t syncHandle; //!< Identifying the periodic advertising train + uint8_t advertisingSID; //!< Value of the Advertising SID subfield in the ADI field of the PDU + uint8_t devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t devAddr[B_ADDR_LEN]; //!< Device address of sync + uint8_t advertisingPHY; //!< Advertiser PHY + uint16_t periodicInterval; //!< Periodic advertising interval + uint8_t clockAccuracy; //!< Clock Accuracy + uint8_t numSubevents; //!< Number of subevents.0x00-No subevents + uint8_t subInterval; //!< Subevent interval.0x00-No subevents + uint8_t rspSlotDelay; //!< Response slot delay.0x00-No response slots + uint8_t rspSlotSpacing; //!< Response slot spacing.0x00-No response slots +} gapSyncEstablishedEvent_t; + +/** + * GAP_PERIODIC_ADV_DEVICE_INFO_EVENT message format. This message is sent to the + * app during Periodic Advertising Sync, when received a Periodic Advertising packet + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERIODIC_ADV_DEVICE_INFO_EVENT + uint16_t syncHandle; //!< Identifying the periodic advertising train + int8_t txPower; //!< Periodic advertising tx power,Units: dBm + int8_t rssi; //!< Periodic advertising rssi,Units: dBm + uint8_t unUsed; + uint16_t eventCounter; //!< The value of paEventCounter for the reported periodic advertising packet + uint8_t subevent; //!< The subevent number. 0xFF: No subevents + uint8_t dataStatus; //!< Data complete + uint8_t dataLength; //!< Length (in bytes) of the data field (evtData) + uint8_t *pEvtData; //!< Data field of periodic advertising data +} gapPeriodicAdvDeviceInfoEvent_t; + +/** + * GAP_SYNC_LOST_EVENT message format. This message is sent to the + * app when the Periodic Advertising Sync timeout period. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_SYNC_LOST_EVENT + uint16_t syncHandle; //!< Identifying the periodic advertising train +} gapSyncLostEvent_t; + +#define PKT_TRANSMITTED 0x00 +#define PKT_NOT_TRANSMITTED 0x01 + +typedef struct +{ + uint8_t taskID; //!< set periodic advertising task ID + uint8_t enable; //!< bit0 Enable periodic advertising + //!< bit1 Include the ADI field in AUX_SYNC_IND PDUs + uint8_t advHandle; //!< Used to identify a periodic advertising train + uint16_t advIntervalMin; //!< Minimum advertising interval for periodic advertising.Time = N × 1.25ms.Time Range: 7.5ms to 81.91875s + uint16_t advIntervalMax; //!< Maximum advertising interval for periodic advertising.Time = N × 1.25ms.Time Range: 7.5ms to 81.91875s + uint16_t advProperties; //!< bit6 Include TxPower in the advertising PDU + uint8_t numSubevents; //!< Number of subevents. + uint8_t subInterval; //!< Interval between subevents.Time = N × 1.25ms.Time Range: 7.5 ms to 318.75 ms + uint8_t rspSlotDelay; //!< Time between the advertising packet in a subevent and the first response slot.Time = N × 1.25 ms.Time Range: 1.25ms to 317.5ms + uint8_t rspSlotSpacing; //!< Time between response slots.Time = N × 0.125ms.Time Range: 0.25ms to 31.875ms + uint8_t numRspSlots; //!< Number of subevent response slots.Range: 0x01 to 0xFF +}gapPawrSetParam_t; + +typedef struct +{ + uint8_t subevent; //!< The subevent index of the data contained in this command. + uint8_t rspSlotStart; //!< The first response slots to be used in this subevent. + uint8_t rspSlotCount; //!< The number of response slots to be used. + uint8_t dataLength; //!< The number of octets in the Subevent_Data parameter. + uint16_t rspMaxLength; //!< + uint8_t *pData; //!< Advertising data +}gapPawrSetData_t; + +typedef struct +{ + uint16_t syncHandle; //!< identifying the PAwR train + uint16_t reqEvent; //!< The value of paEventCounter the periodic advertising packet that the Host is responding to + uint8_t reqSubevent; //!< The subevent for the periodic advertising packet that the Host is responding to + uint8_t rspSubevent; //!< Used to identify the subevent of the PAwR train. + uint8_t rspSlot; //!< Used to identify the response slot of the PAwR train. + uint8_t rspDataLength;//!< The number of octets in the Response_Data parameter. + uint8_t *pRspData; //!< Response data +} gapPawrSetResponseData_t; + +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERI_ADV_SUBEVENT_DATA_REQ_EVENT + uint8_t advHandle; + uint8_t subeventStart; + uint8_t subeventDataCount; +} gapPawrDataRequestEvent_t; + +typedef struct +{ + uint8_t txPower; + int8_t rssi; + uint8_t cteType; + uint8_t rspSlot; + uint8_t dataStatus; + uint8_t dataLength; + uint8_t *pData; +}pawrResponseInfo_t; + +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERI_ADV_RESPONSE_REPORT_EVENT + uint8_t advHandle; + uint8_t subevent; + uint8_t txStatus; //!< 0x00 packet was transmitted. 0x01 packet was not transmitted. + uint8_t numResponses; + pawrResponseInfo_t *pList; +} gapPawrResponseEvent_t; + +typedef struct +{ + uint8_t advHandle; //!< Used to identify a periodic advertising train + uint8_t subevent; //!< Subevent where the connection request is to be sent. + uint8_t ownAddrType; + uint8_t peerAddrType; + uint8_t peerAddr[6]; + uint16_t connIntervalMin; + uint16_t connIntervalMax; + uint16_t maxLatency; + uint16_t supervisionTimeout; +} gapPawrCreateConnection_t; + +/** + * GAP_SCAN_REQUEST_EVENT message format. This message is sent to the + * app when the advertiser receives a SCAN_REQ PDU or an AUX_SCAN_REQ PDU + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_SCAN_REQUEST_EVENT + uint8_t advHandle; //!< identifying the periodic advertising train + uint8_t scannerAddrType; //!< the type of the address + uint8_t scannerAddr[B_ADDR_LEN];//!< the address of scanner device +} gapScanReqReseiveEvent_t; + +/** + * GAP_CONNECTIONESS_CTE_DONE_EVENT message format. This message is sent to the + * app when the Connectionless CTE Transmit config is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_CONNECTIONESS_CTE_DONE_EVENT +} gapMakeConnectionlessCTERspEvent_t; + +/** + * GAP_END_PERIODIC_ADV_DONE_EVENT message format. This message is sent to the + * app when the Periodic Advertising disable is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_END_CONNECTIONESS_CTE_DONE_EVENT +} gapEndConnectionlessCTERspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8_t adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8_t devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t devAddr[B_ADDR_LEN]; //!< Device address of link + uint16_t connectionHandle; //!< Connection Handle from controller used to ref the device + uint8_t connRole; //!< Connection formed as Central or Peripheral + uint16_t connInterval; //!< Connection Interval + uint16_t connLatency; //!< Connection Latency + uint16_t connTimeout; //!< Connection Timeout + uint8_t clockAccuracy; //!< Clock Accuracy + uint8_t advHandle; //!< Used to identify an advertising set + uint16_t syncHandle; //!< Identifying the periodic advertising train +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8_t status; //!< bStatus_t + uint16_t connectionHandle; //!< Connection handle of the update + uint16_t connInterval; //!< Requested connection interval + uint16_t connLatency; //!< Requested connection latency + uint16_t connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16_t connectionHandle; //!< connection Handle + uint8_t reason; //!< termination reason from LL + uint8_t connRole; +} gapTerminateLinkEvent_t; + +/** + * GAP_PHY_UPDATE_EVENT message format. This message is sent to the app(GAP_MSG_EVENT) + * when the PHY update request is complete. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PHY_UPDATE_EVENT + uint8_t status; //!< bStatus_t + uint16_t connectionHandle; //!< Connection handle of the update + uint8_t connTxPHYS; //!< tx phy(GAP_PHY_VAL_TYPE) + uint8_t connRxPHYS; //!< rx phy(GAP_PHY_VAL_TYPE) +} gapPhyUpdateEvent_t; + +/** + * GAP_PERI_ADV_SYNC_TRAN_RECEIVED_EVENT message format. This message is sent to the app(GAP_MSG_EVENT) + * when the periodic advertising sync transfer received. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PERI_ADV_SYNC_TRAN_RECEIVED_EVENT + uint8_t status; //!< bStatus_t + uint16_t connectionHandle; //!< Connection handle of the update + uint16_t serviceData; //!< A value provided by the peer device + uint16_t syncHandle; //!< Identifying the periodic advertising train + uint8_t advertisingSID; //!< Value of the Advertising SID used to advertise the periodic advertising + uint8_t devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t devAddr[B_ADDR_LEN]; //!< Device address of periodic advertising + uint8_t advertisingPHY; //!< the PHY used for the periodic advertising + uint16_t periodicInterval; //!< Periodic advertising interval + uint8_t clockAccuracy; //!< Clock Accuracy + uint8_t numSubevents; //!< Number of subevents + uint8_t subInterval; //!< Subevent interval + uint8_t rspSlotDelay; //!< Response slot delay + uint8_t rspSlotSpacing; //!< Response slot spacing +} gapPeriodicTranReceivec_t; + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8_t deviceAddr[B_ADDR_LEN]; //!< address of device to pair with, and could be either public or random. + uint16_t connectionHandle; //!< Connection handle + uint8_t uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8_t uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t)( uint8_t *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16_t connectionHandle, //!< Connection handle + uint8_t uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8_t uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t)( uint16_t connectionHandle, //!< Connection handle + uint8_t state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8_t status //!< Pairing status + ); + +typedef struct +{ + tmos_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8_t opcode; //!< GAP_O0B_NEEDED_EVENT + uint8_t deviceAddr[B_ADDR_LEN]; //!< address of device to pair with, and could be either public or random. + uint16_t connectionHandle; //!< Connection handle + uint8_t r_local[16]; + uint8_t c_local[16]; +} gapOobNeededEvent_t; + +/** + * OOB Callback Function + */ +typedef void (*pfnOobCB_t)( uint8_t *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16_t connectionHandle, //!< Connection handle + uint8_t* r_local, //!< local rand + uint8_t *c_local //!< local confirm + ); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback + pfnOobCB_t oobCB; //!< oob callback +} gapBondCBs_t; + +typedef int (*pfnEcc_key_t)( uint8_t *pub, uint8_t *priv); + +typedef int (*pfnEcc_dhkey_t)( uint8_t *peer_pub_key_x, uint8_t *peer_pub_key_y, + uint8_t *our_priv_key, uint8_t *out_dhkey ); + +typedef int (*pfnEcc_alg_f4_t)( uint8_t *u, uint8_t *v, uint8_t *x, uint8_t z, + uint8_t *out_enc_data ); + +typedef int (*pfnEcc_alg_g2_t)( uint8_t *u, uint8_t *v, uint8_t *x, uint8_t *y, + uint32_t *passkey ); + +typedef int (*pfnEcc_alg_f5_t)( uint8_t *w, uint8_t *n1, uint8_t *n2, + uint8_t a1t, uint8_t *a1, uint8_t a2t, uint8_t *a2, uint8_t *mackey, uint8_t *ltk ); + +typedef int (*pfnEcc_alg_f6_t)( uint8_t *w, uint8_t *n1, uint8_t *n2, uint8_t *r, + uint8_t *iocap, uint8_t a1t, uint8_t *a1, uint8_t a2t, uint8_t *a2, uint8_t *check ); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnEcc_key_t gen_key_pair; + pfnEcc_dhkey_t gen_dhkey; + pfnEcc_alg_f4_t alg_f4; //!< LE Secure Connections confirm value generation function f4 + pfnEcc_alg_g2_t alg_g2; //!< LE Secure Connections numeric comparison value generation function g2 + pfnEcc_alg_f5_t alg_f5; //!< LE Secure Connect ions key generation function f5 + pfnEcc_alg_f6_t alg_f6; //!< LE Secure Connections check value generation function f6 +} gapEccCBs_t; + +/** + * gapRole_States_t defined + */ +typedef uint32_t gapRole_States_t; + +// gapRole_States_t @ 4b'[3-0]-advertising states +#define GAPROLE_STATE_ADV_MASK (0xF) //!< advertising states mask +#define GAPROLE_STATE_ADV_SHIFT (0x0) //!< advertising states shift +#define GAPROLE_INIT 0 //!< Waiting to be started +#define GAPROLE_STARTED 1 //!< Started but not advertising +#define GAPROLE_ADVERTISING 2 //!< Currently Advertising +#define GAPROLE_WAITING 3 //!< Device is started but not advertising, is in waiting period before advertising again +#define GAPROLE_CONNECTED 4 //!< In a connection +#define GAPROLE_CONNECTED_ADV 5 //!< In a connection + advertising +#define GAPROLE_ERROR 6 //!< Error occurred - invalid state + +// gapRole_States_t @ 4b'[7-4]-Periodic advertising states +// Periodic advertising Enable,only effective when GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT advertising event enable +#define GAPROLE_STATE_PERIODIC_MASK (0xF0) //!< Periodic advertising states mask +#define GAPROLE_STATE_PERIODIC_SHIFT (4) //!< Periodic advertising states shift +#define GAPROLE_PERIODIC_INVALID (0<<4) //!< Periodic advertising Waiting to be started +#define GAPROLE_PERIODIC_ENABLE (1<<4) //!< Periodic advertising Enable +#define GAPROLE_PERIODIC_WAIT (2<<4) //!< Periodic advertising is started but disable +#define GAPROLE_PERIODIC_ERROR (3<<4) //!< Periodic advertising error occurred + +// gapRole_States_t @ 4b'[11-8]-Connectionless CTE Transmit states +// Connectionless CTE Transmit Enable,only effective when Periodic advertising valid +#define GAPROLE_STATE_CTE_MASK (0xF00) //!< gapRole_States_t Connectionless CTE defined +#define GAPROLE_STATE_CTE_SHIFT (8) //!< Connectionless CTE Transmit states shift +#define GAPROLE_CONNECTIONLESS_CTE_INVALID (0<<8) //!< Connectionless CTE Transmit Waiting to be started +#define GAPROLE_CONNECTIONLESS_CTE_ENABLE (1<<8) //!< Connectionless CTE Transmit Enable +#define GAPROLE_CONNECTIONLESS_CTE_WAIT (2<<8) //!< Connectionless CTE Transmit is started but disable +#define GAPROLE_CONNECTIONLESS_CTE_ERROR (3<<8) //!< Connectionless CTE Transmit error occurred +// gapRole_States_t @ 12b'[23-12]- Reserved for future use + +// gapRole_States_t @ 8b'[31-24] - indicates which fields change +#define GAPROLE_PERIODIC_STATE_VALID (1<<24) //!< indicates periodic advertising states change +#define GAPROLE_CTE_T_STATE_VALID (1<<25) //!< indicates Connectionless CTE Transmit states change + +typedef union { + struct { + uint32_t advState : 4; + uint32_t periState : 4; + uint32_t cteState : 4; + uint32_t Reserved0 : 12; + uint32_t periValid : 1; + uint32_t cteValid : 1; + uint32_t Reserved1 : 6; + }; + uint32_t gapRoleStates; +} gapRoleStates_t; + +/** + * gapRole Event Structure + */ +typedef union +{ + gapEventHdr_t gap; //!< GAP_MSG_EVENT and status. + gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. + gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure. + gapDirectDeviceInfoEvent_t deviceDirectInfo; //!< Discovery direct device information event structure. + gapAdvDataUpdateEvent_t dataUpdate; //!< Advertising Data Update is complete. + gapPeriodicAdvDeviceInfoEvent_t devicePeriodicInfo; //!< Discovery periodic device information event structure. + gapExtAdvDeviceInfoEvent_t deviceExtAdvInfo; //!< Discovery extend advertising device information event structure. + gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure. + gapSyncEstablishedEvent_t syncEstEvt; //!< sync established event structure. + gapSyncLostEvent_t syncLostEvt; //!< sync lost event structure. + gapScanReqReseiveEvent_t scanReqEvt; //!< Scan_Request_Received event structure. + + gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure. + gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure. + gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure. + gapPhyUpdateEvent_t linkPhyUpdate; //!< Link phy update event structure. + gapPeriodicTranReceivec_t syncTran; +} gapRoleEvent_t; + +/** + * Type of device. + */ +typedef struct +{ + uint8_t eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES + uint8_t addrType; //!< Scan Address Type:0x00-Public Device Address or Public Identity Address 0x01-Random Device Address or Random (static) Identity Address + uint8_t addr[B_ADDR_LEN]; //!< Device's Address + int8_t rssi; +} gapScanRec_t; + +/** + * Type of GAPRole_CreateSync command parameters. + */ +typedef struct +{ + uint8_t options; + /* + bit0: used to determine whether the Periodic Advertiser List is used + 0: Use the Advertising_SID, Advertisier_Address_Type, and Advertiser_Address parameters to determine which advertiser to listen to. + 1: Use the Periodic Advertiser List to determine which advertiser to listen to. + bit1: whether GAP_PERIODIC_ADV_DEVICE_INFO_EVENT events for this periodic advertising train are initially enabled or disabled. + 0: Reporting initially enabled + 1: Reporting initially disabled + bit2: + 0: Duplicate filtering initially disabled + 1: Duplicate filtering initially enabled */ + uint8_t advertising_SID; //!< if used, specifies the value that must match the Advertising SID + uint8_t addrType; //!< Scan Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8_t addr[B_ADDR_LEN]; //!< Device's Address + uint16_t skip; //!< the maximum number of consecutive periodic advertising events that the receiver may skip after + //!< successfully receiving a periodic advertising packet.Range: 0x0000 to 0x01F3 + uint16_t syncTimeout; //!< the maximum permitted time between successful receives. If this time is exceeded, synchronization is lost. + //!< Time = N*10 ms.Range: 0x000A to 0x4000 + uint8_t syncCTEType; //!< specifies whether to only synchronize to periodic advertising with certain types of Constant Tone Extension + //!< (a value of 0 indicates that the presence or absence of a Constant Tone Extension is irrelevant). +} gapCreateSync_t; + +/** + * Type of GAPRole_SyncTransferParameters command parameters. + */ +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + uint8_t mode; //!< specifies the action to be taken when periodic advertising synchronization information is received +#define MODE_0 0 //!< No attempt is made to synchronize to the periodic advertising and no + //!< gapPeriodicTranReceivec_t event is sent to the APP. +#define MODE_1 1 //!< An gapPeriodicTranReceivec_t event is sent to the APP. + //!< gapPeriodicAdvDeviceInfoEvent_t events will be disabled. +#define MODE_2 2 //!< An gapPeriodicTranReceivec_t event is sent to the APP. + //!< gapPeriodicAdvDeviceInfoEvent_t events will be enabled with duplicate filtering disabled. +#define MODE_3 3 //!< An gapPeriodicTranReceivec_t event is sent to the APP. + //!< gapPeriodicAdvDeviceInfoEvent_t events will be enabled with duplicate filtering enabled. + uint16_t skip; //!< resv(The number of periodic advertising packets that can be skipped after a successful receive). + uint16_t syncTimeout; //!< Synchronization timeout for the periodic advertising train.Time = N*10 ms.Range: 0x000A to 0x4000 + uint8_t cteType; //!< Reserved for future use. +} gapSyncTransferParam_t; + +/** + * Type of GAPRole_SyncTransferSync command parameters. + */ +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + uint16_t serviceData; //!< A value provided by the Host for use by the Host of the peer device. + uint16_t syncHandle; //!< Identifier of the periodic advertising train to a connected device. +} gapSyncTransferSync_t; + +/** + * Type of GAPRole_SyncTransferAdvertising command parameters. + */ +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + uint16_t serviceData; //!< A value provided by the Host for use by the Host of the peer device. + uint8_t advHandle; //!< Identifier of the periodic advertising in an advertising set to a connected device. +} gapSyncTransferAdvertising_t; + +/** + * Type of GAPRole_SetPathLossReporting command parameters. + */ +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + int8_t highThreshold; //!< High threshold for the path loss.Units: dB + int8_t highHysteresis; //!< Hysteresis value for the high threshold.Units: dB + int8_t lowThreshold; //!< High threshold for the path loss.Units: dB + int8_t lowHysteresis; //!< Hysteresis value for the high threshold.Units: dB + uint16_t minTimeSpent; //!< Minimum time in number of connection events to be observed + //!< once the path crosses the threshold before an event is generated. + uint8_t enable; //!< 0x00:Reporting disabled 0x01:Reporting enabled +} gapRoleSetPathLossReporting_t; + +typedef struct +{ + uint16_t connHandle; //!< Used to identify the Connection handle + int8_t lowRxThreshold; //!< High threshold for the peer power levels.Units: dB + int8_t highRxThreshold; //!< High threshold for the peer power levels.Units: dB + int8_t minTxPower; //!< Minimum transmit power level.Units: dB + int8_t maxTxPower; //!< Maximum transmit power level.Units: dB +} gapRolePowerlevelManagement_t; + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesBroadcasterStateNotify_t)( gapRole_States_t newState ); + +typedef void (*gapRolesScanReqRecv_t)( gapScanRec_t * pEvent ); + +typedef struct +{ + gapRolesBroadcasterStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesScanReqRecv_t pfnScanRecv; +} gapRolesBroadcasterCBs_t; + +/** + * Observer Event Callback Function + */ +typedef void (*pfnGapObserverRoleEventCB_t)( gapRoleEvent_t *pEvent //!< Pointer to event structure. + ); + +/** + * Observer Callback Structure + */ +typedef struct +{ + pfnGapObserverRoleEventCB_t eventCB; //!< Event callback. +} gapRoleObserverCB_t; + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( uint16_t connHandle, int8_t newRSSI ); + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gapRole_States_t newState, gapRoleEvent_t * pEvent ); + +/** + * Callback when the connection parameteres are updated. + */ +typedef void (*gapRolesParamUpdateCB_t)( uint16_t connHandle, uint16_t connInterval, + uint16_t connSlaveLatency, uint16_t connTimeout ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller + gapRolesParamUpdateCB_t pfnParamUpdate; //!< When the connection parameteres are updated +} gapRolesCBs_t; + +/** + * Central Event Callback Function + */ +typedef void (*pfnGapCentralRoleEventCB_t)( gapRoleEvent_t *pEvent ); //!< Pointer to event structure. + +/** + * HCI Data Length Change Event Callback Function + */ +typedef void (*pfnHciDataLenChangeEvCB_t)( uint16_t connHandle, uint16_t maxTxOctets, + uint16_t maxRxOctets ); + +/** + * Central Callback Structure + */ +typedef struct +{ + gapRolesRssiRead_t rssiCB; //!< RSSI callback. + pfnGapCentralRoleEventCB_t eventCB; //!< Event callback. + pfnHciDataLenChangeEvCB_t ChangCB; //!< Length Change Event Callback . +} gapCentralRoleCB_t; // gapCentralRoleCB_t + +/* RF-PHY define */ + +/* + * RF_ROLE_STATUS_TYPE pfnRFStatusCB_t state defined + */ +// TX_MODE call RF_Tx +#define TX_MODE_TX_FINISH 0x01 //!< basic or auto tx mode sends data successfully + //!< if it is in basic mode,it will enter idle state; + //!< if it is in auto mode,it will wait for receiving +#define TX_MODE_TX_FAIL 0x11 //!< basic or auto tx mode fail to send data and enter idle state +#define TX_MODE_TX_TIMEOUT TX_MODE_TX_FAIL //!< time of data transmission +#define TX_MODE_RX_DATA 0x02 //!< auto tx mode receive data(ack) and enter idle state +#define TX_MODE_RX_TIMEOUT 0x12 //!< auto tx mode receive timeout and enter idle state +#define TX_MODE_HOP_SHUT 0x22 + +// RX_MODE call RF_Rx +#define RX_MODE_RX_DATA 0x03 //!< basic or auto rx mode receive data + //!< if it is in basic mode,it will enter idle state; + //!< if it is in auto mode,it will judge whether the type matches; + //!< if it matches,it will send data(ack),otherwise(rsr=2), it will restart receiving +#define RX_MODE_TX_FINISH 0x04 //!< auto rx mode sends data(ack) successfully and enters idle state +#define RX_MODE_TX_FAIL 0x14 //!< auto rx mode fail to send data and enter idle state +#define RX_MODE_TX_TIMEOUT RX_MODE_TX_FAIL //!< time of data transmission +#define RX_MODE_HOP_SHUT 0x24 + +// LLE_MODE_TYPE +#define LLE_MODE_BASIC (0) //!< basic mode, enter idle state after sending or receive +#define LLE_MODE_AUTO (1) //!< auto mode, auto swtich to the receiving status after sending and the sending status after receiving + +// LLE_WHITENING_TYPE +#define LLE_WHITENING_ON (0<<1) +#define LLE_WHITENING_OFF (1<<1) + +// LLE_PHY_TYPE +#define LLE_MODE_PHY_MODE_MASK (0x30) +#define LLE_MODE_PHY_1M (0<<4) +#define LLE_MODE_PHY_2M (1<<4) +#define LLE_MODE_PHY_CODED_S8 (2<<4) +#define LLE_MODE_PHY_CODED_S2 (3<<4) + +#define LLE_MODE_EX_CHANNEL (1<<6) + +#define LLE_MODE_NON_RSSI (1<<7) + +/** + * RFRole Event Callback Function + */ +typedef void (*pfnRFStatusCB_t)( uint8_t sta, uint8_t rsr, uint8_t *rxBuf ); +// sta - current status@ref RF_ROLE_STATUS_TYPE +// rsr - receive status: bit0- crc check result,bit1- type matching result +// rxBuf - receive data buffer + +typedef struct tag_rf_config +{ + uint8_t LLEMode; //!< BIT0 0=basic, 1=auto def@LLE_MODE_TYPE + //!< BIT1 0=whitening on, 1=whitening off def@LLE_WHITENING_TYPE + //!< BIT4-5 00-1M 01-2M 10-coded(S8) 11-coded(S2) def@LLE_PHY_TYPE + //!< BIT6 0=data channel(0-39) + //!< 1=rf frequency (2400000kHz-2483500kHz) + //!< BIT7 0=the first byte of the receive buffer is rssi + //!< 1=the first byte of the receive buffer is package type + uint8_t Channel; //!< rf channel(0-39) + uint32_t Frequency; //!< rf frequency (2400000kHz-2483500kHz) + uint32_t accessAddress; //!< access address,32bit PHY address + uint32_t CRCInit; //!< crc initial value + pfnRFStatusCB_t rfStatusCB; //!< status call back + uint32_t ChannelMap; //!< indicating Used and Unused data channels.Every channel is represented with a + //!< bit positioned as per the data channel index,The LSB represents data channel index 0 + uint8_t Resv; + uint8_t HeartPeriod; //!< The heart package interval shall be an integer multiple of 100ms + uint8_t HopPeriod; //!< hop period( T=32n*RTC clock ),default is 8 + uint8_t HopIndex; //!< indicate the hopIncrement used in the data channel selection algorithm,default is 17 + uint8_t RxMaxlen; //!< Maximum data length received in rf-mode(default 251) + uint8_t TxMaxlen; //!< Maximum data length transmit in rf-mode(default 251) +} rfConfig_t; + +/* end define@RF-PHY */ + +/******************************************************************************* + * UUID defined + */ +/** + * GATT Services + */ +extern const uint8_t gapServiceUUID[]; +extern const uint8_t gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8_t primaryServiceUUID[]; +extern const uint8_t secondaryServiceUUID[]; +extern const uint8_t includeUUID[]; +extern const uint8_t characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8_t charExtPropsUUID[]; +extern const uint8_t charUserDescUUID[]; +extern const uint8_t clientCharCfgUUID[]; +extern const uint8_t servCharCfgUUID[]; +extern const uint8_t charFormatUUID[]; +extern const uint8_t charAggFormatUUID[]; +extern const uint8_t validRangeUUID[]; +extern const uint8_t extReportRefUUID[]; +extern const uint8_t reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8_t deviceNameUUID[]; +extern const uint8_t appearanceUUID[]; +extern const uint8_t periPrivacyFlagUUID[]; +extern const uint8_t reconnectAddrUUID[]; +extern const uint8_t periConnParamUUID[]; +extern const uint8_t serviceChangedUUID[]; +extern const uint8_t centAddrResUUID[]; + +/******************************************************************************* + * PUBLIC FUNCTIONS + */ +extern uint32_t tmos_rand( void ); // pseudo-random number +extern BOOL tmos_memcmp( const void *src1, const void *src2, uint32_t len ); // TRUE - same, FALSE - different +extern BOOL tmos_isbufset( uint8_t *buf, uint8_t val, uint32_t len ); // TRUE if all "val",FALSE otherwise +extern uint32_t tmos_strlen( char *pString ); +extern void tmos_memset( void * pDst, uint8_t Value, uint32_t len ); +extern void tmos_memcpy( void *dst, const void *src, uint32_t len ); // Generic memory copy. + +/** + * @brief start a event immediately + * + * @param taskID - task ID of event + * @param event - event value + * + * @return 0 - SUCCESS. + */ +extern bStatus_t tmos_set_event( tmosTaskID taskID, tmosEvents event ); + +/** + * @brief clear a event already timeout, cannot be used in it own event function. + * + * @param taskID - task ID of event + * @param event - event value + * + * @return 0 - SUCCESS. + */ +extern bStatus_t tmos_clear_event( tmosTaskID taskID, tmosEvents event ); + +/** + * @brief start a event after period of time + * + * @param taskID - task ID to set event for + * @param event - event to be notified with + * @param time - timeout value + * + * @return TRUE,FALSE. + */ +extern BOOL tmos_start_task( tmosTaskID taskID, tmosEvents event, tmosTimer time ); + +/** + * @brief This function is called to start a timer to expire in n system clock time. + * When the timer expires, the calling task will get the specified event + * and the timer will be reloaded with the timeout value. + * + * @param taskID - task ID to set timer for + * @param event - event to be notified with + * @param time - timeout value + * + * @return SUCCESS, or NO_TIMER_AVAIL. + */ +extern bStatus_t tmos_start_reload_task( tmosTaskID taskID, tmosEvents event, tmosTimer time ); + +/** + * @brief stop a event + * + * @param taskID - task ID of event + * @param event - event value + * + * @param None. + * + * @return SUCCESS. + */ +extern bStatus_t tmos_stop_task( tmosTaskID taskID, tmosEvents event ); + +/** + * @brief get last period of time for this event + * + * @param taskID - task ID of event + * @param event - event value + * + * @return the timer's tick count if found, zero otherwise. + */ +extern tmosTimer tmos_get_task_timer( tmosTaskID taskID, tmosEvents event ); + +/** + * @brief send msg to a task,callback events&SYS_EVENT_MSG + * + * @param taskID - task ID of task need to send msg + * @param *msg_ptr - point of msg + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +extern bStatus_t tmos_msg_send( tmosTaskID taskID, uint8_t *msg_ptr ); + +/** + * @brief delete a msg + * + * @param *msg_ptr - point of msg + * + * @return SUCCESS. + */ +extern bStatus_t tmos_msg_deallocate( uint8_t *msg_ptr ); + +/** + * @brief receive a msg + * + * @param taskID - task ID of task need to receive msg + * + * @return *uint8_t - message information or NULL if no message + */ +extern uint8_t *tmos_msg_receive( tmosTaskID taskID ); + +/** + * @brief allocate buffer for msg when need to send msg + * + * @param len - length of msg + * + * @return pointer to allocated buffer or NULL if allocation failed. + */ +extern uint8_t *tmos_msg_allocate( uint16_t len ); + +/** + * @brief read a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data to read. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +extern bStatus_t tmos_snv_read( tmosSnvId_t id, tmosSnvLen_t len, void *pBuf ); + +/** + * @brief tmos system timer initialization + * + * @note must initialization before call tmos task + * + * @param fnGetClock - system clock select extend input,if NULL select HSE as the clock source + * + * @return SUCCESS if successful, FAILURE if failed. + */ +extern bStatus_t TMOS_TimerInit( bleClockConfig_t *pClockConfig ); + +/** + * @brief interrupt handler. + * + * @param None + * + * @return None + */ +extern bStatus_t TMOS_TimerIRQHandler( uint32_t *time ); + +/** + * @brief Process system + * + * @param None. + * + * @return None. + */ +extern void TMOS_SystemProcess( void ); + +/** + * @brief Get current system clock + * + * @param None. + * + * @return current system clock (in 0.625ms) + */ +extern uint32_t TMOS_GetSystemClock( void ); + +/** + * @brief register process event callback function + * + * @param eventCb-events callback function + * + * @return 0xFF - error,others-task id + */ +extern tmosTaskID TMOS_ProcessEventRegister( pTaskEventHandlerFn eventCb ); + +/** + * @brief Add a device address into white list ( support SNVNum MAX ) + * + * @param addrType - Type of device address + * @param devAddr - first address of device address + * + * @return Command Status. + */ +extern bStatus_t LL_AddWhiteListDevice( uint8_t addrType, uint8_t *devAddr ); + +/** + * @brief Remove a device address from white list + * + * @param addrType - Type of device address + * @param devAddr - first address of device address + * + * @return Command Status. + */ +extern bStatus_t LL_RemoveWhiteListDevice( uint8_t addrType, uint8_t *devAddr ); + +/** + * @brief Clear white list + * + * @param None + * + * @return Command Status. + */ +extern bStatus_t LL_ClearWhiteList( void ); + +/** + * @brief Encrypt data + * + * @param key - key + * @param plaintextData - original data + * @param encryptData - encrypted data + * + * @return Command Status. + */ +extern bStatus_t LL_Encrypt( uint8_t *key, uint8_t *plaintextData, uint8_t *encryptData ); + +/** + * @brief Decrypt data + * + * @param key - key + * @param plaintextData - original data + * @param decryptData - decrypted data + * + * @return Command Status. + */ +extern bStatus_t LL_Decrypt( uint8_t *key, uint8_t *plaintextData, uint8_t *decryptData ); + +/** + * @brief get number of unAck packet in current connect buffer + * + * @param handle - connect handle + * + * @return 0xFFFFFFFF-handle error,number of packets not receiving ack + */ +extern uint32_t LL_GetNumberOfUnAckPacket( uint16_t handle ); + +/** + * @brief Register a callback function will be called after each connect event. + * Only effect in single connection + * + * @param connEventCB - callback function + * + * @return None. + */ +extern void LL_ConnectEventRegister( pfnEventCB connEventCB ); + +/** + * @brief Register a callback function will be called after each advertise event. + * + * @param advEventCB - callback function + * + * @return None. + */ +extern void LL_AdvertiseEventRegister( pfnEventCB advEventCB ); + +/** + * @brief set tx power level + * + * @param power - tx power level + * + * @return Command Status. + */ +extern bStatus_t LL_SetTxPowerLevel( uint8_t power ); + +/** + * @brief read rssi + * + * @param None. + * + * @return the value of rssi. + */ +extern int8_t BLE_ReadRssi( void ); + +/** + * @brief read cfo + * + * @param None. + * + * @return the value of cfo. + */ +extern int16_t BLE_ReadCfo( void ); + +/** + * @brief pa control init + * + * @note Can't be called until role Init + * + * @param paControl - pa control parameters(global variable) + * + * @return Command Status. + */ +extern void BLE_PAControlInit( blePaControlConfig_t *paControl ); + +/** + * @brief ble register reset and rf calibration + * + * @param None + * + * @return None + */ +extern void BLE_RegInit( void ); + +/** + * @brief Init BLE lib. RTC will be occupied at the same time. + * + * @param pCfg - config of BLE lib + * + * @return 0-success. error defined @ ERR_LIB_INIT + */ +extern bStatus_t BLE_LibInit( bleConfig_t* pCfg ); + +/** + * @brief interrupt handler. + * + * @param None + * + * @return None + */ +extern void BB_IRQLibHandler( void ); + +/** + * @brief interrupt handler. + * + * @param None + * + * @return None + */ +extern void LLE_IRQLibHandler( void ); + +/** + * @brief generate a valid access address + * + * @param None. + * + * @return access address + * the Access Address meets the following requirements: + * It shall have no more than six consecutive zeros or ones. + * It shall not be t he advertising channel packets’ Access Address. + * It shall not be a sequence that differ s from the advertising channel packets' Access Address by only one bit. + * It shall not have all four octets equal. + * It shall have no more than 24 transitions. + * It shall have a minimum of two transitions in the most significant six bits. + */ +extern uint32_t BLE_AccessAddressGenerate( void ); + +/* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ +extern uint8_t linkDB_Register( pfnLinkDBCB_t pFunc ); + +/* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ +extern uint8_t linkDB_State( uint16_t connectionHandle, uint8_t state ); + +/* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ +extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); +/* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8_t linkDB_Up( uint16_t connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ +#define linkDB_Up( connectionHandle ) linkDB_State( (connectionHandle), LINK_CONNECTED ) + +/** + * @brief This function is used to get the MTU size of a connection. + * + * @param connHandle - connection handle. + * + * @return connection MTU size.
+ */ +extern uint16_t ATT_GetMTU( uint16_t connHandle ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16_t connHandle ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8_t ATT_CompareUUID( const uint8_t *pUUID1, uint16_t len1, const uint8_t *pUUID2, uint16_t len2 ); + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS: Client initialized successfully.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId ?task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8_t taskId ); + +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16_t handle, uint16_t *pHandle ); + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * @note This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeoutstatus) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16_t connHandle, attHandleValueInd_t *pInd, uint8_t authenticated, uint8_t taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * @note A notification may be sent at any time and does not invoke a confirmation. + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16_t connHandle, attHandleValueNoti_t *pNoti, uint8_t authenticated ); + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16_t connHandle, attExchangeMTUReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16_t connHandle, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pUUID - pointer to service UUID to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16_t connHandle, uint8_t *pUUID, uint8_t len, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureCompleteor bleTimeout status)or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16_t connHandle, uint16_t startHandle, uint16_t endHandle, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status)or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16_t connHandle, uint16_t startHandle, uint16_t endHandle, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16_t connHandle, attReadByTypeReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptors Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16_t connHandle, uint16_t startHandle, uint16_t endHandle, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU ?1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU - 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16_t connHandle, attReadReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16_t connHandle, attReadByTypeReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16_t connHandle, attReadBlobReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16_t connHandle, attReadMultiReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU ?3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16_t connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU ?15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16_t connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16_t connHandle, attWriteReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * @note This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP + * (with SUCCESS or bleTimeout status), or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @note The 'pReq->pValue' pointer will be freed when the sub-procedure is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16_t connHandle, attPrepareWriteReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * @note This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP + * (with SUCCESS or bleTimeout status), or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @note The 'pReqs' pointer will be freed when the sub-procedure is complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16_t connHandle, attPrepareWriteReq_t *pReqs, uint8_t numReqs, + uint8_t flags, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration's Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16_t connHandle, attReadReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration's Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16_t connHandle, attReadBlobReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an tmos GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * @note This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16_t connHandle, attWriteReq_t *pReq, uint8_t taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple tmos GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * @note This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP + * (with SUCCESS or bleTimeout status), or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @note The 'pReq->pValue' pointer will be freed when the sub-procedure is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16_t connHandle, attPrepareWriteReq_t *pReq, uint8_t taskId ); + +/** + * @brief GATT implementation of the allocator functionality. + * + * @note This function should only be called by GATT and the upper layer protocol/application. + * + * @param connHandle - connection that message is to be sent on. + * @param opcode - opcode of message that buffer to be allocated for. + * @param size - number of bytes to allocate from the heap. + * @param pSizeAlloc - number of bytes allocated for the caller from the heap. + * @param flag - . + * + * @return pointer to the heap allocation; NULL if error or failure. + */ +extern void *GATT_bm_alloc( uint16_t connHandle, uint8_t opcode, uint16_t size, uint16_t *pSizeAlloc, uint8_t flag ); + +/** + * @brief GATT implementation of the de-allocator functionality. + * + * @param pMsg - pointer to GATT message containing the memory to free. + * @param opcode - opcode of the message + * + * @return none + */ +extern void GATT_bm_free( gattMsg_t *pMsg, uint8_t opcode ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param encKeySize - Minimum encryption key size required by service (7-16 bytes) + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service fields.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleInvalidRange: Encryption key size's out of range.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16_t numAttrs, + uint8_t encKeySize, gattServiceCBs_t *pServiceCBs ); + +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32_t services ); + +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * @note It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DeregisterService( uint16_t handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * @note Each client has its own instantiation of the ClientCharacteristic Configuration. + * Reads/Writes of the Client Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16_t connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16_t connHandle, uint8_t taskId ); + +/** + * @brief Read the client characteristic configuration for a given client. + * + * @note Each client has its own instantiation of the Client Characteristic Configuration. + * Reads of the Client Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16_t GATTServApp_ReadCharCfg( uint16_t connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given client. + * + * @note Each client has its own instantiation of the Client Characteristic Configuration. + * Writes of the Client Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8_t GATTServApp_WriteCharCfg( uint16_t connHandle, gattCharCfg_t *charCfgTbl, uint16_t value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16_t connHandle, gattAttribute_t *pAttr, + uint8_t *pValue, uint16_t len, uint16_t offset, uint16_t validCfg ); + +/** + * @brief Set a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_SetParameter( uint8_t param, uint8_t len, void *value ); + +/** + * @brief Get a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_GetParameter( uint8_t param, void *value ); + +/** + * @brief Add function for the GAP GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GGS_AddService( uint32_t services ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuration + */ + +/** + * @brief Set a GAP Parameter value. Use this function to change the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAP_SetParamValue( uint16_t paramID, uint16_t paramValue ); + +/** + * @brief Get a GAP Parameter value. + * + * @note This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ +extern uint16_t GAP_GetParamValue( uint16_t paramID ); + +/** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE is selected, + * the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC or ADDRTYPE_PRIVATE_NONRESOLVE type + * NULL to auto generate otherwise the application can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed + * bleIncorrectMode: can't change with an active connection,or INVALIDPARAMETER + * If return value isn't SUCCESS, the address type remains the same as before this call. + */ +extern bStatus_t GAP_ConfigDeviceAddr( uint8_t addrType, uint8_t *pStaticAddr ); + +/** + * @brief Resolves a private address against an IRK. + * + * @param(in) pIRK - pointer to the IRK + * @param(in) pAddr - pointer to the Resolvable Private address + * + * @param(out) pIRK + * @param(out) pAddr + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ +extern bStatus_t GAP_ResolvePrivateAddr( uint8_t *pIRK, uint8_t *pAddr ); + +/** + * @brief Setup or change advertising and scan response data. + * + * @note if the return status from this function is SUCCESS,the task isn't complete + * until the GAP_ADV_DATA_UPDATE_DONE_EVENT is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted + * bleIncorrectMode: invalid profile role + */ +extern bStatus_t GAP_UpdateAdvertisingData( uint8_t taskID, uint8_t adType, uint16_t dataLen, uint8_t *pAdvertData ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GAP Bond API + */ +/** + * @brief Set a GAP Bond Manager parameter. + * + * @note You can call this function with a GAP Parameter ID and it will set the GAP Parameter. + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16_t param, uint8_t len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * @note You can call this function with a GAP Parameter ID and it will get a GAP Parameter. + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate data type. + * (example: data type of uint16_t will be cast to uint16_t pointer) + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16_t param, void *pValue ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed + * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16_t connectionHandle, uint8_t status, uint32_t passcode ); + +/** + * @brief Respond to a passcode request. + * + * @param connHandle - connection handle of the connected device or 0xFFFF if all devices in database. + * @param status - SUCCESS if oob data is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param oob - containing the oob data. + * @param c_peer - containing the peer confirm. + * + * @return SUCCESS - bond record found and changed + * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_OobRsp( uint16_t connHandle, uint8_t status, uint8_t *oob, uint8_t * c_peer ); + +/** + * @brief Initialization function for the ecc-function callback. + * + * @param pEcc - callback registration Structure @ref gapEccCBs_t. + * + * @return null. + */ +extern void GAPBondMgr_EccInit( gapEccCBs_t *pEcc ); + +/** + * @brief Send a security request + * + * @param connHandle - connection handle + * + * @return SUCCESS: will send + * bleNotConnected: Link not found + * bleIncorrectMode: wrong GAP role, must be a Peripheral Role + */ +extern bStatus_t GAPBondMgr_PeriSecurityReq( uint16_t connHandle ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GAPRole API + */ +/** + * @brief Set a GAP Role parameter. + * + * @note You can call this function with a GAP Parameter ID and it will set a GAP Parameter. + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on the parameter ID and + * WILL be cast to the appropriate data type (example: data type of uint16_t + * will be cast to uint16_t pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16_t param, uint16_t len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * @note You can call this function with a GAP Parameter ID and it will get a GAP Parameter. + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16_t will be cast to + * uint16_t pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16_t param, void *pValue ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateLink( uint16_t connHandle ); + +/** + * @brief Read Rssi Cmd. + * + * @param connHandle - connection handle + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_ReadRssiCmd( uint16_t connHandle ); + +/** + * @brief used to synchronize with a periodic advertising train from an advertiser and + * begin receiving periodic advertising packets. + * + * @param pSync - sync parameters@ gapCreateSync_t + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_CreateSync( gapCreateSync_t *pSync ); + +/** + * @brief used to cancel the HCI_LE_Periodic_Advertising_Create_Sync command while + * it is pending. + * + * @param None. + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_CancelSync( void ); + +/** + * @brief used to stop reception of the periodic advertising train identified + * by the Sync_Handle parameter. + * + * @param syncHandle-identifying the periodic advertising train + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_TerminateSync( uint16_t syncHandle ); + +/** + * @brief used to instruct the Controller to send synchronization information about the periodic + * advertising in an advertising set to a connected device. + * + * @param pSync - sync parameters@ gapSyncTransferParam_t + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_SyncTransferParameters( gapSyncTransferParam_t *pSync ); + +/** + * @brief used to instruct the Controller to send synchronization information about the periodic + * advertising train identified by the Sync_Handle parameter to a connected device. + * + * @param pSync - sync parameters@ gapSyncTransferSync_t + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_SyncTransferSync( gapSyncTransferSync_t *pSync ); + +/** + * @brief used to instruct the Controller to send synchronization information about the periodic + * advertising in an advertising set to a connected device. + * + * @param pSync - sync parameters@ gapSyncTransferAdvertising_t + * + * @return bStatus_t: HCI Error Code.
+ * + */ +extern bStatus_t GAPRole_SyncTransferAdvertising( gapSyncTransferAdvertising_t *pSync ); + +/** + * @brief Update the link connection parameters. + * + * @param connHandle - connection handle + * @param connIntervalMin - minimum connection interval in 1.25ms units + * @param connIntervalMax - maximum connection interval in 1.25ms units + * @param connLatency - number of LL latency connection events + * @param connTimeout - connection timeout in 10ms units + * + * @return SUCCESS: Connection update started started.
+ * bleIncorrectMode: No connection to update.
+ */ +extern bStatus_t GAPRole_UpdateLink( uint16_t connHandle, uint16_t connIntervalMin, + uint16_t connIntervalMax, uint16_t connLatency, uint16_t connTimeout ); + +/** + * @brief Update the connection phy. + * + * @param connHandle - connection handle + * @param all_phys - a bit field that allows the Host to specify, for each direction + * set BIT0:The Host has no preference among the transmitter PHYs supported by the Controller + * set BIT1:The Host has no preference among the receiver PHYs supported by the Controller + * @param tx_phys - a bit field that indicates the transmitter PHYs.(GAP_PHY_BIT_TYPE) + * @param rx_phys - a bit field that indicates the receiver PHYs.(GAP_PHY_BIT_TYPE) + * @param phy_options - preferred coding when transmitting on the LE Coded PHY(GAP_PHY_OPTIONS_TYPE) + * + * @return SUCCESS: PHY update started started .
+ * bleIncorrectMode: No connection to update.
+ */ +extern bStatus_t GAPRole_UpdatePHY( uint16_t connHandle, uint8_t all_phys, uint8_t tx_phys,\ + uint8_t rx_phys, uint16_t phy_options ); + +/** + * @brief used to allow the Host to specify the privacy mode to be used for a given entry on the resolving list. + * + * @note This command shall not be used when address resolution is enabled in the Controller and: + * Advertising (other than periodic advertising) is enabled, + * Scanning is enabled, or + * an GAPRole_CentralEstablishLink, or GAPRole_CreateSync command is pending. + * + * @param addrTypePeer - 0x00:Public Identity Address 0x01:Random (static) Identity Address + * @param peerAddr - Public Identity Address or Random (static) Identity Address of the advertiser + * @param privacyMode - 0x00:Use Network Privacy Mode for this peer device (default) + * 0x01:Use Device Privacy Mode for this peer device + * + * @return Command Status. + * + */ +extern bStatus_t GAPRole_SetPrivacyMode( uint8_t addrTypePeer, uint8_t *peerAddr, uint8_t privacyMode ); + +/** + * @brief used to set the path loss threshold reporting parameters. + * + * @param pParm - set path loss parameters@ gapRoleSetPathLossReporting_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPRole_SetPathLossReporting( gapRoleSetPathLossReporting_t *pParm ); + +/** + * @brief used to set power level management. + * + * @param pParm - set power level parameters@ gapRolePowerlevelManagement_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPRole_SetPowerlevel( gapRolePowerlevelManagement_t *pParm ); + +/** + * @brief used to set the parameters for pawr advertising.. + * + * @param pParm - set pawr parameters@ gapPawrSetParam_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPPawr_SetParameters( gapPawrSetParam_t *pParm ); + +/** + * @brief used to set the data for one or more subevents of PAwR in reply to an + * HCI_LE_Periodic_Advertising_Subevent_Data_Request event. + * + * @param advHandle - advertising handle + * @param numSubevents - the number of subevent data contained in the parameter arrays. + * @param pParm - The arrayed parameter @ gapPawrSetResponseData_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPPawr_SetSubeventData( uint8_t advHandle, uint8_t numSubevents, gapPawrSetData_t *pParm ); + +/** + * @brief used by the Host to set the data for a response slot in a specific subevent + * of the PAwR identified by the Sync_Handle. + * + * @param pParm - The parameter @ gapPawrSetResponseData_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPPawr_SetResponseData( gapPawrSetResponseData_t *pParm ); + +/** + * @brief used to create an ACL connection between a periodic advertiser and a synchronized device. + * + * @param pParm - The parameter @ gapPawrCreateConnection_t + * + * @return Command Status. + * + */ +extern bStatus_t GAPPawr_CreatConnection( gapPawrCreateConnection_t *pParm ); + +/*------------------------------------------------------------------- + * FUNCTIONS - BROADCASTER_PROFILE_API Broadcaster Profile API + */ +/** + * + * @brief Initialization function for the GAP Role Task. + * + * @param None. + * + * @return SUCCESS,bleInvalidRange + */ +extern bStatus_t GAPRole_BroadcasterInit( void ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_BroadcasterStartDevice( gapRolesBroadcasterCBs_t *pAppCallbacks ); + +/** + * @brief Does the Broadcaster receive scan request call initialization. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return None + */ +extern void GAPRole_BroadcasterSetCB( gapRolesBroadcasterCBs_t *pAppCallbacks ); + +/*------------------------------------------------------------------- + * FUNCTIONS - OBSERVER_PROFILE_API Observer Profile API + */ +/** + * @internal + * + * @brief Observer Profile Task initialization function. + * + * @param None. + * + * @return SUCCESS,bleInvalidRange + */ +extern bStatus_t GAPRole_ObserverInit( void ); + +/** + * @brief Start the device in Observer role. This function is typically + * called once during system startup. + * + * @param pAppCallbacks - pointer to application callbacks + * + * @return SUCCESS: Operation successful.
+ * bleAlreadyInRequestedMode: Device already started.
+ */ +extern bStatus_t GAPRole_ObserverStartDevice( gapRoleObserverCB_t *pAppCallbacks ); + +/** + * @brief Start a device discovery scan. + * + * @param mode - discovery mode: @ref GAP_DEVDISC_MODE_DEFINES + * @param activeScan - TRUE to perform active scan + * @param whiteList - TRUE to only scan for devices in the white list + * + * @return SUCCESS: Discovery scan started.
+ * bleIncorrectMode: Invalid profile role.
+ * bleAlreadyInRequestedMode: Not available.
+ */ +extern bStatus_t GAPRole_ObserverStartDiscovery( uint8_t mode, uint8_t activeScan, uint8_t whiteList ); + +/** + * @brief Cancel a device discovery scan. + * + * @return SUCCESS: Cancel started.
+ * bleInvalidTaskID: Not the task that started discovery.
+ * bleIncorrectMode: Not in discovery mode.
+ */ +extern bStatus_t GAPRole_ObserverCancelDiscovery( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - PERIPHERAL_PROFILE_API Peripheral Profile API + */ +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param None. + * + * @return SUCCESS,bleInvalidRange + */ +extern bStatus_t GAPRole_PeripheralInit( void ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_PeripheralStartDevice( uint8_t taskid, gapBondCBs_t *pCB, gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Update the parameters of an existing connection + * + * @param connHandle - the connection Handle + * @param connIntervalMin - minimum connection interval in 1.25ms units + * @param connIntervalMax - maximum connection interval in 1.25ms units + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param taskId - taskID will recv L2CAP_SIGNAL_EVENT message + * + * @return SUCCESS, bleNotConnected or bleInvalidRange + */ +extern bStatus_t GAPRole_PeripheralConnParamUpdateReq( uint16_t connHandle, uint16_t connIntervalMin, + uint16_t connIntervalMax, uint16_t latency, uint16_t connTimeout, uint8_t taskId ); + +/*------------------------------------------------------------------- + * FUNCTIONS - CENTRAL_PROFILE_API Central Profile API + */ +/** + * @internal + * + * @brief Central Profile Task initialization function. + * + * @param None. + * + * @return SUCCESS,bleInvalidRange + */ +extern bStatus_t GAPRole_CentralInit( void ); + +/** + * @brief Start the device in Central role. This function is typically + * called once during system startup. + * + * @param pAppCallbacks - pointer to application callbacks + * + * @return SUCCESS: Operation successful.
+ * bleAlreadyInRequestedMode: Device already started.
+ */ +extern bStatus_t GAPRole_CentralStartDevice( uint8_t taskid, gapBondCBs_t *pCB, gapCentralRoleCB_t *pAppCallbacks ); + +/** + * @brief Start a device discovery scan. + * + * @param mode - discovery mode: @ref GAP_DEVDISC_MODE_DEFINES + * @param activeScan - TRUE to perform active scan + * @param whiteList - TRUE to only scan for devices in the white list + * + * @return SUCCESS: Discovery scan started.
+ * bleIncorrectMode: Invalid profile role.
+ * bleAlreadyInRequestedMode: Not available.
+ */ +extern bStatus_t GAPRole_CentralStartDiscovery( uint8_t mode, uint8_t activeScan, uint8_t whiteList ); + +/** + * @brief Cancel a device discovery scan. + * + * @return SUCCESS: Cancel started.
+ * bleInvalidTaskID: Not the task that started discovery.
+ * bleIncorrectMode: Not in discovery mode.
+ */ +extern bStatus_t GAPRole_CentralCancelDiscovery( void ); + +/** + * @brief This API is called by the Central to update the Host data channels + * initiating an Update Data Channel control procedure. + * + * @note While it isn't specified,it is assumed that the Host expects an + * update channel map on all active connections and periodic advertise. + * + * input parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used". + * + * @return SUCCESS + */ +extern void GAPRole_SetHostChanClassification( uint8_t *chanMap ); + +/** + * @brief Establish a link to a peer device. + * + * @param highDutyCycle - TRUE to high duty cycle scan, FALSE if not + * @param whiteList - determines use of the white list: TRUE-enable + * @param addrTypePeer - address type of the peer device: @ref GAP_ADDR_TYPE_DEFINES + * @param peerAddr - peer device address + * + * @return SUCCESS: started establish link process.
+ * bleIncorrectMode: invalid profile role.
+ * bleNotReady: a scan is in progress.
+ * bleAlreadyInRequestedMode: can't process now.
+ * bleNoResources: too many links.
+ */ +extern bStatus_t GAPRole_CentralEstablishLink( uint8_t highDutyCycle, uint8_t whiteList, uint8_t addrTypePeer, uint8_t *peerAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - RF_PHY Profile API + */ + +/** + * @brief RF_PHY Profile Task initialization function. + * + * @param None. + * + * @return 0 - success. + */ +extern bStatus_t RF_RoleInit( void ); + +/** + * @brief rf config. + * + * @param pConfig - rf config parameters + * + * @return 0 - success. + */ +extern bStatus_t RF_Config( rfConfig_t *pConfig ); + +/** + * @brief rx mode. + * + * @param txBuf - rx mode tx data + * @param txLen - rx mode tx length(0-251) + * @param pktRxType - rx mode rx package type + * broadcast type(0xFF):receive all matching types, + * others:receive match type or broadcast type + * @param pktTxType - rx mode tx package type(auto mode) + * broadcast type(0xFF):received by all matching types; + * others:only received by matching type + * + * @return 0 - success. 1-access address error 2-busy + */ +extern bStatus_t RF_Rx( uint8_t *txBuf, uint8_t txLen, uint8_t pktRxType, uint8_t pktTxType ); + +/** + * @brief tx mode. + * + * @param txBuf - tx mode tx data + * @param txLen - tx mode tx length(0-251) + * @param pktTxType - tx mode tx package type + * broadcast type(0xFF):received by all matching types; + * others:only received by matching type + * @param pktRxType - tx mode rx package type(auto mode) + * broadcast type(0xFF):receive all matching types, + * others:receive match type or broadcast type + * + * @return 0 - success. 1-access address error 2-busy + */ +extern bStatus_t RF_Tx( uint8_t *txBuf, uint8_t txLen, uint8_t pktTxType, uint8_t pktRxType ); + +/** + * @brief shut down,stop tx/rx mode. + * + * @param None. + * + * @return 0 - success. + */ +extern bStatus_t RF_Shut( void ); + +/** + * @brief rf mode set radio channel/frequency. + * + * @param channel. + * + * @return 0 - success. + */ +extern void RF_SetChannel( uint32_t channel ); + +/** + * @brief rf mode set radio frequency and whitening channel index + * note: LLEMode bit6 set 1 + * + * @param frequency - + * @param ch - the whitening channel index + * + * @return 0 - success. + */ +extern bStatus_t RF_SetFrequency( uint32_t frequency, uint8_t ch ); + +/** + * @brief shut down rf frequency hopping + * + * @param None. + * + * @return None. + */ +extern void RF_FrequencyHoppingShut( void ); + +/** + * @brief + * + * @param resendCount - Maximum count of sending HOP_TX pdu,0 = unlimited. + * + * @return 0 - success. + */ +extern uint8_t RF_FrequencyHoppingTx( uint8_t resendCount ); + +/** + * @brief + * + * @param timeoutMS - Maximum time to wait for receiving HOP_TX pdu(Time = n * 1mSec),0 = unlimited. + * + * @return 0 - success.1-fail.2-LLEMode error(shall AUTO) + */ +extern uint8_t RF_FrequencyHoppingRx( uint32_t timeoutMS ); + +/** + * @brief Erase FH bonded device + * + * @param None. + * + * @return None. + */ +extern void RF_BondingErase( void ); + +/** + * @brief single channel mode. + * + * @param ch - rf channel,f=2402+ch*2 MHz, ch=0,...,39 + * + * @return 0 - success. + */ +extern bStatus_t LL_SingleChannel( uint8_t ch ); + +/** + * @brief used to stop any test which is in progress. + * + * @param(in) pPktNum - null + * + * @param(out) the number of received packets. + * + * @return 0 - success. + */ +extern bStatus_t LL_TestEnd( uint8_t *pPktNum ); + +/** + * @brief used to start a test where the DUT receives test reference packets at a fixed interval + * + * input parameters + * + * @param opcode = 0x201D + * pParm0 - RX_Channel + * + * opcode = 0x2033 + * pParm0 - RX_Channel + * pParm1 - PHY + * pParm2 - Modulation_Index + * + * @return 0 - success. + */ +extern bStatus_t API_LE_ReceiverTestCmd( uint8_t *pParm, uint16_t opcode ); + +/** + * @brief used to start a test where the DUT generates test reference packets at a fixed interval + * + * @param opcode = 0x201E + * pParm 0 - TX_Channel + * pParm 1 - Test_Data_Length + * pParm 2 - Packet_Payload + * + * opcode = 0x2034 + * pParm 0 - TX_Channel + * pParm 1 - Test_Data_Length + * pParm 2 - Packet_Payload + * pParm 3 - PHY + * + * @return 0 - success. + */ +extern bStatus_t API_LE_TransmitterTestCmd( uint8_t *pParm, uint16_t opcode ); + +/** + * @brief used to stop any test which is in progress + * + * @param None + * + * @return 0 - success. + */ +extern bStatus_t API_LE_TestEndCmd( void ); + +/** + * @brief used to set sensitivity level + * + * @param None + * + * @return None. + */ +extern void RFEND_SetSensitivity( void ); + +/** + * @brief used to set rf TxCtune value + * + * @param pParm(in) - Must provide length of parameter followed by 6 bytes parameter + * + * @return Command Status. + */ +extern bStatus_t RFEND_TXCtuneSet( uint8_t *pParm ); + +/** + * @brief used to get rf TxCtune value + * + * @param pParm(out) - length of parameter(6) followed by 6 bytes parameter + * + * @return Command Status. + */ +extern bStatus_t RFEND_TXCtuneGet( uint8_t *pParm ); + +/* + * END @ Profile API + */ +/******************************************************************************/ +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/link.mk b/Ubiquitous/XiZi_IIoT/link.mk index 97dcbba8f..7597b8a28 100644 --- a/Ubiquitous/XiZi_IIoT/link.mk +++ b/Ubiquitous/XiZi_IIoT/link.mk @@ -3,7 +3,7 @@ OBJS := $(shell cat make.obj) $(TARGET): $(OBJS) @echo ------------------------------------------------ @echo link $(TARGET) - @$(CROSS_COMPILE)g++ -o $@ $($(LINK_FLAGS)) $(OBJS) $(LINK_LWIP) $(LINK_MUSLLIB) $(LINK_MONGOOSE) $(LINK_WCH_NET) $(LIBCC) + @$(CROSS_COMPILE)g++ -o $@ $($(LINK_FLAGS)) $(OBJS) $(LINK_LWIP) $(LINK_MUSLLIB) $(LINK_MONGOOSE) $(LINK_WCH_NET) $(LIBCC) $(LINK_WCH_BLE) @echo ------------------------------------------------ @$(CROSS_COMPILE)objcopy -O binary $@ XiZi-$(BOARD)$(COMPILE_TYPE).bin @$(CROSS_COMPILE)objdump -S $@ > XiZi-$(BOARD)$(COMPILE_TYPE).asm