From 29db0f4dd71ce751318b04bfc37ee0d8b18bb663 Mon Sep 17 00:00:00 2001 From: Dustin Crossman <53874429+dustin-crossman@users.noreply.github.com> Date: Mon, 28 Feb 2022 14:52:49 -0800 Subject: [PATCH] Add P6 OTA Requestor App (#14563) * Add P6 ota-requestor app. * More work on p6 ota app. * Add new linker script for p6 ota requestor. Add necessary defines for ota. * Add anycloud-ota and serial-flash submodules. * Adding more code to p6 OTA. * Add factory reset button handling Fix factory reset bug. * Move various ota objects to AppTask. * Fix init bug. * More p6 ota changes. * Fix build issues with other p6 apps. * Add mcuboot config headers. * Add bootloader hex. * Format with clang-format and gn format. * Small improvement to P6 OTA image processor. * App network commissioning fixes. * Add ota build scripts. Add build flag for ota update image. * Fixup documentation * Ran gn format * CI fixes * Restyling! * Add DAPLINK to word list. * More restyling. * Remove duplicate submodule entry. * Addressing review issues. * Add button handling to trigger query-image commands from device. * Fix for restyle. * A few more review items. * More restyle * Move persistent storage to last 1/4 of flash to leave room for OTA images at start. * Fix compile issue and add some comments. * Move NotifyUpdateApplied to after update and reboot. * Add arg for chip_stack_lock_tracking. * Delete call to removed function. * Restyled by clang-format * Restyled by gn * Save software version persistently and fix update logic. * Restyling. * Fix compile error on other platforms. * Compile fix for linux fake tests. * Fix P6 compile after rebase. * Quick update to README. * Restyle. Co-authored-by: Restyled.io --- .github/.wordlist.txt | 1 + .gitmodules | 3 + examples/ota-requestor-app/p6/.gn | 28 + examples/ota-requestor-app/p6/BUILD.gn | 174 + examples/ota-requestor-app/p6/README.md | 138 + examples/ota-requestor-app/p6/args.gni | 28 + examples/ota-requestor-app/p6/build_overrides | 1 + .../p6/config/mcuboot_config/mcuboot_assert.h | 20 + .../p6/config/mcuboot_config/mcuboot_config.h | 151 + .../config/mcuboot_config/mcuboot_logging.h | 107 + .../p6/config/mcuboot_crypto_acc_config.h | 52 + .../p6/config/mcuboot_crypto_config.h | 3606 +++++++++++++++ .../ota-requestor-app/p6/include/AppConfig.h | 65 + .../ota-requestor-app/p6/include/AppEvent.h | 52 + .../ota-requestor-app/p6/include/AppTask.h | 89 + .../p6/include/ButtonHandler.h | 41 + .../p6/include/CHIPProjectConfig.h | 135 + .../p6/matter-psoc6-mcuboot-bootloader.hex | 4099 +++++++++++++++++ .../ota-requestor-app/p6/ota_base_build.sh | 8 + .../ota-requestor-app/p6/ota_update_build.sh | 8 + examples/ota-requestor-app/p6/src/AppTask.cpp | 465 ++ .../p6/src/ButtonHandler.cpp | 98 + .../ota-requestor-app/p6/src/ZclCallbacks.cpp | 56 + .../p6/src/cy8c6xxa_cm4_dual_ota_int.ld | 404 ++ examples/ota-requestor-app/p6/src/main.cpp | 158 + .../p6/third_party/connectedhomeip | 1 + scripts/examples/gn_p6_example.sh | 30 +- src/include/platform/ConfigurationManager.h | 1 + .../GenericConfigurationManagerImpl.cpp | 6 + .../GenericConfigurationManagerImpl.h | 1 + src/platform/P6/BUILD.gn | 15 +- src/platform/P6/ConfigurationManagerImpl.cpp | 17 + src/platform/P6/ConfigurationManagerImpl.h | 2 + src/platform/P6/MTBKeyValueStore.cpp | 10 +- src/platform/P6/OTAImageProcessorImpl.cpp | 213 + src/platform/P6/OTAImageProcessorImpl.h | 74 + src/platform/P6/P6Config.cpp | 10 +- src/platform/P6/P6Config.h | 1 + src/platform/P6/args.gni | 8 +- src/platform/fake/ConfigurationManagerImpl.h | 1 + third_party/p6/BUILD.gn | 16 +- third_party/p6/p6_sdk.gni | 17 +- third_party/p6/p6_sdk/libs/anycloud-ota | 1 + 43 files changed, 10384 insertions(+), 27 deletions(-) create mode 100644 examples/ota-requestor-app/p6/.gn create mode 100644 examples/ota-requestor-app/p6/BUILD.gn create mode 100644 examples/ota-requestor-app/p6/README.md create mode 100644 examples/ota-requestor-app/p6/args.gni create mode 120000 examples/ota-requestor-app/p6/build_overrides create mode 100644 examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_assert.h create mode 100644 examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_config.h create mode 100644 examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_logging.h create mode 100644 examples/ota-requestor-app/p6/config/mcuboot_crypto_acc_config.h create mode 100644 examples/ota-requestor-app/p6/config/mcuboot_crypto_config.h create mode 100644 examples/ota-requestor-app/p6/include/AppConfig.h create mode 100644 examples/ota-requestor-app/p6/include/AppEvent.h create mode 100644 examples/ota-requestor-app/p6/include/AppTask.h create mode 100644 examples/ota-requestor-app/p6/include/ButtonHandler.h create mode 100644 examples/ota-requestor-app/p6/include/CHIPProjectConfig.h create mode 100644 examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex create mode 100755 examples/ota-requestor-app/p6/ota_base_build.sh create mode 100755 examples/ota-requestor-app/p6/ota_update_build.sh create mode 100644 examples/ota-requestor-app/p6/src/AppTask.cpp create mode 100644 examples/ota-requestor-app/p6/src/ButtonHandler.cpp create mode 100644 examples/ota-requestor-app/p6/src/ZclCallbacks.cpp create mode 100644 examples/ota-requestor-app/p6/src/cy8c6xxa_cm4_dual_ota_int.ld create mode 100644 examples/ota-requestor-app/p6/src/main.cpp create mode 120000 examples/ota-requestor-app/p6/third_party/connectedhomeip create mode 100644 src/platform/P6/OTAImageProcessorImpl.cpp create mode 100644 src/platform/P6/OTAImageProcessorImpl.h create mode 160000 third_party/p6/p6_sdk/libs/anycloud-ota diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt index a43f32507055c8..82beacd143f390 100644 --- a/.github/.wordlist.txt +++ b/.github/.wordlist.txt @@ -294,6 +294,7 @@ CY CYW DAC DAP +DAPLINK DataFrame DataModelRevision dataset diff --git a/.gitmodules b/.gitmodules index 3669fb04581332..45cbaf452b0a54 100644 --- a/.gitmodules +++ b/.gitmodules @@ -181,6 +181,9 @@ [submodule "cyw30739_sdk/tools"] path = third_party/cyw30739_sdk/repos/btsdk-tools url = https://github.com/Infineon/btsdk-tools.git +[submodule "third_party/p6/p6_sdk/libs/anycloud-ota"] + path = third_party/p6/p6_sdk/libs/anycloud-ota + url = https://github.com/Infineon/anycloud-ota [submodule "third_party/mbed-mcu-boot/repo"] path = third_party/mbed-mcu-boot/repo url = https://github.com/ATmobica/mcuboot.git diff --git a/examples/ota-requestor-app/p6/.gn b/examples/ota-requestor-app/p6/.gn new file mode 100644 index 00000000000000..81cec9d11a421b --- /dev/null +++ b/examples/ota-requestor-app/p6/.gn @@ -0,0 +1,28 @@ +# Copyright (c) 2021 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build_overrides/build.gni") + +# The location of the build configuration file. +buildconfig = "${build_root}/config/BUILDCONFIG.gn" + +# CHIP uses angle bracket includes. +check_system_includes = true + +default_args = { + target_cpu = "arm" + target_os = "freertos" + + import("//args.gni") +} diff --git a/examples/ota-requestor-app/p6/BUILD.gn b/examples/ota-requestor-app/p6/BUILD.gn new file mode 100644 index 00000000000000..f628f7780c0748 --- /dev/null +++ b/examples/ota-requestor-app/p6/BUILD.gn @@ -0,0 +1,174 @@ +# Copyright (c) 2021 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build_overrides/build.gni") +import("//build_overrides/chip.gni") +import("//build_overrides/p6.gni") + +import("${build_root}/config/defaults.gni") +import("${p6_sdk_build_root}/p6_executable.gni") +import("${p6_sdk_build_root}/p6_sdk.gni") + +assert(current_os == "freertos") + +p6_project_dir = "${chip_root}/examples/ota-requestor-app/p6" +examples_plat_dir = "${chip_root}/examples/platform/p6" + +declare_args() { + # Dump memory usage at link time. + chip_print_memory_usage = false + + # PIN code for PASE session establishment. + setup_pin_code = 20202021 + + # Monitor & log memory usage at runtime. + enable_heap_monitoring = false + + # Build update app + build_update_image = false +} + +config("p6_ota_config") { + ldflags = [ "-T/" + rebase_path("src/cy8c6xxa_cm4_dual_ota_int.ld", + "/", + "${p6_project_dir}") ] + + ldflags += [ "-Wl,--defsym,MCUBOOT_HEADER_SIZE=0x400,--defsym,MCUBOOT_BOOTLOADER_SIZE=0x18000,--defsym,CY_BOOT_PRIMARY_1_SIZE=0x1C0000" ] + + defines = [ + "P6_OTA", + "OTA_SUPPORT ", + "OTA_USE_EXTERNAL_FLASH", + "CY_BOOT_USE_EXTERNAL_FLASH", + "MCUBOOT_HEADER_SIZE=0x400", + "MCUBOOT_MAX_IMG_SECTORS=3584", + "CY_BOOT_SCRATCH_SIZE=0x00004000", + "MCUBOOT_BOOTLOADER_SIZE=0x00018000", + "CY_BOOT_BOOTLOADER_SIZE=0x00018000", + "CY_BOOT_PRIMARY_1_START=0x00018000", + "CY_BOOT_PRIMARY_1_SIZE=0x1C0000", + "CY_BOOT_SECONDARY_1_START=0x00000000", + "CY_BOOT_SECONDARY_1_SIZE=0x001C0000", + "CY_FLASH_ERASE_VALUE=0xFF", + "MCUBOOT_IMAGE_NUMBER=1", + "MCUBOOT_SLOT_SIZE=0x1C0000", + "MCUBOOT_SCRATCH_SIZE=0x4000", + "MCUBOOT_SECTOR_SIZE = 512", + "APP_VERSION_MAJOR=1", + "APP_VERSION_MINOR=0", + "APP_VERSION_BUILD=0", + "MCUBOOT_OVERWRITE_ONLY", + "CY_ENABLE_XIP_PROGRAM", + ] + + if (build_update_image) { + defines += [ "CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION=2" ] + } else { + defines += [ "CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION=1" ] + } +} + +# Warning: Don't change the name of this target without also modifying +# third_party/p6/BUILD.gn and third_party/p6/p6_sdk.gn. There are conditionals +# relying on this name. +p6_sdk_sources("ota_requestor_app_sdk_sources") { + include_dirs = [ + "${chip_root}/src/platform/P6", + "${p6_project_dir}/include", + "${examples_plat_dir}", + "${p6_project_dir}/config", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/mem_config/", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/include/", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/include/flash_map_backend/", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/sysflash/", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/bootutil/include", + ] + + defines = [ + "BOARD_ID=${p6_board}", + "P6_LOG_ENABLED=1", + "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE=${setup_pin_code}", + ] + + sources = [ + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/bootutil/src/bootutil_misc.c", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_flash_map.c", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_flash_psoc6.c", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_smif_psoc6.c", + "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/mem_config/mem_config_sfdp.c", + "${p6_project_dir}/include/CHIPProjectConfig.h", + ] + + public_configs = [ + "${chip_root}/third_party/p6:p6_sdk_config", + ":p6_ota_config", + ] +} + +p6_executable("ota_requestor_app") { + include_dirs = [] + defines = [] + output_name = "chip-p6-ota-requestor-example.out" + + sources = [ + "${examples_plat_dir}/LEDWidget.cpp", + "${examples_plat_dir}/init_p6Platform.cpp", + "src/AppTask.cpp", + "src/ButtonHandler.cpp", + "src/ZclCallbacks.cpp", + "src/main.cpp", + ] + + deps = [ + ":ota_requestor_app_sdk_sources", + "${chip_root}/examples/common/QRCode", + "${chip_root}/examples/ota-requestor-app/ota-requestor-common", + "${chip_root}/src/app/server", + "${chip_root}/src/lib", + "${chip_root}/src/setup_payload", + ] + + include_dirs += [ + "include", + "${examples_plat_dir}", + "${p6_project_dir}/include", + "${chip_root}/examples/ota-requestor-app/ota-requestor-common/include", + ] + + defines = [] + + if (enable_heap_monitoring) { + sources += [ "${examples_plat_dir}/MemMonitoring.cpp" ] + defines += [ "HEAP_MONITORING" ] + } + + if (chip_print_memory_usage) { + ldflags += [ + "-Wl,--print-memory-usage", + "-fstack-usage", + ] + } + + output_dir = root_out_dir +} + +group("p6") { + deps = [ ":ota_requestor_app" ] +} + +group("default") { + deps = [ ":p6" ] +} diff --git a/examples/ota-requestor-app/p6/README.md b/examples/ota-requestor-app/p6/README.md new file mode 100644 index 00000000000000..73c5361389fe6b --- /dev/null +++ b/examples/ota-requestor-app/p6/README.md @@ -0,0 +1,138 @@ +#CHIP P6 OTA Requestor Example + +An example demonstrating the OTA Requestor cluster on a Infineon +CY8CKIT-062S2-43012 board. + +
+ +- [Matter P6 OTA Requestor Example](#chip-p6-ota-requestor-example) + - [Introduction](#introduction) + - [Building](#building) + - [Flashing the Application](#flashing-the-application) + - [Running OTA Update Process](#running-ota-update-process) + - [Notes](#notes) + +
+ + + +## Introduction + +The P6 OTA Requestor example provides a baseline demonstration of a OTA +requestor device, built using Matter and the Infineon Modustoolbox SDK. It can +be controlled by Matter controller over Wi-Fi network. + +The P6 device can be commissioned over Bluetooth Low Energy where the device and +the Matter controller will exchange security information with the Rendezvous +procedure. Wi-Fi Network credentials are then provided to the P6 device which +will then join the network. + + + +## Building + +- [Modustoolbox Software](https://www.cypress.com/products/modustoolbox) + + Refer to `integrations/docker/images/chip-build-infineon/Dockerfile` or + `scripts/examples/gn_p6_example.sh` for downloading the Software and related + tools. + +- Install some additional tools (likely already present for Matter + developers): \$ sudo apt install gcc g++ clang ninja-build python + python3-venv libssl-dev libavahi-client-dev libglib2.0-dev git cmake + python3-pip + +- Supported hardware: + [CY8CKIT-062S2-43012](https://www.cypress.com/CY8CKIT-062S2-43012) + +* The following applications must be built to demonstrate the OTA process: + + - The P6 OTA Requestor App + - The Updated P6 OTA Requestor App (or other app) + - An OTA Provider App (the Linux ota-provider app is used here) + - chip-tool + +* Build the P6 OTA Requestor application from the chip root dir: + + $ ./examples/ota-requestor-app/examples/ota_base_build.sh + +* Build the P6 OTA Update application from the chip root dir: + + $ ./examples/ota-requestor-app/examples/ota_update_build.sh + +* On a RPi4: Build the Linux OTA Provider application from the chip root dir: + + $ ./scripts/examples/gn_build_example.sh examples/ota-provider-app/linux/ out/ota_provider_debug/ chip_config_network_layer_ble=false + +* On a RPi4: Build chip-tool: + + $ ./scripts/examples/gn_build_example.sh examples/chip-tool/ out/chip-tool/ + +* Additionally a pre-compiled bootloader must be flashed to the board. This + can be found at: + + $ ./examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex + + + +## Flashing the Application + +- Flash the bootloader by first putting the CY8CKIT-062S2-43012 board into + KitProg3 DAPLINK Mode by pressing the `MODE SELECT` button. + `KITPROG3 STATUS` LED will blink to indicate the the board is in the proper + mode. A drive named 'DAPLINK' should be automatically mounted. To flash + drag-and-drop matter-psoc6-mcuboot-bootloader.hex into that drive. + +- Put CY8CKIT-062S2-43012 board back into KitProg3 CMSIS-DAP Mode by pressing + the `MODE SELECT` button. `KITPROG3 STATUS` LED is ON confirms board is in + proper mode. + +- On the command line: + + $ cd ~/connectedhomeip + $ python3 out/ota_requestor_debug/chip-p6-ota-requestor-example.flash.py + + + +### Running OTA Update Process + +- Make sure the ota-requestor-app is flashed and booting on the + CY8CKIT-062S2-43012. + +- Transfer out/ota_requestor_update_debug/chip-p6-ota-requestor-example.bin to + a RPi4. + +- On the RPi: In terminal 1 run the Linux ota-provider-app as follows: + + $ ./out/ota_provider_debug/chip-ota-provider-app -f chip-p6-ota-requestor-example.bin + +- On the RPi: In terminal 2 run the following chip-tool commands + + $ ./out/chip-tool/chip-tool pairing ble-wifi 2 "" "" 20202021 3840 + + $ ./out/chip-tool/chip-tool pairing onnetwork 1 20202021 + + $ ./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": [1, 2], "targets": [{"cluster": null, "endpoint": 0, "deviceType": null}]}]' 1 0 + + $ ./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": [1, 2], "targets": [{"cluster": null, "endpoint": 0, "deviceType": null}]}]' 2 0 + + $ ./chip-tool otasoftwareupdaterequestor write default-ota-providers '[{"fabricIndex": 1, "providerNodeID": 1, "endpoint": 0}]' 2 0 + +- Press user button 1 on the CY8CKIT-062S2-43012. This will trigger a + query-image call from the board using the default ota provider list written + in the above commands. + +- Using a serial emulator reading from the CY8CKIT-062S2-43012, you should + observe the updated application being transferred to the board, written to + flash, and, when completed, booted into. + + + +#### Notes + +Raspberry Pi 4 BLE connection issues can be avoided by running the following +commands. These power cycle the BlueTooth hardware and disable BR/EDR mode. + + $ sudo btmgmt -i hci0 power off + $ sudo btmgmt -i hci0 bredr off + $ sudo btmgmt -i hci0 power on diff --git a/examples/ota-requestor-app/p6/args.gni b/examples/ota-requestor-app/p6/args.gni new file mode 100644 index 00000000000000..0afa5bc4780513 --- /dev/null +++ b/examples/ota-requestor-app/p6/args.gni @@ -0,0 +1,28 @@ +# Copyright (c) 2021 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build_overrides/chip.gni") +import("//build_overrides/pigweed.gni") +import("${chip_root}/src/platform/P6/args.gni") + +declare_args() { + chip_enable_ota_requestor = true + + # Disable lock tracking, since our FreeRTOS configuration does not set + # INCLUDE_xSemaphoreGetMutexHolder + chip_stack_lock_tracking = "none" +} + +p6_target_project = + get_label_info(":ota_requestor_app_sdk_sources", "label_no_toolchain") diff --git a/examples/ota-requestor-app/p6/build_overrides b/examples/ota-requestor-app/p6/build_overrides new file mode 120000 index 00000000000000..194ee0b812dc3d --- /dev/null +++ b/examples/ota-requestor-app/p6/build_overrides @@ -0,0 +1 @@ +../../build_overrides/ \ No newline at end of file diff --git a/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_assert.h b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_assert.h new file mode 100644 index 00000000000000..15a69555516030 --- /dev/null +++ b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_assert.h @@ -0,0 +1,20 @@ +/* + * mcuboot_assert.h + * + * Cypress-specific assert() macro redefinition + * + */ + +#ifndef MCUBOOT_ASSERT_H +#define MCUBOOT_ASSERT_H + +#define CYBL_ASSERT(...) Cy_BLServ_Assert(__VA_ARGS__) + +#if !defined(NDEBUG) +#undef assert +#define assert(...) CYBL_ASSERT(__VA_ARGS__) +#else +#define assert +#endif + +#endif /* MCUBOOT_ASSERT_H */ diff --git a/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_config.h b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_config.h new file mode 100644 index 00000000000000..6b11d855ca1d04 --- /dev/null +++ b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_config.h @@ -0,0 +1,151 @@ +/* Copyright 2019 Cypress Semiconductor Corporation + * + * Copyright (c) 2018 Open Source Foundries Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef MCUBOOT_CONFIG_H +#define MCUBOOT_CONFIG_H + +/* + * Template configuration file for MCUboot. + * + * When porting MCUboot to a new target, copy it somewhere that your + * include path can find it as mcuboot_config/mcuboot_config.h, and + * make adjustments to suit your platform. + * + * For examples, see: + * + * boot/zephyr/include/mcuboot_config/mcuboot_config.h + * boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_config.h + */ +/* Default maximum number of flash sectors per image slot; change + * as desirable. */ +#ifndef MCUBOOT_MAX_IMG_SECTORS +#define MCUBOOT_MAX_IMG_SECTORS 128 +#endif + +/* + * Signature types + * + * You must choose exactly one signature type. + */ + +/* Uncomment for RSA signature support */ +//#define MCUBOOT_SIGN_RSA + +/* Uncomment for ECDSA signatures using curve P-256. */ +//#define MCUBOOT_SIGN_EC256 +//#define NUM_ECC_BYTES (256 / 8) // P-256 curve size in bytes, rnok: to make compilable + +// #define MCUBOOT_SIGN_EC + +/* + * Upgrade mode + * + * The default is to support A/B image swapping with rollback. A + * simpler code path, which only supports overwriting the + * existing image with the update image, is also available. + */ +#ifdef MCUBOOT_OVERWRITE_ONLY +/* Uncomment to only erase and overwrite those slot 0 sectors needed + * to install the new image, rather than the entire image slot. */ +/* #define MCUBOOT_OVERWRITE_ONLY_FAST */ +#else +/* Using SWAP w Scratch by default. + * Comment/Uncomment which is needed. */ +/* #define MCUBOOT_SWAP_USING_SCRATCH 1 */ +/* #define MCUBOOT_SWAP_USING_MOVE 1 */ +#define MCUBOOT_SWAP_USING_STATUS 1 +#endif + +/* + * Cryptographic settings + * + * You must choose between mbedTLS and Tinycrypt as source of + * cryptographic primitives. Other cryptographic settings are also + * available. + */ + +/* Uncomment to use ARM's mbedTLS cryptographic primitives */ +#define MCUBOOT_USE_MBED_TLS +/* Uncomment to use Tinycrypt's. */ +/* #define MCUBOOT_USE_TINYCRYPT */ + +/* + * Always check the signature of the image in slot 0 before booting, + * even if no upgrade was performed. This is recommended if the boot + * time penalty is acceptable. + */ +//#define MCUBOOT_VALIDATE_PRIMARY_SLOT + +/* + * Flash abstraction + */ + +/* Uncomment if your flash map API supports flash_area_get_sectors(). + * See the flash APIs for more details. */ +// TODO: FWSECURITY-755 +#define MCUBOOT_USE_FLASH_AREA_GET_SECTORS + +/* Default number of separately updateable images; change in case of + * multiple images. */ +#ifndef MCUBOOT_IMAGE_NUMBER +#define MCUBOOT_IMAGE_NUMBER 1 +#endif + +/* + * Logging + */ + +/* + * If logging is enabled the following functions must be defined by the + * platform: + * + * MCUBOOT_LOG_ERR(...) + * MCUBOOT_LOG_WRN(...) + * MCUBOOT_LOG_INF(...) + * MCUBOOT_LOG_DBG(...) + * + * The following global logging level configuration macros must also be + * defined, each with a unique value. Those will be used to define a global + * configuration and will allow any source files to override the global + * configuration: + * + * MCUBOOT_LOG_LEVEL_OFF + * MCUBOOT_LOG_LEVEL_ERROR + * MCUBOOT_LOG_LEVEL_WARNING + * MCUBOOT_LOG_LEVEL_INFO + * MCUBOOT_LOG_LEVEL_DEBUG + * + * The global logging level must be defined, with one of the previously defined + * logging levels: + * + * #define MCUBOOT_LOG_LEVEL MCUBOOT_LOG_LEVEL_(OFF|ERROR|WARNING|INFO|DEBUG) + * + * MCUBOOT_LOG_LEVEL sets the minimum level that will be logged. The function + * priority is: + * + * MCUBOOT_LOG_ERR > MCUBOOT_LOG_WRN > MCUBOOT_LOG_INF > MCUBOOT_LOG_DBG + * + * NOTE: Each source file is still able to request its own logging level by + * defining BOOT_LOG_LEVEL before #including `bootutil_log.h` + */ +#define MCUBOOT_HAVE_LOGGING 1 + +/* + * Assertions + */ + +/* Uncomment if your platform has its own mcuboot_config/mcuboot_assert.h. + * If so, it must provide an ASSERT macro for use by bootutil. Otherwise, + * "assert" is used. */ +//#define MCUBOOT_HAVE_ASSERT_H + +#define MCUBOOT_WATCHDOG_FEED() \ + do \ + { \ + /* TODO: to be implemented */ \ + } while (0) + +#endif /* MCUBOOT_CONFIG_H */ diff --git a/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_logging.h b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_logging.h new file mode 100644 index 00000000000000..35424b4c5ad96d --- /dev/null +++ b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_logging.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018 Nordic Semiconductor ASA + * Copyright (c) 2015 Runtime Inc + * Copyright (c) 2020 Cypress Semiconductor Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/*******************************************************************************/ + +#ifndef MCUBOOT_LOGGING_H +#define MCUBOOT_LOGGING_H + +#include + +#define MCUBOOT_LOG_LEVEL_OFF 0 +#define MCUBOOT_LOG_LEVEL_ERROR 1 +#define MCUBOOT_LOG_LEVEL_WARNING 2 +#define MCUBOOT_LOG_LEVEL_INFO 3 +#define MCUBOOT_LOG_LEVEL_DEBUG 4 + +/* + * The compiled log level determines the maximum level that can be + * printed. Messages at or below this level can be printed, provided + * they are also enabled through the Rust logging system, such as by + * setting RUST_LOG to bootsim::api=info. + */ +#ifndef MCUBOOT_LOG_LEVEL +#define MCUBOOT_LOG_LEVEL MCUBOOT_LOG_LEVEL_INFO +#endif + +int sim_log_enabled(int level); + +#define sim_log_enabled(x) 1 + +#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_ERROR +#define MCUBOOT_LOG_ERR(_fmt, ...) \ + do \ + { \ + if (sim_log_enabled(MCUBOOT_LOG_LEVEL_ERROR)) \ + { \ + fprintf(stderr, "[ERR] " _fmt "\n\r", ##__VA_ARGS__); \ + } \ + } while (0) +#else +#define MCUBOOT_LOG_ERR(...) IGNORE(__VA_ARGS__) +#endif + +#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_WARNING +#define MCUBOOT_LOG_WRN(_fmt, ...) \ + do \ + { \ + if (sim_log_enabled(MCUBOOT_LOG_LEVEL_WARNING)) \ + { \ + fprintf(stderr, "[WRN] " _fmt "\n\r", ##__VA_ARGS__); \ + } \ + } while (0) +#else +#define MCUBOOT_LOG_WRN(...) IGNORE(__VA_ARGS__) +#endif + +#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_INFO +#define MCUBOOT_LOG_INF(_fmt, ...) \ + do \ + { \ + if (sim_log_enabled(MCUBOOT_LOG_LEVEL_INFO)) \ + { \ + fprintf(stderr, "[INF] " _fmt "\n\r", ##__VA_ARGS__); \ + } \ + } while (0) +#else +#define MCUBOOT_LOG_INF(...) IGNORE(__VA_ARGS__) +#endif + +#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_DEBUG +#define MCUBOOT_LOG_DBG(_fmt, ...) \ + do \ + { \ + if (sim_log_enabled(MCUBOOT_LOG_LEVEL_DEBUG)) \ + { \ + fprintf(stderr, "[DBG] " _fmt "\n\r", ##__VA_ARGS__); \ + } \ + } while (0) +#else +#define MCUBOOT_LOG_DBG(...) IGNORE(__VA_ARGS__) +#endif + +#define MCUBOOT_LOG_MODULE_DECLARE(...) + +#endif /* MCUBOOT_LOGGING_H */ diff --git a/examples/ota-requestor-app/p6/config/mcuboot_crypto_acc_config.h b/examples/ota-requestor-app/p6/config/mcuboot_crypto_acc_config.h new file mode 100644 index 00000000000000..2bf440a549bc49 --- /dev/null +++ b/examples/ota-requestor-app/p6/config/mcuboot_crypto_acc_config.h @@ -0,0 +1,52 @@ +/* + * mbed Microcontroller Library + * Copyright (c) 2019 Cypress Semiconductor Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * \file mcuboot_crypto_acc_config.h + * \version 1.1 + */ + +#ifndef MCUBOOT_MBEDTLS_DEVICE_H +#define MCUBOOT_MBEDTLS_DEVICE_H + +/* Currently this target supports SHA1 */ +// #define MBEDTLS_SHA1_C + +#define MBEDTLS_SHA1_ALT +#define MBEDTLS_SHA256_ALT +#define MBEDTLS_SHA512_ALT + +/* Currently this target supports CBC, CFB, OFB, CTR and XTS cipher modes */ +#define MBEDTLS_AES_ALT +// #define MBEDTLS_CIPHER_MODE_CBC +// #define MBEDTLS_CIPHER_MODE_CFB +// #define MBEDTLS_CIPHER_MODE_OFB +// #define MBEDTLS_CIPHER_MODE_CTR +// #define MBEDTLS_CIPHER_MODE_XTS + +/* Only NIST-P curves are currently supported */ +#define MBEDTLS_ECP_ALT +// #define MBEDTLS_ECP_DP_SECP192R1_ENABLED +// #define MBEDTLS_ECP_DP_SECP224R1_ENABLED +// #define MBEDTLS_ECP_DP_SECP256R1_ENABLED +// #define MBEDTLS_ECP_DP_SECP384R1_ENABLED +// #define MBEDTLS_ECP_DP_SECP521R1_ENABLED + +#define MBEDTLS_ECDSA_SIGN_ALT +#define MBEDTLS_ECDSA_VERIFY_ALT + +#endif /* MCUBOOT_MBEDTLS_DEVICE_H */ diff --git a/examples/ota-requestor-app/p6/config/mcuboot_crypto_config.h b/examples/ota-requestor-app/p6/config/mcuboot_crypto_config.h new file mode 100644 index 00000000000000..4f0f7d383b4bc4 --- /dev/null +++ b/examples/ota-requestor-app/p6/config/mcuboot_crypto_config.h @@ -0,0 +1,3606 @@ +/** + * \file config.h + * + * \brief Configuration options (set of defines) + * + * This set of compile-time options may be used to enable + * or disable features selectively, and reduce the global + * memory footprint. + */ +/* + * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is part of mbed TLS (https://tls.mbed.org) + */ + +#ifndef MBEDTLS_CONFIG_H +#define MBEDTLS_CONFIG_H + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +/** + * \name SECTION: System support + * + * This section sets system specific settings. + * \{ + */ + +/** + * \def MBEDTLS_HAVE_ASM + * + * The compiler has support for asm(). + * + * Requires support for asm() in compiler. + * + * Used in: + * library/aria.c + * library/timing.c + * include/mbedtls/bn_mul.h + * + * Required by: + * MBEDTLS_AESNI_C + * MBEDTLS_PADLOCK_C + * + * Comment to disable the use of assembly code. + */ +#define MBEDTLS_HAVE_ASM + +/** + * \def MBEDTLS_NO_UDBL_DIVISION + * + * The platform lacks support for double-width integer division (64-bit + * division on a 32-bit platform, 128-bit division on a 64-bit platform). + * + * Used in: + * include/mbedtls/bignum.h + * library/bignum.c + * + * The bignum code uses double-width division to speed up some operations. + * Double-width division is often implemented in software that needs to + * be linked with the program. The presence of a double-width integer + * type is usually detected automatically through preprocessor macros, + * but the automatic detection cannot know whether the code needs to + * and can be linked with an implementation of division for that type. + * By default division is assumed to be usable if the type is present. + * Uncomment this option to prevent the use of double-width division. + * + * Note that division for the native integer type is always required. + * Furthermore, a 64-bit type is always required even on a 32-bit + * platform, but it need not support multiplication or division. In some + * cases it is also desirable to disable some double-width operations. For + * example, if double-width division is implemented in software, disabling + * it can reduce code size in some embedded targets. + */ +//#define MBEDTLS_NO_UDBL_DIVISION + +/** + * \def MBEDTLS_NO_64BIT_MULTIPLICATION + * + * The platform lacks support for 32x32 -> 64-bit multiplication. + * + * Used in: + * library/poly1305.c + * + * Some parts of the library may use multiplication of two unsigned 32-bit + * operands with a 64-bit result in order to speed up computations. On some + * platforms, this is not available in hardware and has to be implemented in + * software, usually in a library provided by the toolchain. + * + * Sometimes it is not desirable to have to link to that library. This option + * removes the dependency of that library on platforms that lack a hardware + * 64-bit multiplier by embedding a software implementation in Mbed TLS. + * + * Note that depending on the compiler, this may decrease performance compared + * to using the library function provided by the toolchain. + */ +//#define MBEDTLS_NO_64BIT_MULTIPLICATION + +/** + * \def MBEDTLS_HAVE_SSE2 + * + * CPU supports SSE2 instruction set. + * + * Uncomment if the CPU supports SSE2 (IA-32 specific). + */ +//#define MBEDTLS_HAVE_SSE2 + +/** + * \def MBEDTLS_HAVE_TIME + * + * System has time.h and time(). + * The time does not need to be correct, only time differences are used, + * by contrast with MBEDTLS_HAVE_TIME_DATE + * + * Defining MBEDTLS_HAVE_TIME allows you to specify MBEDTLS_PLATFORM_TIME_ALT, + * MBEDTLS_PLATFORM_TIME_MACRO, MBEDTLS_PLATFORM_TIME_TYPE_MACRO and + * MBEDTLS_PLATFORM_STD_TIME. + * + * Comment if your system does not support time functions + */ +#define MBEDTLS_HAVE_TIME + +/** + * \def MBEDTLS_HAVE_TIME_DATE + * + * System has time.h, time(), and an implementation for + * mbedtls_platform_gmtime_r() (see below). + * The time needs to be correct (not necessarily very accurate, but at least + * the date should be correct). This is used to verify the validity period of + * X.509 certificates. + * + * Comment if your system does not have a correct clock. + * + * \note mbedtls_platform_gmtime_r() is an abstraction in platform_util.h that + * behaves similarly to the gmtime_r() function from the C standard. Refer to + * the documentation for mbedtls_platform_gmtime_r() for more information. + * + * \note It is possible to configure an implementation for + * mbedtls_platform_gmtime_r() at compile-time by using the macro + * MBEDTLS_PLATFORM_GMTIME_R_ALT. + */ +#define MBEDTLS_HAVE_TIME_DATE + +/** + * \def MBEDTLS_PLATFORM_MEMORY + * + * Enable the memory allocation layer. + * + * By default mbed TLS uses the system-provided calloc() and free(). + * This allows different allocators (self-implemented or provided) to be + * provided to the platform abstraction layer. + * + * Enabling MBEDTLS_PLATFORM_MEMORY without the + * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide + * "mbedtls_platform_set_calloc_free()" allowing you to set an alternative calloc() and + * free() function pointer at runtime. + * + * Enabling MBEDTLS_PLATFORM_MEMORY and specifying + * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the + * alternate function at compile time. + * + * Requires: MBEDTLS_PLATFORM_C + * + * Enable this layer to allow use of alternative memory allocators. + */ +//#define MBEDTLS_PLATFORM_MEMORY + +/** + * \def MBEDTLS_PLATFORM_NO_STD_FUNCTIONS + * + * Do not assign standard functions in the platform layer (e.g. calloc() to + * MBEDTLS_PLATFORM_STD_CALLOC and printf() to MBEDTLS_PLATFORM_STD_PRINTF) + * + * This makes sure there are no linking errors on platforms that do not support + * these functions. You will HAVE to provide alternatives, either at runtime + * via the platform_set_xxx() functions or at compile time by setting + * the MBEDTLS_PLATFORM_STD_XXX defines, or enabling a + * MBEDTLS_PLATFORM_XXX_MACRO. + * + * Requires: MBEDTLS_PLATFORM_C + * + * Uncomment to prevent default assignment of standard functions in the + * platform layer. + */ +//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS + +/** + * \def MBEDTLS_PLATFORM_EXIT_ALT + * + * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let mbed TLS support the + * function in the platform abstraction layer. + * + * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will + * provide a function "mbedtls_platform_set_printf()" that allows you to set an + * alternative printf function pointer. + * + * All these define require MBEDTLS_PLATFORM_C to be defined! + * + * \note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows; + * it will be enabled automatically by check_config.h + * + * \warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as + * MBEDTLS_PLATFORM_XXX_MACRO! + * + * Requires: MBEDTLS_PLATFORM_TIME_ALT requires MBEDTLS_HAVE_TIME + * + * Uncomment a macro to enable alternate implementation of specific base + * platform function + */ +//#define MBEDTLS_PLATFORM_EXIT_ALT +//#define MBEDTLS_PLATFORM_TIME_ALT +//#define MBEDTLS_PLATFORM_FPRINTF_ALT +//#define MBEDTLS_PLATFORM_PRINTF_ALT +//#define MBEDTLS_PLATFORM_SNPRINTF_ALT +//#define MBEDTLS_PLATFORM_VSNPRINTF_ALT +//#define MBEDTLS_PLATFORM_NV_SEED_ALT +//#define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT + +/** + * \def MBEDTLS_DEPRECATED_WARNING + * + * Mark deprecated functions so that they generate a warning if used. + * Functions deprecated in one version will usually be removed in the next + * version. You can enable this to help you prepare the transition to a new + * major version by making sure your code is not using these functions. + * + * This only works with GCC and Clang. With other compilers, you may want to + * use MBEDTLS_DEPRECATED_REMOVED + * + * Uncomment to get warnings on using deprecated functions. + */ +//#define MBEDTLS_DEPRECATED_WARNING + +/** + * \def MBEDTLS_DEPRECATED_REMOVED + * + * Remove deprecated functions so that they generate an error if used. + * Functions deprecated in one version will usually be removed in the next + * version. You can enable this to help you prepare the transition to a new + * major version by making sure your code is not using these functions. + * + * Uncomment to get errors on using deprecated functions. + */ +//#define MBEDTLS_DEPRECATED_REMOVED + +/** + * \def MBEDTLS_CHECK_PARAMS + * + * This configuration option controls whether the library validates more of + * the parameters passed to it. + * + * When this flag is not defined, the library only attempts to validate an + * input parameter if: (1) they may come from the outside world (such as the + * network, the filesystem, etc.) or (2) not validating them could result in + * internal memory errors such as overflowing a buffer controlled by the + * library. On the other hand, it doesn't attempt to validate parameters whose + * values are fully controlled by the application (such as pointers). + * + * When this flag is defined, the library additionally attempts to validate + * parameters that are fully controlled by the application, and should always + * be valid if the application code is fully correct and trusted. + * + * For example, when a function accepts as input a pointer to a buffer that may + * contain untrusted data, and its documentation mentions that this pointer + * must not be NULL: + * - The pointer is checked to be non-NULL only if this option is enabled. + * - The content of the buffer is always validated. + * + * When this flag is defined, if a library function receives a parameter that + * is invalid: + * 1. The function will invoke the macro MBEDTLS_PARAM_FAILED(). + * 2. If MBEDTLS_PARAM_FAILED() did not terminate the program, the function + * will immediately return. If the function returns an Mbed TLS error code, + * the error code in this case is MBEDTLS_ERR_xxx_BAD_INPUT_DATA. + * + * When defining this flag, you also need to arrange a definition for + * MBEDTLS_PARAM_FAILED(). You can do this by any of the following methods: + * - By default, the library defines MBEDTLS_PARAM_FAILED() to call a + * function mbedtls_param_failed(), but the library does not define this + * function. If you do not make any other arrangements, you must provide + * the function mbedtls_param_failed() in your application. + * See `platform_util.h` for its prototype. + * - If you enable the macro #MBEDTLS_CHECK_PARAMS_ASSERT, then the + * library defines MBEDTLS_PARAM_FAILED(\c cond) to be `assert(cond)`. + * You can still supply an alternative definition of + * MBEDTLS_PARAM_FAILED(), which may call `assert`. + * - If you define a macro MBEDTLS_PARAM_FAILED() before including `config.h` + * or you uncomment the definition of MBEDTLS_PARAM_FAILED() in `config.h`, + * the library will call the macro that you defined and will not supply + * its own version. Note that if MBEDTLS_PARAM_FAILED() calls `assert`, + * you need to enable #MBEDTLS_CHECK_PARAMS_ASSERT so that library source + * files include ``. + * + * Uncomment to enable validation of application-controlled parameters. + */ +//#define MBEDTLS_CHECK_PARAMS + +/** + * \def MBEDTLS_CHECK_PARAMS_ASSERT + * + * Allow MBEDTLS_PARAM_FAILED() to call `assert`, and make it default to + * `assert`. This macro is only used if #MBEDTLS_CHECK_PARAMS is defined. + * + * If this macro is not defined, then MBEDTLS_PARAM_FAILED() defaults to + * calling a function mbedtls_param_failed(). See the documentation of + * #MBEDTLS_CHECK_PARAMS for details. + * + * Uncomment to allow MBEDTLS_PARAM_FAILED() to call `assert`. + */ +//#define MBEDTLS_CHECK_PARAMS_ASSERT + +/* \} name SECTION: System support */ + +/** + * \name SECTION: mbed TLS feature support + * + * This section sets support for features that are or are not needed + * within the modules that are enabled. + * \{ + */ + +/** + * \def MBEDTLS_TIMING_ALT + * + * Uncomment to provide your own alternate implementation for mbedtls_timing_hardclock(), + * mbedtls_timing_get_timer(), mbedtls_set_alarm(), mbedtls_set/get_delay() + * + * Only works if you have MBEDTLS_TIMING_C enabled. + * + * You will need to provide a header "timing_alt.h" and an implementation at + * compile time. + */ +//#define MBEDTLS_TIMING_ALT + +/** + * \def MBEDTLS_AES_ALT + * + * MBEDTLS__MODULE_NAME__ALT: Uncomment a macro to let mbed TLS use your + * alternate core implementation of a symmetric crypto, an arithmetic or hash + * module (e.g. platform specific assembly optimized implementations). Keep + * in mind that the function prototypes should remain the same. + * + * This replaces the whole module. If you only want to replace one of the + * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags. + * + * Example: In case you uncomment MBEDTLS_AES_ALT, mbed TLS will no longer + * provide the "struct mbedtls_aes_context" definition and omit the base + * function declarations and implementations. "aes_alt.h" will be included from + * "aes.h" to include the new function definitions. + * + * Uncomment a macro to enable alternate implementation of the corresponding + * module. + * + * \warning MD2, MD4, MD5, ARC4, DES and SHA-1 are considered weak and their + * use constitutes a security risk. If possible, we recommend + * avoiding dependencies on them, and considering stronger message + * digests and ciphers instead. + * + */ +//#define MBEDTLS_AES_ALT +//#define MBEDTLS_ARC4_ALT +//#define MBEDTLS_ARIA_ALT +//#define MBEDTLS_BLOWFISH_ALT +//#define MBEDTLS_CAMELLIA_ALT +//#define MBEDTLS_CCM_ALT +//#define MBEDTLS_CHACHA20_ALT +//#define MBEDTLS_CHACHAPOLY_ALT +//#define MBEDTLS_CMAC_ALT +//#define MBEDTLS_DES_ALT +//#define MBEDTLS_DHM_ALT +//#define MBEDTLS_ECJPAKE_ALT +//#define MBEDTLS_GCM_ALT +//#define MBEDTLS_NIST_KW_ALT +//#define MBEDTLS_MD2_ALT +//#define MBEDTLS_MD4_ALT +//#define MBEDTLS_MD5_ALT +//#define MBEDTLS_POLY1305_ALT +//#define MBEDTLS_RIPEMD160_ALT +//#define MBEDTLS_RSA_ALT +//#define MBEDTLS_SHA1_ALT +//#define MBEDTLS_SHA256_ALT +//#define MBEDTLS_SHA512_ALT +//#define MBEDTLS_XTEA_ALT + +/* + * When replacing the elliptic curve module, pleace consider, that it is + * implemented with two .c files: + * - ecp.c + * - ecp_curves.c + * You can replace them very much like all the other MBEDTLS__MODULE_NAME__ALT + * macros as described above. The only difference is that you have to make sure + * that you provide functionality for both .c files. + */ +//#define MBEDTLS_ECP_ALT + +/** + * \def MBEDTLS_MD2_PROCESS_ALT + * + * MBEDTLS__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use you + * alternate core implementation of symmetric crypto or hash function. Keep in + * mind that function prototypes should remain the same. + * + * This replaces only one function. The header file from mbed TLS is still + * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags. + * + * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, mbed TLS will + * no longer provide the mbedtls_sha1_process() function, but it will still provide + * the other function (using your mbedtls_sha1_process() function) and the definition + * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible + * with this definition. + * + * \note Because of a signature change, the core AES encryption and decryption routines are + * currently named mbedtls_aes_internal_encrypt and mbedtls_aes_internal_decrypt, + * respectively. When setting up alternative implementations, these functions should + * be overridden, but the wrapper functions mbedtls_aes_decrypt and mbedtls_aes_encrypt + * must stay untouched. + * + * \note If you use the AES_xxx_ALT macros, then is is recommended to also set + * MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES + * tables. + * + * Uncomment a macro to enable alternate implementation of the corresponding + * function. + * + * \warning MD2, MD4, MD5, DES and SHA-1 are considered weak and their use + * constitutes a security risk. If possible, we recommend avoiding + * dependencies on them, and considering stronger message digests + * and ciphers instead. + * + */ +//#define MBEDTLS_MD2_PROCESS_ALT +//#define MBEDTLS_MD4_PROCESS_ALT +//#define MBEDTLS_MD5_PROCESS_ALT +//#define MBEDTLS_RIPEMD160_PROCESS_ALT +//#define MBEDTLS_SHA1_PROCESS_ALT +//#define MBEDTLS_SHA256_PROCESS_ALT +//#define MBEDTLS_SHA512_PROCESS_ALT +//#define MBEDTLS_DES_SETKEY_ALT +//#define MBEDTLS_DES_CRYPT_ECB_ALT +//#define MBEDTLS_DES3_CRYPT_ECB_ALT +//#define MBEDTLS_AES_SETKEY_ENC_ALT +//#define MBEDTLS_AES_SETKEY_DEC_ALT +//#define MBEDTLS_AES_ENCRYPT_ALT +//#define MBEDTLS_AES_DECRYPT_ALT +//#define MBEDTLS_ECDH_GEN_PUBLIC_ALT +//#define MBEDTLS_ECDH_COMPUTE_SHARED_ALT +//#define MBEDTLS_ECDSA_VERIFY_ALT +//#define MBEDTLS_ECDSA_SIGN_ALT +//#define MBEDTLS_ECDSA_GENKEY_ALT + +/** + * \def MBEDTLS_ECP_INTERNAL_ALT + * + * Expose a part of the internal interface of the Elliptic Curve Point module. + * + * MBEDTLS_ECP__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use your + * alternative core implementation of elliptic curve arithmetic. Keep in mind + * that function prototypes should remain the same. + * + * This partially replaces one function. The header file from mbed TLS is still + * used, in contrast to the MBEDTLS_ECP_ALT flag. The original implementation + * is still present and it is used for group structures not supported by the + * alternative. + * + * Any of these options become available by defining MBEDTLS_ECP_INTERNAL_ALT + * and implementing the following functions: + * unsigned char mbedtls_internal_ecp_grp_capable( + * const mbedtls_ecp_group *grp ) + * int mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp ) + * void mbedtls_internal_ecp_free( const mbedtls_ecp_group *grp ) + * The mbedtls_internal_ecp_grp_capable function should return 1 if the + * replacement functions implement arithmetic for the given group and 0 + * otherwise. + * The functions mbedtls_internal_ecp_init and mbedtls_internal_ecp_free are + * called before and after each point operation and provide an opportunity to + * implement optimized set up and tear down instructions. + * + * Example: In case you uncomment MBEDTLS_ECP_INTERNAL_ALT and + * MBEDTLS_ECP_DOUBLE_JAC_ALT, mbed TLS will still provide the ecp_double_jac + * function, but will use your mbedtls_internal_ecp_double_jac if the group is + * supported (your mbedtls_internal_ecp_grp_capable function returns 1 when + * receives it as an argument). If the group is not supported then the original + * implementation is used. The other functions and the definition of + * mbedtls_ecp_group and mbedtls_ecp_point will not change, so your + * implementation of mbedtls_internal_ecp_double_jac and + * mbedtls_internal_ecp_grp_capable must be compatible with this definition. + * + * Uncomment a macro to enable alternate implementation of the corresponding + * function. + */ +/* Required for all the functions in this section */ +//#define MBEDTLS_ECP_INTERNAL_ALT +/* Support for Weierstrass curves with Jacobi representation */ +//#define MBEDTLS_ECP_RANDOMIZE_JAC_ALT +//#define MBEDTLS_ECP_ADD_MIXED_ALT +//#define MBEDTLS_ECP_DOUBLE_JAC_ALT +//#define MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT +//#define MBEDTLS_ECP_NORMALIZE_JAC_ALT +/* Support for curves with Montgomery arithmetic */ +//#define MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT +//#define MBEDTLS_ECP_RANDOMIZE_MXZ_ALT +//#define MBEDTLS_ECP_NORMALIZE_MXZ_ALT + +/** + * \def MBEDTLS_TEST_NULL_ENTROPY + * + * Enables testing and use of mbed TLS without any configured entropy sources. + * This permits use of the library on platforms before an entropy source has + * been integrated (see for example the MBEDTLS_ENTROPY_HARDWARE_ALT or the + * MBEDTLS_ENTROPY_NV_SEED switches). + * + * WARNING! This switch MUST be disabled in production builds, and is suitable + * only for development. + * Enabling the switch negates any security provided by the library. + * + * Requires MBEDTLS_ENTROPY_C, MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES + * + */ +//#define MBEDTLS_TEST_NULL_ENTROPY + +/** + * \def MBEDTLS_ENTROPY_HARDWARE_ALT + * + * Uncomment this macro to let mbed TLS use your own implementation of a + * hardware entropy collector. + * + * Your function must be called \c mbedtls_hardware_poll(), have the same + * prototype as declared in entropy_poll.h, and accept NULL as first argument. + * + * Uncomment to use your own hardware entropy collector. + */ +//#define MBEDTLS_ENTROPY_HARDWARE_ALT + +/** + * \def MBEDTLS_AES_ROM_TABLES + * + * Use precomputed AES tables stored in ROM. + * + * Uncomment this macro to use precomputed AES tables stored in ROM. + * Comment this macro to generate AES tables in RAM at runtime. + * + * Tradeoff: Using precomputed ROM tables reduces RAM usage by ~8kb + * (or ~2kb if \c MBEDTLS_AES_FEWER_TABLES is used) and reduces the + * initialization time before the first AES operation can be performed. + * It comes at the cost of additional ~8kb ROM use (resp. ~2kb if \c + * MBEDTLS_AES_FEWER_TABLES below is used), and potentially degraded + * performance if ROM access is slower than RAM access. + * + * This option is independent of \c MBEDTLS_AES_FEWER_TABLES. + * + */ +//#define MBEDTLS_AES_ROM_TABLES + +/** + * \def MBEDTLS_AES_FEWER_TABLES + * + * Use less ROM/RAM for AES tables. + * + * Uncommenting this macro omits 75% of the AES tables from + * ROM / RAM (depending on the value of \c MBEDTLS_AES_ROM_TABLES) + * by computing their values on the fly during operations + * (the tables are entry-wise rotations of one another). + * + * Tradeoff: Uncommenting this reduces the RAM / ROM footprint + * by ~6kb but at the cost of more arithmetic operations during + * runtime. Specifically, one has to compare 4 accesses within + * different tables to 4 accesses with additional arithmetic + * operations within the same table. The performance gain/loss + * depends on the system and memory details. + * + * This option is independent of \c MBEDTLS_AES_ROM_TABLES. + * + */ +//#define MBEDTLS_AES_FEWER_TABLES + +/** + * \def MBEDTLS_CAMELLIA_SMALL_MEMORY + * + * Use less ROM for the Camellia implementation (saves about 768 bytes). + * + * Uncomment this macro to use less memory for Camellia. + */ +//#define MBEDTLS_CAMELLIA_SMALL_MEMORY + +/** + * \def MBEDTLS_CIPHER_MODE_CBC + * + * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers. + */ +#define MBEDTLS_CIPHER_MODE_CBC + +/** + * \def MBEDTLS_CIPHER_MODE_CFB + * + * Enable Cipher Feedback mode (CFB) for symmetric ciphers. + */ +#define MBEDTLS_CIPHER_MODE_CFB + +/** + * \def MBEDTLS_CIPHER_MODE_CTR + * + * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. + */ +#define MBEDTLS_CIPHER_MODE_CTR + +/** + * \def MBEDTLS_CIPHER_MODE_OFB + * + * Enable Output Feedback mode (OFB) for symmetric ciphers. + */ +#define MBEDTLS_CIPHER_MODE_OFB + +/** + * \def MBEDTLS_CIPHER_MODE_XTS + * + * Enable Xor-encrypt-xor with ciphertext stealing mode (XTS) for AES. + */ +#define MBEDTLS_CIPHER_MODE_XTS + +/** + * \def MBEDTLS_CIPHER_NULL_CIPHER + * + * Enable NULL cipher. + * Warning: Only do so when you know what you are doing. This allows for + * encryption or channels without any security! + * + * Requires MBEDTLS_ENABLE_WEAK_CIPHERSUITES as well to enable + * the following ciphersuites: + * MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA + * MBEDTLS_TLS_RSA_WITH_NULL_SHA256 + * MBEDTLS_TLS_RSA_WITH_NULL_SHA + * MBEDTLS_TLS_RSA_WITH_NULL_MD5 + * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA + * MBEDTLS_TLS_PSK_WITH_NULL_SHA384 + * MBEDTLS_TLS_PSK_WITH_NULL_SHA256 + * MBEDTLS_TLS_PSK_WITH_NULL_SHA + * + * Uncomment this macro to enable the NULL cipher and ciphersuites + */ +//#define MBEDTLS_CIPHER_NULL_CIPHER + +/** + * \def MBEDTLS_CIPHER_PADDING_PKCS7 + * + * MBEDTLS_CIPHER_PADDING_XXX: Uncomment or comment macros to add support for + * specific padding modes in the cipher layer with cipher modes that support + * padding (e.g. CBC) + * + * If you disable all padding modes, only full blocks can be used with CBC. + * + * Enable padding modes in the cipher layer. + */ +#define MBEDTLS_CIPHER_PADDING_PKCS7 +#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS +#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN +#define MBEDTLS_CIPHER_PADDING_ZEROS + +/** + * \def MBEDTLS_ENABLE_WEAK_CIPHERSUITES + * + * Enable weak ciphersuites in SSL / TLS. + * Warning: Only do so when you know what you are doing. This allows for + * channels with virtually no security at all! + * + * This enables the following ciphersuites: + * MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA + * + * Uncomment this macro to enable weak ciphersuites + * + * \warning DES is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers instead. + */ +//#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES + +/** + * \def MBEDTLS_REMOVE_ARC4_CIPHERSUITES + * + * Remove RC4 ciphersuites by default in SSL / TLS. + * This flag removes the ciphersuites based on RC4 from the default list as + * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible to + * enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including them + * explicitly. + * + * Uncomment this macro to remove RC4 ciphersuites by default. + */ +#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES + +/** + * \def MBEDTLS_REMOVE_3DES_CIPHERSUITES + * + * Remove 3DES ciphersuites by default in SSL / TLS. + * This flag removes the ciphersuites based on 3DES from the default list as + * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible + * to enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including + * them explicitly. + * + * A man-in-the-browser attacker can recover authentication tokens sent through + * a TLS connection using a 3DES based cipher suite (see "On the Practical + * (In-)Security of 64-bit Block Ciphers" by Karthikeyan Bhargavan and Gaƫtan + * Leurent, see https://sweet32.info/SWEET32_CCS16.pdf). If this attack falls + * in your threat model or you are unsure, then you should keep this option + * enabled to remove 3DES based cipher suites. + * + * Comment this macro to keep 3DES in the default ciphersuite list. + */ +#define MBEDTLS_REMOVE_3DES_CIPHERSUITES + +/** + * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED + * + * MBEDTLS_ECP_XXXX_ENABLED: Enables specific curves within the Elliptic Curve + * module. By default all supported curves are enabled. + * + * Comment macros to disable the curve and functions for it + */ +// #define MBEDTLS_ECP_DP_SECP192R1_ENABLED +#define MBEDTLS_ECP_DP_SECP224R1_ENABLED +#define MBEDTLS_ECP_DP_SECP256R1_ENABLED +// #define MBEDTLS_ECP_DP_SECP384R1_ENABLED +// #define MBEDTLS_ECP_DP_SECP521R1_ENABLED +// #define MBEDTLS_ECP_DP_SECP192K1_ENABLED +// #define MBEDTLS_ECP_DP_SECP224K1_ENABLED +// #define MBEDTLS_ECP_DP_SECP256K1_ENABLED +// #define MBEDTLS_ECP_DP_BP256R1_ENABLED +// #define MBEDTLS_ECP_DP_BP384R1_ENABLED +// #define MBEDTLS_ECP_DP_BP512R1_ENABLED +// #define MBEDTLS_ECP_DP_CURVE25519_ENABLED +// #define MBEDTLS_ECP_DP_CURVE448_ENABLED + +/** + * \def MBEDTLS_ECP_NIST_OPTIM + * + * Enable specific 'modulo p' routines for each NIST prime. + * Depending on the prime and architecture, makes operations 4 to 8 times + * faster on the corresponding curve. + * + * Comment this macro to disable NIST curves optimisation. + */ +#define MBEDTLS_ECP_NIST_OPTIM + +/** + * \def MBEDTLS_ECP_RESTARTABLE + * + * Enable "non-blocking" ECC operations that can return early and be resumed. + * + * This allows various functions to pause by returning + * #MBEDTLS_ERR_ECP_IN_PROGRESS (or, for functions in the SSL module, + * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) and then be called later again in + * order to further progress and eventually complete their operation. This is + * controlled through mbedtls_ecp_set_max_ops() which limits the maximum + * number of ECC operations a function may perform before pausing; see + * mbedtls_ecp_set_max_ops() for more information. + * + * This is useful in non-threaded environments if you want to avoid blocking + * for too long on ECC (and, hence, X.509 or SSL/TLS) operations. + * + * Uncomment this macro to enable restartable ECC computations. + * + * \note This option only works with the default software implementation of + * elliptic curve functionality. It is incompatible with + * MBEDTLS_ECP_ALT, MBEDTLS_ECDH_XXX_ALT, MBEDTLS_ECDSA_XXX_ALT + * and MBEDTLS_ECDH_LEGACY_CONTEXT. + */ +//#define MBEDTLS_ECP_RESTARTABLE + +/** + * \def MBEDTLS_ECDH_LEGACY_CONTEXT + * + * Use a backward compatible ECDH context. + * + * Mbed TLS supports two formats for ECDH contexts (#mbedtls_ecdh_context + * defined in `ecdh.h`). For most applications, the choice of format makes + * no difference, since all library functions can work with either format, + * except that the new format is incompatible with MBEDTLS_ECP_RESTARTABLE. + + * The new format used when this option is disabled is smaller + * (56 bytes on a 32-bit platform). In future versions of the library, it + * will support alternative implementations of ECDH operations. + * The new format is incompatible with applications that access + * context fields directly and with restartable ECP operations. + * + * Define this macro if you enable MBEDTLS_ECP_RESTARTABLE or if you + * want to access ECDH context fields directly. Otherwise you should + * comment out this macro definition. + * + * This option has no effect if #MBEDTLS_ECDH_C is not enabled. + * + * \note This configuration option is experimental. Future versions of the + * library may modify the way the ECDH context layout is configured + * and may modify the layout of the new context type. + */ +#define MBEDTLS_ECDH_LEGACY_CONTEXT + +/** + * \def MBEDTLS_ECDSA_DETERMINISTIC + * + * Enable deterministic ECDSA (RFC 6979). + * Standard ECDSA is "fragile" in the sense that lack of entropy when signing + * may result in a compromise of the long-term signing key. This is avoided by + * the deterministic variant. + * + * Requires: MBEDTLS_HMAC_DRBG_C + * + * Comment this macro to disable deterministic ECDSA. + */ +#define MBEDTLS_ECDSA_DETERMINISTIC + +/** + * \def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED + * + * Enable the PSK based ciphersuite modes in SSL / TLS. + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED + * + * Enable the DHE-PSK based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_DHM_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA + * + * \warning Using DHE constitutes a security risk as it + * is not possible to validate custom DH parameters. + * If possible, it is recommended users should consider + * preferring other methods of key exchange. + * See dhm.h for more details. + * + */ +#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED + * + * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED + * + * Enable the RSA-PSK based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED + * + * Enable the RSA-only based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 + */ +#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED + * + * Enable the DHE-RSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_DHM_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA + * + * \warning Using DHE constitutes a security risk as it + * is not possible to validate custom DH parameters. + * If possible, it is recommended users should consider + * preferring other methods of key exchange. + * See dhm.h for more details. + * + */ +#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED + * + * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED + * + * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C, + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED + * + * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 + */ +#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED + * + * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 + */ +#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED + * + * Enable the ECJPAKE based ciphersuite modes in SSL / TLS. + * + * \warning This is currently experimental. EC J-PAKE support is based on the + * Thread v1.0.0 specification; incompatible changes to the specification + * might still happen. For this reason, this is disabled by default. + * + * Requires: MBEDTLS_ECJPAKE_C + * MBEDTLS_SHA256_C + * MBEDTLS_ECP_DP_SECP256R1_ENABLED + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 + */ +//#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED + +/** + * \def MBEDTLS_PK_PARSE_EC_EXTENDED + * + * Enhance support for reading EC keys using variants of SEC1 not allowed by + * RFC 5915 and RFC 5480. + * + * Currently this means parsing the SpecifiedECDomain choice of EC + * parameters (only known groups are supported, not arbitrary domains, to + * avoid validation issues). + * + * Disable if you only need to support RFC 5915 + 5480 key formats. + */ +#define MBEDTLS_PK_PARSE_EC_EXTENDED + +/** + * \def MBEDTLS_ERROR_STRERROR_DUMMY + * + * Enable a dummy error function to make use of mbedtls_strerror() in + * third party libraries easier when MBEDTLS_ERROR_C is disabled + * (no effect when MBEDTLS_ERROR_C is enabled). + * + * You can safely disable this if MBEDTLS_ERROR_C is enabled, or if you're + * not using mbedtls_strerror() or error_strerror() in your application. + * + * Disable if you run into name conflicts and want to really remove the + * mbedtls_strerror() + */ +// #define MBEDTLS_ERROR_STRERROR_DUMMY + +/** + * \def MBEDTLS_GENPRIME + * + * Enable the prime-number generation code. + * + * Requires: MBEDTLS_BIGNUM_C + */ +#define MBEDTLS_GENPRIME + +/** + * \def MBEDTLS_FS_IO + * + * Enable functions that use the filesystem. + */ +// #define MBEDTLS_FS_IO + +/** + * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES + * + * Do not add default entropy sources. These are the platform specific, + * mbedtls_timing_hardclock and HAVEGE based poll functions. + * + * This is useful to have more control over the added entropy sources in an + * application. + * + * Uncomment this macro to prevent loading of default entropy functions. + */ +//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES + +/** + * \def MBEDTLS_NO_PLATFORM_ENTROPY + * + * Do not use built-in platform entropy functions. + * This is useful if your platform does not support + * standards like the /dev/urandom or Windows CryptoAPI. + * + * Uncomment this macro to disable the built-in platform entropy functions. + */ +#define MBEDTLS_NO_PLATFORM_ENTROPY + +/** + * \def MBEDTLS_ENTROPY_FORCE_SHA256 + * + * Force the entropy accumulator to use a SHA-256 accumulator instead of the + * default SHA-512 based one (if both are available). + * + * Requires: MBEDTLS_SHA256_C + * + * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option + * if you have performance concerns. + * + * This option is only useful if both MBEDTLS_SHA256_C and + * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used. + */ +//#define MBEDTLS_ENTROPY_FORCE_SHA256 + +/** + * \def MBEDTLS_ENTROPY_NV_SEED + * + * Enable the non-volatile (NV) seed file-based entropy source. + * (Also enables the NV seed read/write functions in the platform layer) + * + * This is crucial (if not required) on systems that do not have a + * cryptographic entropy source (in hardware or kernel) available. + * + * Requires: MBEDTLS_ENTROPY_C, MBEDTLS_PLATFORM_C + * + * \note The read/write functions that are used by the entropy source are + * determined in the platform layer, and can be modified at runtime and/or + * compile-time depending on the flags (MBEDTLS_PLATFORM_NV_SEED_*) used. + * + * \note If you use the default implementation functions that read a seedfile + * with regular fopen(), please make sure you make a seedfile with the + * proper name (defined in MBEDTLS_PLATFORM_STD_NV_SEED_FILE) and at + * least MBEDTLS_ENTROPY_BLOCK_SIZE bytes in size that can be read from + * and written to or you will get an entropy source error! The default + * implementation will only use the first MBEDTLS_ENTROPY_BLOCK_SIZE + * bytes from the file. + * + * \note The entropy collector will write to the seed file before entropy is + * given to an external source, to update it. + */ +//#define MBEDTLS_ENTROPY_NV_SEED + +/** + * \def MBEDTLS_MEMORY_DEBUG + * + * Enable debugging of buffer allocator memory issues. Automatically prints + * (to stderr) all (fatal) messages on memory allocation issues. Enables + * function for 'debug output' of allocated memory. + * + * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C + * + * Uncomment this macro to let the buffer allocator print out error messages. + */ +//#define MBEDTLS_MEMORY_DEBUG + +/** + * \def MBEDTLS_MEMORY_BACKTRACE + * + * Include backtrace information with each allocated block. + * + * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C + * GLIBC-compatible backtrace() an backtrace_symbols() support + * + * Uncomment this macro to include backtrace information + */ +//#define MBEDTLS_MEMORY_BACKTRACE + +/** + * \def MBEDTLS_PK_RSA_ALT_SUPPORT + * + * Support external private RSA keys (eg from a HSM) in the PK layer. + * + * Comment this macro to disable support for external private RSA keys. + */ +// #define MBEDTLS_PK_RSA_ALT_SUPPORT + +/** + * \def MBEDTLS_PKCS1_V15 + * + * Enable support for PKCS#1 v1.5 encoding. + * + * Requires: MBEDTLS_RSA_C + * + * This enables support for PKCS#1 v1.5 operations. + */ +#define MBEDTLS_PKCS1_V15 + +/** + * \def MBEDTLS_PKCS1_V21 + * + * Enable support for PKCS#1 v2.1 encoding. + * + * Requires: MBEDTLS_MD_C, MBEDTLS_RSA_C + * + * This enables support for RSAES-OAEP and RSASSA-PSS operations. + */ +#define MBEDTLS_PKCS1_V21 + +/** + * \def MBEDTLS_PSA_CRYPTO_SPM + * + * When MBEDTLS_PSA_CRYPTO_SPM is defined, the code is built for SPM (Secure + * Partition Manager) integration which separates the code into two parts: a + * NSPE (Non-Secure Process Environment) and an SPE (Secure Process + * Environment). + * + * Module: library/psa_crypto.c + * Requires: MBEDTLS_PSA_CRYPTO_C + * + */ +//#define MBEDTLS_PSA_CRYPTO_SPM + +/** + * \def MBEDTLS_PSA_INJECT_ENTROPY + * + * Enable support for entropy injection at first boot. This feature is + * required on systems that do not have a built-in entropy source (TRNG). + * This feature is currently not supported on systems that have a built-in + * entropy source. + * + * Requires: MBEDTLS_PSA_CRYPTO_STORAGE_C, MBEDTLS_ENTROPY_NV_SEED + * + */ +//#define MBEDTLS_PSA_INJECT_ENTROPY + +/** + * \def MBEDTLS_RSA_NO_CRT + * + * Do not use the Chinese Remainder Theorem + * for the RSA private operation. + * + * Uncomment this macro to disable the use of CRT in RSA. + * + */ +//#define MBEDTLS_RSA_NO_CRT + +/** + * \def MBEDTLS_SELF_TEST + * + * Enable the checkup functions (*_self_test). + */ +#define MBEDTLS_SELF_TEST + +/** + * \def MBEDTLS_SHA256_SMALLER + * + * Enable an implementation of SHA-256 that has lower ROM footprint but also + * lower performance. + * + * The default implementation is meant to be a reasonnable compromise between + * performance and size. This version optimizes more aggressively for size at + * the expense of performance. Eg on Cortex-M4 it reduces the size of + * mbedtls_sha256_process() from ~2KB to ~0.5KB for a performance hit of about + * 30%. + * + * Uncomment to enable the smaller implementation of SHA256. + */ +//#define MBEDTLS_SHA256_SMALLER + +/** + * \def MBEDTLS_SSL_ALL_ALERT_MESSAGES + * + * Enable sending of alert messages in case of encountered errors as per RFC. + * If you choose not to send the alert messages, mbed TLS can still communicate + * with other servers, only debugging of failures is harder. + * + * The advantage of not sending alert messages, is that no information is given + * about reasons for failures thus preventing adversaries of gaining intel. + * + * Enable sending of all alert messages + */ +#define MBEDTLS_SSL_ALL_ALERT_MESSAGES + +/** + * \def MBEDTLS_SSL_RECORD_CHECKING + * + * Enable the function mbedtls_ssl_check_record() which can be used to check + * the validity and authenticity of an incoming record, to verify that it has + * not been seen before. These checks are performed without modifying the + * externally visible state of the SSL context. + * + * See mbedtls_ssl_check_record() for more information. + * + * Uncomment to enable support for record checking. + */ +#define MBEDTLS_SSL_RECORD_CHECKING + +/** + * \def MBEDTLS_SSL_DTLS_CONNECTION_ID + * + * Enable support for the DTLS Connection ID extension + * (version draft-ietf-tls-dtls-connection-id-05, + * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05) + * which allows to identify DTLS connections across changes + * in the underlying transport. + * + * Setting this option enables the SSL APIs `mbedtls_ssl_set_cid()`, + * `mbedtls_ssl_get_peer_cid()` and `mbedtls_ssl_conf_cid()`. + * See the corresponding documentation for more information. + * + * \warning The Connection ID extension is still in draft state. + * We make no stability promises for the availability + * or the shape of the API controlled by this option. + * + * The maximum lengths of outgoing and incoming CIDs can be configured + * through the options + * - MBEDTLS_SSL_CID_OUT_LEN_MAX + * - MBEDTLS_SSL_CID_IN_LEN_MAX. + * + * Requires: MBEDTLS_SSL_PROTO_DTLS + * + * Uncomment to enable the Connection ID extension. + */ +//#define MBEDTLS_SSL_DTLS_CONNECTION_ID + +/** + * \def MBEDTLS_SSL_ASYNC_PRIVATE + * + * Enable asynchronous external private key operations in SSL. This allows + * you to configure an SSL connection to call an external cryptographic + * module to perform private key operations instead of performing the + * operation inside the library. + * + */ +//#define MBEDTLS_SSL_ASYNC_PRIVATE + +/** + * \def MBEDTLS_SSL_CONTEXT_SERIALIZATION + * + * Enable serialization of the TLS context structures, through use of the + * functions mbedtls_ssl_context_save() and mbedtls_ssl_context_load(). + * + * This pair of functions allows one side of a connection to serialize the + * context associated with the connection, then free or re-use that context + * while the serialized state is persisted elsewhere, and finally deserialize + * that state to a live context for resuming read/write operations on the + * connection. From a protocol perspective, the state of the connection is + * unaffected, in particular this is entirely transparent to the peer. + * + * Note: this is distinct from TLS session resumption, which is part of the + * protocol and fully visible by the peer. TLS session resumption enables + * establishing new connections associated to a saved session with shorter, + * lighter handshakes, while context serialization is a local optimization in + * handling a single, potentially long-lived connection. + * + * Enabling these APIs makes some SSL structures larger, as 64 extra bytes are + * saved after the handshake to allow for more efficient serialization, so if + * you don't need this feature you'll save RAM by disabling it. + * + * Comment to disable the context serialization APIs. + */ +#define MBEDTLS_SSL_CONTEXT_SERIALIZATION + +/** + * \def MBEDTLS_SSL_DEBUG_ALL + * + * Enable the debug messages in SSL module for all issues. + * Debug messages have been disabled in some places to prevent timing + * attacks due to (unbalanced) debugging function calls. + * + * If you need all error reporting you should enable this during debugging, + * but remove this for production servers that should log as well. + * + * Uncomment this macro to report all debug messages on errors introducing + * a timing side-channel. + * + */ +//#define MBEDTLS_SSL_DEBUG_ALL + +/** \def MBEDTLS_SSL_ENCRYPT_THEN_MAC + * + * Enable support for Encrypt-then-MAC, RFC 7366. + * + * This allows peers that both support it to use a more robust protection for + * ciphersuites using CBC, providing deep resistance against timing attacks + * on the padding or underlying cipher. + * + * This only affects CBC ciphersuites, and is useless if none is defined. + * + * Requires: MBEDTLS_SSL_PROTO_TLS1 or + * MBEDTLS_SSL_PROTO_TLS1_1 or + * MBEDTLS_SSL_PROTO_TLS1_2 + * + * Comment this macro to disable support for Encrypt-then-MAC + */ +#define MBEDTLS_SSL_ENCRYPT_THEN_MAC + +/** \def MBEDTLS_SSL_EXTENDED_MASTER_SECRET + * + * Enable support for Extended Master Secret, aka Session Hash + * (draft-ietf-tls-session-hash-02). + * + * This was introduced as "the proper fix" to the Triple Handshake familiy of + * attacks, but it is recommended to always use it (even if you disable + * renegotiation), since it actually fixes a more fundamental issue in the + * original SSL/TLS design, and has implications beyond Triple Handshake. + * + * Requires: MBEDTLS_SSL_PROTO_TLS1 or + * MBEDTLS_SSL_PROTO_TLS1_1 or + * MBEDTLS_SSL_PROTO_TLS1_2 + * + * Comment this macro to disable support for Extended Master Secret. + */ +#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET + +/** + * \def MBEDTLS_SSL_FALLBACK_SCSV + * + * Enable support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv-00). + * + * For servers, it is recommended to always enable this, unless you support + * only one version of TLS, or know for sure that none of your clients + * implements a fallback strategy. + * + * For clients, you only need this if you're using a fallback strategy, which + * is not recommended in the first place, unless you absolutely need it to + * interoperate with buggy (version-intolerant) servers. + * + * Comment this macro to disable support for FALLBACK_SCSV + */ +#define MBEDTLS_SSL_FALLBACK_SCSV + +/** + * \def MBEDTLS_SSL_KEEP_PEER_CERTIFICATE + * + * This option controls the availability of the API mbedtls_ssl_get_peer_cert() + * giving access to the peer's certificate after completion of the handshake. + * + * Unless you need mbedtls_ssl_peer_cert() in your application, it is + * recommended to disable this option for reduced RAM usage. + * + * \note If this option is disabled, mbedtls_ssl_get_peer_cert() is still + * defined, but always returns \c NULL. + * + * \note This option has no influence on the protection against the + * triple handshake attack. Even if it is disabled, Mbed TLS will + * still ensure that certificates do not change during renegotiation, + * for exaple by keeping a hash of the peer's certificate. + * + * Comment this macro to disable storing the peer's certificate + * after the handshake. + */ +#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE + +/** + * \def MBEDTLS_SSL_HW_RECORD_ACCEL + * + * Enable hooking functions in SSL module for hardware acceleration of + * individual records. + * + * Uncomment this macro to enable hooking functions. + */ +//#define MBEDTLS_SSL_HW_RECORD_ACCEL + +/** + * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING + * + * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0. + * + * This is a countermeasure to the BEAST attack, which also minimizes the risk + * of interoperability issues compared to sending 0-length records. + * + * Comment this macro to disable 1/n-1 record splitting. + */ +#define MBEDTLS_SSL_CBC_RECORD_SPLITTING + +/** + * \def MBEDTLS_SSL_RENEGOTIATION + * + * Enable support for TLS renegotiation. + * + * The two main uses of renegotiation are (1) refresh keys on long-lived + * connections and (2) client authentication after the initial handshake. + * If you don't need renegotiation, it's probably better to disable it, since + * it has been associated with security issues in the past and is easy to + * misuse/misunderstand. + * + * Comment this to disable support for renegotiation. + * + * \note Even if this option is disabled, both client and server are aware + * of the Renegotiation Indication Extension (RFC 5746) used to + * prevent the SSL renegotiation attack (see RFC 5746 Sect. 1). + * (See \c mbedtls_ssl_conf_legacy_renegotiation for the + * configuration of this extension). + * + */ +#define MBEDTLS_SSL_RENEGOTIATION + +/** + * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO + * + * Enable support for receiving and parsing SSLv2 Client Hello messages for the + * SSL Server module (MBEDTLS_SSL_SRV_C). + * + * Uncomment this macro to enable support for SSLv2 Client Hello messages. + */ +//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO + +/** + * \def MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE + * + * Pick the ciphersuite according to the client's preferences rather than ours + * in the SSL Server module (MBEDTLS_SSL_SRV_C). + * + * Uncomment this macro to respect client's ciphersuite order + */ +//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE + +/** + * \def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH + * + * Enable support for RFC 6066 max_fragment_length extension in SSL. + * + * Comment this macro to disable support for the max_fragment_length extension + */ +#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH + +/** + * \def MBEDTLS_SSL_PROTO_SSL3 + * + * Enable support for SSL 3.0. + * + * Requires: MBEDTLS_MD5_C + * MBEDTLS_SHA1_C + * + * Comment this macro to disable support for SSL 3.0 + */ +//#define MBEDTLS_SSL_PROTO_SSL3 + +/** + * \def MBEDTLS_SSL_PROTO_TLS1 + * + * Enable support for TLS 1.0. + * + * Requires: MBEDTLS_MD5_C + * MBEDTLS_SHA1_C + * + * Comment this macro to disable support for TLS 1.0 + */ +#define MBEDTLS_SSL_PROTO_TLS1 + +/** + * \def MBEDTLS_SSL_PROTO_TLS1_1 + * + * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled). + * + * Requires: MBEDTLS_MD5_C + * MBEDTLS_SHA1_C + * + * Comment this macro to disable support for TLS 1.1 / DTLS 1.0 + */ +#define MBEDTLS_SSL_PROTO_TLS1_1 + +/** + * \def MBEDTLS_SSL_PROTO_TLS1_2 + * + * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled). + * + * Requires: MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C + * (Depends on ciphersuites) + * + * Comment this macro to disable support for TLS 1.2 / DTLS 1.2 + */ +#define MBEDTLS_SSL_PROTO_TLS1_2 + +/** + * \def MBEDTLS_SSL_PROTO_DTLS + * + * Enable support for DTLS (all available versions). + * + * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0, + * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2. + * + * Requires: MBEDTLS_SSL_PROTO_TLS1_1 + * or MBEDTLS_SSL_PROTO_TLS1_2 + * + * Comment this macro to disable support for DTLS + */ +#define MBEDTLS_SSL_PROTO_DTLS + +/** + * \def MBEDTLS_SSL_ALPN + * + * Enable support for RFC 7301 Application Layer Protocol Negotiation. + * + * Comment this macro to disable support for ALPN. + */ +#define MBEDTLS_SSL_ALPN + +/** + * \def MBEDTLS_SSL_DTLS_ANTI_REPLAY + * + * Enable support for the anti-replay mechanism in DTLS. + * + * Requires: MBEDTLS_SSL_TLS_C + * MBEDTLS_SSL_PROTO_DTLS + * + * \warning Disabling this is often a security risk! + * See mbedtls_ssl_conf_dtls_anti_replay() for details. + * + * Comment this to disable anti-replay in DTLS. + */ +#define MBEDTLS_SSL_DTLS_ANTI_REPLAY + +/** + * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY + * + * Enable support for HelloVerifyRequest on DTLS servers. + * + * This feature is highly recommended to prevent DTLS servers being used as + * amplifiers in DoS attacks against other hosts. It should always be enabled + * unless you know for sure amplification cannot be a problem in the + * environment in which your server operates. + * + * \warning Disabling this can ba a security risk! (see above) + * + * Requires: MBEDTLS_SSL_PROTO_DTLS + * + * Comment this to disable support for HelloVerifyRequest. + */ +#define MBEDTLS_SSL_DTLS_HELLO_VERIFY + +/** + * \def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE + * + * Enable server-side support for clients that reconnect from the same port. + * + * Some clients unexpectedly close the connection and try to reconnect using the + * same source port. This needs special support from the server to handle the + * new connection securely, as described in section 4.2.8 of RFC 6347. This + * flag enables that support. + * + * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY + * + * Comment this to disable support for clients reusing the source port. + */ +#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE + +/** + * \def MBEDTLS_SSL_DTLS_BADMAC_LIMIT + * + * Enable support for a limit of records with bad MAC. + * + * See mbedtls_ssl_conf_dtls_badmac_limit(). + * + * Requires: MBEDTLS_SSL_PROTO_DTLS + */ +#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT + +/** + * \def MBEDTLS_SSL_SESSION_TICKETS + * + * Enable support for RFC 5077 session tickets in SSL. + * Client-side, provides full support for session tickets (maintenance of a + * session store remains the responsibility of the application, though). + * Server-side, you also need to provide callbacks for writing and parsing + * tickets, including authenticated encryption and key management. Example + * callbacks are provided by MBEDTLS_SSL_TICKET_C. + * + * Comment this macro to disable support for SSL session tickets + */ +#define MBEDTLS_SSL_SESSION_TICKETS + +/** + * \def MBEDTLS_SSL_EXPORT_KEYS + * + * Enable support for exporting key block and master secret. + * This is required for certain users of TLS, e.g. EAP-TLS. + * + * Comment this macro to disable support for key export + */ +#define MBEDTLS_SSL_EXPORT_KEYS + +/** + * \def MBEDTLS_SSL_SERVER_NAME_INDICATION + * + * Enable support for RFC 6066 server name indication (SNI) in SSL. + * + * Requires: MBEDTLS_X509_CRT_PARSE_C + * + * Comment this macro to disable support for server name indication in SSL + */ +#define MBEDTLS_SSL_SERVER_NAME_INDICATION + +/** + * \def MBEDTLS_SSL_TRUNCATED_HMAC + * + * Enable support for RFC 6066 truncated HMAC in SSL. + * + * Comment this macro to disable support for truncated HMAC in SSL + */ +#define MBEDTLS_SSL_TRUNCATED_HMAC + +/** + * \def MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT + * + * Fallback to old (pre-2.7), non-conforming implementation of the truncated + * HMAC extension which also truncates the HMAC key. Note that this option is + * only meant for a transitory upgrade period and is likely to be removed in + * a future version of the library. + * + * \warning The old implementation is non-compliant and has a security weakness + * (2^80 brute force attack on the HMAC key used for a single, + * uninterrupted connection). This should only be enabled temporarily + * when (1) the use of truncated HMAC is essential in order to save + * bandwidth, and (2) the peer is an Mbed TLS stack that doesn't use + * the fixed implementation yet (pre-2.7). + * + * \deprecated This option is deprecated and will likely be removed in a + * future version of Mbed TLS. + * + * Uncomment to fallback to old, non-compliant truncated HMAC implementation. + * + * Requires: MBEDTLS_SSL_TRUNCATED_HMAC + */ +//#define MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT + +/** + * \def MBEDTLS_THREADING_ALT + * + * Provide your own alternate threading implementation. + * + * Requires: MBEDTLS_THREADING_C + * + * Uncomment this to allow your own alternate threading implementation. + */ +//#define MBEDTLS_THREADING_ALT + +/** + * \def MBEDTLS_THREADING_PTHREAD + * + * Enable the pthread wrapper layer for the threading layer. + * + * Requires: MBEDTLS_THREADING_C + * + * Uncomment this to enable pthread mutexes. + */ +//#define MBEDTLS_THREADING_PTHREAD + +/** + * \def MBEDTLS_USE_PSA_CRYPTO + * + * Make the X.509 and TLS library use PSA for cryptographic operations, and + * enable new APIs for using keys handled by PSA Crypto. + * + * \note Development of this option is currently in progress, and parts + * of the X.509 and TLS modules are not ported to PSA yet. However, these parts + * will still continue to work as usual, so enabling this option should not + * break backwards compatibility. + * + * \warning The PSA Crypto API is in beta stage. While you're welcome to + * experiment using it, incompatible API changes are still possible, and some + * parts may not have reached the same quality as the rest of Mbed TLS yet. + * + * \warning This option enables new Mbed TLS APIs that are dependent on the + * PSA Crypto API, so can't come with the same stability guarantees as the + * rest of the Mbed TLS APIs. You're welcome to experiment with them, but for + * now, access to these APIs is opt-in (via enabling the present option), in + * order to clearly differentiate them from the stable Mbed TLS APIs. + * + * Requires: MBEDTLS_PSA_CRYPTO_C. + * + * Uncomment this to enable internal use of PSA Crypto and new associated APIs. + */ +//#define MBEDTLS_USE_PSA_CRYPTO + +/** + * \def MBEDTLS_VERSION_FEATURES + * + * Allow run-time checking of compile-time enabled features. Thus allowing users + * to check at run-time if the library is for instance compiled with threading + * support via mbedtls_version_check_feature(). + * + * Requires: MBEDTLS_VERSION_C + * + * Comment this to disable run-time checking and save ROM space + */ +// #define MBEDTLS_VERSION_FEATURES + +/** + * \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 + * + * If set, the X509 parser will not break-off when parsing an X509 certificate + * and encountering an extension in a v1 or v2 certificate. + * + * Uncomment to prevent an error. + */ +//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 + +/** + * \def MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION + * + * If set, the X509 parser will not break-off when parsing an X509 certificate + * and encountering an unknown critical extension. + * + * \warning Depending on your PKI use, enabling this can be a security risk! + * + * Uncomment to prevent an error. + */ +//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION + +/** + * \def MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK + * + * If set, this enables the X.509 API `mbedtls_x509_crt_verify_with_ca_cb()` + * and the SSL API `mbedtls_ssl_conf_ca_cb()` which allow users to configure + * the set of trusted certificates through a callback instead of a linked + * list. + * + * This is useful for example in environments where a large number of trusted + * certificates is present and storing them in a linked list isn't efficient + * enough, or when the set of trusted certificates changes frequently. + * + * See the documentation of `mbedtls_x509_crt_verify_with_ca_cb()` and + * `mbedtls_ssl_conf_ca_cb()` for more information. + * + * Uncomment to enable trusted certificate callbacks. + */ +//#define MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK + +/** + * \def MBEDTLS_X509_CHECK_KEY_USAGE + * + * Enable verification of the keyUsage extension (CA and leaf certificates). + * + * Disabling this avoids problems with mis-issued and/or misused + * (intermediate) CA and leaf certificates. + * + * \warning Depending on your PKI use, disabling this can be a security risk! + * + * Comment to skip keyUsage checking for both CA and leaf certificates. + */ +#define MBEDTLS_X509_CHECK_KEY_USAGE + +/** + * \def MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE + * + * Enable verification of the extendedKeyUsage extension (leaf certificates). + * + * Disabling this avoids problems with mis-issued and/or misused certificates. + * + * \warning Depending on your PKI use, disabling this can be a security risk! + * + * Comment to skip extendedKeyUsage checking for certificates. + */ +#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE + +/** + * \def MBEDTLS_X509_RSASSA_PSS_SUPPORT + * + * Enable parsing and verification of X.509 certificates, CRLs and CSRS + * signed with RSASSA-PSS (aka PKCS#1 v2.1). + * + * Comment this macro to disallow using RSASSA-PSS in certificates. + */ +#define MBEDTLS_X509_RSASSA_PSS_SUPPORT + +/** + * \def MBEDTLS_ZLIB_SUPPORT + * + * If set, the SSL/TLS module uses ZLIB to support compression and + * decompression of packet data. + * + * \warning TLS-level compression MAY REDUCE SECURITY! See for example the + * CRIME attack. Before enabling this option, you should examine with care if + * CRIME or similar exploits may be applicable to your use case. + * + * \note Currently compression can't be used with DTLS. + * + * \deprecated This feature is deprecated and will be removed + * in the next major revision of the library. + * + * Used in: library/ssl_tls.c + * library/ssl_cli.c + * library/ssl_srv.c + * + * This feature requires zlib library and headers to be present. + * + * Uncomment to enable use of ZLIB + */ +//#define MBEDTLS_ZLIB_SUPPORT +/* \} name SECTION: mbed TLS feature support */ + +/** + * \name SECTION: mbed TLS modules + * + * This section enables or disables entire modules in mbed TLS + * \{ + */ + +/** + * \def MBEDTLS_AESNI_C + * + * Enable AES-NI support on x86-64. + * + * Module: library/aesni.c + * Caller: library/aes.c + * + * Requires: MBEDTLS_HAVE_ASM + * + * This modules adds support for the AES-NI instructions on x86-64 + */ +#define MBEDTLS_AESNI_C + +/** + * \def MBEDTLS_AES_C + * + * Enable the AES block cipher. + * + * Module: library/aes.c + * Caller: library/cipher.c + * library/pem.c + * library/ctr_drbg.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA + * + * PEM_PARSE uses AES for decrypting encrypted keys. + */ +#define MBEDTLS_AES_C + +/** + * \def MBEDTLS_ARC4_C + * + * Enable the ARCFOUR stream cipher. + * + * Module: library/arc4.c + * Caller: library/cipher.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA + * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 + * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA + * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. If possible, we recommend avoidng dependencies on + * it, and considering stronger ciphers instead. + * + */ +#define MBEDTLS_ARC4_C + +/** + * \def MBEDTLS_ASN1_PARSE_C + * + * Enable the generic ASN1 parser. + * + * Module: library/asn1.c + * Caller: library/x509.c + * library/dhm.c + * library/pkcs12.c + * library/pkcs5.c + * library/pkparse.c + */ +#define MBEDTLS_ASN1_PARSE_C + +/** + * \def MBEDTLS_ASN1_WRITE_C + * + * Enable the generic ASN1 writer. + * + * Module: library/asn1write.c + * Caller: library/ecdsa.c + * library/pkwrite.c + * library/x509_create.c + * library/x509write_crt.c + * library/x509write_csr.c + */ +#define MBEDTLS_ASN1_WRITE_C + +/** + * \def MBEDTLS_BASE64_C + * + * Enable the Base64 module. + * + * Module: library/base64.c + * Caller: library/pem.c + * + * This module is required for PEM support (required by X.509). + */ +#define MBEDTLS_BASE64_C + +/** + * \def MBEDTLS_BIGNUM_C + * + * Enable the multi-precision integer library. + * + * Module: library/bignum.c + * Caller: library/dhm.c + * library/ecp.c + * library/ecdsa.c + * library/rsa.c + * library/rsa_internal.c + * library/ssl_tls.c + * + * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support. + */ +#define MBEDTLS_BIGNUM_C + +/** + * \def MBEDTLS_BLOWFISH_C + * + * Enable the Blowfish block cipher. + * + * Module: library/blowfish.c + */ +#define MBEDTLS_BLOWFISH_C + +/** + * \def MBEDTLS_CAMELLIA_C + * + * Enable the Camellia block cipher. + * + * Module: library/camellia.c + * Caller: library/cipher.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 + */ +#define MBEDTLS_CAMELLIA_C + +/** + * \def MBEDTLS_ARIA_C + * + * Enable the ARIA block cipher. + * + * Module: library/aria.c + * Caller: library/cipher.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * + * MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 + */ +//#define MBEDTLS_ARIA_C + +/** + * \def MBEDTLS_CCM_C + * + * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher. + * + * Module: library/ccm.c + * + * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C + * + * This module enables the AES-CCM ciphersuites, if other requisites are + * enabled as well. + */ +#define MBEDTLS_CCM_C + +/** + * \def MBEDTLS_CERTS_C + * + * Enable the test certificates. + * + * Module: library/certs.c + * Caller: + * + * This module is used for testing (ssl_client/server). + */ +#define MBEDTLS_CERTS_C + +/** + * \def MBEDTLS_CHACHA20_C + * + * Enable the ChaCha20 stream cipher. + * + * Module: library/chacha20.c + */ +#define MBEDTLS_CHACHA20_C + +/** + * \def MBEDTLS_CHACHAPOLY_C + * + * Enable the ChaCha20-Poly1305 AEAD algorithm. + * + * Module: library/chachapoly.c + * + * This module requires: MBEDTLS_CHACHA20_C, MBEDTLS_POLY1305_C + */ +#define MBEDTLS_CHACHAPOLY_C + +/** + * \def MBEDTLS_CIPHER_C + * + * Enable the generic cipher layer. + * + * Module: library/cipher.c + * Caller: library/ssl_tls.c + * + * Uncomment to enable generic cipher wrappers. + */ +#define MBEDTLS_CIPHER_C + +/** + * \def MBEDTLS_CMAC_C + * + * Enable the CMAC (Cipher-based Message Authentication Code) mode for block + * ciphers. + * + * Module: library/cmac.c + * + * Requires: MBEDTLS_AES_C or MBEDTLS_DES_C + * + */ +//#define MBEDTLS_CMAC_C + +/** + * \def MBEDTLS_CTR_DRBG_C + * + * Enable the CTR_DRBG AES-based random generator. + * The CTR_DRBG generator uses AES-256 by default. + * To use AES-128 instead, enable MBEDTLS_CTR_DRBG_USE_128_BIT_KEY below. + * + * Module: library/ctr_drbg.c + * Caller: + * + * Requires: MBEDTLS_AES_C + * + * This module provides the CTR_DRBG AES random number generator. + */ +#define MBEDTLS_CTR_DRBG_C + +/** + * \def MBEDTLS_DEBUG_C + * + * Enable the debug functions. + * + * Module: library/debug.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * + * This module provides debugging functions. + */ +#define MBEDTLS_DEBUG_C + +/** + * \def MBEDTLS_DES_C + * + * Enable the DES block cipher. + * + * Module: library/des.c + * Caller: library/pem.c + * library/cipher.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA + * + * PEM_PARSE uses DES/3DES for decrypting encrypted keys. + * + * \warning DES is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers instead. + */ +#define MBEDTLS_DES_C + +/** + * \def MBEDTLS_DHM_C + * + * Enable the Diffie-Hellman-Merkle module. + * + * Module: library/dhm.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * This module is used by the following key exchanges: + * DHE-RSA, DHE-PSK + * + * \warning Using DHE constitutes a security risk as it + * is not possible to validate custom DH parameters. + * If possible, it is recommended users should consider + * preferring other methods of key exchange. + * See dhm.h for more details. + * + */ +#define MBEDTLS_DHM_C + +/** + * \def MBEDTLS_ECDH_C + * + * Enable the elliptic curve Diffie-Hellman library. + * + * Module: library/ecdh.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * This module is used by the following key exchanges: + * ECDHE-ECDSA, ECDHE-RSA, DHE-PSK + * + * Requires: MBEDTLS_ECP_C + */ +#define MBEDTLS_ECDH_C + +/** + * \def MBEDTLS_ECDSA_C + * + * Enable the elliptic curve DSA library. + * + * Module: library/ecdsa.c + * Caller: + * + * This module is used by the following key exchanges: + * ECDHE-ECDSA + * + * Requires: MBEDTLS_ECP_C, MBEDTLS_ASN1_WRITE_C, MBEDTLS_ASN1_PARSE_C + */ +#define MBEDTLS_ECDSA_C + +/** + * \def MBEDTLS_ECJPAKE_C + * + * Enable the elliptic curve J-PAKE library. + * + * \warning This is currently experimental. EC J-PAKE support is based on the + * Thread v1.0.0 specification; incompatible changes to the specification + * might still happen. For this reason, this is disabled by default. + * + * Module: library/ecjpake.c + * Caller: + * + * This module is used by the following key exchanges: + * ECJPAKE + * + * Requires: MBEDTLS_ECP_C, MBEDTLS_MD_C + */ +//#define MBEDTLS_ECJPAKE_C + +/** + * \def MBEDTLS_ECP_C + * + * Enable the elliptic curve over GF(p) library. + * + * Module: library/ecp.c + * Caller: library/ecdh.c + * library/ecdsa.c + * library/ecjpake.c + * + * Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED + */ +#define MBEDTLS_ECP_C + +/** + * \def MBEDTLS_ENTROPY_C + * + * Enable the platform-specific entropy code. + * + * Module: library/entropy.c + * Caller: + * + * Requires: MBEDTLS_SHA512_C or MBEDTLS_SHA256_C + * + * This module provides a generic entropy pool + */ +#define MBEDTLS_ENTROPY_C + +/** + * \def MBEDTLS_ERROR_C + * + * Enable error code to error string conversion. + * + * Module: library/error.c + * Caller: + * + * This module enables mbedtls_strerror(). + */ +// #define MBEDTLS_ERROR_C + +/** + * \def MBEDTLS_GCM_C + * + * Enable the Galois/Counter Mode (GCM) for AES. + * + * Module: library/gcm.c + * + * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C + * + * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other + * requisites are enabled as well. + */ +#define MBEDTLS_GCM_C + +/** + * \def MBEDTLS_HAVEGE_C + * + * Enable the HAVEGE random generator. + * + * Warning: the HAVEGE random generator is not suitable for virtualized + * environments + * + * Warning: the HAVEGE random generator is dependent on timing and specific + * processor traits. It is therefore not advised to use HAVEGE as + * your applications primary random generator or primary entropy pool + * input. As a secondary input to your entropy pool, it IS able add + * the (limited) extra entropy it provides. + * + * Module: library/havege.c + * Caller: + * + * Requires: MBEDTLS_TIMING_C + * + * Uncomment to enable the HAVEGE random generator. + */ +//#define MBEDTLS_HAVEGE_C + +/** + * \def MBEDTLS_HKDF_C + * + * Enable the HKDF algorithm (RFC 5869). + * + * Module: library/hkdf.c + * Caller: + * + * Requires: MBEDTLS_MD_C + * + * This module adds support for the Hashed Message Authentication Code + * (HMAC)-based key derivation function (HKDF). + */ +#define MBEDTLS_HKDF_C + +/** + * \def MBEDTLS_HMAC_DRBG_C + * + * Enable the HMAC_DRBG random generator. + * + * Module: library/hmac_drbg.c + * Caller: + * + * Requires: MBEDTLS_MD_C + * + * Uncomment to enable the HMAC_DRBG random number geerator. + */ +#define MBEDTLS_HMAC_DRBG_C + +/** + * \def MBEDTLS_NIST_KW_C + * + * Enable the Key Wrapping mode for 128-bit block ciphers, + * as defined in NIST SP 800-38F. Only KW and KWP modes + * are supported. At the moment, only AES is approved by NIST. + * + * Module: library/nist_kw.c + * + * Requires: MBEDTLS_AES_C and MBEDTLS_CIPHER_C + */ +//#define MBEDTLS_NIST_KW_C + +/** + * \def MBEDTLS_MD_C + * + * Enable the generic message digest layer. + * + * Module: library/md.c + * Caller: + * + * Uncomment to enable generic message digest wrappers. + */ +#define MBEDTLS_MD_C + +/** + * \def MBEDTLS_MD2_C + * + * Enable the MD2 hash algorithm. + * + * Module: library/md2.c + * Caller: + * + * Uncomment to enable support for (rare) MD2-signed X.509 certs. + * + * \warning MD2 is considered a weak message digest and its use constitutes a + * security risk. If possible, we recommend avoiding dependencies on + * it, and considering stronger message digests instead. + * + */ +//#define MBEDTLS_MD2_C + +/** + * \def MBEDTLS_MD4_C + * + * Enable the MD4 hash algorithm. + * + * Module: library/md4.c + * Caller: + * + * Uncomment to enable support for (rare) MD4-signed X.509 certs. + * + * \warning MD4 is considered a weak message digest and its use constitutes a + * security risk. If possible, we recommend avoiding dependencies on + * it, and considering stronger message digests instead. + * + */ +//#define MBEDTLS_MD4_C + +/** + * \def MBEDTLS_MD5_C + * + * Enable the MD5 hash algorithm. + * + * Module: library/md5.c + * Caller: library/md.c + * library/pem.c + * library/ssl_tls.c + * + * This module is required for SSL/TLS up to version 1.1, and for TLS 1.2 + * depending on the handshake parameters. Further, it is used for checking + * MD5-signed certificates, and for PBKDF1 when decrypting PEM-encoded + * encrypted keys. + * + * \warning MD5 is considered a weak message digest and its use constitutes a + * security risk. If possible, we recommend avoiding dependencies on + * it, and considering stronger message digests instead. + * + */ +#define MBEDTLS_MD5_C + +/** + * \def MBEDTLS_MEMORY_BUFFER_ALLOC_C + * + * Enable the buffer allocator implementation that makes use of a (stack) + * based buffer to 'allocate' dynamic memory. (replaces calloc() and free() + * calls) + * + * Module: library/memory_buffer_alloc.c + * + * Requires: MBEDTLS_PLATFORM_C + * MBEDTLS_PLATFORM_MEMORY (to use it within mbed TLS) + * + * Enable this module to enable the buffer memory allocator. + */ +//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C + +/** + * \def MBEDTLS_NET_C + * + * Enable the TCP and UDP over IPv6/IPv4 networking routines. + * + * \note This module only works on POSIX/Unix (including Linux, BSD and OS X) + * and Windows. For other platforms, you'll want to disable it, and write your + * own networking callbacks to be passed to \c mbedtls_ssl_set_bio(). + * + * \note See also our Knowledge Base article about porting to a new + * environment: + * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS + * + * Module: library/net_sockets.c + * + * This module provides networking routines. + */ +// #define MBEDTLS_NET_C + +/** + * \def MBEDTLS_OID_C + * + * Enable the OID database. + * + * Module: library/oid.c + * Caller: library/asn1write.c + * library/pkcs5.c + * library/pkparse.c + * library/pkwrite.c + * library/rsa.c + * library/x509.c + * library/x509_create.c + * library/x509_crl.c + * library/x509_crt.c + * library/x509_csr.c + * library/x509write_crt.c + * library/x509write_csr.c + * + * This modules translates between OIDs and internal values. + */ +#define MBEDTLS_OID_C + +/** + * \def MBEDTLS_PADLOCK_C + * + * Enable VIA Padlock support on x86. + * + * Module: library/padlock.c + * Caller: library/aes.c + * + * Requires: MBEDTLS_HAVE_ASM + * + * This modules adds support for the VIA PadLock on x86. + */ +#define MBEDTLS_PADLOCK_C + +/** + * \def MBEDTLS_PEM_PARSE_C + * + * Enable PEM decoding / parsing. + * + * Module: library/pem.c + * Caller: library/dhm.c + * library/pkparse.c + * library/x509_crl.c + * library/x509_crt.c + * library/x509_csr.c + * + * Requires: MBEDTLS_BASE64_C + * + * This modules adds support for decoding / parsing PEM files. + */ +#define MBEDTLS_PEM_PARSE_C + +/** + * \def MBEDTLS_PEM_WRITE_C + * + * Enable PEM encoding / writing. + * + * Module: library/pem.c + * Caller: library/pkwrite.c + * library/x509write_crt.c + * library/x509write_csr.c + * + * Requires: MBEDTLS_BASE64_C + * + * This modules adds support for encoding / writing PEM files. + */ +#define MBEDTLS_PEM_WRITE_C + +/** + * \def MBEDTLS_PK_C + * + * Enable the generic public (asymetric) key layer. + * + * Module: library/pk.c + * Caller: library/ssl_tls.c + * library/ssl_cli.c + * library/ssl_srv.c + * + * Requires: MBEDTLS_RSA_C or MBEDTLS_ECP_C + * + * Uncomment to enable generic public key wrappers. + */ +#define MBEDTLS_PK_C + +/** + * \def MBEDTLS_PK_PARSE_C + * + * Enable the generic public (asymetric) key parser. + * + * Module: library/pkparse.c + * Caller: library/x509_crt.c + * library/x509_csr.c + * + * Requires: MBEDTLS_PK_C + * + * Uncomment to enable generic public key parse functions. + */ +#define MBEDTLS_PK_PARSE_C + +/** + * \def MBEDTLS_PK_WRITE_C + * + * Enable the generic public (asymetric) key writer. + * + * Module: library/pkwrite.c + * Caller: library/x509write.c + * + * Requires: MBEDTLS_PK_C + * + * Uncomment to enable generic public key write functions. + */ +#define MBEDTLS_PK_WRITE_C + +/** + * \def MBEDTLS_PKCS5_C + * + * Enable PKCS#5 functions. + * + * Module: library/pkcs5.c + * + * Requires: MBEDTLS_MD_C + * + * This module adds support for the PKCS#5 functions. + */ +#define MBEDTLS_PKCS5_C + +/** + * \def MBEDTLS_PKCS11_C + * + * Enable wrapper for PKCS#11 smartcard support. + * + * Module: library/pkcs11.c + * Caller: library/pk.c + * + * Requires: MBEDTLS_PK_C + * + * This module enables SSL/TLS PKCS #11 smartcard support. + * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) + */ +//#define MBEDTLS_PKCS11_C + +/** + * \def MBEDTLS_PKCS12_C + * + * Enable PKCS#12 PBE functions. + * Adds algorithms for parsing PKCS#8 encrypted private keys + * + * Module: library/pkcs12.c + * Caller: library/pkparse.c + * + * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C, MBEDTLS_MD_C + * Can use: MBEDTLS_ARC4_C + * + * This module enables PKCS#12 functions. + */ +#define MBEDTLS_PKCS12_C + +/** + * \def MBEDTLS_PLATFORM_C + * + * Enable the platform abstraction layer that allows you to re-assign + * functions like calloc(), free(), snprintf(), printf(), fprintf(), exit(). + * + * Enabling MBEDTLS_PLATFORM_C enables to use of MBEDTLS_PLATFORM_XXX_ALT + * or MBEDTLS_PLATFORM_XXX_MACRO directives, allowing the functions mentioned + * above to be specified at runtime or compile time respectively. + * + * \note This abstraction layer must be enabled on Windows (including MSYS2) + * as other module rely on it for a fixed snprintf implementation. + * + * Module: library/platform.c + * Caller: Most other .c files + * + * This module enables abstraction of common (libc) functions. + */ +#define MBEDTLS_PLATFORM_C + +/** + * \def MBEDTLS_POLY1305_C + * + * Enable the Poly1305 MAC algorithm. + * + * Module: library/poly1305.c + * Caller: library/chachapoly.c + */ +#define MBEDTLS_POLY1305_C + +/** + * \def MBEDTLS_PSA_CRYPTO_C + * + * Enable the Platform Security Architecture cryptography API. + * + * \warning The PSA Crypto API is still beta status. While you're welcome to + * experiment using it, incompatible API changes are still possible, and some + * parts may not have reached the same quality as the rest of Mbed TLS yet. + * + * Module: crypto/library/psa_crypto.c + * + * Requires: MBEDTLS_CTR_DRBG_C, MBEDTLS_ENTROPY_C + * + */ +#define MBEDTLS_PSA_CRYPTO_C + +/** + * \def MBEDTLS_PSA_CRYPTO_STORAGE_C + * + * Enable the Platform Security Architecture persistent key storage. + * + * Module: crypto/library/psa_crypto_storage.c + * + * Requires: MBEDTLS_PSA_CRYPTO_C, + * either MBEDTLS_PSA_ITS_FILE_C or a native implementation of + * the PSA ITS interface + */ +//#define MBEDTLS_PSA_CRYPTO_STORAGE_C + +/** + * \def MBEDTLS_PSA_ITS_FILE_C + * + * Enable the emulation of the Platform Security Architecture + * Internal Trusted Storage (PSA ITS) over files. + * + * Module: crypto/library/psa_its_file.c + * + * Requires: MBEDTLS_FS_IO + * + */ +//#define MBEDTLS_PSA_ITS_FILE_C + +/** + * \def MBEDTLS_RIPEMD160_C + * + * Enable the RIPEMD-160 hash algorithm. + * + * Module: library/ripemd160.c + * Caller: library/md.c + * + */ +#define MBEDTLS_RIPEMD160_C + +/** + * \def MBEDTLS_RSA_C + * + * Enable the RSA public-key cryptosystem. + * + * Module: library/rsa.c + * library/rsa_internal.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * library/x509.c + * + * This module is used by the following key exchanges: + * RSA, DHE-RSA, ECDHE-RSA, RSA-PSK + * + * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C + */ +#define MBEDTLS_RSA_C + +/** + * \def MBEDTLS_SHA1_C + * + * Enable the SHA1 cryptographic hash algorithm. + * + * Module: library/sha1.c + * Caller: library/md.c + * library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * library/x509write_crt.c + * + * This module is required for SSL/TLS up to version 1.1, for TLS 1.2 + * depending on the handshake parameters, and for SHA1-signed certificates. + * + * \warning SHA-1 is considered a weak message digest and its use constitutes + * a security risk. If possible, we recommend avoiding dependencies + * on it, and considering stronger message digests instead. + * + */ +#define MBEDTLS_SHA1_C + +/** + * \def MBEDTLS_SHA256_C + * + * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. + * + * Module: library/sha256.c + * Caller: library/entropy.c + * library/md.c + * library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * + * This module adds support for SHA-224 and SHA-256. + * This module is required for the SSL/TLS 1.2 PRF function. + */ +#define MBEDTLS_SHA256_C + +/** + * \def MBEDTLS_SHA512_C + * + * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. + * + * Module: library/sha512.c + * Caller: library/entropy.c + * library/md.c + * library/ssl_cli.c + * library/ssl_srv.c + * + * This module adds support for SHA-384 and SHA-512. + */ +#define MBEDTLS_SHA512_C + +/** + * \def MBEDTLS_SSL_CACHE_C + * + * Enable simple SSL cache implementation. + * + * Module: library/ssl_cache.c + * Caller: + * + * Requires: MBEDTLS_SSL_CACHE_C + */ +#define MBEDTLS_SSL_CACHE_C + +/** + * \def MBEDTLS_SSL_COOKIE_C + * + * Enable basic implementation of DTLS cookies for hello verification. + * + * Module: library/ssl_cookie.c + * Caller: + */ +#define MBEDTLS_SSL_COOKIE_C + +/** + * \def MBEDTLS_SSL_TICKET_C + * + * Enable an implementation of TLS server-side callbacks for session tickets. + * + * Module: library/ssl_ticket.c + * Caller: + * + * Requires: MBEDTLS_CIPHER_C + */ +#define MBEDTLS_SSL_TICKET_C + +/** + * \def MBEDTLS_SSL_CLI_C + * + * Enable the SSL/TLS client code. + * + * Module: library/ssl_cli.c + * Caller: + * + * Requires: MBEDTLS_SSL_TLS_C + * + * This module is required for SSL/TLS client support. + */ +#define MBEDTLS_SSL_CLI_C + +/** + * \def MBEDTLS_SSL_SRV_C + * + * Enable the SSL/TLS server code. + * + * Module: library/ssl_srv.c + * Caller: + * + * Requires: MBEDTLS_SSL_TLS_C + * + * This module is required for SSL/TLS server support. + */ +#define MBEDTLS_SSL_SRV_C + +/** + * \def MBEDTLS_SSL_TLS_C + * + * Enable the generic SSL/TLS code. + * + * Module: library/ssl_tls.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * Requires: MBEDTLS_CIPHER_C, MBEDTLS_MD_C + * and at least one of the MBEDTLS_SSL_PROTO_XXX defines + * + * This module is required for SSL/TLS. + */ +#define MBEDTLS_SSL_TLS_C + +/** + * \def MBEDTLS_THREADING_C + * + * Enable the threading abstraction layer. + * By default mbed TLS assumes it is used in a non-threaded environment or that + * contexts are not shared between threads. If you do intend to use contexts + * between threads, you will need to enable this layer to prevent race + * conditions. See also our Knowledge Base article about threading: + * https://tls.mbed.org/kb/development/thread-safety-and-multi-threading + * + * Module: library/threading.c + * + * This allows different threading implementations (self-implemented or + * provided). + * + * You will have to enable either MBEDTLS_THREADING_ALT or + * MBEDTLS_THREADING_PTHREAD. + * + * Enable this layer to allow use of mutexes within mbed TLS + */ +//#define MBEDTLS_THREADING_C + +/** + * \def MBEDTLS_TIMING_C + * + * Enable the semi-portable timing interface. + * + * \note The provided implementation only works on POSIX/Unix (including Linux, + * BSD and OS X) and Windows. On other platforms, you can either disable that + * module and provide your own implementations of the callbacks needed by + * \c mbedtls_ssl_set_timer_cb() for DTLS, or leave it enabled and provide + * your own implementation of the whole module by setting + * \c MBEDTLS_TIMING_ALT in the current file. + * + * \note See also our Knowledge Base article about porting to a new + * environment: + * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS + * + * Module: library/timing.c + * Caller: library/havege.c + * + * This module is used by the HAVEGE random number generator. + */ +// #define MBEDTLS_TIMING_C + +/** + * \def MBEDTLS_VERSION_C + * + * Enable run-time version information. + * + * Module: library/version.c + * + * This module provides run-time version information. + */ +// #define MBEDTLS_VERSION_C + +/** + * \def MBEDTLS_X509_USE_C + * + * Enable X.509 core for using certificates. + * + * Module: library/x509.c + * Caller: library/x509_crl.c + * library/x509_crt.c + * library/x509_csr.c + * + * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, + * MBEDTLS_PK_PARSE_C + * + * This module is required for the X.509 parsing modules. + */ +#define MBEDTLS_X509_USE_C + +/** + * \def MBEDTLS_X509_CRT_PARSE_C + * + * Enable X.509 certificate parsing. + * + * Module: library/x509_crt.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * + * Requires: MBEDTLS_X509_USE_C + * + * This module is required for X.509 certificate parsing. + */ +#define MBEDTLS_X509_CRT_PARSE_C + +/** + * \def MBEDTLS_X509_CRL_PARSE_C + * + * Enable X.509 CRL parsing. + * + * Module: library/x509_crl.c + * Caller: library/x509_crt.c + * + * Requires: MBEDTLS_X509_USE_C + * + * This module is required for X.509 CRL parsing. + */ +#define MBEDTLS_X509_CRL_PARSE_C + +/** + * \def MBEDTLS_X509_CSR_PARSE_C + * + * Enable X.509 Certificate Signing Request (CSR) parsing. + * + * Module: library/x509_csr.c + * Caller: library/x509_crt_write.c + * + * Requires: MBEDTLS_X509_USE_C + * + * This module is used for reading X.509 certificate request. + */ +#define MBEDTLS_X509_CSR_PARSE_C + +/** + * \def MBEDTLS_X509_CREATE_C + * + * Enable X.509 core for creating certificates. + * + * Module: library/x509_create.c + * + * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C + * + * This module is the basis for creating X.509 certificates and CSRs. + */ +#define MBEDTLS_X509_CREATE_C + +/** + * \def MBEDTLS_X509_CRT_WRITE_C + * + * Enable creating X.509 certificates. + * + * Module: library/x509_crt_write.c + * + * Requires: MBEDTLS_X509_CREATE_C + * + * This module is required for X.509 certificate creation. + */ +#define MBEDTLS_X509_CRT_WRITE_C + +/** + * \def MBEDTLS_X509_CSR_WRITE_C + * + * Enable creating X.509 Certificate Signing Requests (CSR). + * + * Module: library/x509_csr_write.c + * + * Requires: MBEDTLS_X509_CREATE_C + * + * This module is required for X.509 certificate request writing. + */ +#define MBEDTLS_X509_CSR_WRITE_C + +/** + * \def MBEDTLS_XTEA_C + * + * Enable the XTEA block cipher. + * + * Module: library/xtea.c + * Caller: + */ +#define MBEDTLS_XTEA_C + +/* \} name SECTION: mbed TLS modules */ + +/** + * \name SECTION: Module configuration options + * + * This section allows for the setting of module specific sizes and + * configuration options. The default values are already present in the + * relevant header files and should suffice for the regular use cases. + * + * Our advice is to enable options and change their values here + * only if you have a good reason and know the consequences. + * + * Please check the respective header file for documentation on these + * parameters (to prevent duplicate documentation). + * \{ + */ + +/* MPI / BIGNUM options */ +//#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ +//#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ + +/* CTR_DRBG options */ +//#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with +// SHA-256) */ #define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ #define +// MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ #define +// MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ #define +// MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ #define MBEDTLS_CTR_DRBG_USE_128_BIT_KEY +///**< Use 128-bit key for CTR_DRBG - may reduce security (see ctr_drbg.h) */ + +/* HMAC_DRBG options */ +//#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ +//#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ +//#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ +//#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ + +/* ECP options */ +//#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ +//#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ +//#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ + +/* Entropy options */ +//#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ +//#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ +//#define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Default minimum number of bytes required for the hardware entropy +// source mbedtls_hardware_poll() before entropy is released */ + +/* Memory buffer allocator options */ +//#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ + +/* Platform options */ +//#define MBEDTLS_PLATFORM_STD_MEM_HDR /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't +// define if no header is needed. */ #define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be +// undefined */ #define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ #define +// MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ #define MBEDTLS_PLATFORM_STD_TIME time +///**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ #define MBEDTLS_PLATFORM_STD_FPRINTF fprintf +///**< Default fprintf to use, can be undefined */ #define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can +// be undefined */ +/* Note: your snprintf must correctly zero-terminate the buffer! */ +//#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS 0 /**< Default exit value to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE 1 /**< Default exit value to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be +// undefined */ #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function +// to use, can be undefined */ #define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" /**< Seed file to read/write with default +// implementation */ + +/* To Use Function Macros MBEDTLS_PLATFORM_C must be enabled */ +/* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */ +//#define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_EXIT_MACRO exit /**< Default exit macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be +// enabled */ #define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. +// MBEDTLS_HAVE_TIME must be enabled */ #define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can +// be undefined */ #define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ +/* Note: your snprintf must correctly zero-terminate the buffer! */ +//#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_VSNPRINTF_MACRO vsnprintf /**< Default vsnprintf macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be +// undefined */ #define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function +// to use, can be undefined */ + +/** + * \brief This macro is invoked by the library when an invalid parameter + * is detected that is only checked with #MBEDTLS_CHECK_PARAMS + * (see the documentation of that option for context). + * + * When you leave this undefined here, the library provides + * a default definition. If the macro #MBEDTLS_CHECK_PARAMS_ASSERT + * is defined, the default definition is `assert(cond)`, + * otherwise the default definition calls a function + * mbedtls_param_failed(). This function is declared in + * `platform_util.h` for the benefit of the library, but + * you need to define in your application. + * + * When you define this here, this replaces the default + * definition in platform_util.h (which no longer declares the + * function mbedtls_param_failed()) and it is your responsibility + * to make sure this macro expands to something suitable (in + * particular, that all the necessary declarations are visible + * from within the library - you can ensure that by providing + * them in this file next to the macro definition). + * If you define this macro to call `assert`, also define + * #MBEDTLS_CHECK_PARAMS_ASSERT so that library source files + * include ``. + * + * Note that you may define this macro to expand to nothing, in + * which case you don't have to worry about declarations or + * definitions. However, you will then be notified about invalid + * parameters only in non-void functions, and void function will + * just silently return early on invalid parameters, which + * partially negates the benefits of enabling + * #MBEDTLS_CHECK_PARAMS in the first place, so is discouraged. + * + * \param cond The expression that should evaluate to true, but doesn't. + */ +//#define MBEDTLS_PARAM_FAILED( cond ) assert( cond ) + +/* SSL Cache options */ +//#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ +//#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ + +/* SSL options */ + +/** \def MBEDTLS_SSL_MAX_CONTENT_LEN + * + * Maximum length (in bytes) of incoming and outgoing plaintext fragments. + * + * This determines the size of both the incoming and outgoing TLS I/O buffers + * in such a way that both are capable of holding the specified amount of + * plaintext data, regardless of the protection mechanism used. + * + * To configure incoming and outgoing I/O buffers separately, use + * #MBEDTLS_SSL_IN_CONTENT_LEN and #MBEDTLS_SSL_OUT_CONTENT_LEN, + * which overwrite the value set by this option. + * + * \note When using a value less than the default of 16KB on the client, it is + * recommended to use the Maximum Fragment Length (MFL) extension to + * inform the server about this limitation. On the server, there + * is no supported, standardized way of informing the client about + * restriction on the maximum size of incoming messages, and unless + * the limitation has been communicated by other means, it is recommended + * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN + * while keeping the default value of 16KB for the incoming buffer. + * + * Uncomment to set the maximum plaintext size of both + * incoming and outgoing I/O buffers. + */ +//#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 + +/** \def MBEDTLS_SSL_IN_CONTENT_LEN + * + * Maximum length (in bytes) of incoming plaintext fragments. + * + * This determines the size of the incoming TLS I/O buffer in such a way + * that it is capable of holding the specified amount of plaintext data, + * regardless of the protection mechanism used. + * + * If this option is undefined, it inherits its value from + * #MBEDTLS_SSL_MAX_CONTENT_LEN. + * + * \note When using a value less than the default of 16KB on the client, it is + * recommended to use the Maximum Fragment Length (MFL) extension to + * inform the server about this limitation. On the server, there + * is no supported, standardized way of informing the client about + * restriction on the maximum size of incoming messages, and unless + * the limitation has been communicated by other means, it is recommended + * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN + * while keeping the default value of 16KB for the incoming buffer. + * + * Uncomment to set the maximum plaintext size of the incoming I/O buffer + * independently of the outgoing I/O buffer. + */ +//#define MBEDTLS_SSL_IN_CONTENT_LEN 16384 + +/** \def MBEDTLS_SSL_CID_IN_LEN_MAX + * + * The maximum length of CIDs used for incoming DTLS messages. + * + */ +//#define MBEDTLS_SSL_CID_IN_LEN_MAX 32 + +/** \def MBEDTLS_SSL_CID_OUT_LEN_MAX + * + * The maximum length of CIDs used for outgoing DTLS messages. + * + */ +//#define MBEDTLS_SSL_CID_OUT_LEN_MAX 32 + +/** \def MBEDTLS_SSL_CID_PADDING_GRANULARITY + * + * This option controls the use of record plaintext padding + * when using the Connection ID extension in DTLS 1.2. + * + * The padding will always be chosen so that the length of the + * padded plaintext is a multiple of the value of this option. + * + * Note: A value of \c 1 means that no padding will be used + * for outgoing records. + * + * Note: On systems lacking division instructions, + * a power of two should be preferred. + * + */ +//#define MBEDTLS_SSL_CID_PADDING_GRANULARITY 16 + +/** \def MBEDTLS_SSL_OUT_CONTENT_LEN + * + * Maximum length (in bytes) of outgoing plaintext fragments. + * + * This determines the size of the outgoing TLS I/O buffer in such a way + * that it is capable of holding the specified amount of plaintext data, + * regardless of the protection mechanism used. + * + * If this option undefined, it inherits its value from + * #MBEDTLS_SSL_MAX_CONTENT_LEN. + * + * It is possible to save RAM by setting a smaller outward buffer, while keeping + * the default inward 16384 byte buffer to conform to the TLS specification. + * + * The minimum required outward buffer size is determined by the handshake + * protocol's usage. Handshaking will fail if the outward buffer is too small. + * The specific size requirement depends on the configured ciphers and any + * certificate data which is sent during the handshake. + * + * Uncomment to set the maximum plaintext size of the outgoing I/O buffer + * independently of the incoming I/O buffer. + */ +//#define MBEDTLS_SSL_OUT_CONTENT_LEN 16384 + +/** \def MBEDTLS_SSL_DTLS_MAX_BUFFERING + * + * Maximum number of heap-allocated bytes for the purpose of + * DTLS handshake message reassembly and future message buffering. + * + * This should be at least 9/8 * MBEDTLSSL_IN_CONTENT_LEN + * to account for a reassembled handshake message of maximum size, + * together with its reassembly bitmap. + * + * A value of 2 * MBEDTLS_SSL_IN_CONTENT_LEN (32768 by default) + * should be sufficient for all practical situations as it allows + * to reassembly a large handshake message (such as a certificate) + * while buffering multiple smaller handshake messages. + * + */ +//#define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 + +//#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ +//#define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */ +//#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number +// of cookies issued */ + +/** + * Complete list of ciphersuites to use, in order of preference. + * + * \warning No dependency checking is done on that field! This option can only + * be used to restrict the set of available ciphersuites. It is your + * responsibility to make sure the needed modules are active. + * + * Use this to save a few hundred bytes of ROM (default ordering of all + * available ciphersuites) and a few to a few hundred bytes of RAM. + * + * The value below is only an example, not the default. + */ +//#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + +/* X509 options */ +//#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */ +//#define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 /**< Maximum length of a path/filename string in bytes including the null +// terminator character ('\0'). */ + +/** + * Allow SHA-1 in the default TLS configuration for certificate signing. + * Without this build-time option, SHA-1 support must be activated explicitly + * through mbedtls_ssl_conf_cert_profile. Turning on this option is not + * recommended because of it is possible to generate SHA-1 collisions, however + * this may be safe for legacy infrastructure where additional controls apply. + * + * \warning SHA-1 is considered a weak message digest and its use constitutes + * a security risk. If possible, we recommend avoiding dependencies + * on it, and considering stronger message digests instead. + * + */ +//#define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES + +/** + * Allow SHA-1 in the default TLS configuration for TLS 1.2 handshake + * signature and ciphersuite selection. Without this build-time option, SHA-1 + * support must be activated explicitly through mbedtls_ssl_conf_sig_hashes. + * The use of SHA-1 in TLS <= 1.1 and in HMAC-SHA-1 is always allowed by + * default. At the time of writing, there is no practical attack on the use + * of SHA-1 in handshake signatures, hence this option is turned on by default + * to preserve compatibility with existing peers, but the general + * warning applies nonetheless: + * + * \warning SHA-1 is considered a weak message digest and its use constitutes + * a security risk. If possible, we recommend avoiding dependencies + * on it, and considering stronger message digests instead. + * + */ +#define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE + +/** + * Uncomment the macro to let mbed TLS use your alternate implementation of + * mbedtls_platform_zeroize(). This replaces the default implementation in + * platform_util.c. + * + * mbedtls_platform_zeroize() is a widely used function across the library to + * zero a block of memory. The implementation is expected to be secure in the + * sense that it has been written to prevent the compiler from removing calls + * to mbedtls_platform_zeroize() as part of redundant code elimination + * optimizations. However, it is difficult to guarantee that calls to + * mbedtls_platform_zeroize() will not be optimized by the compiler as older + * versions of the C language standards do not provide a secure implementation + * of memset(). Therefore, MBEDTLS_PLATFORM_ZEROIZE_ALT enables users to + * configure their own implementation of mbedtls_platform_zeroize(), for + * example by using directives specific to their compiler, features from newer + * C standards (e.g using memset_s() in C11) or calling a secure memset() from + * their system (e.g explicit_bzero() in BSD). + */ +//#define MBEDTLS_PLATFORM_ZEROIZE_ALT + +/** + * Uncomment the macro to let Mbed TLS use your alternate implementation of + * mbedtls_platform_gmtime_r(). This replaces the default implementation in + * platform_util.c. + * + * gmtime() is not a thread-safe function as defined in the C standard. The + * library will try to use safer implementations of this function, such as + * gmtime_r() when available. However, if Mbed TLS cannot identify the target + * system, the implementation of mbedtls_platform_gmtime_r() will default to + * using the standard gmtime(). In this case, calls from the library to + * gmtime() will be guarded by the global mutex mbedtls_threading_gmtime_mutex + * if MBEDTLS_THREADING_C is enabled. We recommend that calls from outside the + * library are also guarded with this mutex to avoid race conditions. However, + * if the macro MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, Mbed TLS will + * unconditionally use the implementation for mbedtls_platform_gmtime_r() + * supplied at compile time. + */ +//#define MBEDTLS_PLATFORM_GMTIME_R_ALT + +/** + * Enable the verified implementations of ECDH primitives from Project Everest + * (currently only Curve25519). This feature changes the layout of ECDH + * contexts and therefore is a compatibility break for applications that access + * fields of a mbedtls_ecdh_context structure directly. See also + * MBEDTLS_ECDH_LEGACY_CONTEXT in include/mbedtls/ecdh.h. + */ +//#define MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED + +/* \} name SECTION: Customisation configuration options */ + +/* Target and application specific configurations + * + * Allow user to override any previous default. + * + */ +#if defined(MBEDTLS_USER_CONFIG_FILE) +#include MBEDTLS_USER_CONFIG_FILE +#endif + +#include "mbedtls/check_config.h" + +#endif /* MBEDTLS_CONFIG_H */ diff --git a/examples/ota-requestor-app/p6/include/AppConfig.h b/examples/ota-requestor-app/p6/include/AppConfig.h new file mode 100644 index 00000000000000..a7b25027a031af --- /dev/null +++ b/examples/ota-requestor-app/p6/include/AppConfig.h @@ -0,0 +1,65 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2019 Google LLC. + * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company) + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "cybsp.h" +#include "cyhal.h" + +// ---- OTA Requestor Example App Config ---- + +#define APP_TASK_NAME "APP" + +#define APP_UPDATE_BUTTON_IDX 0 +#define APP_FUNCTION_BUTTON_IDX 1 + +#define APP_UPDATE_BUTTON CYBSP_USER_BTN1 +#define APP_FUNCTION_BUTTON CYBSP_USER_BTN2 +#define APP_BUTTON_DEBOUNCE_PERIOD_MS 50 + +#define APP_BUTTON_PRESSED 0 +#define APP_BUTTON_RELEASED 1 + +#define SYSTEM_STATE_LED CYBSP_USER_LED1 +#define UPDATE_LED CYBSP_USER_LED2 + +// Time it takes in ms for the simulated actuator to move from one +// state to another. +#define ACTUATOR_MOVEMENT_PERIOS_MS 2000 + +// ---- Thread Polling Config ---- +#define THREAD_ACTIVE_POLLING_INTERVAL_MS 100 +#define THREAD_INACTIVE_POLLING_INTERVAL_MS 1000 + +// P6 Logging +#ifdef __cplusplus +extern "C" { +#endif + +void appError(int err); +void P6Log(const char * aFormat, ...); +#define P6_LOG(...) P6Log(__VA_ARGS__) + +#ifdef __cplusplus +} + +#include +void appError(CHIP_ERROR error); +#endif diff --git a/examples/ota-requestor-app/p6/include/AppEvent.h b/examples/ota-requestor-app/p6/include/AppEvent.h new file mode 100644 index 00000000000000..671a1be6419724 --- /dev/null +++ b/examples/ota-requestor-app/p6/include/AppEvent.h @@ -0,0 +1,52 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2018 Nest Labs, Inc. + * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company) + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +struct AppEvent; +typedef void (*EventHandler)(AppEvent *); + +struct AppEvent +{ + enum AppEventTypes + { + kEventType_Button = 0, + kEventType_Timer, + kEventType_Light, + kEventType_Install, + }; + + uint16_t Type; + + union + { + struct + { + uint8_t ButtonIdx; + uint8_t Action; + } ButtonEvent; + struct + { + void * Context; + } TimerEvent; + }; + + EventHandler Handler; +}; diff --git a/examples/ota-requestor-app/p6/include/AppTask.h b/examples/ota-requestor-app/p6/include/AppTask.h new file mode 100644 index 00000000000000..43d448ed06b51c --- /dev/null +++ b/examples/ota-requestor-app/p6/include/AppTask.h @@ -0,0 +1,89 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2019 Google LLC. + * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company) + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +#include "AppEvent.h" +#include "FreeRTOS.h" +#include "timers.h" // provides FreeRTOS timer support +#include +#include + +// Application-defined error codes in the CHIP_ERROR space. +#define APP_ERROR_EVENT_QUEUE_FAILED CHIP_APPLICATION_ERROR(0x01) +#define APP_ERROR_CREATE_TASK_FAILED CHIP_APPLICATION_ERROR(0x02) +#define APP_ERROR_UNHANDLED_EVENT CHIP_APPLICATION_ERROR(0x03) +#define APP_ERROR_CREATE_TIMER_FAILED CHIP_APPLICATION_ERROR(0x04) +#define APP_ERROR_START_TIMER_FAILED CHIP_APPLICATION_ERROR(0x05) +#define APP_ERROR_STOP_TIMER_FAILED CHIP_APPLICATION_ERROR(0x06) + +class AppTask +{ + +public: + CHIP_ERROR StartAppTask(); + static void AppTaskMain(void * pvParameter); + + void PostEvent(const AppEvent * event); + + void ButtonEventHandler(uint8_t btnIdx, uint8_t btnAction); + +private: + friend AppTask & GetAppTask(void); + + CHIP_ERROR Init(); + + void CancelTimer(void); + + void DispatchEvent(AppEvent * event); + + static void FunctionTimerEventHandler(AppEvent * aEvent); + static void UpdateButtonHandler(AppEvent * aEvent); + static void FunctionHandler(AppEvent * aEvent); + static void TimerEventHandler(TimerHandle_t xTimer); + + static void UpdateClusterState(void); + + void StartTimer(uint32_t aTimeoutMs); + + enum class Function + { + kNoneSelected = 0, + kSoftwareUpdate = 0, + kStartBleAdv = 1, + kFactoryReset = 2, + + kInvalid + }; + + Function mFunction = Function::kNoneSelected; + bool mFunctionTimerActive = false; + bool mSyncClusterToButtonAction = false; + + static AppTask sAppTask; +}; + +inline AppTask & GetAppTask(void) +{ + return AppTask::sAppTask; +} diff --git a/examples/ota-requestor-app/p6/include/ButtonHandler.h b/examples/ota-requestor-app/p6/include/ButtonHandler.h new file mode 100644 index 00000000000000..8dfbf7ef7ef856 --- /dev/null +++ b/examples/ota-requestor-app/p6/include/ButtonHandler.h @@ -0,0 +1,41 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2019 Google LLC. + * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company) + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include "FreeRTOS.h" +#include "cyhal.h" +#include "timers.h" // provides FreeRTOS timer support + +#define GPIO_INTERRUPT_PRIORITY (5) + +class ButtonHandler +{ +public: + static void Init(void); + +private: + static void GpioInit(void); + static void lockbuttonIsr(void * handler_arg, cyhal_gpio_event_t event); + static void functionbuttonIsr(void * handler_arg, cyhal_gpio_event_t event); + static void TimerCallback(TimerHandle_t xTimer); +}; diff --git a/examples/ota-requestor-app/p6/include/CHIPProjectConfig.h b/examples/ota-requestor-app/p6/include/CHIPProjectConfig.h new file mode 100644 index 00000000000000..17f8d6772f71b7 --- /dev/null +++ b/examples/ota-requestor-app/p6/include/CHIPProjectConfig.h @@ -0,0 +1,135 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2019 Google LLC. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file + * Example project configuration file for CHIP. + * + * This is a place to put application or project-specific overrides + * to the default configuration values for general CHIP features. + * + */ + +#pragma once + +/** + * CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY + * + * Enables the use of a hard-coded default Chip device id and credentials if no device id + * is found in Chip NV storage. + * + * This option is for testing only and should be disabled in production releases. + */ +#define CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY 34 + +// Use a default pairing code if one hasn't been provisioned in flash. +#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE +#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021 +#endif + +#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR +#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00 +#endif + +// For convenience, Chip Security Test Mode can be enabled and the +// requirement for authentication in various protocols can be disabled. +// +// WARNING: These options make it possible to circumvent basic Chip security functionality, +// including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS. +// +#define CHIP_CONFIG_SECURITY_TEST_MODE 0 +#define CHIP_CONFIG_REQUIRE_AUTH 1 + +/** + * CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_REVISION + * + * The product revision number assigned to device or product by the device vendor. This + * number is scoped to the device product id, and typically corresponds to a revision of the + * physical device, a change to its packaging, and/or a change to its marketing presentation. + * This value is generally *not* incremented for device software revisions. + */ +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_REVISION 1 + +/** + * CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING + * + * A string identifying the firmware revision running on the device. + * CHIP service currently expects the firmware version to be in the format + * {MAJOR_VERSION}.0d{MINOR_VERSION} + */ +#ifndef CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING +#define CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING "0.1ALPHA" +#endif +/** + * CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE + * + * Enable support for Chip-over-BLE (CHIPoBLE). + */ +#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1 + +/** + * CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC + * + * Enables synchronizing the device's real time clock with a remote Chip Time service + * using the Chip Time Sync protocol. + */ +#define CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC 0 + +/** + * CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER + * + * Enables the use of a hard-coded default serial number if none + * is found in Chip NV storage. + */ +#define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN" + +/** + * CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS + * + * Enable recording UTC timestamps. + */ +#define CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS 1 + +/** + * CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE + * + * A size, in bytes, of the individual debug event logging buffer. + */ +#define CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (512) + +/** + * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION + * + * The hardware version number assigned to device or product by the device vendor. This + * number is scoped to the device product id, and typically corresponds to a version of the + * physical device, a change to its packaging, and/or a change to its marketing presentation. + * This value is generally *not* incremented for device software versions. + */ +#define CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION 1 + +/** + * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING + * + * A string identifying the software version running on the device. + * CHIP service currently expects the software version to be in the format + * {MAJOR_VERSION}.0d{MINOR_VERSION} + */ +#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "0.1ALPHA" +#endif diff --git a/examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex b/examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex new file mode 100644 index 00000000000000..a8ae0bf328eb65 --- /dev/null +++ b/examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex @@ -0,0 +1,4099 @@ +:020000041000EA +:1000000000000208070500100D000000690500103F +:1000100000000000000000000000000000000000E0 +:100020000000000000000000000000006505001056 +:1000300000000000000000006505001065050010CC +:1000400065050010650500106505001065050010C8 +:1000500065050010650500106505001065050010B8 +:1000600065050010650500106505001065050010A8 +:100070006505001065050010650500106505001098 +:1000800010B5064C2378002B07D1054B002B02D06E +:10009000044800E000BF0123237010BD740700086E +:1000A00000000000DCF60010044B10B5002B03D05C +:1000B0000349044800E000BF10BDC0460000000036 +:1000C00078070008DCF6001010B500F07DF800F0AD +:1000D00007F800F069F800F01FF800F029F810BDEB +:1000E00010B50021012007F059F94D22002101200F +:1000F00007F092F80021012007F00EF900210020FE +:1001000007F04CF900220021002007F085F80021BB +:10011000002007F001F910BD10B5002200212F20AA +:1001200007F0C0F800220121052007F0BBF810BD40 +:1001300010B5134C134A0021200004F0AFFD124A01 +:100140000121200004F0AAFD104C114A00212000DA +:1001500004F0A4FD0F4A0121200004F09FFD0E4C85 +:100160000E4A0421200004F099FD0D4A06212000CA +:1001700004F094FD0B4A0721200004F08FFD10BD10 +:1001800000003140FCDF001030E000108002314000 +:1001900094DF0010C8DF00100003314060DF001062 +:1001A0002CDF0010F8DE0010034B332203495A50B5 +:1001B00003495A507047C0460000304008200000F4 +:1001C00010200000FEE7000030B583B0962100202B +:1001D00008F048F808F00CF800281BD1774AFF23F4 +:1001E0001B02D4583F231C4007F0F2FF002806D022 +:1001F000012007F0DBFF714B9B6C002B25DB6F4A66 +:10020000FF231B02D45007F07BFA07F06DFA0120A0 +:1002100007F08EFA012008F005FD08F0A1FC08F0B7 +:1002200087FD08F06FFD0021002007F0FFF9002096 +:1002300007F086F9012007F067F9002007F0E2F8DF +:100240005F4B1A683F23D45C06E00620FFF7BAFF35 +:10025000200007F0BBFC013C002CF9D1002101205B +:1002600007F09EFA002007F0CFF9002800D189E0BE +:1002700007F054FB0021002007F092FA0021002033 +:1002800007F0A4F94F4C002500950023002200211F +:10029000200004F055FC00950023002201212000DD +:1002A00004F04EFC484807F0FFF9002800D075E044 +:1002B000012007F017F9002007F042F9012007F0AC +:1002C00023F9002007F09EF80021012007F068FACA +:1002D0000021002007F064FA0021022007F060FAF4 +:1002E0000021032007F05CFA0021042007F058FAEF +:1002F0000021052007F054FA344807F02DFB0028B0 +:100300004FD1334807F0F6FB00284DD101210020E2 +:1003100007F05CF90021002007F088F92D49012041 +:1003200007F07AFC002842D12B49012007F00AFD92 +:1003300000283FD10021022007F048F901210220C6 +:1003400007F074F9022007F00DF907F0BFF800205C +:1003500007F088F8002007F09DF807F0ABF80020C0 +:1003600008F0F4FC012007F06BF807F0BDF901205C +:1003700007F0DEF99021002007F074FF00F01AF971 +:1003800003B030BD07F03AFA1223FF33984200D091 +:100390006EE70121002007F019F969E70520FFF752 +:1003A00011FF0420FFF70EFF0420FFF70BFF0320CF +:1003B000FFF708FF0320FFF705FFC04600002740B6 +:1003C000D45F01080000314040420F00C0E100103E +:1003D000400D0300D4E100101027000010B503F019 +:1003E00059F9054C200004F055FB200004F052FBA5 +:1003F000012002F04FFE10BD8002314010B584682C +:1004000003681B89E418094B1B68DB68382201214B +:1004100007480AF0B5F80A21064803F01DF9FFF76E +:10042000DDFF200000F082F910BDC046EC0100089D +:10043000DCE100100000654010B584B0FFF744FE19 +:1004400062B6E120400203F0E9F8264C2368DB683D +:100450001022012124480AF093F82368DB68222245 +:10046000012122480AF08CF8012002F0C1FD041E8F +:100470000DD11C4B1B68DB682E2201211C480AF0A1 +:100480007FF8002C0BD0002008F032FAFBE7154B68 +:100490001B68D8682200174909F0FEFFF1E701A8A0 +:1004A00000F086FF00280FD10E4B1B68DB682F225F +:1004B000012111480AF064F8FA20000102F0BAFFA5 +:1004C00001A8FFF79BFFDEE7064B1B68DB683222C3 +:1004D00001210A480AF054F80A21094803F0BCF83F +:1004E000D1E7C046EC01000818E200102CE2001031 +:1004F00050E2001080E20010C4E20010F4E20010AC +:10050000000065407047FFF7FDFF72B60F4C104DBD +:10051000AC4209DA21686268A368043B02DBC85870 +:10052000D050FAE70C34F3E70A490B4A0020521A7C +:1005300002DD043A8850FCDC084809490860BFF332 +:100540004F8F00F075F8FFF777FFFEE7E8F6001031 +:1005500000F70010740700087C6001080000000824 +:1005600008ED00E0FEE7FEE700B504207146084212 +:1005700002D0EFF3098001E0EFF30880043007F0C8 +:1005800059FEFEE7000000000230800803D0013071 +:100590000238FCD1C046C0467047EFF3108072B6F7 +:1005A000704780F31088704710B5002004F0C2FD3A +:1005B00010BD704710B5002007F0EAFC041E00D102 +:1005C00010BD144B186006F0AFFF411C200008F06E +:1005D00035FC0400104B186006F026FF411C20007B +:1005E00008F02CFC04000D4B1860013C0C49200065 +:1005F00008F024FC01300B4B1870FA218900200010 +:1006000008F01CFC0130084B1860C003074B186051 +:10061000D6E7C04684000008880000088000000873 +:1006200040420F0094000008900000088C00000871 +:1006300010B5234803F036F8224CB022D200A3585C +:100640005B005B08A350E02189006358302083439E +:10065000635080235B04A3501B4B1C4AE2500433BD +:10066000A0229201E2501A4BFF22E25008F098FBC0 +:10067000C0225200A35801218B43A350FFF799FFDA +:10068000FFF798FF134B1B68BA20195ACA00521A79 +:10069000196A8C4662440021D1601A6A185AC30054 +:1006A0001B1AD31859600C4A8031032004F09AFDBC +:1006B0000A4804F0F3FB0A4804F048FC10BDC046A9 +:1006C000F8ED001000002640840500000100020043 +:1006D0008C050000D45F010820070008900700087F +:1006E00028E30010034A90235B01D35803201840ED +:1006F0007047C0460000204010B5FFF74EFF084C81 +:10070000902149016358074A1A40074B134363502D +:10071000034B5B68DB06FBD5FFF743FF10BDC0460C +:1007200000002040FCFF00000100FA0570B5040045 +:10073000830500D001BEFFF730FF0500FFF7D2FFB1 +:10074000032813D00B4B802292009C509020400134 +:100750001A5809491140094A0A431A50054B5B6867 +:10076000DB06FBD52800FFF71CFF70BDFFF7C4FFB9 +:10077000E8E7C04600002040FCFF00000300FA0547 +:1007800000B583B0130001AA1370012301F055FADC +:1007900003B000BD10B509F00DFF10BD04280AD04C +:1007A000052804D101394B1E994108007047401AB1 +:1007B00043425841FAE70120F8E710B582B00C0037 +:1007C000C0B201A901F07EFF002803D0012420005F +:1007D00002B010BD2100019801F094FA04000198C4 +:1007E00001F084FFF3E710B5040001F015FA0100F1 +:1007F00001222000FFF7C4FF10BD10B5040001F076 +:1008000007FA010001222000FFF7BAFF10BD000027 +:1008100030B583B004000E2A10D80E2915D8120165 +:100820000A436B46DD1DDA7101F0FBF9010001237B +:100830002A00200001F001FA03B030BD9C21064BD4 +:10084000064A8900064809F009FE9C21054B034A27 +:100850008900034809F002FE5CE30010CCE40010BC +:1008600070E30010B8E3001010B582B004000191ED +:1008700001F0DCF90100042301AA200001F0DDF9F8 +:1008800002B010BD30B589B006A90120FFF795FF71 +:10089000002800D08CE004A90230FFF78EFF04008E +:1008A000444B1B68D86806AB1B78012B28D0032B60 +:1008B00024D0414B06AA51789578D27802920195BE +:1008C00000913E4A3E4909F0E7FD3A4B1B68D86863 +:1008D00004AB1B78012B17D0032B13D0364B04AA83 +:1008E00051789578D278029201950091354A344931 +:1008F00009F0D2FD002C11D0FF2057E0324BD9E790 +:10090000324BD7E7304BEAE7304BE8E72B79042B43 +:1009100028D006AA9278934224D00134022C3CD8E5 +:1009200063001B195B002A4AD51806A90978D05C18 +:10093000FFF734FF0028F0D004AB19786878FFF790 +:100940002DFF0028E9D0AB78042B03D006AAD2787B +:100950009342E2D1EB78042BD8D004AAD278934208 +:10096000DBD1D3E7134B1B68D8686B79022B07D018 +:10097000032B10D0042B01D0164A02E0164A00E0E7 +:10098000164A174909F088FD6879831EDBB2022BED +:100990000CD9FF200AE0134AF3E7064B1B68DB681B +:1009A00017220121104809F0EBFD012009B030BDEC +:1009B000FF20FBE7EC010008CCE300100CE4001082 +:1009C00030E4001074E40010D8E30010D0E300100D +:1009D000F4E40010F0E3001004E40010E0E3001081 +:1009E0009CE40010E8E30010B4E4001070B50500CA +:1009F000002915D001235B422878584004090F22B2 +:100A00001040094E80008359634018091A40920033 +:100A100093594340013901350029EDD1D84370BDC8 +:100A200001235B42FAE7C04608E50010F0B5CE4668 +:100A3000474680B5A7B0140099462E9F2F9B984635 +:100A4000684602F0B9FC0021684602F0BAFC319B0E +:100A5000002B02D0329B002B07DC2389E2689446EE +:100A600063446689F618002513E01A003199684638 +:100A700002F0B5FCF1E723003A002900484601F0F6 +:100A800037FE002811D122003900684602F0A7FC89 +:100A90002D19B54204D2741B4445ECD94446EAE70B +:100AA0003099684602F0A7FC002027B0C0BCB946C8 +:100AB000B046F0BDF0B59FB017001D002C4B1E686E +:100AC000279B0493269B039306AB0293259B0193DC +:100AD000249B00932B00FFF7A9FF041E3DD1289B08 +:100AE000002B04D0202206A9180009F071FD002374 +:100AF0000093204B2A00390016A801F00FFD041EB8 +:100B00002BD11CAB72226A441DA916A801F07CFDF2 +:100B1000002821DB1CDC1CA909881029F1D17223D3 +:100B20006B441B88202B20D10EAA1D99280001F0B0 +:100B3000DFFD071E17D120220EA906A8FFF72AFE07 +:100B400006000D4B1B6801248342DAD03C0004E010 +:100B500063425C41E4B200E00400002C00D13400A8 +:100B600020001FB0F0BD0400F7E701246442F7E75E +:100B700098000008FFFF00001009000810B50B4B9B +:100B800002689A420FD1C2680389D843824202D8D0 +:100B9000D418012000E00020002805D08B68A34273 +:100BA00002D8002000E0002010BDC0463DB8F396FA +:100BB000F0B585B005000C000192002001F098FE10 +:100BC000C0B203A901F07EFD002806D001270398DA +:100BD00001F08CFD380005B0F0BD2C236343EB1809 +:100BE0001A89DE689619042302AA3100039801F0DD +:100BF0007FFD071E26D12C214C432D196C8902AB99 +:100C00001A88134B9A420DD0002C1DD102AB1A88C2 +:100C1000104B9A421AD1331902AA52889B18019A92 +:100C20001360D4E702AB59888C4201D00327CEE78A +:100C30008919042302AA039801F05AFD0028E5D07F +:100C40000127C4E70127C2E70327C0E70327BEE760 +:100C5000086900000769000010B582B004000800B0 +:100C6000E02212010192012906D002290FD00729A2 +:100C700010D1E26D603401E0626A283401A901F00C +:100C800085FE002801D1019B236002B010BD226DBA +:100C90005434F3E70120F8E710B5006A01F018FEBC +:100CA00010BD70B504000121FFF7D6FF002802D067 +:100CB0000125280070BD02212000FFF7CDFF00288C +:100CC00001D00125F5E707212000FFF7C5FF051E2C +:100CD00001D00125EDE72000FFF7DEFFA066E8E781 +:100CE000F0B583B004000F00002001F001FEC0B297 +:100CF00001A901F0E7FC061E1AD1019801F008FED7 +:100D00000500019801F0F2FC2C21794361180023C1 +:100D1000032B05D8CA5C954208D10133DBB2F7E753 +:100D20000123002B07D0300003B0F0BD0023F8E70B +:100D300001267642F7E701267642F4E700B587B050 +:100D4000130000220492039202920132FF320192B8 +:100D5000044A00920A0000210020FFF7ABFE07B012 +:100D600000BDC046805D0108F0B585B005000C00EF +:100D70000192244B1F68002001F0BAFDC0B203A904 +:100D800001F0A0FC002802D0380005B0F0BD2C30E6 +:100D900060432E1821002800FFF7A2FF00282BD067 +:100DA0003369D90601D5012727E0019B039A310059 +:100DB0002800FFF7C3FF0700039D29003000FFF75D +:100DC000DDFE002803D0104B1B68BB4215D0002C61 +:100DD0000AD10E4B1B68D868002C0BD10C4A0D4968 +:100DE00009F05AFB012708E0AA680021280001F059 +:100DF00015FDEEE7084AF2E70127039801F076FCBB +:100E0000C2E7C0469800000810090008EC0100087D +:100E100054E500105CE5001048E5001070B50500D1 +:100E20000E000020FFF72EFD0400022805D0042844 +:100E300003D0032801D0200070BD3200012128001A +:100E4000FFF792FF044B1B688342F4D0012801D0C6 +:100E50000524F0E70400EEE710090008F8B50600E5 +:100E60000D0017000024012C11DC2C226243B21863 +:100E70003B002100300000F0D9FB002801D10134F3 +:100E8000F1E7002C04DD002D02D1002000E000205D +:100E9000F8BD002383718360C36001334371036035 +:100EA0000371C37170474379012B01D00020704753 +:100EB0000368012B01D00020F9E70379012B01D051 +:100EC0000020F4E70120F2E730B583B005000C0004 +:100ED0000023009301930800FFF7E5FF002830D0BE +:100EE000204B2A689A4212D01E4BEA6A9A421BD0C3 +:100EF000019B009A934200D90093009BA360009A43 +:100F00002100280000F0D2FD002003B030BD6A4669 +:100F100000212800FFF74CFE0028E5D0124B134AB1 +:100F20001349144809F09AFA01AA01212800FFF791 +:100F30003FFE0028DCD00C4B0C4A0F490D4809F04D +:100F40008DFA21000831002001F000F8002802D1BC +:100F5000A3680093D3E7044B044A0849054809F005 +:100F60007DFAC0463DB8F39688E50010C8E600104B +:100F70003604000090E500104D0400006D040000F0 +:100F800070B504000D00FFF79FFF002812D1EB7928 +:100F90006422A354033BDBB2012B11D9EB79022B62 +:100FA00017D0042B15D0032B13D06423E35CFF2B45 +:100FB00018D070BD124B134A1349144809F04EFA69 +:100FC000002000F011FA0028E8D06423FF22E25448 +:100FD000E4E7002000F0F4F90028E6D06423FF22C3 +:100FE000E254E2E70A4B1B68DB680E220121094844 +:100FF00009F0C6FA084B034A0849044809F02EFADA +:1010000088E50010D8E600109605000090E5001075 +:10101000EC010008D0E50010E0E50010AE0500008E +:1010200070B50400FFF750FF002814D16423E55C7D +:10103000EB1EDBB2012B14D9022D03D0042D01D0FD +:10104000032D07D1002000F0BBF9002802D0642353 +:10105000FF22E25470BD084B084A0949094809F0CB +:10106000FDF9002000F0C0F90028E5D06423FF223C +:10107000E254FF25E2E7C04688E50010B4E6001020 +:101080005305000090E5001070B504000D00FFF757 +:1010900008FE00280FD1002200212000FFF7DEFE0D +:1010A000002814D1200000F0CDFB00281AD16423C1 +:1010B0000122E2540AE0344B1B68D868E022120196 +:1010C000324909F0E9F964230122E25470BD2E4B44 +:1010D0001B68D86800222E4909F0DEF9642301223A +:1010E000E254F3E72800FFF7D4FE2900200001F0C6 +:1010F00001F8002814D12800FFF7D5FE00281AD0E7 +:10110000EB79012B34D02A0001212000FFF72CFEBF +:10111000204B1B68834232D064230522E254D5E77A +:10112000194B1B68D86800221B4909F0B5F96423E4 +:101130000122E254CAE729002000FFF721FF00281E +:101140000AD12A0000212000FFF788FE002809D1DB +:1011500064230122E254B9E7104B114A11491248A5 +:1011600009F07CF90D4B0E4A10490F4809F076F949 +:1011700029002000FFF752FE6423E054A6E7EA7935 +:101180006423E254A2E7C046EC010008E4E5001045 +:101190002CE60010100900085CE6001088E500103D +:1011A000F4E600105306000090E500105906000018 +:1011B00010B501F033FB10BDF8B5DE4657464E467C +:1011C0004546E0B58946924698460A9B9B460B9E4B +:1011D000002512E04346E9182300124A484601F070 +:1011E00087FA002819D15B46E91823000D4A5046BA +:1011F00001F0BEFA002812D12D19B54206D2741B97 +:101200008023DB009C42E5D91C00E3E70020F0BC12 +:10121000BB46B246A946A046F8BD0120F7E701202B +:10122000F5E7C04680090008F0B5C64600B584B0B1 +:1012300004000E004E4B1B6898466C22002109F0FA +:10124000D0F94C4B63624C4B23654C4BE365012753 +:101250007F420025012D14D82900002001F048FB11 +:101260002C21694320316118C0B201F02BFA071E0E +:1012700001D10135EEE7424B424A4349434809F068 +:10128000EDF869462000FFF7FFFE6423E35C6A4641 +:10129000D371042B18D8022B21D2012B2BD164231C +:1012A000E35CFF2B2BD0012B37D1394B22689A42BC +:1012B0003BD0384B1B68D86800232200364909F020 +:1012C000EBF80327002549E0052B14D1002000F09E +:1012D0008BF8071EE3D06423FF22E254DFE7694660 +:1012E0002000FFF79DFE071ED9D0254B254A2B492C +:1012F000264809F0B3F86423FF22E254CFE7254BD8 +:101300001B68DB680E220121254809F039F9254BBD +:101310001C4A25491D4809F0A1F86A460021200011 +:10132000FFF79CFD071EC0D0CCE7102200216846C5 +:1013300009F057F9236A5B783371236A5B68B360FD +:1013400034601A4B1B689846BCE70122521B2C23C1 +:101350005343E318186A01F0C9F90135012DF4D996 +:10136000002F00D14746380004B080BCB846F0BD1D +:1013700098000008800D0008807D000880ED0008BE +:1013800088E5001014E70010D406000090E5001076 +:101390003DB8F396EC0100088CE60010140700003D +:1013A000D0E50010E0E500102B0700001009000850 +:1013B00010B501000148FFF737FF10BD1409000800 +:1013C00010B582B001A9012001F07CF9002803D0FA +:1013D0000124200002B010BD0198FFF704FA0400B8 +:1013E000019801F083F9F4E710B584B003A9012056 +:1013F00001F068F9002803D00124200004B010BDDA +:1014000001A9039800F07EFC041E0CD101ABDB782F +:10141000032B03D0039801F069F9EEE70398FFF777 +:10142000ECF90400F6E70124F4E70000F0B5CE463D +:1014300000B582B00C0016001D00526AC300D758D8 +:101440001368FF1A0138C0001258D31A99462B6846 +:10145000012B15D1EB68022B0CD00899300000F05D +:101460008BFD00282AD12A000899300000F0EAFDFF +:1014700000282AD10999300000F07EFD00282BD1E8 +:10148000220039000898FFF793FE00282BD1019421 +:1014900000974B46089A11003000FFF78DFE002898 +:1014A00028D12900300000F0E9FB2B6801332B60C4 +:1014B000002826D102B080BCB946F0BD5421144B9F +:1014C000144AFF31144808F0C9FFAB21104B114AF0 +:1014D0004900114808F0C2FFAD210D4B0D4A4900EB +:1014E0000D4808F0BBFFAF21094B0A4A49000A48E2 +:1014F00008F0B4FF6221064B064AFF31064808F0A7 +:10150000ADFFB321024B034A4900034808F0A6FF90 +:1015100088E50010CCE8001024E70010F0B5CE46B6 +:10152000474680B583B00F0015001C00566AC30003 +:10153000F2583368D21A90460138C0003658F61A6D +:101540002A6D11581368CB1A99462279012A07D0BF +:101550002379022B32D003B0C0BCB946B046F0BDEF +:101560003A0031000A98FFF723FE002818D10197AE +:1015700000964B460A9A0B992800FFF71DFE00289B +:1015800015D12100280000F079FB022323710028E7 +:10159000DED08021224B234AFF31234808F05EFF32 +:1015A0007A211F4B1F4AFF311F4808F057FFBE2109 +:1015B0001B4B1C4A49001C4808F050FF3A004946A2 +:1015C0000B98FFF7F5FD00281CD101974B460093BF +:1015D00043460B9A0A992800FFF7EEFD002818D120 +:1015E0002100280000F04AFB236801332360012317 +:1015F00023710028AFD08C21094B0A4AFF310A48D9 +:1016000008F02CFFC221064B064A4900064808F0A4 +:1016100025FF8821024B034AFF31034808F01EFFD3 +:1016200088E50010B8E8001024E7001070B582B01B +:1016300016001C1E3AD0436A5D686379012B12D0F4 +:10164000022B19D00025002001F052F9C0B201A9E7 +:1016500001F038F8002830D00125019801F046F853 +:10166000280002B070BD002922D11D4B1B682268E2 +:101670009A42E8D80025E6E72368012B08D9184AE2 +:101680001268934204D8002914D100250131DAE709 +:10169000012B01D00025D6E7002900D00025012923 +:1016A000D1D12379022BCED10021CCE70025CAE786 +:1016B0000025C8E700250021C5E7202332002900C6 +:1016C000019801F015F8051E08D1002CC5D032682C +:1016D000044B9A42C1D001256D42BEE70125BCE70B +:1016E0009C0000083DB8F396F0B5DE4657464E46DE +:1016F0004546E0B589B006000591049200230393A6 +:101700000378032B00D182E000F095FAE0252D014B +:1017100000239A460133019300239B46013B9946DF +:101720000023029380464F460BE06B1E9B460292BD +:101730001AE0019BA34202D001239C46E244013DF2 +:101740000194002D1DDD30784346E918013901234D +:1017500006AA073200F086FE041E5ADB06ABDA79D1 +:10176000531EDBB2012BE0D9300001F0D1F806ABFB +:1017700007331B789842DCD07A1CE0D12F0003930A +:10178000DDE7B9465346012B24DC049908310020DB +:1017900000F0DCFB041E2BD1049B9E6805998F6E24 +:1017A0003900300007F04AFB05003900300007F02F +:1017B000CBFB4B1E99416918484601302AD0894518 +:1017C0001CDA0123049A537113004A461A60039AE3 +:1017D0001A711FE0134B1B68DB6825220121124898 +:1017E00008F0CEFE114B124AC221124808F036FE14 +:1017F000114B0F4AC8210F4808F030FE0223049A0B +:10180000537113005A461A60029A1A7102E00724B3 +:1018100000E00124200009B0F0BCBB46B246A94656 +:10182000A046F0BDEC0100086CE70010E0E50010F8 +:1018300010E9001024E7001088E500100068484314 +:101840007047000070B5856A446DAC4202D0631CDD +:10185000AB4213D1E0231B019D4219D80023002184 +:10186000A34229D2DA00416A89184968066DB44654 +:10187000624452688A4215D10133F1E7194B1B6863 +:10188000DB683A220121184808F07AFE002012E0B5 +:10189000144B1B68DB6831220121144808F070FEEC +:1018A000002008E00F4B1B68DB682E220121104846 +:1018B00008F066FE002070BDAC4211D2426ADB0027 +:1018C000D3185B68994201D10120F4E7054B1B68EE +:1018D000DB682E220121064808F052FE0020EAE7CC +:1018E0000120E8E7EC01000894E70010D0E70010C1 +:1018F00004E8001070B586B004A90120FEF75DFF72 +:10190000041E25D11D4B1B68D86804AB1B78012B26 +:1019100027D0032B23D01A4B04AD6A78A978EE7830 +:10192000029601910092174A174908F0B5FD2B78ED +:10193000012B02D1AB78032B15D0104B1B68DB6851 +:1019400019220121114808F01BFE200006B070BDCD +:1019500030210F4B0F4AFF310F4808F07FFD0F4B2E +:10196000DAE70F4BD8E7054B1B68DB682122012122 +:101970000C4808F005FE0224E7E7C046EC01000829 +:10198000CCE3001034E8001030E400107CE80010D4 +:1019900088E50010FCE8001024E70010D8E30010F0 +:1019A000D0E3001058E80010F0B589B005900C00A5 +:1019B0001500334962681140324A914202D12268CF +:1019C000012A01D009B0F0BD06A91800FEF7F5FE06 +:1019D000002834D12C4B1B68D86806AB1B78012B30 +:1019E00036D0032B32D0294B06AF7A78B978FE78FF +:1019F000029601910092264A264908F04DFD3B7857 +:101A0000032BDFD12900059800F0B6FA002821D178 +:101A10002800FEF7F2FE002823D1A1682800FEF777 +:101A200023FF002824D1280000F010F90028C9D095 +:101A3000B821194B194AFF31194808F00FFDD4217C +:101A4000154B164A4900164808F008FD154BCBE720 +:101A5000154BC9E7D721104B104A4900104808F030 +:101A6000FDFCB2210C4B0D4AFF310D4808F0F6FC8D +:101A7000DA21094B094A4900094808F0EFFCC04641 +:101A800000FF00FF00010004EC010008CCE300109F +:101A900098E8001030E4001088E50010ECE8001031 +:101AA00024E70010D8E30010D0E30010F0B5C646DC +:101AB00000B584B080460E00354B00211960436AA2 +:101AC0005F680023DB19324D29684C1C2C6093425F +:101AD000F8D303A9012000F0F5FD002812D102A9D6 +:101AE000022000F0EFFD002813D10223029A3100FA +:101AF0004046FFF759FF7379012B11D00223737110 +:101B0000012429E0D821234B234AFF31234808F040 +:101B1000A5FCED211F4B204A4900204808F09EFCFF +:101B20001B4B1C6800E0013C002C11D0184B1B68BB +:101B300032689B1A0133A342F5D3029B0193039BA6 +:101B400000933300424639002000FFF76FFCEAE7BC +:101B500001233360D2E701340D4B1B68A3420DD340 +:101B60003368A342F7D8029B0193039B0093330091 +:101B7000424639002000FFF7D1FCECE7039800F063 +:101B8000B5FD029800F0B2FD04B080BCB846F0BDCF +:101B90009C00000888E50010E0E8001024E7001031 +:101BA000012800D170470220FCE7000010B5102288 +:101BB000044908F0FFFC002801D0022010BD0120DC +:101BC000FCE7C046E4E4001030B585B00D0001200C +:101BD00000F078FD041E02D0200005B030BD1023B7 +:101BE0006A460949012000F03DFC041E07D110227D +:101BF0000649684608F0DEFC002800D10400286889 +:101C000000F074FDE8E7C04684110000E4E4001031 +:101C1000004870478311000010B5FFF7F9FF013845 +:101C200010BD10B5FFF7F8FF013810BD10B5FFF774 +:101C3000F8FF043810BD0020704710B5007800F0A0 +:101C40009FFB002800D110BD0120FCE710B50078F3 +:101C50001023044A044900F093FB002800D110BD72 +:101C60000120FCE7E4E400108411000010B5C36D0E +:101C700059689020800107F0E1F810BD30B583B0BD +:101C80000C0001A9012000F01DFD002806D0012450 +:101C9000019800F02BFD200003B030BD0198FFF744 +:101CA000CAFF050001212000FFF7C8FD291863794C +:101CB000012B0ED023790133DBB26A460332137055 +:101CC000019B1878012300F05BFB041EE0D0012487 +:101CD000DEE72379F1E7F0B5C64600B580460F0090 +:101CE0001600002400E00134B44207D23D5D4046B6 +:101CF00000F00EFE8542F6D0002000E0012080BCFE +:101D0000B846F0BDF0B5DE4657464E464546E0B50E +:101D100089B004000E0002A9072000F0D3FC051EC4 +:101D200008D00127380009B0F0BCBB46B246A9462E +:101D3000A046F0BD2078102304AA834900F092FB4E +:101D4000002800DAEEE0102204A90298FFF7C3FF92 +:101D5000071E00DAE8E001286FD004A8FFF726FF8D +:101D600030700023994698462000FFF75AFF010083 +:101D70002078012302AA073200F074FB002800DA61 +:101D8000D4E0012202ABD91D0298FFF7A4FF00287E +:101D900000DACDE002AB07331B780F221A407270D5 +:101DA0001B093371012801D0042A03D90123737060 +:101DB000002333712000FFF72FFF01002078B71CAC +:101DC00001233A0000F04EFB002800DAB2E00122C5 +:101DD00039000298FFF77FFF002800DAACE0012805 +:101DE00063D0B078FFF7DCFEB0702000FFF710FF83 +:101DF00082462078F31C9B4601235A46514600F048 +:101E000031FB002800DA99E0012259460298FFF7D9 +:101E100062FF071E00DA93E0012849D0F078FFF74F +:101E2000BFFEF0704B46002B00D18BE010224146E4 +:101E3000200000F0F3FC070074E7032333702378DD +:101E4000022B05D0062B03D00023994698468BE73A +:101E5000A36810225242944663449846102304AA71 +:101E60004146200000F06EFD8146031E00DA59E76E +:101E700001280DD004A8FFF799FEC0B230700128E8 +:101E80000BD04B46002B00DA4CE7012399466BE759 +:101E9000023333700023994666E72078102304AAA2 +:101EA000294900F06DFA8146EBE70323B3709CE704 +:101EB0000323F3702378052B25D021D8012B22D0C2 +:101EC000022B00D02EE7A3681822524294466344A6 +:101ED000984601235A464146200000F033FD031E78 +:101EE000019000DA1EE7012811D0F078FFF758FEC4 +:101EF000C0B2F07002280DD1019B002B96DA11E7D9 +:101F0000062BE0D00EE7B378012B8BD1DBE7023351 +:101F1000F37087E7207801235A46514600F030FAE3 +:101F20000190E9E70127FDE60127FBE60127F9E635 +:101F30000127F7E60127F5E60127F3E60127F1E699 +:101F40000127EFE62F00EDE68411000030B583B0E5 +:101F50000C0001A9FFF738FE002801D003B030BD06 +:101F6000019D2800FFF762FE01002878042322006B +:101F700000F078FAF2E70000F0B5CE46474680B5AB +:101F800083B007008946294B1B68D8680A7828491E +:101F900008F082FA01A9072000F094FB002806D07F +:101FA0000124200003B0C0BCB946B046F0BD0021FA +:101FB00000F09EFC04000121002000F099FC4B463B +:101FC0001B78A34201D083422ED1180000F048F9BB +:101FD00080463800FFF74AFE441E0025FA6DE300F4 +:101FE000D3185E6819681368C91A41443200019811 +:101FF000FFF7DEF8002811D1013CAD1990239B01B9 +:102000009D42EBD34B46996840394022484600F048 +:1020100005FC0400019800F069FBC2E7054B064A85 +:102020000649074808F01AFA0124BAE7EC0100084B +:1020300028E9001088E50010C0E90010190200002E +:102040004CE9001030B583B00C0015006946022041 +:10205000FEF7B3FB002814D1E979012917D16B46AB +:10206000DB78012B1FD0A9682000FEF7FDFB0028BC +:1020700024D12000FFF7EAFD002825D1002003B07D +:1020800030BD144B144A1549154808F0E7F90022F1 +:102090002000FEF7BDFB0028E1D00E4B0E4A11498F +:1020A0000F4808F0DBF92000FEF7A7FB0028DAD084 +:1020B000084B094A0C490A4808F0D0F9054B064A72 +:1020C0000A49074808F0CAF9024B034A084904487C +:1020D00008F0C4F988E50010ACE900103E020000E9 +:1020E0004CE9001042020000470200004B020000D1 +:1020F0005602000070B584B005000E00FFF7FAFB31 +:10210000041EF06008D0022809D103A9012000F0C4 +:10211000D9FA002809D00124200004B070BD1E4B5C +:102120001E4A1F491F4808F099F902A9072000F02C +:10213000C9FA002801D00124EEE7320029000398F3 +:10214000FFF7D2FA041E19D10398FFF76AFD0100C8 +:1021500001236A460732012000F084F901226B4610 +:10216000D91D0298FFF7B7FD002813DB01280CD01A +:102170006B46DA790F231340F3710400039800F0E3 +:10218000B5FA029800F0B2FAC6E76B460122DA719E +:102190002000EDE70124BFE7E0E5001098E900101A +:1021A0006F0200004CE9001010B5FA21490006F05A +:1021B00045FE10BD10B5FFF7F7FF400210BD10B58A +:1021C000FEF714FC10BD000070B5204CA5440400BF +:1021D0000E001D000132839201A9072000F072FA5F +:1021E000002805D00124200084239B009D4470BD5D +:1021F000FA225200290002A808F0EAF9839B809392 +:10220000134B1B687F93FE21490002A8FFF7D7FFFD +:1022100082908190012E10D00136F1008919490277 +:10222000091980239B0002AA019800F0A1FA041E5C +:1022300005D1019800F05AFAD5E70026EDE7054BE5 +:10224000054AE921054808F009F9C046F0FDFFFFFD +:10225000C4EA001088E500107CEA0010DCE90010F8 +:10226000012804D0022804D190208001704700206A +:10227000FCE701204042F9E7F0B5DE4657464E46FE +:102280004546E0B5394CA54481460191029205A925 +:10229000072000F017FA061E63D100250023984698 +:1022A00000279A4603930CE0859B9B46FE2149003C +:1022B00006A8FFF784FF584518D001239C46E24446 +:1022C0000135012D19D8EC00641964024C448023B7 +:1022D0009B0006AA2100059800F00AFA002842D1C6 +:1022E000234B839A9A42DFD00137E9E7849B9845D4 +:1022F000E6D82E0098460394E2E7022F11D0534609 +:10230000022B1CD101267642059800F0EFF930002F +:1023100087239B009D44F0BCBB46B246A946A0461D +:10232000F0BD0023029A1360059800F0F1FA010055 +:10233000FA225200019808F054F90126E4E7029BC2 +:1023400042461A60FA235B00019A0399059800F04F +:10235000CFF90028D8D0074B074AAB21074808F02F +:102360007DF80126D3E70126D1E7C046E4FDFFFF53 +:10237000AFBEADDE88E50010ACEA0010DCE900106D +:10238000F0B5CE46474680B5FFB007000C00914639 +:102390001E00FA214900200006F0D6FD0D0032197A +:1023A0002A4B9A420DD83800FFF75AFF071E0FDB61 +:1023B0002000FFF7FFFEC719002398460120404286 +:1023C00026E00E21224B234AFF31234808F046F82D +:1023D0001221224B1F4AFF311F4808F03FF85A1BB9 +:1023E000280068444946414408F0F2F86B467D9A5B +:1023F00021003800FFF7E8FE002818D1F53EFF3E27 +:1024000080239B009C4667440C3B9C46E04400258F +:10241000002E15DD7DAA69463800FFF72DFF041E4A +:102420000CDBFA235B009E42D9DC3200D8E72E2178 +:102430000B4B084AFF31084808F010F801204042D1 +:102440007FB0C0BCB946B046F0BDC0469411000094 +:1024500028EA001098EA0010DCE9001054EA0010A5 +:1024600088E50010F0B5C64600B5FEB005000E00C8 +:1024700090461C00FA214900300006F065FD0F006F +:10248000A219214B9A420AD82800FFF7E9FE051E3F +:102490000CDB3000FFF78EFE451900261DE0AA2157 +:1024A0001A4B1B4A49001B4807F0D8FFAC211A4BB6 +:1024B000174A4900174807F0D1FF22003900694444 +:1024C0004346981908F084F8F53CFF3C80239B00B4 +:1024D0009C466544F536FF360027002C0CDD7DAAAE +:1024E00069462800FFF7C8FE00280ADBFA235B00D4 +:1024F0009C42E2DDDA1BE1E700207EB080BCB846FA +:10250000F0BD01204042F8E79411000028EA0010D5 +:1025100064EA0010DCE9001054EA0010F0B5D64679 +:102520004F464646C0B582B004000D0017009946DC +:102530000AAA13789A46002845D0002947D0002FD0 +:1025400049D00E89CB689C466644042301AA310019 +:10255000380000F0CDF88046002840D101AB1A8841 +:10256000274B9A421FD06B89002B40D101AB1A88B0 +:10257000244B9A423FD1256067604B4623815346E6 +:10258000A3726B899B19E3606B899B1901AA52881E +:102590009B18636104362661404602B0E0BCBA462F +:1025A000B146A846F0BD6B8901AA51888B421AD169 +:1025B00089190423380000F09BF80028D6D00123A5 +:1025C0005B429846E8E701235B429846E4E7012333 +:1025D0005B429846E0E701235B429846DCE7012333 +:1025E0005B429846D8E701235B429846D4E7012333 +:1025F0005B429846D0E701235B429846CCE7C04651 +:102600000869000007690000F0B583B004000F00FE +:1026100016001D00002848D00368002B48D04368EE +:10262000002B20D1012040423BE0042301AA216974 +:10263000606800F05DF800283DD1A37A002B03D03C +:102640002369E268934239D223891D4A934218D004 +:1026500001AA1288934214D001AB5B882269944688 +:102660006344043323612369626993421BD2226865 +:102670005289002AD9D0E2689A42D6D10433236124 +:10268000D3E7002D02D001AB1B882B8023690433D4 +:102690003B6001AB5B88338022699446634404331A +:1026A000236103B0F0BD0120FBE701204042F8E7C1 +:1026B00001204042F5E701204042F2E70120F0E727 +:1026C000FFFF000010B5002200E001329300064C2D +:1026D0001B59002B05D01C788442F6D10B600020DA +:1026E00001E00120404210BDA0000008704700003A +:1026F00070B5150044688C4214D9CA18944218D990 +:10270000611842787F2A1BD052B2002A1EDB0124B6 +:102710006442114B1B68D8682200104907F0BCFEC8 +:10272000200070BD20210E4B0E4AFF310E4807F0ED +:1027300095FE90210D4B0B4A49000B4807F08EFE89 +:102740001A00280007F044FF0024E9E72A0000F0FF +:102750006FF9041EE4D0DCE7EC01000844EB001044 +:10276000C8EA001098EC0010DCEA00102CEB001016 +:10277000F8B5150044688C420CD9CA18944210D997 +:10278000641842787F2A13D052B2002A34DB012029 +:102790004042F8BDA3211B4B1B4A49001B4807F0D0 +:1027A0005DFE48211A4B184AFF31184807F056FEC3 +:1027B000DA0506D1E205D00D002A09D15F0A06002C +:1027C00017E0A921134B104A4900104807F046FEB4 +:1027D0005421114B0C4AFF310C4807F03FFE2900F1 +:1027E000200002F017F980239B009C466444654456 +:1027F0000136BE42F3D3CCE72A00210000F040F9B5 +:10280000C7E7C046C8EA001084EC0010DCEA0010FC +:102810002CEB00106CEB00108CEB001070B5836893 +:10282000934211D38B4216D9541845685B199C42C8 +:1028300018D26D18531941787F291AD049B200294E +:1028400034DB0120404270BDBC211B4B1B4A4900B8 +:102850001B4807F003FE7A211A4B184AFF3118482B +:1028600007F0FCFDBD21184B144A4900144807F03D +:10287000F5FD6D0A6D025B0A5B029D4212D05B1B87 +:102880005C0A0020002CDED0013C6002401902F0FE +:1028900087F80028F6D094210C4B084AFF310848ED +:1028A00007F0DCFD280002F07BF8CCE711002800DF +:1028B00000F00EF9C7E7C046B8EB001070EC00104E +:1028C000DCEA0010CCEB0010E0EB001008EC00108C +:1028D00010B543787F2B08D05BB2002B02DB0120C0 +:1028E000404210BD00F0C6FBFBE780208000F8E707 +:1028F000012908D0022908D0002902D00120404235 +:1029000070470120FCE70220FAE70320F8E7000007 +:1029100010B543787F2B0BD05BB2002B02DAFF207F +:10292000C0B210BD034B044A0449054807F096FDA8 +:102930000020F5E724EC001058EC00101F02000006 +:10294000DCEA0010F8B5CE46474680B50700904651 +:102950001E00FFF7CDFE814600280FD10024B442AF +:1029600009D243461D5D3800FFF7D2FF854208D1EA +:102970000134E4B2F3E70123994602E001235B420C +:1029800099464846C0BCB946B046F8BDF8B50E00F9 +:102990001500002200E00132930020495B58002B13 +:1029A00004D019788142F6D11C0000E01C00002BF5 +:1029B0002ED063787F2B11D05BB2002B2BDA00F086 +:1029C00061FB0700A368D8190138390006F036FA10 +:1029D000336883420BD36268002414E0072802D1D5 +:1029E0008027BF00EEE700F04DFB0700EAE70C4B45 +:1029F0000C4A0D490D4807F031FDE300EB185F600C +:102A00001A60D21901348442F7D330600020F8BD37 +:102A100001204042FBE701204042F8E7A000000807 +:102A20002CEC001040EC001072020000DCEA0010F8 +:102A3000F0B5C64600B582B00E0017001C00437802 +:102A40007F20184000F0AEFA0500E8231B069C46E4 +:102A5000664400F0AFFA804600F0B0FA01900094AE +:102A60003B0032002900404604F0F6F9002804D16A +:102A7000002002B080BCB846F0BD01204042F8E71B +:102A8000F0B5C64600B582B00E0017001C004378B2 +:102A90007F20184000F086FA0500E8231B069C46BC +:102AA000664400F087FA804600F088FA01900094AE +:102AB0003B0032002900404604F048FA002804D1C7 +:102AC000002002B080BCB846F0BD01204042F8E7CB +:102AD000F0B583B00500002000F064FA0400E8239C +:102AE0001B06E818A3699D696D42054000F062FA73 +:102AF0000600A3699F6900F061FA00903B002A007C +:102B00002100300004F0C0FA002802D1002003B0F8 +:102B1000F0BD01204042FAE7F0B5C64600B58C682A +:102B20000A688423C3580F252B40073DED1A230064 +:102B3000AC4226D92B0024E055782D021678354377 +:102B4000D678360697783F043E4335439827C551DB +:102B500055792D0216793543A846D67936069579EA +:102B60002D042E4345463543C551D218E41A84231B +:102B7000C3580F252B40073DED1A2300AC4200D966 +:102B80002B00002B00D183E0082BD5D0012B24D0C3 +:102B9000022B26D0032B2BD0042B33D0052B3ED079 +:102BA000062B4CD0072B5DD053781B0215782B4396 +:102BB000D5782D069678360435432B4398268351D5 +:102BC00053791B0215792B43D5792D0697793F044C +:102BD0003D432B4383510823C7E716789025465180 +:102BE000C3E755782D021678354394268551BCE706 +:102BF00055782D0216783543942685519678902580 +:102C00004651B2E755782D0216783543D678360608 +:102C100097783F043E43354398268551A5E755787C +:102C20002D0216783543D678360697783F043E4312 +:102C300035439826855116799025465195E7557864 +:102C40002D0216783543D678360697783F043E43F2 +:102C500035439826855155792D02167935439426AA +:102C6000855182E755782D0216783543D678360699 +:102C700097783F043E4335439826855155792D0278 +:102C800016793543942685519679902546516CE7FF +:102C90000A608C60002C0CD1F924E4000359012255 +:102CA000934303518A61CB69002B02D0CB69012089 +:102CB000984780BCB846F0BDF8B50E004C69CA68AC +:102CC000C423C3580F21194023008C421CD90B0088 +:102CD0001AE0D825415911700F0A57700F0C9770E0 +:102CE000090ED17045591571290A5171290C91713C +:102CF0002D0ED571D218E41AC423C3580F251D40D8 +:102D00002300AC4200D92B00002B6DD0082BE0D063 +:102D1000012B1ED0022B20D0032B24D0042B2BD030 +:102D2000052B33D0062B3ED0072B4BD0D821435850 +:102D300013701D0A55701D0C95701B0ED3704358EF +:102D40001371190A5171190C91711B0ED37108235B +:102D5000D0E7D02141581170CCE7D42141581170EF +:102D6000090A5170C6E7D42141581170090A5170FF +:102D7000D02141589170BDE7D821415811700D0AFA +:102D800055700D0C9570090ED170B3E7D8214158DC +:102D900011700D0A55700D0C9570090ED170D0216F +:102DA00041581171A6E7D821415811700D0A55708C +:102DB0000D0C9570090ED170D42141581171090A7A +:102DC000517197E7D821415811700D0A55700D0CBB +:102DD0009570090ED170D42141581171090A5171B1 +:102DE000D0214158917185E7F2607461002C0DD1BA +:102DF000F922D200835802218B4383500323B3610D +:102E0000336A002B02D0336A032098477461F8BDFF +:102E100010B5264A264BD358DA070DD49A0716D494 +:102E20005A071FD5234B05229A61204AF823DB005D +:102E30000421D150D35809E01C4C1E492000FFF753 +:102E40006BFEF823DB000122E250E35810BD174C63 +:102E500018492000FFF730FFF823DB000222E25080 +:102E6000E358F3E71A0709D5124B06229A610F4A75 +:102E7000F823DB000821D150D358E7E7DA0609D55B +:102E80000C4B07229A61094AF823DB001021D1502C +:102E9000D358DBE79B06D9D5064B08229A61034A33 +:102EA000F823DB002021D150D358CFE70000424067 +:102EB000CC070000805E010810B52E4C2E4A03217D +:102EC000200001F0EBFE11220321200001F00CFE96 +:102ED0002A4A0421200001F0E1FE112204212000F1 +:102EE00001F002FE264A0521200001F0D7FE112242 +:102EF0000521200001F0F8FD224A0621200001F002 +:102F0000CDFE11220621200001F0EEFD1E4A072110 +:102F1000200001F0C3FE11220721200001F0E4FD92 +:102F20000021022004F052FB0221022004F07EFB6B +:102F3000022004F017FB1549154805F0BBF8FA22EA +:102F4000144B92001449154802F040FD041E0FD1A5 +:102F50000F4B00229B5E002B06DB1F2213401E3A04 +:102F60009A4013000E4A13600A490C4802F00CFF05 +:102F7000200010BD8005314044ED001010ED001020 +:102F8000DCEC0010A8EC001078ED0010112E001001 +:102F9000E4010008805E0108ACED00100000424032 +:102FA00000E100E0024B1B685B688000C05870477E +:102FB000385F0108004870470000424000487047F1 +:102FC000805E010810B50400FFF776FF002800D0EE +:102FD00010BD044B1C60044A2100044803F02EFE7F +:102FE000F6E7C046385F0108805E010800004240F5 +:102FF00070B51D4B5B68032831D00AD8012811D069 +:10300000022803D11B6802221A700EE00120404200 +:1030100024E0042803D11B6808221A7005E001206F +:1030200040421BE01B6801221A7001380F4A43001E +:10303000191889008C581918890051184D680E7A92 +:103040000B4A16722900200001F028FE32002900E8 +:10305000200001F049FD0448FFF7B4FF70BD1B6874 +:1030600004221A70E1E7C046D40100088C01000870 +:10307000E4000008024B5B681B689B69586A704754 +:10308000D4010008024B5B681B689B699869704714 +:10309000D401000870B504001D4D280003F040FB6A +:1030A0002B685B005B082B60022004F073FA194B5D +:1030B00000229B5E002B0BDB1F2213401E3A9A401E +:1030C0001300154980228B50BFF34F8FBFF36F8FD2 +:1030D000104B59880020185E04F0BAFF013C6000D4 +:1030E000001980000D4BC05801F0D4FC0C4C20009E +:1030F00001F0D0FC200001F0CDFC200001F0CAFC62 +:10310000200001F0C7FC200001F0C4FC70BDC046E7 +:1031100000004240E401000800E100E08C010008EA +:1031200080053140074BC200D05A9B1859889A88B5 +:10313000DB88084310431843C0B2431E9841C0B215 +:103140007047C046845F010870B515000024002C4C +:1031500002D0124C200070BDA3005B195B00104A26 +:103160009A5A6B000F4E9B5B9A4201D30134EEE7F3 +:1031700000230B704C700C4B03602000FFF7D2FF54 +:10318000002807D00649A20055196D006B5A01337B +:103190006B52DFE7044800F0FDFBF3E7011000008D +:1031A000845F0108BCED00100000104070B50600FF +:1031B0000D004C78A3009B185B0010495B5A002B54 +:1031C00004D0A400A4186400013B63526878FFF7A0 +:1031D000A9FF002800D070BD094B1B68002B05D04B +:1031E0003368002B05DB01232B70F4E700F026FB8E +:1031F000F6E7300000F014FCF5E7C046845F0108F4 +:10320000D85F010870B504000D0000280BD0211D07 +:103210002A002000FFF798FF002800D1A571434243 +:103220005841C0B270BD01BEF1E710B5002803D00F +:103230000379002B02D010BD01BEF9E782790100AD +:1032400001C9FFF7B3FFF6E730B583B005000C0006 +:10325000002801D0002901D103B030BD0321684608 +:10326000FFF7D0FF002803D16846FFF7DEFFF3E742 +:103270000098A3B2074A11682D228A5C1F2A04D83D +:103280000022290000F07AFCEEE70022290000F07D +:1032900003FDE9E7D45F010810B5041E01D0002941 +:1032A00000D110BDFFF7D0FF03212000FFF7AAFFD8 +:1032B000F7E7000070B505000C1E22D0002B23D0CC +:1032C000006816490E682D21715C1F2911D8210054 +:1032D00000F05EFD00281AD12868104B1A682D23D3 +:1032E000D35C1F2B09D8210000F008FE002811D163 +:1032F00070BD210000F0D6FEECE7210000F060FF79 +:10330000F4E701204042F3E701204042F0E70120CA +:103310004042EDE701204042EAE7C046D45F0108A1 +:1033200070B5002913D0002A14D0CC68002C14D01A +:1033300000680D4C25682D242C5D1F2C04D800F04E +:10334000F3FD00280CD170BD00F050FFF9E701201B +:103350004042F8E701204042F5E701204042F2E711 +:1033600001204042EFE7C046D45F010810B50029B4 +:1033700013D0002A14D0CB68002B14D000680D4B5A +:103380001C682D23E35C1F2B04D800F019FE0028D5 +:103390000CD110BD01F0C6F8F9E701204042F8E772 +:1033A00001204042F5E701204042F2E7012040427F +:1033B000EFE7C046D45F010810B59821FFF76CFF16 +:1033C00010BD10B50B0001000831002B05D1022201 +:1033D00003003833FFF76EFF10BD0122F8E710B588 +:1033E0000C00131E01D1002010BD01000831220085 +:1033F000FFF796FFF8E710B50A0001000831FFF764 +:10340000B5FF10BD10B50549C02252008B580120F0 +:1034100003438B5005F008FD10BDC0460000264058 +:103420000349C02252008B58012083438B507047C0 +:103430000000264070B50400421E304B9A4256D818 +:103440002F4B1B78002B55D12D4B01221A702D4B81 +:103450001B78002B0ED0FFF7E3FF2B4B1C800023C3 +:103460000C2B1FD89900294A52185288A24212D90F +:103470000133F5E7264D8032FF32AB580126334346 +:10348000AB5005F0D1FCE122D200AB58B343AB50B6 +:103490001C4B1E70DFE70A001C49525AA24202D997 +:1034A000140000E00C231B4A1370FF251D40280068 +:1034B00005F0A0FC2004000C06F02CFE164A174B69 +:1034C00005F06AFF05F07EFE82B211235B1B01202E +:1034D0009840101A80B20E4AC2235B00D358C0181D +:1034E00080B205F06FFCFFF78DFF002070BD01205A +:1034F0004042FBE701204042F8E7C0466F1700005A +:10350000905F0108915F01088E5F0108C4ED001013 +:10351000000026408C5F010833DFC14F1C409F3FF5 +:10352000064AD0239B00D05803E0044AD0239B00D6 +:10353000D058431CF9D0C0B27047C0460000654067 +:1035400010B50400002003E02100034801F0E8FE6C +:103550000028F9D010BDC0460000654070B50600D7 +:103560000D00002102F0AAF80021012003F016FF4F +:10357000040004F01DFDE9004B08C01805F05EFCD6 +:10358000421E002C08D0002C0CD0326880231B0671 +:1035900013433360200070BD0021012003F03CFE86 +:1035A0000400F0E70021012003F0B6FE0400ECE780 +:1035B00070B50C001600002901D0002509E0002597 +:1035C000280070BD2078094B1870FFF7B9FF01344F +:1035D0000135B542F4DA23780A2BF3D1034B1B787B +:1035E0000D2BEFD00D20FFF7ABFFEBE7D05F01080D +:1035F00070B50C001600002901D0002503E000255D +:10360000280070BD0134B542FADAFFF789FF207057 +:1036100001350A28F4D00D28F4D1F1E710B50400E3 +:103620000A4A0B490B4801F08FFE002808D00028F9 +:1036300005D1084A116880231B060B43136010BD97 +:1036400021000448FFF78AFFF1E7C046945F0108B4 +:10365000B8DE00100000654070B505000C0007E002 +:103660000B4B1B689800C0184000FCF78DFF013C15 +:10367000002C0BD082229200AB58DB05DB0DA95841 +:10368000C90B01220A409B18002BE9D170BDC0462E +:103690009000000810B5024801F0DEFF10BDC046E2 +:1036A00000006540014B18607047C046D45F0108B8 +:1036B000F0B51F001D4B1E68002E2DD0B36B1B18DC +:1036C0001B68346D2418E41A631E9C41E3B29C46C7 +:1036D000B368C41825680F242C40062CF8D81306AC +:1036E000F26882183B43136063460B4313D00F4BC1 +:1036F0001B689B68C3181B68DB03F8D50C4B1A6862 +:103700002D23D35C1F2B09D8084B1B681B681B1883 +:103710001B681B06F8D4F0BD3300D2E7034B1B68CF +:103720001B681B181B68002BF8D1F4E7D85F010851 +:10373000D45F010810B50400E0239B05802200211E +:10374000FFF7B6FFD0239B05802200212000FFF762 +:10375000AFFFC0239B05802200212000FFF7A8FFB8 +:10376000B0239B05802200212000FFF7A1FFA023AA +:103770009B05802200212000FFF79AFF90239B05E4 +:10378000802200212000FFF793FF80239B058022E9 +:1037900000212000FFF78CFFE0235B058022002141 +:1037A0002000FFF785FFC0235B0580220021200059 +:1037B000FFF77EFFA0235B05802200212000FFF79A +:1037C00077FF80235B05802200212000FFF770FF38 +:1037D000C0231B05802200212000FFF769FF802302 +:1037E0001B05802200212000FFF762FF8023DB04FD +:1037F000802200212000FFF75BFF002380220021B0 +:103800002000FFF755FF0B4B1B689B080A4A116805 +:103810002D228A5C1F2A0AD80C229340F02292059E +:103820001343802200212000FFF742FF10BD0D222C +:10383000F3E7C046DC5F0108D45F0108054B1A6856 +:103840002D23D35C1F2B03D8034A044B1A60704707 +:10385000034AFAE7D45F0108B8EE0010D85F010808 +:103860000CEF0010F0B583B01400444B1B68002B24 +:1038700075D0002918D0002973D0002C73D0802275 +:103880001202944200D972E080225201944239D04F +:1038900021D88022D200944236D00ED98022120143 +:1038A000944216D1782225E0002AE4D11A6D11182D +:1038B000334A1268D46CA400DDE78022520094429F +:1038C00024D00132FF32944201D17E2212E02D4DEC +:1038D0004AE02C4D48E08022D201944218D0802248 +:1038E0001202944201D1002204E08022920194420B +:1038F0003FD16022224D2E682D25765D1F2E09D9DD +:10390000671E08E07022F5E77C22F3E77F22F1E7EB +:103910004022EFE71C4F01910D003D4039422AD172 +:103920001F2E02D91202194942509B6B1B18019A93 +:103930001A60A308124A11682D228A5C1F2A0CD82B +:103940000C2293401A00F0239B0513438022002190 +:10395000FFF7AEFE0E4B1C6006E00D22F1E7094DAD +:1039600002E0084D00E0074D280003B0F0BD054D12 +:10397000FAE7044DF8E7034DF6E7C046D85F0108C3 +:10398000D45F01080B003200FF3F000088140000E4 +:10399000DC5F010810B50400FFF750FF1A4B1A68EE +:1039A0002D23D35C1F2B10D8184B2360184B1B689A +:1039B0005B6B1B1901221A60164B1B68002B16D07B +:1039C0002000FFF7B7FE002010BD2368124A134005 +:1039D00023600F4B1B685B681B19104A1A60226832 +:1039E00080231B06134323600323A360DEE7084BF9 +:1039F0001B68196D6118044B1B68DA6C920020007B +:103A0000FFF730FFDCE7C046D45F01080300008009 +:103A1000D85F0108DC5F0108FFFFFE7F01000200A4 +:103A2000084B1A682D23D35C1F2B06D80023036094 +:103A3000054B00221A60002070470023036083605A +:103A4000F6E7C046D45F0108DC5F010870B50D4C95 +:103A50002568AC68241826680F243440042CF6D856 +:103A6000EC680419084D2560064C2568ED68451979 +:103A700029602168C96841180A602268D2688018E4 +:103A8000036070BDD85F01081002004270B50F4C92 +:103A90002568AC68241826680C242642F7D1EC6807 +:103AA00004190B4D2560094C2568ED6845192960FE +:103AB0002168C96841180A602268D26882181360B8 +:103AC0002368DB68C018049B036070BDD85F0108E1 +:103AD0001032004370B51D0004AB1E78084A14680C +:103AE000A3681A1812681307F8D409060223B34012 +:103AF00019430123AB40E26880181943016070BD8F +:103B0000D85F010830B51D000B4A1468A3681A1865 +:103B100012681307F8D409060323049A9340194343 +:103B20000223039A934019430123AB40E2688018B3 +:103B30001943016030BDC046D85F010810B582B09E +:103B4000040008001100002B01D102B010BD0200DA +:103B50002000FFF77BFF08230093043B0022502145 +:103B60002000FFF7B7FF044B1B681B681B191B687D +:103B7000DB06F8D4E9E7C046D85F010810B582B08B +:103B8000040010001A1E01D102B010BD0300200075 +:103B9000FFF75CFF0C230093043B0022512120001F +:103BA000FFF798FF034B1B681B681B191B68DB069C +:103BB000F8D4E9E7D85F0108F0B5002B00D1F0BDDB +:103BC0001E00314C2568AC68241827680F243C403F +:103BD000042CF6D8862464010459002CFADBEC6826 +:103BE00004192A4D2560284D2C68E46804192260C8 +:103BF0002A68D26882181660234A1468A2681218CC +:103C000015680F222A40042AF6D8E2688218204C50 +:103C100014601D4C2268D268821811602268D26834 +:103C2000821816600EE0184A11688A681218146823 +:103C30000F222240062AF6D8CA6882181549116058 +:103C4000103B9BB20F2BEED8002B07D10E4B1B68FD +:103C50001B681B181B68002BF8D1B0E70A4A1168D3 +:103C60008A68121814680F222240062AF6D81B040C +:103C7000C02212021343CA68821808210B43802114 +:103C8000C9050B431360E1E7D85F01080800007124 +:103C90000C00007008C01040F0B5002B00D1F0BD42 +:103CA0001F00264C2568AC68241826680F24344071 +:103CB000042CF6D8EC680419214D25601F4D2C68A2 +:103CC000E468041921602968C96841180F600F2B46 +:103CD00014D91A490C68A16809180D680F212940E8 +:103CE0000629F6D8E168411886256D03154384241A +:103CF000E4052C430C60103B9BB2E8E7002B07D196 +:103D00000E4B1B681B681B181B68002BF8D1C6E7FD +:103D10000A490C68A16809180D680F212940062975 +:103D2000F6D81B04C02109020B43E16841181A436D +:103D30008423DB051A430A60E2E7C046D85F010826 +:103D40000C00007010B582B004000B0011000722B7 +:103D500058680240C020800022501A699B69009276 +:103D60002000FFF793FE0C230193043B0093043BD8 +:103D700000224C212000FFF7C5FE044B1B681B6886 +:103D80001B191B685B07F8D402B010BDD85F01088F +:103D900010B5002B01D0002900D101BE062A00D9A0 +:103DA00098E090004C4C205887468B6018004030BB +:103DB000086154338B610A6000234B60474BCB6230 +:103DC0004023CB602C3B4B614B622D33FF33CB61E7 +:103DD000002010BD8B6018004030086160338B619B +:103DE0000A6001234B603E4BCB624023CB60203BFB +:103DF0004B61043B4B62E433CB610020E9E78B600D +:103E000018004030086160338B610A6001234B6009 +:103E1000344BCB624023CB60203B4B614B62E033A1 +:103E2000CB610020D5E78B60180080300861C0337B +:103E30008B610A6002234B602B4BCB628023CB60EB +:103E4000403B4B61103B4B62A0239B00CB610020A9 +:103E5000BFE78B60180080300861C0338B610A6057 +:103E600002234B60214BCB628023CB60403B4B61F4 +:103E70004B62A0239B00CB610020AAE78B60180057 +:103E800080300861C0338B610A6002234B60184B9D +:103E9000CB628023CB60403B4B61243B4B62A02331 +:103EA0009B00CB61002094E78B6018008030086194 +:103EB000C0338B610A6002234B600E4BCB628023C0 +:103EC000CB60403B4B61203B4B62A0239B00CB610E +:103ED00000207EE708487CE760EF00107CEF0010D0 +:103EE00090EF0010B0EF0010D0EF001010F00010B5 +:103EF00050F0001090F000100B00320010B50A1EB8 +:103F00000ED000238B620B624B69002B01D1054858 +:103F100010BD0969D26A9BB2FFF710FE0020F7E7D7 +:103F20000048F5E70B003200F0B5D6464F4646464E +:103F3000C0B581460E001700002931D0002A31D0CB +:103F4000CA689046002A2FD0002B34D00A6AD218B3 +:103F50000A628C6A1D0014E043461B1B9A46B36834 +:103F6000191953469BB23A004846FFF7E7FDB2687D +:103F700031004846FFF7E6FE4346E41A2D19574440 +:103F800000242B199845E7D9B362002D0DD0B168F4 +:103F90000919ABB23A004846FFF7D0FD002504E00E +:103FA000064D02E0054D00E0044D2800E0BCBA4695 +:103FB000B146A846F0BD1D00F7E7C0460B00320031 +:103FC000F0B5DE4657464E464546E0B583B0009014 +:103FD0000E00140000295FD0002A5FD00D698B68A5 +:103FE0009846CF688B6A9A460B6ADB009946802F09 +:103FF0002DD038230193802342465146535401313A +:104000004144BBB29B4652469B1A9BB2013B9BB2BA +:1040100000220098FFF7B2FD019B53451AD93B1FC0 +:104020004A46120E4146CA544B461A0CFB1ECA544D +:104030004B461A0ABB1ECA54013F4A46CA5542465D +:1040400031000098FFF77EFE706A80081BE0702345 +:104050000193D0E742463100009B9A461800FFF7D3 +:1040600071FE5B46002241465046FFF787FDD6E7CA +:10407000EB782370AB7863706B78A3702B78E37068 +:104080000434043501380028F2D103B0F0BCBB463B +:10409000B246A946A046F0BD0148F6E70048F4E75D +:1040A0000B00320010B5002B01D0002900D101BE59 +:1040B000062A00D970E09000384C205887468B6063 +:1040C00040330B610A6069234B60354BCB62402360 +:1040D000CB602C3B4B614B62002010BD8B604033AA +:1040E0000B610A606A234B602E4BCB624023CB608E +:1040F000203B4B614B620020EFE78B6040330B614C +:104100000A606A234B60284BCB624023CB60203B84 +:104110004B61043B4B620020DFE78B6080330B6117 +:104120000A606B234B60214BCB628023CB60403B0A +:104130004B614B620020D0E78B6080330B610A60DB +:104140006B234B601A4BCB628023CB60403B4B61AF +:10415000103B4B620020C0E78B6080330B610A602C +:104160006B234B60134BCB628023CB60403B4B6196 +:10417000203B4B620020B0E78B6080330B610A600C +:104180006B234B600C4BCB628023CB60403B4B617D +:10419000243B4B620020A0E708489EE7D0F00010C7 +:1041A000ECF0001020F1001000F1001080F1001080 +:1041B00040F1001000F20010C0F100100B003200BE +:1041C00010B50A1E0ED000238B620B624B69002BC8 +:1041D00001D1054810BD0969D26A9BB2FFF7ECFC1A +:1041E0000020F7E70048F5E70B003200F0B5D646AF +:1041F0004F464646C0B504009146002900D180E1F3 +:10420000002A00D17FE1CE68002E00D17DE1002B95 +:1042100005D11800E0BCBA46B146A846F0BD0A6A0E +:10422000D01808628D6ABA480768BA68101902681F +:104230000F2010400628F6D8F8682018C827FF0578 +:104240000760B34800680068001900680028F8D1CA +:104250000A6990464A699446AD480768BA681019D9 +:1042600002680F2010400428F6D8F8682018A94FDB +:104270000760A74F3868C068201842460260386857 +:10428000C0682018624602604A699446A0480768E0 +:10429000BA68101902680F2010400628F6D8F8688E +:1042A0002018CC27FF05624617430760984800682E +:1042B0000068201802689246002AF7D194480268E4 +:1042C0009068001907680F2038400628F6D8D06893 +:1042D0002018CA22D2050260002D48D18C480268FD +:1042E0009068001907680F2038400428F6D8862007 +:1042F000400120580028FADBD0682018864A026066 +:10430000834A94461068C06820184A460260624694 +:104310001268D268A21813605A19964257D8721BB5 +:1043200090467B4A10688268121917680F223A403B +:10433000062AF6D82A02C068201847461743CC221E +:10434000D2053A4302604A689046714A1068826812 +:10435000121917680F223A40062AF6D8C268A21826 +:10436000404600061060AD1B5B195546D4E78A68CD +:104370009046674802689068001907680F20384027 +:104380000428F6D8D0682018624A0260604A106893 +:10439000C0682018474607601068C068201805608C +:1043A0005B4802689068001907680F2038400628AB +:1043B000F6D8D0682018CC22D2052A43026054488F +:1043C00000680068201800680028F8D186E78A6233 +:1043D000002B4ED18D6A002D64D10E694D694C4B76 +:1043E0001A6893681B1918680F230340042BF6D82A +:1043F000D368E318494A1A60454A1368DB68E31832 +:104400001E601368DB68E3181D60414B1A689368EF +:104410001B1918680F230340062BF6D8D368E3183E +:10442000CA22D2051A604869394B1A6893681B1969 +:1044300019680F230B40062BF6D8D368E318CE2259 +:10444000D20502431A60324B1B681B68E3181868D8 +:104450000028F8D12E4B1A6893681B1919680F238E +:104460000B40062BF6D8D368E418CA23DB0523607B +:10447000D0E6274A10688268121916680F22324067 +:10448000062AF6D82D02C268A2182B43CC25ED05CA +:104490002B4313601E4B1B681B68E3181B68002B23 +:1044A000F8D197E78E681A4B1A6893681B19186839 +:1044B0000F230340042BF6D8D368E318174A1A6079 +:1044C000134A1368DB68E3181E601368DB68E3189F +:1044D0001D608D6A0E4B1A6893681B1918680F23AC +:1044E0000340062BF6D8D368E318CE22D2052A4320 +:1044F0001A60074B1B681B68E3181B68002BF8D178 +:104500006BE7074886E6064884E6054882E6C0462B +:10451000D85F010808000070080000710C000070EE +:104520000B003200F0B5DE4657464E464546E0B534 +:1045300083B003000192002900D198E1002A00D144 +:1045400097E1CC688E6A0D6A6A0F9346ED00802C65 +:1045500000D171E138229446C7480768BA68D0187C +:1045600002680F2010400628F6D8F8681818C827E7 +:10457000FF050760C04800680068C0180068002890 +:10458000F8D10A6991464A699046BB480768BA68FB +:10459000D01802680F2010400428F6D8F8681818C0 +:1045A000B64A0260B44A92461068C06818184A4673 +:1045B000026052461068C0681818424602604A6994 +:1045C0009146AD480768BA68D01802680F201040BD +:1045D0000628F6D8F8681818CC22D2054F4617439B +:1045E0000760A54800680068181800680028F8D11E +:1045F000A1480768BA68D01802680F201040062842 +:10460000F6D8F8681818CA27FF0507608A68904628 +:1046100099480768BA68D01802680F20104004282B +:10462000F6D8F8681818954F0760934F3868C06837 +:104630001818424602603868C068181806608E482C +:104640000768BA68D01802680F2010400628F6D80C +:10465000F8681818CC27FF053743076086480068BC +:104660000068181800680028F8D183480768BA68FD +:10467000D01802680F2010400628F6D83202914662 +:10468000F8681818802290464A4647463A439146B1 +:10469000D022D20590464A4647463A430260B44586 +:1046A00000D8CCE0621F94465A46D2B29046724877 +:1046B0000668B268D01807680F2038400628F6D878 +:1046C00062461702F068181842461743D026F605CE +:1046D00037430760221F90462A0E944666480668B4 +:1046E000B268D01807680F2038400628F6D842462E +:1046F0001002F6689E1962461043D027FF05384322 +:104700003060E21E9046280CC2B294465A480668B1 +:10471000B268D01807680F2038400628F6D84246FD +:104720001002F6689E1962461043D027FF053843F1 +:104730003060A21E9046280AC2B294464E480668CF +:10474000B268D01807680F2038400628F6D84246CD +:104750001002F6689E1962461043D027FF053843C1 +:104760003060013CEAB2944643480668B268D0180B +:1047700007680F2038400628F6D82502F068181878 +:1047800062461543D024E405254305604E683A4847 +:104790000468A268D01805680F2028400628F6D8BB +:1047A000E068181836060660334800680068181874 +:1047B00000680028F8D14F6A2F4C2568AA68D418E1 +:1047C00026680F243440042CF6D8EC681C192C4DB4 +:1047D0002560294D2C68E4681C19019A22602A681A +:1047E000D2689A181760244A1468A268D21815680B +:1047F0000F222A40062AF6D8E2689A18CA24E4054D +:1048000014604D6A1C4A11688A68D21814680F2215 +:104810002240062AF6D8CA689A18CE21C90529432B +:104820001160184A9A58002AFBDB03B0F0BCBB4663 +:10483000B246A946A046F0BD702294468CE64A686E +:1048400090460D480668B268D01807680F203840B7 +:104850000628F6D8F068181842461606066006487C +:1048600000680068181800680028F8D11AE70648A0 +:10487000DBE70548D9E7C046D85F010808000070AB +:104880000C000070F01000000B003200C005434225 +:104890005841C0B270470000A0231B0698422AD09E +:1048A00014D8802829D008D980235B0098422AD0C8 +:1048B0001B4B984209D01B4807E010281FD0402806 +:1048C00001D1194801E000281BD17047174B9842CD +:1048D0001BD007D9164B98421ED0164B98421DD1BB +:1048E0001548F2E7154B984211D0154B984211D15B +:1048F000A420C003E9E70020E7E71248E5E71248F3 +:10490000E3E70848E1E70648DFE71048DDE7A020D5 +:10491000C003DAE70348D8E70D48D6E70148D4E7F3 +:1049200006005200FF00520002005000030000F099 +:10493000040000F0050000F003005200090000A090 +:10494000010000F00500520001005000010052007B +:104950000200520010B50F4B1A683323D35C002BB2 +:1049600000D101BE0B4B1C68BC23E358226A94465D +:1049700063441B68002B0BDB074B1868FFF78CFFA9 +:10498000636801229A6063689B68002BFBD110BDAD +:104990000248FCE7D45F0108E05F01080200500014 +:1049A00010B50400FFF772FF002801D1134810BDB5 +:1049B000FBF700FE124B134A1A605C6000229A60FB +:1049C000DA60114B1A685423D35C002B10D003F02B +:1049D000FCFAFA21890004F031FA01000B4804F0D6 +:1049E0002DFA0B4BC1188020400009F05DFADEE77C +:1049F00080200021400009F057FAD8E70600520055 +:104A0000E05F01080001001CD45F010860F5900020 +:104A10009808000070B504000D00FFF737FF00286C +:104A200027D0002D27D0FBF7C5FD144B144A1A6080 +:104A300000225A609C60DD60124B1A685223D35CDE +:104A4000002B10D003F0C1FAFA21890004F0F6F926 +:104A500001000D4804F0F2F90C4BC1188020400011 +:104A600009F022FA06E080200021400009F01CFA3B +:104A700000E0074870BD0648FCE7C046E05F01085B +:104A800000010005D45F0108C0EA210148260000AA +:104A90000600520030B5134A11688B69C31ADB094E +:104AA00049691B01C91800230360812415682C5D26 +:104AB00004192360822415682C5D04192360832463 +:104AC00015682C5D04192360802415682C5D041979 +:104AD0002360836114688422A25C801803600B60E9 +:104AE0004B6030BDD45F010810B5072900D901BE65 +:104AF0001F2314009C4300D001BE104B1B689C690F +:104B0000001BC0095B690001181803290AD8046852 +:104B1000C9001F238B409C431F231A408A40224315 +:104B2000026010BD04394468C9001F238B409C43B8 +:104B30001F231A408A4022434260F2E7D45F0108F3 +:104B4000F8B506000C0015001F0006AB1A780729FF +:104B500000D901BE0F232900994303D1012D01D0B3 +:104B6000092D00D101BE012F00D901BE1F23110064 +:104B7000994300D001BE21003000FFF7B5FF336834 +:104B800001210A00A24093433940A14019433160FA +:104B9000074B1A688123D05C86193268A400723BE7 +:104BA0001900A1408A432B40A34013433360F8BD52 +:104BB000D45F0108072900D901BE012A00D901BE2E +:104BC00001238B40002A01D1436070478360FCE7DA +:104BD00030B50400072900D901BE0F231000984307 +:104BE00003D1012A01D0092A00D101BE8900074B57 +:104BF00018688123C05C00190468723B1D008D4059 +:104C0000AC4313408B402343036030BDD45F0108A5 +:104C100030B50300072900D901BE012A00D901BE21 +:104C2000074804688220205CC018046801231D0026 +:104C30008D40AC4313408B402343036030BDC046DE +:104C4000D45F010830B5082900D901BE012A00D976 +:104C500001BE846901231D008D40AC4313408B408D +:104C60002343836130BD000030B50300082900D91B +:104C700001BE032A00D901BE49000748046880200C +:104C8000205CC018046803231D008D40AC43134012 +:104C90008B402343036030BDD45F0108F8B5CE4696 +:104CA000474680B507000E001400002800D1B1E08F +:104CB000002A00D1B0E0072900D901BE2368012BEA +:104CC00000D901BE63680F221900914303D1012B63 +:104CD00001D0092B00D101BE237A1F22934300D0BB +:104CE00001BEE368032B00D901BE2369012B00D963 +:104CF00001BE6369012B00D901BE236A012B00D9D3 +:104D000001BE636A012B00D901BEA36A012B00D941 +:104D100001BEE36A032B00D901BE236B072B00D928 +:104D200001BEE369032B00D901BEA369012B00D9A1 +:104D300001BE01252B00B3407000103003229146C4 +:104D4000110081400B439C46344B984683234146D7 +:104D50000968C95CC9190B68624693439C46A369FC +:104D60002B40B340624613439C46E2694B461340D6 +:104D70001A008240634613430B60626831003800BA +:104D8000FFF726FF227A31003800FFF7ADFEE26818 +:104D900031003800FFF768FF226931003800FFF763 +:104DA00051FF626931003800FFF732FF43461A684D +:104DB0008423D25CBA1810687B3398469843236AE0 +:104DC0001D40636A5B009C46022361460B401D4305 +:104DD000A36A9B009C46042361460B402B43E16A77 +:104DE000C90018250D402B43216B4D014146294038 +:104DF0000B43B100FE25AD0029408B4003431360F7 +:104E0000226831003800FFF7D5FE0020C0BCB9464B +:104E1000B046F8BD0248F9E70148F7E7D45F01085A +:104E200001005A00084B1A68BC23D3581B181B6892 +:104E3000002B07DA0B0C00D001BE0904090C4160FD +:104E4000002070470148FCE7D45F010801008A0098 +:104E50000368002B08DAC2600B0C00D001BE090405 +:104E6000090C8160002070470048FCE701008A00BF +:104E700000290BD0074B1A68BC23D3581B181B689A +:104E8000002B05DAC3680B600020704701BEF1E714 +:104E90000148FAE7D45F010801008A00034B1B6850 +:104EA000002B00D07047014B1860FBE7046001083D +:104EB00070B5040023480068002840D021480568E8 +:104EC0002C2060432818FF2425001D4005601E0A81 +:104ED000344044601B0C83601B4B1C683323E35C31 +:104EE0009D4200D301BE184B1C68BA23E35A6B43A2 +:104EF000256AAC466344036143683425645DA3427C +:104F000000D301BE104C2468246A80335B01E4188E +:104F1000446183681D0C00D001BE1D0C00D001BE91 +:104F20001B041D0C2B43A360C2610162002383613B +:104F3000049B002B02D000229B5E838170BD01BECA +:104F4000BCE7C04604600108D45F0108F0B58FB02B +:104F5000041E44D06368032B00D901BEE36A002B12 +:104F60003FD0236B002B3ED007AA1300210061C95C +:104F700061C321C921C302AE230014333100A1CB88 +:104F8000A1C121CB21C10821535E0CAD2B80174B51 +:104F90001B681B8F079989B25B186B80089B0D9368 +:104FA0000B9B0A980095A26AE16AFFF781FF069BB6 +:104FB0000598002200920021FFF77AFF216B28005C +:104FC00003F078F80022AB5E002B06DB1F221340B3 +:104FD0001E3A9A401300064A13600FB0F0BD01BE9E +:104FE000B8E701BEBDE701BEBEE7C046D45F010819 +:104FF00000E100E0F0B504000800002A2DD01C49B3 +:10500000096800292BD01A4909682C256C430C1912 +:105010004543491901263500486885402D046068DC +:1050200086402769002F1CD0886900281BD13F6863 +:10503000002F1ADA17683F043F0C17603D431560D4 +:105040002569EA6001228A614B622369320C00D033 +:1050500001BE3604360C9E60F0BD01BECFE701BE36 +:10506000D1E70448F8E70448F6E70348F4E7C04608 +:105070000460010804028A0007028A0070B582B049 +:1050800004000023019300282BD02369002B2AD091 +:105090006369002B29D0236A002B28D06369DD685F +:1050A0002A0C0BD012041A601B682069204B1A6866 +:1050B000BC23D3581B181B68002B1ADB2D042A0CA9 +:1050C000002D0AD063691A601B68636A002B2AD01E +:1050D0009847002363620023A36163691B6802B0E1 +:1050E00070BD01BED1E701BED2E701BED3E701BE6C +:1050F000D4E701A9FFF7BCFE00280ED10198026891 +:10510000160CFF231340E2699A4207D99B00226ADA +:10511000D358002B02D0984700E0002631002069C8 +:10512000FFF780FECAE7A36A002BD4D09847D2E7E6 +:10513000D45F010810B50200064B1B68002B07D096 +:10514000044B18682C235343C018FFF797FF10BD7A +:1051500001BEF5E70460010870B50C001D4B1A682C +:105160003323D35C834230D9002930D00B68DB066F +:1051700001D019482AE03323D35C984200D301BE02 +:10518000144B1B681D6ABA229B5A58432D18134EA4 +:1051900035602368DA080021606805F022FA0021F2 +:1051A0002800FFF73FFE306822000021FFF750FE85 +:1051B000002801D00A4809E0084B18680021FFF7D1 +:1051C00031FE002802D0064800E0034870BD0248C6 +:1051D000FCE7C046D45F010803018A0008600108AB +:1051E00001018A0010B50B00002A05D0002A1DD04D +:1051F000002B15D10E4810BD0029F7D10D4A1168BA +:1052000033228A5C904200D301BE0A4A11680A6ABE +:10521000BA24095B4843121807490A601800EAE7F4 +:1052200006490B604A60FFF797FFE4E70048E2E7B2 +:1052300003018A00D45F01080860010830070008F4 +:10524000F0B5C64600B50C00194B1B68DE68336824 +:1052500083422BD947091F23184001258540002987 +:1052600018D000239846124B18680368002B17DAF1 +:105270007368BF00DF193B681D420FD0AB433B6032 +:1052800000250021FFF7CEFD002C0BD0280080BCAC +:10529000B846F0BDFBF781F98046E4E7054DF0E73D +:1052A000054DF1E74046FBF77CF9EFE7034DEDE7ED +:1052B00008600108020188000301880004018A00D7 +:1052C0000A4B1B68DB681A6882420BD941091F220E +:1052D00010401E3A8240586889000B581A4203D089 +:1052E000034800E0034870470348FCE708600108F2 +:1052F0000101880004018A0000018800074B1B6837 +:105300009B6CC340DB0700D401BE044B1B681B69C8 +:1053100010308002C3580F2018407047D45F010836 +:1053200003681B050CD5802282239B00C358DB0534 +:10533000DB0D934206D090239B00C15001207047A3 +:105340004022F1E70020FAE7F0B5002800D16CE137 +:10535000002900D16BE10B78022B00D901BE4B7BF9 +:10536000023BDBB2062B00D901BE8B7B002B04D0A5 +:10537000022B02D0032B00D001BE2123CB5C012BDA +:1053800000D901BE2823CB5C012B00D901BE0B78CC +:10539000012B07D98B7F002B09D04B68013B062BD3 +:1053A00005D903E04B68083B082B00D901BE8B6888 +:1053B000053B042B00D901BE4B69FF2B00D901BE70 +:1053C0008B69FF2B00D901BE8B7C002B06D00B789C +:1053D000002B02D18B68092B74D001BE964B4C6B0D +:1053E0001C4200D001BE954BCC6B1C4200D001BECC +:1053F0000B78022B6AD04B685D1E0B7F002B6AD0A6 +:1054000080235B028C68082C67D880242401234306 +:105410000F242C4023438024A404234303600C6BFB +:1054200003681B055BD580239C4200D301BE8C6BB7 +:1054300003681B0555D580239C4200D301BE4C6AEE +:1054400003681B054FD580239C4200D301BE0B7817 +:105450001B06C024A404234003644B7F002B44D0CC +:1054600040238C7C002C42D08024E40023430C7C1D +:10547000002C3ED08024640023434C7C002C3AD086 +:105480008024A4002343CC6A013C2404F0252D038E +:105490002C4023434D7B013D07242C4023438D7B2F +:1054A0002D0130242C40234383640B7B002B24D01C +:1054B00080246400CB7B002B21D10B78022B46D0BB +:1054C00000231EE08B7B002B88D086E78B7F002B90 +:1054D00091D1002591E7002394E7002497E740232A +:1054E000A2E74023A8E74023AEE70023B9E7002462 +:1054F000BCE70024C0E70024C4E70024DAE78023E7 +:105500009B001C438B685D1E0F231D402C43C0264F +:10551000B6008451FF244D692C408D692D04FF276E +:105520003F043D402C43C425AD004451CC6A85590D +:105530002B4003339C4201D3102C00D901BECB7FFA +:10554000002B07D00B78012B5FD0002503E08023D0 +:105550009B00D6E700254C7B013C072323402B43CF +:105560008D7B2D0130242C40234343640B7B002B87 +:105570004ED080256D008B685C1E0F2323402B438B +:105580000C78012C46D0002423438024A40003512E +:10559000FF230C6B2340C124A40003512023CB5CC8 +:1055A000002B3AD080239B0421240C5D012C36D0A3 +:1055B0000024234328240C5D012C33D000242343F2 +:1055C000FF244D6A25402B4303658B6B1C408123D0 +:1055D0009B00C4501A4B4C6B23401A4C03511A4B7E +:1055E000CC6B2340194C0351002A22D00023536076 +:1055F00013609360D3601362D3625363897F303347 +:10560000D154134B93630020F0BD80256D00A2E7B9 +:105610000025B0E780246402B6E70023C4E78024B5 +:105620006404C6E780246402C9E70A48ECE7094835 +:10563000EAE70020E8E7C04692F4FFFF8CF8FFFF9E +:105640006D0B0000C80F000073070000880F0000FA +:10565000EFCDAB000160AA00114B03600F3B036468 +:10566000002383640822FF32C021890042500431A4 +:1056700043500C31435043641139FF394250FD32DD +:1056800083500365074A8350074A8350074A835073 +:10569000074A8350074A8350074A83507047C046E1 +:1056A0000F000003C80E0000880E0000C80F0000A5 +:1056B000880F0000080F0000480F000003685B001F +:1056C0005B080360002904D000234B600B600B6271 +:1056D000CB627047F0B5C64600B58C680A68842373 +:1056E000C3580F252B40073DED1A2300AC4226D9A5 +:1056F0002B0024E055782D0216783543D6783606EF +:1057000097783F043E4335439827C55155792D027C +:1057100016793543A846D679360695792D042E4359 +:1057200045463543C551D218E41A8423C3580F2582 +:105730002B40073DED1A2300AC4200D92B00002B73 +:1057400000D183E0082BD5D0012B24D0022B26D00A +:10575000032B2BD0042B33D0052B3ED0062B4CD063 +:10576000072B5DD053781B0215782B43D5782D0677 +:105770009678360435432B439826835153791B0280 +:1057800015792B43D5792D0697793F043D432B435B +:1057900083510823C7E7167890254651C3E755780B +:1057A0002D021678354394268551BCE755782D0295 +:1057B0001678354394268551967890254651B2E760 +:1057C00055782D0216783543D678360697783F04FB +:1057D0003E43354398268551A5E755782D02167826 +:1057E0003543D678360697783F043E4335439826AE +:1057F000855116799025465195E755782D021678F2 +:105800003543D678360697783F043E43354398268D +:10581000855155792D02167935439426855182E7B5 +:1058200055782D0216783543D678360697783F049A +:105830003E4335439826855155792D0216793543D7 +:10584000942685519679902546516CE70A608C60C4 +:10585000002C0CD1F924E400035901229343035195 +:105860008A61CB69002B02D0CB690120984780BCAC +:10587000B846F0BDF8B50E004C69CA68C423C358D9 +:105880000F21194023008C421CD90B001AE0D825A7 +:10589000415911700F0A57700F0C9770090ED17093 +:1058A00045591571290A5171290C91712D0ED57127 +:1058B000D218E41AC423C3580F251D402300AC425C +:1058C00000D92B00002B6DD0082BE0D0012B1ED06F +:1058D000022B20D0032B24D0042B2BD0052B33D02C +:1058E000062B3ED0072B4BD0D821435813701D0AEE +:1058F00055701D0C95701B0ED37043581371190A07 +:105900005171190C91711B0ED3710823D0E7D0216E +:1059100041581170CCE7D42141581170090A5170D7 +:10592000C6E7D42141581170090A5170D02141585D +:105930009170BDE7D821415811700D0A55700D0CBA +:105940009570090ED170B3E7D821415811700D0A36 +:1059500055700D0C9570090ED170D0214158117100 +:10596000A6E7D821415811700D0A55700D0C95709D +:10597000090ED170D42141581171090A517197E76C +:10598000D821415811700D0A55700D0C9570090EF3 +:10599000D170D42141581171090A5171D021415857 +:1059A000917185E7F2607461002C0DD1F922D2006B +:1059B000835802218B4383500323B361336A002B46 +:1059C00002D0336A032098477461F8BD10B50028EF +:1059D00032D0002932D0002B32D05A62F922D200C4 +:1059E00083580324A34383500B78012B00D901BEB5 +:1059F0000B7A032B00D901BE4B68072B00D901BEDF +:105A00000B7B012B00D901BE01230A6813408A6871 +:105A10001203C024A401224013434A681204E02464 +:105A2000E40222401343CA681206802149040A4056 +:105A300013430360002010BD0248FCE70148FAE769 +:105A40000048F8E70400B2004B1EDBB2012B04D97A +:105A5000042902D0082900D001BE032A00D901BEC2 +:105A6000042920D008D801290DD002291AD1882371 +:105A70001B019C4660440AE0082913D198231B01AE +:105A80009C46604403E080231B019C466044002840 +:105A900008D0036806490B401204C02189020A405D +:105AA0001A430260704790231B019C466044EEE756 +:105AB000FFFFFCFFF8B5DE4657464E464546E0B5CB +:105AC000070008009A460AAB40CB1B789B460CABFC +:105AD0001B78111FC9B2FA2900D801BE59460439F2 +:105AE000C9B2FA2900D801BE591EC9B2012904D988 +:105AF000042B02D0082B00D001BE002E02D051464C +:105B000000291CD0002E02D05946FF2919D01B02B3 +:105B1000F02109010B4099460E9B5D6A1104C022D9 +:105B2000920211404B4619430143002E0BD10D9BAD +:105B3000DA07120C11433965002400200CE001BE85 +:105B4000E0E701BEE3E70022F4E703433B650134ED +:105B5000E4B2002D1FD128002100B44225D2164BFB +:105B6000984222D07B6C0422100018401A42F0D1D7 +:105B700053465B5C4A46134398465A461204C02378 +:105B80009B021A40434613430131B142DDD30D9AC3 +:105B9000D007000CD9E7012002F008FB013D002DE1 +:105BA00001D00020D8E70448D6E7F0BCBB46B24697 +:105BB000A946A046F8BDC0460200B20070B58AB042 +:105BC0000500181FC0B2FA2800D801BE002A34D040 +:105BD000686C042634000440064231D11B04C02006 +:105BE00080020340501E0004000C03438020C002CA +:105BF00003432B65002925D00E9B5E6A009102921B +:105C00000023079302330693200006E0012002F0F0 +:105C1000CDFA013E002E0ED02000069B022B0DD1A6 +:105C2000094B98420AD069462800FFF753FD002E21 +:105C3000ECD13000F1E70448EFE704480AB070BD4A +:105C40000348FBE72000F9E70200B2000400B200BD +:105C50000100B200F0B50400069D181FC0B2FA287A +:105C600000D801BE002A21D0666C042738003040DD +:105C700037421DD11B04C026B6023340561E3604DF +:105C8000360C3343802636033343236500290ED078 +:105C9000E9602A616A61059B2B620423AB61F922EA +:105CA000D200A35802210B43A35000E00148F0BDED +:105CB0000148FCE70400B2000100B20070B58AB0F0 +:105CC0000500181FC0B2FA2800D801BE002A34D03F +:105CD000686C042634000440064231D11B04C02005 +:105CE00080020340501E0004000C03438020000388 +:105CF00003432B65002925D00E9B5E6A0391059214 +:105D00000023089304330693200006E0012002F0EC +:105D10004DFA013E002E0ED02000069B042B0DD123 +:105D2000094B98420AD069462800FFF7A3FD002ED0 +:105D3000ECD13000F1E70448EFE704480AB070BD49 +:105D40000348FBE72000F9E70200B2000400B200BC +:105D50000100B20010B5030000290DD0426C0424EC +:105D600020001040144209D101390904090CC02255 +:105D700012031143196510BD0148FCE70148FAE719 +:105D80000400B2000100B20000230B604B608B6086 +:105D9000CB600B614B618B61026880231B06134350 +:105DA0000360704770B58D69AA682B6AFF26CC68BE +:105DB000B44384600C696442B443C4602D68013DFF +:105DC00003242C404969002901D080214900214346 +:105DD0000162002A33D01468611C67D0FF21214082 +:105DE00014792404C025AD022C40214380242406CC +:105DF0002143016451790904C024A4022140416473 +:105E00009468611C54D0FF212140147B2404C025D8 +:105E1000AD022C4021438024240621438164116972 +:105E2000002905D001391F240C4080210906214397 +:105E3000C164127D1204C02189020A400265002B50 +:105E400033D019684A1C35D0FF220A401979090459 +:105E5000C024A40221400A43802109060A430266A5 +:105E60005A791204C02189020A40426699684A1C84 +:105E700022D0FF220A40197B0904C024A402214039 +:105E80000A43802109060A4382661A69002A05D05E +:105E9000013A1F211140802212060A43C2661B7D6F +:105EA0001B04C02292021340036770BD0021A0E7CB +:105EB0000021B3E70022D2E70022E5E770B5050034 +:105EC00008220026002000E008328B790133DB0035 +:105ED000934216D3FF232B408C5CA342F4D12C0AAF +:105EE000FF2323408C18E479A342EDD18B185B7813 +:105EF000B342E9D38C18A478012CE5D11E00100020 +:105F0000E2E770BD70B50C0015001E00FFF7D6FF6C +:105F100000280BD021180B79AB704B796B708B7903 +:105F20002B70CB789B003360002070BD0048FCE7ED +:105F30008000B2008278520803231340012B07D05F +:105F4000022B07D0002B01D0002070470320FCE774 +:105F50000420FAE70420F8E70200407900021379F0 +:105F60001843D3791B069279120413431843002B6C +:105F700002DB0130C0087047033880231B0618433A +:105F8000F9E7437A0B6000230B7102334B71037AFC +:105F90005B0908D1013B8B60027A1F2313400B6120 +:105FA00002230B757047FF238B60FD3B0B73F3E7F8 +:105FB000C37A0B6000230B714B71837A5B0908D1A4 +:105FC000013B8B60827A1F2313400B6102230B7508 +:105FD0007047FF238B6000230B73F3E7C37B0B60D9 +:105FE00000230B7101334B71837B5B0908D1013BAB +:105FF0008B60827B1F2313400B6101230B7570475D +:10600000FF238B60FE3B0B73F3E7437B0B600023A6 +:106010000B714B71037B5B0908D1013B8B60027BE9 +:106020001F2313400B6101230B757047FF238B6007 +:1060300000230B73F3E703230B6000230B714B71F9 +:10604000012252428A600B610B75704710B50B003C +:106050001100012B0DD0032B09D00123002B12D0EE +:1060600083789A0607D45B0609D4FF2010BD00236D +:10607000F4E70023F2E7FFF784FF0520F6E7FFF7D8 +:1060800097FF0420F2E78378DA0605D4DB0707D40C +:10609000FFF7D1FF0120E9E7FFF7A0FF0320E5E7C5 +:1060A000FFF7B3FF0220E1E70068052907D8890060 +:1060B0000D4B5B589F46830601D5EC231360704758 +:1060C000C306FCD56C231360F9E70307F7D5BC239F +:1060D0001360F4E74307F2D53C231360EFE783072F +:1060E000EDD50C231360EAE740F200102823C35CCF +:1060F0001B09012098407047F0B5C64600B54F6AAD +:106100001B38430898460F263E400021002411E02A +:10611000012800D11024701C013363434D00AC46AC +:106120008C446546AD00AC46944443435B006046F6 +:1061300083600131032917D8CB005B1A3800D8409F +:106140000509430A032018401F232B40022809D0C9 +:1061500003D80028DCD10124DDE70328DBD1FA24B1 +:10616000A400D8E78024D6E7434658004044850081 +:106170000C3D5219906880BCB846F0BD10B5446A19 +:10618000816A4A0F032313400A0E1F2111400F2278 +:106190002240022B11D00BD8002B11D0012B11D192 +:1061A00080204000531C013148435843400010BD3B +:1061B000032B09D1FA200002F4E7FA200001F1E7ED +:1061C0001020EFE70020EDE70020EBE7836A190AD3 +:1061D0001F2001400F221A409B0406D408230132DD +:1061E000481C58435043400070474023F7E70623BC +:1061F00003600023037170470423036000230371CD +:10620000704702230360002303714371012252424D +:1062100082600373036103757047122303600023D8 +:10622000037143710122524282600373036103755B +:1062300070473423036000230371437101225242EB +:106240008260037303610233037570473E2303606A +:10625000002202713C3B437101214942816003737A +:1062600002610375704710B50368042922D009D86C +:106270000139C9B2022904D85B062BD51000FFF7FB +:10628000CCFF10BD0529FCD1D90507D4190609D4C6 +:106290005B060BD51000FFF7C0FFF2E71000FFF719 +:1062A000D5FFEEE71000FFF7C4FFEAE71000FFF7A5 +:1062B000A8FFE6E7190605D45B0607D51000FFF72F +:1062C000ACFFDEE71000FFF7B4FFDAE71000FFF7DE +:1062D00098FFD6E71000FFF794FFD2E7052303608D +:1062E0000023037170470000C36A002B10D0036BBA +:1062F000002B0FD00023026B13713A33CA5C1209D2 +:10630000333B1340052B0ED89B00154AD3589F46AC +:1063100001BEECE701BEEDE701235B42C363026B04 +:106320001360C26A136070470223C363036B0122C8 +:106330001A60C36A34321A60F5E74023C363036B03 +:1063400001221A60C36A04321A60ECE78023C36337 +:10635000036B3E221A60C36A01321A60E3E7C0464B +:1063600058F2001060230360002303717047F0B5FA +:1063700005000368042B07D01D200B5CFF2B2BD1DD +:10638000222828D80230F8E74369012040421860EB +:106390004B785B080F261E400023042B07D80124EE +:1063A0009C4030002040844201D00133F5E7032BAC +:1063B0001FD81F1D0020032807D8061D44002418DD +:1063C000A4008E5D16550130F5E76A69C95D11605C +:1063D00058001D3005E00020002802D06B690A5CDF +:1063E0001A60002806D000236A6913716A69537124 +:1063F00003E000206B69FF221A71F0BD70B5002226 +:1064000000240FE023001C33C65C53009B189B0044 +:10641000CB180125B5405D6025001D35455D1D701B +:1064200002340132032AEDD970BD10B5013B9C182E +:106430000855000A002BF9D110BD10B50400002347 +:10644000002003E00002E25C104301338B42F9D3E9 +:1064500010BD000030B587B004001D004B062AD4E3 +:106460001648CB0725D58B0710D5D368002B0DD048 +:106470001A7919780A9B0493012303930295FE333A +:106480000193002300932000FFF714FB0B4B98426D +:1064900001D000280DD10A9B049301230393029598 +:1064A000FE330193002300930022B7212000FFF761 +:1064B00001FB07B030BD0020D3E7C0468000B2002A +:1064C00030B587B004000800150019000C9B049338 +:1064D00000230393029001930B9B00930A9B0022DD +:1064E0002000FFF7E7FA002801D007B030BD0C9B71 +:1064F00000930023012229002000FFF7DFFBF4E7CF +:10650000F0B5DE4657464E464546E0B589B00590A3 +:106510000D0090469B4612AB1B789A4600230693CB +:106520005D4E002400273000139B99462DE0032088 +:1065300000E00420002108E00020FBE72218521AA6 +:10654000AA18D67806AA565401318842F6D84A4687 +:106550000292019006AA0092172202A98C46624478 +:1065600051460598FFF7ACFF00280BD17F00FBB226 +:10657000172202A98C4662441778049A17407A1EA3 +:1065800097411F430834444531D82B5D9B0716D4EF +:10659000631CEB5CE21CAA5C0492172202A98C46E5 +:1065A0006244002111702A1992789209012ABED002 +:1065B000022ABED0002ABFD05A461068BAE70600A9 +:1065C000002E16D0002E5CD12B199B780133DBB244 +:1065D00004935A46D364012B5BD93700B24600239B +:1065E00005961E00A8462500149B994617E02B4EE1 +:1065F000E6E742462B195B78BB42E3D02B199B7828 +:1066000002339B00E418A242F4D2244EDAE7E3609E +:106610005168380002F012FC60600136F6B2049B4B +:106620009E422DD2BA440435434658195B5D0F2172 +:10663000194001220023114207D15200D2B2013386 +:10664000DBB2042BF7D9154A059207683F0A0137D8 +:106650003F02B2005946096D8C58524622605A00DA +:10666000D3189B004A46D2184946CB5CA360936876 +:1066700023615368BB42CAD9E76001236360CCE75A +:10668000059E300009B0F0BCBB46B246A946A04604 +:10669000F0BD014EF5E7C0460600B2000700B200AB +:1066A000F0B587B006000D0010000E9C0A7909783D +:1066B00004940027039702936B79019303230093BB +:1066C00003003000FFF7F6F9002801D007B0F0BD55 +:1066D00029693000FFF73EFB0028F7D12B7D01949C +:1066E000002200920C9A0D993000FFF7B3FA061EB3 +:1066F000ECD1656A06E0012001F058FD013D002D56 +:106700000AD03000A369032BE0D0044B9842DDD0BF +:10671000002DF0D12800F5E70048F3E70200B200B1 +:1067200010B5002134E00B001033DB0100221A50B9 +:10673000CB01C318184C1C192260184C1C1922607C +:10674000822424011C192260842424011C19226043 +:10675000134C1C192260134C1C192260124C1C197A +:106760002260852424011C192260862424011C191E +:1067700022600E4C1C1922600D4C1C1922600D4C1D +:106780001C19226087242401A44663441A60013145 +:106790000329C8D910BDC046080800000C08000035 +:1067A00044080000480800004C080000640800008D +:1067B000680800006C08000010B586B00B001400DB +:1067C0008A69D16800290ED00A79097804940124D5 +:1067D00003941B780293FF23019300230093FFF798 +:1067E00069F906B010BD0148FBE7C0468000B20061 +:1067F00030B587B004000800150019000A9B049307 +:106800000023039302780292FF2201920093002258 +:106810002000FFF74FF9002801D007B030BD0A9BD8 +:1068200000930023012229002000FFF747FAF4E734 +:1068300010B584B00F236B4401241C708C69A36ACB +:10684000002B0DD01B7800920F226A44FFF7D0FF77 +:10685000002805D1A36B0F226A4411780B401370F6 +:106860000F236B441878431E9841C0B204B010BD8A +:10687000F0B5002808D085696B6893421DD92E6D4C +:10688000002E03D0002004E001BEF4E70C4813E022 +:106890000130EB6C83420ED98300F458E3686768DB +:1068A0007B432768BC466344BA42F1D39A42EFD295 +:1068B0000C60002000E00248F0BD0248FCE7C04642 +:1068C0000600B2000400B200F0B58BB006900C00D8 +:1068D00015000793002928D0002D30D0A6697769CC +:1068E0000023099331682800FFF7A7FD020009A9DA +:1068F0002000FFF7BDFF002F1BD03A79FF2A1AD0E6 +:10690000104B984219D0002811D1099B197A079B86 +:106910000493012303932378029301923368009335 +:106920002B000698FFF7C6F80AE001BED4E73978D5 +:10693000EDE7054804E0044802E0034800E00148B0 +:106940000BB0F0BD0400B2008000B200F0B5DE462E +:1069500057464E464546E0B5C9B005000C00160046 +:106960009946002913D02EAAAE4B19881180997828 +:1069700091702DAA19881180997891702CAA198884 +:1069800011809B789370636B9846002305E001BEED +:10699000E9E72FA90022CA540133632BF9D94A46EB +:1069A00031002800FFF750F84346002B13D0529BCC +:1069B00002932FAB01933823009333002EAA414654 +:1069C0002800FFF76DFE071E06D12FAB9B79062B23 +:1069D00002D9954F07E0944F002F04D12FAB1B78BD +:1069E000532B08D0904F380049B0F0BCBB46B2469C +:1069F000A946A046F0BD2FAB5B78462B01D08A4F4D +:106A0000F1E72FAB9B78442B01D0874FEBE72FABFF +:106A1000DB78502B01D0844FE5E72FAB1B79052B9A +:106A200000D8FCE02FAB5B79012B01D07E4FDAE779 +:106A3000049704AB2DAA2FA97C48FFF763FA0597AA +:106A400005AB2CAA2FA97A48FFF75CFA794B98423C +:106A500000D1A0E000230693FF2006AB2EAA2FA9A9 +:106A60000002FFF74FFA071EBDD1A368002B00D12B +:106A700095E0E368002B00D193E02369002B00D15F +:106A800091E06369002B00D18FE0E369002B00D116 +:106A90008DE0236A002B00D18BE0A36A002B00D18C +:106AA00089E0529B02932FAB9A460193069B009379 +:106AB00033002EAA41462800FFF7F2FD070020A967 +:106AC0005046FFF79BFC5046FFF734FA20605046D3 +:106AD000FFF742FA60605046FFF708FB6062E0682B +:106AE000FFF785FB2069FFF787FB0123A363A06AFB +:106AF000FFF7F4FB51462000FFF7F6FBE069FFF7D4 +:106B000031FC5046FFF73AFB60645046FFF75EFBEE +:106B1000A064A3689B461A0049465046FFF796FAC0 +:106B200081462368042B48D0206AFFF76AFB20AA1D +:106B30002FA92000FFF71BFC002809D0431E2FA916 +:106B4000CA5C01239340A36120AAFFF7D5FA206411 +:106B5000236D002B00D146E7529B02932FAB01938C +:106B6000059B009333002CAA41462800FFF798FDAF +:106B7000071E00D037E720AB0293529B019300968B +:106B80002300059A2FA92800FFF7BAFC2A4B984248 +:106B900041D0070027E70023E36423655AE701BEDD +:106BA00067E701BE69E701BE6BE701BE6DE701BEA5 +:106BB0006FE701BE71E701BE73E752463833D15C1F +:106BC000529B0093330022002800FFF743FC071E6E +:106BD00003D0002F0FD00120B0E7529B029307ABE8 +:106BE0000193049B009333002DAA41462800FFF730 +:106BF00057FD0700EDE75A46494607A8FFF754FA44 +:106C0000226A494607A8FFF72EFB20AA07A9200001 +:106C1000FFF7ADFB90E70023E3642365E3E6024F53 +:106C2000E1E6C04670F200100500B20084FF0000EB +:106C300081FF00008000B2000600B200F0B5DE4621 +:106C400057464E464546E0B583B0061E904600D1F5 +:106C5000ACE0002900D1B1E04F68002F00D1AFE0D7 +:106C6000002A00D1AEE00B689946002B03D0002526 +:106C700000239A465DE0544899E001BE70E0524816 +:106C800007E0082B04D198231B019B46B3440CE07A +:106C90004D485346002B00D189E0B2200004184330 +:106CA00085E080231B019B46B3445B46002B00D14B +:106CB0007AE01B68454A1340227A1204C0218902F7 +:106CC0000A4013435A4613606368042210001840B8 +:106CD0001A4257D1A3691B68013B032B00D901BE9F +:106CE000002825D163689B0722D52169E06802F05E +:106CF0002BF9002900D001BE236980225202934261 +:106D000002D35A1E1A4200D001BE21005846FFF796 +:106D100049F80223FF3362681340227A1204C0212B +:106D200089020A4013438022120613435A46136015 +:106D30000135A94536D9AB00FC58002CF8D0227893 +:106D4000531EDBB2012B04D9042A02D0082A00D03A +:106D500001BE237A032B00D901BEA369002B8CD07E +:106D60002378042B09D08CD8012B9AD0022B86D102 +:106D700088231B019B46B34497E790231B019B4646 +:106D8000B34492E7237A2278A1694046009030000C +:106D9000FFF7DCFD00289DD00823AB4052461A4384 +:106DA000924697E7002074E7074872E7064803B069 +:106DB000F0BCBB46B246A946A046F0BD0248F6E785 +:106DC0000148F4E70048F2E70400B200FFFFFCFFCF +:106DD000F0B5D6464F464646C0B507008846140073 +:106DE00099469608194B9A4203D8002E08D10126DD +:106DF00006E0174E04E0A41B00281CD0002C1AD07B +:106E0000FA218900300002F019F88246FA2189003F +:106E1000300002F099F88DB2504601F0D1F9280007 +:106E200001F0D2F94A4641463800FFF701FDB4426D +:106E3000E1D80024E0E7002805D10020E0BCBA46F4 +:106E4000B146A846F0BD0348F8E7C04603093D0037 +:106E500040420F000200B200F0B5DE4657464E46F3 +:106E60004546E0B589B082460F0090469946129C8F +:106E7000139B9B460023079300290BD04B46002B06 +:106E80000AD0BA69956843461B195268934205D8DF +:106E90002D4817E001BEF1E701BEF2E72A4809B02C +:106EA000F0BCBB46B246A946A046F0BD002802D1C0 +:106EB000296900293AD100283CD00028EFD1A41B31 +:106EC000B044B144002CEAD0260080235B029C42EF +:106ED00000D91E00BB691B68002207A94046FFF7C6 +:106EE000A4FABB692A7929785846049000200390B7 +:106EF00038780290687901901B68009307AB504680 +:106F0000FEF7D8FD0028D1D1A9684B1CCED02A7B32 +:106F1000C9B25B4604930023039338780290FF20A4 +:106F2000019000935046FEF7C5FDBFE75046FEF7BF +:106F300011FFC0E72B7D5A46009232004946504669 +:106F4000FEF7BCFEB9E7C0460400B200F0B5DE466D +:106F500057464E464546E0B589B082460F001600BA +:106F60009846129D00230793002910D04346002B1A +:106F70000FD0BA69536A9946136A9B4673195268CF +:106F8000934208D83F483B004F46994618E001BE5F +:106F9000ECE701BEEDE73B4809B0F0BCBB46B246AA +:106FA000A946A046F0BD2C00139A49465046FFF76B +:106FB00003FC00280FD00028EED1A04436192D1B69 +:106FC000002DE9D03900300001F0BEFF6B18BB4244 +:106FD000E9D37C1AE8E74B469B691B68002207A9A6 +:106FE0003000FFF722FA4B469B695A461279594600 +:106FF0000978139804900020039048460078029086 +:107000005846407901901B68009307AB5046FEF745 +:1070100051FD002803D15B4699684B1C12D1002812 +:1070200003D15B46196900291DD100281FD0002813 +:10703000C1D14B469B699A6C139B49465046FFF75A +:10704000C7FEB8E75B461A7BC9B2139B04930023C3 +:107050000393484600780290FF2001900093504629 +:10706000FEF728FDDBE75046FEF774FEDDE75B46E2 +:107070001B7D139A0092220041465046FEF79EFD6A +:10708000D5E7C0460400B200F0B5DE4657464E468E +:107090004546E0B587B007000E0015000093109A32 +:1070A0009046EB18013B01930023059304930029BC +:1070B00048D0B3699B469B699A465B461B6C02931A +:1070C0005B465B68019A93423ED80023994603933E +:1070D000504C504B9C4200D194E04B46E81A51462C +:1070E00001F032FF002900D08BE0039B019A93420C +:1070F00044D3484B9C4200D184E0019B4A46981AF5 +:107100000130514601F020FF002943D1009B002BA4 +:1071100078D02A0004A93000FFF7AAFB041E6AD128 +:10712000049A13690293D3689A46116853685246C9 +:1071300053435B18013B9946019B4B452ED2019B63 +:1071400099462BE001BEB4E72A0004A93000FFF7FE +:107150008FFB041E0AD1049B1A689146DA68924696 +:107160005B6853434B44013B039302E00023994681 +:107170000393009B9A45ACD9264CAAE704A930009A +:10718000FFF776FB041EB4D1049B1A689146DB68B6 +:107190009A46AEE71F4C35E0002CB7D14D45B5D22D +:1071A000424631003800FFF707FB041EF4D15B466E +:1071B0001B68002205A92800FFF737F9434605AAF6 +:1071C00031003800FFF780FB041EE5D1029B5A0115 +:1071D000D21A92009C466244D200434631003800E5 +:1071E000FFF7F6FD009B534508D9554452469B1ABC +:1071F00000930400D0E7019B9946CFE70094040078 +:1072000084E7044C200007B0F0BCBB46B246A94658 +:10721000A046F0BD0400B20010B5002814D1072923 +:107220002ED8FF2A2ED81A4B186883687824005B62 +:107230001B188900C9180B68164803401206120C67 +:107240001A430A60002002E0012801D0124810BD54 +:107250000F2919D880235B029A4217D20C4B186869 +:1072600083687A24005B1B188900C9180B680B48D7 +:10727000034012020A4802401A430A600020E6E76F +:107280000548E4E70448E2E70348E0E70248DEE7B0 +:10729000D45F0108FF00FFFF01004A00FF0000FF6C +:1072A00000FFFF0030B51A4B1B6842241C5D84426E +:1072B00028D9032928D8002901D1072A0FD9012963 +:1072C00005D0022906D0032907D012481BE00F2A57 +:1072D00005D9F6E7032A02D9F5E7002A16D1752465 +:1072E0001D5DA940723CAC40214074241C5D2240CD +:1072F0009B680A43C02189008C4660448000C250CC +:10730000002000E0034830BD0248FCE70148FAE7EE +:10731000D45F010801004A00F0B5032835D80028E1 +:1073200001D107290FD9012805D0022806D003284A +:1073300007D0184828E00F2905D9F6E7032902D914 +:10734000F5E7002923D1144B1C687723E35C032263 +:1073500015009D402B007425655D7626A65D2F00E7 +:10736000B7403B437526A65DB040B240104018437D +:10737000294008438021090608438023DB00A268D6 +:10738000D050A268D3580020F0BD0248FCE7014865 +:10739000FAE7C04601004A00D45F010810B503288F +:1073A00028D8002801D107290FD9012805D00228A3 +:1073B00006D0032807D011481BE00F2905D9F6E7AE +:1073C000032902D9F5E7002916D10D4B1A68752358 +:1073D000D45CA040723BA34018407423D35C194096 +:1073E000926801438020C00501438023DB00D15017 +:1073F000002010BD0148FCE70048FAE701004A0000 +:10740000D45F0108064B1B681A6888215B58D218A4 +:10741000136804490B400002034313607047C046E1 +:10742000D45F0108FF00FFFF044B1A68136888212E +:1074300052589B181868000AC0B27047D45F010800 +:10744000012800D901BE054A136805490B40000216 +:10745000C021890008401843106070470000274091 +:10746000FFFCFFFF10B5074B984200D901BE06494B +:10747000064A8B58064C2340024C20401843885043 +:1074800010BDC046010300000000264004050000B6 +:10749000FEFCFFFF10B50449044A8B58044C2340FE +:1074A000000403438B5010BD00002640040500007B +:1074B000FFFF00FF0349044A885880231B0603434B +:1074C0008B50704700002640040500000349044A21 +:1074D0008B585B005B088B507047C046000026400D +:1074E0000405000010B50300032800D901BE054CB7 +:1074F000A021C900605803229043134018436050F4 +:1075000010BDC04600002640064B1B681A68882143 +:107510005B58D21813681B021B0A00060343136052 +:107520007047C046D45F0108044B1A68136888216D +:1075300052589B181868000E7047C046D45F010867 +:10754000064B1B681A688C215B58D21813680449D3 +:107550000B400002034313607047C046D45F01082C +:10756000FF00FFFF084B1A684023D35C834209D910 +:10757000064AE0308000815880231B060B4383506D +:10758000002070470248FCE7D45F01080000264055 +:1075900001004A0000280ED0094B1A684023D35C32 +:1075A00083420AD9074AE030800083585B005B08B9 +:1075B0008350002070470448FCE70348FAE7C046C0 +:1075C000D45F01080000264001004A0010B50B4BB3 +:1075D0001A684023D35C83420CD90F290CD8084C7D +:1075E000E030800003590F229343114019430151A9 +:1075F000002010BD0348FCE70248FAE7D45F010809 +:107600000000264001004A00064B1A684023D35C64 +:10761000834200D801BEE0308000034BC3580F20E6 +:1076200018407047D45F01080000264010B50C4B8D +:107630001A684023D35C83420DD903290DD8094C25 +:10764000E03080000359302293430901114019436F +:107650000151002010BD0448FCE70348FAE7C0468A +:10766000D45F01080000264001004A00074B1A6859 +:107670004023D35C834200D801BEE0308000044B3D +:10768000C3581B09032018407047C046D45F010847 +:1076900000002640034B1B6904201840431E9841FC +:1076A000C0B270470000274010B504000A4A1368B2 +:1076B00008210B43136003E0012000F077FD013C3B +:1076C000FFF7E8FF002801D1002CF5D1002C01D0F4 +:1076D000002010BD0148FCE70000274002004A00DE +:1076E00000207047002070470349044A88588023CF +:1076F0001B0603438B507047000026400C0500001A +:10770000084AC0235B00D3580122100018401A42D7 +:1077100006D10449044A8B585B005B088B507047C4 +:107720000248FCE7000026400C05000003004A0068 +:10773000064A074BD35801229343002800D1002268 +:1077400013430249024A8B507047C046000026404E +:107750000C050000014B18687047C0460C6001081A +:10776000084AA623DB00D25803231340032B06D07C +:10777000044AA623DB00D35801201840704702209A +:10778000FCE7C0460000264010B5FFF7E9FF0228DD +:1077900001D0002010BD014B1868FBE71060010804 +:1077A000134B1A683E23D35C83421DD9042904D9A4 +:1077B0004B1EFF3B9BB2132B18D8FF290CD91F235C +:1077C00019400C4A0300C0339B009950D030800010 +:1077D00004238350002008E007231940D0308000A4 +:1077E000044BC150002000E0034870470248FCE70A +:1077F000D45F01080000264001004A0003000C4A43 +:1078000011683E228A5C824200D801BE1A00D03242 +:1078100092000849505807221040042800D07047B1 +:10782000C0339B005B581B300340E1301843F6E740 +:10783000D45F01080000264010B52A4B1A683E2389 +:10784000D35C834200D801BEFFF7D8FF88235B00DA +:10785000984231D012D802282BD004D903280BD15A +:10786000FFF73EFF3CE0002839D0012802D1FFF7A6 +:1078700071FF35E0002033E0002031E089235B0018 +:10788000984229D01423FF33984206D1164A174B49 +:10789000D358002B1DDB002022E01223FF33984237 +:1078A00005D1FFF7F7FE002810D1002018E00020D6 +:1078B00016E0FFF769FF13E00B4A0D4BD358002B7E +:1078C00001DB00200CE08020000209E080200002A3 +:1078D00006E08020000203E0FFF704FF00E0054817 +:1078E00010BDC046D45F0108000026403C050000E2 +:1078F0000C05000000127A00024AB023DB00D058C9 +:10790000C00F704700002640034AB223DB00D35863 +:10791000012018407047C046000026400B4BB120A4 +:10792000C0001A580A491140802292050A431A5091 +:10793000B021C9005A58520052085A5005495A58A5 +:10794000520052085A5000207047C046000026409E +:10795000FFFFFFCF8C05000070B5041E00D175E05D +:10796000FFF7CAFF002800D074E08023DB02226802 +:107970009A4200D301BE23689B039B0BE279002A45 +:1079800000D165E08022520413433349B022D20073 +:107990008B50A28880239B019A4200D301BE22898A +:1079A00080239B009A4200D301BEA388DB04DB0C3A +:1079B0002289120429490A4013432749284A8B5037 +:1079C000A37A0F2B00D901BEE37A0F2B00D901BE99 +:1079D000A28980239B019A4200D301BEA27A0F2381 +:1079E0001340E17A0901FF220A401343A2891202DF +:1079F0001C490A401343A27B1207C02189050A4093 +:107A000013431549B122D2008B50A379042B00D91E +:107A100001BE228A80239B009A4200D301BE0E48F9 +:107A200011494358114A1340A2791202E025ED0092 +:107A30002A401343435043580D4A1340228A1204EC +:107A4000064C224013434350002070BD01BE87E71F +:107A5000002299E70748F8E7000026400000FF01F0 +:107A60008405000000FF1F008C050000FFF8FFFFE9 +:107A7000FFFF00FE03004A0010B5002832D01A496B +:107A8000B023DB00CB589A03920B02608022520491 +:107A900013405A1E9341C371144BCB58DA04D20CD5 +:107AA00082801B0CDB05DB0D0381B123DB00CB588F +:107AB0000F2214001C4084721C092240C2721A0A50 +:107AC000D204D20C82811B0F032213408373084B14 +:107AD000CB58190A04320A4082711B0CDB05DB0DFE +:107AE000038210BD01BECAE70000264084050000E5 +:107AF0008C05000070B505002649274A8858802368 +:107B00001B0603438B502C0003E0012000F04EFBCA +:107B1000013C204AB223DB00D3585B0701D4002C80 +:107B2000F3D11C48B121C90043581C4A1A40802394 +:107B30009B0513434350002D01D0002C0CD0154958 +:107B4000B022D200885880231B0603438B5003E0E9 +:107B5000012000F02BFB013CFFF7D6FE002801D1ED +:107B6000002CF5D1002D01D0002C0ED00949B122F6 +:107B7000D2008858C0239B0503438B50002D02D0B0 +:107B8000002C05D00025280070BDFFF7C7FEF5E7E3 +:107B9000034DF8E7000026408C050000FFFFFFCFF3 +:107BA00002004A000138074B1A683F23D35C834226 +:107BB00000D801BE8130FF308000034BC058C00F99 +:107BC0007047C046D45F01080000264070B50138F8 +:107BD0000D4B1A683F23D35C834201D80B4870BD1C +:107BE0000B4D8130FF30840063590A4A1A408023CC +:107BF0009B0513436351012000F0D8FA63595B00E1 +:107C00005B0863510020EAE7D45F010801004A00E5 +:107C100000002640FFFFFFCFF8B504000D002F4BFA +:107C20001A683F23D35C834201D22D48F8BDFFF789 +:107C3000B9FF002845D1AA78931EDBB20E2B42D89B +:107C40006B78002B41D0122B41D82F783E00E97879 +:107C5000002932D0133086423BD300292FD0382060 +:107C6000864238D8013C2879022816D07F20384037 +:107C70001B02F8267601334003431204F820400328 +:107C800002401A43C90680231B05194011432300F3 +:107C90008133FF339B00134A995012498134FF34DA +:107CA000A4006358104A13402A791207C0208005A7 +:107CB0000240134363500020B8E71620CBE7702042 +:107CC000CEE70A48B2E70648B0E70548AEE7044801 +:107CD000ACE70348AAE70248A8E7C046D45F01081A +:107CE00001004A0000002640FFFFFFCF03004A00CA +:107CF0000138114B1A683F23D35C83421AD9813073 +:107D0000FF3080000D4BC3587F221A400A70180ABA +:107D10001F2210404870180C02408A708022120501 +:107D20001A40501E8241CA701B0F032213400B7170 +:107D3000002070470248FCE7D45F0108000026409D +:107D400001004A0070B50D00461E294B1A683F23FA +:107D5000D35CB34249D9274933008133FF339B00B9 +:107D600058588022120602435A502C0003E001208A +:107D700000F01CFA013C33009133FF339B001D4A95 +:107D80009B58DB0701D4002CF1D1002D01D0002C31 +:107D900017D033008133FF339B00164A9A58120FD5 +:107DA00003231340022B01D0002070BD114A8136FD +:107DB000FF36B600B158C0239B050B43B3500020DB +:107DC000F3E70C4C8136FF36B60033590A4A1A40A5 +:107DD00080239B0513433351012000F0E7F9335909 +:107DE0005B005B0833510548DFE70548DDE7C04627 +:107DF000D45F010800002640FFFFFFCF02004A00C9 +:107E000001004A00F0B587B01422002101A802F059 +:107E1000E8FB01A8FFF730FEFFF76EFD002807D052 +:107E200001AB9B7B022B01D0012302E0002300E089 +:107E3000002301AA019E94882000D279002A1FD035 +:107E40000225002B1ED000281DD00020FFF7F4FCD7 +:107E500032000023002101F087F906000F002A00FC +:107E600000232000002101F07FF902000B00CC0765 +:107E70004008204349088019794101F055F902E092 +:107E80000125DEE7002007B0F0BD0000F0B585B0A9 +:107E900004002E4B1B683F229A5C002A53D0002816 +:107EA00052D03E229B5C834200D801BE274B1A6809 +:107EB0003F23D35CA34201D2002045E005220021EC +:107EC00002A802F08EFB02A92000FFF711FF20009C +:107ED000FFF768FE002807D002AB1B79022B01D008 +:107EE000012302E0002300E0002302AA167857785D +:107EF00038009578002B24D0002F25D0002D01D1FB +:107F0000280021E02000FFF797FC32000023002129 +:107F100001F02AF9009001912A0000233800002185 +:107F200001F022F902000B00CC0740082043490869 +:107F3000009C019D24184D412000290001F0F4F817 +:107F400002E0002000E0002005B0F0BDD45F010891 +:107F500010B504000D4B1A683E23D35C834200D851 +:107F600001BE002C09D0094B1A683F23D35CA34201 +:107F700008D22000FFF760FC10BDFFF743FF002888 +:107F8000FAD1F6E72000FFF781FFF8E7D45F010898 +:107F900070B50600FFF76AFB05000124844030003D +:107FA000FFF732FBFFF7D4FF64082018E84070BDEC +:107FB00010B50020FFF7ECFF0400FFF7B5FA411CF5 +:107FC0004808001900F03AFF10BD10B5FFF7F0FFA8 +:107FD0000400FFF729FA411C4808001900F02EFFA1 +:107FE00010BD000030B5194B1B682C229A5C1F2A6B +:107FF00015D884080722250095432A1E22D1033272 +:108000001040C000FC3282401B682033A4001B19C2 +:108010001C688140614011406140196012E03C22BF +:108020009A5E0BB29A420ED007230340074A1268A9 +:10803000126880200006184380239B019C466144FF +:108040008900885030BD01BEEEE7C046D45F01080C +:1080500010B50A4B1B682C229A5C1F2A0AD91A6891 +:1080600080239B019C46614489008B585B005B0820 +:108070008B5010BD998FFFF7B5FFFAE7D45F010869 +:10808000094B9A68094B9A4204D010308000084B83 +:10809000C0587047002905D01030044A8300985812 +:1080A0009950F6E701BEF7E700ED00E00000000898 +:1080B00000000010F0B5C64600B582B0041E019164 +:1080C0004FD04368032B00D901BE0023E05E002897 +:1080D00025DA254E0023E25E6168002A24DB93083E +:1080E000224DC0339B005859804603273A40D200A6 +:1080F000FF208446070097404046B84307008901A7 +:1081000060460840904038435851194B9A68194BC3 +:108110009A4220D0300002B080BCB846F0BD6188E1 +:10812000FFF760FF0026D5E70F231340083B9B08AD +:1081300006339B000E48844663445F680320024078 +:10814000D200FC3005009540AF43890108409040C3 +:1081500038435860D9E70023E05E0199FFF790FFAC +:10816000D8E7014ED6E7C0460100560000E100E026 +:1081700000ED00E00000000810B5040006E0084B28 +:108180001868F8F701FA074B9C46644480231B02E9 +:108190009C42F4D8044B18686043F8F7F5F910BD19 +:1081A0008C0000080080FFFF9000000810B5034B12 +:1081B0001B785843F8F7E8F910BDC0469400000852 +:1081C00010B5FFF7D9FF10BD10B5FFF7EFFF10BDD9 +:1081D000054B802212069A649B6C002B01DB002069 +:1081E00070470248FCE7C0460000274003004600F5 +:1081F0000D4B8022120198585B68FF221A4202D070 +:108200008023DB021843084A084BD3581B0402D0D2 +:1082100080235B021843044A044BD3581B0C02D042 +:1082200080239B021843704700002640040800008A +:10823000FEE7000010B50A4B0268DA6142681A6274 +:1082400082685A62C2689A620269DA6242691A6393 +:1082500082695A63C2699A63FFF7EAFF10BDC0469C +:1082600038070008F0B5C64600B5002833D01923FA +:108270008B429B415B42314C22681668AC27D25B33 +:10828000B61832680325AA432B401A433260266889 +:108290003268F65B92191768294E374017602768D5 +:1082A0003A689046AE229446BF5A3A004244176854 +:1082B000AF433B431360226813686446125B9B180C +:1082C0001A6832401A60002807D010291DD92129C8 +:1082D00027D801221AE06423CAE7184B1B685522ED +:1082E0009A5C8A421FD256229A5C8A421DD2572239 +:1082F0009A5C8A421BD258229A5C8A4219D259222D +:108300009B5C8B4217D3553A00E000220B4B1B6855 +:1083100059680B680F20834313430B6080BCB84639 +:10832000F0BD0222F2E70022F0E70122EEE702228E +:10833000ECE70322EAE70522E8E7C046D45F01083C +:10834000FFFCFFFFB0235B055B78002B04D0B0235C +:108350005B055878C0B270472120FCE7B0235B056D +:108360009B899BB2002B04D0B0235B05988980B217 +:10837000704780204000FBE770B5FFF7EFFF8023D8 +:108380005B0098421AD0B0204005174BC358174ADB +:108390001340174C21680A689C25495952181168E6 +:1083A000C025AD0029400B43136022681368A0214B +:1083B00052589B180F4A82581A6070BD0C4B1A68AD +:1083C00011689C20125889180A680F24A2439A3811 +:1083D00002430A601B681A68A0215B58D218136810 +:1083E000A34303431360E8E748180000FFFCFFFFC6 +:1083F000D45F01084418000070B5FFF7AFFF802379 +:108400005B0098421AD0B0204005134BC358134A62 +:108410001340134C21680A689C2549595218116869 +:10842000C025AD0029400B43136022681368A021CA +:1084300052589B180B4A82581A6070BD084B1A6834 +:1084400013689C2152589B181A68074911408022D2 +:10845000D2010A431A60F0E750180000FFFCFFFF4A +:10846000D45F01084C180000FF8FFFFF10B5FFF725 +:1084700075FF80235B00984212D0B02252050F4B4B +:10848000D3580F4A13400F4A11680A689C200958B4 +:1084900052181168C020800001400B43136010BDCA +:1084A000084B1A6813689C2152589B181A68064991 +:1084B0001140C022D2010A431A60F0E71C180000E4 +:1084C000FFFCFFFFD45F0108FF8FFFFF70B5FFF7D0 +:1084D00045FF80235B0098421BD0B0204005184B1D +:1084E000C358184A1340184C21680A689C254959FA +:1084F00052181168C025AD0029400B431360226853 +:108500001368A02152589B18C122520182581A6048 +:1085100070BD0D4B1A6811689C20125889180A68A2 +:108520000F24A243993802430A601B681A68A021ED +:108530005B58D2181368A34303431360E8E7C046AF +:1085400024180000FFFCFFFFD45F010870B5204B2A +:108550001A6813689C2152589B181C68C02000019F +:108560000440FFF7FBFE80235B0098421FD01849B0 +:10857000086803689C2280581B181868154D28400D +:1085800018600868036880581B181D68C0263601EB +:108590003000A04305431D6009680B688A589B188A +:1085A00018683040001B431E9841C0B270BD0020C7 +:1085B000FCF7A4FE0400FFF7C5FE222803D8002C18 +:1085C00003D10120F2E70120F0E70020EEE7C046EA +:1085D000D45F0108FFF3FFFF70B584B006000D0003 +:1085E000022804D9042802D0032800D001BE6B1E43 +:1085F000DBB2012B04D9042D02D0082D00D001BE1E +:10860000B300294A9C58042D1FD0012D1FD0022DE4 +:1086100033D026006469002CFBD1002034E064696B +:10862000002C18D0214B984213D0A3682B42F6D1CE +:10863000E3681A6802925B6801930393290002A819 +:10864000236898471A4B1C60E9E70020E8E7002000 +:10865000E6E7012DE9D1012D01D004B070BD134B27 +:10866000984204D0B600134B0022F250F5E7B60052 +:108670000F4B1A680F4BF250EFE70D4B1E68002EA0 +:10868000CBD03669C9E73669002EE6D0B3682B42F5 +:10869000F9D1F3681A6802925B6801930393290089 +:1086A00002A833689847EEE754600108FF004200D3 +:1086B000506001083C600108F0B5C64600B50700EF +:1086C000012800D901BEFFF73DFE85B2FFF746FE47 +:1086D00006000020FCF712FE041E17D180235B0069 +:1086E0009E4201D02A4C12E0222D42D8294B1B6811 +:1086F000586829494358294A134098463A06802326 +:108700005B041A4043461343435000E0204C80234F +:108710005B009E422FD080235B009E4225D01D4BE4 +:108720001A683323D35C002B00D101BE194B1B68A0 +:108730001D6A80235B009E4220D0002F24D0184A5F +:1087400001212800FCF784FB00280ED1114B1A6888 +:10875000BC23D3585B191B68002BF7DBEB681B0E9F +:108760001B06A0221206934210D0200080BCB846FF +:10877000F0BD074CCBE7222DD1D8CCE7002F01D09C +:10878000084ADDE7084ADBE7084AD9E70400ECE7D6 +:1087900004004200D45F010818F00000FFFFFFFE54 +:1087A0000300000C01010030010000300100000C4A +:1087B00000283DD01F4B1B6888229A5819688C46A8 +:1087C0006244126802628C229A5819688C4662448C +:1087D0001268426246229A5C002A28D0E0229968F8 +:1087E0008A58D20623D5DA68F223DB01D358036016 +:1087F000104B1B68F022D201D9688A5842600E4A99 +:10880000D9688A5882600D4AD9688A58C2600C4A71 +:10881000D9688A5802610B4AD9688A5842610A4A63 +:10882000D9688A588261DA68084BD358C3617047A7 +:1088300001BEBFE7D45F010804780000087800009B +:108840000C78000010780000147800001878000000 +:1088500010B500283BD01F4B19680A6888240959B5 +:108860005218016A116019680A68043409595218CB +:10887000416A11601B6846229A5C002A26D0E022D9 +:1088800099688A58D20621D5F022D201D968446865 +:108890008C50114AD96884688C50104AD968C468D1 +:1088A0008C500F4AD96804698C500E4AD9684469C3 +:1088B0008C500D4AD96884698C500C4AD968C469B7 +:1088C0008C50DA680168F223DB01D15010BD01BE83 +:1088D000C1E7C046D45F01080478000008780000B2 +:1088E0000C78000010780000147800001878000060 +:1088F000F0B5C64600B50700FFF724FD0500012FBF +:1089000000D901BE7E4B5B68002B00D187E00121BE +:108910000120FFF761FE041E72D1F7F73EFE06004C +:10892000774B5B68002B03D004210120FFF754FE36 +:10893000744B1A68136ABA21515ACA00521A9B180A +:108940001A68002AF4DADB68DA0000D569E08020D2 +:10895000800518436B4B1B68BA215D5AEA00521B15 +:108960001D6AAC466244D060585AC200121A186A96 +:1089700084466244002050601A6A595ACB005B1A40 +:10898000D3185B68FFF7EAFC80235B00984200D1B4 +:108990007FE05C4B1A683323D35C002B00D101BE0F +:1089A000584B1A68116ABC23D3585B181B68002BFC +:1089B00000DB72E0544C534B1A68136ABA21515AC7 +:1089C000CA00521A9B181A68002AF4DADD68EB0014 +:1089D00000D581E04D4B1D404A4B1B68BA21585AC7 +:1089E000C200121A186A84466244D5601A6A595A3B +:1089F000CB005B1AD31800225A603000F7F7D1FD84 +:108A0000002C00D06DE03E4B5B68002B03D00821AA +:108A10000120FFF7E1FD200080BCB846F0BD002436 +:108A20007BE71B0F1B0798463948FFF7C1FE212D36 +:108A300018D0344D2B68196888229B58C9180B68C8 +:108A400034480340783213430B6029680B688C2547 +:108A500049595B18196801400A431A602C4B424679 +:108A6000134374E7274D2B68196888229B58C9184F +:108A70000B68284803409022120113430B602968B9 +:108A80000B688C2549595B18196801400A431A6024 +:108A9000E4E7380005F000FA8DE73323D35C012BBF +:108AA00000D801BE174B1968BA23CA5A0B6A9C46F4 +:108AB0006244BC23CB589B181B68002B0ADB164A68 +:108AC000136904210B431361012F01D030BF72E7FA +:108AD00020BF70E70C4C6EE728010009FFF7B8FED5 +:108AE00078E7074B5B68002B03D002210120FFF7DA +:108AF00073FD054B9C4200D18DE7084C8BE7C046C7 +:108B000054600108D45F010805004200FFFFFFDF49 +:108B100014600108FF00FFFF00ED00E0FF004200CD +:108B2000074A084BD3581F200340B0214905E822CB +:108B3000D200885CC01A431E9841C0B27047C0463C +:108B4000000026401CFF0000044B186880231B0413 +:108B5000184043425841C0B27047C046000026400A +:108B600010B5FFF7F1FF002810D01C4A13681C490C +:108B70000B4013600820FFF719FB6423174A1268A3 +:108B8000002A09DB002B07D0013BF7E7134A1368E3 +:108B900014490B401360EDE7002B01D1124810BDC2 +:108BA0000E4A136811490B4013600120FFF7FEFACB +:108BB000FFF7CAFF002801D10020F0E7FFF7B0FF60 +:108BC000012801D00020EAE7B0225205084BD15815 +:108BD000024A084BD1500020E1E7C0460000264081 +:108BE000FFFFFBACFFFFFBAD02004200FFFFFFFBFE +:108BF00010180000307F000010B5FFF7A5FF002817 +:108C000008D0054B054A10681840C01A4342584125 +:108C1000C0B210BD024BF5E700000453000026402F +:108C200000000452F8B50400012800D901BEFFF786 +:108C30008DFC002802D12D4D2800F8BDF7F7ADFCC2 +:108C40000600002C14D12A4A2A4B0021D150B02210 +:108C50005205E823DB00D75CFFB20120FFF72CFDB3 +:108C6000051E02D0002D2AD11DE0FFF785FBF9E794 +:108C7000FFF7C2FF002826D01D4A1E4B5021D150BD +:108C8000B02252051C4BD75CFFB219491B4A8B58C6 +:108C90001F208343143803438B500838FFF786FAAC +:108CA000FFF7AAFB00251248144943581F2293439B +:108CB0003A4013434350002C0DD1FFF7D7FB30004F +:108CC000F7F76FFCB8E7B02252050D4BD158084AB0 +:108CD000084BD150D4E70720FFF768FAFFF7F6FBFF +:108CE0000020FFF7E9FC0500E9E7C0460300420069 +:108CF00000002640307F0000410700001CFF0000FC +:108D000010180000084B5A6C120AFF2313403A2B2C +:108D100000D0704704494B6C044A1A40E8239B0179 +:108D200013434B64F5E7C04600002740FFC5FFDF53 +:108D300004494B6C044A1A40E8239B0113434B64DB +:108D40007047C04600002740FF00FFFF042810D0F6 +:108D500000060B4B1A681368A42152589B18C022B6 +:108D6000920410401860074A1368A0398B431360BF +:108D70007047044A136804210B431360F8E7C046A8 +:108D8000D45F010810E000E0044AC0235B00D05823 +:108D9000800F431E9841C0B27047C0460000264075 +:108DA0000749C02252008B589B009B088020C005B9 +:108DB00003438B50885880231B0603438B50704716 +:108DC0000000264010B5040080235B02984200D3C7 +:108DD00001BEFFF7D9FF002809D1054AC4235B0073 +:108DE000D058000C00042404240C0443D45010BDBB +:108DF0000000264010B504000F2800D901BEFFF77F +:108E0000C3FF00280BD10649C42252008B580548E5 +:108E100003402404F020000304401C438C5010BD88 +:108E200000002640FFFFF0FF034AE023DB000121A2 +:108E3000D150D3587047C046000026400022430856 +:108E40008B4274D303098B425FD3030A8B4244D312 +:108E5000030B8B4228D3030C8B420DD3FF22090254 +:108E600012BA030C8B4202D31212090265D0030B13 +:108E70008B4219D300E0090AC30B8B4201D3CB0309 +:108E8000C01A5241830B8B4201D38B03C01A52414B +:108E9000430B8B4201D34B03C01A5241030B8B424D +:108EA00001D30B03C01A5241C30A8B4201D3CB0238 +:108EB000C01A5241830A8B4201D38B02C01A52411D +:108EC000430A8B4201D34B02C01A5241030A8B4220 +:108ED00001D30B02C01A5241CDD2C3098B4201D338 +:108EE000CB01C01A524183098B4201D38B01C01AB6 +:108EF000524143098B4201D34B01C01A524103092D +:108F00008B4201D30B01C01A5241C3088B4201D3DB +:108F1000CB00C01A524183088B4201D38B00C01A88 +:108F2000524143088B4201D34B00C01A5241411AAF +:108F300000D20146524110467047FFE701B50020BC +:108F400000F0F0F802BDC0460029F7D076E7704780 +:108F500003460B437FD4002243088B4274D303099A +:108F60008B425FD3030A8B4244D3030B8B4228D33B +:108F7000030C8B420DD3FF22090212BA030C8B4261 +:108F800002D31212090265D0030B8B4219D300E001 +:108F9000090AC30B8B4201D3CB03C01A5241830B86 +:108FA0008B4201D38B03C01A5241430B8B4201D336 +:108FB0004B03C01A5241030B8B4201D30B03C01A5F +:108FC0005241C30A8B4201D3CB02C01A5241830AD9 +:108FD0008B4201D38B02C01A5241430A8B4201D308 +:108FE0004B02C01A5241030A8B4201D30B02C01A32 +:108FF0005241CDD2C3098B4201D3CB01C01A524199 +:1090000083098B4201D38B01C01A524143098B4221 +:1090100001D34B01C01A524103098B4201D30B010A +:10902000C01A5241C3088B4201D3CB00C01A52412F +:1090300083088B4201D38B00C01A524143088B42F4 +:1090400001D34B00C01A5241411A00D2014652418D +:10905000104670475DE0CA0F00D04942031000D3AC +:109060004042534000229C4603098B422DD3030A01 +:109070008B4212D3FC22890112BA030A8B420CD311 +:10908000890192118B4208D3890192118B4204D33A +:1090900089013AD0921100E08909C3098B4201D3BA +:1090A000CB01C01A524183098B4201D38B01C01AF4 +:1090B000524143098B4201D34B01C01A524103096B +:1090C0008B4201D30B01C01A5241C3088B4201D31A +:1090D000CB00C01A524183088B4201D38B00C01AC7 +:1090E0005241D9D243088B4201D34B00C01A52419E +:1090F000411A00D20146634652415B10104601D32B +:109100004042002B00D54942704763465B1000D3B4 +:10911000404201B5002000F005F802BD0029F8D05A +:1091200016E770477047C046002B11D1002A0FD1B7 +:10913000002900D1002802D00021C943080007B44B +:10914000024802A14018029003BDC046D9FFFFFFAC +:1091500003B4684601B5029800F052F8019B9E46A0 +:1091600002B00CBC7047C046F0B5CE46474680B54D +:10917000070099463B0C9C4613041B0C1D000E0077 +:1091800061460004140C000C45434B4360436143AB +:10919000C0182C0C20188C46834203D980235B0214 +:1091A0009846C444494679437243030C63442D04F2 +:1091B0002D0CC918000440198918C0BCB946B04626 +:1091C000F0BDC04670B500220C4B04000D0001F04C +:1091D00005F8002804D12000290000F065FF70BDCB +:1091E000064B00222000290000F0CCFB00F05CFFC1 +:1091F00080231B069C466044F1E7C0460000E04126 +:10920000F0B557464E464546DE46E0B504000D0033 +:109210009246994683B08B4230D82DD0494650466D +:1092200001F004F829000600200000F0FFFF331AC7 +:109230009846203B9B4633D45A4653469340424679 +:109240001F00534693401E00AF423AD8AF4200D1B0 +:1092500078E05B46A41BBD41002B00DA75E00022DC +:1092600000230092019301235A4693400193012366 +:1092700042469340009328E08242CFD90022002347 +:10928000009201930C9B002B01D01C605D60009844 +:10929000019903B0F0BCBB46B246A946A046F0BD5A +:1092A000424620239B1A5246DA40414613004A4662 +:1092B0008A40170042461F43534693401E00AF4268 +:1092C000C4D900220023009201934346002BD9D039 +:1092D000FB0772081A4346467B080EE0AB4201D1F9 +:1092E000A2420CD8A41A9D41012024196D410021ED +:1092F000013E24184D41002E06D0AB42EED9013E6E +:1093000024196D41002EF8D1009801995B4600198F +:109310006941002B24DB2B005A464446D3402A00E7 +:10932000E2401C005B461500002B2ADB26009E4015 +:10933000330026004746BE403200801A9941009013 +:1093400001919FE7A342BCD883E742462023002136 +:109350009B1A0022009101920122DA40019286E7D5 +:10936000424620239B1A2A0046469A402300F34097 +:10937000444613432A00E2401C005B461500002BC4 +:10938000D4DA42462F002023260097409B1ADE4065 +:109390003B003343CDE7C046F0B557464E46454601 +:1093A000DE46E0B5814605000C03480092461F00EA +:1093B00085B0240B400DCE0F002800D156E1D44BD0 +:1093C000984200D172E16B0FE4001C4380231B0420 +:1093D00023439846CF4BED009B4600239946834498 +:1093E00000933C037B005046240B5B0DFF0F002BCA +:1093F00000D11FE1C64A934200D162E1C549420F44 +:109400008C46E40059461443802263441204CB1A6C +:1094100014439B46C200002033007B409A464B46D3 +:109420000F2B27D8BC499B00CB589F46B246009BC8 +:10943000022B16D0032B00D18EE2012B00D0D9E0F5 +:1094400000230024002552461B052343D207134363 +:109450002800190005B0F0BCBB46B246A946A0469C +:10946000F0BD00240025AA4BEDE7BA46A046150042 +:109470000090DCE7444500D2C7E100D1C2E10123FE +:109480005B429C462E0040460025E3442302140E16 +:109490001C431B0C994623041F0C120249460092E0 +:1094A0000197FFF751FD02007A430B04310C80460F +:1094B00019438A4207D901235B429C460919E044BB +:1094C0008C4200D807E2881A4946FFF73DFD09049F +:1094D0008C4631046646019A090C4243030031432D +:1094E0008A4204D90919013B8C4200D8EDE1881A5F +:1094F000424612041A4390464146009B0E041B0C40 +:109500001F000293009B360C1B04190C0B007343C5 +:10951000120C7E43039151437A431F0CBC467618CC +:109520006644B14203D9802149028C466244310C21 +:109530008A1831041E04360C8E19904202D312D1BF +:10954000B54210D24346591E009B9C4665441F00FD +:109550009D429B415B421B19C018844200D2A0E18E +:1095600000D19BE18846AE1BB542AD41801A6D42E9 +:10957000401B844200D1D5E14946FFF7E5FC019A42 +:109580000B044243310C050019438A4200D96CE1B7 +:10959000881A4946FFF7D8FC019A36044243090469 +:1095A000360C03000E43B24200D953E10398B61AB9 +:1095B00002002D041D43029F2B041B0C5A437B43C6 +:1095C0009C46290C4843130C8444634479439842D5 +:1095D00003D98020400284466144180C12041B0405 +:1095E000120C41189B188E4200D2FFE000D1FAE025 +:1095F00001231D43494A5A44002A00DCAAE06B07B4 +:1096000000D03DE1ED084346DB0106D54246444B20 +:109610001A4090468022D2005A44424B9A4200DDC2 +:109620001FE743465B071D43434652055C02240B7C +:10963000530D08E75246224300D17BE0002C00D1B5 +:10964000FAE0200000F0D4FD02000B3A1D230100D7 +:109650009B1A52460839DA408C40144352468A40DD +:10966000314B58449B4683440020D5E64B46234368 +:10967000984644D0002C00D1CEE0200000F0B8FD88 +:10968000010002000B391D235B1A49461000D94026 +:10969000083884400B004D462343984685402348B4 +:1096A000831A9B460023994600939AE64B46234330 +:1096B00098461DD108239946063B00258346009312 +:1096C0008FE65246224309D1022349461943184BDB +:1096D00089469C4600240220E3449DE603234A4633 +:1096E0001A43134B91469C4652460320E34493E6AB +:1096F0000C239946093BA0468346009371E6042358 +:10970000994600239B4601330025009369E6C04635 +:10971000FF07000001FCFFFF74F20010FF030000D0 +:10972000FFFFFFFEFE070000F30300000DFCFFFF3C +:1097300001F8FFFF4946012319438946002401200F +:109740006AE6002380249A4600258A4B24037AE6A1 +:1097500001256D4201239B1A382B00DD70E61F2B7B +:1097600000DCBFE01F2149428A1A4146D1400A006D +:10977000202B04D04146804B5B4499400D436B1E27 +:109780009D4107232A431D0000241540134200D1A8 +:10979000D4E00F2100231140042900D1CBE0111D9A +:1097A0009142924152429B180A00190200D4C2E031 +:1097B00001230024002546E6802341461B0319426D +:1097C00008D01C4206D11C432403BA461500694B3D +:1097D000240B38E68024434624031C432403B2466A +:1097E000644B240B2FE6002B00D103E7A619681E5B +:1097F000A64200D28DE08E4200D2A3E000D1B3E0B9 +:109800000500F5E6AA4200D939E64346DE075808C6 +:109810006B081E43ED0739E6484600F0E9FC0100FD +:109820000200153120321C2900DC2CE74B46083899 +:1098300083400025984632E700F0DAFC03001A0066 +:10984000153220301C2A00DC00E75446083B002279 +:109850009C4005E73619013BB44200D9A6E6B24266 +:1098600000D8A3E6831E3619A0E60919013D8C42F3 +:1098700000D98DE68A4200D88AE6851E091987E656 +:109880000F232B40042B00D1BCE605235B42AB42E7 +:109890009B4104355B42ED089844B4E6AF4200D9E1 +:1098A00060E6824204D800D05CE6AE4200D859E6B9 +:1098B00002235B429C46009BE0449C4665449D42DB +:1098C0009B415B421B19C0184DE68A4200D80EE648 +:1098D000831E09190BE68A4200D8F4E5831E9846D8 +:1098E0000919F0E52549280059448D4042468A402F +:1098F000691E8D414146D840D94002432A430B009E +:10990000510700D151E70F211140042900D046E74B +:109910004BE705008E4200D06AE6009A934200D0E1 +:1099200066E667E6164A5A44002A00DC10E701237F +:109930000025984467E65D075B021C0BD2080023F4 +:10994000154380E50098023D42008242BF417F42BC +:109950003C1936190092DDE78024434624031C435A +:109960002403044B240B6EE5009A9A42EAD30500C7 +:10997000D3E7C046FF0700003E0400001E040000BD +:10998000FF030000F8B557464E464546DE46E0B5B3 +:109990001E0017004A000B03520D5B0A9046420F4F +:1099A0001A43CD0FCD4C3103C300944670007A0F9B +:1099B000490AFF009A46B946400DF60F1143A042EE +:1099C00000D1B1E001225640B346B54200D188E053 +:1099D0004246121A002A00DCAEE0002800D1C1E0A5 +:1099E000BE48804500D151E1802000040143382A5F +:1099F00000DD7BE11F2A00DDEEE120203E00801A21 +:109A00000C00D640D140874062468440521A781EEE +:109A10008741944634432743DC1BA3429B41624663 +:109A20005B42D31A99464B461B0200D418E14B46C1 +:109A30005802430A99464B46002B00D137E148466D +:109A400000F0D6FB010008392023220048465B1AAB +:109A5000DA4088408C4043461043884500DD36E1BB +:109A6000C91A4B1C1F2B00DDEAE020222600D21A67 +:109A700001009440DE40D84000239140621E944192 +:109A80008146984631430C43630709D00F23234096 +:109A9000042B05D0231DA342A4416442A1441C0011 +:109AA0004B461B0200D4DEE041468C4B013199420B +:109AB00000D1E7E04B468A48E40803401800490516 +:109AC0005B07400223434A0D040B1205ED072243B6 +:109AD0002A4318001100F0BCBB46B246A946A04676 +:109AE000F8BD4246121A002A52DD002800D19CE03F +:109AF000A04500D1CAE0802000040143382A00DDDF +:109B000049E11F2A00DC97E110000E002038C64012 +:109B1000202A04D04020821A91400F43B9464C4677 +:109B2000621E944134433AE10A003A4328D0B346D6 +:109B3000B5422BD06B4A4244002A5DD0424644468F +:109B4000821A002C00D0F5E065461D4300D19CE14F +:109B5000551E012A00D1FBE1604CA24200D1BDE1BB +:109B60002A00F0E00800384300D1C3E0501E012A6B +:109B700000D1A8E1594CA24200D187E0020036E7AB +:109B800001225640B346B54200D021E7554A42442F +:109B9000002A00D1B5E042464446821A002C00D18A +:109BA00038E14E4EB04200D1DEE1802664463604F4 +:109BB0003443A446382A00DD96E11F2A00DD24E262 +:109BC0002026B41AA24664465646B440A1461C005C +:109BD0004E46D440264334005646B3405E1EB34141 +:109BE0001C436346D340C918E419BC42BF417F42BD +:109BF000B94680468944D8E040463B4C013020427B +:109C000000D0B4E04046002800D044E1604618434C +:109C100000D190E10800384300D0AAE16146DB089A +:109C200049070B436146CC0827E00800384361D060 +:109C3000501E012A00D139E1A24227D002005DE77F +:109C400002001F39CA401100202B03D04022D31A32 +:109C500098400443631E9C410023994698460C4358 +:109C6000630700D012E74B464A46E4085B072343EC +:109C7000D408424619498A420ED024035205240BC7 +:109C8000520D22E70A00002400231EE7DB0862468B +:109C9000520713436246D4081A00224300D1FCE164 +:109CA00080221203144324030C4A240B0DE72000E6 +:109CB00000F09EFA010018311F2900DCC4E60838C4 +:109CC0008440434620000024884500DCC8E6044A5E +:109CD0005B1A104098468146D6E6C046FF07000052 +:109CE000FFFF7FFF01F8FFFFFE0700000F437A1E12 +:109CF000974191E66146DB0849070B436146CC0872 +:109D0000B8E74046D34C0130204200D0A2E04046A4 +:109D1000002800D001E16046184300D15EE1080050 +:109D2000384300D05FE16146DB0849070B436146D9 +:109D3000CC08A2E7C84DA84200D1CFE080256446F8 +:109D40002D042C43A446382A56DC1F2A00DDD1E01E +:109D500020251E00AD1A6446AB40AC40D6405D1EC7 +:109D6000AB41344323436446D440091B49E0604679 +:109D7000DC1B461AA34280414042814630004E46D9 +:109D8000801B8146000276D44B46234300D052E626 +:109D90000024002571E739430C00621E9441E41849 +:109DA0009C429B415B42634499464B461B0200D454 +:109DB00056E701239C46A84BE044984538D04B46D3 +:109DC000A648012203401800630814401C43C3073F +:109DD0001C434308994657E610000E002038C64041 +:109DE000202A04D04020821A91400F43B9464F46A2 +:109DF0007A1E974137430FE662461A4313005A1EF4 +:109E00009341FC1AA742BF417F42CB1B99465D4656 +:109E1000804608E666461E4300D1BEE0561E012A73 +:109E200000D109E18C4CA24200D119E13200C1E617 +:109E300042460024002348E620200C00801A3E0001 +:109E400087408440D640781E8741D14034433C430C +:109E50008C44A4E7804A904200D1E9E0DF199F4298 +:109E60009B4161445B42C918CC077F084B08994667 +:109E700080463C43F4E6FC1AA742BF4163467F425A +:109E8000C91ACB1B99465D46D5E5FF084B075D46D1 +:109E90003B43CC08EEE662461A4300D082E00B005A +:109EA0003B431BD1802400252403F9E6DC199C42A6 +:109EB0009B41614489465B4299444B461B0244D412 +:109EC00001239846CCE6DC1B6246A3429B41511A13 +:109ED0005B42CB1A994601239846A4E5FF084B073D +:109EE0005D463B43CC08D7E662461A431400631E26 +:109EF0009C4179E615006446203DEC40A046202AAE +:109F000005D040256446AA1A944023439A465446F5 +:109F1000631E9C414346234373E762461A4323D0A2 +:109F20000A003A4300D0A0E06246DB085207134320 +:109F30006246D408B0E60B003B4300D128E7FF0897 +:109F40004B075D463B43CC0897E60223984636E72D +:109F5000FC1AA742BF4163467F42C91ACB1B9946F0 +:109F600001235D4698465EE54B07FF083B43CC085E +:109F700092E6DC1B6046A342B641401A7642801B43 +:109F80008146000260D5FC1AA742BF4163467F426A +:109F9000C91ACB1B99465D4676E5FF084B073B4344 +:109FA000CC0867E60A00DB083A4300D16FE6624658 +:109FB000520713436246D40880221203144207D08A +:109FC000C808104204D15D460400FB0849070B4352 +:109FD0005A0FDB00DB08520713435DE64B07FF080F +:109FE0003B43CC0849E6DC199C429B4161448946CD +:109FF0005B4299444B461B0200D431E64A46174B5C +:10A000001A400123914698462AE616006446203EEF +:10A01000F440A046202A05D040266446B21A944057 +:10A0200023439A465446631E9C4143461C43DBE54A +:10A0300002000024002348E5DC19BC42BF41614412 +:10A0400089467F42B94438E74B46234300D19FE617 +:10A0500006E6C046FE070000FF070000FFFF7FFF87 +:10A06000FF084B073B43CC0816E66246DB08520765 +:10A0700013436246D40880221203144207D0C80852 +:10A08000104204D15D460400FB0849070B435A0FF8 +:10A09000DB005207DB081343FEE50023014A1C00E6 +:10A0A00013E5C046FF0700000A0030B5134C53000B +:10A0B00009030500090B00205B0DD20FA34204DD4C +:10A0C0000F48834202DD0F4BD01830BD8020400383 +:10A0D00001430D48C01A1F2808DD0C48C31AD94097 +:10A0E0000B005842002AF0D11800EEE7084CC5409A +:10A0F000A446634499400B002B43F2E7FE030000A3 +:10A100001D040000FFFFFF7F330400001304000064 +:10A11000EDFBFFFF70B5002816D0C317C5185D40D2 +:10A12000C40F280000F064F8114A121A0A2816DC3D +:10A1300003002E0015339E400B23181AC54052050C +:10A140002D032D0B530D03E00024002300250026D2 +:10A150001B052B43E40723433000190070BD0B3867 +:10A16000854052052D0300262D0B530DF0E7C04608 +:10A170001E0400008446100062468C4619006346A7 +:10A1800000E0C0461FB500F005F9002801D4002109 +:10A19000C8421FBD10B500F055F84042013010BD57 +:10A1A00010B500F0F7F8002801DB002010BD0120F9 +:10A1B00010BDC04610B500F0EDF8002801DD00200C +:10A1C00010BD012010BDC04610B500F07DF800287C +:10A1D00001DC002010BD012010BDC04610B500F00C +:10A1E00073F8002801DA002010BD012010BDC04620 +:10A1F0001C2101231B04984201D3000C10391B0AB7 +:10A20000984201D3000A08391B09984201D300097A +:10A21000043902A2105C40187047C04604030202D1 +:10A2200001010101000000000000000010B500293C +:10A2300003D1FFF7DDFF203002E00800FFF7D8FF71 +:10A2400010BDC046F0B54E464546DE4657469046E0 +:10A25000E0B517001A03120B0500844619480E03D7 +:10A260004C0091465A00DB0F9B46360B640DC90F1C +:10A27000520D844219D0824210D0012094420ED156 +:10A280004E450CD10120C44509D1594517D0002CA9 +:10A2900005D130002843431E984100E00120F0BC66 +:10A2A000BB46B246A946A046F0BD330001202B4371 +:10A2B000F5D1A242F3D14B463B43F0D1E2E7002077 +:10A2C000EDE7C046FF070000F0B54746CE46040064 +:10A2D000180016001B031B0B2D4D4A00994680B534 +:10A2E00043000F03A446B0463F0B520DC90F5B0D50 +:10A2F000C00FAA4221D0AB4213D0002A22D13C4346 +:10A30000002B02D14D462E4322D0002C10D081428A +:10A3100022D00220013908400138C0BCB946B046FD +:10A32000F0BD4D462E4329D1002AF0D13C43EED159 +:10A330000028F2D101204042EFE73D0025431DD126 +:10A340009342EED0002BE2D14C462643DFD1E0E72A +:10A350000020002CE1D0DCE79A420ADCE8DB4F4524 +:10A36000D7D80ED000204F45D7D20029E2D0080020 +:10A37000D3E74342584140000138CEE70220404233 +:10A38000CBE7C445C5D80020C445C6D2EDE7C046DA +:10A39000FF070000F0B54746CE460400180016003F +:10A3A0001B031B0B2C4D4A00994680B543000F033D +:10A3B000A446B0463F0B520DC90F5B0DC00FAA4219 +:10A3C0000DD0AB4210D0002A27D13C43002B11D135 +:10A3D0004D462E430ED10020002C15D00EE03D003E +:10A3E000254310D1934218D14D462E430BD1002A5C +:10A3F00002D13C43002C0BD0814214D00220013901 +:10A400000840013800E00220C0BCB946B046F0BDAB +:10A410000028F9D101204042F6E7002BECD14C4650 +:10A420002643E9D1EAE79A4204DD4342584140001D +:10A430000138E9E79A42EBDB4F45DFD806D0002030 +:10A440004F45E1D20029E5D00800DDE7C445D5D865 +:10A450000020C445D8D2F5E7FF07000030B514004E +:10A460001A00094B05001B6885B0D868074B002C03 +:10A4700001D1074B1C00019300912B000549029468 +:10A4800000F00AF801F07CF8EC010008B4F20010CA +:10A49000EFF20010C1F200100EB403B5010003ABDF +:10A4A000044804CB0068019300F0DAF902B008BC5C +:10A4B00003B01847EC010008F7B553430500170037 +:10A4C000089C01910093002804D08369002B01D1DE +:10A4D00002F030F8274B9C4225D16C68636EDB0795 +:10A4E00005D4A3899B0502D4A06D00F057F8A38979 +:10A4F0001B0722D52369002B1FD00026009B9E42FC +:10A5000022D0019B995DA368013BA360002B04DA74 +:10A51000A269934226DB0A2924D023685A1C2260B0 +:10A5200019700136EAE7144B9C4201D1AC68D5E7BB +:10A53000124B9C42D2D1EC68D0E72100280000F0F9 +:10A54000A7FF0026B042D8D0636EDB0705D4A389ED +:10A550009B0502D4A06D00F022F839003000FEF710 +:10A560006DFCFEBD2200280000F03CFF431CD8D14A +:10A57000EAE7C046F0F4001010F50010D0F4001027 +:10A5800007B5009313000A00010002480068FFF7B6 +:10A5900093FF0EBDEC01000870477047704770478D +:10A5A00010B5034B0100186800F0BCF810BDC046A0 +:10A5B000EC01000830B500240139A24201D100208D +:10A5C00005E0035D01340D5DAB42F6D0581B30BD94 +:10A5D000002310B59A4200D110BDCC5CC4540133A5 +:10A5E000F8E703008218934200D1704719700133D5 +:10A5F000F9E770B5130C0D0C1ED1002B0CD189B2EC +:10A6000094B24C43210000F08DF8051E1BD02200AF +:10A610000021FFF7E6FF16E01D1C0B1C92B289B269 +:10A620009CB25143ABB263430C0C1C19220C07D1F2 +:10A63000240489B20C43E5E7002B01D1131CEDE79C +:10A640000C2300250360280070BD000070B50500D4 +:10A65000002910D00C1F2368002B00DAE418280012 +:10A6600002F096F81D4A1368002B05D16360146050 +:10A67000280002F095F870BDA34208D9216860183F +:10A680008342F3D118685B6841182160EEE71A0035 +:10A690005B68002B01D0A342F9D911685018A04281 +:10A6A0000BD120680918501811608342E0D1186856 +:10A6B0005B68411811605360DAE7A04202D90C23AD +:10A6C0002B60D5E721686018834203D118685B6866 +:10A6D0004118216063605460CAE7C0466C6001089D +:10A6E00070B50F4E0D0031680400002902D100F052 +:10A6F0005FFE30602900200000F05AFE431C0AD0A3 +:10A700000323C51C9D43A84207D0291A200000F04E +:10A710004FFE431C01D101256D42280070BDC0468B +:10A7200070600108F7B50322CB1C93430833060081 +:10A730001F000C2B32D20C27B94231D8300002F066 +:10A7400027F8324D2B681C00002C2ED13900300028 +:10A75000FFF7C6FF0400431C1ED12C682500002D06 +:10A760004AD123682900E3183000019300F020FE4D +:10A77000019B834243D123680337FF1A03239F437E +:10A7800008370C2F00D20C2739003000FFF7A8FF44 +:10A79000431C34D02368DF19276013E0002BCBDA89 +:10A7A0000C23002533602800FEBD2268D11B20D475 +:10A7B0000B2917D9E2192760A34211D12A606368D7 +:10A7C000116053603000250001F0EAFF07220B35CD +:10A7D000231D9543EA1A9D42E5D05B1BA350E2E797 +:10A7E0005A60ECE76268A34201D12A60EAE75A6046 +:10A7F000E8E723006468A7E72C006D68AFE70C2347 +:10A800003000336001F0CCFFCDE7C0466C6001083A +:10A81000936810B5013B9360002B04DA9469A3425E +:10A8200007DB0A2905D01368581C1060197008004E +:10A8300010BD00F0D7FD0100F9E7F8B506000F00E4 +:10A840001400D518AC4201D1002007E021783A006D +:10A850003000FFF7DDFF0134431CF3D1F8BD0000E9 +:10A86000F0B5A1B006000C001F000392002804D030 +:10A870008369002B01D101F05DFE8E4B9C421CD1FF +:10A880007468636EDB0705D4A3899B0502D4A06DB1 +:10A89000FFF784FEA3891B0702D52369002B1DD176 +:10A8A0002100300000F0F4FD002817D0636EDB07B4 +:10A8B0000DD50120404221B0F0BD7F4B9C4201D11B +:10A8C000B468DEE77D4B9C42DBD1F468D9E7A3890D +:10A8D0009B05EED4A06DFFF762FEEAE7002308AD0A +:10A8E0006B6120336B761033AB760797039F3B7811 +:10A8F000002B01D0252B4ED1039BFB1A0593039B04 +:10A900009F420DD0059B21003000039AFFF795FF71 +:10A91000431C00D1B5E06A69059B944663446B61B2 +:10A920003B78002B00D1ACE001227B1C0393002379 +:10A9300052426A6004A9543252182B60EB60AB603B +:10A940001370AB65039B052219785D4801F014FF75 +:10A95000039B5F1C002820D12A68D30604D553230B +:10A9600004A95B1820211970130704D5532304A9E7 +:10A970005B182B211970039B1B782A2B16D0002102 +:10A98000EB68039F3A78781C303A8446092A4FD9FD +:10A99000002911D117E00137A9E7494B2A68C01AED +:10A9A0000123834013432B600397CBE7079B191DBB +:10A9B0001B680791002B01DB0B9304E05B42EB600B +:10A9C000022313432B603B782E2B0AD17B782A2B52 +:10A9D00037D1079B02371A1D1B680792002B2DDB0E +:10A9E000099303223978374801F0C6FE002807D0C2 +:10A9F000344B2A68C01A40238340134301372B602D +:10AA000039787B1C062230480393297601F0B4FE86 +:10AA1000002845D02D4B002B27D10722079B073359 +:10AA20009343083307936B69049A9B186B615DE746 +:10AA30000A214B4367469B180939A3E701235B4270 +:10AA4000CEE700231A0001376B603978781C303963 +:10AA50008446092903D9002BC3D00992C1E70A23F0 +:10AA60005A4367465218093BEFE707AB00932200B1 +:10AA700029003000164B00F0D7F80490049B0133F6 +:10AA8000D1D1636EDB0705D4A3899B0502D4A06DE9 +:10AA9000FFF785FDA3895B0600D50AE70D980AE755 +:10AAA00007AB0093220029003000094B00F06EFB39 +:10AAB000E3E7C046F0F4001010F50010D0F40010E9 +:10AAC000F4F20010FAF20010FEF2001029AC0010AF +:10AAD0003BA80010F0B51E00002314008BB09E426E +:10AAE00004DA8021090673181E002D23129A149F80 +:10AAF0001370202303229F43462F07D03B00453B82 +:10AB000059424B411099013ACB18109309AB049369 +:10AB100008AB0393139B00920293109B22000193B6 +:10AB2000330000F0BFFD0500472F02D1119BDB076A +:10AB300028D5109BEB180793462F14D12B78302B78 +:10AB40000CD10022002320003100FFF723FB002856 +:10AB500004D10123109A9B1A139A1360139B079A2E +:10AB60001B68D31807930022002320003100FFF751 +:10AB700011FB002801D0079B09933022099B0799FC +:10AB80008B4206D32800099B159A5B1B13600BB000 +:10AB9000F0BD591C09911A70F0E7F0B5831C87B01D +:10ABA000039305000C002B230270002901DA4C42AC +:10ABB00002336B70092C31DD0A2704ABDE1D200047 +:10ABC00039000196FEF7AAFA013E303120003170BB +:10ABD00039000294FEF7BCF9029B0400632BEEDC03 +:10ABE000019B30349A1E13000399147004A8073097 +:10ABF00098420ED804AB073300209A4204D804AB25 +:10AC00000930C018019BC01A039B1818401B07B0DD +:10AC1000F0BD1878013308700131E7E73023E418FC +:10AC2000AB70281DEC70F1E7F0B595B00C000992FF +:10AC30001E001A9D070001F01DFD036818000C930B +:10AC400000F0C8FB00231293237E07220A93236897 +:10AC50000E900D930D992B68C90547D59B1893430A +:10AC60001A0008322A601A685B68A264E364012251 +:10AC7000A36CE56C0B936B005B080F930B98A74BD1 +:10AC80000F99524203F076F8002831D10122A34BEC +:10AC90000B980F995242FFF78DFA002828D1002215 +:10ACA000002329000B98FFF77BFA002803D023002C +:10ACB0002D2243331A700A9B994D472B00D9994D89 +:10ACC00003230D9A236101339A43002322600B93DF +:10ACD000099B21003800009613AA00F0E7F9431CF5 +:10ACE00000D0A2E00120404215B0F0BD0733B6E726 +:10ACF0000B9A2B001000290003F03CF800280BD021 +:10AD0000002D03DA23002D2243331A700A9B864D4F +:10AD1000472BD5D9854DD3E720220A996368914303 +:10AD20000F915A1C49D10733636080230D9ADB00D1 +:10AD300013430022069212AA05920A9A08A90492C5 +:10AD400011AA03922322236001936368521802928E +:10AD5000009338002B000B9AFFF7BCFE0F9B0500F9 +:10AD60001199472B08D1CB1C02DB6368994248DD5F +:10AD70000A9B023BDBB20A930A9B652B24D8200076 +:10AD80001A00013950301191FFF707FF129A0B900A +:10AD900013182361012A02DC2268D20701D501338E +:10ADA0002361232308AA9B181B78002B00D18FE76F +:10ADB00023002D2243331A708AE70F9A472AB4D111 +:10ADC000002BB2D10133AFE70A9B662B1BD163681E +:10ADD00000290DDD2161002B02D12268D20702D5A6 +:10ADE000013359182161119BA36500230B93D8E708 +:10ADF000002B03D101222168114200D09A1C22614C +:10AE0000F1E767230A93119B129A934206DB2268AB +:10AE10002361D207E7D501332361E4E70121002B49 +:10AE200001DC4918C91A5218E9E72268530507D40A +:10AE300023692A0038000999B047431C28D151E7FB +:10AE40000A9B652B00D8E1E0A06CE16C0022002396 +:10AE5000FFF7A0F9002831D001233800344A0999BE +:10AE6000B047431C00D13DE7119B129A934202DB8D +:10AE70002368DB070CD538000E9B0C9A0999B04764 +:10AE80000025431C00D12DE7129B013BAB420ADC9D +:10AE900023689B0700D506E1139BE068984200DB1E +:10AEA00022E7180020E722000123380009991A320E +:10AEB000B047431C00D115E70135E5E7119B002B96 +:10AEC00038DC012338001A4A0999B047431C00D1E5 +:10AED00008E7119B129A134302D12368DB07D7D5E9 +:10AEE0000E9B38000C9A0999B047431C00D1F9E633 +:10AEF00000230A93119B0A9A5B42934201DC129B46 +:10AF000097E722000123380009991A32B047431C01 +:10AF100000D1E7E60A9B0133EBE7C046FFFFEF7F76 +:10AF200005F3001009F300100DF3001011F30010E9 +:10AF300015F30010129AA36D0A929A4200DD0A934B +:10AF40000A9B002B3CDC00230D930A9BDB43DB17A1 +:10AF50000F93A36D0F9A0B930A9B13400B9AD31A6E +:10AF60000D9A934234DC119B129A93423DDB236885 +:10AF7000DB073AD4129A0B9B1199D31A521A0A92F0 +:10AF80009A4200DD0A930A9B002B36DC0A9B0025BF +:10AF9000DB43DB170B93119A129B0B999B1A0A9AAE +:10AFA0000A409B1AAB4200DC72E722000123380002 +:10AFB00009991A32B047431C00D193E60135EAE7FC +:10AFC0000A9B2A0038000999B047431CBBD189E687 +:10AFD00022000123380009991A32B047431C00D1DE +:10AFE00080E60D9B01330D93B3E70E9B38000C9A5E +:10AFF0000999B047431CBDD174E60B9B3800EA1891 +:10B0000009990A9BB047431CC0D16BE6129B012BE8 +:10B0100002DC01231A4234D001232A0038000999A6 +:10B02000B047431C00D15DE60E9B38000C9A09998D +:10B03000B047431C00D155E6A06CE16C0022002310 +:10B04000FFF7A8F800281AD1129B6A1C013B3800B0 +:10B050000999B047431C0ED144E622000123380071 +:10B0600009991A32B047431C00D13BE60135129BC7 +:10B07000013BAB42F1DC22000B9B5032DAE60025AB +:10B08000F5E72A00E3E72200012338000999193285 +:10B09000B047431C00D125E60135E368139A9B1A9B +:10B0A000AB42F0DCF8E60025F7E7C046F7B515003F +:10B0B00001938A680B690C000090934200DA130038 +:10B0C00022002B6043321278002A01D001332B601A +:10B0D00023689B0602D52B6802332B602268062367 +:10B0E00017001F401A4227D0230043331B785A1EF3 +:10B0F00093412268920630D4220001990098089E5C +:10B100004332B047431C25D0062320682A68E168F3 +:10B1100000250340042B03D18D1AEB43DB171D40A0 +:10B12000A3682269934201DD9B1AED180027BD42F6 +:10B1300020D1002010E00137E3682A689B1ABB4247 +:10B14000D2DD2200012301990098089E1932B047F0 +:10B15000431CF0D101204042FEBD3020E1184331B4 +:10B16000087021005A1C45310978A2184332023375 +:10B170001170C1E72200012301990098089E1A323C +:10B18000B047431CE6D00137D1E70000F0B58BB0E3 +:10B1900006920A0043320793059004920A7E0C003F +:10B1A000109B782A07D8622A09D8002A00D1C1E06A +:10B1B000582A00D18CE026004236327022E010007E +:10B1C00063381528F7D802F023F816001F00F6FFA1 +:10B1D000F6FFF6FFF6FF1F00F6FFF6FFF6FFF6FF9D +:10B1E000A80036009A00F6FFF6FFB900F6FF360019 +:10B1F000F6FFF6FF9E0026001A684236111D196000 +:10B20000136833700123A7E0086819680A1D050652 +:10B210000BD50D681A60002D03DA2D23049A6D42B8 +:10B220001370614B0A2703931BE00D681A604106F7 +:10B23000F1D52DB2EFE70D681968081D18602E06CC +:10B2400001D50D6803E06D06FBD50D68ADB2564B18 +:10B25000082703936F2A00D00237230000224333CC +:10B260001A706368A360002B03DB042221689143FA +:10B270002160002D02D1049E002B0CD0049E2800DA +:10B280003900FDF761FE039B013E5B5C33702B00D0 +:10B2900005009F42F3D9082F09D12368DB0706D5A3 +:10B2A00063682269934202DC3023013E3370049BC1 +:10B2B0009B1B2361079B210000930598069B09AA0D +:10B2C000FFF7F4FE431C4CD1012040420BB0F0BD0F +:10B2D00045310A70344A03921A68216820CA1A60FC +:10B2E000080616D5CB0702D5202319432160102765 +:10B2F000002DB2D1202322689A432260ADE720229C +:10B3000009680A4322602200782145321170274AD9 +:10B31000E1E74806E6D5ADB2E4E71A680D68101D0E +:10B320004969186013682E0601D5196002E06D06A0 +:10B33000FBD519800023049E2361BBE71A68111D09 +:10B340001960166800213000626801F015FA0028C3 +:10B3500001D0801B6060636823610023049A13702E +:10B36000A8E72369320006990598079DA847431C62 +:10B37000AAD023689B0715D4099BE0689842A5DAF8 +:10B380001800A3E72200012306990598079E1932A9 +:10B39000B047431C98D00135E368099A9B1AAB4229 +:10B3A000F0DCE9E70025F7E717F3001028F30010B9 +:10B3B000002370B5064D040008002B6002F04EFD1E +:10B3C000431C03D12B68002B00D0236070BDC04606 +:10B3D000746001080023C25C0133002AFBD1581EAF +:10B3E00070470000F8B505000E001400002804D0D6 +:10B3F0008369002B01D101F09DF8224B9C422ED194 +:10B400006C68A369A360A3891B0732D52369002B4D +:10B410002FD023682269F7B2981A6369F6B2834283 +:10B4200005DC2100280000F0E3FF002827D1A368F5 +:10B430000130013BA36023685A1C22601F706369BE +:10B44000834204D0A389DB0707D50A2E05D121004A +:10B45000280000F0CDFF002811D13000F8BD0A4BC4 +:10B460009C4201D1AC68CCE7084B9C42C9D1EC6846 +:10B47000C7E72100280000F00BF80028C9D00126FA +:10B480007642EAE7F0F4001010F50010D0F4001056 +:10B49000374B70B51D6806000C00002D05D0AB6958 +:10B4A000002B02D1280001F045F8324B9C420FD10D +:10B4B0006C680C23E25E93B211072DD4D90611D427 +:10B4C00009230120336037331343A381404270BD09 +:10B4D000294B9C4201D1AC68EBE7284B9C42E8D158 +:10B4E000EC68E6E75B0713D5616B002908D0230001 +:10B4F0004433994202D03000FFF7A8F80023636379 +:10B500002422A3899343A3810023636023692360DA +:10B510000823A2891343A3812369002B0BD1A02107 +:10B520008022A389890092000B40934203D021001E +:10B53000300001F0CBF80C22A35E01201A0099B272 +:10B54000024003420FD00022A26062695242A2610F +:10B55000002022698242BAD10A06B8D5402213439C +:10B56000A3810138B3E7880700D46269A260EFE7DE +:10B57000EC010008F0F4001010F50010D0F40010F9 +:10B58000062010B501F0DAFC012002F075FCF0B5E0 +:10B5900006000B69326987B0002003919A4265DB8F +:10B5A000013B9C0000930B00143305931B1904937B +:10B5B0003300143302931C19049B27681B6838005E +:10B5C0005D1C29000193FDF739FC0190AF4224D3A3 +:10B5D0000025AC460298059F08CF019A99B25143C5 +:10B5E0001B0C534349190A0C9B18026889B292B28A +:10B5F0006244521A01681D0C090C9BB2CB1A11143B +:10B600005B18191492B21B041A43049B8C4604C0A5 +:10B61000BB42E1D22368002B30D03000039901F007 +:10B620004BFB002821DB30000024019B03990133F0 +:10B63000019314301431036820C99AB21419AAB2C4 +:10B64000A21A1B0C2D0C14145B1B1B191C1492B298 +:10B650001B04134308C0049B8B42ECD2009B029A4C +:10B660009B00D3181A68002A15D0019807B0F0BDC6 +:10B670002368002B06D1009B013B0093029B043CF6 +:10B68000A342F5D3009B3361C7E71A68002A06D1AD +:10B69000009A013A0092029A043B9A42F5D3009B29 +:10B6A0003361E2E7F0B59DB002920393029B039CE5 +:10B6B00008930994446A0700259D002C0ED11020A0 +:10B6C000FEF76EFF021E786204D1EA21C74BC8481C +:10B6D000FEF7C4FE446084600460C4607B6A19683D +:10B6E00000290AD05A68012393404A608B603800D1 +:10B6F00001F0A2F800227B6A1A60039B002B20DA7B +:10B7000001232B60039B5B005B080993099DB94BE8 +:10B71000B84A2B40934217D1B74B249A28031360A1 +:10B72000029B000B184301D100F0BFFDB348269BDC +:10B730000690002B02D0B24B269A136006981DB0DB +:10B74000F0BD00232B60E1E7089B099C1293139442 +:10B750001298139900220023FEF71CFD041E09D045 +:10B760000123249A1360A74B0693269B002BE5D058 +:10B77000A54BE1E71AAB01931BAB00933800129A7B +:10B78000139B01F04DFB6E000590760D00D17CE01F +:10B7900012981399139B9D4A1B031B0B1A4311000C +:10B7A0009B4B1894F61800229A4BFEF7EBF89A4A36 +:10B7B0009A4B02F073F89A4A9A4B01F033FD040059 +:10B7C00030000D00FEF7A6FC974A984B02F066F891 +:10B7D00002000B002000290001F024FD04000D00F0 +:10B7E000FEF762FC00220290002320002900FEF7F1 +:10B7F000D7FC00280BD00298FEF78CFC2B0022000F +:10B80000FEF7C8FC43425841029B1B1A02930123D6 +:10B810001693029B162B0FD812981399DA00844BBB +:10B820009B181A685B68FEF7BBFC002849D0029B96 +:10B83000013B0293002316931A9B9E1B00230A933D +:10B840003300013B0D9304D501239B1B0A93002376 +:10B850000D93029B002B36DB029A0D9B94466344AA +:10B860000D93002315920E93229B0124092B64D87B +:10B87000052B02DD0024043B2293229B981E032803 +:10B8800064D801F0BBFC293836581A9B1B9A9E18C5 +:10B89000684BF218202A0FDD40239B1A9D40664B0F +:10B8A0000298F318D840284302F082FA0123634C2F +:10B8B000013E0919189376E7202302989B1A9840B5 +:10B8C000F2E71690B8E70A9B029A9B1A0A93534232 +:10B8D0000E9300231593C7E700230F93239B0C932C +:10B8E0000793002B13DC01231A000C930793239278 +:10B8F0000DE00123F1E70023239A0F939446029B66 +:10B9000063440C9301330793002B00DC01230022D6 +:10B91000786A426004321500143541689D4219D995 +:10B92000380000F045FF0690002817D1D52102000D +:10B93000434B4900CBE60123DEE700230F9422931B +:10B94000013B0C93079300221333D0E701230F939D +:10B95000023BF6E7013141605200DCE77B6A069A60 +:10B960001A60079B0E2B00D9EBE0002C00D1E8E019 +:10B97000029B002B68DD1A000F212D4B0A40D200DC +:10B980009B181D685E68029B1C1102231093029B8A +:10B99000DB050BD52B4B0C401A6A5B6A1298139986 +:10B9A000FDF7FAFC0323089009911093254B14939B +:10B9B000002C08D1089809992A003300FDF7ECFC07 +:10B9C000089009915CE001231C420BD0109B2800D9 +:10B9D00001331093149B31001A685B6801F05EFF1D +:10B9E00005000E00149B64100833E0E747F40010D4 +:10B9F0005EF400100000F07F0F27000043F40010F9 +:10BA000046F4001015F3001016F300100000F03F8C +:10BA100001FCFFFF0000F83F61436F63A787D23F3F +:10BA2000B3C8608B288AC63FFB799F501344D33F2D +:10BA3000C8F500103204000012040000000010FEDF +:10BA4000BCF40010A0F5001002231093029B002B01 +:10BA500016D0129813995C420F23B64A2340DB009C +:10BA6000D3181A685B6801F019FF012600230890BB +:10BA70000991B14D2411002C00D094E0002B9FD1EE +:10BA8000169B002B00D19BE0089C099D0022200002 +:10BA90002900AA4BFEF784FB002800D190E0079B09 +:10BAA000002B00D18CE00C9B002B46DD029B00227A +:10BAB000200029005E1EA24B01F0F0FE109B0890B2 +:10BAC0000991013310930C9B1098089C099D1493C5 +:10BAD000FEF720FB22002B0001F0E0FE0022994B34 +:10BAE00001F0A0FB10901191109A119B08920993FC +:10BAF000954A119B9446634417930993149B002B1A +:10BB000061D1002220002900904BFDF73BFF089AED +:10BB1000179B04000D00FEF757FB002800D0AFE292 +:10BB20008B481199844661440B0020002900089A33 +:10BB3000FEF736FB002800D09FE2129B139C08936F +:10BB400009941B9B002B00DA72E1029A0E2A00DD99 +:10BB50006EE1784BD2009B185C681B680A930B94CB +:10BB6000239B002B00DBF7E0079B002B00DDF3E0BD +:10BB700000D082E20A980B990022744B01F08EFEED +:10BB8000089A099BFEF72AFB079E3500002800D083 +:10BB900059E2069B069A0133089331231370029BE6 +:10BBA0000133029354E2344207D0109B01331093C7 +:10BBB0002A686B6801F072FE3300641008355AE79A +:10BBC000029E079B80E7149B0F995A1E594BD20087 +:10BBD0009B181A685B68002951D000205D49FDF769 +:10BBE000DBFB089A099BFDF7CDFE069A069B94465F +:10BBF0001793149B1090119163441993290020000E +:10BC0000FEF752FA1490FEF785FA02000B002000AE +:10BC10002900FDF7B7FE179B179A01330893149B71 +:10BC2000040030331370109A119B0D00FEF7B8FA20 +:10BC3000002875D122002B0000204049FDF7A2FE0C +:10BC4000109A119BFEF7ACFA002800D0D2E0199BA5 +:10BC5000089A934200D170E7109811990022384B4E +:10BC600001F01CFE364B109011910022200029009B +:10BC700001F014FE089B04000D001793BEE708981E +:10BC8000099901F00BFE069A069B94460893149BB3 +:10BC9000109011916344199329002000FEF704FAD3 +:10BCA0001790FEF737FA02000B0020002900FDF77D +:10BCB00069FE179B089A303313701300199A0133E9 +:10BCC00004000D00089393422CD110981199069A04 +:10BCD000149B94466344002208931E4B01F0A2FA81 +:10BCE00002000B0020002900FEF76EFA002800D0A9 +:10BCF00080E0109A119B00201649FDF743FE0200D8 +:10BD00000B0020002900FEF74BFA002800D114E7B1 +:10BD1000089B1A00013A08921278302AF8D008934A +:10BD2000029655E00022064B01F0B8FD04000D001C +:10BD3000B2E7C046C8F50010A0F500100000F03FC3 +:10BD40000000244000001C400000C0FC0000144023 +:10BD50000000C07C0000E03F079B069E013B9B1952 +:10BD60000C93089C099D0A9A0B9B20002900FDF763 +:10BD700013FBFEF799F90790FEF7CCF90A9A0B9B93 +:10BD800001F08CFD02000B0020002900FDF7FAFDF8 +:10BD90003300079A013630321A700C9A08969A428C +:10BDA00039D102000B0001F03DFA0A9A0B9B040006 +:10BDB0000D00FEF709FA00281BD10A9A0B9B200000 +:10BDC0002900FEF7E7F9002802D0079BDB0710D413 +:10BDD0003800059900F030FD0023089A029813708E +:10BDE000249B01301860269B002B00D1A6E41A602A +:10BDF000A4E4029E089B0893013B1A78392A06D1D5 +:10BE0000069A9A42F7D13022069901360A701A78BA +:10BE100001321A7084E70022AA4B01F03FFD002294 +:10BE2000002304000D00FEF7B5F900289BD0CFE7F2 +:10BE30000F9D0E9E0A9C002D12D0229A012A66DCCC +:10BE4000189A002A5DD0A04A9B180A9A0121D2189C +:10BE50000A920D9A3800D3180D9300F09DFD05004D +:10BE6000002C0EDD0D9B002B0BDD0D9A2300944260 +:10BE700000DD13000A9AE41AD21A0A920D9AD31A14 +:10BE80000D930E9B002B1FD00F9B002B54D0002E28 +:10BE900011DD29003200380000F044FE059A01004F +:10BEA0000500380000F08EFD05991490380000F070 +:10BEB000C3FC149B05930E9B9A1BB34204D038001D +:10BEC000059900F02FFE05900121380000F064FD77 +:10BED000159B0600002B31DD1A000100380000F030 +:10BEE00021FE229B0600012B2DDD00230E933369DA +:10BEF00003339B00F318586800F006FD2023181A3E +:10BF000039E036231A9A0E9E0A9C9B1A9DE7079BDE +:10BF10005E1E0E9BB34207DB9E1B079B0A9C002BF9 +:10BF200093DAE41A002390E70E9B159AF31AD318BC +:10BF30000E9615930026F0E70E9AC0E700230E93A5 +:10BF4000229B012B13DC00230E93089B002B0ED1A8 +:10BF5000099B1B030BD15D4B099A134207D00A9B27 +:10BF600001330A930D9B01330D9301230E93159B0F +:10BF70000120002BBBD10D9B1F221818030013407A +:10BF8000104246D00132D21A042A3FDD1C22D31AB5 +:10BF90000A9AE418D2180A920D9AD3180D930A9BA4 +:10BFA000002B05DD1A003800059900F017FE0590FA +:10BFB0000D9B002B05DD31001A00380000F00EFE4D +:10BFC0000600169B002B26D03100059800F074FE69 +:10BFD000002820DA029B0A22013B0293380000234A +:10BFE000059900F04DFC0F9B0590002B00D166E1F8 +:10BFF000002329000A22380000F042FC0C9B0500B7 +:10C00000002B47DC229B022B0DDC43E0042AC6D028 +:10C0100013001C33BCE7079B002B35DC229B022B53 +:10C0200032DD079B0C930C9B002B0CD131000522B9 +:10C03000380000F025FC06000100059800F03CFEE9 +:10C04000002800DDA5E5239BDB430293069B0893B4 +:10C0500000243100380000F0EFFB002D00D1B7E6DE +:10C06000002C05D0AC4203D02100380000F0E4FBE6 +:10C070002900380000F0E0FBAAE600263500E2E7E0 +:10C080000296149E350084E50F9B002B00D1CEE074 +:10C09000079B0C93002C05DD29002200380000F0DE +:10C0A0009DFD05000E9B2800002B22D038006968FA +:10C0B00000F07EFB041E0FD10200054B0549FFF77F +:10C0C00006FBC04600002440330400000000F07F5F +:10C0D000BCF40010EA02000029002B690C319A1C04 +:10C0E00092000C30FEF774FA01222100380000F0B3 +:10C0F00075FD069B0C9A0A93013B9B1801222C00AC +:10C1000005001493089B13400F9331000598FFF727 +:10C110003EFA0300210030330D900598079300F09C +:10C12000CBFD2A000E903100380000F0E1FDC3681D +:10C130000890109301230C93109B002B04D1010055 +:10C14000059800F0B9FD0C903800089900F074FBD8 +:10C150000A9B0C9A01330893229B13430F9A1343B3 +:10C160000CD1079B392B26D00E9B002B02DD0D9B9B +:10C17000313307930A9B079A1A706AE70E9B002BCC +:10C1800004DB229A13430F9A13431FD10C9B002BFD +:10C19000F0DD05990122380000F020FD3100059006 +:10C1A00000F08AFD002803DCE4D1079BDB07E1D522 +:10C1B000079B392BDBD139230A9A1370089B08930C +:10C1C000013B1A78392A68D00132D5E70C9B002B45 +:10C1D00007DD079B392BEED0079B0A9A01331370BA +:10C1E00037E70A9B079A1A70149B0A9A93423ED02B +:10C1F00000230A220599380000F042FB0023059035 +:10C200000A2221003800AC4206D100F039FB0400BC +:10C210000500089B0A9378E700F032FB2900040030 +:10C2200000230A22380000F02BFB0500F1E7079BF2 +:10C230000C93002431000598FFF7A9F9069B3030D4 +:10C2400018550C9B01340790A34207DD00230A22F6 +:10C250003800059900F014FB0590EBE70C9B0120DA +:10C26000002B00DD18000024069B1B18089305997D +:10C270000122380000F0B2FC3100059000F01CFDF6 +:10C2800000289BDC02D1079BDB0797D4089B08930F +:10C29000013B1A78302AFAD0DBE6069A9A428ED110 +:10C2A000029B01330293312399E7094B269A0693A7 +:10C2B000084B002A01D0FFF73FFAFFF73FFA0C9B2B +:10C2C000002BB6DC229B022B00DDACE6B1E7C046BA +:10C2D0003AF4001042F40010F7B58B8905000C0009 +:10C2E0001A075FD44A68002A04DC0A6C002A01DCC1 +:10C2F0000020FEBDE76A002FFAD0002280212E68C0 +:10C300002A601A0049010A400B4234D0606DA389AB +:10C310005B0706D56368C01A636B002B01D0236CE2 +:10C32000C01A0200216A00232800E76AB847A189E1 +:10C33000431C06D12B681D2B31D82C4ADA40D30779 +:10C340002DD50023636023692360CB0405D5431CEE +:10C3500002D12B68002B00D16065616B2E60002933 +:10C36000C6D023004433994202D02800FEF76EF96C +:10C3700000206063BDE701232800216AB847431C01 +:10C38000C5D12B68002BC2D01D2B01D0162B01D19B +:10C390002E60ADE74023A2891343A381A9E7402380 +:10C3A0000B43FAE70F69002FA2D00A680F60D21B77 +:10C3B000019200229B0700D14A69A260019B002BD9 +:10C3C00000DC95E73A002800019B216AA66AB04785 +:10C3D000002806DC40230120A28940421343A381A8 +:10C3E00087E7019B3F181B1A0193E7E701004020F4 +:10C3F0000B6970B505000C00002B02D10025280048 +:10C4000070BD002804D08369002B01D100F092F8A0 +:10C41000144B9C421BD16C680C22A35E002BEDD008 +:10C42000626ED20704D49B0502D4A06DFEF7B6F865 +:10C4300028002100FFF750FF636E0500DB07DED404 +:10C44000A3899B05DBD4A06DFEF7A9F8D7E7064BBF +:10C450009C4201D1AC68DFE7044B9C42DCD1EC6824 +:10C46000DAE7C046F0F4001010F50010D0F4001028 +:10C47000002310B50400036043608360818143663C +:10C480001900C28103614361836108225C30FEF7B9 +:10C49000A8F8054B24626362044BA362044BE36279 +:10C4A000044B236310BDC0467DCF0010A5CF001004 +:10C4B000DDCF001009D0001010B5024900F0BAF825 +:10C4C00010BDC0467DD0001070B568254A1E55438A +:10C4D0000E0029007431FEF725F9041E08D0002152 +:10C4E0002A00016046600C30A0606832FEF779F8DF +:10C4F000200070BD10B50248FEF750F810BDC046D0 +:10C500006960010810B50248FEF749F810BDC04641 +:10C510006960010810B50248FEF740F810BDC0463A +:10C520006A60010810B50248FEF739F810BDC04630 +:10C530006A60010813B50400FFF7ECFFA369002B44 +:10C5400002D0FFF7EFFF13BDA364E3642365134B31 +:10C55000134A1B68A2620193A34201D10123A36184 +:10C56000200000F01FF86060200000F01BF8A060C1 +:10C57000200000F017F800220421E0606068FFF757 +:10C5800077FF01220921A068FFF772FF0222122122 +:10C59000E068FFF76DFF0123A361D2E7F0F200101E +:10C5A000B9C40010F8B50700FFF7A4FF1F4B1868C7 +:10C5B0008369002B01D1FFF7BDFF3E004836B46808 +:10C5C0007368013B04D53368002B22D03668F6E748 +:10C5D0000C22A55E002D1AD12000154B5830E360C7 +:10C5E0006566FDF7D9FFFFF78DFF200008222900BF +:10C5F0002560A560656025616561A5615C30FDF71A +:10C60000F0FF6563A563A564E5642000F8BD6834A8 +:10C61000D7E704213800FFF757FF041E3060D5D15B +:10C62000FFF770FF0C233B60EFE7C046F0F200100D +:10C630000100FFFFF7B50400060000270191483410 +:10C640006368A5680093009B013B009304D52468B0 +:10C65000002CF5D13800FEBDAB89012B08D90E2284 +:10C66000AB5E013304D029003000019B984707439B +:10C670006835E8E7004870474003000870B50E00D1 +:10C680001D000E23C95E140096B0002908DA0C22A2 +:10C69000B35E00222A601B0611D48023DB000FE06A +:10C6A0006A4600F05FFD0028F1DBF02301991B02D0 +:10C6B0001940054BC9184B4259412960EDE7402309 +:10C6C0000020236016B070BD00E0FFFFF7B5022622 +:10C6D0008B8905000C00334206D0230047332360CA +:10C6E000236101236361F7BD6A4601ABFFF7C6FF13 +:10C6F000009907002800FEF715F8002808D10C2241 +:10C70000A35E9A05EFD4032293431E43A681E4E778 +:10C710000F4BAB628023A28920601343A381009B4F +:10C7200020616361019B002B0DD028000E23E15E88 +:10C7300000F02AFD002806D00322A38993431A00A3 +:10C7400001231343A381A0890743A781CBE7C046F8 +:10C75000B9C4001082B0002900D101A9101E06D072 +:10C76000002B06D013780B601078431E984102B05E +:10C77000704702204042FAE7C9B28218904201D1C4 +:10C780000020704703788B42FBD00130F6E70000B1 +:10C7900010B50248FDF702FF10BDC04668600108F1 +:10C7A00010B50248FDF7FBFE10BDC04668600108E9 +:10C7B00070B5456A06000C00002D0ED11020FDF763 +:10C7C000EFFE021E706204D16621194B1948FDF775 +:10C7D00045FE456085600560C560756AEB68002BA5 +:10C7E00013D0736AA200DB689B181868002818D160 +:10C7F00001210D00A5406A1D30009200FDF7F9FEF1 +:10C8000000280CD0446085600DE021220421300016 +:10C81000FDF7EFFE736AE860DB68002BE1D10020D2 +:10C8200070BD02681A6000230361C360F8E7C04668 +:10C8300047F400103AF5001070B5466A05000C0088 +:10C84000002E0ED11020FDF7ABFE021E686204D14F +:10C850008A21094B0948FDF701FE466086600660A3 +:10C86000C660002C07D06B6A6268DB6892009B1878 +:10C870001A6822601C6070BD47F400103AF5001081 +:10C88000F7B50E0001900C001D0000200F69143652 +:10C890003368013099B251431B0C534349190D0CB5 +:10C8A0005B191D0C89B21B045B1808C68742EFDCBC +:10C8B000002D22D0A368BB4219DC63680198591C83 +:10C8C000FFF776FF061E05D10200B5210C4B0D487F +:10C8D000FDF7C4FD210023690C319A1C92000C3035 +:10C8E000FDF776FE21000198FFF7A6FF34003B1DFF +:10C8F0009B00E3185D607B1C23612000FEBDC046E9 +:10C90000BCF400103AF500100300020C0020824233 +:10C9100001D11B0410301A0E01D108301B021A0F6E +:10C9200001D104301B019A0F01D102309B00002B72 +:10C9300003DB01305B0000D4202070470368020055 +:10C940000721180008400B420DD0063900200B4289 +:10C9500005D10230034203D0CB400800136070477A +:10C960009B081360FBE799B2002901D110201B0C32 +:10C97000D9B2002901D108301B0A190701D10430AE +:10C980001B09990701D102309B08D907E9D401306E +:10C990005B08E6D12020E2E710B50C000121FFF78B +:10C9A00007FF002806D1A0210200044B04484900DB +:10C9B000FDF754FD01234461036110BDBCF4001078 +:10C9C0003AF50010F0B50B69140012690D0089B03A +:10C9D000934201DA25000C002F6926696968BB19AA +:10C9E0000293AB68BA19934200DA0131FFF7E0FE17 +:10C9F0000190002806D15E210200484B4848FF31D3 +:10CA0000FDF72CFD019B002214339C46BB199B00B3 +:10CA100063440393634603998B422CD32B0022007B +:10CA20001433BF0014320693B600DB190493931934 +:10CA30000793042305932B00049915330092994220 +:10CA400005D34B1B153B9B0801339B000593079BAC +:10CA5000009A9A4211D3029B002B06DD039B043BF4 +:10CA600003931B680093002B53D0019B029A18007C +:10CA70001A6109B0F0BD04C3CDE7009B1B6898B2F2 +:10CA800000281BD067460024069E02CE3A688BB26F +:10CA9000434392B29B181B190C0C44433A68110C87 +:10CAA00061181C0C09190C0C9BB209040B4308C734 +:10CAB000049BB342E9D86346059A9C50009B1B68CF +:10CAC0001E0C20D063462C00604600271B681434DF +:10CAD00022689BB291B271430268120C8918CF1977 +:10CAE00039040B43036002CC4368090C71439BB2C9 +:10CAF0003F0CCB18049ADB191F0C0430A242E7D874 +:10CB0000624605995350009B0433009304239C44D0 +:10CB10009DE7029B013B02939DE7C046BCF40010D9 +:10CB20003AF50010F7B50323150007000E001A4070 +:10CB30001D4208D02549013A920052580023310085 +:10CB4000FFF79EFE0600AD103DD07C6A002C0FD191 +:10CB50001020FDF725FD021E786205D1D7211C4B60 +:10CB60001C484900FDF77AFC446084600460C4609E +:10CB70007B6A9C680193002C08D138001649FFF7A6 +:10CB80000BFF019B040098600023036001231D42FA +:10CB90000AD0310022003800FFF714FF3100019065 +:10CBA0003800FFF749FE019E6D100CD02068002868 +:10CBB00007D1220021003800FFF704FF0023206086 +:10CBC00003600400E2E73000FEBDC04690F60010AE +:10CBD00047F400103AF5001071020000F0B50C00A7 +:10CBE00017002369551187B0EB18029301330193A5 +:10CBF0004968A3680490019A934210DB0498FFF7F8 +:10CC0000D7FD0023020006001900143298420CD10F +:10CC1000DA210200264B2748FF31FDF71FFC0131C6 +:10CC20005B00E8E7980011500133AB42FADBEB43BD +:10CC3000DB171D401F2123003800AD005519226964 +:10CC400014339200084084469A180F422AD00131CA +:10CC5000091A05910021039567461868B8400143F9 +:10CC6000039802C002CB03900598C1409A42F3D8C2 +:10CC7000200015300423824204D3131B153B9B086C +:10CC800001339B00E950002902D0029B023301933B +:10CC9000019B0498013B21003361FFF7CDFD30007B +:10CCA00007B0F0BD02CB02C59A42FBD8F0E7C04600 +:10CCB000BCF400103AF5001002690B6930B50400AD +:10CCC000D01A9A420DD19B0014341431E218C918BD +:10CCD000043A043915680B689D4203D001209D4237 +:10CCE00003D330BD9442F3D3FBE74042F9E70000A1 +:10CCF000F0B50E0007001100300087B01400FFF7F8 +:10CD0000DBFF051E10D101003800FFF751FD021EA8 +:10CD100004D1404B40494148FDF7A0FB0123456148 +:10CD20000361100007B0F0BD01230193002804DB6C +:10CD3000230034001E000023019338006168FFF7D0 +:10CD400037FD021E03D19021324B8900E3E7019B9E +:10CD50000027C360206914340194019B84001B19CF +:10CD60003400029333691434990063180393130059 +:10CD700014339C460593019B0493049B02CC20CB67 +:10CD80000493ABB2DF198BB2FB1A090C2D0C6D1A90 +:10CD900019146D1861462F149BB22D042B4308C142 +:10CDA000039B8C46A342E8D83100039C1531042331 +:10CDB0008C4204D3A31B153B9B0801339B000199B4 +:10CDC000CC1805992600CB189C4602998E4210D3A8 +:10CDD000029EE11E00258E4204D3310003310C1B5C +:10CDE000A408A5005B19043B196800290FD0106145 +:10CDF00097E702CE8DB2ED190F0C291479180F1494 +:10CE0000ADB209040D43614620C18C46DDE701380F +:10CE1000E9E7C046BCF40010320200003AF5001009 +:10CE2000F7B5012114001E00089FFFF7C1FC051E85 +:10CE300005D10200264B27492748FDF70FFB330396 +:10CE400076001B0B760D24D10193002C27D0684669 +:10CE50000094FFF773FD009C00281ED0019B202149 +:10CE60001A00091A8A40C34022436A610193019C57 +:10CE7000AC61631E9C4101342C61002E18D0174B0D +:10CE8000F61835233618181A099B3E6018602800DA +:10CE9000FEBD802252031343D6E76C61E7E701A889 +:10CEA000FFF74CFD0124019B2C616B612030E4E70E +:10CEB0000B4BC0180B4B3860E3189B00EB185869FC +:10CEC000FFF722FD6401099B241A1C60DFE7C046BE +:10CED000BCF400100A0300003AF50010CDFBFFFF80 +:10CEE000CEFBFFFFFFFFFF3F70B504000D001F29C1 +:10CEF00004D9162303600120404270BD436C002B0F +:10CF000004D08A009B181A68002A08D1200000F07B +:10CF100031F82A000100200000F01AF8EDE70020A7 +:10CF2000012AEAD0511C03D1162301302360E4E723 +:10CF3000002428001C6090472000DEE710B5034B5A +:10CF400001001868FFF7D0FF10BDC046EC010008D3 +:10CF5000002370B5064D0400080011002B6000F09E +:10CF60006DFF431C03D12B68002B00D0236070BDE4 +:10CF70007460010810B500F051FF10BD70B50C00D1 +:10CF80000E25495F00F026F9002803DB636D1B18AE +:10CF9000636570BDA389024A1340A381F9E7C046C7 +:10CFA000FFEFFFFFF8B51F008B8905000C0016008E +:10CFB000DB0505D50E23C95E0022022300F0F6F83A +:10CFC000A389054A28001340A38132000E23E15EA5 +:10CFD0003B0000F02DF8F8BDFFEFFFFF70B50C002F +:10CFE0000E25495F00F0E2F8A389421C03D1054AEF +:10CFF0001340A38170BD802252011343A381606559 +:10D00000F8E7C046FFEFFFFF10B50E23C95E00F042 +:10D0100023F810BD0300081E05D0FF2A04D98A2278 +:10D0200001201A604042704701200A70FBE70000AF +:10D0300070B50400080011001A000023054D2B6094 +:10D04000F6F7B6FA431C03D12B68002B00D02360FF +:10D0500070BDC04674600108002370B5064D040021 +:10D0600008002B6000F0CAFE431C03D12B68002B84 +:10D0700000D0236070BDC0467460010870B5050023 +:10D080000C1E02D10026300070BD002804D0836938 +:10D09000002B01D1FFF74EFA2F4B9C4217D16C6841 +:10D0A000636EDB0705D4A3899B0502D4A06DFDF751 +:10D0B00075FA0C22A35E002B13D1626E01331600A9 +:10D0C0001E401A42DED1A06DFDF769FADBE7234B63 +:10D0D0009C4201D1AC68E3E7214B9C42E0D1EC6873 +:10D0E000DEE721002800FFF7F7F8236B0600002B8E +:10D0F00006D02800216A9847002801DA01267642E6 +:10D10000A3891B0603D528002169FDF79FFA616BEF +:10D11000002908D023004433994202D02800FDF7AB +:10D1200095FA00236363A16C002904D02800FDF761 +:10D130008DFA0023A364FFF7DDF90023A381636E5A +:10D14000DB0702D4A06DFDF72AFAA06DFDF725FAE2 +:10D15000FFF7D8F997E7C046F0F4001010F500107B +:10D16000D0F40010002370B5064D04000800110033 +:10D170002B6000F04BFE431C03D12B68002B00D02A +:10D18000236070BD74600108002370B5064D040073 +:10D1900008002B6000F04AFE431C03D12B68002BD3 +:10D1A00000D0236070BDC0467460010870B50400F3 +:10D1B000080011001A000023054D2B6000F046FE08 +:10D1C000431C03D12B68002B00D0236070BDC046E8 +:10D1D0007460010870B50400080011001A000023F3 +:10D1E000054D2B60F6F704FA431C03D12B68002B86 +:10D1F00000D0236070BDC0467460010802B471465F +:10D2000049084900095C49008E4402BC7047C04689 +:10D2100003B47146490840004900095E49008E4444 +:10D2200003BC7047F0B54F464646D6460D00040095 +:10D23000C0B51F0011002803620F400A10437A0096 +:10D24000520DE3003C039146640AFA0F4F0F6E0043 +:10D2500027439246B846760DED0FC900954200D19E +:10D2600099E04C46341BA446002C00DC7CE04A4686 +:10D27000002A00D1B8E0C54A964200D11CE18022C4 +:10D280003C0012041443A0466246382A00DD61E1E6 +:10D290001F2A00DDCCE164462022121B4446944044 +:10D2A0000F00A14664469140E7404C464A1E91411A +:10D2B0003C43424621436446E240801A5C1AA34242 +:10D2C0009B415F42C71B3B0200D4D0E07F027F0A34 +:10D2D000002F00D1FFE03800FCF78AFF0100083979 +:10D2E000202322005B1A8F40DA408C401743B14262 +:10D2F00000DAFFE0891B4B1C1F2B00DDA8E0202279 +:10D300003900D21A200094409140D840621E9441C6 +:10D31000DF40002601430C43630709D00F2323405D +:10D32000042B05D0231DA342A44164423F191C00D5 +:10D330003B0200D49EE0954B01369E4200D1B7E0FF +:10D34000934AE40817407B0771057F0223433F0B94 +:10D350004A0D12053A43ED072A4318001100E0BCBC +:10D36000BA46B146A846F0BD002C4BD04C46A41B93 +:10D37000A446002E00D023E104001C4300D1AFE1FD +:10D380006246541E012A00D115E2804DAC4500D101 +:10D39000C8E1A4461BE14A46B21A9446002A00DCC2 +:10D3A000ACE04A46002A43D0784A964200D1AFE129 +:10D3B00080223C0012041443A0466246382A67DCEF +:10D3C0001F2A00DC5FE14746203AD7406246202A08 +:10D3D00005D064464022121B4446944021434A1E15 +:10D3E00091410C003C4357E03A000A4300D105E16B +:10D3F0002200013A012C00D182E1644CA4455BD0AB +:10D40000944641E7634C771C274200D0C4E00400F7 +:10D410001C43002E00D069E1002C00D1BFE144463E +:10D420000C4300D0D0E14207DB081343C00829E0D9 +:10D430003A000A4300D170E162466446013A012C89 +:10D4400000D1E0E0514CA44500D161E19446B4E73D +:10D450003A001F39CA401100202B03D04022D31AB2 +:10D460009F403C43631E9C41002700260C436307FA +:10D4700000D053E7B446E4087B072343F808434A47 +:10D4800094451DD06246070352053F0B520D60E7DD +:10D4900044460C43621E9441E4189C429B415F4207 +:10D4A0003F183B02E3D5394B01369E4200D0B5E030 +:10D4B0003200002700234CE74207DB081343C00873 +:10D4C0001A00024300D1E1E180273F0307433F03F5 +:10D4D0002E4A3F0B3DE72000FCF78AFE0100183181 +:10D4E0001F2900DCFCE60838844027000024B142F4 +:10D4F00000DBFFE6264A761A17400DE7002A2FD0F8 +:10D500004A46921B9446002E00D1ADE01F4A914539 +:10D5100000D10FE18022120410436246382A00DD58 +:10D520000FE11F2A00DD80E1644620221E00121B4D +:10D530006746040093409440FE405A1E9341F840D1 +:10D5400034431C43804464188C42BF417F424E46A2 +:10D550004744A6E742460A4311004A1E9141ADE600 +:10D560000C4C721C224200D0A1E002001A43002E93 +:10D5700000D0FAE0002A00D145E13A000A4300D089 +:10D5800046E14207DB081343C0087BE7FF070000C2 +:10D59000FFFF7FFFFE07000047465C1AC21BA34245 +:10D5A000BF417F42B94617004A46BF1A3A0200D52A +:10D5B0008DE023003B4300D08AE60020002561E790 +:10D5C000B44CA14500D1ADE080242404204364463E +:10D5D000382C3DDC62461F2C00DDB7E020251E0004 +:10D5E0002D1B0400AB40AC40D640D04042465D1EEF +:10D5F000AB413443121A904623432CE04207DB0828 +:10D600001343C0083BE75C189C429B4140445B428B +:10D61000C71801263B0200D429E702269E4A630868 +:10D620001740012214401C43FB071C437F0873E68C +:10D630004446203AD4406246202A05D0674640221C +:10D64000D21B4746974039434A1E9141214335E654 +:10D650000343581E8341CC1AA142BF4143467F4237 +:10D6600055464E46DF1B2EE602001A4300D1BDE0B0 +:10D6700062466446013A012C00D1E5E0854CA445A0 +:10D6800058D0944649E764462022121B44469440F1 +:10D690000F00A14664469140E7404C464A1E914126 +:10D6A0003C4342460C436146CA408018F4E6794C3C +:10D6B000A24200D1FDE6591899429B4140445F4285 +:10D6C000C719FC07490816000C437F08CFE6CC1A9F +:10D6D000A142BF4143467F42181A5546C71BF7E592 +:10D6E000C9087B0755460B43F808C8E6002C00D054 +:10D6F00081E043460B4315D1802000250003E3E67B +:10D700005C1AA3429B41C71B5B420126FF1ADAE564 +:10D710004207DB081343C008D2E64207DB08134385 +:10D72000C008ACE643464246C9085B0755460B4372 +:10D73000D008C5E6434642465B07C9080B43D008FC +:10D74000BEE603431C00631E9C41FCE60200203C35 +:10D75000E24014006246202A03D04025AD1AA840BA +:10D760000343581E8341234375E7002AE2D03A0061 +:10D770000A43CDD04207DB0813438022C0081203BE +:10D78000104206D0FC08144203D12000CB087A07CF +:10D7900013435A0FDB005207DB08134390E643465E +:10D7A0000B4300D109E743464246C9085B0755468B +:10D7B0000B43D00866E6CC1AA14289413F1A494280 +:10D7C000554601267F1A7EE542465C1A871AA34217 +:10D7D00092415242BF1A3A023DD5CC1AA142894128 +:10D7E000434649421F1A55467F1A95E57B07C908EB +:10D7F0000B43F80843E64446DB080C4330D14207AC +:10D800001343C0085CE67B07C9080B43F80839E6F8 +:10D810005C189C429B4140445B42C7183B0200D4C9 +:10D8200025E61D4B01261F4021E60400203AD44086 +:10D830006246202A04D040226646921B9040034351 +:10D840005A1E93411C437EE65C188C428941404439 +:10D8500049424718DDE623003B4300D1ADE606E62A +:10D86000440723438024C0082403204208D04246B2 +:10D87000D608264204D155463000CB0851070B4349 +:10D880005A0FDB00DB085207134319E60023014A55 +:10D890001F005EE5FF070000FFFF7FFFF0B5574662 +:10D8A0004E464546DE46E0B598460C034B00060062 +:10D8B000924687B0240B5B0DCF0F002B00D15CE1AB +:10D8C000D94A934200D175E1420FE400144380220B +:10D8D00012041443D54AC5009446634400930023C0 +:10D8E00099469B46434642461E03D20F5B00504674 +:10D8F0009046360B5B0D00D120E1CB4A934200D11C +:10D9000062E1CA49420F8C4600996344F6008C4696 +:10D91000164380229C44120463461643C200002032 +:10D9200000930099434601318C4649467B40019360 +:10D930000F2926D8BE4B890059588F46434601937C +:10D940003400150083465B46022B16D0032B00D112 +:10D9500003E2012B00D0CDE0002200240025019B32 +:10D9600012052243DB071A432800110007B0F0BC60 +:10D97000BB46B246A946A046F0BD00240025AA4AEF +:10D98000EDE7280C2D042D0C2B00110C1204120CA9 +:10D990005343984613002F00434399464F434F4447 +:10D9A000BB4647460B003F0CBA464343DA4402935A +:10D9B000D14504D980277F02B9464B440293534690 +:10D9C0001B0C9B4653461F0443461B041B0C9846E6 +:10D9D0003B0043440493330C3604360C9846330022 +:10D9E00043439946434643432F009A464346774371 +:10D9F0005D43380C4D444519A94503D980235B028A +:10DA00009946CA443F04280C3F0C2D04ED19270CFD +:10DA10002404240C0300200050437A4391463A002A +:10DA200053440593030C9A464A4361434944514485 +:10DA3000AB44894503D980235B0299464A440004DC +:10DA40000B0C000C0904091820009946434670434A +:10DA50005C437E435F43030C9846A41944444A4404 +:10DA60000397A64204D980235B0298464744039754 +:10DA70002304029E9A46059B5E449846AE42AD4101 +:10DA800076188E4289410004000C504440446D4297 +:10DA90004719B846934649428946C344D9449842F7 +:10DAA0008041A845AD4193459241894589416D42E8 +:10DAB00040422843240C524249420A43039B001926 +:10DAC0008018C7184B46DC0D049B75021D436A1E67 +:10DAD00095414B46F60D7F0235435A023C431543B0 +:10DAE000FB0100D41CE101216A080D401543E20747 +:10DAF000154364084F496144002900DCB0E06B071E +:10DB000009D00F222A40042A05D02A1DAA42AD417D +:10DB10006D4264191500E30104D58021464AC9000D +:10DB200014406144454A914200DD26E76207ED0852 +:10DB3000640249051543240B4A0D10E7524632434F +:10DB400000D17FE0002E00D1DCE03000FCF750FB7C +:10DB500002000B3A1D2301009B1A52460839DA4095 +:10DB60008E40164352468A40009B3549181A0300DE +:10DB70008C46634400200093D3E6250005434AD039 +:10DB8000002C00D1B0E02000FCF732FB01000200C5 +:10DB90000B391D2310005B1A310035000838844012 +:10DBA000D94085400C432648831A009300239946A8 +:10DBB0009B4697E60500254326D1082200930223C1 +:10DBC000002491469B468DE65246009B324310D17D +:10DBD000154900268C4663444946009302231943A5 +:10DBE000894602209DE65B460197022B00D0ADE6F8 +:10DBF000C3E60D4A0320944663444A460093032338 +:10DC00001A43914652468CE60C22009303230500EA +:10DC100091469B4666E60423994600230093013310 +:10DC200000249B465EE6C046FF07000001FCFFFFA4 +:10DC30009CF60010FF030000FFFFFFFEFE07000040 +:10DC40000DFCFFFF494601231943894600260120A8 +:10DC500067E6002380240025434A019324037EE6DF +:10DC60000120401A382800DD76E61F285BDD1F22E0 +:10DC700023005242511ACB401900202803D03B4ABE +:10DC80006244944025436A1E95412A000A430721B5 +:10DC90000D000024154011425BD00F2100241140DB +:10DCA000042953D0111D914292415242A4180A00F6 +:10DCB00023024BD501220024002550E680231B03BC +:10DCC0001C4209D01E4207D133431C0343461500B2 +:10DCD000240B254A019342E68022120314432403B5 +:10DCE000214A240B01973AE6FCF782FA0100020070 +:10DCF000153120321C2900DC4BE7340008380025A0 +:10DD0000844050E7FCF774FA03001A001532203003 +:10DD10001C2A00DC1EE75646083B00229E4023E7F3 +:10DD2000009B9C46E6E61249220061442E008D408D +:10DD30008A40C640691E8D4132432A43C44053077E +:10DD4000B6D00F2111400429ACD1B1E765076402B8 +:10DD5000240BD2081543002201E68022120314434B +:10DD60002403014A240BFAE5FF0700003E040000EB +:10DD70001E04000070B505000C481C0316005B0073 +:10DD80000A034900120B490D240B5B0D814208D098 +:10DD9000064A0020934203D120003043431E98419D +:10DDA00070BD01202A43FBD1F2E7C046FF07000007 +:10DDB00010B5041E10D0FCF71BFA0F4B1B1A0A28D3 +:10DDC00011DC0B222100121AD14015300A035B0529 +:10DDD0008440120B5B0D01E0002300221B0513435E +:10DDE0002000190010BD22000B3882405B05120391 +:10DDF0000024120B5B0DF1E71E04000058220120E5 +:10DE0000014B40421A60704774600108582201209B +:10DE1000014B40421A60704774600108582201208B +:10DE2000014B40421A607047746001085822024B4F +:10DE300000201A607047C046746001085822012013 +:10DE4000014B40421A60704774600108582201205B +:10DE5000014B40421A60704774600108044A030095 +:10DE60001068002802D0C318136070470148FAE711 +:10DE70007860010880600108FEE7C046F8B5C0463A +:10DE8000F8BC08BC9E467047F8B5C046F8BC08BC54 +:10DE90009E4670470000000001B40248844601BC61 +:10DEA000604700BF0906000801B40248844601BC6F +:10DEB000604700BFA5040008000000000800000043 +:10DEC0000800000000020000000000000000000048 +:10DED0000000000000000000000000000000000042 +:10DEE000000000000B0000003F00000000000000E8 +:10DEF0003F00000000000000010000000B000000D7 +:10DF00001D000000000000000000000000000000F4 +:10DF10000000000001000000000000000000000000 +:10DF200000000000000000000000000001000000F0 +:10DF30000A0000001D0000000000000000000000BA +:10DF400000000000000000000100000000000000D0 +:10DF500000000000000000000000000000000000C1 +:10DF600001000000060000001D000000000000008D +:10DF700000000000000000000000000001000000A0 +:10DF80000000000000000000000000000000000091 +:10DF90000000000001000000080000001200000066 +:10DFA0000000000000000000000000000000000071 +:10DFB0000100000000000000000000000000000060 +:10DFC000000000000000000001000000060000004A +:10DFD000120000000000000000000000000000002F +:10DFE0000000000001000000000000000000000030 +:10DFF0000000000000000000000000000100000020 +:10E000000000000000000000000000000000000010 +:10E0100000000000000000000100000000000000FF +:10E0200000000000000000000000000000000000F0 +:10E0300001000000000000000000000000000000DF +:10E0400000000000000000000000000001000000CF +:10E0500000000000000000000000000000000000C0 +:10E0600000000000010000000300000000000000AC +:10E0700000000018000000040000000058E100103B +:10E080006000000000000000FFFFFFFF0000000034 +:10E090000000000000000000DC00000000000000A4 +:10E0A000FFFFFFFF00000000000000000000000074 +:10E0B0003400000000000000FFFFFFFF020000002E +:10E0C0000000000002000000EC0000000002000060 +:10E0D0000100000002000000040000000200000037 +:10E0E0003500000000000000FFFFFFFF00000000FF +:10E0F000000000000000000005000000000000001B +:10E10000FFFFFFFF00000000000000000000000013 +:10E110000400000000000000FFFFFFFF00000000FF +:10E1200000000000000000000600000000000000E9 +:10E13000FFFFFFFF000000000000000000000000E3 +:10E140000100000000000000FFFFFFFF00000000D2 +:10E1500000000000000000000400000000000004B7 +:10E16000C8E0001028E1001010E1001098E0001055 +:10E170000000040080E00010B0E000100002000089 +:10E18000F8E00010E0E0001040E1001000000000A6 +:10E190000100000002000000280A0000E00407005F +:10E1A0001405000000000000000000000100000055 +:10E1B000BCE10010020000001400000064E0001048 +:10E1C000F4010000140004010A000905080003001E +:10E1D0006301000024010200000000005B494E467C +:10E1E0005D205374617274696E6720557365722087 +:10E1F0004170706C69636174696F6E206F6E20434B +:10E200004D342E20506C6561736520776169742EE2 +:10E210002E2E0A0D000000005B494E465D201B5B60 +:10E22000324A1B5B3B480A0D000000005B494E462A +:10E230005D204D4355626F6F7420426F6F746C6F39 +:10E240006164657220537461727465640A0D000024 +:10E250005B494E465D2045787465726E616C204D59 +:10E26000656D6F727920696E697469616C697A6530 +:10E2700064207573696E6720534644500A0D000090 +:10E280005B4552525D2045787465726E616C204D1D +:10E29000656D6F727920696E697469616C697A6104 +:10E2A00074696F6E207573696E6720534644502001 +:10E2B0004641494C45443A203078253032780A0DA1 +:10E2C000000000005B494E465D2055736572204199 +:10E2D00070706C69636174696F6E2076616C6964DB +:10E2E00061746564207375636365737366756C6CC4 +:10E2F000790A0D005B494E465D204D4355626F6FB4 +:10E300007420426F6F746C6F6164657220666F7504 +:10E310006E64206E6F20626F6F7461626C6520693D +:10E320006D6167650A0D0000030000000100000038 +:10E330000100000000000000050360000400000070 +:10E340000100000000000000010000000604600061 +:10E3500008000000F0080008A905001028696D6198 +:10E3600067655F6E756D29203C203078460000009F +:10E370002E2E2F6D74625F7368617265642F6D63FA +:10E3800075626F6F742F76312E372E302D63797052 +:10E39000726573732F626F6F742F626F6F74757411 +:10E3A000696C2F7372632F626F6F747574696C5F21 +:10E3B0006D6973632E63000028737761705F7479F1 +:10E3C000706529203C2030784600000062616400BE +:10E3D000676F6F6400000000756E73657400000065 +:10E3E00074657374000000007065726D00000000B9 +:10E3F0004255473B2063616E2774206861707065E9 +:10E400006E0000007265766572740000626F6F7452 +:10E410005F737761705F747970655F6D756C746937 +:10E420003A205072696D61727920696D616765008B +:10E430005B494E465D2025733A206D616769633DF7 +:10E4400025732C20737761705F747970653D307827 +:10E4500025782C20636F70795F646F6E653D30782E +:10E4600025782C20696D6167655F6F6B3D3078257D +:10E47000780A0D00626F6F745F737761705F7479F3 +:10E4800070655F6D756C74693A205365636F6E6477 +:10E4900061727920696D6167650000005B494E46D5 +:10E4A0005D205377617020747970653A2025730A76 +:10E4B0000D0000005B494E465D205377617020746B +:10E4C0007970653A206E6F6E650A0D00626F6F7429 +:10E4D0005F77726974655F737761705F696E666F8D +:10E4E0000000000077C295F360D2EF7F3552500FE5 +:10E4F0002CB679800401040304020401040104031E +:10E500000103030401040000000000006FC75E1057 +:10E51000DE8EBD20B149E330BC1D7B41D3DA2551ED +:10E520006293C6610D549871783BF68217FCA892ED +:10E53000A6B54BA2C97215B2C4268DC3ABE1D3D325 +:10E540001AA830E3756F6EF37365636F6E64617262 +:10E55000790000007072696D617279005B455252FA +:10E560005D20496D61676520696E207468652025AE +:10E570007320736C6F74206973206E6F74207661E2 +:10E580006C6964210A0D00007263203D3D2030005B +:10E590002E2E2F6D74625F7368617265642F6D63D8 +:10E5A00075626F6F742F76312E372E302D63797030 +:10E5B000726573732F626F6F742F626F6F747574EF +:10E5C000696C2F7372632F6C6F616465722E6300C8 +:10E5D0005B4552525D2070616E6963210A0D000037 +:10E5E000300000005B57524E5D204661696C6564E7 +:10E5F0002072656164696E6720736563746F7273FE +:10E600003B20424F4F545F4D41585F494D475F5348 +:10E610004543544F52533D2564202D20746F6F2085 +:10E62000736D616C6C3F0A0D000000005B57524E29 +:10E630005D204661696C65642072656164696E671E +:10E6400020696D61676520686561646572733B2050 +:10E65000496D6167653D25750A0D00005B57524E97 +:10E660005D204661696C65642072656164696E67EE +:10E6700020626F6F74207374617475733B20496DF1 +:10E680006167653D25750A0D000000005B4552522B +:10E690005D2062616420696D616765206D616769F5 +:10E6A00063203078256C783B20496D6167653D2596 +:10E6B000750A0D00626F6F745F706572666F726DC0 +:10E6C0005F75706461746500626F6F745F7377610A +:10E6D000705F696D61676500626F6F745F636F6D16 +:10E6E000706C6574655F7061727469616C5F73777B +:10E6F00061700000626F6F745F7072657061726547 +:10E700005F696D6167655F666F725F757064617484 +:10E7100065000000636F6E746578745F626F6F747C +:10E720005F676F002E2E2F6D74625F736861726574 +:10E73000642F6D6375626F6F742F76312E372E30B4 +:10E740002D637970726573732F626F6F742F626FB0 +:10E750006F747574696C2F7372632F737761705F58 +:10E760007374617475732E63000000005B45525230 +:10E770005D20446574656374656420696E636F6EC3 +:10E7800073697374656E7420737461747573210A90 +:10E790000D0000005B57524E5D2043616E6E6F743A +:10E7A00020757067726164653A206E6F7420612015 +:10E7B000636F6D70617469626C6520616D6F756EF9 +:10E7C00074206F6620736563746F72730A0D0000A6 +:10E7D0005B57524E5D2043616E6E6F74207570679B +:10E7E000726164653A206D6F726520736563746F42 +:10E7F0007273207468616E20616C6C6F7765640A57 +:10E800000D0000005B57524E5D2043616E6E6F74C9 +:10E8100020757067726164653A206E6F7420736151 +:10E820006D6520736563746F72206C61796F7574A8 +:10E830000A0D0000737761705F7374617475735FA4 +:10E84000736F757263653A205072696D61727920D9 +:10E85000696D6167650000005B494E465D20426F4F +:10E860006F7420736F757263653A207072696D61A1 +:10E87000727920736C6F740A0D0000005B494E467C +:10E880005D20426F6F7420736F757263653A206EFE +:10E890006F6E650A0D00000066697875705F7265BD +:10E8A000766572743A205365636F6E646172792085 +:10E8B000696D616765000000626F6F745F737761F7 +:10E8C000705F736563746F7273000000626F6F74C2 +:10E8D0005F6D6F76655F736563746F725F757000EF +:10E8E000737761705F72756E0000000066697875FD +:10E8F000705F7265766572740000000073776170F6 +:10E900005F7374617475735F736F75726365000014 +:10E91000737761705F726561645F7374617475733E +:10E920005F627974657300005B494E465D204572F5 +:10E930006173696E6720747261696C65723B2066F1 +:10E94000615F69643D25640A0D0000002E2E2F6D65 +:10E9500074625F7368617265642F6D6375626F6F57 +:10E96000742F76312E372E302D6379707265737364 +:10E970002F626F6F742F626F6F747574696C2F7371 +:10E9800072632F737761705F7374617475735F6DF9 +:10E990006973632E63000000737761705F72656155 +:10E9A000645F737461747573000000007377617045 +:10E9B0005F7374617475735F696E69740000000041 +:10E9C000737761705F65726173655F747261696CA2 +:10E9D00065725F736563746F727300002E2E2F6D06 +:10E9E00074625F7368617265642F6D6375626F6FC7 +:10E9F000742F76312E372E302D63797072657373D4 +:10EA00002F626F6F742F626F6F747574696C2F73E0 +:10EA100072632F737761705F7374617475735F7065 +:10EA20006172742E63000000286F666673202B20CD +:10EA30006C656E29203C3D20424F4F545F53574137 +:10EA4000505F5354415455535F445F53495A455F97 +:10EA500052415700696E69745F6F666673203E3D70 +:10EA600020300000737761705F7374617475735F39 +:10EA70007265747269657665000000007377617075 +:10EA80005F7374617475735F77726974655F7265C3 +:10EA9000636F726400000000737761705F7374616C +:10EAA0007475735F7570646174650000737761706D +:10EAB0005F7374617475735F726561645F726563BF +:10EAC0006F726400AFBEADDE6F6666203C2066618B +:10EAD0002D3E66615F6F6666000000002E2E2F6D72 +:10EAE00074625F7368617265642F6D6375626F6FC6 +:10EAF000742F76312E372E302D63797072657373D3 +:10EB00002F626F6F742F637970726573732F6379DF +:10EB10005F666C6173685F70616C2F63795F666CB0 +:10EB20006173685F6D61702E630000006F66662020 +:10EB30002B206C656E203C2066612D3E66615F6F08 +:10EB4000666600005B4552525D20466C617368202A +:10EB5000617265612072656164206572726F722CEA +:10EB6000207263203D2025640A0D000021286C6579 +:10EB70006E20252043595F464C4153485F53495A04 +:10EB8000454F465F524F57290000000021287772F9 +:10EB90006974655F73746172745F61646472202567 +:10EBA0002043595F464C4153485F53495A454F46AD +:10EBB0005F524F57290000006C656E203C3D206677 +:10EBC000612D3E66615F73697A6500006F6666203D +:10EBD0003C2066612D3E66615F73697A65000000C6 +:10EBE0006F6666202B206C656E203C2066612D3E92 +:10EBF00066615F6F6666202B2066612D3E66615FF1 +:10EC000073697A65000000007263203D3D2043591E +:10EC10005F464C4153485F4452565F53554343450A +:10EC20005353000066616C73650000007365637484 +:10EC30006F72735F6E203C3D202A636E740000008B +:10EC4000666C6173685F617265615F6765745F734D +:10EC50006563746F72730000666C6173685F6172E4 +:10EC600065615F6572617365645F76616C00000069 +:10EC7000666C6173685F617265615F65726173651F +:10EC800000000000666C6173685F617265615F77A8 +:10EC90007269746500000000666C6173685F617280 +:10ECA00065615F7265616400010000000E00000094 +:10ECB0001100000000000000000000000000000043 +:10ECC0000000000001000000000000000000000043 +:10ECD0000000000000000000000000000100000033 +:10ECE0000E00000011000000000000000000000005 +:10ECF0000000000000000000010000000000000013 +:10ED00000000000000000000000000000000000003 +:10ED1000010000000E0000001100000000000000D3 +:10ED200000000000000000000000000001000000E2 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000010000000E00000011000000A3 +:10ED500000000000000000000000000000000000B3 +:10ED600001000000000000000000000000000000A2 +:10ED7000000000000000000001000000060000008C +:10ED80001100000000000000000000000000000072 +:10ED90000000000001000000000000000000000072 +:10EDA0000000000000000000000000000000000063 +:10EDB000010000000100000000000000010001004F +:10EDC00000010001A10FB90BD107DC05E903EE0238 +:10EDD000F5017701FB00BC007E005E003F002F00C4 +:10EDE0002000180010000C000800060004000300BA +:10EDF0000200020001000100000020400000244049 +:10EE000000000040000000000000234000003040EF +:10EE10000000314000009F400000224000001040F0 +:10EE200000009D402020202020101010101D1D806B +:10EE300017007500FF0306020600360410200000CC +:10EE40007FC0000000040000000000000019324BE9 +:10EE5000647D0000000000804000080B10000000EE +:10EE60000000FF012002001F00800004FF081018AE +:10EE7000001000140018001C4044484C50000000D2 +:10EE8000081000000800000004000000041000004A +:10EE90000012000004210000002100000016000004 +:10EEA00040114002C41300138013A01340138813B1 +:10EEB000A81320001C000000040000004000000017 +:10EEC0004400000048000000800000000001000035 +:10EED000100200008802000000040000100400007E +:10EEE00020040000400400004804000080040000EA +:10EEF0008404000090040000C0070000C407000064 +:10EF0000C8070000CC07000000400000041000000B +:10EF1000401000004410000048100000C014000021 +:10EF20000011000018020000980200000014000008 +:10EF300010140000201400004014000048140000C9 +:10EF400080140000841400009014000000010000F0 +:10EF500004010000080100000C0100000080000016 +:10EF6000AA3D0010D43D0010FE3D0010263E0010CA +:10EF7000523E0010A83E00107C3E00100123456761 +:10EF800089ABCDEFFEDCBA9876543210F0E1D2C3F3 +:10EF9000D89E05C107D57C3617DD703039590EF77C +:10EFA000310BC0FF11155868A78FF964A44FFABE42 +:10EFB00067E6096A85AE67BB72F36E3C3AF54FA50A +:10EFC0007F520E518C68059BABD9831F19CDE05B36 +:10EFD0005D9DBBCBD89E05C12A299A6207D57C3698 +:10EFE0005A01599117DD7030D8EC2F1539590EF7A9 +:10EFF00067263367310BC0FF874AB48E11155868F6 +:10F000000D2E0CDBA78FF9641D48B547A44FFABE3F +:10F0100067E6096A08C9BCF385AE67BB3BA7CA842B +:10F0200072F36E3C2BF894FE3AF54FA5F1361D5F56 +:10F030007F520E51D182E6AD8C68059B1F6C3E2B32 +:10F04000ABD9831F6BBD41FB19CDE05B79217E13EA +:10F05000C8373D8CA24D54196699E173D6D4DC892A +:10F06000AEB7FA1D829CFF3214D59D67CF9F2F58F3 +:10F07000692B6D0FA84DD47B736FE3774289C4046D +:10F08000A8859D3FC8361D6AADE61211A192D691A2 +:10F09000942131222CF72BFCA35F559FC2644CC8EE +:10F0A0006BB8932351B1536F19773896BDEA405925 +:10F0B000E23E2896E3FF8EA8251E5EBE9239865357 +:10F0C000FC99012BAAB8852CDC2DB70EA22CC5818A +:10F0D000BE400010FA400010DC4000103841001023 +:10F0E0001A41001058410010784100106745230173 +:10F0F000EFCDAB8998BADCFE10325476C3D2E1F082 +:10F10000C1059ED8367CD5073070DD17F70E59390A +:10F11000FFC00B316858151164F98FA7BEFA4FA4D0 +:10F120006A09E667BB67AE853C6EF372A54FF53A98 +:10F13000510E527F9B05688C1F83D9AB5BE0CD19C4 +:10F14000CBBB9D5DC1059ED8629A292A367CD50726 +:10F150009159015A3070DD17152FECD8F70E593937 +:10F1600067332667FFC00B318EB44A876858151184 +:10F17000DB0C2E0D64F98FA747B5481DBEFA4FA4CE +:10F180006A09E667F3BCC908BB67AE8584CAA73BBA +:10F190003C6EF372FE94F82BA54FF53A5F1D36F1E5 +:10F1A000510E527FADE682D19B05688C2B3E6C1FC1 +:10F1B0001F83D9ABFB41BD6B5BE0CD19137E217979 +:10F1C0008C3D37C819544DA273E1996689DCD4D6B9 +:10F1D0001DFAB7AE32FF9C82679DD514582F9FCF82 +:10F1E0000F6D2B697BD44DA877E36F7304C48942FC +:10F1F0003F9D85A86A1D36C81112E6AD91D692A131 +:10F2000022312194FC2BF72C9F555FA3C84C64C27C +:10F210002393B86B6F53B151963877195940EABDB3 +:10F2200096283EE2A88EFFE3BE5E1E2553863992E5 +:10F230002B0199FC2C85B8AA0EB72DDC81C52CA218 +:10F24000BE600010DE600010D4600010CA600010C4 +:10F25000C0600010B6600010186300102863001032 +:10F260003A6300104C6300102863001028630010FC +:10F27000000000007494001062940010409400108C +:10F280006A940010409400104297001040940010BF +:10F290006A9400106294001062940010429700106B +:10F2A0006A9400102C9400102C9400102C940010E0 +:10F2B000B89700102C2066756E6374696F6E3A20E3 +:10F2C00000617373657274696F6E2022257322204A +:10F2D0006661696C65643A2066696C6520222573F5 +:10F2E000222C206C696E65202564257325730A0025 +:10F2F000F0010008232D302B2000686C4C0065665F +:10F300006745464700494E4600696E66004E414ECD +:10F31000006E616E003000303132333435363738AC +:10F320003941424344454600303132333435363773 +:10F330003839616263646566000020202020202047 +:10F340002020202828282828202020202020202095 +:10F350002020202020202020202088101010101095 +:10F3600010101010101010101010040404040404E5 +:10F3700004040404101010101010104141414141C8 +:10F38000410101010101010101010101010101012D +:10F3900001010101011010101010104242424242BE +:10F3A00042020202020202020202020202020202FD +:10F3B00002020202021010101020000000000000E3 +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000496E66696E696F +:10F440007479004E614E005245454E54206D616CFA +:10F450006C6F6320737563636565646564002F6812 +:10F460006F6D652F706172616C6C656C732F746F5A +:10F470006F6C636861696E2F6763632D61726D2DB8 +:10F480006E6F6E652D656162692D31302E332D32C0 +:10F490003032312E30372F7372632F6E65776C697F +:10F4A000622F6E65776C69622F6C6962632F73746B +:10F4B000646C69622F64746F612E630042616C6CCE +:10F4C0006F632073756363656564656400000000A5 +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F530004300504F534958002E002F686F6D652FC0 +:10F54000706172616C6C656C732F746F6F6C636843 +:10F5500061696E2F6763632D61726D2D6E6F6E65CD +:10F560002D656162692D31302E332D323032312ECE +:10F5700030372F7372632F6E65776C69622F6E65FB +:10F58000776C69622F6C6962632F7374646C696253 +:10F590002F6D707265632E63000000000000000094 +:10F5A0000080E03779C34143176E05B5B5B893467F +:10F5B000F5F93FE9034F384D321D30F94877825A4B +:10F5C0003CBF737FDD4F1575000000000000F03F69 +:10F5D000000000000000244000000000000059402E +:10F5E0000000000000408F40000000000088C34081 +:10F5F00000000000006AF8400000000080842E41F6 +:10F6000000000000D01263410000000084D7974141 +:10F610000000000065CDCD41000000205FA0024247 +:10F62000000000E876483742000000A2941A6D42BC +:10F63000000040E59C30A2420000901EC4BCD642AF +:10F6400000003426F56B0C430080E03779C341435A +:10F6500000A0D8855734764300C84E676DC1AB43D0 +:10F66000003D9160E458E143408CB5781DAF1544EE +:10F6700050EFE2D6E41A4B4492D54D06CFF08044C9 +:10F68000F64AE1C7022DB544B49DD9794378EA44DE +:10F6900005000000190000007D00000082D9001064 +:10F6A00040D9001040D900103CD9001046D90010B4 +:10F6B00046D9001052DC00103CD9001046D9001089 +:10F6C00052DC001046D900103CD90010E6DB0010D7 +:10F6D000E6DB0010E6DB0010BCDC001000000000E0 +:08F6E000209BFF7F01000000E8 +:10F6E80000000010000000088000000008F700106B +:08F6F80080000008A0060000DC +:08F7000074070008085901001C +:10F7080000093D0000127A0000093D000000D00702 +:10F71800A00F000004000000FFFFFFFFFFFFFFFF36 +:10F72800B4000008C0000008CC000008D800000899 +:10F7380000000000007F00000000001000800100B1 +:10F74800017F00000080011000001C000280000002 +:10F758000000001800001C00077F000000801D103A +:10F768000048000001000000060000001100000031 +:10F778000000000000000000000000000000000081 +:10F788000100000000000000000000000000000070 +:10F79800000000000000000004000000000000005D +:10F7A800F05E0108545F01083C5F0108C05E010873 +:10F7B80000000000A85E0108D85E010800000000F3 +:10F7C800085F0108205F01086C5F0108BC010008A0 +:10F7D8000000000000000000000000000000000021 +:10F7E8000000000000000000000000000100000010 +:10F7F80004000000000000000000001800000000E5 +:10F8080000000000180100086C0100088005314064 +:10F8180002000000110000008005314001000000D6 +:10F8280011000000800531400000000011000000B8 +:10F838000006314004000000110000005A000000DA +:10F8480000000000FFFFFFFF0000000008000000AC +:10F85800000000000100000088010008000000000E +:10F86800000000000700A00001000000F0010008EF +:10F8780000000000F0F4001010F50010D0F40010A3 +:10F888000000000000000000000000000000000070 +:10F898000000000000000000000000000000000060 +:10F8A8000000000000000000000000000000000050 +:10F8B8000000000000000000000000000000000040 +:10F8C8000000000000000000000000000000000030 +:10F8D80043000000000000000000000000000000DD +:10F8E8000000000000000000000000000000000010 +:10F8F80043000000000000000000000000000000BD +:10F9080000000000000000000000000000000000EF +:10F91800430000000000000000000000000000009C +:10F9280000000000000000000000000000000000CF +:10F93800430000000000000000000000000000007C +:10F9480000000000000000000000000000000000AF +:10F95800430000000000000000000000000000005C +:10F96800000000000000000000000000000000008F +:10F97800430000000000000000000000000000003C +:10F98800000000000000000000000000000000006F +:10F99800430000000000000000000000000000001C +:10F9A800000000000000000000000000000000004F +:10F9B80015D0001055C700100000000039F30010E2 +:10F9C80038F50010EFF20010EFF20010EFF200101F +:10F9D800EFF20010EFF20010EFF20010EFF200105B +:10F9E800EFF20010EFF20010FFFFFFFFFFFFFFFF35 +:10F9F800FFFFFFFFFFFF000001004153434949009B +:10FA080000000000000000000000000000000000EE +:10FA18000000000000000000000041534349490075 +:10FA280000000000000000000000000000000000CE +:10FA3800000000000000000000000000A900001005 +:10FA48008100001010B50004440B002827D0144B87 +:10FA58001A68136ABA21515ACA00521A9B181B68AD +:10FA6800002BF4DA0F4B3E221A600F4B0F4A1A6034 +:10FA78000F4BA322D200062199500E4A9C509B5846 +:10FA8800074B1A68136AB431515ACA00521A9B18A4 +:10FA980000225A60064A074BD358002BFADA10BDE9 +:10FAA800D45F010804012640080126401E1F0000FB +:10FAB800000026401C05000010B54378FF2B00D03D +:10FAC80010BD00F035F9124B1A683323D35C032BB1 +:10FAD80000D801BE0E4B1A68136ABA21515A4A005F +:10FAE80052189B18DB680B4A13600B4A00211160FF +:10FAF80001310A4A11605A68094B1A6013680B43AE +:10FB080013601368DB07FCD400F03AF9D8E7C04665 +:10FB1800D45F010800600108F45F0108F85F01087C +:10FB2800FC5F0108F0B583B0009001914D4B1A6855 +:10FB38003323D35C002B00D101BE4A4B1B681F6ADC +:10FB4800BC229C58E4196C3A9B5C002B69D000F0ED +:10FB5800E7F8060003280ED000F0EAF80500424A4C +:10FB6800424BD358002B3DDB414C032E52D028008A +:10FB780000F006F96DE03B4B1A683323D35C062B83 +:10FB880000D801BE374B1968BA23CA5A53009A18CD +:10FB980052000B6A9C466244BC23CB589B181B68D6 +:10FBA800002B5BDB002000F0DBF8324B984257D08B +:10FBB800314B1A6800230021012000F0D9F8051EF6 +:10FBC80002D02B4C45E00135002000F0C9F8294B44 +:10FBD800984202D0294B9D42F5D9284B9D42BBD96A +:10FBE800234C36E0264A0121380000F0A9F8002805 +:10FBF80001D01F4CB9E70198FFF724FF009B002BA9 +:10FC080006D02368002BFCDB00F0C2F80400ACE748 +:10FC18001C4CAAE70121002000F09AF80028F9D12D +:10FC2800A5E700F085F80600154A0121380000F024 +:10FC380087F8002809D1009B002B0DD02368002BE2 +:10FC4800FCDB00F0A5F8040000E0094C300000F0EF +:10FC580097F8200003B0F0BD0A4CF7E7044CF8E72A +:10FC6800034CF6E7D45F0108000026401C0500009D +:10FC78000500520001018800F05F0108EF49020009 +:10FC8800E05F010801005000F0B5C64600B51C4B06 +:10FC98001B6859681B4A136904242343136101280C +:10FCA8002CD030BF86235B00CB58002B23D1164CB9 +:10FCB8002768164BA320C0001E58154A90461568A1 +:10FCC800144A226006241C503E2042461060124A04 +:10FCD800063098500D4A104BD358002BFADA862379 +:10FCE8005B000E4ACA50084B1F60084AA323DB007A +:10FCF800D650074B1D6080BCB846F0BD20BFD1E789 +:10FD0800D45F010800ED00E008012640000026400D +:10FD1800040126401E1F00001C050000AAAAAAAA6A +:10FD280001B40248844601BC604700BFE5060010E4 +:10FD380001B40248844601BC604700BF9B0500101F +:10FD480001B40248844601BC604700BF514E001010 +:10FD580001B40248844601BC604700BF415200100C +:10FD680001B40248844601BC604700BFC15200107C +:10FD780001B40248844601BC604700BFF54F00103B +:10FD880001B40248844601BC604700BFA3050010C7 +:10FD980001B40248844601BC604700BF55490010C1 +:10FDA800000000000000000000000000000000004B +:08FDB800000000000000000043 +:020000041600E4 +:08080000ACE100100000000053 +:107C0000FC01000020122101000000000008001605 +:107C10000000001000000000000000000000000054 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000C20200000000B33BD1 +:0400000510000507DB +:00000001FF diff --git a/examples/ota-requestor-app/p6/ota_base_build.sh b/examples/ota-requestor-app/p6/ota_base_build.sh new file mode 100755 index 00000000000000..69ca770cc8a613 --- /dev/null +++ b/examples/ota-requestor-app/p6/ota_base_build.sh @@ -0,0 +1,8 @@ +OUT_DIR=out/ota_requestor_debug/ +ANYCLOUD_DIR=third_party/p6/p6_sdk/libs/anycloud-ota/ + +./scripts/examples/gn_p6_example.sh examples/ota-requestor-app/p6/ "$OUT_DIR" + +mv "$OUT_DIR"/chip-p6-ota-requestor-example.hex "$OUT_DIR"/chip-p6-ota-requestor-example.unsigned.hex + +./"$ANYCLOUD_DIR"/scripts/sign_script.bash "$OUT_DIR"/ chip-p6-ota-requestor-example python3 arm-none-eabi-objcopy "-O ihex" "" "$ANYCLOUD_DIR"/source/mcuboot/scripts/ imgtool_v1.7.0/imgtool.py create 0xFF 0x400 3584 1.0.0 0x00018000 0x001C0000 arm-none-eabi-objcopy "" diff --git a/examples/ota-requestor-app/p6/ota_update_build.sh b/examples/ota-requestor-app/p6/ota_update_build.sh new file mode 100755 index 00000000000000..8dbe33869b2ed8 --- /dev/null +++ b/examples/ota-requestor-app/p6/ota_update_build.sh @@ -0,0 +1,8 @@ +OUT_DIR=out/ota_requestor_update_debug/ +ANYCLOUD_DIR=third_party/p6/p6_sdk/libs/anycloud-ota/ + +./scripts/examples/gn_p6_example.sh examples/ota-requestor-app/p6/ "$OUT_DIR" build_update_image=true + +mv "$OUT_DIR"/chip-p6-ota-requestor-example.hex "$OUT_DIR"/chip-p6-ota-requestor-example.unsigned.hex + +./"$ANYCLOUD_DIR"/scripts/sign_script.bash "$OUT_DIR" chip-p6-ota-requestor-example python3 arm-none-eabi-objcopy "-O ihex" "" "$ANYCLOUD_DIR"/source/mcuboot/scripts/ imgtool_v1.7.0/imgtool.py sign 0xFF 0x400 3584 1.0.0 0x00018000 0x001C0000 arm-none-eabi-objcopy "-k $ANYCLOUD_DIR/source/mcuboot/keys/cypress-test-ec-p256.pem" diff --git a/examples/ota-requestor-app/p6/src/AppTask.cpp b/examples/ota-requestor-app/p6/src/AppTask.cpp new file mode 100644 index 00000000000000..ef45532e6af40d --- /dev/null +++ b/examples/ota-requestor-app/p6/src/AppTask.cpp @@ -0,0 +1,465 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2019 Google LLC. + * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company) + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AppTask.h" +#include "AppConfig.h" +#include "AppEvent.h" +#include "ButtonHandler.h" +#include "LEDWidget.h" +#include "app/clusters/ota-requestor/BDXDownloader.h" +#include "app/clusters/ota-requestor/OTARequestor.h" +#include "platform/GenericOTARequestorDriver.h" +#include "platform/P6/OTAImageProcessorImpl.h" +#include "qrcodegen.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +extern "C" { +#include "cy_smif_psoc6.h" +} + +#define FACTORY_RESET_TRIGGER_TIMEOUT 3000 +#define FACTORY_RESET_CANCEL_WINDOW_TIMEOUT 3000 +#define APP_TASK_STACK_SIZE (4096) +#define APP_TASK_PRIORITY 2 +#define APP_EVENT_QUEUE_SIZE 10 + +using chip::BDXDownloader; +using chip::CharSpan; +using chip::FabricIndex; +using chip::GetRequestorInstance; +using chip::NodeId; +using chip::OTADownloader; +using chip::OTAImageProcessorImpl; +using chip::OTAImageProcessorParams; +using chip::OTARequestor; +using chip::System::Layer; + +using namespace ::chip; +using namespace chip::TLV; +using namespace ::chip::Credentials; +using namespace ::chip::DeviceLayer; +using namespace ::chip::System; + +namespace { +TimerHandle_t sFunctionTimer; // FreeRTOS app sw timer. + +TaskHandle_t sAppTaskHandle; +QueueHandle_t sAppEventQueue; + +LEDWidget sStatusLED; + +bool sIsWiFiStationProvisioned = false; +bool sIsWiFiStationEnabled = false; +bool sIsWiFiStationConnected = false; +bool sHaveBLEConnections = false; + +uint8_t sAppEventQueueBuffer[APP_EVENT_QUEUE_SIZE * sizeof(AppEvent)]; +StaticQueue_t sAppEventQueueStruct; + +StackType_t appStack[APP_TASK_STACK_SIZE / sizeof(StackType_t)]; +StaticTask_t appTaskStruct; + +OTARequestor gRequestorCore; +GenericOTARequestorDriver gRequestorUser; +BDXDownloader gDownloader; +OTAImageProcessorImpl gImageProcessor; + +app::Clusters::NetworkCommissioning::Instance + sWiFiNetworkCommissioningInstance(0 /* Endpoint Id */, &(NetworkCommissioning::P6WiFiDriver::GetInstance())); +} // namespace + +void OnTriggerUpdateTimerHandler(Layer * systemLayer, void * appState); + +AppTask AppTask::sAppTask; + +void NetWorkCommissioningInstInit() +{ + sWiFiNetworkCommissioningInstance.Init(); +} + +CHIP_ERROR AppTask::StartAppTask() +{ + sAppEventQueue = xQueueCreateStatic(APP_EVENT_QUEUE_SIZE, sizeof(AppEvent), sAppEventQueueBuffer, &sAppEventQueueStruct); + if (sAppEventQueue == NULL) + { + P6_LOG("Failed to allocate app event queue"); + appError(APP_ERROR_EVENT_QUEUE_FAILED); + } + + // Start App task. + sAppTaskHandle = xTaskCreateStatic(AppTaskMain, APP_TASK_NAME, ArraySize(appStack), NULL, 1, appStack, &appTaskStruct); + return (sAppTaskHandle == nullptr) ? APP_ERROR_CREATE_TASK_FAILED : CHIP_NO_ERROR; +} + +CHIP_ERROR AppTask::Init() +{ + CHIP_ERROR err = CHIP_NO_ERROR; + + int rc = boot_set_confirmed(); + if (rc != 0) + { + P6_LOG("boot_set_confirmed failed"); + appError(CHIP_ERROR_WELL_UNINITIALIZED); + } + + // Register the callback to init the MDNS server when connectivity is available + PlatformMgr().AddEventHandler( + [](const ChipDeviceEvent * event, intptr_t arg) { + // Restart the server whenever an ip address is renewed + if (event->Type == DeviceEventType::kInternetConnectivityChange) + { + if (event->InternetConnectivityChange.IPv4 == kConnectivity_Established || + event->InternetConnectivityChange.IPv6 == kConnectivity_Established) + { + chip::app::DnssdServer::Instance().StartServer(); + } + } + }, + 0); + // Init ZCL Data Model + chip::Server::GetInstance().Init(); + + // Initialize device attestation config + SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); + + // Initialise WSTK buttons PB0 and PB1 (including debounce). + ButtonHandler::Init(); + + // Create FreeRTOS sw timer for Function Selection. + sFunctionTimer = xTimerCreate("FnTmr", // Just a text name, not used by the RTOS kernel + 1, // == default timer period (mS) + false, // no timer reload (==one-shot) + (void *) this, // init timer id = app task obj context + TimerEventHandler // timer callback handler + ); + if (sFunctionTimer == NULL) + { + P6_LOG("funct timer create failed"); + appError(APP_ERROR_CREATE_TIMER_FAILED); + } + + NetWorkCommissioningInstInit(); + + // Initialize LEDs + sStatusLED.Init(SYSTEM_STATE_LED); + + ConfigurationMgr().LogDeviceConfig(); + + SetRequestorInstance(&gRequestorCore); + gRequestorCore.Init(&(Server::GetInstance()), &gRequestorUser, &gDownloader); + gImageProcessor.SetOTADownloader(&gDownloader); + gDownloader.SetImageProcessorDelegate(&gImageProcessor); + gRequestorUser.Init(&gRequestorCore, &gImageProcessor); + + uint32_t savedSoftwareVersion; + err = ConfigurationMgr().GetSoftwareVersion(savedSoftwareVersion); + if (err != CHIP_NO_ERROR) + { + P6_LOG("Can't get saved software version"); + appError(err); + } + + if (savedSoftwareVersion != CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION) + { + ConfigurationMgr().StoreSoftwareVersion(CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION); + + P6_LOG("Confirming update to version: %u", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION); + chip::OTARequestorInterface * requestor = chip::GetRequestorInstance(); + if (requestor != nullptr) + { + requestor->NotifyUpdateApplied(savedSoftwareVersion); + } + } + + P6_LOG("Current Software Version: %u", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION); + P6_LOG("Current Firmware Version: %s", CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING); + + // Print setup info + PrintOnboardingCodes(chip::RendezvousInformationFlag(chip::RendezvousInformationFlag::kBLE)); + + return err; +} + +void AppTask::AppTaskMain(void * pvParameter) +{ + AppEvent event; + CHIP_ERROR err = sAppTask.Init(); + if (err != CHIP_NO_ERROR) + { + P6_LOG("AppTask.Init() failed"); + appError(err); + } + + P6_LOG("App Task started"); + + while (true) + { + BaseType_t eventReceived = xQueueReceive(sAppEventQueue, &event, pdMS_TO_TICKS(10)); + while (eventReceived == pdTRUE) + { + sAppTask.DispatchEvent(&event); + eventReceived = xQueueReceive(sAppEventQueue, &event, 0); + } + + // Update the status LED if factory reset has not been initiated. + // + // If system has "full connectivity", keep the LED On constantly. + // + // If thread and service provisioned, but not attached to the thread network + // yet OR no connectivity to the service OR subscriptions are not fully + // established THEN blink the LED Off for a short period of time. + // + // If the system has ble connection(s) uptill the stage above, THEN blink + // the LEDs at an even rate of 100ms. + // + // Otherwise, blink the LED ON for a very short time. + if (sAppTask.mFunction != Function::kFactoryReset) + { + if (sIsWiFiStationEnabled && sIsWiFiStationProvisioned && !sIsWiFiStationConnected) + { + sStatusLED.Blink(950, 50); + } + else if (sHaveBLEConnections) + { + sStatusLED.Blink(100, 100); + } + else + { + sStatusLED.Blink(50, 950); + } + } + + sStatusLED.Animate(); + } +} + +void AppTask::ButtonEventHandler(uint8_t btnIdx, uint8_t btnAction) +{ + if (btnIdx != APP_FUNCTION_BUTTON_IDX && btnIdx != APP_UPDATE_BUTTON_IDX) + { + return; + } + + AppEvent button_event = {}; + button_event.Type = AppEvent::kEventType_Button; + button_event.ButtonEvent.ButtonIdx = btnIdx; + button_event.ButtonEvent.Action = btnAction; + + if (btnIdx == APP_FUNCTION_BUTTON_IDX) + { + button_event.Handler = FunctionHandler; + sAppTask.PostEvent(&button_event); + } + if (btnIdx == APP_UPDATE_BUTTON_IDX) + { + button_event.Handler = UpdateButtonHandler; + sAppTask.PostEvent(&button_event); + } +} + +void AppTask::TimerEventHandler(TimerHandle_t xTimer) +{ + AppEvent event; + event.Type = AppEvent::kEventType_Timer; + event.TimerEvent.Context = (void *) xTimer; + event.Handler = FunctionTimerEventHandler; + sAppTask.PostEvent(&event); +} + +void AppTask::FunctionTimerEventHandler(AppEvent * aEvent) +{ + if (aEvent->Type != AppEvent::kEventType_Timer) + { + return; + } + + // If we reached here, the button was held past FACTORY_RESET_TRIGGER_TIMEOUT, + // initiate factory reset + if (sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kStartBleAdv) + { + P6_LOG("Factory Reset Triggered. Release button within %ums to cancel.", FACTORY_RESET_CANCEL_WINDOW_TIMEOUT); + + // Start timer for FACTORY_RESET_CANCEL_WINDOW_TIMEOUT to allow user to + // cancel, if required. + sAppTask.StartTimer(FACTORY_RESET_CANCEL_WINDOW_TIMEOUT); + + sAppTask.mFunction = Function::kFactoryReset; + + // Turn off all LEDs before starting blink to make sure blink is + // co-ordinated. + sStatusLED.Set(false); + + sStatusLED.Blink(500); + } + else if (sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kFactoryReset) + { + // Actually trigger Factory Reset + sAppTask.mFunction = Function::kNoneSelected; + ConfigurationMgr().InitiateFactoryReset(); + } +} + +void AppTask::FunctionHandler(AppEvent * aEvent) +{ + // To trigger software update: press the APP_FUNCTION_BUTTON button briefly (< + // FACTORY_RESET_TRIGGER_TIMEOUT) To initiate factory reset: press the + // APP_FUNCTION_BUTTON for FACTORY_RESET_TRIGGER_TIMEOUT + + // FACTORY_RESET_CANCEL_WINDOW_TIMEOUT All LEDs start blinking after + // FACTORY_RESET_TRIGGER_TIMEOUT to signal factory reset has been initiated. + // To cancel factory reset: release the APP_FUNCTION_BUTTON once all LEDs + // start blinking within the FACTORY_RESET_CANCEL_WINDOW_TIMEOUT + if (aEvent->ButtonEvent.Action == APP_BUTTON_RELEASED) + { + if (!sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kNoneSelected) + { + sAppTask.StartTimer(FACTORY_RESET_TRIGGER_TIMEOUT); + sAppTask.mFunction = Function::kStartBleAdv; + } + } + else + { + // If the button was released before factory reset got initiated, start Thread Network + if (sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kStartBleAdv) + { + sAppTask.CancelTimer(); + sAppTask.mFunction = Function::kNoneSelected; + } + else if (sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kFactoryReset) + { + + sAppTask.CancelTimer(); + + // Change the function to none selected since factory reset has been + // canceled. + sAppTask.mFunction = Function::kNoneSelected; + + P6_LOG("Factory Reset has been Canceled"); + } + } +} + +void AppTask::UpdateButtonHandler(AppEvent * aEvent) +{ + if (aEvent->ButtonEvent.Action == APP_BUTTON_RELEASED) + { + chip::DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Milliseconds32(2000), OnTriggerUpdateTimerHandler, + nullptr); + } +} + +void AppTask::CancelTimer() +{ + if (xTimerStop(sFunctionTimer, 0) == pdFAIL) + { + P6_LOG("app timer stop() failed"); + appError(APP_ERROR_STOP_TIMER_FAILED); + } + + mFunctionTimerActive = false; +} + +void AppTask::StartTimer(uint32_t aTimeoutInMs) +{ + if (xTimerIsTimerActive(sFunctionTimer)) + { + P6_LOG("app timer already started!"); + CancelTimer(); + } + + // timer is not active, change its period to required value (== restart). + // FreeRTOS- Block for a maximum of 100 ticks if the change period command + // cannot immediately be sent to the timer command queue. + if (xTimerChangePeriod(sFunctionTimer, aTimeoutInMs / portTICK_PERIOD_MS, 100) != pdPASS) + { + P6_LOG("app timer start() failed"); + appError(APP_ERROR_START_TIMER_FAILED); + } + + mFunctionTimerActive = true; +} + +void AppTask::PostEvent(const AppEvent * aEvent) +{ + if (sAppEventQueue != NULL) + { + BaseType_t status; + if (xPortIsInsideInterrupt()) + { + BaseType_t higherPrioTaskWoken = pdFALSE; + status = xQueueSendFromISR(sAppEventQueue, aEvent, &higherPrioTaskWoken); + +#ifdef portYIELD_FROM_ISR + portYIELD_FROM_ISR(higherPrioTaskWoken); +#elif portEND_SWITCHING_ISR // portYIELD_FROM_ISR or portEND_SWITCHING_ISR + portEND_SWITCHING_ISR(higherPrioTaskWoken); +#else // portYIELD_FROM_ISR or portEND_SWITCHING_ISR +#error "Must have portYIELD_FROM_ISR or portEND_SWITCHING_ISR" +#endif // portYIELD_FROM_ISR or portEND_SWITCHING_ISR + } + else + { + status = xQueueSend(sAppEventQueue, aEvent, 1); + } + + if (!status) + P6_LOG("Failed to post event to app task event queue"); + } + else + { + P6_LOG("Event Queue is NULL should never happen"); + } +} + +void AppTask::DispatchEvent(AppEvent * aEvent) +{ + if (aEvent->Handler) + { + aEvent->Handler(aEvent); + } + else + { + P6_LOG("Event received with no handler. Dropping event."); + } +} + +void OnTriggerUpdateTimerHandler(Layer * systemLayer, void * appState) +{ + P6_LOG("Triggering immediate OTA update query"); + + OTARequestor * req = static_cast(GetRequestorInstance()); + req->TriggerImmediateQuery(); +} diff --git a/examples/ota-requestor-app/p6/src/ButtonHandler.cpp b/examples/ota-requestor-app/p6/src/ButtonHandler.cpp new file mode 100644 index 00000000000000..9701eca6e976a1 --- /dev/null +++ b/examples/ota-requestor-app/p6/src/ButtonHandler.cpp @@ -0,0 +1,98 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2019 Google LLC. + * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company) + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ButtonHandler.h" +#include "AppConfig.h" +#include "AppTask.h" + +namespace { +constexpr int kButtonCount = 2; + +TimerHandle_t buttonTimers[kButtonCount]; // FreeRTOS timers used for debouncing +// buttons. Array to hold handles to +// the created timers. + +} // namespace + +void ButtonHandler::Init(void) +{ + GpioInit(); + // Create FreeRTOS sw timers for debouncing buttons. + for (uint8_t i = 0; i < kButtonCount; i++) + { + buttonTimers[i] = xTimerCreate("BtnTmr", // Just a text name, not used by the RTOS kernel + APP_BUTTON_DEBOUNCE_PERIOD_MS, // timer period + false, // no timer reload (==one-shot) + (void *) (int) i, // init timer id = button index + TimerCallback // timer callback handler (all buttons use + // the same timer cn function) + ); + } +} + +void ButtonHandler::GpioInit(void) +{ + cy_rslt_t result = CY_RSLT_SUCCESS; + // Set up button GPIOs to input with pullups. + result = cyhal_gpio_init(APP_UPDATE_BUTTON, CYHAL_GPIO_DIR_INPUT, CYHAL_GPIO_DRIVE_PULLUP, CYBSP_BTN_OFF); + if (result != CY_RSLT_SUCCESS) + { + printf(" cyhal_gpio_init failed for APP_LOCK_BUTTON\r\n"); + } + result = cyhal_gpio_init(APP_FUNCTION_BUTTON, CYHAL_GPIO_DIR_INPUT, CYHAL_GPIO_DRIVE_PULLUP, CYBSP_BTN_OFF); + if (result != CY_RSLT_SUCCESS) + { + printf(" cyhal_gpio_init failed for APP_FUNCTION_BUTTON\r\n"); + } + /* Configure GPIO interrupt. */ + cyhal_gpio_register_callback(APP_UPDATE_BUTTON, lockbuttonIsr, NULL); + cyhal_gpio_register_callback(APP_FUNCTION_BUTTON, functionbuttonIsr, NULL); + cyhal_gpio_enable_event(APP_UPDATE_BUTTON, CYHAL_GPIO_IRQ_FALL, GPIO_INTERRUPT_PRIORITY, true); + cyhal_gpio_enable_event(APP_FUNCTION_BUTTON, CYHAL_GPIO_IRQ_FALL, GPIO_INTERRUPT_PRIORITY, true); +} + +void ButtonHandler::lockbuttonIsr(void * handler_arg, cyhal_gpio_event_t event) +{ + portBASE_TYPE taskWoken = pdFALSE; + xTimerStartFromISR(buttonTimers[APP_UPDATE_BUTTON_IDX], &taskWoken); +} + +void ButtonHandler::functionbuttonIsr(void * handler_arg, cyhal_gpio_event_t event) +{ + portBASE_TYPE taskWoken = pdFALSE; + xTimerStartFromISR(buttonTimers[APP_FUNCTION_BUTTON_IDX], &taskWoken); +} + +void ButtonHandler::TimerCallback(TimerHandle_t xTimer) +{ + // Get the button index of the expired timer and call button event helper. + uint32_t timerId; + uint8_t buttonevent = 0; + timerId = (uint32_t) pvTimerGetTimerID(xTimer); + if (timerId) + { + buttonevent = cyhal_gpio_read(APP_FUNCTION_BUTTON); + } + else + { + buttonevent = cyhal_gpio_read(APP_UPDATE_BUTTON); + } + GetAppTask().ButtonEventHandler(timerId, (buttonevent) ? APP_BUTTON_PRESSED : APP_BUTTON_RELEASED); +} diff --git a/examples/ota-requestor-app/p6/src/ZclCallbacks.cpp b/examples/ota-requestor-app/p6/src/ZclCallbacks.cpp new file mode 100644 index 00000000000000..f1f6f41c0e07b6 --- /dev/null +++ b/examples/ota-requestor-app/p6/src/ZclCallbacks.cpp @@ -0,0 +1,56 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file + * This file implements the handler for data model messages. + */ + +#include "AppConfig.h" +#include + +#include +#include +#include +#include +#include + +using namespace ::chip; +using namespace ::chip::app::Clusters; + +void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t mask, uint8_t type, + uint16_t size, uint8_t * value) +{ + EndpointId endpoint = attributePath.mEndpointId; + ClusterId clusterId = attributePath.mClusterId; + AttributeId attributeId = attributePath.mAttributeId; + P6_LOG("MatterPostAttributeChangeCallback - Cluster ID: " ChipLogFormatMEI + ", EndPoint ID: '0x%02x', Attribute ID: " ChipLogFormatMEI, + ChipLogValueMEI(clusterId), endpoint, ChipLogValueMEI(attributeId)); + + switch (clusterId) + { + case Identify::Id: + ChipLogProgress(Zcl, "Identify attribute ID: " ChipLogFormatMEI " Type: %u Value: %" PRIu16 ", length %" PRIu16, + ChipLogValueMEI(attributeId), type, *value, size); + break; + default: + P6_LOG("Unhandled cluster ID: " ChipLogFormatMEI, ChipLogValueMEI(clusterId)); + break; + } +} diff --git a/examples/ota-requestor-app/p6/src/cy8c6xxa_cm4_dual_ota_int.ld b/examples/ota-requestor-app/p6/src/cy8c6xxa_cm4_dual_ota_int.ld new file mode 100644 index 00000000000000..d1717ff3e47ff0 --- /dev/null +++ b/examples/ota-requestor-app/p6/src/cy8c6xxa_cm4_dual_ota_int.ld @@ -0,0 +1,404 @@ +/***************************************************************************//** +* \file cy8c6xxa_cm4_dual.ld +* \version 2.60 +* +* Linker file for the GNU C compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2019 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + +/* Size of the stack section at the end of CM4 SRAM */ +STACK_SIZE = 0x1000; + +/* Size of the Cortex-M0+ application image at the start of FLASH - passed in as argument to ld.exe*/ +/* MCUBOOT_BOOTLOADER_SIZE = 0x12000; */ + +/* MCUBoot Header Size passed in as argument to ld.exe */ +/* MCUBOOT_HEADER_SIZE = 0x1000; */ + +/* CY_BOOT_PRIMARY_1_SIZE Slot 1 size passed in as argument to ld.exe */ +/* CY_BOOT_PRIMARY_1_SIZE = 0x0EE000 (Internal FLASH) */ +/* CY_BOOT_PRIMARY_1_SIZE = 0x10C000 (External FLASH) */ + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) + +/* The MEMORY section below describes the location and size of blocks of memory in the target. +* Use this section to specify the memory regions available for allocation. +*/ +MEMORY +{ + /* The ram and flash regions control RAM and flash memory allocation for the CM4 core. + * You can change the memory allocation by editing the 'ram' and 'flash' regions. + * Note that 2 KB of RAM (at the end of the SRAM) are reserved for system use. + * Using this memory region for other purposes will lead to unexpected behavior. + * Your changes must be aligned with the corresponding memory regions for CM0+ core in 'xx_cm0plus.ld', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.ld'. + */ + ram (rwx) : ORIGIN = 0x08020800, LENGTH = 0xDF000 + flash (rx) : ORIGIN = 0x10000000 + MCUBOOT_BOOTLOADER_SIZE, LENGTH = CY_BOOT_PRIMARY_1_SIZE + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 /* 32 KB */ + + /* The following regions define device specific memory regions and must not be changed. */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 /* Supervisory flash: User data */ + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 /* Supervisory flash: Normal Access Restrictions (NAR) */ + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 /* Supervisory flash: Public Key */ + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 */ + sflash_rtoc_2 (rx) : ORIGIN = 0x16007E00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 Copy */ + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ + + +SECTIONS +{ + /* Cortex-M4 application flash area */ + .text ORIGIN(flash) + MCUBOOT_HEADER_SIZE : + { + . = ALIGN(8); + __cy_app_load_addr = . ; + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(8); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(8); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc6_02_cm4.S */ + .copy.table : + { + . = ALIGN(8); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6_02_cm4.S */ + .zero.table : + { + . = ALIGN(8); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(8); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(8); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(8); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(8); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(8); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(8); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(8); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + . = ORIGIN(ram) + LENGTH(ram) - STACK_SIZE; + __HeapLimit = .; + } > ram + + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Used for the digital signature of the secure application and the Bootloader SDK application. + * The size of the section depends on the required data size. */ + .cy_app_signature ORIGIN(flash) + LENGTH(flash) - 256 : + { + KEEP(*(.cy_app_signature)) + } > flash + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom (NOLOAD): + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: Table of Content # 2 Copy */ + .cy_rtoc_part2 : + { + KEEP(*(.cy_rtoc_part2)) + } > sflash_rtoc_2 + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00200000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/examples/ota-requestor-app/p6/src/main.cpp b/examples/ota-requestor-app/p6/src/main.cpp new file mode 100644 index 00000000000000..f2bcc8b51fba57 --- /dev/null +++ b/examples/ota-requestor-app/p6/src/main.cpp @@ -0,0 +1,158 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2019 Google LLC. + * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company) + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#include "AppConfig.h" +#include "cyhal_wdt.h" +#include "init_p6Platform.h" +#include + +#ifdef HEAP_MONITORING +#include "MemMonitoring.h" +#endif +#define MAIN_TASK_STACK_SIZE (4096) +#define MAIN_TASK_PRIORITY 2 + +using namespace ::chip; +using namespace ::chip::Inet; +using namespace ::chip::DeviceLayer; + +volatile int apperror_cnt; +static void main_task(void * pvParameters); + +// ================================================================================ +// App Error +//================================================================================= +void appError(int err) +{ + P6_LOG("!! App Critical Error: %d !!", err); + portDISABLE_INTERRUPTS(); + while (1) + ; +} + +void appError(CHIP_ERROR error) +{ + appError(static_cast(error.AsInteger())); +} + +// ================================================================================ +// FreeRTOS Callbacks +// ================================================================================ +extern "C" void vApplicationIdleHook(void) +{ + // FreeRTOS Idle callback +} + +extern "C" void vApplicationDaemonTaskStartupHook() +{ + // Init Chip memory management before the stack + chip::Platform::MemoryInit(); + + /* Create the Main task. */ + xTaskCreate(main_task, "Main task", MAIN_TASK_STACK_SIZE, NULL, MAIN_TASK_PRIORITY, NULL); +} + +static void main_task(void * pvParameters) +{ + CHIP_ERROR ret = chip::DeviceLayer::PersistedStorage::KeyValueStoreMgrImpl().Init(); + if (ret != CHIP_NO_ERROR) + { + P6_LOG("PersistedStorage::KeyValueStoreMgrImpl().Init() failed"); + appError(ret); + } + + ret = PlatformMgr().InitChipStack(); + if (ret != CHIP_NO_ERROR) + { + P6_LOG("PlatformMgr().InitChipStack() failed"); + appError(ret); + } + + ret = chip::DeviceLayer::ConnectivityMgr().SetBLEDeviceName("P6_OTA_REQ"); + if (ret != CHIP_NO_ERROR) + { + P6_LOG("ConnectivityMgr().SetBLEDeviceName() failed"); + appError(ret); + } + + P6_LOG("Starting Platform Manager Event Loop"); + ret = PlatformMgr().StartEventLoopTask(); + if (ret != CHIP_NO_ERROR) + { + P6_LOG("PlatformMgr().StartEventLoopTask() failed"); + appError(ret); + } + ret = GetAppTask().StartAppTask(); + if (ret != CHIP_NO_ERROR) + { + P6_LOG("GetAppTask().Init() failed"); + appError(ret); + } + + /* Delete task */ + vTaskDelete(NULL); +} + +// ================================================================================ +// Main Code +// ================================================================================ +int main(void) +{ + init_p6Platform(); + + // Clear watchdog timer (started by bootloader) so that it doesn't trigger a reset + cyhal_wdt_t wdt_obj; + cyhal_wdt_init(&wdt_obj, cyhal_wdt_get_max_timeout_ms()); + cyhal_wdt_free(&wdt_obj); + +#ifdef HEAP_MONITORING + MemMonitoring::startHeapMonitoring(); +#endif + + P6_LOG("==================================================\r\n"); + P6_LOG("chip-p6-ota-requestor-example starting\r\n"); + P6_LOG("==================================================\r\n"); + + /* Start the FreeRTOS scheduler */ + vTaskStartScheduler(); + + chip::Platform::MemoryShutdown(); + PlatformMgr().StopEventLoopTask(); + PlatformMgr().Shutdown(); + + // Should never get here. + P6_LOG("vTaskStartScheduler() failed"); +} diff --git a/examples/ota-requestor-app/p6/third_party/connectedhomeip b/examples/ota-requestor-app/p6/third_party/connectedhomeip new file mode 120000 index 00000000000000..11a54ed360106c --- /dev/null +++ b/examples/ota-requestor-app/p6/third_party/connectedhomeip @@ -0,0 +1 @@ +../../../../ \ No newline at end of file diff --git a/scripts/examples/gn_p6_example.sh b/scripts/examples/gn_p6_example.sh index 29871cc4033e5f..6d718f0d785235 100755 --- a/scripts/examples/gn_p6_example.sh +++ b/scripts/examples/gn_p6_example.sh @@ -41,14 +41,36 @@ env # Build steps EXAMPLE_DIR=$1 +shift OUTPUT_DIR=out/example_app P6_BOARD=CY8CKIT-062S2-43012 -if [[ ! -z "$2" ]]; then - OUTPUT_DIR=$2 +if [[ ! -z "$1" ]]; then + OUTPUT_DIR=$1 + shift fi -gn gen --check --fail-on-unused-args "$OUTPUT_DIR" --root="$EXAMPLE_DIR" --args="p6_board=\"$P6_BOARD\"" -ninja -C "$OUTPUT_DIR" +GN_ARGS=() +NINJA_ARGS=() +for arg; do + case $arg in + -v) + NINJA_ARGS+=(-v) + ;; + *=*) + GN_ARGS+=("$arg") + ;; + *import*) + GN_ARGS+=("$arg") + ;; + *) + echo >&2 "invalid argument: $arg" + exit 2 + ;; + esac +done + +gn gen --check --fail-on-unused-args "$OUTPUT_DIR" --root="$EXAMPLE_DIR" --args="p6_board=\"$P6_BOARD\" ${GN_ARGS[*]}" +ninja -C "$OUTPUT_DIR" "${NINJA_ARGS[@]}" #print stats arm-none-eabi-size -A "$OUTPUT_DIR"/*.out diff --git a/src/include/platform/ConfigurationManager.h b/src/include/platform/ConfigurationManager.h index a06e07d9f1c640..d78d04a1528d6f 100644 --- a/src/include/platform/ConfigurationManager.h +++ b/src/include/platform/ConfigurationManager.h @@ -118,6 +118,7 @@ class ConfigurationManager virtual CHIP_ERROR StorePrimaryWiFiMACAddress(const uint8_t * buf) = 0; virtual CHIP_ERROR StorePrimary802154MACAddress(const uint8_t * buf) = 0; virtual CHIP_ERROR StoreManufacturingDate(const char * mfgDate, size_t mfgDateLen) = 0; + virtual CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer) = 0; virtual CHIP_ERROR StoreHardwareVersion(uint16_t hardwareVer) = 0; virtual CHIP_ERROR StoreSetupPinCode(uint32_t setupPinCode) = 0; virtual CHIP_ERROR StoreSetupDiscriminator(uint16_t setupDiscriminator) = 0; diff --git a/src/include/platform/internal/GenericConfigurationManagerImpl.cpp b/src/include/platform/internal/GenericConfigurationManagerImpl.cpp index d5ec5cd6f2af5d..54ed92f12cdb76 100644 --- a/src/include/platform/internal/GenericConfigurationManagerImpl.cpp +++ b/src/include/platform/internal/GenericConfigurationManagerImpl.cpp @@ -94,6 +94,12 @@ CHIP_ERROR GenericConfigurationManagerImpl::GetSoftwareVersion(uint return CHIP_NO_ERROR; } +template +inline CHIP_ERROR GenericConfigurationManagerImpl::StoreSoftwareVersion(uint32_t softwareVer) +{ + return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; +} + template CHIP_ERROR GenericConfigurationManagerImpl::GetDeviceTypeId(uint16_t & deviceType) { diff --git a/src/include/platform/internal/GenericConfigurationManagerImpl.h b/src/include/platform/internal/GenericConfigurationManagerImpl.h index 831370464f88ad..0fe14efaee9c9a 100644 --- a/src/include/platform/internal/GenericConfigurationManagerImpl.h +++ b/src/include/platform/internal/GenericConfigurationManagerImpl.h @@ -63,6 +63,7 @@ class GenericConfigurationManagerImpl : public ConfigurationManager CHIP_ERROR StoreHardwareVersion(uint16_t hardwareVer) override; CHIP_ERROR GetSoftwareVersionString(char * buf, size_t bufSize) override; CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override; + CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer) override; CHIP_ERROR GetSerialNumber(char * buf, size_t bufSize) override; CHIP_ERROR StoreSerialNumber(const char * serialNum, size_t serialNumLen) override; CHIP_ERROR GetPrimaryMACAddress(MutableByteSpan buf) override; diff --git a/src/platform/P6/BUILD.gn b/src/platform/P6/BUILD.gn index ed08a0b5ba3526..d7af750cb91df7 100644 --- a/src/platform/P6/BUILD.gn +++ b/src/platform/P6/BUILD.gn @@ -1,10 +1,10 @@ -# Copyright (c) 2021 Project CHIP Authors +# Copyright(c) 2022 Project CHIP Authors # -# Licensed under the Apache License, Version 2.0 (the "License"); +# Licensed under the Apache License, Version 2.0(the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http:// www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -16,7 +16,6 @@ import("//build_overrides/chip.gni") import("//build_overrides/pigweed.gni") import("${chip_root}/src/platform/device.gni") - assert(chip_device_platform == "p6") if (chip_enable_openthread) { @@ -50,6 +49,8 @@ static_library("P6") { "MTBKeyValueStore.h", "NetworkCommissioningDriver.h", "NetworkCommissioningWiFiDriver.cpp", + "OTAImageProcessorImpl.cpp", + "OTAImageProcessorImpl.h", "P6Config.cpp", "P6Config.h", "P6Utils.cpp", @@ -67,7 +68,11 @@ static_library("P6") { "cycfg_gatt_db.c", "cycfg_gatt_db.h", ] - deps = [ "${chip_root}/src/lib/dnssd:platform_header" ] + + deps = [ + "${chip_root}/src/lib/dnssd:platform_header", + "${chip_root}/src/setup_payload", + ] public_deps = [ "${chip_root}/src/crypto", diff --git a/src/platform/P6/ConfigurationManagerImpl.cpp b/src/platform/P6/ConfigurationManagerImpl.cpp index ef408fec77decd..f078d0bc71b1bf 100644 --- a/src/platform/P6/ConfigurationManagerImpl.cpp +++ b/src/platform/P6/ConfigurationManagerImpl.cpp @@ -48,6 +48,13 @@ CHIP_ERROR ConfigurationManagerImpl::Init() bool failSafeArmed; uint32_t rebootCount; + // Save out software version on first boot + if (!P6Config::ConfigValueExists(P6Config::kConfigKey_SoftwareVersion)) + { + err = StoreSoftwareVersion(CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION); + SuccessOrExit(err); + } + if (P6Config::ConfigValueExists(P6Config::kCounterKey_RebootCount)) { err = GetRebootCount(rebootCount); @@ -94,6 +101,16 @@ CHIP_ERROR ConfigurationManagerImpl::StoreRebootCount(uint32_t rebootCount) return WriteConfigValue(P6Config::kCounterKey_RebootCount, rebootCount); } +CHIP_ERROR ConfigurationManagerImpl::GetSoftwareVersion(uint32_t & softwareVer) +{ + return ReadConfigValue(P6Config::kConfigKey_SoftwareVersion, softwareVer); +} + +CHIP_ERROR ConfigurationManagerImpl::StoreSoftwareVersion(uint32_t softwareVer) +{ + return WriteConfigValue(P6Config::kConfigKey_SoftwareVersion, softwareVer); +} + CHIP_ERROR ConfigurationManagerImpl::GetTotalOperationalHours(uint32_t & totalOperationalHours) { return ReadConfigValue(P6Config::kCounterKey_TotalOperationalHours, totalOperationalHours); diff --git a/src/platform/P6/ConfigurationManagerImpl.h b/src/platform/P6/ConfigurationManagerImpl.h index 8da0df2b060579..a9fd74facf9220 100644 --- a/src/platform/P6/ConfigurationManagerImpl.h +++ b/src/platform/P6/ConfigurationManagerImpl.h @@ -40,6 +40,8 @@ class ConfigurationManagerImpl : public Internal::GenericConfigurationManagerImp public: CHIP_ERROR GetRebootCount(uint32_t & rebootCount) override; CHIP_ERROR StoreRebootCount(uint32_t rebootCount) override; + CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override; + CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer); CHIP_ERROR GetTotalOperationalHours(uint32_t & totalOperationalHours) override; CHIP_ERROR StoreTotalOperationalHours(uint32_t totalOperationalHours) override; // This returns an instance of this class. diff --git a/src/platform/P6/MTBKeyValueStore.cpp b/src/platform/P6/MTBKeyValueStore.cpp index 839be54bf37f72..fe05f6095a2a32 100644 --- a/src/platform/P6/MTBKeyValueStore.cpp +++ b/src/platform/P6/MTBKeyValueStore.cpp @@ -46,9 +46,15 @@ cy_rslt_t mtb_key_value_store_init(mtb_kvstore_t * kvstore_obj) { return result; } - sectorSize = cy_serial_flash_qspi_get_erase_size(ext_mem_address); - uint32_t length = sectorSize * 2; + sectorSize = cy_serial_flash_qspi_get_erase_size(ext_mem_address); + uint32_t length = sectorSize * 2; +#ifdef P6_OTA + // If using OTA set the start address towards the end of the flash area so + // an update doesn't clobber the persistent storage. + uint32_t start_addr = 0x3000000U; +#else uint32_t start_addr = 0; +#endif block_device.read = bd_read; block_device.program = bd_program; diff --git a/src/platform/P6/OTAImageProcessorImpl.cpp b/src/platform/P6/OTAImageProcessorImpl.cpp new file mode 100644 index 00000000000000..e7625e5e94726b --- /dev/null +++ b/src/platform/P6/OTAImageProcessorImpl.cpp @@ -0,0 +1,213 @@ +/* + * + * Copyright (c) 2022 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "OTAImageProcessorImpl.h" + +namespace chip { + +#ifdef P6_OTA +CHIP_ERROR OTAImageProcessorImpl::PrepareDownload() +{ + DeviceLayer::PlatformMgr().ScheduleWork(HandlePrepareDownload, reinterpret_cast(this)); + return CHIP_NO_ERROR; +} + +CHIP_ERROR OTAImageProcessorImpl::Finalize() +{ + DeviceLayer::PlatformMgr().ScheduleWork(HandleFinalize, reinterpret_cast(this)); + return CHIP_NO_ERROR; +} + +CHIP_ERROR OTAImageProcessorImpl::Apply() +{ + DeviceLayer::PlatformMgr().ScheduleWork(HandleApply, reinterpret_cast(this)); + return CHIP_NO_ERROR; +} + +CHIP_ERROR OTAImageProcessorImpl::Abort() +{ + DeviceLayer::PlatformMgr().ScheduleWork(HandleAbort, reinterpret_cast(this)); + return CHIP_NO_ERROR; +} + +CHIP_ERROR OTAImageProcessorImpl::ProcessBlock(ByteSpan & block) +{ + if ((block.data() == nullptr) || block.empty()) + { + return CHIP_ERROR_INVALID_ARGUMENT; + } + + // Store block data for HandleProcessBlock to access + CHIP_ERROR err = SetBlock(block); + if (err != CHIP_NO_ERROR) + { + ChipLogError(SoftwareUpdate, "Cannot set block data: %" CHIP_ERROR_FORMAT, err.Format()); + } + + DeviceLayer::PlatformMgr().ScheduleWork(HandleProcessBlock, reinterpret_cast(this)); + return CHIP_NO_ERROR; +} + +void OTAImageProcessorImpl::HandlePrepareDownload(intptr_t context) +{ + auto * imageProcessor = reinterpret_cast(context); + if (imageProcessor == nullptr) + { + ChipLogError(SoftwareUpdate, "ImageProcessor context is null"); + return; + } + else if (imageProcessor->mDownloader == nullptr) + { + ChipLogError(SoftwareUpdate, "mDownloader is null"); + return; + } + + // Open and erase secondary flash area to prepare + if (flash_area_open(FLASH_AREA_IMAGE_SECONDARY(0), &(imageProcessor->mFlashArea)) != 0) + { + imageProcessor->mDownloader->OnPreparedForDownload(CHIP_ERROR_OPEN_FAILED); + return; + } + // Note: This only erases up to the secondary slot size (which fa_size is + // set to). It will not erase the persistent storage as that only uses + // a small region towards the end of flash. + if (flash_area_erase(imageProcessor->mFlashArea, 0, imageProcessor->mFlashArea->fa_size) != 0) + { + imageProcessor->mDownloader->OnPreparedForDownload(CHIP_ERROR_OPEN_FAILED); + return; + } + + imageProcessor->mDownloader->OnPreparedForDownload(CHIP_NO_ERROR); +} + +void OTAImageProcessorImpl::HandleFinalize(intptr_t context) +{ + auto * imageProcessor = reinterpret_cast(context); + if (imageProcessor == nullptr) + { + return; + } + + flash_area_close(imageProcessor->mFlashArea); + ChipLogProgress(SoftwareUpdate, "Setting boot pending"); + int ret = boot_set_pending(0, 1); + + if (ret != 0) + { + ChipLogError(SoftwareUpdate, "Failed to set boot pending"); + return; + } + + imageProcessor->ReleaseBlock(); +} + +void OTAImageProcessorImpl::HandleAbort(intptr_t context) +{ + auto * imageProcessor = reinterpret_cast(context); + if (imageProcessor == nullptr) + { + return; + } + + flash_area_erase(imageProcessor->mFlashArea, 0, imageProcessor->mFlashArea->fa_size); + + imageProcessor->ReleaseBlock(); +} + +void OTAImageProcessorImpl::HandleProcessBlock(intptr_t context) +{ + auto * imageProcessor = reinterpret_cast(context); + if (imageProcessor == nullptr) + { + ChipLogError(SoftwareUpdate, "ImageProcessor context is null"); + return; + } + else if (imageProcessor->mDownloader == nullptr) + { + ChipLogError(SoftwareUpdate, "mDownloader is null"); + return; + } + + int rc = flash_area_write(imageProcessor->mFlashArea, imageProcessor->mParams.downloadedBytes, imageProcessor->mBlock.data(), + imageProcessor->mBlock.size()); + if (rc != 0) + { + imageProcessor->mDownloader->EndDownload(CHIP_ERROR_WRITE_FAILED); + return; + } + + imageProcessor->mParams.downloadedBytes += imageProcessor->mBlock.size(); + imageProcessor->mDownloader->FetchNextData(); +} + +void OTAImageProcessorImpl::HandleApply(intptr_t context) +{ + ChipLogProgress(SoftwareUpdate, "Rebooting after 2 seconds..."); + + cy_rtos_delay_milliseconds(2000); + + NVIC_SystemReset(); + + return; +} + +CHIP_ERROR OTAImageProcessorImpl::SetBlock(ByteSpan & block) +{ + if (!IsSpanUsable(block)) + { + ReleaseBlock(); + return CHIP_NO_ERROR; + } + if (mBlock.size() < block.size()) + { + if (!mBlock.empty()) + { + ReleaseBlock(); + } + uint8_t * mBlock_ptr = static_cast(chip::Platform::MemoryAlloc(block.size())); + if (mBlock_ptr == nullptr) + { + return CHIP_ERROR_NO_MEMORY; + } + mBlock = MutableByteSpan(mBlock_ptr, block.size()); + } + CHIP_ERROR err = CopySpanToMutableSpan(block, mBlock); + if (err != CHIP_NO_ERROR) + { + ChipLogError(SoftwareUpdate, "Cannot copy block data: %" CHIP_ERROR_FORMAT, err.Format()); + return err; + } + return CHIP_NO_ERROR; +} + +CHIP_ERROR OTAImageProcessorImpl::ReleaseBlock() +{ + if (mBlock.data() != nullptr) + { + chip::Platform::MemoryFree(mBlock.data()); + } + + mBlock = MutableByteSpan(); + return CHIP_NO_ERROR; +} +#endif // P6_OTA + +} // namespace chip diff --git a/src/platform/P6/OTAImageProcessorImpl.h b/src/platform/P6/OTAImageProcessorImpl.h new file mode 100644 index 00000000000000..89a2e7cd2d9fdb --- /dev/null +++ b/src/platform/P6/OTAImageProcessorImpl.h @@ -0,0 +1,74 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include + +#include + +#ifdef P6_OTA +extern "C" { +#include "bootutil/bootutil.h" +#include "cy_flash_psoc6.h" +#include "cy_smif_psoc6.h" +#include "sysflash/sysflash.h" +} + +namespace chip { + +class OTAImageProcessorImpl : public OTAImageProcessorInterface +{ +public: + //////////// OTAImageProcessorInterface Implementation /////////////// + CHIP_ERROR PrepareDownload() override; + CHIP_ERROR Finalize() override; + CHIP_ERROR Apply() override; + CHIP_ERROR Abort() override; + CHIP_ERROR ProcessBlock(ByteSpan & block) override; + + void SetOTADownloader(OTADownloader * downloader) { mDownloader = downloader; } + +private: + //////////// Actual handlers for the OTAImageProcessorInterface /////////////// + static void HandlePrepareDownload(intptr_t context); + static void HandleFinalize(intptr_t context); + static void HandleAbort(intptr_t context); + static void HandleProcessBlock(intptr_t context); + static void HandleApply(intptr_t context); + + /** + * Called to allocate memory for mBlock if necessary and set it to block + */ + CHIP_ERROR SetBlock(ByteSpan & block); + + /** + * Called to release allocated memory for mBlock + */ + CHIP_ERROR ReleaseBlock(); + + MutableByteSpan mBlock; + OTADownloader * mDownloader; + + const struct flash_area * mFlashArea; +}; + +} // namespace chip +#endif diff --git a/src/platform/P6/P6Config.cpp b/src/platform/P6/P6Config.cpp index 857e0dbe019372..f6a5dbbe77b67f 100644 --- a/src/platform/P6/P6Config.cpp +++ b/src/platform/P6/P6Config.cpp @@ -53,6 +53,7 @@ const P6Config::Key P6Config::kConfigKey_MfrDeviceId = { kConfigNamesp const P6Config::Key P6Config::kConfigKey_MfrDeviceCert = { kConfigNamespace_ChipFactory, "device-cert" }; const P6Config::Key P6Config::kConfigKey_MfrDeviceICACerts = { kConfigNamespace_ChipFactory, "device-ca-certs" }; const P6Config::Key P6Config::kConfigKey_MfrDevicePrivateKey = { kConfigNamespace_ChipFactory, "device-key" }; +const P6Config::Key P6Config::kConfigKey_SoftwareVersion = { kConfigNamespace_ChipFactory, "software-ver" }; const P6Config::Key P6Config::kConfigKey_HardwareVersion = { kConfigNamespace_ChipFactory, "hardware-ver" }; const P6Config::Key P6Config::kConfigKey_ManufacturingDate = { kConfigNamespace_ChipFactory, "mfg-date" }; const P6Config::Key P6Config::kConfigKey_SetupPinCode = { kConfigNamespace_ChipFactory, "pin-code" }; @@ -218,10 +219,11 @@ bool P6Config::ConfigValueExists(Key key) CHIP_ERROR P6Config::FactoryResetConfig(void) { CHIP_ERROR err = CHIP_NO_ERROR; - const Key * config_keys[] = { &kConfigKey_FabricId, &kConfigKey_ServiceConfig, &kConfigKey_PairedAccountId, - &kConfigKey_ServiceId, &kConfigKey_GroupKeyIndex, &kConfigKey_LastUsedEpochKeyId, - &kConfigKey_FailSafeArmed, &kConfigKey_WiFiStationSecType, &kConfigKey_WiFiSSID, - &kConfigKey_WiFiPassword, &kConfigKey_WiFiSecurity, &kConfigKey_WiFiMode }; + const Key * config_keys[] = { &kConfigKey_FabricId, &kConfigKey_ServiceConfig, &kConfigKey_PairedAccountId, + &kConfigKey_ServiceId, &kConfigKey_GroupKeyIndex, &kConfigKey_LastUsedEpochKeyId, + &kConfigKey_FailSafeArmed, &kConfigKey_WiFiStationSecType, &kConfigKey_WiFiSSID, + &kConfigKey_WiFiPassword, &kConfigKey_WiFiSecurity, &kConfigKey_WiFiMode, + &kConfigKey_SoftwareVersion }; for (uint32_t i = 0; i < (sizeof(config_keys) / sizeof(config_keys[0])); i++) { diff --git a/src/platform/P6/P6Config.h b/src/platform/P6/P6Config.h index b576b47c53e831..ae44ced3261c9d 100644 --- a/src/platform/P6/P6Config.h +++ b/src/platform/P6/P6Config.h @@ -60,6 +60,7 @@ class P6Config static const Key kConfigKey_MfrDeviceCert; static const Key kConfigKey_MfrDeviceICACerts; static const Key kConfigKey_MfrDevicePrivateKey; + static const Key kConfigKey_SoftwareVersion; static const Key kConfigKey_HardwareVersion; static const Key kConfigKey_ManufacturingDate; static const Key kConfigKey_SetupPinCode; diff --git a/src/platform/P6/args.gni b/src/platform/P6/args.gni index e16170a519e15e..b34b5678ae231d 100644 --- a/src/platform/P6/args.gni +++ b/src/platform/P6/args.gni @@ -1,10 +1,10 @@ -# Copyright (c) 2021 Project CHIP Authors +# Copyright(c) 2022 Project CHIP Authors # -# Licensed under the Apache License, Version 2.0 (the "License"); +# Licensed under the Apache License, Version 2.0(the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http: // www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -17,7 +17,7 @@ import("//build_overrides/p6.gni") import("${chip_root}/examples/platform/p6/args.gni") -# ARM architecture flags will be set based on p6_family. +#ARM architecture flags will be set based on p6_family. arm_platform_config = "${p6_sdk_build_root}/p6_arm.gni" mbedtls_target = "${p6_sdk_build_root}:p6_build" diff --git a/src/platform/fake/ConfigurationManagerImpl.h b/src/platform/fake/ConfigurationManagerImpl.h index fef8584d40a4e8..331c2441ecb1e8 100644 --- a/src/platform/fake/ConfigurationManagerImpl.h +++ b/src/platform/fake/ConfigurationManagerImpl.h @@ -44,6 +44,7 @@ class ConfigurationManagerImpl : public ConfigurationManager CHIP_ERROR StoreHardwareVersion(uint16_t hardwareVer) override { return CHIP_ERROR_NOT_IMPLEMENTED; } CHIP_ERROR GetSoftwareVersionString(char * buf, size_t bufSize) override { return CHIP_ERROR_NOT_IMPLEMENTED; } CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override { return CHIP_ERROR_NOT_IMPLEMENTED; } + CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer) override { return CHIP_ERROR_NOT_IMPLEMENTED; } CHIP_ERROR GetSerialNumber(char * buf, size_t bufSize) override { return CHIP_ERROR_NOT_IMPLEMENTED; } CHIP_ERROR StoreSerialNumber(const char * serialNum, size_t serialNumLen) override { return CHIP_ERROR_NOT_IMPLEMENTED; } CHIP_ERROR GetPrimaryMACAddress(MutableByteSpan buf) override { return CHIP_ERROR_NOT_IMPLEMENTED; } diff --git a/third_party/p6/BUILD.gn b/third_party/p6/BUILD.gn index 6e19423d2ba3c8..a4c3b8a264c883 100644 --- a/third_party/p6/BUILD.gn +++ b/third_party/p6/BUILD.gn @@ -24,6 +24,9 @@ assert(p6_target_project != "", "p6_target_project must be specified") # Add includes, cflags, asmflags, etc in config config("p6_sdk_config") { + # This is ugly but I'm unsure of any other way to forward (non-global) vars from the ota examples BUILD.gn file to this config object + ota_app = p6_target_project == "//:ota_requestor_app_sdk_sources" + # Pull out includes from generated json # Treat these includes as system includes, so warnings in them are not fatal. _include_dirs = [] @@ -62,11 +65,14 @@ config("p6_sdk_config") { ldflags = filter_exclude(mtb_json.ldflags, [ "-T*" ]) # Pull out linker flags with paths (-T flags) and make paths absolute - linker_script_flags = filter_include(mtb_json.ldflags, [ "-T*" ]) - foreach(flag, linker_script_flags) { - ldflags += [ "-T/" + rebase_path(string_replace(flag, "-T", "", 1), - "/", - "${p6_sdk_build_root}/p6_sdk/") ] + # OTA app provides it's own linker script + if (!ota_app) { + linker_script_flags = filter_include(mtb_json.ldflags, [ "-T*" ]) + foreach(flag, linker_script_flags) { + ldflags += [ "-T/" + rebase_path(string_replace(flag, "-T", "", 1), + "/", + "${p6_sdk_build_root}/p6_sdk/") ] + } } # --specs=nano.specs is getting added twice and causing compile issues so remove from cxx flags here. diff --git a/third_party/p6/p6_sdk.gni b/third_party/p6/p6_sdk.gni index e376fe62296687..2f8b8dc2afac2c 100644 --- a/third_party/p6/p6_sdk.gni +++ b/third_party/p6/p6_sdk.gni @@ -66,22 +66,33 @@ template("p6_sdk_sources") { sources += invoker.sources } + # This is ugly. See note in BUILD.gn for reasoning + mtb_json_local = mtb_json # Can't modify without copying into current scope + if (target_name == "ota_requestor_app_sdk_sources") { + mtb_json_local.c_source -= [ + "./libs/psoc6cm0p/COMPONENT_CM0P_SLEEP/psoc6_01_cm0p_sleep.c", + "./libs/psoc6cm0p/COMPONENT_CM0P_SLEEP/psoc6_02_cm0p_sleep.c", + "./libs/psoc6cm0p/COMPONENT_CM0P_SLEEP/psoc6_03_cm0p_sleep.c", + "./libs/psoc6cm0p/COMPONENT_CM0P_SLEEP/psoc6_04_cm0p_sleep.c", + ] + } + # Pull out c sources from generated json - foreach(src, mtb_json.c_source) { + foreach(src, mtb_json_local.c_source) { sources += [ rebase_path(src, "${p6_project_dir}", "${p6_sdk_build_root}/p6_sdk/") ] } # Pull out cpp sources from generated json - foreach(src, mtb_json.cxx_source) { + foreach(src, mtb_json_local.cxx_source) { sources += [ rebase_path(src, "${p6_project_dir}", "${p6_sdk_build_root}/p6_sdk/") ] } # Pull out .S files from generated json - foreach(asm, mtb_json.asm_source) { + foreach(asm, mtb_json_local.asm_source) { sources += [ rebase_path(asm, "${p6_project_dir}", "${p6_sdk_build_root}/p6_sdk/") ] diff --git a/third_party/p6/p6_sdk/libs/anycloud-ota b/third_party/p6/p6_sdk/libs/anycloud-ota new file mode 160000 index 00000000000000..040f563c5fa34b --- /dev/null +++ b/third_party/p6/p6_sdk/libs/anycloud-ota @@ -0,0 +1 @@ +Subproject commit 040f563c5fa34bf64a4ab487b7af35c6e6e9d7c5