From 0cabe28570429d730b9b0b8b7d5dc5d22e888ec6 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sun, 2 Jun 2019 19:12:36 +0200 Subject: [PATCH] Initial commit --- .gitattributes | 1 + LICENSE | 27 + README.md | 26 + adapter_sd.c | 10 + adapter_sd.go | 119 + error_sd.go | 87 + examples/advertisement/main.go | 33 + examples/heartrate/main.go | 44 + gap.go | 21 + gap_sd.go | 51 + gatts.go | 14 + gatts_sd.go | 53 + .../s132_nrf52_6.1.1_API/include/ble.h | 685 ++ .../s132_nrf52_6.1.1_API/include/ble_err.h | 93 + .../s132_nrf52_6.1.1_API/include/ble_gap.h | 2681 +++++ .../s132_nrf52_6.1.1_API/include/ble_gatt.h | 229 + .../s132_nrf52_6.1.1_API/include/ble_gattc.h | 715 ++ .../s132_nrf52_6.1.1_API/include/ble_gatts.h | 845 ++ .../s132_nrf52_6.1.1_API/include/ble_hci.h | 135 + .../s132_nrf52_6.1.1_API/include/ble_l2cap.h | 506 + .../s132_nrf52_6.1.1_API/include/ble_ranges.h | 156 + .../s132_nrf52_6.1.1_API/include/ble_types.h | 215 + .../include/nrf52/nrf_mbr.h | 268 + .../s132_nrf52_6.1.1_API/include/nrf_error.h | 90 + .../include/nrf_error_sdm.h | 70 + .../include/nrf_error_soc.h | 85 + .../s132_nrf52_6.1.1_API/include/nrf_nvic.h | 491 + .../s132_nrf52_6.1.1_API/include/nrf_sdm.h | 367 + .../s132_nrf52_6.1.1_API/include/nrf_soc.h | 1007 ++ .../s132_nrf52_6.1.1_API/include/nrf_svc.h | 90 + .../s132_nrf52_6.1.1_license-agreement.txt | 35 + .../s132_nrf52_6.1.1_softdevice.hex | 9417 +++++++++++++++++ uuid.go | 32 + uuid_sd.go | 24 + 34 files changed, 18722 insertions(+) create mode 100644 .gitattributes create mode 100644 LICENSE create mode 100644 README.md create mode 100644 adapter_sd.c create mode 100644 adapter_sd.go create mode 100644 error_sd.go create mode 100644 examples/advertisement/main.go create mode 100644 examples/heartrate/main.go create mode 100644 gap.go create mode 100644 gap_sd.go create mode 100644 gatts.go create mode 100644 gatts_sd.go create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_err.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gap.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gatt.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gattc.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gatts.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_hci.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_l2cap.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_ranges.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_types.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf52/nrf_mbr.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error_sdm.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error_soc.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_nvic.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_sdm.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_soc.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_svc.h create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_license-agreement.txt create mode 100644 s132_nrf52_6.1.1/s132_nrf52_6.1.1_softdevice.hex create mode 100644 uuid.go create mode 100644 uuid_sd.go diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bef406c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +s132_nrf52_6.1.1/* linguist-vendored diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..52afcc8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2019 Ayke van Laethem. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6799846 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# Go Bluetooth + +Bluetooth API for embedded devices. + +This package attempts to build a cross-system Bluetooth API written in Go. It +specifically targets embedded devices that are supported by +[TinyGo](https://tinygo.org/). + +At the moment, there is only support for the +[S132](https://www.nordicsemi.com/Software-and-Tools/Software/S132) +SoftDevice (binary driver) on Nordic Semiconductors devices. + +## Flashing the SoftDevice + +Flashing the SoftDevice can be tricky. If you have +[nrfjprog](https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Command-Line-Tools) +installed, you can erase the flash and flash the new BLE firmware using the +following commands. + + nrfjprog -f nrf52 --eraseall + nrfjprog -f nrf52 --program s132_nrf52_6.1.1/s132_nrf52_6.1.1_softdevice.hex + +After that, don't reset the board but instead flash a new program to it. For +example, you can flash the Heart Rate Sensor example using `tinygo`: + + tinygo flash -target=pca10040-s132v6 ./examples/heartrate diff --git a/adapter_sd.c b/adapter_sd.c new file mode 100644 index 0000000..c3607b1 --- /dev/null +++ b/adapter_sd.c @@ -0,0 +1,10 @@ +// +build softdevice,s132v6 + +// This file is necessary to define SVCall wrappers, because TinyGo does not yet +// support static functions in the preamble. + +// Discard all 'static' attributes to define functions normally. +#define static + +#include "s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_sdm.h" +#include "s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble.h" diff --git a/adapter_sd.go b/adapter_sd.go new file mode 100644 index 0000000..4e1eb32 --- /dev/null +++ b/adapter_sd.go @@ -0,0 +1,119 @@ +// +build softdevice,s132v6 + +package bluetooth + +/* +// Define SoftDevice functions as regular function declarations (not inline +// static functions). +#define SVCALL_AS_NORMAL_FUNCTION + +#include "s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_sdm.h" +#include "s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble.h" +#include "s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gap.h" + +void assertHandler(void); +*/ +import "C" + +import ( + "device/arm" + "device/nrf" + "unsafe" +) + +//export assertHandler +func assertHandler() { + println("SoftDevice assert") +} + +var clockConfig C.nrf_clock_lf_cfg_t = C.nrf_clock_lf_cfg_t{ + source: C.NRF_CLOCK_LF_SRC_SYNTH, + rc_ctiv: 0, + rc_temp_ctiv: 0, + accuracy: 0, +} + +var ( + secModeOpen C.ble_gap_conn_sec_mode_t + defaultDeviceName = [6]byte{'T', 'i', 'n', 'y', 'G', 'o'} +) + +// Globally allocated buffer for incoming SoftDevice events. +var eventBuf struct { + C.ble_evt_t + buf [23]byte +} + +func init() { + secModeOpen.set_bitfield_sm(1) + secModeOpen.set_bitfield_lv(1) +} + +// Adapter is a dummy adapter: it represents the connection to the (only) +// SoftDevice on the chip. +type Adapter struct { +} + +// DefaultAdapter is an adapter to the default Bluetooth stack on a given +// target. +var DefaultAdapter = &Adapter{} + +// Enable configures the BLE stack. It must be called before any +// Bluetooth-related calls (unless otherwise indicated). +func (a *Adapter) Enable() error { + // Enable the IRQ that handles all events. + arm.EnableIRQ(nrf.IRQ_SWI2) + arm.SetPriority(nrf.IRQ_SWI2, 192) + + errCode := C.sd_softdevice_enable(&clockConfig, C.nrf_fault_handler_t(C.assertHandler)) + if errCode != 0 { + return Error(errCode) + } + + appRAMBase := uint32(0x200039c0) + errCode = C.sd_ble_enable(&appRAMBase) + if errCode != 0 { + return Error(errCode) + } + + errCode = C.sd_ble_gap_device_name_set(&secModeOpen, &defaultDeviceName[0], uint16(len(defaultDeviceName))) + if errCode != 0 { + return Error(errCode) + } + + var gapConnParams C.ble_gap_conn_params_t + gapConnParams.min_conn_interval = C.BLE_GAP_CP_MIN_CONN_INTVL_MIN + gapConnParams.max_conn_interval = C.BLE_GAP_CP_MIN_CONN_INTVL_MAX + gapConnParams.slave_latency = 0 + gapConnParams.conn_sup_timeout = C.BLE_GAP_CP_CONN_SUP_TIMEOUT_NONE + + errCode = C.sd_ble_gap_ppcp_set(&gapConnParams) + if errCode != 0 { + return Error(errCode) + } + + return nil +} + +func handleEvent() { + // TODO: do something with the events. +} + +//go:export SWI2_EGU2_IRQHandler +func handleInterrupt() { + for { + eventBufLen := uint16(unsafe.Sizeof(eventBuf)) + errCode := C.sd_ble_evt_get((*uint8)(unsafe.Pointer(&eventBuf)), &eventBufLen) + if errCode != 0 { + // Possible error conditions: + // * NRF_ERROR_NOT_FOUND: no events left, break + // * NRF_ERROR_DATA_SIZE: retry with a bigger data buffer + // (currently not handled, TODO) + // * NRF_ERROR_INVALID_ADDR: pointer is not aligned, should + // not happen. + // In all cases, it's best to simply stop now. + break + } + handleEvent() + } +} diff --git a/error_sd.go b/error_sd.go new file mode 100644 index 0000000..3103113 --- /dev/null +++ b/error_sd.go @@ -0,0 +1,87 @@ +// +build softdevice,s132v6 + +package bluetooth + +// Error is an error from within the SoftDevice. +type Error uint32 + +func (e Error) Error() string { + switch { + case e < 0x1000: + // Global errors. + switch e { + case 0: + return "no error" + case 1: + return "SVC handler is missing" + case 2: + return "SoftDevice has not been enabled" + case 3: + return "internal error" + case 4: + return "no memory for operation" + case 5: + return "not found" + case 6: + return "not supported" + case 7: + return "invalid parameter" + case 8: + return "invalid state, operation disallowed in this state" + case 9: + return "invalid Length" + case 10: + return "invalid flags" + case 11: + return "invalid data" + case 12: + return "invalid data size" + case 13: + return "operation timed out" + case 14: + return "null pointer" + case 15: + return "forbidden operation" + case 16: + return "bad memory address" + case 17: + return "busy" + case 18: + return "maximum connection count exceeded" + case 19: + return "not enough resources for operation" + default: + return "other global error" + } + case e < 0x2000: + // SDM errors. + switch e { + case 0x1000: + return "unknown LFCLK source" + case 0x1001: + return "incorrect interrupt configuration" + case 0x1002: + return "incorrect CLENR0" + default: + return "other SDM error" + } + case e < 0x3000: + // SoC errors. + return "other SoC error" + case e < 0x4000: + // STK errors. + return "other STK error" + default: + // Other errors. + return "other error" + } +} + +// makeError returns an error (using the Error type) if the error code is +// non-zero, otherwise it returns nil. It is used with internal API calls. +func makeError(code uint32) error { + if code != 0 { + return Error(code) + } + return nil +} diff --git a/examples/advertisement/main.go b/examples/advertisement/main.go new file mode 100644 index 0000000..9872fcc --- /dev/null +++ b/examples/advertisement/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "time" + + "github.com/aykevl/go-bluetooth" +) + +// flags + local name +var advPayload = []byte("\x02\x01\x06" + "\x07\x09TinyGo") + +func main() { + adapter := bluetooth.DefaultAdapter + must("enable SD", adapter.Enable()) + adv := adapter.NewAdvertisement() + options := &bluetooth.AdvertiseOptions{ + Interval: bluetooth.NewAdvertiseInterval(100), + } + must("config adv", adv.Configure(advPayload, nil, options)) + must("start adv", adv.Start()) + + println("advertising...") + for { + // Sleep forever. + time.Sleep(time.Hour) + } +} + +func must(action string, err error) { + if err != nil { + panic("failed to " + action + ": " + err.Error()) + } +} diff --git a/examples/heartrate/main.go b/examples/heartrate/main.go new file mode 100644 index 0000000..97a583d --- /dev/null +++ b/examples/heartrate/main.go @@ -0,0 +1,44 @@ +package main + +import ( + "time" + + "github.com/aykevl/go-bluetooth" +) + +// flags + local name +var advPayload = []byte("\x02\x01\x06" + "\x07\x09TinyGo") + +func main() { + println("starting") + adapter := bluetooth.DefaultAdapter + must("enable SD", adapter.Enable()) + adv := adapter.NewAdvertisement() + options := &bluetooth.AdvertiseOptions{ + Interval: bluetooth.NewAdvertiseInterval(100), + } + must("config adv", adv.Configure(advPayload, nil, options)) + must("start adv", adv.Start()) + + must("add service", adapter.AddService(&bluetooth.Service{ + UUID: bluetooth.New16BitUUID(0x180D), // Heart Rate + Characteristics: []bluetooth.Characteristic{ + bluetooth.Characteristic{ + UUID: bluetooth.New16BitUUID(0x2A37), // Heart Rate Measurement + Value: []byte{0, 75}, // 75bpm + }, + }, + })) + + println("sleeping") + for { + // Sleep forever. + time.Sleep(time.Hour) + } +} + +func must(action string, err error) { + if err != nil { + panic("failed to " + action + ": " + err.Error()) + } +} diff --git a/gap.go b/gap.go new file mode 100644 index 0000000..c3fc70e --- /dev/null +++ b/gap.go @@ -0,0 +1,21 @@ +package bluetooth + +// Advertisement encapsulates a single advertisement instance. +type Advertisement struct { + handle uint8 +} + +// AdvertiseOptions configures everything related to BLE advertisements. +type AdvertiseOptions struct { + Interval AdvertiseInterval +} + +// AdvertiseInterval is the advertisement interval in 0.625µs units. +type AdvertiseInterval uint32 + +// NewAdvertiseInterval returns a new advertisement interval, based on an +// interval in milliseconds. +func NewAdvertiseInterval(intervalMillis uint32) AdvertiseInterval { + // Convert an interval to units of + return AdvertiseInterval(intervalMillis * 8 / 5) +} diff --git a/gap_sd.go b/gap_sd.go new file mode 100644 index 0000000..9769c28 --- /dev/null +++ b/gap_sd.go @@ -0,0 +1,51 @@ +// +build softdevice,s132v6 + +package bluetooth + +/* +// Define SoftDevice functions as regular function declarations (not inline +// static functions). +#define SVCALL_AS_NORMAL_FUNCTION + +#include "s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gap.h" +*/ +import "C" + +// NewAdvertisement creates a new advertisement instance but does not configure +// it. It can be called before the SoftDevice has been initialized. +func (a *Adapter) NewAdvertisement() *Advertisement { + return &Advertisement{ + handle: C.BLE_GAP_ADV_SET_HANDLE_NOT_SET, + } +} + +// Configure this advertisement. Must be called after SoftDevice initialization. +func (a *Advertisement) Configure(broadcastData, scanResponseData []byte, options *AdvertiseOptions) error { + data := C.ble_gap_adv_data_t{} + if broadcastData != nil { + data.adv_data = C.ble_data_t{ + p_data: &broadcastData[0], + len: uint16(len(broadcastData)), + } + } + if scanResponseData != nil { + data.scan_rsp_data = C.ble_data_t{ + p_data: &scanResponseData[0], + len: uint16(len(scanResponseData)), + } + } + params := C.ble_gap_adv_params_t{ + properties: C.ble_gap_adv_properties_t{ + _type: C.BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED, + }, + interval: uint32(options.Interval), + } + errCode := C.sd_ble_gap_adv_set_configure(&a.handle, &data, ¶ms) + return makeError(errCode) +} + +// Start advertisement. May only be called after it has been configured. +func (a *Advertisement) Start() error { + errCode := C.sd_ble_gap_adv_start(a.handle, C.BLE_CONN_CFG_TAG_DEFAULT) + return makeError(errCode) +} diff --git a/gatts.go b/gatts.go new file mode 100644 index 0000000..858fc55 --- /dev/null +++ b/gatts.go @@ -0,0 +1,14 @@ +package bluetooth + +// Service is a GATT service to be used in AddService. +type Service struct { + handle uint16 + UUID + Characteristics []Characteristic +} + +type Characteristic struct { + handle uint16 + UUID + Value []byte +} diff --git a/gatts_sd.go b/gatts_sd.go new file mode 100644 index 0000000..dc1ba40 --- /dev/null +++ b/gatts_sd.go @@ -0,0 +1,53 @@ +// +build softdevice,s132v6 + +package bluetooth + +/* +// Define SoftDevice functions as regular function declarations (not inline +// static functions). +#define SVCALL_AS_NORMAL_FUNCTION + +#include "s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gap.h" +*/ +import "C" + +func (a *Adapter) AddService(service *Service) error { + uuid, errCode := service.UUID.shortUUID() + if errCode != 0 { + return Error(errCode) + } + errCode = C.sd_ble_gatts_service_add(C.BLE_GATTS_SRVC_TYPE_PRIMARY, &uuid, &service.handle) + if errCode != 0 { + return Error(errCode) + } + for _, char := range service.Characteristics { + metadata := C.ble_gatts_char_md_t{} + metadata.char_props.set_bitfield_read(1) + metadata.char_props.set_bitfield_write(1) + handles := C.ble_gatts_char_handles_t{} + charUUID, errCode := char.UUID.shortUUID() + if errCode != 0 { + return Error(errCode) + } + value := C.ble_gatts_attr_t{ + p_uuid: &charUUID, + p_attr_md: &C.ble_gatts_attr_md_t{ + read_perm: secModeOpen, + write_perm: secModeOpen, + }, + init_len: uint16(len(char.Value)), + init_offs: 0, + max_len: uint16(len(char.Value)), + } + if len(char.Value) != 0 { + value.p_value = &char.Value[0] + } + value.p_attr_md.set_bitfield_vloc(C.BLE_GATTS_VLOC_STACK) + errCode = C.sd_ble_gatts_characteristic_add(service.handle, &metadata, &value, &handles) + if errCode != 0 { + return Error(errCode) + } + char.handle = handles.value_handle + } + return makeError(errCode) +} diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble.h new file mode 100644 index 0000000..76a432b --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble.h @@ -0,0 +1,685 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON BLE SoftDevice Common + @{ + @defgroup ble_api Events, type definitions and API calls + @{ + + @brief Module independent events, type definitions and API calls for the BLE SoftDevice. + + */ + +#ifndef BLE_H__ +#define BLE_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_err.h" +#include "ble_gap.h" +#include "ble_l2cap.h" +#include "ble_gatt.h" +#include "ble_gattc.h" +#include "ble_gatts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations + * @{ */ + +/** + * @brief Common API SVC numbers. + */ +enum BLE_COMMON_SVCS +{ + SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */ + SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */ + SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific base UUID. */ + SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */ + SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */ + SD_BLE_VERSION_GET, /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */ + SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */ + SD_BLE_OPT_SET, /**< Set a BLE option. */ + SD_BLE_OPT_GET, /**< Get a BLE option. */ + SD_BLE_CFG_SET, /**< Add a configuration to the BLE stack. */ + SD_BLE_UUID_VS_REMOVE, /**< Remove a Vendor Specific base UUID. */ +}; + +/** + * @brief BLE Module Independent Event IDs. + */ +enum BLE_COMMON_EVTS +{ + BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0, /**< User Memory request. @ref ble_evt_user_mem_request_t */ + BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1, /**< User Memory release. @ref ble_evt_user_mem_release_t */ +}; + +/**@brief BLE Connection Configuration IDs. + * + * IDs that uniquely identify a connection configuration. + */ +enum BLE_CONN_CFGS +{ + BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */ + BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */ + BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */ + BLE_CONN_CFG_GATT = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */ + BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */ +}; + +/**@brief BLE Common Configuration IDs. + * + * IDs that uniquely identify a common configuration. + */ +enum BLE_COMMON_CFGS +{ + BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific base UUID configuration */ +}; + +/**@brief Common Option IDs. + * IDs that uniquely identify a common option. + */ +enum BLE_COMMON_OPTS +{ + BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE + 0, /**< PA and LNA options */ + BLE_COMMON_OPT_CONN_EVT_EXT = BLE_OPT_BASE + 1, /**< Extended connection events option */ + BLE_COMMON_OPT_EXTENDED_RC_CAL = BLE_OPT_BASE + 2, /**< Extended RC calibration option */ + BLE_COMMON_OPT_ADV_SCHED_CFG = BLE_OPT_BASE + 3, /**< Advertiser role scheduling configuration option */ +}; + +/** @} */ + +/** @addtogroup BLE_COMMON_DEFINES Defines + * @{ */ + +/** @brief Required pointer alignment for BLE Events. +*/ +#define BLE_EVT_PTR_ALIGNMENT 4 + +/** @brief Leaves the maximum of the two arguments. +*/ +#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a)) + +/** @brief Maximum possible length for BLE Events. + * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. + * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. +*/ +#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ + offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ +) + +/** @defgroup ADV_SCHED_CFG Advertiser Role Scheduling Configuration + * @{ */ +#define ADV_SCHED_CFG_DEFAULT 0 /**< Default advertiser role scheduling configuration. */ +#define ADV_SCHED_CFG_IMPROVED 1 /**< Improved advertiser role scheduling configuration in which the housekeeping time is reduced. */ +/** @} */ + +/** @defgroup BLE_USER_MEM_TYPES User Memory Types + * @{ */ +#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */ +#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */ +/** @} */ + +/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific base UUID counts + * @{ + */ +#define BLE_UUID_VS_COUNT_DEFAULT 10 /**< Default VS UUID count. */ +#define BLE_UUID_VS_COUNT_MAX 254 /**< Maximum VS UUID count. */ +/** @} */ + +/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults. + * @{ + */ +#define BLE_CONN_CFG_TAG_DEFAULT 0 /**< Default configuration tag, SoftDevice default connection configuration. */ + +/** @} */ + +/** @} */ + +/** @addtogroup BLE_COMMON_STRUCTURES Structures + * @{ */ + +/**@brief User Memory Block. */ +typedef struct +{ + uint8_t *p_mem; /**< Pointer to the start of the user memory block. */ + uint16_t len; /**< Length in bytes of the user memory block. */ +} ble_user_mem_block_t; + +/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */ +typedef struct +{ + uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ +} ble_evt_user_mem_request_t; + +/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */ +typedef struct +{ + uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ + ble_user_mem_block_t mem_block; /**< User memory block */ +} ble_evt_user_mem_release_t; + +/**@brief Event structure for events not associated with a specific function module. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which this event occurred. */ + union + { + ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */ + ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */ + } params; /**< Event parameter union. */ +} ble_common_evt_t; + +/**@brief BLE Event header. */ +typedef struct +{ + uint16_t evt_id; /**< Value from a BLE__EVT series. */ + uint16_t evt_len; /**< Length in octets including this header. */ +} ble_evt_hdr_t; + +/**@brief Common BLE Event type, wrapping the module specific event reports. */ +typedef struct +{ + ble_evt_hdr_t header; /**< Event header. */ + union + { + ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ + ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ + ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ + ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ + ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ + } evt; /**< Event union. */ +} ble_evt_t; + + +/** + * @brief Version Information. + */ +typedef struct +{ + uint8_t version_number; /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */ + uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ + uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ +} ble_version_t; + +/** + * @brief Configuration parameters for the PA and LNA. + */ +typedef struct +{ + uint8_t enable :1; /**< Enable toggling for this amplifier */ + uint8_t active_high :1; /**< Set the pin to be active high */ + uint8_t gpio_pin :6; /**< The GPIO pin to toggle for this amplifier */ +} ble_pa_lna_cfg_t; + +/** + * @brief PA & LNA GPIO toggle configuration + * + * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or + * a low noise amplifier. + * + * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided + * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. + * + * @note @ref sd_ble_opt_get is not supported for this option. + * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences + * and must be avoided by the application. + */ +typedef struct +{ + ble_pa_lna_cfg_t pa_cfg; /**< Power Amplifier configuration */ + ble_pa_lna_cfg_t lna_cfg; /**< Low Noise Amplifier configuration */ + + uint8_t ppi_ch_id_set; /**< PPI channel used for radio pin setting */ + uint8_t ppi_ch_id_clr; /**< PPI channel used for radio pin clearing */ + uint8_t gpiote_ch_id; /**< GPIOTE channel used for radio pin toggling */ +} ble_common_opt_pa_lna_t; + +/** + * @brief Configuration of extended BLE connection events. + * + * When enabled the SoftDevice will dynamically extend the connection event when possible. + * + * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length. + * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval, + * and if there are no conflicts with other BLE roles requesting radio time. + * + * @note @ref sd_ble_opt_get is not supported for this option. + */ +typedef struct +{ + uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */ +} ble_common_opt_conn_evt_ext_t; + +/** + * @brief Enable/disable extended RC calibration. + * + * If extended RC calibration is enabled and the internal RC oscillator (@ref NRF_CLOCK_LF_SRC_RC) is used as the SoftDevice + * LFCLK source, the SoftDevice as a peripheral will by default try to increase the receive window if two consecutive packets + * are not received. If it turns out that the packets were not received due to clock drift, the RC calibration is started. + * This calibration comes in addition to the periodic calibration that is configured by @ref sd_softdevice_enable(). When + * using only peripheral connections, the periodic calibration can therefore be configured with a much longer interval as the + * peripheral will be able to detect and adjust automatically to clock drift, and calibrate on demand. + * + * If extended RC calibration is disabled and the internal RC oscillator is used as the SoftDevice LFCLK source, the + * RC oscillator is calibrated periodically as configured by @ref sd_softdevice_enable(). + * + * @note @ref sd_ble_opt_get is not supported for this option. + */ +typedef struct +{ + uint8_t enable : 1; /**< Enable extended RC calibration, enabled by default. */ +} ble_common_opt_extended_rc_cal_t; + +/** + * @brief Configuration of BLE advertiser role scheduling. + * + * @note @ref sd_ble_opt_get is not supported for this option. + */ +typedef struct +{ + uint8_t sched_cfg; /**< See @ref ADV_SCHED_CFG. */ +} ble_common_opt_adv_sched_cfg_t; + +/**@brief Option structure for common options. */ +typedef union +{ + ble_common_opt_pa_lna_t pa_lna; /**< Parameters for controlling PA and LNA pin toggling. */ + ble_common_opt_conn_evt_ext_t conn_evt_ext; /**< Parameters for enabling extended connection events. */ + ble_common_opt_extended_rc_cal_t extended_rc_cal; /**< Parameters for enabling extended RC calibration. */ + ble_common_opt_adv_sched_cfg_t adv_sched_cfg; /**< Parameters for configuring advertiser role scheduling. */ +} ble_common_opt_t; + +/**@brief Common BLE Option type, wrapping the module specific options. */ +typedef union +{ + ble_common_opt_t common_opt; /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */ + ble_gap_opt_t gap_opt; /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */ +} ble_opt_t; + +/**@brief BLE connection configuration type, wrapping the module specific configurations, set with + * @ref sd_ble_cfg_set. + * + * @note Connection configurations don't have to be set. + * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, + * the default connection configuration will be automatically added for the remaining connections. + * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in + * place of @ref ble_conn_cfg_t::conn_cfg_tag. + * + * @sa sd_ble_gap_adv_start() + * @sa sd_ble_gap_connect() + * + * @mscs + * @mmsc{@ref BLE_CONN_CFG} + * @endmscs + + */ +typedef struct +{ + uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the + @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() calls + to select this configuration when creating a connection. + Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ + union { + ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ + ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ + ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ + ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ + ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ + } params; /**< Connection configuration union. */ +} ble_conn_cfg_t; + +/** + * @brief Configuration of Vendor Specific base UUIDs, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured. + */ +typedef struct +{ + uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific base UUID bases to allocate memory for. + Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is + @ref BLE_UUID_VS_COUNT_MAX. */ +} ble_common_cfg_vs_uuid_t; + +/**@brief Common BLE Configuration type, wrapping the common configurations. */ +typedef union +{ + ble_common_cfg_vs_uuid_t vs_uuid_cfg; /**< Vendor Specific base UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */ +} ble_common_cfg_t; + +/**@brief BLE Configuration type, wrapping the module specific configurations. */ +typedef union +{ + ble_conn_cfg_t conn_cfg; /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */ + ble_common_cfg_t common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */ + ble_gap_cfg_t gap_cfg; /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */ + ble_gatts_cfg_t gatts_cfg; /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */ +} ble_cfg_t; + +/** @} */ + +/** @addtogroup BLE_COMMON_FUNCTIONS Functions + * @{ */ + +/**@brief Enable the BLE stack + * + * @param[in, out] p_app_ram_base Pointer to a variable containing the start address of the + * application RAM region (APP_RAM_BASE). On return, this will + * contain the minimum start address of the application RAM region + * required by the SoftDevice for this configuration. + * + * @note The memory requirement for a specific configuration will not increase between SoftDevices + * with the same major version number. + * + * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located + * between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between + * APP_RAM_BASE and the start of the call stack. + * + * @details This call initializes the BLE stack, no BLE related function other than @ref + * sd_ble_cfg_set can be called before this one. + * + * @mscs + * @mmsc{@ref BLE_COMMON_ENABLE} + * @endmscs + * + * @retval ::NRF_SUCCESS The BLE stack has been initialized successfully. + * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized and cannot be reinitialized. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_NO_MEM One or more of the following is true: + * - The amount of memory assigned to the SoftDevice by *p_app_ram_base is not + * large enough to fit this configuration's memory requirement. Check *p_app_ram_base + * and set the start address of the application RAM region accordingly. + * - Dynamic part of the SoftDevice RAM region is larger then 64 kB which + * is currently not supported. + * @retval ::NRF_ERROR_RESOURCES The total number of L2CAP Channels configured using @ref sd_ble_cfg_set is too large. + */ +SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base)); + +/**@brief Add configurations for the BLE stack + * + * @param[in] cfg_id Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref + * BLE_GAP_CFGS or @ref BLE_GATTS_CFGS. + * @param[in] p_cfg Pointer to a ble_cfg_t structure containing the configuration value. + * @param[in] app_ram_base The start address of the application RAM region (APP_RAM_BASE). + * See @ref sd_ble_enable for details about APP_RAM_BASE. + * + * @note The memory requirement for a specific configuration will not increase between SoftDevices + * with the same major version number. + * + * @note If a configuration is set more than once, the last one set is the one that takes effect on + * @ref sd_ble_enable. + * + * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default + * configuration. + * + * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref + * sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref + * sd_ble_enable). + * + * @note Error codes for the configurations are described in the configuration structs. + * + * @mscs + * @mmsc{@ref BLE_COMMON_ENABLE} + * @endmscs + * + * @retval ::NRF_SUCCESS The configuration has been added successfully. + * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid cfg_id supplied. + * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by app_ram_base is not + * large enough to fit this configuration's memory requirement. + */ +SVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)); + +/**@brief Get an event from the pending events queue. + * + * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. + * This buffer must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT. + * The buffer should be interpreted as a @ref ble_evt_t struct. + * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length. + * + * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that + * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt. + * The application is free to choose whether to call this function from thread mode (main context) or directly from the + * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher + * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) + * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so + * could potentially leave events in the internal queue without the application being aware of this fact. + * + * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to + * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event, + * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size. + * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also "peek" the event length + * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return: + * + * \code + * uint16_t len; + * errcode = sd_ble_evt_get(NULL, &len); + * \endcode + * + * @mscs + * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC} + * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled. + * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer. + */ +SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)); + + +/**@brief Add a Vendor Specific base UUID. + * + * @details This call enables the application to add a Vendor Specific base UUID to the BLE stack's table, for later + * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t + * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code + * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses + * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to + * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field + * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to + * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536, + * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array. + * + * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by + * the 16-bit uuid field in @ref ble_uuid_t. + * + * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in + * p_uuid_type along with an @ref NRF_SUCCESS error code. + * + * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific base UUID disregarding + * bytes 12 and 13. + * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored. + * + * @retval ::NRF_SUCCESS Successfully added the Vendor Specific base UUID. + * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid. + * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs. + */ +SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)); + + +/**@brief Remove a Vendor Specific base UUID. + * + * @details This call removes a Vendor Specific base UUID that has been added with @ref sd_ble_uuid_vs_add. This function allows + * the application to reuse memory allocated for Vendor Specific base UUIDs. + * + * @note Currently this function can only be called with a p_uuid_type set to @ref BLE_UUID_TYPE_UNKNOWN or the last added UUID type. + * + * @param[in] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t::type corresponds to the UUID type that + * shall be removed. If the type is set to @ref BLE_UUID_TYPE_UNKNOWN, or the pointer is NULL, the last + * Vendor Specific base UUID will be removed. + * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponds to the UUID type that was + * removed. If function returns with a failure, it contains the last type that is in use by the ATT Server. + * + * @retval ::NRF_SUCCESS Successfully removed the Vendor Specific base UUID. + * @retval ::NRF_ERROR_INVALID_ADDR If p_uuid_type is invalid. + * @retval ::NRF_ERROR_INVALID_PARAM If p_uuid_type points to a non-valid UUID type. + * @retval ::NRF_ERROR_FORBIDDEN If the Vendor Specific base UUID is in use by the ATT Server. + */ + +SVCALL(SD_BLE_UUID_VS_REMOVE, uint32_t, sd_ble_uuid_vs_remove(uint8_t *p_uuid_type)); + + +/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure. + * + * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared + * to the corresponding ones in each entry of the table of Vendor Specific base UUIDs populated with @ref sd_ble_uuid_vs_add + * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index + * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type. + * + * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE. + * + * @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes). + * @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes. + * @param[out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length. + * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs. + */ +SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)); + + +/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit). + * + * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed. + * + * @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes. + * @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes). + * @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored. + * + * @retval ::NRF_SUCCESS Successfully encoded into the buffer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type. + */ +SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)); + + +/**@brief Get Version Information. + * + * @details This call allows the application to get the BLE stack version information. + * + * @param[out] p_version Pointer to a ble_version_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Version information stored successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure). + */ +SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version)); + + +/**@brief Provide a user memory block. + * + * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. + * + * @param[in] conn_handle Connection handle. + * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Successfully queued a response to the peer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. + */ +SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); + +/**@brief Set a BLE option. + * + * @details This call allows the application to set the value of an option. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} + * @endmscs + * + * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. + * @param[in] p_opt Pointer to a ble_opt_t structure containing the option value. + * + * @retval ::NRF_SUCCESS Option set successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. + * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. + */ +SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)); + + +/**@brief Get a BLE option. + * + * @details This call allows the application to retrieve the value of an option. + * + * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. + * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Option retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. + * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. + * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported. + * + */ +SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)); + +/** @} */ +#ifdef __cplusplus +} +#endif +#endif /* BLE_H__ */ + +/** + @} + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_err.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_err.h new file mode 100644 index 0000000..1b4820d --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_err.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @addtogroup nrf_error + @{ + @ingroup BLE_COMMON + @} + + @defgroup ble_err General error codes + @{ + + @brief General error code definitions for the BLE API. + + @ingroup BLE_COMMON +*/ +#ifndef NRF_BLE_ERR_H__ +#define NRF_BLE_ERR_H__ + +#include "nrf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* @defgroup BLE_ERRORS Error Codes + * @{ */ +#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ +#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ +#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ +#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ +#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ +#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ +/** @} */ + + +/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges + * @brief Assignment of subranges for module specific error codes. + * @note For specific error codes, see ble_.h or ble_error_.h. + * @{ */ +#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ +#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ +#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ +#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif + + +/** + @} + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gap.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gap.h new file mode 100644 index 0000000..fe9365f --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gap.h @@ -0,0 +1,2681 @@ +/* + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GAP Generic Access Profile (GAP) + @{ + @brief Definitions and prototypes for the GAP interface. + */ + +#ifndef BLE_GAP_H__ +#define BLE_GAP_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup BLE_GAP_ENUMERATIONS Enumerations + * @{ */ + +/**@brief GAP API SVC numbers. + */ +enum BLE_GAP_SVCS +{ + SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ + SD_BLE_GAP_ADDR_GET = BLE_GAP_SVC_BASE + 1, /**< Get own Bluetooth Address. */ + SD_BLE_GAP_WHITELIST_SET = BLE_GAP_SVC_BASE + 2, /**< Set active whitelist. */ + SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ + SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ + SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ + SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ + SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ + SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ + SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ + SD_BLE_GAP_DISCONNECT = BLE_GAP_SVC_BASE + 10, /**< Disconnect. */ + SD_BLE_GAP_TX_POWER_SET = BLE_GAP_SVC_BASE + 11, /**< Set TX Power. */ + SD_BLE_GAP_APPEARANCE_SET = BLE_GAP_SVC_BASE + 12, /**< Set Appearance. */ + SD_BLE_GAP_APPEARANCE_GET = BLE_GAP_SVC_BASE + 13, /**< Get Appearance. */ + SD_BLE_GAP_PPCP_SET = BLE_GAP_SVC_BASE + 14, /**< Set PPCP. */ + SD_BLE_GAP_PPCP_GET = BLE_GAP_SVC_BASE + 15, /**< Get PPCP. */ + SD_BLE_GAP_DEVICE_NAME_SET = BLE_GAP_SVC_BASE + 16, /**< Set Device Name. */ + SD_BLE_GAP_DEVICE_NAME_GET = BLE_GAP_SVC_BASE + 17, /**< Get Device Name. */ + SD_BLE_GAP_AUTHENTICATE = BLE_GAP_SVC_BASE + 18, /**< Initiate Pairing/Bonding. */ + SD_BLE_GAP_SEC_PARAMS_REPLY = BLE_GAP_SVC_BASE + 19, /**< Reply with Security Parameters. */ + SD_BLE_GAP_AUTH_KEY_REPLY = BLE_GAP_SVC_BASE + 20, /**< Reply with an authentication key. */ + SD_BLE_GAP_LESC_DHKEY_REPLY = BLE_GAP_SVC_BASE + 21, /**< Reply with an LE Secure Connections DHKey. */ + SD_BLE_GAP_KEYPRESS_NOTIFY = BLE_GAP_SVC_BASE + 22, /**< Notify of a keypress during an authentication procedure. */ + SD_BLE_GAP_LESC_OOB_DATA_GET = BLE_GAP_SVC_BASE + 23, /**< Get the local LE Secure Connections OOB data. */ + SD_BLE_GAP_LESC_OOB_DATA_SET = BLE_GAP_SVC_BASE + 24, /**< Set the remote LE Secure Connections OOB data. */ + SD_BLE_GAP_ENCRYPT = BLE_GAP_SVC_BASE + 25, /**< Initiate encryption procedure. */ + SD_BLE_GAP_SEC_INFO_REPLY = BLE_GAP_SVC_BASE + 26, /**< Reply with Security Information. */ + SD_BLE_GAP_CONN_SEC_GET = BLE_GAP_SVC_BASE + 27, /**< Obtain connection security level. */ + SD_BLE_GAP_RSSI_START = BLE_GAP_SVC_BASE + 28, /**< Start reporting of changes in RSSI. */ + SD_BLE_GAP_RSSI_STOP = BLE_GAP_SVC_BASE + 29, /**< Stop reporting of changes in RSSI. */ + SD_BLE_GAP_SCAN_START = BLE_GAP_SVC_BASE + 30, /**< Start Scanning. */ + SD_BLE_GAP_SCAN_STOP = BLE_GAP_SVC_BASE + 31, /**< Stop Scanning. */ + SD_BLE_GAP_CONNECT = BLE_GAP_SVC_BASE + 32, /**< Connect. */ + SD_BLE_GAP_CONNECT_CANCEL = BLE_GAP_SVC_BASE + 33, /**< Cancel ongoing connection procedure. */ + SD_BLE_GAP_RSSI_GET = BLE_GAP_SVC_BASE + 34, /**< Get the last RSSI sample. */ + SD_BLE_GAP_PHY_UPDATE = BLE_GAP_SVC_BASE + 35, /**< Initiate or respond to a PHY Update Procedure. */ + SD_BLE_GAP_DATA_LENGTH_UPDATE = BLE_GAP_SVC_BASE + 36, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_START = BLE_GAP_SVC_BASE + 37, /**< Start Quality of Service (QoS) channel survey module. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP = BLE_GAP_SVC_BASE + 38, /**< Stop Quality of Service (QoS) channel survey module. */ + SD_BLE_GAP_ADV_ADDR_GET = BLE_GAP_SVC_BASE + 39, /**< Get the Address used on air while Advertising. */ +}; + +/**@brief GAP Event IDs. + * IDs that uniquely identify an event coming from the stack to the application. + */ +enum BLE_GAP_EVTS +{ + BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connected to peer. \n See @ref ble_gap_evt_connected_t */ + BLE_GAP_EVT_DISCONNECTED = BLE_GAP_EVT_BASE + 1, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE = BLE_GAP_EVT_BASE + 2, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ + BLE_GAP_EVT_SEC_PARAMS_REQUEST = BLE_GAP_EVT_BASE + 3, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ + BLE_GAP_EVT_SEC_INFO_REQUEST = BLE_GAP_EVT_BASE + 4, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ + BLE_GAP_EVT_PASSKEY_DISPLAY = BLE_GAP_EVT_BASE + 5, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ + BLE_GAP_EVT_KEY_PRESSED = BLE_GAP_EVT_BASE + 6, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ + BLE_GAP_EVT_AUTH_KEY_REQUEST = BLE_GAP_EVT_BASE + 7, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ + BLE_GAP_EVT_LESC_DHKEY_REQUEST = BLE_GAP_EVT_BASE + 8, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ + BLE_GAP_EVT_AUTH_STATUS = BLE_GAP_EVT_BASE + 9, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ + BLE_GAP_EVT_CONN_SEC_UPDATE = BLE_GAP_EVT_BASE + 10, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ + BLE_GAP_EVT_TIMEOUT = BLE_GAP_EVT_BASE + 11, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ + BLE_GAP_EVT_RSSI_CHANGED = BLE_GAP_EVT_BASE + 12, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ + BLE_GAP_EVT_ADV_REPORT = BLE_GAP_EVT_BASE + 13, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ + BLE_GAP_EVT_SEC_REQUEST = BLE_GAP_EVT_BASE + 14, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 15, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ + BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ + BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ + BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE = BLE_GAP_EVT_BASE + 20, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT = BLE_GAP_EVT_BASE + 21, /**< Channel survey report. \n See @ref ble_gap_evt_qos_channel_survey_report_t. */ + BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ +}; + +/**@brief GAP Option IDs. + * IDs that uniquely identify a GAP option. + */ +enum BLE_GAP_OPTS +{ + BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ + BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ + BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ + BLE_GAP_OPT_COMPAT_MODE_1 = BLE_GAP_OPT_BASE + 3, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ + BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ + BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ +}; + +/**@brief GAP Configuration IDs. + * + * IDs that uniquely identify a GAP configuration. + */ +enum BLE_GAP_CFGS +{ + BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ + BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ +}; + +/**@brief GAP TX Power roles. + */ +enum BLE_GAP_TX_POWER_ROLES +{ + BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ + BLE_GAP_TX_POWER_ROLE_SCAN_INIT = 2, /**< Scanner and initiator role. */ + BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ +}; + +/** @} */ + +/**@addtogroup BLE_GAP_DEFINES Defines + * @{ */ + +/**@defgroup BLE_ERRORS_GAP SVC return values specific to GAP + * @{ */ +#define BLE_ERROR_GAP_UUID_LIST_MISMATCH (NRF_GAP_ERR_BASE + 0x000) /**< UUID list does not contain an integral number of UUIDs. */ +#define BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST (NRF_GAP_ERR_BASE + 0x001) /**< Use of Whitelist not permitted with discoverable advertising. */ +#define BLE_ERROR_GAP_INVALID_BLE_ADDR (NRF_GAP_ERR_BASE + 0x002) /**< The upper two bits of the address do not correspond to the specified address type. */ +#define BLE_ERROR_GAP_WHITELIST_IN_USE (NRF_GAP_ERR_BASE + 0x003) /**< Attempt to modify the whitelist while already in use by another operation. */ +#define BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE (NRF_GAP_ERR_BASE + 0x004) /**< Attempt to modify the device identity list while already in use by another operation. */ +#define BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE (NRF_GAP_ERR_BASE + 0x005) /**< The device identity list contains entries with duplicate identity addresses. */ +/**@} */ + + +/**@defgroup BLE_GAP_ROLES GAP Roles + * @{ */ +#define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ +#define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ +#define BLE_GAP_ROLE_CENTRAL 0x2 /**< Central Role. */ +/**@} */ + + +/**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources + * @{ */ +#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ +#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ +#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ +/**@} */ + + +/**@defgroup BLE_GAP_ADDR_TYPES GAP Address types + * @{ */ +#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ +#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ +#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ +#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ +#define BLE_GAP_ADDR_TYPE_ANONYMOUS 0x7F /**< An advertiser may advertise without its address. + This type of advertising is called anonymous. */ +/**@} */ + + +/**@brief The default interval in seconds at which a private address is refreshed. */ +#define BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S (900) /* 15 minutes. */ +/**@brief The maximum interval in seconds at which a private address can be refreshed. */ +#define BLE_GAP_MAX_PRIVATE_ADDR_CYCLE_INTERVAL_S (41400) /* 11 hours 30 minutes. */ + + +/** @brief BLE address length. */ +#define BLE_GAP_ADDR_LEN (6) + +/**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes + * @{ */ +#define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ +#define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ +#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, + and will not accept a peer using identity address as sender address when + the peer IRK is exchanged, non-zero and added to the identity list. */ +/**@} */ + +/** @brief Invalid power level. */ +#define BLE_GAP_POWER_LEVEL_INVALID 127 + +/** @brief Advertising set handle not set. */ +#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) + +/** @brief The default number of advertising sets. */ +#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) + +/** @brief The maximum number of advertising sets supported by this SoftDevice. */ +#define BLE_GAP_ADV_SET_COUNT_MAX (1) + +/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. + * @{ */ +#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. + If more advertising data is required, use extended advertising instead. */ +#define BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED (255) /**< Maximum supported data length for an extended advertising set. */ + +#define BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED (238) /**< Maximum supported data length for an extended connectable advertising set. */ +/**@}. */ + +/** @brief Set ID not available in advertising report. */ +#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF + +/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons + * @{ */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ +/**@} */ + +/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format + * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm + * @{ */ +#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */ +#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */ +#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */ +#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */ +#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */ +#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */ +#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */ +#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */ +#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */ +#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */ +#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */ +#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */ +#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */ +#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */ +#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */ +#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */ +#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */ +#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */ +#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */ +#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */ +#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */ +#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */ +#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */ +#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */ +#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */ +#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */ +#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */ +#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */ +/**@} */ + + +/**@defgroup BLE_GAP_ADV_FLAGS GAP Advertisement Flags + * @{ */ +#define BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE (0x01) /**< LE Limited Discoverable Mode. */ +#define BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE (0x02) /**< LE General Discoverable Mode. */ +#define BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED (0x04) /**< BR/EDR not supported. */ +#define BLE_GAP_ADV_FLAG_LE_BR_EDR_CONTROLLER (0x08) /**< Simultaneous LE and BR/EDR, Controller. */ +#define BLE_GAP_ADV_FLAG_LE_BR_EDR_HOST (0x10) /**< Simultaneous LE and BR/EDR, Host. */ +#define BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE (BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE Limited Discoverable Mode, BR/EDR not supported. */ +#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE General Discoverable Mode, BR/EDR not supported. */ +/**@} */ + + +/**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min + * @{ */ +#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ +#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ + /**@} */ + + +/**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min + * @{ */ +#define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ +#define BLE_GAP_SCAN_INTERVAL_MAX 0xFFFF /**< Maximum Scan interval in 625 us units, i.e. 40,959.375 s. */ + /** @} */ + + +/**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min + * @{ */ +#define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ +#define BLE_GAP_SCAN_WINDOW_MAX 0xFFFF /**< Maximum Scan window in 625 us units, i.e. 40,959.375 s. */ + /** @} */ + + +/**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min + * @{ */ +#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in 10 ms units, i.e 10 ms. */ +#define BLE_GAP_SCAN_TIMEOUT_UNLIMITED 0x0000 /**< Continue to scan forever. */ + /** @} */ + +/**@defgroup BLE_GAP_SCAN_BUFFER_SIZE GAP Minimum scanner buffer size + * + * Scan buffers are used for storing advertising data received from an advertiser. + * If ble_gap_scan_params_t::extended is set to 0, @ref BLE_GAP_SCAN_BUFFER_MIN is the minimum scan buffer length. + * else the minimum scan buffer size is @ref BLE_GAP_SCAN_BUFFER_EXTENDED_MIN. + * @{ */ +#define BLE_GAP_SCAN_BUFFER_MIN (31) /**< Minimum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_MAX (31) /**< Maximum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MIN (255) /**< Minimum data length for an + extended advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX (1650) /**< Maximum data length for an + extended advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED (255) /**< Maximum supported data length for + an extended advertising set. */ +/** @} */ + +/**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types + * + * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. + * + * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. + * The maximum supported data length for an extended advertiser is defined by + * @ref BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED + * Note that some of the advertising types do not support advertising data. Non-scannable types do not support + * scan response data. + * + * @{ */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising + events. Advertising interval is less that 3.75 ms. + Use this type for fast reconnections. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising + events. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED 0x06 /**< Connectable non-scannable undirected advertising + events using extended advertising PDUs. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_DIRECTED 0x07 /**< Connectable non-scannable directed advertising + events using extended advertising PDUs. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x08 /**< Non-connectable scannable undirected advertising + events using extended advertising PDUs. + @note Only scan response data is supported. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_DIRECTED 0x09 /**< Non-connectable scannable directed advertising + events using extended advertising PDUs. + @note Only scan response data is supported. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x0A /**< Non-connectable non-scannable undirected advertising + events using extended advertising PDUs. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED 0x0B /**< Non-connectable non-scannable directed advertising + events using extended advertising PDUs. */ +/**@} */ + +/**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies + * @{ */ +#define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ +#define BLE_GAP_ADV_FP_FILTER_SCANREQ 0x01 /**< Filter scan requests with whitelist. */ +#define BLE_GAP_ADV_FP_FILTER_CONNREQ 0x02 /**< Filter connect requests with whitelist. */ +#define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ +/**@} */ + +/**@defgroup BLE_GAP_ADV_DATA_STATUS GAP Advertising data status + * @{ */ +#define BLE_GAP_ADV_DATA_STATUS_COMPLETE 0x00 /**< All data in the advertising event have been received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA 0x01 /**< More data to be received. + @note This value will only be used if + @ref ble_gap_scan_params_t::report_incomplete_evts and + @ref ble_gap_adv_report_type_t::extended_pdu are set to true. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED 0x02 /**< Incomplete data. Buffer size insufficient to receive more. + @note This value will only be used if + @ref ble_gap_adv_report_type_t::extended_pdu is set to true. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MISSED 0x03 /**< Failed to receive the remaining data. + @note This value will only be used if + @ref ble_gap_adv_report_type_t::extended_pdu is set to true. */ +/**@} */ + +/**@defgroup BLE_GAP_SCAN_FILTER_POLICIES GAP Scanner filter policies + * @{ */ +#define BLE_GAP_SCAN_FP_ACCEPT_ALL 0x00 /**< Accept all advertising packets except directed advertising packets + not addressed to this device. */ +#define BLE_GAP_SCAN_FP_WHITELIST 0x01 /**< Accept advertising packets from devices in the whitelist except directed + packets not addressed to this device. */ +#define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED 0x02 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_ACCEPT_ALL. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +#define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_WHITELIST. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +/**@} */ + +/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units + * @{ */ +#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ +#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ +#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. + For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ +/**@} */ + + +/**@defgroup BLE_GAP_DISC_MODES GAP Discovery modes + * @{ */ +#define BLE_GAP_DISC_MODE_NOT_DISCOVERABLE 0x00 /**< Not discoverable discovery Mode. */ +#define BLE_GAP_DISC_MODE_LIMITED 0x01 /**< Limited Discovery Mode. */ +#define BLE_GAP_DISC_MODE_GENERAL 0x02 /**< General Discovery Mode. */ +/**@} */ + + +/**@defgroup BLE_GAP_IO_CAPS GAP IO Capabilities + * @{ */ +#define BLE_GAP_IO_CAPS_DISPLAY_ONLY 0x00 /**< Display Only. */ +#define BLE_GAP_IO_CAPS_DISPLAY_YESNO 0x01 /**< Display and Yes/No entry. */ +#define BLE_GAP_IO_CAPS_KEYBOARD_ONLY 0x02 /**< Keyboard Only. */ +#define BLE_GAP_IO_CAPS_NONE 0x03 /**< No I/O capabilities. */ +#define BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY 0x04 /**< Keyboard and Display. */ +/**@} */ + + +/**@defgroup BLE_GAP_AUTH_KEY_TYPES GAP Authentication Key Types + * @{ */ +#define BLE_GAP_AUTH_KEY_TYPE_NONE 0x00 /**< No key (may be used to reject). */ +#define BLE_GAP_AUTH_KEY_TYPE_PASSKEY 0x01 /**< 6-digit Passkey. */ +#define BLE_GAP_AUTH_KEY_TYPE_OOB 0x02 /**< Out Of Band data. */ +/**@} */ + + +/**@defgroup BLE_GAP_KP_NOT_TYPES GAP Keypress Notification Types + * @{ */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_START 0x00 /**< Passkey entry started. */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_IN 0x01 /**< Passkey digit entered. */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_OUT 0x02 /**< Passkey digit erased. */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_CLEAR 0x03 /**< Passkey cleared. */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_END 0x04 /**< Passkey entry completed. */ +/**@} */ + + +/**@defgroup BLE_GAP_SEC_STATUS GAP Security status + * @{ */ +#define BLE_GAP_SEC_STATUS_SUCCESS 0x00 /**< Procedure completed with success. */ +#define BLE_GAP_SEC_STATUS_TIMEOUT 0x01 /**< Procedure timed out. */ +#define BLE_GAP_SEC_STATUS_PDU_INVALID 0x02 /**< Invalid PDU received. */ +#define BLE_GAP_SEC_STATUS_RFU_RANGE1_BEGIN 0x03 /**< Reserved for Future Use range #1 begin. */ +#define BLE_GAP_SEC_STATUS_RFU_RANGE1_END 0x80 /**< Reserved for Future Use range #1 end. */ +#define BLE_GAP_SEC_STATUS_PASSKEY_ENTRY_FAILED 0x81 /**< Passkey entry failed (user canceled or other). */ +#define BLE_GAP_SEC_STATUS_OOB_NOT_AVAILABLE 0x82 /**< Out of Band Key not available. */ +#define BLE_GAP_SEC_STATUS_AUTH_REQ 0x83 /**< Authentication requirements not met. */ +#define BLE_GAP_SEC_STATUS_CONFIRM_VALUE 0x84 /**< Confirm value failed. */ +#define BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP 0x85 /**< Pairing not supported. */ +#define BLE_GAP_SEC_STATUS_ENC_KEY_SIZE 0x86 /**< Encryption key size. */ +#define BLE_GAP_SEC_STATUS_SMP_CMD_UNSUPPORTED 0x87 /**< Unsupported SMP command. */ +#define BLE_GAP_SEC_STATUS_UNSPECIFIED 0x88 /**< Unspecified reason. */ +#define BLE_GAP_SEC_STATUS_REPEATED_ATTEMPTS 0x89 /**< Too little time elapsed since last attempt. */ +#define BLE_GAP_SEC_STATUS_INVALID_PARAMS 0x8A /**< Invalid parameters. */ +#define BLE_GAP_SEC_STATUS_DHKEY_FAILURE 0x8B /**< DHKey check failure. */ +#define BLE_GAP_SEC_STATUS_NUM_COMP_FAILURE 0x8C /**< Numeric Comparison failure. */ +#define BLE_GAP_SEC_STATUS_BR_EDR_IN_PROG 0x8D /**< BR/EDR pairing in progress. */ +#define BLE_GAP_SEC_STATUS_X_TRANS_KEY_DISALLOWED 0x8E /**< BR/EDR Link Key cannot be used for LE keys. */ +#define BLE_GAP_SEC_STATUS_RFU_RANGE2_BEGIN 0x8F /**< Reserved for Future Use range #2 begin. */ +#define BLE_GAP_SEC_STATUS_RFU_RANGE2_END 0xFF /**< Reserved for Future Use range #2 end. */ +/**@} */ + + +/**@defgroup BLE_GAP_SEC_STATUS_SOURCES GAP Security status sources + * @{ */ +#define BLE_GAP_SEC_STATUS_SOURCE_LOCAL 0x00 /**< Local failure. */ +#define BLE_GAP_SEC_STATUS_SOURCE_REMOTE 0x01 /**< Remote failure. */ +/**@} */ + + +/**@defgroup BLE_GAP_CP_LIMITS GAP Connection Parameters Limits + * @{ */ +#define BLE_GAP_CP_MIN_CONN_INTVL_NONE 0xFFFF /**< No new minimum connection interval specified in connect parameters. */ +#define BLE_GAP_CP_MIN_CONN_INTVL_MIN 0x0006 /**< Lowest minimum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ +#define BLE_GAP_CP_MIN_CONN_INTVL_MAX 0x0C80 /**< Highest minimum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ +#define BLE_GAP_CP_MAX_CONN_INTVL_NONE 0xFFFF /**< No new maximum connection interval specified in connect parameters. */ +#define BLE_GAP_CP_MAX_CONN_INTVL_MIN 0x0006 /**< Lowest maximum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ +#define BLE_GAP_CP_MAX_CONN_INTVL_MAX 0x0C80 /**< Highest maximum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ +#define BLE_GAP_CP_SLAVE_LATENCY_MAX 0x01F3 /**< Highest slave latency permitted, in connection events. */ +#define BLE_GAP_CP_CONN_SUP_TIMEOUT_NONE 0xFFFF /**< No new supervision timeout specified in connect parameters. */ +#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MIN 0x000A /**< Lowest supervision timeout permitted, in units of 10 ms, i.e. 100 ms. */ +#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MAX 0x0C80 /**< Highest supervision timeout permitted, in units of 10 ms, i.e. 32 s. */ +/**@} */ + + +/**@defgroup BLE_GAP_DEVNAME GAP device name defines. + * @{ */ +#define BLE_GAP_DEVNAME_DEFAULT "nRF5x" /**< Default device name value. */ +#define BLE_GAP_DEVNAME_DEFAULT_LEN 31 /**< Default number of octets in device name. */ +#define BLE_GAP_DEVNAME_MAX_LEN 248 /**< Maximum number of octets in device name. */ +/**@} */ + + +/**@brief Disable RSSI events for connections */ +#define BLE_GAP_RSSI_THRESHOLD_INVALID 0xFF + +/**@defgroup BLE_GAP_PHYS GAP PHYs + * @{ */ +#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ +#define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ +#define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ +#define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ +#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ + +/**@brief Supported PHYs in connections, for scanning, and for advertising. */ +#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS) /**< All PHYs except @ref BLE_GAP_PHY_CODED are supported. */ + +/**@} */ + +/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters + * + * See @ref ble_gap_conn_sec_mode_t. + * @{ */ +/**@brief Set sec_mode pointed to by ptr to have no access rights.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr) do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0) +/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr) do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0) +/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0) +/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0) +/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0) +/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0) +/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0) +/**@} */ + + +/**@brief GAP Security Random Number Length. */ +#define BLE_GAP_SEC_RAND_LEN 8 + + +/**@brief GAP Security Key Length. */ +#define BLE_GAP_SEC_KEY_LEN 16 + + +/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key Length. */ +#define BLE_GAP_LESC_P256_PK_LEN 64 + + +/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman DHKey Length. */ +#define BLE_GAP_LESC_DHKEY_LEN 32 + + +/**@brief GAP Passkey Length. */ +#define BLE_GAP_PASSKEY_LEN 6 + + +/**@brief Maximum amount of addresses in the whitelist. */ +#define BLE_GAP_WHITELIST_ADDR_MAX_COUNT (8) + + +/**@brief Maximum amount of identities in the device identities list. */ +#define BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT (8) + + +/**@brief Default connection count for a configuration. */ +#define BLE_GAP_CONN_COUNT_DEFAULT (1) + + +/**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. + * @{ */ +#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ +/**@} */ + + +/**@defgroup BLE_GAP_ROLE_COUNT GAP concurrent connection count defines. + * @{ */ +#define BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT (1) /**< Default maximum number of connections concurrently acting as peripherals. */ +#define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ +#define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ +#define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ + +/**@} */ + +/**@brief Automatic data length parameter. */ +#define BLE_GAP_DATA_LENGTH_AUTO 0 + +/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. + * @{ */ +#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ +#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ +/**@} */ + +/**@defgroup GAP_SEC_MODES GAP Security Modes + * @{ */ +#define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ +/**@} */ + +/**@brief The total number of channels in Bluetooth Low Energy. */ +#define BLE_GAP_CHANNEL_COUNT (40) + +/**@defgroup BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS Quality of Service (QoS) Channel survey interval defines + * @{ */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS (0) /**< Continuous channel survey. */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MIN_US (7500) /**< Minimum channel survey interval in microseconds (7.5 ms). */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MAX_US (4000000) /**< Maximum channel survey interval in microseconds (4 s). */ + /**@} */ + +/** @} */ + + +/**@addtogroup BLE_GAP_STRUCTURES Structures + * @{ */ + +/**@brief Advertising event properties. */ +typedef struct +{ + uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ + uint8_t anonymous : 1; /**< Omit advertiser's address from all PDUs. + @note Anonymous advertising is only available for + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED and + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED. */ + uint8_t include_tx_power : 1; /**< This feature is not supported on this SoftDevice. */ +} ble_gap_adv_properties_t; + + +/**@brief Advertising report type. */ +typedef struct +{ + uint16_t connectable : 1; /**< Connectable advertising event type. */ + uint16_t scannable : 1; /**< Scannable advertising event type. */ + uint16_t directed : 1; /**< Directed advertising event type. */ + uint16_t scan_response : 1; /**< Received a scan response. */ + uint16_t extended_pdu : 1; /**< Received an extended advertising set. */ + uint16_t status : 2; /**< Data status. See @ref BLE_GAP_ADV_DATA_STATUS. */ + uint16_t reserved : 9; /**< Reserved for future use. */ +} ble_gap_adv_report_type_t; + +/**@brief Advertising Auxiliary Pointer. */ +typedef struct +{ + uint16_t aux_offset; /**< Time offset from the beginning of advertising packet to the auxiliary packet in 100 us units. */ + uint8_t aux_phy; /**< Indicates the PHY on which the auxiliary advertising packet is sent. See @ref BLE_GAP_PHYS. */ +} ble_gap_aux_pointer_t; + +/**@brief Bluetooth Low Energy address. */ +typedef struct +{ + uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. + This bit is set by the SoftDevice to indicate whether the address has been resolved from + a Resolvable Private Address (when the peer is using privacy). + If set to 1, @ref addr and @ref addr_type refer to the identity address of the resolved address. + + This bit is ignored when a variable of type @ref ble_gap_addr_t is used as input to API functions. */ + uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ + uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. + @ref addr is not used if @ref addr_type is @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. */ +} ble_gap_addr_t; + + +/**@brief GAP connection parameters. + * + * @note When ble_conn_params_t is received in an event, both min_conn_interval and + * max_conn_interval will be equal to the connection interval set by the central. + * + * @note If both conn_sup_timeout and max_conn_interval are specified, then the following constraint applies: + * conn_sup_timeout * 4 > (1 + slave_latency) * max_conn_interval + * that corresponds to the following Bluetooth Spec requirement: + * The Supervision_Timeout in milliseconds shall be larger than + * (1 + Conn_Latency) * Conn_Interval_Max * 2, where Conn_Interval_Max is given in milliseconds. + */ +typedef struct +{ + uint16_t min_conn_interval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ + uint16_t max_conn_interval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ + uint16_t slave_latency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/ + uint16_t conn_sup_timeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/ +} ble_gap_conn_params_t; + + +/**@brief GAP connection security modes. + * + * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\n + * Security Mode 1 Level 1: No security is needed (aka open link).\n + * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n + * Security Mode 1 Level 3: MITM protected encrypted link required.\n + * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n + * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n + * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n + */ +typedef struct +{ + uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */ + uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */ + +} ble_gap_conn_sec_mode_t; + + +/**@brief GAP connection security status.*/ +typedef struct +{ + ble_gap_conn_sec_mode_t sec_mode; /**< Currently active security mode for this connection.*/ + uint8_t encr_key_size; /**< Length of currently active encryption key, 7 to 16 octets (only applicable for bonding procedures). */ +} ble_gap_conn_sec_t; + +/**@brief Identity Resolving Key. */ +typedef struct +{ + uint8_t irk[BLE_GAP_SEC_KEY_LEN]; /**< Array containing IRK. */ +} ble_gap_irk_t; + + +/**@brief Channel mask (40 bits). + * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, + * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents + * channel index 39. If a bit is set to 1, the channel is not used. + */ +typedef uint8_t ble_gap_ch_mask_t[5]; + + +/**@brief GAP advertising parameters. */ +typedef struct +{ + ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ + ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. + @note ble_gap_addr_t::addr_type cannot be + @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. + - When privacy is enabled and the local device uses + @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, + the device identity list is searched for a matching entry. If + the local IRK for that device identity is set, the local IRK + for that device will be used to generate the advertiser address + field in the advertising packet. + - If @ref ble_gap_adv_properties_t::type is directed, this must be + set to the targeted scanner or initiator. If the peer address is + in the device identity list, the peer IRK for that device will be + used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE + target addresses used in the advertising event PDUs. */ + uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE + advertising, this parameter is ignored. */ + uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, + an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + @sa BLE_GAP_ADV_TIMEOUT_VALUES. + @note The SoftDevice will always complete at least one advertising + event even if the duration is set too low. */ + uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling + advertising. Setting the value to 0 disables the limitation. When + the count of advertising events specified by this parameter + (if not 0) is reached, advertising will be automatically stopped + and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, + this parameter is ignored. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be used. + Masking away secondary advertising channels is not supported. */ + uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets + are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS + will be used. + The only supported value by this SoftDevice is @ref BLE_GAP_PHY_1MBPS. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising channel packets + are transmitted. + If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS will be used. + Valid values are + @ref BLE_GAP_PHY_1MBPS and @ref BLE_GAP_PHY_2MBPS. @ref BLE_GAP_PHY_CODED + is not supported by this SoftDevice. + If @ref ble_gap_adv_properties_t::type is an extended advertising type + and connectable, this is the PHY that will be used to establish a + connection and send AUX_ADV_IND packets on. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t set_id:4; /**< The advertising set identifier distinguishes this advertising set from other + advertising sets transmitted by this and other devices. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a + scan request is received and the scanner address is allowed + by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is a non-scannable + advertising type. */ +} ble_gap_adv_params_t; + + +/**@brief GAP advertising data buffers. + * + * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and + * shall never be modified while advertising. The data shall be kept alive until either: + * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding + * advertising handle. + * - Advertising is stopped. + * - Advertising data is changed. + * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ +typedef struct +{ + ble_data_t adv_data; /**< Advertising data. + @note + Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type + that is allowed to contain advertising data. */ + ble_data_t scan_rsp_data; /**< Scan response data. + @note + Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type + that is scannable. */ +} ble_gap_adv_data_t; + + +/**@brief GAP scanning parameters. */ +typedef struct +{ + uint8_t extended : 1; /**< If 1, the scanner will accept extended advertising packets. + If set to 0, the scanner will not receive advertising packets + on secondary advertising channels, and will not be able + to receive long advertising PDUs. */ + uint8_t report_incomplete_evts : 1; /**< If 1, events of type @ref ble_gap_evt_adv_report_t may have + @ref ble_gap_adv_report_type_t::status set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. + This parameter is ignored when used with @ref sd_ble_gap_connect + @note This may be used to abort receiving more packets from an extended + advertising event, and is only available for extended + scanning, see @ref sd_ble_gap_scan_start. + @note This feature is not supported by this SoftDevice. */ + uint8_t active : 1; /**< If 1, perform active scanning by sending scan requests. + This parameter is ignored when used with @ref sd_ble_gap_connect. */ + uint8_t filter_policy : 2; /**< Scanning filter policy. @sa BLE_GAP_SCAN_FILTER_POLICIES. + @note Only @ref BLE_GAP_SCAN_FP_ACCEPT_ALL and + @ref BLE_GAP_SCAN_FP_WHITELIST are valid when used with + @ref sd_ble_gap_connect */ + uint8_t scan_phys; /**< Bitfield of PHYs to scan on. If set to @ref BLE_GAP_PHY_AUTO, + scan_phys will default to @ref BLE_GAP_PHY_1MBPS. + - If @ref ble_gap_scan_params_t::extended is set to 0, the only + supported PHY is @ref BLE_GAP_PHY_1MBPS. + - When used with @ref sd_ble_gap_scan_start, + the bitfield indicates the PHYs the scanner will use for scanning + on primary advertising channels. The scanner will accept + @ref BLE_GAP_PHYS_SUPPORTED as secondary advertising channel PHYs. + - When used with @ref sd_ble_gap_connect, the bitfield indicates + the PHYs the initiator will use for scanning on primary advertising + channels. The initiator will accept connections initiated on either + of the @ref BLE_GAP_PHYS_SUPPORTED PHYs. + If scan_phys contains @ref BLE_GAP_PHY_1MBPS and/or @ref BLE_GAP_PHY_2MBPS, + the primary scan PHY is @ref BLE_GAP_PHY_1MBPS. */ + uint16_t interval; /**< Scan interval in 625 us units. @sa BLE_GAP_SCAN_INTERVALS. */ + uint16_t window; /**< Scan window in 625 us units. @sa BLE_GAP_SCAN_WINDOW. */ + uint16_t timeout; /**< Scan timeout in 10 ms units. @sa BLE_GAP_SCAN_TIMEOUT. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be + set to 0. + Masking away secondary channels is not supported. */ +} ble_gap_scan_params_t; + + +/**@brief Privacy. + * + * The privacy feature provides a way for the device to avoid being tracked over a period of time. + * The privacy feature, when enabled, hides the local device identity and replaces it with a private address + * that is automatically refreshed at a specified interval. + * + * If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK). + * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, + * and devices can establish connections without revealing their real identities. + * + * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) + * are supported. + * + * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all + * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. + * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. + */ +typedef struct +{ + uint8_t privacy_mode; /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */ + uint8_t private_addr_type; /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ + uint16_t private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */ + ble_gap_irk_t *p_device_irk; /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used. + When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored. + By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */ +} ble_gap_privacy_params_t; + + +/**@brief PHY preferences for TX and RX + * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. + * @code + * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; + * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; + * @endcode + * + */ +typedef struct +{ + uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ + uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ +} ble_gap_phys_t; + +/** @brief Keys that can be exchanged during a bonding procedure. */ +typedef struct +{ + uint8_t enc : 1; /**< Long Term Key and Master Identification. */ + uint8_t id : 1; /**< Identity Resolving Key and Identity Address Information. */ + uint8_t sign : 1; /**< Connection Signature Resolving Key. */ + uint8_t link : 1; /**< Derive the Link Key from the LTK. */ +} ble_gap_sec_kdist_t; + + +/**@brief GAP security parameters. */ +typedef struct +{ + uint8_t bond : 1; /**< Perform bonding. */ + uint8_t mitm : 1; /**< Enable Man In The Middle protection. */ + uint8_t lesc : 1; /**< Enable LE Secure Connection pairing. */ + uint8_t keypress : 1; /**< Enable generation of keypress notifications. */ + uint8_t io_caps : 3; /**< IO capabilities, see @ref BLE_GAP_IO_CAPS. */ + uint8_t oob : 1; /**< The OOB data flag. + - In LE legacy pairing, this flag is set if a device has out of band authentication data. + The OOB method is used if both of the devices have out of band authentication data. + - In LE Secure Connections pairing, this flag is set if a device has the peer device's out of band authentication data. + The OOB method is used if at least one device has the peer device's OOB data available. */ + uint8_t min_key_size; /**< Minimum encryption key size in octets between 7 and 16. If 0 then not applicable in this instance. */ + uint8_t max_key_size; /**< Maximum encryption key size in octets between min_key_size and 16. */ + ble_gap_sec_kdist_t kdist_own; /**< Key distribution bitmap: keys that the local device will distribute. */ + ble_gap_sec_kdist_t kdist_peer; /**< Key distribution bitmap: keys that the remote device will distribute. */ +} ble_gap_sec_params_t; + + +/**@brief GAP Encryption Information. */ +typedef struct +{ + uint8_t ltk[BLE_GAP_SEC_KEY_LEN]; /**< Long Term Key. */ + uint8_t lesc : 1; /**< Key generated using LE Secure Connections. */ + uint8_t auth : 1; /**< Authenticated Key. */ + uint8_t ltk_len : 6; /**< LTK length in octets. */ +} ble_gap_enc_info_t; + + +/**@brief GAP Master Identification. */ +typedef struct +{ + uint16_t ediv; /**< Encrypted Diversifier. */ + uint8_t rand[BLE_GAP_SEC_RAND_LEN]; /**< Random Number. */ +} ble_gap_master_id_t; + + +/**@brief GAP Signing Information. */ +typedef struct +{ + uint8_t csrk[BLE_GAP_SEC_KEY_LEN]; /**< Connection Signature Resolving Key. */ +} ble_gap_sign_info_t; + + +/**@brief GAP LE Secure Connections P-256 Public Key. */ +typedef struct +{ + uint8_t pk[BLE_GAP_LESC_P256_PK_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key. Stored in the standard SMP protocol format: {X,Y} both in little-endian. */ +} ble_gap_lesc_p256_pk_t; + + +/**@brief GAP LE Secure Connections DHKey. */ +typedef struct +{ + uint8_t key[BLE_GAP_LESC_DHKEY_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman Key. Stored in little-endian. */ +} ble_gap_lesc_dhkey_t; + + +/**@brief GAP LE Secure Connections OOB data. */ +typedef struct +{ + ble_gap_addr_t addr; /**< Bluetooth address of the device. */ + uint8_t r[BLE_GAP_SEC_KEY_LEN]; /**< Random Number. */ + uint8_t c[BLE_GAP_SEC_KEY_LEN]; /**< Confirm Value. */ +} ble_gap_lesc_oob_data_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_CONNECTED. */ +typedef struct +{ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 + and the address is the device's identity address. */ + uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ + ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ +} ble_gap_evt_connected_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_DISCONNECTED. */ +typedef struct +{ + uint8_t reason; /**< HCI error code, see @ref BLE_HCI_STATUS_CODES. */ +} ble_gap_evt_disconnected_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE. */ +typedef struct +{ + ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ +} ble_gap_evt_conn_param_update_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ +typedef struct +{ + ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ +} ble_gap_evt_phy_update_request_t; + +/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ +typedef struct +{ + uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ + uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ + uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ +} ble_gap_evt_phy_update_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. */ +typedef struct +{ + ble_gap_sec_params_t peer_params; /**< Initiator Security Parameters. */ +} ble_gap_evt_sec_params_request_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_SEC_INFO_REQUEST. */ +typedef struct +{ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. */ + ble_gap_master_id_t master_id; /**< Master Identification for LTK lookup. */ + uint8_t enc_info : 1; /**< If 1, Encryption Information required. */ + uint8_t id_info : 1; /**< If 1, Identity Information required. */ + uint8_t sign_info : 1; /**< If 1, Signing Information required. */ +} ble_gap_evt_sec_info_request_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_PASSKEY_DISPLAY. */ +typedef struct +{ + uint8_t passkey[BLE_GAP_PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */ + uint8_t match_request : 1; /**< If 1 requires the application to report the match using @ref sd_ble_gap_auth_key_reply + with either @ref BLE_GAP_AUTH_KEY_TYPE_NONE if there is no match or + @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY if there is a match. */ +} ble_gap_evt_passkey_display_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_KEY_PRESSED. */ +typedef struct +{ + uint8_t kp_not; /**< Keypress notification type, see @ref BLE_GAP_KP_NOT_TYPES. */ +} ble_gap_evt_key_pressed_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_KEY_REQUEST. */ +typedef struct +{ + uint8_t key_type; /**< See @ref BLE_GAP_AUTH_KEY_TYPES. */ +} ble_gap_evt_auth_key_request_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST. */ +typedef struct +{ + ble_gap_lesc_p256_pk_t *p_pk_peer; /**< LE Secure Connections remote P-256 Public Key. This will point to the application-supplied memory + inside the keyset during the call to @ref sd_ble_gap_sec_params_reply. */ + uint8_t oobd_req :1; /**< LESC OOB data required. A call to @ref sd_ble_gap_lesc_oob_data_set is required to complete the procedure. */ +} ble_gap_evt_lesc_dhkey_request_t; + + +/**@brief Security levels supported. + * @note See Bluetooth Specification Version 4.2 Volume 3, Part C, Chapter 10, Section 10.2.1. +*/ +typedef struct +{ + uint8_t lv1 : 1; /**< If 1: Level 1 is supported. */ + uint8_t lv2 : 1; /**< If 1: Level 2 is supported. */ + uint8_t lv3 : 1; /**< If 1: Level 3 is supported. */ + uint8_t lv4 : 1; /**< If 1: Level 4 is supported. */ +} ble_gap_sec_levels_t; + + +/**@brief Encryption Key. */ +typedef struct +{ + ble_gap_enc_info_t enc_info; /**< Encryption Information. */ + ble_gap_master_id_t master_id; /**< Master Identification. */ +} ble_gap_enc_key_t; + + +/**@brief Identity Key. */ +typedef struct +{ + ble_gap_irk_t id_info; /**< Identity Resolving Key. */ + ble_gap_addr_t id_addr_info; /**< Identity Address. */ +} ble_gap_id_key_t; + + +/**@brief Security Keys. */ +typedef struct +{ + ble_gap_enc_key_t *p_enc_key; /**< Encryption Key, or NULL. */ + ble_gap_id_key_t *p_id_key; /**< Identity Key, or NULL. */ + ble_gap_sign_info_t *p_sign_key; /**< Signing Key, or NULL. */ + ble_gap_lesc_p256_pk_t *p_pk; /**< LE Secure Connections P-256 Public Key. When in debug mode the application must use the value defined + in the Core Bluetooth Specification v4.2 Vol.3, Part H, Section 2.3.5.6.1 */ +} ble_gap_sec_keys_t; + + +/**@brief Security key set for both local and peer keys. */ +typedef struct +{ + ble_gap_sec_keys_t keys_own; /**< Keys distributed by the local device. For LE Secure Connections the encryption key will be generated locally and will always be stored if bonding. */ + ble_gap_sec_keys_t keys_peer; /**< Keys distributed by the remote device. For LE Secure Connections, p_enc_key must always be NULL. */ +} ble_gap_sec_keyset_t; + + +/**@brief Data Length Update Procedure parameters. */ +typedef struct +{ + uint16_t max_tx_octets; /**< Maximum number of payload octets that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ + uint16_t max_rx_octets; /**< Maximum number of payload octets that a Controller supports for reception of a single Link Layer Data Channel PDU. */ + uint16_t max_tx_time_us; /**< Maximum time, in microseconds, that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ + uint16_t max_rx_time_us; /**< Maximum time, in microseconds, that a Controller supports for reception of a single Link Layer Data Channel PDU. */ +} ble_gap_data_length_params_t; + + +/**@brief Data Length Update Procedure local limitation. */ +typedef struct +{ + uint16_t tx_payload_limited_octets; /**< If > 0, the requested TX packet length is too long by this many octets. */ + uint16_t rx_payload_limited_octets; /**< If > 0, the requested RX packet length is too long by this many octets. */ + uint16_t tx_rx_time_limited_us; /**< If > 0, the requested combination of TX and RX packet lengths is too long by this many microseconds. */ +} ble_gap_data_length_limitation_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_STATUS. */ +typedef struct +{ + uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ + uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ + uint8_t bonded : 1; /**< Procedure resulted in a bond. */ + uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ + ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ + ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ + ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ + ble_gap_sec_kdist_t kdist_peer; /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */ +} ble_gap_evt_auth_status_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_CONN_SEC_UPDATE. */ +typedef struct +{ + ble_gap_conn_sec_t conn_sec; /**< Connection security level. */ +} ble_gap_evt_conn_sec_update_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_TIMEOUT. */ +typedef struct +{ + uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ + union + { + ble_data_t adv_report_buffer; /**< If source is set to @ref BLE_GAP_TIMEOUT_SRC_SCAN, the released + scan buffer is contained in this field. */ + } params; /**< Event Parameters. */ +} ble_gap_evt_timeout_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ +typedef struct +{ + int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ +} ble_gap_evt_rssi_changed_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ +typedef struct +{ + uint8_t reason; /**< Reason for why the advertising set terminated. See + @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ + uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, + this field indicates the number of completed advertising events. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. */ +} ble_gap_evt_adv_set_terminated_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. + * + * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * not all fields in the advertising report may be available. + * + * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start. + */ +typedef struct +{ + ble_gap_adv_report_type_t type; /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr is resolved: + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the + peer's identity address. */ + ble_gap_addr_t direct_addr; /**< Contains the target address of the advertising event if + @ref ble_gap_adv_report_type_t::directed is set to 1. If the + SoftDevice was able to resolve the address, + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr + contains the local identity address. If the target address of the + advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE, + and the SoftDevice was unable to resolve it, the application may try + to resolve this address to find out if the advertising event was + directed to us. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising packet was received. + See @ref BLE_GAP_PHYS. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising packet was received. + See @ref BLE_GAP_PHYS. This field is set to @ref BLE_GAP_PHY_NOT_SET if no packets + were received on a secondary advertising channel. */ + int8_t tx_power; /**< TX Power reported by the advertiser in the last packet header received. + This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the + last received packet did not contain the Tx Power field. + @note TX Power is only included in extended advertising packets. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm of the last packet received. */ + uint8_t ch_index; /**< Channel Index on which the last advertising packet is received (0-39). */ + uint8_t set_id; /**< Set ID of the received advertising data. Set ID is not present + if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + uint16_t data_id:12; /**< The advertising data ID of the received advertising data. Data ID + is not present if @ref ble_gap_evt_adv_report_t::set_id is set to + @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + ble_data_t data; /**< Received advertising or scan response data. If + @ref ble_gap_adv_report_type_t::status is not set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided + in @ref sd_ble_gap_scan_start is now released. */ + ble_gap_aux_pointer_t aux_pointer; /**< The offset and PHY of the next advertising packet in this extended advertising + event. @note This field is only set if @ref ble_gap_adv_report_type_t::status + is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */ +} ble_gap_evt_adv_report_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_SEC_REQUEST. */ +typedef struct +{ + uint8_t bond : 1; /**< Perform bonding. */ + uint8_t mitm : 1; /**< Man In The Middle protection requested. */ + uint8_t lesc : 1; /**< LE Secure Connections requested. */ + uint8_t keypress : 1; /**< Generation of keypress notifications requested. */ +} ble_gap_evt_sec_request_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST. */ +typedef struct +{ + ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ +} ble_gap_evt_conn_param_update_request_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ +typedef struct +{ + uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 + and the address is the device's identity address. */ +} ble_gap_evt_scan_req_report_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ +typedef struct +{ + ble_gap_data_length_params_t peer_params; /**< Peer data length parameters. */ +} ble_gap_evt_data_length_update_request_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE. */ +typedef struct +{ + ble_gap_data_length_params_t effective_params; /**< The effective data length parameters. */ +} ble_gap_evt_data_length_update_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT. */ +typedef struct +{ + int8_t channel_energy[BLE_GAP_CHANNEL_COUNT]; /**< The measured energy on the Bluetooth Low Energy + channels, in dBm, indexed by Channel Index. + If no measurement is available for the given channel, channel_energy is set to + @ref BLE_GAP_POWER_LEVEL_INVALID. */ +} ble_gap_evt_qos_channel_survey_report_t; + +/**@brief GAP event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which event occurred. */ + union /**< union alternative identified by evt_id in enclosing struct. */ + { + ble_gap_evt_connected_t connected; /**< Connected Event Parameters. */ + ble_gap_evt_disconnected_t disconnected; /**< Disconnected Event Parameters. */ + ble_gap_evt_conn_param_update_t conn_param_update; /**< Connection Parameter Update Parameters. */ + ble_gap_evt_sec_params_request_t sec_params_request; /**< Security Parameters Request Event Parameters. */ + ble_gap_evt_sec_info_request_t sec_info_request; /**< Security Information Request Event Parameters. */ + ble_gap_evt_passkey_display_t passkey_display; /**< Passkey Display Event Parameters. */ + ble_gap_evt_key_pressed_t key_pressed; /**< Key Pressed Event Parameters. */ + ble_gap_evt_auth_key_request_t auth_key_request; /**< Authentication Key Request Event Parameters. */ + ble_gap_evt_lesc_dhkey_request_t lesc_dhkey_request; /**< LE Secure Connections DHKey calculation request. */ + ble_gap_evt_auth_status_t auth_status; /**< Authentication Status Event Parameters. */ + ble_gap_evt_conn_sec_update_t conn_sec_update; /**< Connection Security Update Event Parameters. */ + ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ + ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ + ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ + ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ + ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ + ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ + ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ + ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ + ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ + ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ + ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ + ble_gap_evt_qos_channel_survey_report_t qos_channel_survey_report; /**< Quality of Service (QoS) Channel Survey Report Parameters. */ + } params; /**< Event Parameters. */ +} ble_gap_evt_t; + + +/** + * @brief BLE GAP connection configuration parameters, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_CONN_COUNT The connection count for the connection configurations is zero. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - The sum of conn_count for all connection configurations combined exceeds UINT8_MAX. + * - The event length is smaller than @ref BLE_GAP_EVENT_LENGTH_MIN. + */ +typedef struct +{ + uint8_t conn_count; /**< The number of concurrent connections the application can create with this configuration. + The default and minimum value is @ref BLE_GAP_CONN_COUNT_DEFAULT. */ + uint16_t event_length; /**< The time set aside for this connection on every connection interval in 1.25 ms units. + The default value is @ref BLE_GAP_EVENT_LENGTH_DEFAULT, the minimum value is @ref BLE_GAP_EVENT_LENGTH_MIN. + The event length and the connection interval are the primary parameters + for setting the throughput of a connection. + See the SoftDevice Specification for details on throughput. */ +} ble_gap_conn_cfg_t; + + +/** + * @brief Configuration of maximum concurrent connections in the different connected roles, set with + * @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_CONN_COUNT The sum of periph_role_count and central_role_count is too + * large. The maximum supported sum of concurrent connections is + * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. + * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. + * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum + * supported advertising handles is + * @ref BLE_GAP_ADV_SET_COUNT_MAX. + */ +typedef struct +{ + uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ + uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ + uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ + uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ + uint8_t qos_channel_survey_role_available:1; /**< If set, the Quality of Service (QoS) channel survey module is available to the + application using @ref sd_ble_gap_qos_channel_survey_start. */ +} ble_gap_cfg_role_count_t; + + +/** + * @brief Device name and its properties, set with @ref sd_ble_cfg_set. + * + * @note If the device name is not configured, the default device name will be + * @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be + * @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name + * will have no write access. + * + * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, + * the attribute table size must be increased to have room for the longer device name (see + * @ref sd_ble_cfg_set and @ref ble_gatts_cfg_attr_tab_size_t). + * + * @note If vloc is @ref BLE_GATTS_VLOC_STACK : + * - p_value must point to non-volatile memory (flash) or be NULL. + * - If p_value is NULL, the device name will initially be empty. + * + * @note If vloc is @ref BLE_GATTS_VLOC_USER : + * - p_value cannot be NULL. + * - If the device name is writable, p_value must point to volatile memory (RAM). + * + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Invalid device name location (vloc). + * - Invalid device name security mode. + * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: + * - The device name length is invalid (must be between 0 and @ref BLE_GAP_DEVNAME_MAX_LEN). + * - The device name length is too long for the given Attribute Table. + * @retval ::NRF_ERROR_NOT_SUPPORTED Device name security mode is not supported. + */ +typedef struct +{ + ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ + uint8_t vloc:2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ + uint8_t *p_value; /**< Pointer to where the value (device name) is stored or will be stored. */ + uint16_t current_len; /**< Current length in bytes of the memory pointed to by p_value.*/ + uint16_t max_len; /**< Maximum length in bytes of the memory pointed to by p_value.*/ +} ble_gap_cfg_device_name_t; + + +/**@brief Configuration structure for GAP configurations. */ +typedef union +{ + ble_gap_cfg_role_count_t role_count_cfg; /**< Role count configuration, cfg_id is @ref BLE_GAP_CFG_ROLE_COUNT. */ + ble_gap_cfg_device_name_t device_name_cfg; /**< Device name configuration, cfg_id is @ref BLE_GAP_CFG_DEVICE_NAME. */ +} ble_gap_cfg_t; + + +/**@brief Channel Map option. + * + * @details Used with @ref sd_ble_opt_get to get the current channel map + * or @ref sd_ble_opt_set to set a new channel map. When setting the + * channel map, it applies to all current and future connections. When getting the + * current channel map, it applies to a single connection and the connection handle + * must be supplied. + * + * @note Setting the channel map may take some time, depending on connection parameters. + * The time taken may be different for each connection and the get operation will + * return the previous channel map until the new one has taken effect. + * + * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. + * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. + * + * @retval ::NRF_SUCCESS Get or set successful. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Less then two bits in @ref ch_map are set. + * - Bits for primary advertising channels (37-39) are set. + * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. + * + */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle (only applicable for get) */ + uint8_t ch_map[5]; /**< Channel Map (37-bit). */ +} ble_gap_opt_ch_map_t; + + +/**@brief Local connection latency option. + * + * @details Local connection latency is a feature which enables the slave to improve + * current consumption by ignoring the slave latency set by the peer. The + * local connection latency can only be set to a multiple of the slave latency, + * and cannot be longer than half of the supervision timeout. + * + * @details Used with @ref sd_ble_opt_set to set the local connection latency. The + * @ref sd_ble_opt_get is not supported for this option, but the actual + * local connection latency (unless set to NULL) is set as a return parameter + * when setting the option. + * + * @note The latency set will be truncated down to the closest slave latency event + * multiple, or the nearest multiple before half of the supervision timeout. + * + * @note The local connection latency is disabled by default, and needs to be enabled for new + * connections and whenever the connection is updated. + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. + */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle */ + uint16_t requested_latency; /**< Requested local connection latency. */ + uint16_t * p_actual_latency; /**< Pointer to storage for the actual local connection latency (can be set to NULL to skip return value). */ +} ble_gap_opt_local_conn_latency_t; + +/**@brief Disable slave latency + * + * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection + * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the + * peripheral will ignore the slave_latency set by the central. + * + * @note Shall only be called on peripheral links. + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. + */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle */ + uint8_t disable : 1; /**< Set to 1 to disable slave latency. Set to 0 enable it again.*/ +} ble_gap_opt_slave_latency_disable_t; + +/**@brief Passkey Option. + * + * @details Structure containing the passkey to be used during pairing. This can be used with @ref + * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication + * instead of generating a random one. + * + * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. + * + * @note @ref sd_ble_opt_get is not supported for this option. + * + */ +typedef struct +{ + uint8_t const * p_passkey; /**< Pointer to 6-digit ASCII string (digit 0..9 only, no NULL termination) passkey to be used during pairing. If this is NULL, the SoftDevice will generate a random passkey if required.*/ +} ble_gap_opt_passkey_t; + + +/**@brief Compatibility mode 1 option. + * + * @details This can be used with @ref sd_ble_opt_set to enable and disable + * compatibility mode 1. Compatibility mode 1 is disabled by default. + * + * @note Compatibility mode 1 enables interoperability with devices that do not support a value of + * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a + * limited set of legacy peripheral devices from another vendor. Enabling this compatibility + * mode will only have an effect if the local device will act as a central device and + * initiate a connection to a peripheral device. In that case it may lead to the connection + * creation taking up to one connection interval longer to complete for all connections. + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. + */ +typedef struct +{ + uint8_t enable : 1; /**< Enable compatibility mode 1.*/ +} ble_gap_opt_compat_mode_1_t; + + +/**@brief Authenticated payload timeout option. + * + * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other + * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. + * + * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated + * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted + * link. + * + * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance + * to reset the timer. In addition the stack will try to prioritize running of LE ping over other + * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects + * on other activities, it is recommended to use high timeout values. + * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. + */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle */ + uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ +} ble_gap_opt_auth_payload_timeout_t; + +/**@brief Option structure for GAP options. */ +typedef union +{ + ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ + ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ + ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ + ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ + ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ + ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ +} ble_gap_opt_t; +/**@} */ + + +/**@addtogroup BLE_GAP_FUNCTIONS Functions + * @{ */ + +/**@brief Set the local Bluetooth identity address. + * + * The local Bluetooth identity address is the address that identifies this device to other peers. + * The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. + * + * @note The identity address cannot be changed while advertising, scanning or creating a connection. + * + * @note This address will be distributed to the peer during bonding. + * If the address changes, the address stored in the peer device will not be valid and the ability to + * reconnect using the old address will be lost. + * + * @note By default the SoftDevice will set an address of type @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC upon being + * enabled. The address is a random number populated during the IC manufacturing process and remains unchanged + * for the lifetime of each IC. + * + * @mscs + * @mmsc{@ref BLE_GAP_ADV_MSC} + * @endmscs + * + * @param[in] p_addr Pointer to address structure. + * + * @retval ::NRF_SUCCESS Address successfully set. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising, + * scanning or creating a connection. + */ +SVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)); + + +/**@brief Get local Bluetooth identity address. + * + * @note This will always return the identity address irrespective of the privacy settings, + * i.e. the address type will always be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. + * + * @param[out] p_addr Pointer to address structure to be filled in. + * + * @retval ::NRF_SUCCESS Address successfully retrieved. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. + */ +SVCALL(SD_BLE_GAP_ADDR_GET, uint32_t, sd_ble_gap_addr_get(ble_gap_addr_t *p_addr)); + + +/**@brief Get the Bluetooth device address used by the advertiser. + * + * @note This function will return the local Bluetooth address used in advertising PDUs. When + * using privacy, the SoftDevice will generate a new private address every + * @ref ble_gap_privacy_params_t::private_addr_cycle_s configured using + * @ref sd_ble_gap_privacy_set. Hence depending on when the application calls this API, the + * address returned may not be the latest address that is used in the advertising PDUs. + * + * @param[in] adv_handle The advertising handle to get the address from. + * @param[out] p_addr Pointer to address structure to be filled in. + * + * @retval ::NRF_SUCCESS Address successfully retrieved. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. + * @retval ::NRF_ERROR_INVALID_STATE The advertising set is currently not advertising. + */ +SVCALL(SD_BLE_GAP_ADV_ADDR_GET, uint32_t, sd_ble_gap_adv_addr_get(uint8_t adv_handle, ble_gap_addr_t *p_addr)); + + +/**@brief Set the active whitelist in the SoftDevice. + * + * @note Only one whitelist can be used at a time and the whitelist is shared between the BLE roles. + * The whitelist cannot be set if a BLE role is using the whitelist. + * + * @note If an address is resolved using the information in the device identity list, then the whitelist + * filter policy applies to the peer identity address and not the resolvable address sent on air. + * + * @mscs + * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} + * @endmscs + * + * @param[in] pp_wl_addrs Pointer to a whitelist of peer addresses, if NULL the whitelist will be cleared. + * @param[in] len Length of the whitelist, maximum @ref BLE_GAP_WHITELIST_ADDR_MAX_COUNT. + * + * @retval ::NRF_SUCCESS The whitelist is successfully set/cleared. + * @retval ::NRF_ERROR_INVALID_ADDR The whitelist (or one of its entries) provided is invalid. + * @retval ::BLE_ERROR_GAP_WHITELIST_IN_USE The whitelist is in use by a BLE role and cannot be set or cleared. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. + * @retval ::NRF_ERROR_DATA_SIZE The given whitelist size is invalid (zero or too large); this can only return when + * pp_wl_addrs is not NULL. + */ +SVCALL(SD_BLE_GAP_WHITELIST_SET, uint32_t, sd_ble_gap_whitelist_set(ble_gap_addr_t const * const * pp_wl_addrs, uint8_t len)); + + +/**@brief Set device identity list. + * + * @note Only one device identity list can be used at a time and the list is shared between the BLE roles. + * The device identity list cannot be set if a BLE role is using the list. + * + * @param[in] pp_id_keys Pointer to an array of peer identity addresses and peer IRKs, if NULL the device identity list will be cleared. + * @param[in] pp_local_irks Pointer to an array of local IRKs. Each entry in the array maps to the entry in pp_id_keys at the same index. + * To fill in the list with the currently set device IRK for all peers, set to NULL. + * @param[in] len Length of the device identity list, maximum @ref BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT. + * + * @mscs + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS The device identity list successfully set/cleared. + * @retval ::NRF_ERROR_INVALID_ADDR The device identity list (or one of its entries) provided is invalid. + * This code may be returned if the local IRK list also has an invalid entry. + * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE The device identity list is in use and cannot be set or cleared. + * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE The device identity list contains multiple entries with the same identity address. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. + * @retval ::NRF_ERROR_DATA_SIZE The given device identity list size invalid (zero or too large); this can + * only return when pp_id_keys is not NULL. + */ +SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_set(ble_gap_id_key_t const * const * pp_id_keys, ble_gap_irk_t const * const * pp_local_irks, uint8_t len)); + + +/**@brief Set privacy settings. + * + * @note Privacy settings cannot be changed while advertising, scanning or creating a connection. + * + * @param[in] p_privacy_params Privacy settings. + * + * @mscs + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. + * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid. + * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. + * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided. + * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising, scanning + * or creating a connection. + */ +SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)); + + +/**@brief Get privacy settings. + * + * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. + * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. + * + * @param[in,out] p_privacy_params Privacy settings. + * + * @retval ::NRF_SUCCESS Privacy settings read. + * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. + * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. + */ +SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); + + +/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. + * + * @note The format of the advertising data will be checked by this call to ensure interoperability. + * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and + * duplicating the local name in the advertising data and scan response data. + * + * @note In order to update advertising data while advertising, new advertising buffers must be provided. + * + * @mscs + * @mmsc{@ref BLE_GAP_ADV_MSC} + * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} + * @endmscs + * + * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure + * a new advertising set. On success, a new handle is then returned through the pointer. + * Provide a pointer to an existing advertising handle to configure an existing advertising set. + * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. + * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, + * this parameter must be NULL. See @ref ble_gap_adv_params_t. + * + * @retval ::NRF_SUCCESS Advertising set successfully configured. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, + * see @ref sd_ble_gap_whitelist_set. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - It is invalid to provide non-NULL advertising set parameters while advertising. + * - It is invalid to provide the same data buffers while advertising. To update + * advertising data, provide new advertising buffers. + * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to + * configure a new advertising handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification + * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an + * existing advertising handle instead. + * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. + */ +SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); + + +/**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). + * + * @note Only one advertiser may be active at any time. + * + * @events + * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} + * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} + * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_ADV_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} + * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} + * @endmscs + * + * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable + * advertising, this is ignored. + * + * @retval ::NRF_SUCCESS The BLE stack has started advertising. + * @retval ::NRF_ERROR_INVALID_STATE adv_handle is not configured or already advertising. + * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. + * @retval ::NRF_ERROR_RESOURCES Either: + * - adv_handle is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * - Not enough BLE role slots available. + Stop one or more currently active roles (Central, Peripheral, Broadcaster or Observer) and try again. + * - p_adv_params is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. + */ +SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); + + +/**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). + * + * @mscs + * @mmsc{@ref BLE_GAP_ADV_MSC} + * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} + * @endmscs + * + * @param[in] adv_handle The advertising handle that should stop advertising. + * + * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. + * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. + */ +SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); + + + +/**@brief Update connection parameters. + * + * @details In the central role this will initiate a Link Layer connection parameter update procedure, + * otherwise in the peripheral role, this will send the corresponding L2CAP request and wait for + * the central to perform the procedure. In both cases, and regardless of success or failure, the application + * will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event. + * + * @details This function can be used as a central both to reply to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST or to start the procedure unrequested. + * + * @events + * @event{@ref BLE_GAP_EVT_CONN_PARAM_UPDATE, Result of the connection parameter update procedure.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_CPU_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} + * @mmsc{@ref BLE_GAP_MULTILINK_CPU_MSC} + * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_CPU_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_conn_params Pointer to desired connection parameters. If NULL is provided on a peripheral role, + * the parameters in the PPCP characteristic of the GAP service will be used instead. + * If NULL is provided on a central role and in response to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request will be rejected + * + * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. + * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established. + * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + */ +SVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)); + + +/**@brief Disconnect (GAP Link Termination). + * + * @details This call initiates the disconnection procedure, and its completion will be communicated to the application + * with a @ref BLE_GAP_EVT_DISCONNECTED event. + * + * @events + * @event{@ref BLE_GAP_EVT_DISCONNECTED, Generated when disconnection procedure is complete.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_CONN_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] hci_status_code HCI status code, see @ref BLE_HCI_STATUS_CODES (accepted values are @ref BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION and @ref BLE_HCI_CONN_INTERVAL_UNACCEPTABLE). + * + * @retval ::NRF_SUCCESS The disconnection procedure has been started successfully. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established. + */ +SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code)); + + +/**@brief Set the radio's transmit power. + * + * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for + * possible roles. + * @param[in] handle The handle parameter is interpreted depending on role: + * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. + * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, + * will use the specified transmit power, and include it in the advertising packet headers if + * @ref ble_gap_adv_properties_t::include_tx_power set. + * - For all other roles handle is ignored. + * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). + * + * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm. + * @note The initiator will have the same transmit power as the scanner. + * @note When a connection is created it will inherit the transmit power from the initiator or + * advertiser leading to the connection. + * + * @retval ::NRF_SUCCESS Successfully changed the transmit power. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); + + +/**@brief Set GAP Appearance value. + * + * @param[in] appearance Appearance (16-bit), see @ref BLE_APPEARANCES. + * + * @retval ::NRF_SUCCESS Appearance value set successfully. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + */ +SVCALL(SD_BLE_GAP_APPEARANCE_SET, uint32_t, sd_ble_gap_appearance_set(uint16_t appearance)); + + +/**@brief Get GAP Appearance value. + * + * @param[out] p_appearance Pointer to appearance (16-bit) to be filled in, see @ref BLE_APPEARANCES. + * + * @retval ::NRF_SUCCESS Appearance value retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + */ +SVCALL(SD_BLE_GAP_APPEARANCE_GET, uint32_t, sd_ble_gap_appearance_get(uint16_t *p_appearance)); + + +/**@brief Set GAP Peripheral Preferred Connection Parameters. + * + * @param[in] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure with the desired parameters. + * + * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters set successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + */ +SVCALL(SD_BLE_GAP_PPCP_SET, uint32_t, sd_ble_gap_ppcp_set(ble_gap_conn_params_t const *p_conn_params)); + + +/**@brief Get GAP Peripheral Preferred Connection Parameters. + * + * @param[out] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure where the parameters will be stored. + * + * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + */ +SVCALL(SD_BLE_GAP_PPCP_GET, uint32_t, sd_ble_gap_ppcp_get(ble_gap_conn_params_t *p_conn_params)); + + +/**@brief Set GAP device name. + * + * @note If the device name is located in application flash memory (see @ref ble_gap_cfg_device_name_t), + * it cannot be changed. Then @ref NRF_ERROR_FORBIDDEN will be returned. + * + * @param[in] p_write_perm Write permissions for the Device Name characteristic, see @ref ble_gap_conn_sec_mode_t. + * @param[in] p_dev_name Pointer to a UTF-8 encoded, non NULL-terminated string. + * @param[in] len Length of the UTF-8, non NULL-terminated string pointed to by p_dev_name in octets (must be smaller or equal than @ref BLE_GAP_DEVNAME_MAX_LEN). + * + * @retval ::NRF_SUCCESS GAP device name and permissions set successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + * @retval ::NRF_ERROR_FORBIDDEN Device name is not writable. + */ +SVCALL(SD_BLE_GAP_DEVICE_NAME_SET, uint32_t, sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const *p_write_perm, uint8_t const *p_dev_name, uint16_t len)); + + +/**@brief Get GAP device name. + * + * @note If the device name is longer than the size of the supplied buffer, + * p_len will return the complete device name length, + * and not the number of bytes actually returned in p_dev_name. + * The application may use this information to allocate a suitable buffer size. + * + * @param[out] p_dev_name Pointer to an empty buffer where the UTF-8 non NULL-terminated string will be placed. Set to NULL to obtain the complete device name length. + * @param[in,out] p_len Length of the buffer pointed by p_dev_name, complete device name length on output. + * + * @retval ::NRF_SUCCESS GAP device name retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + */ +SVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t *p_dev_name, uint16_t *p_len)); + + +/**@brief Initiate the GAP Authentication procedure. + * + * @details In the central role, this function will send an SMP Pairing Request (or an SMP Pairing Failed if rejected), + * otherwise in the peripheral role, an SMP Security Request will be sent. + * + * @events + * @event{Depending on the security parameters set and the packet exchanges with the peer\, the following events may be generated:} + * @event{@ref BLE_GAP_EVT_SEC_PARAMS_REQUEST} + * @event{@ref BLE_GAP_EVT_SEC_INFO_REQUEST} + * @event{@ref BLE_GAP_EVT_PASSKEY_DISPLAY} + * @event{@ref BLE_GAP_EVT_KEY_PRESSED} + * @event{@ref BLE_GAP_EVT_AUTH_KEY_REQUEST} + * @event{@ref BLE_GAP_EVT_LESC_DHKEY_REQUEST} + * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE} + * @event{@ref BLE_GAP_EVT_AUTH_STATUS} + * @event{@ref BLE_GAP_EVT_TIMEOUT} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_SEC_REQ_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure. + * In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used. + * In the central role, this pointer may be NULL to reject a Security Request. + * + * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - No link has been established. + * - An encryption is already executing or queued. + * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. + * @retval ::NRF_ERROR_TIMEOUT A SMP timeout has occurred, and further SMP operations on this link is prohibited. + */ +SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)); + + +/**@brief Reply with GAP security parameters. + * + * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. + * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. + * + * @events + * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_JW_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS. + * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. In the central role this must be set to NULL, as the parameters have + * already been provided during a previous call to @ref sd_ble_gap_authenticate. + * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure + * will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application + * upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event. + * Note that the SoftDevice expects the application to provide memory for storing the + * peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key + * can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the + * @ref BLE_GAP_EVT_AUTH_STATUS event. + * + * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Security parameters has not been requested. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. + */ +SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)); + + +/**@brief Reply with an authentication key. + * + * @details This function is only used to reply to a @ref BLE_GAP_EVT_AUTH_KEY_REQUEST or a @ref BLE_GAP_EVT_PASSKEY_DISPLAY, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. + * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. + * + * @events + * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] key_type See @ref BLE_GAP_AUTH_KEY_TYPES. + * @param[in] p_key If key type is @ref BLE_GAP_AUTH_KEY_TYPE_NONE, then NULL. + * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY, then a 6-byte ASCII string (digit 0..9 only, no NULL termination) + * or NULL when confirming LE Secure Connections Numeric Comparison. + * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_OOB, then a 16-byte OOB key value in little-endian format. + * + * @retval ::NRF_SUCCESS Authentication key successfully set. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Authentication key has not been requested. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); + + +/**@brief Reply with an LE Secure connections DHKey. + * + * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. + * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. + * + * @events + * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_dhkey LE Secure Connections DHKey. + * + * @retval ::NRF_SUCCESS DHKey successfully set. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - The peer is not authenticated. + * - The application has not pulled a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); + + +/**@brief Notify the peer of a local keypress. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] kp_not See @ref BLE_GAP_KP_NOT_TYPES. + * + * @retval ::NRF_SUCCESS Keypress notification successfully queued for transmission. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Authentication key not requested. + * - Passkey has not been entered. + * - Keypresses have not been enabled by both peers. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy. Retry at later time. + */ +SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); + + +/**@brief Generate a set of OOB data to send to a peer out of band. + * + * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, + * the one used during connection setup). The application may manually overwrite it with an updated value. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. + * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. + * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. + * + * @retval ::NRF_SUCCESS OOB data successfully generated. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint16_t conn_handle, ble_gap_lesc_p256_pk_t const *p_pk_own, ble_gap_lesc_oob_data_t *p_oobd_own)); + +/**@brief Provide the OOB data sent/received out of band. + * + * @note An authentication procedure with OOB selected as an algorithm must be in progress when calling this function. + * @note A @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event with the oobd_req set to 1 must have been received prior to calling this function. + * + * @events + * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_oobd_own The OOB data sent out of band to a peer or NULL if the peer has not received OOB data. + * Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. + * @param[in] p_oobd_peer The OOB data received out of band from a peer or NULL if none received. + * Must correspond to @ref ble_gap_sec_params_t::oob flag + * in @ref sd_ble_gap_authenticate in the central role or + * in @ref sd_ble_gap_sec_params_reply in the peripheral role. + * + * @retval ::NRF_SUCCESS OOB data accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Authentication key not requested + * - Not expecting LESC OOB data + * - Have not actually exchanged passkeys. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); + + +/**@brief Initiate GAP Encryption procedure. + * + * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. + * + * @events + * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE, The connection security has been updated.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_ENC_MSC} + * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_master_id Pointer to a @ref ble_gap_master_id_t master identification structure. + * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. + * + * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE No link has been established. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::BLE_ERROR_INVALID_ROLE Operation is not supported in the Peripheral role. + * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, wait for pending procedures to complete and retry. + */ +SVCALL(SD_BLE_GAP_ENCRYPT, uint32_t, sd_ble_gap_encrypt(uint16_t conn_handle, ble_gap_master_id_t const *p_master_id, ble_gap_enc_info_t const *p_enc_info)); + + +/**@brief Reply with GAP security information. + * + * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_INFO_REQUEST, calling it at other times will result in @ref NRF_ERROR_INVALID_STATE. + * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. + * @note Data signing is not yet supported, and p_sign_info must therefore be NULL. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_ENC_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. May be NULL to signal none is available. + * @param[in] p_id_info Pointer to a @ref ble_gap_irk_t identity information structure. May be NULL to signal none is available. + * @param[in] p_sign_info Pointer to a @ref ble_gap_sign_info_t signing information structure. May be NULL to signal none is available. + * + * @retval ::NRF_SUCCESS Successfully accepted security information. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - No link has been established. + * - No @ref BLE_GAP_EVT_SEC_REQUEST pending. + * - LE long term key requested command not allowed. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_SEC_INFO_REPLY, uint32_t, sd_ble_gap_sec_info_reply(uint16_t conn_handle, ble_gap_enc_info_t const *p_enc_info, ble_gap_irk_t const *p_id_info, ble_gap_sign_info_t const *p_sign_info)); + + +/**@brief Get the current connection security. + * + * @param[in] conn_handle Connection handle. + * @param[out] p_conn_sec Pointer to a @ref ble_gap_conn_sec_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Current connection security successfully retrieved. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_handle, ble_gap_conn_sec_t *p_conn_sec)); + + +/**@brief Start reporting the received signal strength to the application. + * + * A new event is reported whenever the RSSI value changes, until @ref sd_ble_gap_rssi_stop is called. + * + * @events + * @event{@ref BLE_GAP_EVT_RSSI_CHANGED, New RSSI data available. How often the event is generated is + * dependent on the settings of the threshold_dbm + * and skip_count input parameters.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} + * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] threshold_dbm Minimum change in dBm before triggering the @ref BLE_GAP_EVT_RSSI_CHANGED event. Events are disabled if threshold_dbm equals @ref BLE_GAP_RSSI_THRESHOLD_INVALID. + * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. + * + * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); + + +/**@brief Stop reporting the received signal strength. + * + * @note An RSSI change detected before the call but not yet received by the application + * may be reported after @ref sd_ble_gap_rssi_stop has been called. + * + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} + * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * + * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); + + +/**@brief Get the received signal strength for the last connection event. + * + * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND + * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. + * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. + * + * @retval ::NRF_SUCCESS Successfully read the RSSI. + * @retval ::NRF_ERROR_NOT_FOUND No sample is available. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. + */ +SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); + + +/**@brief Start or continue scanning (GAP Discovery procedure, Observer Procedure). + * + * @note A call to this function will require the application to keep the memory pointed by + * p_adv_report_buffer alive until the buffer is released. The buffer is released when the scanner is stopped + * or when this function is called with another buffer. + * + * @note The scanner will automatically stop in the following cases: + * - @ref sd_ble_gap_scan_stop is called. + * - @ref sd_ble_gap_connect is called. + * - A @ref BLE_GAP_EVT_TIMEOUT with source set to @ref BLE_GAP_TIMEOUT_SRC_SCAN is received. + * - When a @ref BLE_GAP_EVT_ADV_REPORT event is received and @ref ble_gap_adv_report_type_t::status is not set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. In this case scanning is only paused to let the application + * access received data. The application must call this function to continue scanning, or call @ref sd_ble_gap_scan_stop + * to stop scanning. + * + * @note If a @ref BLE_GAP_EVT_ADV_REPORT event is received with @ref ble_gap_adv_report_type_t::status set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the scanner will continue scanning, and the application will + * receive more reports from this advertising event. The following reports will include the old and new received data. + * + * @events + * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} + * @event{@ref BLE_GAP_EVT_TIMEOUT, Scanner has timed out.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_SCAN_MSC} + * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} + * @endmscs + * + * @param[in] p_scan_params Pointer to scan parameters structure. When this function is used to continue + * scanning, this parameter must be NULL. + * @param[in] p_adv_report_buffer Pointer to buffer used to store incoming advertising data. + * The memory pointed to should be kept alive until the scanning is stopped. + * See @ref BLE_GAP_SCAN_BUFFER_SIZE for minimum and maximum buffer size. + * If the scanner receives advertising data larger than can be stored in the buffer, + * a @ref BLE_GAP_EVT_ADV_REPORT will be raised with @ref ble_gap_adv_report_type_t::status + * set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED. + * + * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Scanning is already ongoing and p_scan_params was not NULL + * - Scanning is not running and p_scan_params was NULL. + * - The scanner has timed out when this function is called to continue scanning. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported parameters supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_INVALID_LENGTH The provided buffer length is invalid. See @ref BLE_GAP_SCAN_BUFFER_MIN. + * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. + * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. + */ +SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer)); + + +/**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). + * + * @note The buffer provided in @ref sd_ble_gap_scan_start is released. + * + * @mscs + * @mmsc{@ref BLE_GAP_SCAN_MSC} + * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. + * @retval ::NRF_ERROR_INVALID_STATE Not in the scanning state. + */ +SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); + + +/**@brief Create a connection (GAP Link Establishment). + * + * @note If a scanning procedure is currently in progress it will be automatically stopped when calling this function. + * The scanning procedure will be stopped even if the function returns an error. + * + * @events + * @event{@ref BLE_GAP_EVT_CONNECTED, A connection was established.} + * @event{@ref BLE_GAP_EVT_TIMEOUT, Failed to establish a connection.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} + * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} + * @endmscs + * + * @param[in] p_peer_addr Pointer to peer identity address. If @ref ble_gap_scan_params_t::filter_policy is set to use + * whitelist, then p_peer_addr is ignored. + * @param[in] p_scan_params Pointer to scan parameters structure. + * @param[in] p_conn_params Pointer to desired connection parameters. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. + * + * @retval ::NRF_SUCCESS Successfully initiated connection procedure. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * - Invalid parameter(s) in p_scan_params or p_conn_params. + * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. + * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. + * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an + * existing locally initiated connect procedure, which must complete before initiating again. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. + * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. + * @retval ::NRF_ERROR_RESOURCES Either: + * - Not enough BLE role slots available. + * Stop one or more currently active roles (Central, Peripheral or Observer) and try again. + * - The event_length parameter associated with conn_cfg_tag is too small to be able to + * establish a connection on the selected @ref ble_gap_scan_params_t::scan_phys. + * Use @ref sd_ble_cfg_set to increase the event length. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. + */ +SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); + + +/**@brief Cancel a connection establishment. + * + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Successfully canceled an ongoing connection procedure. + * @retval ::NRF_ERROR_INVALID_STATE No locally initiated connect procedure started or connection + * completed occurred. + */ +SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); + + +/**@brief Initiate or respond to a PHY Update Procedure + * + * @details This function is used to initiate or respond to a PHY Update Procedure. It will always + * generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. + * If this function is used to initiate a PHY Update procedure and the only option + * provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the + * currently active PHYs in the respective directions, the SoftDevice will generate a + * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the + * procedure in the Link Layer. + * + * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, + * then the stack will select PHYs based on the peer's PHY preferences and the local link + * configuration. The PHY Update procedure will for this case result in a PHY combination + * that respects the time constraints configured with @ref sd_ble_cfg_set and the current + * link layer data length. + * + * When acting as a central, the SoftDevice will select the fastest common PHY in each direction. + * + * If the peer does not support the PHY Update Procedure, then the resulting + * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to + * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. + * + * If the PHY procedure was rejected by the peer due to a procedure collision, the status + * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or + * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. + * If the peer responds to the PHY Update procedure with invalid parameters, the status + * will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. + * If the PHY procedure was rejected by the peer for a different reason, the status will + * contain the reason as specified by the peer. + * + * @events + * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} + * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} + * @endmscs + * + * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. + * @param[in] p_gap_phys Pointer to PHY structure. + * + * @retval ::NRF_SUCCESS Successfully requested a PHY Update. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. + * @retval ::NRF_ERROR_INVALID_STATE No link has been established. + * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. + * + */ +SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); + + +/**@brief Initiate or respond to a Data Length Update Procedure. + * + * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of + * p_dl_params, the SoftDevice will choose the highest value supported in current + * configuration and connection parameters. + * + * @param[in] conn_handle Connection handle. + * @param[in] p_dl_params Pointer to local parameters to be used in Data Length Update + * Procedure. Set any member to @ref BLE_GAP_DATA_LENGTH_AUTO to let + * the SoftDevice automatically decide the value for that member. + * Set to NULL to use automatic values for all members. + * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not + * have enough resources or does not support the requested Data Length + * Update parameters. Ignored if NULL. + * + * @mscs + * @mmsc{@ref BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Successfully set Data Length Extension initiation/response parameters. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. + * @retval ::NRF_ERROR_INVALID_STATE No link has been established. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect + * p_dl_limitation to see which parameter is not supported. + * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters. + * Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length. + * Inspect p_dl_limitation to see where the limitation is. + * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the + * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. + */ +SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); + +/**@brief Start the Quality of Service (QoS) channel survey module. + * + * @details The channel survey module provides measurements of the energy levels on + * the Bluetooth Low Energy channels. When the module is enabled, @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT + * events will periodically report the measured energy levels for each channel. + * + * @note The measurements are scheduled with lower priority than other Bluetooth Low Energy roles, + * Radio Timeslot API events and Flash API events. + * + * @note The channel survey module will attempt to do measurements so that the average interval + * between measurements will be interval_us. However due to the channel survey module + * having the lowest priority of all roles and modules, this may not be possible. In that + * case fewer than expected channel survey reports may be given. + * + * @note In order to use the channel survey module, @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available + * must be set. This is done using @ref sd_ble_cfg_set. + * + * @param[in] interval_us Requested average interval for the measurements and reports. See + * @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS for valid ranges. If set + * to @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS, the channel + * survey role will be scheduled at every available opportunity. + * + * @retval ::NRF_SUCCESS The module is successfully started. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. interval_us is out of the + * allowed range. + * @retval ::NRF_ERROR_INVALID_STATE Trying to start the module when already running. + * @retval ::NRF_ERROR_RESOURCES The channel survey module is not available to the application. + * Set @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available using + * @ref sd_ble_cfg_set. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_START, uint32_t, sd_ble_gap_qos_channel_survey_start(uint32_t interval_us)); + +/**@brief Stop the Quality of Service (QoS) channel survey module. + * + * @retval ::NRF_SUCCESS The module is successfully stopped. + * @retval ::NRF_ERROR_INVALID_STATE Trying to stop the module when it is not running. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP, uint32_t, sd_ble_gap_qos_channel_survey_stop(void)); + + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_GAP_H__ + +/** + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gatt.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gatt.h new file mode 100644 index 0000000..9cb577c --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gatt.h @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GATT Generic Attribute Profile (GATT) Common + @{ + @brief Common definitions and prototypes for the GATT interfaces. + */ + +#ifndef BLE_GATT_H__ +#define BLE_GATT_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_GATT_DEFINES Defines + * @{ */ + +/** @brief Default ATT MTU, in bytes. */ +#define BLE_GATT_ATT_MTU_DEFAULT 23 + +/**@brief Invalid Attribute Handle. */ +#define BLE_GATT_HANDLE_INVALID 0x0000 + +/**@brief First Attribute Handle. */ +#define BLE_GATT_HANDLE_START 0x0001 + +/**@brief Last Attribute Handle. */ +#define BLE_GATT_HANDLE_END 0xFFFF + +/** @defgroup BLE_GATT_TIMEOUT_SOURCES GATT Timeout sources + * @{ */ +#define BLE_GATT_TIMEOUT_SRC_PROTOCOL 0x00 /**< ATT Protocol timeout. */ +/** @} */ + +/** @defgroup BLE_GATT_WRITE_OPS GATT Write operations + * @{ */ +#define BLE_GATT_OP_INVALID 0x00 /**< Invalid Operation. */ +#define BLE_GATT_OP_WRITE_REQ 0x01 /**< Write Request. */ +#define BLE_GATT_OP_WRITE_CMD 0x02 /**< Write Command. */ +#define BLE_GATT_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ +#define BLE_GATT_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ +#define BLE_GATT_OP_EXEC_WRITE_REQ 0x05 /**< Execute Write Request. */ +/** @} */ + +/** @defgroup BLE_GATT_EXEC_WRITE_FLAGS GATT Execute Write flags + * @{ */ +#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_CANCEL 0x00 /**< Cancel prepared write. */ +#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE 0x01 /**< Execute prepared write. */ +/** @} */ + +/** @defgroup BLE_GATT_HVX_TYPES GATT Handle Value operations + * @{ */ +#define BLE_GATT_HVX_INVALID 0x00 /**< Invalid Operation. */ +#define BLE_GATT_HVX_NOTIFICATION 0x01 /**< Handle Value Notification. */ +#define BLE_GATT_HVX_INDICATION 0x02 /**< Handle Value Indication. */ +/** @} */ + +/** @defgroup BLE_GATT_STATUS_CODES GATT Status Codes + * @{ */ +#define BLE_GATT_STATUS_SUCCESS 0x0000 /**< Success. */ +#define BLE_GATT_STATUS_UNKNOWN 0x0001 /**< Unknown or not applicable status. */ +#define BLE_GATT_STATUS_ATTERR_INVALID 0x0100 /**< ATT Error: Invalid Error Code. */ +#define BLE_GATT_STATUS_ATTERR_INVALID_HANDLE 0x0101 /**< ATT Error: Invalid Attribute Handle. */ +#define BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED 0x0102 /**< ATT Error: Read not permitted. */ +#define BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED 0x0103 /**< ATT Error: Write not permitted. */ +#define BLE_GATT_STATUS_ATTERR_INVALID_PDU 0x0104 /**< ATT Error: Used in ATT as Invalid PDU. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHENTICATION 0x0105 /**< ATT Error: Authenticated link required. */ +#define BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED 0x0106 /**< ATT Error: Used in ATT as Request Not Supported. */ +#define BLE_GATT_STATUS_ATTERR_INVALID_OFFSET 0x0107 /**< ATT Error: Offset specified was past the end of the attribute. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHORIZATION 0x0108 /**< ATT Error: Used in ATT as Insufficient Authorization. */ +#define BLE_GATT_STATUS_ATTERR_PREPARE_QUEUE_FULL 0x0109 /**< ATT Error: Used in ATT as Prepare Queue Full. */ +#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND 0x010A /**< ATT Error: Used in ATT as Attribute not found. */ +#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_LONG 0x010B /**< ATT Error: Attribute cannot be read or written using read/write blob requests. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_ENC_KEY_SIZE 0x010C /**< ATT Error: Encryption key size used is insufficient. */ +#define BLE_GATT_STATUS_ATTERR_INVALID_ATT_VAL_LENGTH 0x010D /**< ATT Error: Invalid value size. */ +#define BLE_GATT_STATUS_ATTERR_UNLIKELY_ERROR 0x010E /**< ATT Error: Very unlikely error. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_ENCRYPTION 0x010F /**< ATT Error: Encrypted link required. */ +#define BLE_GATT_STATUS_ATTERR_UNSUPPORTED_GROUP_TYPE 0x0110 /**< ATT Error: Attribute type is not a supported grouping attribute. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_RESOURCES 0x0111 /**< ATT Error: Encrypted link required. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_BEGIN 0x0112 /**< ATT Error: Reserved for Future Use range #1 begin. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_END 0x017F /**< ATT Error: Reserved for Future Use range #1 end. */ +#define BLE_GATT_STATUS_ATTERR_APP_BEGIN 0x0180 /**< ATT Error: Application range begin. */ +#define BLE_GATT_STATUS_ATTERR_APP_END 0x019F /**< ATT Error: Application range end. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_BEGIN 0x01A0 /**< ATT Error: Reserved for Future Use range #2 begin. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_END 0x01DF /**< ATT Error: Reserved for Future Use range #2 end. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_BEGIN 0x01E0 /**< ATT Error: Reserved for Future Use range #3 begin. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_END 0x01FC /**< ATT Error: Reserved for Future Use range #3 end. */ +#define BLE_GATT_STATUS_ATTERR_CPS_WRITE_REQ_REJECTED 0x01FC /**< ATT Common Profile and Service Error: Write request rejected. */ +#define BLE_GATT_STATUS_ATTERR_CPS_CCCD_CONFIG_ERROR 0x01FD /**< ATT Common Profile and Service Error: Client Characteristic Configuration Descriptor improperly configured. */ +#define BLE_GATT_STATUS_ATTERR_CPS_PROC_ALR_IN_PROG 0x01FE /**< ATT Common Profile and Service Error: Procedure Already in Progress. */ +#define BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE 0x01FF /**< ATT Common Profile and Service Error: Out Of Range. */ +/** @} */ + + +/** @defgroup BLE_GATT_CPF_FORMATS Characteristic Presentation Formats + * @note Found at http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml + * @{ */ +#define BLE_GATT_CPF_FORMAT_RFU 0x00 /**< Reserved For Future Use. */ +#define BLE_GATT_CPF_FORMAT_BOOLEAN 0x01 /**< Boolean. */ +#define BLE_GATT_CPF_FORMAT_2BIT 0x02 /**< Unsigned 2-bit integer. */ +#define BLE_GATT_CPF_FORMAT_NIBBLE 0x03 /**< Unsigned 4-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT8 0x04 /**< Unsigned 8-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT12 0x05 /**< Unsigned 12-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT16 0x06 /**< Unsigned 16-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT24 0x07 /**< Unsigned 24-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT32 0x08 /**< Unsigned 32-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT48 0x09 /**< Unsigned 48-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT64 0x0A /**< Unsigned 64-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT128 0x0B /**< Unsigned 128-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT8 0x0C /**< Signed 2-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT12 0x0D /**< Signed 12-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT16 0x0E /**< Signed 16-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT24 0x0F /**< Signed 24-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT32 0x10 /**< Signed 32-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT48 0x11 /**< Signed 48-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT64 0x12 /**< Signed 64-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT128 0x13 /**< Signed 128-bit integer. */ +#define BLE_GATT_CPF_FORMAT_FLOAT32 0x14 /**< IEEE-754 32-bit floating point. */ +#define BLE_GATT_CPF_FORMAT_FLOAT64 0x15 /**< IEEE-754 64-bit floating point. */ +#define BLE_GATT_CPF_FORMAT_SFLOAT 0x16 /**< IEEE-11073 16-bit SFLOAT. */ +#define BLE_GATT_CPF_FORMAT_FLOAT 0x17 /**< IEEE-11073 32-bit FLOAT. */ +#define BLE_GATT_CPF_FORMAT_DUINT16 0x18 /**< IEEE-20601 format. */ +#define BLE_GATT_CPF_FORMAT_UTF8S 0x19 /**< UTF-8 string. */ +#define BLE_GATT_CPF_FORMAT_UTF16S 0x1A /**< UTF-16 string. */ +#define BLE_GATT_CPF_FORMAT_STRUCT 0x1B /**< Opaque Structure. */ +/** @} */ + +/** @defgroup BLE_GATT_CPF_NAMESPACES GATT Bluetooth Namespaces + * @{ + */ +#define BLE_GATT_CPF_NAMESPACE_BTSIG 0x01 /**< Bluetooth SIG defined Namespace. */ +#define BLE_GATT_CPF_NAMESPACE_DESCRIPTION_UNKNOWN 0x0000 /**< Namespace Description Unknown. */ +/** @} */ + +/** @} */ + +/** @addtogroup BLE_GATT_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. + */ +typedef struct +{ + uint16_t att_mtu; /**< Maximum size of ATT packet the SoftDevice can send or receive. + The default and minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. + @mscs + @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} + @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} + @endmscs + */ +} ble_gatt_conn_cfg_t; + +/**@brief GATT Characteristic Properties. */ +typedef struct +{ + /* Standard properties */ + uint8_t broadcast :1; /**< Broadcasting of the value permitted. */ + uint8_t read :1; /**< Reading the value permitted. */ + uint8_t write_wo_resp :1; /**< Writing the value with Write Command permitted. */ + uint8_t write :1; /**< Writing the value with Write Request permitted. */ + uint8_t notify :1; /**< Notification of the value permitted. */ + uint8_t indicate :1; /**< Indications of the value permitted. */ + uint8_t auth_signed_wr :1; /**< Writing the value with Signed Write Command permitted. */ +} ble_gatt_char_props_t; + +/**@brief GATT Characteristic Extended Properties. */ +typedef struct +{ + /* Extended properties */ + uint8_t reliable_wr :1; /**< Writing the value with Queued Write operations permitted. */ + uint8_t wr_aux :1; /**< Writing the Characteristic User Description descriptor permitted. */ +} ble_gatt_char_ext_props_t; + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_GATT_H__ + +/** @} */ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gattc.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gattc.h new file mode 100644 index 0000000..7fb3920 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gattc.h @@ -0,0 +1,715 @@ +/* + * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client + @{ + @brief Definitions and prototypes for the GATT Client interface. + */ + +#ifndef BLE_GATTC_H__ +#define BLE_GATTC_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations + * @{ */ + +/**@brief GATTC API SVC numbers. */ +enum BLE_GATTC_SVCS +{ + SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */ + SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */ + SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */ + SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */ + SD_BLE_GATTC_ATTR_INFO_DISCOVER, /**< Attribute Information Discovery. */ + SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */ + SD_BLE_GATTC_READ, /**< Generic read. */ + SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */ + SD_BLE_GATTC_WRITE, /**< Generic write. */ + SD_BLE_GATTC_HV_CONFIRM, /**< Handle Value Confirmation. */ + SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. */ +}; + +/** + * @brief GATT Client Event IDs. + */ +enum BLE_GATTC_EVTS +{ + BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. \n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t. */ + BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. \n See @ref ble_gattc_evt_rel_disc_rsp_t. */ + BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. \n See @ref ble_gattc_evt_char_disc_rsp_t. */ + BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. \n See @ref ble_gattc_evt_desc_disc_rsp_t. */ + BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, /**< Attribute Information Response event. \n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */ + BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. \n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t. */ + BLE_GATTC_EVT_READ_RSP, /**< Read Response event. \n See @ref ble_gattc_evt_read_rsp_t. */ + BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. \n See @ref ble_gattc_evt_char_vals_read_rsp_t. */ + BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. \n See @ref ble_gattc_evt_write_rsp_t. */ + BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. \n Confirm indication with @ref sd_ble_gattc_hv_confirm. \n See @ref ble_gattc_evt_hvx_t. */ + BLE_GATTC_EVT_EXCHANGE_MTU_RSP, /**< Exchange MTU Response event. \n See @ref ble_gattc_evt_exchange_mtu_rsp_t. */ + BLE_GATTC_EVT_TIMEOUT, /**< Timeout event. \n See @ref ble_gattc_evt_timeout_t. */ + BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE /**< Write without Response transmission complete. \n See @ref ble_gattc_evt_write_cmd_tx_complete_t. */ +}; + +/** @} */ + +/** @addtogroup BLE_GATTC_DEFINES Defines + * @{ */ + +/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC + * @{ */ +#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */ +/** @} */ + +/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats + * @{ */ +#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT 1 /**< 16-bit Attribute Information Format. */ +#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT 2 /**< 128-bit Attribute Information Format. */ +/** @} */ + +/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults + * @{ */ +#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Write without Response that can be queued for transmission. */ +/** @} */ + +/** @} */ + +/** @addtogroup BLE_GATTC_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set. + */ +typedef struct +{ + uint8_t write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission. + The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */ +} ble_gattc_conn_cfg_t; + +/**@brief Operation Handle Range. */ +typedef struct +{ + uint16_t start_handle; /**< Start Handle. */ + uint16_t end_handle; /**< End Handle. */ +} ble_gattc_handle_range_t; + + +/**@brief GATT service. */ +typedef struct +{ + ble_uuid_t uuid; /**< Service UUID. */ + ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */ +} ble_gattc_service_t; + + +/**@brief GATT include. */ +typedef struct +{ + uint16_t handle; /**< Include Handle. */ + ble_gattc_service_t included_srvc; /**< Handle of the included service. */ +} ble_gattc_include_t; + + +/**@brief GATT characteristic. */ +typedef struct +{ + ble_uuid_t uuid; /**< Characteristic UUID. */ + ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ + uint8_t char_ext_props : 1; /**< Extended properties present. */ + uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */ + uint16_t handle_value; /**< Handle of the Characteristic Value. */ +} ble_gattc_char_t; + + +/**@brief GATT descriptor. */ +typedef struct +{ + uint16_t handle; /**< Descriptor Handle. */ + ble_uuid_t uuid; /**< Descriptor UUID. */ +} ble_gattc_desc_t; + + +/**@brief Write Parameters. */ +typedef struct +{ + uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */ + uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */ + uint16_t handle; /**< Handle to the attribute to be written. */ + uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */ + uint16_t len; /**< Length of data in bytes. */ + uint8_t const *p_value; /**< Pointer to the value data. */ +} ble_gattc_write_params_t; + +/**@brief Attribute Information for 16-bit Attribute UUID. */ +typedef struct +{ + uint16_t handle; /**< Attribute handle. */ + ble_uuid_t uuid; /**< 16-bit Attribute UUID. */ +} ble_gattc_attr_info16_t; + +/**@brief Attribute Information for 128-bit Attribute UUID. */ +typedef struct +{ + uint16_t handle; /**< Attribute handle. */ + ble_uuid128_t uuid; /**< 128-bit Attribute UUID. */ +} ble_gattc_attr_info128_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Service count. */ + ble_gattc_service_t services[1]; /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_prim_srvc_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Include count. */ + ble_gattc_include_t includes[1]; /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_rel_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Characteristic count. */ + ble_gattc_char_t chars[1]; /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Descriptor count. */ + ble_gattc_desc_t descs[1]; /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_desc_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Attribute count. */ + uint8_t format; /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */ + union { + ble_gattc_attr_info16_t attr_info16[1]; /**< Attribute information for 16-bit Attribute UUID. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ + ble_gattc_attr_info128_t attr_info128[1]; /**< Attribute information for 128-bit Attribute UUID. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ + } info; /**< Attribute information union. */ +} ble_gattc_evt_attr_info_disc_rsp_t; + +/**@brief GATT read by UUID handle value pair. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint8_t *p_value; /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */ +} ble_gattc_handle_value_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */ +typedef struct +{ + uint16_t count; /**< Handle-Value Pair Count. */ + uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */ + uint8_t handle_value[1]; /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_val_by_uuid_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint16_t offset; /**< Offset of the attribute data. */ + uint16_t len; /**< Attribute data length. */ + uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */ +typedef struct +{ + uint16_t len; /**< Concatenated Attribute values length. */ + uint8_t values[1]; /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_vals_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */ + uint16_t offset; /**< Data offset. */ + uint16_t len; /**< Data length. */ + uint8_t data[1]; /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_write_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */ +typedef struct +{ + uint16_t handle; /**< Handle to which the HVx operation applies. */ + uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ + uint16_t len; /**< Attribute data length. */ + uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_hvx_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */ +typedef struct +{ + uint16_t server_rx_mtu; /**< Server RX MTU size. */ +} ble_gattc_evt_exchange_mtu_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */ +typedef struct +{ + uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ +} ble_gattc_evt_timeout_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */ +typedef struct +{ + uint8_t count; /**< Number of write without response transmissions completed. */ +} ble_gattc_evt_write_cmd_tx_complete_t; + +/**@brief GATTC event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which event occurred. */ + uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ + uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */ + union + { + ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */ + ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */ + ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */ + ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */ + ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */ + ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */ + ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */ + ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */ + ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */ + ble_gattc_evt_exchange_mtu_rsp_t exchange_mtu_rsp; /**< Exchange MTU Response Event Parameters. */ + ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */ + ble_gattc_evt_attr_info_disc_rsp_t attr_info_disc_rsp; /**< Attribute Information Discovery Event Parameters. */ + ble_gattc_evt_write_cmd_tx_complete_t write_cmd_tx_complete; /**< Write without Response transmission complete Event Parameters. */ + } params; /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */ +} ble_gattc_evt_t; +/** @} */ + +/** @addtogroup BLE_GATTC_FUNCTIONS Functions + * @{ */ + +/**@brief Initiate or continue a GATT Primary Service Discovery procedure. + * + * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle. + * If the last service has not been reached, this function must be called again with an updated start handle value to continue the search. + * + * @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with + * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. + * + * @events + * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] start_handle Handle to start searching from. + * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); + + +/**@brief Initiate or continue a GATT Relationship Discovery procedure. + * + * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached, + * this must be called again with an updated handle range to continue the search. + * + * @events + * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_REL_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Characteristic Discovery procedure. + * + * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with + * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure. + * + * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @events + * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure. + * + * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_READ_UUID_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_uuid Pointer to a Characteristic value UUID to read. + * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure. + * + * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor + * to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the + * complete value. + * + * @events + * @event{@ref BLE_GATTC_EVT_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] handle The handle of the attribute to be read. + * @param[in] offset Offset into the attribute value to be read. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); + + +/**@brief Initiate a GATT Read Multiple Characteristic Values procedure. + * + * @details This function initiates a GATT Read Multiple Characteristic Values procedure. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_READ_MULT_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read. + * @param[in] handle_count The number of handles in p_handles. + * + * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); + + +/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure. + * + * @details This function can perform all write procedures described in GATT. + * + * @note Only one write with response procedure can be ongoing per connection at a time. + * If the application tries to write with response while another write with response procedure is ongoing, + * the function call will return @ref NRF_ERROR_BUSY. + * A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer. + * + * @note The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size + * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. + * A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete. + * + * @note The application can keep track of the available queue element count for writes without responses by following the procedure below: + * - Store initial queue element count in a variable. + * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. + * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event. + * + * @events + * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.} + * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_write_params A pointer to a write parameters structure. + * + * @retval ::NRF_SUCCESS Successfully started the Write procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. + * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. + * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); + + +/**@brief Send a Handle Value Confirmation to the GATT Server. + * + * @mscs + * @mmsc{@ref BLE_GATTC_HVI_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] handle The handle of the attribute in the indication. + * + * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); + +/**@brief Discovers information about a range of attributes on a GATT server. + * + * @events + * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.} + * @endevents + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range The range of handles to request information about. + * + * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); + +/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server. + * + * @details The SoftDevice sets ATT_MTU to the minimum of: + * - The Client RX MTU value, and + * - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. + * + * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. + * + * @events + * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] client_rx_mtu Client RX MTU size. + * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. + * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration + used for this connection. + * - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply + * if an ATT_MTU exchange has already been performed in the other direction. + * + * @retval ::NRF_SUCCESS Successfully sent request to the server. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); + +/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. + * + * @param[in] p_gattc_evt Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. + * @note If the buffer contains different event, behavior is undefined. + * @param[in,out] p_iter Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with + * the next Handle-Value pair in each iteration. If the function returns other than + * @ref NRF_SUCCESS, it will not be changed. + * - To start iteration, initialize the structure to zero. + * - To continue, pass the value from previous iteration. + * + * \code + * ble_gattc_handle_value_t iter; + * memset(&iter, 0, sizeof(ble_gattc_handle_value_t)); + * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS) + * { + * app_handle = iter.handle; + * memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len); + * } + * \endcode + * + * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair. + * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list. + */ +__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter); + +/** @} */ + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter) +{ + uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len; + uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value; + uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first; + + if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count) + { + p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0]; + p_iter->p_value = p_next + sizeof(uint16_t); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_NOT_FOUND; + } +} + +#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ + +#ifdef __cplusplus +} +#endif +#endif /* BLE_GATTC_H__ */ + +/** + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gatts.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gatts.h new file mode 100644 index 0000000..394d8d1 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_gatts.h @@ -0,0 +1,845 @@ +/* + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server + @{ + @brief Definitions and prototypes for the GATTS interface. + */ + +#ifndef BLE_GATTS_H__ +#define BLE_GATTS_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" +#include "ble_gap.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations + * @{ */ + +/** + * @brief GATTS API SVC numbers. + */ +enum BLE_GATTS_SVCS +{ + SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */ + SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */ + SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */ + SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */ + SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */ + SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */ + SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */ + SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */ + SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */ + SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */ + SD_BLE_GATTS_SYS_ATTR_GET, /**< Retrieve the persistent system attributes. */ + SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, /**< Retrieve the first valid user handle. */ + SD_BLE_GATTS_ATTR_GET, /**< Retrieve the UUID and/or metadata of an attribute. */ + SD_BLE_GATTS_EXCHANGE_MTU_REPLY /**< Reply to Exchange MTU Request. */ +}; + +/** + * @brief GATT Server Event IDs. + */ +enum BLE_GATTS_EVTS +{ + BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. \n See @ref ble_gatts_evt_write_t. */ + BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. \n Reply with @ref sd_ble_gatts_rw_authorize_reply. \n See @ref ble_gatts_evt_rw_authorize_request_t. */ + BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending. \n Respond with @ref sd_ble_gatts_sys_attr_set. \n See @ref ble_gatts_evt_sys_attr_missing_t. */ + BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. \n See @ref ble_gatts_evt_hvc_t. */ + BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. \n No additional event structure applies. */ + BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. \n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \n See @ref ble_gatts_evt_exchange_mtu_request_t. */ + BLE_GATTS_EVT_TIMEOUT, /**< Peer failed to respond to an ATT request in time. \n See @ref ble_gatts_evt_timeout_t. */ + BLE_GATTS_EVT_HVN_TX_COMPLETE /**< Handle Value Notification transmission complete. \n See @ref ble_gatts_evt_hvn_tx_complete_t. */ +}; + +/**@brief GATTS Configuration IDs. + * + * IDs that uniquely identify a GATTS configuration. + */ +enum BLE_GATTS_CFGS +{ + BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */ + BLE_GATTS_CFG_ATTR_TAB_SIZE, /**< Attribute table size configuration. */ +}; + +/** @} */ + +/** @addtogroup BLE_GATTS_DEFINES Defines + * @{ */ + +/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS + * @{ */ +#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */ +#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */ +/** @} */ + +/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths + * @{ */ +#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */ +#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */ +/** @} */ + +/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types + * @{ */ +#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */ +#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */ +#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */ +/** @} */ + + +/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types + * @{ */ +#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */ +#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */ +#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */ +#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */ +#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */ +#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */ +#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */ +#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */ +/** @} */ + + +/** @defgroup BLE_GATTS_OPS GATT Server Operations + * @{ */ +#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */ +#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */ +#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */ +#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ +#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ +#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */ +#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */ +/** @} */ + +/** @defgroup BLE_GATTS_VLOCS GATT Value Locations + * @{ */ +#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */ +#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */ +#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack + will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */ +/** @} */ + +/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types + * @{ */ +#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */ +#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */ +#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */ +/** @} */ + +/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags + * @{ */ +#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0) /**< Restrict system attributes to system services only. */ +#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1) /**< Restrict system attributes to user services only. */ +/** @} */ + +/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values + * @{ + */ +#define BLE_GATTS_SERVICE_CHANGED_DEFAULT (1) /**< Default is to include the Service Changed characteristic in the Attribute Table. */ +/** @} */ + +/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size + * @{ + */ +#define BLE_GATTS_ATTR_TAB_SIZE_MIN (248) /**< Minimum Attribute Table size */ +#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT (1408) /**< Default Attribute Table size. */ +/** @} */ + +/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults + * @{ + */ +#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Handle Value Notifications that can be queued for transmission. */ +/** @} */ + +/** @} */ + +/** @addtogroup BLE_GATTS_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set. + */ +typedef struct +{ + uint8_t hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission. + The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */ +} ble_gatts_conn_cfg_t; + +/**@brief Attribute metadata. */ +typedef struct +{ + ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */ + ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ + uint8_t vlen :1; /**< Variable length attribute. */ + uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ + uint8_t rd_auth :1; /**< Read authorization and value will be requested from the application on every read operation. */ + uint8_t wr_auth :1; /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */ +} ble_gatts_attr_md_t; + + +/**@brief GATT Attribute. */ +typedef struct +{ + ble_uuid_t const *p_uuid; /**< Pointer to the attribute UUID. */ + ble_gatts_attr_md_t const *p_attr_md; /**< Pointer to the attribute metadata structure. */ + uint16_t init_len; /**< Initial attribute value length in bytes. */ + uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */ + uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */ + uint8_t *p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer + that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location. + The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/ +} ble_gatts_attr_t; + +/**@brief GATT Attribute Value. */ +typedef struct +{ + uint16_t len; /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/ + uint16_t offset; /**< Attribute value offset. */ + uint8_t *p_value; /**< Pointer to where value is stored or will be stored. + If value is stored in user memory, only the attribute length is updated when p_value == NULL. + Set to NULL when reading to obtain the complete length of the attribute value */ +} ble_gatts_value_t; + + +/**@brief GATT Characteristic Presentation Format. */ +typedef struct +{ + uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */ + int8_t exponent; /**< Exponent for integer data types. */ + uint16_t unit; /**< Unit from Bluetooth Assigned Numbers. */ + uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ + uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ +} ble_gatts_char_pf_t; + + +/**@brief GATT Characteristic metadata. */ +typedef struct +{ + ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ + ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */ + uint8_t const *p_char_user_desc; /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */ + uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */ + uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */ + ble_gatts_char_pf_t const *p_char_pf; /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */ + ble_gatts_attr_md_t const *p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */ + ble_gatts_attr_md_t const *p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */ + ble_gatts_attr_md_t const *p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */ +} ble_gatts_char_md_t; + + +/**@brief GATT Characteristic Definition Handles. */ +typedef struct +{ + uint16_t value_handle; /**< Handle to the characteristic value. */ + uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ + uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ + uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ +} ble_gatts_char_handles_t; + + +/**@brief GATT HVx parameters. */ +typedef struct +{ + uint16_t handle; /**< Characteristic Value Handle. */ + uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ + uint16_t offset; /**< Offset within the attribute value. */ + uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ + uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ +} ble_gatts_hvx_params_t; + +/**@brief GATT Authorization parameters. */ +typedef struct +{ + uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ + uint8_t update : 1; /**< If set, data supplied in p_data will be used to update the attribute value. + Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set, + as the data to be written needs to be stored and later provided by the application. */ + uint16_t offset; /**< Offset of the attribute value being updated. */ + uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */ + uint8_t const *p_data; /**< Pointer to new value used to update the attribute value. */ +} ble_gatts_authorize_params_t; + +/**@brief GATT Read or Write Authorize Reply parameters. */ +typedef struct +{ + uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ + union { + ble_gatts_authorize_params_t read; /**< Read authorization parameters. */ + ble_gatts_authorize_params_t write; /**< Write authorization parameters. */ + } params; /**< Reply Parameters. */ +} ble_gatts_rw_authorize_reply_params_t; + +/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */ +typedef struct +{ + uint8_t service_changed : 1; /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */ +} ble_gatts_cfg_service_changed_t; + +/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: + * - The specified Attribute Table size is too small. + * The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. + * - The specified Attribute Table size is not a multiple of 4. + */ +typedef struct +{ + uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */ +} ble_gatts_cfg_attr_tab_size_t; + +/**@brief Config structure for GATTS configurations. */ +typedef union +{ + ble_gatts_cfg_service_changed_t service_changed; /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */ + ble_gatts_cfg_attr_tab_size_t attr_tab_size; /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */ +} ble_gatts_cfg_t; + + +/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + ble_uuid_t uuid; /**< Attribute UUID. */ + uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */ + uint8_t auth_required; /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */ + uint16_t offset; /**< Offset for the write operation. */ + uint16_t len; /**< Length of the received data. */ + uint8_t data[1]; /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gatts_evt_write_t; + +/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + ble_uuid_t uuid; /**< Attribute UUID. */ + uint16_t offset; /**< Offset for the read operation. */ +} ble_gatts_evt_read_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */ +typedef struct +{ + uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ + union { + ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */ + ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */ + } request; /**< Request Parameters. */ +} ble_gatts_evt_rw_authorize_request_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */ +typedef struct +{ + uint8_t hint; /**< Hint (currently unused). */ +} ble_gatts_evt_sys_attr_missing_t; + + +/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ +} ble_gatts_evt_hvc_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */ +typedef struct +{ + uint16_t client_rx_mtu; /**< Client RX MTU size. */ +} ble_gatts_evt_exchange_mtu_request_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */ +typedef struct +{ + uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ +} ble_gatts_evt_timeout_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */ +typedef struct +{ + uint8_t count; /**< Number of notification transmissions completed. */ +} ble_gatts_evt_hvn_tx_complete_t; + +/**@brief GATTS event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which the event occurred. */ + union + { + ble_gatts_evt_write_t write; /**< Write Event Parameters. */ + ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */ + ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */ + ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */ + ble_gatts_evt_exchange_mtu_request_t exchange_mtu_request; /**< Exchange MTU Request Event Parameters. */ + ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */ + ble_gatts_evt_hvn_tx_complete_t hvn_tx_complete; /**< Handle Value Notification transmission complete Event Parameters. */ + } params; /**< Event Parameters. */ +} ble_gatts_evt_t; + +/** @} */ + +/** @addtogroup BLE_GATTS_FUNCTIONS Functions + * @{ */ + +/**@brief Add a service declaration to the Attribute Table. + * + * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to + * add a secondary service declaration that is not referenced by another service later in the Attribute Table. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES. + * @param[in] p_uuid Pointer to service UUID. + * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a service declaration. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + */ +SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)); + + +/**@brief Add an include declaration to the Attribute Table. + * + * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time). + * + * @note The included service must already be present in the Attribute Table prior to this call. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] service_handle Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] inc_srvc_handle Handle of the included service. + * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added an include declaration. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. + * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + */ +SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)); + + +/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table. + * + * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time). + * + * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits, + * readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values. + * + * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] service_handle Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] p_char_md Characteristic metadata. + * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value. + * @param[out] p_handles Pointer to the structure where the assigned handles will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a characteristic. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + */ +SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)); + + +/**@brief Add a descriptor to the Attribute Table. + * + * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time). + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] p_attr Pointer to the attribute structure. + * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a descriptor. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + */ +SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)); + +/**@brief Set the value of a given attribute. + * + * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. + * @param[in] handle Attribute handle. + * @param[in,out] p_value Attribute value information. + * + * @retval ::NRF_SUCCESS Successfully set the value of the attribute. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. + */ +SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); + +/**@brief Get the value of a given attribute. + * + * @note If the attribute value is longer than the size of the supplied buffer, + * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), + * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. + * The application may use this information to allocate a suitable buffer size. + * + * @note When retrieving system attribute values with this function, the connection handle + * may refer to an already disconnected connection. Refer to the documentation of + * @ref sd_ble_gatts_sys_attr_get for further information. + * + * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. + * @param[in] handle Attribute handle. + * @param[in,out] p_value Attribute value information. + * + * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + */ +SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); + +/**@brief Notify or Indicate an attribute value. + * + * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation + * (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that + * the application can atomically perform a value update and a server initiated transaction with a single API call. + * + * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. + * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, + * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. + * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). + * + * @note Only one indication procedure can be ongoing per connection at a time. + * If the application tries to indicate an attribute value while another indication procedure is ongoing, + * the function call will return @ref NRF_ERROR_BUSY. + * A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer. + * + * @note The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size + * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. + * A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete. + * + * @note The application can keep track of the available queue element count for notifications by following the procedure below: + * - Store initial queue element count in a variable. + * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. + * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event. + * + * @events + * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.} + * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} + * @mmsc{@ref BLE_GATTS_HVN_MSC} + * @mmsc{@ref BLE_GATTS_HVI_MSC} + * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data + * contains a non-NULL pointer the attribute value will be updated with the contents + * pointed by it before sending the notification or indication. If the attribute value + * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to + * contain the number of actual bytes written, else it will be set to 0. + * + * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: + * - Invalid Connection State + * - Notifications and/or indications not enabled in the CCCD + * - An ATT_MTU exchange is ongoing + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate. + * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. + * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); + +/**@brief Indicate the Service Changed attribute value. + * + * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute + * Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will + * be issued. + * + * @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here. + * + * @events + * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTS_SC_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] start_handle Start of affected attribute handle range. + * @param[in] end_handle End of affected attribute handle range. + * + * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref + * sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t. + * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: + * - Invalid Connection State + * - Notifications and/or indications not enabled in the CCCD + * - An ATT_MTU exchange is ongoing + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. + * @retval ::NRF_ERROR_BUSY Procedure already in progress. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); + +/**@brief Respond to a Read/Write authorization request. + * + * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. + * + * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond + * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update + * is set to 0. + * + * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. + * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, + * handle supplied does not match requested handle, + * or invalid data to be written provided by the application. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); + + +/**@brief Update persistent system attribute information. + * + * @details Supply information about persistent system attributes to the stack, + * previously obtained using @ref sd_ble_gatts_sys_attr_get. + * This call is only allowed for active connections, and is usually + * made immediately after a connection is established with an known bonded device, + * often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. + * + * p_sysattrs may point directly to the application's stored copy of the system attributes + * obtained using @ref sd_ble_gatts_sys_attr_get. + * If the pointer is NULL, the system attribute info is initialized, assuming that + * the application does not have any previously saved system attribute data for this device. + * + * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration. + * + * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially. + * This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or + * reset the SoftDevice to return to a known state. + * + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified. + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified. + * + * @mscs + * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC} + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL. + * @param[in] len Size of data pointed by p_sys_attr_data, in octets. + * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS + * + * @retval ::NRF_SUCCESS Successfully set the system attribute information. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + */ +SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)); + + +/**@brief Retrieve persistent system attribute information from the stack. + * + * @details This call is used to retrieve information about values to be stored persistently by the application + * during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device, + * the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set. + * If retrieved after disconnection, the data should be read before a new connection established. The connection handle for + * the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it. + * Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes + * may be written to at any time by the peer during a connection's lifetime. + * + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned. + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned. + * + * @mscs + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle of the recently terminated connection. + * @param[out] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described + * in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data. + * @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data. + * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS + * + * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. + * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer. + * @retval ::NRF_ERROR_NOT_FOUND No system attributes found. + */ +SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)); + + +/**@brief Retrieve the first valid user attribute handle. + * + * @param[out] p_handle Pointer to an integer where the handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully retrieved the handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + */ +SVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)); + +/**@brief Retrieve the attribute UUID and/or metadata. + * + * @param[in] handle Attribute handle + * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field. + * @param[out] p_md Metadata of the attribute. Use NULL to omit this field. + * + * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata, + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL. + * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found. + */ +SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)); + +/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client. + * + * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event. + * + * @details The SoftDevice sets ATT_MTU to the minimum of: + * - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and + * - The Server RX MTU value. + * + * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. + * + * @mscs + * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] server_rx_mtu Server RX MTU size. + * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. + * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration + * used for this connection. + * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request + * if an ATT_MTU exchange has already been performed in the other direction. + * + * @retval ::NRF_SUCCESS Successfully sent response to the client. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_GATTS_H__ + +/** + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_hci.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_hci.h new file mode 100644 index 0000000..f0dde9a --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_hci.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ +*/ + + +#ifndef BLE_HCI_H__ +#define BLE_HCI_H__ +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup BLE_HCI_STATUS_CODES Bluetooth status codes + * @{ */ + +#define BLE_HCI_STATUS_CODE_SUCCESS 0x00 /**< Success. */ +#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01 /**< Unknown BLE Command. */ +#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 /**< Unknown Connection Identifier. */ +/*0x03 Hardware Failure +0x04 Page Timeout +*/ +#define BLE_HCI_AUTHENTICATION_FAILURE 0x05 /**< Authentication Failure. */ +#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06 /**< Pin or Key missing. */ +#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07 /**< Memory Capacity Exceeded. */ +#define BLE_HCI_CONNECTION_TIMEOUT 0x08 /**< Connection Timeout. */ +/*0x09 Connection Limit Exceeded +0x0A Synchronous Connection Limit To A Device Exceeded +0x0B ACL Connection Already Exists*/ +#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C /**< Command Disallowed. */ +/*0x0D Connection Rejected due to Limited Resources +0x0E Connection Rejected Due To Security Reasons +0x0F Connection Rejected due to Unacceptable BD_ADDR +0x10 Connection Accept Timeout Exceeded +0x11 Unsupported Feature or Parameter Value*/ +#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12 /**< Invalid BLE Command Parameters. */ +#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13 /**< Remote User Terminated Connection. */ +#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14 /**< Remote Device Terminated Connection due to low resources.*/ +#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15 /**< Remote Device Terminated Connection due to power off. */ +#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16 /**< Local Host Terminated Connection. */ +/* +0x17 Repeated Attempts +0x18 Pairing Not Allowed +0x19 Unknown LMP PDU +*/ +#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A /**< Unsupported Remote Feature. */ +/* +0x1B SCO Offset Rejected +0x1C SCO Interval Rejected +0x1D SCO Air Mode Rejected*/ +#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E /**< Invalid LMP Parameters. */ +#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F /**< Unspecified Error. */ +/*0x20 Unsupported LMP Parameter Value +0x21 Role Change Not Allowed +*/ +#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ +#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ +#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ +/*0x25 Encryption Mode Not Acceptable +0x26 Link Key Can Not be Changed +0x27 Requested QoS Not Supported +*/ +#define BLE_HCI_INSTANT_PASSED 0x28 /**< Instant Passed. */ +#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29 /**< Pairing with Unit Key Unsupported. */ +#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A /**< Different Transaction Collision. */ +/* +0x2B Reserved +0x2C QoS Unacceptable Parameter +0x2D QoS Rejected +0x2E Channel Classification Not Supported +0x2F Insufficient Security +*/ +#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 /**< Parameter Out Of Mandatory Range. */ +/* +0x31 Reserved +0x32 Role Switch Pending +0x33 Reserved +0x34 Reserved Slot Violation +0x35 Role Switch Failed +0x36 Extended Inquiry Response Too Large +0x37 Secure Simple Pairing Not Supported By Host. +0x38 Host Busy - Pairing +0x39 Connection Rejected due to No Suitable Channel Found*/ +#define BLE_HCI_CONTROLLER_BUSY 0x3A /**< Controller Busy. */ +#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B /**< Connection Interval Unacceptable. */ +#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C /**< Directed Advertisement Timeout. */ +#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D /**< Connection Terminated due to MIC Failure. */ +#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E /**< Connection Failed to be Established. */ + +/** @} */ + + +#ifdef __cplusplus +} +#endif +#endif // BLE_HCI_H__ + +/** @} */ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_l2cap.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_l2cap.h new file mode 100644 index 0000000..edaf664 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_l2cap.h @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) + @{ + @brief Definitions and prototypes for the L2CAP interface. + */ + +#ifndef BLE_L2CAP_H__ +#define BLE_L2CAP_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology + * @{ + * @details + * + * L2CAP SDU + * - A data unit that the application can send/receive to/from a peer. + * + * L2CAP PDU + * - A data unit that is exchanged between local and remote L2CAP entities. + * It consists of L2CAP protocol control information and payload fields. + * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. + * + * L2CAP MTU + * - The maximum length of an L2CAP SDU. + * + * L2CAP MPS + * - The maximum length of an L2CAP PDU payload field. + * + * Credits + * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. + * @} */ + +/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations + * @{ */ + +/**@brief L2CAP API SVC numbers. */ +enum BLE_L2CAP_SVCS +{ + SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */ + SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */ + SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */ +}; + +/**@brief L2CAP Event IDs. */ +enum BLE_L2CAP_EVTS +{ + BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event. + \n See @ref ble_l2cap_evt_ch_setup_request_t. */ + BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event. + \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ + BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event. + \n See @ref ble_l2cap_evt_ch_setup_t. */ + BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event. + \n No additional event structure applies. */ + BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event. + \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ + BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received. + \n See @ref ble_l2cap_evt_ch_credit_t. */ + BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received. + \n See @ref ble_l2cap_evt_ch_rx_t. */ + BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted. + \n See @ref ble_l2cap_evt_ch_tx_t. */ +}; + +/** @} */ + +/**@addtogroup BLE_L2CAP_DEFINES Defines + * @{ */ + +/**@brief Maximum number of L2CAP channels per connection. */ +#define BLE_L2CAP_CH_COUNT_MAX (64) + +/**@brief Minimum L2CAP MTU, in bytes. */ +#define BLE_L2CAP_MTU_MIN (23) + +/**@brief Minimum L2CAP MPS, in bytes. */ +#define BLE_L2CAP_MPS_MIN (23) + +/**@brief Invalid CID. */ +#define BLE_L2CAP_CID_INVALID (0x0000) + +/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ +#define BLE_L2CAP_CREDITS_DEFAULT (1) + +/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources + * @{ */ +#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ +#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ + /** @} */ + + /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes + * @{ */ +#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ +#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ +#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ +#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ +#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ +#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ +#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ +#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ +/** @} */ + +/** @} */ + +/**@addtogroup BLE_L2CAP_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. + * + * @note These parameters are set per connection, so all L2CAP channels created on this connection + * will have the same parameters. + * + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. + * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. + * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. + * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. + */ +typedef struct +{ + uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall + be able to receive on L2CAP channels on connections with this + configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ + uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall + be able to transmit on L2CAP channels on connections with this + configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ + uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per + L2CAP channel. The minimum value is one. */ + uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission + per L2CAP channel. The minimum value is one. */ + uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection + with this configuration. The default value is zero, the maximum + value is @ref BLE_L2CAP_CH_COUNT_MAX. + @note if this parameter is set to zero, all other parameters in + @ref ble_l2cap_conn_cfg_t are ignored. */ +} ble_l2cap_conn_cfg_t; + +/**@brief L2CAP channel RX parameters. */ +typedef struct +{ + uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to + receive on this L2CAP channel. + - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ + uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be + able to receive on this L2CAP channel. + - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. + - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ + ble_data_t sdu_buf; /**< SDU data buffer for reception. + - If @ref ble_data_t::p_data is non-NULL, initial credits are + issued to the peer. + - If @ref ble_data_t::p_data is NULL, no initial credits are + issued to the peer. */ +} ble_l2cap_ch_rx_params_t; + +/**@brief L2CAP channel setup parameters. */ +typedef struct +{ + ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ + uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting + setup of an L2CAP channel, ignored otherwise. */ + uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. + Used when replying to a setup request of an L2CAP + channel, ignored otherwise. */ +} ble_l2cap_ch_setup_params_t; + +/**@brief L2CAP channel TX parameters. */ +typedef struct +{ + uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to + transmit on this L2CAP channel. */ + uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is + able to receive on this L2CAP channel. */ + uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able + to transmit on this L2CAP channel. This is effective tx_mps, + selected by the SoftDevice as + MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ + uint16_t credits; /**< Initial credits given by the peer. */ +} ble_l2cap_ch_tx_params_t; + +/**@brief L2CAP Channel Setup Request event. */ +typedef struct +{ + ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ + uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ +} ble_l2cap_evt_ch_setup_request_t; + +/**@brief L2CAP Channel Setup Refused event. */ +typedef struct +{ + uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ + uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ +} ble_l2cap_evt_ch_setup_refused_t; + +/**@brief L2CAP Channel Setup Completed event. */ +typedef struct +{ + ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ +} ble_l2cap_evt_ch_setup_t; + +/**@brief L2CAP Channel SDU Data Buffer Released event. */ +typedef struct +{ + ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice + returns SDU data buffers supplied by the application, which have + not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or + @ref BLE_L2CAP_EVT_CH_TX event. */ +} ble_l2cap_evt_ch_sdu_buf_released_t; + +/**@brief L2CAP Channel Credit received event. */ +typedef struct +{ + uint16_t credits; /**< Additional credits given by the peer. */ +} ble_l2cap_evt_ch_credit_t; + +/**@brief L2CAP Channel received SDU event. */ +typedef struct +{ + uint16_t sdu_len; /**< Total SDU length, in bytes. */ + ble_data_t sdu_buf; /**< SDU data buffer. + @note If there is not enough space in the buffer + (sdu_buf.len < sdu_len) then the rest of the SDU will be + silently discarded by the SoftDevice. */ +} ble_l2cap_evt_ch_rx_t; + +/**@brief L2CAP Channel transmitted SDU event. */ +typedef struct +{ + ble_data_t sdu_buf; /**< SDU data buffer. */ +} ble_l2cap_evt_ch_tx_t; + +/**@brief L2CAP event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which the event occured. */ + uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or + @ref BLE_L2CAP_CID_INVALID if not present. */ + union + { + ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ + ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ + ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ + ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ + ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ + ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ + ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ + } params; /**< Event Parameters. */ +} ble_l2cap_evt_t; + +/** @} */ + +/**@addtogroup BLE_L2CAP_FUNCTIONS Functions + * @{ */ + +/**@brief Set up an L2CAP channel. + * + * @details This function is used to: + * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. + * - Reply to a setup request of an L2CAP channel (if called in response to a + * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection + * Response packet to a peer. + * + * @note A call to this function will require the application to keep the SDU data buffer alive + * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or + * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} + * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: + * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP + * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST + * event when replying to a setup request of an L2CAP channel. + * - As output: local_cid for this channel. + * @param[in] p_params L2CAP channel parameters. + * + * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, + * see @ref ble_l2cap_conn_cfg_t::ch_count. + */ +SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); + +/**@brief Release an L2CAP channel. + * + * @details This sends a Disconnection Request packet to a peer. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * + * @retval ::NRF_SUCCESS Successfully queued request for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for the L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + */ +SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); + +/**@brief Receive an SDU on an L2CAP channel. + * + * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. + * + * @note A call to this function will require the application to keep the memory pointed by + * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX + * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers + * for reception per L2CAP channel. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * @param[in] p_sdu_buf Pointer to the SDU data buffer. + * + * @retval ::NRF_SUCCESS Buffer accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for an L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a + * @ref BLE_L2CAP_EVT_CH_RX event and retry. + */ +SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); + +/**@brief Transmit an SDU on an L2CAP channel. + * + * @note A call to this function will require the application to keep the memory pointed by + * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX + * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for + * transmission per L2CAP channel. + * + * @note The application can keep track of the available credits for transmission by following + * the procedure below: + * - Store initial credits given by the peer in a variable. + * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) + * - Decrement the variable, which stores the currently available credits, by + * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns + * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) + * - Increment the variable, which stores the currently available credits, by additional + * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * @param[in] p_sdu_buf Pointer to the SDU data buffer. + * + * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for the L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than + * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in + * @ref BLE_L2CAP_EVT_CH_SETUP event. + * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a + * @ref BLE_L2CAP_EVT_CH_TX event and retry. + */ +SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); + +/**@brief Advanced SDU reception flow control. + * + * @details Adjust the way the SoftDevice issues credits to the peer. + * This may issue additional credits to the peer using an LE Flow Control Credit packet. + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set + * the value that will be used for newly created channels. + * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every + * time it starts using a new reception buffer. + * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will + * use if this function is not called. + * - If set to zero, the SoftDevice will stop issuing credits for new reception + * buffers the application provides or has provided. SDU reception that is + * currently ongoing will be allowed to complete. + * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be + * written by the SoftDevice with the number of credits that is or will be + * available to the peer. If the value written by the SoftDevice is 0 when + * credits parameter was set to 0, the peer will not be able to send more + * data until more credits are provided by calling this function again with + * credits > 0. This parameter is ignored when local_cid is set to + * @ref BLE_L2CAP_CID_INVALID. + * + * @note Application should take care when setting number of credits higher than default value. In + * this case the application must make sure that the SoftDevice always has reception buffers + * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have + * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic + * on the connection handle may be stalled until the SoftDevice again has an available + * reception buffer. This applies even if the application has used this call to set the + * credits back to default, or zero. + * + * @retval ::NRF_SUCCESS Flow control parameters accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for an L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + */ +SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_L2CAP_H__ + +/** + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_ranges.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_ranges.h new file mode 100644 index 0000000..0935bca --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_ranges.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @defgroup ble_ranges Module specific SVC, event and option number subranges + @{ + + @brief Definition of SVC, event and option number subranges for each API module. + + @note + SVCs, event and option numbers are split into subranges for each API module. + Each module receives its entire allocated range of SVC calls, whether implemented or not, + but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range. + + Note that the symbols BLE__SVC_LAST is the end of the allocated SVC range, + rather than the last SVC function call actually defined and implemented. + + Specific SVC, event and option values are defined in each module's ble_.h file, + which defines names of each individual SVC code based on the range start value. +*/ + +#ifndef BLE_RANGES_H__ +#define BLE_RANGES_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_SVC_BASE 0x60 /**< Common BLE SVC base. */ +#define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ + +#define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ +#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ + +#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ +#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ + +#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ +#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ + +#define BLE_L2CAP_SVC_BASE 0xB8 /**< L2CAP BLE SVC base. */ +#define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ + + +#define BLE_EVT_INVALID 0x00 /**< Invalid BLE Event. */ + +#define BLE_EVT_BASE 0x01 /**< Common BLE Event base. */ +#define BLE_EVT_LAST 0x0F /**< Common BLE Event last. */ + +#define BLE_GAP_EVT_BASE 0x10 /**< GAP BLE Event base. */ +#define BLE_GAP_EVT_LAST 0x2F /**< GAP BLE Event last. */ + +#define BLE_GATTC_EVT_BASE 0x30 /**< GATTC BLE Event base. */ +#define BLE_GATTC_EVT_LAST 0x4F /**< GATTC BLE Event last. */ + +#define BLE_GATTS_EVT_BASE 0x50 /**< GATTS BLE Event base. */ +#define BLE_GATTS_EVT_LAST 0x6F /**< GATTS BLE Event last. */ + +#define BLE_L2CAP_EVT_BASE 0x70 /**< L2CAP BLE Event base. */ +#define BLE_L2CAP_EVT_LAST 0x8F /**< L2CAP BLE Event last. */ + + +#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */ + +#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */ +#define BLE_OPT_LAST 0x1F /**< Common BLE Option last. */ + +#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */ +#define BLE_GAP_OPT_LAST 0x3F /**< GAP BLE Option last. */ + +#define BLE_GATT_OPT_BASE 0x40 /**< GATT BLE Option base. */ +#define BLE_GATT_OPT_LAST 0x5F /**< GATT BLE Option last. */ + +#define BLE_GATTC_OPT_BASE 0x60 /**< GATTC BLE Option base. */ +#define BLE_GATTC_OPT_LAST 0x7F /**< GATTC BLE Option last. */ + +#define BLE_GATTS_OPT_BASE 0x80 /**< GATTS BLE Option base. */ +#define BLE_GATTS_OPT_LAST 0x9F /**< GATTS BLE Option last. */ + +#define BLE_L2CAP_OPT_BASE 0xA0 /**< L2CAP BLE Option base. */ +#define BLE_L2CAP_OPT_LAST 0xBF /**< L2CAP BLE Option last. */ + + +#define BLE_CFG_INVALID 0x00 /**< Invalid BLE configuration. */ + +#define BLE_CFG_BASE 0x01 /**< Common BLE configuration base. */ +#define BLE_CFG_LAST 0x1F /**< Common BLE configuration last. */ + +#define BLE_CONN_CFG_BASE 0x20 /**< BLE connection configuration base. */ +#define BLE_CONN_CFG_LAST 0x3F /**< BLE connection configuration last. */ + +#define BLE_GAP_CFG_BASE 0x40 /**< GAP BLE configuration base. */ +#define BLE_GAP_CFG_LAST 0x5F /**< GAP BLE configuration last. */ + +#define BLE_GATT_CFG_BASE 0x60 /**< GATT BLE configuration base. */ +#define BLE_GATT_CFG_LAST 0x7F /**< GATT BLE configuration last. */ + +#define BLE_GATTC_CFG_BASE 0x80 /**< GATTC BLE configuration base. */ +#define BLE_GATTC_CFG_LAST 0x9F /**< GATTC BLE configuration last. */ + +#define BLE_GATTS_CFG_BASE 0xA0 /**< GATTS BLE configuration base. */ +#define BLE_GATTS_CFG_LAST 0xBF /**< GATTS BLE configuration last. */ + +#define BLE_L2CAP_CFG_BASE 0xC0 /**< L2CAP BLE configuration base. */ +#define BLE_L2CAP_CFG_LAST 0xDF /**< L2CAP BLE configuration last. */ + + + + + +#ifdef __cplusplus +} +#endif +#endif /* BLE_RANGES_H__ */ + +/** + @} + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_types.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_types.h new file mode 100644 index 0000000..88c9318 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble_types.h @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @defgroup ble_types Common types and macro definitions + @{ + + @brief Common types and macro definitions for the BLE SoftDevice. + */ + +#ifndef BLE_TYPES_H__ +#define BLE_TYPES_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_TYPES_DEFINES Defines + * @{ */ + +/** @defgroup BLE_CONN_HANDLES BLE Connection Handles + * @{ */ +#define BLE_CONN_HANDLE_INVALID 0xFFFF /**< Invalid Connection Handle. */ +#define BLE_CONN_HANDLE_ALL 0xFFFE /**< Applies to all Connection Handles. */ +/** @} */ + + +/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs + * @{ */ +/* Generic UUIDs, applicable to all services */ +#define BLE_UUID_UNKNOWN 0x0000 /**< Reserved UUID. */ +#define BLE_UUID_SERVICE_PRIMARY 0x2800 /**< Primary Service. */ +#define BLE_UUID_SERVICE_SECONDARY 0x2801 /**< Secondary Service. */ +#define BLE_UUID_SERVICE_INCLUDE 0x2802 /**< Include. */ +#define BLE_UUID_CHARACTERISTIC 0x2803 /**< Characteristic. */ +#define BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP 0x2900 /**< Characteristic Extended Properties Descriptor. */ +#define BLE_UUID_DESCRIPTOR_CHAR_USER_DESC 0x2901 /**< Characteristic User Description Descriptor. */ +#define BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG 0x2902 /**< Client Characteristic Configuration Descriptor. */ +#define BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG 0x2903 /**< Server Characteristic Configuration Descriptor. */ +#define BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT 0x2904 /**< Characteristic Presentation Format Descriptor. */ +#define BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT 0x2905 /**< Characteristic Aggregate Format Descriptor. */ +/* GATT specific UUIDs */ +#define BLE_UUID_GATT 0x1801 /**< Generic Attribute Profile. */ +#define BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED 0x2A05 /**< Service Changed Characteristic. */ +/* GAP specific UUIDs */ +#define BLE_UUID_GAP 0x1800 /**< Generic Access Profile. */ +#define BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME 0x2A00 /**< Device Name Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE 0x2A01 /**< Appearance Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_CAR 0x2AA6 /**< Central Address Resolution Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ +/** @} */ + + +/** @defgroup BLE_UUID_TYPES Types of UUID + * @{ */ +#define BLE_UUID_TYPE_UNKNOWN 0x00 /**< Invalid UUID type. */ +#define BLE_UUID_TYPE_BLE 0x01 /**< Bluetooth SIG UUID (16-bit). */ +#define BLE_UUID_TYPE_VENDOR_BEGIN 0x02 /**< Vendor UUID types start at this index (128-bit). */ +/** @} */ + + +/** @defgroup BLE_APPEARANCES Bluetooth Appearance values + * @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml + * @{ */ +#define BLE_APPEARANCE_UNKNOWN 0 /**< Unknown. */ +#define BLE_APPEARANCE_GENERIC_PHONE 64 /**< Generic Phone. */ +#define BLE_APPEARANCE_GENERIC_COMPUTER 128 /**< Generic Computer. */ +#define BLE_APPEARANCE_GENERIC_WATCH 192 /**< Generic Watch. */ +#define BLE_APPEARANCE_WATCH_SPORTS_WATCH 193 /**< Watch: Sports Watch. */ +#define BLE_APPEARANCE_GENERIC_CLOCK 256 /**< Generic Clock. */ +#define BLE_APPEARANCE_GENERIC_DISPLAY 320 /**< Generic Display. */ +#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL 384 /**< Generic Remote Control. */ +#define BLE_APPEARANCE_GENERIC_EYE_GLASSES 448 /**< Generic Eye-glasses. */ +#define BLE_APPEARANCE_GENERIC_TAG 512 /**< Generic Tag. */ +#define BLE_APPEARANCE_GENERIC_KEYRING 576 /**< Generic Keyring. */ +#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 640 /**< Generic Media Player. */ +#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 704 /**< Generic Barcode Scanner. */ +#define BLE_APPEARANCE_GENERIC_THERMOMETER 768 /**< Generic Thermometer. */ +#define BLE_APPEARANCE_THERMOMETER_EAR 769 /**< Thermometer: Ear. */ +#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR 832 /**< Generic Heart rate Sensor. */ +#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT 833 /**< Heart Rate Sensor: Heart Rate Belt. */ +#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 896 /**< Generic Blood Pressure. */ +#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM 897 /**< Blood Pressure: Arm. */ +#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 898 /**< Blood Pressure: Wrist. */ +#define BLE_APPEARANCE_GENERIC_HID 960 /**< Human Interface Device (HID). */ +#define BLE_APPEARANCE_HID_KEYBOARD 961 /**< Keyboard (HID Subtype). */ +#define BLE_APPEARANCE_HID_MOUSE 962 /**< Mouse (HID Subtype). */ +#define BLE_APPEARANCE_HID_JOYSTICK 963 /**< Joystick (HID Subtype). */ +#define BLE_APPEARANCE_HID_GAMEPAD 964 /**< Gamepad (HID Subtype). */ +#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE 965 /**< Digitizer Tablet (HID Subtype). */ +#define BLE_APPEARANCE_HID_CARD_READER 966 /**< Card Reader (HID Subtype). */ +#define BLE_APPEARANCE_HID_DIGITAL_PEN 967 /**< Digital Pen (HID Subtype). */ +#define BLE_APPEARANCE_HID_BARCODE 968 /**< Barcode Scanner (HID Subtype). */ +#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER 1024 /**< Generic Glucose Meter. */ +#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR 1088 /**< Generic Running Walking Sensor. */ +#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE 1089 /**< Running Walking Sensor: In-Shoe. */ +#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE 1090 /**< Running Walking Sensor: On-Shoe. */ +#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP 1091 /**< Running Walking Sensor: On-Hip. */ +#define BLE_APPEARANCE_GENERIC_CYCLING 1152 /**< Generic Cycling. */ +#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER 1153 /**< Cycling: Cycling Computer. */ +#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR 1154 /**< Cycling: Speed Sensor. */ +#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR 1155 /**< Cycling: Cadence Sensor. */ +#define BLE_APPEARANCE_CYCLING_POWER_SENSOR 1156 /**< Cycling: Power Sensor. */ +#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR 1157 /**< Cycling: Speed and Cadence Sensor. */ +#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 3136 /**< Generic Pulse Oximeter. */ +#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 3137 /**< Fingertip (Pulse Oximeter subtype). */ +#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN 3138 /**< Wrist Worn(Pulse Oximeter subtype). */ +#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE 3200 /**< Generic Weight Scale. */ +#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT 5184 /**< Generic Outdoor Sports Activity. */ +#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP 5185 /**< Location Display Device (Outdoor Sports Activity subtype). */ +#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */ +#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD 5187 /**< Location Pod (Outdoor Sports Activity subtype). */ +#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD 5188 /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */ +/** @} */ + +/** @brief Set .type and .uuid fields of ble_uuid_struct to specified UUID value. */ +#define BLE_UUID_BLE_ASSIGN(instance, value) do {\ + instance.type = BLE_UUID_TYPE_BLE; \ + instance.uuid = value;} while(0) + +/** @brief Copy type and uuid members from src to dst ble_uuid_t pointer. Both pointers must be valid/non-null. */ +#define BLE_UUID_COPY_PTR(dst, src) do {\ + (dst)->type = (src)->type; \ + (dst)->uuid = (src)->uuid;} while(0) + +/** @brief Copy type and uuid members from src to dst ble_uuid_t struct. */ +#define BLE_UUID_COPY_INST(dst, src) do {\ + (dst).type = (src).type; \ + (dst).uuid = (src).uuid;} while(0) + +/** @brief Compare for equality both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ +#define BLE_UUID_EQ(p_uuid1, p_uuid2) \ + (((p_uuid1)->type == (p_uuid2)->type) && ((p_uuid1)->uuid == (p_uuid2)->uuid)) + +/** @brief Compare for difference both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ +#define BLE_UUID_NEQ(p_uuid1, p_uuid2) \ + (((p_uuid1)->type != (p_uuid2)->type) || ((p_uuid1)->uuid != (p_uuid2)->uuid)) + +/** @} */ + +/** @addtogroup BLE_TYPES_STRUCTURES Structures + * @{ */ + +/** @brief 128 bit UUID values. */ +typedef struct +{ + uint8_t uuid128[16]; /**< Little-Endian UUID bytes. */ +} ble_uuid128_t; + +/** @brief Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */ +typedef struct +{ + uint16_t uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */ + uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */ +} ble_uuid_t; + +/**@brief Data structure. */ +typedef struct +{ + uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ + uint16_t len; /**< Length of the data buffer, in bytes. */ +} ble_data_t; + +/** @} */ +#ifdef __cplusplus +} +#endif + +#endif /* BLE_TYPES_H__ */ + +/** + @} + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf52/nrf_mbr.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf52/nrf_mbr.h new file mode 100644 index 0000000..389cc37 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf52/nrf_mbr.h @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @defgroup nrf_mbr_api Master Boot Record API + @{ + + @brief APIs for updating SoftDevice and BootLoader + +*/ + +#ifndef NRF_MBR_H__ +#define NRF_MBR_H__ + +#include "nrf_svc.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup NRF_MBR_DEFINES Defines + * @{ */ + +/**@brief MBR SVC Base number. */ +#define MBR_SVC_BASE (0x18) + +/**@brief Page size in words. */ +#define MBR_PAGE_SIZE_IN_WORDS (1024) + +/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. +This is the offset where the first byte of the SoftDevice hex file is written. */ +#define MBR_SIZE (0x1000) + +/** @brief Location (in the flash memory) of the bootloader address. */ +#define MBR_BOOTLOADER_ADDR (0xFF8) + +/** @brief Location (in UICR) of the bootloader address. */ +#define MBR_UICR_BOOTLOADER_ADDR (&(NRF_UICR->NRFFW[0])) + +/** @brief Location (in the flash memory) of the address of the MBR parameter page. */ +#define MBR_PARAM_PAGE_ADDR (0xFFC) + +/** @brief Location (in UICR) of the address of the MBR parameter page. */ +#define MBR_UICR_PARAM_PAGE_ADDR (&(NRF_UICR->NRFFW[1])) + + +/** @} */ + +/** @addtogroup NRF_MBR_ENUMS Enumerations + * @{ */ + +/**@brief nRF Master Boot Record API SVC numbers. */ +enum NRF_MBR_SVCS +{ + SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ +}; + +/**@brief Possible values for ::sd_mbr_command_t.command */ +enum NRF_MBR_COMMANDS +{ + SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ + SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ + SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ + SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ + SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ + SD_MBR_COMMAND_RESERVED, + SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ +}; + +/** @} */ + +/** @addtogroup NRF_MBR_TYPES Types + * @{ */ + +/**@brief This command copies part of a new SoftDevice + * + * The destination area is erased before copying. + * If dst is in the middle of a flash page, that whole flash page will be erased. + * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. + * + * The user of this function is responsible for setting the BPROT registers. + * + * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. + * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. + */ +typedef struct +{ + uint32_t *src; /**< Pointer to the source of data to be copied.*/ + uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ + uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ +} sd_mbr_command_copy_sd_t; + + +/**@brief This command works like memcmp, but takes the length in words. + * + * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. + * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. + */ +typedef struct +{ + uint32_t *ptr1; /**< Pointer to block of memory. */ + uint32_t *ptr2; /**< Pointer to block of memory. */ + uint32_t len; /**< Number of 32 bit words to compare.*/ +} sd_mbr_command_compare_t; + + +/**@brief This command copies a new BootLoader. + * + * The MBR assumes that either @ref MBR_BOOTLOADER_ADDR or @ref MBR_UICR_BOOTLOADER_ADDR is set to + * the address where the bootloader will be copied. If both addresses are set, the MBR will prioritize + * @ref MBR_BOOTLOADER_ADDR. + * + * The bootloader destination is erased by this function. + * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. + * + * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set, + * see @ref sd_mbr_command. + * + * This command will use the flash protect peripheral (BPROT or ACL) to protect the flash that is + * not intended to be written. + * + * On success, this function will not return. It will start the new bootloader from reset-vector as normal. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_FORBIDDEN if the bootloader address is not set. + * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. + * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command. + */ +typedef struct +{ + uint32_t *bl_src; /**< Pointer to the source of the bootloader to be be copied.*/ + uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ +} sd_mbr_command_copy_bl_t; + +/**@brief Change the address the MBR starts after a reset + * + * Once this function has been called, this address is where the MBR will start to forward + * interrupts to after a reset. + * + * To restore default forwarding, this function should be called with @ref address set to 0. If a + * bootloader is present, interrupts will be forwarded to the bootloader. If not, interrupts will + * be forwarded to the SoftDevice. + * + * The location of a bootloader can be specified in @ref MBR_BOOTLOADER_ADDR or + * @ref MBR_UICR_BOOTLOADER_ADDR. If both addresses are set, the MBR will prioritize + * @ref MBR_BOOTLOADER_ADDR. + * + * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set, + * see @ref sd_mbr_command. + * + * On success, this function will not return. It will reset the device. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. + * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command. + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_vector_table_base_set_t; + +/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR + * + * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not + * change where the MBR starts after reset. + * + * @retval ::NRF_SUCCESS + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_irq_forward_address_set_t; + +/**@brief Input structure containing data used when calling ::sd_mbr_command + * + * Depending on what command value that is set, the corresponding params value type must also be + * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command + * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. + */ +typedef struct +{ + uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ + union + { + sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ + sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ + sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ + sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ + sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ + } params; /**< Command parameters. */ +} sd_mbr_command_t; + +/** @} */ + +/** @addtogroup NRF_MBR_FUNCTIONS Functions + * @{ */ + +/**@brief Issue Master Boot Record commands + * + * Commands used when updating a SoftDevice and bootloader. + * + * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires + * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash + * page. The location of the flash page should be provided by the application in either + * @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR. If both addresses are set, the MBR + * will prioritize @ref MBR_PARAM_PAGE_ADDR. This page will be cleared by the MBR and is used to + * store the command before reset. When an address is specified, the page it refers to must not be + * used by the application. If no address is provided by the application, i.e. both + * @ref MBR_PARAM_PAGE_ADDR and @ref MBR_UICR_PARAM_PAGE_ADDR is 0xFFFFFFFF, MBR commands which use + * flash will be unavailable and return @ref NRF_ERROR_NO_MEM. + * + * @param[in] param Pointer to a struct describing the command. + * + * @note For a complete set of return values, see ::sd_mbr_command_copy_sd_t, + * ::sd_mbr_command_copy_bl_t, ::sd_mbr_command_compare_t, + * ::sd_mbr_command_vector_table_base_set_t, ::sd_mbr_command_irq_forward_address_set_t + * + * @retval ::NRF_ERROR_NO_MEM No MBR parameter page provided + * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. +*/ +SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_MBR_H__ + +/** + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error.h new file mode 100644 index 0000000..6badee9 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /** + @defgroup nrf_error SoftDevice Global Error Codes + @{ + + @brief Global Error definitions +*/ + +/* Header guard */ +#ifndef NRF_ERROR_H__ +#define NRF_ERROR_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions + * @{ */ +#define NRF_ERROR_BASE_NUM (0x0) ///< Global error base +#define NRF_ERROR_SDM_BASE_NUM (0x1000) ///< SDM error base +#define NRF_ERROR_SOC_BASE_NUM (0x2000) ///< SoC error base +#define NRF_ERROR_STK_BASE_NUM (0x3000) ///< STK error base +/** @} */ + +#define NRF_SUCCESS (NRF_ERROR_BASE_NUM + 0) ///< Successful command +#define NRF_ERROR_SVC_HANDLER_MISSING (NRF_ERROR_BASE_NUM + 1) ///< SVC handler is missing +#define NRF_ERROR_SOFTDEVICE_NOT_ENABLED (NRF_ERROR_BASE_NUM + 2) ///< SoftDevice has not been enabled +#define NRF_ERROR_INTERNAL (NRF_ERROR_BASE_NUM + 3) ///< Internal Error +#define NRF_ERROR_NO_MEM (NRF_ERROR_BASE_NUM + 4) ///< No Memory for operation +#define NRF_ERROR_NOT_FOUND (NRF_ERROR_BASE_NUM + 5) ///< Not found +#define NRF_ERROR_NOT_SUPPORTED (NRF_ERROR_BASE_NUM + 6) ///< Not supported +#define NRF_ERROR_INVALID_PARAM (NRF_ERROR_BASE_NUM + 7) ///< Invalid Parameter +#define NRF_ERROR_INVALID_STATE (NRF_ERROR_BASE_NUM + 8) ///< Invalid state, operation disallowed in this state +#define NRF_ERROR_INVALID_LENGTH (NRF_ERROR_BASE_NUM + 9) ///< Invalid Length +#define NRF_ERROR_INVALID_FLAGS (NRF_ERROR_BASE_NUM + 10) ///< Invalid Flags +#define NRF_ERROR_INVALID_DATA (NRF_ERROR_BASE_NUM + 11) ///< Invalid Data +#define NRF_ERROR_DATA_SIZE (NRF_ERROR_BASE_NUM + 12) ///< Invalid Data size +#define NRF_ERROR_TIMEOUT (NRF_ERROR_BASE_NUM + 13) ///< Operation timed out +#define NRF_ERROR_NULL (NRF_ERROR_BASE_NUM + 14) ///< Null Pointer +#define NRF_ERROR_FORBIDDEN (NRF_ERROR_BASE_NUM + 15) ///< Forbidden Operation +#define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address +#define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy +#define NRF_ERROR_CONN_COUNT (NRF_ERROR_BASE_NUM + 18) ///< Maximum connection count exceeded. +#define NRF_ERROR_RESOURCES (NRF_ERROR_BASE_NUM + 19) ///< Not enough resources for operation + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_H__ + +/** + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error_sdm.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error_sdm.h new file mode 100644 index 0000000..530959b --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error_sdm.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /** + @addtogroup nrf_sdm_api + @{ + @defgroup nrf_sdm_error SoftDevice Manager Error Codes + @{ + + @brief Error definitions for the SDM API +*/ + +/* Header guard */ +#ifndef NRF_ERROR_SDM_H__ +#define NRF_ERROR_SDM_H__ + +#include "nrf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. +#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). +#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_SDM_H__ + +/** + @} + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error_soc.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error_soc.h new file mode 100644 index 0000000..1e784b8 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_error_soc.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup nrf_soc_api + @{ + @defgroup nrf_soc_error SoC Library Error Codes + @{ + + @brief Error definitions for the SoC library + +*/ + +/* Header guard */ +#ifndef NRF_ERROR_SOC_H__ +#define NRF_ERROR_SOC_H__ + +#include "nrf_error.h" +#ifdef __cplusplus +extern "C" { +#endif + +/* Mutex Errors */ +#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken + +/* NVIC errors */ +#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available +#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed +#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return + +/* Power errors */ +#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown +#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown +#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return + +/* Rand errors */ +#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values + +/* PPI errors */ +#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel +#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_SOC_H__ +/** + @} + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_nvic.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_nvic.h new file mode 100644 index 0000000..1f79cc3 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_nvic.h @@ -0,0 +1,491 @@ +/* + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @defgroup nrf_nvic_api SoftDevice NVIC API + * @{ + * + * @note In order to use this module, the following code has to be added to a .c file: + * \code + * nrf_nvic_state_t nrf_nvic_state = {0}; + * \endcode + * + * @note Definitions and declarations starting with __ (double underscore) in this header file are + * not intended for direct use by the application. + * + * @brief APIs for the accessing NVIC when using a SoftDevice. + * + */ + +#ifndef NRF_NVIC_H__ +#define NRF_NVIC_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "nrf_error_soc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup NRF_NVIC_DEFINES Defines + * @{ */ + +/**@defgroup NRF_NVIC_ISER_DEFINES SoftDevice NVIC internal definitions + * @{ */ + +#define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */ + +#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ + +/**@brief Interrupt priority levels used by the SoftDevice. */ +#define __NRF_NVIC_SD_IRQ_PRIOS ((uint8_t)( \ + (1U << 0) /**< Priority level high .*/ \ + | (1U << 1) /**< Priority level medium. */ \ + | (1U << 4) /**< Priority level low. */ \ + )) + +/**@brief Interrupt priority levels available to the application. */ +#define __NRF_NVIC_APP_IRQ_PRIOS ((uint8_t)~__NRF_NVIC_SD_IRQ_PRIOS) + +/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ +#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ + (1U << POWER_CLOCK_IRQn) \ + | (1U << RADIO_IRQn) \ + | (1U << RTC0_IRQn) \ + | (1U << TIMER0_IRQn) \ + | (1U << RNG_IRQn) \ + | (1U << ECB_IRQn) \ + | (1U << CCM_AAR_IRQn) \ + | (1U << TEMP_IRQn) \ + | (1U << __NRF_NVIC_NVMC_IRQn) \ + | (1U << (uint32_t)SWI5_IRQn) \ + )) + +/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ +#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) + +/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ +#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) + +/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ +#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) + +/**@} */ + +/**@} */ + +/**@addtogroup NRF_NVIC_VARIABLES Variables + * @{ */ + +/**@brief Type representing the state struct for the SoftDevice NVIC module. */ +typedef struct +{ + uint32_t volatile __irq_masks[__NRF_NVIC_ISER_COUNT]; /**< IRQs enabled by the application in the NVIC. */ + uint32_t volatile __cr_flag; /**< Non-zero if already in a critical region */ +} nrf_nvic_state_t; + +/**@brief Variable keeping the state for the SoftDevice NVIC module. This must be declared in an + * application source file. */ +extern nrf_nvic_state_t nrf_nvic_state; + +/**@} */ + +/**@addtogroup NRF_NVIC_INTERNAL_FUNCTIONS SoftDevice NVIC internal functions + * @{ */ + +/**@brief Disables IRQ interrupts globally, including the SoftDevice's interrupts. + * + * @retval The value of PRIMASK prior to disabling the interrupts. + */ +__STATIC_INLINE int __sd_nvic_irq_disable(void); + +/**@brief Enables IRQ interrupts globally, including the SoftDevice's interrupts. + */ +__STATIC_INLINE void __sd_nvic_irq_enable(void); + +/**@brief Checks if IRQn is available to application + * @param[in] IRQn IRQ to check + * + * @retval 1 (true) if the IRQ to check is available to the application + */ +__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn); + +/**@brief Checks if priority is available to application + * @param[in] priority priority to check + * + * @retval 1 (true) if the priority to check is available to the application + */ +__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority); + +/**@} */ + +/**@addtogroup NRF_NVIC_FUNCTIONS SoftDevice NVIC public functions + * @{ */ + +/**@brief Enable External Interrupt. + * @note Corresponds to NVIC_EnableIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_EnableIRQ documentation in CMSIS. + * + * @retval ::NRF_SUCCESS The interrupt was enabled. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt has a priority not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn); + +/**@brief Disable External Interrupt. + * @note Corresponds to NVIC_DisableIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_DisableIRQ documentation in CMSIS. + * + * @retval ::NRF_SUCCESS The interrupt was disabled. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn); + +/**@brief Get Pending Interrupt. + * @note Corresponds to NVIC_GetPendingIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_GetPendingIRQ documentation in CMSIS. + * @param[out] p_pending_irq Return value from NVIC_GetPendingIRQ. + * + * @retval ::NRF_SUCCESS The interrupt is available for the application. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq); + +/**@brief Set Pending Interrupt. + * @note Corresponds to NVIC_SetPendingIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_SetPendingIRQ documentation in CMSIS. + * + * @retval ::NRF_SUCCESS The interrupt is set pending. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn); + +/**@brief Clear Pending Interrupt. + * @note Corresponds to NVIC_ClearPendingIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_ClearPendingIRQ documentation in CMSIS. + * + * @retval ::NRF_SUCCESS The interrupt pending flag is cleared. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn); + +/**@brief Set Interrupt Priority. + * @note Corresponds to NVIC_SetPriority in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * @pre Priority is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_SetPriority documentation in CMSIS. + * @param[in] priority A valid IRQ priority for use by the application. + * + * @retval ::NRF_SUCCESS The interrupt and priority level is available for the application. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt priority is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority); + +/**@brief Get Interrupt Priority. + * @note Corresponds to NVIC_GetPriority in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_GetPriority documentation in CMSIS. + * @param[out] p_priority Return value from NVIC_GetPriority. + * + * @retval ::NRF_SUCCESS The interrupt priority is returned in p_priority. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE - IRQn is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority); + +/**@brief System Reset. + * @note Corresponds to NVIC_SystemReset in CMSIS. + * + * @retval ::NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN + */ +__STATIC_INLINE uint32_t sd_nvic_SystemReset(void); + +/**@brief Enter critical region. + * + * @post Application interrupts will be disabled. + * @note sd_nvic_critical_region_enter() and ::sd_nvic_critical_region_exit() must be called in matching pairs inside each + * execution context + * @sa sd_nvic_critical_region_exit + * + * @param[out] p_is_nested_critical_region If 1, the application is now in a nested critical region. + * + * @retval ::NRF_SUCCESS + */ +__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region); + +/**@brief Exit critical region. + * + * @pre Application has entered a critical region using ::sd_nvic_critical_region_enter. + * @post If not in a nested critical region, the application interrupts will restored to the state before ::sd_nvic_critical_region_enter was called. + * + * @param[in] is_nested_critical_region If this is set to 1, the critical region won't be exited. @sa sd_nvic_critical_region_enter. + * + * @retval ::NRF_SUCCESS + */ +__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region); + +/**@} */ + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE int __sd_nvic_irq_disable(void) +{ + int pm = __get_PRIMASK(); + __disable_irq(); + return pm; +} + +__STATIC_INLINE void __sd_nvic_irq_enable(void) +{ + __enable_irq(); +} + +__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) +{ + if (IRQn < 32) + { + return ((1UL<= (1 << __NVIC_PRIO_BITS)) + || (((1 << priority) & __NRF_NVIC_APP_IRQ_PRIOS) == 0) + ) + { + return 0; + } + return 1; +} + + +__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn) +{ + if (!__sd_nvic_app_accessible_irq(IRQn)) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } + if (!__sd_nvic_is_app_accessible_priority(NVIC_GetPriority(IRQn))) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; + } + + if (nrf_nvic_state.__cr_flag) + { + nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] |= (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); + } + else + { + NVIC_EnableIRQ(IRQn); + } + return NRF_SUCCESS; +} + +__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn) +{ + if (!__sd_nvic_app_accessible_irq(IRQn)) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } + + if (nrf_nvic_state.__cr_flag) + { + nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] &= ~(1UL << ((uint32_t)(IRQn) & 0x1F)); + } + else + { + NVIC_DisableIRQ(IRQn); + } + + return NRF_SUCCESS; +} + +__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq) +{ + if (__sd_nvic_app_accessible_irq(IRQn)) + { + *p_pending_irq = NVIC_GetPendingIRQ(IRQn); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } +} + +__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn) +{ + if (__sd_nvic_app_accessible_irq(IRQn)) + { + NVIC_SetPendingIRQ(IRQn); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } +} + +__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn) +{ + if (__sd_nvic_app_accessible_irq(IRQn)) + { + NVIC_ClearPendingIRQ(IRQn); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } +} + +__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if (!__sd_nvic_app_accessible_irq(IRQn)) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } + + if (!__sd_nvic_is_app_accessible_priority(priority)) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; + } + + NVIC_SetPriority(IRQn, (uint32_t)priority); + return NRF_SUCCESS; +} + +__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority) +{ + if (__sd_nvic_app_accessible_irq(IRQn)) + { + *p_priority = (NVIC_GetPriority(IRQn) & 0xFF); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } +} + +__STATIC_INLINE uint32_t sd_nvic_SystemReset(void) +{ + NVIC_SystemReset(); + return NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN; +} + +__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region) +{ + int was_masked = __sd_nvic_irq_disable(); + if (!nrf_nvic_state.__cr_flag) + { + nrf_nvic_state.__cr_flag = 1; + nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 ); + NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; + nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); + NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; + *p_is_nested_critical_region = 0; + } + else + { + *p_is_nested_critical_region = 1; + } + if (!was_masked) + { + __sd_nvic_irq_enable(); + } + return NRF_SUCCESS; +} + +__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region) +{ + if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0)) + { + int was_masked = __sd_nvic_irq_disable(); + NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; + NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; + nrf_nvic_state.__cr_flag = 0; + if (!was_masked) + { + __sd_nvic_irq_enable(); + } + } + + return NRF_SUCCESS; +} + +#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ + +#ifdef __cplusplus +} +#endif + +#endif // NRF_NVIC_H__ + +/**@} */ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_sdm.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_sdm.h new file mode 100644 index 0000000..c0e0eec --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_sdm.h @@ -0,0 +1,367 @@ +/* + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @defgroup nrf_sdm_api SoftDevice Manager API + @{ + + @brief APIs for SoftDevice management. + +*/ + +#ifndef NRF_SDM_H__ +#define NRF_SDM_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "nrf_error_sdm.h" +#include "nrf_soc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup NRF_SDM_DEFINES Defines + * @{ */ +#ifdef NRFSOC_DOXYGEN +/// Declared in nrf_mbr.h +#define MBR_SIZE 0 +#warning test +#endif + +/** @brief The major version for the SoftDevice binary distributed with this header file. */ +#define SD_MAJOR_VERSION (6) + +/** @brief The minor version for the SoftDevice binary distributed with this header file. */ +#define SD_MINOR_VERSION (1) + +/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ +#define SD_BUGFIX_VERSION (1) + +/** @brief The SoftDevice variant of this firmware. */ +#define SD_VARIANT_ID 132 + +/** @brief The full version number for the SoftDevice binary this header file was distributed + * with, as a decimal number in the form Mmmmbbb, where: + * - M is major version (one or more digits) + * - mmm is minor version (three digits) + * - bbb is bugfix version (three digits). */ +#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION) + +/** @brief SoftDevice Manager SVC Base number. */ +#define SDM_SVC_BASE 0x10 + +/** @brief SoftDevice unique string size in bytes. */ +#define SD_UNIQUE_STR_SIZE 20 + +/** @brief Invalid info field. Returned when an info field does not exist. */ +#define SDM_INFO_FIELD_INVALID (0) + +/** @brief Defines the SoftDevice Information Structure location (address) as an offset from +the start of the SoftDevice (without MBR)*/ +#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) + +/** @brief Defines the absolute SoftDevice Information Structure location (address) when the + * SoftDevice is installed just above the MBR (the usual case). */ +#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE) + +/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the + * SoftDevice base address. The size value is of type uint8_t. */ +#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET) + +/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address. + * The size value is of type uint32_t. */ +#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08) + +/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value + * is of type uint16_t. */ +#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C) + +/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID + * is of type uint32_t. */ +#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10) + +/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in + * the same format as @ref SD_VERSION, stored as an uint32_t. */ +#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) + +/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. + * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. + */ +#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) + +/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value + * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is + * installed just above the MBR (the usual case). */ +#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET))) + +/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base + * address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above + * the MBR (the usual case). */ +#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) + +/** @brief Defines the amount of flash that is used by the SoftDevice. + * Add @ref MBR_SIZE to find the first available flash address when the SoftDevice is installed + * just above the MBR (the usual case). + */ +#define SD_FLASH_SIZE 0x25000 + +/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual + * case). */ +#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) + +/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the + * usual case). */ +#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. + * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR + * (the usual case). */ +#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. + * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR + * (the usual case). */ +#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges + * @{ */ +#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ +#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ +/**@} */ + +/**@defgroup NRF_FAULT_IDS Fault ID types + * @{ */ +#define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ +#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access. The info parameter will contain 0x00000000, + in case of SoftDevice RAM access violation. In case of SoftDevice peripheral + register violation the info parameter will contain the sub-region number of + PREGION[0], on whose address range the disallowed write access caused the + memory access fault. */ +/**@} */ + +/** @} */ + +/** @addtogroup NRF_SDM_ENUMS Enumerations + * @{ */ + +/**@brief nRF SoftDevice Manager API SVC numbers. */ +enum NRF_SD_SVCS +{ + SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */ + SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */ + SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */ + SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */ + SVC_SDM_LAST /**< Placeholder for last SDM SVC */ +}; + +/** @} */ + +/** @addtogroup NRF_SDM_DEFINES Defines + * @{ */ + +/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy + * @{ */ + +#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ +#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ +#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ +#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ +#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ +#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ +#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ +#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ +#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ +#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ +#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ +#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ + +/** @} */ + +/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources + * @{ */ + +#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */ +#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */ +#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */ + +/** @} */ + +/** @} */ + +/** @addtogroup NRF_SDM_TYPES Types + * @{ */ + +/**@brief Type representing LFCLK oscillator source. */ +typedef struct +{ + uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ + uint8_t rc_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second + units (nRF52: 1-32). + @note To avoid excessive clock drift, 0.5 degrees Celsius is the + maximum temperature change allowed in one calibration timer + interval. The interval should be selected to ensure this. + + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. */ + uint8_t rc_temp_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration + intervals) the RC oscillator shall be calibrated if the temperature + hasn't changed. + 0: Always calibrate even if the temperature hasn't changed. + 1: Only calibrate if the temperature has changed (legacy - nRF51 only). + 2-33: Check the temperature and only calibrate if it has changed, + however calibration will take place every rc_temp_ctiv + intervals in any case. + + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. + + @note For nRF52, the application must ensure calibration at least once + every 8 seconds to ensure +/-500 ppm clock stability. The + recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is + rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at + least once every 8 seconds and for temperature changes of 0.5 + degrees Celsius every 4 seconds. See the Product Specification + for the nRF52 device being used for more information.*/ + uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing + windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ +} nrf_clock_lf_cfg_t; + +/**@brief Fault Handler type. + * + * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back. + * The protocol stack will be in an undefined state when this happens and the only way to recover will be to + * perform a reset, using e.g. CMSIS NVIC_SystemReset(). + * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset(). + * + * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback. + * + * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. + * @param[in] pc The program counter of the instruction that triggered the fault. + * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. + * + * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when + * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. + */ +typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); + +/** @} */ + +/** @addtogroup NRF_SDM_FUNCTIONS Functions + * @{ */ + +/**@brief Enables the SoftDevice and by extension the protocol stack. + * + * @note Some care must be taken if a low frequency clock source is already running when calling this function: + * If the LF clock has a different source then the one currently running, it will be stopped. Then, the new + * clock source will be started. + * + * @note This function has no effect when returning with an error. + * + * @post If return code is ::NRF_SUCCESS + * - SoC library and protocol stack APIs are made available. + * - A portion of RAM will be unavailable (see relevant SDS documentation). + * - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation). + * - Interrupts will not arrive from protected peripherals or interrupts. + * - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice. + * - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation). + * - Chosen low frequency clock source will be running. + * + * @param p_clock_lf_cfg Low frequency clock source and accuracy. + If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2 + In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock. + * @param fault_handler Callback to be invoked in case of fault, cannot be NULL. + * + * @retval ::NRF_SUCCESS + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. + * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. + * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. + */ +SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); + + +/**@brief Disables the SoftDevice and by extension the protocol stack. + * + * Idempotent function to disable the SoftDevice. + * + * @post SoC library and protocol stack APIs are made unavailable. + * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest). + * @post All peripherals used by the SoftDevice will be reset to default values. + * @post All of RAM become available. + * @post All interrupts are forwarded to the application. + * @post LFCLK source chosen in ::sd_softdevice_enable will be left running. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void)); + +/**@brief Check if the SoftDevice is enabled. + * + * @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)); + +/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice + * + * This function is only intended to be called when a bootloader is enabled. + * + * @param[in] address The base address of the interrupt vector table for forwarded interrupts. + + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_SDM_H__ + +/** + @} +*/ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_soc.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_soc.h new file mode 100644 index 0000000..d599576 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_soc.h @@ -0,0 +1,1007 @@ +/* + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @defgroup nrf_soc_api SoC Library API + * @{ + * + * @brief APIs for the SoC library. + * + */ + +#ifndef NRF_SOC_H__ +#define NRF_SOC_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "nrf_error_soc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup NRF_SOC_DEFINES Defines + * @{ */ + +/**@brief The number of the lowest SVC number reserved for the SoC library. */ +#define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ +#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ + +/**@brief Guaranteed time for application to process radio inactive notification. */ +#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) + +/**@brief The minimum allowed timeslot extension time. */ +#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) + +/**@brief The maximum processing time to handle a timeslot extension. */ +#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (17) + +/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ +#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (79) + +#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ +#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ +#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ + +#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ +#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. + The default interrupt priority for this handler is set to 6 */ +#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ +#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. + The default interrupt priority for this handler is set to 6 */ +#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ +#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ + +#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */ + +#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */ + +#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */ + +/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is disabled. */ +#define NRF_SOC_SD_PPI_CHANNELS_SD_DISABLED_MSK ((uint32_t)(0)) + +/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is enabled. */ +#define NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK ((uint32_t)( \ + (1U << 17) \ + | (1U << 18) \ + | (1U << 19) \ + | (1U << 20) \ + | (1U << 21) \ + | (1U << 22) \ + | (1U << 23) \ + | (1U << 24) \ + | (1U << 25) \ + | (1U << 26) \ + | (1U << 27) \ + | (1U << 28) \ + | (1U << 29) \ + | (1U << 30) \ + | (1U << 31) \ + )) + +/**@brief Mask of PPI channels available to the application when the SoftDevice is disabled. */ +#define NRF_SOC_APP_PPI_CHANNELS_SD_DISABLED_MSK (~NRF_SOC_SD_PPI_CHANNELS_SD_DISABLED_MSK) + +/**@brief Mask of PPI channels available to the application when the SoftDevice is enabled. */ +#define NRF_SOC_APP_PPI_CHANNELS_SD_ENABLED_MSK (~NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK) + +/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is disabled. */ +#define NRF_SOC_SD_PPI_GROUPS_SD_DISABLED_MSK ((uint32_t)(0)) + +/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is enabled. */ +#define NRF_SOC_SD_PPI_GROUPS_SD_ENABLED_MSK ((uint32_t)( \ + (1U << 4) \ + | (1U << 5) \ + )) + +/**@brief Mask of PPI groups available to the application when the SoftDevice is disabled. */ +#define NRF_SOC_APP_PPI_GROUPS_SD_DISABLED_MSK (~NRF_SOC_SD_PPI_GROUPS_SD_DISABLED_MSK) + +/**@brief Mask of PPI groups available to the application when the SoftDevice is enabled. */ +#define NRF_SOC_APP_PPI_GROUPS_SD_ENABLED_MSK (~NRF_SOC_SD_PPI_GROUPS_SD_ENABLED_MSK) + +/**@} */ + +/**@addtogroup NRF_SOC_ENUMS Enumerations + * @{ */ + +/**@brief The SVC numbers used by the SVC functions in the SoC library. */ +enum NRF_SOC_SVCS +{ + SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, + SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, + SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, + SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, + SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, + SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, + SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, + SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, + SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, + SD_FLASH_WRITE = SOC_SVC_BASE + 9, + SD_FLASH_PROTECT = SOC_SVC_BASE + 10, + SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, + SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, + SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, + SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, + SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, + SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, + SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, + SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, + SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, + SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, + SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, + SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, + SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, + SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, + SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, + SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, + SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, + SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, + SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, + SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, + SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, + SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, + SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, + SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, + SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, + SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, + SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, + SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, + SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, + SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, + SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, + SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, + SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 +}; + +/**@brief Possible values of a ::nrf_mutex_t. */ +enum NRF_MUTEX_VALUES +{ + NRF_MUTEX_FREE, + NRF_MUTEX_TAKEN +}; + +/**@brief Power modes. */ +enum NRF_POWER_MODES +{ + NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */ + NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */ +}; + + +/**@brief Power failure thresholds */ +enum NRF_POWER_THRESHOLDS +{ + NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V18, /**< 1.8 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V19, /**< 1.9 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V20, /**< 2.0 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V22, /**< 2.2 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V24, /**< 2.4 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V26, /**< 2.6 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V27, /**< 2.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ +}; + + + +/**@brief DC/DC converter modes. */ +enum NRF_POWER_DCDC_MODES +{ + NRF_POWER_DCDC_DISABLE, /**< The DCDC is disabled. */ + NRF_POWER_DCDC_ENABLE /**< The DCDC is enabled. */ +}; + +/**@brief Radio notification distances. */ +enum NRF_RADIO_NOTIFICATION_DISTANCES +{ + NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */ + NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */ +}; + + +/**@brief Radio notification types. */ +enum NRF_RADIO_NOTIFICATION_TYPES +{ + NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */ +}; + +/**@brief The Radio signal callback types. */ +enum NRF_RADIO_CALLBACK_SIGNAL_TYPE +{ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */ +}; + +/**@brief The actions requested by the signal callback. + * + * This code gives the SOC instructions about what action to take when the signal callback has + * returned. + */ +enum NRF_RADIO_SIGNAL_CALLBACK_ACTION +{ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current + timeslot. Maximum execution time for this action: + @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. + This action must be started at least + @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before + the end of the timeslot. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ +}; + +/**@brief Radio timeslot high frequency clock source configuration. */ +enum NRF_RADIO_HFCLK_CFG +{ + NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the + external crystal for the whole duration of the timeslot. This should be the + preferred option for events that use the radio or require high timing accuracy. + @note The SoftDevice will automatically turn on and off the external crystal, + at the beginning and end of the timeslot, respectively. The crystal may also + intentionally be left running after the timeslot, in cases where it is needed + by the SoftDevice shortly after the end of the timeslot. */ + NRF_RADIO_HFCLK_CFG_NO_GUARANTEE /**< This configuration allows for earlier and tighter scheduling of timeslots. + The RC oscillator may be the clock source in part or for the whole duration of the timeslot. + The RC oscillator's accuracy must therefore be taken into consideration. + @note If the application will use the radio peripheral in timeslots with this configuration, + it must make sure that the crystal is running and stable before starting the radio. */ +}; + +/**@brief Radio timeslot priorities. */ +enum NRF_RADIO_PRIORITY +{ + NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */ + NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */ +}; + +/**@brief Radio timeslot request type. */ +enum NRF_RADIO_REQUEST_TYPE +{ + NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */ + NRF_RADIO_REQ_TYPE_NORMAL /**< Normal radio timeslot request. */ +}; + +/**@brief SoC Events. */ +enum NRF_SOC_EVTS +{ + NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */ + NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */ + NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */ + NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */ + NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */ + NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */ + NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ + NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ + NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ + NRF_EVT_NUMBER_OF_EVTS +}; + +/**@} */ + + +/**@addtogroup NRF_SOC_STRUCTURES Structures + * @{ */ + +/**@brief Represents a mutex for use with the nrf_mutex functions. + * @note Accessing the value directly is not safe, use the mutex functions! + */ +typedef volatile uint8_t nrf_mutex_t; + +/**@brief Parameters for a request for a timeslot as early as possible. */ +typedef struct +{ + uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ + uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ + uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */ + uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */ +} nrf_radio_request_earliest_t; + +/**@brief Parameters for a normal radio timeslot request. */ +typedef struct +{ + uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ + uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ + uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */ + uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */ +} nrf_radio_request_normal_t; + +/**@brief Radio timeslot request parameters. */ +typedef struct +{ + uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */ + union + { + nrf_radio_request_earliest_t earliest; /**< Parameters for requesting a radio timeslot as early as possible. */ + nrf_radio_request_normal_t normal; /**< Parameters for requesting a normal radio timeslot. */ + } params; /**< Parameter union. */ +} nrf_radio_request_t; + +/**@brief Return parameters of the radio timeslot signal callback. */ +typedef struct +{ + uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */ + union + { + struct + { + nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */ + } request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */ + struct + { + uint32_t length_us; /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */ + } extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */ + } params; /**< Parameter union. */ +} nrf_radio_signal_callback_return_param_t; + +/**@brief The radio timeslot signal callback type. + * + * @note In case of invalid return parameters, the radio timeslot will automatically end + * immediately after returning from the signal callback and the + * @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent. + * @note The returned struct pointer must remain valid after the signal callback + * function returns. For instance, this means that it must not point to a stack variable. + * + * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE. + * + * @return Pointer to structure containing action requested by the application. + */ +typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type); + +/**@brief AES ECB parameter typedefs */ +typedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH]; /**< Encryption key type. */ +typedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH]; /**< Cleartext data type. */ +typedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Ciphertext data type. */ + +/**@brief AES ECB data structure */ +typedef struct +{ + soc_ecb_key_t key; /**< Encryption key. */ + soc_ecb_cleartext_t cleartext; /**< Cleartext data. */ + soc_ecb_ciphertext_t ciphertext; /**< Ciphertext data. */ +} nrf_ecb_hal_data_t; + +/**@brief AES ECB block. Used to provide multiple blocks in a single call + to @ref sd_ecb_blocks_encrypt.*/ +typedef struct +{ + soc_ecb_key_t const * p_key; /**< Pointer to the Encryption key. */ + soc_ecb_cleartext_t const * p_cleartext; /**< Pointer to the Cleartext data. */ + soc_ecb_ciphertext_t * p_ciphertext; /**< Pointer to the Ciphertext data. */ +} nrf_ecb_hal_data_block_t; + +/**@} */ + +/**@addtogroup NRF_SOC_FUNCTIONS Functions + * @{ */ + +/**@brief Initialize a mutex. + * + * @param[in] p_mutex Pointer to the mutex to initialize. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex)); + +/**@brief Attempt to acquire a mutex. + * + * @param[in] p_mutex Pointer to the mutex to acquire. + * + * @retval ::NRF_SUCCESS The mutex was successfully acquired. + * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired. + */ +SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex)); + +/**@brief Release a mutex. + * + * @param[in] p_mutex Pointer to the mutex to release. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex)); + +/**@brief Query the capacity of the application random pool. + * + * @param[out] p_pool_capacity The capacity of the pool. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)); + +/**@brief Get number of random bytes available to the application. + * + * @param[out] p_bytes_available The number of bytes currently available in the pool. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)); + +/**@brief Get random bytes from the application pool. + * + * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes. + * @param[in] length Number of bytes to take from pool and place in p_buff. + * + * @retval ::NRF_SUCCESS The requested bytes were written to p_buff. + * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available. +*/ +SVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)); + +/**@brief Gets the reset reason register. + * + * @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason)); + +/**@brief Clears the bits of the reset reason register. + * + * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)); + +/**@brief Sets the power mode when in CPU sleep. + * + * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait + * + * @retval ::NRF_SUCCESS The power mode was set. + * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown. + */ +SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode)); + +/**@brief Puts the chip in System OFF mode. + * + * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN + */ +SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); + +/**@brief Enables or disables the power-fail comparator. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); + + +/**@brief Sets the power failure comparator threshold value. + * + * + * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. + * + * @retval ::NRF_SUCCESS The power failure threshold was set. + * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. + */ +SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); + + +/**@brief Writes the NRF_POWER->RAM[index].POWERSET register. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. + * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)); + +/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to. + * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)); + +/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from. + * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)); + +/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[in] gpregret_msk Bits to be set in the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); + +/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); + +/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[out] p_gpregret Contents of the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); + +/**@brief Enable or disable the DC/DC regulator. + * + * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. + * + * @retval ::NRF_SUCCESS + * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid. + */ +SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); + + +/**@brief Request the high frequency crystal oscillator. + * + * Will start the high frequency crystal oscillator, the startup time of the crystal varies + * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started. + * + * @see sd_clock_hfclk_is_running + * @see sd_clock_hfclk_release + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void)); + +/**@brief Releases the high frequency crystal oscillator. + * + * Will stop the high frequency crystal oscillator, this happens immediately. + * + * @see sd_clock_hfclk_is_running + * @see sd_clock_hfclk_request + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void)); + +/**@brief Checks if the high frequency crystal oscillator is running. + * + * @see sd_clock_hfclk_request + * @see sd_clock_hfclk_release + * + * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running)); + +/**@brief Waits for an application event. + * + * An application event is either an application interrupt or a pended interrupt when the interrupt + * is disabled. + * + * When the application waits for an application event by calling this function, an interrupt that + * is enabled will be taken immediately on pending since this function will wait in thread mode, + * then the execution will return in the application's main thread. + * + * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M + * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets + * pended, this function will return to the application's main thread. + * + * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ + * in order to sleep using this function. This is only necessary for disabled interrupts, as + * the interrupt handler will clear the pending flag automatically for enabled interrupts. + * + * @note If an application interrupt has happened since the last time sd_app_evt_wait was + * called this function will return immediately and not go to sleep. This is to avoid race + * conditions that can occur when a flag is updated in the interrupt handler and processed + * in the main loop. + * + * @post An application interrupt has happened or a interrupt pending flag is set. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void)); + +/**@brief Get PPI channel enable register contents. + * + * @param[out] p_channel_enable The contents of the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable)); + +/**@brief Set PPI channel enable register. + * + * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)); + +/**@brief Clear PPI channel enable register. + * + * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)); + +/**@brief Assign endpoints to a PPI channel. + * + * @param[in] channel_num Number of the PPI channel to assign. + * @param[in] evt_endpoint Event endpoint of the PPI channel. + * @param[in] task_endpoint Task endpoint of the PPI channel. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)); + +/**@brief Task to enable a channel group. + * + * @param[in] group_num Number of the channel group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num)); + +/**@brief Task to disable a channel group. + * + * @param[in] group_num Number of the PPI group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num)); + +/**@brief Assign PPI channels to a channel group. + * + * @param[in] group_num Number of the channel group. + * @param[in] channel_msk Mask of the channels to assign to the group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)); + +/**@brief Gets the PPI channels of a channel group. + * + * @param[in] group_num Number of the channel group. + * @param[out] p_channel_msk Mask of the channels assigned to the group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)); + +/**@brief Configures the Radio Notification signal. + * + * @note + * - The notification signal latency depends on the interrupt priority settings of SWI used + * for notification signal. + * - To ensure that the radio notification signal behaves in a consistent way, the radio + * notifications must be configured when there is no protocol stack or other SoftDevice + * activity in progress. It is recommended that the radio notification signal is + * configured directly after the SoftDevice has been enabled. + * - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice + * will interrupt the application to do Radio Event preparation. + * - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have + * to shorten the connection events to have time for the Radio Notification signals. + * + * @param[in] type Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES. + * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio + * notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is + * recommended (but not required) to be used with + * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE. + * + * @param[in] distance Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES. + * This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or + * @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used. + * + * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid. + * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all + * running activities and retry. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)); + +/**@brief Encrypts a block according to the specified parameters. + * + * 128-bit AES encryption. + * + * @note: + * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while + * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application + * main or low interrupt level. + * + * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input + * parameters and one output parameter). + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)); + +/**@brief Encrypts multiple data blocks provided as an array of data block structures. + * + * @details: Performs 128-bit AES encryption on multiple data blocks + * + * @note: + * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while + * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application + * main or low interrupt level. + * + * @param[in] block_count Count of blocks in the p_data_blocks array. + * @param[in,out] p_data_blocks Pointer to the first entry in a contiguous array of + * @ref nrf_ecb_hal_data_block_t structures. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)); + +/**@brief Gets any pending events generated by the SoC API. + * + * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned. + * + * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending. + * + * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter. + * @retval ::NRF_ERROR_NOT_FOUND No pending events. + */ +SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id)); + +/**@brief Get the temperature measured on the chip + * + * This function will block until the temperature measurement is done. + * It takes around 50 us from call to return. + * + * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius. + * + * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp + */ +SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); + +/**@brief Flash Write +* +* Commands to write a buffer to flash +* +* If the SoftDevice is enabled: +* This call initiates the flash access command, and its completion will be communicated to the +* application with exactly one of the following events: +* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. +* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. +* +* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the + * write has been completed +* +* @note +* - This call takes control over the radio and the CPU during flash erase and write to make sure that +* they will not interfere with the flash access. This means that all interrupts will be blocked +* for a predictable time (depending on the NVMC specification in the device's Product Specification +* and the command parameters). +* - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS +* or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. +* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is +* protected. +* +* +* @param[in] p_dst Pointer to start of flash location to be written. +* @param[in] p_src Pointer to buffer with data to be written. +* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one +* flash page. See the device's Product Specification for details. +* +* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. +* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. +* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. +* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. +* @retval ::NRF_SUCCESS The command was accepted. +*/ +SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); + + +/**@brief Flash Erase page +* +* Commands to erase a flash page +* If the SoftDevice is enabled: +* This call initiates the flash access command, and its completion will be communicated to the +* application with exactly one of the following events: +* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. +* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. +* +* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the +* erase has been completed +* +* @note +* - This call takes control over the radio and the CPU during flash erase and write to make sure that +* they will not interfere with the flash access. This means that all interrupts will be blocked +* for a predictable time (depending on the NVMC specification in the device's Product Specification +* and the command parameters). +* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is +* protected. +* +* +* @param[in] page_number Page number of the page to erase +* +* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. +* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. +* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. +* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. +* @retval ::NRF_SUCCESS The command was accepted. +*/ +SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); + + +/**@brief Flash Protection set + * + * Commands to set the flash protection configuration registers. + This sets the CONFIGx registers of the BPROT peripheral. + * + * @note Not all parameters are valid for all products. Some bits in each parameter may not be + * valid for your product. Please refer your Product Specification for more details. + * + * @note To read the values read them directly. They are only write-protected. + * + * @note It is possible to use @ref sd_protected_register_write instead of this function. + * + * @param[in] block_cfg0 Value to be written to the configuration register. + * @param[in] block_cfg1 Value to be written to the configuration register. + * @param[in] block_cfg2 Value to be written to the configuration register. + * @param[in] block_cfg3 Value to be written to the configuration register. + * + * @retval ::NRF_ERROR_NOT_SUPPORTED Non-zero value supplied to one or more of the unsupported parameters. + * @retval ::NRF_SUCCESS Values successfully written to configuration registers. + */ +SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); + +/**@brief Opens a session for radio timeslot requests. + * + * @note Only one session can be open at a time. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot + * starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed + * by the application. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0 + * interrupt occurs. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO + * interrupt occurs. + * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This + * implies that none of the sd_* API calls can be used from p_radio_signal_callback(). + * + * @param[in] p_radio_signal_callback The signal callback. + * + * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer. + * @retval ::NRF_ERROR_BUSY If session cannot be opened. + * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)); + +/**@brief Closes a session for radio timeslot requests. + * + * @note Any current radio timeslot will be finished before the session is closed. + * @note If a radio timeslot is scheduled when the session is closed, it will be canceled. + * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED + * event is received. + * + * @retval ::NRF_ERROR_FORBIDDEN If session not opened. + * @retval ::NRF_ERROR_BUSY If session is currently being closed. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void)); + +/**@brief Requests a radio timeslot. + * + * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST + * and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST. + * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by + * p_request->distance_us and is given relative to the start of the previous timeslot. + * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event. + * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event. + * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths. + * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this + * function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent. + * The application may then try to schedule the first radio timeslot again. + * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START). + * Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS. + * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us. + * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the + * specified radio timeslot start, but this does not affect the actual start time of the timeslot. + * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency + * (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is + * guaranteed to be clocked from the external crystal. + * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral + * during the radio timeslot. + * + * @param[in] p_request Pointer to the request parameters. + * + * @retval ::NRF_ERROR_FORBIDDEN If session not opened or the session is not IDLE. + * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid. + * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); + +/**@brief Write register protected by the SoftDevice + * + * This function writes to a register that is write-protected by the SoftDevice. Please refer to your + * SoftDevice Specification for more details about which registers that are protected by SoftDevice. + * This function can write to the following protected peripheral: + * - BPROT + * + * @note Protected registers may be read directly. + * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in + * the register has not changed. See the Product Specification for more details about register + * properties. + * + * @param[in] p_register Pointer to register to be written. + * @param[in] value Value to be written to the register. + * + * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. + * @retval ::NRF_SUCCESS Value successfully written to register. + * + */ +SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); + +/**@} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_SOC_H__ + +/**@} */ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_svc.h b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_svc.h new file mode 100644 index 0000000..292c692 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/nrf_svc.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NRF_SVC__ +#define NRF_SVC__ + +#include "stdint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SVCALL_AS_NORMAL_FUNCTION +#define SVCALL(number, return_type, signature) return_type signature +#else + +#ifndef SVCALL +#if defined (__CC_ARM) +#define SVCALL(number, return_type, signature) return_type __svc(number) signature +#elif defined (__GNUC__) +#ifdef __cplusplus +#define GCC_CAST_CPP (uint16_t) +#else +#define GCC_CAST_CPP +#endif +#define SVCALL(number, return_type, signature) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ + __attribute__((naked)) \ + __attribute__((unused)) \ + static return_type signature \ + { \ + __asm( \ + "svc %0\n" \ + "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ + ); \ + } \ + _Pragma("GCC diagnostic pop") + +#elif defined (__ICCARM__) +#define PRAGMA(x) _Pragma(#x) +#define SVCALL(number, return_type, signature) \ +PRAGMA(swi_number = (number)) \ + __swi return_type signature; +#else +#define SVCALL(number, return_type, signature) return_type signature +#endif +#endif // SVCALL + +#endif // SVCALL_AS_NORMAL_FUNCTION + +#ifdef __cplusplus +} +#endif +#endif // NRF_SVC__ diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_license-agreement.txt b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_license-agreement.txt new file mode 100644 index 0000000..2d1bc12 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_license-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/s132_nrf52_6.1.1/s132_nrf52_6.1.1_softdevice.hex b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_softdevice.hex new file mode 100644 index 0000000..f111257 --- /dev/null +++ b/s132_nrf52_6.1.1/s132_nrf52_6.1.1_softdevice.hex @@ -0,0 +1,9417 @@ +:020000040000FA +:1000000000040020810A000015070000610A0000BA +:100010001F07000029070000330700000000000050 +:10002000000000000000000000000000A50A000021 +:100030003D070000000000004707000051070000D6 +:100040005B070000650700006F07000079070000EC +:10005000830700008D07000097070000A10700003C +:10006000AB070000B5070000BF070000C90700008C +:10007000D3070000DD070000E7070000F1070000DC +:10008000FB070000050800000F0800001908000029 +:10009000230800002D080000370800004108000078 +:1000A0004B080000550800005F08000069080000C8 +:1000B000730800007D080000870800009108000018 +:1000C0009B080000A5080000AF080000B908000068 +:1000D000C3080000CD080000D7080000E1080000B8 +:1000E000EB080000F5080000FF0800000909000007 +:1000F000130900001D090000270900003109000054 +:100100003B0900001FB500F003F88DE80F001FBD8C +:1001100000F0ACBC40F6FC7108684FF01022401CA7 +:1001200008D00868401C09D00868401C04D0086842 +:1001300000F037BA9069F5E79069F9E7704770B554 +:100140000B46010B184400F6FF70040B4FF0805073 +:100150000022090303692403406943431D1B104621 +:1001600000F048FA29462046BDE8704000F042BA47 +:10017000F0B54FF6FF734FF4B4751A466E1E11E0DA +:10018000A94201D3344600E00C46091B30F8027B3B +:10019000641E3B441A44F9D19CB204EB134394B25D +:1001A00004EB12420029EBD198B200EB134002EBB2 +:1001B000124140EA0140F0BDF34992B00446D1E952 +:1001C0000001CDE91001FF224021684600F0F4FB58 +:1001D00094E80F008DE80F00684610A902E004C8FB +:1001E00041F8042D8842FAD110216846FFF7C0FF7C +:1001F0001090AA208DF8440000F099F9FFF78AFFCB +:1002000040F6FC7420684FF01025401C0FD0206889 +:1002100010226946803000F078F92068401C08D030 +:100220002068082210A900F070F900F061F9A869AF +:10023000EEE7A869F5E74FF080500369406940F6A2 +:10024000FC71434308684FF01022401C06D0086838 +:1002500000F58050834203D2092070479069F7E788 +:100260000868401C04D00868401C03D00020704778 +:100270009069F9E70420704770B504460068C34DE3 +:10028000072876D2DFE800F033041929631E250021 +:10029000D4E9026564682946304600F062F92A46CE +:1002A0002146304600F031F9AA002146304600F0E0 +:1002B00057FB002800D0032070BD00F009FC4FF46C +:1002C000805007E0201D00F040F90028F4D100F034 +:1002D000FFFB60682860002070BD241D94E80700C3 +:1002E000920000F03DFB0028F6D00E2070BDFFF715 +:1002F000A2FF0028FAD1D4E901034FF0805100EBAE +:10030000830208694D69684382420ED840F6F8704E +:1003100005684FF010226D1C09D0056805EB8305B8 +:100320000B6949694B439D4203D9092070BD55694A +:10033000F4E70168491C03D00068401C02D003E0C8 +:100340005069FAE70F2070BD2046FFF735FFFFF731 +:1003500072FF0028F7D1201D00F0F7F80028F2D135 +:1003600060680028F0D100F0E2F8FFF7D3FE00F05B +:10037000BFF8072070BD10B50C46182802D0012028 +:10038000086010BD2068FFF777FF206010BD41684E +:10039000054609B1012700E0002740F6F8742068FF +:1003A0004FF01026401C2BD02068AA68920000F065 +:1003B000D7FA38B3A86881002068401C27D020688D +:1003C000FFF7BDFED7B12068401C22D026684FF051 +:1003D0008050AC686D68016942695143A9420DD9EA +:1003E000016940694143A14208D92146304600F0E5 +:1003F000B8F822462946304600F087F800F078F831 +:100400007069D2E700F093F8FFF784FEF6E77069B1 +:10041000D6E77669DBE740F6FC7420684FF01026DB +:10042000401C23D02068401C0CD02068401C1FD0EA +:100430002568206805F18005401C1BD027683879A5 +:10044000AA2819D040F6F8700168491C42D001680A +:10045000491C45D00168491C3ED001680968491C07 +:100460003ED00168491C39D000683EE0B069DAE747 +:10047000B569DEE7B769E2E710212846FFF778FEA5 +:100480003968814222D12068401C05D0D4F8001080 +:1004900001F18002C03107E0B169F9E730B108CA63 +:1004A00051F8040D984201D1012000E000208A4259 +:1004B000F4D158B1286810B1042803D0FEE72846CB +:1004C000FFF765FF3149686808600EE0FFF722FE1C +:1004D00000F00EF87169BBE77169BFE7706904E06D +:1004E0004FF480500168491C01D000F0CBFAFEE7C0 +:1004F000BFF34F8F26480168264A01F4E06111439B +:100500000160BFF34F8F00BFFDE72DE9F0411746B3 +:100510000D460646002406E03046296800F054F8EF +:10052000641C2D1D361DBC42F6D3BDE8F08140F69B +:10053000FC700168491C04D0D0F800004FF48051D1 +:10054000FDE54FF010208069F8E74FF080510A690F +:10055000496900684A43824201D810207047002050 +:10056000704770B50C4605464FF4806608E0284693 +:1005700000F017F8B44205D3A4F5806405F5805562 +:10058000002CF4D170BD0000F40A0000000000202F +:100590000CED00E00400FA05144801680029FCD0C5 +:1005A0007047134A0221116010490B68002BFCD0E0 +:1005B0000F4B1B1D186008680028FCD0002010603D +:1005C00008680028FCD07047094B10B501221A605A +:1005D000064A1468002CFCD0016010680028FCD08A +:1005E0000020186010680028FCD010BD00E4014015 +:1005F00004E5014070B50C46054600F073F810B9EB +:1006000000F07EF828B121462846BDE8704000F091 +:1006100007B821462846BDE8704000F037B8000012 +:100620007FB5002200920192029203920A0B000B06 +:100630006946012302440AE0440900F01F0651F80C +:10064000245003FA06F6354341F82450401C8242F8 +:10065000F2D80D490868009A10430860081D016827 +:10066000019A1143016000F03DF800280AD00649C4 +:1006700010310868029A10430860091D0868039A3F +:10068000104308607FBD00000006004030B50F4CED +:10069000002200BF04EB0213D3F800582DB9D3F8A1 +:1006A000045815B9D3F808581DB1521C082AF1D3C3 +:1006B00030BD082AFCD204EB0212C2F80008C3F8CD +:1006C00004180220C3F8080830BD000000E0014013 +:1006D0004FF08050D0F83001082801D0002070473A +:1006E000012070474FF08050D0F83011062905D016 +:1006F000D0F83001401C01D0002070470120704725 +:100700004FF08050D0F830010A2801D00020704707 +:100710000120704708208F490968095808471020B0 +:100720008C4909680958084714208A4909680958FA +:100730000847182087490968095808473020854923 +:100740000968095808473820824909680958084744 +:100750003C20804909680958084740207D490968BC +:100760000958084744207B49096809580847482028 +:1007700078490968095808474C207649096809589A +:10078000084750207349096809580847542071499F +:1007900009680958084758206E49096809580847E8 +:1007A0005C206C4909680958084760206949096854 +:1007B00009580847642067490968095808476820AC +:1007C00064490968095808476C2062490968095852 +:1007D000084770205F4909680958084774205D4937 +:1007E00009680958084778205A490968095808478C +:1007F0007C205849096809580847802055490968EC +:10080000095808478420534909680958084788202F +:1008100050490968095808478C204E490968095809 +:10082000084790204B4909680958084794204949CE +:10083000096809580847982046490968095808472F +:100840009C204449096809580847A0204149096883 +:1008500009580847A4203F49096809580847A820B3 +:100860003C49096809580847AC203A4909680958C1 +:100870000847B0203749096809580847B420354966 +:10088000096809580847B8203249096809580847D3 +:10089000BC203049096809580847C0202D4909681B +:1008A00009580847C4202B49096809580847C82037 +:1008B0002849096809580847CC2026490968095879 +:1008C0000847D0202349096809580847D4202149FE +:1008D000096809580847D8201E4909680958084777 +:1008E000DC201C49096809580847E02019490968B3 +:1008F00009580847E4201749096809580847E820BB +:100900001449096809580847EC2012490968095830 +:100910000847F0200F49096809580847F4200D4995 +:10092000096809580847F8200A490968095808471A +:10093000FC2008490968095808475FF48070054998 +:10094000096809580847000003480449024A034B54 +:100950007047000000000020000B0000000B0000AA +:1009600040EA010310B59B070FD1042A0DD310C82C +:1009700008C9121F9C42F8D020BA19BA884201D97E +:10098000012010BD4FF0FF3010BD1AB1D30703D0C6 +:10099000521C07E0002010BD10F8013B11F8014B7C +:1009A0001B1B07D110F8013B11F8014B1B1B01D198 +:1009B000921EF1D1184610BD02F0FF0343EA032254 +:1009C00042EA024200F005B87047704770474FF0A6 +:1009D00000020429C0F0128010F0030C00F01B800C +:1009E000CCF1040CBCF1020F18BF00F8012BA8BF1A +:1009F00020F8022BA1EB0C0100F00DB85FEAC17CDE +:100A000024BF00F8012B00F8012B48BF00F8012B90 +:100A100070474FF0000200B51346944696462039C1 +:100A200022BFA0E80C50A0E80C50B1F12001BFF4A7 +:100A3000F7AF090728BFA0E80C5048BF0CC05DF80D +:100A400004EB890028BF40F8042B08BF704748BF5B +:100A500020F8022B11F0804F18BF00F8012B7047CF +:100A6000014B1B68DB6818470000002009480A4951 +:100A70007047FFF7FBFFFFF745FB00BD20BFFDE719 +:100A8000064B1847064A1060016881F308884068E1 +:100A900000470000000B0000000B000017040000DE +:100AA000000000201EF0040F0CBFEFF30881EFF3ED +:100AB0000981886902380078182803D100E0000015 +:100AC000074A1047074A12682C3212681047000084 +:100AD00000B5054B1B68054A9B58984700BD0000B0 +:100AE0007703000000000020F00A0000040000006E +:100AF000001000000000000000FFFFFF0090D00386 +:1010000080130020194B020005C000007F4A020037 +:1010100005C0000005C0000005C000000000000081 +:10102000000000000000000000000000754B0200FE +:1010300005C000000000000005C0000005C0000061 +:10104000DD4B0200E34B020005C0000005C00000BC +:1010500005C0000005C0000005C0000005C000007C +:10106000E94B020005C0000005C00000EF4B020084 +:1010700005C00000F54B0200FB4B0200014C0200D2 +:1010800005C0000005C0000005C0000005C000004C +:1010900005C0000005C0000005C0000005C000003C +:1010A00005C00000074C020005C0000005C000009C +:1010B00005C0000005C0000005C0000005C000001C +:1010C0000D4C020005C0000005C0000005C0000076 +:1010D00005C0000005C0000005C0000005C00000FC +:1010E00005C0000005C0000005C0000005C00000EC +:1010F00005C0000005C0000005C0000005C00000DC +:1011000005C0000005C0000000F002F823F0F3FC69 +:101110000AA090E8000C82448344AAF10107DA4552 +:1011200001D123F0E8FCAFF2090EBAE80F0013F08A +:10113000010F18BFFB1A43F001031847C03F02001C +:10114000E03F02000A444FF0000C10F8013B13F09E +:10115000070408BF10F8014B1D1108BF10F8015B10 +:10116000641E05D010F8016B641E01F8016BF9D103 +:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A +:101180006D1E58BF01F801CBFAD505E014F8016BCC +:1011900001F8016B6D1EF9D59142D6D3704700005E +:1011A0000023002400250026103A28BF78C1FBD870 +:1011B000520728BF30C148BF0B6070471FB500F011 +:1011C0003DF88DE80F001FBD1EF0040F0CBFEFF3BC +:1011D0000880EFF30980014A1047000047BF000074 +:1011E000F0B44046494652465B460FB402A0013077 +:1011F00001B50648004700BF01BC86460FBC8046CB +:10120000894692469B46F0BC7047000009110000D9 +:101210008269034981614FF001001044704700006A +:101220002512000001B41EB400B514F047FD01B44E +:101230000198864601BC01B01EBD000023F058BCD9 +:1012400070B51A4C054609202070A01C00F0D1F89A +:101250005920A08029462046BDE8704008F0C4B857 +:1012600008F0CDB870B50C461149097829B1A0F144 +:1012700060015E2908D3012013E0602804D06928AA +:1012800002D043F201000CE020CC0A4E94E80E009C +:1012900006EB8000A0F58050241FD0F8806E284611 +:1012A000B047206070BD012070470000080000209A +:1012B00018000020584C02003249884201D2012017 +:1012C00070470020704770B50446A0F500002E4E10 +:1012D000B0F1786F02D23444A4F500042948844266 +:1012E00001D2012500E0002500F043F848B125B9FE +:1012F000B44204D32548006808E0012070BD0020F6 +:1013000070BD002DF9D1B442F9D321488442F6D200 +:10131000F3E710B50446A0F50000B0F1786F03D2F2 +:1013200019480444A4F5000400F023F84FF080416C +:1013300030B11648006804E08C4204D2012003E07A +:1013400013488442F8D2002080F0010010BD10B58F +:1013500020B1FFF7DEFF08B1012010BD002010BD55 +:1013600010B520B1FFF7AFFF08B1012010BD00207C +:1013700010BD084808490068884201D10120704723 +:101380000020704700600200000000201C000020C8 +:101390000800002054000020BEBAFECA10B5044662 +:1013A0000021012000F03DF800210B2000F039F869 +:1013B0000421192000F035F804210D2000F031F847 +:1013C00004210E2000F02DF804210F2000F029F850 +:1013D0000421C84300F025F80621162000F021F86A +:1013E0000621152000F01DF82046FFF729FF0020F8 +:1013F00010BDB72101807047FFF732BF1148704719 +:1014000010487047104A10B514680F4B0F4A083344 +:101410001A60FFF727FF0C48001D046010BD7047DD +:1014200070474907090E002804DB00F1E02080F82E +:101430000014704700F00F0000F1E02080F8141D48 +:101440007047000003F9004210050240010000014E +:10145000FE48002101604160018170472DE9F7439A +:10146000044692B091464068FFF771FF40B1606852 +:10147000FFF776FF20B9607800F00300022801D062 +:10148000012000E00020F14E30724846FFF71BFFBC +:1014900018B1102015B0BDE8F0834946012001F0D5 +:1014A0008EFE0028F6D101258DF842504FF4C05031 +:1014B000ADF84000002210A9284606F0FFFB0028E6 +:1014C000E8D18DF842504FF428504FF00008ADF8A5 +:1014D000400047461C216846CDF81C8023F0A3FA43 +:1014E0009DF81C0008AA20F00F00401C20F0F0001E +:1014F00010308DF81C0020788DF81D0061789DF863 +:101500001E0061F3420040F001008DF81E009DF8BE +:1015100000000AA940F002008DF800002089ADF813 +:101520003000ADF83270608907AFADF834000B972A +:10153000606810AC0E900A94684606F0B2F9002874 +:10154000A8D1BDF8200030808DF8425042F601202D +:10155000ADF840009DF81E0008AA20F00600801C8F +:1015600020F001008DF81E000220ADF83000ADF82B +:10157000340013A80E900AA9684606F092F90028D4 +:1015800088D1BDF820007080311D484600F033F945 +:10159000002887D18DF8425042F6A620ADF84000D1 +:1015A0001C216846CDF81C8023F03DFA9DF81C00F4 +:1015B000ADF8345020F00F00401C20F0F000103047 +:1015C0008DF81C009DF81D0008AA20F0FF008DF882 +:1015D0001D009DF81E000AA920F0060040F0010041 +:1015E000801C8DF81E009DF800008DF8445040F0DE +:1015F00002008DF80000CDE90A4711A80E90ADF861 +:101600003050684606F04DF9002899D1BDF8200009 +:10161000F08000203EE73EB504460820ADF800000B +:101620002046FFF750FE08B110203EBD21460120A4 +:1016300001F0C5FD0028F8D12088ADF804006088CD +:10164000ADF80600A088ADF80800E088ADF80A0003 +:101650007E4801AB6A468088002106F02BFDBDF86C +:1016600000100829E1D003203EBD1FB5044600202C +:1016700002900820ADF80800CDF80CD02046FFF706 +:1016800022FE10B1102004B010BD704802AA81885B +:101690004FF6FF7006F050FF0028F4D1BDF8081097 +:1016A000082901D00320EEE7BDF800102180BDF825 +:1016B00002106180BDF80410A180BDF80610E18021 +:1016C000E1E701B582B00220ADF800005F4802AB4F +:1016D0006A464088002106F0EDFCBDF800100229A2 +:1016E00000D003200EBD1CB5002100910221ADF8F1 +:1016F00000100190FFF70DFE08B110201CBD5348EB +:101700006A4641884FF6FF7006F016FFBDF80010DC +:101710000229F3D003201CBDFEB54C4C06461546ED +:10172000207A0F46C00705D00846FFF7CCFD18B158 +:101730001020FEBD0F20FEBDF82D01D90C20FEBDEE +:101740003046FFF7C0FD18BB208801A905F0AEFDAB +:101750000028F4D130788DF80500208801A906F022 +:1017600087FC0028EBD100909DF800009DF8051043 +:1017700040F002008DF80000090703D040F0080097 +:101780008DF800002088694606F00FFC0028D6D1AD +:10179000ADF8085020883B4602AA002106F08AFCDA +:1017A000BDF80810A942CAD00320FEBD7CB505468D +:1017B0000020009001900888ADF800000C462846F3 +:1017C0000195FFF7C4FD18B92046FFF7A2FD08B147 +:1017D00010207CBD15B1BDF8000050B11B486A4611 +:1017E00001884FF6FF7006F0A7FEBDF800102180BB +:1017F0007CBD0C207CBD30B593B0044600200D4666 +:101800000090142101A823F00EF91C2108A823F050 +:101810000AF99DF80000CDF808D020F00F00401C18 +:1018200020F0F00010308DF800009DF8010020F04D +:10183000FF008DF801009DF8200040F002008DF8B7 +:10184000200001208DF8460002E000002002002068 +:1018500042F60420ADF8440011A801902088ADF8AC +:101860003C006088ADF83E00A088ADF84000E088FC +:10187000ADF842009DF8020006AA20F00600801C88 +:1018800020F001008DF802000820ADF80C00ADF842 +:1018900010000FA8059001A908A806F002F800287A +:1018A00003D1BDF818002880002013B030BD00001F +:1018B000F0B5007B059F1E4614460D46012800D05A +:1018C000FFDF0C2030803A203880002C08D0287AA6 +:1018D000032806D0287B012800D0FFDF1720608175 +:1018E000F0BDA889FBE72DE9F04786B0144691F8D2 +:1018F0000C900E9A0D46B9F1010F0BD01021007B10 +:101900002E8A8846052807D0062833D0FFDF06B088 +:10191000BDE8F0870221F2E7E8890C2100EB4000E6 +:1019200001EB4000188033201080002CEFD0E889B4 +:10193000608100271AE00096688808F1020301AA76 +:10194000696900F084FF06EB0800801C07EB470183 +:1019500086B204EB4102BDF8040090810DF106014E +:1019600040460E3212F04FFC7F1CBFB26089B84275 +:10197000E1D8CCE734201080E889B9F1010F11D00B +:10198000122148430E301880002CC0D0E8896081B5 +:101990004846B9F1010F00D00220207300270DF155 +:1019A000040A1FE00621ECE70096688808F10203AC +:1019B00001AA696900F04BFF06EB0800801C86B2A3 +:1019C000B9F1010F12D007EBC70004EB4000BDF8DE +:1019D0000410C18110220AF10201103022F082FFAE +:1019E0007F1CBFB26089B842DED890E707EB4701A1 +:1019F00004EB4102BDF80400D0810AF10201404627 +:101A0000103212F000FCEBE72DE9F0470E4688B0EB +:101A100090F80CC096F80C80378AF5890C20109944 +:101A200002F10C044FF0000ABCF1030F08D0BCF126 +:101A3000040F3ED0BCF1070F7DD0FFDF08B067E791 +:101A400005EB850C00EB4C00188031200880002A43 +:101A5000F4D0A8F1060000F0FF09558125E0182117 +:101A600001A822F0E0FF00977088434601AA71693F +:101A700000F0EDFEBDF804002080BDF80600E08017 +:101A8000BDF808002081A21C0DF10A01484612F0A1 +:101A9000BAFBB9F1000F00D018B184F804A0A4F883 +:101AA00002A007EB080087B20A346D1EADB2D6D291 +:101AB000C4E705EB850C00EB4C0018803220088051 +:101AC000002ABBD0A8F1050000F0FF09558137E0DE +:101AD00000977088434601AA716900F0B8FE9DF82E +:101AE0000600BDF80410E1802179420860F300018E +:101AF00062F34101820862F38201C20862F3C3010A +:101B0000020962F30411420962F34511820962F38A +:101B100086112171C0096071BDF80700208122463D +:101B20000DF10901484612F06EFB18B184F802A0CD +:101B3000A4F800A000E007E007EB080087B20A3431 +:101B40006D1EADB2C4D279E7A8F1020084B205FBE4 +:101B500008F000F10E0CA3F800C035230B80002A1A +:101B6000A6D055819481009783B270880E32716936 +:101B700000F06DFE62E72DE9F84F1E460A9D0C4607 +:101B800081462AB1607A00F58070D080E0891081AA +:101B900099F80C000C274FF000084FF00E0A0D28A2 +:101BA00073D2DFE800F09E070E1C28303846556AD5 +:101BB00073737300214648460095FFF779FEBDE830 +:101BC000F88F207B9146082802D0032800D0FFDF41 +:101BD000378030200AE000BFA9F80A80EFE7207BB9 +:101BE0009146042800D0FFDF378031202880B9F1EA +:101BF000000FF1D1E3E7207B9146042800D0FFDFFE +:101C000037803220F2E7207B9146022800D0FFDFA8 +:101C100037803320EAE7207B1746022800D0FFDF19 +:101C20003420A6F800A02880002FC8D0A7F80A808A +:101C3000C5E7207B1746042800D0FFDF3520A6F833 +:101C400000A02880002FBAD04046A7F80A8012E0F2 +:101C5000207B1746052802D0062800D0FFDF102081 +:101C6000308036202880002FA9D0E0897881A7F81D +:101C70000E80B9F80E00B881A1E7207B91460728B5 +:101C800000D0FFDF37803720B0E72AE04FF01200A6 +:101C900018804FF038001700288090D0E0897881B4 +:101CA000A7F80E80A7F8108099F80C000A2805D034 +:101CB0000B2809D00C280DD0FFDF80E7207B0A28F5 +:101CC00000D0FFDF01200AE0207B0B2800D0FFDFDF +:101CD000042004E0207B0C2800D0FFDF05203873AF +:101CE0006DE7FFDF6BE770B50C46054601F0ABFB17 +:101CF00020B10078222804D2082070BD43F20200EF +:101D000070BD0521284610F0F1FC206008B10020CC +:101D100070BD032070BD30B44880087820F00F00FB +:101D2000C01C20F0F000903001F8080B1DCA81E8BB +:101D30001D0030BC07F0D9BB2DE9FF4784B0002758 +:101D40008246029707989046894612300AF0AAF90F +:101D5000401D20F00306079828B907A95046FFF751 +:101D6000C2FF002854D1B9F1000F05D00798017BBC +:101D700019BB052504681BE098F80000092803D06A +:101D80000D2812D0FFDF46E0079903254868B0B35D +:101D9000497B42887143914239D98AB2B3B2011D5D +:101DA00010F017FB0446078002E0079C0425083466 +:101DB0000CB1208810B1032D29D02CE00798012107 +:101DC00012300AF0A1F9ADF80C00024602AB294628 +:101DD000504608F0F0F9070001D1A01C02900798C6 +:101DE0003A461230C8F80400A8F802A003A94046F9 +:101DF000029B0AF096F9D8B10A2817D200E006E053 +:101E0000DFE800F007091414100B0D14141213204E +:101E100014E6002012E6112010E608200EE643F238 +:101E200003000BE6072009E60D2007E6032005E680 +:101E3000BDF80C002346CDE900702A4650460799AC +:101E400000F015FD57B9032D08D10798B3B2417BB7 +:101E5000406871438AB2011D10F0CFFAB9F1000F4A +:101E6000D7D0079981F80C90D3E72DE9FE4F914622 +:101E70001A881C468A468046FAB102AB494608F0E9 +:101E80009AF9050019D04046A61C278810F072FD6B +:101E90003246072629463B46009610F080F92088F6 +:101EA0002346CDE900504A465146404600F0DFFC4B +:101EB000002020800120BDE8FE8F0020FBE710B548 +:101EC00086B01C46AAB104238DF800301388ADF803 +:101ED00008305288ADF80A208A788DF80E200988DB +:101EE000ADF80C1000236A462146FFF725FF06B027 +:101EF00010BD1020FBE770B50D46052110F0F6FB74 +:101F0000040000D1FFDF294604F11200BDE8704053 +:101F10000AF0E3B82DE9F8430D468046002607F0A5 +:101F2000E1FA04462878102878D2DFE800F0773B01 +:101F30003453313112313131083131313131287975 +:101F4000001FC0B2022801D0102810D114BBFFDF3F +:101F500035E004B9FFDF0521404610F0C7FB007BE8 +:101F6000032806D004280BD0072828D0FFDF072637 +:101F700055E02879801FC0B2022820D050B1F6E782 +:101F80002879401FC0B2022819D0102817D0EEE7D8 +:101F900004B9FFDF13E004B9FFDF287901280ED16F +:101FA000172137E00521404610F0A0FB070000D1C3 +:101FB000FFDF07F1120140460AF06CF82CB12A4607 +:101FC00021464046FFF7A7FE29E01321404602F0D4 +:101FD000F1FC24E004B9FFDF0521404610F086FB48 +:101FE000060000D1FFDF694606F112000AF05CF836 +:101FF000060000D0FFDFA988172901D2172200E0D0 +:102000000A46BDF80000824202D9014602E005E01E +:102010001729C5D3404600F03AFCD0E7FFDF304631 +:10202000BDE8F883401D20F0030219B102FB01F066 +:10203000001D00E000201044704713B5009848B11F +:102040000024684610F06FF9002C02D1F74A00997D +:1020500011601CBD01240020F4E72DE9F0470C4677 +:1020600015462421204622F0DEFC05B9FFDFA878C2 +:1020700060732888DFF8B4A3401D20F00301AF7817 +:102080008946DAF8000010F06CF9060000D1FFDF95 +:102090004FF000082660A6F8008077B109FB07F131 +:1020A000091D0AD0DAF8000010F05BF9060000D133 +:1020B000FFDF6660C6F8008001E0C4F8048029886C +:1020C00004F11200BDE8F04709F0D6BF2DE9F04752 +:1020D000804601F112000D46814609F0E3FF401DE4 +:1020E000D24F20F003026E7B14462968386810F046 +:1020F00063F93EB104FB06F2121D03D0696838682B +:1021000010F05AF9052010F099FA0446052010F055 +:102110009DFA201A012802D1386810F017F94946B3 +:102120004046BDE8F04709F0BCBF70B50546052143 +:1021300010F0DCFA040000D1FFDF04F112012846A0 +:10214000BDE8704009F0A6BF2DE9F04F91B04FF007 +:10215000000BADF834B0ADF804B047880C46054626 +:1021600092460521384610F0C1FA060000D1FFDF83 +:1021700024B1A780A4F806B0A4F808B029780922F1 +:102180000B20B2EB111F7DD12A7A04F11001382700 +:102190004FF00C084FF001090391102A73D2DFE8C9 +:1021A00002F072F2F1F07F08D2888D9F3DDBF3EEF2 +:1021B000B6B6307B022800D0FFDFA88908EBC0014B +:1021C000ADF804103021ADF83410002C25D060811A +:1021D000B5F80E9000271DE004EBC708317C88F8A5 +:1021E0000E10F189A8F80C10CDF80090688804232F +:1021F00004AA296900F02BFBBDF81010A8F81010F4 +:1022000009F10400BDF812107F1C1FFA80F9A8F82C +:102210001210BFB26089B842DED80DE1307B0228CF +:1022200000D0FFDFE98908EBC100ADF804003020E1 +:10223000ADF83400287B0A90001FC0B20F90002C2C +:10224000EBD06181B5F81090002725E0CDF8009023 +:102250006888696903AA0A9B00F0F9FA0A9804EBF6 +:10226000C70848441FFA80F908F10C0204A90F9826 +:1022700011F0C9FF18B188F80EB0A8F80CB0BDF87D +:102280000C1001E0D4E0CFE0A8F81010BDF80E105B +:102290007F1CA8F81210BFB26089B842D6D8CBE034 +:1022A0000DA8009001AB224629463046FFF71BFBE4 +:1022B000C2E0307B082805D0FFDF03E0307B082830 +:1022C00000D0FFDFE8891030ADF804003620ADF80B +:1022D0003400002C3FD0A9896181F189A18127E0D8 +:1022E000307B092800D0FFDFA88900F10C01ADF890 +:1022F00004103721ADF83410002C2CD06081E8890F +:102300000090AB89688804F10C02296956E0E889DD +:102310003921103080B2ADF80400ADF83410002C33 +:1023200074D0A9896181287A0E280AD002212173EC +:10233000E989E181288A0090EB8968886969039AB4 +:102340003CE00121F3E70DA8009001AB22462946AD +:102350003046FFF759FB6FE0307B0A2800D0FFDFE3 +:102360001220ADF80400ADF834704CB3A989618136 +:10237000A4F810B0A4F80EB084F80C905CE020E053 +:1023800002E031E039E042E0307B0B2800D0FFDF93 +:10239000288AADF834701230ADF8040084B10421FD +:1023A0002173A9896181E989E181298A2182688A69 +:1023B00000902B8A688804F11202696900F047FADC +:1023C0003AE0307B0C2800D0FFDF1220ADF804008B +:1023D000ADF834703CB305212173A4F80AB0A4F819 +:1023E0000EB0A4F810B027E00DA8009001AB224673 +:1023F00029463046FFF75CFA1EE00DA8009001ABBD +:10240000224629463046FFF7B6FB15E034E03B2173 +:10241000ADF80400ADF8341074B3A4F80690A4F835 +:1024200008B084F80AB007E0FFDF05E010000020E4 +:10243000297A012917D0FFDFBDF80400AAF80000AF +:102440006CB1BDF834002080BDF804006080BDF898 +:102450003400392803D03C2801D086F80CB011B0E4 +:102460000020BDE8F08F3C21ADF80400ADF8341039 +:1024700014B1697AA172DFE7AAF80000EFE72DE94D +:10248000F84356880F46804615460521304610F021 +:102490002DF9040000D1FFDF123400943B46414681 +:1024A00030466A6809F071FFBAE570B50D4605213E +:1024B00010F01CF9040000D1FFDF294604F11200DE +:1024C000BDE8704009F0FBBD70B50D46052110F068 +:1024D0000DF9040000D1FFDF294604F11200BDE828 +:1024E000704009F019BE70B50546052110F0FEF8E0 +:1024F000040000D1FFDF04F1080321462846BDE8AF +:1025000070400422B1E470B50546052110F0EEF8E4 +:10251000040000D1FFDF214628462368BDE8704053 +:102520000522A2E470B50646052110F0DFF804008C +:1025300000D1FFDF04F1120009F0B4FD401D20F0CE +:10254000030511E0011D008803224318214630468F +:10255000FFF78BFC00280BD0607BABB2684382B2E4 +:102560006068011D0FF07FFF606841880029E9D194 +:1025700070BD70B50E46054606F0B4FF040000D1EC +:10258000FFDF0120207266726580207820F00F0046 +:10259000C01C20F0F00030302070BDE8704006F024 +:1025A000A4BF2DE9F0438BB00D461446814606A921 +:1025B000FFF799FB002814D14FF6FF7601274FF45F +:1025C00020588CB103208DF800001020ADF81000C9 +:1025D00007A8059007AA204604A911F033FE78B198 +:1025E00007200BB0BDE8F0830820ADF808508DF847 +:1025F0000E708DF80000ADF80A60ADF80C800CE0AC +:102600000698A17801742188C1818DF80E70ADF80B +:102610000850ADF80C80ADF80A606A4602214846C1 +:10262000069BFFF789FBDCE708B501228DF8022045 +:1026300042F60202ADF800200A4603236946FFF77E +:102640003EFC08BD08B501228DF8022042F60302C7 +:10265000ADF800200A4604236946FFF730FC08BDA8 +:1026600000B587B079B102228DF800200A88ADF854 +:1026700008204988ADF80A1000236A460521FFF7B3 +:102680005BFB07B000BD1020FBE709B1072316E490 +:102690000720704770B588B00D461446064606A957 +:1026A000FFF721FB00280ED17CB10620ADF80850C1 +:1026B0008DF80000ADF80A40069B6A460821DC81CF +:1026C0003046FFF739FB08B070BD05208DF80000DB +:1026D000ADF80850F0E700B587B059B107238DF881 +:1026E0000030ADF80820039100236A460921FFF766 +:1026F00023FBC6E71020C4E770B588B00C46064639 +:10270000002506A9FFF7EFFA0028DCD10698012181 +:10271000123009F0F9FC9CB12178062921D2DFE8BA +:1027200001F0200505160318801E80B2C01EE28845 +:1027300080B20AB1A3681BB1824203D90C20C2E760 +:102740001020C0E7042904D0A08850B901E0062079 +:10275000B9E7012913D0022905D004291CD0052985 +:102760002AD00720AFE709208DF800006088ADF877 +:102770000800E088ADF80A00A068039023E00A2072 +:102780008DF800006088ADF80800E088ADF80A0018 +:10279000A0680A25039016E00B208DF800006088E1 +:1027A000ADF80800A088ADF80A00E088ADF80C008C +:1027B000A0680B25049006E00C208DF800006078DE +:1027C0008DF808000C256A4629463046069BFFF71F +:1027D000B3FA78E700B587B00D228DF80020ADF888 +:1027E000081000236A461946FFF7A6FA49E700B524 +:1027F00087B071B102228DF800200A88ADF8082058 +:102800004988ADF80A1000236A460621FFF794FABA +:1028100037E7102035E770B586B0064601200D4633 +:10282000ADF808108DF80000014600236A463046D6 +:10283000FFF782FA040008D12946304605F054FC1F +:102840000021304605F06EFC204606B070BDF8B59C +:102850001C4615460E46069F10F07AF82346FF1DCB +:10286000BCB231462A4600940FF065FCF8BD30B486 +:102870001146DDE902423CB1032903D0002330BCFC +:1028800008F024BB0123FAE71A8030BC704770B50A +:102890000C460546FFF72FFB2146284605F033FC82 +:1028A0002846BDE87040012105F03CBC4FF0E02215 +:1028B0004FF400400021C2F88001BFF34F8FBFF3F7 +:1028C0006F8F1748016001601649900208607047D9 +:1028D000134900B500220A600A60124B4FF0607283 +:1028E0001A60002808BF00BD0F4A104BDFF840C037 +:1028F00001280CD002281CBFFFDF00BD03200860A8 +:102900001A604FF4000000BFCCF8000000BD0220A8 +:1029100008601A604FF04070F6E700B5FFDF00BDB9 +:1029200000F5004008F50140A002002014F5004029 +:1029300004F5014070B50B2000F0BDF9082000F04F +:10294000BAF900210B2000F0D4F90021082000F092 +:10295000D0F9F44C01256560A5600020C4F8400161 +:10296000C4F84401C4F848010B2000F0B5F9082070 +:1029700000F0B2F90B2000F091F9256070BD10B5A0 +:102980000B2000F098F9082000F095F9E5480121A6 +:1029900041608160E4490A68002AFCD10021C0F846 +:1029A0004011C0F84411C0F848110B2000F094F910 +:1029B000BDE81040082000F08FB910B50B2000F0E2 +:1029C0008BF9BDE81040082000F086B900B530B1A1 +:1029D000012806D0022806D0FFDF002000BDD34822 +:1029E00000BDD34800BDD248001D00BD70B5D1491F +:1029F0004FF000400860D04DC00BC5F80803CF4829 +:102A000000240460C5F840410820C43500F053F9A3 +:102A1000C5F83C41CA48047070BD08B5C14A0021E0 +:102A200028B1012811D002281CD0FFDF08BD4FF4C7 +:102A30008030C2F80803C2F84803BB483C3001604C +:102A4000C2F84011BDE80840D0E74FF40030C2F8AA +:102A50000803C2F84803B44840300160C2F844118A +:102A6000B3480CE04FF48020C2F80803C2F84803D2 +:102A7000AD4844300160C2F84811AD48001D0068FF +:102A8000009008BD70B516460D460446022800D9D0 +:102A9000FFDF0022A348012304F110018B4000EB6B +:102AA0008401C1F8405526B1C1F84021C0F8043373 +:102AB00003E0C0F80833C1F84021C0F8443370BDCA +:102AC0002DE9F0411D46144630B1012833D00228CB +:102AD00038D0FFDFBDE8F081891E002221F07F4160 +:102AE0001046FFF7CFFF012D23D00020944D924FC9 +:102AF000012668703E61914900203C39086002203F +:102B0000091D08608D490420303908608B483D3428 +:102B1000046008206C6000F0DFF83004C7F804039C +:102B2000082000F0BBF88349F007091F08602E70E9 +:102B3000D0E70120DAE7012B02D00022012005E0D6 +:102B40000122FBE7012B04D000220220BDE8F04166 +:102B500098E70122F9E774480068704770B500F003 +:102B6000D8F8704C0546D4F840010026012809D158 +:102B7000D4F80803C00305D54FF48030C4F8080327 +:102B8000C4F84061D4F8440101280CD1D4F80803FA +:102B9000800308D54FF40030C4F80803C4F844613A +:102BA000012012F025FBD4F8480101280CD1D4F8FB +:102BB0000803400308D54FF48020C4F80803C4F884 +:102BC0004861022012F014FB5E48056070BD70B5CC +:102BD00000F09FF85A4D0446287850B1FFF706FFE1 +:102BE000687818B10020687012F002FB5548046044 +:102BF00070BD0320F8E74FF0E0214FF40010C1F85A +:102C000000027047152000F067B84B4901200861A9 +:102C1000082000F061B848494FF47C10C1F808035F +:102C20000020024601EB8003C3F84025C3F8402191 +:102C3000401CC0B20628F5D37047410A43F609523A +:102C40005143C0F3080010FB02F000F5807001EB67 +:102C50005020704710B5430B48F2376463431B0C98 +:102C60005C020C60384C03FB0400384B4CF2F72438 +:102C700043435B0D13FB04F404EB402000F580702C +:102C80004012107008681844086010BD2C48406855 +:102C9000704729490120C1F800027047002809DB6C +:102CA00000F01F02012191404009800000F1E02066 +:102CB000C0F80011704700280DDB00F01F02012151 +:102CC00091404009800000F1E020C0F88011BFF37E +:102CD0004F8FBFF36F8F7047002809DB00F01F0292 +:102CE000012191404009800000F1E020C0F88012ED +:102CF00070474907090E002804DB00F1E02080F846 +:102D00000014704700F00F0000F1E02080F8141D5F +:102D100070470C48001F00680A4A0D49121D1160D7 +:102D20007047000000B0004004B500404081004002 +:102D300044B1004008F5014000800040408500405B +:102D40003400002014050240F7C2FFFF6F0C0100A1 +:102D5000010000010A4810B5046809490948083112 +:102D6000086012F0D9FA0648001D046010BD06493B +:102D7000002008604FF0E0210220C1F88002704777 +:102D80001005024001000001FC1F004010B50D209D +:102D900000F077F8C4B26FF0040000F072F8C0B22F +:102DA000844200D0FFDF3E490120086010BD70B5AD +:102DB0000D2000F048F83B4C0020C4F8000101252C +:102DC000C4F804530D2000F04FF825604FF0E021C7 +:102DD0006014C1F8000170BD10B50D2000F033F88B +:102DE0003048012141600021C0F80011BDE81040C9 +:102DF0000D2000F039B82C4810B504682A492B483A +:102E0000083108602749D1F80001012804D0FFDF0C +:102E10002548001D046010BD2148001D00680022E7 +:102E2000C0B2C1F8002112F0C3FEF1E710B51D4891 +:102E3000D0F800110029FBD0FFF7DDFFBDE81040FE +:102E40000D2000F011B800280DDB00F01F02012159 +:102E500091404009800000F1E020C0F88011BFF3EC +:102E60004F8FBFF36F8F7047002809DB00F01F0200 +:102E7000012191404009800000F1E020C0F880125B +:102E80007047002804DB00F1E02090F8000405E022 +:102E900000F00F0000F1E02090F8140D4009704799 +:102EA00004D5004000D000401005024001000001A0 +:102EB0004FF0E0214FF00070C1F8800101F5C071C2 +:102EC000BFF34F8FBFF36F8FC1F80001384B8022E3 +:102ED00083F8002441F8800C704700B502460420B6 +:102EE000344903E001EBC0031B792BB1401EC0B293 +:102EF000F8D2FFDFFF2000BD41F8302001EBC00118 +:102F000000224A718A7101220A7100BD294A0021FA +:102F100002EBC0000171704710B50446042800D3CD +:102F2000FFDF244800EBC4042079012800D0FFDF34 +:102F30006079A179401CC0B2814200D060714FF02D +:102F4000E0214FF00070C1F8000210BD2DE9F04102 +:102F500019480568184919480831086014480426BA +:102F600090F80004134F4009154C042818D0FFDFD7 +:102F700016E0217807EBC1000279012A08D14279D5 +:102F800083799A4204D04279827157F831008047A0 +:102F90002078401CC0B22070042801D3002020708B +:102FA000761EF6B2E5D20448001D0560BDE8F0814A +:102FB00019E000E0D80500201005024001000001E2 +:102FC000500000200548064A0168914201D10021C5 +:102FD000016004490120086070470000540000208F +:102FE000BEBAFECA40E5014070B50C46054609F080 +:102FF00069FB21462846BDE870400AF04EBC704788 +:103000002CFFFFFFDBE5B15100600200B700FFFFBE +:103010008400000069915B00935FFEEDA0843C7327 +:10302000F87462145E06C0CB72F2136030B5F84DCE +:103030000446062CA9780ED2DFE804F0030E0E0E2B +:103040000509FFDF08E0022906D0FFDF04E00329BD +:1030500002D0FFDF00E0FFDFAC7030BD30B50446CA +:103060001038EB4D07280CD2DFE800F0040C060CFA +:103070000C0C0C00FFDF05E0287E112802D0FFDFDA +:1030800000E0FFDF2C7630BD2DE9F04111F044FA6D +:10309000044612F01DFC201AC5B206200FF0CEFA2D +:1030A000044606200FF0D2FA211AD94C207E1228AD +:1030B00018D000200F1807200FF0C0FA064607208E +:1030C0000FF0C4FA301A3918207E13280CD00020D3 +:1030D0000144A078042809D000200844281AC0B26E +:1030E000BDE8F0810120E5E70120F1E70120F4E7E8 +:1030F000C74810B590F825004108C54800F12600E2 +:1031000005D00DF0A8FABDE8104006F001B80DF0AA +:1031100083FAF8E730B50446A1F120000D460A28ED +:103120004AD2DFE800F005070C1C2328353A3F445B +:10313000FFDF42E0207820283FD1FFDF3DE0B448A8 +:103140008178052939D0007E122836D020782428AD +:1031500033D0252831D023282FD0FFDF2DE0207851 +:1031600022282AD0232828D8FFDF26E0207822280A +:1031700023D0FFDF21E0207822281ED024281CD075 +:1031800026281AD0272818D0292816D0FFDF14E0C7 +:103190002078252811D0FFDF0FE0207825280CD0DB +:1031A000FFDF0AE02078252807D0FFDF05E0207840 +:1031B000282802D0FFDF00E0FFDF257030BD1FB5FB +:1031C00004466A46002001F036FEB4B1BDF8022084 +:1031D0004FF6FF700621824201D1ADF80210BDF812 +:1031E0000420824201D1ADF80410BDF808108142DC +:1031F00003D14FF44860ADF8080068460DF0A7FF12 +:1032000005F086FF04B010BD70B514460D460646A5 +:10321000FEF759F858B90DB1A54201D90C2070BD7F +:10322000002408E056F82400FEF74DF808B11020FD +:1032300070BD641CE4B2AC42F4D3002070BD2DE933 +:10324000F04105461F4690460E4600240068FEF7F2 +:1032500087F830B9A98828680844401EFEF780F82E +:1032600008B110203CE728680028A88802D0B8429E +:1032700002D850E00028F5D0092031E72968085D20 +:10328000B8B1671CCA5D152A2ED03CDC152A3AD28B +:10329000DFE802F03912222228282A2A313139396E +:1032A00039393939393939392200085D30BB641C64 +:1032B000A4B2A242F9D833E00228DDD1A01C085CF8 +:1032C00088F80000072801D2400701D40A2007E748 +:1032D000307840F0010015E0C143C90707E001283C +:1032E00007D010E00620FBE60107A1F1805100297C +:1032F000F5D01846F4E63078810701D50B20EFE6CB +:1033000040F0020030702868005D384484B2A8881C +:10331000A04202D2B0E74FF4485382B2A242ADD8E5 +:103320000020DDE610B5027843F2022354080122A2 +:10333000022C12D003DC3CB1012C16D106E0032C88 +:1033400010D07F2C11D112E0002011E080790324ED +:10335000B4EB901F09D10A700BE08079B2EB901F9B +:1033600003D1F8E780798009F5D0184610BDFF2019 +:103370000870002010BD08B500208DF8000024481A +:1033800090F82E1049B190F82F0002280ED0032893 +:103390000ED0FFDF9DF8000008BD1D4869462530AE +:1033A00001F098FD0028F5D0FFDFF3E7032000E0EF +:1033B00001208DF80000EDE738B50C46054669465A +:1033C00001F088FD00280DD19DF80010207861F3F0 +:1033D0004700207055F8010FC4F80100A888A4F830 +:1033E0000500002038BD38B51378A8B1022813D0E5 +:1033F000FF281AD007A46D46246800944C7905EB89 +:103400009414247864F347031370032809D00FE061 +:10341000EC0100200302FF0123F0FE0313700228D9 +:10342000F3D1D8B240F0010005E043F0FE00107087 +:10343000107820F0010010700868C2F80100888838 +:10344000A2F8050038BD02210FF050B938B50C467E +:103450000978222901D2082038BDADF800008DF886 +:10346000022068460DF039F905F052FE050003D13F +:1034700021212046FFF74EFE284638BD1CB500200E +:103480008DF80000CDF80100ADF80500FE4890F879 +:103490002E00022801D0012000E000208DF8070056 +:1034A00068460DF083FA002800D0FFDF1CBD002223 +:1034B0000A80437892B263F3451222F040020A80F8 +:1034C00000780C282BD2DFE800F02A06090E11162E +:1034D000191C1F220C2742F0110009E042F01D00C8 +:1034E00008800020704742F0110012E042F0100006 +:1034F00040F00200F4E742F01000F1E742F0010072 +:10350000EEE742F0010004E042F00200E8E742F09A +:10351000020040F00400E3E742F00400E0E7072087 +:1035200070472DE9FF478AB00025BDF82C60824620 +:103530001C4690468DF81C50700703D56068FDF757 +:10354000C2FE68B9D04F4FF0010997F82E0058B16C +:1035500097F82F00022807D16068FDF701FF18B126 +:1035600010200EB0BDE8F087300702D5A089802872 +:1035700016D8700705D4B8F1000F02D097F82400D0 +:1035800070B1E07DC0F300108DF81B00617D072055 +:1035900041B1012906D00229E3D00429E1D12CE070 +:1035A0000720DEE749468DF81790F00609D4A27D82 +:1035B000072032B1012A04D0022A05D0042AD0D132 +:1035C0001BE08DF8191002E002208DF819008DF82B +:1035D00015806068B0B107A9FFF7A4FE0028C0D12C +:1035E0009DF81C00FF280AD0606850F8011FCDF834 +:1035F0000F108088ADF8130008E00620B1E743F211 +:103600000220AEE7CDF80F50ADF81350E07B002854 +:10361000F3D1207C0028F0D1607C0028EDD1A07C83 +:103620000028EAD1E07CC006E7D18DF800A0BDF803 +:103630002C00ADF80200A0680190A068029004F18F +:103640000F0001F03BFC8DF80C00FFF794FE8DF8A5 +:103650000D009DF81C008DF80E008DF816508DF8A9 +:103660001850E07D08A900F00F008DF81A00684698 +:103670000DF0B7FE05F04CFD73E7F0B58FB00025F7 +:103680008DF830508DF814508DF8345006468DF872 +:103690002850019502950395049519B10FC901AC05 +:1036A00084E80F00784CA078052801D004280CD1BC +:1036B00001986168884200D120B90398E168884286 +:1036C00003D110B108200FB0F0BD207DC00601D598 +:1036D0001F2700E0FF273B460DAA05A903A8FFF717 +:1036E000AEFD0028EFD1A08AC10702D0C00600D4E9 +:1036F000EE273B460AAA0CA901A8FFF7A0FD002867 +:10370000E1D19DF81400C00701D00A20DBE7A08AB0 +:10371000410708D4A17D31B19DF82810890702D056 +:1037200043F20120CFE79DF82810C90709D04007D0 +:1037300007D4208818B144F25061884201D907208B +:10374000C1E78DF818508DF81960BDF80800ADF884 +:103750001A000198079006A80DF05DFE05F0D8FC50 +:103760000028B0D18DF820508DF82160BDF81000F0 +:10377000ADF822000398099008A80DF06BFE05F043 +:10378000C7FC00289FD101AD241D95E80F0084E8F7 +:103790000F00002097E770B586B00D46040005D0F5 +:1037A000FDF7DEFD20B1102006B070BD0820FBE75C +:1037B0002078C107A98802D0FF2902D303E01F297E +:1037C00001D20920F0E780073BD4FFF75DFC38B158 +:1037D0002178C1F3C100012804D0032802D005E0FC +:1037E0001320E1E7284890F82400C8B1C8074FF03B +:1037F00001064FF0000502D08DF80F6001E08DF852 +:103800000F50FFF7B8FD8DF8000020786946C0F32F +:10381000C1008DF8010060788DF80250C20801D017 +:103820000720C1E778B1C20701D08DF80260820796 +:1038300005D59DF8022042F002028DF802204007D3 +:1038400003D50620B0E78DF80260002022780B181F +:10385000C2F38002DA7001EB40026388D380401C1F +:10386000A388C0B253810228F0D3207A0028E8D17F +:10387000607A0028E5D1A07A0028E2D1E07A002819 +:10388000DFD1207BC00601E0EC010020D9D104F19A +:10389000080001F013FB8DF80E0068460DF0B1F939 +:1038A00005F036FC00288DD18DF810608DF8115090 +:1038B000E088ADF81200ADF8145004A80DF0F4F94A +:1038C00005F026FC00288CD12078C00701D01520F7 +:1038D00000E01320FFF7C2FB002065E72DE9FF475A +:1038E0000220FC4E8DF804000027708EADF8060013 +:1038F000B84643F202094CE001A80EF05EFE050056 +:1039000006D0708EA8B3A6F83280ADF806803EE0EF +:10391000039CA07F01072DD504F124000090A28E06 +:10392000BDF80800214604F1360301F05CFC0500F7 +:1039300005D04D452AD0112D3CD0FFDF3AE0A07FC5 +:1039400020F00801E07F420862F3C711A1778108E7 +:1039500061F30000E07794F8210000F01F0084F884 +:1039600020002078282826D129212046FFF7D2FBE5 +:1039700021E014E040070AD5BDF8080004F10E016B +:1039800001F0B2FA05000DD04D4510D100257F1C85 +:10399000FFB202200EF052FE401CB842ACD8052DFA +:1039A00011D008E0A07F20F00400A07703E0112DE3 +:1039B00000D0FFDF0025BDF806007086052D04D07D +:1039C000284604B0CEE5A6F832800020F9E770B5AD +:1039D0000646FFF738FD054605F084FD040000D1DA +:1039E000FFDF6680207820F00F00801C20F0F000C0 +:1039F000203020700320207295F83E006072BDE8F0 +:103A0000704005F072BD2DE9F04786B0040000D18A +:103A1000FFDF2078AF4D20F00F00801C20F0F00079 +:103A20007030207060680178491F1B2933D2DFE8AD +:103A300001F0FC32323255FB320EFBFB42FA3232DD +:103A40003278FAFAF9F83232FAFAF7F6FA00C6885A +:103A50003046FFF7F8FC0546304607F035F9E0B18F +:103A60006068007A85F83E0021212846FFF752FB66 +:103A70003046FEF75AFB304603F058FE314601202F +:103A800012F056FBA87F20F01000A877FFF726FF62 +:103A9000002800D0FFDF06B064E5207820F0F000B9 +:103AA000203020700320207266806068007A607287 +:103AB00005F01BFDD8E7C5882846FFF7C4FC00B910 +:103AC000FFDF60680079012800D0FFDF6068017ABD +:103AD00006B02846BDE8F04707F0D5BCC68830469A +:103AE000FFF7B1FC050000D1FFDF05F0FEFC6068C8 +:103AF00031460089288160684089688160688089D2 +:103B0000A881012012F014FB0020A875A87F00F006 +:103B100003000228BFD1FFF7E1FE0028BBD0FFDF82 +:103B2000B9E700790228B6D000B1FFDF05F0DDFC6F +:103B30006668B6F806A0307A361D012806D0687E81 +:103B4000814605F051FA070003D101E0E878F7E774 +:103B5000FFDF0022022150460EF0BFFD040000D11D +:103B6000FFDF22212046FFF7D5FA3079012800D067 +:103B70000220A17F804668F30101A177308B20816C +:103B8000708B6081B08BA08184F822908DF80880C2 +:103B9000B8680090F86801906A46032150460EF01C +:103BA0009CFD00B9FFDFB888ADF81000B8788DF83B +:103BB000120004AA052150460EF08FFD00B9FFDF68 +:103BC000B888ADF80C00F8788DF80E0003AA04212F +:103BD00050460EF082FD00B9FFDF062106F112000B +:103BE00001F0A0F940B37079800700D5FFDF71794B +:103BF000E07D61F34700E075D6F80600A0617089AA +:103C0000A083062106F10C0001F08CF9F0B195F8C3 +:103C100025004108607861F34700607006E040E0ED +:103C200038E070E058E04DE02EE042E0D5F82600A4 +:103C3000C4F80200688D12E0E07D20F0FE00801CD8 +:103C4000E075D6F81200A061F08AD9E7607820F01C +:103C5000FE00801C6070F068C4F80200308AE080CA +:103C6000B8F1010F04D0B8F1020F05D0FFDF12E761 +:103C70000320FFF7DBF90EE7287E122800D0FFDFD4 +:103C80001120FFF7EBF906E706B02046BDE8F04744 +:103C900001F032BD05F029FC15F8300F40F00200AC +:103CA00005E005F022FC15F8300F40F00400287004 +:103CB000F1E6287E13280AD01528D8D15FF0160027 +:103CC000FFF7CCF906B0BDE8F04705F00EBC1420B4 +:103CD000F6E70000EC010020A978052909D00429A5 +:103CE000C5D105F002FC022006B0BDE8F047FFF7A1 +:103CF0009DB900790028BAD0E87801F0C6F805F03F +:103D0000F4FB0320F0E7287E122802D1687E01F040 +:103D1000BCF81120D4E72DE9F047054600784FF0B4 +:103D200000080009DFF8C0A891460C464646012865 +:103D300075D0022874D007280AD00A2871D0FFDF76 +:103D4000A9F8006014B1A4F800806680002009E49E +:103D50006968012704F108000A784FF0020C4FF659 +:103D6000FF73172A7ED00EDC142A32D006DC052A17 +:103D700068D0092A10D0102A75D120E0152A73D0F6 +:103D8000162AF9D1F8E0183A082A6CD2DFE802F0D6 +:103D9000F36B6B0ACAF2DFF1C8884FF012081026E5 +:103DA00021468DE14FF01C080A26BCB38888A0800C +:103DB0006868807920726868C0796072C0E74FF0E7 +:103DC0001B08142654B30320207268688088A080E2 +:103DD000B6E70A793C2AB3D00D1D4FF010082C2607 +:103DE000E4B16988A180298B6182298B2182698B4A +:103DF000A182A98BE1826B790246A91D1846FFF7C3 +:103E0000F2FA2979002001290CD084F80FC0FF2193 +:103E10002176E06120626062A06291E70FE02EE10E +:103E200051E18CE1E77320760AF1040090E80E007E +:103E3000DAF81000C4E90930C4E9071280E7A9F8EC +:103E4000006083E72C264FF01D08002CF7D00546B4 +:103E5000A380887B2A880F1D60F300022A80887B5C +:103E6000400802E09DE007E1BEE060F341022A80E5 +:103E7000887B800860F382022A80887BB91CC00896 +:103E800060F3C3022A80B87A0011401C60F3041268 +:103E900002F07F0028807878AA1CFFF7A4FA387D0A +:103EA00005F1090207F11501FFF79DFA387B01F0D2 +:103EB00048F82874787B01F044F86874F87EA87498 +:103EC000787AE874387F2875B87B6875388AE88214 +:103ED000DAF81C00A861B87A524697F808A0C0F337 +:103EE0004111012904D0108C504503D2824609E0CB +:103EF000FFDF10E0022903D0288820F0600009E0ED +:103F0000504504D1288820F06000403002E0288825 +:103F100040F060002880A4F824A0524607F11D015B +:103F2000A86996E011264FF02008002C87D0A380C6 +:103F3000686804F10A02007920726868007B607288 +:103F400069688B1D48791946FFF74DFAF8E60A268D +:103F50004FF02108002CE9D08888A080686880791B +:103F600020726868C07960729AF8301021F00401FC +:103F70009FE065E04CE06FE00B264FF02208002C3C +:103F8000D4D0C888A0806868007920726868007AF8 +:103F900000F0D7FF60726868407A00F0D2FFA0722C +:103FA000CEE61C264FF02608002CBFD0A380686800 +:103FB000407960726868007AA0720AF1040090E8A3 +:103FC0000E00DAF81000C4E90530C4E9031268688D +:103FD00000793C2803D0432803D0FFDFB0E62772E6 +:103FE000AEE684F808C0ABE610264FF02408002C9B +:103FF0009CD08888A0806868807920816868807AF1 +:10400000608168680089A08168688089E08197E69E +:1040100010264FF02308002C88D08888A08068687C +:10402000C088208168680089608168684089A081B3 +:1040300068688089E0819AF8301021F0020138E048 +:1040400030264FF02508002C85D0A38069682822EF +:10405000496820F047FC73E614264FF01B08002C3B +:104060008ED0A380686800790128BAD02772DAE977 +:104070000710C4E9031063E64A46214660E0287A47 +:10408000012803D0022817D0FFDF59E610264FF091 +:104090001F08002C89D06888A080A8892081E88921 +:1040A0006081288AA081688AE0819AF8301021F026 +:1040B00001018AF8301043E64FF012081026688894 +:1040C00000F01DFF3CE6287AC8B3012838D002284A +:1040D00036D0032801D0FFDF32E609264FF0110861 +:1040E000002C85D06F883846FFF7ADF990F822A0F4 +:1040F000A780687A2072042138460EF009FB05215A +:1041000038460EF005FB002138460EF001FB012178 +:1041100038460EF0FDFA032138460EF0F9FA022176 +:1041200038460EF0F5FA062138460EF0F1FA07216E +:1041300038460EF0EDFA504600F0A7FE00E6FFE725 +:104140002846BDE8F04701F061BC70B5012803D0F6 +:10415000052800D0FFDF70BD8DB22846FFF773F948 +:10416000040000D1FFDF20782128F4D005F0BAF94F +:1041700080B1017821F00F01891C21F0F00110318C +:1041800001700221017245800020A075BDE87040D9 +:1041900005F0ABB921462846BDE870401322FFF771 +:1041A00055B92DE9F04116460C00804600D1FFDFDD +:1041B000307820F00F00801C20F0F00010303070BC +:1041C0002078012804D0022818D0FFDFBDE8F08154 +:1041D0004046FFF738F9050000D1FFDF0320A8753E +:1041E00005F083F994E80F00083686E80F00FE48D2 +:1041F00010F8301F41F001010170E7E74046FFF77A +:1042000022F9050000D1FFDFA1884FF6FF700027DB +:10421000814202D1E288824203D0814201D1E0880A +:1042200040B105F062F994E80F00083686E80F0007 +:10423000AF75CBE7A87D0128C8D17823002241467D +:1042400011F0CCFE0220A875C0E738B505460C4633 +:104250000846FDF738F818BB203D062D4AD2DFE8A6 +:1042600005F0031B373C42300021052011F036FFDA +:1042700008B1112038BDA01C0CF0BCFF04F048FFB1 +:10428000050038D1002208231146052011F0A6FEB2 +:10429000052830D0FFDF2EE06068FDF758F808B140 +:1042A000102038BD618820886A460DF054FA04F069 +:1042B0002FFF05001FD16068E8B1BDF80010018034 +:1042C00019E0A07800F0010120880DF075FA0EE0E9 +:1042D000206801F047FE05460DE0207800F001005F +:1042E0000CF082F903E0618820880DF0B0F904F049 +:1042F0000FFFF0E70725284638BD70B505460C4688 +:104300000846FDF706F808B1102070BD202D07D033 +:10431000212D0DD0222D0BD0252D09D0072070BDC9 +:104320002088A11C0CF036FABDE8704004F0F0BE05 +:10433000062070BDAC482530704708B53421AA4826 +:1043400020F071FB0120FEF771FE1120FEF786FEC2 +:10435000A5496846263105F05BF8A3489DF8002082 +:1043600010F8251F62F3470121F0010101700021BF +:1043700041724FF46171A0F8071002218172FEF7BB +:10438000B7FE00B1FFDFFDF763F801F080F908BD6B +:1043900010B50C464021204620F023FBA07F20F0E2 +:1043A0000300A077202020700020A07584F823004F +:1043B00010BD70472DE9FC410746FCF784FF10B1A2 +:1043C0001020BDE8FC81884E06F12501D6F82500B5 +:1043D0000090B6F82950ADF8045096F82B408DF8AF +:1043E00006403846FEF7E8FF0028EAD1FEF780FED7 +:1043F0000028E6D0009946F8251FB580B471E0E7A3 +:1044000010B50446FCF785FF08B1102010BD7648B2 +:104410007549224690F8250026314008FEF7E3FF53 +:10442000002010BD3EB504460D460846FCF771FF5E +:1044300008B110203EBD14B143F204003EBD6A48ED +:104440008078052803D0042801D008203EBD6946A5 +:1044500002A80AF069FA2A4669469DF80800FEF7A4 +:10446000C2FF00203EBDFEB50D4604004FF0000720 +:1044700011D00822FEF7C8FE002811D1002608E05E +:1044800054F826006946FEF74DFF002808D1761C37 +:10449000F6B2AE42F4D30BF0F1FF10B143F20320B9 +:1044A000FEBD514E86F824700CB300271BE000BF00 +:1044B00054F8270002A9FEF735FF00B1FFDF9DF891 +:1044C00008008DF8000054F8270050F8011FCDF8BF +:1044D00001108088ADF8050068460BF0F4FF00B1CC +:1044E000FFDF7F1CFFB2AF42E2D386F824500020EA +:1044F000FEBD2DE9F0478AB01546894604001ED05E +:104500000F4608222946FEF77FFE002811D100261B +:1045100013E000BF54F826006946103000F0DAFCC2 +:10452000002806D13FB157F82600FCF7CCFE10B1A9 +:1045300010200AB00BE4761CF6B2AE42EAD3002695 +:10454000A5F101081CE000BF06F1010A0AF0FF070F +:1045500012E000BF54F82600017C4A0854F82710E6 +:104560000B7CB2EB530F05D106221130113120F034 +:104570008DF958B17F1CFFB2AF42EBD30AF0FF06B2 +:104580004645E1DB4E4624B1012003E043F205201D +:10459000CFE700200BF0BCFF10B90BF0C5FF10B146 +:1045A00043F20420C5E774B300270DF1170828E093 +:1045B00054F827006946103000F08CFC00B1FFDF92 +:1045C00054F82700102250F8111FCDF801108088F0 +:1045D000ADF8050054F827100DF1070020F082F91E +:1045E000AEB156F8271001E0EC0100201022404641 +:1045F00020F078F968460BF04BFF00B1FFDF7F1C1D +:10460000FFB2AF42D4D3FEF739FF002091E7404616 +:1046100001F09CFCEEE730B585B00446FCF753FE94 +:1046200018B96068FCF79CFE10B1102005B030BDD1 +:1046300060884AF2B811884206D82078F84D28B12F +:10464000012806D0022804D00720EFE7FEF750FD2E +:1046500018E06078022804D0032802D043F2022038 +:10466000E4E785F82F00C1B200200090ADF8040007 +:1046700002292CD0032927D0FFDF68460BF0EBFF7F +:1046800004F046FD0028D1D1606801F052FC20788A +:1046900058B101208DF800000DF1010001F056FC29 +:1046A00068460DF0EDF800B1FFDF207885F82E00A8 +:1046B000FEF7E4FE608860B1A88580B20BF020FFB1 +:1046C00000B1FFDF0020B1E78DF80500D5E74020FD +:1046D000FAE74FF46170EFE710B50446FCF719FEF6 +:1046E00020B9606838B1FCF732FE08B1102010BD67 +:1046F000606801F02BFCCA4830F82C1F6180C1783B +:10470000617080782070002010BD2DE9F8431446B8 +:1047100089460646FCF7FDFDA0B94846FCF720FE99 +:1047200080B92046FCF71CFE60B9BD4DA878012871 +:1047300000D13CB13178FF2906D049B143F20400E1 +:10474000BDE8F8831020FBE7012801D00420F7E73B +:10475000CCB3052811D004280FD069462046FEF7B7 +:10476000A6FE0028ECD1217D49B1012909D00229FA +:1047700009D0032909D00720E2E70820E0E7024634 +:1047800004E0012202E0022200E0032280462346E8 +:10479000174600200099FEF7C4FE0028D0D1A0895A +:1047A0002880A07BE875BDF80000A882AF75BDF831 +:1047B0000010090701D5A18931B1A1892980C0075D +:1047C00004D0032003E006E08021F7E70220FEF793 +:1047D0002DFC86F800804946BDE8F8430020FEF72E +:1047E0004CBF7CB58E4C05460E46A078022803D0FF +:1047F000032801D008207CBD15B143F204007CBD24 +:1048000007200DF023FF10B9A078032806D0FEF78B +:104810003BFC28B1A078032804D009E012207CBD1D +:1048200013207CBD304600F013FB0028F9D1E67060 +:10483000FEF7A1FD09F0B5FF01208DF800008DF80D +:1048400001008DF802502088ADF80400E07D8DF85D +:10485000060068460CF0BEFE04F05AFC0028E0D1C9 +:10486000A078032804D00420FEF7E0FB00207CBDE4 +:10487000E07800F0FDFA0520F6E71CB510B143F230 +:1048800004001CBD664CA078042803D0052801D084 +:1048900008201CBD00208DF8000001218DF80110BA +:1048A0008DF8020068460CF095FE04F031FC0028FB +:1048B000EFD1A078052805D05FF00200FEF7B6FB27 +:1048C00000201CBDE07800F0E0FA0320F6E72DE9B7 +:1048D000FC4180460E4603250846FCF741FD0028B2 +:1048E00066D14046FEF7AFFD040004D020782228B0 +:1048F00004D2082065E543F2020062E5A07F00F0E3 +:1049000003073EB1012F0CD000203146FEF757FCC3 +:104910000500EFD1012F06D0022F1AD0FFDF284665 +:104920004FE50120F1E7A07D3146022801D011B109 +:1049300007E0112045E56846FCF797FE0028D9D12D +:104940006946404606F062FD0500E8D10120A075E9 +:10495000E5E7A07D032804D1314890F83000C00776 +:1049600001D02EB30EE026B1A07F40071ED4002157 +:1049700000E00121404606F069FD0500CFD1A07599 +:10498000002ECCD03146404600F0AEFA0546112844 +:10499000C5D1A07F4107C2D4316844F80E1F7168A9 +:1049A000616040F0040020740025B8E71125B6E7E7 +:1049B000102006E570B50C460546FEF744FD0100E3 +:1049C00005D022462846BDE87040FEF73FBD43F2C1 +:1049D000020070BD10B5012807D1114B9B78012B47 +:1049E00000D011B143F2040010BD0BF0BBFDBDE8D7 +:1049F000104004F08DBB012300F051BA00231A4689 +:104A0000194600F04CBA70B506460C460846FCF74D +:104A10005AFC18B92068FCF77CFC18B1102070BD56 +:104A2000EC010020F84D2A7E112A04D0132A00D36D +:104A30003EB10820F3E721463046FEF7ACFE60B1F8 +:104A4000EDE70920132A0DD0142A0BD0A188FF29E5 +:104A5000E5D31520FEF702FB0020D4E90012C5E9DA +:104A60000712DCE7A1881F29D9D31320F2E71CB570 +:104A7000E548007E132801D208201CBD00208DF8D7 +:104A8000000068460CF010F904F042FB0028F4D155 +:104A90001120FEF7E3FA00201CBD2DE9F04FDFF8EE +:104AA00068A3814691B09AF818009B4615460C46BB +:104AB000132803D3FFF7DBFF00281FD12046FCF7A4 +:104AC00002FC78BB2846FCF7FEFB58BB20784FF071 +:104AD0000107C0074FF0000102D08DF83A7001E0E5 +:104AE0008DF83A1020788846C0F3C1008DF8000098 +:104AF00060788DF80910C10803D0072011B0BDE817 +:104B0000F08F80B1C10701D08DF80970810705D5FC +:104B10009DF8091041F002018DF80910400704D5F5 +:104B20000620EBE720E08DF809709DF80900810769 +:104B300003D540F001008DF8090000206E4606EB19 +:104B4000400162884A81401CA288C0B20A820328C0 +:104B5000F5D32078C0F3C100012821D003281FD04D +:104B60004846FCF7B0FB08B11020C7E799F80000F1 +:104B7000400808D0012809D0022807D0032805D012 +:104B800043F20220BAE78DF8028001E08DF802704E +:104B9000484650F8011FCDF803108088ADF8070093 +:104BA000FEF7E9FB8DF801000020424606EB4001CC +:104BB0002B88CB826B888B83AB884B84EB880B85EF +:104BC000401CCA85C0B28A860328EFD3E088ADF8BE +:104BD0003C0068460CF083F900288ED19AF8180042 +:104BE0005546112801D0082088E706200DF02EFD3B +:104BF00038B12078C0F3C100012804D0032802D0C6 +:104C000006E012207AE795F8240000283FF475AFFB +:104C1000FEF73AFA022801D213206FE7584600F057 +:104C200017F90028A1D185F819B068460CF069FA87 +:104C300004F06EFA040098D1687E00F019F9122091 +:104C4000FEF70CFA204659E770B56F4D287E122802 +:104C500001D00820E3E60CF057FA04F059FA0400FA +:104C600005D1687E00F011F91120FEF7F7F9204612 +:104C7000D5E670B5064615460C460846FCF749FBD6 +:104C800018B92846FCF745FB08B11020C7E62A46AC +:104C9000214630460CF03FFD04F03AFA0028F5D1E9 +:104CA00021787F29F2D10520B9E67CB505460C466E +:104CB0000846FCF708FB08B110207CBD2846FEF72B +:104CC000C2FB20B10078222804D208207CBD43F228 +:104CD00002007CBD4C4890F83000400701D51120FF +:104CE0007CBD2178C80802D16078C20801D00720B5 +:104CF0007CBD890801D1800801D006207CBDADF8BB +:104D0000005020788DF8020060788DF803000220B2 +:104D1000ADF8040068460BF0E3FE04F0F9F97CBD41 +:104D200070B586B014460D460646FEF78CFB28B1DA +:104D30000078222805D2082006B070E643F202006F +:104D4000FAE72846FCF70CFB20B944B12046FCF7F3 +:104D5000FEFA08B11020EFE700202060A0802A486A +:104D600090F83000800701D51120E5E703A930460F +:104D70000BF05CFD18B100BF04F0CAF9DCE7ADF838 +:104D80000060BDF81400ADF80200BDF81600ADF8E3 +:104D90000400BDF81000BDF81210ADF80600ADF823 +:104DA00008107DB1298809B1ADF80610698809B1EC +:104DB000ADF80210A98809B1ADF80810E98809B169 +:104DC000ADF80410DCB1BDF80610814201D9081A13 +:104DD0002080BDF80210BDF81400814201D9081AE4 +:104DE0006080BDF80800BDF80410BDF8162001442D +:104DF000BDF812001044814201D9081AA08068460B +:104E00000BF0D3FDB8E70000EC0100201CB55249BF +:104E10000968CDE9001068460CF063F804F078F9F1 +:104E20001CBD1CB500200090019068460CF059F89C +:104E300004F06EF91CBD108008885080488890806E +:104E4000C88810818888D080002050819081704768 +:104E500010B5044604F0C8F830B1407830B12046AF +:104E600004F0E7FB002010BD052010BD122010BD8E +:104E700010B504F0B9F8040000D1FFDF607800B984 +:104E8000FFDF6078401E607010BD10B504F0ACF814 +:104E9000040000D1FFDF6078401C607010BD1CB5BD +:104EA000ADF800008DF802308DF803108DF8042065 +:104EB00068460CF0F3FB04F02BF91CBD0CB527A2DF +:104EC000D2E90012CDE900120079694601EB5010D9 +:104ED00000780CBD0278520804D0012A02D043F2B7 +:104EE00002207047FEF71EBA1FB56A46FFF7A3FF00 +:104EF00068460CF03CF904F00BF904B010BD70B535 +:104F00000C0006460DD0FEF79EFA050000D1FFDF2B +:104F1000A68028892081288960816889A081A88944 +:104F2000E0817CE510B500231A4603E0845C23434E +:104F3000521CD2B28A42F9D30BB1002010BD01201D +:104F400010BD00B530B1012803D0022801D0FFDF29 +:104F5000002000BDFF2000BDCC4D02000706050467 +:104F60000302010010B50446FCF7ADF908B11020AA +:104F700010BD2078C0F30210042807D860780728F5 +:104F800004D3A178102901D8814201D2072010BD95 +:104F9000E078410706D421794A0703D4000701D4F9 +:104FA000080701D5062010BD002010BD10B51378EC +:104FB0005C08837F64F3C713837713789C08C37FEF +:104FC00064F30003C3771078C309487863F34100A2 +:104FD000487013781C090B7864F347130B7013782F +:104FE000DB0863F3000048705078487110BD10B5BD +:104FF000C4780B7864F300030B70C478640864F31E +:1050000041030B70C478A40864F382030B70C47866 +:10501000E40864F3C3030B700379117863F30001B0 +:10502000117003795B0863F34101117003799B08E8 +:1050300063F3820111700079C00860F3C30111703D +:1050400010BD70B514460D46064604F04BFA80B10B +:105050000178182221F00F01891C21F0F001A03104 +:1050600000F8081B21461FF082FCBDE8704004F0E8 +:105070003CBA29463046BDE870401322FEF7E6B937 +:105080002DE9F047064608A8894690E830041F46F7 +:105090009046142128461FF0C6FC0021CAF80010D3 +:1050A000B8F1000F03D0B9F1000F03D114E0387844 +:1050B000C00711D02068FCF72CF9C0BBB8F1000F75 +:1050C00007D120681230286020681430686020689A +:1050D000A8602168CAF800103878800724D5606875 +:1050E000FCF735F918BBB9F1000F21D0FFF722F911 +:1050F0000168C6F868118188A6F86C11807986F875 +:105100006E0101F0F8FCF94FEF60626862B196F849 +:10511000680106F2691140081032FEF764F91022A6 +:10512000394660681FF0DEFB0020BDE8F08706E02E +:10513000606820B1E8606068C6F86401F4E7102098 +:10514000F3E730B5054608780C4620F00F00401C08 +:1051500020F0F001103121700020607095F82300DC +:1051600030B104280FD0052811D0062814D0FFDF55 +:1051700020780121B1EB101F04D295F8200000F037 +:105180001F00607030BD21F0F000203002E021F0FF +:10519000F00030302070EBE721F0F0004030F9E70C +:1051A000F0B591B0022715460C4606463A46ADF8D2 +:1051B0000870092103AB04F0FEFF0490002810D012 +:1051C00004208DF804008DF80170E03409960594F0 +:1051D0008DF818500AA968460EF078FF00B1FFDF7D +:1051E000012011B0F0BD10B588B00C460A99ADF899 +:1051F0000000C3B11868CDF802005868CDF8060069 +:10520000ADF80A20102203A81FF06CFB68460CF0D2 +:105210001EF803F07DFF002803D1A17F41F01001AB +:10522000A17708B010BD0020CDF80200E6E72DE917 +:10523000F84F0646808A0D4680B28246FEF703F993 +:1052400004463078DFF8A48200274FF00209A8F165 +:1052500020080F2870D2DFE800F06FF23708387DA1 +:105260008CC8F1F0EFF35FF3F300A07F00F00300D0 +:10527000022809D05FF0000080F0010150460DF0D7 +:1052800035FA050003D101E00120F5E7FFDF98F8CA +:105290005C10C90702D0D8F860000BE0032105F1CB +:1052A0001D0010F066FCD5F81D009149B0FBF1F22D +:1052B00001FB1200C5F81D0070686867B068A86738 +:1052C0002078252800D0FFDFCAE0A07F00F003008F +:1052D000022809D05FF0000080F0010150460DF077 +:1052E00005FA060003D101E00120F5E7FFDF307881 +:1052F000810702D52178252904D040F001003070C3 +:10530000BDE8F88F85F80090307F287106F11D0008 +:105310002D36C5E90206F3E7A07F00F0030002285E +:1053200008D0002080F0010150460DF0DFF90400A4 +:1053300004D102E00120F5E7A7E1FFDF2078C106F4 +:1053400004D5072028703D346C60D9E740F0080090 +:105350002070D5E7E07F000700D5FFDF307CB28802 +:1053600000F0010301B05046BDE8F04F092105F0FF +:10537000ADBD04B9FFDF716821B1102204F1240032 +:105380001FF0B0FA28212046FDF7C4FEA07F00F0F0 +:10539000030002280ED104F12400002300901A46D5 +:1053A00021465046FFF71FFF112807D0292120462C +:1053B000FDF7B0FE307A84F82000A1E7A07F000757 +:1053C00000D5FFDF14F81E0F40F008002070E782C0 +:1053D000A761E761C109607861F34100014660F3AC +:1053E00082016170307AE0708AE7A07F00F00300EC +:1053F000022809D05FF0000080F0010150460DF056 +:1054000075F9040003D101E00120F5E7FFDF022177 +:1054100004F1850010F0ADFB0420287004F5B47091 +:105420006860B4F885002882304810387C346C619C +:10543000C5E9028064E703E024E15BE02DE015E0CC +:10544000A07F00F00300022807D0002080F00101B7 +:1054500050460DF04BF918B901E00120F6E7FFDFE7 +:10546000324621465046BDE8F84FEAE504B9FFDF71 +:1054700020782128A1D93079012803D1E07F40F09C +:105480000800E077324621465046FFF7DAFD204615 +:10549000BDE8F84F2321FDF73DBE3279AA8005F122 +:1054A00008030921504604F086FEE86010B105208B +:1054B000287025E7A07F00F00300022808D0002014 +:1054C00080F0010150460DF011F9040003D101E014 +:1054D0000120F5E7FFDF04F1620102231022081F1B +:1054E0000CF08BFF07703179417009E74C02002006 +:1054F00040420F00A07F00F00300022808D00020E7 +:1055000080F0010150460DF0F1F8050003D101E0F3 +:105510000120F5E7FFDF95F8840000F00300012883 +:105520007AD1A07F00F00307E07F10F0010602D0DF +:10553000022F04D133E095F8A000C0072BD0D5F896 +:10554000601121B395F88320087C62F3870008740A +:10555000A17FCA09D5F8601162F341000874D5F83B +:10556000601166F300000874AEB1D5F86001102236 +:1055700004F1240188351FF0B5F9287E40F00100C0 +:105580002876287820F0010005F8880900E016B197 +:10559000022F04D02DE095F88800C00727D0D5F859 +:1055A0005C1121B395F88320087C62F387000874AE +:1055B000A17FCA09D5F85C1162F341000874D5F8DF +:1055C0005C1166F3000008748EB1D5F85C011022FE +:1055D00004F1240188351FF085F9287840F0010096 +:1055E00005F8180B287820F0010005F8A009022F13 +:1055F00044D0002000EB400005EBC00090F888008C +:10560000800709D595F87C00D5F86421400805F19C +:105610007D011032FDF7E7FE8DF8009095F88400CB +:105620006A4600F003008DF8010095F888108DF8A7 +:10563000021095F8A0008DF803002146504601F0B5 +:1056400043FA2078252805D0212807D0FFDF2078CD +:10565000222803D922212046FDF75CFDA07F00F01F +:10566000030002280CD0002080F0010150460DF00C +:105670004FF800283FF44FAEFFDF41E60120B9E7C5 +:105680000120F1E7706847703AE6FFDF38E670B551 +:10569000FE4C002584F85C5025660EF0E4FC04F115 +:1056A0001001204603F0DAFE84F8305070BD70B56A +:1056B0000D46FDF7C8FE040000D1FFDF4FF4B871BE +:1056C00028461FF0B0F904F124002861A07F00F003 +:1056D0000300022808D0012105F1E0000EF0C4FC0F +:1056E000002800D0FFDF70BD0221F5E70A46014621 +:1056F00002F1E0000EF0D8BC70B50546406886B0F7 +:1057000001780A2906D00D2933D00E292FD0FFDFCA +:1057100006B070BD86883046FDF795FE040000D1C6 +:10572000FFDF20782128F3D028281BD168680221C8 +:105730000E3001F0BEF9A8B168680821801D01F0A3 +:10574000B8F978B104F1240130460BF045FF03F0BD +:10575000DFFC00B1FFDF06B02046BDE87040292124 +:10576000FDF7D8BC06B0BDE8704003F0BEBE012115 +:1057700001726868C6883046FDF765FE040000D1F6 +:10578000FFDFA07F00F00301022902D120F010000A +:10579000A077207821280AD06868017A09B10079B9 +:1057A00080B1A07F00F00300022862D0FFDFA07F5D +:1057B00000F003000228ABD1FEF790F80028A7D034 +:1057C000FFDFA5E703F091FEA17F08062BD5E07F60 +:1057D000C00705D094F8200000F01F00102820D04A +:1057E0005FF0050084F82300207829281DD02428A4 +:1057F000DDD13146042010F09BFC22212046FDF72C +:1058000089FCA07F00F00300022830D05FF0000088 +:1058100080F0010130460CF07BFF0028C7D0FFDF8D +:10582000C5E70620DEE70420DCE701F003000228DC +:1058300008D0002080F0010130460CF057FF050031 +:1058400003D101E00120F5E7FFDF25212046FDF728 +:1058500061FC03208DF80000694605F1E0000EF0C0 +:105860001AFC0228A3D00028A1D0FFDF9FE7012067 +:10587000CEE703F03AFE9AE72DE9F04387B0994668 +:10588000164688460746FDF7DEFD04004BD020781B +:10589000222848D3232846D0E07F000743D4A07FA6 +:1058A00000F00300022809D05FF0000080F0010141 +:1058B00038460CF01BFF050002D00CE00120F5E794 +:1058C000A07F00F00300022805D001210022384605 +:1058D0000CF003FF05466946284601F01CF90098C4 +:1058E00000B9FFDF45B10098E03505612078222836 +:1058F00006D0242804D007E000990020086103E0C6 +:1059000025212046FDF706FC0098012141704762E1 +:10591000868001A9C0E902890EF0D8FB022802D0D6 +:10592000002800D0FFDF07B0BDE8F08370B586B077 +:105930000546FDF788FD017822291ED9807F00F0F9 +:105940000300022808D0002080F0010128460CF056 +:10595000CDFE04002FD101E00120F5E7FFDF2AE0B2 +:10596000B4F85E0004F1620630440178427829B14F +:1059700021462846FFF714FCB0B9C9E6ADF804206B +:105980000921284602AB04F016FC03900028F4D04D +:1059900005208DF80000694604F1E0000EF07BFB65 +:1059A000022801D000B1FFDF02231022314604F1AA +:1059B0005E000CF058FDB4F860000028D0D1A7E6D6 +:1059C00010B586B00446FDF73EFD017822291BD9AB +:1059D000807F00F00300022808D0002080F0010141 +:1059E00020460CF083FE040003D101E00120F5E71E +:1059F000FFDF06208DF80000694604F1E0000EF09C +:105A00004AFB002800D0FFDF06B010BD2DE9F05F93 +:105A100005460C4600270078904601093E4604F1F1 +:105A2000080BBA4602297DD0072902D00A2909D1DC +:105A300046E0686801780A2905D00D2930D00E2982 +:105A40002ED0FFDFBBE114271C26002C6BD08088F2 +:105A5000A080FDF7F8FC5FEA000900D1FFDF99F8AC +:105A600017005A46400809F11801FDF7BCFC6868A8 +:105A7000C0892082696851F8060FC4F8120048688E +:105A8000C4F81600A07E20F0060001E02C020020E1 +:105A900040F00100A07699F81E0040F020014DE092 +:105AA0001A270A26002CD1D0C088A080FDF7CBFC95 +:105AB000050000D1FFDF59462846FFF742FB7EE193 +:105AC0000CB1A88BA080287A0B287DD006DC012899 +:105AD0007BD0022808D0032804D135E00D2875D0EA +:105AE0000E2874D0FFDF6AE11E270926002CADD0F6 +:105AF000A088FDF7A8FC5FEA000900D1FFDF287B42 +:105B000000F003000128207A1BD020F00100207251 +:105B1000297B890861F341002072297BC90861F360 +:105B2000820001E041E1F2E02072297B090961F382 +:105B3000C300207299F81E0040F0400189F81E1041 +:105B40003DE140F00100E2E713270D26002CAAD02A +:105B5000A088FDF778FC8146807F00F003000228D2 +:105B600008D0002080F00101A0880CF0BFFD0500E6 +:105B700003D101E00120F5E7FFDF99F81E0000F0F6 +:105B80000302022A50D0686F817801F003010129D5 +:105B9000217A4BD021F00101217283789B0863F3B5 +:105BA000410121728378DB0863F3820121728378DB +:105BB0001B0963F3C3012172037863F30611217299 +:105BC000437863F3C71103E061E0A9E090E0A1E04E +:105BD000217284F809A0C178A172022A29D0027921 +:105BE000E17A62F30001E1720279520862F3410145 +:105BF000E1720279920862F38201E1720279D208BD +:105C000062F3C301E1724279217B62F300012173E7 +:105C10004279520862F3410121734279920862F39A +:105C200082012173407928E0A86FADE741F00101BE +:105C3000B2E74279E17A62F30001E17242795208F7 +:105C400062F34101E1724279920862F38201E172EA +:105C50004279D20862F3C301E1720279217B62F3D7 +:105C6000000121730279520862F341012173027924 +:105C7000920862F3820121730079C00860F3C301C6 +:105C8000217399F80000232831D9262140E01827F4 +:105C90001026E4B3A088FDF7D6FB8346807F00F092 +:105CA0000300022809D0002080F00101A0880CF038 +:105CB0001DFD5FEA000903D101E00120F4E7FFDFE9 +:105CC000E868A06099F8000040F0040189F800102D +:105CD00099F80100800708D5012020739BF8000087 +:105CE00023286CD92721584651E084F80CA066E09F +:105CF00015270F265CB1A088FDF7A5FB814606227B +:105D00005946E86808F097FA0120A073A0E041E046 +:105D100048463CE016270926E4B3287B20724EE073 +:105D2000287B19270E26ACB3C4F808A0A4F80CA051 +:105D3000012807D0022805D0032805D0042803D065 +:105D4000FFDF0DE0207207E0697B042801F00F01FE +:105D500041F0800121721ED0607A20F00300607251 +:105D6000A088FDF770FB05460078212827D023285E +:105D700000D0FFDFA87F00F00300022813D000202E +:105D800080F00101A0880CF0C3FC22212846FDF719 +:105D9000C1F914E004E0607A20F00300401CDEE763 +:105DA000A8F8006010E00120EAE70CB16888A08044 +:105DB000287A68B301280AD002284FD0FFDFA8F85C +:105DC00000600CB1278066800020BDE8F09F152799 +:105DD0000F26002CE4D0A088FDF735FB807F00F073 +:105DE0000300022808D0002080F00101A0880CF0F8 +:105DF0007DFC050003D101E00120F5E7FFDFD5F8C8 +:105E00001D000622594608F016FA84F80EA0D6E7BF +:105E100017270926002CC3D0A088FDF714FB814664 +:105E2000807F00F00300022808D0002080F00101EC +:105E3000A0880CF05BFC050003D101E00120F5E730 +:105E4000FFDF6878800701D5022000E00120207282 +:105E500099F800002328B2D9272159E719270E26DF +:105E6000002C9DD0A088FDF7EEFA5FEA000900D172 +:105E7000FFDFC4F808A0A4F80CA084F808A0A07A5A +:105E800040F00300A07299F81E10C90961F3820066 +:105E9000A07299F81F2099F81E1012EAD11F05D0A0 +:105EA00099F8201001F01F0110292BD020F00800D4 +:105EB000A07299F81F10607A61F3C3006072697A6A +:105EC00001F003010129A2D140F00400607299F8A9 +:105ED0001E0000F003000228E87A16D0217B60F350 +:105EE00000012173AA7A607B62F300006073EA7A92 +:105EF000520862F341012173A97A490861F3410014 +:105F000060735CE740F00800D2E7617B60F300015A +:105F10006173AA7A207B62F300002073EA7A520848 +:105F200062F341016173A97A490861F3410020736A +:105F300045E710B5FE4C30B10146102204F12000B7 +:105F40001EF0D0FC012084F8300010BD10B50446CE +:105F500000F0D1FDF64920461022BDE81040203166 +:105F60001EF0C0BC70B5F24D06004FF0000413D017 +:105F7000FBF7A9F908B110240CE00621304608F01F +:105F800041F9411C05D028665FF0010085F85C00EE +:105F900000E00724204670BD0020F7E7007810F0ED +:105FA0000F0204D0012A05D0022A0CD110E000090A +:105FB00009D10AE00009012807D0022805D00328EA +:105FC00003D0042801D007207047087000207047D4 +:105FD0000620704705282AD2DFE800F003070F17D4 +:105FE0001F00087820F0FF001EE0087820F00F0066 +:105FF000401C20F0F000103016E0087820F00F0070 +:10600000401C20F0F00020300EE0087820F00F0057 +:10601000401C20F0F000303006E0087820F00F003F +:10602000401C20F0F000403008700020704707202E +:1060300070472DE9F041804688B00D46002708469C +:10604000FBF78EF9A8B94046FDF7FDF9040003D02F +:106050002078222815D104E043F2020008B0BDE800 +:10606000F08145B9A07F410603D500F00300022866 +:1060700001D01020F2E7A07FC10601D4010702D5AC +:106080000DB10820EAE7E17F090701D50D20E5E71A +:1060900000F00300022805D125B12846FEF762FF73 +:1060A0000700DBD1A07F00F00300022808D0002009 +:1060B00080F0010140460CF019FB060002D00FE011 +:1060C0000120F5E7A07F00F0030002280ED0002099 +:1060D00080F00101002240460CF0FFFA060007D0D4 +:1060E000A07F00F00300022804D009E00120EFE7C0 +:1060F0000420B3E725B12A4631462046FEF756FF75 +:106100006946304600F007FD009800B9FFDF0099AE +:10611000022006F1E0024870C1F824804A610022A2 +:106120000A81A27F02F00302022A1CD0012008711A +:10613000287800F00102087E62F3010008762A78D0 +:10614000520862F3820008762A78920862F3C3004C +:1061500008762A78D20862F30410087624212046B3 +:10616000FCF7D8FF33E035B30871301D8861307813 +:10617000400908777078C0F340004877287800F02D +:106180000102887F62F301008877A27FD20962F35F +:1061900082008877E27F62F3C3008877727862F3C7 +:1061A00004108877A878C87701F1210228462031A9 +:1061B000FEF71DFF03E00320087105200876252166 +:1061C0002046FCF7A7FFA07F20F04000A07701A9A0 +:1061D00000980DF07BFF022801D000B1FFDF3846A8 +:1061E0003CE72DE9FF4F534A0D4699B09A4607CA3E +:1061F0000AAB002783E807001998FDF724F9060089 +:1062000006D03078262806D008201DB0BDE8F08FD3 +:1062100043F20200F9E7B07F00F00309B9F1020F81 +:106220000AD05DB91B98FEF79DFE0028EDD1B07F26 +:1062300000F00300022801D11B9890BBB07F00F052 +:106240000300022808D0002080F0010119980CF00A +:106250004DFA040003D101E00120F5E7FFDF852DB1 +:1062600028D007DCF5B1812D1ED0822D1ED0832DC4 +:1062700008D11DE0862D1FD0882D1FD0892D1FD05D +:106280008A2D1FD00F2020710F281DD003F02AF96E +:10629000E0B101208DF83C00201D10902079B8B1AC +:1062A0005BE111E00020EEE70120ECE70220EAE7E5 +:1062B0000320E8E70520E6E70620E4E70820E2E718 +:1062C0000920E0E70A20DEE707209EE711209CE78F +:1062D000B9F1020F03D0A56F03D1A06F02E0656F83 +:1062E000FAE7606F804632D04FF0010001904FF026 +:1062F00002000090214630461B9AFEF757FE1B987D +:10630000007800F00101A87861F30100A870B17F66 +:10631000C90961F38200A870F17F61F3C300A8701E +:10632000617861F30410A87020784009287003E0B8 +:106330002C020020D44D02006078C0F34000687049 +:106340001B988078E87000206871287103E00220B3 +:10635000019001200090A87898F80210C0F3C000C6 +:10636000C1F3C00108405FEA000B2DD05046FAF798 +:10637000AAFF78BBDAF80C00FAF7A5FF50BBDAF8F1 +:106380001C00FAF7A0FF28BBDAF80C00A060DAF8CE +:106390001C00E060607898F8012042EA500100BFDC +:1063A00061F34100607098F80210C0B200EA111168 +:1063B00061F30000607000202077009906F117005B +:1063C000022908D0012107E0607898F8012002EA4C +:1063D0005001E5E732E0002104EB810148610199B9 +:1063E000701C022901D0012100E0002104EB810191 +:1063F0004861A87800F00300012857D198F80200FE +:1064000000F00300012851D1B9F1020F04D02A1D78 +:10641000691D1B98FEF7EBFD287998F804100840D9 +:106420008DF83400697998F8052011408DF83810FE +:1064300008433BD05046FAF746FF08B11020E4E687 +:106440000AF110010491B9F1020F17D0084600219A +:1064500004F18C03CDE9000304F5AE7202920DAB9A +:106460005A462046FEF70CFE0028E8D1B9F1020F8B +:1064700008D0504608D14FF0010107E050464FF0D8 +:106480000101E5E70498F5E74FF0000104F1A403EA +:10649000CDE9000304F5B072029281F001010EAB68 +:1064A0005A462046FEF7ECFD0028C8D160788007E8 +:1064B00034D4A87898F80210C0F38000C1F38001AA +:1064C00008432BD0297898F800000AAAB9F1020FE6 +:1064D00006D032F811204300DA4002F003070AE048 +:1064E00032F810204B00DA4012F0030705D0012FDC +:1064F0000BD0022F0BD0032F07D0BBF1000F0DD014 +:10650000012906D0042904D008E00227F5E7012775 +:10651000F3E7012801D0042800D10427B07F40F020 +:106520008000B077F17F6BF30001F177607880072E +:1065300006D50320A071BBF1000F0ED1002028E08A +:106540000220022F18D0012F18D0042F29D00020AC +:10655000A071B07F20F08000B07725213046FCF795 +:10656000D9FD0FA904F1E0000DF095FD10B102284E +:1065700000D0FFDF002048E6A071DFE7A0710D2109 +:1065800004F120001EF04FFA207840F00200207045 +:1065900001208DF85C0017AA3146199800F094FA92 +:1065A000DBE70120A071D8E72DE9F04387B09046E2 +:1065B000894604460025FCF746FF060006D03078E1 +:1065C000272806D0082007B0BDE8F08343F2020078 +:1065D000F9E7B07F00F00300022809D05FF0000067 +:1065E00080F0010120460CF081F8040003D101E0A5 +:1065F0000120F5E7FFDFA7795FEA090005D0012850 +:1066000021D0B9F1020F26D110E0B8F1000F22D14C +:10661000012F05D0022F05D0032F05D0FFDF2DE07D +:106620000C252BE0012529E0022527E04046FAF75A +:106630004AFEB0B9032F0ED11022414604F11D00CD +:106640001EF050F91AE0012F02D0022F03D104E00E +:10665000B8F1000F12D00720B5E74046FAF733FE35 +:1066600008B11020AFE7102104F11D001EF0B9F9A8 +:106670000621404607F0C6FDC4F81D0020782521FC +:1066800040F0020020703046FCF744FD2078C1073E +:1066900013D020F00100207002208DF8000004F1DA +:1066A0001D0002908DF804506946C3300DF0F3FCD4 +:1066B000022803D010B1FFDF00E02577002082E739 +:1066C00030B587B00D460446FCF7BDFEA0B1807F13 +:1066D00000F00300022812D05FF0000080F00101FA +:1066E00020460CF003F804000ED02846FAF7EBFD24 +:1066F00038B1102007B030BD43F20200FAE70120A4 +:10670000ECE72078400701D40820F3E7294604F19C +:106710003D00202205461EF0E5F8207840F01000EC +:10672000207001070FD520F00800207007208DF899 +:106730000000694604F1E00001950DF0ACFC022870 +:1067400001D000B1FFDF0020D4E770B50D4606464A +:10675000FCF779FE18B10178272921D102E043F234 +:10676000020070BD807F00F00300022808D00020E6 +:1067700080F0010130460BF0B9FF040003D101E0C5 +:106780000120F5E7FFDFA079022809D16078C00772 +:1067900006D02A4621463046FEF702FD10B10FE032 +:1067A000082070BDB4F860000E280BD204F162011D +:1067B00002231022081F0BF020FE012101704570FA +:1067C000002070BD112070BD70B5064614460D4600 +:1067D0000846FAF778FD18B92046FAF79AFD08B18D +:1067E000102070BDA6F57F40FF380ED03046FCF774 +:1067F0002AFE38B1417822464B08811C1846FCF726 +:10680000F2FD07E043F2020070BD2046FDF7F8FDFF +:106810000028F9D11021E01D0FF0ABF9E21D294647 +:1068200004F1170000F087F9002070BD2DE9F04158 +:1068300004468AB01546884600270846FAF790FDB8 +:1068400018B92846FAF78CFD10B110200AB006E4FA +:106850002046FCF7F8FD060003D0307827281AD12F +:1068600002E043F20200F1E7B07F00F003000228EB +:1068700008D0002080F0010120460BF037FF040013 +:1068800003D101E00120F5E7FFDF2078400702D5C2 +:106890006078800701D40820D8E7B07F00F00300BB +:1068A000022803D0A06F03D1A16F02E0606FFAE766 +:1068B000616F407800B19DB1487810B1B8F1000F18 +:1068C0000ED0ADB1EA1D06A8E16800F034F910223F +:1068D00006A905F117001DF0D9FF18B1042707E03C +:1068E0000720B3E71022E91D04F12D001DF0FAFF87 +:1068F000B8F1000F06D0102208F1070104F11D00C5 +:106900001DF0F0FF2078252140F002002070304675 +:10691000FCF700FC2078C10715D020F001002070A2 +:1069200002208DF8000004F11D0002901030039049 +:106930008DF804706946B3300DF0ADFB022803D02A +:1069400010B1FFDF00E0277700207FE7F8B515469C +:106950000E460746FCF777FD040004D02078222875 +:1069600004D00820F8BD43F20200F8BDA07F00F07B +:106970000300022802D043F20500F8BD3046FAF7C2 +:10698000A2FC18B92846FAF79EFC08B11020F8BD01 +:1069900000953288B31C21463846FEF724FC1128A6 +:1069A00015D00028F3D1297C4A08A17F62F3C711D2 +:1069B000A177297CE27F61F30002E277297C8908D4 +:1069C00084F82010A17F21F04001A177F8BDA17FBC +:1069D0000907FBD4D6F80200C4F83600D6F8060042 +:1069E000C4F83A003088A0861022294604F1240019 +:1069F0001DF078FF287C4108E07F61F34100E077DB +:106A0000297C61F38200E077287C800884F82100EB +:106A1000A07F40F00800A0770020D3E770B50D46B6 +:106A200006460BB1072070BDFCF70DFD040007D032 +:106A30002078222802D3A07F800604D4082070BDCD +:106A400043F2020070BDADB1294630460AF0C4FDE4 +:106A500002F05EFB297C4A08A17F62F3C711A1778F +:106A6000297CE27F61F30002E277297C890884F8BF +:106A7000201004E030460AF0D2FD02F049FBA17F6D +:106A800021F02001A17770BD70B50D46FCF7DBFC4D +:106A9000040005D02846FAF73CFC20B1102070BD58 +:106AA00043F2020070BD29462046FEF74AFB002053 +:106AB00070BD04E010F8012B0AB100207047491E98 +:106AC00089B2F7D20120704770B51546064602F02C +:106AD00009FD040000D1FFDF207820F00F00801CAA +:106AE00020F0F0002030207066802868A060BDE8AB +:106AF000704002F0FABC10B5134C94F83000002836 +:106B000008D104F12001A1F110000DF006FB0120D5 +:106B100084F8300010BD10B190F8B9202AB10A48AD +:106B200090F8350018B1002003E0B83001E00648C5 +:106B300034300860704708B50023009313460A46B6 +:106B40000BF0CFFF08BD00002C02002018B18178A7 +:106B5000012938D101E010207047018842F6011266 +:106B6000881A914231D018DC42F60102A1EB0200F2 +:106B700091422AD00CDC41B3B1F5C05F25D06FF44F +:106B8000C050081821D0A0F57060FF381BD11CE060 +:106B900001281AD002280AD117E0B0F5807F14D05E +:106BA00008DC012811D002280FD003280DD0FF28BF +:106BB00009D10AE0B0F5817F07D0A0F580700338D5 +:106BC00003D0012801D0002070470F2070470A2809 +:106BD0001FD008DC0A2818D2DFE800F0191B1F1F9D +:106BE000171F231D1F21102815D008DC0B2812D0D9 +:106BF0000C2810D00D2816D00F2806D10DE0112832 +:106C00000BD084280BD087280FD00320704700209A +:106C1000704705207047072070470F2070470420F9 +:106C20007047062070470C20704743F202007047FF +:106C300038B50C46050041D06946FFF7AFF900288A +:106C400019D19DF80010607861F302006070694608 +:106C5000681CFFF7A3F900280DD19DF8001060789B +:106C600061F3C5006070A978C1F34101012903D027 +:106C7000022905D0072038BD217821F0200102E04B +:106C8000217841F020012170410704D0A978C9087A +:106C900061F386106070607810F0380F07D0A97823 +:106CA000090961F3C710607010F0380F02D16078E5 +:106CB000400603D5207840F040002070002038BD09 +:106CC00070B504460020088015466068FFF7B0FFE5 +:106CD000002816D12089A189884211D8606880785F +:106CE000C0070AD0B1F5007F0AD840F20120B1FBFD +:106CF000F0F200FB1210288007E0B1F5FF7F01D908 +:106D00000C2070BD01F201212980002070BD10B55A +:106D10000478137864F3000313700478640864F350 +:106D2000410313700478A40864F382031370047899 +:106D3000E40864F3C30313700478240964F30413B0 +:106D400013700478640964F34513137000788009A4 +:106D500060F38613137031B10878C10701D1800741 +:106D600001D5012000E0002060F3C713137010BDAF +:106D70004278530702D002F0070306E012F0380F02 +:106D800002D0C2F3C20300E001234A7863F3020297 +:106D90004A70407810F0380F02D0C0F3C20005E00E +:106DA000430702D000F0070000E0012060F3C502B5 +:106DB0004A7070472DE9F04F95B00D00824612D011 +:106DC000122128461DF00DFE4FF6FF7B05AA01217A +:106DD000584607F03EF80024264637464FF4205820 +:106DE0006FF4205973E0102015B0BDE8F08F00BF9C +:106DF0009DF81E0001280AD1BDF81C1041450BD09A +:106E000011EB09000AD001280CD002280CD0042C68 +:106E10000ED0052C0FD10DE0012400E00224BDF8B6 +:106E20001A6008E0032406E00424BDF81A7002E0AA +:106E3000052400E00624BDF81A10514547D12C74F2 +:106E4000BEB34FF0000810AA4FF0070ACDE9028246 +:106E5000CDE900A80DF13C091023CDF81090424671 +:106E60003146584607F0A8F808BBBDF83C002A4652 +:106E7000C0B210A90DF0C7F9C8B9AE81CFB1CDE944 +:106E800000A80DF1080C0AAE40468CE8410213231D +:106E900000223946584607F08FF840B9BDF83C004B +:106EA000F11CC01EC0B22A1D0DF0ADF910B10320B7 +:106EB0009AE70AE0BDF82900E881062C05D19DF883 +:106EC0001E00A872BDF81C00288100208CE705A8D0 +:106ED00006F0CBFF00288BD0FFF779FE84E72DE981 +:106EE000F0471C46DDE90978DDF8209015460E00D4 +:106EF000824600D1FFDF0CB1208818B1D5B1112036 +:106F0000BDE8F087022D01D0012100E0002106F14B +:106F1000140005F08DFEA8F8000002463B46294605 +:106F2000504603F048F9C9F8000008B9A41C3C60B9 +:106F30000020E5E71320E3E7F0B41446DDE904524E +:106F40008DB1002314B1022C09D101E0012306E028 +:106F50000D7CEE0703D025F0010501230D742146B9 +:106F6000F0BC03F0B3BF1A80F0BC70472DE9FE4FB0 +:106F700091461A881C468A468046FAB102AB4946B9 +:106F800003F019F9050019D04046A61C27880BF01C +:106F9000F1FC3246072629463B4600960BF0FFF8E7 +:106FA00020882346CDE900504A4651464046FFF727 +:106FB000C3FF002020800120BDE8FE8F0020FBE7FA +:106FC0002DE9F04786B082460EA8904690E8B000C2 +:106FD000894604AA05A903A88DE807001E462A468B +:106FE00021465046FFF77BFF039901B1012139701B +:106FF000002818D1F94904F1140204AB0860039881 +:1070000005998DE8070042464946504606F0C7F903 +:10701000A8B1092811D2DFE800F005080510100A10 +:107020000C0C0E00002006B06AE71120FBE70720D9 +:10703000F9E70820F7E70D20F5E70320F3E7BDF8AF +:1070400010100398CDE9000133462A4621465046E8 +:10705000FFF772FFE6E72DE9F04389B00D46DDE961 +:10706000108781461C461646142103A81DF0DBFC40 +:10707000012002218DF810108DF80C008DF8117090 +:10708000ADF8146064B1A278D20709D08DF816006B +:10709000E088ADF81A00A088ADF81800A068079045 +:1070A00008A80095CDE90110424603A948466B683F +:1070B000FFF786FF09B0BDE8F083F0B58BB0002480 +:1070C0000646069407940727089405A80994019496 +:1070D00000970294CDE903400D4610232246304626 +:1070E00006F06AFF78B90AA806A9019400970294ED +:1070F000CDE90310BDF8143000222946304606F0D1 +:1071000031FD002801D0FFF762FD0BB0F0BD06F0A5 +:10711000D1BB2DE9FC410C468046002602F0E2F985 +:10712000054620780D287DD2DFE800F0BC0713B3B8 +:1071300025BD49496383AF959B00A848006820B1ED +:10714000417841F010014170ADE0404602F0FAF99B +:10715000A9E0042140460BF0C9FA070000D1FFDF87 +:1071600007F11401404605F0F7FCA5BB132140468A +:10717000FDF720FC97E0042140460BF0B7FA07002A +:1071800000D1FFDFE088ADF800000020B8819DF855 +:107190000000010704D5C00602D5A088B88105E02B +:1071A0009DF8010040067ED5A088F88105B9FFDF73 +:1071B00022462946404601F0BDFC022673E0E188E4 +:1071C000ADF800109DF8011009060FD5072803D06F +:1071D00006280AD00AE024E0042140460BF086FA93 +:1071E000060000D1FFDFA088F0810226CDB9FFDFC5 +:1071F00017E0042140460BF079FA070000D1FFDFC9 +:1072000007F1140006F08DFB90F0010F02D1E07938 +:10721000000648D5387C022640F00200387405B9D3 +:10722000FFDF00E03EE022462946404601F082FCB6 +:1072300039E0042140460BF059FA017C002D01F0A1 +:107240000206C1F340016171017C21F00201017469 +:10725000E7D1FFDFE5E702260121404602F0A4F96D +:1072600021E0042140460BF041FA05466068009099 +:107270002089ADF8040001226946404602F0B5F9C4 +:10728000287C20F0020028740DE0002DC9D1FFDF1A +:10729000C7E7022600214046FBF716F9002DC0D1B2 +:1072A000FFDFBEE7FFDF3046BDE8FC813EB50C00E6 +:1072B00009D001466B4601AA002006F0FFFE20B16E +:1072C000FFF785FC3EBD10203EBD00202080A07051 +:1072D0009DF8050002A900F00700FEF77BFE50B9FB +:1072E0009DF8080020709DF8050002A9C0F3C200B7 +:1072F000FEF770FE08B103203EBD9DF808006070E7 +:107300009DF80500C109A07861F30410A0709DF8F4 +:107310000510890961F3C300A0709DF80410890667 +:1073200001D5022100E0012161F342009DF8001027 +:1073300061F30000A07000203EBD70B51446064603 +:107340000D4651EA040005D075B10846F9F7FFFF74 +:1073500078B901E0072070BD2946304606F00FFFDE +:1073600010B1BDE8704032E454B12046F9F7EFFFA8 +:1073700008B1102070BD21463046BDE8704095E749 +:10738000002070BD2DE9FC5F0C46904605460027A5 +:1073900001780822007A3E46B2EB111F7ED104F13B +:1073A0000A0100910A31821E4FF0020A04F1080B13 +:1073B0000191092A73D2DFE802F0ECDF05F42727F8 +:1073C0007AA9CD00688804210BF090F9060000D15D +:1073D000FFDFB08920B152270726C2E090020020CB +:1073E00051271026002C7DD06888A0800120A07134 +:1073F000A88900220099FFF7A0FF002873D1A8896F +:107400002081288AE081D1E0B5F81290072824D1A4 +:10741000E87B000621D5512709F1140086B2002C23 +:10742000E1D0A88900220099FFF787FF00285AD1F0 +:107430006888A08084F806A0A88920810120A07314 +:10744000288A2082A4F81290A88A009068884B4667 +:10745000A969019A01F04BFBA8E0502709F112003D +:1074600086B2002C3ED0A88900225946FFF765FF5E +:10747000002838D16888A080A889E080287A072869 +:1074800013D002202073288AE081E87BC009607352 +:10749000A4F81090A88A0090688801E083E080E05A +:1074A0004B4604F11202A969D4E70120EAE7B5F8D6 +:1074B0001290512709F1140086B2002C66D068881A +:1074C00004210BF013F983466888A080A889002264 +:1074D0000099FFF732FF00286ED184F806A0A88932 +:1074E000208101E052E067E00420A073288A208216 +:1074F000A4F81290A88A009068884B46A969019A5E +:1075000001F0F5FAA989ABF80E104FE06888FBF797 +:107510009AFF0746688804210BF0E8F8064607B989 +:10752000FFDF06B9FFDF687BC00702D051271426B2 +:1075300001E0502712264CB36888A080502F06D057 +:1075400084F806A0287B594601F0E1FA2EE0287B5A +:10755000A11DF9E7FE49A8894989814205D154272F +:1075600006269CB16888A08020E053270BE068883D +:10757000A080A889E08019E0688804210BF0B6F8A3 +:1075800000B9FFDF55270826002CF0D1A8F80060CD +:1075900011E056270726002CF8D06888A08000202C +:1075A00013E0FFDF02E0012808D0FFDFA8F8006049 +:1075B0000CB1278066800020BDE8FC9F5727072676 +:1075C000002CE3D06888A080687AA071EEE7401DA7 +:1075D00020F0030009B14143091D01EB4000704751 +:1075E00013B5DB4A00201071009848B100246846AA +:1075F0000AF099FE002C02D1D64A009911601CBDF8 +:1076000001240020F4E770B50D46064686B0144606 +:107610005C2128461DF007FA04B9FFDFA0786874E2 +:10762000A2782188284601F09CFA0020A881E881F0 +:10763000228805F11401304605F073FA6A460121EB +:10764000304606F006FC19E09DF80300000715D54A +:10765000BDF806103046FFF730FD9DF80300BDF879 +:10766000061040F010008DF80300BDF80300ADF8DF +:107670001400FF233046059A06F04CFD684606F0DC +:10768000F4FB0028E0D006B070BD10B50C4601F147 +:10769000140005F07DFA0146627C2046BDE81040EA +:1076A00001F094BA30B50446A94891B04FF6FF7581 +:1076B000C18905AA284606F0CCFB30E09DF81E00E3 +:1076C000A0422AD001282AD1BDF81C00B0F5205FC5 +:1076D00003D042F60101884221D1002002AB0AAA60 +:1076E0000CA9019083E8070007200090BDF81A104C +:1076F00010230022284606F05FFC38B9BDF82800A8 +:107700000BAAC0B20CA90CF07EFD10B1032011B081 +:1077100030BD9DF82E00A04201D10020F7E705A85A +:1077200006F0A3FB0028C9D00520F0E770B5054698 +:1077300004210AF0DBFF040000D1FFDF04F1140193 +:107740000C46284605F008FA21462846BDE8704058 +:1077500005F009BA70B58AB00C460646FBF773FE11 +:10776000050014D02878222827D30CB1A08890B126 +:1077700001208DF80C0003208DF8100000208DF8FA +:10778000110054B1A088ADF81800206807E043F25A +:1077900002000AB070BD0920FBE7ADF818000590A3 +:1077A000042130460AF0A2FF040000D1FFDF04F1FB +:1077B000140005F004FA000701D40820E9E701F0FD +:1077C00091FE60B108A802210094CDE9011095F85E +:1077D000232003A930466368FFF7F2FBD9E71120A5 +:1077E000D7E72DE9F04FB2F802A0834689B01546DD +:1077F00089465046FBF727FE0746042150460AF00B +:1078000075FF0026044605964FF002080696ADF86F +:107810001C6007B9FFDF04B9FFDF4146504603F0A3 +:10782000C0FE50B907AA06A905A88DE80700424680 +:10783000214650466368FFF752FB454807AB066098 +:10784000DDE9051204F11400CDF80090CDE9032024 +:10785000CDE9013197F82320594650466B6805F071 +:10786000F7F906000AD0022E04D0032E14D0042EFD +:1078700000D0FFDF09B03046BDE8F08FBDF81C0036 +:107880000028F7D00599CDE9001042462146504620 +:107890006368FFF751FBEDE7687840F00800687017 +:1078A000E8E72DE9F04F99B004464FF0000828486A +:1078B000ADF81C80ADF82080ADF82480A0F80880D9 +:1078C000ADF81480ADF81880ADF82C80ADF82880A4 +:1078D000007916460D464746012808D0022806D0F2 +:1078E000032804D0042802D0082019B0C4E7204699 +:1078F000F9F7E9FC80BB2846F9F7E5FC60BB606856 +:10790000F9F72EFD40BB606848B160892189884243 +:1079100002D8B1F5007F01D90C20E6E780460EAA17 +:1079200006A92846FFF7CCF90028DED168688078E0 +:10793000C0F34100022808D19DF8190010F0380F5B +:1079400003D02869F9F703FD30B905A9206904E0DF +:10795000900200201400002020E0FFF769F90028C1 +:10796000C3D1206948B1607880079DF8150000F008 +:10797000380001D5F0B300E0E0BB9DF814008006AC +:107980000ED59DF8150010F0380F03D06068F9F798 +:10799000DEFC18B96068F9F7E3FC08B11020A4E731 +:1079A0000AA96069FFF744F900289ED1606940B1D7 +:1079B0009DF8290000F0070101293CD110F0380F93 +:1079C00039D00BA9A069FFF733F900288DD19DF8B4 +:1079D000280080062FD49DF82C0080062BD4A069A7 +:1079E00050B19DF82D0000F00701012923D110F0BE +:1079F000380F00E01FE01ED0E06818B10078D0B169 +:107A00001C2818D20FAA611C2046FFF780F901211B +:107A1000384661F30F2082468DF85210B94642F67F +:107A200003000F46ADF850000DF13F0218A9286879 +:107A30000CF008FC08B1072057E79DF8600015A975 +:107A4000CDF80090C01CCDE9019100F0FF0B0023A0 +:107A50000BF20122514614A806F03EF9F0BBBDF826 +:107A600054000C90FD492A8928690092CDE9010152 +:107A70006B89BDF838202868069906F02DF90100B9 +:107A80007ED120784FF0020AC10601D480062BD5A2 +:107A9000ADF80C90606950B90AA906A8FFF768F91B +:107AA0009DF8290020F00700401C8DF829009DF862 +:107AB000280008A940F0C8008DF828008DF8527001 +:107AC00042F60210ADF8500003AACDF800A0CDE9AF +:107AD0000121002340F2032214A800E01EE00A99CD +:107AE00006F0FAF801004BD1DC484D4608385B46F9 +:107AF0000089ADF83D000FA8CDE90290CDF80490C3 +:107B0000CDF810904FF007090022CDF80090BDF895 +:107B100054104FF6FF7006F025F810B1FFF757F834 +:107B2000E3E69DF83C00000625D52946012060F3D8 +:107B30000F218DF852704FF42450ADF85000ADF87D +:107B40000C5062789DF80C00002362F300008DF861 +:107B50000C006278CDF800A0520862F341008DF865 +:107B60000C0003AACDE9012540F2032214A806F077 +:107B7000B3F8010004D1606888B32069A8B900E0B7 +:107B800086E005A906A8FFF7F3F86078800706D419 +:107B90009DF8150020F038008DF8150005E09DF8DF +:107BA000140040F040008DF814008DF8527042F639 +:107BB0000110ADF85000208940F20121B0FBF1F234 +:107BC00001FB1202606809ABCDF80080CDE901032A +:107BD000002314A8059906F07FF8010058D12078F9 +:107BE000C00729D0ADF80C50A06950B90BA906A860 +:107BF000FFF7BEF89DF82D0020F00700401C8DF81F +:107C00002D009DF82C008DF8527040F040008DF84A +:107C10002C0042F60310ADF8500007A903AACDF8D6 +:107C200000A0CDE90121002340F2032214A80B9902 +:107C300006F052F801002BD1E06868B32946012014 +:107C400060F30F218DF8527042F60410ADF8500029 +:107C5000E068002302788DF8582040788DF85900AC +:107C6000E06816AA4088ADF85A00E06800798DF8FF +:107C70005C00E068C088ADF85D00CDF80090CDE90B +:107C800001254FF4027214A806F026F8010003D073 +:107C90000C9800F0C7FF28E67048032108380171EE +:107CA00056B100893080BDF824007080BDF82000F6 +:107CB000B080BDF81C00F080002016E670B50125EC +:107CC0008AB016460B46012802D0022816D104E0DD +:107CD0008DF80E504FF4205003E08DF80E5042F610 +:107CE0000100ADF80C005BB10024601C60F30F24B0 +:107CF00004AA08A918460CF0A5FA18B1072048E50F +:107D0000102046E504A99DF820205448CDE9002123 +:107D1000801E02900023214603A802F2012205F0F2 +:107D2000DBFF10B1FEF753FF33E54C4808380EB1C6 +:107D3000C1883180057100202BE5F0B593B007466E +:107D400001268DF83E6041F60100ADF83C0012AA14 +:107D50000FA93046FFF7B2FF002848D13F4C00255D +:107D6000083CE7B31C2102A81CF05DFE9DF808004A +:107D70008DF83E6040F020008DF8080042F60520A6 +:107D8000ADF83C000E959DF83A00119520F00600E4 +:107D9000801C8DF83A009DF838006A4620F0FF00FC +:107DA0008DF838009DF8390009A920F0FF008DF802 +:107DB00039000420ADF82C00ADF830000EA80A9070 +:107DC00011A80D900FA80990ADF82E5002A8FFF74A +:107DD00068FD00280BD1BDF80000608100E008E0DC +:107DE000BDF80400A081401CE0812571002013B083 +:107DF000F0BD6581A581BDF84800F4E72DE9F74F96 +:107E00001649A0B00024083917940A79A146012A1E +:107E100004D0022A02D0082023B02DE5CA8882426D +:107E200001D00620F8E721988A46824201D1072036 +:107E3000F2E701202146ADF848004FF6FF788DF8B3 +:107E40006E0042F6020B60F30F21ADF84A80ADF8E8 +:107E50006CB006918DF8724002E00000980200209C +:107E60001CA9ADF870401391ADF8508012A806F02F +:107E700020F800252E462F460DAB072212A94046BA +:107E800006F01AF878B10A285DD195B38EB3ADF833 +:107E90006450ADF866609DF85E008DF8144019AC32 +:107EA000012864D06BE09DF83A001FB3012859D136 +:107EB000BDF8381059451FD118A809A9019402949A +:107EC000CDE9031007200090BDF8361010230022E2 +:107ED000404606F071F8B0BBBDF86000042801D040 +:107EE00006284AD1BDF82410219881423AD10F20AA +:107EF00092E73AE0012835D1BDF83800B0F5205FAF +:107F000003D042F6010188422CD1BAF80600BDF830 +:107F10003610884201D1012700E0002705B19EB14B +:107F2000219881421ED118A809AA01940294CDE992 +:107F30000320072000900D4610230022404606F043 +:107F40003BF800B902E02DE04E460BE0BDF86000C2 +:107F5000022801D0102810D1C0B217AA09A90CF02C +:107F600052F950B9BDF8369086E7052054E705A9C7 +:107F700017A8221D0CF066F908B103204CE79DF804 +:107F800014000023001DC2B28DF814202298009224 +:107F9000CDE901401BA8069905F09EFE10B902220A +:107FA0008AF80420FEF713FE36E710B50B46401E94 +:107FB00088B084B205AA00211846FEF7A8FE00206A +:107FC0000DF1080C06AA05A901908CE8070007200E +:107FD00000900123002221464FF6FF7005F0C2FDFC +:107FE0000446BDF81800012800D0FFDF2046FEF748 +:107FF000EEFD08B010BDF0B5F74F044687B03879F4 +:108000000E46032804D0042802D0082007B0F0BD93 +:1080100004AA03A92046FEF753FE0500F6D16068C6 +:108020008078C0F3410002280AD19DF80D0010F0BD +:10803000380F05D02069F9F78AF908B11020E5E773 +:10804000208905AA21698DE807006389BDF8102001 +:108050002068039905F040FE10B1FEF7B8FDD5E7A2 +:1080600016B1BDF814003080042038712846CDE7E1 +:10807000F8B50C0006460CD001464FF6FF750023FC +:108080006A46284606F01AF828B100BFFEF79FFDA1 +:10809000F8BD1020F8BD69462046FEF7C9FD00284E +:1080A000F8D1A078314600F001032846009A06F086 +:1080B00031F8EBE730B587B0144600220DF1080C1B +:1080C00005AD01928CE82C00072200920A46014679 +:1080D00023884FF6FF7005F045FDBDF81410218090 +:1080E000FEF775FD07B030BD70B50D4604210AF0EE +:1080F000FDFA040000D1FFDF294604F11400BDE8B9 +:10810000704004F055BD70B50D4604210AF0EEFA3A +:10811000040000D1FFDF294604F11400BDE87040DF +:1081200004F069BD70B50D4604210AF0DFFA0400C1 +:1081300000D1FFDF294604F11400BDE8704004F0CF +:1081400081BD70B5054604210AF0D0FA040000D1C3 +:10815000FFDF214628462368BDE870400122FEF774 +:1081600005BF70B5064604210AF0C0FA040000D12C +:10817000FFDF04F1140004F00BFD401D20F00305A7 +:1081800011E0011D00880022431821463046FEF709 +:10819000EDFE00280BD0607CABB2684382B2A068D1 +:1081A000011D0AF060F9A06841880029E9D170BD7D +:1081B00070B5054604210AF099FA040000D1FFDFEA +:1081C000214628466368BDE870400222FEF7CEBE15 +:1081D00070B50E46054601F085F9040000D1FFDFB9 +:1081E0000120207266726580207820F00F00001D4B +:1081F00020F0F00040302070BDE8704001F075B90B +:1082000010B50446012900D0FFDF2046BDE810402C +:108210000121FAF759B92DE9F04F97B04FF0000A54 +:108220000C008346ADF814A0D04619D0E06830B1F8 +:10823000A068A8B10188ADF81410A0F800A05846B5 +:10824000FBF701F9070043F2020961D038782228D0 +:108250005CD3042158460AF049FA050005D103E031 +:10826000102017B0BDE8F08FFFDF05F1140004F017 +:108270008FFC401D20F00306A078012803D00228BF +:1082800001D00720EDE7218807AA584605F0E1FD57 +:1082900030BB07A805F0E9FD10BB07A805F0E5FD18 +:1082A00048B99DF82600012805D1BDF82400A0F5A5 +:1082B0002451023902D04FF45050D2E7E068B0B1F7 +:1082C000CDE902A00720009005AACDF804A00492F1 +:1082D000A2882188BDF81430584605F043FC10B13F +:1082E000FEF775FCBDE7A168BDF8140008809DF895 +:1082F0001F00C00602D543F20140B2E70B9838B127 +:10830000A1780078012905D080071AD40820A8E7B1 +:108310004846A6E7C007F9D002208DF83C00A868BF +:108320004FF00009A0B1697C4288714391420FD996 +:108330008AB2B3B2011D0AF04CF88046A0F800A042 +:1083400006E003208DF83C00D5F800804FF00109CD +:108350009DF8200010F0380F00D1FFDF9DF82000BD +:108360001E49C0F3C200084497F8231010F8010C0E +:10837000884201D90F2074E72088ADF8400014A985 +:108380000095CDE90191434607220FA95846FEF713 +:1083900017FE002891D19DF8500050B9A07801280F +:1083A00007D1687CB3B2704382B2A868011D0AF09D +:1083B00024F8002055E770B5064615460C460846D9 +:1083C000FEF7C4FB002805D12A4621463046BDE809 +:1083D000704073E470BD11E590020020DE4D020094 +:1083E00070B51E4614460D0009D044B1616831B124 +:1083F00038B1FC49C988814203D0072070BD1020E4 +:1084000070BD2068FEF7A2FB0028F9D13246214654 +:108410002846BDE87040FFF744BA70B515460C0019 +:1084200006D038B1EF490989814203D0072070BDD9 +:10843000102070BD2068FEF789FB0028F9D129467D +:108440002046BDE87040D6E570B5064686B00D46BC +:1084500014461046F8F75DFFD0BB6068F8F780FF60 +:10846000B0BBA6F57F40FF3803D03046FAF7EBFFEC +:1084700080B128466946FEF79DFC00280CD19DF886 +:1084800010100F2008293DD2DFE801F0080606068B +:10849000060A0A0843F2020006B070BD0320FBE79B +:1084A0009DF80210012908D1BDF80010B1F5C05F98 +:1084B000F2D06FF4C052D142EED09DF806100129DF +:1084C0000DD1BDF80410A1F52851062907D200E00E +:1084D00029E0DFE801F0030304030303DCE79DF870 +:1084E0000A1001290FD1BDF80810B1F5245FD3D0CF +:1084F000A1F60211B1F50051CED00129CCD002294C +:1085000001D1C9E7FFDF606878B9002305AA2946D1 +:10851000304605F0D3FD10B1FEF759FBBCE79DF8DE +:108520001400800601D41020B6E761882246284650 +:108530006368FFF7BFFDAFE72DE9F043814687B0E1 +:10854000884614461046F8F7E4FE18B1102007B02C +:10855000BDE8F083002306AA4146484605F0AEFD7B +:1085600018B100BFFEF733FBF1E79DF81800C00615 +:1085700002D543F20140EAE70025072705A8019547 +:1085800000970295CDE9035062884FF6FF7341468C +:10859000484605F011FD060013D16068F8F7B9FEF2 +:1085A00060B960680195CDE9025000970495238871 +:1085B00062884146484605F0FFFC0646BDF81400B7 +:1085C00020803046CEE739B1864B0A889B899A4293 +:1085D00002D843F2030070471DE610B586B0814C07 +:1085E0000423ADF81430638943B1A4898C4201D2CD +:1085F000914205D943F2030006B010BD0620FBE707 +:10860000ADF81010002100910191ADF80030022169 +:108610008DF8021005A9029104A90391ADF812206A +:108620006946FFF7F8FDE7E72DE9FC4781460D466F +:108630000846F8F748FE88BB4846FAF704FF5FEAA9 +:1086400000080AD098F80000222829D304214846BF +:108650000AF04CF8070005D103E043F20200BDE840 +:10866000FC87FFDF07F1140004F0A9FA064628781A +:10867000012803D0022804D00720F0E7B0070FD567 +:1086800002E016F01C0F0BD0A8792C1DC00709D0F2 +:10869000E08838B1A068F8F716FE18B11020DEE7C0 +:1086A0000820DCE721882A780720B1F5847F35D0BF +:1086B0001EDC40F20315A1F20313A94226D00EDC02 +:1086C000B1F5807FCBD003DCF9B1012926D1C6E713 +:1086D000A1F58073013BC2D0012B1FD113E0012B08 +:1086E000BDD0022B1AD0032BB9D0042B16D112E027 +:1086F000A1F20912082A11D2DFE802F00B040410DB +:1087000010101004ABE7022AA9D007E0012AA6D076 +:1087100004E0320700E0F206002AA0DACDB200F051 +:10872000E1FE50B198F82300CDE90005FA8923460F +:1087300039464846FEF78FFC91E711208FE72DE977 +:10874000F04F8BB01F4615460C4683460026FAF7BD +:108750007AFE28B10078222805D208200BB081E5E6 +:1087600043F20200FAE7B80801D00720F6E7032F2A +:1087700000D100274FF6FF79CCB1022D73D32046EC +:10878000F8F7EEFD30B904EB0508A8F10100F8F7A1 +:10879000E7FD08B11020E1E7AD1EAAB22146484628 +:1087A00005F05BFD38F8021C88425CD1ADB20D4982 +:1087B000B80702D58889401C00E001201FFA80F824 +:1087C000F80701D08F8900E04F4605AA4146584678 +:1087D00005F03FFB4FF0070A4FF00009DCB32046DD +:1087E0000BE0000090020020408810283BD8361D86 +:1087F000304486B2AE4236D2A01902884245F3D345 +:1088000051E000BF9DF8170002074CD594B304EB6C +:108810000608361DB8F80230B6B2102B23D89A19C4 +:10882000AA4220D8B8F8002091421CD1C0061CD51D +:10883000CDE900A90DF1080C0AAAA11948468CE857 +:108840000700B8F800100022584605F08BF920B157 +:10885000FEF7BDF982E726E005E0B8F80200BDF8B2 +:108860002810884201D00B2078E7B8F80200304485 +:1088700086B207E0FFE7C00604D55846FEF71DFCA8 +:10888000002888D19DF81700BDF81A1020F01000BC +:108890008DF81700BDF81700ADF80000FF2358460B +:1088A000009A05F037FC05A805F0DFFA18B9BDF805 +:1088B0001A10B942A6D90421584609F017FF04003E +:1088C00000D1FFDFA2895AB1CDE900A94D460023AE +:1088D00021465846FEF7BFFB0028BBD1A5813DE7E6 +:1088E00000203BE72DE9FF4F8BB01E4617000D46D9 +:1088F0004FF0000412D0B00802D007200FB0B1E44E +:10890000032E00D100265DB10846F8F720FD28B9F6 +:108910003888691E0844F8F71AFD08B11020EDE701 +:10892000C64AB00701D5D18900E00121F0074FF612 +:10893000FF7802D0D089401E00E0404686B206AAE9 +:108940000B9805F086FA4FF000094FF0070B0DF178 +:10895000140A38E09DF81B00000734D5CDF80490C8 +:10896000CDF800B0CDF80890CDE9039A4346002237 +:108970000B9805F021FB60BB05B3BDF814103A88D5 +:1089800021442819091D8A4230D3BDF81E2020F841 +:10899000022BBDF8142020F8022BCDE900B9CDE957 +:1089A0000290CDF810A0BDF81E10BDF814300022C2 +:1089B0000B9805F001FB08B103209FE7BDF81400F8 +:1089C0002044001D84B206A805F04FFA20B10A2801 +:1089D00006D0FEF7FCF891E7BDF81E10B142B9D9F8 +:1089E00034B17DB13888A11C884203D20C2085E7C0 +:1089F000052083E722462946404605F02EFC014625 +:108A000028190180A41C3C80002077E710B504469B +:108A1000F8F77FFC08B1102010BD8848C08920807D +:108A2000002010BDF0B58BB00D460646142103A8FA +:108A30001BF0F9FF01208DF80C008DF810000020CC +:108A40008DF81100ADF814503046FAF7FCFC48B12F +:108A50000078222812D30421304609F047FE040092 +:108A600005D103E043F202000BB0F0BDFFDF04F1DB +:108A70001400074604F0A3F8800601D40820F3E7A9 +:108A8000207C022140F00100207409A80094CDE967 +:108A90000110072203A930466368FEF791FA20B15E +:108AA000217C21F001012174DEE729463046F9F7E7 +:108AB000FCFC08A9384604F071F800B1FFDFBDF8EE +:108AC0002040172C01D2172000E02046A84201D9EF +:108AD0002C4602E0172C00D2172421463046FFF71F +:108AE00012FB21463046F9F706FA0020BCE7F8B53C +:108AF0001C4615460E46069F09F02AFF2346FF1D19 +:108B0000BCB231462A46009409F015FBF8BD70B599 +:108B10000C4605460E2120461BF063FF00202080F6 +:108B20002DB1012D01D0FFDF70BD062000E0052032 +:108B3000A07170BD10B548800878134620F00F0072 +:108B4000001D20F0F00080300C46087014221946F9 +:108B500004F108001BF00BFF00F0C7FC374804606D +:108B600010BD2DE9F047DFF8D890491D064621F0E9 +:108B7000030117460C46D9F8000009F0F2FB050086 +:108B800000D1FFDF4FF000083560A5F800802146D6 +:108B9000D9F8000009F0E5FB050000D1FFDF7560A2 +:108BA000A5F800807FB104FB07F1091D0BD0D9F8AF +:108BB000000009F0D6FB040000D1FFDFB460C4F868 +:108BC0000080BDE8F087C6F80880FAE72DE9F0419B +:108BD0001746491D21F00302194D06460168144647 +:108BE000286809F0E9FB22467168286809F0E4FB6F +:108BF0003FB104FB07F2121D03D0B168286809F0E9 +:108C0000DBFB042009F01AFD0446042009F01EFDD8 +:108C1000201A012804D12868BDE8F04109F096BB6C +:108C2000BDE8F08110B50C4605F0DFF800B1FFDFBC +:108C30002046BDE81040FDF7CABF000090020020AA +:108C40001400002038B50C468288817B19B1418917 +:108C5000914200D90A462280C188121D90B26A460C +:108C600008F0E2FDBDF80000032800D30320C1B2E4 +:108C7000208801F00BF838BD38B50C468288817B1E +:108C800019B10189914200D90A462280C188121D7A +:108C900090B26A4608F0C8FDBDF80000022800D373 +:108CA0000220C1B2208800F0F1FF401CC0B238BDE4 +:108CB0002DE9FE4F82468B46F94814460BF103021C +:108CC000D0E90010CDE9011022F0030268464FF40C +:108CD0009071009209F027FBF24E002C02D1F24A6B +:108CE00000999160009901440091357F05F10105DB +:108CF00004D1E8B20BF020FA00B1FFDF009800EBDE +:108D00000510C01C20F0030100915CB9707AB27AA2 +:108D10001044C2B200200870308C80B204F0EDFE26 +:108D200000B1FFDF0098316A084400902146684690 +:108D300000F06FFF80460098C01C20F003000090F8 +:108D4000B37AF27A717A04B1002009F0E2FB00995B +:108D5000084400902146684600F0A3FFD148002750 +:108D60003D4690F801900CE0284600F035FF06469D +:108D700081788088F9F756F971786D1C00FB0177CE +:108D8000EDB24D45F0D10098C01C20F003000090DA +:108D900004B100203946F9F750F90099002708443A +:108DA0000090C0483D4690F801900CE0284600F045 +:108DB00013FF0646C1788088FEF709FC71786D1CA8 +:108DC00000FB0177EDB24D45F0D10098C01C20F0BA +:108DD0000300009004B100203946FEF701FC009921 +:108DE0004FF0000908440090AE484D4647780EE029 +:108DF000284600F0F1FE0646807B30B106F10800FF +:108E000001F013FF727800FB02996D1CEDB2BD42B8 +:108E1000EED10098C01C20F00300009004B10020A7 +:108E2000494601F006FF0099084400902146684633 +:108E300000F0A9FE0098C01D20F007000090DAF8AD +:108E40000010814204D3A0EB0B01B1F5803F04DB9D +:108E50004FF00408CAF8000004E0CAF80000B8F1B6 +:108E6000000F02D04046BDE8FE8F34BB8F49002082 +:108E7000009A03F05BF8FBF760FA8A4801AA002128 +:108E80001030F8F7EBFA00B1FFDF8648407FFEF7BD +:108E900054FF00B1FFDF83484FF4F67140301BF000 +:108EA000C2FD80480421403080F8E91180F8EA11C1 +:108EB000062180F8EB11032101710020D3E770B582 +:108EC000784C06464034207804EB4015E0780835AD +:108ED00090B9A01990F8E80100280ED0A0780F28CA +:108EE00000D3FFDF202128461BF09DFD687866F344 +:108EF000020068700120E070284670BD2DE9F04145 +:108F000005460C4600270078052190463E46B1EB09 +:108F1000101F00D0FFDF287A50B101280ED0FFDFEC +:108F2000A8F800600CB1278066800020BDE8F081C1 +:108F30000127092674B16888A08008E0022714265A +:108F400044B16888A0802869E060A88A2082287BD4 +:108F50002072E5E7A8F80060E7E730B5514C012042 +:108F6000002120706170207260720322A272E07290 +:108F700021732174052121831F21618360744CA119 +:108F800061610A2121776077474D4FF4B06020621C +:108F90006868C11C21F00301814200D0FFDF6868CE +:108FA000606030BD30B5404C1568636810339D4239 +:108FB00002D20420136030BD3A4B5D785A6802EB50 +:108FC0000512107051700320D0801720908001206E +:108FD000D0709070002090735878401C5870606872 +:108FE00010306060002030BD70B506462D4800246A +:108FF000457807E0204600F0EFFD0178B14204D04B +:10900000641CE4B2AC42F5D1002070BDF7B5074650 +:1090100008780C4610B3FFF7E7FF0546A7F12006D6 +:10902000202F06D0052E19D2DFE806F00F2B2B15C6 +:109030001A0000F0DCFD0DB1697800E00021401A53 +:10904000A17880B20844FF2808D8A07830B1A08861 +:10905000022831D202E0608817282DD20720FEBDF9 +:10906000207AE0B161881729F8D3A1881729F5D3B0 +:10907000A1790029F2D0E1790029EFD0402804D964 +:10908000ECE7242F18D1207A48B161884FF6FB70A5 +:10909000814202D8A18881420ED90420FEBD0BE096 +:1090A000E44D0200AC030020180000200000002066 +:1090B0006E5246357800000065B9207802AA012179 +:1090C000FFF770FF0028E9D12078FFF78DFF05003A +:1090D00000D1FFDF052E18D2DFE806F0030B0E08E3 +:1090E0001100A0786870A088E8800FE06088A880F0 +:1090F0000CE0A078A87009E0A078E87006E054F8C9 +:10910000020FA8606068E86000E0FFDF0020C5E7AC +:109110001A2835D00DDC132832D2DFE800F01B31DD +:10912000203131272723252D313129313131312F7C +:109130000F00302802D003DC1E2821D10720704701 +:109140003A3809281CD2DFE800F0151B0F1B1B1B47 +:109150001B1B07000020704743F20400704743F2D6 +:1091600002007047042070470D2070470F207047A1 +:109170000820704711207047132070470620704761 +:109180000320704710B5007800F0010008F03EFBA6 +:10919000BDE81040BCE710B5007818B1012801D037 +:1091A000072010BD08F082FBBDE81040B0E710B505 +:1091B000007800F0010008F032FBBDE81040A7E79E +:1091C0000EB5017801F001018DF80010417801F031 +:1091D00001018DF801100178C1F340018DF80210F2 +:1091E0004178C1F340018DF80310017889088DF8AA +:1091F0000410417889088DF8051081788DF80610E3 +:10920000C1788DF8071000798DF80800684607F0DE +:109210002FFAFFF77DFF0EBD2DE9F84FDFF8F88339 +:10922000FE4C00264FF490771FE0012000F07CFDFB +:109230000120FFF744FE05463946D8F8080009F03A +:1092400090F8686000B9FFDF686807F0A2F8B0B175 +:109250002846FAF7D8FB284600F06CFD28B93A46B4 +:109260006968D8F8080009F0A7F894F9E90104281A +:10927000DBDA022009F0E2F907460025A5E03A46CC +:109280006968D8F8080009F097F8F2E7B8F8021012 +:109290004046491C89B2A8F80210B94201D3002106 +:1092A00041800221B8F8020009F020FA002864D0B9 +:1092B000B8F80200694608F01BFAFFF729FF00B171 +:1092C000FFDF9DF8000078B1B8F8020009F052FB0A +:1092D0005FEA000900D1FFDF484608F0C0FD18B181 +:1092E000B8F8020002F04CF9B8F8020009F030FBBF +:1092F0005FEA000900D1FFDF484608F0A8FDE0BBA7 +:109300000321B8F8020009F0F1F95FEA000B47D138 +:10931000FFDF45E0DBF8100010B10078FF2849D0EE +:10932000022000F001FD0220FFF7C9FD82464846F9 +:1093300008F099FECAF8040000B9FFDFDAF804006B +:1093400008F061FF002100900170B8F8021050464B +:10935000AAF8021001F016FE484608F056FF00B9C0 +:10936000FFDF504600F0E6FC18B99AF8010000074C +:1093700004D50098CBF8100012E024E0DBF81000D0 +:1093800038B10178491C11F0FF01017008D1FFDFED +:1093900006E000221146484600F0F3FB00B9FFDF6B +:1093A00094F9EA01022805DBB8F8020001F0AFFDEC +:1093B0000028AFD194F9E901042804DB484608F0FD +:1093C00088FF00B101266D1CEDB2BD4204D294F9B4 +:1093D000EA010228BFF65AAF002E7FF422AFBDE8A3 +:1093E000F84F032000F0A0BC10B58B4CE06008687B +:1093F0002061AFF2DB10F9F770FD607010BD874897 +:1094000000214038017084480170854941607047EF +:1094100070B505464FF080500C46D0F8A410491C9A +:1094200005D1D0F8A810C9430904090C0BD050F895 +:10943000A01F01F001012970416821608068A080AF +:10944000287830B970BD062120460CF092FB01202F +:109450002870607940F0C000607170BD70B54FF049 +:1094600080540D46D4F88010491C0BD1D4F88410D8 +:10947000491C07D1D4F88810491C03D1D4F88C10AA +:10948000491C0CD0D4F880100160D4F884104160DD +:10949000D4F888108160D4F88C10C16002E01021EB +:1094A0000CF067FBD4F89000401C0BD1D4F894006A +:1094B000401C07D1D4F89800401C03D1D4F89C007C +:1094C000401C09D054F8900F286060686860A0685C +:1094D000A860E068E86070BD2846BDE870401021D3 +:1094E0000CF047BB4D480079E9E470B54B4CE0788F +:1094F00030B3207804EB4010407A00F0070020449D +:1095000090F9E801002800DCFFDF2078002504EB5B +:109510004010407A00F00700011991F8E801401E60 +:1095200081F8E8012078401CC0B220700F2800D1DB +:109530002570A078401CA0700CF012FAE57070BD88 +:10954000FFDF70BD3EB50546032109F0CFF80446A4 +:10955000284609F0FDF9054604B9FFDF206918B176 +:109560000078FF2800D1FFDF01AA6946284600F0F5 +:1095700008FB60B9FFDF0AE0002202A9284600F0DC +:1095800000FB00B9FFDF9DF8080000B1FFDF9DF888 +:109590000000411E8DF80010EED22069019988422A +:1095A00001D1002020613EBD70B50546A0F57F4089 +:1095B0000C46FF3800D1FFDF012C01D0FFDF70BD6A +:1095C000FFF790FF040000D1FFDF207820F00F00AC +:1095D000401D20F0F0005030207065800020207287 +:1095E00001202073BDE870407FE72DE9F041164669 +:1095F0000D460746FFF776FF040000D1FFDF207815 +:1096000020F00F00401D20F0F000503020706780E7 +:1096100001202072286805E018000020EC030020DB +:10962000F81300202061A888A0822673BDE8F041CD +:109630005BE77FB5FFF7D8FC040000D1FFDF02A98C +:109640002046FFF7FFFA054603A92046FFF714FB63 +:109650008DF800508DF80100BDF80800001DADF830 +:109660000200BDF80C00001DADF80400E088ADF864 +:109670000600684608F0B2F8002800D0FFDF7FBD82 +:109680002DE9F05FF94E8146307810B10820BDE831 +:10969000F09F4846F7F73DFE08B11020F7E7F44C7D +:1096A000207808B9FFF759FCA17A607A4D46084442 +:1096B000C4B200F09CFAA04207D2201AC1B22A46D6 +:1096C0000020FFF76FFC0028E1D17168E848C91C51 +:1096D000002721F003017160B3463E463D46BA467D +:1096E0003C4690F801800AE0204600F075FA417887 +:1096F000807B0E4410FB0155641CE4B27F1C444582 +:10970000F2D1C6EBC601DA4E0AEB870000EB81000E +:10971000F17A00EB850000EB8100DBF804105C4679 +:109720004518012229464846FFF7C2FA070012D021 +:109730000020FFF759FC05000BD005F1130061680C +:1097400020F00300884200D0FFDF7078401E707068 +:10975000656038469BE7002229464846FFF7A8FA8D +:1097600000B1FFDFD9F8000060604FF6FF70608045 +:109770000120207000208AE72DE9F0410446BB4813 +:1097800017460E46007810B10820BDE8F081084663 +:10979000F7F799FD08B11020F7E7B54D287808B91B +:1097A000FFF7DBFB601E1E2807D8012C22D1307882 +:1097B000FE281FD828770020E7E7A4F120001F2803 +:1097C00005D8E0B23A463146BDE8F0411EE4A4F1C6 +:1097D00040001F2805D831462046BDE8F04100F082 +:1097E000D1BAA4F1A0001F2804D80020A02C03D0D7 +:1097F000A12C06D00720C8E7317801F00101697774 +:10980000C3E731680922F82901D38B0701D010463C +:10981000BBE76B7C03F00303012B04D16B8BD733C5 +:109820009CB28C42F3D82962AFE72DE9F04781461C +:109830000E460846F7F76DFD48B94846F7F787FD2D +:1098400028B909F1030020F00301494502D0102096 +:10985000BDE8F08786484FF0000A4030817869B152 +:109860004178804600EB41140834378832460021A5 +:10987000204600F06DFA050004D027E0A6F800A00D +:109880000520E5E7B9F1000F24D03088B84201D9AE +:109890000C251FE0607800F00705284600F044FA28 +:1098A00008EB0507324697F8E8014946401C87F85F +:1098B000E801204607F5F47700F04AFA05463878C3 +:1098C000401E3870032000F02FFA2DB10C2D01D06E +:1098D000A6F800A02846BBE76078644E00F00701B8 +:1098E000012923D002290CD0032934D0FFDF98F8B6 +:1098F00001104046491CC9B288F801100F2935D023 +:1099000036E0616821B1000702D46088FFF71AFED3 +:1099100098F8EA014746012802D17078F9F7FCFA75 +:1099200097F9EA010428E2DBFFDFE0E7616821B193 +:109930004FF49072B06808F03FFD98F8E90147468F +:10994000032802D17078F9F7E7FA97F9E9010428BA +:10995000CDDBFFDFCBE7C00602D56088FFF7F2FD65 +:1099600098F9EB010628C2DBFFDFC0E780F801A011 +:109970008178491E8170617801F0070101EB0800D0 +:1099800090F8E811491C80F8E811A3E770B50D467E +:109990000446F7F798FC18B92846F7F7BAFC08B15F +:1099A000102070BD29462046BDE870400AF0FBBB80 +:1099B00070B505460AF01AFCC4B22846F7F7C7FC92 +:1099C00008B1102070BD35B128782C7018B1A042B4 +:1099D00001D0072070BD2046FDF764FE052805D1A3 +:1099E0000AF008FC012801D0002070BD0F2070BDD6 +:1099F00070B5044615460E460846F7F764FC18B9DC +:109A00002846F7F786FC08B1102070BD022C03D061 +:109A1000102C01D0092070BD2A46314620460AF09C +:109A2000F2FB0028F7D0052070BD70B514460D4636 +:109A30000646F7F748FC38B92846F7F76AFC18B924 +:109A40002046F7F784FC08B1102070BD2246294655 +:109A500030460AF0F7FB0028F7D0072070BD3EB56E +:109A60000446F7F756FC28B110203EBD1800002030 +:109A7000AC030020684606F064FDFFF749FB0028B0 +:109A8000F3D19DF806002070BDF808006080BDF895 +:109A90000A00A0800020E8E770B505460C4608469D +:109AA000F7F755FC20B93CB12068F7F732FC08B154 +:109AB000102070BDA08828B121462846BDE870401E +:109AC000FDF748BE092070BD70B504460D46084636 +:109AD000F7F7F9FB30B9601E1E2814D82846F7F7AF +:109AE000F2FB08B1102070BD042C01D9072070BD15 +:109AF00004B9FFDFF54800EB840050F8041C284649 +:109B0000BDE870400847A4F120001F2805D8294669 +:109B10002046BDE87040FAF798BBF02CE6D1A86863 +:109B2000F7F7D1FB0028DDD1284607F0C4FEBDE8D9 +:109B30007040FFF7EDBA70B504460D460846F7F7DA +:109B4000E8FB30B9601E1E2811D82846F7F7BBFB8A +:109B500008B1102070BD012C05D0022C03D0032CBD +:109B600001D0042C01D1062070BD072070BDA4F1E6 +:109B700020001F28F9D829462046BDE87040FAF792 +:109B8000BCBB08F033B938B50446D148007B00F0BF +:109B90000105D9B904F012FB0DB1226800E00022E2 +:109BA000CC484178C06806F0BAFBCA481030C0788B +:109BB0008DF8000010B1012802D004E0012000E07F +:109BC00000208DF80000684606F033FD002D02D01D +:109BD00020682830206038BD30B5BD4D0446687817 +:109BE000A04200D8FFDF686800EB041030BD70B5FC +:109BF000B74800252C46467807E02046FFF7ECFFE3 +:109C00004078641C2844C5B2E4B2B442F5D1284679 +:109C100070BD2DE9F0410C4607464FF0000800F0FA +:109C2000DEF80646FF2801D94FF013083868C01C3B +:109C300020F003023A6054EA080421D1A448F3B2A8 +:109C4000072124300CF09AF909E0072C10D2DFE844 +:109C500004F0060408080A0406009F4804E09F4830 +:109C600002E09F4800E09F480CF0A8F9054600E09C +:109C7000FFDFA54200D0FFDF641CE4B2072CE4D371 +:109C8000386800EB0610386040467EE5021D5143FF +:109C9000452900D245210844C01CB0FBF2F0C0B2F7 +:109CA00070472DE9FC5F064689484FF000088B4657 +:109CB0004746444690F8019022E02046FFF78CFF8B +:109CC000050000D1FFDF687869463844C7B22846EE +:109CD000FEF7B8FF824601A92846FEF7CDFF0346EE +:109CE000BDF804005246001D81B2BDF80000001D01 +:109CF00080B208F079FD6A78641C00FB0288E4B247 +:109D00004C45DAD13068C01C20F003003060BBF154 +:109D1000000F00D000204246394608F073FD31683C +:109D200008443060BDE8FC9F69494031087100205B +:109D3000C870704766494031CA782AB10A7801EB89 +:109D400042110831814201D0012070470020704744 +:109D50002DE9F04106460078154600F00F0400207A +:109D60001080601E0F46052800D3FFDF57482A46A3 +:109D7000183800EB8400394650F8043C3046BDE802 +:109D8000F041184770B50C46402802D0412806D152 +:109D900020E0A07861780D18E178814201D9072090 +:109DA00070BD2078012801D9132070BDFF2D08D87F +:109DB0000AF0B2FB06460BF08BFD301A801EA8425B +:109DC00001DA122070BD4248216881602179017357 +:109DD000002070BDBDE87040084600F02BB82DE9AA +:109DE000F047DFF8EC900026344699F8090099F81E +:109DF0000A2099F801700244D5B299F80B2010445A +:109E000000F0FF0808E02046FFF7E6FE817B40787F +:109E100011FB0066641CE4B2BC42F4D199F809104D +:109E200099F80A0029442944414400B1012008441A +:109E300030440DE538B50446407800F003000128B1 +:109E400003D002280BD0072038BD606858B1F7F75F +:109E500087FAD0B96068F7F77AFA20B915E0606838 +:109E6000F7F731FA88B969462046FCF797F80028D9 +:109E7000EAD1607800F00300022808D19DF80000C4 +:109E800028B16068F7F763FA08B1102038BD61891E +:109E9000F8290DD8208988420AD8607800F003029A +:109EA0000B48012A06D1D731026A89B28A4201D20F +:109EB000092038BD94E80E0000F1100585E80E0079 +:109EC0000AB900210183002038BD0000044E0200C1 +:109ED000AC030020180000204B410000FFAC000044 +:109EE000E92F00002B3F01002DE9F0410746144601 +:109EF0008846084601F022FD064608EB88001C2231 +:109F0000796802EBC0000D18688C58B1414638469C +:109F100001F01CFD014678680078C200082305F1B5 +:109F200020000CE0E88CA8B14146384601F015FD50 +:109F30000146786808234078C20005F1240008F043 +:109F400092FA38B1062121726681D0E90010C4E985 +:109F5000031009E0287809280BD0052020726681BB +:109F60006868E060002028702046BDE8F04101F0FC +:109F7000DBBC072020726681F4E72DE9F04116462C +:109F80000D460746406801EB85011C2202EBC1012A +:109F90004418204601F003FD40B10021708865F3AC +:109FA0000F2160F31F4106200CF0C2F80920207039 +:109FB000324629463846BDE8F04195E72DE9F041A3 +:109FC0000E46074600241C21F07816E004EB8403BB +:109FD000726801EBC303D25C6AB1FFF783FA050034 +:109FE00000D1FFDF6F802A4621463046FFF7C5FFCC +:109FF0000120BDE8F081641CE4B2A042E6D8002054 +:10A00000F7E770B5064600241C21C0780AE000BFBF +:10A0100004EB8403726801EBC303D5182A782AB1D4 +:10A02000641CE4B2A042F3D8402070BD2821284629 +:10A030001AF0D7FC706880892881204670BD70B501 +:10A04000034600201C25DC780DE000BF00EB8006F5 +:10A050005A6805EBC6063244167816B1128A8A424F +:10A0600004D0401CC0B28442F0D8402070BDF0B58E +:10A07000044600201C26E5780EE000BF00EB8007B8 +:10A08000636806EBC7073B441F788F4202D15B78B9 +:10A09000934204D0401CC0B28542EFD84020F0BDAE +:10A0A0000078032801D00020704701207047007815 +:10A0B000022801D00020704701207047007807284F +:10A0C00001D000207047012070472DE9F04106467D +:10A0D00088461078F1781546884200D3FFDF2C7847 +:10A0E0001C27641CF078E4B2A04201D8201AC4B244 +:10A0F00004EB8401706807EBC1010844017821B1C9 +:10A100004146884708B12C7073E72878A042E8D10F +:10A11000402028706DE770B514460B880122A240DC +:10A12000134207D113430B8001230A22011D08F0BB +:10A1300064F9047070BD2DE9FF4F81B00878DDE946 +:10A140000E7B9A4691460E4640072CD4019808F0A3 +:10A1500011FC040000D1FFDF07F1040820461FFABC +:10A1600088F107F050FD050000D1FFDF20462946A9 +:10A170006A4607F09AFF0098A0F80370A0F805A0BF +:10A18000284608F040F8017869F306016BF3C7111F +:10A19000017020461FFA88F107F078FD00B9FFDF53 +:10A1A000019806F02EF806EB0900017F491C0177A3 +:10A1B00005B0BDE8F08F2DE9F84F0E469A4691465E +:10A1C0000746032108F092FA0446008DDFF8B885AF +:10A1D000002518B198F80000B0421ED1384608F0AA +:10A1E000C9FB070000D1FFDF09F10401384689B23D +:10A1F00007F009FD050010D0384629466A4607F0E9 +:10A2000054FF009800210A460180817006F0B2F8E0 +:10A210000098C01DCAF8000021E098F80000B04284 +:10A2200016D104F1260734F8341F012000FA06F98C +:10A2300011EA090F00D0FFDF2088012340EA09005E +:10A2400020800A22391D384608F0F2F8067006E030 +:10A25000324604F1340104F12600FFF75CFF0A21C5 +:10A2600088F800102846BDE8F88FFEB515460C4664 +:10A27000064602AB0C220621FFF79DFF002827D0DF +:10A280000299607812220A70801C487008224A8065 +:10A29000A07002982988052381806988C180A988D7 +:10A2A0000181E988418100250C20CDE900050622C5 +:10A2B00021463046FFF73FFF2946002266F31F4143 +:10A2C000F02310460BF08AFE6078801C607001203D +:10A2D000FEBDFEB514460D460622064602AB1146EB +:10A2E000FFF769FF002812D0029B1320002118708D +:10A2F000A8785870022058809C800620CDE9000183 +:10A300000246052329463046FFF715FF0120FEBD12 +:10A310002DE9FE430C46804644E002AB0E220721A5 +:10A320004046FFF748FF002841D060681C2267784C +:10A330008678BF1C06EB860102EBC1014518029826 +:10A340001421017047700A214180698A0181E98ADC +:10A350004181A9888180A9898181304601F0EEFA86 +:10A36000029905230722C8806F70042028700025F9 +:10A370000E20CDE9000521464046FFF7DCFE2946C8 +:10A3800066F30F2168F31F41F023002206200BF033 +:10A3900025FE6078FD49801C607062682046921C32 +:10A3A000FFF793FE606880784028B6D10120BDE8B1 +:10A3B000FE83FEB50D46064638E002AB0E220721AD +:10A3C0003046FFF7F8FE002835D068681C23C178B6 +:10A3D00001EB810203EBC20284180298152202707D +:10A3E000627842700A224280A2894281A2888281D8 +:10A3F000084601F0A3FA014602988180618AC18073 +:10A40000E18A0181A088B8B10020207000210E20CF +:10A41000CDE900010523072229463046FFF78BFED0 +:10A420006A68DB492846D21CFFF74FFE6868C0788F +:10A430004028C2D10120FEBD0620E6E72DE9FE43FB +:10A440000C46814644E0204601F093FAD0B302ABBB +:10A45000082207214846FFF7AEFE0028A7D0606813 +:10A460001C2265780679AD1C06EB860102EBC10162 +:10A4700047180298B7F81080062101704570042132 +:10A480004180304601F05AFA01460298052307221E +:10A49000C180A0F804807D70082038700025CDE9C7 +:10A4A000000521464846FFF746FE294666F30F2180 +:10A4B00069F31F41F023002206200BF08FFD607826 +:10A4C000801C60706268B3492046121DFFF7FDFDD5 +:10A4D000606801794029B6D1012068E72DE9F34F82 +:10A4E00083B00E4680E0304601F043FA002875D074 +:10A4F00071681C2091F8068008EB880200EBC2000E +:10A500000C184146304601F028FA0146A078C300F5 +:10A5100070684078C20004F1240007F0C0FF0746CD +:10A520008088E18B401A80B2002581B3AA46218B36 +:10A53000814200D808468146024602AB07210398B3 +:10A54000FFF739FE010028D0BAF1000F03D0029ABC +:10A55000B888022510808B46E28B3968A9EB05008C +:10A560001FFA80FA0A440398009208F003FAED1DDE +:10A57000009A59465346009507F011FEE08B50446F +:10A5800080B2E083B988884209D1012508E0FFE75D +:10A59000801C4FF0010A80B2C9E7002008E60025C0 +:10A5A000CDE90095238A072231460398FFF7C3FDC2 +:10A5B000E089401EE0818DB1A078401CA0707068D9 +:10A5C000F178427811FB02F1CAB2816901230E30A1 +:10A5D00007F013FF80F800800020E08372686E4966 +:10A5E0003046921DFFF771FD7068817940297FF434 +:10A5F0007AAF0120DCE570B5064648680D46144682 +:10A600008179402910D104EB84011C2202EBC101A5 +:10A61000084401F0E5F9002806D0686829468471ED +:10A620003046BDE8704059E770BDFEB50C460746A0 +:10A63000002645E0204601F09CF9D8B360681C2252 +:10A64000417901EB810102EBC1014518688900B92C +:10A65000FFDF02AB082207213846FFF7ACFD0028D8 +:10A6600033D00299607816220A70801C487004204A +:10A6700048806068407901F061F90146029805233D +:10A68000072281806989C1800820CDE90006214622 +:10A690003846FFF750FD6078801C6070A889698992 +:10A6A0000844B0F5803F00D3FFDFA88969890844DA +:10A6B000A8816E81626839492046521DFFF705FD69 +:10A6C000606841794029B5D10120FEBD30B5438C89 +:10A6D000458BC3F3C704002345B1838B641EED1A79 +:10A6E000C38A6D1E1D4495FBF3F3E4B22CB10089BF +:10A6F00018B1A04200D8204603444FF6FF708342B1 +:10A7000000D3034613800C7030BD2DE9FC41074691 +:10A7100016460D46486802EB86011C2202EBC10179 +:10A7200044186A4601A92046FFF7D0FFA089618935 +:10A7300001448AB2BDF80010914212D0081A00D527 +:10A74000002060816868407940280AD1204601F0E5 +:10A750003DF9002805D06868294646713846FFF75C +:10A7600064FFBDE8FC812DE9FE4F89468046154611 +:10A770005088032107F0BAFF8346B8F8020040284A +:10A780000ED240200DE000002C000020A1A000000F +:10A79000AFA00000BDA00000E1B90000CDB90000ED +:10A7A000403880B282460146584601F0E2F800285F +:10A7B0007ED00AEB8A001C22DBF8041002EBC000FA +:10A7C0000C18204601F0EBF8002877D1B8F800000B +:10A7D000E18A88423CD8A189D1B348456ED1002690 +:10A7E0005146584601F0B2F8218C0F18608B48B9D9 +:10A7F000B9F1020F62D3B8F804006083618A88421D +:10A8000026D80226A9EB06001FFA80F9B888A28B89 +:10A81000801A002814DD4946814500DA084683B2D3 +:10A8200068886968029139680A44CDE9003208F005 +:10A830008FF8DDE90121F61D009B009607F07BFCF7 +:10A84000A18B01EB090080B2A083618B884207D9FC +:10A85000688803B052465946BDE8F04F01F0DDB8B4 +:10A860001FD14FF009002872B8F802006881D7E9BB +:10A870000001C5E90401608BA881284601F054F865 +:10A880005146584601F062F80146DBF804000823FF +:10A890000078C20004F1200007F0E5FD0020A0834D +:10A8A0006083A0890AF0FF02401EA081688800E052 +:10A8B00004E003B05946BDE8F04F26E7BDE8FE8F3F +:10A8C0002DE9F041064615460F461C461846F6F798 +:10A8D000FAFC18B92068F6F71CFD08B1102013E443 +:10A8E0007168688C0978B0EBC10F01D313200BE4B9 +:10A8F0003946304601F02AF801467068082300788E +:10A90000C20005F1200007F078FDD4E90012C0E98B +:10A9100000120020E3E710B50446032107F0E6FE2D +:10A920000146007800F00300022805D02046BDE86B +:10A93000104001F1140298E48A8A2046BDE81040D4 +:10A94000C7E470B50446032107F0D0FE0546014672 +:10A950002046FFF773FD002816D029462046FFF752 +:10A9600064FE002810D029462046FFF722FD00286B +:10A970000AD029462046FFF7CBFC002804D0294600 +:10A980002046BDE87040A9E570BD2DE9F0410C46B8 +:10A9900080461EE0E178427811FB02F1CAB281697B +:10A9A00001230E3007F05FFD077860681C22C17933 +:10A9B000491EC17107EB8701606802EBC1014618AF +:10A9C0003946204600F0D5FF18B1304600F0E0FFD0 +:10A9D00020B16068C1790029DCD180E7FEF782FDF3 +:10A9E000050000D1FFDF0A202872384600F0A6FFDC +:10A9F00068813946204600F0B0FF014660680823B0 +:10AA00004078C20006F1240007F02DFDD0E90010C7 +:10AA1000C5E90310A5F80280284600F085FFB0784C +:10AA200000B9FFDFB078401EB07058E770B50C4633 +:10AA30000546032107F05AFE01464068C2792244C8 +:10AA4000C2712846BDE870409FE72DE9FE4F82465F +:10AA5000507814460F464FF0000800284FD00128C8 +:10AA600007D0022822D0FFDF2068B8606068F86055 +:10AA700024E702AB0E2208215046FFF79CFB00287A +:10AA8000F2D00298152105230170217841700A2126 +:10AA90004180C0F80480C0F80880A0F80C8062886B +:10AAA00082810E20CDE90008082221E0A6783046F8 +:10AAB00000F044FF054606EB86012C22786802EB85 +:10AAC000C1010822465A02AB11465046FFF773FBFC +:10AAD0000028C9D002980721017021784170042113 +:10AAE000418008218580C680CDE9001805230A46EB +:10AAF00039465046FFF71FFB87F80880DEE6A67848 +:10AB0000022516B1022E13D0FFDF2A1D914602AB9B +:10AB100008215046FFF74FFB0028A5D002980121DD +:10AB2000022E0170217841704580868002D005E0B8 +:10AB30000625EAE7A188C180E1880181CDE9009876 +:10AB40000523082239465046D4E710B504460321B0 +:10AB500007F0CCFD014600F108022046BDE8104098 +:10AB600073E72DE9F05F0C4601281DD0957992F826 +:10AB70000480567905EB85011F2202EBC10121F00B +:10AB8000030B08EB060111FB05F14FF6FF7202EA19 +:10AB9000C10909F1030115FB0611F94F21F0031A50 +:10ABA00040B101283DD124E06168E57891F800804A +:10ABB0004E78DFE75946786807F0D3FB606000B94C +:10ABC000FFDF5946606819F02EFFE570514678683E +:10ABD00007F0C7FB6168486100B9FFDF6068426940 +:10ABE00002EB09018161606880F80080606846704E +:10ABF00017E0606852464169786807F0DDFB5A4605 +:10AC00006168786807F0D8FB032007F017FD044659 +:10AC1000032007F01BFD201A012802D1786807F0F5 +:10AC200095FB0BEB0A00BDE8F09F024600210220D5 +:10AC300097E773B5D24D0A202870009848B10024D8 +:10AC40004FEA0D0007F06FFB002C01D100996960FD +:10AC50007CBD01240020F5E770B50C46154638216F +:10AC6000204619F0E0FE012666700A2104F11C005E +:10AC700019F0D9FE05B9FFDF297A207861F30100C8 +:10AC80002070A879002817D02A4621460020FFF717 +:10AC900068FF6168402088706168C87061680871E9 +:10ACA0006168487161688871616828880881616895 +:10ACB000688848816068868170BDC878002802D0A5 +:10ACC000002201204DE7704770B50546002165F36D +:10ACD0001F4100200BF02CFA0321284607F006FD47 +:10ACE000040000D1FFDF21462846FFF767F900285E +:10ACF00004D0207840F010002070012070BD2DE9B4 +:10AD0000FF4180460E460F0CFEF7ECFB050007D016 +:10AD10006F800321384607F0E9FC040008D106E003 +:10AD200004B03846BDE8F0411321F9F743BEFFDF18 +:10AD30005FEA080005D0B8F1060F18D0FFDFBDE8C4 +:10AD4000FF8120782A4620F0080020700020ADF80E +:10AD5000020002208DF800004FF6FF70ADF80400ED +:10AD6000ADF8060069463846F9F71BFAE7E7C6F37F +:10AD7000072101EB81021C23606803EBC202805CA7 +:10AD8000042803D008280AD0FFDFD8E7012000906C +:10AD90004FF440432A46204600F008FECFE704B0B7 +:10ADA0002A462046BDE8F041FFF7E7B82DE9F05FFD +:10ADB0000027B0F80A9090460C4605463E46B9F189 +:10ADC000400F01D2402001E0A9F140001FFA80FAB3 +:10ADD000287AC01E08286BD2DFE800F00D04192085 +:10ADE00058363C4772271026002C6CD0D5E9030159 +:10ADF000C4E902015CE070271226002C63D00A220D +:10AE000005F10C0104F1080019F0B1FD50E07127C3 +:10AE10000C26002C57D0E868A06049E07427102663 +:10AE20009CB3D5E90301C4E902016888032107F056 +:10AE30005DFC8346FEF756FB02466888508051460B +:10AE40005846FFF751F833E075270A26ECB1A88978 +:10AE500020812DE076271426BCB105F10C0004F109 +:10AE6000080307C883E8070022E07727102664B1AB +:10AE7000D5E90301C4E902016888032107F036FC23 +:10AE800001466888FFF781FD12E01CE07327082661 +:10AE9000CCB16888032107F029FC01460078C00680 +:10AEA00006D56888FFF78AF810B96888F8F78FFD2B +:10AEB000A8F800602CB12780A4F806906680688806 +:10AEC000A0800020AFE6A8F80060FAE72DE9FC4179 +:10AED0000C461E4617468046032107F007FC054630 +:10AEE0000A2C0AD2DFE804F0050505050505090965 +:10AEF0000907042303E0062301E0FFDF0023CDE977 +:10AF00000076224629464046FFF715F929E438B570 +:10AF10000546A0F57F40FF3830D0284607F018FDE1 +:10AF2000040000D1FFDF204607F09DF8002815D06F +:10AF300001466A46204607F0B8F800980321B0F8A9 +:10AF40000540284607F0D2FB0546052C03D0402CCF +:10AF500005D2402404E0007A80B1002038BD403C96 +:10AF6000A4B2214600F005FD40B1686804EB8401FD +:10AF70003E2202EBC101405A0028EFD0012038BD2B +:10AF80002C0000202DE9F04F054689B0408807F0DD +:10AF9000DFFC040000D1FFDF06AA2046696800F04C +:10AFA000C1FC069C001F34F8031F21806388638066 +:10AFB000228881B28A4205D1042B0AD0052B1DD0EC +:10AFC000062B15D02A462046FFF7CDFB09B0BDE879 +:10AFD000F08F1646241D2A4621463046F7F74FFAD1 +:10AFE0000828F3D12A4621463046FCF7FAFBEDE764 +:10AFF0006888211D6B68FAF73FFCE7E71746688809 +:10B00000032107F073FB4FF000088DF8048006461B +:10B01000ADF80680042FD9D36279002AD6D02079E2 +:10B020004FF6FF794FF01C0A13282CD008DC0128BA +:10B0300078D0062847D0072875D0122874D106E0AA +:10B04000142872D0152871D016286DD1ACE10C2FC0 +:10B050006AD1307800F00301022965D140F0080080 +:10B0600030706079B07001208DF804002089ADF84F +:10B0700008006089ADF80A00A089ADF80C00E089ED +:10B08000ADF80E0019E0B07890429FD130780107FA +:10B090009CD5062F9AD120F0080030706888414670 +:10B0A00060F31F4100200BF043F802208DF80400EC +:10B0B000ADF808902089ADF80A0068882A4601A9F1 +:10B0C000F9F76FF882E7082F80D12789B4F80A9042 +:10B0D000402F01D2402001E0A7F1400080B280461D +:10B0E0000146304600F045FC08B3716808EB880063 +:10B0F0002C2202EBC000095A4945E3D1FE4807AAB9 +:10B10000D0E90210CDE9071060798DF81C0008F035 +:10B11000FF048DF81E4068883146FFF796FC2A46EA +:10B12000214639E0B6E014E03CE039E0E6E0F248E0 +:10B13000D0E90010CDE907106079ADF820708DF8E6 +:10B140001C00ADF82290688807AA3146FFF77DFC05 +:10B150003CE7082FB6D16089B4F80880402801D2B6 +:10B16000402000E0403887B23946304600F001FC0C +:10B170000028A7D007EB870271680AEBC2000844D9 +:10B18000028A42459ED1017808299BD14078617995 +:10B19000884297D1F9B22A463046FEF7EEFE15E70F +:10B1A0000E2F07D0CDF81C80CDF8208060798DF867 +:10B1B0001C00C8E76189E7898B46B4F80C903046DB +:10B1C000FEF73DFFABF14001402901D309204AE0E1 +:10B1D000B9F1170F01D3172F01D20B2043E04028FC +:10B1E0000ED000EB800271680AEBC20008440178BF +:10B1F000012903D1407861798842A9D00A2032E040 +:10B200003046FEF7FEFE014640282BD001EB8103BD +:10B2100072680AEBC30002EB0008012288F80020E4 +:10B22000627988F80120706822894089B84200D983 +:10B230003846248A03232B72AA82EF812882A5F83C +:10B240000C906C82084600F079FB6881A8F8149095 +:10B25000A8F81870A8F80E40A8F810B0284600F01A +:10B2600063FBB3E6042005212972A5F80A80E88172 +:10B2700001212973A049D1E90421CDE90721617990 +:10B280008DF81C10ADF81E00688807AA3146FFF73C +:10B29000DCFBE3E7062FE4D3B078904215D1307899 +:10B2A000010712D520F0080030706888414660F32D +:10B2B0001F4100200AF03CFF02208DF80400208985 +:10B2C000ADF80800ADF80A90F7E604213046FEF725 +:10B2D000CEFE04464028C4D00220830300902A46B4 +:10B2E0002146304600F062FB4146688864F30F2136 +:10B2F00060F31F4106200AF01BFF67E60E2FB0D156 +:10B3000004213046FEF7B3FE81464028A9D04146CD +:10B31000688869F30F2160F31F4106200AF008FFD7 +:10B32000208A0790E08900907068A7894089B84218 +:10B3300000D938468346B4F80A80208905904846EB +:10B3400000F0FCFA6881079840B10220079B00904A +:10B350002A464946304600F029FB37E6B8F1170F78 +:10B360001ED3172F1CD30420287200986882EF8107 +:10B37000A5F810B0A5F80C8009EB89020AEBC20011 +:10B380007168009A0C180598A4F81480A4F818B0F5 +:10B39000E2812082284600F0C7FA0620207015E6D8 +:10B3A00001200B230090D3E7082FA6D12189304636 +:10B3B000FEF745FE074640289FD007EB87027168DD +:10B3C0000AEBC2000844804600F0E9FA002894D154 +:10B3D0006489B8F80E002044B0F5803F05D3688832 +:10B3E0003A46314600F019FBF0E5002C85D0A8F86C +:10B3F0000E0068883A463146FFF7FDF808202872AB +:10B40000384600F09BFA6881AC8127E770B50D469D +:10B410000646032107F06AF9040004D020780007EB +:10B4200004D5112070BD43F2020070BD2A462146AA +:10B430003046FEF71AFF18B9286860616868A06195 +:10B44000207840F008002070002070BD70B50D46D7 +:10B450000646032107F04AF9040004D020780007CB +:10B4600004D4082070BD43F2020070BD2A46214674 +:10B470003046FEF72EFF00B9A582207820F00800A4 +:10B480002070002070BD2DE9F04F0E4691B080462F +:10B49000032107F02BF90446404607F06BFA0746F4 +:10B4A0000020079008900990ADF830000A900290B3 +:10B4B0000390049004B9FFDF0DF108091FBBFFDF03 +:10B4C00021E038460BA9002206F090FC9DF82C00E4 +:10B4D00000F07F050A2D00D3FFDF6019017F491EB0 +:10B4E00001779DF82C0000060DD52A460CA907A867 +:10B4F000FEF711FE02E00000144E020019F80510DC +:10B50000491C09F80510761EF6B2DAD204F13400AF +:10B51000FA4D04F1260BDFF8E8A304F12A070690A0 +:10B5200010E05846069900F06AFA064628700A2884 +:10B5300000D3FFDF5AF8261040468847E08CC05DF4 +:10B54000B04202D0208D0028EBD10A202870EC4DAB +:10B550004E4628350EE00CA907A800F050FA044624 +:10B56000375D55F8240000B9FFDF55F8242039462F +:10B5700040469047BDF81E000028ECD111B026E5EA +:10B5800010B5032107F0B2F8040000D1FFDF0A2153 +:10B5900004F11C0019F047FA207840F004002070F4 +:10B5A00010BD10B50C46032107F0A0F82044007F21 +:10B5B000002800D0012010BD2DE9F84F894615461E +:10B5C0008246032107F092F8070004D02846F5F7D9 +:10B5D0007AFE40B903E043F20200BDE8F88F484626 +:10B5E000F5F797FE08B11020F7E7786828B1698869 +:10B5F0000089814201D90920EFE7B9F800001C2435 +:10B6000018B1402809D2402008E03846FEF7F9FC7E +:10B610008046402819D11320DFE7403880B28046A9 +:10B620000146384600F0A5F948B108EB8800796872 +:10B6300004EBC000085C012803D00820CDE70520FA +:10B64000CBE7FDF74FFF06000BD008EB88007968C9 +:10B6500004EBC0000C18B9F8000020B1E88910B163 +:10B6600013E01120B9E72888172802D36888172823 +:10B6700001D20720B1E7686838B12B1D2246414648 +:10B680003846FFF71DF90028A7D104F10C026946DE +:10B690002046FFF71BF8288860826888E082B9F8A6 +:10B6A000000030B102202070E889A080E889A0B1B4 +:10B6B0002BE003202070A889A08078688178402939 +:10B6C00005D180F8028039465046FEF721FE4046FB +:10B6D00000F034F9A9F8000021E07868218B408956 +:10B6E000884200D908462083A6F802A004203072C0 +:10B6F000B9F800007081E0897082F181208B30827E +:10B70000A08AB081304600F00FF97868C1784029EE +:10B7100005D180F8038039465046FEF74AFE0020E6 +:10B720005BE770B50D460646032106F0DFFF040017 +:10B7300003D0402D04D2402503E043F2020070BD47 +:10B74000403DADB2294600F014F958B105EB850132 +:10B750001C22606802EBC101084400F020F918B116 +:10B76000082070BD052070BD2A462146304600F0F5 +:10B7700054F9002070BD2DE9F0410D461646804673 +:10B78000032106F0B3FF0446402D01D2402500E01E +:10B79000403DADB28CB1294600F0EBF880B105EB2D +:10B7A00085011C22606802EBC1014718384600F091 +:10B7B000F6F838B10820BDE8F08143F20200FAE75C +:10B7C0000520F8E733463A4629462046FFF778F841 +:10B7D0000028F0D1EAB221464046FEF796FF00204D +:10B7E000E9E72DE9F0410D4616468046032106F0B3 +:10B7F0007DFF0446402D01D2402500E0403DAFB220 +:10B8000024B13046F5F75FFD38B902E043F202009B +:10B81000D1E73068F5F757FD08B11020CBE739467E +:10B82000204600F0A6F860B107EB87011C22606893 +:10B8300002EBC1014518284600F0B1F818B1082004 +:10B84000B9E70520B7E7B088A98A884201D90C205A +:10B85000B1E76168E88C4978B0EBC10F01D31320E0 +:10B86000A9E73946204600F078F8014660680823C9 +:10B870004078C20005F1240006F0BFFDD6E90012B1 +:10B88000C0E90012FAB221464046FEF7B4FE00209D +:10B8900091E72DE9F0470D461F469046814603216A +:10B8A00006F024FF0446402D01D2402001E0A5F11E +:10B8B000400086B23CB14DB13846F5F748FD50B175 +:10B8C0001020BDE8F08743F20200FAE76068C8B1D3 +:10B8D000A0F80C8024E03146204600F04AF888B1F8 +:10B8E00006EB86011C22606802EBC1014518284660 +:10B8F00000F055F840B10820E3E700002C000020DC +:10B900002C4E02000520DCE7A5F80880F2B22146A3 +:10B910004846FEF7FAFE1FB1A889698908443880B5 +:10B920000020CEE706F0C1BB017821F00F01491CD1 +:10B9300021F0F00110310170FDF7D7BD10B50446BC +:10B94000402800D9FFDF4034A0B210BD40684269F2 +:10B950000078484302EBC0007047C2784068037823 +:10B9600012FB03F24378406901FB032100EBC100A5 +:10B970007047C2788A4209D9406801EB81011C22D4 +:10B9800002EBC101405C08B1012070470020704704 +:10B990000078062801D90120704700207047007800 +:10B9A000062801D00120704700207047F0B401EB59 +:10B9B00081061C27446807EBC6063444049D05260F +:10B9C0002670E3802571F0BCFEF78EBA10B5418970 +:10B9D00011B1FFF7DDFF08B1002010BD012010BD3F +:10B9E00010B5C18C8278B1EBC20F04D9C18911B1F5 +:10B9F000FFF7CEFF08B1002010BD012010BD10B52B +:10BA00000C4601230A22011D06F02DFD0078218835 +:10BA1000012282409143218010BDF0B402EB8205E7 +:10BA20001C264C6806EBC505072363554B681C793B +:10BA3000402C03D11A71F0BCFEF700BDF0BC70477A +:10BA400010B5EFF3108000F0010472B6F7484178AA +:10BA5000491C41704078012801D109F0A9FF002C50 +:10BA600000D162B610BD70B5F04CA07848B9012580 +:10BA7000A570FFF7E5FF09F0ACFF20B1002009F049 +:10BA800076FF002070BD4FF08040E570C0F8045391 +:10BA9000F7E770B5EFF3108000F0010572B6E34CE4 +:10BAA000607800B9FFDF6078401E6070607808B988 +:10BAB00009F082FF002D00D162B670BDDB4810B5E1 +:10BAC000817821B10021C1708170FFF7E2FF002071 +:10BAD00010BD10B5044609F07CFFD44989780840B0 +:10BAE00000D001202060002010BD10B5FFF7A8FF96 +:10BAF00009F06FFF02220123CC49540728B1CC483A +:10BB0000026023610320087202E00A72C4F8043361 +:10BB10000020887110BD2DE9F84FDFF810934278AE +:10BB2000817889F80420002689F80510074689F8ED +:10BB300006600078DFF8FCB2354620B1012811D04C +:10BB4000022811D0FFDF09F056FF4FF0804498B172 +:10BB500009F058FFB0420FD1304609F057FF0028D6 +:10BB6000FAD041E00126EEE7FFF76AFF5846016888 +:10BB7000C907FCD00226E6E70120E060C4F80451C2 +:10BB8000AD490E600107D1F84412AB4AC1F342310E +:10BB900024321160A849343108604FF0020AC4F819 +:10BBA00004A3A060A5480168C94341F3001101F155 +:10BBB0000108016841F01001016000E020BFD4F8E5 +:10BBC00004010028FAD0304609F020FF0028FAD0FE +:10BBD000B8F1000F04D19948016821F0100101600B +:10BBE000C4F808A3C4F8045199F805004E4680B182 +:10BBF000387870B909F0EDFE80460AF081F86FF0F0 +:10BC00000042B8F1000F02D0C6E9032001E0C6E906 +:10BC10000302DBF80000C00701D009F0D6FE387837 +:10BC200010B13572BDE8F88F4FF01808C4F80883DA +:10BC30000127A7614FF4A070ADF80000BDF8000027 +:10BC4000411EADF80010F9D2C4F80C51C4F81051DF +:10BC50007648C01D09F0ECFE3570FFF746FF6761BE +:10BC60007549307920310860C4F80483DAE770B58B +:10BC7000050000D1FFDF4FF080424FF0FF30C2F8E7 +:10BC800008030021C2F80011C2F80411C2F80C1117 +:10BC9000C2F81011654C617009F0A7FE10B10120C7 +:10BCA000A070607063480068C00701D009F08DFE85 +:10BCB0002846BDE870402EE75C48007A002800D096 +:10BCC000012070472DE9FC5F5D48D0F800905C4A88 +:10BCD0005C49083211608406D4F8080100B10120E3 +:10BCE000D4F8001111B14FF0010801E04FF0000845 +:10BCF000D4F8041101B101210191D4F80C1101B162 +:10BD000001210091D4F8101101B10121474D8A465B +:10BD100095F800B0002620B1C4F80861012009F0B0 +:10BD200026FE4248C01D09F08BFE00B1FFDF01274F +:10BD3000B8F1000F10D0C4F80873E87818B1EE70AD +:10BD4000002009F014FE287A022805D10320287269 +:10BD50003748022101602761019808B1C4F80461E5 +:10BD6000009850B1C4F80C61287A032800D0FFDF96 +:10BD70002F4806602F72FFF78CFEBAF1000F07D034 +:10BD8000C4F81061287A012801D100F05DF86761DC +:10BD9000BBF1000F07D02E70287A012801D1FFF7E0 +:10BDA000A4FEFFF776FE2148C01D09F05FFE24497E +:10BDB000091DC1F80090BDE8FC9F1C4810B5C01DCE +:10BDC00009F03EFE194940B1012008704FF0E02112 +:10BDD000C1F80002BDE8104032E6087A012801D11E +:10BDE000FFF783FE1148BDE81040C01D09F03EBEBC +:10BDF00070B50E4CA07808B909F0DEFD012085076A +:10BE0000A861207A002603280AD100BFD5F80C01CA +:10BE100020B9002009F0FAFD0028F7D1C5F80C611F +:10BE200026724FF0FF30C5F8080370BD3C000020BB +:10BE3000340C00400C0400401805004010ED00E0F8 +:10BE4000100502400100000170B5134C6079F0B19B +:10BE5000012803D0A179401E814218DA09F0B9FD0A +:10BE6000054609F04DFF6179012902D9A179491CE4 +:10BE7000A1710DB1216900E0E168411A022902DADD +:10BE800011F1020FD1DC0DB1206100E0E060BDE8EE +:10BE900070402AE6C9E700003C00002010B52020D1 +:10BEA00000F07FF8202000F08DF84D49202081F827 +:10BEB0000004F5F7A3FA4B4908604B48D0F8041387 +:10BEC00041F00101C0F80413D0F8041341F080716F +:10BED000C0F80413424901201C39C1F8000110BD0B +:10BEE00010B5202000F05DF83E480021C838016000 +:10BEF000001D01603D4A481E10603B4AC2F808031D +:10BF0000384B1960C2F80001C2F860013849086076 +:10BF1000BDE81040202000F055B834493548091FCD +:10BF20000860704731493348086070472D48C83869 +:10BF30000160001D521E026070472C4901200860FC +:10BF4000BFF34F8F70472DE9F0412849D0F8188092 +:10BF500028480860244CD4F800010025244E6F1EA8 +:10BF600028B14046F5F7A8F940B9002111E0D4F80E +:10BF7000600198B14046F5F79FF948B1C4F8005107 +:10BF8000C4F860513760BDE8F041202000F01AB8D5 +:10BF900031684046BDE8F04118F070BDFFDFBDE8F4 +:10BFA000F08100280DDB00F01F02012191404009C3 +:10BFB000800000F1E020C0F88011BFF34F8FBFF385 +:10BFC0006F8F7047002809DB00F01F0201219140AC +:10BFD0004009800000F1E020C0F8801270470000A6 +:10BFE00020E000E0C80602400000024018050240C0 +:10BFF00000040240010000010F4A12680D498A4204 +:10C000000CD118470C4A12680A4B9A4206D101B566 +:10C0100009F048FEFFF781FFBDE8014007490968C4 +:10C020000958084706480749054A064B704700006B +:10C0300000000000BEBAFECA540000200400002028 +:10C040008013002080130020F8B51D46DDE9064767 +:10C050000E000AD006F08EFC2346FF1DBCB231460E +:10C060002A46009406F09BF8F8BDD01922461946DE +:10C0700018F038FC2046F8BD70B50D460446102176 +:10C0800018F0AFFC258117206081A07B40F00A00EA +:10C09000A07370BD4FF6FF720A80014602200AF0BD +:10C0A00047B8704700897047827BD30701D1920758 +:10C0B00003D4808908800020704705207047827B68 +:10C0C000920700D58181704701460020098841F61A +:10C0D000FE52114200D00120704700B50346807B1C +:10C0E000C00701D0052000BD59811846FFF7ECFFBD +:10C0F000C00703D0987B40F004009873987B40F011 +:10C1000001009873002000BD827B520700D509B161 +:10C110004089704717207047827B61F3C3028273A6 +:10C1200070472DE9FC5F0E460446017896460120D3 +:10C1300000FA01F14DF6FF5201EA020962684FF67A +:10C14000FF7B1188594502D10920BDE8FC9FB9F158 +:10C15000000F05D041F6FE55294201D00120F4E739 +:10C1600041EA090111801D0014D000232B7094F8BE +:10C1700000C0052103221F464FF0020ABCF10E0F3A +:10C1800076D2DFE80CF0F909252F47646B774791E9 +:10C1900093B4D1D80420D8E7616820898B7B9B07B2 +:10C1A00067D517284AD30B89834247D38989172932 +:10C1B00001D3814242D185F800A0A5F80100328068 +:10C1C000616888816068817B21F002018173C6E02B +:10C1D000042028702089A5F801006089A5F80300D3 +:10C1E0003180BCE0208A3188C01D1FFA80F84145AB +:10C1F00024D3062028702089A5F801006089A5F8BD +:10C200000300A089A5F805000721208ACDE90001D7 +:10C21000636941E00CF0FF00082810D00820287066 +:10C220002089A5F801006089A5F8030031806A1D06 +:10C23000694604F10C0008F005F810B15EE010202A +:10C24000EDE730889DF800100844308087E00A2030 +:10C2500028702089A5F80100328044E00C20287065 +:10C260002089A5F801006089A5F8030031803AE033 +:10C2700082E064E02189338800EB41021FFA82F8F2 +:10C2800043453BD3B8F1050F38D30E222A700BEA91 +:10C290004101CDE90010E36860882A467146FFF746 +:10C2A000D3FEA6F800805AE04020287060893188CB +:10C2B000C01C1FFA80F8414520D32878714620F031 +:10C2C0003F00123028702089A5F801006089CDE96F +:10C2D000000260882A46E368FFF7B6FEA6F80080F1 +:10C2E000287840063BD461682089888037E0A0899F +:10C2F0003288401D1FFA80F8424501D204273DE0F4 +:10C30000162028702089A5F801006089A5F803008F +:10C31000A089CDE9000160882A4671462369FFF7AC +:10C3200093FEA6F80080DEE718202870207A687057 +:10C33000A6F800A013E061680A88920401D40527DA +:10C340001CE0C9882289914201D0062716E01E21EF +:10C35000297030806068018821F400510180B9F1B2 +:10C36000000F0BD0618878230022022009F036FEEE +:10C3700061682078887006E0338003276068018850 +:10C3800021EA090101803846DFE62DE9FF4F85B03B +:10C390001746129C0D001E461CD03078C10703D0F2 +:10C3A00000F03F00192801D9012100E000212046BA +:10C3B000FFF7AAFEA8420DD32088A0F57F41FF39E0 +:10C3C00008D03078410601D4000605D5082009B010 +:10C3D000BDE8F08F0720FAE700208DF800008DF807 +:10C3E000010030786B1E00F03F0C0121A81E4FF0B9 +:10C3F000050A4FF002094FF0030B9AB2BCF1200F6F +:10C4000075D2DFE80CF08B10745E7468748C749CC9 +:10C4100074B674BB74C974D574E2747474F274F035 +:10C4200074EF74EE748B052D78D18DF80090A078A0 +:10C430008DF804007088ADF8060030798DF80100A1 +:10C44000707800F03F000C2829D00ADCA0F102002F +:10C45000092863D2DFE800F0126215621A621D62D9 +:10C460002000122824D004DC0E281BD01028DBD199 +:10C470001BE016281FD01828D6D11FE0207880078F +:10C4800001E020784007002848DAEFE02078000734 +:10C49000F9E72078C006F6E720788006F3E72078F1 +:10C4A0004006F0E720780006EDE72088C005EAE7BF +:10C4B00020884005E7E720880005E4E72088C004DD +:10C4C000E1E72078800729D5032D27D18DF800B02A +:10C4D000B6F8010082E0217849071FD5062D1DD34B +:10C4E00081B27078012803D0022817D102E0CAE097 +:10C4F000022000E0102004228DF8002072788DF8D0 +:10C500000420801CB1FBF0F2ADF8062092B2424349 +:10C510008A4203D10397ADF80890A7E07AE020782B +:10C52000000777D598B282088DF800A0ADF80420F6 +:10C53000B0EB820F6ED10297ADF8061096E021782D +:10C54000C90667D5022D65D381B206208DF800009B +:10C55000707802285ED300BFB1FBF0F28DF80400C2 +:10C56000ADF8062092B242438A4253D1ADF808900A +:10C570007BE0207880064DD5072003E02078400638 +:10C580007FD508208DF80000A088ADF80400ADF834 +:10C590000620ADF8081068E02078000671D5092063 +:10C5A000ADF804208DF80000ADF8061002975DE0AC +:10C5B0002188C90565D5022D63D381B20A208DF883 +:10C5C0000000707804285CD3C6E72088400558D561 +:10C5D000012D56D10B208DF80000A088ADF8040085 +:10C5E00044E021E026E016E0FFE72088000548D57A +:10C5F000052D46D30C208DF80000A088ADF804006E +:10C60000B6F803006D1FADF80850ADF80600ADF8A0 +:10C610000AA02AE035E02088C00432D5012D30D1AF +:10C620000D208DF8000021E02088800429D4B6F880 +:10C630000100E080A07B000723D5032D21D33078B3 +:10C6400000F03F001B2818D00F208DF80000208834 +:10C6500040F40050A4F80000B6F80100ADF8040062 +:10C66000ED1EADF80650ADF808B003976946059881 +:10C67000F5F750FC050008D016E00E208DF80000FC +:10C68000EAE7072510E008250EE0307800F03F00CB +:10C690001B2809D01D2807D00220059909F048FD64 +:10C6A000208800F400502080A07B400708D5204659 +:10C6B000FFF70AFDC00703D1A07B20F00400A073A0 +:10C6C000284684E61FB5022806D101208DF8000017 +:10C6D00088B26946F5F71EFC1FBD0000F8B51D467F +:10C6E000DDE906470E000AD006F044F92346FF1D97 +:10C6F000BCB231462A46009405F051FDF8BDD01970 +:10C700002246194618F0EEF82046F8BD2DE9FF4FF5 +:10C710008DB09B46DDE91B57DDF87CA00C46082B4D +:10C7200005D0E06901F002F950B11020D2E028886C +:10C73000092140F0100028808AF80010022617E036 +:10C74000E16901208871E2694FF420519180E1692B +:10C750008872E06942F601010181E069002181737C +:10C760002888112140F0200028808AF80010042633 +:10C7700038780A900A2038704FF0020904F1180046 +:10C780004D460C9001F095FBB04681E0BBF1100FD7 +:10C790000ED1022D0CD0A9EB0800801C80B2022122 +:10C7A000CDE9001005AB52461E990D98FFF796FF94 +:10C7B000BDF816101A98814203D9F74800790F90F6 +:10C7C00004E003D10A9808B138702FE04FF002015D +:10C7D000CDE900190DF1160352461E990D98FFF789 +:10C7E0007DFF1D980088401B801B83B2C6F1FF00AF +:10C7F000984200D203461E990BA8D9B15FF00002FF +:10C80000DDF878C0CDE9032009EB060189B2CDE956 +:10C8100001C10F980090BDF8161000220D9801F08C +:10C82000CBFB387070B1C0B2832807D0BDF81600BA +:10C8300020833AE00AEB09018A19E1E7022011B0EE +:10C84000BDE8F08FBDF82C00811901F0FF08022D22 +:10C850000DD09AF80120424506D1BDF82010814242 +:10C8600007D0B8F1FF0F04D09AF801801FE08AF8D2 +:10C870000180C94800680178052902D1BDF8161069 +:10C88000818009EB08001FFA80F905EB080085B2EA +:10C89000DDE90C1005AB0F9A01F00EFB28B91D98CD +:10C8A0000088411B4145BFF671AF022D13D0BBF18B +:10C8B000100F0CD1A9EB0800801C81B20220CDE939 +:10C8C000000105AB52461E990D98FFF707FF1D9812 +:10C8D0000580002038700020B1E72DE9F8439C4620 +:10C8E000089E13460027B26B9AB3491F8CB2F18F92 +:10C8F000A1F57F45FF3D05D05518AD882944891D18 +:10C900008DB200E000252919B6F83C800831414578 +:10C9100020D82A44BCF8011022F8021BBCF80310EE +:10C9200022F8021B984622F8024B914606F010F8B6 +:10C930004FF00C0C41464A462346CDF800C005F0A6 +:10C94000FAFBF587B16B00202944A41D214408801F +:10C9500003E001E0092700E083273846BDE8F883BB +:10C9600010B50B88848F9C420CD9846BE018048826 +:10C9700044B1848824F40044A41D23440B80106037 +:10C98000002010BD0A2010BD2DE9F0478AB0002517 +:10C99000904689468246ADF8185007274BE0059827 +:10C9A00006888088000446D4A8F8006007A801958E +:10C9B00000970295CDE903504FF4007300223146F1 +:10C9C000504601F0F9FA04003CD1BDF81800ADF86A +:10C9D0002000059804888188B44216D10A0414D432 +:10C9E00001950295039521F400410097049541F4C7 +:10C9F000804342882146504601F0B4F804000BD130 +:10CA00000598818841F40041818005AA08A948461B +:10CA1000FFF7A6FF0400DCD000970598029501956A +:10CA2000039504950188BDF81C300022504601F0A2 +:10CA300099F80A2C06D105AA06A94846FFF790FFE7 +:10CA40000400ACD0ADF8185004E00598818821F4BA +:10CA50000041818005AA06A94846FFF781FF00280A +:10CA6000F3D00A2C03D020460AB0BDE8F08700209E +:10CA7000FAE710B50C46896B86B051B10C218DF8E0 +:10CA80000010A18FADF80810A16B01916946FAF76B +:10CA900040FB00204FF6FF71A063E187A08706B03E +:10CAA00010BD2DE9F0410D460746896B0020069E1A +:10CAB0001446002911D0012B0FD1324629463846A1 +:10CAC000FFF762FF002808D1002C06D03246294625 +:10CAD0003846BDE8F04100F038BFBDE8F0812DE9EF +:10CAE000FC411446DDE9087C0E46DDE90A15521DBD +:10CAF000BCF800E092B2964502D20720BDE8FC8166 +:10CB0000ACF8002017222A70A5F80160A5F80330C0 +:10CB10000522CDE900423B462A46FFF7DFFD002013 +:10CB2000ECE770B50C4615464821204617F07BFF10 +:10CB300004F1080044F81C0F00204FF6FF71E0617B +:10CB400061842084A5841720E08494F82A0040F0B2 +:10CB50000A0084F82A0070BD4FF6FF720A80014671 +:10CB6000032009F0E5BA30B585B00C460546FFF75D +:10CB700080FFA18E284629B101218DF80010694659 +:10CB8000FAF7C7FA0020E0622063606305B030BDA9 +:10CB9000B0F84000704700005800002090F8462090 +:10CBA000920703D4408808800020F3E70620F1E7CD +:10CBB00090F846209207EDD5A0F84410EAE7014628 +:10CBC000002009880A0700D5012011F0F00F01D0DC +:10CBD00040F00200CA0501D540F004008A0501D5E5 +:10CBE00040F008004A0501D540F010000905D1D5F4 +:10CBF00040F02000CEE700B5034690F84600C0079D +:10CC000001D0062000BDA3F842101846FFF7D7FF59 +:10CC100010F03E0F05D093F8460040F0040083F872 +:10CC2000460013F8460F40F001001870002000BDC8 +:10CC300090F84620520700D511B1B0F84200A9E79C +:10CC40001720A7E710F8462F61F3C3020270A1E78F +:10CC50002DE9FF4F9BB00E00DDE92B34DDE929788B +:10CC6000289D24D02878C10703D000F03F00192860 +:10CC700001D9012100E000212046FFF7D9FFB04291 +:10CC800015D32878410600F03F010CD41E290CD0A2 +:10CC9000218811F47F6F0AD13A8842B1A1F57F4211 +:10CCA000FF3A04D001E0122901D1000602D5042088 +:10CCB0001FB0C5E5F9491D984FF0000A08718DF8BD +:10CCC00018A08DF83CA00FAA0A60ADF81CA0ADF822 +:10CCD00050A02978994601F03F02701F5B1C04F1B7 +:10CCE000180C4FF0060E4FF0040BCDF858C01F2A59 +:10CCF0007ED2DFE802F07D7D107D267DAC7DF47D67 +:10CD0000F37DF27DF17DF47DF07D7D7DEF7DEE7D27 +:10CD10007D7D7D7DED0094F84610B5F80100890712 +:10CD200001D5032E02D08DF818B022E34FF4006134 +:10CD3000ADF85010608003218DF83C10ADF8400034 +:10CD4000D8E2052EEFD1B5F801002083ADF81C0024 +:10CD5000B5F80310618308B1884201D901207FE151 +:10CD60000020A07220814FF6FF702084169801F0F9 +:10CD7000A0F8052089F800000220029083460AAB43 +:10CD80001D9A16991B9801F097F890BB9DF82E00FC +:10CD9000012804D0022089F80100102003E00120BE +:10CDA00089F8010002200590002203A90BA807F0D2 +:10CDB00049FAE8BB9DF80C00059981423DD13A88BB +:10CDC000801CA2EB0B01814237DB02990220CDE9E6 +:10CDD00000010DF12A034A4641461B98FFF77EFCED +:10CDE00002980BF1020B801C80B217AA03A901E084 +:10CDF000A0E228E002900BA807F024FA02999DF81F +:10CE00000C00CDE9000117AB4A4641461B98FFF7DD +:10CE100065FC9DF80C100AAB0BEB01001FFA80FBC0 +:10CE200002981D9A084480B2029016991B9800E05F +:10CE300003E001F041F80028B6D0BBF1020F02D0A8 +:10CE4000A7F800B053E20A208DF818004FE2002145 +:10CE50000391072EFFF467AFB5F801002083ADF80A +:10CE60001C00B5F80320628300283FF477AF90429E +:10CE70003FF674AF0120A072B5F8050020810020B4 +:10CE8000A073E06900F052FD78B9E1690120887172 +:10CE9000E2694FF420519180E1698872E06942F6BD +:10CEA00001010181E06900218173F01F20841E9837 +:10CEB000606207206084169800F0FBFF072089F865 +:10CEC00000000120049002900020ADF82A0028E024 +:10CED0001DE2A3E13AE1EAE016E2AEE086E049E0D5 +:10CEE0000298012814D0E0698079012803D1BDF8A7 +:10CEF0002800ADF80E00049803ABCDE900B04A4617 +:10CF000041461B98FFF7EAFB0498001D80B204908D +:10CF1000BDF82A00ADF80C00ADF80E00059880B2FF +:10CF200002900AAB1D9A16991B9800F0C5FF28B90C +:10CF300002983988001D05908142D1D202980128BB +:10CF400081D0E0698079012805D0BDF82810A1F5CD +:10CF50007F40FF3803D1BDF82800ADF80E000498DB +:10CF600003ABCDE900B04A4641461B98FFF7B6FB3C +:10CF70000298BBE1072E02D0152E7FF4D4AEB5F88F +:10CF800001102183ADF81C10B5F80320628300293D +:10CF90003FF4E4AE91423FF6E1AE0121A1724FF0C1 +:10CFA000000BA4F808B084F80EB0052E07D0C0B26C +:10CFB000691DE26907F027F900287FF444AF4FF6B6 +:10CFC000FF70208401A906AA14A8CDF800B081E85A +:10CFD00085032878214600F03F031D9A1B98FFF730 +:10CFE00095FB8246208BADF81C0080E10120032ECA +:10CFF000C3D14021ADF85010B5F801102183ADF830 +:10D000001C100AAAB8F1000F00D00023CDE90203DA +:10D0100004921D98CDF80480009038880022401EAC +:10D0200083B21B9800F0C8FF8DF8180090BB0B204E +:10D0300089F80000BDF8280037E04FF0010C052EFC +:10D040009BD18020ADF85000B5F801102183B5F8D0 +:10D0500003002084ADF81C10B0F5007F03D9072031 +:10D060008DF8180085E140F47C4222840CA8B8F1C8 +:10D07000000F00D00023CDE90330CDE9018C1D98CD +:10D0800000903888401E83B21B9800F095FF8DF801 +:10D09000180028B18328A8D10220BDE05800002044 +:10D0A0000D2189F80010BDF83000401C1EE1032E50 +:10D0B00004D248067FF537AE002017E1B5F801101D +:10D0C000ADF81C102878400602D58DF83CE002E04F +:10D0D00007208DF83C004FF000080320CDE902083E +:10D0E0001E9BCDF810801D980193A6F1030B0090B4 +:10D0F0001FFA8BF342461B9800F034FD8DF81800A0 +:10D100008DF83C80297849060DD52088C00506D5C4 +:10D11000208BBDF81C10884201D1C4F82480404601 +:10D120008DF81880E2E0832801D14FF0020A4FF415 +:10D130008070ADF85000BDF81C002083A4F820B02A +:10D140001E986062032060841321CCE0052EFFF45A +:10D15000EAADB5F80110ADF81C10A28F62B3A2F5CC +:10D160007F43FE3B28D008228DF83C204FF0000B77 +:10D170000523CDE9023BDDF878C0CDF810B01D9A4B +:10D1800080B2CDF804C040F400430092B5F803200B +:10D190001B9800F0E7FC8DF83CB04FF400718DF85F +:10D1A0001800ADF85010832810D0F8B1A18FA1F568 +:10D1B0007F40FE3807D0DCE00B228DF83C204FF694 +:10D1C000FE72A287D2E7A4F83CB0D2E000942B46CE +:10D1D00031461E9A1B98FFF780FB8DF8180008B1A6 +:10D1E00083284BD1BDF81C00208355E700942B46C3 +:10D1F00031461E9A1B98FFF770FB8DF81800E8BBAC +:10D20000E18FA06B0844811D8DE8820343888288EA +:10D2100001881B98FFF763FC824668E095F801805F +:10D22000022E70D15FEA080002D0B8F1010F6AD176 +:10D2300009208DF83C0007A800908DF840804346F7 +:10D24000002221461B98FFF72CFC8DF842004FF07E +:10D25000000B8DF843B050B9B8F1010F12D0B8F1FE +:10D26000000F04D1A18FA1F57F40FF380AD0A08F15 +:10D2700040B18DF83CB04FF4806000E037E0ADF88D +:10D2800050000DE00FA91B98F9F743FF82468DF877 +:10D290003CB04FF48060ADF85000BAF1020F06D0F8 +:10D2A000FC480068C07928B18DF8180027E0A4F880 +:10D2B000188044E0BAF1000F03D081208DF81800E7 +:10D2C0003DE007A800904346012221461B98FFF746 +:10D2D000E8FB8DF8180021461B98FFF7CAFB9DF864 +:10D2E000180020B9192189F80010012038809DF814 +:10D2F0003C0020B10FA91B98F9F70BFF8246BAF149 +:10D30000000F33D01BE018E08DF818E031E02078F2 +:10D31000000712D5012E10D10A208DF83C00E088BC +:10D32000ADF8400003201B9908F002FF0820ADF87B +:10D330005000C1E648067FF5F6AC4FF0040A20889D +:10D34000BDF8501008432080BDF8500080050BD573 +:10D35000A18FA1F57F40FE3806D11E98E062289883 +:10D360002063A6864FF0030A5046A1E49DF81800FA +:10D3700078B1012089F80000297889F80110BDF8FA +:10D380001C10A9F802109DF8181089F80410052047 +:10D3900038802088BDF8501088432080E4E72DE9CC +:10D3A000FF4F8846087895B0012181404FF209006F +:10D3B000249C0140ADF820102088DDF88890A0F56D +:10D3C0007F424FF0000AFF3A06D039B1000705D579 +:10D3D000012019B0BDE8F08F0820FAE7239E4FF036 +:10D3E000000B0EA886F800B018995D460988ADF8C4 +:10D3F0003410A8498DF81CB0179A0A718DF838B00E +:10D40000086098F8000001283BD0022809D00328C2 +:10D410006FD1307820F03F001D303070B8F8040034 +:10D42000E08098F800100320022904D1317821F01F +:10D430003F011B31317094F84610090759D505ABEF +:10D44000B9F1000F13D0002102AA82E80B000720D7 +:10D45000CDE90009BDF83400B8F80410C01E83B24D +:10D460000022159800F0A8FD0028D1D101E0F11CA0 +:10D47000EAE7B8F80400A6F80100BDF81400C01CE3 +:10D4800004E198F805108DF81C1098F804000128A4 +:10D4900006D04FF4007A02282CD00328B8D16CE1D2 +:10D4A0002188B8F8080011F40061ADF8201020D0F0 +:10D4B00017281CD3B4F84010814218D3B4F8441094 +:10D4C000172901D3814212D1317821F03F01C91CC3 +:10D4D0003170A6F801000321ADF83410A4F844001F +:10D4E00094F8460020F0020084F8460065E1052526 +:10D4F0007EE177E1208808F1080700F4FE60ADF8CE +:10D50000200010F0F00F1BD010F0C00F03D03888AF +:10D51000228B9042EBD199B9B878C00710D0B96886 +:10D520000720CDE902B1CDF804B00090CDF810B0DD +:10D53000FB88BA883988159800F014FB0028D6D1EA +:10D540002398BDF82010401C80294ED006DC1029FD +:10D550000DD020290BD0402987D124E0B1F5807F60 +:10D560006ED051457ED0B1F5806F97D1DEE0C80610 +:10D5700001D5082000E0102082460DA907AA052049 +:10D58000CDE902218DF83800ADF83CB0CDE9049624 +:10D5900008A93888CDE9000153460722214615988D +:10D5A000FFF7B4F8A8E09DF81C2001214FF00A0A0B +:10D5B000002A9BD105ABB9F1000F00D00020CDE9C6 +:10D5C00002100720CDE90009BDF834000493401E85 +:10D5D00083B2218B0022159800F0EEFC8DF81C0020 +:10D5E0000B203070BDF8140020E09DF81C200121B4 +:10D5F0004FF00C0A002A22D113ABB9F1000F00D072 +:10D600000020CDE902100720CDE900090493BDF800 +:10D610003400228C401E83B2218B159800F0CCFC84 +:10D620008DF81C000D203070BDF84C00401CADF88A +:10D63000340005208DF83800208BADF83C00BCE0AC +:10D640003888218B88427FF452AF9DF81C004FF040 +:10D65000120A00281CD1606AA8B1B878C0073FF44C +:10D6600046AF00E018E0BA680720CDE902B2CDF875 +:10D6700004B00090CDF810B0FB88BA88159800F07F +:10D6800071FA8DF81C00132030700120ADF83400C1 +:10D6900093E00000580000203988208B8142D2D1CD +:10D6A0009DF81C004FF0160A0028A06B08D0E0B3CC +:10D6B0004FF6FF7000215F46ADF808B0019027E0FB +:10D6C00068B1B978C907BED1E18F0DAB0844821D9E +:10D6D00003968DE80C0243888288018809E0B878B7 +:10D6E000C007BCD0BA680DAB03968DE80C02BB88AE +:10D6F000FA881598FFF7F3F905005ED0072D72D070 +:10D7000076E0019005AA02A92046FFF729F9014613 +:10D71000E28FBDF80800824201D00029F1D0E08FED +:10D72000A16B084407800198E08746E09DF81C0043 +:10D730004FF0180A40B1208BC8B1388820832146A9 +:10D740001598FFF796F938E004F118000090237E51 +:10D75000012221461598FFF7A4F98DF81C00002836 +:10D76000EDD1192030700120ADF83400E7E7052530 +:10D7700021461598FFF77DF93AE0208800F4007003 +:10D78000ADF8200050452DD1A08FA0F57F41FE3986 +:10D7900001D006252CE0D8F808004FF0160A48B151 +:10D7A000A063B8F80C10A1874FF6FF71E187A0F8CD +:10D7B00000B002E04FF6FF70A087BDF8200030F403 +:10D7C0007F611AD0782300220320159908F006FC07 +:10D7D00098F8000020712088BDF8201008432080B0 +:10D7E0000EE000E007252088BDF820108843208047 +:10D7F000208810F47F6F1CD03AE02188814321807B +:10D800009DF8380020B10EA91598F9F782FC05465D +:10D810009DF81C000028EBD086F801A00120307094 +:10D82000208B70809DF81C0030710520ADF834000D +:10D83000DEE7A18EE1B118980DAB0088ADF8340099 +:10D840002398CDE90304CDE90139206B0090E36A08 +:10D85000179A1598FFF7FCF9054601208DF8380056 +:10D860000EA91598F9F755FC00B10546A4F834B097 +:10D8700094F8460040070AD52046FFF7A0F910F0BB +:10D880003E0F04D114F8460F20F0040020701898C1 +:10D89000BDF83410018028469BE500B585B003280B +:10D8A00006D102208DF8000088B26946F9F731FCF4 +:10D8B00005B000BD10B5384C0B782268012B02D0A2 +:10D8C000022B2AD111E013780BB1052B01D10423CF +:10D8D000137023688A889A802268CB88D380226854 +:10D8E0000B891381498951810DE08B8893802268CF +:10D8F000CB88D38022680B8913814B8953818B8914 +:10D900009381096911612168F9F703FC22680021FC +:10D910000228117003D0002800D0812010BD832080 +:10D9200010BD806B002800D001207047817801294C +:10D9300009D10088B0F5205F03D042F6010188428A +:10D9400001D10020704707207047F0B587B0002450 +:10D9500015460E460746ADF8184011E005980088B8 +:10D96000288005980194811DCDE902410721049486 +:10D970000091838842880188384600F0F3F830B976 +:10D9800005AA06A93046FEF7EBFF0028E6D00A28D4 +:10D9900000D1002007B0F0BD5800002010B58B78F2 +:10D9A00083B102789A4205D10B885BB102E08B7992 +:10D9B000091D4BB18B789A42F9D1B0F801300C882F +:10D9C000A342F4D1002010BD812010BD072826D02D +:10D9D00012B1012A27D103E0497801F0070102E0E2 +:10D9E0004978C1F3C20105291DD2DFE801F003180F +:10D9F000080C12000AB10320704702207047042867 +:10DA00000DD250B10DE0052809D2801E022808D39E +:10DA100003E0062803D0032803D005207047002028 +:10DA200070470F20704781207047C0B282060BD428 +:10DA3000000607D5FE48807A4143C01D01EBD000A7 +:10DA400080B27047084670470020704770B5138851 +:10DA50000B800B781C0625D5F54CA47A844204D89B +:10DA600043F010000870002070BD956800F00706B4 +:10DA700005EBD0052D78F54065F304130B70137892 +:10DA8000D17803F0030341EA032140F20123B1FB03 +:10DA9000F3F503FB15119268E41D00FB012000EB78 +:10DAA000D40070BD906870BD37B51446BDF8041041 +:10DAB00011809DF804100A061ED5C1F30013DC493D +:10DAC000A568897A814208D8FE2811D1C91DC908E4 +:10DAD0005A42284616F07DFF0AE005EBD00100F01F +:10DAE0000702012508789540A84393401843087021 +:10DAF000207820F0100020703EBD2DE9F04107464F +:10DB0000C81C0E4620F00300B04202D08620BDE8BB +:10DB1000F081C74D002034462E60AF802881AA7264 +:10DB2000E8801AE0E988491CE980810614D4E1788C +:10DB300000F0030041EA002040F20121B0FBF1F2C5 +:10DB400001FB12012068FFF770FF2989084480B2A9 +:10DB50002881381A3044A0600C3420784107E1D481 +:10DB60000020D4E72DE9FF4F89B01646DDE9168A7B +:10DB70000F46994623F44045084600F00DFB04008B +:10DB80000FD0099804F078FD0290207800060AD59D +:10DB9000A748817A0298814205D887200DB0BDE858 +:10DBA000F08F0120FAE7224601A90298FFF74EFF05 +:10DBB000834600208DF80C004046B8F1070F1AD0BC +:10DBC00001222146FFF702FF0028E7D12078400616 +:10DBD00011D502208DF80C00ADF81070BDF80400CE +:10DBE000ADF81200ADF814601898ADF81650CDF8E5 +:10DBF0001CA0ADF818005FEA094004D500252E46A8 +:10DC0000A84601270CE02178E07801F0030140EA02 +:10DC1000012040F20121B0FBF1F2804601FB1287A6 +:10DC20005FEA494009D5B84507D1A178207901F0CC +:10DC3000030140EA0120B04201D3BE4201D90720CE +:10DC4000ACE7A8191FFA80F9B94501D90D20A5E75D +:10DC50009DF80C0028B103A90998F9F758FA002893 +:10DC60009CD1B84507D1A0784FEA192161F3010092 +:10DC7000A07084F804901A9800B10580199850EAB1 +:10DC80000A0027D0199830B10BEB06002A461999E3 +:10DC900016F028FE0EE00BEB06085746189E099872 +:10DCA00004F056FE2B46F61DB5B2394642460095A5 +:10DCB00004F041FA224601A90298FFF7C7FE9DF839 +:10DCC0000400224620F010008DF80400DDE9011068 +:10DCD000FFF7EAFE002061E72DE9FF4FDFF85091E2 +:10DCE00082461746B9F80610D9F8000001EB410149 +:10DCF00000EB810440F20120B2FBF0F185B000FBA3 +:10DD000011764D46DDF84C8031460698FFF78DFEC2 +:10DD100029682A898B46611A0C3101441144AB8869 +:10DD200089B28B4202D8842009B038E70699CDB277 +:10DD3000290603D5A90601D50620F5E7B9F806C0DE +:10DD40000CF1010C1FFA8CFCA9F806C0149909B15A +:10DD5000A1F800C0A90602D5C4F8088007E0104465 +:10DD600080B2A9F80800191A01EB0B00A060224646 +:10DD7000FE200699FFF798FEE77026712078390A91 +:10DD800061F30100320AA17840F0040062F301015E +:10DD9000A17020709AF802006071BAF80000E0806B +:10DDA00000262673280602D599F80A7000E001279C +:10DDB000A80601D54FF000084D4600244FF0070992 +:10DDC0000FE0CDE902680196CDF800900496E9884D +:10DDD0002046129B089AFFF7C5FE0028A4D1641CB8 +:10DDE000E4B2BC42EDD300209EE72DE9F047804627 +:10DDF00000F0D2F9070005D0002644460C4D40F251 +:10DE0000012919E00120BDE8F087204600F0C4F99F +:10DE10000278C17802F0030241EA0222B2FBF9F370 +:10DE200009FB13210068FFF700FE304486B201E0D1 +:10DE3000F8050020641CA4B2E988601E8142E4DC7D +:10DE4000A8F10100E8802889801B28810020387013 +:10DE5000D9E710B5144631B1491E218004F00CFCFD +:10DE6000A070002010BD012010BD10B5D24904469D +:10DE70000088CA88904201D30A2010BD096800EBCF +:10DE8000400001EB80025079A072D0882081917807 +:10DE9000107901F0030140EA0120A081A078E11C83 +:10DEA000FFF7D4FD20612088401C2080E080002006 +:10DEB00010BD0121018270472DE9FF4F85B04FF65B +:10DEC000FF788246A3F8008048681F460D46807898 +:10DED0008DF8060048680088ADF8040000208DF831 +:10DEE0000A00088A0C88A04200D304462C8241E034 +:10DEF000288A401C2882701D6968FFF74FFDB8BB57 +:10DF00003988414501D1601E38806888A04236D3E7 +:10DF1000B178307901F0030140EA012901A9701DAF +:10DF2000FFF73CFD20BB298941452CD0002231461A +:10DF30000798FFF74BFDD8B92989494518D1E968F9 +:10DF40000391B5F80AC0D6F808B05046CDF800C025 +:10DF500004F0FEFCDDF800C05A460CF1070C1FFA75 +:10DF60008CFC4B460399CDF800C004F0AEF850B1DC +:10DF7000641CA4B2204600F00FF90600B8D1641E5C +:10DF80002C820A20D0E67C807079B871F088B88045 +:10DF90003178F07801F0030140EA01207881A7F898 +:10DFA0000C90504604F068FB324607F10801FFF779 +:10DFB0004DFD38610020B7E62DE9FF4F87B081465F +:10DFC0001C469246DDF860B0DDF85480089800F0F9 +:10DFD000E3F805000CD0484604F04EFB297809060A +:10DFE00008D57549897A814204D887200BB0D6E5D7 +:10DFF0000120FBE7CAF309062A4601A9FFF726FD1F +:10E000000746149807281CD000222946FFF7DEFC9B +:10E010000028EBD12878400613D501208DF80800A0 +:10E020000898ADF80C00BDF80400ADF80E00ADF88E +:10E030001060ADF8124002A94846F9F768F80028C8 +:10E04000D4D12978E87801F0030140EA0121AA78C7 +:10E05000287902F0030240EA0220564507D0B1F5C4 +:10E06000007F04D9611E814201DD0B20BEE786429C +:10E0700001D90720BAE7801B85B2A54200D9254601 +:10E08000BBF1000F01D0ABF80050179818B1B919C7 +:10E090002A4616F027FCB8F1000F0DD03E44484642 +:10E0A0004446169F04F066FC2146FF1DBCB2324672 +:10E0B0002B46009404F073F8002097E72DE9F04117 +:10E0C00007461D461646084600F066F804000BD0C9 +:10E0D000384604F0D1FA2178090607D53649897AFD +:10E0E000814203D8872012E5012010E522463146FF +:10E0F000FFF7ACFC65B12178E07801F0030140EA5C +:10E100000120B0F5007F01D8012000E00020287038 +:10E110000020FCE42DE9F04107461D46164608465E +:10E1200000F03AF804000BD0384604F0A5FA217844 +:10E13000090607D52049897A814203D88720E6E479 +:10E140000120E4E422463146FFF7AEFCFF2D14D057 +:10E150002178E07801F0030240EA022040F2012237 +:10E16000B0FBF2F302FB130015B900F2012080B2FC +:10E17000E070000A60F3010121700020C7E410B5CF +:10E180000C4600F009F828B1C18821804079A070C0 +:10E19000002010BD012010BD0749CA88824209D362 +:10E1A00040B1096800EB40006FF00B0202EB800009 +:10E1B0000844704700207047F805002010B508F0AB +:10E1C00079F9F4F773FB07F0FFFFBDE8104008F0A2 +:10E1D000C7B8202834BF012000207047012303FA6C +:10E1E00000F04FF0A042002914BFC2F80C05C2F89D +:10E1F000080570474FF0A041012202FA00F0C1F873 +:10E200001805704770B50346002002466FF02F05D1 +:10E210000EE09C5CA4F130060A2E02D34FF0FF30D2 +:10E2200070BD00EB800005EB4000521C2044D2B2D0 +:10E230008A42EED370BD30B50A230BE0B0FBF3F495 +:10E2400003FB1404B0FBF3F08D183034521E05F8B4 +:10E25000014CD2B2002AF1D130BD30B500234FF6C7 +:10E26000FF7510E0040A44EA002084B2C85C6040F4 +:10E27000C0F30314604005EA00344440E0B25B1C84 +:10E2800084EA40109BB29342ECD330BD2DE9F041BB +:10E29000FE4B0026012793F860501C7893F864C069 +:10E2A000B8B183F88D40A3F88E1083F88C2083F8E2 +:10E2B0008A70BCF1000F0CBF83F8906083F8905017 +:10E2C000F3488068008804F043FBBDE8F04103F0A8 +:10E2D000D9BF4FF6FF7083F88D40A3F88E0083F806 +:10E2E0008C2083F88A70BCF1000F14BF83F8905023 +:10E2F00083F89060BDE8F08170B5E54E0446306863 +:10E3000090F898100025012919D090F89210012951 +:10E3100024D090F8681001292AD090F88A10012999 +:10E320001CBF002070BD657017212170D0F88C10C3 +:10E330006160B0F89010218180F88A5016E0657015 +:10E340001C212170D0F899106160D0F89D10A16057 +:10E3500090F8A110217380F8985007E065700721AC +:10E360002170D0F89410616080F89250012070BD47 +:10E3700065701421217000F16A012022201D16F021 +:10E38000B1FA01212172306880F86850BF48B0F8B6 +:10E390006C20A0F89420B268537B80F8963080F807 +:10E3A0009210108804F0D4FA03F07BFFDEE7B8483F +:10E3B000006890F86810002914BFB0F86C004FF6A0 +:10E3C000FF70704770B5B24C06462068002808BF41 +:10E3D000FFDF0025206845706660002808BFFFDF6A +:10E3E0002068417800291CBFFFDF70BDA42116F012 +:10E3F0001AFB2068FF2101707F2180F8361013215D +:10E400004184282180F86510012180F8581080F897 +:10E410005D5008F02DFDBDE8704007F002BF9C493B +:10E420000968097881420CBF012000207047984894 +:10E43000006890F82200C0F34000704794480068DC +:10E4400090F8220000F0010070479148006890F8B1 +:10E450002200C0F3001070472DE9F0438C48D0F83B +:10E4600000C09CF82400BCF82240C0F38001C0F337 +:10E470004002114400F001000144C4F30010F0B167 +:10E48000132C17D009DC102C02BF824830F8110081 +:10E49000BDE8F083122C0DD008E0152C08BF7E4893 +:10E4A00009D01D2C04BF7D48BDE8F083FFDF0020AC +:10E4B000BDE8F0837A4830F81100BDE8F0839CF89D +:10E4C0005A209CF85B002E2600234FF47A774FF0F9 +:10E4D00014084FF04009022A04BF4AF2D745B5FBA1 +:10E4E000F7F510D0012A04BF4AF22F75B5FBF7F5F6 +:10E4F00010D04AF62315B5FBF7F5082A08BF4E469B +:10E5000013D0042A18D01E46082A0ED0042A13D08D +:10E51000022A49D003F12806042A0FD0082A1CBF7A +:10E520004FF01908082204D00AE04FF0140806F54D +:10E53000A8764FF0400203E006F5A8764FF01002EF +:10E5400018FB026212FB0152C1EB0111554D01EBA8 +:10E55000810105EB8101114414F0010F4FF4C872E1 +:10E560004FF4BF7504BFC4F34006002E6FD0C4F350 +:10E57000400601F5A571EEB1082804BF17464026F4 +:10E580000CD0042804BF2F46102607D0022807BF4E +:10E5900003F11807042603F12807082606EB86086E +:10E5A00008EB86163E441BE003F118064FF01908ED +:10E5B0000422C5E7082804BF164640270CD00428CB +:10E5C00004BF2E46102707D0022807BF03F1180604 +:10E5D000042703F12806082707EB871706EB8706B1 +:10E5E00031449C31082804BF164640270CD004282B +:10E5F00004BF2E46102707D0022807BF03F11806D4 +:10E60000042703F128060827C7EBC70707EB4707CE +:10E6100006EB47063144983114F0010F18D0082852 +:10E6200008BF40200CD0042804BF2A46102007D081 +:10E63000022807BF03F11802042003F12802082072 +:10E6400000EB400303EB0010104401444FE052E0A4 +:10E65000082804BF144640260CD0042804BF2C46CA +:10E66000102607D0022807BF03F11804042603F17F +:10E670002804082606EB8616BCF83CC004EB86048A +:10E680002144BCF1EB0F32D90EE00000040600205B +:10E6900060000020904E0200984E02008E89130008 +:10E6A000884E0200D4FEFFFF44F255240CF10B0CFF +:10E6B0000CFB04FC4FEA9C5C082807D0042802D01D +:10E6C000022805D008E02A46102008E0402006E095 +:10E6D00003F11802042002E003F12802082000EBF5 +:10E6E000801002EB800000F5A5700CFB001101F218 +:10E6F0006510BDE8F08301F5A574082804BF16462F +:10E7000040210CD0042804BF2E46102107D0022837 +:10E7100007BF03F11806042103F12806082101EBC5 +:10E720008111BCF844C006EB81012144BCF1EB0F20 +:10E73000DDD944F255240CF10B0C0CFB04FC4FEA20 +:10E740009C5C0828C2D00428BDD00228C4D1BFE7F1 +:10E75000FE4840F271210068806A48437047FB48D8 +:10E76000006890F83500002818BF0120704710B5E8 +:10E77000F74C207B022818BF032808D1207D04F124 +:10E7800015010DF07EF908281CBF012010BD207B6B +:10E79000002816BF022800200120BDE8104008F024 +:10E7A00045BFEB4908737047E849096881F83000B4 +:10E7B00070472DE9F047E54C2168087B002816BF1B +:10E7C000022800200120487301F10E0108F018FF13 +:10E7D0002168087B022816BF03280122002281F845 +:10E7E0002F204FF0080081F82D00487B01F10E0327 +:10E7F0004FF001064FF00007012804BF5B7913F0CA +:10E80000C00F0AD001F10E03012804D1587900F09D +:10E81000C000402801D0002000E0012081F82E0037 +:10E82000002A04BF91F8220010F0040F07D0087DE1 +:10E8300001F115010DF025F9216881F82D002068FE +:10E84000476006F095F82168C14D4FF000098860D7 +:10E8500095F82D000DF031F9804695F82F0000282D +:10E8600018BFB8F1000F04D095F82D000CF0ECFEA5 +:10E8700068B195F8300000281CBF95F82E000028DC +:10E880001DD0697B05F10E0001290ED012E06E73D8 +:10E890004A4605F10E01404608F007FF95F82D1095 +:10E8A00005F10E000DF000FA09E0407900F0C0001B +:10E8B000402831D0394605F10E0008F02DFF2068C0 +:10E8C000C77690F8220010F0040F08BFBDE8F0876B +:10E8D000002795F82D000CF06BFF050008BFBDE880 +:10E8E000F08710210DF073FF002818BFBDE8F087F6 +:10E8F00020683A4600F11C01C676284608F0D5FE8D +:10E90000206800F11C0160680EF07EFA6068BDE8C6 +:10E91000F04701210EF093BA0DF003FA4A4605F1D3 +:10E920000E0108F0C2FECAE7884A1268137B037022 +:10E93000D2F80E000860508A8880704778B5844904 +:10E940000446824D407B08732A68207810706088E6 +:10E95000ADF8000080B200F00101C0F3400341EACD +:10E960004301C0F3800341EA8301C0F3C00341EADD +:10E97000C301C0F3001341EA0311C0F3401341EA9D +:10E980004311C0F3801041EA80105084E07D0128DB +:10E9900008BF012603D0022814BFFFDF0226286823 +:10E9A00080F85A60607E012808BF012603D0022843 +:10E9B00014BFFFDF0226286880F85B60217B80F8A7 +:10E9C0002410418C1D290CBF002161688162617D8A +:10E9D00080F83510A17B002916BF022900210121F2 +:10E9E0000175D4F80F10C0F81510B4F81310A0F882 +:10E9F0001910A17EB0F8662061F30302A0F866202A +:10EA0000E17E012918BF002180F83410002078BD74 +:10EA10004E480068408CC0F3001131B1C0F3800053 +:10EA2000002804BF1F20704702E0C0F3400109B175 +:10EA30000020704710F0010F14BFEE20FF20704738 +:10EA400042480068408CC0F3001119B1C0F3800047 +:10EA500028B102E0C0F3400008B100207047012057 +:10EA600070473A49002209680A664B8C1D2B0CBF7F +:10EA700081F8642081F8640070470023334A1268EB +:10EA800082F859309164A2F84C00012082F85900B4 +:10EA900070472E4A0023126882F85830A2F85400BA +:10EAA0000120116582F8580070472849096881F8EB +:10EAB0005D0070472548006890F95D007047234865 +:10EAC000006890F82200C0F3401070471F480068AB +:10EAD00090F82200C0F3C0007047012070471B4827 +:10EAE000006890F85B00704770B508F0A2F908F074 +:10EAF00081F908F04EF808F0D7F8144C2068016E40 +:10EB0000491C016690F83300002530B108F0B0F9D7 +:10EB100007F087FB206880F833502068457090F834 +:10EB2000371021B1BDE87040042009F049BA90F8CF +:10EB3000641001B3006E81421DD8042009F040FA30 +:10EB4000206890F8220010F0010F03E06000002020 +:10EB50000406002007D0A06843220188BDE8704069 +:10EB60000120FFF793BBBDE8704043224FF6FF71D1 +:10EB70000020FFF78BBBBDE87040002009F020BAF1 +:10EB80002DE9F047FF4E814682B030680F464FF0C6 +:10EB90000008458C15F0030F10D015F0010F05F09B +:10EBA000020005D0002808BF4FF0010806D004E09D +:10EBB000002818BF4FF0020800D1FFDF4FF0000A15 +:10EBC000544615F0010F05F002000DD080B915F084 +:10EBD000040F0DD04AF00800002F1CBF40F00100C8 +:10EBE00040F0020440D090E010B115F0040F0DD0B9 +:10EBF00015F0070F10D015F0010F05F0020036D008 +:10EC0000002808BF15F0040F27D03DE0002F18BFE3 +:10EC10004AF0090479D134E02FB14AF0080415F024 +:10EC2000200F14D071E0316805F02002B1F84400E3 +:10EC3000104308BF4AF0010467D04AF0180415F0E9 +:10EC4000200F62D191F85A1008295AD156E0316844 +:10EC500091F85A10082951D153E04AF00800002FCA +:10EC600018BF40F0010450D140F010044DE00028DE +:10EC700018BF15F0040F07D0002F18BF4AF00B047F +:10EC800043D14AF0180440E015F0030F3CD115F0D1 +:10EC9000040F39D077B131684AF0080091F85A1062 +:10ECA00008290CBF40F0020420F0020415F0200FE8 +:10ECB00022D02AE0316805F02002B1F84400104368 +:10ECC00008BF4AF0030420D04AF0180015F0200FC6 +:10ECD00009D000BF91F85A10082914BF40F002046F +:10ECE00020F0020411E091F85A20082A14BF40F0E5 +:10ECF000010020F00100EDE7082902D024F0010412 +:10ED000003E044F0010400E0FFDF15F0400F1BD0EA +:10ED1000C7B93168B1F84400002804BF488C10F02E +:10ED2000010F0BD110F0020F08BF10F0200F05D11A +:10ED300015F0010F08BF15F0020F03D091F85A002B +:10ED4000082801D044F040047068A0F800A00178C1 +:10ED500021F02001017007210EF022F84146706871 +:10ED60000EF015FA214670680EF01DFA14F0010F2E +:10ED70000AD006230022844970680EF0EEF930684C +:10ED8000417B70680EF04EF814F0020F18D0D6E9EF +:10ED90000010B9F1000F4FF006034FF0010207D049 +:10EDA0001C310EF0DAF9012170680EF048F807E026 +:10EDB00015310EF0D2F93068017D70680EF03FF821 +:10EDC00014F0040F18BFFFDF14F0080F17D0CDF8B0 +:10EDD00000A03068BDF800100223B0F866000209F8 +:10EDE00062F30B01ADF800109DF80110032260F3EF +:10EDF00007118DF80110694670680EF0AEF9012F09 +:10EE000061D13068B0F84410E9B390F82200C0F343 +:10EE10004000C0BB70680EF0B6F9401CC7B2306845 +:10EE2000B0F84420B0F85610551AC7F1FF018D42D2 +:10EE3000A8BF0D46AA423AD990F8220010F0010F5F +:10EE400035D144F01004214670680EF0ACF9F81C7E +:10EE5000C0B2ED1E284482B23068B0F86610036E6E +:10EE6000090951FA83F190F85C30484F1944BC46C7 +:10EE70000023E1FB07C31B096FF0240C03FB0C11FB +:10EE800080F85C1000E01EE090F85B00012101F0CA +:10EE900025F80090BDF800009DF80210032340EA19 +:10EEA00001400190042201A970680EF056F9306803 +:10EEB000AAB2016C70680EF0A4F93068B0F8561070 +:10EEC0002944A0F8561014F0400F06D0D6E90010DF +:10EED000012306225D310EF040F914F0200F18BF17 +:10EEE000FFDF0020002818BFFFDF02B0BDE8F08779 +:10EEF0002DE9F843234C2068002808BFFFDF206875 +:10EF0000417839BB0178FF2924D0002680F8316090 +:10EF1000A0F85660867080F83760304607F0D8FE5B +:10EF200007F062FB206890F95D0007F029FC1848A3 +:10EF300007F02CFC174807F0B1FE606807F0CBFE25 +:10EF4000206890F8240010F0010F06D0252007F06B +:10EF500025FC09E00C20BDE8F88310F0020F18BF73 +:10EF6000262076D007F01AFC206890F85A10252049 +:10EF700007F006FB206880F82C6007F0A3FE2068ED +:10EF80000AE00000600000201206002053E4B36E87 +:10EF9000844E0200814E020090F85A10002007F0C3 +:10EFA000F3FC0F21052007F0BFFB206890F82E101E +:10EFB000002901BF90F82F10002990F8220010F0CE +:10EFC000040F75D005F0D4FC0546206829468068FA +:10EFD00006F0E7F9DFF82C84074690FBF8F008FB11 +:10EFE00010704142284605F0C4F92168886097FBFB +:10EFF000F8F04A68104448600CF040FD0146206873 +:10F00000426891426FD8C0E90165FF4D4FF0010899 +:10F0100095F82D000CF051FD814695F82F00012741 +:10F02000002818BFB9F1000F04D095F82D000CF09E +:10F030000BFBA8B195F8300000281CBF95F82E00F6 +:10F04000002825D0697B05F10E00012916D01AE0B1 +:10F05000FFE710F0040F14BF2720FFDF82D183E702 +:10F060003A466F7305F10E01484608F01EFB95F80D +:10F070002D1005F10E000CF017FE09E0407900F0AC +:10F08000C000402815D0414605F10E0008F044FBB1 +:10F09000206890F8220010F0040F24D095F82D007D +:10F0A0000CF086FB05001ED010210DF090FB40B146 +:10F0B00019E00CF036FE3A4605F10E0108F0F5FABB +:10F0C000E6E720683A4600F11C01C776284608F0BA +:10F0D000ECFA206800F11C0160680DF095FE01213A +:10F0E00060680DF0ACFE2068417B0E3007F000FB3D +:10F0F000206890F8581059B3B0F85410A0F8441094 +:10F10000016D016490F82210C1F30011E9B9B0F863 +:10F11000660002210509ADF80050684606F00AFDB8 +:10F1200028B1BDF80000C0F30B00A84204D1BDF81F +:10F130000000401CADF800002168BDF80000B1F8E7 +:10F14000662060F30F12A1F86620206880F85860EE +:10F15000206890F8591031B1B0F84C108187816C5B +:10F16000816380F85960B0F86610026E090951FA9F +:10F1700082F190F85C20DFF894C2114463460022CB +:10F18000E1FB0C3212096FF0240302FB031180F83B +:10F190005C100CF0F6FC032160680CF075FD216832 +:10F1A00081F833000020BDE8F883994988607047F2 +:10F1B0002DE9F043964C83B0226892F831303BB190 +:10F1C000508C1D2808BFFFDF03B0BDE8F0438BE47F +:10F1D00001260027F1B1054692F85C0007F0DEFA3F +:10F1E000206890F85B10FF2007F0CAF920684FF400 +:10F1F000A57190F85B20002007F08EFC206890F845 +:10F20000221011F0030F00F02D81002D00F0248159 +:10F2100000F028B992F822108046D07EC1F3001188 +:10F22000002956D0054660680780017821F020014A +:10F230000170518C132937D01FDC102908BF02211F +:10F2400044D0122908BF062140D0FFDF6E4D606810 +:10F2500005F10E010DF0CAFD697B60680DF0E2FD5D +:10F260002068418C1D2918BF152965D0B0F84420AD +:10F27000016C60680DF0EFFD5EE0152918BF1D29D7 +:10F28000E3D14FF001010DF08BFD6068017841F092 +:10F2900020010170216885B11C310DF0B5FD0121FF +:10F2A00060680DF0CCFDD1E700210DF079FD6068BC +:10F2B000017841F020010170C8E715310DF0A4FD7F +:10F2C0002068017D60680DF0BAFDBFE70DF068FDB4 +:10F2D000BCE70021FFF754FC6068C17811F03F0FD4 +:10F2E0002AD0017911F0100F26D00DF057FD2368B8 +:10F2F000024693F82410C1F38000C1F3400C60442F +:10F3000001F0010100EB010C93F82C10C1F3800017 +:10F31000C1F34005284401F001010844ACEB0000B2 +:10F32000C1B293F85A0000F0D9FD009003230422E3 +:10F33000694660680DF011FF2068002590F82410E0 +:10F3400090F82C0021EA000212F0010F18BF0125ED +:10F350000ED111F0020F04D010F0020F08BF0225E9 +:10F3600006D011F0040F03D010F0040F08BF0425DD +:10F37000B8F1000F2BD0012D1BD0022D08BF262085 +:10F380001BD0042D14BFFFDF272016D0206890F873 +:10F390005A10252007F0F4F8206890F82210C1F3E5 +:10F3A000001169B101224FF49671002007F0B4FBFF +:10F3B0000DE0252007F0F2F9E8E707F0EFF9E5E7BF +:10F3C00090F85A204FF49671002007F0A5FB2068B2 +:10F3D00090F82C10294380F82C1090F8242032EA61 +:10F3E00001011CD04670418C13292BD026DC10293A +:10F3F00004BF03B0BDE8F083122923D0C1F300108D +:10F40000002807E040420F000406002053E4B36EDA +:10F410006000002018BFFFDF03B0BDE8F083418C1F +:10F420001D2908BF80F82C70DCD0C1F30011002921 +:10F4300014BF80F8316080F83170D3E7152918BF08 +:10F440001D29DBD190F85A2003B04FF00101BDE82F +:10F45000F043084607F049BD90F85B2001210846BB +:10F4600007F043FD2168002DC87E7CD04A8C3D46C4 +:10F47000C2F34000002808BF47F0080512F0400F13 +:10F4800018BF45F04005002819BFD1F83890B1F8F1 +:10F490003C80D1F84090B1F8448060680721078033 +:10F4A0000DF07EFC002160680DF071FE2946606859 +:10F4B0000DF079FE15F0080F15D02068BDF800108A +:10F4C0000223B0F86600020962F30B01ADF80010E8 +:10F4D0009DF80110032260F307118DF801106946B1 +:10F4E00060680DF03AFE60680DF016FD2168C0F10D +:10F4F000FE00B1F85620A8EB02018142A8BF0146E8 +:10F50000CFB2D019404542D245F0100160680DF0ED +:10F510004AFE60680DF000FD2168C0F1FE00B1F800 +:10F520005610A8EB01018142A8BF0146CFB2606826 +:10F530000DF029FE3844421C2068B0F86610036EB6 +:10F54000090951FA83F190F85C30FF4D1944AC463B +:10F550000023E1FB05C31B096FF0240C03FB0C1116 +:10F5600080F85C1000E038E090F85B00012100F0CA +:10F57000B5FC0090BDF800009DF80210032340EA9E +:10F5800001400190042201A960680DF0E6FD2168A8 +:10F5900091F8220010F0400F05D0012306225D31C2 +:10F5A00060680DF0DAFD20683A46B0F8560000EBCE +:10F5B000090160680DF025FE2068B0F85610394446 +:10F5C000A0F8561007F053FF002818BFFFDF20688F +:10F5D0004670867003B0BDE8F0830121FFF7D0FAD2 +:10F5E000F0E7DA4810B50068417841B90078FF28A3 +:10F5F00005D000210846FFF7DBFD002010BD07F015 +:10F6000018FC07F0F7FB07F0C4FA07F04DFB0C20DD +:10F6100010BD10B5CD4C206890F8220010F0010FFD +:10F620001CBFA06801884FF03C0212BF01204FF6BA +:10F63000FF710020FEF72AFE2168012081F83700C3 +:10F6400010BDC249096881F8320070472DE9F041C8 +:10F65000002608F081FC002800F0F380BB4C2068F5 +:10F66000417800270125012906D0022901D003296C +:10F670007BD0FFDFBDE8F081817802270029418C33 +:10F6800037D0C1F34002002A08BF11F0010F6DD03E +:10F6900090F85B204FF001014FF0000007F025FCCF +:10F6A000216891F82200C0F34000002814BF0C200C +:10F6B000222091F85B1006F063FF2068477090F8F5 +:10F6C000330020B106F099FD402007F0BEFB206812 +:10F6D00090F83400002818BF07F0E4FB00219620C2 +:10F6E00007F04CFB07F0BAFE002818BFFFDFBDE8AB +:10F6F000F081C1F3001282B110293ED090F833009E +:10F7000020B106F07AFD402007F09FFB206890F8BA +:10F71000221011F0040F35D042E090F8242090F828 +:10F720002C309A4229D1B0F84400002808BF11F0CB +:10F73000010F05D111F0020F08BF11F0200F7DD08D +:10F740004FF001014FF00000FFF732FD2068418CBF +:10F7500011F0010F04BFC1F3400100290AD1B0F834 +:10F760005610B0F84420914201E032E026E018BF84 +:10F77000BDE8F08180F83150B9E7BDE8F0410021E3 +:10F78000012015E590F83510012914BF0329102632 +:10F7900046F00E0190F85A204FF0000007F0A5FB4C +:10F7A000206890F83400002818BF07F07BFB002188 +:10F7B000962007F0E3FA2068477098E7B0F85610F3 +:10F7C000B0F8440081423CD0BDE8F0410121084638 +:10F7D000EEE48178D9B1418C11F0010F1CD080F892 +:10F7E000685090F86A20B0F86C100120FEF74EFDCA +:10F7F0002068477007F01DFB07F0FCFA07F0C9F915 +:10F8000007F052FABDE8F041032008F0D9BB817837 +:10F81000BDE8F0410120CBE411F0020F08BFFFDF8B +:10F820003FF465AFB0F85610808F814209D00121B6 +:10F830000846FFF7BDFC0320216800E001E04870A6 +:10F8400055E7BDE8F041FFF74FB9FFF74DB910B5E7 +:10F850003E4C206890F8341049B1363007F02DFB4B +:10F8600018B921687F2081F8360007F011FB206865 +:10F8700090F8330018B107F0FBFA06F0D2FC08F05C +:10F880006BFBA8B1206890F82210C1F3001179B188 +:10F890004078022818BFFFDF00210120FFF788FC15 +:10F8A0002068417800291EBF40780128FFDF10BD85 +:10F8B000BDE81040FFF718B92DE9F047234C0F467B +:10F8C00080462168B8F1030F488C08BFC0F340059B +:10F8D00008D000F0010591F83200002818BF4FF061 +:10F8E000010901D14FF0000906F04CFF0646B8F1BE +:10F8F000030F0CBF4FF002084FF0010835EA090072 +:10F9000008BFBDE8F087206890F8330068B10CF0BC +:10F910001BF938700146FF2807D06068C01C0CF046 +:10F92000ECF838780CF01DF9064360680178C1F3F3 +:10F93000801221680B7D9A420DD10622C01C153120 +:10F9400014F0A4FF002803E053E4B36E600000202D +:10F9500008BF012000D000203978FF2906D0C8B99F +:10F96000206890F82D00884216D113E0A0B161689C +:10F9700011F8030BC0F380100CF083F805460CF06F +:10F98000E3F938B128460BF013FF18B110210CF041 +:10F990001EFF08B1012000E00020216891F822102C +:10F9A00011F0040F01D0F0B11AE0CEB9FE4890F882 +:10F9B0003500002818BF404515D1616811F8030BC8 +:10F9C000C0F380100CF05DF804460CF0BDF938B1BE +:10F9D00020460BF0EDFE18B110210CF0F8FE10B12E +:10F9E0000120BDE8F0870020BDE8F0872DE9F04F49 +:10F9F000EE4D074683B0286800264078022818BFDD +:10FA0000FFDF28684FF07F0990F8341049B1363095 +:10FA100007F053FA002804BF286880F8369007F0F2 +:10FA200037FA68680DF0DEF90446002F00F0048212 +:10FA300068680DF062FB002800F0FE8106F070FEA1 +:10FA4000002800F0F981FF20DFF864B3DFF8588365 +:10FA500000274FF0010A062C80F00082DFE804F056 +:10FA6000EFEFEF03EFF78DF8000069460320FFF793 +:10FA700023FF002800F0E480296891F8340010B1D9 +:10FA800091F89800D0B12868817801294CD0686835 +:10FA9000042107800DF084F908F10E0168680DF06B +:10FAA000A5F998F80D1068680DF0BCF92868828FE8 +:10FAB000816B68680DF0F3F900F04DB99DF8000016 +:10FAC00081F898A00A7881F89920FF280FD001F1D9 +:10FAD0009B029A310BF0FAFF002808BFFFDF28686D +:10FAE00090F89A1041F0020180F89A100DE06868D1 +:10FAF0000278C2F3801281F89A20D0F80320C1F86E +:10FB00009B20B0F80700A1F89F00286800F1A1042D +:10FB100090F836007F2808BFFFDF286890F836107D +:10FB2000217080F83690AEE790F822009BF80490A0 +:10FB3000C0F38014686864F38619072107800DF00C +:10FB40002FF9002168680DF022FB494668680DF026 +:10FB50002AFB0623002208F10E0168680DF0FDFA69 +:10FB60002868417B68680DF05DF968680DF0D4F98C +:10FB700029688A8FC0F1FE018A42B8BF1146CFB210 +:10FB8000BA423DD9F81EC7B249F0100A514668681A +:10FB90000DF009FB68680DF0F6FA3844431C28683C +:10FBA000B0F86610026E090951FA82F190F85C20F3 +:10FBB000DFF800920A44C8464FF0000CE2FB098CC3 +:10FBC0004FEA1C116FF0240C01FB0C2180F85C1033 +:10FBD00090F85B001A46012100F080F90190BDF811 +:10FBE00004009DF80610032340EA0140029004221D +:10FBF00002A968680DF0B1FA514668680DF0D3FAB1 +:10FC000034B1D5E90010012306225D310DF0A5FACB +:10FC100028683A46816B68680DF0F3FA2868A0F806 +:10FC20005670818F8F420CBF0121002180F8311066 +:10FC300007F01DFC002818BFFFDF8CE007E00DE196 +:10FC400028688078002840F0F98000F0F5B88DF839 +:10FC5000000068680178C1F38019D0F803100191A1 +:10FC6000B0F80700ADF8080069460520FFF724FE4C +:10FC70000028286873D08178002972D090F85BA0A2 +:10FC8000D5E90104D0F80F10C4F80E10B0F8131025 +:10FC90006182417D2175817D6175B0F81710E18227 +:10FCA000B0F819106180B0F81B10A180B0F81D10D9 +:10FCB000E18000F11F0104F1080014F0C8FF68683A +:10FCC00090F8241001F01F01217690F824004009DB +:10FCD00084F8740184F854A084F855A0286890F83A +:10FCE000651084F8561090F85D0084F857009DF870 +:10FCF0000010A86800F050F9022008F061F9686867 +:10FD0000DBF800400DF1040A078008210DF048F8E7 +:10FD1000002168680DF03BFA214668680DF043FA4F +:10FD20000623002208F10E0168680DF016FA286813 +:10FD3000417B68680DF076F8494668680DF07FF8F9 +:10FD400006230122514668680DF007FA07F08FFB81 +:10FD5000002818BFFFDF03202968487070E066E0C4 +:10FD6000FFE76868AC684FF001080278617BC2F376 +:10FD7000401211406173D0F80F10C4F80E10B0F8A3 +:10FD800013106182417D2175817D6175B0F8171076 +:10FD9000E182B0F819106180B0F81B10A180B0F8B2 +:10FDA0001D10E18008E00000040600206000002033 +:10FDB0007C4E020053E4B36E00F11F0104F1080011 +:10FDC00014F045FF686890F8241001F01F012176B7 +:10FDD00090F82400400984F8740184F8548084F871 +:10FDE0005580286890F8651084F8561090F85D00EA +:10FDF00084F857009DF80010A86800F0CDF8286836 +:10FE000080F868A090F86A20B0F86C100120FEF726 +:10FE10003DFA2868477007F00CF806F0EBFF06F093 +:10FE2000B8FE06F041FF012008F0CAF808E090F89B +:10FE30002200C0F3001008B1012601E0FEF754FED5 +:10FE4000286890F8330018B107F012F806F0E9F9C5 +:10FE500066B100210120FFF7ABF910E0286890F8A7 +:10FE60002200C0F300100028E8D0E5E72868817878 +:10FE7000012904D190F85B10FF2006F081FB28686F +:10FE80004178002919BF4178012903B0BDE8F08FFE +:10FE90004078032818BFFFDF03B0BDE8F08F70B5CE +:10FEA000794C06460D462068807858B106F030FB44 +:10FEB00021680346304691F85B202946BDE8704032 +:10FEC00008F03BBE06F024FB21680346304691F85B +:10FED0005A202946BDE8704008F02FBE78B50C4680 +:10FEE00000210091082804BF4FF4C87040210DD0B4 +:10FEF000042804BF4FF4BF70102107D0022807BFA9 +:10FF000001F11800042101F128000821521D02FB13 +:10FF100001065D489DF80010006890F85C2062F3CF +:10FF2000050141F040058DF8005090F85B00012874 +:10FF300004BF9DF8020020F0E0002AD0022818BF7C +:10FF4000FFDF21D025F080008DF80000C4EB041005 +:10FF500000EB80001E2101EB800006FB04044B48EF +:10FF6000844228BFFFDF4A48A0FB0410BDF80110FF +:10FF7000000960F30C01ADF80110BDF800009DF818 +:10FF8000021040EA014078BD9DF8020020F0E00038 +:10FF900020308DF80200D5E72DE9F0413A4D0446B6 +:10FFA0000E46286890F86800002818BFFFDF002779 +:10FFB000286880F86A702188A0F86C106188A0F821 +:10FFC0008210A188A0F88410E188A0F8861094F827 +:10FFD000741180F8881090F82F1049B1427B00F11D +:10FFE0000E01012A04D1497901F0C001402934D021 +:10FFF00090F8301041B1427B00F10E01012A04BF9C +:020000040001F9 +:10000000497911F0C00F28D000F1760014F016FEE7 +:100010006868FF2E0178C1F380116176D0F8031073 +:10002000C4F81A10B0F80700E08328681DD0C16733 +:10003000E18BA0F8801000F17002511E30460BF0E9 +:1000400045FD002808BFFFDF286890F86F1041F0D9 +:10005000020180F86F10BDE8F081D0F80E10C0F8F2 +:100060007610418AA0F87A10D2E7C767A0F88070AE +:10007000617E80F86F10D4F81A100167E18BA0F848 +:100080007410BDE8F081000060000020C4BF0300D0 +:10009000898888880178406829B190F8141190F80F +:1000A000730038B901E001F0BFBC19B1042901D0D7 +:1000B000012070470020704770B50C4605460621A8 +:1000C00002F014FB606008B1002006E0072128461A +:1000D00002F00CFB606018B101202070002070BDA0 +:1000E000022070BD2DE9FC470C4606466946FFF725 +:1000F000E3FF00287DD19DF8000050B1FEF757F9CD +:10010000B0427CD02146304609F09CFE002873D1D5 +:100110002DE00DF0F5FAB04271D02146304612F0D4 +:10012000F2FD002868D1019D95F8D80022E0012059 +:1001300000E00020804695F837004FF0010A4FF0AC +:100140000009F0B195F8380080071AD584F80190BD +:1001500084F800A084F80490E68095F839102172A4 +:10016000698F6181A98FA18185F8379044E0019D55 +:1001700095F8140158350028DBD1E87E0028D8D046 +:10018000D5E7304602F0F6FB070000D1FFDF384626 +:1001900001F006FE40B184F801900F212170E68045 +:1001A000208184F804A027E0304602F0D1FB07004C +:1001B00000D1FFDFB8F1000F21D0384601F047FE33 +:1001C000B8B19DF8000038B90198D0F80001418815 +:1001D000B14201D180F80090304607F090F984F8E0 +:1001E00001900C21217084F80490E680297F21720F +:1001F00000E004E085F81B900120BDE8FC870020AA +:10020000FBE71CB56946FFF757FF00B1FFDF684603 +:1002100001F016FCFA4900208968A1F8DA001CBD3B +:100220002DE9FC4104460E46062002F007FA054679 +:10023000072002F003FA2844C7B20025A8463E442E +:1002400017E02088401C80B22080B04202D3404694 +:10025000A4F8008080B2B84204D3B04202D2002099 +:10026000BDE8FC816946FFF727FF0028F8D06D1C28 +:10027000EDB2AE42E5D84FF6FF7020801220EFE7D6 +:1002800038B54FF6FF70ADF800000DE00621BDF85F +:10029000000002F03DFA04460721BDF8000002F01C +:1002A00037FA0CB100B1FFDF00216846FFF7B8FF55 +:1002B0000028EBD038BD70B507F08EF90BF0CDF902 +:1002C000D04C4FF6FF7600256683A683CEA025701E +:1002D00001680079A4F14002657042F8421FA11C38 +:1002E0001071601C12F02FFE25721B2060814FF4EC +:1002F000A471A181E08121820321A1740422E2740E +:10030000A082E082A4F13E00218305704680BC48B3 +:100310000C300570A4F110000570468070BD70B5FA +:10032000B74C16460D466060217007F0CFF8FFF716 +:10033000A7FFFFF7C0FF207810F0F1FAB4480DF0E6 +:1003400053FE2178606812F0A3FD20780AF010FCBB +:10035000284608F09CF9AE48FEF734F8217860682A +:1003600009F056FE3146207813F078F8BDE8704069 +:100370000BF073B910B501240AB1002010BD21B1F2 +:10038000012903D00024204610BD02210CF076FF85 +:10039000F9E72DE9F047040000D1FFDF9948022179 +:1003A0001C308146FFF73CFF00B1FFDF954D062072 +:1003B000B5F81C8002F042F90646072002F03EF92B +:1003C0003044C6B2701CC7B2A88BB04228D12046B8 +:1003D0000DF00CF9B0B1207818283FD12079012810 +:1003E0003CD1E088062102F081F9040000D1FFDF52 +:1003F000208807F084F82088062102F089F940B3AC +:10040000FFDF2BE0287860B3002666701420207090 +:100410002021201D14F007FB022020712E701DE00A +:10042000B84217D12046FDF767FFD0B120781728D2 +:1004300014D1207968B1E088072102F057F940B162 +:10044000008807F05CF8E088072102F061F900B14C +:10045000FFDF03E02146FFF745FE10B10120BDE8B4 +:10046000F08702214846FFF7DBFE10B9A98B414512 +:10047000AAD12046BDE8F04713F036B810B501F018 +:100480007AFA08B10C2010BD0BF03AF9002010BD2B +:1004900010B50446007818B1012801D0122010BD13 +:1004A00001F07AFA20B10BF0DBFA08B10C2010BD94 +:1004B000207801F027FAE21D04F11703611CBDE862 +:1004C00010400BF0C2B910B5044601F054FA08B15F +:1004D0000C2010BD207828B1012803D0FF280BD0B4 +:1004E000122010BD01F00EFA611C0BF0C9F808B122 +:1004F000002010BD072010BD01200BF0FBF8F7E72E +:1005000010B50BF0B0FA08B1002010BD302010BDBE +:1005100010B5044601F040FA08B10C2010BD204689 +:100520000BF09BFA002010BD10B501F035FA20B198 +:100530000BF096FA08B10C2010BD0BF0EBF900207F +:1005400010BDFF2181704FF6FF7181802C494968F1 +:100550000A7882718A88028149884181012141702B +:10056000002070471CB5002412F1080F15D00CDCD8 +:1005700012F1280F11D012F1140F0ED012F1100F3A +:100580000BD012F10C0F0ED107E012F1040F04D0C2 +:100590001AB1032A01D0042A05D1012806D0022865 +:1005A00008D003280AD0122420461CBD1046FEF7AE +:1005B0007CFAF9E710460DF0BDFCF5E70846144655 +:1005C0006946FFF779FD08B10224EDE79DF80000C8 +:1005D000019880F857400024E6E710B51346012241 +:1005E0000CF032F9002010BD10B5044610F07CFF6D +:1005F00005280FD0204610F081F9002010BD000022 +:100600006C000020E8070020FFFFFFFF1F00000034 +:10061000A80600200C20F1E710B5044601F0BCF953 +:1006200008B10C20EAE72146002006F0D6FF0020A2 +:10063000E4E710B5044610F0EFF950B108F0ABFA5A +:1006400038B1207808F049F820780DF067FF0020D5 +:10065000D4E70C20D2E710B5044601F09DF908B1AB +:100660000C20CBE72146012006F0B7FF0020C5E7AC +:1006700038B504464FF6FF70ADF80000A079E17977 +:10068000884216D02079FDF7A4FD90B16079FDF77E +:10069000A0FD70B10022A079114613F0F5FA40B91F +:1006A0000022E079114613F0EFFA10B9207A0728FA +:1006B00001D9122038BD08F07BFA60B910F014FFA0 +:1006C00048B900216846FFF7ABFD20B1204605F090 +:1006D00032FF002038BD0C2038BD2DE9FC41817867 +:1006E00005461A2925D00EDC16292DD2DFE801F0A7 +:1006F0002C2C2C2C2C212C2C2C2C2C2C2C2C2C2C45 +:100700002C2C2C2121212A291ED00BDCA1F11E0129 +:100710000C2919D2DFE801F0181818181818181841 +:100720001818180D3A3904290ED2DFE801F00D022D +:100730000D022888B0F5706F06D201276946FFF7D1 +:10074000BBFC18B102208BE5122089E59DF8000062 +:1007500001F0DFF8019C08B1FC3401E004F5BC7441 +:100760009DF8000001F0D5F8019E08B1FD3601E0CA +:1007700006F279166846FFF78DFC08B1207808B1BB +:100780000C206DE52770A8783070684601F058F9A4 +:10079000002065E57CB50D466946FFF78DFC002617 +:1007A00018B12E602E7102207CBD9DF8000001F072 +:1007B000B0F8019C9DF80000583401F0AAF80198A7 +:1007C00084F8406081682960017B297194F84010A9 +:1007D0000029F5D100207CBD70B50D460446018985 +:1007E000002380880CF09CF9696A81421DD2401A6E +:1007F000401CA1884008091A8AB2A2802189081ADF +:100800002081668895F8541010460CF063F98642F2 +:1008100000D230466080E68895F8551020890CF0AB +:1008200059F9864200D23046E08070BDF0B585B0FF +:100830000D46064603A9FFF73FFC00282DD19DF881 +:100840000C0060B300220499FB20B1F84A30FB2B66 +:1008500000D30346B1F84C40FB20FB2C00D30446E8 +:10086000DFF8A8CA9CE8811000900197CDF808C075 +:10087000ADF80230ADF806406846FFF7ADFF6E8078 +:10088000BDF80400E880BDF808006881BDF80200EA +:10089000A880BDF806002881002005B0F0BD012227 +:1008A000D1E72DE9F04186B0044600886946FFF79C +:1008B00003FC002876D12189E08801F0D0F80028D7 +:1008C00070D1A188608801F0CAF800286AD1218916 +:1008D000E08801F0D2F8002864D1A188608801F096 +:1008E000CCF807005ED1208802A9FFF79FFF00B176 +:1008F000FFDFBDF8101062880920914252D3BDF885 +:100900000C10E28891424DD3BDF81210BDF80E20B4 +:1009100023891144A2881A44914243D39DF80010C0 +:10092000019D4FF00008012640F6480041B185F8CE +:10093000A361019991F8E61105F5D17541B91AE065 +:1009400085F80D61019991F8301105F5867509B1A9 +:100950003A2724E0E18869806188E9802189814221 +:1009600000D30146A980A188814200D2084628818F +:10097000012201990FE0E18869806188E98021897D +:10098000814200D30146A980A188814200D2084655 +:100990002881019900222846FFF71EFF2E7085F856 +:1009A0000180384606B0BDE8F0817AE710B504460C +:1009B00000F0F2FF20B10BF053F808B10C201DE657 +:1009C000207800F09FFFE279611C0BF0CAF908B1B2 +:1009D000002013E6022011E610B503780446002B30 +:1009E000406813460A46014608D001200CF0C9F9B8 +:1009F0006168496A884203D90120FFE50020F5E7D4 +:100A00000020FBE5887800B90320C97801B90321EB +:100A1000107019700020704710B586B00446008829 +:100A200003A9FFF749FB002806D1A08830B10128AF +:100A300004D0022802D0122006B0DFE56B4602AADD +:100A4000214603A8FFF7DEFF0028F5D19DF80C3002 +:100A500000220121002B049B06D083F8AD11049BDA +:100A600093F8FA314BBB20E083F81711049B93F8FD +:100A70003C313BB9049B93F816311BB9049B93F8A6 +:100A80007D300BB13A200CE0049B83F81611049BD7 +:100A90009DF8081083F81811049B9DF8001083F846 +:100AA0001911049981F81721C6E7049B93F8AC311A +:100AB0001BB9049B93F87D300BB13A200CE0049BEA +:100AC00083F8AC11049B9DF8081083F8AE11049BC9 +:100AD0009DF8001083F8AF11049981F8AD21ABE7C0 +:100AE00010B504460020A17801B90120E2780AB9C6 +:100AF00040F0020000F0CBFF002803D12046BDE803 +:100B0000104089E77AE52DE9F04104460078012894 +:100B100004D018B1022801D003281ED1607828B172 +:100B2000012803D0022801D0032816D1E07B10B998 +:100B3000A078012811D1A07830F005020DD110F075 +:100B4000050F0AD0400801D011202CE7E078E68894 +:100B500062890F4618B1012801D0122023E7104600 +:100B600000F0A5FF302558B13946304600F0A9FF06 +:100B700030B1A07B0028F0D00728EED8002012E783 +:100B8000284610E71FB5044600F0E8FE10B10C201F +:100B900004B033E5022104F10A0000F09CFFA078C4 +:100BA0008DF80800A0788DF8000060788DF80400BA +:100BB00020788DF80300A07B8DF80500E07B00B164 +:100BC00001208DF80600A078C0070DD0E07801283C +:100BD00013D0A0B15FF000008DF80100E088ADF8FF +:100BE0000A006089ADF80C0002A80FF021FF002870 +:100BF000CED168460DF097FCCAE70220ECE7012051 +:100C0000EAE710B504460121FFF77DFF002803D174 +:100C10002046BDE81040B5E7F0E40278012A01D093 +:100C2000BAB118E042783AB1012A05D0022A12D1AD +:100C300089B1818879B100E059B1418849B1808892 +:100C400038B101EB8101490000EB8000B1EB002FCE +:100C500001D2002070471220704770B5044600781A +:100C60000D46012809D010F03FFC052803D00FF0F5 +:100C7000F0FD002800D00C2070BD0DF034FB88B1D1 +:100C80000DF046FB0DF02CFC0028F5D125B1607865 +:100C90000DF0DCFB0028EFD1A1886088BDE8704032 +:100CA0000FF0E1BE122070BD10B504460121FFF720 +:100CB000B4FF002804D12046BDE810400121CCE754 +:100CC0009CE42DE9F0470746B0F84C50FB209246D3 +:100CD0000E46FB2D00D30546DFF83486B8F80A002F +:100CE000A84200D2054697F85510284600F025FE88 +:100CF000B8F80C10814200D208468146B7F84A4045 +:100D0000FB20FB2C00D30446B8F80E00A04200D212 +:100D1000044697F85410204600F00FFEB8F8101063 +:100D2000814200D208464FF4A4721B2C01D090429D +:100D300003D11B2D25D0914523D0F580A6F808902E +:100D40007480B080524639463046FFF745FD012099 +:100D50003070F0881B38E02800D9FFDF70881B381E +:100D6000E02800D9FFDF30894FF4E064A0F5A470DB +:100D7000A04200D9FFDFB088A0F5A470A04200D93E +:100D8000FFDFBDE8F087F0B5871FDDE9056540F6B8 +:100D90007B44A74213D28F1FA74210D288420ED89D +:100DA000B2F5FA7F0BD2A3F10A00241FA04206D2AB +:100DB000521C4A43B2EB830F01DAAE4201D9002044 +:100DC000F0BD0120F0BD2DE9FC41477A884604467C +:100DD00017F0050F7FD0F8087DD1780701D51120D5 +:100DE000B1E494F83A0008B9012F74D100252E46D9 +:100DF000F8071BD088F00105208A294600F057FE2D +:100E000048B36089294600F05CFE20B3208A6189DE +:100E1000884260D8A18EE08DCDE90001238D628CDF +:100E2000A18BE08AFFF7AFFFA8B10125B8070ED567 +:100E300004EB4500828EC18DCDE90012038D428CFA +:100E4000818BC08AFFF79FFF28B12E466D1CB8F139 +:100E5000000F02D023E0302075E4228A012119E03E +:100E6000B14203D004EB4100008A024404EB41008C +:100E7000C38A878ABB422ED1838B478BBB422AD140 +:100E8000438C078CBB4226D1038DC08C834222D178 +:100E9000491CC9B2A942E3D3608990421BD3207890 +:100EA00010B1012817D10EE0A078B8F1000F08D0DA +:100EB00048B1012807D0022805D003280BD102E051 +:100EC00009E00028EDD1607838B1012805D002286A +:100ED00003D0032801D0122035E4002033E40021A0 +:100EE00071E70178C90702D0406812F0D0BA12F059 +:100EF0009DBA2DE9F0438DB00D46AFF6F402D2E96C +:100F0000008701462846FFF75EFF00280CD100F05D +:100F100025FD40B9FE4E307828B90CF0F1FBA0F564 +:100F20007F41FF3903D00C200DB0BDE8F0830321D1 +:100F300005F1100000F0CFFDF54808AA3E380890F2 +:100F4000F4480990F248062110380A900BA801F0E5 +:100F50009BFB040035D003210BF013FAB18AA4F8EF +:100F60004A10F28AA4F84C20F37C0093B146B37C7B +:100F7000208801F076FC00B1FFDF208806F0BEFA81 +:100F8000218804F10E0000F011FDE3A004F1120627 +:100F900000680490032104A804F0C2FD002004A905 +:100FA0000A5C3254401CC0B20328F9D3A88B60807D +:100FB000688CA080288DE080687AC10703D0012169 +:100FC00006E00920B0E7800701D5022100E00021FA +:100FD000B9F818000A460FF0DBFD0146A062204672 +:100FE0000FF0E4FD002684F85E6084F85F60A87866 +:100FF00000F088FC6076D5F80300C4F81A00B5F854 +:101000000700E083C4F808802773012084F80801F2 +:10101000024604F586712046FFF753FE8DF8006006 +:101020000121684604F07CFD9DF8000000F00701F6 +:10103000C0F3C1021144C0F3401008448DF8000011 +:10104000401D2076092801D2083020760021204654 +:101050000BF097F968780DF051F9A9782878EA1C17 +:101060000DF01FF948B10DF053F9A9782878EA1C62 +:101070000DF0C6F9060002D038E0122636E0687A94 +:1010800000F001010020CA0700D00120890701D526 +:1010900040F002000DF0EEF8060027D121460320B3 +:1010A0000DF0D8F9060021D1687A00F001018DF821 +:1010B0000810C00705D06889ADF80A00288AADF885 +:1010C0000C0002A80FF0B4FC064695F83A0000B1F7 +:1010D00001200DF0E1F84EB90DF002FA060005D13D +:1010E000A98F20460FF046FC060008D0208806F0A5 +:1010F00006FA2088062101F00BFB00B1FFDF304625 +:1011000012E701460020F4E638B58148007878B946 +:1011100010F0EAF9052805D00CF0F2FAA0F57F41AD +:10112000FF3905D068460FF0E2FC040002D00CE065 +:101130000C2038BD0098008806F0E1F900980621DF +:10114000008801F0E5FA00B1FFDF204638BD1CB58C +:1011500082894189CDE900120389C288818840884B +:10116000FFF711FE08B100201CBD30201CBD70B57A +:101170000546FFF7ECFF00280ED12888062101F074 +:10118000B5FA040007D000F04FFC20B1D4F80001FC +:10119000017831B901E0022070BDD4F84C11097812 +:1011A00009B13A2070BD05218171D4F800110020E9 +:1011B0000881D4F80011A8884881D4F80011E88883 +:1011C0008881D4F800112889C881D4F800010289E7 +:1011D00041898A4204D88279082A01D88A4201D3F7 +:1011E000122070BD29884180D4F8001102200870B7 +:1011F000002070BD3EB504460BF0B8FAB0B14448CB +:101200000125A0F140024570236842F8423F23794E +:101210000021137141706946062001F0F0F900B118 +:10122000FFDF684601F0C9F910B10EE012203EBDA3 +:10123000BDF80440029880F80851684601F0BDF9F5 +:1012400018B9BDF80400A042F4D100203EBD70B52D +:1012500005460088062101F049FA040007D000F095 +:10126000E3FB20B1D4F80011087830B901E0022086 +:1012700070BDD4F84C01007808B13A2070BD9620BA +:10128000005D10F0010F1BD0D5F802004860D5F8C2 +:1012900006008860D4F80001698910228181D4F8A1 +:1012A000000105F10C010E3004F5807413F01AFBF7 +:1012B000216803200870216828884880002070BDBC +:1012C0000C2070BD38B504460078EF2856D86088E9 +:1012D000ADF80000009800F00FFCD0B3618808075B +:1012E00008D4D4E90120824248D8202A46D3B0F558 +:1012F000804F43D8207B60B307283FD8607B70B114 +:1013000001280CD002280AD0032807E0A04E0200D2 +:10131000E807002078000020112233002ED14A0770 +:1013200003D4022801D0032805D1A07B08B10128ED +:1013300024D1480707D4607D28B1012803D00228B2 +:1013400001D003281AD1C806E07D03D5012815D1A4 +:1013500010E013E0012801D003280FD1C80609D4FA +:10136000607E012803D0022801D0032806D1A07E88 +:101370000F2803D8E07E18B1012801D0122038BD13 +:10138000002038BDF8B515460E46044607F010FC9F +:1013900008B10C20F8BD2046FFF794FF0028F9D1D2 +:1013A000E07D03280BD0A078C00602D4607E03281D +:1013B00005D0FDF77FFB3070A07515B10CE0112052 +:1013C000F8BDFF208DF8000069460020FDF761FBA5 +:1013D00069460020FDF751FB2046BDE8F840FDF7C7 +:1013E000ADBA0022CEE770B50C46054612B11F29F2 +:1013F00007D80CE0FF2C04D8FDF727F818B11F2CF4 +:1014000001D9122070BD2846FDF709F808B1002067 +:1014100070BD422070BD10B50446408810B1FDF784 +:101420000FFB78B12078618800F001026078FFF747 +:10143000DAFF002805D1FDF7EBFA6288824203D972 +:1014400007203DE412203BE410466168FDF721FBD4 +:10145000002035E410B50446408810B1FCF7E7FFE2 +:1014600070B12078618800F001026078FFF7BBFF5F +:10147000002804D160886168FDF7FFFA00201FE4AE +:1014800012201DE47CB5054640784224012808D886 +:10149000A878FCF7C4FF20B128781224012802D0D4 +:1014A00090B120467CBDFDF711FB20B1A888002833 +:1014B000F7D08028F5D8FDF710FB60B168780028D8 +:1014C000EFD02878012808D006F038F9044607F054 +:1014D0003BF8002872D00C207CBDFDF748F910B90C +:1014E000FDF7EDFA90B307F063FB0028F3D1FCF7AA +:1014F0005EFFA0F57F41FF39EDD1FDF75AF9AE88C7 +:1015000042F210704643A879FDF7ABFAFCF796FF5C +:10151000F8B10022072101A801F0B6F804001FD09D +:10152000F6480321846020460AF0E4FD2046FDF7DA +:101530003CFEF34DA88AA4F84A00E88AA4F84C00BF +:10154000FCF783FF70B1288B01210FE0FFE7122029 +:101550007CBD3146002007F0C3F868B3FFDF37E0F9 +:1015600009207CBDFDF7BBFA0146288B07F06DF919 +:101570000146A0620022204606F0E3F8FCF765FF72 +:1015800008B9FDF7ACFAE87C0090AB7CEA8AA98A3E +:10159000208801F066F900B1FFDF208805F0AEFF7A +:1015A0003146204607F09CF800B1FFDF002204F529 +:1015B000D1712046FFF785FB0AE0FFE744B12088A0 +:1015C00005F09DFF2088072101F0A2F800B1FFDFA0 +:1015D00000207CBD002155E770B50D46072101F0C4 +:1015E00085F8040003D094F87B0110B10AE00220D2 +:1015F00070BD94F86500142801D0152802D194F824 +:10160000C80108B10C2070BD1022294604F5BE7037 +:1016100013F068F9012084F87B01002070BD10B53B +:10162000072101F063F818B190F87B1111B107E0C0 +:10163000022006E790F86510142903D0152901D07F +:101640000C20FEE6022180F87B110020F9E62DE94E +:10165000FC410C464BF68032122194421CD8DCB17E +:101660006946FEF729FD002815D19DF8000000F01D +:1016700050F9019E9DF80000583600F04AF9019D8E +:10168000AD1C2F882246394630460AF0EEFC2888E9 +:10169000B842F6D100201FE408461DE47CB504469C +:1016A00000886946FEF708FD002810D19DF800006B +:1016B00000F02FF9019D9DF80000583500F029F940 +:1016C0000198A27890F82C10914201D10C207CBD99 +:1016D0007F212972A9720021E972E17880F82D102A +:1016E000217980F82E10A17880F82C1000207CBD84 +:1016F0001CB50C466946FEF7DFFC00280AD19DF8B0 +:10170000000000F006F9019890F8730000B1012084 +:10171000207000201CBD7CB50D4614466946FEF7BE +:10172000CBFC002809D19DF8000000F0F2F80198E8 +:1017300090F82C00012801D00C207CBD9DF8000001 +:1017400000F0E7F8019890F86010297090F86100B7 +:10175000207000207CBD70B50D461646072100F0B4 +:10176000C5FF18B381880124C388428804EB410473 +:10177000AC4217D842F210746343A4106243B3FB27 +:10178000F2F2521E94B24FF4FA72944200D9144607 +:10179000A54200D22C46491C641CB4FBF1F24A431A +:1017A000521E91B290F8B4211AB901E0022070BD26 +:1017B00001843180002070BD10B50C46072100F077 +:1017C00095FF48B180F8E74024B190F8E51009B1E1 +:1017D00007F051F8002034E6022032E6017899B192 +:1017E000417889B141881B290ED381881B290BD3ED +:1017F000C188022908D342490268403941F8522F72 +:1018000040684860002070471220704710B50446B9 +:101810000FF0BAF9204606F0E7FF002011E610B5F8 +:1018200006F0E5FF00200CE62DE9F04115460F46D5 +:1018300006460122114638460FF0AAF90446012156 +:10184000384607F002F8844200D2044601213046AF +:10185000653C00F063F806460121002000F05EF8C8 +:10186000304401219630844206D900F19601201AB5 +:10187000B0FBF1F0401C81B229800020BDE8F0816E +:1018800010B5044600F088F808B10C20D9E5601CBA +:101890000AF042FA207800F00100FCF785FF20787A +:1018A00000F001000CF02FFD0020CAE510B506F095 +:1018B00098FF0020C5E510B50446072000F0B0FEF3 +:1018C00008B10C20BDE52078C00711D00022607857 +:1018D000114612F0D9F908B11220B2E5A06808F05B +:1018E000F6FE6078D4F8041008F0FAFE0020A8E5AF +:1018F000002008F0ECFE00210846F5E76C0000200F +:10190000E807002018B1022801D00120704700200C +:10191000704708B1002070470120704710B50129B9 +:1019200004D0022905D0FFDF20468AE5C0005030F0 +:1019300001E080002C3084B2F6E711F00C0F04D0E7 +:101940004FF4747101EB801006E0022902D0C00050 +:10195000703001E080003C3080B2704710B50FF06D +:10196000C3FD042805D00FF0BFFD052801D00020DD +:1019700067E5012065E510B5FFF7F0FF10B10CF049 +:1019800073FD28B907F014F920B1FCF7E8FE08B19F +:10199000012056E5002054E510B5FFF7DFFF18B928 +:1019A00007F006F9002800D001204AE52DE9FE43A2 +:1019B00000250F4680460A260421404604F0D9F847 +:1019C00040460AF0AFFE062000F038FE044616E05E +:1019D0006946062000F013FE0BE000BFBDF80400CE +:1019E000B84206D00298042241460E3012F04EFF53 +:1019F00050B1684600F0E1FD0500EFD0641E002CF8 +:101A000006DD002DE4D005E040460AF094FEF5E73F +:101A100005B9FFDFD8F800000AF031FB761E01D0CF +:101A20000028C9D0BDE8FE8390F8D81090F8730064 +:101A300020B919B1042901D0012070470020704756 +:101A4000017800290AD0416891F8E520002A05D0E4 +:101A5000002281F8E520406806F00DBF70471B3872 +:101A6000E12806D2B1F5A47F03D344F2902081424D +:101A700001D91220704700207047FB2803D840F698 +:101A80004800814201D9112070470020704770B58D +:101A900014460546012200F053F8002806D12146DD +:101AA0002846BDE87040002200F04AB870BD042806 +:101AB00003D321B9B0F5804F01D900207047012030 +:101AC0007047042803D321B9B0F5804F01D9002015 +:101AD00070470120704710B500224FF4C84408E059 +:101AE00030F81230A34200D9234620F81230521C9D +:101AF000D2B28A42F4D3A4E480B2C1060BD4010767 +:101B00001CD481064FEAC07101D5B9B900E099B182 +:101B1000800713D410E0410610D481060ED4C1070B +:101B20004FEA807104D0002902DB400704D405E0AD +:101B3000010703D4400701D40120704700207047FB +:101B40000AB1012200E00222024202D1880802D139 +:101B500009B10020704711207047000030B505889A +:101B600025F4004421448CB24FF4004194420AD23F +:101B7000121B92B21B339A4201D2A94307E005F42B +:101B80000041214303E0A21A92B2A943114301800C +:101B900030BD0844083050434A31084480B2704791 +:101BA00070B51D4616460B46044629463046049A33 +:101BB000FFF7EFFF0646B34200D2FFDF28212046A1 +:101BC00012F031FF4FF6FF70A082283EB0B2657769 +:101BD0006080B0F5004F00D9FFDF618805F13C005F +:101BE000814200D2FFDF60880835401B343880B264 +:101BF00020801B2800D21B2020800020A07770BDF1 +:101C00008161886170472DE9F05F0D46C188044607 +:101C100000F12809008921F4004620F4004800F072 +:101C200062FB10B10020BDE8F09F4FF0000A4FF0BA +:101C3000010BB0450CD9617FA8EB0600401A0838AB +:101C4000854219DC09EB06000021058041801AE07D +:101C50006088617F801B471A083F0DD41B2F00DA74 +:101C6000FFDFBD4201DC294600E0B9B2681A020478 +:101C7000120C04D0424502DD84F817A0D2E709EB2C +:101C800006000180428084F817B0CCE770B50446A6 +:101C900000F12802C088E37D20F400402BB11044FD +:101CA0000288438813448B4201D2002070BD002576 +:101CB0008A4202D30180458008E0891A0904090C90 +:101CC000418003D0A01D00F01EFB08E0637F008868 +:101CD0000833184481B26288A01DFFF73FFFE57505 +:101CE000012070BD70B5034600F12804C5888088C6 +:101CF00020F400462644A84202D10020188270BD7C +:101D000098893588A84206D3401B75882D1A20442F +:101D1000ADB2C01E05E02C1AA5B25C7F2044304451 +:101D2000401D0C88AC4200D90D809C8924B1002450 +:101D300014700988198270BD0124F9E770B5044652 +:101D400000F12801808820F400404518208A0028EE +:101D500025D0A189084480B2A08129886A881144CD +:101D6000814200D2FFDF2888698800260844A189C3 +:101D7000884212D1A069807F2871698819B1201D1D +:101D800000F0C1FA08E0637F28880833184481B264 +:101D90006288201DFFF7E2FEA6812682012070BD29 +:101DA0002DE9F041418987880026044600F1280585 +:101DB000B94218D004F10A0821F4004028444188AF +:101DC00019B1404600F09FFA08E0637F00880833AD +:101DD000184481B262884046FFF7C0FE761C6189D4 +:101DE000B6B2B942E8D13046BDE8F0812DE9F04104 +:101DF00004460B4627892830A68827F40041B4F80A +:101E00000A8001440D46B74201D10020ECE70AB137 +:101E1000481D106023B1627F691D184612F062FDF3 +:101E20002E88698804F1080021B18A1996B200F061 +:101E30006AFA06E0637F62880833991989B2FFF76E +:101E40008DFE474501D1208960813046CCE78188ED +:101E5000C088814201D1012070470020704701896C +:101E60008088814201D1012070470020704770B501 +:101E70008588C38800F1280425F4004223F400413A +:101E800014449D421AD08389058A5E192588638887 +:101E9000EC18A64214D313B18B4211D30EE0437F4A +:101EA00008325C192244408892B2801A80B22333EF +:101EB000984201D211B103E08A4201D1002070BDE5 +:101EC000012070BD2DE9F0478846C188044600898D +:101ED00021F4004604F1280720F4004507EB060929 +:101EE00000F001FA002178BBB54204D9627FA81B3B +:101EF000801A002503E06088627F801B801A083802 +:101F000023D4E28962B1B9F80020B9F802303BB1BC +:101F1000E81A2177404518DBE0893844801A09E047 +:101F2000801A217740450ADB607FE1890830304420 +:101F300039440844C01EA4F81280BDE8F087454526 +:101F400003DB01202077E7E7FFE761820020F4E769 +:101F50002DE9F74F044600F12805C088884620F493 +:101F6000004A608A05EB0A0608B1404502D200200B +:101F7000BDE8FE8FE08978B13788B6F8029007EBAC +:101F80000901884200D0FFDF207F4FF0000B50EAAC +:101F9000090106D088B33BE00027A07FB946307125 +:101FA000F2E7E18959B1607F294408305044084480 +:101FB000B4F81F1020F8031D94F821108170E289F5 +:101FC00007EB080002EB0801E1813080A6F802B0BF +:101FD00002985F4650B1637F30880833184481B25D +:101FE0006288A01DFFF7BAFDE78121E0607FE189EB +:101FF00008305044294408442DE0FFE7E089B4F854 +:102000001F102844C01B20F8031D94F82110817074 +:1020100009EB0800E28981B202EB0800E081378019 +:1020200071800298A0B1A01D00F06DF9A4F80EB067 +:10203000A07F401CA077A07D08B1E088A08284F832 +:1020400016B000BFA4F812B084F817B001208FE7D3 +:10205000E0892844C01B30F8031DA4F81F108078C5 +:1020600084F82100EEE710B5818800F1280321F4FF +:1020700000442344848AC288A14212D0914210D0E5 +:10208000818971B9826972B11046FFF7E8FE50B9D3 +:102090001089283220F400401044197900798842D0 +:1020A00001D1002010BD184610BD00F12803407F6B +:1020B00008300844C01E1060088808B9DB1E136091 +:1020C00008884988084480B270472DE9F04100F142 +:1020D0002806407F1C4608309046431808884D88E3 +:1020E000069ADB1EA0B1C01C80B2904214D9801A9F +:1020F000A04200DB204687B298183A46414612F0CB +:10210000C5FB002816D1E01B84B2B844002005E0CE +:10211000ED1CADB2F61EE8E7101A80B20119A94213 +:1021200006D8304422464146BDE8F04112F0AEBB2D +:102130004FF0FF3058E62DE9F04100F12804407FD0 +:102140001E46083090464318002508884F88069A96 +:10215000DB1E90B1C01C80B2904212D9801AB042EE +:1021600000DB304685B299182A46404612F0BAFB89 +:10217000701B86B2A844002005E0FF1CBFB2E41E1D +:10218000EAE7101A80B28119B94206D821183246FE +:10219000404612F0A7FBA81985B2284624E62DE98F +:1021A000F04100F12804407F1E4608309046431855 +:1021B000002508884F88069ADB1E90B1C01C80B2AB +:1021C000904212D9801AB04200DB304685B298188E +:1021D0002A46414612F086FB701B86B2A8440020B6 +:1021E00005E0FF1CBFB2E41EEAE7101A80B28119B5 +:1021F000B94206D820443246414612F073FBA81972 +:1022000085B22846F0E5401D704710B5044600F140 +:102210002801C288808820F400431944904206D0E7 +:10222000A28922B9228A12B9A28A904201D1002041 +:1022300010BD0888498831B1201D00F064F80020E5 +:102240002082012010BD637F62880833184481B268 +:10225000201DFFF783FCF2E70021C1810177418255 +:10226000C1758175704703881380C28942B1C288E5 +:1022700022F4004300F128021A440A60C089704722 +:102280000020704710B50446808AA0F57F41FF39D1 +:1022900000D0FFDFE088A082E08900B10120A075B6 +:1022A00010BD4FF6FF71818200218175704710B516 +:1022B0000446808AA0F57F41FF3900D1FFDFA07D71 +:1022C00028B9A088A18A884201D1002010BD012030 +:1022D00010BD8188828A914201D1807D08B10020A1 +:1022E00070470120704720F4004221F400439A42D5 +:1022F00007D100F4004001F40041884201D00120E0 +:1023000070470020704730B5044600880D4620F421 +:102310000040A84200D2FFDF21884FF400408843EC +:102320002843208030BD70B50C00054609D0082C2C +:1023300000D2FFDF1DB1A1B2286800F044F8201DD3 +:1023400070BD0DB100202860002070BD0021026822 +:1023500003E093881268194489B2002AF9D100F089 +:1023600032B870B500260D460446082900D2FFDFBA +:10237000206808B91EE0044620688188A94202D07E +:1023800001680029F7D181880646A94201D1006879 +:102390000DE005F1080293B20022994209D32844C6 +:1023A000491B02608180216809682160016020600A +:1023B00000E00026304670BD00230B608A80026872 +:1023C0000A600160704700234360021D01810260C2 +:1023D0007047F0B50F460188408815460C181E4618 +:1023E000AC4200D3641B3044A84200D9FFDFA019DF +:1023F000A84200D9FFDF3819F0BD2DE9F041884629 +:1024000006460188408815460C181F46AC4200D38A +:10241000641B3844A84200D9FFDFE019A84200D964 +:10242000FFDF70883844708008EB0400BDE8F0815D +:102430002DE9F041054600881E461746841B884654 +:10244000BC4200D33C442C8068883044B84200D958 +:10245000FFDFA019B84200D9FFDF688830446880E8 +:1024600008EB0400E2E72DE9F04106881D4604462A +:10247000701980B2174688462080B84201D3C01B2D +:1024800020806088A84200D2FFDF7019B84200D9CE +:10249000FFDF6088401B608008EB0600C6E730B5B0 +:1024A0000D460188CC18944200D3A41A4088984263 +:1024B00000D8FFDF281930BD2DE9F041C84D044692 +:1024C0009046A8780E46A04200D8FFDF05EB8607AD +:1024D000B86A50F8240000B1FFDFB868002816D0B1 +:1024E000304600F044F90146B868FFF73AFF0500AE +:1024F0000CD0B86A082E40F8245000D3FFDFB9484A +:102500004246294650F82630204698472846BDE8DE +:10251000F0812DE9F8431E468C1991460F46054679 +:10252000FF2C00D9FFDFB14500D9FFDFE4B20095F1 +:102530004DB300208046E81C20F00300A84200D0E4 +:10254000FFDF4946DFF89892684689F8001089F85D +:10255000017089F8024089F8034089F8044089F83D +:10256000054089F8066089F80770414600F008F9CF +:10257000002142460F464B460098C01C20F0030045 +:10258000009012B10EE00120D4E703EB8106B062A7 +:10259000002005E0D6F828C04CF82070401CC0B2DE +:1025A000A042F7D30098491C00EB8400C9B2009008 +:1025B0000829E1D3401BBDE8F88310B50446EEF7C7 +:1025C000A8FE08B1102010BD2078854A618802EB72 +:1025D000800092780EE0836A53F8213043B14A1CA0 +:1025E0006280A180806A50F82100A060002010BDA8 +:1025F000491C89B28A42EED86180052010BD70B5B1 +:1026000005460C460846EEF784FE08B1102070BD62 +:10261000082D01D3072070BD25700020608070BD9B +:102620000EB56946FFF7EBFF00B1FFDF6846FFF725 +:10263000C4FF08B100200EBD01200EBD10B5044638 +:10264000082800D3FFDF6648005D10BD3EB5054693 +:1026500000246946FFF7D3FF18B1FFDF01E0641CD7 +:10266000E4B26846FFF7A9FF0028F8D02846FFF734 +:10267000E5FF001BC0B23EBD59498978814201D9AE +:10268000C0B27047FF2070472DE9F041544B062936 +:1026900003D007291CD19D7900E0002500244FF6C6 +:1026A000FF7603EB810713F801C00AE06319D7F83E +:1026B00028E09BB25EF823E0BEF1000F04D0641C5A +:1026C000A4B2A445F2D8334603801846B34201D1E0 +:1026D00000201CE7BDE8F041EEE6A0F57F43FF3B9C +:1026E00001D0082901D300207047E5E6A0F57F421C +:1026F000FF3A0BD0082909D2394A9378834205D989 +:1027000002EB8101896A51F8200070470020704770 +:102710002DE9F04104460D46A4F57F4143F2020045 +:10272000FF3902D0082D01D30720F0E62C494FF0E5 +:1027300000088A78A242F8D901EB8506B26A52F8FD +:102740002470002FF1D027483946203050F825203A +:1027500020469047B16A284641F8248000F007F8E7 +:1027600002463946B068FFF727FE0020CFE61D4934 +:10277000403131F810004FF6FC71C01C0840704722 +:102780002DE9F843164E8846054600242868C01CEB +:1027900020F0030028602046FFF7E9FF315D484341 +:1027A000B8F1000F01D0002200E02A680146009233 +:1027B00032B100274FEA0D00FFF7B5FD1FB106E06B +:1027C00001270020F8E706EB8401009A8A60296857 +:1027D000641C0844E4B22860082CD7D3EBE6000060 +:1027E00008080020AC4E020070B50E461D4611468A +:1027F00000F0D4F804462946304600F0D8F82044CA +:10280000001D70BD2DE9F04190460D4604004FF0CB +:10281000000610D00027E01C20F00300A04200D0EA +:10282000FFDFDDB141460020FFF77DFD0C3000EBFE +:10283000850617B112E00127EDE7614F04F10C00A6 +:10284000A9003C602572606000EB85002060606834 +:1028500012F0E9F841463868FFF765FD3046BDE8FB +:10286000F0812DE9FF4F564C804681B020689A4692 +:10287000934600B9FFDF2068027A424503D94168D8 +:1028800051F8280020B143F2020005B0BDE8F08FF6 +:102890005146029800F082F886B258460E9900F030 +:1028A00086F885B27019001D87B22068A1463946A6 +:1028B0000068FFF756FD04001FD067802580294679 +:1028C000201D0E9D07465A4601230095FFF768F923 +:1028D0002088314638440123029ACDF800A0FFF742 +:1028E0005FF92088C1193846FFF78AF9D9F8000046 +:1028F0004168002041F82840C7E70420C5E770B5CB +:102900002F4C0546206800B9FFDF2068017AA942F4 +:102910000ED9426852F8251051B1002342F82530F3 +:102920004A880068FFF748FD216800200A7A08E01D +:1029300043F2020070BD4B6853F8203033B9401C9D +:10294000C0B28242F7D80868FFF700FD002070BDD2 +:1029500070B51B4E05460024306800B9FFDF3068B3 +:10296000017AA94204D9406850F8250000B1041D3D +:10297000204670BD70B5124E05460024306800B97F +:10298000FFDF3068017AA94206D9406850F8251067 +:1029900011B131F8040B4418204670BD10B50A4639 +:1029A0000121FFF7F6F8C01C20F0030010BD10B5A0 +:1029B0000A460121FFF7EDF8C01C20F0030010BD0E +:1029C0008000002070B50446C2F11005281911F0EE +:1029D00089FF15F0FF0108D0491EC9B2802060545C +:1029E0002046BDE8704011F0FCBF70BD30B505E079 +:1029F0005B1EDBB2CC5CD55C6C40C454002BF7D1C1 +:102A000030BD10B5002409E00B78521E44EA4303A0 +:102A100000F8013B11F8013BD2B2DC09002AF3D1E6 +:102A200010BD2DE9F04389B01E46DDE910799046CE +:102A30000D00044622D002460846F949FDF7CDFDB7 +:102A4000102221463846FFF7DCFFE07B000606D562 +:102A5000F34A3946102310320846FFF7C7FF102209 +:102A600039464846FFF7CDFFF87B000606D5EC4A0D +:102A70004946102310320846FFF7B8FF10212046C0 +:102A800011F0AFFF0DE0103EB6B208EB06011023C7 +:102A900022466846FFF7AAFF224628466946FDF708 +:102AA0009CFD102EEFD818D0F2B241466846FFF7D1 +:102AB00089FF10234A46694604A8FFF797FF1023B1 +:102AC000224604A96846FFF791FF22462846694638 +:102AD000FDF783FD09B0BDE8F08310233A46414677 +:102AE000EAE770B59CB01E460546134620980C4692 +:102AF0008DF80800202219460DF1090011F0F2FEB0 +:102B0000202221460DF1290011F0ECFE17A913A88F +:102B1000CDE90001412302AA31462846FFF781FF93 +:102B20001CB070BD2DE9FF4F9FB014AEDDE92D54F0 +:102B300010AFBB49CDE90076202320311AA8FFF75A +:102B400070FF4FF000088DF808804FF001098DF8F4 +:102B5000099054F8010FCDF80A00A088ADF80E00D6 +:102B600014F8010C1022C0F340008DF8100055F845 +:102B7000010FCDF81100A888ADF8150015F8010C6B +:102B80002C99C0F340008DF8170006A8824611F07A +:102B9000A9FE0AA883461022229911F0A3FEA0489C +:102BA0003523083802AA40688DF83C80CDE90076CC +:102BB0000E901AA91F98FFF734FF8DF808808DF842 +:102BC00009902068CDF80A00A088ADF80E0014F82E +:102BD000010C1022C0F340008DF810002868CDF8D9 +:102BE0001100A888ADF8150015F8010C2C99C0F358 +:102BF00040008DF81700504611F074FE5846102220 +:102C0000229911F06FFE86483523083802AA4068E1 +:102C10008DF83C90CDE900760E901AA92098FFF728 +:102C200000FF23B0BDE8F08FF0B59BB00C46054621 +:102C3000DDE922101E461746DDE92032D0F801C03A +:102C4000CDF808C0B0F805C0ADF80CC00078C0F3EE +:102C500040008DF80E00D1F80100CDF80F00B1F85A +:102C60000500ADF8130008781946C0F340008DF850 +:102C700015001088ADF8160090788DF818000DF149 +:102C80001900102211F02EFE0DF1290010223146FC +:102C900011F028FE0DF139001022394611F022FE04 +:102CA00017A913A8CDE90001412302AA214628460D +:102CB000FFF7B7FE1BB0F0BDF0B5A3B017460D4649 +:102CC00004461E46102202A8289911F00BFE06A801 +:102CD0002022394611F006FE0EA82022294611F0C6 +:102CE00001FE1EA91AA8CDE90001502302AA31460F +:102CF00016A8FFF796FE1698206023B0F0BDF0B539 +:102D000089B00446DDE90E070D463978109EC1F3FF +:102D100040018DF8001031789446C1F340018DF8E0 +:102D200001101968CDF802109988ADF8061099794C +:102D30008DF808100168CDF809108188ADF80D10E4 +:102D400080798DF80F0010236A46614604A8FFF7CA +:102D50004DFE2246284604A9FDF73FFCD6F80100A7 +:102D60000090B6F80500ADF80400D7F80100CDF8E2 +:102D70000600B7F80500ADF80A0000200390102304 +:102D80006A46214604A8FFF731FE2246284604A9D8 +:102D9000FDF723FC09B0F0BD1FB51C6800945B680B +:102DA00001931368029352680392024608466946EB +:102DB000FDF713FC1FBD10B588B0044610680490E1 +:102DC0005068059000200690079008466A4604A9BE +:102DD000FDF703FCBDF80000208008B010BD1FB552 +:102DE0001288ADF800201A88ADF802200022019266 +:102DF00002920392024608466946FDF7EEFB1FBDAC +:102E00007FB5074B14460546083B9A1C6846FFF7FA +:102E1000E6FF224669462846FFF7CDFF7FBD00004A +:102E2000044F020070B5044600780E46012813D006 +:102E3000052802D0092813D10EE0A0686169057841 +:102E4000042003F075F9052D0AD078230022042010 +:102E5000616903F0C3F803E00420616903F068F9D5 +:102E600031462046BDE8704001F084B810B500F14D +:102E70002D03C2799C78411D144064F30102C27194 +:102E8000D2070DD04A795C7922404A710A791B79C0 +:102E90001A400A718278C9788A4200D9817010BDBF +:102EA00000224A71F5E74178012900D00C21017018 +:102EB00070472DE9F04F93B04FF0000B0C690D46B1 +:102EC0008DF820B0097801260C2017464FF00D0828 +:102ED0004FF0110A4FF008091B2975D2DFE811F0F5 +:102EE0001B00C20205031D035C036F03A103B603AD +:102EF000F7031804600492049F04EB0429053305CA +:102F000051055C05ED053006330662067E06F806BF +:102F10001C07E506EA0614B120781D282AD0D5F84A +:102F200008805FEA08004FD001208DF82000686A11 +:102F300002220D908DF824200A208DF82500A86922 +:102F40000A90A8880028EED098F8001091B10F29B7 +:102F500010D27DD2DFE801F07C1349DEFCFBFAF9E8 +:102F6000F8F738089CF6F50002282DD124B1207816 +:102F70000C2801D00026EEE38DF82020CAE10420C1 +:102F8000696A03F0D5F8A8880728EED1204600F03A +:102F9000ECFF022809D0204600F0E7FF032807D9FC +:102FA000204600F0E2FF072802D20120207004E052 +:102FB000002CB8D020780128D7D198F80400C11F80 +:102FC0000A2902D30A2061E0C3E1A070D8F80010FA +:102FD000E162B8F80410218698F8060084F83200FF +:102FE000012028700320207044E00728BDD1002C68 +:102FF00099D020780D28B8D198F8031094F82F2094 +:10300000C1F3C000C2F3C002104201D0062000E0AC +:103010000720890707D198F805100142D2D198F806 +:1030200006100142CED194F8312098F8051020EA1C +:1030300002021142C6D194F8322098F8061090434B +:103040000142BFD198F80400C11F0A29BAD200E09A +:1030500006E2617D81427CD8D8F800106160B8F842 +:103060000410218198F80600A072012028700E201B +:10307000207003208DF82000686A0D9004F12D0067 +:103080000990601D0A900F300B9021E12875FDE337 +:10309000412891D1204600F068FF042802D1E07851 +:1030A000C00704D1204600F060FF0F2884D1A88C0F +:1030B000D5F80C8080B24FF0400BE669FFF748FC72 +:1030C000324641465B464E46CDF80090FFF733F856 +:1030D0000B208DF82000686A0D90E06909900021AE +:1030E00008A8FFF79FFE2078042806D0A07D58B1DD +:1030F000012809D003280AD048E3052020700320C6 +:1031000028708DF82060CCE184F800A032E712200E +:103110002070E8E11128BCD1204600F026FF0428E9 +:1031200002D1E078C00719D0204600F01EFF062823 +:1031300005D1E078C00711D1A07D02280ED020462D +:1031400008E0CBE084E070E14FE122E102E1E8E059 +:1031500019E0AEE100F009FF11289AD1102208F120 +:10316000010104F13C0011F0BDFB607801286ED034 +:1031700012202070E078C00760D0A07D0028C8D061 +:103180000128C6D05AE0112890D1204600F0EDFE6B +:10319000082804D0204600F0E8FE132886D104F168 +:1031A0006C00102208F10101064611F09BFB20780B +:1031B00008280DD014202070E178C8070DD0A07D1C +:1031C00002280AD06278022A04D00328A1D035E070 +:1031D0000920F0E708B1012837D1C80713D0A07D36 +:1031E00002281DD000200090D4E9062133460EA805 +:1031F000FFF777FC10220EA904F13C0011F046FB0A +:10320000C8B1042042E7D4E90912201D8DE8070067 +:1032100004F12C0332460EA8616BFFF770FDE9E75D +:10322000606BC1F34401491E0068C84000F0010012 +:1032300040F08000D7E72078092806D185F8009073 +:103240008DF8209032E32870EBE30920FBE79CE146 +:10325000112899D1204600F088FE0A2802D1E07892 +:10326000C00704D1204600F080FE15288CD104F15F +:103270003C00102208F10101064611F033FB2078D2 +:103280000A2816D016202070D4E90932606B611D1F +:103290008DE80F0004F15C0304F16C0247310EA8C5 +:1032A000FFF7C2FC10220EA9304611F0EFFA18B158 +:1032B000F6E20B20207071E22046FFF7D7FDA078E0 +:1032C000216A0A18C0F11001104611F08AFB23E3AD +:1032D000394608A8FFF7A6FD06463BE20228B8D10A +:1032E000204600F042FE042804D3204600F03DFEB4 +:1032F000082809D3204600F038FE0E2829D320469E +:1033000000F033FE122824D2A07D0228A1D10E2085 +:103310008DF82000686A0D9098F801008DF824005F +:10332000F0E3022895D1204600F01FFE002810D0BF +:10333000204600F01AFE0128F9D0204600F015FEC4 +:103340000C28F4D004208DF8240098F801008DF8A2 +:1033500025005EE21128FCD1002CFAD02078172835 +:10336000F7D16178606A022911D0002101EB410197 +:10337000182606EBC1011022405808F1010111F096 +:10338000B1FA0420696A00F0E3FD2670F2E501213C +:10339000ECE70B28DDD1002CDBD020781828D8D121 +:1033A0006078616A02281CD05FF0000000EB4002E8 +:1033B000102000EBC2000958B8F8010008806078BE +:1033C000616A02280FD0002000EB4002142000EBBD +:1033D000C2000958404650F8032F0A604068486010 +:1033E00039E00120E2E70120EEE71128B1D1002CFD +:1033F000AFD020781928ACD16178606A022912D048 +:103400005FF0000101EB41011C2202EBC10110221F +:10341000405808F1010111F065FA0420696A00F0D2 +:1034200097FD1A20B6E00121ECE7082891D1002C85 +:103430008FD020781A288CD1606A98F80120017802 +:1034400062F347010170616AD8F8022041F8012F48 +:10345000B8F8060088800420696A00F079FD8EE2E1 +:10346000072013E63878012894D1182204F11400BB +:10347000796811F07CFAE079C10894F82F0001EA2C +:10348000D001E07861F30000E070217D002974D163 +:103490002178032909D0C00725D0032028708DF892 +:1034A0002090686A0D90412004E3607DA1788842F5 +:1034B00001D90620EAE502262671E179204621F0AD +:1034C000E001E171617A21F0F0016172A17A21F0ED +:1034D000F001A172FFF7CAFC2E708DF82090686A87 +:1034E0000D900720E6E20420ADE6387805289DD14E +:1034F0008DF82000686A0D90B8680A900720ADF832 +:1035000024000A988DF830B06168016021898180BB +:10351000A17A817104202070F4E23978052985D1DF +:103520008DF82010696A0D91391D09AE0EC986E823 +:103530000E004121ADF824108DF830B01070A88C29 +:10354000D7F80C8080B24026A769FFF713FA4146EE +:103550003A463346C846CDF80090FEF720FE0021DB +:1035600008A8FFF75FFCE07820F03E00801CE070C8 +:103570002078052802D00F200CE049E1A07D20B181 +:10358000012802D0032802D002E10720C0E584F818 +:103590000080EFE42070EDE4102104F15C0002F003 +:1035A000E8FA606BB0BBA07D18B1012801D00520FE +:1035B000FDE006202870F7486063A063BEE238781B +:1035C000022894D1387908B12875B3E3A07D022888 +:1035D00002D0032805D022E0B8680028F5D0606347 +:1035E0001CE06078012806D0A07994F82E100128FC +:1035F00005D0E84806E0A17994F82E00F7E7B8680E +:103600000028E2D06063E078C00701D0012902D031 +:10361000E04803E003E0F8680028D6D0A063062065 +:1036200011E68DF82090696A0D91E1784846C90746 +:1036300009D06178022903D1A17D29B1012903D0E4 +:10364000A17D032900D00720287031E138780528B2 +:10365000BBD1207807281ED084F800A005208DF863 +:103660002000686A0D90B8680A90ADF824A08DF823 +:1036700030B003210170E178CA070FD0A27D022A81 +:103680001AD000210091D4E9061204F15C03401C19 +:10369000FFF727FA67E384F80090DFE7D4E909230E +:1036A000211D8DE80E0004F12C0304F15C02401C86 +:1036B000616BFFF724FB56E3626BC1F34401491EC3 +:1036C0001268CA4002F0010141F08001DAE738785F +:1036D0000528BDD18DF82000686A0D90B8680A9061 +:1036E000ADF824A08DF830B0042100F8011B1022A1 +:1036F00004F15C0111F0F6F8002108A8FFF792FB35 +:103700002078092801D0132044E70A2020709CE586 +:10371000E078C10742D0A17D012902D0022927D03B +:1037200038E0617808A8012916D004F16C010091F5 +:10373000D4E9061204F15C03001DFFF7BDFA0A206C +:10374000287003268DF82080686A0D90002108A853 +:10375000FFF768FBDDE2C3E204F15C010091D4E90C +:10376000062104F16C03001DFFF7A6FA0026E9E725 +:10377000C0F3440114290DD24FF0006101EBB010E9 +:103780004FEAB060E0706078012801D01020BFE4FB +:103790000620FFE6607801283FF4B8AC0A2052E525 +:1037A000E178C90708D0A17D012903D10B20287039 +:1037B00004202FE028702DE00E2028706078616BC7 +:1037C000012817D004F15C0304F16C020EA8FFF786 +:1037D000E3FA2046FFF74AFBA0780EAEC0F11001D5 +:1037E000304411F0FEF806208DF82000686A099632 +:1037F0000D909AE004F16C0304F15C020EA8FFF74F +:10380000CBFAE9E73978022903D139790029D1D0F7 +:1038100029758FE28DF82000686A0D9058E5387898 +:103820000728F6D1D4E909216078012809D000BF22 +:1038300004F16C00CDE90002029105D104F16C03A2 +:1038400004E004F15C00F5E704F15C0304F14C00D2 +:103850007A680646216AFFF765F96078012821D168 +:10386000A078216A0A18C0F11001104611F0B9F8C9 +:10387000D4E90923606B04F12D018DE80F0004F1F8 +:103880005C0304F16C0231460EA800E054E2FFF73D +:10389000CBF910220EA904F13C0010F0F7FF08B19B +:1038A0000B20AFE485F800808DF82090686A0D90B9 +:1038B0008DF824A00CE538780528AAD18DF82000D1 +:1038C000686A0D90B8680A90ADF824A08DF830B001 +:1038D00080F80080617801291AD0D4E9093204F116 +:1038E0002D01A66B03920096CDE9011304F16C0340 +:1038F00004F15C0204F14C01401CFFF795F9002132 +:1039000008A8FFF78FFA6078012805D0152041E656 +:10391000D4E90923611DE4E70E20287006208DF804 +:103920002000686ACDF824B00D90A0788DF82800AA +:10393000CEE438780328C0D1E079C00770D00F20DA +:103940002870072066E7387804286BD11422391DC7 +:1039500004F1140011F00BF8616A208CA1F8090041 +:10396000616AA078C871E179626A01F0030111729D +:10397000616A627A0A73616AA07A81F8240016206B +:1039800061E485F800A08DF82090696A50460D9199 +:1039900090E00000044F02003878052842D1B86852 +:1039A000A8616178606A022901D0012100E000214C +:1039B00001EB4101142606EBC1014058082102F039 +:1039C000D8F86178606A022901D0012100E0002165 +:1039D00001EB410106EBC101425802A8E169FFF782 +:1039E0000FFA6078626A022801D0012000E000200E +:1039F00000EB4001102000EBC1000223105802A987 +:103A00000932FEF7F3FF626AFD4B0EA80932A16985 +:103A1000FFF7E5F96178606A022904D0012103E02B +:103A200042E18BE0BDE0002101EB4101182606EBED +:103A3000C101A27840580EA910F054FF6178606A65 +:103A4000022901D0012100E0002101EB410106EB38 +:103A5000C1014058A1780844C1F1100110F0C1FF24 +:103A600005208DF82000686A0D90A8690A90ADF8CD +:103A700024A08DF830B0062101706278616A022AB4 +:103A800001D0012200E0002202EB420206EBC2025A +:103A9000401C8958102210F025FF002108A8FFF7CC +:103AA000C1F91220C5F818B028708DF82090686A06 +:103AB0000D900B208DF824000AE43878052870D189 +:103AC0008DF82000686A0D90B8680A900B20ADF858 +:103AD00024000A98072101706178626A022901D0E6 +:103AE000012100E0002101EB4103102101EBC301A2 +:103AF00051580988A0F801106178626A022902D041 +:103B0000012101E02FE1002101EB4103142101EB30 +:103B1000C30151580A6840F8032F4968416059E0D1 +:103B20001920287001208DF8300077E616202870C3 +:103B30008DF830B0002108A8FFF774F9032617E1CB +:103B400014202870B0E6387805282AD18DF8200096 +:103B5000686A0D90B8680A90ADF824A08DF830B06E +:103B600080F800906278616A4E46022A01D00122F4 +:103B700000E0002202EB42021C2303EBC202401CC5 +:103B80008958102210F0AEFE002108A8FFF74AF96C +:103B9000152028708DF82060686A0D908DF82460DB +:103BA0003CE680E0387805287DD18DF82000686AF1 +:103BB0000D90B8680A90ADF82490092101706169F0 +:103BC000097849084170616951F8012FC0F8022055 +:103BD0008988C18020781C28A8D1A1E7E078C00797 +:103BE00002D04FF0060C01E04FF0070C607802287D +:103BF0000AD000BF4FF0000000EB040101F1090101 +:103C000005D04FF0010004E04FF00100F4E74FF061 +:103C100000000B78204413EA0C030B7010F8092FF6 +:103C200002EA0C02027004D14FF01B0C84F800C0B1 +:103C3000D2B394F801C0BCF1010F00D09BB990F849 +:103C400000C0E0465FEACC7C04D028F00106067094 +:103C5000102606E05FEA887C05D528F0020606708B +:103C600013262E70032694F801C0BCF1020F00D079 +:103C700092B991F800C05FEACC7804D02CF001062C +:103C80000E70172106E05FEA8C7805D52CF002064D +:103C90000E701921217000260078D0BBCAB3C3BBB7 +:103CA0001C20207035E012E002E03878062841D16F +:103CB0001A2019E4207801283CD00C283AD020465C +:103CC000FFF7F1F809208DF82000686A0D9031E0C7 +:103CD0003878052805D0062038700326182028706B +:103CE00046E005218DF82010686A0D90B8680A90AA +:103CF0000220ADF8240001208DF830000A980170F0 +:103D0000297D4170394608A8FFF78CF8064618202F +:103D10002870012E0ED02BE001208DF82000686A5B +:103D20000D9003208DF82400287D8DF8250085F85E +:103D300014B012E0287D80B11D202070172028705B +:103D40008DF82090686A0D9002208DF82400394685 +:103D500008A8FFF767F806460AE00CB1FE202070BD +:103D60009DF8200020B1002108A8FFF75BF810E4BF +:103D700013B03046BDE8F08F2DE9F04387B00C4614 +:103D80004E6900218DF80410012025780346022792 +:103D90004FF007094FF0050C85B1012D53D0022DCE +:103DA00039D1FE2030708DF80030606A0590032014 +:103DB0008DF80400207E8DF8050063E0217901294B +:103DC00025D002292DD0032928D0042923D1B17D63 +:103DD000022920D131780D1F042D04D30A3D032D73 +:103DE00001D31D2917D12189022914D38DF804701C +:103DF000237020899DF8041088421BD2082001E01E +:103E0000FC4E02008DF80000606A059057E0707863 +:103E10000128EBD0052007B0BDE8F0831D203070ED +:103E2000E4E771780229F5D131780C29F3D18DF8C6 +:103E30000490DDE7083402F804CB94E80B0082E834 +:103E40000B000320E7E71578052DE4D18DF800C0BD +:103E5000656A0595956802958DF8101094F80480B0 +:103E6000B8F1010F13D0B8F1020F2DD0B8F1030F44 +:103E70001CD0B8F1040FCED1ADF804700E2028701C +:103E8000207E687000216846FEF7CCFF0CE0ADF89C +:103E900004700B202870207E002100F01F00687045 +:103EA0006846FEF7BFFF37700020B4E7ADF8047036 +:103EB0008DF8103085F800C0207E6870277011469C +:103EC0006846FEF7AFFFA6E7ADF804902B70207FA1 +:103ED0006870607F00F00100A870A07F00F01F00F4 +:103EE000E870E27F2A71C0071CD094F8200000F02F +:103EF0000700687194F8210000F00700A871002104 +:103F00006846FEF78FFF2868F062A8883086A87997 +:103F100086F83200A069407870752879B0700D205D +:103F20003070C1E7A9716971E9E700B587B004286D +:103F30000CD101208DF800008DF8040000200591BF +:103F40008DF8050001466846FEF76CFF07B000BD1E +:103F500070B50C46054602F0EBF821462846BDE850 +:103F600070407823002202F039B808B10078704719 +:103F70000C20704770B50C0005784FF000010CD094 +:103F800021702146F1F753F969482178405D884254 +:103F900001D1032070BD022070BDF1F748F9002067 +:103FA00070BD0279012A05D000220A704B78012BDE +:103FB00002D003E0042070470A758A6102799300F9 +:103FC000521C0271C15003207047F0B587B00F46F4 +:103FD00005460124287905EB800050F8046C7078C0 +:103FE000411E02290AD252493A46083901EB8000A3 +:103FF000314650F8043C2846984704460CB1012C41 +:1040000011D12879401E10F0FF00287101D003243F +:10401000E0E70A208DF80000706A05900021019603 +:104020006846FFF7A7FF032CD4D007B02046F0BDA9 +:1040300070B515460A46044629461046FFF7C5FFE7 +:10404000064674B12078FE280BD1207C30B10020C8 +:104050002870294604F10C00FFF7B7FF2046FEF751 +:1040600022FF304670BD704770B50E4604467C2175 +:1040700010F0D9FC0225012E03D0022E04D0052019 +:1040800070BD0120607000E065702046FEF70BFFF8 +:10409000A575002070BD28B1027C1AB10A4600F156 +:1040A0000C01C5E70120704710B5044686B0042016 +:1040B00002F03EF82078FE2806D000208DF800009F +:1040C00069462046FFF7E7FF06B010BD7CB50E46F7 +:1040D00000218DF804104178012903D0022903D072 +:1040E000002405E0046900E044690CB1217C89B139 +:1040F0006D4601462846FFF754FF032809D1324692 +:1041000029462046FFF794FF9DF80410002900D0AF +:1041100004207CBD04F10C05EBE730B40C460146ED +:10412000034A204630BC034B0C3AFEF758BE000051 +:10413000404F0200FC4E020070B50D46040011D045 +:1041400085B12101284610F04CFC10225449284624 +:1041500010F0C8FB524801210838018044804560B6 +:10416000002070BD012070BD70B54D4E0024054685 +:10417000083E10E07068AA7B00EB0410817B91423E +:1041800008D1C17BEA7B914204D10C22294610F070 +:104190007DFB30B1641C30888442EBDB4FF0FF3094 +:1041A00070BD204670BD70B50D46060006D02DB11D +:1041B000FFF7DAFF002803DB401C14E0102070BD7D +:1041C000374C083C20886288411C914201D9042068 +:1041D00070BD6168102201EB0010314610F082FBC7 +:1041E0002088401C20802870002070BD2C48083892 +:1041F000008870472A4908390888012802D0401EE3 +:1042000008800020704770B514460D0018D0BCB16E +:104210000021A170022802D0102811D105E02888C1 +:1042200070B10121A170108008E02846FFF79CFFC3 +:10423000002805DB401CA070A8892080002070BDEC +:10424000012070BD70B5054614460E000BD000204D +:104250003070A878012808D005D91149A1F10801CA +:104260000A8890420AD9012070BD24B128782070B4 +:104270002888000A5070022008700FE064B1496875 +:10428000102201EB00112046103910F02BFB28788A +:1042900020732888000A607310203070002070BDE1 +:1042A0008C0000202DE9F04190460C460746002581 +:1042B000FE48072F00EB881607D2DFE807F0070754 +:1042C000070704040400012500E0FFDF06F814706E +:1042D000002D13D0F548803000EB880191F82700BD +:1042E000202803D006EB4000447001E081F826400E +:1042F00006EB44022020507081F82740BDE8F08191 +:10430000F0B51F4614460E460546202A00D1FFDFB1 +:10431000E649E648803100EB871C0CEB440001EBDA +:104320008702202E07D00CEB460140784B7848706E +:10433000184620210AE092F82530407882F82500BE +:10434000F6E701460CEB410005704078A142F8D138 +:1043500092F82740202C03D00CEB4404637001E05A +:1043600082F826300CEB41042023637082F827107A +:10437000F0BD30B50D46CE4B44190022181A72EB31 +:10438000020100D2FFDFCB48854200DDFFDFC948D4 +:104390004042854200DAFFDFC548401C844207DA0C +:1043A000002C01DB204630BDC148401C201830BD28 +:1043B000BF48C043FAE710B504460168407ABE4AD8 +:1043C00052F82020114450B10220084420F07F40D0 +:1043D000EEF733FC94F90810BDE81040C9E704205B +:1043E000F3E72DE9F047B14E803696F82D50DFF80F +:1043F000BC9206EB850090F8264034E009EB851767 +:104400004FF0070817F81400012806D004282ED012 +:1044100005282ED0062800D0FFDF01F00AF901465A +:1044200007EB4400427806EB850080F8262090F8E0 +:104430002720A24202D1202280F82720084601F03E +:1044400003F92A4621460120FFF72CFF9B484146ED +:1044500000EB041002682046904796F82D5006EBBA +:10446000850090F82640202CC8D1BDE8F0870220B6 +:1044700000E003208046D0E710B58C4C202180342A +:1044800084F8251084F8261084F82710002084F87A +:10449000280084F82D0084F82E10411EA16044F8F5 +:1044A000100B2074607420736073A0738449E077EC +:1044B00020750870487000217C4A103C02F81100F9 +:1044C000491CC9B22029F9D30120EEF7A6FA002031 +:1044D000EEF7A3FA012084F82200EEF7E9FC794810 +:1044E000EEF7FBFC764CA41E20707748EEF7F5FC47 +:1044F0006070BDE81040EEF71DBA10B5EEF73FFA58 +:104500006F4CA41E2078EEF701FD6078EEF7FEFCFC +:10451000BDE8104001F0C5B8202070472DE9F34FE9 +:10452000624C0025803404EB810A89B09AF825009A +:10453000202821D0691E02916049009501EB0017E7 +:10454000391D03AB07C983E80700A18BADF81C1028 +:10455000A07F8DF81E009DF81500A046C8B1022668 +:10456000554951F820400399A219114421F07F4187 +:10457000019184B102210FE00120EEF74EFA0020F4 +:10458000EEF74BFAEEF719FA01F08BF884F82F509A +:10459000A7E00426E4E700218DF81810022801D0D6 +:1045A000012820D1039801190998081A801C9DF848 +:1045B0001C1020F07F4001B10221353181420BD225 +:1045C00003208DF815000398C4F13201401A20F041 +:1045D0007F40322403900CE098F8240018B901F0D1 +:1045E000F8F900284DD0322C03D214B101F04DF867 +:1045F00001E001F056F8324A107820B39346527821 +:10460000039B121B00219DF81840994601281BD0DE +:10461000032819D05FF000008DF81E00002A04DD89 +:10462000981A039001208DF818009DF81C0000B125 +:1046300002210398254A20F07F40039003AB09989C +:1046400001F03BF810B110E00120E5E79DF81D00F6 +:1046500018B99BF80000032812D08DF81C50CDF833 +:104660000C908DF818408DF81E509DF8180058B128 +:1046700003980123811900221846EEF721FA06E07B +:1046800000200BB0BDE8F08F0120EEF7C6F997F9D6 +:104690000C20012300200199EEF712FAF87BC007E5 +:1046A00001D0EEF7F6FA012112E00000500A0020D6 +:1046B000FF7F841E0020A107504F020050080020F9 +:1046C0009E0000208B5E0100E3430100FFFF3F00DE +:1046D00088F82F108AF8285020226946F74810F0F1 +:1046E00046F90120CDE72DE9F05FDFF8D0830646DB +:1046F00008EB860090F82550202D1FD0A8F18000EF +:104700002C4600EB8617A0F50079DFF8B4B305E07E +:10471000A24607EB4A004478202C0AD0EEF71BFA99 +:1047200009EB04135A4601211B1D00F0C6FF0028A7 +:10473000EED0AC4202D0334652461EE0E14808B10A +:10474000AFF30080EEF707FA98F82F206AB1D8F897 +:104750000C20411C891A0902CA1701EB12610912C7 +:10476000002902DD0020BDE8F09F3146FFF7D6FEAC +:1047700008B10120F7E733462A4620210420FFF73D +:10478000BFFDEFE72DE9F041CC4C2569EEF7E3F9E9 +:10479000401B0002C11700EB1160001200D4FFDFC4 +:1047A00094F8220000B1FFDF012784F8227094F80A +:1047B0002E00202800D1FFDF94F82E60202084F8FE +:1047C0002E00002584F82F5084F8205084F82150C2 +:1047D000BD4825600078022833D0032831D000205E +:1047E0002077A068401C05D04FF0FF30A06001206A +:1047F000EEF713F90020EEF710F9EEF70CFAEEF7EA +:1048000004FAEEF7DAF80FF0DBFAB048056005605D +:104810004FF0E0214FF40040B846C1F88002EEF7B7 +:10482000A6FA94F82D703846FFF75DFF0028FAD0FD +:10483000A248803800EB871010F81600022802D03A +:1048400006E00120CCE73A4631460620FFF72AFD74 +:1048500084F8238004EB870090F82600202804D0F9 +:104860009948801E4078EEF757FB207F002803D040 +:10487000EEF7C1F92577657740E5904910B591F8D5 +:104880002D200024803901EB821100BF11F8143073 +:104890002BB1641CE4B2202CF8D3202010BD8C492D +:1048A00001EB041108600020C87321460120FFF7C6 +:1048B000F9FC204610BD10B5012801D0032800D115 +:1048C00071B37E4A92F82D307C4C0022803C04EB80 +:1048D000831300BF13F812400CB1082010BD521C06 +:1048E000D2B2202AF6D3784A48B1022807D0072945 +:1048F00016D2DFE801F01506080A0C0E10000021A0 +:104900000AE01B2108E03A2106E0582104E0772163 +:1049100002E0962100E0B52151701070002010BD1A +:10492000072010BD684810B54078EEF786F980B2D0 +:1049300010BD10B5202811D2604991F82D30A1F199 +:10494000800202EB831414F810303BB191F82D3043 +:1049500002EB831212F81020012A01D0002010BDB2 +:1049600091F82D2001460020FFF79CFC012010BD8E +:1049700010B5EEF7F0F8BDE81040EEF75EB92DE99E +:10498000F0410E464D4F01782025803F0C4607EB45 +:10499000831303E0254603EB45046478944202D078 +:1049A000202CF7D108E0202C06D0A14206D103EB41 +:1049B00041014978017007E000209FE403EB4400C7 +:1049C00003EB450140784870424F7EB127B100218A +:1049D00040F2DD30AFF300803078A04206D127B13D +:1049E00000214FF47870AFF30080357027B10021BB +:1049F00040F2E530AFF3008001207FE410B542685B +:104A00000B689A1A1202D41702EB1462121216D40F +:104A1000497A91B1427A82B92F4A006852F821103E +:104A2000126819441044001D891C081A0002C1179D +:104A300000EB11600012322801DB012010BD0020C4 +:104A400010BD2DE9F04781461C48214E00EB810046 +:104A5000984690F825402020107006F50070154605 +:104A600000EB81170BE000BF06EB04104946001D68 +:104A7000FFF7C4FF28B107EB44002C704478202CCA +:104A8000F2D1297888F8001013E000BF06EB041576 +:104A9000291D4846FFF7B2FF68B988F80040A97B96 +:104AA00099F80A00814201D80020DEE407EB4400B7 +:104AB0004478202CEAD10120D7E40000D00A00205D +:104AC000FFFF3F00000000009E00002000F50040B6 +:104AD0005008002000000000504F02002DE9FC416A +:104AE0000E4607460024FE4D09E000BF9DF8000079 +:104AF00005EB00108168384600F0F3FD01246B4699 +:104B000001AA31463846FFF79CFF0028EED0204628 +:104B1000BDE8FC8170B50446F2480125A54300EBD1 +:104B2000841100EB851040220FF0DCFEEE4E26B122 +:104B3000002140F25F40AFF30080EA48803000EB94 +:104B4000850100EB8400D0F82500C1F8250026B1CE +:104B5000002140F26340AFF30080284670BD2DE98C +:104B6000FC418446DF481546089C00EB85170E463D +:104B700017F81400012803D0022801D00020C7E74D +:104B80000B46DA4A0121604600F097FDA8B101AB5F +:104B90006A4629463046FFF754FF70B1D1489DF868 +:104BA00004209DF80010803000EB85068A4208D072 +:104BB0002B460520FFF7A4FB0BE02A4621460420E4 +:104BC00014E0202903D007EB4100407801E096F87B +:104BD000250007EB440148709DF80000202809D00B +:104BE00007EB400044702A4621460320FFF75AFB9A +:104BF00001208DE706F8254F0120F070F3E7B84952 +:104C000001EB0010001DFFF7D6BB7CB51D46134617 +:104C100004460E4600F1080221461846EEF71AF83F +:104C200094F908000F2804DD1F3820722068401C0A +:104C3000206096B10220AE4951F82610461820682F +:104C40006946801B20F07F40206094F908002844CA +:104C5000C01C1F2803DA012009E00420EBE701AAA9 +:104C6000EDF7F8FF9DF8040010B10098401C00908B +:104C70000099206831440844C01C20F07F406060E7 +:104C80007CBD2DE9FE430C4606460978607990729A +:104C9000207998461546507241B19248803090F87C +:104CA0002E1020290AD00069401D0BE0D4E9022310 +:104CB000217903B02846BDE8F043A6E78D48417846 +:104CC000701D084420F07F47217900222846A36800 +:104CD000FFF79BFF3946284600F003FDD4E9023276 +:104CE00021796846FFF791FF41462846019CFFF76E +:104CF000F5FE2B4622460021304600F0DEFC00285F +:104D000003D13146284600F0ECFCBDE8FE832DE9D6 +:104D1000FE4F814600F0A1FC30B1002799F8000059 +:104D200020B10020BDE8FE8F0127F7E76D4D6E4CE6 +:104D30004FF0000A803524B1002140F2D640AFF395 +:104D4000008095F82D8085F823A0002624B100214D +:104D500040F2DB40AFF300801FB94046FFF7DAFEB8 +:104D6000804624B1002140F2E340AFF30080EDF72C +:104D7000F2FE43466A464946FFF783FF24B100210D +:104D800040F2E940AFF3008095F82E0020280CD0C7 +:104D900029690098401A0002C21700EB1260001245 +:104DA00003D5684600F09DFC012624B1002140F2A5 +:104DB000F340AFF3008095F823000028BBD124B165 +:104DC000002140F2F940AFF30080EDF7C4FE6B46DE +:104DD000464A002100F071FC0028A3D027B94146C3 +:104DE0006846FFF77BFE064326B16846FFF7E3FA05 +:104DF000C9F8080024B1002140F20C50AFF3008044 +:104E000001208FE72DE9F04F89B08B46824600F0F4 +:104E100024FC344C803428B39BF80000002710B1E8 +:104E2000012800D0FFDF304D25B1002140F2825033 +:104E3000AFF300802A49012001EB0A18A946079028 +:104E40005FEA090604D0002140F28A50AFF30080E7 +:104E5000079800F0F9FB94F82D50002084F8230007 +:104E600067B119E094F82E000127202800D1FFDF58 +:104E70009BF800000028D6D0FFDFD4E72846FFF7D4 +:104E800049FE054626B1002140F29450AFF3008060 +:104E900094F823000028D3D126B1002140F29E507F +:104EA000AFF30080EDF757FE2B4602AA5946079054 +:104EB000FFF7E7FE98F80F005FEA060900F001002F +:104EC0008DF8130004D000214FF4B560AFF30080DB +:104ED0003B462A4602A9CDF800A007980CE0000046 +:104EE00050080020500A002000000000FFFF3F0093 +:104EF000504F02009E000020FFF731FE064604EBF3 +:104F0000850090F828000090B9F1000F04D000212E +:104F100040F2AF50AFF3008000F08BFB0790B9F187 +:104F2000000F04D0002140F2B550AFF3008094F898 +:104F30002300002884D1B9F1000F04D0002140F2F1 +:104F4000BD50AFF300800DF1080C9CE80E00C8E9DD +:104F50000112C8F80C304EB35FEA090604D00021F4 +:104F600040F2CA50AFF300800098B84312D094F8D2 +:104F70002E0020280ED126B1002140F2CF50AFF3F1 +:104F800000802846FFF7AFFB20B99BF80000D8B39C +:104F9000012849D0B9F1000F04D0002140F2EC50B3 +:104FA000AFF30080284600F03DFB01265FEA0905CB +:104FB00004D0002140F2F550AFF30080079800F0D4 +:104FC00043FB25B1002140F2F950AFF300808EB1D0 +:104FD00094F82D0004EB800090F82600202809D0DA +:104FE00025B100214FF4C060AFF30080F94840784C +:104FF000EDF792FF25B1002140F20560AFF300808C +:1050000009B03046BDE8F08FFFE7B9F1000F04D0DA +:10501000002140F2D750AFF3008094F82D20514684 +:105020000420FFF73FF9C0E7002E3FF409AF00214D +:1050300040F2E250AFF3008002E72DE9F84FE64D71 +:10504000814695F82D004FF00008E44C4FF0010B1D +:10505000474624B1002140F21360AFF30080584668 +:1050600000F0F2FA85F8237024B100214FF4C360F8 +:10507000AFF3008095F82D00FFF74CFD064695F83C +:10508000230028B1002CE4D0002140F21E604BE048 +:1050900024B1002140F22260AFF30080CE48803876 +:1050A00000EB861111F81900032856D1334605EBA1 +:1050B000830A4A469AF82500904201D1012000E077 +:1050C000002000900AF125000021FFF758FC01465E +:1050D0000098014203D001228AF82820AF77E1B37B +:1050E00024B1002140F22760AFF3008032464946E8 +:1050F0000120FFF7D7F89AF828A024B1002140F248 +:105100003260AFF3008000F094FA834624B10021AE +:1051100040F23760AFF3008095F8230038B1002CDF +:1051200097D0002140F23B60AFF3008091E7BAF1E5 +:10513000000F07D095F82E00202803D13046FFF746 +:10514000D2FAE0B124B1002140F24F60AFF3008009 +:10515000304600F067FA4FF0010824B100214FF407 +:10516000CB60AFF30080584600F06EFA24B1002106 +:1051700040F25C60AFF300804046BDE8F88F002C41 +:10518000F1D0002140F24A60AFF30080E6E7002052 +:10519000EDF71CBC0120EDF719BC8E480078704774 +:1051A0002DE9F0418C4C94F82E0020281FD194F862 +:1051B0002D6004EB860797F82550202D00D1FFDFE6 +:1051C0008549803901EB861000EB4500407807F8EF +:1051D000250F0120F87084F82300294684F82E500A +:1051E000324602202234FFF75DF80020207004E4EC +:1051F0002DE9F0417A4E784C012538B1012821D0B3 +:10520000022879D003287DD0FFDFF0E700F03DFAD7 +:10521000FFF7C6FF207E00B1FFDF84F82150002099 +:10522000EDF7FBFBA168481C04D0012300221846BF +:10523000EDF746FC14F82E0F217806EB01110A68F1 +:10524000012154E0FFF7ACFF0120EDF7E6FB94F8F5 +:10525000210050B1A068401C07D014F82E0F21780F +:1052600006EB01110A68062141E0207EDFF8648127 +:10527000002708F10208012803D002281ED0FFDF12 +:10528000B5E7A777EDF7B7FC98F80000032801D140 +:1052900065772577607D534951F8200094F82010F8 +:1052A00051B948B161680123091A00221846EDF787 +:1052B00007FC022020769AE7277698E784F82050AA +:1052C00000F0E3F9A07F50B198F801006168012374 +:1052D000091A00221846EDF7F3FB257600E0277641 +:1052E00014F82E0F217806EB01110A680021BDE8A1 +:1052F000F041104700E005E036480078BDE8F04195 +:10530000EDF70ABEFFF74CFF14F82E0F217806EBDD +:1053100001110A680521EAE710B52F4C94F82E0018 +:10532000202800D1FFDF14F82E0F21782C4A02EB41 +:1053300001110A68BDE81040042110477CB5264CD5 +:10534000054694F82E00202800D1FFDFA068401CFD +:1053500000D0FFDF94F82E00214901AA01EB0010D4 +:10536000694690F90C002844EDF774FC9DF904009F +:105370000F2801DD012000E0002000990844616849 +:10538000084420F07F41A16094F82100002807D054 +:1053900002B00123BDE8704000221846EDF790BB33 +:1053A0007CBD30B5104A0B1A541CB3EB940F1FD3BD +:1053B000451AB5EB940F1BD3934203D9101A431827 +:1053C0005B1C15E0954211D9511A0844401C434218 +:1053D0000EE000009C000020D00A00200000000029 +:1053E00050080020504F0200FF7F841EFFDF002383 +:1053F000184630BD0123002201460220EDF760BBB4 +:105400000220EDF70ABBEDF7A6BB2DE9FC47BA4C2D +:10541000054694F82E00202800D1FFDF642D58D3D4 +:10542000B64A0021521B71EB010052D394F82E2092 +:10543000A0462046DFF8C89290F82D7009EB0214C0 +:10544000D8F8000001AA28446946EDF703FC9DF94D +:105450000400002802DD0098401C0090A06800991C +:1054600062684618B21A22F07F42B2F5800F30D23D +:1054700008EB8702444692F82520202A0AD009EB3F +:1054800002125268101A0002C21700EB12600012DA +:1054900088421EDBA068401C10D0EDF75CFBA168C1 +:1054A000081A0002C11700EB11600012022810DD7B +:1054B0000120EDF7B2FA4FF0FF30A06020682844D9 +:1054C000206026F07F402061012084F82300BDE8A1 +:1054D000FC870020FBE72DE9F047874C074694F84E +:1054E0002D00A4F1800606EB801010F8170000B91B +:1054F000FFDF94F82D50A046824C24B100214FF4D8 +:105500000760AFF3008040F67C0940F6850A06EBA1 +:10551000851600BF16F81700012818D0042810D0EF +:1055200005280ED006280CD01CB100214846AFF348 +:10553000008020BF002CEDD000215046AFF300804A +:10554000E8E72A4639460120FEF7ACFEF2E74FF0C5 +:10555000010A4FF00009454624B1002140F68C00B5 +:10556000AFF30080504600F06FF885F8239024B127 +:10557000002140F69100AFF3008095F82D00FFF771 +:10558000C9FA064695F8230028B1002CE4D0002182 +:1055900040F697001FE024B1002140F69B00AFF3D6 +:1055A000008005EB860000F1270133463A4626309D +:1055B000FFF7E5F924B1002140F69F00AFF300802A +:1055C00000F037F8824695F8230038B1002CC3D09C +:1055D000002140F6A500AFF30080BDE785F82D60FF +:1055E000012085F82300504600F02EF8002C04D04E +:1055F000002140F6B200AFF30080BDE8F08730B57F +:1056000004463D480D4690F82D003B49803901EB9A +:10561000801010F8140000B9FFDF394800EB0410C7 +:10562000C57330BD344981F82D00012081F8230075 +:10563000704710B5344808B1AFF30080EFF3108025 +:1056400000F0010072B610BD10B5002804D12F483B +:1056500008B1AFF3008062B610BD2D480068C005E8 +:10566000C00D10D0103840B2002804DB00F1E0205B +:1056700090F8000405E000F00F0000F1E02090F841 +:10568000140D400970470820704710B51A4C94F863 +:105690002400002804D1F6F7D3F9012084F824006F +:1056A00010BD10B5144C94F82400002804D0F6F76F +:1056B000F0F9002084F8240010BD10B51C685B6868 +:1056C000241A181A24F07F4420F07F40A14206D803 +:1056D000B4F5800F03D2904201D8012010BD002004 +:1056E00010BDD0E90032D21A21F07F43114421F0DD +:1056F0007F41C0E900317047D00A0020FF1FA10799 +:105700005008002000000000000000000000000021 +:1057100004ED00E02DE9F041044680074FF000055C +:105720004FF001060CD56B48056006600EF0D1F90C +:1057300020B16948016841F48061016024F00204ED +:10574000E0044FF0FF3705D564484660C0F80873A1 +:1057500024F48054600003D56148056024F080443F +:10576000E0050FD55F48C0F80052C0F808735E49E5 +:105770000D60091D0D605C4A04210C321160066148 +:1057800024F48074A00409D558484660C0F800523B +:10579000C0F808735648056024F40054C4F3803000 +:1057A000C4F3C031884200D0FFDF14F4404F14D05E +:1057B00050484660C0F808734F488660C0F80052F1 +:1057C000C0F808734D490D600A1D16608660C0F868 +:1057D00008730D60166024F4404420050AD548483B +:1057E00046608660C0F80873C0F848734548056095 +:1057F00024F400640EF0BEFA4348044200D0FFDFF8 +:10580000BDE8F081F0B50022202501234FEA020413 +:1058100020FA02F1C9072DD051B2002910DB00BFD8 +:105820004FEA51174FEA870701F01F0607F1E027FB +:1058300003FA06F6C7F88061BFF34F8FBFF36F8F8F +:105840000CDB00BF4FEA51174FEA870701F01F0634 +:1058500007F1E02703FA06F6C7F8806204DB01F1DE +:10586000E02181F8004405E001F00F0101F1E021A1 +:1058700081F8144D02F10102AA42C9D3F0BD10B55E +:10588000224C20600846F6F7F2F92068FFF742FF45 +:105890002068FFF7B7FF0DF0B1FE00F01AF90EF027 +:1058A00069FA0EF0B4F9EDF703FBBDE810400DF016 +:1058B00055BF10B5154C2068FFF72CFF2068FFF787 +:1058C000A1FF0EF057FAF6F793FA0020206010BD02 +:1058D0000A207047FC1F00403C17004000C00040F9 +:1058E00004E50140008000400485004000D00040F5 +:1058F00004D5004000E0004000F0004000F500400A +:1059000000B0004008B50040FEFF0FFDA0000020E1 +:1059100070B526490A680AB30022154601244B686F +:105920005B1C4B60092B00D34D600E7904FA06F323 +:105930000E681E420FD0EFF3108212F0010272B611 +:1059400000D001220C689C430C6002B962B6496821 +:105950000160002070BD521C092AE0D3052070BDF3 +:105960004FF0E0214FF48000C1F800027047EFF3E0 +:10597000108111F0010F72B64FF0010202FA00F22D +:105980000A48036842EA0302026000D162B6E7E710 +:1059900006480021016041607047012181400348B1 +:1059A0000068084000D0012070470000A4000020DB +:1059B00001208107086070470121880741600021AC +:1059C000C0F800111848017070471749012008708D +:1059D00070474FF08040D0F80001012803D01248F2 +:1059E0000078002800D00120704710480068C007E8 +:1059F00000D0012070470D480C300068C00700D06F +:105A00000120704709481430006870470749103179 +:105A10000A68D20306D5096801F00301814201D169 +:105A20000120704700207047AC00002008040040AF +:105A30000021017008467047014600200870704739 +:105A4000EFF3108101F0010172B60278012A01D052 +:105A5000012200E000220123037001B962B60AB1FD +:105A6000002070474FF400507047E9E7EFF31081D2 +:105A700011F0010F72B64FF00002027000D162B651 +:105A800000207047F2E700002DE9F04115460E4670 +:105A90000446002700F0E7F8A84215D30023412070 +:105AA0000FE000BF94F84220A25CF25494F8421038 +:105AB000491CB1FBF0F200FB12115B1C84F8421090 +:105AC000DBB2AB42EED3012700F0D9F83846BDE88F +:105AD000F081704910B5802081F800046E490020E3 +:105AE00081F8420081F84100433181F8420081F899 +:105AF0004100433181F8420081F841006748FFF7D7 +:105B000097FF6648401CFFF793FFEDF73FF9BDE8AC +:105B1000104000F0B4B8402070475F4800F0A3B8D0 +:105B20000A4601465C48AFE7402070475A48433078 +:105B300000F099B80A46014657484330A4E740218F +:105B400001700020704710B504465348863000F0BD +:105B50008AF82070002010BD0A4601464E4810B554 +:105B60008630FFF791FF08B1002010BD42F2070018 +:105B700010BD70B50C460546412900D9FFDF4848E5 +:105B80000068103840B200F050F8C6B20D2000F0A6 +:105B90004CF8C0B2864203D2FFDF01E0EDF746F9D0 +:105BA000224629463C48FFF76FFF0028F6D070BD1B +:105BB0002DE9F041394F002506463F1D57F8254095 +:105BC000204600F041F810B36D1CEDB2032DF5D363 +:105BD0003148433000F038F8002825D02E4800F036 +:105BE00033F8002820D02C48863000F02DF800280B +:105BF0001AD0EDF7F1F82948FFF722FFB0F5005F62 +:105C000000D0FFDFBDE8F0412448FFF72FBF94F834 +:105C100041004121265414F8410F401CB0FBF1F221 +:105C200001FB12002070D3E751E7002804DB00F1EC +:105C3000E02090F8000405E000F00F0000F1E02003 +:105C400090F8140D4009704710F8411F4122491C7B +:105C5000B1FBF2F302FB13114078814201D1012024 +:105C600070470020704710F8411F4078814201D3EF +:105C7000081A02E0C0F141000844C0B2704710B5F4 +:105C80000648FFF7DDFE002803D1BDE81040EDF720 +:105C90008EB810BD0DE000E0000B0020B000002029 +:105CA00004ED00E070B5154D2878401CC4B268784A +:105CB000844202D0F6F741F92C7070BD2DE9F04115 +:105CC0000E4C4FF0E02600BFF6F72CF920BF40BF86 +:105CD00020BF677820786070D6F80052EBF790FB11 +:105CE000854305D1D6F8040210B92078B842EBD02C +:105CF000F6F713F90020BDE8F0810000C000002095 +:105D00002DE9F041012528034FF0E0210026C1F8DC +:105D10008001BFF34F8FBFF36F8F1F4CC4F800613A +:105D20000C2000F02CF81D4801680268C94341F3BB +:105D3000001142F010020260C4F804532560491CAF +:105D400000E020BFD4F80021002AFAD019B9016878 +:105D500021F010010160124807686560C4F808531B +:105D6000C4F800610C2000F00AF83846BDE8F08164 +:105D700010B50446FFF7C4FF2060002010BD0028C6 +:105D800009DB00F01F02012191404009800000F171 +:105D9000E020C0F88012704700C0004010ED00E025 +:105DA00008C500402DE9F047FF4C0646FF21A068DA +:105DB00000EB061211702178FF2910D04FF008096E +:105DC00009EB011109EB06174158C05900F0F4F92D +:105DD000002807DDA168207801EB06110870267005 +:105DE000BDE8F08794F8008045460DE0A06809EB17 +:105DF00005114158C05900F0DFF9002806DCA06801 +:105E0000A84600EB08100578FF2DEFD1A06800EB45 +:105E1000061100EB08100D700670E1E7F0B5E24BDB +:105E20000446002001259A680C269B780CE000BFF0 +:105E300005EB0017D75DA74204D106EB0017D75931 +:105E40008F4204D0401CC0B28342F1D8FF20F0BD85 +:105E500070B5FFF7D8FAD44C08252278A16805EB75 +:105E60000212895800F0A8F9012808DD2178A068FD +:105E700005EB01114058BDE87040FFF7BBBAFFF7D2 +:105E80008CF9BDE87040EDF747B82DE9F041C64CFC +:105E90002578FFF7B8FAFF2D6ED04FF00808A268FA +:105EA00008EB0516915900F087F90228A06801DD7A +:105EB00080595DE000EB051109782170022101EBAA +:105EC0000511425C5AB1521E4254815901F58001BC +:105ED00021F07F4181512846FFF764FF34E004231D +:105EE000012203EB051302EB051250F803C0875C97 +:105EF000BCF1000F10D0BCF5007F10D9CCF3080224 +:105F000050F806C00CEB423C2CF07F4C40F806C029 +:105F1000C3589A1A520A09E0FF2181540AE08259B3 +:105F200002EB4C3222F07F4282510022425428463A +:105F3000FFF738FF0C21A06801EB05114158E0681C +:105F400050F82720384690472078FF2814D0FFF7D4 +:105F50005AFA2278A16808EB02124546895800F0E7 +:105F60002BF9012893DD2178A06805EB0111405839 +:105F7000BDE8F041FFF73EBABDE8F081F0B51D463F +:105F800014460E460746FF2B00D3FFDFA00700D0C4 +:105F9000FFDF8548FF210022C0E90247C570067176 +:105FA0000170427082701046012204E002EB00137F +:105FB000401CE154C0B2A842F8D3F0BD70B57A4C91 +:105FC000064665782079854200D3FFDFE06840F817 +:105FD00025606078401C6070284670BD2DE9FF5F29 +:105FE0001D468B460746FF24FFF70DFADFF8B891F0 +:105FF000064699F80100B84200D8FFDF00214FF0B3 +:1060000001084FF00C0A99F80220D9F808000EE0B8 +:1060100008EB0113C35CFF2B0ED0BB4205D10AEB8A +:10602000011350F803C0DC450CD0491CC9B28A42A8 +:10603000EED8FF2C02D00DE00C46F6E799F80310DD +:106040008A4203D1FF2004B0BDE8F09F1446521CE1 +:1060500089F8022008EB04110AEB0412475440F8B7 +:1060600002B00421029B0022012B01EB04110CD091 +:1060700040F801204FF4007808234FF0020C45450A +:1060800013D9E905C90D02D002E04550F2E74146B7 +:1060900006EB413203EB041322F07F42C250691A2F +:1060A0000CEB0412490A81540BE005B9012506EBFB +:1060B000453103EB041321F07F41C1500CEB041177 +:1060C000425499F800502046FFF76CFE99F8000002 +:1060D000A84201D0FFF7BCFE3846B4E770B50C46C5 +:1060E0000546FFF790F9064621462846FFF796FE3B +:1060F0000446FF281AD02C4D082101EB0411A86892 +:106100004158304600F058F800F58050C11700EBB8 +:10611000D14040130221AA6801EB0411515C09B17E +:1061200000EB4120002800DC012070BD002070BD84 +:106130002DE9F04788468146FFF770FE0746FF28A5 +:106140001BD0194D2E78A8683146344605E0BC4274 +:1061500006D0264600EB06121478FF2CF7D10CE08F +:10616000FF2C0AD0A6420CD100EB01100078287059 +:10617000FF2804D0FFF76CFE03E0002030E6FFF7B5 +:106180003FF941464846FFF7A9FF0123A9680246A7 +:1061900003EB0413FF20C854A878401EB84200D176 +:1061A000A87001EB041001E0CC0B002001EB0611FC +:1061B00000780870104613E6081A0002C11700EBB9 +:1061C00011600012704700005E48002101704170AC +:1061D00010218170704770B5054616460C460220A6 +:1061E000ECF776FB5749012008705749F01E08600C +:1061F00056480560001F046070BD10B50220ECF722 +:1062000067FB50490120087051480021C0F8001177 +:10621000C0F80411C0F808114E494FF4000008609E +:1062200010BD48480178D9B14B4A4FF400011160C4 +:106230004749D1F800310022002B1CBFD1F80431AE +:10624000002B02D0D1F8081119B142704FF01001A3 +:1062500004E04FF00101417040490968817002700B +:106260004FF00000ECF734BB10B50220ECF730FB28 +:1062700034480122002102703548C0F80011C0F8EE +:106280000411C0F80811026010BD2E4801780029E1 +:1062900004BF407870472E48D0F80011002904BF91 +:1062A00002207047D0F8001100291CBFD0F804115B +:1062B000002905D0D0F80801002804BF012070474C +:1062C000002070471F4800B50278214B4078C82154 +:1062D000491EC9B282B1D3F800C1BCF1000F10D081 +:1062E000D3F8000100281CBFD3F8040100280BD00C +:1062F000D3F8080150B107E0022802D0012805D0E8 +:1063000002E00029E4D1FFDF002000BD012000BD34 +:106310000C480178002904BF807870470C48D0F8F9 +:10632000001100291CBFD0F80411002902D0D0F8B8 +:10633000080110B14FF01000704708480068C0B263 +:1063400070470000C200002010F5004008F5004032 +:1063500000F0004004F5014008F5014000F4004061 +:106360004C48002101704170704770B506461446D4 +:106370000D460120ECF7ACFA47480660001D0460AA +:10638000001D056070BD70B5424901250D7040EAE1 +:106390000241424A41F080711160414C0026C4F82C +:1063A0000461404A4FF040711160002802BFC4F8F8 +:1063B0000052256070BD012818BFFFDFC4F80062DD +:1063C00025604FF000703849086070BD3148017891 +:1063D00079B1344A4FF0407111603149D1F804214C +:1063E0000021002A08BF417002D0304A1268427072 +:1063F00001700020ECF76CBA26480178002904BF30 +:10640000407870472648D0F80401002808BF70473C +:1064100026480068C0B27047002808BF704730B5F2 +:106420001C480078002808BFFFDF1D48D0F8041181 +:10643000002918BF30BD0224C0F80443DFF870C043 +:10644000DCF80010C1F30015DCF8001041F0100179 +:10645000CCF80010D0F80411002904BF4FF400411B +:106460004FF0E02207D100BFC2F8801220BFD0F861 +:106470000431002BF8D02DB9DCF8001021F0100108 +:10648000CCF80010C0F8084330BD054901208860F1 +:1064900070470000C500002008F5004004F50040EA +:1064A00000F0004008F5014004F5014000F4004010 +:1064B00010ED00E010B5FF48002401214470047085 +:1064C00044728472C17280F82540C46284631830BB +:1064D0000EF0B8FBF849601E0860091D0860091D30 +:1064E0000C60091D0860091D0C60091D0860091D6C +:1064F0000860091D0860091D0860091D0860091D64 +:106500000860091D0860091D0860091D086010BDAC +:10651000EA48016801F00F01032904BF0120704718 +:10652000006800F00F00042804BF0220704700B587 +:10653000FFDF012000BD10B5DE4C0168A16141689C +:10654000E161007A84F82000207E48B1207FF7F7CF +:1065500051FEA07E011C18BF0121207FF7F73EFEEF +:10656000607E002808BF10BD607FF7F743FEE07E25 +:10657000011C18BF0121607FBDE81040F7F72EBE57 +:1065800030B500250446012904D002290CBF4FF084 +:106590008075FFDF45F4847040F48010C8490860BE +:1065A00044F44030091D40F00070086030BD30B543 +:1065B00000250446012904D002290CBF4FF0807544 +:1065C000FFDF45F4847040F48010BD49086044F456 +:1065D0004030091D40F000700860BA48D0F8000152 +:1065E000002818BFFFDF30BD2DE9F04102254FF034 +:1065F000E02801240026C8F88051BFF34F8FBFF375 +:106600006F8FB148066004600DF063FAAF4F18B1A8 +:10661000386840F4806038600DF031FA38B138687D +:1066200020F0770040F0880040F0004038600DF026 +:106630003EFA30B1A648016821F47F4141F4B051DF +:106640000160A549A34808600DF031FA994948B1A5 +:10665000A24881F821500560A24AA1481060121F8B +:10666000A14810604FF01020806CB0F1FF3F04D0C3 +:106670009E4A136860F3174313609D4A40F25B60C3 +:106680001060121F40F203101060101F04608B4A4C +:10669000032010609748046091F82120002A14BF5D +:1066A0004FF4C022944A42F46022944B1A60954BF6 +:1066B000934A1A601B1F944A1A60026822F44072BF +:1066C0000260026842F480720260C8F880527D4A1B +:1066D0001020C2F8040381F83160CE62BDE8F08179 +:1066E0008A48016821F0010141F080710160704722 +:1066F000704A0368C2F802308088D08011727047F7 +:106700006C4B10B51A7A8A4208D101460622981CB1 +:106710000EF0BCF8002804BF012010BD002010BD01 +:10672000644890F825007047624A517010707047B5 +:10673000F0B50546800000F1804000F580508B8860 +:10674000C0F820360B78D1F8011043EA0121C0F8D7 +:10675000001605F10800012707FA00F66C4C002A24 +:1067600004BF2068B04304D0012A18BFFFDF2068AF +:1067700030432060206807FA05F108432060F0BD2F +:106780000DF04EBC4B4890F832007047614AC1781A +:10679000116000686049000208607047252808BF42 +:1067A00002210ED0262808BF1A210AD0272808BFA8 +:1067B000502106D00A2894BF0422062202EB400191 +:1067C000C9B2564A116056490860704739498A7AF9 +:1067D000012A49D0022A18BF70474B7E002B08BF00 +:1067E0007047012A44D0CB7E4A7F13F1000C18BFBA +:1067F0004FF0010C242318444A4B18604A4B0020E8 +:10680000C3F84C0110028CF0010240EA025040F043 +:10681000031291F82000830003F1804303F5C04385 +:10682000C3F81025414A8B7F02EB8000DA0002F1A9 +:10683000804202F5F832C2F81405DFF8F4C0C2F85D +:1068400010C5C97FCA0002F1804202F5F832C2F8D1 +:1068500014052D48C2F81005012000FA03F2884003 +:1068600034491043086070470B7E002BB9D1704744 +:106870008B7E0A7F002B14BF4FF0010C4FF0000CF1 +:106880001123B8E72DE9F0410E4E804603200D4656 +:10689000C6F80002074F97F82100002814BF4FF4F4 +:1068A000C02015482349086028460DF0E7FB012465 +:1068B00042E00000DC0B0020000E004010150040FC +:1068C0001415004000100040FC1F00403C17004021 +:1068D000401700402C0000897817004060150040E8 +:1068E000448000409CF50140281100408C15004078 +:1068F00038150040501600400000040408F501401F +:1069000040800040A4F50140101100407417004081 +:1069100040160040241500401C150040081500409A +:10692000541500404C85004000800040006000404D +:106930004C81004004F50140B8F1000F03D0B8F1DC +:10694000010F16D018E00DF0B2F878B1F94A1168CD +:106950005006022DD0F820030CBFC0F30660C0F330 +:10696000062021F4FE4141EA00201060BC72346030 +:1069700002E00220B8727460EF48C464EF48006817 +:106980002946BDE8F04121E72DE9F0410D46EC49EB +:1069900007460320C1F80002EA4C94F821000028C1 +:1069A00014BF4FF4C020E848E84E306028460DF090 +:1069B00065FB17B1012F1CD024E00DF078F878B1F9 +:1069C000DC490A684806022DD0F820030CBFC0F34A +:1069D0000660C0F3062022F4FE4242EA002008606E +:1069E0000120A072A06B40F48010A0634FF48010CF +:1069F00007E00220A072A06B40F40010A0634FF4E7 +:106A000000103060ECF742F92946BDE8F041DDE6C0 +:106A10002DE9F74FCA4C804682B003200E46C4F8D9 +:106A20000002C84D95F82100002814BF4FF4C02083 +:106A3000C548C64F386004980DF020FBDFF810A35E +:106A40004FF00109B8F1000F47D0B8F1010F18BF9E +:106A5000FFDF5BD0BF480660C049BF480860A86B35 +:106A600040F40020A863D4F800824FF0100AC4F864 +:106A700008A30025C4F80052B9484FF4802BC0F891 +:106A800000B0C4F80051C4F80C51C4F81051C4F857 +:106A90000451C4F81451C4F818510DF008F8002836 +:106AA00018BFC4F82851AF4800680090C4F80082AD +:106AB000C7F800B0C4F804A34FF4002038609E4823 +:106AC000C0F84C909D480068B04228BFFFDF3046B8 +:106AD000049905B0BDE8F04F78E60CF0E8FF80B10E +:106AE000944A0498116853060228D3F820030CBF77 +:106AF000C0F30660C0F3062021F4FE4141EA002005 +:106B00001060CAF8004085F80A90A3E79648CAF8D2 +:106B100000000220A8729DE72DE9F041894C06464D +:106B2000002594F8310017468846002808BFFFDF8B +:106B300016B1012E16D021E094F83100012808D0BA +:106B400094F83020394640460DF0A5FAE16A451820 +:106B500014E094F830103A4640460DF0DAFAE16A53 +:106B600045180BE094F8310094F8301001283A46AB +:106B7000404609D00DF0F5FAE16A45183A46294633 +:106B80003046BDE8F04143E70DF0A5FAE16A45184B +:106B9000F4E72DE9F84F6A4CD4F8000220F00B0915 +:106BA000D4F804034FF0100AC0F30018C4F808A387 +:106BB0000026C4F80062634D95F82100002814BF38 +:106BC0004FF4C020604840F4602165480160A97A14 +:106BD0000127012902D0022903D015E0297E11B92D +:106BE00012E0697E81B1A97FEA7F07FA01F107FA15 +:106BF00002F21143016095F82000800000F180400E +:106C000000F5C040C0F81065FF208DF80000C4F802 +:106C10001061276105E000BF9DF80000401E8DF85F +:106C200000009DF8000018B1D4F810010028F3D03E +:106C30009DF80000002808BFFFDFC4F810610CF0C9 +:106C400036FF002818BFC4F828616E72AE72EF726A +:106C5000C4F80092B8F1000F18BFC4F804A3BDE84F +:106C6000F88FFF2008B58DF8000035480021C0F8E6 +:106C700010110121016104E09DF80010491E8DF8FA +:106C800000109DF8001019B1D0F810110029F3D0B0 +:106C90009DF80000002808BFFFDF08BD00683349E9 +:106CA00020F07F40086070474FF0E0200221C0F8DC +:106CB000801100F5C070BFF34F8FBFF36F8FC0F826 +:106CC000001170474FF0E0210220C1F80001704729 +:106CD00027490870704727490860704770B5054616 +:106CE000EBF7D4FF174C2844E16A884298BFFFDFD6 +:106CF00001202074EBF7CAFF4119616194F821006B +:106D000040B1084460610E48D0F8001241F04001E3 +:106D1000C0F8001208490020C1F844011649606912 +:106D20000860A06B094940F48000A0634FF4800024 +:106D3000086070BD88150040008000404C85004010 +:106D400000100040DC0B00200000040404F50140AA +:106D5000ACF501404885004048810040A8F501405D +:106D600008F5014018110040041000403C15004097 +:106D7000C7000020041500404485004070B505465A +:106D80000E460220FE4C2074FE48016801F00F01FF +:106D9000032908BF012207D0006800F00F00042873 +:106DA0000EBF0222FFDF012294F8310094F8301068 +:106DB00001281AD028460DF01BFA606194F82100D2 +:106DC00048B1616908446061EF48D0F8001241F0B1 +:106DD0004001C0F80012ED490020C1F8440161698A +:106DE000E06A0844EA49086070BD334628460DF061 +:106DF000CDF9E2E7E7494FF480000860E048816B95 +:106E000021F480018163002101747047C20002F106 +:106E1000804202F5F832E04BC2F81035C2F8141582 +:106E200001218140DD480160D548826B11438163B7 +:106E30007047D64801214160C1600021C0F844116B +:106E4000D3480160CE48C162704710B504460CF0CB +:106E50002EFE00281CBFCA4880F82140D04804609C +:106E6000C948D0F8001241F04001C0F8001210BD2E +:106E7000C54810B5D0F8001221F04001C0F800124A +:106E80000CF015FEC649002818BF0220086010BD8E +:106E9000BD48D0F8001221F01001C0F80012012105 +:106EA00081617047B8480021C0F81C11D0F8001269 +:106EB00041F01001C0F800127047B34981B0D1F819 +:106EC0001C21012A1EBF002001B07047B54A12687C +:106ED00002F07F02524202700020C1F81C01B24849 +:106EE00000680090012001B07047F0B517460C0013 +:106EF000064608BFFFDFA24D14F0010F2F731CBF21 +:106F0000012CFFDF002E0CBF012002206872EC7202 +:106F100001281CBF0228FFDFF0BD2DE9F84FDFF884 +:106F20008C9299F80000042828BFFFDFDFF85CA2EC +:106F3000DAF84C119748924C00264FF00108D9B16D +:106F4000A17A012902D0022903D015E0217E11B9CE +:106F500012E0617E81B1A17FE27F08FA01F108FAB7 +:106F600002F21143016094F82010890001F1804180 +:106F700001F5C041C1F810658648A16B0160A663A8 +:106F8000217C002019B1DAF84411012900D0002138 +:106F9000A27A7D4F012A6CD0022A72D0D7F8101144 +:106FA00001290CBF1021002141EA00058048016839 +:106FB00011F0FF0F03D0D7F81411012900D00021E0 +:106FC00084F83210006810F0FF0F03D0D7F81801D2 +:106FD000012800D0002084F833007648006884F847 +:106FE0003400FFF752F9012818BF002084F835005B +:106FF000C7F80061C7F80C61C7F81061C7F80461F1 +:10700000C7F81461C7F818610CF051FD002818BFCB +:10701000C7F828616848006800905C48C0F844617F +:1070200066480068DFF868A10090DAF80000A06206 +:1070300094F8211000291CBF401AA0626048006823 +:10704000E0625048016801F00F01032908BF0120E8 +:1070500007D0006800F00F0004280EBF0220FFDFF9 +:10706000012084F83000A07A84F83100022824D16D +:1070700016E0D7F80C01012814BF002008208DE786 +:10708000FFE7D7F80C01012814BF002002204D4A69 +:107090001268012A14BF04220022104308437DE72E +:1070A000607850B14849096809780840217831EA88 +:1070B000000008BF84F8248001D084F8246015F013 +:1070C000020F0AD0EBF7E2FDA16A404A081A99F8CC +:1070D0000010490852F82110884715F0010F18BF19 +:1070E0004FF0000B12D000BFEBF7D0FDE16A99F82A +:1070F0000020081A364951F822205946904700BF0F +:1071000099F8000010F0010F2FD10CE015F0020FDC +:1071100018BF4FF0010BE7D115F0080F18BF4FF063 +:10712000020BE1D1ECE7DFF8A0B0DBF8000000785B +:1071300000F00F00072828BF84F8256015D2DBF87F +:107140000000062200F10901A01C0DF09FFB40B9D0 +:10715000207ADBF800100978B0EBD11F08BF0120BE +:1071600001D04FF0000084F82500E17A4FF00000D4 +:1071700011F0020F1CBF15F0020F15F0040F29E0EB +:10718000DC0B002010150040001000400080004083 +:107190004485004008F501400411004004F5014019 +:1071A00060150040481500401C110040C700002039 +:1071B0004016004010140040181100404481004067 +:1071C000408500400014004004150040684F020054 +:1071D000B04F020019D111F0100F1CBF94F83320EA +:1071E000002A02D094F835207AB111F0080F1CBFA4 +:1071F00094F82420002A08D111F0040F02D094F84A +:10720000251011B115F0010F01D04FF00100617A86 +:1072100019B1A0B1FFF7BDFC17E094F821000028D8 +:1072200014BF4FF4C021964996480160D7F8000278 +:1072300020F00300C7F8000284F80B8005E0012964 +:107240000DD0022918BFFFDF12D015F0010F1AD0A0 +:107250008D4899F8001050F82100804734E066729C +:1072600084F80B8084F80A809621227B002007E0B6 +:10727000667284F80B800220A072227B9621012086 +:10728000FFF74AFCE1E715F0020F08D07F4999F8B3 +:10729000002028EA950051F82210884714E015F0E4 +:1072A000080F06D07A4899F8001050F8210080475E +:1072B0000AE015F0100F08BFFFDF05D0754899F8F8 +:1072C000001050F821008047A07A022818BFBDE8BE +:1072D000F88F207C002808BFBDE8F88F6E49C1F800 +:1072E0004461022814D0012818BFFFDFE16A6069F9 +:1072F000884298BFFFDF6069CAF80000A06B674949 +:1073000040F48000A0634FF480000860BDE8F88F6F +:107310006169E06A0844EFE738B50024604D002851 +:1073200018BFC5F800425F4800685F498A7A012AA1 +:1073300002D0022A03D018E00A7E12B915E04A7E74 +:107340009AB18B7F012291F81FC002FA03F302FA6F +:107350000CF21A434B4B1A6091F82010890001F18E +:10736000804101F5C041C1F810450121FFF72EFA17 +:10737000C5F80041C5F80C41C5F81041C5F80441F5 +:10738000C5F81441C5F818410CF091FB002818BF4E +:10739000C5F8284145480068009038BD012804BF61 +:1073A00028207047022804BF1820704700B5FFDF6F +:1073B000282000BD012804BF41F6A47070470228B0 +:1073C00004BF41F28830704700B5FFDF41F6A4707A +:1073D00000BD10B5022807D001280EBF42F6CE30FE +:1073E000FFDF41F66A0010BD0CF03CFB30B90CF039 +:1073F00046FB002808BF41F6583001D041F2643006 +:1074000041F29A01084410BD012812BF0228002051 +:10741000704700B5FFDF002000BD21490820C1F8FA +:107420000002214890F82110002914BF4FF4C02118 +:107430001349144A11601F4A1D491160121D1E494B +:1074400011601F4A1D491160121D1E491160134A27 +:107450004FF4602111600221817270471A4801685F +:1074600003291BBF0068022801200020704716482E +:1074700001680B291BBF00680A2801200020704703 +:107480000000040408F50140704F0200804F020024 +:10749000904F0200A04F02000080004004F5014020 +:1074A0000010004040850040DC0B00201811004017 +:1074B0000011004098F50140141000401C110040DC +:1074C000A8F50140101000405015004010B53F488D +:1074D00022210DF086FA3D480024017821F01001A8 +:1074E0000170012105F0CAFE39494FF6FF7081F89D +:1074F0002240888437490880488010BD704734494D +:107500008A8C824218BF7047002081F822004FF613 +:10751000FF70888470472D49016070472D490880AD +:1075200070472B498A8CA2F57F43FF3B03D0002193 +:1075300001600846704791F822202549012A1ABFA8 +:107540000160012000207047214901F1220091F8DB +:107550002220012A04BF00207047012202701D482A +:1075600000888884104670471A4948807047184937 +:10757000184B8A8C5B889A4206D191F82220002A07 +:107580001EBF016001207047002070471048114A5B +:10759000818C5288914209D14FF6FF71818410F895 +:1075A000221F19B10021017001207047002070478F +:1075B0000748084A818C5288914205D190F82200F0 +:1075C00000281CBF00207047012070473E0C00209F +:1075D000180C0020C80000207047574A012340B112 +:1075E000012818BF704713700868906088889081E0 +:1075F000704753700868C2F802008888D0807047CE +:107600004D4A10B1012807D00EE0507860B1D2F891 +:1076100002000860D08804E0107828B19068086003 +:10762000908988800120704700207047424910B13E +:10763000012803D006E0487810B903E0087808B1C3 +:10764000012070470020704730B58DB00C460546CC +:107650000D2104A80DF0E7F9E0788DF81F002079DE +:107660008DF81E0060798DF81D002868009068680C +:107670000190A8680290E868039068460CF058F8FA +:1076800020789DF82F1088420CD160789DF82E103C +:10769000884207D1A0789DF82D10884202BF0120B2 +:1076A0000DB030BD00200DB030BD30B50C460546E4 +:1076B0008DB04FF0030104F1030012B1FEF73AFA66 +:1076C00001E0FEF756FA60790D2120F0C00040F08D +:1076D0004000607104A80DF0A6F9E0788DF81F0055 +:1076E00020798DF81E0060798DF81D0028680090C3 +:1076F00068680190A8680290E868039068460CF0FA +:1077000017F89DF82F0020709DF82E0060709DF8EE +:107710002D00A0700DB030BD10B5002904464FF00B +:10772000060102D0FEF706FA01E0FEF722FA6079C0 +:1077300020F0C000607110BDCC000020FE48406801 +:1077400070472DE9F0410F460646014614460120D8 +:1077500005F0EFF9054696F85500FFF72BFE4AF2C3 +:10776000B12108444FF47A71B0FBF1F0718840F216 +:1077700071225143C0EB4100001BA0F2653402F0BE +:10778000A9FF002818BF1E3CAF4234BF2846384628 +:10779000A04203D2AF422CBF3C462C467462BDE8E7 +:1077A000F0812DE9FF4F95B0044690F855008946C9 +:1077B0001090DDE9171008431190E0480026057885 +:1077C0000C2D28BFFFDFDE4F37F8158094F8745179 +:1077D0000C2D28BFFFDFDA4830F8150040441FFAAF +:1077E00080F894F865000D280CBF012000200B9054 +:1077F0001798002804BF94F8140103282BD10B9884 +:1078000048B3B4F89601484525D1D4F81C01C4F812 +:107810000801608840F2E2414843C4F80C01B4F822 +:107820006201B4F8EE100844C4F81001204602F0DA +:107830005BFFB4F89A01E08294F898016075B4F89F +:107840009C016080B4F89E01A080B4F8A001E080A3 +:10785000022084F81401D4F86C010F90D4F8680168 +:107860000D90B4F8EE70B4F86001D4F85C11059195 +:10787000179921B194F8281151B100F0DDB804F145 +:10788000E801099174310A9104F5A475091D07E016 +:1078900004F59E710991091D0A9104F59675091D5B +:1078A0000C91B4F85810A9EB0000A9EB01010FFAF4 +:1078B00080FA0FFA81FBBAF1000F05DAD4F858010B +:1078C00005900120DA461190002004909B48007931 +:1078D000E8B3F4F7F1F9D0B3B4F80001022836D3D5 +:1078E00094F81401022832D094F82B0178BB94F854 +:1078F0007481B8F10C0F28BFFFDF914830F81800F1 +:1079000000F5C8601FFA80F894F8140101287DD0B2 +:10791000608840F2E24141430020B8F1000F05D0F9 +:10792000884808FB01F1B1FBF0F0401C07EB0B01AC +:10793000A1EB0A02D4F81C1180B2431A049902FB8D +:1079400003110491C4F81C01012084F82B0194F860 +:107950001401002874D0012800F03B82022800F0B6 +:107960008E81032818BFFFDF00F068820498311A67 +:107970000598FCF7FEFC0A99012640F27122086086 +:107980000C98A0F80090002028702E710A980068CA +:10799000A8606188D4F81C015143C0EB41006749DD +:1079A000A0F235300862C969814287BF0999086031 +:1079B000099801600998616A0068084400F2A510FE +:1079C000E86002F087FE10B1E8681E30E8606E7172 +:1079D000B4F8D800A0EB090000B20028C4BF03200F +:1079E00068710B980028189800F07F82D8B100BF0A +:1079F000B4F8001100290CBF0020B4F80201A4F86B +:107A0000020194F80421401C504300E019E0884230 +:107A100009D26879401E002805DD6E71B4F80201B4 +:107A2000401CA4F802011798002800F0818294F805 +:107A30002801002800F0788219B00220BDE8F08FFC +:107A400065E094F86800032857D03B4894F8551037 +:107A500090F8300005F083F9E18A40F27122514339 +:107A600000EB41010020D4F80C21B8F1000F06D042 +:107A7000344808FB02F2B2FBF0F000F10100D4F848 +:107A80000831D4F81021A0EB030C049BC4F80801C2 +:107A900002FB0C334FF0000007D000BF294808FB61 +:107AA00001F1B1FBF0F000F10100D4F81811C4F8B5 +:107AB0001801A0EB01011944608840F2E24300FB89 +:107AC00003F34FF0000006D01E4808FB03F3B3FB9E +:107AD000F0F000F1010007EB0B03A3EB0A03A3EBAB +:107AE0000202D4F81C31A2F10102A0EB030302FB55 +:107AF00003110491C4F81C0126E7E18A40F27122C7 +:107B0000D4F80C0101FB02F100EB4101AAE70D984A +:107B1000002808BFFFDF94F85510074890F83000A0 +:107B200005F01DF90790E18A40F271204143079862 +:107B300000EB4101002007E0600C0020DC00002089 +:107B4000C04F020040420F00B8F1000F07D000BF45 +:107B5000FF4808FB01F1B1FBF0F000F10100C4F8AF +:107B60001801618840F2E24001FB00F14FF0000093 +:107B700006D0F74808FB01F1B1FBF0F000F101007D +:107B8000C4F81C0186B221464FF00100D4F828A0A9 +:107B900004F0CFFF074694F85500FFF70BFC4AF2BC +:107BA000B12B58444FF47A78B0FBF8F0618840F27A +:107BB00071225143C0EB4100801BA0F2653602F0F8 +:107BC00089FD002818BF1E3EBA4534BF38465046CE +:107BD000B04203D2BA452CBF56463E46666294F880 +:107BE0005500FFF711FC00F2E140B0FBF8F10D98F1 +:107BF0000E1894F85500FFF707FC074694F8550057 +:107C0000FFF7D8FB38444AF2AB310844B0FBF8F137 +:107C1000E28A40F2712042430798D4F8187100EBD1 +:107C20004200401AC01B3044A0F12006617D40F2A2 +:107C3000E24011FB00FA94F855000090FFF7BAFB00 +:107C40005844B0FBF8F000EB470000EB0A0700983F +:107C5000FFF7A4FB384400F16201BE48C16194F80B +:107C60005500FFF7D1FB00F2E140B0FBF8F10D98B1 +:107C70000844301AB0F53D7F98BFFFDF76E6E18A11 +:107C800040F27122D4F80C01514300EB4101002075 +:107C9000B8F1000F07D000BFAD4808FB01F1B1FB00 +:107CA000F0F000F10100C4F81801608840F2E241F0 +:107CB00000FB01F14FF0000006D0A54808FB01F1E0 +:107CC000B1FBF0F000F10100C4F81C0186B22146BE +:107CD0004FF00100D4F828A004F02BFF804694F860 +:107CE0005500FFF767FB4AF2B12B00EB0B014FF495 +:107CF0007A70B1FBF0F0618840F271225143C0EB21 +:107D00004100801BA0F2653602F0E4FC002818BF99 +:107D10001E3EC24534BF40465046B04203D2C24523 +:107D20002CBF5646464666620FBB1898F8B194F8C9 +:107D300055603046FFF73EFB00EB0B014FF47A70C5 +:107D4000B1FBF0F0D4F81811E28A084440F2712334 +:107D5000D4F80C115A4301EB42010F1A3046FFF7D9 +:107D60001DFB0F99081A3844A0F120060AE0E28AA8 +:107D700040F27121D4F80C01514300EB4100D4F8DA +:107D80001811461AD4F81021D4F80811D4F81801A3 +:107D900001FB020A607D40F2E24110FB01F894F819 +:107DA00055000746FFF706FB00EB0B014FF47A7016 +:107DB000B1FBF0F000EB4A0080443846FFF7EEFAE2 +:107DC000404400F160016348C161012084F814015E +:107DD000CCE5618840F27122D4F81C015143C0EB1C +:107DE000410101FB0AF6D4F8101107EB0B02521AFD +:107DF000D4F808C1D4F81831521E0CFB013102FB33 +:107E0000001A607D40F2E24110FB01F894F8550041 +:107E10000746FFF7CFFA4AF2B12101444FF47A70D6 +:107E2000B1FBF0F000EB4A0080443846FFF7B6FAA9 +:107E3000404400F160014748C16197E5618840F224 +:107E40007122D4F81C015143C0EB410000FB0AF63B +:107E500094F8640024281CBF94F8650024280BD1F2 +:107E6000B4F89601A9EB000000B2002804DB94F8F6 +:107E70009901002818BF10901198D8B1D7B90F9860 +:107E800000281ABF0D980028FFDF94F85500FFF76F +:107E900091FA4AF2B12101444FF47A70B1FBF0F04B +:107EA000361A94F85500FFF779FA0F99081A3044FA +:107EB000A0F12006D4F81C1107EB0B0000FB01F722 +:107EC0001098FFF777FA4AF2B12101444FF47A7023 +:107ED000B1FBF0F000EB47071098FFF75FFA38446A +:107EE00000F160011B48C16140E500287FF480ADCE +:107EF00094F8140100283FF496AD618840F2712295 +:107F0000D4F81C015143C0EB4101284604F08CFD1C +:107F10000004000C3FF487AD2299002918BF0880A7 +:107F2000012019B0BDE8F08F94F86401FDF785F8E1 +:107F300094F864012946FCF765FF20B1179880F09A +:107F4000010084F8290119B00020BDE8F08F00007D +:107F500040420F00DC00002070B5FE4C607A002823 +:107F60001CBF002070BD94F8340038B1A16B606A6A +:107F7000884203D9F7F74DFB002070BDA06AE8B135 +:107F8000F6F7E6FB0546F6F767FA284442F2107169 +:107F90004618FCF7EDFC05462946E06AFDF701FAB4 +:107FA000E562A16A8219914224BF081AA06205D233 +:107FB0000120A062F7F72DFB002070BD012070BDED +:107FC000F8B5E44C02460025E34E6168606A052A74 +:107FD0004ED2DFE802F003353A3D4400A07A002794 +:107FE00060B101216846FDF7A5FD9DF8000042F251 +:107FF00010710002B0FBF1F201FB1207F6F7A8FBCB +:10800000C119A069FCF7B5F9A0612574032060755A +:108010007079002814BF012003202075607A38B9D8 +:10802000207B04F11001FCF7EDFE002808BFFFDF04 +:108030002584FCF7A7FBB079BDE8F840EAF76CBFF0 +:10804000BDE8F840002100F0B9BDC1F86801F8BDF5 +:10805000D1F86801BDE8F840012100F0AFBD84F817 +:108060003450FCF78FFBB079BDE8F840EAF754BF15 +:10807000FFDFF8BD2DE9F04FDFF8D882044683B06A +:1080800098F800008B4601270025B34E4FF00209F7 +:10809000032804BF98F80C00A04240F0E780D8F80D +:1080A0000400B06198F80000032818BFFFDF032424 +:1080B000BBF1080F80F0D680DFE80BF0040F313100 +:1080C0002CD4D4CBC8F82450F6F712FF002818BFE0 +:1080D000FFDFB47003B0BDE8F08FF6F7BDF90446DA +:1080E000D8F81C00A04228BFC8F81C4005D2201AAE +:1080F000FDF78BF9C8F81C4038B1F7F772FA002881 +:1081000018BFFFDF03B0BDE8F08F03B00020BDE86B +:10811000F04F55E703B0BDE8F04FFEF7FEBE7079B3 +:108120004FF0010A002814BF0120032088F8140032 +:1081300088F8105098F8340042F2107B68B14FF480 +:108140007A71D8F81800FCF714F9C8F81800002163 +:1081500008F1100004F068FC1CE001216846FDF7FE +:10816000DFFC9DF800000002B0FBFBF10BFB110AE5 +:10817000F6F7EEFA00EB0A018A46D8F81800FCF789 +:10818000F8F8C8F81800514608F1100004F04CFC4B +:1081900000F1010AB8F82000411C0A293CBF5044F4 +:1081A000A8F82000D8F8040038B1B8F82000401C26 +:1081B0000A2828BF88F8159001D288F8154098F849 +:1081C000090070BB98F8340040B1D8F83810D8F8DE +:1081D0002400884202D9F7F71CFA22E0D8F82800D8 +:1081E00058B3F6F7B5FA0446F6F736F9204400EB33 +:1081F0000B09FCF7BDFB04462146D8F82C00FDF71F +:10820000D0F8C8F82C40D8F8281000EB09029142A9 +:1082100024BF081AC8F828000FD2C8F82870F7F74A +:10822000F8F998F80C00FCF784FB88F80050B07956 +:1082300003B0BDE8F04FEAF76FBE98F80C0008F104 +:108240001001FCF7DFFD002808BFFFDF03B0BDE829 +:10825000F08F98F80C00FCF76CFB88F8005003B026 +:10826000BDE8F08FFFDF03B0BDE8F08F202C28BF02 +:10827000FFDFDFF8E880072138F81400FAF736FA54 +:108280005FEA000A08BFFFDF202C28BFFFDF38F8B5 +:108290001400BAF80010884218BFFFDF5446C6F831 +:1082A00018A04FF0200ABBF1080F80F04981DFE8E9 +:1082B0000BF0049EA8A8A1F3F2F1C4F8685135812F +:1082C000C4F86C5194F8290138B9FCF751FBD4F883 +:1082D0003411FDF766F800281BDCB4F82611B4F859 +:1082E0005800814206D1B4F8DC10081AA4F8DE0068 +:1082F000204605E0081AA4F8DE00B4F8261120464E +:10830000A4F85810D4F85011C4F83411C0F858111A +:108310001DE0B4F82411B4F85800081AA4F8DE00DF +:10832000B4F824112046A4F85810D4F83411C4F835 +:108330005011C4F85811D4F83C11C4F8E810D4F81E +:108340004011C4F85C11B4F84411A4F8601102F0B3 +:10835000A7F805E0600C0020DC0000209C0C002049 +:10836000FCF7E0FA804694F85500FFF723F84AF24C +:10837000B12108444FF47A71B0FBF1F0D4F81C112C +:1083800040F27122084461885143C0EB4100A0F1E2 +:10839000300AB8F1B70F98BF4FF0B7082146012057 +:1083A00004F0C7FB4044AAEB0000A0F21A38A24632 +:1083B0002146012004F0BDFB00F19C01DAF8240005 +:1083C000884288BF451AC6F81080454528BF4546F3 +:1083D000F560D4F85401A0F2A5107061FCF7AEFF6F +:1083E00084F8287186F8029003B0BDE8F08F02F09F +:1083F0006CF901E0FEF791FD84F8287103B0BDE847 +:10840000F08FFCF7B5FAD4F8582101461046FCF776 +:10841000C8FF48B1628840F27123D4F81C115A4356 +:10842000C1EB4201B0FBF1F094F865100D290FD0BB +:10843000B4F85820B4F8261113189942AEBF481C5E +:10844000401C1044A4F8260194F82A0178B905E0EC +:10845000B4F82601401CA4F8260108E0B4F826016F +:10846000B4F8DC10884204BF401CA4F82601B4F81C +:1084700062010DF1040B401CA4F86201B4F8800005 +:10848000B4F87E10401AB4F85810401E08441FFA81 +:1084900080F912E046E03EE052E000231A46204612 +:1084A000CDF800B0FFF77DF9002804BF03B0BDE8A8 +:1084B000F08F012818BFFFDF25D0B4F82611A9EBF3 +:1084C000010000B20028E8DA082084F8740084F87B +:1084D0007370204601F0A6FD84F8145194F864519D +:1084E0004FF6FF77202D00D3FFDF28F8157094F8A2 +:1084F0006401FCF71EFA84F864A1B07903B0BDE80A +:10850000F04FEAF709BDB4F82601BDF8041008449D +:10851000A4F82601D1E7FEF7A4FB03B0BDE8F04FB5 +:10852000FEF7FBBC94F81401042818BFFFDF84F8A1 +:10853000145194F864514FF6FF77202DD5D3D3E72B +:10854000FFDF03B0BDE8F08F10B5FA4C207850B1D2 +:1085500001206072F7F775F82078032805D0207A9B +:10856000002808BF10BD0C2010BD207BFCF765FD66 +:10857000207BFCF7B0FF207BFCF7DBF9002808BF6D +:10858000FFDF0020207010BD2DE9F04FE94F83B0D0 +:10859000387801244FF0000840B17C720120F7F7D1 +:1085A00050F83878032818BF387A0DD0DFF8889350 +:1085B00089F8034069460720FAF721F8002818BF18 +:1085C000FFDF4FF6FF7440E0387BFCF736FD387B69 +:1085D000FCF781FF387BFCF7ACF9002808BFFFDF10 +:1085E00087F80080E2E7029800281CBF90F8141179 +:1085F00000292AD00088A0421CBFDFF840A34FF01A +:10860000200B3AD00721FAF771F8040008BFFFDF0A +:1086100094F86401FCF75FFF84F8148194F86451C6 +:108620004FF6FF76202D28BFFFDF2AF8156094F85B +:108630006401FCF77EF984F864B169460720F9F714 +:10864000DEFF002818BFFFDF12E06846F9F7B5FF2C +:108650000028C8D011E0029800281CBF90F814111F +:10866000002905D00088A0F57F41FF39CAD104E078 +:108670006846F9F7A2FF0028EDD089F8038087F853 +:10868000348087F80B8003B00020BDE8F08F70B510 +:108690000446AB4890F80004AA4D400995F8001430 +:1086A0004909884218BFFFDF95F8140D4009A64913 +:1086B00091F800144909884218BFFFDF9E49002045 +:1086C00001228C7188700A7048700A71C8704871F4 +:1086D00098490870BDE8704056E7974908707047A0 +:1086E0002DE9F843934C064688462078002867D148 +:1086F0009648FCF7C2F82073202861D003276660F3 +:108700002770002565722572AEB1012106F58270D1 +:10871000FDF72FFA0620F9F791FF81460720F9F7B8 +:108720008DFF96F804114844B1FBF0F200FB1210E3 +:10873000401C86F80401FCF7F5F840F2F651884237 +:1087400038BF40F2F65000F59F7086B2F5F784FE10 +:10875000E061F5F7FDFF4FF00109002833D084F800 +:108760000A90FCF705F9814601216846FDF7D8F922 +:108770009DF8000042F210710002B0FBF1F201FB23 +:10878000120081194846FBF7F4FDA061C4E90A898B +:1087900069484079002814BF0120032020756775BF +:1087A0002574207B04F11001FCF72CFB002808BF86 +:1087B000FFDF25840020F6F744FF0020BDE8F883A2 +:1087C0000C20BDE8F883FCF7D3F83146FBF7D1FD68 +:1087D000A061A57284F83490A8F28B50A562A063C2 +:1087E000D6E7554948717047534948707047524918 +:1087F000087170472DE9F0414F4C06462089401C16 +:108800002081D4E903516078D6F8687120B13A46E6 +:10881000284604F03DF90546E068854205D06169C7 +:10882000281A08446061FCF789FDE560AF4209D869 +:1088300096F81401012805D0E078002804BF012033 +:10884000BDE8F0810020BDE8F08110B5044608467F +:10885000FEF7B0FD4AF2B12108444FF47A71B0FB43 +:10886000F1F040F2E241614300F2353081428CBFC9 +:10887000081A002010BD70B5044682B0002084F8AC +:10888000280194F8E600002807BF94F81401032893 +:1088900002B070BDFCF76CF8D4F8582101461046C0 +:1088A000FCF77FFD0028DCBF02B070BD628840F29B +:1088B0007123D4F81C115A43C1EB4201B0FBF1F013 +:1088C000B4F85810401C0844A4F82401B4F8DC00A3 +:1088D000B4F82421801A00B20028DCBF02B070BDB9 +:1088E000012084F82A01B4F88000B4F87E2001AE9B +:1088F000801A401E084485B212E00096B4F8241194 +:10890000002301222046FEF74CFF002804BF02B0DE +:1089100070BD01281CD0022812BFFFDF02B070BD5D +:10892000B4F82401281A00B20028BCBF02B070BD00 +:10893000E3E70000600C0020DC0000209C0C00201D +:1089400001E000E00BE000E019E000E075800100CC +:10895000B4F82401BDF804100844A4F82401DFE7AA +:10896000F8B50422002506295BD2DFE801F00726CE +:108970000319192A044680F8142107E00446B74871 +:10898000C078002818BF84F814210AD0FBF7FAFE3B +:10899000A4F86251B4F85800A4F8260184F82A51CA +:1089A000F8BD0095B4F8DC10012300222046FEF744 +:1089B000F8FE002818BFFFDFE8E7032180F8141154 +:1089C000F8BD0646876AB0F81C01314685B2012021 +:1089D00004F0AFF8044696F85500FEF7EBFC4AF2B7 +:1089E000B12108444FF47A71B0FBF1F0718840F284 +:1089F00071225143C0EB4100401BA0F2653501F0EC +:108A000069FE002818BF1E3DA74234BF20463846E5 +:108A1000A84228BF2C4602D2A74228BF3C46746217 +:108A2000F8BDFFDFF8BD2DE9F0478C4CA178022995 +:108A300006BF21890029BDE8F087A569C5F86C014A +:108A400095F85500FEF7AAFCD5F86C11081AE168F4 +:108A50000144E160216908442061A56995F82B0172 +:108A6000002808BFBDE8F08795F81401032818BF57 +:108A7000BDE8F08795F8558024780C2C28BFFFDFDF +:108A8000774E36F8147095F874410C2C28BFFFDF30 +:108A900036F81400384495F8747184B20C2F28BF4E +:108AA000FFDF36F8170000F5C86087B24046FEF7D2 +:108AB00075FCD5F86C110E1A4046FEF77BFC4FF49E +:108AC0007A7900F2E730B0FBF9F0361A4046FEF74B +:108AD00065FCD5F8E810A1EB000A4046FEF76AFCF9 +:108AE0004AF2B1210844B0FBF9F0AAEB0000A0F172 +:108AF00060016143B1FBF7F1292202EB50006031C4 +:108B0000A0EB510200EB5100B24201D8B04201D8B3 +:108B1000F3F753F9688840F2E241414300202CB159 +:108B200004FB01F04F49B0FBF1F0401CC5F81C01FB +:108B3000002085F82B01BDE8F08770B50546474851 +:108B400090F802C0BCF1020F07BF806900F5B47451 +:108B5000454800F12404002904BF256070BD4FF48E +:108B60007A7601290DD002291CBFFFDF70BD1046A7 +:108B7000FEF72FFC00F2E140B0FBF6F0281A20606F +:108B800070BD1846FEF740FC00F2E140B0FBF6F085 +:108B9000281A206070BD3448007800281CBF0020CF +:108BA000704710B50720F9F73BFD80F0010010BDBC +:108BB0002D480078002818BF012070472DE9F843A0 +:108BC000294C0025814684F83450D4F8188084F864 +:108BD0003010E5722570012727722946606803F07E +:108BE00089FA6168C1F85881267B81F86461C1F80F +:108BF0006891C1F85C81B1F80080202E28BFFFDFAA +:108C00001A4820F81680646884F814510023A4F8E8 +:108C100060511A46194620460095FEF7C2FD00280D +:108C200018BFFFDFC4F81051C4F8085184F814715C +:108C3000A4F82651A4F8245184F82A51B4F8580015 +:108C4000401EA4F85800A4F86251FBF79BFD0348AE +:108C50008079BDE8F843EAF75FB90000DC00002046 +:108C6000C04F020040420F00600C00209C0C00200E +:108C70002DE9F0410E46044604F01DFC0546204651 +:108C800004F01DFC044603F08FFFF94F010015D0DE +:108C9000386990F854208A4210D090F8AC311BB15A +:108CA00090F8AE3123421FD02EB990F851302342B4 +:108CB00001D18A4218D890F8AC01A8B1284603F037 +:108CC00073FF70B1396991F85520824209D091F84B +:108CD000AC0118B191F8AF01284205D091F8AC0170 +:108CE00010B10120BDE8F0810020FBE730B5E04C79 +:108CF00085B0E06900285ED0142168460BF093FE31 +:108D0000206990F85500FEF755FB4FF47A7100F595 +:108D1000FA70B0FBF1F5206990F85500FEF73EFBC4 +:108D20002844ADF8060020690188ADF80010B0F8BD +:108D30005810ADF804104188ADF8021090F88E017B +:108D400030B1A069C11C039104F096FA8DF81000AF +:108D5000206990F88D018DF80800E1696846884720 +:108D60002069002180F88E1180F88D110399002967 +:108D700021D090F88C1100291DD190F8641027297A +:108D800019D09DF81010039A002914D013780124EB +:108D9000FF2B12D0072B0ED102290CD15178FF29BD +:108DA00009D100BF80F88C410399C0F890119DF85B +:108DB000101080F88F1105B030BD1B29F2D9FAE7E9 +:108DC00070B5AB4C206990F865001B2800D0FFDF20 +:108DD0002069002580F88D5090F8C00100B1FFDFB8 +:108DE000206990F88E1041B180F88E500188A0F86B +:108DF000C41180F8C2510E2108E00188A0F8C41106 +:108E000080F8C251012180F8C6110D2180F8C011EF +:108E10000088F9F79DFDF9F735FA2079EAF77CF833 +:108E2000206980F8655070BD70B5914CA0798007BD +:108E30002CD5A078002829D162692046D378016911 +:108E40000D2B01F158005FD00DDCA3F102034FF0B0 +:108E500001050B2B19D2DFE803F01A1844506127E3 +:108E6000182C183A6400152B6FD008DC112B4BD04E +:108E7000122B5AD0132B62D0142B06D166E0162B7E +:108E800071D0172B70D0FF2B6FD0FFDF70BD91F822 +:108E900067200123194603F05DFD0028F6D1216902 +:108EA000082081F8670070BD1079BDE8704001F0BE +:108EB000B6BC91F86600C00700D1FFDF01F06EFC80 +:108EC000206910F8661F21F00101017070BD91F852 +:108ED0006500102800D0FFDF2069112180F88D5037 +:108EE00008E091F86500142800D0FFDF2069152103 +:108EF00080F88D5080F8651070BD91F865001528D8 +:108F000000D0FFDF172005E091F86500152800D09C +:108F1000FFDF1920216981F8650070BDBDE8704050 +:108F20004EE7BDE8704001F04EBC91F8642001238B +:108F3000002103F00FFD00B9FFDF0E200FE011F854 +:108F4000660F20F0040008701DE00FE091F8642027 +:108F50000123002103F0FEFC00B9FFDF1C20216982 +:108F600081F8640070BD12E01BE022E091F8660019 +:108F7000C0F30110012800D0FFDF206910F8661F40 +:108F800021F010010170BDE8704001F007BC91F8BC +:108F900064200123002103F0DDFC00B9FFDF1F2066 +:108FA000DDE791F86500212801D000B1FFDF222024 +:108FB000B0E7BDE8704001F0FDBB2D48016991F8B4 +:108FC0006620130702D501218170704742F0080224 +:108FD00081F866208069C07881F8C90001F0D5BBAE +:108FE00010B5234C21690A88A1F8042281F80202F5 +:108FF00091F8540001F0BDFB216981F8060291F857 +:10900000550001F0B6FB216981F80702012081F8C3 +:109010000002002081F8AC012079BDE81040E9F79A +:109020007BBF10B5124C01230921206990F8642000 +:10903000583003F08FFC38B12169002001F87C0F13 +:10904000087301F8180C10BD0120A07010BD70B598 +:10905000074D012329462869896990F86420097918 +:109060000E2A01D1122905D000241C2A05D006E0C1 +:1090700000010020BDE87040D3E7142902D0202A67 +:1090800008D009E080F8644080F88840BDE870406E +:1090900001F0E8BB162906D0262A01D1162902D0F4 +:1090A000172909D00CE000F8644F80F8244040787C +:1090B00021280CD01A2017E090F86520222A07D02A +:1090C000EA69002A03D0FF2901D180F88E3149E7EF +:1090D00080F8654001F062FB286980F87D4090F8D7 +:1090E000AC010028F3D00020BDE8704078E72DE9FE +:1090F000F843FD4C206990F86410202908D000271F +:1091000090F86510222905D07FB300F1640503E0D3 +:109110000127F5E700F1650510F8961F41F00401FD +:109120000170A06904F0D3F94FF00108002608B3DC +:109130003946A069FFF79CFDE0B16A46A169206944 +:1091400003F041FD90B3A06904F0BFF92169A1F8D3 +:109150009601B1F8581001F0F2FA40B320692821C5 +:1091600080F8741080F8738048E0FFE70220A07058 +:10917000BDE8F883206990F8AC0110B11E20FFF71C +:109180002FFFAFB1A0692169C07881F8CA0008FA41 +:1091900000F1C1F3006000B9FFDF20690A2180F807 +:1091A000641090F8880040B9FFDF06E009E01AE09B +:1091B0002E7001F0F3FAFFF700FF206980F87D6060 +:1091C000D6E7206990F8AC0118B10020FFF708FF3E +:1091D0002E70206900F1650180F87D608D420DD10F +:1091E00080F865600AE020699DF8001080F8981109 +:1091F0009DF8011080F8991124202870206900F151 +:1092000065018D4203D1BDE8F84301F0C7BA80F88B +:109210008860ADE770B5B44C01230B21206990F84C +:109220006520583003F096FB202650BB20690123AF +:10923000002190F86520583003F08CFB0125F0B137 +:10924000206990F8640024281BD0A06904F01DF95F +:10925000C8B1206990F8961041F0040180F896108A +:10926000A1694A7902F0070280F85120097901F0DA +:10927000070180F8501090F8AD311BBB06E0A570D7 +:1092800070E6A6706EE6BDE8704096E690F8AC31E8 +:10929000C3B900F154035E788E4205D1197891422A +:1092A00002D180F87D500DE000F5FD710D7002884F +:1092B0004A8090F850200A7190F851004871207946 +:1092C000E9F72AFE2169212081F86500BDE8704098 +:1092D00001F05BBA70B58448006990F84E20448E66 +:1092E000C38E418FB0F84050022A23D0A94200D348 +:1092F00029460186C18FB0F84220914200D3114621 +:109300008186018FB0F84420914200D311464186F6 +:10931000818FB0F84620914200D31146C186418E1C +:10932000A14200D90C464486C18E994200D90B4611 +:10933000C38617E6028E914200D31146C68F828EF5 +:10934000964200D23246A94200D329460186B0F89F +:1093500042108A4200D30A468286002180F84E10CD +:10936000CFE770B5604C206990F8660010F0300FC0 +:1093700004D0A07840F00100A070F3E5A06904F0EB +:1093800069F848B32569A06904F060F82887256961 +:10939000A06904F057F868872569A06904F058F8B7 +:1093A000A8872569A06904F04FF8E887A0794FF0F5 +:1093B0000102800703D56069C07814280FD02069A6 +:1093C00090F864101C290AD090F84E1001290DD095 +:1093D00090F8A31151B906E0BDE87040EDE52069B1 +:1093E00080F84E2002E090F8A21131B1206910F807 +:1093F000661F41F01001017016E090F8661041F010 +:10940000200180F8661000F5DA7103888B86038FDF +:10941000CB86438F0B87838F4B87C08F888781F8DC +:1094200032202079E9F778FDBDE8704001F0ADB950 +:1094300070B52D4C206990F86610890707D590F813 +:10944000642001230821583003F084FAE8B1206930 +:1094500090F89000800712D4A06903F0D7FF21692B +:1094600081F89100A06930F8052FA1F8922040887A +:10947000A1F8940011F8900F40F0020008702069E4 +:1094800090F89010C90703D00FE00120A07069E5A3 +:1094900090F86600800700D5FFDF206910F8661F8E +:1094A00041F00201017001F070F92069002590F887 +:1094B0006410062906D180F8645080F8885020791D +:1094C000E9F72AFD206990F894110429DFD180F88A +:1094D00094512079E9F720FD206990F86410002963 +:1094E000D5D180F888503DE50001002070B5FB4CD7 +:1094F00001230021206990F86520583003F02AFAF2 +:10950000012578B9206990F86520122A0AD0012334 +:109510000521583003F01EFA10B10820A07021E593 +:10952000A5701FE5206990F88E0008B901F02DF9AB +:109530002169A069F03103F04AFF2169A069C031B7 +:1095400003F050FF206990F8C80100B1FFDF2169E6 +:109550000888A1F8CA0101F5E671A06903F025FFAA +:109560002169A06901F5EA7103F027FF206980F8FD +:10957000C851142180F865102079BDE87040E9F7E2 +:10958000CBBC70B5D54C01230021206990F8652033 +:10959000583003F0DFF90125A8B1A06903F0D1FE2E +:1095A00098B1A0692169B0F80D00A1F89601B1F851 +:1095B000581001F0C4F858B12069282180F87410BF +:1095C00080F87350CEE4A570CCE4BDE87040F4E4BC +:1095D000A0692169027981F89821B0F80520A1F8E5 +:1095E0009A2103F0A1FE2169A1F89C01A06903F072 +:1095F0009EFE2169A1F89E01A06903F09FFE2169EA +:10960000A1F8A0010D2081F86500ABE47CB5B34C56 +:10961000A079C00738D0A06901230521C578206949 +:1096200090F86520583003F095F968B1AD1E0A2D09 +:1096300006D2DFE805F0090905050909050509094C +:10964000A07840F00800A070A07800281CD1A06984 +:1096500003F040FE00286ED0A0690226C5781DB137 +:10966000012D01D0162D18D1206990F8640003F067 +:1096700059F990B1206990F864101F290DD0202964 +:1096800003D0162D16D0A6707CBD262180F864105C +:10969000162D02D02A20FFF7A3FC0C2D58D00CDC8D +:1096A0000C2D48D2DFE805F033301D44A8A8489FB0 +:1096B00057A836392020A0707CBD0120152D6ED012 +:1096C00008DC112D6CD0122D6CD0132D64D0142D0C +:1096D00031D179E0162D7DD0182D7ED0FF2D2AD1E5 +:1096E00084E020690123194690F86720583003F080 +:1096F00031F9F8B9A06903F051FE216981F87A01C6 +:10970000072081F8670079E001F033F976E0FFF790 +:1097100038FF73E001F00DF970E0206990F86510F2 +:10972000112901D0A67069E0122180F8651065E06A +:10973000FFF7DCFE62E05FE0206990F86500172823 +:10974000F0D101F02BF821691B2081F8650055E06C +:10975000FFF76EFE52E0206990F86600C00703D064 +:10976000A07840F0010022E06946A06903F055FEB0 +:109770009DF8000000F02501206900F8961F9DF873 +:10978000011001F04101417000F0FFFF206910F865 +:10979000661F41F0010113E0FFF743FC2EE016E0E5 +:1097A0001EE0FFE7216991F86610490701D5A07016 +:1097B00024E000F0EAFF206910F8661F41F0040180 +:1097C00001701BE006E008E0FFF7CBFD16E001F0BA +:1097D0007DF813E0FFF71EFD10E0FFF788FC0DE0B9 +:1097E00001F053F80AE0FFF732FC07E0E16919B134 +:1097F000216981F88E0101E0FFF7DFFB2069F0E9C4 +:109800002A12491C42F10002C0E900127CBD70B569 +:10981000324CA07900074AD5A078002847D12069AA +:1098200090F8CC00FE2800D1FFDF2069FE21002542 +:1098300080F8CC1090F86510192906D180F88D5069 +:1098400000F0ACFF206980F86550206990F8641042 +:109850001F2902D0272921D119E090F8650003F0D3 +:1098600061F878B120692621012380F8641090F80E +:1098700065200B21583003F06DF878B92A20FFF7E6 +:10988000AFFB0BE02169202081F8640006E0012194 +:1098900080F88D1180F8645080F88850206990F825 +:1098A0006710082903D10221217080F8CC100EE442 +:1098B0000A49096991F898210AB991F8542081F868 +:1098C000542091F899210AB991F8552081F8552032 +:1098D000002802D00020FFF783BB70470001002062 +:1098E00070B5FC4C06460D46206990F8CC00FE2869 +:1098F00000D0FFDF2269002082F8CC6015B1A2F809 +:109900008A00BDE422F8840F01201071B8E470B51C +:10991000F04C01230021206990F86420583003F0B6 +:1099200019F800286AD0206990F8A21111B190F8B6 +:10993000A31139B190F8AC1100295ED090F8AD11A7 +:1099400019B35AE090F8651024291CD090F86410DF +:10995000242918D05FF0000300F5CC7200F5D17116 +:1099600003F0ABF82169002081F8A2010146142020 +:10997000FFF7B6FF206930F8421FA0F88C108188ED +:10998000A0F88E103FE00123E6E790F86520012360 +:109990000B21583002F0DEFF78BB206990F85400AC +:1099A00000F0E7FE0546206990F8550000F0E1FE62 +:1099B0000646206990F8AE11284600F0CCFE50B162 +:1099C000206990F8AF11304600F0C5FE18B10020B4 +:1099D000FFF706FB11E020690123032190F86520C1 +:1099E000583002F0B7FF40B920690123022190F8F6 +:1099F0006520583002F0AEFF08B1002040E400219D +:109A00001620FFF76DFF01203AE410B5F0BBB14C12 +:109A1000206990F86610CA0702D00121092051E0A0 +:109A20008A070AD501210C20FFF75AFF206910F898 +:109A3000901F41F00101017046E04A0702D5012163 +:109A400013203FE00A0705D510F8C91F4171012115 +:109A5000072037E011F0300F3AD090F8A311A9B9E0 +:109A600090F8A211D9B190F8651024292ED090F861 +:109A7000641024292AD0002300F5CC7200F5D1719E +:109A800003F01BF8206910F8661F00E020E021F0C9 +:109A9000200141F010010170002180F83C11206983 +:109AA00090F86600C00613D5FFF714FC00F0DAFE4C +:109AB000206930F8421FA0F88C108188A0F88E1021 +:109AC00001211520FFF70CFF012010BD0123D3E772 +:109AD000002010BD70B57F4C206990F8CC10FE2995 +:109AE00078D1A178002975D190F867200123194613 +:109AF000583002F02FFF00286CD1206990F87811BF +:109B000049B10021A0F8821090F8791180F8CE10A8 +:109B1000002102205BE090F86520012304215830E9 +:109B200002F018FF0546FFF770FF002852D12846C3 +:109B300000F083FF00284DD120690123002190F817 +:109B40006420583002F006FF78B120690123042117 +:109B500090F86520583002F0FDFE30B9206990F889 +:109B60007C0010B10021122031E0206990F86420BF +:109B70000A2A0DD0002D2DD101230021583002F0EA +:109B8000E9FE78B1206990F8941104290AD105E022 +:109B900010F8CA1F01710021072018E090F890000A +:109BA000800718D0FFF7B3FE002813D120690123E6 +:109BB000002190F86420583002F0CCFE002809D033 +:109BC000206990F88C01002804D00021FF20BDE816 +:109BD000704085E609E000210C20FFF781FE206936 +:109BE00010F8901F41F00101017050E43EB50546A8 +:109BF0006846FDF796FC00B9FFDF222100980AF0C5 +:109C0000F0FE0321009803F04DFB0098017821F04D +:109C100010010170294603F06AFB2E4C0D2D40D037 +:109C20000BDCA5F102050B2D19D2DFE805F01F189A +:109C30004819191F185518192400152D5DD008DC76 +:109C4000112D25D0122D0BD0132D09D0142D06D196 +:109C500053E0162D29D0172D68D0FF2D72D0FFDFCD +:109C6000FDF772FC002800D1FFDF3EBD216900989E +:109C700091F8CE1017E0E268009811780171918890 +:109C80004171090A81715188C171090A0172E7E7BE +:109C90000321009803F035FC0621009803F035FC01 +:109CA000DEE7009806210171DAE70098D4F8101079 +:109CB00091F8AE21027191F8AF114171D0E721699D +:109CC0000098F83103F092FB21690098C43103F049 +:109CD00097FBC5E700010020F849D1E90001CDE973 +:109CE0000101206901A990F8960000F025008DF887 +:109CF0000400009803F0BFFBB2E72069B0F84410FD +:109D0000009803F08FFB2069B0F8D010009803F0A2 +:109D10008DFB2069B0F84010009803F08BFB2069A0 +:109D2000B0F8CE10009803F089FB99E7216991F80B +:109D3000AC0100280098BBD111F8542F027149786A +:109D4000BBE7FFE7206990F88F21D0F890110098C9 +:109D500003F0DBFA84E7DA4810B5006990F86A107E +:109D600041B990F8652001230621583002F0F2FD38 +:109D7000002800D0012010BD70B5D14D286990F8A1 +:109D8000681039B1012905D0022906D0032904D071 +:109D9000FFDF17E4B0F8DC1037E090F8671008290F +:109DA00036D0B0F87E10B0F8802000248B1C9A4288 +:109DB00006D3511A891E0C04240C01D0641EA4B2CF +:109DC00090F87C1039B190F86420012309215830B3 +:109DD00002F0C0FD40B3FFF7BEFF78B12969002053 +:109DE000B1F87820B1F876108B1C9A4203D3501A40 +:109DF000801E00D0401EA04200D284B20CB1641E6E +:109E0000A4B22869B0F8DC102144A0F8D8104EE5BF +:109E1000B0F87E100329BDD330F8581F028D1144CD +:109E2000491CA0F8801042E50024EAE770B50C4612 +:109E300005464FF4027120460AF0F5FD258036E50F +:109E4000F8F75DBD2DE9F0410D4607460721F8F70B +:109E50004DFC041E3CD094F8B4010026A8B16E70ED +:109E6000092028700BE0268484F8B461D4F8B60188 +:109E70006860D4F8BA01A860B4F8BE01A88194F86B +:109E8000B4010028EFD12E71BAE094F8C00190B36C +:109E900094F8C0010D2813D00E2801D0FFDFAFE0E9 +:109EA0002088F8F755FD0746F8F701FA78B96E7083 +:109EB0000E20287094F8C20128712088E88014E0F0 +:109EC0002088F8F745FD0746F8F7F1F910B10020B2 +:109ED000BDE8F0816E700D20287094F8C2012871E1 +:109EE0002088E88094F8C601287284F8C06138465A +:109EF000F8F7D7F984E0FFE794F8F80130B16E7015 +:109F00001020287084F8F861AF8079E094F8C801D7 +:109F100090B16E700A2028702088A880D4F8CC11E7 +:109F2000C5F80610D4F8D011C5F80A10B4F8D40159 +:109F3000E88184F8C86163E094F8D60140B16E709E +:109F40001A202870B4F8D801A88084F8D66157E0A8 +:109F500094F8F20170B16E701B20287005E000BF0C +:109F600084F8F261D4F8F401686094F8F2010028F2 +:109F7000F6D145E094F8DA0190B16E7015202870A2 +:109F800004F5EE7707E000BF84F8DA610A2239466B +:109F9000281D0AF0ECFC94F8DA010028F4D12FE037 +:109FA00094F8E60158B16E701D20287084F8E661BF +:109FB0000A2204F5F471281D0AF0D9FC20E094F877 +:109FC000FA0138B11E20287084F8FA61D4F8FC0137 +:109FD000686015E094F8000200283FF479AF6E70D5 +:109FE0001620287008E000BF84F80062D4F802024E +:109FF0006860B4F80602288194F800020028F3D1C2 +:10A00000012065E72E480021C1610162084664E431 +:10A0100030B52B4D0C46E860FFF7F4FF00B1FFDFD1 +:10A020002C7130BD002180F8641080F8651080F834 +:10A03000681090F8E61009B1022100E00321FEF754 +:10A040008FBC2DE9F0411E4C0546206909B1002165 +:10A0500004E0B0F8EE10B0F8DE201144A0F8EE10E5 +:10A0600090F8781139B990F86720012319465830D3 +:10A0700002F070FC30B1206930F8821FB0F85C202B +:10A0800011440180206990F8883033B1B0F8841011 +:10A09000B0F8DE201144A0F8841090F98C70002FE5 +:10A0A00006DDB0F88A10B0F8DE201144A0F88A105E +:10A0B00001213D2635B180F8746017E0D84F0200C9 +:10A0C000000100202278022A0AD0012A11D0A278A9 +:10A0D0002AB380F8731012F0140F0DD01E2113E074 +:10A0E00090F8CE20062A3CD016223AE080F8731071 +:10A0F00044E090F87A2134E0110702D580F87460CA +:10A100003CE0910603D5232180F8741036E09007D7 +:10A1100000D1FFDF21692A2081F874002AE02BB1E9 +:10A12000B0F88420B0F886309A4210D2002F05DDB6 +:10A13000B0F88A20B0F886309A4208D2B0F882305F +:10A14000B0F88020934204D390F878310BB12222EA +:10A1500007E090F868303BB1B0F87E30934209D305 +:10A16000082280F87420C1E7B0F87E20062A01D3C7 +:10A170003E22F6E7206990F8731019B12069BDE816 +:10A18000F0414FE7BDE8F0410021FEF7E9BB2DE9C2 +:10A19000F047FA4C81460D4620690088F8F7EAFB43 +:10A1A000060000D1FFDFA0782843A070A0794FF00F +:10A1B00000058006206904D5A0F87E5080F8EC5098 +:10A1C00003E030F87E1F491C0180FFF7C4FD012722 +:10A1D00040B3E088000506D5206990F86A1011B1F7 +:10A1E000A0F876501EE02069B0F87610491C89B2BC +:10A1F000A0F87610B0F878208A4201D3531A00E014 +:10A200000023B4F808C00CF1050C634501D880F8B0 +:10A210007C70914206D3A0F8765080F8F8712079CE +:10A22000E8F77AFEA0794FF0020810F0600F0ED028 +:10A23000206990F8681011B1032908D102E080F874 +:10A24000687001E080F868800121FEF789FB2069D1 +:10A2500090F86810012904D1E188C90501D580F87A +:10A260006880B9F1000F71D1E188890502D5A0F8A5 +:10A27000005104E0B0F80011491CA0F8001100F0F2 +:10A28000A3FBFEF733FDFFF725FC00F049FF002894 +:10A29000206902D0A0F8E05003E030F8E01F491C2C +:10A2A000018000F040FF38B1216991F8EC000228EC +:10A2B00007D8401C81F8EC00206990F8EC000228D7 +:10A2C00004D9206920F8E05F4580057320690123E7 +:10A2D000002190F86520583002F03CFB20B920693D +:10A2E00090F865000C2859D120690123002190F8CD +:10A2F0006420583002F02EFB48B32069012300216E +:10A3000090F86720583002F025FB00B3206990F8E0 +:10A310006810022942D190F8EC00C0B93046F7F736 +:10A3200096FDA0B1216991F8CC00FE2836D1B1F894 +:10A33000DA00012832D981F8E570B1F88000B1F86F +:10A340007E20831E9A4203DB012004E032E025E0F8 +:10A35000801A401E80B2B1F8E02023899A4201D3CE +:10A36000012202E09A1A521C92B2904200D9104681 +:10A37000012801D181F8E55091F8712192B1B1F82D +:10A38000E220B1F872118A4201D3012102E0891A58 +:10A39000491C89B2884205D9084603E02169012099 +:10A3A00081F8E5502169B1F858201044A1F8DC008B +:10A3B000FFF7E2FCE088C0F340214846FFF741FE8A +:10A3C000206980F8E650BDE8F047FDF7DFB86B493B +:10A3D00002468878CB78184312D10846006942B10A +:10A3E0008979090703D590F86700082808D001206B +:10A3F0000DE6B0F84810028E914201D8FEF7FAB986 +:10A40000002004E670B55D4C05460E46E088284302 +:10A41000E080A80703D5E80700D0FFDF6661EA0700 +:10A420004FF000014FF001001AD0A661F278062A21 +:10A4300002D00B2A14D10AE0226992F86530172B5A +:10A440000ED10023E2E9283302F8370C08E0226934 +:10A4500092F86530112B03D182F8691082F88E00D2 +:10A46000AA0718D56269D278052A02D00B2A12D120 +:10A470000AE0216991F86520152A0CD10022E1E952 +:10A480002A2201F83E0C06E0206990F86520102A87 +:10A4900001D180F86A10280601D50820E07078E420 +:10A4A0002DE9F84F354C00254FF00108E580A570E7 +:10A4B000E5704146257061F30702206192468146AE +:10A4C00080F8E6800088F8F755FA070000D1FFDF32 +:10A4D00020690088FDF722F820690088FDF744F81C +:10A4E0002069B0F8DA1071B190F8CC10FE290FD1C4 +:10A4F00090F8781191B190F86720012319465830EF +:10A5000002F028FA80B1206990F8CC00FE2805D02E +:10A51000206990F8CC0000BFFFF768FB206990F835 +:10A52000E71089B1258118E02069A0F8825090F8E1 +:10A53000791180F8CE1000210220FFF7D1F92069AF +:10A5400080F8E5500220E7E790F8B41119B9018CC2 +:10A550008288914200D881882181B0F8DE10491E9E +:10A560008EB2B0F8E0103144A0F8E01090F8E4109A +:10A5700031B1A0F8E25080F8E45006E0000100207C +:10A58000B0F8E2103144A0F8E21030F87E1F3144F8 +:10A590000180FFF7E0FB20B1206930F8761F3144DD +:10A5A00001802069B0F8DA10012902D8491CA0F80E +:10A5B000DA100EB180F8EC5090F8E510A1B1B0F8C7 +:10A5C000E000218988420FD23846F7F740FC58B1A5 +:10A5D000206990F8711139B1B0F8E210B0F8720149 +:10A5E000814201D300F0A2FD206980F8E55090F887 +:10A5F00065100B2901D00C2916D1B0F85820B0F8FD +:10A600009631D21A12B2002A0EDBD0F8981181606E +:10A6100090F89C110173022101F06CFD206980F813 +:10A62000655080F8988026E0242910D1B0F85810A1 +:10A63000B0F89621891A09B2002908DB90F8AC011C +:10A64000FFF736F9206900F8655F057613E090F8AA +:10A650006410242901D025290DD1B0F85810B0F884 +:10A660009601081A00B2002805DB0120FFF720F947 +:10A67000206980F8645020690146B0F8DE20583027 +:10A6800001F05CFF206990F8711109B1A0F8E25067 +:10A69000FD480090FD4BFE4A4946504600F098FCAC +:10A6A000216A11B16078FCF7B1FB20690123052113 +:10A6B00090F86520583002F04DF9002803D0BDE82D +:10A6C000F84F00F05EBABDE8F88F00F00FBDF14919 +:10A6D000C8619CE4EF48C069002800D0012096E4DE +:10A6E000EC4A5070116292E410B50446B0F89C2117 +:10A6F0004388B0F89E11B0F8A0019A4205D1A38812 +:10A70000994202D1E38898420FD02388A4F8B83147 +:10A71000A4F8BA21A4F8BC11A4F8BE01012084F861 +:10A72000B401DC480079E8F7F7FB0121204601F08D +:10A73000E1FC002004F8650F0320E07010BD401A12 +:10A7400000B247F6FE71884201DC002801DC0120DE +:10A750005DE400205BE4012802D0022805D102E07C +:10A76000012904D001E0022901D000204FE401209A +:10A770004DE410B5012804D0022804D0FFDF2046A4 +:10A7800010BD0124FBE70224F9E7C248002100695B +:10A7900020F88A1F8178491C817038E4BD4800B5D3 +:10A7A000016911F88C0F401E40B20870002800DAD1 +:10A7B000FFDF00BDB7482721006980F86410002141 +:10A7C00080F88C1123E410B5B24C206990F89411F4 +:10A7D000042916D190F8642001230021583002F09A +:10A7E000B9F800B9FFDF206990F89010890703D409 +:10A7F000062180F8641004E0002180F8881080F8B9 +:10A800009411206990F86600800707D5FFF7C6FF0E +:10A81000206910F8661F21F00201017010BD9D49EA +:10A8200010B5096991F864200A2A09D191F8CA2063 +:10A83000824205D1002081F8640081F8880010BDB3 +:10A8400091F86620130706D522F0080081F866000B +:10A85000BDE81040A2E7FF2801D0FFDF10BDBDE832 +:10A860001040A7E710B58B4C05212069FEF778F85A +:10A87000206990F84E10012903D0BDE8104000F087 +:10A8800024B9022180F84E1010BD10B5814C20690A +:10A8900010F8961F41F004010170A06902F033FE28 +:10A8A000162806D1206990F86400202802D02628B6 +:10A8B00005D010BDA06902F02AFEFEF791FB2169C8 +:10A8C000002081F8640081F8880010BD70B5714CDB +:10A8D00001230A21206990F86420583002F03AF8E8 +:10A8E00010B3A06902F0B6FDA8B12569A06902F015 +:10A8F000ADFD28872569A06902F0A4FD6887256958 +:10A90000A06902F0A5FDA8872569A06902F09CFD59 +:10A91000E887FEF7DFFC2169002081F8880081F8D4 +:10A920006400BDE870409DE7A07840F00100A07091 +:10A93000B5E510B5574C01230021206990F865203A +:10A94000583002F007F830B1FFF71FFF21691020DF +:10A9500081F8650010BD20690123052190F865206C +:10A96000583001F0F7FF08B1082000E00120A07086 +:10A9700010BD70B5474C01230021206990F8652077 +:10A98000583001F0E7FF012588B1A06902F003FD0E +:10A990002169A1F89601B1F85810FFF7D0FE40B137 +:10A9A0002069282180F8741080F8735077E5A5702D +:10A9B00075E52169A06901F5CC7102F0E7FC216918 +:10A9C0000B2081F865006AE510B5FEF720FFFEF761 +:10A9D0001DFE304CA079400708D5A07830B9206919 +:10A9E00090F86700072801D101202070FEF71CFABB +:10A9F000A079C00609D5A07838B9206990F865100B +:10AA00000B2902D10C2180F86510E07800070ED5E3 +:10AA100020690123052190F86520583001F09AFF44 +:10AA200030B10820A0702169002081F8C00110BD5C +:10AA3000BDE81040002000F07DBB10B5154C216929 +:10AA400091F86520F8B1102A06D0142A07D0152AEB +:10AA500022D01B2A34D122E001210B2021E0FBF778 +:10AA600065F80C281FD320690821F830FBF762F83D +:10AA700028B120690421C430FBF75CF800B9FFDF7E +:10AA8000012104200DE010E08FA10100CFA30100FF +:10AA900005A401000001002000F037F803E00121C7 +:10AAA0000620FEF71DFF012010BD212A08D191F8D4 +:10AAB0007D0038B991F8AC0110B191F8AD0108B141 +:10AAC000002010BD01211720EBE7284B30B4186996 +:10AAD00000F5DA7201881185018E5185818E91858C +:10AAE000018FB0F84440A14200D32146D185818F27 +:10AAF000B0F84600814200D208461086012082F854 +:10AB00002600187930BCE8F707BA70B5174C002555 +:10AB1000206990F87B1101290AD0022925D190F8EB +:10AB20008E10A9B1062180F8CE100121022017E075 +:10AB300090F8C011002918D100F1B00300F1F00124 +:10AB4000002200F5BE7001F07FFE0121052007E024 +:10AB500090F89600400701D5112000E00D2001215A +:10AB6000FEF7BEFE206980F87B5198E400010020CA +:10AB700030B5FF4C05462078002818BFFFDF25724E +:10AB800030BDFB490120C87170472DE9F14FF94DE7 +:10AB90002846297840680029044600F1580890F8B2 +:10ABA000551001F0BBFF94F85510668E80B208294D +:10ABB00068D001F08FFF864238BF3046C7B2DFF859 +:10ABC000B093ED48C9F824006E682878002896F8FC +:10ABD0006AA0B6F832B096F85510304601F09EFFE4 +:10ABE00096F8551080B2082950D001F073FF014645 +:10ABF00058468B4528BF0846BAF1000F1CBF001D00 +:10AC000080B2C0B296F85510FBF7D1FC98F812004C +:10AC1000002840D008F15801D74891E80E1000F5FF +:10AC2000027686E80E10D8F86810C0F82112D8F81D +:10AC30006C10C0F8251200F58170FCF74CF82878EC +:10AC400000280CBF0120002080F00101CB480176D4 +:10AC5000D8E91412C0E90412A0F58372D9F82410BF +:10AC6000FBF783FB94F85500012808BF002204D0AD +:10AC700002281ABFFFDF0022012239460120FBF71C +:10AC800082FB0EE0042101F025FF94E7042101F08E +:10AC900021FF0146ACE7D9F82400FCF71CF8FBF7CC +:10ACA00095FB009818B900219620FCF767F894F8F6 +:10ACB000542001210020FCF718F994F82C000128F9 +:10ACC00008BFFCF7EFF8022089F80000FCF7C6FB8C +:10ACD000002818BFFFDFBDE8F88F2DE9F04FDFF83F +:10ACE00094A283B050469AF800204068AAF114015B +:10ACF000009190F85D1000F1580604464FF00108ED +:10AD0000AAF13407A9B3012900F0DB80022900F081 +:10AD1000DD80032918BFFFDF00F0E680386A0823D2 +:10AD2000017821F008010170B27903EAC2021143EF +:10AD300021F004010170F279042303EA8202114335 +:10AD400021F01001017096F80590F86AF7F78FF876 +:10AD50000546FCF72DFCB9F1020F00F0CC80B9F1EB +:10AD6000010F00F0CB80B9F1030F00F0CA8000F0B2 +:10AD7000CBB8FFE7337B21464FF002094FF0000BC1 +:10AD8000242B1CBF96F80DC0BCF1240F07D01F2B3D +:10AD900018BF202B19D0BCF1220F2ED048E094F818 +:10ADA000545052B191F89801002846D0012D18BF97 +:10ADB000012834D04FF002053FE091F8FA0080B34B +:10ADC000012D18BF01282AD0F4E7BCF1220F14D0BE +:10ADD00072B391F8AE0194F8545010F0010F18BFFF +:10ADE000404604D0012D18BF012818D0E2E710F02A +:10ADF000020F18BF4846F5D11FE0CAB190F8AE1156 +:10AE000090F8510094F8545001EA000010F0010F3E +:10AE100018BF404606D0012D18BF0128CAD14FF0F7 +:10AE200001050AE010F0020F18BF4846F3D104E014 +:10AE300094F85450042D08BF08252946204601F0F7 +:10AE40006BFE80B2294601F045FE218E814238BF5B +:10AE50000846ADF80800A4F848000098FCF787FB06 +:10AE600068B1BA89396A42F48062BA817A694FF46A +:10AE7000806090470320707186F803804EE701AA36 +:10AE800002A9F86AF6F72EFF386210B196F835106D +:10AE900029B10098FCF73FFB86F805803EE79DF856 +:10AEA000041031B9A0F800B080F802B0012102F01E +:10AEB000F9F9BDF80810386A02F02BFB86F8059006 +:10AEC0002CE70098FCF727FB28E700BFB4F8480000 +:10AED000ADF8000001AA6946F86AF6F703FF386288 +:10AEE000002808BFFFDF19E70098FCF740FB0028A7 +:10AEF00008BFFFDF12E7A84306D103E0A84303D150 +:10AF000000E00DB1012100E00021386A027842EA38 +:10AF100001110170717C00291CBF717901293CD09D +:10AF200006F15801144891E80E1000F5027585E805 +:10AF30000E10B16EC0F82112F16EC0F8251200F5A6 +:10AF40008170FBF7C8FE9AF8000000280CBF0121B1 +:10AF500000210A480176D6E91212C0E90412A0F5D0 +:10AF600083713A6AFBF701FA94F85400012807E06C +:10AF70002401002058010020E00C0020E80E0020F1 +:10AF800008BF002204D002281ABFFFDF00220122DE +:10AF9000FB210020FBF7F7F903E0FBF79CFEFBF732 +:10AFA00015FA012194F855200846FBF79EFF87F813 +:10AFB0000480386A018839828078B87487F8008004 +:10AFC000FCF755FA002818BFFFDF03B0BDE8F08F8B +:10AFD0002DE9F0471D46174681460C46FE4EDDF82A +:10AFE0002080307828B9002F1CBF002DB8F1000F49 +:10AFF00000D1FFDFC6F81C80C6E90D94C6E90575CF +:10B000004FF00000F071B071F070B070307170717D +:10B01000F24DB081F081287804F158072088F7F7C5 +:10B02000A9FCF0622088F7F793FC3063FBF7DCFAA9 +:10B0300094F95700FBF7A4FB04F11200FBF72EFE76 +:10B0400004F10E00FBF7A2FB287800280CBF0320B8 +:10B050000120FBF73DFEB87EFBF7A0FBFBF732FEBD +:10B060002878002804BFFF2094F8544019D0BF7CF2 +:10B07000668E94F85510204601F050FD94F8551056 +:10B0800080B2082926D001F025FD014630468E42C7 +:10B0900028BF0846002F1CBF001D80B2C0B294F824 +:10B0A00055402146FBF783FA2878C0B1686890F8CC +:10B0B0007001002818BFFBF713FB21460120FBF7A6 +:10B0C00063FC6868D0F8E800FBF708FEBDE8F047CD +:10B0D00001205AE5042101F0FDFC0146D6E7214696 +:10B0E0000020FBF751FCBDE8F047F6E5BB4800B592 +:10B0F00001783438007819B1022818BFFFDF00BD8D +:10B10000012818BFFFDF00BDB34810B50078022842 +:10B1100018BFFFDFBDE8104000F02FBA00F02DBAD5 +:10B12000AD4800797047AC48C0787047AA49012003 +:10B13000487170472DE9F0470600A848A64D4068C1 +:10B1400000F15804686A90F8019018BF012E03D1ED +:10B15000296B09F077F86870687800274FF00108CC +:10B16000A0B101283CD0022860D003281CBFFFDF1B +:10B17000BDE8F087012E08BFBDE8F087286BF7F720 +:10B180006BF8287ABDE8F047E7F7C6BE012E14D069 +:10B19000A86A002808BFFFDF6889C21CD5E909102A +:10B1A00009F0A0FBA86A686201224946286BF6F7FD +:10B1B000CFFE022E08BFBDE8F087D4E91401401C81 +:10B1C00041F10001C4E91401E079012801D1E771DE +:10B1D00001E084F80780287ABDE8F047E7F79CBED5 +:10B1E000012E14D0A86A002808BFFFDF6889C21C9E +:10B1F000D5E9091009F076FBA86A68620022494681 +:10B20000286BF6F7A5FE022E08BFBDE8F087D4E94B +:10B210001410491C40F10000C4E91410E079012821 +:10B220000CBFE77184F80780BDE8F087012E06D0D7 +:10B23000286BF7F711F8022E08BFBDE8F087D4E9B4 +:10B240001410491C40F10000C4E91410E0790128F1 +:10B25000BFD1BCE770B5614E3046A6F134044068FA +:10B2600000F158052078012818BFFFDFA87868B1E1 +:10B270000021A970A289042042F00402A28162691F +:10B280009047307800281CBF01202871216A0322D2 +:10B29000087832EA000009D1A28912F4806F05D043 +:10B2A00042F00202A281626902209047012100203F +:10B2B00000F082F918B1BDE8704000F05EB9BDE859 +:10B2C0007040002061E42DE9F14F444E00273046E4 +:10B2D000A6F134054068317800F1580A2878B8465C +:10B2E000022818BFFFDFE88940F40070E881716828 +:10B2F0003078FF2091F85410FBF759F90098002896 +:10B300009AF8120000F00181FBF786F8FBF774F859 +:10B310004FF0010990B99AF8120078B1686A417843 +:10B3200061B100789AF80710C0F3C000884205D1D7 +:10B3300085F80290BDE8F84F00F01FB9686A4178BF +:10B340006981002908BFAF6203D0286BF6F7BAFD08 +:10B35000A862E88940F02000E881EF7030787068DA +:10B3600000F15804834690F82C0001281AD1FBF70D +:10B370008FFD2146584601F0A8FA98B13078002890 +:10B3800070680CBF00F58E7000F5F970BBF8001006 +:10B390004180217A0171617A417180F80090287AA8 +:10B3A000E7F7BAFD686A9AF806100078C0F38000E3 +:10B3B000884240D03078706800F1580490F85D0001 +:10B3C000002834D0022850D06771307800281CBF84 +:10B3D000207900280ED003E024010020580100202D +:10B3E0002771AA89394642F01002AA816A694FF092 +:10B3F00010009047E078A0B1E770FCF7C7F800288C +:10B4000008BFFFDF0820AA89002142F00802AA81B4 +:10B410006A699047D4E91202411C42F10000C4E974 +:10B420001210A07901280CBFA77184F80690E88952 +:10B4300040F48070E881696A9AF807300878C0F3B0 +:10B44000C0029A424ED13278726800F0030002F1D5 +:10B450005804012818BF02282DD003281CBFA87942 +:10B4600040F0040012D0A8713CE0E86AF6F766FCF0 +:10B47000002808BFFFDFD4E91202411C42F100009E +:10B48000C4E91210287AE7F747FD9DE784F8029097 +:10B49000EA89484642F40062EA81AA8942F0010240 +:10B4A000AA816A699047E079012801D1E77119E022 +:10B4B00084F8079016E0487818B3E98941F40061F0 +:10B4C000E981A96A71B1FB2884BFA87940F0100016 +:10B4D000C9D8E879002808BFC84603D080206A6927 +:10B4E000002190470120009900F066F8B0B1B8F152 +:10B4F000000F1CBF0020FFF71DFEBDE8F84F00F055 +:10B500003CB8E0790128D3D1D0E7002818BFFAF77A +:10B51000BCFFE88940F04000E881E3E7B8F1000FA4 +:10B520001CBF0120FFF706FEFFF7D7FBB8F1000FA5 +:10B5300008BFBDE8F88F0220BDE8F84FFAE570B506 +:10B540000D4606463C483C4900784C6850B1FAF735 +:10B55000DFFF034694F8542029463046BDE870408A +:10B56000FDF7EBBAFAF7D4FF034694F854202946C6 +:10B570003046BDE8704005F09ABF2F4910B54C68C1 +:10B58000FBF757FCFBF736FCFBF703FBFBF78CFBE9 +:10B59000FAF71CFF94F82C00012808BFFBF778FC91 +:10B5A000264C00216269E0899047E269A179A07880 +:10B5B00090470020207010BD70B5204C0546002932 +:10B5C00008BF012D06D1E07800F10100C0B2E070A3 +:10B5D00001282ED8A16928468847002829D06179FA +:10B5E000174839B1012D01BF41780029017811F0C8 +:10B5F000100F1ED0A179E1B90F490978002908BFC1 +:10B60000012D01D091B18DB90E49097811F0100FBB +:10B6100004BF007810F0100F0BD0A08948B9A06AC1 +:10B6200020B9608910B111F0100F02D04FF0000066 +:10B6300070BD4FF0010070BD5801002024010020B2 +:10B64000E00C002034010020FE498A78824286BF47 +:10B65000084490F843010020704710B540F2D31120 +:10B66000F84809F0BEF9FF220821F74809F0B1F9BE +:10B67000F6480021417081704FF46171818010BDE6 +:10B680002DE9F0410E46054600F0ADFBED4C1028CB +:10B6900016D004EBC00191F85A0110F0010F1CBF45 +:10B6A0000120BDE8F081607808283CBF012081F8C6 +:10B6B0005A011CD26078401C60700120BDE8F08106 +:10B6C0006078082813D222780127501C207004EBE0 +:10B6D000C2083068C8F85401B088A8F85801102A88 +:10B6E00028BFFFDF88F8535188F85A71E2E700203D +:10B6F000BDE8F081D54988707047D448807870479C +:10B7000070B4D04800250178491E4BB2002B46DBAF +:10B7100000EBC30191F85A1111F0010F3BD04278B0 +:10B72000D9B2521E427000EBC10282F85A5190F811 +:10B7300002C00022BCF1000F0BD9841894F80361F9 +:10B740008E4202D1102A26D103E0521CD2B2944577 +:10B75000F3D80278521ED2B202708A421BD000EB9C +:10B76000C20200EBC10CD2F85341CCF85341D2F8DD +:10B770005721CCF85721847890F800C00022002C83 +:10B7800009D9861896F8036166450CD1102A1CBFAA +:10B79000024482F80311591E4BB2002BB8DAAB48B1 +:10B7A000857070BC7047521CD2B29442E9D8F2E75F +:10B7B000A4498A78824286BF01EB0010C01C002099 +:10B7C00070472DE9F04101261F469046344600257A +:10B7D00000F009FB10282AD09A494FF0000C01EB29 +:10B7E000C00292F85A2102F001058A78002A1ED977 +:10B7F00001EB0C0393F8033183421FD1BCF1100F0E +:10B8000015D0002F18BF87F800C0887860450ED982 +:10B8100001EB0C1010F1030F09D001EB0C0090F8B4 +:10B820004B4190F83B0101280CBF0126002648EA55 +:10B83000050046EA04010840BDE8F0810CF101036F +:10B8400003F0FF0C6245D3D8F1E72DE9F05F1F4606 +:10B8500090460E46814600F0C6FA7A4D04461028FE +:10B860003CD00146AB780020002B0ED92A1892F864 +:10B8700003218A4205D110281CBF1220BDE8F09F89 +:10B8800003E0401CC0B28342F0D8082B3FD2102CFA +:10B8900027D0AE781022701CA87005EB061909F1AC +:10B8A0000300414600F0B6FF09F18300102239463B +:10B8B00000F0B0FF1021384600F089FF3544102118 +:10B8C00085F84301404600F082FF85F84B0185F87A +:10B8D0000341002085F83B01BDE8F09FAB78082BC1 +:10B8E00015D22C78CA46601C287005EBC409306854 +:10B8F000C9F85401B0884FF0000BA9F85801102C7A +:10B9000028BFFFDF89F853A189F85AB1C1E70720A2 +:10B91000BDE8F09F70B44B488178491E4BB2002BB4 +:10B92000BCBF70BC704700BF817803F0FF0C491E9C +:10B93000CAB2827050FA83F191F8031194453ED057 +:10B9400000EB021500EB0C14D5F80360C4F803609B +:10B95000D5F80760C4F80760D5F80B60C4F80B6031 +:10B96000D5F80F60C4F80F60D5F88360C4F8836021 +:10B97000D5F88760C4F88760D5F88B60C4F88B6011 +:10B98000D5F88F50C4F88F50851800EB0C0402EBEB +:10B99000420295F803610CEB4C0C00EB420284F878 +:10B9A000036100EB4C0CD2F80B61CCF80B61B2F8E0 +:10B9B0000F21ACF80F2195F83B2184F83B2100EBD7 +:10B9C000C10292F85A2112F0010F33D190F802C04F +:10B9D0000022BCF1000F0BD9841894F803518D425A +:10B9E00002D1102A26D103E0521CD2B29445F3D8DA +:10B9F0000278521ED2B202708A421BD000EBC20201 +:10BA000000EBC10CD2F85341CCF85341D2F8572186 +:10BA1000CCF85721847890F800C00022002C09D976 +:10BA2000851895F80351654512D1102A1CBF0244B0 +:10BA300082F80311591E4BB2002BBFF675AF70BCD4 +:10BA400070470000100F00206C01002060010020F2 +:10BA5000521CD2B29442E3D8ECE7FE4948707047DA +:10BA6000FC484078704738B14AF2B811884203D890 +:10BA7000F84988800120704700207047F548808889 +:10BA8000704710B500F0AFF9102814D0F24A014603 +:10BA9000002092F802C0BCF1000F0CD9131893F8E3 +:10BAA00003318B4203D1102818BF10BD03E0401CA6 +:10BAB000C0B28445F2D8082010BDE7498A78824296 +:10BAC00086BF01EB0010833000207047E24B93F8F3 +:10BAD00002C084459CBF00207047184490F80301C1 +:10BAE00003EBC00090F853310B70D0F85411116083 +:10BAF000B0F85801908001207047D74A114491F85E +:10BB00000321D4490A700268C1F806208088488160 +:10BB1000704770B516460C460546FBF7A9F9FAF7CB +:10BB200080FBCC48407868B1CB48817851B12A1964 +:10BB3000002E0CBF8330C01CFAF74DFBFAF794FBC4 +:10BB4000012070BD002070BD10B5FAF7BBFB0028C6 +:10BB500004BFFF2010BDBDE81040FAF7D9BBFAF7CB +:10BB6000B1BBBD498A7882429CBF0020704708441F +:10BB700090F8030101EBC00090F85A0100F00100B9 +:10BB800070472DE9F047B44E00273D463078002835 +:10BB90008CBFDFF8C882BDE8F0870024B0780028A9 +:10BBA00008D9311991F80321AA4204D0611CCCB202 +:10BBB000A042F6D81024A04286BF06EB0410C01C99 +:10BBC000002006EBC50999F85A1111F0010F16D0A3 +:10BBD00050B1102C04D0311991F83B11012903D038 +:10BBE000102100F0F4FD50B108F8074038467B1CE6 +:10BBF00099F8532109F5AA71DFB2FAF799FD681C8B +:10BC0000C5B23078A842C8D8BDE8F0872DE9F04128 +:10BC1000914C00263546A07800288CBF8F4FBDE898 +:10BC2000F0816119C0B291F80381A84286BF04EB8C +:10BC30000510C01C002091F83B11012903D01021F0 +:10BC400000F0C5FD58B104EBC800BD5590F8532174 +:10BC500000F5AA713046731CDEB2FAF769FD681C64 +:10BC6000C5B2A078A842DCD8BDE8F08101447A488A +:10BC700010B500EB02100A4601218330FAF7ABFA47 +:10BC8000BDE81040FAF7F0BA0A46724910B5497893 +:10BC900041B1714B997829B10244D81CFAF79BFA4B +:10BCA000012010BD002010BD6B4A01EB410102EBE9 +:10BCB00041010268C1F80B218088A1F80F0170478B +:10BCC0002DE9F041644D07460024A878002898BF6C +:10BCD000BDE8F081C0B2A04217D905EB041010F105 +:10BCE000830612D01021304600F071FD68B904EBD4 +:10BCF000440005EB400808F20B113A463046FBF7CA +:10BD0000D4FCB8F80F01A8F80F01601CC4B2A878E1 +:10BD1000A042DFD8BDE8F08101461022504800F073 +:10BD200079BD4F4870474C498A78824203D90A1836 +:10BD300092F843210AB10020704700EB400001EB6C +:10BD4000400000F20B10704743498A78824206D9BE +:10BD5000084490F83B01002804BF012070470020F0 +:10BD600070472DE9F0410E4607461546062130463C +:10BD700000F02DFD384C98B1A17871B104F59D709B +:10BD800011F0010F18BF00F8015FA178490804D035 +:10BD9000457000F8025F491EFAD10120BDE8F0812C +:10BDA0003846314600F01FF8102819D0A37800213A +:10BDB000002B15D9621892F8032182420BD1102969 +:10BDC00018BF08290CD004EB010080F83B514FF05C +:10BDD0000100BDE8F08101F10101C9B28B42E9D84F +:10BDE0000020BDE8F0812DE9F0411B4D06460024FE +:10BDF00028780F46002811D905EBC40090F853119C +:10BE0000B14206D10622394600F5AA7008F03EFD7F +:10BE100038B1601CC4B22878A042EDD81020BDE82B +:10BE2000F0812046BDE8F0810B4910B44A7801EB5F +:10BE3000C003521E4A70002283F85A2191F802C0B2 +:10BE4000BCF1000F16D98B1893F8034184420DD131 +:10BE5000102A07E060010020100F00206C01002074 +:10BE6000E31000201CBF10BC704703E0521CD2B28C +:10BE70009445E8D80A78521ED2B20A7082421BD08A +:10BE800001EBC20201EBC003D2F853C1C3F853C1A6 +:10BE9000D2F85721C3F857218C7891F800C00022BE +:10BEA000002C09D98B1893F80331634506D1102A69 +:10BEB0001CBF114481F8030110BC7047521CD2B260 +:10BEC0009442EFD810BC704770B449490D188A7875 +:10BED000521ED3B28B7095F8032198423DD001EBEE +:10BEE000001401EB031C00EB4000DCF80360C4F815 +:10BEF0000360DCF80760C4F80760DCF80B60C4F886 +:10BF00000B60DCF80F60C4F80F60DCF88360C4F8E5 +:10BF10008360DCF88760C4F88760DCF88B60C4F865 +:10BF20008B60DCF88FC0C4F88FC001EB030C03EB0F +:10BF300043039CF8034101EB430385F8034101EB04 +:10BF40004000D3F80B41C0F80B41B3F80F31A0F813 +:10BF50000F319CF83B0185F83B0101EBC20090F8E2 +:10BF60005A0110F0010F1CBF70BC704700208C7884 +:10BF7000002C0DD90B1893F803C1944504D1102857 +:10BF80001CBF70BC704703E0401CC0B28442F1D8B3 +:10BF90000878401EC0B20870904204BF70BC704761 +:10BFA00001EBC20301EBC000D0F853C1C3F853C189 +:10BFB000D0F85701C3F857018C780B780020002C7B +:10BFC0009CBF70BC704700BF01EB000C9CF803C124 +:10BFD0009C4506D110281CBF084480F8032170BC82 +:10BFE0007047401CC0B28442EED870BC704700005D +:10BFF000100F002010B50A7B02F01F020A73002206 +:10C0000002768B1893F808C00CF001034FEA5C0C21 +:10C010000CF0010423444FEA5C0C0CF001042344AF +:10C020004FEA5C0C0CF001041C444FEA5C0303F083 +:10C03000010CA4445B0803F00104A4445B0803F072 +:10C040000104A4440CEB530300EB020C521C8CF8CB +:10C05000133090F818C0D2B263440376052AD0D3C7 +:10C06000D8B2252888BFFFDF10BD0023C3834284D8 +:10C0700001EBC202521EB2FBF1F10184704770B4B1 +:10C080006FF01F02010C02EA90251F23A1F5AA40C0 +:10C0900054381CBFA1F5AA40B0F1550009D0A1F554 +:10C0A0002850AA381EBFA1F52A40B0F1AA000120ED +:10C0B00000D100204FF0000C624664468CEA010675 +:10C0C000F6431643B6F1FF3F11D005F001064FEAE3 +:10C0D0005C0C4CEAC63C03F0010652086D085B0894 +:10C0E000641C42EAC632162CE8D370BC704770BCA0 +:10C0F000002070472DE9F047012700250446032959 +:10C100000FD04FF4FA4200297ED0012900F00881B7 +:10C11000022918BFBDE8F0870146BDE8F047583056 +:10C1200068E704F158068021304608F07CFCB571C0 +:10C13000F57135737573F573357475717576B576FC +:10C14000212086F83E00412086F83F00FE2086F838 +:10C15000740084F82C50258484F8547084F8557049 +:10C16000282084F856001B20208760874FF4A47095 +:10C17000E087A0871B20208660864FF4A470E086AD +:10C18000A0861B20A4F84000A4F844004FF4A4703B +:10C19000A4F84600A4F842001B20A4F84A00A4F822 +:10C1A0004C00A4F8480067734FF448606080A4F81E +:10C1B000D850A4F8DA50A4F8DC50A4F8DE50A4F863 +:10C1C000E050A4F8E25084F8E55084F8E750A4F871 +:10C1D000EE5084F8EC50A4F80051A4F8025184F811 +:10C1E000A25184F8A35184F8AC5184F8AD5184F87D +:10C1F000715184F8785184F87B5184F89451C4F8D3 +:10C200008C51C4F8905100E001E0BDE8F087A4F83B +:10C21000EE5084F8E6506088FE490144B1FBF0F12D +:10C22000A4F878104BF68031A4F87A10E388A4F8CB +:10C230007E50B4F882C0DB000CFB00FCB3FBF0F3D3 +:10C240009CFBF0FC5B1CA4F882C09BB203FB00FCCF +:10C2500004F15801A4F88030BCF5C84FC4BF5B1E80 +:10C260000B85B2FBF0F2521CCA8500F5802202F564 +:10C27000EE32531EB3FBF0F20A84CB8B03FB00F2C9 +:10C28000B2FBF0F0C883214604F15800FFF7B2FE7C +:10C2900007F00DFCE0B3D4F80E006FF01F014FEA79 +:10C2A000104C01EA90281F26ACF5AA4054381CBF58 +:10C2B000ACF5AA40B0F155000AD0ACF52850AA3828 +:10C2C0001EBFACF52A40B0F1AA004FF0010901D120 +:10C2D0004FF00009002108464FEA010281EA0C03F1 +:10C2E000DB430343B3F1FF3F16D008F001034908D5 +:10C2F00041EAC33106F0010340087608521C40EAC7 +:10C30000C3304FEA5808162AE8D3B9F1000F03D01A +:10C3100084F87051BDE8F08784F87071BDE8F0874B +:10C32000B4F89C11B4F8A031B4F802C004F158007C +:10C33000A4F87E50B4F88240DB0004FB0CF4B3FB9D +:10C34000F1F394FBF1F45B1C44859BB203FB01F415 +:10C350000385B4F5C84FC4BF5B1E0385B2FBF1F281 +:10C36000521CC285428C01EBC202521EB2FBF1F29A +:10C370000284C28B02FB0CF2B2FBF1F1C183BDE877 +:10C38000F08770B50025044603290DD04FF4FA421A +:10C39000002963D001297DD0022918BF70BD014654 +:10C3A000BDE87040583025E604F15806802130463B +:10C3B00008F039FBB571F57135737573F573357424 +:10C3C00075717576B576212086F83E00412086F895 +:10C3D0003F00FE2086F8740084F82C50258401204C +:10C3E00084F8540084F85500282184F856101B2145 +:10C3F000218761874FF4A471E187A1871B212186E2 +:10C4000061864FF4A471E186A1861B21A4F8401037 +:10C41000A4F844104FF4A471A4F84610A4F84210F4 +:10C420001B21A4F84A10A4F84C10A4F8481060731B +:10C43000A4F8E050202084F8E20084F8D850C4F832 +:10C44000DC5084F80C5184F80D5184F8165184F8AE +:10C45000175184F8FC5084F8085170BD60886D490C +:10C460000144B1FBF0F1A4F878104BF68031A4F848 +:10C470007A10E388A4F87E50B4F882C0DB000CFB8D +:10C4800000FC9CFBF0FCB3FBF0F304F15801A4F8B2 +:10C4900082C000E022E05B1C9BB203FB00FCA4F81E +:10C4A0008030BCF5C84FC4BF5B1E0B85B2FBF0F2F9 +:10C4B000521CCA8500F5802202F5EE32531EB3FBF2 +:10C4C000F0F20A84CB8B03FB00F2B2FBF0F0C883DE +:10C4D000214604F15800BDE870408BE5D4F80031E6 +:10C4E000B4F802C004F158005989DB89A4F87E50E1 +:10C4F000B4F88240DB0004FB0CF4B3FBF1F394FBD3 +:10C50000F1F45B1C44859BB203FB01F40385B4F595 +:10C51000C84FC4BF5B1E0385B2FBF1F2521CC2853B +:10C52000428C01EBC202521EB2FBF1F20284C28BBA +:10C5300002FB0CF2B2FBF1F1C18370BD2DE9F003F7 +:10C54000047E0CB1252C03D9BDE8F00312207047FE +:10C55000002A02BF0020BDE8F003704791F80DC02B +:10C560001F2601232C4D4FF00008BCF1000F79D09D +:10C57000BCF1010F1EBF1F20BDE8F0037047B0F8EB +:10C5800000C00A7C8F7B91F80F907A404F7C87EA3D +:10C59000090742EA072282EA0C0C00270CF0FF0987 +:10C5A0004FEA1C2C99FAA9F99CFAACFC4FEA1969DC +:10C5B0004FEA1C6C49EA0C2C0CEB0C1C7F1C9444BD +:10C5C000FFB21FFA8CFC032FE8D38CEA020C124F47 +:10C5D0000022ECFB057212096FF0240502FB05C274 +:10C5E000D2B201EBD207427602F007053F7A03FA96 +:10C5F00005F52F4218BF82767ED104FB0CF2120C97 +:10C60000521CD2B25FF0000400EB040C9CF813C083 +:10C61000944503E0FFDB050053E4B36E3CBFA2EB9F +:10C620000C02D2B213D30D194FF0000C95F808503C +:10C6300003FA0CF73D421CBF521ED2B2002A6AD048 +:10C640000CF1010C0CF0FF0CBCF1080FF0D304F15D +:10C65000010C0CF0FF04052CD6D33046BDE8F003E6 +:10C660007047FFE790F819C00C7E474604FB02C2F2 +:10C67000FE4C4FF0000CE2FB054C4FEA1C1C6FF027 +:10C6800024040CFB0422D2B201EBD204427602F065 +:10C69000070C247A03FA0CFC14EA0C0F1FBF8276F5 +:10C6A0004046BDE8F003704790F818C0B2FBFCF4B8 +:10C6B0000CFB1422521CD2B25FF0000400EB040CFD +:10C6C0009CF813C094453CBFA2EB0C02D2B212D32B +:10C6D0000D194FF0000C2D7A03FA0CF815EA080F2B +:10C6E0001CBF521ED2B27AB10CF1010C0CF0FF0C3F +:10C6F000BCF1080FF0D300E010E004F1010C0CF0E5 +:10C70000FF04052CDAD3A8E70CEBC4018176384688 +:10C71000BDE8F00370470CEBC40181764046BDE8EC +:10C72000F0037047D24A016812681140D14A12687A +:10C7300011430160704730B4CF49CD4B00244FF016 +:10C74000010C0A78521CD2B20A70202A08BF0C7061 +:10C750000D781A680CFA05F52A42F2D009780268B9 +:10C760000CFA01F15140016030BC7047017931F0A1 +:10C770001F0113BF002000221146704710B4435C14 +:10C78000491C03F0010C5B0803F00104A4445B089E +:10C7900003F00104A4445B0803F00104A4445B0813 +:10C7A00003F00104A4445B0803F001045B08A44403 +:10C7B00003F00104A4440CEB53031A44D2B205293C +:10C7C000DDDB012A8CBF0120002010BC704730B493 +:10C7D0000022A1F1010CBCF1000F11DD431E11F08C +:10C7E000010F08BF13F8012F5C785FEA6C0C07D0CB +:10C7F00013F8025F22435C782A43BCF1010CF7D1A5 +:10C80000491E5CBF405C0243002A0CBF012000208F +:10C8100030BC7047002A08BF70471144401E12F018 +:10C82000010F03D011F8013D00F8013F520808BF85 +:10C83000704700BF11F8013C437011F8023D00F849 +:10C84000023F521EF6D1704770B58CB000F1100453 +:10C850001D4616460DF1FF3C5FF0080014F8012C50 +:10C860008CF8012014F8022D0CF8022F401EF5D18F +:10C8700001F1100C6C460DF10F0108201CF8012C81 +:10C880004A701CF8022D01F8022F401EF6D12046F6 +:10C8900006F04EFF7EB16A1E04F130005FF0080121 +:10C8A00010F8013C537010F8023D02F8023F491E97 +:10C8B000F6D10CB070BD08982860099868600A9895 +:10C8C000A8600B98E8600CB070BD38B505460C4602 +:10C8D0006846FAF7F2FA002808BF38BD9DF9002033 +:10C8E0002272A07E607294F90A100020511A48BF8B +:10C8F000494295F82D308B42C8BF38BDFF2B08BF89 +:10C9000038BDE17A491CC9B2E17295F82E309942DE +:10C9100003D8A17A7F2918BF38BDA2720020E07227 +:10C92000012038BD0C2818BF0B2810D00D2818BFC7 +:10C930001F280CD0202818BF212808D0222818BF73 +:10C94000232804D024281EBF2628002070474FF03B +:10C95000010070470C2963D2DFE801F006090E13CD +:10C96000161B323C415C484E002A5BD058E0072A37 +:10C9700018BF082A56D053E00C2A18BF0B2A51D0F2 +:10C980004EE00D2A4ED04BE0A2F10F000C2849D901 +:10C9900046E023B1A2F110000B2843D940E0122A4F +:10C9A00018BF112A3ED090F8360020B1122A37D392 +:10C9B0001A2A37D934E0162A32D31A2A32D92FE06C +:10C9C000A2F10F0103292DD990F8360008B31B2AD4 +:10C9D00028D925E0002B08BF042A21D122E013B179 +:10C9E000062A1FD01CE0012A1AD11BE01C2A1CBFFA +:10C9F0001D2A1E2A16D013E01F2A18BF202A11D084 +:10CA0000212A18BF222A0DD0232A1CBF242A262A15 +:10CA100008D005E013B10E2A04D001E0052A01D0A8 +:10CA200000207047012070472DE9F0410D46044673 +:10CA30008668F8F76CF958B9F7F79AFF40F2347145 +:10CA4000F7F797FCA0602046F8F761F90028F3D0CB +:10CA5000DDB13046A168F8F7A4FC002815DD2844B4 +:10CA6000401EB0FBF5F707FB05F107E053E4B36E9A +:10CA7000E04F0200E44F0200740100203046F7F757 +:10CA800078FCA0603846BDE8F0810020BDE8F08168 +:10CA900070B50446904228BF70BD101B64280AD3AD +:10CAA00025188D4205D8F8F7B0FC00281CBF284691 +:10CAB00070BD204670BD6420F2E74A88A0F840208F +:10CAC000CA88A0F844208A880989A0F84220A0F8E2 +:10CAD0004610704711F00C0F13D001F0040100292B +:10CAE0000DBF4022102296214FF4167101F5BC7142 +:10CAF000A0EB010388428CBF93FBF2F0002080B2D0 +:10CB00007047022919BF6FF00D0101EBD0006FF0E3 +:10CB10000E0101EB9000F2E7808E7047C08E7047E7 +:10CB2000084418449830002A14BF04210021084406 +:10CB3000704730B491F854300A8E13F00C0F4FF454 +:10CB4000747C1CBF0CEB821292B21DD08B8E934270 +:10CB500038BF1A464B8E91F8554014F00C0F1CBF8D +:10CB60000CEB83139BB217D0C98E994238BF0B468A +:10CB700000280CBF01200020D1189831002818BFD0 +:10CB80000420084430BC7047022B07BF92003C329F +:10CB9000D200703292B2D9E7022C07BF9B003C331F +:10CBA000DB0070339BB2DFE710F0010F1CBF0120E8 +:10CBB000704710F0020F1CBF0220704710F00400F5 +:10CBC00018BF082070472DE9F041054617468846F2 +:10CBD0000126084600F06FFC0446404600F06FFC5A +:10CBE000034610F0010F18BF012008D113F0020F07 +:10CBF00018BF022003D113F0040018BF082014F05E +:10CC0000010F18BF4FF0010C21D000BF50EA0C01FA +:10CC100008BF002613F0030F08BF002014F0030F15 +:10CC200008BF4FF0000C95F85410814208BF002057 +:10CC3000387095F85510614508BF4FF0000C87F823 +:10CC400001C0002808BFBCF1000F1CD10DE014F09A +:10CC5000020F18BF4FF0020CD8D114F0040F14BF0C +:10CC60004FF0080C4FF0000CD0E7404600F02DFCD0 +:10CC7000B5F85810401A00B247F6FE71884201DC40 +:10CC8000002800DC00263046BDE8F08101281CBFEA +:10CC900002280020704718B4CBB2C1F3072CC1B2F0 +:10CCA000C0F30720012B05D0022B08BFBCF1020FF7 +:10CCB0001BD002E0BCF1010F17D0012904D00229DA +:10CCC00008BF022811D001E001280ED001EA0C01B2 +:10CCD00061F3070210EA030060F30F22D0B210F0F4 +:10CCE000020F18BF02200BD106E0084003EA0C0136 +:10CCF000084060F30702EFE710F0010018BF0120C1 +:10CD00008DF80000C2F3072010F0020F18BF0220B8 +:10CD100003D110F0010018BF01208DF80100BDF80B +:10CD2000000018BC7047162A10D12A220C2818BF00 +:10CD30000D280FD04FF0230C1F280DD031B10878EB +:10CD4000012818BF002805D0162805D000207047FC +:10CD5000012070471A70FBE783F800C0F8E701294B +:10CD600002D0022905D007E0002804BF40F2E240CB +:10CD7000704740F6C410704700B5FFDF40F2E24054 +:10CD800000BD8A8EC98E00280CBF012000201144EE +:10CD90009831002818BF0420084470474078704735 +:10CDA00030B50546007801F00F0220F00F00104367 +:10CDB0002870092912D2DFE801F0050705070509E7 +:10CDC000050B0F0006240BE00C2409E0222407E0E9 +:10CDD00001240020E87003E00E2401E00024FFDFBE +:10CDE0006C7030BD007800F00F0070470A68C0F822 +:10CDF00003208988A0F807107047D0F803200A6044 +:10CE0000B0F80700888070470A68C0F80920898850 +:10CE1000A0F80D107047D0F809200A60B0F80D0096 +:10CE2000888070470278402322F0400203EA811193 +:10CE30001143017070470078C0F38010704702788A +:10CE4000802322F0800203EAC11111430170704770 +:10CE50000078C009704770B514460E4605461F2A73 +:10CE600088BFFFDF2246314605F1090007F03AFD91 +:10CE7000A01D687070BD70B544780E460546062C3E +:10CE800038BFFFDFA01F84B21F2C88BF1F2422469B +:10CE900005F10901304607F025FD204670BD70B54B +:10CEA00014460E4605461F2A88BFFFDF224631463C +:10CEB00005F1090007F016FDA01D687070BD096836 +:10CEC000C0F80F1070470A88A0F8132089784175C0 +:10CED000704790F8242001F01F0122F01F02114337 +:10CEE00080F824107047072988BF072190F8242074 +:10CEF000E02322F0E00203EA4111114380F82410FC +:10CF000070471F3007F0A3BE10B5044600F009FBC0 +:10CF1000002818BF204410BDC17811F03F0F1BBF7F +:10CF2000027912F0010F0022012211F03F0F1BBF06 +:10CF3000037913F0020F002301231A4402EB42028B +:10CF4000530011F03F0F1BBF027912F0080F0022AF +:10CF5000012203EB420311F03F0F1BBF027912F0D5 +:10CF6000040F00220122134411F03F0F1BBF02796E +:10CF700012F0200F0022012202EBC20203EB420357 +:10CF800011F03F0F1BBF027912F0100F0022012297 +:10CF900002EB42021A4411F03F0F1BBF007910F060 +:10CFA000400F00200120104410F0FF0014BF0121A9 +:10CFB00000210844C0B2704770B50278417802F091 +:10CFC0000F02082A4DD2DFE802F004080B4C4C4C4B +:10CFD0000F14881F1F280AD943E00C2907D040E00E +:10CFE000881F1F2803D93CE0881F1F2839D801203B +:10CFF00070BD4A1EFE2A34D88446C07800258209B6 +:10D00000032A09D000F03F04601C884204D860461F +:10D01000FFF782FFA04201D9284670BD9CF80300AB +:10D020004FF0010610F03F0F1EBF1CF10400007806 +:10D0300010F0100F13D064460421604600F071FA1E +:10D04000002818BF14EB0000E6D0017801F03F0182 +:10D050002529E1D280780221B1EB501FDCD3304684 +:10D0600070BD002070BD70B50178012501F00F0181 +:10D07000002404290AD007290DD008291CBF00204C +:10D0800070BD40780E2836D0204670BD4078801F95 +:10D090001F2830D9F8E7844640789CF803108A09A5 +:10D0A000032AF1D001F03F06711C8142ECD86046A2 +:10D0B000FFF732FFB042E7D89CF8030010F03F0FB3 +:10D0C0001EBF1CF10400007810F0100F13D066464C +:10D0D0000421604600F025FA002818BF16EB000076 +:10D0E000D2D0017801F03F012529CDD280780221EC +:10D0F000B1EB501FC8D3284670BD10B4017801F0C1 +:10D100000F01032920D0052921D14478B0F8191046 +:10D11000B0F81BC0B0F81730827D222C17D1062939 +:10D1200015D3B1F5486F98BFBCF5FA7F0FD272B135 +:10D13000082A98BF8A420AD28B429CBFB0F81D00D1 +:10D14000B0F5486F03D805E040780C2802D010BC39 +:10D150000020704710BC012070472DE9F0411F46A8 +:10D1600014460D00064608BFFFDF2146304600F09A +:10D17000D8F9040008BFFFDF30193A462946BDE858 +:10D18000F04107F0AFBBC07800F03F007047C0220D +:10D1900002EA8111C27802F03F021143C170704768 +:10D1A000C07880097047C9B201F00102C1F34003A1 +:10D1B0001A4402EB4202C1F3800303EB4202C1F3C3 +:10D1C000C00302EB4302C1F3001303EB43031A4411 +:10D1D000C1F3401303EBC30302EB4302C1F380131B +:10D1E0001A4412F0FF0202D0521CD2B20171C3786D +:10D1F00002F03F0103F0C0031943C170511C41709C +:10D2000070472DE9F0410546C078164600F03F040E +:10D210001019401C0F46FF2888BFFFDF281932462F +:10D220003946001D07F05EFBA019401C6870BDE880 +:10D23000F081C178407801F03F01401A401E80B271 +:10D24000704710B590F803C00B460CF03F014478CE +:10D250000CF03F0CA4EB0C0CACF1010C1FFA8CF49D +:10D26000944288BF14462BB10844011D224618463B +:10D2700007F038FB204610BD4078704700B50278B3 +:10D2800001F0030322F003021A430270012914BFC4 +:10D290000229002104D0032916BFFFDF012100BDB0 +:10D2A000417000BD00B5027801F0030322F00302D3 +:10D2B0001A430270012914BF0229002104D0032956 +:10D2C00016BFFFDF012100BD417000BD007800F0F6 +:10D2D00003007047417841B1C078192803D2C04A91 +:10D2E000105C884201D1012070470020704730B5A2 +:10D2F00001240546C17019293CBFB948445C02D3DA +:10D30000FF2918BFFFDF6C7030BD70B515460E46A3 +:10D3100004461B2A88BFFFDF65702A463146E01CA1 +:10D32000BDE8704007F0DEBAB0F807007047B0F80B +:10D3300009007047C172090A01737047B0F80B0009 +:10D34000704730B4B0F80720B0F809C0B0F8053025 +:10D350000179941F40F67A45AC4298BFBCF5FA7F3C +:10D360000ED269B1082998BF914209D293429FBF5A +:10D37000B0F80B00B0F5486F012030BC98BF704783 +:10D38000002030BC7047001D07F061BC021D08463C +:10D39000114607F05CBCB0F809007047007970478F +:10D3A0000A68426049688160704742680A60806824 +:10D3B000486070470988818170478089088070477C +:10D3C0000A68C0F80E204968C0F812107047D0F8FB +:10D3D0000E200A60D0F81200486070470968C0F853 +:10D3E00016107047D0F81600086070470A6842604F +:10D3F00049688160704742680A6080684860704789 +:10D400000968C1607047C06808607047007970475C +:10D410000A68426049688160704742680A608068B3 +:10D42000486070470171090A417170478171090AAA +:10D43000C17170470172090A417270478172090A0D +:10D44000C172704780887047C088704700897047F4 +:10D450004089704701891B2924BF4189B1F5A47F08 +:10D4600007D381881B2921BFC088B0F5A47F012084 +:10D470007047002070470A684260496881607047C1 +:10D4800042680A60806848607047017911F0070FB0 +:10D490001BBF407910F0070F002001207047017971 +:10D4A00011F0070F1BBF407910F0070F002001207B +:10D4B000704701717047007970474171704740793A +:10D4C00070478171090AC1717047C088704745A2D1 +:10D4D00082B0D2E90012CDE900120179407901F061 +:10D4E000070269461DF80220012A07D800F007004C +:10D4F000085C01289EBF012002B07047002002B0E6 +:10D5000070470171704700797047417170474079E9 +:10D51000704730B50C460546FB2988BFFFDF6C70AD +:10D5200030BDC378024613F03F0008BF70470520A6 +:10D53000127903F03F0312F0010F36D0002914BF17 +:10D540000B20704712F0020F32D0012914BF801D4A +:10D55000704700BF12F0040F2DD0022914BF401CE9 +:10D56000704700BF12F0080F28D0032914BF801C99 +:10D57000704700BF12F0100F23D0042914BFC01C45 +:10D58000704700BF12F0200F1ED005291ABF1230BD +:10D59000C0B2704712F0400F19D006291ABF401CC4 +:10D5A000C0B27047072918D114E00029CAD114E08D +:10D5B0000129CFD111E00229D4D10EE00329D9D11C +:10D5C0000BE00429DED108E00529E3D105E00629B6 +:10D5D000E8D102E0834288BF704700207047000016 +:10D5E000E84F020000010102010202032DE9F041AF +:10D5F000FE4E0446736893F828000127002528B1E1 +:10D6000093F8A001D8B993F84801C0B193F8480144 +:10D6100098B383F8A071D3F84C113C2269B36570BC +:10D62000201D07F05FF9052020702771706890F8C1 +:10D63000A011002918BF80F8485107D034E083F8C2 +:10D64000A05103F12A014FF48E72E7E71D212A3021 +:10D6500007F0C7F970687F2180F84510FF2180F836 +:10D66000381080F82B1080F83E10818E21F0600178 +:10D670002031818680F8285016E0FFE793F82200D9 +:10D68000012814D0187801281BD093F850010128E4 +:10D690001CBF0020BDE8F081657018202070D3F811 +:10D6A0005201606083F850510120BDE8F08165703F +:10D6B00007202070586A606083F822500120BDE87E +:10D6C000F0816570142020702022991C201D07F025 +:10D6D00009F9257271680D7081F85051C44882882B +:10D6E0008284D0F86421527B80F8262080F8227052 +:10D6F000D1F864010088F5F72BF9F4F7D2FDD3E7F0 +:10D70000BA4840680178002914BF80884FF6FF703E +:10D71000704770B5B54C0546606890F874112046A6 +:10D720000629806803D0FFF73BFD38B117E0FFF70B +:10D7300037FD90B9A068FFF733FD10E0616891F8FC +:10D740007401082809D025B191F83E00FF2806D0C1 +:10D7500003E091F82B00FF2801D0012070BD0020CC +:10D7600070BDF8B5A14C07460E46606890F82810C9 +:10D77000002906BF90F848110029F8BD00F13305D3 +:10D7800020787F2808BFFFDF207828707F20207056 +:10D79000606890F89A1100F5D470085C012808BF01 +:10D7A000012503D0022814BFFFDF0225606880F83E +:10D7B000365090F8971180F8461090F874110729A8 +:10D7C0000CD190F8A401012808BF012503D002283C +:10D7D00014BFFFDF0225606880F83750606890F85A +:10D7E00074010025062804D1A068FFF7D9FC0028A1 +:10D7F0003DD0606890F87411082904BF90F8A10129 +:10D8000002280ED04FF00301A068FFF77DFB40B166 +:10D8100041780A09616881F838200088C0F30B005C +:10D8200048870095A068FFF7DDFA01466068BDF8FB +:10D83000005090F83420520962F34615ADF80050BC +:10D84000072918BFFFDF1CD0BDF8000000906068FA +:10D85000BDF8001081860421A068FFF755FB002861 +:10D860007DD0B0F80100C004C00C79D0ABE0A06856 +:10D87000C17811F03F0F1CBF007910F0100FB8D124 +:10D88000CFE790F87411062916D0072936D0082959 +:10D8900073D00A2918BFFFDFD6D145F00A01ADF8D1 +:10D8A000001090F83E00FF2814BF0120002060F314 +:10D8B0008201ADF80010C7E7A068FFF771FC58B10E +:10D8C000012808BF45F0010046D0022814BFFFDF41 +:10D8D00045F0020040D0B7E7A068C17811F03F0FD3 +:10D8E0001CBF007910F0020FAED00120FFF711FF2E +:10D8F000002808BF45F004002ED0A5E7A068FFF778 +:10D900004FFCB0B1012804BF45F00100ADF80000A4 +:10D910000FD0022898D145F00200ADF80000A168B0 +:10D92000CA7812F03F0F1CBF097911F0020F21D104 +:10D9300018E0A068C17811F03F0F1CBF007910F00B +:10D94000020F05D1606890F83E00FF283FF47CAFDD +:10D95000BDF8000040F00400ADF8000074E726E0D8 +:10D960002AE00AE0616891F83E10FF2908BF20F024 +:10D970000400F1D040F00400EEE790F83E10FF29DB +:10D980001CBF45F00401ADF8001090F8A101022879 +:10D99000BDF800000CBF40F0080020F00800ADF812 +:10D9A00000000CBF40F0020020F00200D4E76068E5 +:10D9B000818E21F0600105E06068818E21F06001B8 +:10D9C00001F140018186606890F87401A068C17817 +:10D9D00011F03F0F10D0017911F0400F0CD04FF033 +:10D9E0000601FFF791FA0078616803E078010020F2 +:10D9F000F410002081F84500606890F87401062852 +:10DA000004D00020FFF785FE18BB04E0022F18BFEA +:10DA1000012FF6D1F8BDA068C17811F03F0F33D0C7 +:10DA2000017911F0010F2FD0616801F12C0791F8F5 +:10DA3000783101F12B05FF2B0CD03A4629461846C8 +:10DA4000FEF744F8002808BFFFDF287840F0020006 +:10DA5000287019E0FFF7EFF92870A068FFF7C2F906 +:10DA6000072804D23946A068FFF7C7F90CE0A06880 +:10DA7000FFF7B8F9072807D10021A068FFF744FA9B +:10DA8000016839608088B8800120FFF742FE80BBC2 +:10DA9000A068C17811F03F0F2BD0017911F0020F6F +:10DAA00027D0616801F13F0591F876216F1E1AB108 +:10DAB000022E18BF032E08D0FFF794F907280AD2C8 +:10DAC0002946A068FFF7A7F912E0D1F85A012860AB +:10DAD000B1F85E010BE0A068FFF784F9072807D1D1 +:10DAE0000121A068FFF710FA016829608088A880EA +:10DAF0003E70606890F87401062808BFF8BD0728DA +:10DB000018BF082802D00A2806D0F8BDA068FFF781 +:10DB100047FB022808BFF8BD606800F14705A06810 +:10DB2000FFF787FB616891F83230C3F1FF02904242 +:10DB300028BF104605D98A8E22F0600202F1400209 +:10DB40008A86C2B203EB0501A068FFF77AFB616821 +:10DB500091F83220104481F83200F8BD2DE9F047E9 +:10DB6000F74D06466C6894F82800002818BFBDE8F9 +:10DB7000F0871D212A34204606F033FF0127277045 +:10DB8000A868FFF72FF920B3012827D002282AD050 +:10DB9000062818BFFFDF2BD004F11D01A868FFF78E +:10DBA0006AF92072686804F1020904F1010890F82A +:10DBB0007801FF2821D04A464146FDF787FF00281B +:10DBC00008BFFFDF98F8000040F0020088F800006E +:10DBD00031E0608940F013006081DDE7608940F04A +:10DBE00015006081DEE7608940F010006081D3E7B6 +:10DBF000608940F012006081CEE7A868FFF71BF94A +:10DC000088F80000A868FFF7EDF8072804D2494615 +:10DC1000A868FFF7F2F80EE0A868FFF7E3F8072816 +:10DC200009D10021A868FFF76FF90168C9F8001051 +:10DC30008088A9F80400287804F109087F2808BF23 +:10DC4000FFDF287888F800004FF07F0985F8009002 +:10DC5000277300206073FF20A073A17A11F0040FD6 +:10DC600008BF20752DD0686804F1150804F1140A66 +:10DC700090F8761119B1022E18BF032E09D0A868AA +:10DC8000FFF7B0F807280BD24146A868FFF7C3F8A2 +:10DC900015E0D0F85A11C8F80010B0F85E010CE099 +:10DCA000A868FFF79FF8072809D10121A868FFF7A6 +:10DCB0002BF90168C8F800108088A8F804008AF8D9 +:10DCC000006084F81B90686890F89711217780F8BD +:10DCD0002870BDE8F047062003F09FBB2DE9F04116 +:10DCE000974C606890F82810FF250026A1B91D21E7 +:10DCF0002A3006F076FE60687F2180F8451080F8B3 +:10DD0000385080F82B5080F83E50818E21F0600111 +:10DD10002031818680F82860606800F5D47290F820 +:10DD20009A11895C80F8A411002002F094FFF8B1E8 +:10DD3000F8F7C8FF6068834990F879010F5C3846AE +:10DD4000F8F72CFD606880F8977190F8A4112520F1 +:10DD5000F8F716FC606890F8A4110120F8F792FD1E +:10DD6000606890F86811032918BF022904D00FE0F9 +:10DD7000BDE8F04100F070BF90F89A1100F5D47042 +:10DD8000085C012804D1012211460020F9F7ADF802 +:10DD9000F9F788F8606890F8A401012807BF012707 +:10DDA000032100270521A068FDF76EFF616881F857 +:10DDB000760140B1002F0CBF50274027F8F71DFA1D +:10DDC0003846F9F742F86068D0F87C01F8F786FF2A +:10DDD000606890F87811FF291CBF00F29110FDF7E0 +:10DDE0008CFE6068062180F8775180F8785180F8C1 +:10DDF000856180F8846180F8A16180F87411BDE8C4 +:10DE0000F08170B54E4C0646606800F5BA75204644 +:10DE1000806841B1D0F80510C5F81D10B0F80900B0 +:10DE2000A5F8210003E005F11D01FEF7E6FFA0685B +:10DE3000FFF701F885F82400A0680021032E018077 +:10DE400002D0052E04D046E00321FEF7A9FF42E0F0 +:10DE50000521FEF7A5FF6068D0F8640100F10E010E +:10DE6000A068FFF72CF86068D0F8640100F1120197 +:10DE7000A068FFF728F8D4E90110D1F86421527D99 +:10DE80008275D1F86421D28AC275120A0276D1F85D +:10DE9000642152884276120A8276D1F864219288EF +:10DEA000C276120A0277D1F86421D2884277120A28 +:10DEB0008277D1F864110831FFF723F86068D0F851 +:10DEC0006401017EA068FFF704F8606890F8AA1169 +:10DED000A068FFF708F805F11D01A068FEF794FFA0 +:10DEE00095F82410A068FEF7AAFF606800F5AD75EC +:10DEF00090F8596190F8751191B190F86811032963 +:10DF000006D190F86111002918BF90F87A0101D16B +:10DF100090F87701FDF707FF00281CBF0126054692 +:10DF20002946A068FEF762FF3146A068BDE8704050 +:10DF3000FEF778BF0249496881F873017047000015 +:10DF4000780100200450020070B5FE4D686890F81A +:10DF5000741102291FBF90F8741101290C2070BDA3 +:10DF600000F166014FF00004C0F84C1180F8484100 +:10DF70004FF01D0100F12A0006F033FD68687F2193 +:10DF800080F84510FF2180F8381080F82B1080F8B9 +:10DF90003E10818E21F060012031818680F828407A +:10DFA000047080F8224080F85041012680F8A0617A +:10DFB00090F8760130B1F8F75BFFF8F732F968684E +:10DFC00080F876416868072180F8724180F86161C5 +:10DFD00080F8684180F8794180F8734180F8A14168 +:10DFE00080F86011002070BDD64910B5886048687F +:10DFF0000021A0F8A51180F8A711012180F8741163 +:10E00000FFF7A2FF002818BFFFDF10BD2DE9F04188 +:10E01000CC4D0446686890F87401012818BF0228A6 +:10E0200004D003281CBF0C20BDE8F081607A0228D0 +:10E0300023D0F8F7D9FA0220F8F74AFE686890F979 +:10E040007301F8F79DFBA868F8F745FEBE48F8F79E +:10E0500025FEBE48F8F79AFB686890F8591100F55C +:10E06000AD70F8F745FB0F210720F8F75DFB6868F6 +:10E0700090F86101F0B1FDF7C9FD6868217A00F5FB +:10E08000D47280F89A11217A895C80F8A4116168B1 +:10E09000C0F87C112168C0F88011627A6AB1012A47 +:10E0A00025D00526022A08BF80F8746178D0032A9B +:10E0B00077D0BCE0FDF765FDDFE7A54C90F8603157 +:10E0C000002100BF90F87921521CA4FB026C4FEA9A +:10E0D0005C0CACEB8C0C624480F8792123FA02F2E0 +:10E0E00012F0010F03D1491CC9B20329EAD300265B +:10E0F00080F8A16190F87111002904BF90F87501B2 +:10E10000002849D0F6F734FC044668682146D0F868 +:10E110006C01F7F746F9DFF83C82074690FBF8F010 +:10E1200008FB107041422046F6F723F96968C1F8F0 +:10E130006C0197FBF8F0D1F89C211044C1F89C01C8 +:10E14000FDF79CFC01466868D0F89C21914223D8D9 +:10E15000C0F89C61C0F86C4190F8750100281CBFA4 +:10E160000120FDF7ADFD0121686890F87221002AB9 +:10E170001CBF90F87121002A0ED090F8593100F59B +:10E18000AD72012B04D1527902F0C002402A09D0AD +:10E1900000F5AD70F9F7C0FA6968042081F87401E0 +:10E1A00045E009E00124FDF7BCFD6968224601F560 +:10E1B000AD71F9F77AFAEFE7002918BFFFDF686859 +:10E1C00000F2A51490F8A701400908BF012703D069 +:10E1D000012814BF00270227F8F774FD207800F00B +:10E1E0003F042046F8F7DAFA686880F8974190F81B +:10E1F000900102280CBF4020FF203946F8F7C0F9F3 +:10E2000039460120F8F7C0FBF8F74CFE0521A86855 +:10E21000FDF73AFD696881F8760128B15024F7F7D7 +:10E22000ECFF2046F8F711FE686880F87461002062 +:10E23000BDE8F08110B5434C606890F87411042972 +:10E240000DD005291CBF0C2010BD90F8A10148B1CC +:10E2500000F025FD6168082081F8740108E0FFF7EF +:10E260003DFD05E000F01BFD6168072081F87401A9 +:10E27000002010BD3349002210F0010F496802D080 +:10E28000012281F8A82110F0080F03D011440820C2 +:10E2900081F8A801002070472A49496881F8700177 +:10E2A000704710B5274C636893F85831022B14BFA0 +:10E2B000032B00280BD100291ABF022901200020BE +:10E2C0001146FDF7DEFB08281CBF012010BD606869 +:10E2D00090F85801002816BF022800200120BDE850 +:10E2E0001040F9F7A3B91748406890F85801002882 +:10E2F00016BF022800200120F9F798B91149496892 +:10E3000081F8580170470F49496881F872017047D8 +:10E3100070B50C4C616891F85801002816BF0228AE +:10E320000020012081F8590101F5AD71F9F768F974 +:10E33000606890F85811022916BF032901210021B5 +:10E340000AE000007801002001500200075002009E +:10E35000ABAAAAAA40420F0080F8751190F8592183 +:10E3600000F5AD734FF00005012A04BF5B7913F08F +:10E37000C00F0AD000F5AD73012A04D15A7902F01A +:10E38000C002402A01D0002200E0012280F8712161 +:10E39000002A04BF002970BDC0F89C51F6F7E8FAC6 +:10E3A0006168C1F86C0191F8750100281CBF00205C +:10E3B000FDF786FC0026606890F8721100291ABFEC +:10E3C00090F87111002970BD90F8592100F5AD71D8 +:10E3D000012A04D1497901F0C001402906D029461B +:10E3E000BDE8704000F5AD70F9F796B9FDF799FCFE +:10E3F00061683246BDE8704001F5AD71F9F755B975 +:10E4000070B5FF4D0C4600280CBF0123002369683E +:10E4100081F8613181F86A014FF0080081F87A01D2 +:10E420000CD1002C1ABF022C012000201146FDF750 +:10E4300028FB6968082881F87A0101D0002070BDA6 +:10E44000022C14BF032C1220F8D170BD002818BF75 +:10E45000112070470328EA4A526808BFC2F86411C5 +:10E4600082F8680100207047E548416891F868012A +:10E47000032804D0012818BF022807D004E091F82F +:10E480006A01012808BF70470020704791F86901B0 +:10E49000012814BF03280120F6D1704770B5F8F7A2 +:10E4A000C8FCF8F7A7FCF8F774FBF8F7FDFBD44CB1 +:10E4B0000025606890F8760130B1F8F7D9FCF7F7DD +:10E4C000B0FE606880F8765160680121A0F8A5511F +:10E4D00080F8A75180F8741180F85051002070BD69 +:10E4E000C74810B5406800F5C47005F032FF002041 +:10E4F00010BDC3480121406890F86821032A03BF7A +:10E5000080F85211D0F864211288002218BF80F8D8 +:10E510005221A0F8542180F850117047B849496839 +:10E5200081F8AA0170470178002311F0010FB44966 +:10E5300049680AD04278032A08BFC1F8643181F8DB +:10E540006821012281F8A8211346027812F0040FF5 +:10E550000CD082784FF0000C032A08BFC1F864C1C8 +:10E5600081F868210B44082283F8A821C27881F839 +:10E5700058210279002A16BF022A0123002381F8BC +:10E58000613181F86921427981F86021807981F8CF +:10E5900070014FF0000070479948406800F5D27054 +:10E5A00070472DE9F041964C05460E46606890F89C +:10E5B0007401032818BFFFDF022D1EBF032DFFDFEC +:10E5C000BDE8F0814FF000074FF00105AEB1606883 +:10E5D00090F8371089B1818E21F0600101F140017E +:10E5E000818690F8282042B980F8285011F0080F51 +:10E5F00014BF0720062002F010FF6068A0F8A57184 +:10E6000080F8A77180F87451BDE8F08100F024BB58 +:10E610002DE9F0477A4C0646894660684FF00108BC +:10E62000072E90F8617138BF032533D3082E4FF0C1 +:10E63000000088BFBDE8F087FFF76BF8002873D1B2 +:10E64000A068C17811F03F0F12D0027912F0010FCB +:10E650000ED061684FF0050591F87621002A18BFA9 +:10E66000B9F1000F16D091F8A411012909D011E0D9 +:10E6700011F03F0F1ABF007910F0100F002F53D187 +:10E680004CE04FF001024FF00501FDF742FA6168DE +:10E6900081F87601A16808782944C0F3801030B170 +:10E6A000487900F0C000402808BF012000D00020B9 +:10E6B000616891F87611002918BF002807D0FDF78E +:10E6C00043FA0146606880F8771180F884816068B9 +:10E6D00090F87711FF292AD080F878110846FDF7C5 +:10E6E00040FA40EA0705606890F87721FF2A18BFD2 +:10E6F000002D10D0072E0ED3A068C17811F03F0F67 +:10E7000009D0017911F0020F05D00B21FDF7AEFA07 +:10E71000606880F885812846BDE8F087FCF7EDFF4A +:10E72000002808BFBDE8F0870120BDE8F087A36896 +:10E7300090F8612159191B78C3F3801C00F27713FC +:10E740006046FDF73EF80546CDE7F0B52C4C074690 +:10E7500083B060686D460078002818BFFFDF002690 +:10E7600061688E70D1F8640102888A8042884A8389 +:10E7700082888A83C088C88381F8206047B10121DC +:10E78000A068FEF7C1FB0546A0680078C10907E054 +:10E790006946A068FEF731FBA0680078C0F38011DD +:10E7A0006068012790F87521002A18BF002904D05D +:10E7B0006A7902F0C002402A29D090F87221002A1A +:10E7C00018BF002903D0697911F0C00F1FD000F1E4 +:10E7D0000E0006F033FA616891F87801FF281CD02A +:10E7E00001F10802C91DFDF771F9002808BFFFDF1C +:10E7F0006068C17941F00201C171D0F8911101E066 +:10E80000780100204161B0F89511018310E029687A +:10E81000C0F80E10A9884182DDE7D1F86401427E7C +:10E82000CA71D0F81A208A60C08B88814E610E832D +:10E8300060680770D0F8642190F8731182F857105F +:10E84000D0F864010088F4F783F8F3F71BFD03B0F8 +:10E85000F0BD2DE9F041FE4C054601266068002719 +:10E8600090F86811012918BF022902D0032918BFA6 +:10E87000FFDF55B1A068FEF79FFB18B9A068FEF74F +:10E88000F2FB10B100F08EFA2DE0606890F8740190 +:10E890007F25801F062828BFBDE8F081DFE800F053 +:10E8A00003191930443EEA48F8F707FB002808BF6F +:10E8B0002570F8F7EDFA606890F8760130B1F8F756 +:10E8C000D7FAF7F7AEFC606880F87671F8F761F96F +:10E8D00020E0DF48F8F7F1FA002808BF2570F8F7C4 +:10E8E000D7FA00F045FA102880F0DE80DFE800F06B +:10E8F00036B6BFC3DCDC12CCD4DCDCDC249C38694B +:10E90000D348F8F7DAFA002808BF2570F8F7C0FAFC +:10E91000F8F73FF9BDE8F041FFF7E0B9CC48F8F768 +:10E92000CCFA30B9257004E0C948F8F7C6FA0028D7 +:10E93000F8D0F8F7ADFA9AE0032002F08CF900283D +:10E9400071D000210320FFF75CFA01221146104626 +:10E95000F8F7CBFA61680C2081F87401BDE8F0810A +:10E96000606800F5BA75042002F075F900287ED0C1 +:10E970000E202870012002F050FDA0686168007828 +:10E98000C0F3401081F8990100210520FFF739FA02 +:10E99000B049A0684FF0200CD1F864210378527B75 +:10E9A00023F020030CEA42121A430270D1F86401EA +:10E9B00095F82530427B1A4042732820D1F8641123 +:10E9C0002DE0062002F047F9002850D0A14D0F207D +:10E9D00085F87401022002F020FD6068012190F8A2 +:10E9E000A4210846F8F781FAA06861680078C0F3AE +:10E9F000401081F8990101210520FFF702FAD5F8AE +:10EA000064014673A068017821F020010170F8F7D5 +:10EA10002EFD002818BFFFDF2820D5F8641181F8EB +:10EA20005600BDE8F08122E0052002F014F9F0B1B3 +:10EA300001210320FFF7E5F9F8F719FD002818BFB9 +:10EA4000FFDF6068012190F8A4210846F8F74DFA2D +:10EA500061680D2081F87401BDE8F0816068A0F85C +:10EA6000A57180F8A77180F87461BDE8F081BDE8F8 +:10EA7000F04100F0F1B86168032081F87401BDE84D +:10EA8000F041082002F0C9BC00F009F961680720D4 +:10EA900081F87401BDE8F08100F001F96168082097 +:10EAA00081F87401BDE8F081FFDFBDE8F08170B549 +:10EAB000674C606890F874110C2929D00D2932D068 +:10EAC0000E2940D00F291CBFFFDF70BD042002F0CB +:10EAD000A4FC606890F8A4110E20F7F751FD002106 +:10EAE0009620F8F74BF9F8F7DDF90521A068FDF756 +:10EAF000CBF8616881F8760128B15025F7F77DFBE6 +:10EB00002846F8F7A2F961680B2081F8740170BDFE +:10EB1000F8F7C8F900219620F8F730F96168092064 +:10EB200081F8740170BD90F8A411FF20F7F728FD5B +:10EB300000219620F8F722F9F8F7B4F961680A2065 +:10EB400081F8740170BD0021A0F8A51180F8A7110B +:10EB5000012180F874110020FFF7F7FDBDE8704037 +:10EB6000032002F05ABC70B5394C606890F87411FB +:10EB70007F25891F062928BF70BDDFE801F0173205 +:10EB80001D033D113248F8F798F9002808BF257099 +:10EB9000F8F77EF9F7F7FDFFBDE87040FFF79EB884 +:10EBA0002B48F8F78AF960BB25702AE02848F8F767 +:10EBB00084F9D8B9257019E090F8371089B1818EA1 +:10EBC000012221F060014031818690F8283043B95C +:10EBD00080F8282011F0080F14BF0720062002F04B +:10EBE0001CFC1B48F8F769F90028E3D0F8F750F946 +:10EBF000BDE8704000F030B81548F8F75EF900281D +:10EC0000D2D0F8F745F96068002100F5C47005F02E +:10EC100051FBBDE8704000F01FB870B50C4C0646C3 +:10EC20000D46012908D0606890F8A4213046BDE85F +:10EC30007040134602F03BBCF7F76AFC616803467C +:10EC4000304691F8A4212946BDE8704002F02FBC5F +:10EC500078010020F410002070B5F8F7EAF8F8F712 +:10EC6000C9F8F7F796FFF8F71FF8FB4C0025606826 +:10EC700090F8760130B1F8F7FBF8F7F7D2FA606850 +:10EC800080F876516068022180F87411A0F8A551CF +:10EC900080F8A751BDE87040002002F0BEBB2DE90E +:10ECA000F041ED4C616891F8A701400908BF0125CA +:10ECB00003D0012814BF00250225D1F88021002AA5 +:10ECC00034D001F2A517002808BF012603D001287F +:10ECD00014BF00260226F7F7F5FF387800F03F074B +:10ECE0003846F7F75BFD606880F8977190F89001FF +:10ECF00002280CBF4020FF203146F7F741FC606836 +:10ED00003246D0F880110120F7F782FEF8F7CAF8F2 +:10ED10000521A068FCF7B8FF616881F8760128B189 +:10ED20005026F7F76AFA3046F8F78FF86068D0F89F +:10ED30007C01F7F7D3FF606890F86811022906D0CC +:10ED4000032904BF90F89001012804D008E090F84E +:10ED50009001022804D12A4601210020F8F7C5F8C5 +:10ED60006068002180F8A45180F88411BDE8F0812A +:10ED7000B94810B5406890F8371089B1818E0122EA +:10ED800021F060014031818690F8283043B980F845 +:10ED9000282011F0080F14BF0720062002F03DFBC9 +:10EDA000022010BD2DE9F04FAB4D83B00024686800 +:10EDB00090F874017F27801F26464FF0010806282F +:10EDC00080F03F82DFE800F003080893FDFC00F0CC +:10EDD000ADFC044600F036BA9F48F8F76EF80028FC +:10EDE00008BF2F70F8F754F8A868FDF7FBFF04463A +:10EDF00007286AD1A868FEF7D3F9696891F89021CD +:10EE0000824262D191F87401062804D1A868FEF705 +:10EE1000C7F9002836D0686890F87411082904BF33 +:10EE200090F8A101022813D04FF00301A868FEF763 +:10EE30006BF8002849D06968437891F83820B2EB24 +:10EE4000131F42D10088498FC0F30B0088423CD188 +:10EE500000212046FFF7DCFBB0B38DF800608DF891 +:10EE600004608DF80860A868FF24C17811F03F0F96 +:10EE70001CBF007910F0020F1CD00120FEF749FCE6 +:10EE800050B117E0A868C17811F03F0F1CBF00799E +:10EE900010F0100FBFD1DBE702AA694601A800F00D +:10EEA000D5F9686890F859419DF80000002818BF0E +:10EEB00044F0020423469DF808209DF804109DF8B4 +:10EEC000000000F0A1FA02E0FFE7FFF751FF04465F +:10EED000686890F87601002800F0B481F7F7C8FF61 +:10EEE000F7F79FF9686880F8766100F0ABB9A86819 +:10EEF000FDF778FF8146A9686868CA7890F8913173 +:10EF00009A4221D10A7990F892319A421CD14A79D9 +:10EF100090F893319A4217D18A7990F894319A42B5 +:10EF200012D1CA7990F895319A420DD10A7A90F8A7 +:10EF300096319A4208D1097890F89801C1F380116E +:10EF4000814208BF012400D00024F7F722FE424886 +:10EF5000F7F7B3FF002808BF2F70F7F799FFB9F153 +:10EF6000040F75D1002C73D0686890F848110029FF +:10EF70006ED190F8281021B190F8341011F0100FD4 +:10EF800066D0D0F84C411D21204605F02AFD84F8BA +:10EF90000080686804F1020A04F1010990F8780120 +:10EFA000FF280FD052464946FCF790FD002808BFC5 +:10EFB000FFDF99F8000040F0020089F800001FE030 +:10EFC0004CE0FFE0A868FDF736FF89F80000A8686C +:10EFD000FDF708FF072804D25146A868FDF70DFF8A +:10EFE0000EE0A868FDF7FEFE072809D10021A868F9 +:10EFF000FDF78AFF0168CAF800108088AAF80400AB +:10F0000004F11D01A868FDF736FF2072287804F18D +:10F0100009097F2808BFFFDF287889F800002F70D2 +:10F020006868618990F8A12162F3000141F01A013A +:10F03000618184F80C806673FF21A1732175E776E6 +:10F0400090F89711217780F84881072002F0E5F9C0 +:10F05000062400F0F7B80000780100204FF0020805 +:10F06000FD48F7F72AFF002808BF2F70F7F710FFB9 +:10F07000A868FDF7B7FE0446A868FEF791F8082CCB +:10F0800008BF00287ED1A8684FF00301C27812F0B3 +:10F090003F0F77D0007931EA000073D1686800F53E +:10F0A000BA7790F86101002814BFBE79FE784FF05E +:10F0B0000009B87878B1FCF747FD0446FF280AD06C +:10F0C0000146A868401DFCF718FDB4420CBF4FF084 +:10F0D00001094FF000090021A868FDF715FF06227D +:10F0E00007F11D0105F0D2FB40B9A868FDF7A3FEAA +:10F0F00097F82410884208BF012000D0002059EA68 +:10F1000000095DD0686800F5AD7490F859A1787871 +:10F1100038B13046FCF707FE00281CBF04464FF00C +:10F12000010A0027A86801784FEAD11B0121FDF7E9 +:10F13000EBFEBBF1000F07D0407900F0C000402883 +:10F1400008BF4FF0010B01D04FF0000B0121A86860 +:10F15000FDF7DAFE0622214605F098FB30B9A868D3 +:10F16000FDF776FE504508BF012401D04FF00004A2 +:10F170003BEA040018BFFF2E0FD03046FCF79DFC81 +:10F18000060000E01CE008D00121A868FDF7BCFEE5 +:10F1900001463046F8F758FA074644EA070019EAEC +:10F1A000000F0DD06868012100F5C47005F082F8E9 +:10F1B0004FF001084046FFF7C8FA052002F02DF98C +:10F1C00044463FE00224A448F7F777FE002808BF32 +:10F1D0002F70F7F75DFEA868FDF704FE0646A868E5 +:10F1E000FDF7DEFF072E08BF00282BD1A8684FF0DF +:10F1F0000101C27812F03F0F24D00279914321D14E +:10F20000696801F5BA760021FDF77EFE062206F157 +:10F210001D0105F03BFBA8B9A868FDF70CFE96F8A8 +:10F22000241088420ED16868012100F5C47005F0F1 +:10F2300041F8FF21022000F099F8002818BF0324AC +:10F2400000E0FFDF03B02046BDE8F08F2DE9F74F67 +:10F25000814C0025914660688A4690F87501002827 +:10F260000CBF4FF001084FF00008A0680178CE09EC +:10F270000121FDF749FE36B1407900F0C000402879 +:10F2800008BF012600D00026606890F8761100299A +:10F2900063D090F868114FF0000B03291ED190F84D +:10F2A0006111002918BF90F87A7117D0FF2F18BF8D +:10F2B000082F22D03846FCF7C7F9002818BF4FF0B6 +:10F2C0000108002E49D0606890F88501D0B1FCF7A4 +:10F2D00046FC0546606880F885B13EE0A168CA78C2 +:10F2E00012F03F0F19BF097911F0010F90F82B10A0 +:10F2F000FF2918BF90F87771D8D176B390F88401C0 +:10F3000070B12AE03846FCF7D8FB05460121A06819 +:10F31000FDF7FAFD01462846F8F796F905461CE088 +:10F32000A068C17811F03F0F05D0017911F0010FED +:10F3300018BF0B2101D14FF005014FF00002FCF77F +:10F34000E8FB616881F8760138B1FCF7FDFBFF2826 +:10F3500003D06168012581F877018AF80050009890 +:10F36000067089F8008003B0BDE8F08F2DE9F04108 +:10F37000394C02460025606890F8A1310BB3A068B3 +:10F380004FF000064FF00107C37813F03F0F1CBF8A +:10F39000007910F0100F1BD00020FEF7E2F9606832 +:10F3A00090F83400C0F3411002281BD0022000F076 +:10F3B00058FC88B16068012580F89061F7F7E9FB97 +:10F3C0001FE0002A14BF0223012380F8A131D6E7F1 +:10F3D0001046FEF7C6F905E06068818E21F06001F5 +:10F3E00040318186606890F8281051B980F8287003 +:10F3F00090F8340010F0080F14BF0720062002F028 +:10F400000CF82846BDE8F0812DE9F047124C05467E +:10F410001F4690460E46A068FDF7C2FE002800F089 +:10F42000D280012805D0022800F00F81BDE8F04706 +:10F430009EE4A0680921C27812F03F0F00F04381DA +:10F440000279914340F03F81616891F86811032986 +:10F4500009D012F0020F01E07801002008BFFF215F +:10F4600019D065B116E00021FDF74EFD6168062256 +:10F47000D1F864111A3105F009FA50BB1EE0FDF70E +:10F48000E7FC05460121A068FDF73EFD2946F7F798 +:10F4900037F918B13946012000F038B9606890F8A2 +:10F4A0006901032818BF022840F00D81002E1CBFFF +:10F4B000FE21012040F02A8100F005B9A068FDF787 +:10F4C000BAFC6168D1F86411497E884208BF012600 +:10F4D00000D00026A068C17811F03F0F05D0017957 +:10F4E00011F0020F01D05DB338E0616891F86A2134 +:10F4F000012A01D0A6B119E0C6B90021FDF704FD2B +:10F5000061680268D1F86411C1F81A208088C88344 +:10F51000A068FDF790FC6168D1F86411487605E0B9 +:10F5200091F8770191F87A1188424BD1606800F523 +:10F53000C47004F003FF002844D00F20BDE8F0871A +:10F54000B8F1000F0CD0FDF783FC05460121A0683F +:10F55000FDF7DAFC2946F7F7D3F808B1012200E0FD +:10F560000022616891F86A01012807D040B92EB9DC +:10F5700091F8773191F87A118B4201D1012100E0A5 +:10F5800000210A421ED0012808BF002E13D14FF0DF +:10F590000001A068FDF7B8FC61680268D1F8641149 +:10F5A000C1F81A208088C883A068FDF744FC616810 +:10F5B000D1F864114876606800F5C47004F0BEFEAE +:10F5C0000028BAD17FE06068A8464FF0020990F8A1 +:10F5D000680103282AD0A068C17811F03F0F1BBF33 +:10F5E000007910F0020F002001204FF0FF05A8B1B4 +:10F5F0004FF00100FEF78DF8002804BF3D46B8F13A +:10F60000000F0BD1A068FDF723FC07460121A0687D +:10F61000FDF77AFC3946F7F773F850B12946002018 +:10F62000FFF7A4FE002818BF4FF003094846BDE8C5 +:10F63000F087606890F86901032818BF0228F5D1A7 +:10F64000002E18BFFE25E9D1F0E7626892F8683114 +:10F65000032B38D0A0684FF0090CC17811F03F0F90 +:10F6600031D001793CEA010C2DD1022B01F00201CD +:10F6700005D0002908BFFF2147D0CDB344E009B130 +:10F6800035B113E002F5C47004F058FEA0B91AE0D9 +:10F69000B8F1000F1AD0FDF7DBFB05460121A06889 +:10F6A000FDF732FC2946F7F72BF878B1606800F5D2 +:10F6B000C47004F043FE30B139460220FEF751F821 +:10F6C0000D20BDE8F0870220BDE8F087606890F863 +:10F6D0006901032818BF0228F5D1002EF3D04FF09E +:10F6E000FE014FF0020000F0A4FA0220BDE8F0870E +:10F6F000FFE7FDF7ADFB05460121A068FDF704FC1F +:10F700002946F6F7FDFF20B13946022000F091FAB4 +:10F71000D9E7606890F86901032818BF0228D2D1A0 +:10F72000002E1CBFFE210220F0D1CCE72DE9F04FC6 +:10F7300083B04FF00008FE48F7F7BFFBFC4C0028F1 +:10F7400004BF7F202070F7F7A3FBA068FDF74AFBFA +:10F7500082460121FEF75CFF05466068002690F8AE +:10F76000A411012918BFFFDF0ED0606890F8760160 +:10F7700030B1F7F77DFBF6F754FD606880F87661ED +:10F7800003B04046BDE8F08FEA4F4FF006084FF057 +:10F790000109BAF1080F1AD2DFE80AF0278C041920 +:10F7A000191912FEF7F7F5F9002DDED0606890F810 +:10F7B0006801012812BF0228FF20FEF7CFF9D4E725 +:10F7C0002DB190F86801022806D0012854D0F7F72F +:10F7D000E0F94FF00608C8E7FF20FEF7BFF96068C0 +:10F7E0004FF00C0880F8A161BFE74FF00008002D32 +:10F7F00000F0288190F86811022934D001293BD00B +:10F800000329B2D1A268D0F86411D37891F81AC054 +:10F81000634521D1137991F81BC063451CD15379FD +:10F8200091F81CC0634517D1937991F81DC06345C9 +:10F8300012D1D37991F81EC063450DD1137A91F896 +:10F840001FC0634508D1137891F819C0C3F3801322 +:10F85000634508BF012300D0002390F86A01012806 +:10F860000ED0DBB1EAE0FF20FEF778F960684FF0D8 +:10F870000C0880F8A19178E7FF20FEF76FF916E0F9 +:10F88000002B70D110461A31FDF7B7FAA068FDF7CA +:10F89000D2FA6168D1F864114876CFE097F87A011E +:10F8A00008287AD097F8771181425CD0CAE04FF0EF +:10F8B00006085AE790F8751100290CBF4FF0010AAD +:10F8C0004FF0000A4FF00008A16811F8092BD20987 +:10F8D00007D0497901F0C001402908BF4FF0010B62 +:10F8E00001D04FF0000B90F86811032906D190F871 +:10F8F0006111002918BF90F87A0101D190F87701C1 +:10F900000090FCF7DAF85FEA00092DD00098FBF7C9 +:10F910009BFE002818BF4FF0010ABBF1000F23D057 +:10F92000A06800F109014846F7F78EFE5FEA00087B +:10F93000606890F8599118BF49F00209606890F822 +:10F940006811032914D0F7F724F9002DAFD0F6F78A +:10F95000E7FE00280CBFB8F1000F484675D000BF85 +:10F96000FEF7FCF8A3E769E0606890F85991E5E7D5 +:10F97000A168D0F86401CA78837E9A421FD10A79BF +:10F98000C37E9A421BD14A79037F9A4217D18A7962 +:10F99000437F9A4213D101E066E053E0CA79837F46 +:10F9A0009A420CD10A7AC37F9A4208D10978407EE4 +:10F9B000C1F38011814208BF4FF0010901D04FF01F +:10F9C000000997F87701082806D097F87A1188423D +:10F9D00008BF4FF0010B01D04FF0000BB8F1000F42 +:10F9E00005D1BAF1000F04D0F6F79AFE08B1012054 +:10F9F00000E000204DB197F86A11012903D021B928 +:10FA000059EA0B0101D0012100E00021084219D080 +:10FA1000606890F86A11012908BFB9F1000F0DD193 +:10FA2000D0F8640100F11A01A068FDF7E6F9A068BA +:10FA3000FDF701FA6168D1F8641148764FF00E08BD +:10FA400093E602E0F7F7A5F831E7606890F86901FE +:10FA5000032818BF02287FF42AAFBBF1000F18BF9C +:10FA6000FE207FF47DAF22E790F87001002818BFD8 +:10FA7000002D3FF4ACAEA068FDF792FB30B1012839 +:10FA80007DD002287CD0F7F784F86EE6F7F781F88E +:10FA9000606890F8680103283FF409AFA068C17856 +:10FAA00011F03F0F05D0027912F0100F18BF012599 +:10FAB00000D10025002D14BF0822012211F03F0FB4 +:10FAC0003FF4F5AE007932EA00017FF4F0AE10F0B9 +:10FAD000020F06D00120FDF71CFE002808BF012000 +:10FAE00000D000208DF800608DF804608DF808606B +:10FAF000FF27D0B102AA694601A8FFF7A7FB6068FB +:10FB000090F859719DF80000002818BF47F00207CF +:10FB10000BD1A068FDF79CF980460121A068FDF794 +:10FB2000F3F94146F6F7ECFDC0B195B1012003E0D1 +:10FB300078010020F410002000F093F800283FF432 +:10FB4000B6AE39460020FDF70CFE606880F8906183 +:10FB50006CE03946002000F06CF8A8E6606890F888 +:10FB60006901032818BF02287FF4A1AE9DF80400A4 +:10FB700000283FF49CAE9DF80000002801E017E04B +:10FB800032E07FF494AE75B14FF0010000F069F8F7 +:10FB900000283FF48CAEFE210020FDF7E2FD6068F6 +:10FBA00080F8906142E0FE21002000F042F87EE6FD +:10FBB000F6F7EFFFA0681821C27812F03F0F3FF46C +:10FBC00076AE007931EA00007FF471AE012000F0DA +:10FBD00048F800283FF46BAEFF210120FDF7C1FD7E +:10FBE000606880F8909121E0F6F7D3FF606890F8A4 +:10FBF000680103283FF45BAEA0681821C27812F0B8 +:10FC00003F0F3FF454AE007931EA00007FF44FAE6D +:10FC1000012000F026F800283FF449AEFF21022021 +:10FC2000FDF79FFD6168022081F890014FF0030805 +:10FC30009BE510B5FDF795FD2448406890F8281025 +:10FC4000002918BF10BD012280F8282090F8340048 +:10FC500010F0080F14BF07200620BDE8104001F087 +:10FC6000DCBB70B5194D06460421A868FDF74CF9B8 +:10FC7000044680780221B1EB501F18D0686890F8D4 +:10FC80002800A0B900F0CAFF217811F0800F14BF3E +:10FC90004FF496711E21B4F80120C2F30C0212FB3E +:10FCA00001F10A1AB2F5877F28BF814201D20020F4 +:10FCB00070BD68682188A0F8A511A17880F8A71107 +:10FCC0003046BDE8704000F0C6BF0000780100205B +:10FCD000D0F8E81049B1D0E93B231A448B691A44A3 +:10FCE0008A61D0E93912D16003E0F74AD0F8E41014 +:10FCF0001162D0E9391009B1086170470028FCD0C1 +:10FD00000021816170472DE9FF4F06460C46488867 +:10FD100083B040F2E24148430190E08A002500FBB5 +:10FD200001FA94F8640090460D2822D00C2820D0C7 +:10FD300024281ED094F8650024281AD00020834679 +:10FD4000069818B10121204603F0A6F894F8541043 +:10FD500094F85500009094F8D8200F464FF47A7923 +:10FD60004AB1012A61D0022A44D0032A5DD0FFDFC4 +:10FD7000B5E00120E3E7B8F1000F00D1FFDFD24882 +:10FD800014F8541F243090F83800FCF7E8FF019075 +:10FD90002078F7F71EFB4D4600F2E730B0FBF5F197 +:10FDA000DFF82493D9F80C0001EB00082078F7F76E +:10FDB00010FB014614F85409022816D0012816D069 +:10FDC00040F6340008444AF2EF010844B0FBF5F174 +:10FDD0000198D9F81C20411A514402EB08000D1873 +:10FDE000012084F8D8002D1D78E02846EAE74FF47A +:10FDF000C860E7E7DFF8D092A8F10100D9F8081051 +:10FE0000014300D1FFDFB148B8F1000F016801EBF9 +:10FE10000A0506D0D9F8080000F22330A84200D91C +:10FE2000FFDF032084F8D80058E094F86420019D97 +:10FE3000242A05D094F86530242B01D0252A3AD104 +:10FE4000B4F85820B4F8F830D21A521C12B2002A72 +:10FE500031DB94F8FA2072B3174694F8FB2002B114 +:10FE600010460090022916D0012916D040F6340021 +:10FE700049F608528118022F12D0012F12D040F6F5 +:10FE800034001044814210D9081A00F5FA70B0FB12 +:10FE9000F9F005440FE04846EAE74FF4C860E7E7A9 +:10FEA0004846EEE74FF4C860EBE7401A00F5FA70F9 +:10FEB000B0FBF9F02D1AB8F1000F0FD0DFF808826F +:10FEC000D8F8080018B9B8F8020000B1FFDFD8F878 +:10FED000080000F22330A84200D9FFDF05B9FFDF98 +:10FEE0002946D4F8DC00F4F744FAC4F8DC00B0602A +:10FEF000002030704FF0010886F80480204603F09F +:10FF000026F8ABF10101084202D186F8058005E030 +:10FF100094F8D80001282FD003207071606A394608 +:10FF2000009A01F007FBF060069830EA0B0020D041 +:10FF300029463046FCF778FD87B2204603F007F8E3 +:10FF4000B8420FD8074686F8058005FB07F1D4F8BC +:10FF5000DC00F4F70EFAB06029463046FCF764FD89 +:10FF6000384487B23946204602F096FFB068C4F89C +:10FF7000DC0007B0BDE8F08F0220CEE72DE9F041AC +:10FF800006460C46012001F0BCFAC5B20B2001F078 +:10FF9000B8FAC0B2854200D0FFDF0025082C7DD220 +:10FFA000DFE804F00461696965C98E96304601F0A6 +:10FFB000B7FA0621F2F79AFB040000D1FFDF3046C2 +:10FFC00001F0AEFA2188884200D0FFDF94F8D80013 +:10FFD00000B9FFDF204602F007FE3B4E214600201D +:10FFE000B5607580F561FCF7A4FD00F19807606AC3 +:10FFF000B84217D994F85500F7F7DCF9014694F8A0 +:020000040002F8 +:1000000054004FF47A72022828D0012828D040F6F4 +:10001000340008444AF247310844B0FBF2F1606A08 +:100020000844C51B214600203561FCF782FD61882C +:1000300040F2E24251439830081AA0F22330706136 +:1000400094F8552094F85410606A01F073FAA0F205 +:100050009310B061BDE8F041F5F770B91046D8E7EC +:100060004FF4C860D5E7BDE8F04102F027BEBDE817 +:10007000F041F6F752BF6FF0040001F042FAC4B24B +:10008000192001F03EFAC0B2844200D0FFDF3046B2 +:1000900001F046FA0621F2F729FB00E04BE00400EC +:1000A00000D1FFDF304601F03BFA2188884200D0C2 +:1000B000FFDF2046BDE8F0410122002101F057BAE0 +:1000C000F6F7CFFDD3E70000A01200208801002042 +:1000D000304601F025FA0621F2F708FB040000D1B2 +:1000E000FFDF304601F01CFA2188884200D0FFDF94 +:1000F00094F8D800042800D0FFDF84F8D85094F892 +:10010000E2504FF6FF76202D00D3FFDFFB4820F8AA +:10011000156094F8E200F4F70CFC00B9FFDF202032 +:1001200084F8E2002046FFF7D3FDF5480078BDE8EB +:10013000F041E2F7F1BEFFDFBDE8F08170B5EF4CB2 +:100140000025483C84F82C50E07868B1E570FEF753 +:10015000D0F92078042803D0A06AFFF7B9FDA56282 +:10016000E7480078E2F7D8FEBDE8704001F010BA29 +:1001700070B5E24C0146483C206AF5F712F9656813 +:10018000A27890FBF5F172B140F27122B5FBF2F268 +:1001900092B2E36B01FB02F6B34202D901FB1232C9 +:1001A00000E00022E2634D43002800DAFFDF294629 +:1001B000206AF4F7DEF8206270BD2DE9F05FFEF7EB +:1001C000EBF98246CD486C3800F124088168464638 +:1001D000D8F81C00F4F7CDF80146306AF5F7E1F8DD +:1001E0004FF00009074686F839903C464FF42375D6 +:1001F0004E461CE00AEB06000079F7F7DBF84AF2FE +:10020000B12101444FF47A70B1FBF0F108EB8602A2 +:100210004046926811448C4207D3641A90F8391012 +:10022000A4F52374491C88F83910761CF6B298F8A6 +:100230003A00B042DED8002C0FDD98F83910404665 +:1002400008EB81018968A14207D24168C91BA94214 +:1002500000D90D466C4288F8399098F83960C34649 +:100260000AEB060898F80400F7F7A4F801464AF2EA +:10027000B12001444FF47A7AB1FBFAF298F80410F5 +:10028000082909D0042909D00020131804290AD00C +:10029000082908D0252007E0082000E0022000EB14 +:1002A00040002830F1E70F20401D4FF4A8720829C4 +:1002B00013D0042914D0022915D04FF0080C28229D +:1002C00010FB0C20184462190BEB8603024498685B +:1002D000D84682420BD8791925E04FF0400CEFE761 +:1002E0004FF0100CECE74FF0040C1822E8E798F8F8 +:1002F000392098F83A604046B24210D2521C88F831 +:1003000039203C1B9868621984180846F7F752F8A0 +:100310004AF2B1210144B1FBFAF0011903E080F87F +:100320003990D8F80410D8F82000BDE8F05FF4F751 +:1003300020B82DE9FE4F14460546FEF72DF9DFF8EB +:10034000BCB10290ABF1480B58469BF839604FF0B6 +:10035000000A0BEB86018968CBF84010ECB3044629 +:1003600000780027042827D0052840D0FFDFA046CA +:100370003946A069F3F7FDFF0746F4F7F9FA81461D +:100380003946D8F80440F5F70CF8401E90FBF4F01D +:10039000C14361433846F3F7ECFF0146C8F820003B +:1003A0004846F4F7FEFF002800DDFFDF012088F853 +:1003B000140088F813008FE0D4F81890D4F8048063 +:1003C00001F04DF9070010D0387800B9FFDF7969E6 +:1003D00078684A460844414600E00EE001F02BF9F7 +:1003E00007464045C3D9FFDFC1E75746BFE7A06ACC +:1003F00001F0DCF840F6B837B9E7016A0BEB4600CC +:100400000191C08D08B35C46DBF81800FFF7B0FE21 +:100410006168206AF3F7ADFF074684F839A0019CB4 +:10042000D8462046DBF81810F4F7BBFF8146394662 +:100430002046F4F7B6FFD8F80420B9FBF2F3B0FB7E +:10044000F2F0834243D0012142E0F4F791FAFFF742 +:100450008FFEFFF7B2FE9BF83910DBF804900BEB30 +:1004600081010746896800913946DBF82000F4F7DE +:1004700098FF00248046484504DB98FBF9F404FB10 +:1004800009F41BE0002059469BF8392008E000BF22 +:1004900001EB800304F523749B68401C1C44C0B22C +:1004A0008242F5D852B10120F6F784FF4AF2B12119 +:1004B00001444FF47A70B1FBF0F004440099A8EBCA +:1004C00004000C1A00D5FFDFCBF84040A7E700215D +:1004D00088F8141088F813A09BF802005C46B8B1A5 +:1004E0003946206AF4F75DFF0146E26B40F2712065 +:1004F00042438A4206D2C4F840A009E00C1300200F +:1005000084010020206C511A884200D308462064E0 +:10051000AF6085F800A001202871029F94F839008F +:100520003F1DC05DF6F746FF4AF23B5101444FF4D0 +:100530007A70B1FBF0F0216CFB300844E860207861 +:10054000042808D194F8390004EB4000C08D0A2833 +:1005500001D2032000E00220687104EB4600C08D48 +:10056000C0B128466168FCF75FFA82B20020761CB1 +:100570000CE000BF04EB4003B042D98D114489B2B6 +:10058000D98501D3491CD985401CC0B294F83A10D2 +:100590008142EFD2A868A061E06194F8390004EBD1 +:1005A0004000C18D491CC18594F83900C05D082800 +:1005B00003D0042803D000210BE0082100E0022131 +:1005C00001EB410128314FF4A872082804D0042817 +:1005D00002D0022807D028220A44042805D008287F +:1005E00003D0252102E01822F6E70F21491D082833 +:1005F0000CD004280CD002280CD0082011FB0020BD +:10060000216C884208D20120BDE8FE8F4020F5E72A +:100610001020F3E70420F1E70020F5E770B5FB4C6C +:10062000061D14F8392F905DF6F7C4FE4FF47A7169 +:1006300000F2E730B0FBF1F0D4F80710451820784D +:10064000805DF6F7ABFE2178895D082903D0042987 +:1006500003D000220BE0082200E0022202EB42025B +:1006600028324FF4A873082904D0042902D00229A3 +:1006700007D028231344042905D0082903D02522B4 +:1006800002E01823F6E70F22521D08290AD0042998 +:100690000AD002290AD0082112FB0131081A281AAF +:1006A000293070BD4021F7E71021F5E70421F3E779 +:1006B000FEB504460F46012000F023FFC5B20B2013 +:1006C00000F01FFFC0B2854200D0FFDF01260025E9 +:1006D000CE48082F50D2DFE807F004304747434F99 +:1006E0004F4C0446467406744078002819D1FDF733 +:1006F00053FF009594F839108DF808104188C9040B +:1007000010D0606C019003208DF80900BF48243898 +:100710008560C56125746846FDF778FC002800D027 +:10072000FFDFFEBDFFF77AFF0190207D10B18DF84D +:100730000950EBE78DF80960E8E70446407840B1DE +:10074000207C08B9FDF7AAFE6574BDE8FE40F4F709 +:1007500019B8A674FDF76EFD0028E2D0FFDFFEBDDC +:10076000BDE8FE40F6F7D9BB2046BDE8FE4000F0EC +:100770007FBFBDE8FE40E1E4FFDFFEBDA34950B10D +:1007800001228A704A6840F27123B2FBF3F202EB55 +:100790000010C86370470020887070472DE9F05F33 +:1007A000894640F27121994E484300250446706005 +:1007B00090462F46D0074AF2B12A4FF47A7B0FD0E9 +:1007C000B9F800004843B0600120F6F7F3FD00EBF4 +:1007D0000A01B1FBFBF0241AB7680125A4F52374C4 +:1007E0005FEA087016D539F8151040F271204143C0 +:1007F00006EB85080820C8F80810F6F7DBFD00EBCB +:100800000A01B1FBFBF0241AD8F80800A4F5237400 +:1008100007446D1CA7421AD9002D18D0391BB1FB13 +:10082000F5F0B268101AB1FBF5F205FB1212801A4E +:10083000B060012009E000BFB1FBF5F306EB8002D8 +:100840009468E31A401CC0B29360A842F4D3BDE898 +:10085000F09F2DE9F0416D4C00262078042804D04B +:100860002078052801D00C2066E401206070607CAF +:10087000002538B1EFF3108010F0010F72B610D0E0 +:1008800001270FE0FDF788FE074694F82400F4F7EF +:10089000D4FB7888C00411D000210320FDF781FE2D +:1008A0000CE00027607C38B1A07C28B1FDF7F6FD94 +:1008B0006574A574F3F766FF07B962B694F824006F +:1008C000F4F709FE94F82C0030B184F82C5020780D +:1008D000052800D0FFDF0C26657000F059FE304679 +:1008E0002AE44A4810B5007808B1FFF7B2FF00F0DB +:1008F000EFFE464900202439086210BD10B5444C73 +:1009000058B1012807D0FFDFA06841F66A0188428C +:1009100000D3FFDF10BD40F6C410A060F4E73C49EF +:1009200008B50870394900200870487081F82C001B +:10093000C8700874487488742022886281F8242062 +:10094000243948704FF6FF7211F16C0121F8102024 +:10095000401CC0B22028F9D30020FFF7CFFFFFF7DB +:10096000C0FF1020ADF80000012269460420FFF707 +:1009700015FF08BD7FB5254C05460E46207810B101 +:100980000C2004B070BD95F8552095F85410686A95 +:1009900000F0E5FEC5F8EC00A56295F8D80000B1BE +:1009A000FFDF1A4900202439C861052121706070D9 +:1009B00084F82C00014604E004EB4102491CD08578 +:1009C000C9B294F83A208A42F6D284F83900304607 +:1009D000FFF7D4FE0F48F3F750FF84F824002028D7 +:1009E00000D1FFDFF3F7C4FFA06194F824100122C7 +:1009F0006846FFF79EFC00B9FFDF94F824006946C3 +:100A0000F4F700FA00B9FFDF0020BAE7C4120020B3 +:100A100084010020B1060200F74810B5007808B143 +:100A2000002010BD0620F1F7FBFD80F0010010BD95 +:100A300038B5F14D0446287800B1FFDF0020009062 +:100A4000237802460146DB0705D06088A188ADF80F +:100A5000001001221146491E85F83A106946FFF739 +:100A60009DFE002038BD1FB511B1112004B010BD8E +:100A7000E14C217809B10C20F8E7002262700421D2 +:100A80002170114605E000BF04EB4103491CDA85E3 +:100A9000C9B294F83A308B42F6D284F83920FFF785 +:100AA0006DFED648F3F7E9FE84F82400202800D133 +:100AB000FFDF00F0D4FD10B1F3F75AFF05E0F3F7C4 +:100AC00057FF40F6B831F3F754FCA06194F82410B6 +:100AD00001226846FFF72DFC00B9FFDF94F82400DF +:100AE0006946F4F78FF900B9FFDF0020BEE770B563 +:100AF000C14CA16A0160FFF7ACFE050002D1A06AFB +:100B0000FFF7E6F80020A062284670BD7FB5BA4C1A +:100B10002178052901D00C2033E7B7492439C86072 +:100B2000A06A00B9FFDFA06A90F8D80000B1FFDF2B +:100B3000A06A90F8E200202800D0FFDFB048F3F769 +:100B40009CFEA16A0546202881F8E2000E8800D3A9 +:100B5000FFDFA948483020F81560A06A90F8E2004D +:100B6000202800D1FFDF002301226846A16AFFF799 +:100B7000CAF8A06A694690F8E200F4F743F900B9B0 +:100B8000FFDF0020A062FCE69B49243948707047D3 +:100B900010B540F2E24300FB03F4002000F0DFFD5B +:100BA000844201D9201A10BD002010BD70B50D4639 +:100BB000064601460020FBF7BCFF044696F85500A8 +:100BC000F6F7F8FB014696F854004FF47A720228C3 +:100BD00015D0012815D040F6340008444AF24731B8 +:100BE0000844B0FBF2F1708840F271225043C1EB2F +:100BF0004000A0F22330A54206D2214605E010466F +:100C0000EBE74FF4C860E8E72946814204D2A542E9 +:100C100001D2204600E02846706270BD70B5F5F73D +:100C200077FC0446F6F7BAFB01467348243882681D +:100C30004068101A0E18204600F05AFC054620465F +:100C4000F6F7B8FB281A4FF47A7100F2E730B0FBE0 +:100C5000F1F0304470BD70B50546FDF79DFC664966 +:100C6000007824398C689834072D2CD2DFE805F001 +:100C7000043030252830300014214FF4A8730428A4 +:100C800010D00822082809D02A2102280FD011FBF1 +:100C9000024000222823D118441815E0402211FBFD +:100CA0000240F8E7102211FB02402E22F3E7042253 +:100CB00011FB024000221823EDE704F5317403E034 +:100CC00004F5B07400E0FFDF4B48006CA04201D98E +:100CD000012070BD002070BD70B5474C243C607889 +:100CE00070B1D4E904512846A268FBF7D1FE206117 +:100CF000A84205D0A169401B0844A061F4F71EFB7F +:100D00002169A068884201D8207808B1002070BD10 +:100D1000012070BD2DE9FF5F074615460E461C46B3 +:100D20001846F6F73BFB07EB46014618204600F055 +:100D3000DFFB4AF2C5714FF47A790144C846B1FB32 +:100D4000F8F006442C4860362438806800EB050B28 +:100D50002046F6F723FB371A204600F0C9FB05466C +:100D60002046F6F727FB291AB1FBF8F03F1A1820A6 +:100D700028234FF4C8714FF4BF724FF0020A082CB9 +:100D800031D0042C2BD00025022C30D04FF0080C91 +:100D900015F128050CEB8C0808EB8C1C654407EB5F +:100DA000050C0025082C32D0042C2BD00027022C57 +:100DB00032D01846082307F5B07700BF03EB0313C2 +:100DC0001844874234D2082C2CD0042C27D0002081 +:100DD000022C2AD00823283003EB031336E01546F3 +:100DE0004FF0100CD6E70D464FF0400CD2E74FF015 +:100DF000040C1835CEE70000C4120020B106020032 +:100E00007DFF0100104640F2EE371023D6E708467A +:100E10004FF435674023D1E70423B437CEE71046BB +:100E20001023D9E708464023D6E704231830D3E738 +:100E3000082C47D0042C42D00020022C45D0082397 +:100E400010F12800C3EBC30707EB431318446044B9 +:100E5000082C40D0042C3BD00021022C3DD008228D +:100E600011F1280102EB821201EB820147180120E7 +:100E70008DF804008DF800508DF805A0FE4D594600 +:100E800007F22727E869F3F774FACDE9020720464D +:100E9000F6F790FA4AF23B510144B1FBF9F0381AE7 +:100EA000FB38286402986E64E86195F8240069466E +:100EB000F3F7A8FF002800D1FFDFBDE8FF9F104631 +:100EC0001023BFE708464023BCE704231830B9E7E6 +:100ED00011461022C6E74022C4E704221831C1E7B8 +:100EE0002DE9FE4F04461D46174688464FF0010A7D +:100EF0001846F6F753FAE04E0146243E07EB480247 +:100F0000B068204410440F18284600F0F1FA4FF45E +:100F10007A7BD84600F6FB00B0FBF8F0384400F1CD +:100F200020092846F6F73AFAB2680146A9EB020012 +:100F3000001B461A284600F0DBFA07462846F6F75B +:100F400039FA391AB1FBF8F0371A182028234FF470 +:100F5000C8714FF4BF72082D2FD0042D2AD04FF046 +:100F6000000C022D2CD008260CF1280C06EB86086C +:100F700008EB861666443744082D2AD0042D23D06A +:100F80000026022D2AD01846082306F5B07600BFA9 +:100F900003EB0313184486422CD2082D24D0042DD1 +:100FA0001FD00020022D22D00823283003EB03138A +:100FB00018442EE094461026D8E78C464026D5E704 +:100FC00004260CF1180CD1E7104640F2EE3610233F +:100FD000DEE708464FF435664023D9E70423B436EC +:100FE000D6E710461023E1E708464023DEE7042356 +:100FF0001830DBE7082D47D0042D42D00023022D06 +:1010000045D0082013F12803C0EBC00606EB4010C2 +:1010100018443844082D40D0042D3BD00021022D27 +:101020003DD0082211F1280102EB821201EB82016E +:10103000451805F596750C98F6F7BCF94AF23B5140 +:101040000144B1FBFBF08C4EFB30A6F12407316C60 +:1010500004F1FB020844B9684B191A44824228D9AA +:10106000621911440D1AFB35E1F710FEB968084406 +:1010700061190844B0F1807F36D2642D12D2642009 +:1010800011E013461020BFE70B464020BCE70420C8 +:101090001833B9E711461022C6E74022C4E70422FC +:1010A0001831C1E72846F4F7B0F9E8B1306C2844AC +:1010B0003064E1F7EBFDB968293821440844CDE9F3 +:1010C000000996F839008DF8080002208DF8090013 +:1010D0006846FCF79BFF00B1FFDFFDF7ABF800B1FE +:1010E000FFDF5046BDE8FE8F4FF0000AF9E71FB55D +:1010F00000F03BFB604C607880B994F8241000222B +:101100006846FFF716F938B194F824006946F3F7FA +:1011100079FE18B9FFDF01E00120E070F3F732FB40 +:1011200000206074A0741FBD2DE9F84FFDF734FA5C +:101130000646451CC07840090AD001280AD0002084 +:101140002978824608064FF4967405D41E2004E0E0 +:101150000120F5E70220F3E72046B5F80120C2F3AD +:101160000C0212FB00F7C80901D010B103E01E24E5 +:1011700001E0FFDF0024FFF751FDA7EB000928780D +:10118000B77909EB0408C0F3801010B120B1322503 +:1011900004E04FF4FA7501E0FFDF00250C2F00D3C7 +:1011A000FFDF3648364A30F81700291801FB0821BE +:1011B000501CB1FBF0F5F5F7ABF9F6F7FBF84FF47F +:1011C0007A7100F27160B0FBF1F1A9EB0100471BED +:1011D000A7F15900103FB0F5237F11D3264E717847 +:1011E00029B90246534629462046FFF793FD00F0F1 +:1011F000BCFAF3F7C7FA00207074B074BDE8F88F3A +:10120000307800905346224629463846FFF768FE5C +:101210000028F3D101210220FDF7C3F9BDE8F84F02 +:1012200065E710B50446012903D113482438007836 +:1012300030B1042084F8D800BDE81040F3F7A2BA1A +:1012400000220121204600F092F934F8580F401C8A +:101250002080F1E72DE9F0410746FDF79DF90500F3 +:1012600000D1FFDF29783846FBF779FD024C0146B3 +:10127000A4F12406E06905E0C41200200C5002002D +:101280003F420F00B26802446FB32878082803D0A9 +:10129000042803D000270BE0082300E0022303EB1F +:1012A000430728374FF4A873082804D0042802D035 +:1012B000022810D028233B4408280ED004280ED042 +:1012C00002280ED05FF00800C0EBC00707EB40100B +:1012D0001844983009E01823EDE74020F4E7102087 +:1012E000F2E70420F0E74FF4FC7010444718287828 +:1012F0003F1DF6F75FF8024628784FF47A7102280E +:101300001DD001281DD040F6340010444AF2EF02EF +:101310001044B0FBF1F03A1AA06A40F2E241B04644 +:101320004788D8304F43316A81420DD03946606BCF +:1013300000F081F90646B84207D9FFDF05E008460C +:10134000E3E74FF4C860E0E70026FA488068864289 +:1013500007D2A16A40F271224888424306EB420656 +:1013600004E040F2E240B6FBF0F0A16AC882A06A55 +:10137000297880F85410297880F855100521417596 +:10138000C08A6FF41C71484306EB400040F63541BB +:10139000C8F81C00B0EB410F00D3FFDFBDE8F081BF +:1013A00010B5052937D2DFE801F00509030D31003A +:1013B000002100E00121BDE8104032E7032180F860 +:1013C000D81010BD0446408840F2E2414843D94954 +:1013D000091D0860D4F800010089E082D4F80001FA +:1013E00080796075D4F8000140896080D4F80001EC +:1013F0008089A080D4F80001C089E0802046A16ADD +:10140000FFF7D4FB022084F8D80010BD816ABDE844 +:101410001040FFF7CBBBFFDF10BD70B5C64C0928ED +:10142000A1683FD2DFE800F0050B0B151315383823 +:101430000800BDE870405AE6BDE8704074E6022836 +:1014400003D00020BDE8704004E70120FAE7E16026 +:1014500070BD032802D005281CD000E0E160002602 +:1014600000F083F9B44D0120243585F82C0085F86F +:101470003860A86AE9690026C0F8DC1080F8D860F6 +:10148000E068FFF743FB00B1FFDFF3F77BF96E7411 +:10149000AE7470BD0126E3E7A6480078BDE8704051 +:1014A000E1F73ABDFFDF70BDA3494860704770B5F2 +:1014B000A14D0446B1B14FF47A76012903D0022937 +:1014C00005D0FFDF70BD1846F5F79EFF05E0688880 +:1014D000401C68801046F5F77CFF00F2E730B0FB57 +:1014E000F6F0201AA86070BD934824300078704749 +:1014F000082803D0042801D0F5F75CBF4EF6283049 +:101500007047002804DB00F1E02090F8000405E0BB +:1015100000F00F0000F1E02090F8140D4009704732 +:1015200010B50446202800D3FFDF83486C3030F824 +:10153000140010BD70B505460C461046F5F73AFF8D +:101540004FF47A71022C0DD0012C0DD040F63402EC +:1015500010444AF247321044B0FBF1F0284400F244 +:10156000931070BD0A46F3E74FF4C862F0E71FB569 +:1015700013460A46044601466846FEF7C4FB94F843 +:10158000E2006946F3F73EFC002800D1FFDF1FBDF3 +:1015900070B5694C00252434257094F82400F3F7C5 +:1015A000C8F900B9FFDF84F8245070BD2DE9F0417F +:1015B000050000D1FFDF604A0024D5F8EC6020462A +:1015C000631E116A08E08869B04203D3984201D2D1 +:1015D00003460C460846C9680029F4D104B90446FC +:1015E0000021C5F8E840D835CCB1E068E560E86096 +:1015F00000B105612E698846A96156B1B06930B164 +:101600006F69B84200D2FFDFB069C01BA861C6F89D +:101610001880494D24355CB1207820B902E0E9609A +:101620001562E7E7FFDF6169606808446863B5E653 +:10163000C5F83480B2E610B50C4601461046F3F703 +:10164000B0FE002806DA211A491EB1FBF4F101FBB5 +:10165000040010BD90FBF4F101FB140010BD3648EE +:10166000016A002001E00846C9680029FBD17047E3 +:101670007FB504466FF00400FFF743FFC5B21920A1 +:10168000FFF73FFFC0B2854200D0FFDFFCF784FFC9 +:101690004088C00407D001210320FCF782FF2548C1 +:1016A0000078E1F739FC002221466846FEF741FE4A +:1016B00038B169462046F3F7A5FB002800D1FFDFCB +:1016C0007FBD1D4901202431C870FEF737FD7FBD65 +:1016D0002DE9FE43184D0120287000264FF6FF74B7 +:1016E00020E00621F1F702F8070000D1FFDF97F8AC +:1016F000E200D837F3F7EFFE07F80A6BA14617F8B8 +:10170000E289B8F1200F00D3FFDF0B4A6C3222F8D8 +:10171000189097F8E200F3F70CF900B9FFDF2020EA +:1017200087F8E20069460620F0F769FF78B1FFDF2D +:101730000DE0000084010020A0120020029830B1CA +:1017400090F8D81019B10088A042CAD104E06846C8 +:10175000F0F733FF0028F1D02E70BDE8FE8310B5FE +:10176000FFF7E8FE00F5C87010BD0548002190F8AD +:10177000392000EB4200C18502480078E1F7CCBB7C +:10178000C412002084010020FD48806890F8881071 +:1017900029B1B0F88410B0F88620914215D290F8A3 +:1017A0008C1029B1B0F88A10B0F8862091420CD282 +:1017B000B0F88220B0F880108A4206D290F86820F3 +:1017C000B0F87E001AB1884203D301207047062882 +:1017D000FBD2002070472DE9F041E94D0746A8688B +:1017E00000F1580490F8FC0030B9E27B002301219D +:1017F0002046FBF7AFF810B1608D401C60850126D4 +:101800003D21AFB92878022808D001280AD068788D +:10181000C8B110F0140F09D01E2039E0162037E0AF +:10182000E6763EE0A86890F8FE0031E0020701D5B8 +:101830002177F5E7810701D02A2029E0800600D42E +:10184000FFDF232024E094F8300028B1A08D411C54 +:10185000A185E18D884213D294F8340028B1608EBE +:10186000411C6186E18D88420AD2618D208D8142C2 +:1018700003D3AA6892F8FC2012B9E28D914201D3F9 +:10188000222005E0217C29B1E18C814207D3082088 +:101890002077C5E7E08C062801D33E20F8E7E07EFC +:1018A000B0B100202073607320740221A868FFF794 +:1018B00077FDA86890F8CC10012904D1D0F8041164 +:1018C0000878401E0870E878BDE8F041E1F724BBD5 +:1018D000A868BDE8F0410021FFF762BDA8490C28C7 +:1018E000896881F8CC0014D0132812D0182810D0A1 +:1018F000002211280ED007280BD015280AD0012865 +:1019000007D0002805D0022803D021F8842F012019 +:1019100008717047A1F88A20704710B5984CA168EB +:101920000A88A1F8462181F8440191F8540001F099 +:1019300053FBA16881F8480191F8550001F04CFB78 +:10194000A16881F84901012081F84201002081F855 +:101950001601E078BDE81040E1F7DEBA70B5884CBA +:1019600000231946A06890F864205830FAF7F2FF77 +:1019700000283DD0A06890F808110025C9B3A169DE +:101980000978B1BB90F86500FAF7CCFF88BBA16875 +:10199000B1F858000A282DD905220831E06902F073 +:1019A00075FF10B3A068D0F80411087858B105226B +:1019B000491CE06902F06AFF002819D1A068D0F83C +:1019C0000401007840B9A068E169D0F804010A6810 +:1019D000C0F8012009794171A068D0F804010178AC +:1019E000491C01700120FFF779FFA06880F80851B9 +:1019F00070BDFFE7A06890F80C1111B190F80D11BF +:101A000059B390F816110029F2D090F81711002957 +:101A1000EED190F86500FAF785FF0028E8D1A068BC +:101A200090F8540001F0D8FA0546A06890F85500E7 +:101A300001F0D2FA0646A06890F81811284601F085 +:101A4000B5FA38B3A06890F81911304601F0AEFA33 +:101A500000B3BDE8704000205FE790F865102429CE +:101A600016D090F86410242912D0002300F1FA0255 +:101A700000F58671FBF721F8A06880F80C5130F86A +:101A8000421FA0F88C108188A0F88E10142002E06C +:101A90000123EBE71620BDE870401FE710B5F4F70F +:101AA00045F80C2813D3364C0821A068D0F8000163 +:101AB0001E30F4F73FF828B1A0680421C030F4F7D5 +:101AC00039F800B9FFDFBDE81040032006E710BD7C +:101AD00010B52B4CA068D0F800110A78002A1FD04E +:101AE0004988028891421BD190F86420002319464E +:101AF0005830FAF72FFF002812D0A068D0F8001154 +:101B00000978022907D003290BD0042917D0052909 +:101B100006D108200DE090F86500FAF703FF40B108 +:101B200010BD90F8691039B190F86A0000B9FFDF74 +:101B30000A20BDE81040D1E6BDE81040AEE790F8BD +:101B400090008007ECD10C20FFF7C8FEA0680021B0 +:101B500020F8841F01210171017B41F00101017313 +:101B600010BD70B5064CA268556DFBF794F8EBB24A +:101B7000C1B200228B4205D0A36883F8FA1004E0BA +:101B800090010020A16881F8FA20C5F30721C0F375 +:101B90000720814203D0A16881F8FB0028E7A068F4 +:101BA00080F8FB2024E770B5FE48806890F84E204E +:101BB000448EC38E418FB0F84050022A23D0A942F0 +:101BC00000D329460186C18FB0F84220914200D34C +:101BD00011468186018FB0F84420914200D311460E +:101BE0004186818FB0F84620914200D31146C186CC +:101BF000418EA14200D90C464486C18E994200D93B +:101C00000B46C386F4E6028E914200D31146C68F7E +:101C1000828E964200D23246A94200D329460186DE +:101C2000B0F842108A4200D30A468286002180F82A +:101C30004E10CFE770B5DB4CA06890F8CC10FE29B1 +:101C400055D16178002952D190F8672000230121F5 +:101C50005830FAF77FFE002849D1A06890F8FC10B0 +:101C600009B1022037E090F864200023194658306B +:101C7000FAF770FE28B1A06890F87C0008B1122035 +:101C800029E0A068002590F86420122A1DD004DC09 +:101C9000032A23D0112A04D119E0182A1AD0232AA2 +:101CA00026D0002304215830FAF754FE00281ED114 +:101CB000A06890F86510192971D020DC01292AD07C +:101CC000022935D0032932D120E00B2003E0BDE802 +:101CD0007040E3E60620BDE87040FFE510F8CA1F3B +:101CE00001710720FFF7FAFDA06880F864507FE6D5 +:101CF0001820FFF7F3FDA068A0F8845078E61D29AE +:101D000018D01E2916D0212965D149E010F8C91F25 +:101D1000417107206FE00C20FFF7E0FDA06820F87C +:101D20008A5F817941F00101817100F8255C52E000 +:101D300013202BE090F80D2182BB90F80C21B2B15A +:101D4000242912D090F8641024290ED05FF00003EB +:101D500000F1FA0200F58671FAF7AFFEA0681E21C5 +:101D600080F8651080F80C5103E00123F0E71E298C +:101D700031D1FFF718FF01F03BF9A06830F8421F9E +:101D8000A0F88C108188A0F88E101520FFF7A6FD12 +:101D9000A068A0F88A5000BF80F865501BE029E0D9 +:101DA00090F87D1049B100F8FA5F45701820FFF7F0 +:101DB00095FDA068A0F88A500DE090F8171151B970 +:101DC00090F8161139B1016DD0F81801FFF7C9FE6E +:101DD0001820FFF783FDA06890F8CC00FE2886D17C +:101DE000FFF776FEA06890F8CC00FE2886D1BDE80B +:101DF0007040B3E51120FFF771FDA068CCE7694A98 +:101E00000129926819D0002302290FD003291ED07E +:101E100010B301282BD0032807D192F864001328AF +:101E200003D0162801D0182804D1704792F8CC00AE +:101E30000028FAD0D2F8000117E092F8CC0001286F +:101E4000F3D0D2F804110878401E0870704792F859 +:101E5000CC000328EED17047D2F80001B2F8581038 +:101E60008288891A09B20029F5DB03707047B2F83D +:101E70005800B2F80A11401A00B20028F6DBD2F876 +:101E800004010178491E0170704770B5044690F84E +:101E9000640000250C2810D00D282ED1D4F8001194 +:101EA000B4F858008988401C884226D1D4F84C01E7 +:101EB0003C4E017811B3FFDF42E0B4F85800B4F8AB +:101EC0000A11401C884218D1D4F80401D0F801103E +:101ED000A1604079207302212046FAF752FAD4F823 +:101EE0000401007800B9FFDF0121FE20FFF787FF22 +:101EF00084F86450012084F8980079E52188C18035 +:101F0000D4F80001D4F84C1140890881D4F80001BC +:101F1000D4F84C1180894881D4F80001D4F84C11D0 +:101F2000C0898881D4F84C010571D4F84C1109207E +:101F30000870D4F84C1120884880F078E0F7ECFF66 +:101F400001212046FAF71DFA03212046FFF728FA5F +:101F5000B068D0F800010078022800D0FFDF02212D +:101F6000FE20FFF74CFF84F8645041E52DE9F04175 +:101F70000C4C00260327D4F808C00125A0B1206925 +:101F8000C0788CF8CA0005FA00F0C0F3C05000B960 +:101F9000FFDFA06800F8647F068480F82450BDE865 +:101FA000F08100009001002000239CF86520194674 +:101FB0000CF15800FAF7CEFC70B160780028EED131 +:101FC0002069C178A06880F8C91080F86570A0F811 +:101FD0008A6080F88C50E2E76570E0E7F0B5FC4C71 +:101FE000002385B0A068194690F865205830FAF7AC +:101FF000B1FC012580B1A06890F8640023280ED0C0 +:1020000024280CD06846F5F7B2FA68B1009801A907 +:10201000C0788DF8040008E0657005B0F0BD607808 +:1020200040F020006070F8E70021A06803AB1622A2 +:1020300090F86400FAF777FE002670B1A0689DF86A +:102040000C20162100F8F42F4170192100F88F1C84 +:1020500000F8685C20F86A6CDFE72069FBF715FA86 +:1020600078B12169087900F00702A06880F8502053 +:10207000497901F0070180F8511090F817310BBB36 +:1020800003E00020FFF772FFC7E790F81631CBB9E5 +:1020900000F154035F78974205D11A788A4202D141 +:1020A00080F87D500EE000F59F71028821F802292A +:1020B00090F850200A7190F8510048710D70E07846 +:1020C000E0F72AFFA068212180F8651080F88C5085 +:1020D000A0F88A60A1E770B5BD4C00231946A0683E +:1020E00090F865205830FAF735FC28B32069FBF7E3 +:1020F000B1F930B3A5682069FBF7A8F92887A5686E +:102100002069FBF79FF96887A5682069FBF7A0F9AC +:10211000A887A5682069FBF797F9E887A0680125DB +:1021200090F864101C2910D090F84E10012912D09C +:1021300090F80D1179B90BE0607840F00100607003 +:1021400056E4BDE87040002010E780F84E5002E0F1 +:1021500090F80C1119B11E2180F8651012E01D21B4 +:1021600080F8651000F58E710288CA82028F0A839A +:10217000428F4A83828F8A83C08FC8830D75E0782F +:10218000E0F7CAFEA068002120F88A1F85702FE4BE +:1021900010B58F4C00230921A06890F864205830B6 +:1021A000FAF7D8FB48B16078002805D1A16801F89A +:1021B0007C0F087301F8180C10BD0120607010BD71 +:1021C0007CB5834C00230721A06890F86420583028 +:1021D000FAF7C0FB38B36078002826D16946206939 +:1021E000FBF74EF99DF80000002500F02501A068DE +:1021F00080F896109DF8011001F0410180F89710C9 +:1022000080F88850D0F8001100884988814200D0B9 +:10221000FFDFA068D0F800110D70D0F84C110A78DB +:1022200022B1FFDF16E0012060707CBD30F8D02BBA +:10223000CA80C16F0D71C16F009A8A60019ACA602D +:10224000C26F0821117030F8D01CC06F4180E07857 +:10225000E0F762FEA06880F864507CBD70B55C4C0D +:1022600000231946A06890F865205830FAF772FBF1 +:10227000012540B9A0680023082190F86420583057 +:10228000FAF768FB10B36078002820D1A06890F8B6 +:102290009000800712D42069FBF7B8F8A16881F894 +:1022A0009100206930F8052FA1F892204088A1F80C +:1022B000940011F8900F40F002000870A0684FF0F1 +:1022C000000690F89010C90702D011E0657065E42F +:1022D00090F86520002319465830FAF73BFB00B907 +:1022E000FFDFA06880F8655080F88C50A0F88A6005 +:1022F000A06890F86410012906D180F8646080F825 +:102300008860E078E0F708FEA168D1F8000109884C +:1023100042888A42DBD101780429D8D10670E0785E +:10232000E0F7FAFDA06890F864100029CFD180F89A +:10233000886033E470B5264DA86890F864101A29B7 +:1023400002D00220687029E469780029FBD10024BA +:1023500080F88D4080F88840D0F8001100884988C6 +:10236000814200D0FFDFA868D0F800110C70D0F8CF +:102370004C110A780AB1FFDF25E090F88E2072B187 +:1023800080F88E400288CA80D0F84C110C71D0F8C9 +:102390004C210E2111700188D0F84C010DE030F86D +:1023A000D02BCA80C16F0C71C26F01211172C26F34 +:1023B0000D21117030F8D01CC06F418000F092FEEA +:1023C000E878E0F7A9FDA86880F864401AE4000006 +:1023D0009001002070B5FA4CA16891F86420162A8B +:1023E00001D0132A02D191F88E2012B10220607020 +:1023F00008E46278002AFBD181F8C800002581F842 +:102400008D5081F88850D1F80001098840888842B1 +:1024100000D0FFDFA068D0F800010078032800D0CA +:10242000FFDF0321FE20FFF7EAFCA068D0F84C1183 +:102430000A780AB1FFDF14E030F8C82BCA8010F820 +:10244000081BC26F1171C16F0D72C26F0D21117027 +:1024500030F8D01CC06F418000F044FEE078E0F717 +:102460005BFDA06880F8645041E470B5D44C09214C +:102470000023A06890F864205830FAF76BFA002522 +:1024800018B12069007912281ED0A0680A21002303 +:1024900090F864205830FAF75DFA18B12069007995 +:1024A000142814D02069007916281AD1A06890F851 +:1024B00064101F2915D180F8645080F88850BDE859 +:1024C00070401A20FFF729BABDE8704060E6A068A6 +:1024D00000F8645F058480F82450BDE8704000F087 +:1024E00087BD04E470B5B64C2079C00773D020696D +:1024F00000230521C578A06890F864205830FAF7C9 +:1025000029FA98B1062D11D006DC022D0ED0042D2B +:102510000CD0052D06D109E00B2D07D00D2D05D0CF +:10252000112D03D0607840F00800607060780028BA +:1025300051D12069FAF7CEFE00287ED0206900250F +:102540000226C178891E162977D2DFE801F00B76C2 +:1025500034374722764D76254A457676763A53507B +:102560006A6D7073A0680023012190F867205830CD +:10257000FAF7F0F908BB2069FAF710FFA16881F8B3 +:10258000FE00072081F8670081F88C5081F88850A0 +:1025900056E0FFF76AFF53E0A06890F864100F2937 +:1025A00001D066704CE0617839B980F86950122129 +:1025B00080F8641044E000F0C0FD41E000F09CFDB4 +:1025C0003EE0FAF7A0FF03283AD12069FAF79FFF0F +:1025D000FFF700FF34E03BE00079F9E7FFF7AAFEE0 +:1025E0002EE0FFF73BFE2BE0FFF7EAFD28E0FFF7C8 +:1025F000CFFD25E0A0680023194690F865205830EB +:10260000FAF7A8F9012110B16078C8B901E061704A +:1026100016E0A06820F88A5F817000F8256C0FE052 +:102620000BE0FFF758FD0BE000F029FD08E0FFF795 +:10263000D5FC05E000F0EFFC02E00020FFF796FC7F +:10264000A268F2E92A01401C41F10001C2E900013F +:1026500053E42DE9F0415A4C2079800741D5607848 +:1026600000283ED1E06801270026C17820461929BC +:10267000856805F158006FD2DFE801F04B3E0D6F21 +:10268000C1C1801C34C1556287C1C1C1C1BE8B9517 +:1026900098A4B0C1BA0095F8672000230121FAF789 +:1026A00059F900281DD1A068082180F8671080F82A +:1026B000886090E0002395F865201946FAF74AF9FA +:1026C00010B1A06880F88C60A0680023194690F8CB +:1026D00064205830FAF73EF9002802D0A06880F84C +:1026E00088605CE4002395F864201946FAF732F913 +:1026F00000B9FFDF042008E0002395F864201946A4 +:10270000FAF728F900B9FFDF0C20A16881F864000E +:1027100045E4002395F864201946FAF71BF900B93F +:10272000FFDF0D20F1E7002395F864201946FAF742 +:1027300011F900B9FFDFA0680F2180F88D7008E063 +:1027400095F86400122800D0FFDFA068112180F8FE +:102750008E7080F8641022E451E0002395F8642024 +:102760001946FAF7F7F820B9A06890F88E0000B97A +:10277000FFDFA068132180F88D70EAE795F8640008 +:10278000182800D0FFDF1A20BFE7BDE8F04100F0B5 +:1027900053BD002395F864201946FAF7DBF800B919 +:1027A000FFDF0520B1E785F88C6014E4002395F87D +:1027B00064201946FAF7CEF800B9FFDF1C20A4E721 +:1027C00090010020002395F865201946FAF7C2F819 +:1027D00000B9FFDFA06880F88C6082E7002395F8DD +:1027E00064201946FAF7B6F800B9FFDF1F208CE71E +:1027F000BDE8F04100F0E8BC85F86560D3E7FFDF95 +:102800006FE710B5F64C6078002837D12079400783 +:102810000FD5A06890F86400032800D1FFDFA068FE +:1028200090F86710072904D101212170002180F858 +:102830006710FFF70EFF00F0A5FCFFF753FEA0782E +:10284000000716D5A0680023052190F864205830B1 +:10285000FAF780F850B108206070A068D0F84C11E9 +:1028600008780D2800D10020087002E00020F8F759 +:1028700061FCA068BDE81040FFF707BB10BD2DE963 +:10288000F041D74C07464FF0000560780843607070 +:10289000207981062046806802D5A0F87E5004E0A9 +:1028A000B0F87E10491CA0F87E1000F007FD01264C +:1028B000F8B1A088000506D5A06890F86A1011B19B +:1028C000A0F8765015E0A068B0F87610491CA0F882 +:1028D000761000F0E2FCA068B0F87610B0F878202E +:1028E000914206D3A0F8765080F82261E078E0F7B4 +:1028F00013FB207910F0600F08D0A06890F86810E2 +:1029000021B980F868600121FEF74AFD1FB9FFF781 +:1029100078FFFFF78FF93846FEF75DFFBDE8F0411D +:10292000F4F734BEAE4A51789378194313D1114667 +:102930000128896808D01079400703D591F867000D +:10294000072808D001207047B1F84800098E884256 +:1029500001D8FEF7C1B900207047A149C278896843 +:10296000012A06D05AB1182A08D1B1F8F810FAF79E +:10297000A8BDB1F80A114172090A81727047D1F8F5 +:10298000001189884173090A8173704770B5944CAE +:1029900005460E46A0882843A080A80703D5E8076F +:1029A00000D0FFDFE660E80700D02661A80719D550 +:1029B000F078062802D00B2814D10BE0A06890F81C +:1029C000641018290ED10021E0E92A11012100F834 +:1029D0003E1C07E0A06890F86410122902D1002183 +:1029E00080F86A10280601D50820A07068050AD56D +:1029F000A0688288B0F85810304600F06EFC30466F +:102A0000BDE87040A9E762E43EB505466846F4F7C4 +:102A100088FD00B9FFDF2221009801F0E2FF0321C9 +:102A20000098FAF73FFC0098017821F0100101703E +:102A30002946FAF75CFC6A4C192D72D2DFE805F0E2 +:102A400021190D3FB4B4B51367B4B5B55AB4B4B4D5 +:102A5000B4A7B5B572728BB49400A168009891F8D0 +:102A6000FD100171A1E0A068009990F8CE000871F6 +:102A70009BE0A068D0F804110098491CFAF783FC89 +:102A800093E0A1680098D1F8002192790271D1F801 +:102A9000002112894271120A8271D1F800215289F3 +:102AA000C271120A0272D1F8002192894272120A8E +:102AB0008272D1F80011C989FAF73CFC75E0A06870 +:102AC000D0F800110098091DFAF76AFCA068D0F848 +:102AD000001100980C31FAF76DFCA068D0F80011D5 +:102AE00000981E31FAF76CFCA1680098C031FAF723 +:102AF00075FC5AE062690098117801719188417102 +:102B0000090A81715188C171090A01724DE0354984 +:102B1000D1E90001CDE9010101A90098FAF778FC9B +:102B200043E041E0A068B0F840100098FAF782FC5A +:102B3000A068B0F8CE100098FAF780FCA068B0F852 +:102B400044100098FAF76EFCA068B0F8D010009816 +:102B5000FAF76CFC29E0A268009892F8181101714C +:102B600092F81911417120E0A06890F8FB00FAF783 +:102B70008DF801460098FAF7A0FCA06890F8FA00DA +:102B8000FAF784F801460098FAF793FC0DE0A06884 +:102B900090F8F5100098FAF7B4FCA06890F8F410DB +:102BA0000098FAF7B2FC00E0FFDFF4F7CDFC00B9C3 +:102BB000FFDF0098FFF7D1FE3EBD0948806890F81E +:102BC000FA1009B990F8541080F8541090F8FB10DE +:102BD00009B990F8551080F855100020FEF79DBEF9 +:102BE0009001002024500200F8B5F74E002504465D +:102BF000B060B5807570B57035700088F4F78EFCE4 +:102C0000B0680088F4F7B0FCB4F8E000B168401C8C +:102C100082B201F15800F9F791FC00B1FFDF94F89E +:102C20006500242809D1B4F85810B4F8F800081A3F +:102C300000B2002801DB707830B194F864002428D9 +:102C40000AD0252808D015E0FFF7B7FF84F86550B3 +:102C5000B16881F87D500DE0B4F85810B4F8F80070 +:102C6000081A00B2002805DB707818B9FFF7A5FF35 +:102C700084F86450A4F8E050FEF786FD00281CD1CB +:102C8000B06890F8CC00FE2801D0FFF7BDFECF4819 +:102C90000090CF4BCF4A21462846F8F799F9B06803 +:102CA0000023052190F864205830F9F753FE0028DE +:102CB00003D0BDE8F840F7F764BFF8BD10B5FEF7E4 +:102CC00063FD20B10020BDE810400146D7E5BDE816 +:102CD0001040F8F70BBA70B50C46064615464FF48F +:102CE000A871204601F09FFE268005B9FFDF286805 +:102CF000C4F800016868C4F80401A868C4F84C016D +:102D0000A6E4EFF7FCBD2DE9F0410D46074606218C +:102D1000EFF7ECFC041E3DD0D4F84C1100260878E7 +:102D200058B14A8821888A4207D109280FD00E2835 +:102D300019D00D2826D008283ED094F82201D0B30F +:102D40006E701020287084F82261AF809EE06E7053 +:102D500009202870D4F84C01416869608168A96035 +:102D60008089A88133E00846EFF7F2FD0746EFF7C8 +:102D70009EFA70B96E700E202870D4F84C0140682D +:102D8000686011E00846EFF7E3FD0746EFF78FFABA +:102D900008B10020A5E46E700D202870D4F84C0115 +:102DA0004168696000892881D4F84C010670384672 +:102DB000EFF777FA6AE00EE06E7008202870D4F81A +:102DC0004C01416869608168A960C068E860D4F816 +:102DD0004C0106705AE094F8240198B16E701520E9 +:102DE00028700AE084F82461D4F826016860D4F8D9 +:102DF0002A01A860B4F82E01A88194F824010028C3 +:102E0000F0D143E094F8300170B16E701D2028704D +:102E100084F83061D4F832016860D4F83601A860D3 +:102E2000B4F83A01A88131E094F83C0140B16E70E9 +:102E30001E20287084F83C61D4F83E01686025E0CB +:102E400094F81C0170B16E701B20287005E000BF63 +:102E500084F81C61D4F81E01686094F81C010028F5 +:102E6000F6D113E094F84201002893D06E7016203A +:102E7000287007E084F84261D4F844016860B4F82F +:102E80004801288194F842010028F3D1012028E468 +:102E90004D4A5061D170704770B50D4604464EE002 +:102EA000B4F8E000401CA4F8E000B4F87E00401C38 +:102EB000A4F87E00204600F001FAB8B1B4F876001C +:102EC000401CA4F87600204600F0E7F9B4F876003C +:102ED000B4F87810884209D30020A4F876000120C5 +:102EE00084F822013848C078E0F716F894F8880092 +:102EF00020B1B4F88400401CA4F8840094F88C003D +:102F000020B1B4F88A00401CA4F88A0094F8FC00B0 +:102F100040B994F867200023012104F15800F9F723 +:102F200019FD20B1B4F88200401CA4F882002046AC +:102F3000FEF7ABFFB4F85800401CA4F858006D1E13 +:102F4000ADB2ADD25FE5204AC2E90601704770B567 +:102F50000446B0F87E0094F86810D1B1B4F880103F +:102F60000D1A2D1F94F87C0040B194F864200023C2 +:102F7000092104F15800F9F7EDFC70B1B4F876605E +:102F8000204600F09BF938B1B4F87800801B001F90 +:102F900003E0C0F10205E5E72846A84200DA05464D +:102FA000002D01DC00202EE5A8B22CE5012802D07E +:102FB000022805D102E0012904D001E0022901D054 +:102FC0000020704701207047900100207F280200F8 +:102FD000252902008D29020010B5012804D00228FD +:102FE00004D0FFDF204610BD0124FBE70224F9E7EF +:102FF00010B5D84C0421A068FEF7D2F9A06890F86B +:103000004E10012903D0BDE8104000F083B9022121 +:1030100080F84E1010BD70B5CE4CA06890F86400DA +:103020001F2804D0607840F001006070EBE4206954 +:10303000FAF735FAD8B1206901220179407901F017 +:10304000070161F30705294600F0070060F30F212F +:10305000A06880F888200022A0F88420232200F8AD +:10306000642FD0F8B400BDE87040FEF77ABD0120AF +:10307000FEF77CFFBDE870401E20FEF74EBC70B529 +:10308000B44C00230A21A06890F864205830F9F766 +:1030900061FC10B32069FAF7DDF9A8B1A5682069D1 +:1030A000FAF7D4F92887A5682069FAF7CBF9688779 +:1030B000A5682069FAF7CCF9A887A5682069FAF70E +:1030C000C3F9E887FEF76FFDA168002081F888004A +:1030D00081F86400BDE870408AE7607840F0010044 +:1030E000607090E49B4810B580680088EFF730FC72 +:1030F000BDE81040EFF7C6B810B5964CA36893F83A +:103100006400162802D00220607010BD607800288C +:10311000FBD1D3F80001002200F11E010E30B033C4 +:10312000F9F792FBA0680021C0E92811012180F87D +:103130006910182180F8641010BD10B5854CA06886 +:1031400090F86410132902D00220607010BD6178DD +:103150000029FBD1D0F8001100884988814200D0B5 +:10316000FFDFA068D0F8001120692631FAF743F993 +:10317000A1682069C431FAF746F9A168162081F8E0 +:10318000640010BD10B5734C207900071BD5607822 +:10319000002818D1A068002190F8CC00FEF72FFE7F +:1031A000A06890F8CC00FE2800D1FFDFA068FE21C7 +:1031B00080F8CC1090F86710082904D10221217002 +:1031C000002180F8671010BD70B5624D24210024E5 +:1031D000A86890F86520212A05D090F86420232A59 +:1031E00018D0FFDF0FE490F8FA2012B990F8FB2016 +:1031F0002AB180F86510A86880F88C4003E400F8D4 +:10320000654F047690F8B1000028F4D00020FEF756 +:1032100084FBF0E790F8FA2012B990F8FB202AB16D +:1032200080F86410A86880F8884069E580F86440F8 +:103230000020FEF772FBF5E770B5464C0025A0684C +:10324000D0F8001103884A889A4218D109780429D5 +:1032500015D190F86420002319465830F9F77AFB0D +:1032600000B9FFDFA06890F89010890703D401210E +:1032700080F8641003E000F8885F806F0570A06834 +:103280000023194690F865205830F9F763FB0028B1 +:1032900002D0A06880F88C5032E5B0F87820B0F801 +:1032A00076108A4201D3511A00E000218288521D13 +:1032B0008A4202D3012180F87C10704710B590F843 +:1032C0006A1041B990F86420002306215830F9F7BC +:1032D00041FB002800D0012010BD1144C2781D48D8 +:1032E000891D89B28068012A06D042B1182A05D109 +:1032F00090F8FA203AB10AE0A0F80A117047D0F825 +:1033000000018180704790F8FB2002B90021A0F8ED +:10331000F81070470F4B30B4986800F58E72018832 +:103320005181018E9181818ED181018FB0F844400D +:10333000A14200D321461182818FB0F8460081421C +:1033400000D20846508201201072D87830BCDFF7D6 +:10335000E3BD00009001002070B58D4C0829207A53 +:1033600062D2DFE801F0041959592561615978B139 +:10337000F3F73AF901210846F3F706FBF4F74DF8A5 +:103380000020A072F3F70AFABDE87040F3F79ABC88 +:10339000BDE87040F1F7F6B9D4E90001F0F7E9FFB4 +:1033A0002060A07A401CC0B2A07228281CD370BD37 +:1033B000A07A0025401EC6B2E0683044F3F77DFDD8 +:1033C00010B9E1687F208855A07A272828BF0125F9 +:1033D0002846F3F7A1FFA07A282809D2401CC0B2E2 +:1033E000A072282828BF70BDBDE87040F3F7D6B999 +:1033F000207A00281CBF012000F085F8F3F7C9FBF4 +:10340000F3F752FC0120E07262480078DFF784FD98 +:10341000BDE87040F1F7B6B9002808BF70BD0020C4 +:10342000BDE8704000F06FB8FFDF70BD10B5584CBC +:10343000207A002804BF0C2010BD00202072E0720A +:10344000607AF1F7FAFD607AF2F745F8607AF1F701 +:1034500070FA00280CBF1F20002010BD002270B59C +:103460004B4C06460D46207A68B12272E272607AB1 +:10347000F1F7E3FD607AF2F72EF8607AF1F759FA86 +:10348000002808BFFFDF4348E560067070BD70B5D7 +:10349000050007D0A5F5E8503F494C3881429CBF54 +:1034A000122070BD3A4CE068002804BF092070BDAE +:1034B000207A00281CBF0C2070BD3848F1F7DDF9D8 +:1034C0006072202804BF1F2070BDF1F751FA206000 +:1034D000002D1CBF28442060012065602072002060 +:1034E00000F011F8002070BD2949CA7A002A04BFF3 +:1034F000002070471F22027000224270CB68436098 +:10350000CA72012070472DE9F04184B00746F1F7F7 +:103510002FFA1F4D8046414668682C6800EB8000FA +:1035200046002046F1F73DFFB04206DB6868811B8C +:103530004046F0F71EFF0446286040F234762146EC +:103540004046F1F72EFFB04204DA31464046F0F72C +:1035500010FF044600208DF800004FF4DD6003905A +:1035600004208DF80500002F14BF012003208DF8E2 +:10357000040068460294F1F7CAFB687A6946F1F7DD +:1035800041FC002808BFFFDF04B0BDE8F081000067 +:103590004C130020B0010020B5EB3C005933020071 +:1035A0002DE9F0410C4612490D68114A11490832C3 +:1035B0001160A0F12001312901D301200CE0412844 +:1035C00010D040CC0C4F94E80E0007EB8000241F75 +:1035D00050F8807C3046B84720600548001D0560E3 +:1035E000BDE8F0812046DDF713FEF5E706207047C1 +:1035F00010050240010000012C50020010B5534894 +:10360000F2F716FA00B1FFDF5048401CF2F710FA4B +:10361000002800D0FFDF10BD2DE9F14F4C4ED6F849 +:1036200000B001274948F2F70BFADFF8208128B9EA +:103630005FF0000708F10100F2F718FA454C002589 +:103640004FF0030901206060C4F80051C4F8045130 +:10365000009931602060DFF800A118E0DAF800007E +:10366000C00614D50E2000F064F8EFF3108010F0BF +:10367000010072B600D00120C4F80493D4F8001100 +:1036800019B9D4F8041101B920BF00B962B6D4F851 +:10369000000118B9D4F804010028DFD0D4F80401DF +:1036A0000028CFD137B1C6F800B008F10100F2F719 +:1036B000C7F911E008F10100F2F7C2F90028B9D109 +:1036C000C4F80893C4F80451C4F800510E2000F067 +:1036D00030F81E48F2F7CAF90020BDE8F88F2DE94E +:1036E000F0438DB00D46064600240DF110090DF192 +:1036F000200817E004EB4407102255F8271068460D +:1037000001F0F0F805EB870710224846796801F0D0 +:10371000E9F86846FFF780FF10224146B86801F0DB +:10372000E1F8641CB442E5DB0DB00020BDE8F08395 +:1037300072E7002809DB00F01F02012191404009D7 +:10374000800000F1E020C0F880127047B101002035 +:1037500004E5004000E0004010ED00E0B249002028 +:103760000870704770B5B14D01232B60B04B1C68D9 +:10377000002CFCD0002407E00E6806601E68002EB6 +:10378000FCD0001D091D641C9442F5D30020286064 +:1037900018680028FCD070BD70B5A34E0446A54D36 +:1037A0003078022800D0FFDFAC4200D3FFDF716920 +:1037B000A148012903D847F23052944201DD032287 +:1037C0004271491C7161291BC1609B497078F1F7F6 +:1037D00019FB002800D1FFDF70BD70B5924C0D467B +:1037E0006178884200D0FFDF924E082D4BD2DFE88F +:1037F00005F04A041E2D4A4A4A382078022800D093 +:10380000FFDF03202070A078012801D020B108E05C +:10381000A06800F0AFFD04E004F1080007C8FFF75E +:10382000A1FF05202070BDE87040F0F7ABBFF1F7B5 +:103830009FF801466068F1F7B4FDB04202D26169B9 +:1038400002290BD30320F2F792F812E0F1F790F877 +:1038500001466068F1F7A5FDB042F3D2BDE87040C3 +:103860009AE7207802280AD0052806D0FFDF042036 +:103870002070BDE8704000F0CCB8022000E00320CA +:10388000F2F775F8F3E7FFDF70BD70B50546F1F7A5 +:103890006FF8654C60602078012800D0FFDF664932 +:1038A000012008700020087104208D604871614873 +:1038B000C860022020706078F1F7A4FA002800D1D7 +:1038C000FFDF70BD10B5584C207838B90220F2F7F0 +:1038D00064F818B90320F2F760F808B1112010BDA0 +:1038E0005648F0F7CAFF6070202804D001202070ED +:1038F0000020606110BD032010BD2DE9F047144683 +:10390000054600EB84000E46A0F1040800F045FDDA +:1039100007464FF0805001694F4306EB8401091FB1 +:10392000B14201D2012100E0002189461CB10069A9 +:10393000B4EB900F02D90920BDE8F0872846DDF7E7 +:10394000BBFC90B9A84510D3BD4205D2B84503D2FF +:1039500045EA0600800701D01020EDE73046DDF78C +:10396000ABFC10B9B9F1000F01D00F20E4E73448E7 +:1039700034490068884205D0224631462846FFF780 +:10398000F1FE14E0FFF79EFF0028D5D12648002164 +:103990008560C0E90364817000F071F810B14FF4E4 +:1039A000A97000E0292060431830FFF76EFF002067 +:1039B000C2E770B505464FF0805004696C4320465D +:1039C000DDF77AFC08B10F2070BD00F0E6FCA842DC +:1039D00001D8102070BD1A481A490068884203D0E7 +:1039E000204600F0C7FC10E0FFF76CFF0028F1D183 +:1039F0000D4801218460817000F041F808B112483F +:103A000000E012481830FFF740FF002070BD00F0C2 +:103A10000DBF10B5044C6078F0F78BFF00B9FFDFE5 +:103A20000020207010BD0000B401002004E501401A +:103A300000E40140105C0C005C130020DB37020046 +:103A400054000020BEBAFECA645E0100084C0100AA +:103A50004FF08050D0F830010A2801D00020704784 +:103A60000120704700B5FFF7F3FF20B14FF0805001 +:103A7000D0F8340108B1002000BD012000BD4FF096 +:103A80008050D0F83011062905D0D0F83001401C04 +:103A900001D000207047012070474FF08050D0F8CF +:103AA0003001082801D0002070470120704700B580 +:103AB000FFF7E5FF48B14FF08050D0F834110629E8 +:103AC00005D3D0F83401401C01D0002000BD0120F6 +:103AD00000BD00B5FFF7D3FF58B14FF08050D0F8CC +:103AE0003411062905D3D0F83401401C01D001203F +:103AF00000BD002000BD00004C49096801600020A5 +:103B000070474A4908600020704701218A0720B1A8 +:103B1000012804D042F204007047916700E0D167A9 +:103B20000020704742490120086042F206007047B9 +:103B300008B504233E4A1907103230B1C1F80433E6 +:103B4000106840F0010010600BE0106820F00100E8 +:103B50001060C1F808330020C1F80801354800683A +:103B60000090002008BD011F0B2909D830491031F1 +:103B70000A6822F01E0242EA4000086000207047F6 +:103B800042F205007047000100F18040C0F80419BE +:103B900000207047000100F18040C0F808190020A3 +:103BA0007047000100F18040D0F800090860002053 +:103BB0007047012801D9072070471F4A52F820009A +:103BC00002680A43026000207047012801D90720DB +:103BD0007047194A52F8200002688A4302600020A8 +:103BE0007047012801D907207047134A52F8200076 +:103BF0000068086000207047020010494FF0000084 +:103C000003D0012A01D0072070470A6070474FF0A7 +:103C100080410020C1F808014FF0E020802180F8A9 +:103C200000140121C0F8001170470000000400409A +:103C30000005004008010040F050020078050040F7 +:103C40006249634B0A6863499A42096801D1C1F32A +:103C500010010160002070475C495D4B0A685D49B6 +:103C6000091D9A4201D1C0F310000860002070477E +:103C70005649574B0A68574908319A4201D1C0F357 +:103C8000100008600020704730B5504B504D1C6844 +:103C900042F20803AC4202D0142802D203E01128F9 +:103CA00001D3184630BDC3004B481844C0F8101566 +:103CB000C0F81425002030BD4449454B0A6842F243 +:103CC00009019A4202D0062802D203E0042801D357 +:103CD00008467047404A012142F8301000207047E2 +:103CE0003A493B4B0A6842F209019A4202D006283F +:103CF00002D203E0042801D308467047364A012166 +:103D000002EBC00041600020704770B52F4A304E72 +:103D1000314C156842F2090304EB8002B54204D02D +:103D2000062804D2C2F8001807E0042801D3184678 +:103D300070BDC1F31000C2F80008002070BD70B55E +:103D4000224A234E244C156842F2090304EB8002F8 +:103D5000B54204D0062804D2D2F8000807E00428AF +:103D600001D3184670BDD2F80008C0F310000860F7 +:103D7000002070BD174910B508311848086011209F +:103D8000154A002102EBC003C3F81015C3F814153F +:103D9000401C1428F6D3002006E0042804D302EBCC +:103DA0008003C3F8001807E002EB8003D3F8004853 +:103DB000C4F31004C3F80048401C0628EDD310BD1E +:103DC000044906480831086070470000540000208C +:103DD000BEBAFECA00F5014000F001400000FEFF3F +:103DE000834B1B6803B19847BFF34F8F814801682D +:103DF000814A01F4E06111430160BFF34F8F00BFBE +:103E0000FDE710B5EFF3108010F0010F72B601D08E +:103E1000012400E0002400F0E1F850B1DDF7ECFAF5 +:103E2000F0F76BFBF1F745FDE8F75AF8734900200E +:103E3000086004B962B6002010BD2DE9F0410C46BF +:103E40000546EFF3108010F0010F72B601D0012685 +:103E500000E0002600F0C2F820B106B962B60820E2 +:103E6000BDE8F081DDF7BCF9DDF7CAFA02460020B3 +:103E700001234709BF0007F1E02700F01F01D7F831 +:103E80000071CF40F9071BD0202803D222FA00F19D +:103E9000C90727D141B2002904DB01F1E02191F8E3 +:103EA000001405E001F00F0101F1E02191F8141D6B +:103EB0004909082916D203FA01F717F0EC0F11D0BF +:103EC000401C6428D5D3E7F7E9FF4D4A4D4900204F +:103ED000E8F72CF849494C4808602046DDF7F3F92B +:103EE00060B904E006B962B641F20100B8E74048A3 +:103EF00004602DB12846DDF733FA18B110242CE008 +:103F0000424D19E02878022802D94FF4805424E069 +:103F100007240028687801D0F8B908E0E8B1202823 +:103F20001BD8A878212818D8012816D001E0A87835 +:103F300098B9E8780B2810D83549802081F8140DFD +:103F4000DDF75EFA2946F1F79AFCF0F795FA00F0F2 +:103F500057FA2846DDF722FA044606B962B61CB1C4 +:103F6000FFF74FFF20467BE7002079E710B50446B6 +:103F700000F034F800B101202070002010BD254968 +:103F800008600020704770B50C4623490D6822492F +:103F9000224E08310E60102807D011280CD01228AC +:103FA0000FD0132811D0012013E0D4E90001FFF74E +:103FB00044FF354620600DE0FFF723FF0025206019 +:103FC00008E02068FFF7D2FF03E01249206808608C +:103FD000002020601048001D056070BD07480A4998 +:103FE0000068884201D1012070470020704700001E +:103FF000CC0100200CED00E00400FA055400002084 +:10400000F813002000000020BEBAFECAF8500200DB +:104010000BE000E004000020100502400100000158 +:1040200000B5864910F1080F08BFF82024D014DC31 +:1040300010F1280F08BFD8201ED010F1140F08BFB0 +:10404000EC2019D010F1100F08BFF02014D010F19F +:104050000C0F08BFF4200FD00CE010F1040F08BFC4 +:10406000FC2009D0002818BF032805D0042804BF6D +:10407000086000BDFFDF00BD086000BD00B57049ED +:10408000012808BF032004D0022816BFFFDF042048 +:1040900000BD086000BD70B505460C4616461046CA +:1040A000F3F788F9022C08BF4FF47A7105D0012C80 +:1040B0000CBF4FF4C86140F6340144183046F3F7A2 +:1040C000A3F9204449F6797108444FF47A71B0FBA2 +:1040D000F1F0281A70BD70B505460C460846F3F796 +:1040E00078F9022C08BF40F24C4105D0012C0CBFDE +:1040F00040F634014FF4AF5149F6CA62511A0844F0 +:104100004FF47A7100F2E140B0FBF1F0281A801E02 +:1041100070BD70B5064615460C460846F3F759F9CA +:10412000022D08BF4FF47A7105D0012D0CBF4FF45A +:10413000C86140F63401022C08BF40F24C4205D061 +:10414000012C0CBF40F634024FF4AF52891A0844D8 +:1041500049F6FC6108444FF47A71B0FBF1F0301A73 +:1041600070BD70B504460E460846F3F723F90546C0 +:104170003046F3F749F928444AF2AB3108444FF48A +:104180007A71B0FBF1F0201A801E70BD2DE9F0416C +:1041900007461E460D4614461046082A16BF042838 +:1041A0004EF62830F3F706F907EB4701C1EBC711CC +:1041B00000EBC100022D08BF40F24C4105D0012D9B +:1041C0000CBF40F634014FF4AF5147182846F3F7BF +:1041D00000F9381A4FF47A7100F6B730B0FBF1F5F8 +:1041E0002046F3F7DBF828443044401DBDE8F08159 +:1041F00070B5054614460E460846F3F7DBF805EBA6 +:104200004502C2EBC512C0EBC2053046F3F7FCF81D +:104210002D1A2046082C16BF04284EF62830F3F736 +:10422000C9F828444FF47A7100F6B730B0FBF1F5C5 +:104230002046F3F7B3F82844401D70BD0C1500402C +:10424000101500402DE9FE430C468046F9F73EF874 +:10425000074698F80160204601A96A46EEF703F880 +:1042600005000DD0012F02D00320BDE8FE832046BB +:1042700002AA0199EDF719FF0298B0F803000AE0CD +:10428000022F14D1042E12D3B8F80300BDF8002079 +:10429000011D914204D8001D80B2A919814202D1AA +:1042A0004FF00000E1E702D24FF00100DDE74FF0F0 +:1042B0000200DAE7C2790D2341B342BB81880129AC +:1042C00004D94908818004BF012282800168012944 +:1042D00018BF002930D001686FEA0101C1EBC102AB +:1042E00002EB011281796FEA010101EB8103C3EB5B +:1042F000811111444FEA914201608188B2FBF1F3D0 +:1043000001FB132181714FF0010102E01AB14FF05E +:104310000001C17170478188FF2908D24FF6FF72F2 +:1043200002EA41018180FF2984BFFF228280016867 +:10433000012918BF0029CED10360CCE7817931B1C2 +:10434000491E11F0FF0181711CBF00207047012040 +:10435000704710B50121C17181718180044604212B +:10436000F1F7E8FB002818BF10BD2068401C206052 +:1043700010BD00000B4A022111600B490B68002B95 +:10438000FCD0084B1B1D186008680028FCD00020DA +:10439000106008680028FCD070474FF080504069DA +:1043A0007047000004E5014000E4014002000B46B4 +:1043B0004FF00000014620D0012A04D0022A04D088 +:1043C000032A0DD103E0012002E0022015E00320C2 +:1043D000072B05D2DFE803F00406080A0C0E1000D4 +:1043E00007207047012108E0022106E0032104E0D4 +:1043F000042102E0052100E00621F0F75CBA00008C +:10440000F948052181700021017041707047F7491A +:104410000A78012A05D0CA681044C8604038F0F70D +:104420008DBF8A6810448860F8E7002819D00378A7 +:10443000EF49F04A13B1012B0ED011E00379012BA3 +:1044400000D06BB943790BB1012B09D18368643B70 +:104450008B4205D2C0680EE00379012B02D00BB16C +:104460000020704743790BB1012BF9D1C368643B3D +:104470008B42F5D280689042F2D801207047DB4928 +:1044800010B501220A700279A2B100220A714279A4 +:1044900092B104224A718268D34C52328A60C06859 +:1044A0001434C8606060F0F763FACF4920600220DE +:1044B000887010BD0322E9E70322EBE770B5CB4D0E +:1044C000044600202870207988B100202871607986 +:1044D00078B10420C44E6871A168F068EFF749FF15 +:1044E000A860E0685230E8600320B07070BD012021 +:1044F000ECE70320EEE72DE9F04105460226F0F750 +:1045000049FE006800B1FFDFB74C01273DB12878B4 +:10451000B0B1012805D0022810D0032813D027718C +:104520000CE06868C82807D3F0F76FFF20B168680F +:10453000FFF76DFF012603E0002601E000F05EF9C1 +:104540003046BDE8F08120780028F7D16868FFF791 +:104550006CFF0028E3D06868017879B1A07804285E +:1045600000D0FFDF01216868FFF7A8FF9F49E078CE +:10457000F0F748FC0028E1D1FFDFDFE7FFF77FFF1E +:104580006770DBE72DE9F047974C8846E178884271 +:1045900000D0FFDFDFF8509200250127934E09F18C +:1045A0001409B8F1080F75D2DFE808F0040C28529E +:1045B0007A808D95A078032802D0022800D0FFDFF2 +:1045C000BDE8F087A078032802D0022800D0FFDFE2 +:1045D0000420A07025712078002878D1FFF717FFFC +:1045E0003078012806D0B068E06000F033F920612F +:1045F000002060E0E078F0F702FBF5E7A078032800 +:1046000002D0022800D0FFDF207800286DD1A078EA +:10461000032816D0F0F7ACF901464F46D9F8000050 +:10462000F0F7BFFE00280EDB796881420BDB081A29 +:10463000F0606E49E078F0F7E5FB0028C0D1FFDFBD +:10464000BEE7042028E00420F1F791F9A570B7E750 +:10465000A078032802D0022800D0FFDF207888BB92 +:10466000A078032817D0F0F783F901464F46D9F810 +:104670000000F0F796FE0028E5DB79688142E2DB76 +:10468000081AF0605949E078F0F7BCFB002897D190 +:10469000FFDF95E740E00520F1F769F9A7708FE7A4 +:1046A000A078042800D0FFDF022004E0A0780428CE +:1046B00000D0FFDF0120A1688847FFF71CFF0546F7 +:1046C00030E004E011E0A078042800D0FFDFBDE86E +:1046D000F04700F093B8A078042804D0617809B1BD +:1046E000022800D0FFDF207818B1BDE8F04700F0C5 +:1046F0008EB8207920B10620F1F739F92571CDE780 +:10470000607838B13949E078F0F77CFB00B9FFDF19 +:10471000657055E70720BFE7FFDF51E73DB1012D89 +:1047200003D0FFDF022DF9D14AE70420C3E70320BD +:10473000C1E770B5050004D02B4CA078052806D140 +:1047400001E0102070BD0820F1F727F908B1112011 +:1047500070BD2948F0F791F8E070202806D00121BB +:10476000F0F74DFF0020A560A07070BD032070BD64 +:104770001D4810B5017809B1112010BD81780529B7 +:1047800006D0012906D029B101210170002010BDF9 +:104790000F2010BD00F03BF8F8E770B5124C05464D +:1047A000A07808B1012809D155B12846FFF73DFE90 +:1047B00040B1287840B1A078012809D00F2070BD01 +:1047C000102070BD072070BD2846FFF758FE03E09B +:1047D00000212846FFF772FE0449E078F0F712FB4B +:1047E00000B9FFDF002070BDD00100206C13002055 +:1047F0003D860100FF1FA107854502000A4810B54C +:10480000006900F01FF8BDE81040EFF7BBBF064895 +:1048100010B5C078F0F78DF800B9FFDF0820F1F788 +:10482000A6F8BDE81040EBE5D001002010B5134C10 +:104830002060201D0160114810300260001D0360DF +:10484000002010BD0E490A6848F202139A43024341 +:104850000A6070470A4A116848F2021301EA03002D +:10486000994311607047054B02465B421020134488 +:10487000FC2B01D8116000207047000000060040AA +:10488000C8060240704770477047704740EA01030E +:1048900010B59B070FD1042A0DD310C808C9121FE9 +:1048A0009C42F8D020BA19BA884201D9012010BD23 +:1048B0004FF0FF3010BD1AB1D30703D0521C07E0F0 +:1048C000002010BD10F8013B11F8014B1B1B07D154 +:1048D00010F8013B11F8014B1B1B01D1921EF1D1C5 +:1048E000184610BD032A40F2308010F0030C00F08F +:1048F000158011F8013BBCF1020F624498BF11F81A +:1049000001CB00F8013B38BF11F8013BA2F10402D2 +:1049100098BF00F801CB38BF00F8013B11F003034A +:1049200000F02580083AC0F0088051F8043B083AAE +:1049300051F804CBA0E80810F5E7121D5CBF51F850 +:10494000043B40F8043BAFF30080D20724BF11F8CA +:10495000013B11F801CB48BF11F8012B24BF00F82F +:10496000013B00F801CB48BF00F8012B704710B5A0 +:10497000203AC0F00B80B1E81850203AA0E8185057 +:10498000B1E81850A0E81850BFF4F5AF5FEA027C18 +:1049900024BFB1E81850A0E8185044BF18C918C087 +:1049A000BDE810405FEA827C24BF51F8043B40F828 +:1049B000043B08BF7047D20728BF31F8023B48BF0D +:1049C00011F8012B28BF20F8023B48BF00F8012B4B +:1049D000704702F0FF0343EA032242EA024200F07A +:1049E00002B84FF000020429C0F0128010F0030C4E +:1049F00000F01B80CCF1040CBCF1020F18BF00F8D2 +:104A0000012BA8BF20F8022BA1EB0C0100F00DB880 +:104A10005FEAC17C24BF00F8012B00F8012B48BFDE +:104A200000F8012B70474FF0000200B51346944682 +:104A30009646203922BFA0E80C50A0E80C50B1F1F6 +:104A40002001BFF4F7AF090728BFA0E80C5048BF0A +:104A50000CC05DF804EB890028BF40F8042B08BFA8 +:104A6000704748BF20F8022B11F0804F18BF00F8A4 +:104A7000012B70477047704770477047FEDF184939 +:104A80000978F9B90420714608421BD10699154AE4 +:104A9000914217DC0699022914DB02394878DF2895 +:104AA00010D10878FE2807D0FF280BD14FF0010065 +:104AB0004FF000020C4B184741F201000099019A97 +:104AC000094B1847094B002B02D01B68DB681847BD +:104AD0004FF0FF3071464FF00002034B18470000C3 +:104AE00028ED00E000600200E13D0200040000202B +:104AF000174818497047FFF7FBFFDCF75FFB00BD65 +:104B0000154816490968884203D1154A13605B6845 +:104B1000184700BD20BFFDE70F48104909688842CB +:104B200010D1104B18684FF0FF318842F2D080F35B +:104B300008884FF02021884204DD0B4802680321D9 +:104B40000A4302600948804709488047FFDF0000A8 +:104B500080130020801300200010000000000020BF +:104B6000040000200060020014090040C52F00006E +:104B7000014B020004207146084202D0EFF3098184 +:104B800001E0EFF30881886902380078102813DB10 +:104B900020280FDB2C280BDB0A4A12680A4B9A42AA +:104BA00003D1602804DB094A1047022008607047DF +:104BB000074A1047074A1047074A12682C32126802 +:104BC0001047000054000020BEBAFECA05140000C1 +:104BD000A1350200873F0200040000200D4B0E4962 +:104BE00008470E4B0C4908470D4B0B4908470D4B26 +:104BF000094908470C4B084908470C4B0649084728 +:104C00000B4B054908470B4B034908470A4B024920 +:104C100008470000C5BC0000F9BF0000552D00008A +:104C2000CF2B00005D2B0000F72D000021140000A9 +:104C30001B2900004D2F0000C91100000021016058 +:104C400081807047002101604160017270470A68ED +:104C500002600B7903717047819600002B98000069 +:104C60008D990000F19900002B9A00005F9A0000D6 +:104C7000999A0000C99A0000379B000079970000BC +:104C8000B1990000A7120000B543000001440000E4 +:104C900067440000F344000017460000D9460000B6 +:104CA0000B470000E34700007B480000CF480000AE +:104CB000B5490000D5490000C3160000E716000002 +:104CC000171600006B16000019170000AD17000042 +:104CD00033600000E3610000A9650000C1660000C8 +:104CE0004B670000C96700002D6800004D69000097 +:104CF0001D6A0000896A0000F7490000FD490000B4 +:104D0000074A00006F4A00009B4A0000494C00001F +:104D1000734C0000AB4C0000214D00000D4E000014 +:104D2000234E000025440000A7120000A712000037 +:104D3000A7120000A7120000A7120000A71200008F +:104D4000A7120000A3250000292600004526000028 +:104D500061260000EF2700008B260000952600004A +:104D6000D7260000F9260000D527000017280000EC +:104D7000A7120000A7120000B7830000D78300002D +:104D8000E18300001B840000498400003985000095 +:104D9000C7850000DB850000298600003F870000F2 +:104DA000E58800000D8A00003B730000258A0000A2 +:104DB000A7120000A7120000B9B5000023B7000039 +:104DC00077B70000E3B7000093B8000001000000CF +:104DD00000000000100110013A0200001A02000455 +:104DE00005060000FFFFFFFF0000FFFFADAD000064 +:104DF000173D00004921000085730000FD8E000072 +:104E000000000000C191000085910000AF910000FA +:104E10009791000000000200000000000002000066 +:104E2000000000000001000000000000638100009D +:104E300043810000B181000025250000E724000027 +:104E40000725000017A9000043A900004BAB000094 +:104E50002D590000D18100000000000001820000F7 +:104E600073250000000000000000000000000000AA +:104E70002DAA000000000000C1590000030000003E +:104E800001555555D6BE898E00006306630C63122A +:104E900000000703AB054F08000053044308330C20 +:104EA000000000004808000048080000AF5600005D +:104EB000AF5600009143000059AC00000776000097 +:104EC0005B200000D72C02002D9E0100ED56000053 +:104ED000ED560000B3430000BBAC00008B76000031 +:104EE000CD200000032D0200419E010070017001E1 +:104EF000400038005C00240050010802000003005C +:104F0000656C7462000000000000000000000000FA +:104F1000000000008700000000000000000000000A +:104F200000000000BE83605ADB0B376038A5F5AA8D +:104F30009183886C01000000B32E0100793D0100CF +:104F40000000000102060304050000000700000045 +:104F500000000000060000000A000000320000000F +:104F600073000000B4000000278A0100A9140200A9 +:104F70004FF8000009B1010067EB010009B1010021 +:104F8000EDF90000C7B2010053E80100C7B201000B +:104F90004DF6000055B20100AFEA010055B2010024 +:104FA0004BF800001DB101000DE601001DB101002C +:104FB0009FFE00003FB501001BEC01003FB5010062 +:104FC000F401FA00960064004B0032001E00140049 +:104FD0000A0005000200010000410000000000007E +:104FE000AAAED7AB154120100C0802170D01010223 +:104FF000090901010602091818030101090903033F +:1050000005555555252627D6BE898E00F401FA0090 +:10501000960064004B0032001E0014000A000500D8 +:10502000020001002541000000000000413C020098 +:10503000593C0200713C0200893C0200B93C02006C +:10504000E13C02000B3D02003F3D0200B33902008B +:10505000FB3802000F3A020067480200315A010093 +:10506000415A01006D5A01003F5B0100475B01009E +:10507000595B01000B3B0200253B0200F93A02009C +:10508000033B0200313B0200673B0200ED350200AA +:10509000873B0200953B0200A33B0200B33B0200AA +:1050A000CB3B0200E33B0200F93B0200ED3502007E +:1050B0000000000067BA0000BDBA0000D3BA0000CB +:1050C000AD43020019360200DF360200334702000A +:1050D000714702009B47020011590100715D0100F8 +:1050E000ED350200ED350200ED350200ED35020030 +:1050F0001C05004020050040001002001C51020069 +:1051000008000020E401000044110000505102009A +:10511000EC01002094110000A0110000011413F80C +:10512000130240200B200406441A0102228C27207F +:10513000FB349B5F801280021E101B430B5419042A +:105140002A8608019F0916CB327F0B6CF410C00031 +:00000001FF diff --git a/uuid.go b/uuid.go new file mode 100644 index 0000000..57f18fe --- /dev/null +++ b/uuid.go @@ -0,0 +1,32 @@ +package bluetooth + +// This file implements 16-bit and 128-bit UUIDs as defined in the Bluetooth +// specification. + +// UUID is a single UUID as used in the Bluetooth stack. It is represented as a +// [4]uint32 instead of a [16]byte for efficiency. +type UUID [4]uint32 + +// New16bitUUID returns a new 128-bit UUID based on a 16-bit UUID. +// +// Note: only use registered UUIDs. See +// https://www.bluetooth.com/specifications/gatt/services/ for a list. +func New16BitUUID(shortUUID uint16) UUID { + // https://stackoverflow.com/questions/36212020/how-can-i-convert-a-bluetooth-16-bit-service-uuid-into-a-128-bit-uuid + var uuid UUID + uuid[0] = 0x5F9B34FB + uuid[1] = 0x80000080 + uuid[2] = 0x00001000 + uuid[3] = uint32(shortUUID) + return uuid +} + +// Is16Bit returns whether this UUID is a 16-bit BLE UUID. +func (uuid UUID) Is16Bit() bool { + return uuid.Is32Bit() && uuid[3] == uint32(uint16(uuid[3])) +} + +// Is32Bit returns whether this UUID is a 32-bit BLE UUID. +func (uuid UUID) Is32Bit() bool { + return uuid[0] == 0x5F9B34FB && uuid[1] == 0x80000080 && uuid[2] == 0x00001000 +} diff --git a/uuid_sd.go b/uuid_sd.go new file mode 100644 index 0000000..291cd69 --- /dev/null +++ b/uuid_sd.go @@ -0,0 +1,24 @@ +// +build softdevice,s132v6 + +package bluetooth + +/* +// Define SoftDevice functions as regular function declarations (not inline +// static functions). +#define SVCALL_AS_NORMAL_FUNCTION + +#include "s132_nrf52_6.1.1/s132_nrf52_6.1.1_API/include/ble.h" +*/ +import "C" +import "unsafe" + +func (uuid UUID) shortUUID() (C.ble_uuid_t, uint32) { + var short C.ble_uuid_t + short.uuid = uint16(uuid[3]) + if uuid.Is16Bit() { + short._type = C.BLE_UUID_TYPE_BLE + return short, 0 + } + errCode := C.sd_ble_uuid_vs_add((*C.ble_uuid128_t)(unsafe.Pointer(&uuid[0])), &short._type) + return short, errCode +}