From 7dec0b1165c99221ec9721d90679fe369362a430 Mon Sep 17 00:00:00 2001 From: lathoub Date: Sun, 8 Mar 2020 13:47:12 +0100 Subject: [PATCH] renamed BLEMIDI to BLE-MIDI --- examples/MidiBle/MidiBle.ino | 11 +- src/BLE-MIDI.cpp | 1 + src/BLE-MIDI.h | 314 ++++ src/BLE-MIDI_Defs.h | 38 + ...di_bleNamespace.h => BLE-MIDI_Namespace.h} | 0 src/BLE-MIDI_Settings.h | 12 + .../BLE-MIDI_ESP32.h} | 31 +- src/midi_bleDefs.h | 27 - src/midi_bleSettings.h | 3 - src/midi_bleTransport.cpp | 1 - src/midi_bleTransport.h | 158 -- src/utility/endian.h | 139 -- src/utility/midi_feat4_4_0/MIDI.cpp | 115 -- src/utility/midi_feat4_4_0/MIDI.h | 266 --- src/utility/midi_feat4_4_0/MIDI.hpp | 1428 ----------------- src/utility/midi_feat4_4_0/midi_Defs.h | 209 --- src/utility/midi_feat4_4_0/midi_Message.h | 101 -- src/utility/midi_feat4_4_0/midi_Namespace.h | 38 - src/utility/midi_feat4_4_0/midi_Settings.h | 87 - test/Arduino.h | 5 + test/NoteOn.cpp | 2 +- .../UserInterfaceState.xcuserstate | Bin 213637 -> 234098 bytes .../xcshareddata/xcschemes/rtpMidi.xcscheme | 78 + .../xcschemes/xcschememanagement.plist | 8 + 24 files changed, 476 insertions(+), 2596 deletions(-) create mode 100755 src/BLE-MIDI.cpp create mode 100755 src/BLE-MIDI.h create mode 100755 src/BLE-MIDI_Defs.h rename src/{midi_bleNamespace.h => BLE-MIDI_Namespace.h} (100%) create mode 100755 src/BLE-MIDI_Settings.h rename src/{Ble_esp32.h => hardware/BLE-MIDI_ESP32.h} (74%) delete mode 100755 src/midi_bleDefs.h delete mode 100755 src/midi_bleSettings.h delete mode 100755 src/midi_bleTransport.cpp delete mode 100755 src/midi_bleTransport.h delete mode 100644 src/utility/endian.h delete mode 100644 src/utility/midi_feat4_4_0/MIDI.cpp delete mode 100644 src/utility/midi_feat4_4_0/MIDI.h delete mode 100644 src/utility/midi_feat4_4_0/MIDI.hpp delete mode 100644 src/utility/midi_feat4_4_0/midi_Defs.h delete mode 100644 src/utility/midi_feat4_4_0/midi_Message.h delete mode 100644 src/utility/midi_feat4_4_0/midi_Namespace.h delete mode 100644 src/utility/midi_feat4_4_0/midi_Settings.h create mode 100644 test/bleMidi.xcodeproj/xcshareddata/xcschemes/rtpMidi.xcscheme diff --git a/examples/MidiBle/MidiBle.ino b/examples/MidiBle/MidiBle.ino index 919f9dc..7d098f3 100644 --- a/examples/MidiBle/MidiBle.ino +++ b/examples/MidiBle/MidiBle.ino @@ -1,16 +1,15 @@ #define DEBUG 4 -#include -#include +#include +#include - -typedef BLEMIDI_NAMESPACE::BleMidiTransport bleMIDI_t; -bleMIDI_t bm("Huzzah BLE MIDI"); -MIDI_NAMESPACE::MidiInterface MIDI((bleMIDI_t &)bm); +BLEMIDI_CREATE_DEFAULT_ESP32_INSTANCE() USING_NAMESPACE_BLEMIDI unsigned long t0 = millis(); +#ifdef ESP32 bool isConnected = false; +#endif // ----------------------------------------------------------------------------- // diff --git a/src/BLE-MIDI.cpp b/src/BLE-MIDI.cpp new file mode 100755 index 0000000..3ba251c --- /dev/null +++ b/src/BLE-MIDI.cpp @@ -0,0 +1 @@ +#include "BLE-MIDI.h" diff --git a/src/BLE-MIDI.h b/src/BLE-MIDI.h new file mode 100755 index 0000000..2f7317a --- /dev/null +++ b/src/BLE-MIDI.h @@ -0,0 +1,314 @@ +/*! + * @file BLEMIDI.h + */ + +#pragma once + +#include "utility/Logging.h" + +#include +using namespace MIDI_NAMESPACE; + +#include "BLE-MIDI_Settings.h" +#include "BLE-MIDI_Defs.h" +#include "BLE-MIDI_Namespace.h" + +BEGIN_BLEMIDI_NAMESPACE + +template +class BLEMIDI +{ + typedef _Settings Settings; + +private: + byte mRxBuffer[Settings::MaxBufferSize]; + unsigned mRxIndex = 0; + + byte mTxBuffer[Settings::MaxBufferSize]; + unsigned mTxIndex = 0; + + char mDeviceName[24]; + +private: + T mBleClass; + +public: + BLEMIDI(const char* deviceName) + { + strncpy(mDeviceName, deviceName, 24); + + mRxIndex = 0; + mTxIndex = 0; + } + + void begin(MIDI_NAMESPACE::Channel inChannel = 1) + { + mBleClass.begin(mDeviceName, this); + } + + bool beginTransmission(MidiType) + { + getMidiTimestamp(&mTxBuffer[0], &mTxBuffer[1]); + mTxIndex = 2; + + return true; + } + + void write(byte inData) + { + // check for size! SysEx!!! + if (false) + { + // should only happen from SysEx! + // if we approach the end of the buffer, chop-up in segments until + // we reach F7 (end of SysEx) + } + + mTxBuffer[mTxIndex++] = inData; + } + + void endTransmission() + { + mBleClass.write(mTxBuffer, mTxIndex); + mTxIndex = 0; + } + + unsigned available() + { + return mRxIndex; + } + + byte read() + { + return mRxBuffer[--mRxIndex]; + } + +private: + void reverse(byte arr[], int n) + { + for (int low = 0, high = n - 1; low < high; low++, high--) + { + int temp = arr[low]; + arr[low] = arr[high]; + arr[high] = temp; + } + } + +public: + /* + The general form of a MIDI message follows: + n-byte MIDI Message + Byte 0 MIDI message Status byte, Bit 7 is Set to 1. + Bytes 1 to n-1 MIDI message Data bytes, if n > 1. Bit 7 is Set to 0 + There are two types of MIDI messages that can appear in a single packet: full MIDI messages and + Running Status MIDI messages. Each is encoded differently. + A full MIDI message is simply the MIDI message with the Status byte included. + A Running Status MIDI message is a MIDI message with the Status byte omitted. Running Status + MIDI messages may only be placed in the data stream if the following criteria are met: + 1. The original MIDI message is 2 bytes or greater and is not a System Common or System + Real-Time message. + 2. The omitted Status byte matches the most recently preceding full MIDI message’s Status + byte within the same BLE packet. + In addition, the following rules apply with respect to Running Status: + 1. A Running Status MIDI message is allowed within the packet after at least one full MIDI + message. + 2. Every MIDI Status byte must be preceded by a timestamp byte. Running Status MIDI + messages may be preceded by a timestamp byte. If a Running Status MIDI message is not + preceded by a timestamp byte, the timestamp byte of the most recently preceding message + in the same packet is used. + 3. System Common and System Real-Time messages do not cancel Running Status if + interspersed between Running Status MIDI messages. However, a timestamp byte must + precede the Running Status MIDI message that follows. + 4. The end of a BLE packet does cancel Running Status. + In the MIDI 1.0 protocol, System Real-Time messages can be sent at any time and may be + inserted anywhere in a MIDI data stream, including between Status and Data bytes of any other + MIDI messages. In the MIDI BLE protocol, the System Real-Time messages must be deinterleaved + from other messages – except for System Exclusive messages. + */ + void receive(byte* buffer, size_t bufferSize) + { + size_t index = 0; + size_t i = 0; + + N_DEBUG_PRINT("Received ("); + N_DEBUG_PRINT(bufferSize); + N_DEBUG_PRINTLN(") :"); + for (int j = 0; j < bufferSize; j++) { + N_DEBUG_PRINT("0x"); + N_DEBUG_PRINT(buffer[j], HEX); + N_DEBUG_PRINT(" "); + } + N_DEBUG_PRINTLN(); + N_DEBUG_PRINTLN(); + + // Pointers used to search through payload. + uint8_t lPtr = 0; + uint8_t rPtr = 0; + + // lastStatus used to capture runningStatus + uint8_t lastStatus; + + // Decode first packet -- SHALL be "Full MIDI message" + lPtr = 2; //Start at first MIDI status -- SHALL be "MIDI status" + + // While statement contains incrementing pointers and breaks when buffer size exceeded. + while (true) + { + lastStatus = buffer[lPtr]; + if( (buffer[lPtr] < 0x80) ) + break; // Status message not present, bail + + // Point to next non-data byte + rPtr = lPtr; + while ((buffer[rPtr + 1] < 0x80) + && (rPtr < (bufferSize - 1)) ) + rPtr++; + + // look at l and r pointers and decode by size. + if( rPtr - lPtr < 1 ) + { + mRxBuffer[i++] = lastStatus; + } + else if( rPtr - lPtr < 2 ) { + mRxBuffer[i++] = lastStatus; + mRxBuffer[i++] = buffer[lPtr + 1]; + } + else if( rPtr - lPtr < 3 ) { + mRxBuffer[i++] = lastStatus; + mRxBuffer[i++] = buffer[lPtr + 1]; + mRxBuffer[i++] = buffer[lPtr + 2]; + } + else + { +/* //Too much data + //If not System Common or System Real-Time, send it as running status + switch( buffer[lPtr] & 0xF0 ) + { + case NoteOff: + case NoteOn: + case AfterTouchPoly: + case ControlChange: + case PitchBend: + for(int i = lPtr; i < rPtr; i = i + 2) + sendMIDI(lastStatus, buffer[i + 1], buffer[i + 2]); + break; + case ProgramChange: + case AfterTouchChannel: + for(int i = lPtr; i < rPtr; i = i + 1) + sendMIDI(lastStatus, buffer[i + 1]); + break; + default: + break; + } +*/ + } + + // Point to next status + lPtr = rPtr + 2; + + if (lPtr >= bufferSize) + break; //end of packet + } + + + + + + + + + + + + + reverse(mRxBuffer, i); + + N_DEBUG_PRINT("mRxBuffer ("); + N_DEBUG_PRINT(i); + N_DEBUG_PRINTLN(") :"); + for (int j = 0; j < i; j++) { + N_DEBUG_PRINT("0x"); + N_DEBUG_PRINT(mRxBuffer[j], HEX); + N_DEBUG_PRINT(" "); + } + N_DEBUG_PRINTLN(); + N_DEBUG_PRINTLN(); + + mRxIndex = i; + } + +protected: + /* + The first byte of all BLE packets must be a header byte. This is followed by timestamp bytes and MIDI messages. + + Header Byte + bit 7 Set to 1. + bit 6 Set to 0. (Reserved for future use) + bits 5-0 timestampHigh:Most significant 6 bits of timestamp information. + The header byte contains the topmost 6 bits of timing information for MIDI events in the BLE + packet. The remaining 7 bits of timing information for individual MIDI messages encoded in a + packet is expressed by timestamp bytes. + + Timestamp Byte + bit 7 Set to 1. + bits 6-0 timestampLow: Least Significant 7 bits of timestamp information. + + The 13-bit timestamp for the first MIDI message in a packet is calculated using 6 bits from the + header byte and 7 bits from the timestamp byte. + + Timestamps are 13-bit values in milliseconds, and therefore the maximum value is 8,191 ms. + Timestamps must be issued by the sender in a monotonically increasing fashion. + timestampHigh is initially set using the lower 6 bits from the header byte while the timestampLow is + formed of the lower 7 bits from the timestamp byte. Should the timestamp value of a subsequent + MIDI message in the same packet overflow/wrap (i.e., the timestampLow is smaller than a + preceding timestampLow), the receiver is responsible for tracking this by incrementing the + timestampHigh by one (the incremented value is not transmitted, only understood as a result of the + overflow condition). + + In practice, the time difference between MIDI messages in the same BLE packet should not span + more than twice the connection interval. As a result, a maximum of one overflow/wrap may occur + per BLE packet. + + Timestamps are in the sender’s clock domain and are not allowed to be scheduled in the future. + Correlation between the receiver’s clock and the received timestamps must be performed to + ensure accurate rendering of MIDI messages, and is not addressed in this document. + */ + + /* + Calculating a Timestamp + To calculate the timestamp, the built-in millis() is used. + The BLE standard only specifies 13 bits worth of millisecond data though, + so it’s bitwise anded with 0x1FFF for an ever repeating cycle of 13 bits. + This is done right after a MIDI message is detected. It’s split into a 6 upper bits, 7 lower bits, + and the MSB of both bytes are set to indicate that this is a header byte. + Both bytes are placed into the first two position of an array in preparation for a MIDI message. + */ + static void getMidiTimestamp (uint8_t *header, uint8_t *timestamp) + { + auto currentTimeStamp = millis() & 0x01FFF; + + *header = ((currentTimeStamp >> 7) & 0x3F) | 0x80; // 6 bits plus MSB + *timestamp = (currentTimeStamp & 0x7F) | 0x80; // 7 bits plus MSB + } + + static void setMidiTimestamp (uint8_t header, uint8_t *timestamp) + { + } + +public: + // callbacks + void(*_connectedCallback)() = nullptr; + void(*_disconnectedCallback)() = nullptr; + +public: + void onConnected(void(*fptr)()) { + _connectedCallback = fptr; + } + + void onDisconnected(void(*fptr)()) { + _disconnectedCallback = fptr; + } + +}; + +END_BLEMIDI_NAMESPACE diff --git a/src/BLE-MIDI_Defs.h b/src/BLE-MIDI_Defs.h new file mode 100755 index 0000000..5fd8056 --- /dev/null +++ b/src/BLE-MIDI_Defs.h @@ -0,0 +1,38 @@ +#pragma once + +#include "BLE-MIDI_Namespace.h" + +// As specified in +// Specification for MIDI over Bluetooth Low Energy (BLE-MIDI) +// Version 1.0a, NOvember 1, 2015 +// 3. BLE Service and Characteristics Definitions +#define SERVICE_UUID "03b80e5a-ede8-4b33-a751-6ce34ec4c700" +#define CHARACTERISTIC_UUID "7772e5db-3868-4112-a1a9-f2669d106bf3" + +#if ARDUINO +#include +#else +#include +typedef uint8_t byte; +#endif + +BEGIN_BLEMIDI_NAMESPACE + +/*! \brief Create an instance of the library + */ +#define BLEMIDI_CREATE_INSTANCE(Type, DeviceName, Name) \ +typedef BLEMIDI_NAMESPACE::BLEMIDI BLEMIDI_t; \ +BLEMIDI_t Name(DeviceName); \ +MIDI_NAMESPACE::MidiInterface MIDI((BLEMIDI_t &)Name); + +/*! \brief Create an instance for ESP32 named +*/ +#define BLEMIDI_CREATE_ESP32_INSTANCE(DeviceName) \ +BLEMIDI_CREATE_INSTANCE(BLEMIDI_NAMESPACE::BLEMIDI_ESP32, DeviceName, bm); + +/*! \brief Create a default instance for ESP32 named BLE-MIDI +*/ +#define BLEMIDI_CREATE_DEFAULT_ESP32_INSTANCE() \ +BLEMIDI_CREATE_ESP32_INSTANCE("BLE-MIDI") + +END_BLEMIDI_NAMESPACE diff --git a/src/midi_bleNamespace.h b/src/BLE-MIDI_Namespace.h similarity index 100% rename from src/midi_bleNamespace.h rename to src/BLE-MIDI_Namespace.h diff --git a/src/BLE-MIDI_Settings.h b/src/BLE-MIDI_Settings.h new file mode 100755 index 0000000..581cac5 --- /dev/null +++ b/src/BLE-MIDI_Settings.h @@ -0,0 +1,12 @@ +#pragma once + +#include "BLE-MIDI_Namespace.h" + +BEGIN_BLEMIDI_NAMESPACE + +struct DefaultSettings +{ + static const size_t MaxBufferSize = 64; +}; + +END_BLEMIDI_NAMESPACE diff --git a/src/Ble_esp32.h b/src/hardware/BLE-MIDI_ESP32.h similarity index 74% rename from src/Ble_esp32.h rename to src/hardware/BLE-MIDI_ESP32.h index 95a0678..815d172 100755 --- a/src/Ble_esp32.h +++ b/src/hardware/BLE-MIDI_ESP32.h @@ -8,43 +8,40 @@ BEGIN_BLEMIDI_NAMESPACE -#define SERVICE_UUID "03b80e5a-ede8-4b33-a751-6ce34ec4c700" -#define CHARACTERISTIC_UUID "7772e5db-3868-4112-a1a9-f2669d106bf3" - -class BluetoothEsp32 +class BLEMIDI_ESP32 { private: BLEServer* _server = nullptr; BLEAdvertising* _advertising = nullptr; BLECharacteristic* _characteristic = nullptr; - BleMidiTransport* _bleMidiTransport = nullptr; + BLEMIDI* _bleMidiTransport = nullptr; public: - BluetoothEsp32() + BLEMIDI_ESP32() { } - bool begin(const char*, BleMidiTransport*); + bool begin(const char*, BLEMIDI*); - inline void write(uint8_t* data, uint8_t length) + void write(uint8_t* data, uint8_t length) { _characteristic->setValue(data, length); _characteristic->notify(); } - inline void receive(uint8_t* buffer, uint8_t length) + void receive(uint8_t* buffer, uint8_t length) { _bleMidiTransport->receive(buffer, length); } - inline void connected() + void connected() { if (_bleMidiTransport->_connectedCallback) _bleMidiTransport->_connectedCallback(); } - inline void disconnected() + void disconnected() { if (_bleMidiTransport->_disconnectedCallback) _bleMidiTransport->_disconnectedCallback(); @@ -53,12 +50,12 @@ public: class MyServerCallbacks: public BLEServerCallbacks { public: - MyServerCallbacks(BluetoothEsp32* bluetoothEsp32) + MyServerCallbacks(BLEMIDI_ESP32* bluetoothEsp32) : _bluetoothEsp32(bluetoothEsp32) { } protected: - BluetoothEsp32* _bluetoothEsp32 = nullptr; + BLEMIDI_ESP32* _bluetoothEsp32 = nullptr; void onConnect(BLEServer* server) { _bluetoothEsp32->connected(); @@ -71,22 +68,22 @@ protected: class MyCharacteristicCallbacks: public BLECharacteristicCallbacks { public: - MyCharacteristicCallbacks(BluetoothEsp32* bluetoothEsp32) + MyCharacteristicCallbacks(BLEMIDI_ESP32* bluetoothEsp32) : _bluetoothEsp32(bluetoothEsp32 ) { } protected: - BluetoothEsp32* _bluetoothEsp32 = nullptr; + BLEMIDI_ESP32* _bluetoothEsp32 = nullptr; void onWrite(BLECharacteristic * characteristic) { std::string rxValue = characteristic->getValue(); - if (rxValue.length() > 2) { + if (rxValue.length() > 0) { _bluetoothEsp32->receive((uint8_t *)(rxValue.c_str()), rxValue.length()); } } }; -bool BluetoothEsp32::begin(const char* deviceName, BleMidiTransport* bleMidiTransport) +bool BLEMIDI_ESP32::begin(const char* deviceName, BLEMIDI* bleMidiTransport) { _bleMidiTransport = bleMidiTransport; diff --git a/src/midi_bleDefs.h b/src/midi_bleDefs.h deleted file mode 100755 index 1f0b965..0000000 --- a/src/midi_bleDefs.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "midi_bleNamespace.h" - -#if ARDUINO -#include -#else -#include -typedef uint8_t byte; -#endif - -BEGIN_BLEMIDI_NAMESPACE - -#define BleBuffer_t Deque - -/*! \brief Create an instance of the library - */ -#define BLEMIDI_CREATE_INSTANCE(Type, Name) \ - BLEMIDI_NAMESPACE::BleMidiTransport Name((Type&)SerialPort); - - -/*! \brief -*/ -#define BLEMIDI_CREATE_DEFAULT_INSTANCE() \ - BLEMIDI_CREATE_INSTANCE(bm); - -END_BLEMIDI_NAMESPACE diff --git a/src/midi_bleSettings.h b/src/midi_bleSettings.h deleted file mode 100755 index 8771a06..0000000 --- a/src/midi_bleSettings.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "midi_bleNamespace.h" diff --git a/src/midi_bleTransport.cpp b/src/midi_bleTransport.cpp deleted file mode 100755 index fef6562..0000000 --- a/src/midi_bleTransport.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "midi_bleTransport.h" diff --git a/src/midi_bleTransport.h b/src/midi_bleTransport.h deleted file mode 100755 index 3622996..0000000 --- a/src/midi_bleTransport.h +++ /dev/null @@ -1,158 +0,0 @@ -/*! - * @file midi_bleTransport.h - */ - -#pragma once - -#include "utility/midi_feat4_4_0/MIDI.h" - -#include "utility/Logging.h" - -#include "midi_bleSettings.h" -#include "midi_bleDefs.h" - -#include "utility/Deque.h" - -BEGIN_BLEMIDI_NAMESPACE - -template -class BleMidiTransport -{ -private: - byte mRxBuffer[44]; - unsigned mRxIndex = 0; - - byte mTxBuffer[44]; - unsigned mTxIndex = 0; - - char mDeviceName[24]; - -private: - BleClass mBleClass; - -public: - BleMidiTransport(const char* deviceName) - { - strncpy(mDeviceName, deviceName, 24); - - mRxIndex = 0; - mTxIndex = 0; - } - - void begin(MIDI_NAMESPACE::Channel inChannel = 1) - { - mBleClass.begin(mDeviceName, this); - } - - bool beginTransmission() - { - getMidiTimestamp(&mTxBuffer[0], &mTxBuffer[1]); - mTxIndex = 2; - - return true; - } - - void write(byte inData) - { - // check for size! SysEx!!! - if (false) - { - // should only happen from SysEx! - // if we approach the end of the buffer, chop-up in segments until - // we reach F7 (end of SysEx) - } - - mTxBuffer[mTxIndex++] = inData; - } - - void endTransmission() - { - mBleClass.write(mTxBuffer, mTxIndex); - mTxIndex = 0; - } - - unsigned available() - { - return mRxIndex; - } - - byte read() - { - return mRxBuffer[--mRxIndex]; - } - -public: - void receive(uint8_t* buffer, uint8_t length) - { - // drop the first 2 bytes - - for (int i = 2; i < length; i++) - mRxBuffer[length - i - 1] = buffer[i]; - - mRxIndex = (length - 2); - } - -protected: - /* - The first byte of all BLE packets must be a header byte. This is followed by timestamp bytes and MIDI messages. - Header Byte - bit 7 Set to 1. - bit 6 Set to 0. (Reserved for future use) - bits 5-0 timestampHigh:Most significant 6 bits of timestamp information. - The header byte contains the topmost 6 bits of timing information for MIDI events in the BLE - packet. The remaining 7 bits of timing information for individual MIDI messages encoded in a - packet is expressed by timestamp bytes. - Timestamp Byte - bit 7 Set to 1. - bits 6-0 timestampLow: Least Significant 7 bits of timestamp information. - The 13-bit timestamp for the first MIDI message in a packet is calculated using 6 bits from the - header byte and 7 bits from the timestamp byte. - Timestamps are 13-bit values in milliseconds, and therefore the maximum value is 8,191 ms. - Timestamps must be issued by the sender in a monotonically increasing fashion. - timestampHigh is initially set using the lower 6 bits from the header byte while the timestampLow is - formed of the lower 7 bits from the timestamp byte. Should the timestamp value of a subsequent - MIDI message in the same packet overflow/wrap (i.e., the timestampLow is smaller than a - preceding timestampLow), the receiver is responsible for tracking this by incrementing the - timestampHigh by one (the incremented value is not transmitted, only understood as a result of the - overflow condition). - In practice, the time difference between MIDI messages in the same BLE packet should not span - more than twice the connection interval. As a result, a maximum of one overflow/wrap may occur - per BLE packet. - Timestamps are in the sender’s clock domain and are not allowed to be scheduled in the future. - Correlation between the receiver’s clock and the received timestamps must be performed to - ensure accurate rendering of MIDI messages, and is not addressed in this document. - */ - /* - Calculating a Timestamp - To calculate the timestamp, the built-in millis() is used. - The BLE standard only specifies 13 bits worth of millisecond data though, - so it’s bitwise anded with 0x1FFF for an ever repeating cycle of 13 bits. - This is done right after a MIDI message is detected. It’s split into a 6 upper bits, 7 lower bits, - and the MSB of both bytes are set to indicate that this is a header byte. - Both bytes are placed into the first two position of an array in preparation for a MIDI message. - */ - inline static void getMidiTimestamp (uint8_t *header, uint8_t *timestamp) - { - auto currentTimeStamp = millis() & 0x01FFF; - - *header = ((currentTimeStamp >> 7) & 0x3F) | 0x80; // 6 bits plus MSB - *timestamp = (currentTimeStamp & 0x7F) | 0x80; // 7 bits plus MSB - } - -public: - // callbacks - void(*_connectedCallback)() = nullptr; - void(*_disconnectedCallback)() = nullptr; - -public: - void onConnected(void(*fptr)()) { - _connectedCallback = fptr; - } - - void onDisconnected(void(*fptr)()) { - _disconnectedCallback = fptr; - } - -}; - -END_BLEMIDI_NAMESPACE diff --git a/src/utility/endian.h b/src/utility/endian.h deleted file mode 100644 index 0f9271c..0000000 --- a/src/utility/endian.h +++ /dev/null @@ -1,139 +0,0 @@ -#pragma once - -#ifndef BYTE_ORDER - -#ifndef BIG_ENDIAN -#define BIG_ENDIAN 4321 -#endif -#ifndef LITTLE_ENDIAN -#define LITTLE_ENDIAN 1234 -#endif - -#define TEST_LITTLE_ENDIAN (((union { unsigned x; unsigned char c; }){1}).c) - -#ifdef TEST_LITTLE_ENDIAN -#define BYTE_ORDER LITTLE_ENDIAN -#else -#define BYTE_ORDER BIG_ENDIAN -#endif - -#undef TEST_LITTLE_ENDIAN -#endif - -#include - -#ifndef __bswap16 -#define __bswap16(x) ((uint16_t)((((uint16_t)(x)&0xff00) >> 8) | (((uint16_t)(x)&0x00ff) << 8))) -#endif - -#ifndef __bswap32 -#define __bswap32(x) \ - ((uint32_t)((((uint32_t)(x)&0xff000000) >> 24) | (((uint32_t)(x)&0x00ff0000) >> 8) | \ - (((uint32_t)(x)&0x0000ff00) << 8) | (((uint32_t)(x)&0x000000ff) << 24))) -#endif - -#ifndef __bswap64 -#define __bswap64(x) \ - ((uint64_t)((((uint64_t)(x)&0xff00000000000000ULL) >> 56) | \ - (((uint64_t)(x)&0x00ff000000000000ULL) >> 40) | \ - (((uint64_t)(x)&0x0000ff0000000000ULL) >> 24) | \ - (((uint64_t)(x)&0x000000ff00000000ULL) >> 8) | \ - (((uint64_t)(x)&0x00000000ff000000ULL) << 8) | \ - (((uint64_t)(x)&0x0000000000ff0000ULL) << 24) | \ - (((uint64_t)(x)&0x000000000000ff00ULL) << 40) | \ - (((uint64_t)(x)&0x00000000000000ffULL) << 56))) -#endif - -union conversionBuffer -{ - uint8_t value8; - uint16_t value16; - uint32_t value32; - uint64_t value64; - byte buffer[8]; -}; - -#if BYTE_ORDER == LITTLE_ENDIAN - -// Definitions from musl libc -#define htobe16(x) __bswap16(x) -#define be16toh(x) __bswap16(x) -#define betoh16(x) __bswap16(x) -#define htobe32(x) __bswap32(x) -#define be32toh(x) __bswap32(x) -#define betoh32(x) __bswap32(x) -#define htobe64(x) __bswap64(x) -#define be64toh(x) __bswap64(x) -#define betoh64(x) __bswap64(x) -#define htole16(x) (uint16_t)(x) -#define le16toh(x) (uint16_t)(x) -#define letoh16(x) (uint16_t)(x) -#define htole32(x) (uint32_t)(x) -#define le32toh(x) (uint32_t)(x) -#define letoh32(x) (uint32_t)(x) -#define htole64(x) (uint64_t)(x) -#define le64toh(x) (uint64_t)(x) -#define letoh64(x) (uint64_t)(x) - -// From Apple Open Source Libc -#define ntohs(x) __bswap16(x) -#define htons(x) __bswap16(x) -#define ntohl(x) __bswap32(x) -#define htonl(x) __bswap32(x) -#define ntohll(x) __bswap64(x) -#define htonll(x) __bswap64(x) - -#define NTOHL(x) (x) = ntohl((uint32_t)x) -#define NTOHS(x) (x) = ntohs((uint16_t)x) -#define NTOHLL(x) (x) = ntohll((uint64_t)x) -#define HTONL(x) (x) = htonl((uint32_t)x) -#define HTONS(x) (x) = htons((uint16_t)x) -#define HTONLL(x) (x) = htonll((uint64_t)x) - -#else // BIG_ENDIAN - -// Definitions from musl libc - -#define htobe16(x) (uint16_t)(x) -#define be16toh(x) (uint16_t)(x) -#define betoh16(x) (uint16_t)(x) -#define htobe32(x) (uint32_t)(x) -#define be32toh(x) (uint32_t)(x) -#define betoh32(x) (uint32_t)(x) -#define htobe64(x) (uint64_t)(x) -#define be64toh(x) (uint64_t)(x) -#define betoh64(x) (uint64_t)(x) -#define htole16(x) __bswap16(x) -#define le16toh(x) __bswap16(x) -#define letoh16(x) __bswap16(x) -#define htole32(x) __bswap32(x) -#define le32toh(x) __bswap32(x) -#define letoh32(x) __bswap32(x) -#define htole64(x) __bswap64(x) -#define le64toh(x) __bswap64(x) -#define letoh64(x) __bswap64(x) - -// From Apple Open Source libc -#define ntohl(x) ((uint32_t)(x)) -#define ntohs(x) ((uint16_t)(x)) -#define htonl(x) ((uint32_t)(x)) -#define htons(x) ((uint16_t)(x)) -#define ntohll(x) ((uint64_t)(x)) -#define htonll(x) ((uint64_t)(x)) - -#define NTOHL(x) (x) -#define NTOHS(x) (x) -#define NTOHLL(x) (x) -#define HTONL(x) (x) -#define HTONS(x) (x) -#define HTONLL(x) (x) - - -void aa(uint64_t value) -{ - if ( value >= 10 ) - aa(value / 10); - N_DEBUG_PRINT((uint32_t)(value % 10)); -} - -#endif diff --git a/src/utility/midi_feat4_4_0/MIDI.cpp b/src/utility/midi_feat4_4_0/MIDI.cpp deleted file mode 100644 index 6d9b6a7..0000000 --- a/src/utility/midi_feat4_4_0/MIDI.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/*! - * @file MIDI.cpp - * Project Arduino MIDI Library - * @brief MIDI Library for the Arduino - * @author Francois Best - * @date 24/02/11 - * @license MIT - Copyright (c) 2015 Francois Best - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "MIDI.h" - -// ----------------------------------------------------------------------------- - -BEGIN_MIDI_NAMESPACE - -/*! \brief Encode System Exclusive messages. - SysEx messages are encoded to guarantee transmission of data bytes higher than - 127 without breaking the MIDI protocol. Use this static method to convert the - data you want to send. - \param inData The data to encode. - \param outSysEx The output buffer where to store the encoded message. - \param inLength The lenght of the input buffer. - \param inFlipHeaderBits True for Korg and other who store MSB in reverse order - \return The lenght of the encoded output buffer. - @see decodeSysEx - Code inspired from Ruin & Wesen's SysEx encoder/decoder - http://ruinwesen.com - */ -unsigned encodeSysEx(const byte* inData, - byte* outSysEx, - unsigned inLength, - bool inFlipHeaderBits) -{ - unsigned outLength = 0; // Num bytes in output array. - byte count = 0; // Num 7bytes in a block. - outSysEx[0] = 0; - - for (unsigned i = 0; i < inLength; ++i) - { - const byte data = inData[i]; - const byte msb = data >> 7; - const byte body = data & 0x7f; - - outSysEx[0] |= (msb << (inFlipHeaderBits ? count : (6 - count))); - outSysEx[1 + count] = body; - - if (count++ == 6) - { - outSysEx += 8; - outLength += 8; - outSysEx[0] = 0; - count = 0; - } - } - return outLength + count + (count != 0 ? 1 : 0); -} - -/*! \brief Decode System Exclusive messages. - SysEx messages are encoded to guarantee transmission of data bytes higher than - 127 without breaking the MIDI protocol. Use this static method to reassemble - your received message. - \param inSysEx The SysEx data received from MIDI in. - \param outData The output buffer where to store the decrypted message. - \param inLength The lenght of the input buffer. - \param inFlipHeaderBits True for Korg and other who store MSB in reverse order - \return The lenght of the output buffer. - @see encodeSysEx @see getSysExArrayLength - Code inspired from Ruin & Wesen's SysEx encoder/decoder - http://ruinwesen.com - */ -unsigned decodeSysEx(const byte* inSysEx, - byte* outData, - unsigned inLength, - bool inFlipHeaderBits) -{ - unsigned count = 0; - byte msbStorage = 0; - byte byteIndex = 0; - - for (unsigned i = 0; i < inLength; ++i) - { - if ((i % 8) == 0) - { - msbStorage = inSysEx[i]; - byteIndex = 6; - } - else - { - const byte body = inSysEx[i]; - const byte shift = inFlipHeaderBits ? 6 - byteIndex : byteIndex; - const byte msb = byte(((msbStorage >> shift) & 1) << 7); - byteIndex--; - outData[count++] = msb | body; - } - } - return count; -} - -END_MIDI_NAMESPACE diff --git a/src/utility/midi_feat4_4_0/MIDI.h b/src/utility/midi_feat4_4_0/MIDI.h deleted file mode 100644 index 9edc8ee..0000000 --- a/src/utility/midi_feat4_4_0/MIDI.h +++ /dev/null @@ -1,266 +0,0 @@ -/*! - * @file MIDI.h - * Project Arduino MIDI Library - * @brief MIDI Library for the Arduino - * @author Francois Best - * @date 24/02/11 - * @license MIT - Copyright (c) 2015 Francois Best - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include "midi_Defs.h" -#include "midi_Settings.h" -#include "midi_Message.h" - -// ----------------------------------------------------------------------------- - -BEGIN_MIDI_NAMESPACE - -/*! \brief The main class for MIDI handling. -It is templated over the type of serial port to provide abstraction from -the hardware interface, meaning you can use HardwareSerial, SoftwareSerial -or ak47's Uart classes. The only requirement is that the class implements -the begin, read, write and available methods. - */ -template -class MidiInterface -{ -public: - typedef _Settings Settings; - -public: - inline MidiInterface(Encoder&); - inline ~MidiInterface(); - -public: - void begin(Channel inChannel = 1); - - // ------------------------------------------------------------------------- - // MIDI Output - -public: - inline void sendNoteOn(DataByte inNoteNumber, - DataByte inVelocity, - Channel inChannel); - - inline void sendNoteOff(DataByte inNoteNumber, - DataByte inVelocity, - Channel inChannel); - - inline void sendProgramChange(DataByte inProgramNumber, - Channel inChannel); - - inline void sendControlChange(DataByte inControlNumber, - DataByte inControlValue, - Channel inChannel); - - inline void sendPitchBend(int inPitchValue, Channel inChannel); - inline void sendPitchBend(double inPitchValue, Channel inChannel); - - inline void sendPolyPressure(DataByte inNoteNumber, - DataByte inPressure, - Channel inChannel) __attribute__ ((deprecated)); - - inline void sendAfterTouch(DataByte inPressure, - Channel inChannel); - inline void sendAfterTouch(DataByte inNoteNumber, - DataByte inPressure, - Channel inChannel); - - inline void sendSysEx(unsigned inLength, - const byte* inArray, - bool inArrayContainsBoundaries = false); - - inline void sendTimeCodeQuarterFrame(DataByte inTypeNibble, - DataByte inValuesNibble); - inline void sendTimeCodeQuarterFrame(DataByte inData); - - inline void sendSongPosition(unsigned inBeats); - inline void sendSongSelect(DataByte inSongNumber); - inline void sendTuneRequest(); - inline void sendRealTime(MidiType inType); - - inline void beginRpn(unsigned inNumber, - Channel inChannel); - inline void sendRpnValue(unsigned inValue, - Channel inChannel); - inline void sendRpnValue(byte inMsb, - byte inLsb, - Channel inChannel); - inline void sendRpnIncrement(byte inAmount, - Channel inChannel); - inline void sendRpnDecrement(byte inAmount, - Channel inChannel); - inline void endRpn(Channel inChannel); - - inline void beginNrpn(unsigned inNumber, - Channel inChannel); - inline void sendNrpnValue(unsigned inValue, - Channel inChannel); - inline void sendNrpnValue(byte inMsb, - byte inLsb, - Channel inChannel); - inline void sendNrpnIncrement(byte inAmount, - Channel inChannel); - inline void sendNrpnDecrement(byte inAmount, - Channel inChannel); - inline void endNrpn(Channel inChannel); - -public: - void send(MidiType inType, - DataByte inData1, - DataByte inData2, - Channel inChannel); - - // ------------------------------------------------------------------------- - // MIDI Input - -public: - inline bool read(); - inline bool read(Channel inChannel); - -public: - inline MidiType getType() const; - inline Channel getChannel() const; - inline DataByte getData1() const; - inline DataByte getData2() const; - inline const byte* getSysExArray() const; - inline unsigned getSysExArrayLength() const; - inline bool check() const; - -public: - inline Channel getInputChannel() const; - inline void setInputChannel(Channel inChannel); - -public: - static inline MidiType getTypeFromStatusByte(byte inStatus); - static inline Channel getChannelFromStatusByte(byte inStatus); - static inline bool isChannelMessage(MidiType inType); - - // ------------------------------------------------------------------------- - // Input Callbacks - -public: - inline void setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity)); - inline void setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity)); - inline void setHandleAfterTouchPoly(void (*fptr)(byte channel, byte note, byte pressure)); - inline void setHandleControlChange(void (*fptr)(byte channel, byte number, byte value)); - inline void setHandleProgramChange(void (*fptr)(byte channel, byte number)); - inline void setHandleAfterTouchChannel(void (*fptr)(byte channel, byte pressure)); - inline void setHandlePitchBend(void (*fptr)(byte channel, int bend)); - inline void setHandleSystemExclusive(void (*fptr)(byte * array, unsigned size)); - inline void setHandleTimeCodeQuarterFrame(void (*fptr)(byte data)); - inline void setHandleSongPosition(void (*fptr)(unsigned beats)); - inline void setHandleSongSelect(void (*fptr)(byte songnumber)); - inline void setHandleTuneRequest(void (*fptr)(void)); - inline void setHandleClock(void (*fptr)(void)); - inline void setHandleStart(void (*fptr)(void)); - inline void setHandleContinue(void (*fptr)(void)); - inline void setHandleStop(void (*fptr)(void)); - inline void setHandleActiveSensing(void (*fptr)(void)); - inline void setHandleSystemReset(void (*fptr)(void)); - - inline void disconnectCallbackFromType(MidiType inType); - -private: - void launchCallback(); - - void (*mNoteOffCallback)(byte channel, byte note, byte velocity); - void (*mNoteOnCallback)(byte channel, byte note, byte velocity); - void (*mAfterTouchPolyCallback)(byte channel, byte note, byte velocity); - void (*mControlChangeCallback)(byte channel, byte, byte); - void (*mProgramChangeCallback)(byte channel, byte); - void (*mAfterTouchChannelCallback)(byte channel, byte); - void (*mPitchBendCallback)(byte channel, int); - void (*mSystemExclusiveCallback)(byte * array, unsigned size); - void (*mTimeCodeQuarterFrameCallback)(byte data); - void (*mSongPositionCallback)(unsigned beats); - void (*mSongSelectCallback)(byte songnumber); - void (*mTuneRequestCallback)(void); - void (*mClockCallback)(void); - void (*mStartCallback)(void); - void (*mContinueCallback)(void); - void (*mStopCallback)(void); - void (*mActiveSensingCallback)(void); - void (*mSystemResetCallback)(void); - - // ------------------------------------------------------------------------- - // MIDI Soft Thru - -public: - inline Thru::Mode getFilterMode() const; - inline bool getThruState() const; - - inline void turnThruOn(Thru::Mode inThruFilterMode = Thru::Full); - inline void turnThruOff(); - inline void setThruFilterMode(Thru::Mode inThruFilterMode); - -private: - void thruFilter(byte inChannel); - -private: - bool parse(); - inline void handleNullVelocityNoteOnAsNoteOff(); - inline bool inputFilter(Channel inChannel); - inline void resetInput(); - -private: - typedef Message MidiMessage; - -private: - Encoder& mEncoder; - -private: - Channel mInputChannel; - StatusByte mRunningStatus_RX; - StatusByte mRunningStatus_TX; - byte mPendingMessage[3]; - unsigned mPendingMessageExpectedLenght; - unsigned mPendingMessageIndex; - unsigned mCurrentRpnNumber; - unsigned mCurrentNrpnNumber; - bool mThruActivated : 1; - Thru::Mode mThruFilterMode : 7; - MidiMessage mMessage; - - unsigned long mLastMessageSentTime; - bool mSenderActiveSensingActivated; - -private: - inline StatusByte getStatus(MidiType inType, - Channel inChannel) const; -}; - -// ----------------------------------------------------------------------------- - -unsigned encodeSysEx(const byte* inData, - byte* outSysEx, - unsigned inLenght, - bool inFlipHeaderBits = false); -unsigned decodeSysEx(const byte* inSysEx, - byte* outData, - unsigned inLenght, - bool inFlipHeaderBits = false); - -END_MIDI_NAMESPACE - -#include "MIDI.hpp" diff --git a/src/utility/midi_feat4_4_0/MIDI.hpp b/src/utility/midi_feat4_4_0/MIDI.hpp deleted file mode 100644 index 1a53659..0000000 --- a/src/utility/midi_feat4_4_0/MIDI.hpp +++ /dev/null @@ -1,1428 +0,0 @@ -/*! - * @file MIDI.hpp - * Project Arduino MIDI Library - * @brief MIDI Library for the Arduino - Inline implementations - * @author Francois Best - * @date 24/02/11 - * @license MIT - Copyright (c) 2015 Francois Best - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -BEGIN_MIDI_NAMESPACE - -/// \brief Constructor for MidiInterface. -template -inline MidiInterface::MidiInterface(Encoder& inEncoder) - : mEncoder(inEncoder) - , mInputChannel(0) - , mRunningStatus_RX(InvalidType) - , mRunningStatus_TX(InvalidType) - , mPendingMessageExpectedLenght(0) - , mPendingMessageIndex(0) - , mCurrentRpnNumber(0xffff) - , mCurrentNrpnNumber(0xffff) - , mLastMessageSentTime(0) - , mSenderActiveSensingActivated(false) - , mThruActivated(false) - , mThruFilterMode(Thru::Full) -{ - mNoteOffCallback = 0; - mNoteOnCallback = 0; - mAfterTouchPolyCallback = 0; - mControlChangeCallback = 0; - mProgramChangeCallback = 0; - mAfterTouchChannelCallback = 0; - mPitchBendCallback = 0; - mSystemExclusiveCallback = 0; - mTimeCodeQuarterFrameCallback = 0; - mSongPositionCallback = 0; - mSongSelectCallback = 0; - mTuneRequestCallback = 0; - mClockCallback = 0; - mStartCallback = 0; - mContinueCallback = 0; - mStopCallback = 0; - mActiveSensingCallback = 0; - mSystemResetCallback = 0; -} - -/*! \brief Destructor for MidiInterface. - - This is not really useful for the Arduino, as it is never called... - */ -template -inline MidiInterface::~MidiInterface() -{ -} - -// ----------------------------------------------------------------------------- - -/*! \brief Call the begin method in the setup() function of the Arduino. - - All parameters are set to their default values: - - Input channel set to 1 if no value is specified - - Full thru mirroring - */ -template -void MidiInterface::begin(Channel inChannel) -{ - // Initialise the Serial port - mEncoder.begin(); - - mInputChannel = inChannel; - mRunningStatus_TX = InvalidType; - mRunningStatus_RX = InvalidType; - - mPendingMessageIndex = 0; - mPendingMessageExpectedLenght = 0; - - mCurrentRpnNumber = 0xffff; - mCurrentNrpnNumber = 0xffff; - - mSenderActiveSensingActivated = Settings::UseSenderActiveSensing; - mLastMessageSentTime = millis(); - - mMessage.valid = false; - mMessage.type = InvalidType; - mMessage.channel = 0; - mMessage.data1 = 0; - mMessage.data2 = 0; - - mThruFilterMode = Thru::Full; - mThruActivated = false; -} - -// ----------------------------------------------------------------------------- -// Output -// ----------------------------------------------------------------------------- - -/*! \addtogroup output - @{ - */ - -/*! \brief Generate and send a MIDI message from the values given. - \param inType The message type (see type defines for reference) - \param inData1 The first data byte. - \param inData2 The second data byte (if the message contains only 1 data byte, - set this one to 0). - \param inChannel The output channel on which the message will be sent - (values from 1 to 16). Note: you cannot send to OMNI. - - This is an internal method, use it only if you need to send raw data - from your code, at your own risks. - */ -template -void MidiInterface::send(MidiType inType, - DataByte inData1, - DataByte inData2, - Channel inChannel) -{ - // Then test if channel is valid - if (inChannel >= MIDI_CHANNEL_OFF || - inChannel == MIDI_CHANNEL_OMNI || - inType < 0x80) - { - return; // Don't send anything - } - - if (inType <= PitchBend) // Channel messages - { - // Protection: remove MSBs on data - inData1 &= 0x7f; - inData2 &= 0x7f; - - const StatusByte status = getStatus(inType, inChannel); - - if (mEncoder.beginTransmission()) - { - if (Settings::UseRunningStatus) - { - if (mRunningStatus_TX != status) - { - // New message, memorise and send header - mRunningStatus_TX = status; - mEncoder.write(mRunningStatus_TX); - } - } - else - { - // Don't care about running status, send the status byte. - mEncoder.write(status); - } - - // Then send data - mEncoder.write(inData1); - if (inType != ProgramChange && inType != AfterTouchChannel) - { - mEncoder.write(inData2); - } - - mEncoder.endTransmission(); - } - } - else if (inType >= Clock && inType <= SystemReset) - { - sendRealTime(inType); // System Real-time and 1 byte. - } - - if (mSenderActiveSensingActivated) - mLastMessageSentTime = millis(); -} - -// ----------------------------------------------------------------------------- - -/*! \brief Send a Note On message - \param inNoteNumber Pitch value in the MIDI format (0 to 127). - \param inVelocity Note attack velocity (0 to 127). A NoteOn with 0 velocity - is considered as a NoteOff. - \param inChannel The channel on which the message will be sent (1 to 16). - - Take a look at the values, names and frequencies of notes here: - http://www.phys.unsw.edu.au/jw/notes.html - */ -template -void MidiInterface::sendNoteOn(DataByte inNoteNumber, - DataByte inVelocity, - Channel inChannel) -{ - send(NoteOn, inNoteNumber, inVelocity, inChannel); -} - -/*! \brief Send a Note Off message - \param inNoteNumber Pitch value in the MIDI format (0 to 127). - \param inVelocity Release velocity (0 to 127). - \param inChannel The channel on which the message will be sent (1 to 16). - - Note: you can send NoteOn with zero velocity to make a NoteOff, this is based - on the Running Status principle, to avoid sending status messages and thus - sending only NoteOn data. sendNoteOff will always send a real NoteOff message. - Take a look at the values, names and frequencies of notes here: - http://www.phys.unsw.edu.au/jw/notes.html - */ -template -void MidiInterface::sendNoteOff(DataByte inNoteNumber, - DataByte inVelocity, - Channel inChannel) -{ - send(NoteOff, inNoteNumber, inVelocity, inChannel); -} - -/*! \brief Send a Program Change message - \param inProgramNumber The Program to select (0 to 127). - \param inChannel The channel on which the message will be sent (1 to 16). - */ -template -void MidiInterface::sendProgramChange(DataByte inProgramNumber, - Channel inChannel) -{ - send(ProgramChange, inProgramNumber, 0, inChannel); -} - -/*! \brief Send a Control Change message - \param inControlNumber The controller number (0 to 127). - \param inControlValue The value for the specified controller (0 to 127). - \param inChannel The channel on which the message will be sent (1 to 16). - @see MidiControlChangeNumber - */ -template -void MidiInterface::sendControlChange(DataByte inControlNumber, - DataByte inControlValue, - Channel inChannel) -{ - send(ControlChange, inControlNumber, inControlValue, inChannel); -} - -/*! \brief Send a Polyphonic AfterTouch message (applies to a specified note) - \param inNoteNumber The note to apply AfterTouch to (0 to 127). - \param inPressure The amount of AfterTouch to apply (0 to 127). - \param inChannel The channel on which the message will be sent (1 to 16). - Note: this method is deprecated and will be removed in a future revision of the - library, @see sendAfterTouch to send polyphonic and monophonic AfterTouch messages. - */ -template -void MidiInterface::sendPolyPressure(DataByte inNoteNumber, - DataByte inPressure, - Channel inChannel) -{ - send(AfterTouchPoly, inNoteNumber, inPressure, inChannel); -} - -/*! \brief Send a MonoPhonic AfterTouch message (applies to all notes) - \param inPressure The amount of AfterTouch to apply to all notes. - \param inChannel The channel on which the message will be sent (1 to 16). - */ -template -void MidiInterface::sendAfterTouch(DataByte inPressure, - Channel inChannel) -{ - send(AfterTouchChannel, inPressure, 0, inChannel); -} - -/*! \brief Send a Polyphonic AfterTouch message (applies to a specified note) - \param inNoteNumber The note to apply AfterTouch to (0 to 127). - \param inPressure The amount of AfterTouch to apply (0 to 127). - \param inChannel The channel on which the message will be sent (1 to 16). - @see Replaces sendPolyPressure (which is now deprecated). - */ -template -void MidiInterface::sendAfterTouch(DataByte inNoteNumber, - DataByte inPressure, - Channel inChannel) -{ - send(AfterTouchPoly, inNoteNumber, inPressure, inChannel); -} - -/*! \brief Send a Pitch Bend message using a signed integer value. - \param inPitchValue The amount of bend to send (in a signed integer format), - between MIDI_PITCHBEND_MIN and MIDI_PITCHBEND_MAX, - center value is 0. - \param inChannel The channel on which the message will be sent (1 to 16). - */ -template -void MidiInterface::sendPitchBend(int inPitchValue, - Channel inChannel) -{ - const unsigned bend = unsigned(inPitchValue - int(MIDI_PITCHBEND_MIN)); - send(PitchBend, (bend & 0x7f), (bend >> 7) & 0x7f, inChannel); -} - - -/*! \brief Send a Pitch Bend message using a floating point value. - \param inPitchValue The amount of bend to send (in a floating point format), - between -1.0f (maximum downwards bend) - and +1.0f (max upwards bend), center value is 0.0f. - \param inChannel The channel on which the message will be sent (1 to 16). - */ -template -void MidiInterface::sendPitchBend(double inPitchValue, - Channel inChannel) -{ - const int scale = inPitchValue > 0.0 ? MIDI_PITCHBEND_MAX : MIDI_PITCHBEND_MIN; - const int value = int(inPitchValue * double(scale)); - sendPitchBend(value, inChannel); -} - -/*! \brief Generate and send a System Exclusive frame. - \param inLength The size of the array to send - \param inArray The byte array containing the data to send - \param inArrayContainsBoundaries When set to 'true', 0xf0 & 0xf7 bytes - (start & stop SysEx) will NOT be sent - (and therefore must be included in the array). - default value for ArrayContainsBoundaries is set to 'false' for compatibility - with previous versions of the library. - */ -template -void MidiInterface::sendSysEx(unsigned inLength, - const byte* inArray, - bool inArrayContainsBoundaries) -{ - const bool writeBeginEndBytes = !inArrayContainsBoundaries; - - if (mEncoder.beginTransmission()) - { - if (writeBeginEndBytes) - mEncoder.write(0xf0); - - for (unsigned i = 0; i < inLength; ++i) - mEncoder.write(inArray[i]); - - if (writeBeginEndBytes) - mEncoder.write(0xf7); - - mEncoder.endTransmission(); - } - - if (Settings::UseRunningStatus) - { - mRunningStatus_TX = InvalidType; - } -} - -/*! \brief Send a Tune Request message. - - When a MIDI unit receives this message, - it should tune its oscillators (if equipped with any). - */ -template -void MidiInterface::sendTuneRequest() -{ - if (mEncoder.beginTransmission()) - { - mEncoder.write(TuneRequest); - mEncoder.endTransmission(); - } - - if (Settings::UseRunningStatus) - { - mRunningStatus_TX = InvalidType; - } -} - -/*! \brief Send a MIDI Time Code Quarter Frame. - - \param inTypeNibble MTC type - \param inValuesNibble MTC data - See MIDI Specification for more information. - */ -template -void MidiInterface::sendTimeCodeQuarterFrame(DataByte inTypeNibble, - DataByte inValuesNibble) -{ - const byte data = byte((((inTypeNibble & 0x07) << 4) | (inValuesNibble & 0x0f))); - sendTimeCodeQuarterFrame(data); -} - -/*! \brief Send a MIDI Time Code Quarter Frame. - - See MIDI Specification for more information. - \param inData if you want to encode directly the nibbles in your program, - you can send the byte here. - */ -template -void MidiInterface::sendTimeCodeQuarterFrame(DataByte inData) -{ - if (mEncoder.beginTransmission()) - { - mEncoder.write((byte)TimeCodeQuarterFrame); - mEncoder.write(inData); - mEncoder.endTransmission(); - } - - if (Settings::UseRunningStatus) - { - mRunningStatus_TX = InvalidType; - } -} - -/*! \brief Send a Song Position Pointer message. - \param inBeats The number of beats since the start of the song. - */ -template -void MidiInterface::sendSongPosition(unsigned inBeats) -{ - if (mEncoder.beginTransmission()) - { - mEncoder.write((byte)SongPosition); - mEncoder.write(inBeats & 0x7f); - mEncoder.write((inBeats >> 7) & 0x7f); - mEncoder.endTransmission(); - } - - if (Settings::UseRunningStatus) - { - mRunningStatus_TX = InvalidType; - } -} - -/*! \brief Send a Song Select message */ -template -void MidiInterface::sendSongSelect(DataByte inSongNumber) -{ - if (mEncoder.beginTransmission()) - { - mEncoder.write((byte)SongSelect); - mEncoder.write(inSongNumber & 0x7f); - mEncoder.endTransmission(); - } - - if (Settings::UseRunningStatus) - { - mRunningStatus_TX = InvalidType; - } -} - -/*! \brief Send a Real Time (one byte) message. - - \param inType The available Real Time types are: - Start, Stop, Continue, Clock, ActiveSensing and SystemReset. - @see MidiType - */ -template -void MidiInterface::sendRealTime(MidiType inType) -{ - // Do not invalidate Running Status for real-time messages - // as they can be interleaved within any message. - - switch (inType) - { - case Clock: - case Start: - case Stop: - case Continue: - case ActiveSensing: - case SystemReset: - if (mEncoder.beginTransmission()) - { - mEncoder.write((byte)inType); - mEncoder.endTransmission(); - } - break; - default: - // Invalid Real Time marker - break; - } -} - -/*! \brief Start a Registered Parameter Number frame. - \param inNumber The 14-bit number of the RPN you want to select. - \param inChannel The channel on which the message will be sent (1 to 16). -*/ -template -inline void MidiInterface::beginRpn(unsigned inNumber, - Channel inChannel) -{ - if (mCurrentRpnNumber != inNumber) - { - const byte numMsb = 0x7f & (inNumber >> 7); - const byte numLsb = 0x7f & inNumber; - sendControlChange(RPNLSB, numLsb, inChannel); - sendControlChange(RPNMSB, numMsb, inChannel); - mCurrentRpnNumber = inNumber; - } -} - -/*! \brief Send a 14-bit value for the currently selected RPN number. - \param inValue The 14-bit value of the selected RPN. - \param inChannel The channel on which the message will be sent (1 to 16). -*/ -template -inline void MidiInterface::sendRpnValue(unsigned inValue, - Channel inChannel) -{; - const byte valMsb = 0x7f & (inValue >> 7); - const byte valLsb = 0x7f & inValue; - sendControlChange(DataEntryMSB, valMsb, inChannel); - sendControlChange(DataEntryLSB, valLsb, inChannel); -} - -/*! \brief Send separate MSB/LSB values for the currently selected RPN number. - \param inMsb The MSB part of the value to send. Meaning depends on RPN number. - \param inLsb The LSB part of the value to send. Meaning depends on RPN number. - \param inChannel The channel on which the message will be sent (1 to 16). -*/ -template -inline void MidiInterface::sendRpnValue(byte inMsb, - byte inLsb, - Channel inChannel) -{ - sendControlChange(DataEntryMSB, inMsb, inChannel); - sendControlChange(DataEntryLSB, inLsb, inChannel); -} - -/* \brief Increment the value of the currently selected RPN number by the specified amount. - \param inAmount The amount to add to the currently selected RPN value. -*/ -template -inline void MidiInterface::sendRpnIncrement(byte inAmount, - Channel inChannel) -{ - sendControlChange(DataIncrement, inAmount, inChannel); -} - -/* \brief Decrement the value of the currently selected RPN number by the specified amount. - \param inAmount The amount to subtract to the currently selected RPN value. -*/ -template -inline void MidiInterface::sendRpnDecrement(byte inAmount, - Channel inChannel) -{ - sendControlChange(DataDecrement, inAmount, inChannel); -} - -/*! \brief Terminate an RPN frame. -This will send a Null Function to deselect the currently selected RPN. - \param inChannel The channel on which the message will be sent (1 to 16). -*/ -template -inline void MidiInterface::endRpn(Channel inChannel) -{ - sendControlChange(RPNLSB, 0x7f, inChannel); - sendControlChange(RPNMSB, 0x7f, inChannel); - mCurrentRpnNumber = 0xffff; -} - - - -/*! \brief Start a Non-Registered Parameter Number frame. - \param inNumber The 14-bit number of the NRPN you want to select. - \param inChannel The channel on which the message will be sent (1 to 16). -*/ -template -inline void MidiInterface::beginNrpn(unsigned inNumber, - Channel inChannel) -{ - if (mCurrentNrpnNumber != inNumber) - { - const byte numMsb = 0x7f & (inNumber >> 7); - const byte numLsb = 0x7f & inNumber; - sendControlChange(NRPNLSB, numLsb, inChannel); - sendControlChange(NRPNMSB, numMsb, inChannel); - mCurrentNrpnNumber = inNumber; - } -} - -/*! \brief Send a 14-bit value for the currently selected NRPN number. - \param inValue The 14-bit value of the selected NRPN. - \param inChannel The channel on which the message will be sent (1 to 16). -*/ -template -inline void MidiInterface::sendNrpnValue(unsigned inValue, - Channel inChannel) -{; - const byte valMsb = 0x7f & (inValue >> 7); - const byte valLsb = 0x7f & inValue; - sendControlChange(DataEntryMSB, valMsb, inChannel); - sendControlChange(DataEntryLSB, valLsb, inChannel); -} - -/*! \brief Send separate MSB/LSB values for the currently selected NRPN number. - \param inMsb The MSB part of the value to send. Meaning depends on NRPN number. - \param inLsb The LSB part of the value to send. Meaning depends on NRPN number. - \param inChannel The channel on which the message will be sent (1 to 16). -*/ -template -inline void MidiInterface::sendNrpnValue(byte inMsb, - byte inLsb, - Channel inChannel) -{ - sendControlChange(DataEntryMSB, inMsb, inChannel); - sendControlChange(DataEntryLSB, inLsb, inChannel); -} - -/* \brief Increment the value of the currently selected NRPN number by the specified amount. - \param inAmount The amount to add to the currently selected NRPN value. -*/ -template -inline void MidiInterface::sendNrpnIncrement(byte inAmount, - Channel inChannel) -{ - sendControlChange(DataIncrement, inAmount, inChannel); -} - -/* \brief Decrement the value of the currently selected NRPN number by the specified amount. - \param inAmount The amount to subtract to the currently selected NRPN value. -*/ -template -inline void MidiInterface::sendNrpnDecrement(byte inAmount, - Channel inChannel) -{ - sendControlChange(DataDecrement, inAmount, inChannel); -} - -/*! \brief Terminate an NRPN frame. -This will send a Null Function to deselect the currently selected NRPN. - \param inChannel The channel on which the message will be sent (1 to 16). -*/ -template -inline void MidiInterface::endNrpn(Channel inChannel) -{ - sendControlChange(NRPNLSB, 0x7f, inChannel); - sendControlChange(NRPNMSB, 0x7f, inChannel); - mCurrentNrpnNumber = 0xffff; -} - -/*! @} */ // End of doc group MIDI Output - -// ----------------------------------------------------------------------------- - -template -StatusByte MidiInterface::getStatus(MidiType inType, - Channel inChannel) const -{ - return StatusByte(((byte)inType | ((inChannel - 1) & 0x0f))); -} - -// ----------------------------------------------------------------------------- -// Input -// ----------------------------------------------------------------------------- - -/*! \addtogroup input - @{ -*/ - -/*! \brief Read messages from the serial port using the main input channel. - - \return True if a valid message has been stored in the structure, false if not. - A valid message is a message that matches the input channel. \n\n - If the Thru is enabled and the message matches the filter, - it is sent back on the MIDI output. - @see see setInputChannel() - */ -template -inline bool MidiInterface::read() -{ - return read(mInputChannel); -} - -/*! \brief Read messages on a specified channel. - */ -template -inline bool MidiInterface::read(Channel inChannel) -{ - // Active Sensing. This message is intended to be sent - // repeatedly to tell the receiver that a connection is alive. Use - // of this message is optional. When initially received, the - // receiver will expect to receive another Active Sensing - // message each 300ms (max), and if it does not then it will - // assume that the connection has been terminated. At - // termination, the receiver will turn off all voices and return to - // normal (non- active sensing) operation. - if (mSenderActiveSensingActivated && (millis() - mLastMessageSentTime) > 270) - { - sendRealTime(ActiveSensing); - mLastMessageSentTime = millis(); - } - - if (inChannel >= MIDI_CHANNEL_OFF) - return false; // MIDI Input disabled. - - if (!parse()) - return false; - - handleNullVelocityNoteOnAsNoteOff(); - const bool channelMatch = inputFilter(inChannel); - - if (channelMatch) - { - launchCallback(); - } - - thruFilter(inChannel); - - return channelMatch; -} - -// ----------------------------------------------------------------------------- - -// Private method: MIDI parser -template -bool MidiInterface::parse() -{ - if (mEncoder.available() == 0) - { - // No data available. - return false; - } - - // Parsing algorithm: - // Get a byte from the serial buffer. - // If there is no pending message to be recomposed, start a new one. - // - Find type and channel (if pertinent) - // - Look for other bytes in buffer, call parser recursively, - // until the message is assembled or the buffer is empty. - // Else, add the extracted byte to the pending message, and check validity. - // When the message is done, store it. - - const byte extracted = mEncoder.read(); - - // Ignore Undefined - if (extracted == 0xf9 || extracted == 0xfd) - { - if (Settings::Use1ByteParsing) - { - return false; - } - else - { - return parse(); - } - } - - if (mPendingMessageIndex == 0) - { - // Start a new pending message - mPendingMessage[0] = extracted; - - // Check for running status first - if (isChannelMessage(getTypeFromStatusByte(mRunningStatus_RX))) - { - // Only these types allow Running Status - - // If the status byte is not received, prepend it - // to the pending message - if (extracted < 0x80) - { - mPendingMessage[0] = mRunningStatus_RX; - mPendingMessage[1] = extracted; - mPendingMessageIndex = 1; - } - // Else: well, we received another status byte, - // so the running status does not apply here. - // It will be updated upon completion of this message. - } - - const MidiType pendingType = getTypeFromStatusByte(mPendingMessage[0]); - - switch (pendingType) - { - // 1 byte messages - case Start: - case Continue: - case Stop: - case Clock: - case ActiveSensing: - case SystemReset: - case TuneRequest: - // Handle the message type directly here. - mMessage.type = pendingType; - mMessage.channel = 0; - mMessage.data1 = 0; - mMessage.data2 = 0; - mMessage.valid = true; - - // Do not reset all input attributes, Running Status must remain unchanged. - // We still need to reset these - mPendingMessageIndex = 0; - mPendingMessageExpectedLenght = 0; - - return true; - break; - - // 2 bytes messages - case ProgramChange: - case AfterTouchChannel: - case TimeCodeQuarterFrame: - case SongSelect: - mPendingMessageExpectedLenght = 2; - break; - - // 3 bytes messages - case NoteOn: - case NoteOff: - case ControlChange: - case PitchBend: - case AfterTouchPoly: - case SongPosition: - mPendingMessageExpectedLenght = 3; - break; - - case SystemExclusiveStart: - case SystemExclusiveEnd: - // The message can be any lenght - // between 3 and MidiMessage::sSysExMaxSize bytes - mPendingMessageExpectedLenght = MidiMessage::sSysExMaxSize; - mRunningStatus_RX = InvalidType; - mMessage.sysexArray[0] = pendingType; - break; - - case InvalidType: - default: - // This is obviously wrong. Let's get the hell out'a here. - resetInput(); - return false; - break; - } - - if (mPendingMessageIndex >= (mPendingMessageExpectedLenght - 1)) - { - // Reception complete - mMessage.type = pendingType; - mMessage.channel = getChannelFromStatusByte(mPendingMessage[0]); - mMessage.data1 = mPendingMessage[1]; - mMessage.data2 = 0; // Completed new message has 1 data byte - - mPendingMessageIndex = 0; - mPendingMessageExpectedLenght = 0; - mMessage.valid = true; - return true; - } - else - { - // Waiting for more data - mPendingMessageIndex++; - } - - if (Settings::Use1ByteParsing) - { - // Message is not complete. - return false; - } - else - { - // Call the parser recursively - // to parse the rest of the message. - return parse(); - } - } - else - { - // First, test if this is a status byte - if (extracted >= 0x80) - { - // Reception of status bytes in the middle of an uncompleted message - // are allowed only for interleaved Real Time message or EOX - switch (extracted) - { - case Clock: - case Start: - case Continue: - case Stop: - case ActiveSensing: - case SystemReset: - - // Here we will have to extract the one-byte message, - // pass it to the structure for being read outside - // the MIDI class, and recompose the message it was - // interleaved into. Oh, and without killing the running status.. - // This is done by leaving the pending message as is, - // it will be completed on next calls. - - mMessage.type = (MidiType)extracted; - mMessage.data1 = 0; - mMessage.data2 = 0; - mMessage.channel = 0; - mMessage.valid = true; - return true; - - // Exclusive - case SystemExclusiveStart: - case SystemExclusiveEnd: - if ((mMessage.sysexArray[0] == SystemExclusiveStart) - || (mMessage.sysexArray[0] == SystemExclusiveEnd)) - { - // Store the last byte (EOX) - mMessage.sysexArray[mPendingMessageIndex++] = extracted; - mMessage.type = SystemExclusive; - - // Get length - mMessage.data1 = mPendingMessageIndex & 0xff; // LSB - mMessage.data2 = byte(mPendingMessageIndex >> 8); // MSB - mMessage.channel = 0; - mMessage.valid = true; - - resetInput(); - return true; - } - else - { - // Well well well.. error. - resetInput(); - return false; - } - - default: - break; // LCOV_EXCL_LINE - Coverage blind spot - } - } - - // Add extracted data byte to pending message - if ((mPendingMessage[0] == SystemExclusiveStart) - || (mPendingMessage[0] == SystemExclusiveEnd)) - mMessage.sysexArray[mPendingMessageIndex] = extracted; - else - mPendingMessage[mPendingMessageIndex] = extracted; - - // Now we are going to check if we have reached the end of the message - if (mPendingMessageIndex >= (mPendingMessageExpectedLenght - 1)) - { - // "FML" case: fall down here with an overflown SysEx.. - // This means we received the last possible data byte that can fit - // the buffer. If this happens, try increasing MidiMessage::sSysExMaxSize. - if (mPendingMessage[0] == SystemExclusive) - { - resetInput(); - return false; - } - - mMessage.type = getTypeFromStatusByte(mPendingMessage[0]); - - if (isChannelMessage(mMessage.type)) - mMessage.channel = getChannelFromStatusByte(mPendingMessage[0]); - else - mMessage.channel = 0; - - mMessage.data1 = mPendingMessage[1]; - - // Save data2 only if applicable - mMessage.data2 = mPendingMessageExpectedLenght == 3 ? mPendingMessage[2] : 0; - - // Reset local variables - mPendingMessageIndex = 0; - mPendingMessageExpectedLenght = 0; - - mMessage.valid = true; - - // Activate running status (if enabled for the received type) - switch (mMessage.type) - { - case NoteOff: - case NoteOn: - case AfterTouchPoly: - case ControlChange: - case ProgramChange: - case AfterTouchChannel: - case PitchBend: - // Running status enabled: store it from received message - mRunningStatus_RX = mPendingMessage[0]; - break; - - default: - // No running status - mRunningStatus_RX = InvalidType; - break; - } - return true; - } - else - { - // Then update the index of the pending message. - mPendingMessageIndex++; - - if (Settings::Use1ByteParsing) - { - // Message is not complete. - return false; - } - else - { - // Call the parser recursively to parse the rest of the message. - return parse(); - } - } - } -} - -// Private method, see midi_Settings.h for documentation -template -inline void MidiInterface::handleNullVelocityNoteOnAsNoteOff() -{ - if (Settings::HandleNullVelocityNoteOnAsNoteOff && - getType() == NoteOn && getData2() == 0) - { - mMessage.type = NoteOff; - } -} - -// Private method: check if the received message is on the listened channel -template -inline bool MidiInterface::inputFilter(Channel inChannel) -{ - // This method handles recognition of channel - // (to know if the message is destinated to the Arduino) - - // First, check if the received message is Channel - if (mMessage.type >= NoteOff && mMessage.type <= PitchBend) - { - // Then we need to know if we listen to it - if ((mMessage.channel == inChannel) || - (inChannel == MIDI_CHANNEL_OMNI)) - { - return true; - } - else - { - // We don't listen to this channel - return false; - } - } - else - { - // System messages are always received - return true; - } -} - -// Private method: reset input attributes -template -inline void MidiInterface::resetInput() -{ - mPendingMessageIndex = 0; - mPendingMessageExpectedLenght = 0; - mRunningStatus_RX = InvalidType; -} - -// ----------------------------------------------------------------------------- - -/*! \brief Get the last received message's type - - Returns an enumerated type. @see MidiType - */ -template -inline MidiType MidiInterface::getType() const -{ - return mMessage.type; -} - -/*! \brief Get the channel of the message stored in the structure. - - \return Channel range is 1 to 16. - For non-channel messages, this will return 0. - */ -template -inline Channel MidiInterface::getChannel() const -{ - return mMessage.channel; -} - -/*! \brief Get the first data byte of the last received message. */ -template -inline DataByte MidiInterface::getData1() const -{ - return mMessage.data1; -} - -/*! \brief Get the second data byte of the last received message. */ -template -inline DataByte MidiInterface::getData2() const -{ - return mMessage.data2; -} - -/*! \brief Get the System Exclusive byte array. - - @see getSysExArrayLength to get the array's length in bytes. - */ -template -inline const byte* MidiInterface::getSysExArray() const -{ - return mMessage.sysexArray; -} - -/*! \brief Get the lenght of the System Exclusive array. - - It is coded using data1 as LSB and data2 as MSB. - \return The array's length, in bytes. - */ -template -inline unsigned MidiInterface::getSysExArrayLength() const -{ - return mMessage.getSysExSize(); -} - -/*! \brief Check if a valid message is stored in the structure. */ -template -inline bool MidiInterface::check() const -{ - return mMessage.valid; -} - -// ----------------------------------------------------------------------------- - -template -inline Channel MidiInterface::getInputChannel() const -{ - return mInputChannel; -} - -/*! \brief Set the value for the input MIDI channel - \param inChannel the channel value. Valid values are 1 to 16, MIDI_CHANNEL_OMNI - if you want to listen to all channels, and MIDI_CHANNEL_OFF to disable input. - */ -template -inline void MidiInterface::setInputChannel(Channel inChannel) -{ - mInputChannel = inChannel; -} - -// ----------------------------------------------------------------------------- - -/*! \brief Extract an enumerated MIDI type from a status byte. - - This is a utility static method, used internally, - made public so you can handle MidiTypes more easily. - */ -template -MidiType MidiInterface::getTypeFromStatusByte(byte inStatus) -{ - if ((inStatus < 0x80) || - (inStatus == 0xf4) || - (inStatus == 0xf5) || - (inStatus == 0xf9) || - (inStatus == 0xfD)) - { - // Data bytes and undefined. - return InvalidType; - } - if (inStatus < 0xf0) - { - // Channel message, remove channel nibble. - return MidiType(inStatus & 0xf0); - } - - return MidiType(inStatus); -} - -/*! \brief Returns channel in the range 1-16 - */ -template -inline Channel MidiInterface::getChannelFromStatusByte(byte inStatus) -{ - return Channel((inStatus & 0x0f) + 1); -} - -template -bool MidiInterface::isChannelMessage(MidiType inType) -{ - return (inType == NoteOff || - inType == NoteOn || - inType == ControlChange || - inType == AfterTouchPoly || - inType == AfterTouchChannel || - inType == PitchBend || - inType == ProgramChange); -} - -// ----------------------------------------------------------------------------- - -/*! \addtogroup callbacks - @{ - */ - -template void MidiInterface::setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity)) { mNoteOffCallback = fptr; } -template void MidiInterface::setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity)) { mNoteOnCallback = fptr; } -template void MidiInterface::setHandleAfterTouchPoly(void (*fptr)(byte channel, byte note, byte pressure)) { mAfterTouchPolyCallback = fptr; } -template void MidiInterface::setHandleControlChange(void (*fptr)(byte channel, byte number, byte value)) { mControlChangeCallback = fptr; } -template void MidiInterface::setHandleProgramChange(void (*fptr)(byte channel, byte number)) { mProgramChangeCallback = fptr; } -template void MidiInterface::setHandleAfterTouchChannel(void (*fptr)(byte channel, byte pressure)) { mAfterTouchChannelCallback = fptr; } -template void MidiInterface::setHandlePitchBend(void (*fptr)(byte channel, int bend)) { mPitchBendCallback = fptr; } -template void MidiInterface::setHandleSystemExclusive(void (*fptr)(byte* array, unsigned size)) { mSystemExclusiveCallback = fptr; } -template void MidiInterface::setHandleTimeCodeQuarterFrame(void (*fptr)(byte data)) { mTimeCodeQuarterFrameCallback = fptr; } -template void MidiInterface::setHandleSongPosition(void (*fptr)(unsigned beats)) { mSongPositionCallback = fptr; } -template void MidiInterface::setHandleSongSelect(void (*fptr)(byte songnumber)) { mSongSelectCallback = fptr; } -template void MidiInterface::setHandleTuneRequest(void (*fptr)(void)) { mTuneRequestCallback = fptr; } -template void MidiInterface::setHandleClock(void (*fptr)(void)) { mClockCallback = fptr; } -template void MidiInterface::setHandleStart(void (*fptr)(void)) { mStartCallback = fptr; } -template void MidiInterface::setHandleContinue(void (*fptr)(void)) { mContinueCallback = fptr; } -template void MidiInterface::setHandleStop(void (*fptr)(void)) { mStopCallback = fptr; } -template void MidiInterface::setHandleActiveSensing(void (*fptr)(void)) { mActiveSensingCallback = fptr; } -template void MidiInterface::setHandleSystemReset(void (*fptr)(void)) { mSystemResetCallback = fptr; } - -/*! \brief Detach an external function from the given type. - - Use this method to cancel the effects of setHandle********. - \param inType The type of message to unbind. - When a message of this type is received, no function will be called. - */ -template -void MidiInterface::disconnectCallbackFromType(MidiType inType) -{ - switch (inType) - { - case NoteOff: mNoteOffCallback = 0; break; - case NoteOn: mNoteOnCallback = 0; break; - case AfterTouchPoly: mAfterTouchPolyCallback = 0; break; - case ControlChange: mControlChangeCallback = 0; break; - case ProgramChange: mProgramChangeCallback = 0; break; - case AfterTouchChannel: mAfterTouchChannelCallback = 0; break; - case PitchBend: mPitchBendCallback = 0; break; - case SystemExclusive: mSystemExclusiveCallback = 0; break; - case TimeCodeQuarterFrame: mTimeCodeQuarterFrameCallback = 0; break; - case SongPosition: mSongPositionCallback = 0; break; - case SongSelect: mSongSelectCallback = 0; break; - case TuneRequest: mTuneRequestCallback = 0; break; - case Clock: mClockCallback = 0; break; - case Start: mStartCallback = 0; break; - case Continue: mContinueCallback = 0; break; - case Stop: mStopCallback = 0; break; - case ActiveSensing: mActiveSensingCallback = 0; break; - case SystemReset: mSystemResetCallback = 0; break; - default: - break; - } -} - -/*! @} */ // End of doc group MIDI Callbacks - -// Private - launch callback function based on received type. -template -void MidiInterface::launchCallback() -{ - // The order is mixed to allow frequent messages to trigger their callback faster. - switch (mMessage.type) - { - // Notes - case NoteOff: if (mNoteOffCallback != 0) mNoteOffCallback(mMessage.channel, mMessage.data1, mMessage.data2); break; - case NoteOn: if (mNoteOnCallback != 0) mNoteOnCallback(mMessage.channel, mMessage.data1, mMessage.data2); break; - - // Real-time messages - case Clock: if (mClockCallback != 0) mClockCallback(); break; - case Start: if (mStartCallback != 0) mStartCallback(); break; - case Continue: if (mContinueCallback != 0) mContinueCallback(); break; - case Stop: if (mStopCallback != 0) mStopCallback(); break; - case ActiveSensing: if (mActiveSensingCallback != 0) mActiveSensingCallback(); break; - - // Continuous controllers - case ControlChange: if (mControlChangeCallback != 0) mControlChangeCallback(mMessage.channel, mMessage.data1, mMessage.data2); break; - case PitchBend: if (mPitchBendCallback != 0) mPitchBendCallback(mMessage.channel, (int)((mMessage.data1 & 0x7f) | ((mMessage.data2 & 0x7f) << 7)) + MIDI_PITCHBEND_MIN); break; - case AfterTouchPoly: if (mAfterTouchPolyCallback != 0) mAfterTouchPolyCallback(mMessage.channel, mMessage.data1, mMessage.data2); break; - case AfterTouchChannel: if (mAfterTouchChannelCallback != 0) mAfterTouchChannelCallback(mMessage.channel, mMessage.data1); break; - - case ProgramChange: if (mProgramChangeCallback != 0) mProgramChangeCallback(mMessage.channel, mMessage.data1); break; - case SystemExclusive: if (mSystemExclusiveCallback != 0) mSystemExclusiveCallback(mMessage.sysexArray, mMessage.getSysExSize()); break; - - // Occasional messages - case TimeCodeQuarterFrame: if (mTimeCodeQuarterFrameCallback != 0) mTimeCodeQuarterFrameCallback(mMessage.data1); break; - case SongPosition: if (mSongPositionCallback != 0) mSongPositionCallback(unsigned((mMessage.data1 & 0x7f) | ((mMessage.data2 & 0x7f) << 7))); break; - case SongSelect: if (mSongSelectCallback != 0) mSongSelectCallback(mMessage.data1); break; - case TuneRequest: if (mTuneRequestCallback != 0) mTuneRequestCallback(); break; - - case SystemReset: if (mSystemResetCallback != 0) mSystemResetCallback(); break; - - case InvalidType: - default: - break; // LCOV_EXCL_LINE - Unreacheable code, but prevents unhandled case warning. - } -} - -/*! @} */ // End of doc group MIDI Input - -// ----------------------------------------------------------------------------- -// Thru -// ----------------------------------------------------------------------------- - -/*! \addtogroup thru - @{ - */ - -/*! \brief Set the filter for thru mirroring - \param inThruFilterMode a filter mode - - @see Thru::Mode - */ -template -inline void MidiInterface::setThruFilterMode(Thru::Mode inThruFilterMode) -{ - mThruFilterMode = inThruFilterMode; - mThruActivated = mThruFilterMode != Thru::Off; -} - -template -inline Thru::Mode MidiInterface::getFilterMode() const -{ - return mThruFilterMode; -} - -template -inline bool MidiInterface::getThruState() const -{ - return mThruActivated; -} - -template -inline void MidiInterface::turnThruOn(Thru::Mode inThruFilterMode) -{ - mThruActivated = true; - mThruFilterMode = inThruFilterMode; -} - -template -inline void MidiInterface::turnThruOff() -{ - mThruActivated = false; - mThruFilterMode = Thru::Off; -} - -/*! @} */ // End of doc group MIDI Thru - -// This method is called upon reception of a message -// and takes care of Thru filtering and sending. -// - All system messages (System Exclusive, Common and Real Time) are passed -// to output unless filter is set to Off. -// - Channel messages are passed to the output whether their channel -// is matching the input channel and the filter setting -template -void MidiInterface::thruFilter(Channel inChannel) -{ - // If the feature is disabled, don't do anything. - if (!mThruActivated || (mThruFilterMode == Thru::Off)) - return; - - // First, check if the received message is Channel - if (mMessage.type >= NoteOff && mMessage.type <= PitchBend) - { - const bool filter_condition = ((mMessage.channel == inChannel) || - (inChannel == MIDI_CHANNEL_OMNI)); - - // Now let's pass it to the output - switch (mThruFilterMode) - { - case Thru::Full: - send(mMessage.type, - mMessage.data1, - mMessage.data2, - mMessage.channel); - break; - - case Thru::SameChannel: - if (filter_condition) - { - send(mMessage.type, - mMessage.data1, - mMessage.data2, - mMessage.channel); - } - break; - - case Thru::DifferentChannel: - if (!filter_condition) - { - send(mMessage.type, - mMessage.data1, - mMessage.data2, - mMessage.channel); - } - break; - - default: - break; - } - } - else - { - // Send the message to the output - switch (mMessage.type) - { - // Real Time and 1 byte - case Clock: - case Start: - case Stop: - case Continue: - case ActiveSensing: - case SystemReset: - case TuneRequest: - sendRealTime(mMessage.type); - break; - - case SystemExclusive: - // Send SysEx (0xf0 and 0xf7 are included in the buffer) - sendSysEx(getSysExArrayLength(), getSysExArray(), true); - break; - - case SongSelect: - sendSongSelect(mMessage.data1); - break; - - case SongPosition: - sendSongPosition(mMessage.data1 | ((unsigned)mMessage.data2 << 7)); - break; - - case TimeCodeQuarterFrame: - sendTimeCodeQuarterFrame(mMessage.data1,mMessage.data2); - break; - - default: - break; // LCOV_EXCL_LINE - Unreacheable code, but prevents unhandled case warning. - } - } -} - -END_MIDI_NAMESPACE diff --git a/src/utility/midi_feat4_4_0/midi_Defs.h b/src/utility/midi_feat4_4_0/midi_Defs.h deleted file mode 100644 index 810e8de..0000000 --- a/src/utility/midi_feat4_4_0/midi_Defs.h +++ /dev/null @@ -1,209 +0,0 @@ -/*! - * @file midi_Defs.h - * Project Arduino MIDI Library - * @brief MIDI Library for the Arduino - Definitions - * @author Francois Best - * @date 24/02/11 - * @license MIT - Copyright (c) 2015 Francois Best - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include "midi_Namespace.h" - -#if ARDUINO -#include -#else -#include -typedef uint8_t byte; -#endif - -BEGIN_MIDI_NAMESPACE - -#define MIDI_LIBRARY_VERSION 0x040400 -#define MIDI_LIBRARY_VERSION_MAJOR 4 -#define MIDI_LIBRARY_VERSION_MINOR 4 -#define MIDI_LIBRARY_VERSION_PATCH 0 - -// ----------------------------------------------------------------------------- - -#define MIDI_CHANNEL_OMNI 0 -#define MIDI_CHANNEL_OFF 17 // and over - -#define MIDI_PITCHBEND_MIN -8192 -#define MIDI_PITCHBEND_MAX 8191 - -// ----------------------------------------------------------------------------- -// Type definitions - -typedef byte StatusByte; -typedef byte DataByte; -typedef byte Channel; -typedef byte FilterMode; - -// ----------------------------------------------------------------------------- - -/*! Enumeration of MIDI types */ -enum MidiType: uint8_t -{ - InvalidType = 0x00, ///< For notifying errors - NoteOff = 0x80, ///< Note Off - NoteOn = 0x90, ///< Note On - AfterTouchPoly = 0xA0, ///< Polyphonic AfterTouch - ControlChange = 0xB0, ///< Control Change / Channel Mode - ProgramChange = 0xC0, ///< Program Change - AfterTouchChannel = 0xD0, ///< Channel (monophonic) AfterTouch - PitchBend = 0xE0, ///< Pitch Bend - SystemExclusive = 0xF0, ///< System Exclusive - SystemExclusiveStart = SystemExclusive, ///< System Exclusive Start - TimeCodeQuarterFrame = 0xF1, ///< System Common - MIDI Time Code Quarter Frame - SongPosition = 0xF2, ///< System Common - Song Position Pointer - SongSelect = 0xF3, ///< System Common - Song Select - TuneRequest = 0xF6, ///< System Common - Tune Request - SystemExclusiveEnd = 0xF7, ///< System Exclusive End - Clock = 0xF8, ///< System Real Time - Timing Clock - Start = 0xFA, ///< System Real Time - Start - Continue = 0xFB, ///< System Real Time - Continue - Stop = 0xFC, ///< System Real Time - Stop - ActiveSensing = 0xFE, ///< System Real Time - Active Sensing - SystemReset = 0xFF, ///< System Real Time - System Reset -}; - -// ----------------------------------------------------------------------------- - -/*! Enumeration of Thru filter modes */ -struct Thru -{ - enum Mode - { - Off = 0, ///< Thru disabled (nothing passes through). - Full = 1, ///< Fully enabled Thru (every incoming message is sent back). - SameChannel = 2, ///< Only the messages on the Input Channel will be sent back. - DifferentChannel = 3, ///< All the messages but the ones on the Input Channel will be sent back. - }; -}; - -/*! Deprecated: use Thru::Mode instead. - Will be removed in v5.0. -*/ -enum __attribute__ ((deprecated)) MidiFilterMode -{ - Off = Thru::Off, - Full = Thru::Full, - SameChannel = Thru::SameChannel, - DifferentChannel = Thru::DifferentChannel, -}; - -// ----------------------------------------------------------------------------- - -/*! \brief Enumeration of Control Change command numbers. - See the detailed controllers numbers & description here: - http://www.somascape.org/midi/tech/spec.html#ctrlnums - */ -enum MidiControlChangeNumber: uint8_t -{ - // High resolution Continuous Controllers MSB (+32 for LSB) ---------------- - BankSelect = 0, - ModulationWheel = 1, - BreathController = 2, - // CC3 undefined - FootController = 4, - PortamentoTime = 5, - DataEntryMSB = 6, - ChannelVolume = 7, - Balance = 8, - // CC9 undefined - Pan = 10, - ExpressionController = 11, - EffectControl1 = 12, - EffectControl2 = 13, - // CC14 undefined - // CC15 undefined - GeneralPurposeController1 = 16, - GeneralPurposeController2 = 17, - GeneralPurposeController3 = 18, - GeneralPurposeController4 = 19, - - DataEntryLSB = 38, - - // Switches ---------------------------------------------------------------- - Sustain = 64, - Portamento = 65, - Sostenuto = 66, - SoftPedal = 67, - Legato = 68, - Hold = 69, - - // Low resolution continuous controllers ----------------------------------- - SoundController1 = 70, ///< Synth: Sound Variation FX: Exciter On/Off - SoundController2 = 71, ///< Synth: Harmonic Content FX: Compressor On/Off - SoundController3 = 72, ///< Synth: Release Time FX: Distortion On/Off - SoundController4 = 73, ///< Synth: Attack Time FX: EQ On/Off - SoundController5 = 74, ///< Synth: Brightness FX: Expander On/Off - SoundController6 = 75, ///< Synth: Decay Time FX: Reverb On/Off - SoundController7 = 76, ///< Synth: Vibrato Rate FX: Delay On/Off - SoundController8 = 77, ///< Synth: Vibrato Depth FX: Pitch Transpose On/Off - SoundController9 = 78, ///< Synth: Vibrato Delay FX: Flange/Chorus On/Off - SoundController10 = 79, ///< Synth: Undefined FX: Special Effects On/Off - GeneralPurposeController5 = 80, - GeneralPurposeController6 = 81, - GeneralPurposeController7 = 82, - GeneralPurposeController8 = 83, - PortamentoControl = 84, - // CC85 to CC90 undefined - Effects1 = 91, ///< Reverb send level - Effects2 = 92, ///< Tremolo depth - Effects3 = 93, ///< Chorus send level - Effects4 = 94, ///< Celeste depth - Effects5 = 95, ///< Phaser depth - DataIncrement = 96, - DataDecrement = 97, - NRPNLSB = 98, ///< Non-Registered Parameter Number (LSB) - NRPNMSB = 99, ///< Non-Registered Parameter Number (MSB) - RPNLSB = 100, ///< Registered Parameter Number (LSB) - RPNMSB = 101, ///< Registered Parameter Number (MSB) - - // Channel Mode messages --------------------------------------------------- - AllSoundOff = 120, - ResetAllControllers = 121, - LocalControl = 122, - AllNotesOff = 123, - OmniModeOff = 124, - OmniModeOn = 125, - MonoModeOn = 126, - PolyModeOn = 127 -}; - -struct RPN -{ - enum RegisteredParameterNumbers: uint16_t - { - PitchBendSensitivity = 0x0000, - ChannelFineTuning = 0x0001, - ChannelCoarseTuning = 0x0002, - SelectTuningProgram = 0x0003, - SelectTuningBank = 0x0004, - ModulationDepthRange = 0x0005, - NullFunction = (0x7f << 7) + 0x7f, - }; -}; - -END_MIDI_NAMESPACE diff --git a/src/utility/midi_feat4_4_0/midi_Message.h b/src/utility/midi_feat4_4_0/midi_Message.h deleted file mode 100644 index 04b56c9..0000000 --- a/src/utility/midi_feat4_4_0/midi_Message.h +++ /dev/null @@ -1,101 +0,0 @@ -/*! - * @file midi_Message.h - * Project Arduino MIDI Library - * @brief MIDI Library for the Arduino - Message struct definition - * @author Francois Best - * @date 11/06/14 - * @license MIT - Copyright (c) 2015 Francois Best - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include "midi_Namespace.h" -#include "midi_Defs.h" -#ifndef ARDUINO -#include -#endif - -BEGIN_MIDI_NAMESPACE - -/*! The Message structure contains decoded data of a MIDI message - read from the serial port with read() - */ -template -struct Message -{ - /*! Default constructor - \n Initializes the attributes with their default values. - */ - inline Message() - : channel(0) - , type(MIDI_NAMESPACE::InvalidType) - , data1(0) - , data2(0) - , valid(false) - { - memset(sysexArray, 0, sSysExMaxSize * sizeof(DataByte)); - } - - /*! The maximum size for the System Exclusive array. - */ - static const unsigned sSysExMaxSize = SysExMaxSize; - - /*! The MIDI channel on which the message was recieved. - \n Value goes from 1 to 16. - */ - Channel channel; - - /*! The type of the message - (see the MidiType enum for types reference) - */ - MidiType type; - - /*! The first data byte. - \n Value goes from 0 to 127. - */ - DataByte data1; - - /*! The second data byte. - If the message is only 2 bytes long, this one is null. - \n Value goes from 0 to 127. - */ - DataByte data2; - - /*! System Exclusive dedicated byte array. - \n Array length is stocked on 16 bits, - in data1 (LSB) and data2 (MSB) - */ - DataByte sysexArray[sSysExMaxSize]; - - /*! This boolean indicates if the message is valid or not. - There is no channel consideration here, - validity means the message respects the MIDI norm. - */ - bool valid; - - inline unsigned getSysExSize() const - { - const unsigned size = unsigned(data2) << 8 | data1; - return size > sSysExMaxSize ? sSysExMaxSize : size; - } -}; - -END_MIDI_NAMESPACE diff --git a/src/utility/midi_feat4_4_0/midi_Namespace.h b/src/utility/midi_feat4_4_0/midi_Namespace.h deleted file mode 100644 index cab0a2c..0000000 --- a/src/utility/midi_feat4_4_0/midi_Namespace.h +++ /dev/null @@ -1,38 +0,0 @@ -/*! - * @file midi_Namespace.h - * Project Arduino MIDI Library - * @brief MIDI Library for the Arduino - Namespace declaration - * @author Francois Best - * @date 24/02/11 - * @license MIT - Copyright (c) 2015 Francois Best - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#define MIDI_NAMESPACE midi_v440 -#define BEGIN_MIDI_NAMESPACE namespace MIDI_NAMESPACE { -#define END_MIDI_NAMESPACE } - -#define USING_NAMESPACE_MIDI using namespace MIDI_NAMESPACE; - -BEGIN_MIDI_NAMESPACE - -END_MIDI_NAMESPACE diff --git a/src/utility/midi_feat4_4_0/midi_Settings.h b/src/utility/midi_feat4_4_0/midi_Settings.h deleted file mode 100644 index 60f034c..0000000 --- a/src/utility/midi_feat4_4_0/midi_Settings.h +++ /dev/null @@ -1,87 +0,0 @@ -/*! - * @file midi_Settings.h - * Project Arduino MIDI Library - * @brief MIDI Library for the Arduino - Settings - * @author Francois Best - * @date 24/02/11 - * @license MIT - Copyright (c) 2015 Francois Best - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include "midi_Defs.h" - -BEGIN_MIDI_NAMESPACE - -/*! \brief Default Settings for the MIDI Library. - - To change the default settings, don't edit them there, create a subclass and - override the values in that subclass, then use the MIDI_CREATE_CUSTOM_INSTANCE - macro to create your instance. The settings you don't override will keep their - default value. Eg: - \code{.cpp} - struct MySettings : public MIDI::DefaultSettings - { - static const unsigned SysExMaxSize = 1024; // Accept SysEx messages up to 1024 bytes long. - }; - - MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial2, MIDI, MySettings); - \endcode - */ -struct DefaultSettings -{ - /*! Running status enables short messages when sending multiple values - of the same type and channel.\n - Must be disabled to send USB MIDI messages to a computer - Warning: does not work with some hardware, enable with caution. - */ - static const bool UseRunningStatus = false; - - /*! NoteOn with 0 velocity should be handled as NoteOf.\n - Set to true to get NoteOff events when receiving null-velocity NoteOn messages.\n - Set to false to get NoteOn events when receiving null-velocity NoteOn messages. - */ - static const bool HandleNullVelocityNoteOnAsNoteOff = true; - - /*! Active Sensing is intended to be sent - repeatedly by the sender to tell the receiver that a connection is alive. Use - of this message is optional. When initially received, the - receiver will expect to receive another Active Sensing - message each 300ms (max), and if it does not then it will - assume that the connection has been terminated. At - termination, the receiver will turn off all voices and return to - normal (non- active sensing) operation.. - */ - static const bool UseSenderActiveSensing = false; - - /*! Setting this to true will make MIDI.read parse only one byte of data for each - call when data is available. This can speed up your application if receiving - a lot of traffic, but might induce MIDI Thru and treatment latency. - */ - static const bool Use1ByteParsing = false; - - /*! Maximum size of SysEx receivable. Decrease to save RAM if you don't expect - to receive SysEx, or adjust accordingly. - */ - static const unsigned SysExMaxSize = 128; -}; - -END_MIDI_NAMESPACE diff --git a/test/Arduino.h b/test/Arduino.h index c4df0cc..ffc2042 100644 --- a/test/Arduino.h +++ b/test/Arduino.h @@ -87,4 +87,9 @@ template const T& min(const T& a, const T& b) { return !(b < a) ? a : b; // or: return !comp(b,a)?a:b; for version (2) } +bool bitRead(byte value, uint8_t bitToCheck) +{ + return value & (1 << bitToCheck) +} + #define F(x) x diff --git a/test/NoteOn.cpp b/test/NoteOn.cpp index 1399dfa..f48de2c 100644 --- a/test/NoteOn.cpp +++ b/test/NoteOn.cpp @@ -1,7 +1,7 @@ #define DEBUG 7 #define APPLEMIDI_INITIATOR -#include "../src/midi_bleTransport.h" +#include "../src/BLEMIDI.h" void begin() { diff --git a/test/bleMidi.xcodeproj/project.xcworkspace/xcuserdata/bart.xcuserdatad/UserInterfaceState.xcuserstate b/test/bleMidi.xcodeproj/project.xcworkspace/xcuserdata/bart.xcuserdatad/UserInterfaceState.xcuserstate index d447496607b59eae9f85b5052962ac2598240266..0322d87cb1cb5aa83e32eea8b6fba1199f718f6c 100644 GIT binary patch literal 234098 zcmd3P2Ygh;_WzxG@AhopO}6*!Znkf-C84*39(pe!gaCn%KoWYp1A_FTAiYZ$L7J%a zCa9<&(u;x>kYX1U{&RQJFxmHbzmMSm<>MpSduQ(Xe$SaRXU?3t+k0?+UU7-fcNPN} zju9A%F)${^!nmC+!*Yv?^9l>PSh9<9`sbm)+FMEr2Y0p<_8yR%Q&KF!z~q%#B4K8` z=D8zt`_wPJ=`_a1I33!RWS8VpV5?X-2;*UKSOTWNl$aB9VQ$QWc`+a6$C9xWEP$nA zb+L9>d#nT25$l9?#=2l#v2Iv*tOOg14a0_GBe0R!C~Pz~1{;fw!{%Ufu~)EHv3b~h z>@{owwh&v6t-#h|>##Smt=Kl~UFY_)dHeegHp+AHqMxKf+Jpr}6Xn z1^gm@6aNbT4!?`v!|&q{@kjU*fwZSiF3p?;w$27 z;vVq}@rd}7BuF;NA*G~})RP9%N;*jw86s96}By zN0Vd7vE<9-6mkan3i&EIk6cc!AlHx^$xY;Dau>Oqe3v{(9wHBuACafX)8u*b0(p_V zNq$9sN8Tmxk@v}mkkORUjM1FY zfzgGL#puPzW(;HuVGL)CV2oiv#stO;#vH~1#zMv-#u~ik8z*zfbod&gvn&Gm~5tmDP<-wwM-pT&rD)Em|kXp8D!RA z)?}tLGnmbpZJ2GD9hse&+05R|zRUs4fy{j7Fy?UPXeMM%U`}MtWX@u~!d%E)#9YH% z&wPWqh506P5Az-7KIReTQRc_YPne%EFETGNzhZvP{GNG_d7t@!`H1<1MY0$yCQHPU zu~aNIOT)6V94sHp&q`+1V%1}1uo|k#W0>jTz@tdCgdSm#-nSzoel zux_$`VBKZ?$oh@-JL?ZN!6w;kHlHnE3)xDximhXt*%o#p+spQ`1MD<*4R%d-Iy-~i zjNOXen%#!ojoqEyi`|#qkKLbL#4cu+ut%}SvnlpV?5XT&?0M|@?AO>!*{j&A+3VSF zu(z<^X76FY!`{z6!amCWfc+u+bM`s*W%ifs8|-h`-?AUDe`Np0{*(O|2XJss9EZ=5 za1uBQj)tS<*f@5Mo0Gx`aB6UBa?&{&oaUT1oVJ`!oX(uyoE%PnP64NoQ^Fa_8PB0O zlQ`2j(>b#_b2y7ROE@bzYdPyUZ*aD7-sbG#?Bg8a9OazgoaB7QIm@}gxyrf5xz72X zbBlAA^AqQ1&STCKF2QAS*<1-Xo~z=jxry8)uAA%OrgCd>>v8LIn{!)n+i}}-dvbeo z`*Qnnhj52-M{-ATU*b;T&fw1EF5oWVuHdfZZsNYl-Ok;?-N!w|eV==Rdxm?Cdxd+I z`z`l2_W}1u?w>r2$KvZthsUwv*m06LX`C!h8K;ZW$64YM$3bxI=M=G6by!Z3G5~a8vMu z;I80D!S8}U1P_IzkRjvV~OSoIO zSGZ4jSa?KuN_a+iL3mMkO?X}Sz3`Usw(y?t7vZnM-$X!!iwF^0#1{!fQjtug6X`_; zQKHBxa*2E*zo@3Dt|(oUA!;mYBkCyXF6tr57WEe8iw28^iiU}Xi=b$dXu4>IXr^d^ zXsKwmXpLxtXrpL{Xs2kG=pE61(E-sx(FdZBMW2bziar-z7u^(nC;DD=OZ2nochO&> z$D$`Z#B^(J?!jr^F_!5akDv6hmZY|%z9e0e zA!#gWE@?p&N?J;~NV-b8NwOuqC4D9RB*P^mBqJrGB%>u`Bx5C%WTNCH$qdO%$t=lY z$r8y@$uh}u$qLCz$tuYf$xg{0$zI7p$sx&M$#Ka?l2ek?k~5M^lFO1Sk{gnnlJ6zA zB=;o`C66S3O8$~OmOPPiq+BUaDwoDf6QpU<8q%85TGHCmI?}q*deZvR2GWMoM$&X? zhP1J?i8NE%O4?r9Q<^31B^@9gD9x7+k`9rMmX48*m5!5+mrj(vEL|X7CS5LFBV8}u zAbmr+Mf#R>yL7j7uk?WQp!A&dy!3+fqV$sVvh<4ds`Q%ly7VStV*=?d>22vx(x0Wj zNPn09Apn7_i>mlnY>n+Qb7060tV`P*J$|lJs%cjYu%Vx`7mCchalr5DllkJf0lv1gX9JBLiu3%2>BTKSUHqWkWZ6Om(P&Tl+TkdkuR06k#CZ}CEq9CFFznZ zD1Tr6vHTPHr}Fdi3-XKdOY$$}H{>_vU&(LFAIN`^|0@4e{#QH^PsTIidGW${QG9%S zLcBWO7;lO<$J^t5@qzeYd|G^s_}1}l;@ifzi*Fy_A--dLr})nCUE+Jh_leJs9~55@ zKP-ND{LJ`S@w4OS#Lta?CH~d;dGYh(UyENHzbbxX{HFNr@jK$*iQgB$KmKsSl!O@x zGZW?}ypr%*!h(b)2}=`JCag+Wo3JinQ^MwitqI!_b|&mfcqifAg#8Hz5{@JsO*oNo zGT~Ih#|dW=K1(>Ca3SGJ!qtQ?6K*7YlkjcA?SwlC_Y)o@{F3l%!o!3|2~QN5f>baR z90gY)PzV)Lg-oGPC>2_TPGM4*6*h%k;ZnF2enqk(qzEf&Drza}De5cI6&Z?Visp(| ziq?wuiVlh{imr;DiY!HrqK~4#B2O_$QJ^SN6f1@+MkvN8#wws{lFC98tWlIHCARaY}Jo zaYk`Yab9s*aYgZk;!DNXifBd>B13svc}96jd0BZyc~$wf@*Cx!%DZKZ{8m=0l8mStk8m$_m8mk(o8n2qDnx>krdQ~+~HD9$%wOqARwM(^I z^|oq{>K)a)s`pfTRr^$jR3}uQs!prUs4l54s~)I+RQ;s-S@nzRSJiK--&KF89;zOz z8EU>-pcbkV)C#pn?N$5Kes!`sMIBHF)gg6QU6YusZlG?aZmw>jZm;g39;nV&4^kJX z3)O?wL)1m;Vs(jn1TjE8Uj4Fqih8PguKE@A2K7euCiQ0Z8|p3UH`QC!+thEVcd7TP zkE)NUkE=gcf1>_c{f+ut^>^y;)wk5Q)pyiCsPC$O#Lue#&;SiCT&y89JWZU&q%mtO znnaCNW7F6*Ng9X7sqtz;nmU@gntGZhnx>j8O)pKhrne?X(?^r5>8t6d>95Hbbk-DW zN;G3MV>RP6<25g9rf8OHR%ljgR%upi)@WYWtkta3tk-O2=V-QTc4*$y?A7ek9Mc@v zT+v+BT+>|Fe4+VLb3=1e^Ofdn&G(x7ng^OcG!He8G=FMIEkmo;YP4FdPOH}%v_`E- zYt~w{cCAL2F48X6F3~R4F4Hd8uF$U0ZeqNm-K^cA-KpKB-L2iPJ)r$udro^^dqI0q zdr5m)dqsOydrf;I?j+G%`@Qyo_D5cU_9yKl?Vmb{PO6jXQp+lPOr0a z+UsmOyUs_Z>-@SjT@77pT^n6nT{~TST?bu9T_;^endqwxEZk}$w?ls*4-4fku;*xHS?seT8x-Gglbz60B>-OkA)_tP;RCii; zM)#TStnPE&Io)~PW!(+kE!}P19o^5mU-UeEoSv^2=!JTbUaXhsrFxlO!E2z`>kWFN zK1uJ;JM}JoKp)gM*SFBO)Mx5j>09gD=-cYs>D%i&6Doa{zMsCoK2JYHU!gLcrI@lCu~SCC=3RJ(O@z-3{FFR zLjyxYLnA}FA;Zwv(8SQx(9Do&=wRq*=w!$;^fF`{dK(591{$DYf?=ZJCBr1cWW&pb zDTb+rX@*&b`G(gF%MB|GD-Ej*8x5Nb2Mvb|hYd#zM-9ge#|`frP8d!aP7%Kw&Kj;5 zt{Scxt{c8Jd}nxUcw)qiz=#_OBWYw9nMRh8hukV2#phrlZ`Vu zA>%CLYsLk}g~mn3RmRoEJ;ry8?;77T?ltZ+?l&GV9yA^@9y5MqJZt>ic+Pmuc-{Dm z@mJ$-#@~&97#|uR8UHl?WqfSHO&pV$*lCiOR3^2_Z%Q_$m;$DtDP#(pQcY>58m2mN z1)PnhbW?^Y)6|MMV`^>cZ0cevGz~TlF%_ALO(mwGreUVxrV*ww_+HaQ({$4e&Jfc~ z(|prwrZ-GmOmCXDnzotVGHo~QFzqz$GQC4KCrzeF%x<&C>^1w$esi)p#T+oF zn(LYyo0||%%uUU0%x%s6&3Wbl=7HvX^B{A9xzIe=Jj6WIJjVQz;4Skc^Gx$B^Xuld z=5^-v<_+eJ=1u0!<~Ph+%x{_Zm=Br{nGc&kFn?(N(tN{w)BKhBYx6heZ_VGCzc=49 z-!=bY{>%K>{KUetuq`@^-eRyAEhdZEVzDGztQMQaNj$bBTWW~*S!!AuS{hlpTDn=f zTY6Y}TCyy?EZLUcmK;kzO97Lz6k3K`Mp#B#Mp-6UCR!F*7F(8BmRgosmRnX>R$5kB zR$JB)Ul1nC7RxTnZp+)21D1o9bC&a#3zmzPOP0%)E0(L4YnJPlo0eOaA1yywezyE+ z`72SHC`*(l#wR8uDiW26szi07Cee^+OY|oC5>pe?5?dvN_c61OLw zNIaSNLE?vrA0?hj{5bKG#7`4XCw|V^K-5dTl6W=o>%?yo?qP5I)=AdM)|ahQtW&Mith221t;>iV*5%f9*7eqX*8SE4)`QkV*2C5# z)}z*A*5lR>$Pwf|>uKv5>m}=D>lN!))~~IPtbbbnvOcyxv0*k~!)=6(w6SeMTY^nt zQ`(F+lP%SjW~*VVX{%+cZL4FeYpZ9gZ%ZfZ+FID!+d9~K*m~MZY(s6sY{P9MY$I)> zY@=;sY-4SZs6%YFO|i|f&9yDEEw*j5y=B{O+hN;j+hyBrd)v0h_Kt0z?WpaT?Ue0f z+d12L+Yh$8wtKewwg>NASF0o7PNp^?bX?NM(c8}d__u2jS zWP8Y7+n#REuxHv^*>mlE?fvZi?RoYA_JQ_%`yhLPy~sY&4($`{6YbOOGwiGFYwWMv z*V@d57-adPuNe|uiL+{e`&vAziI!<{_6Eb+5fcvmBdJ5CTWtiNxCF`k|D{MWJ)q8S&|Zyl9GH$sYz)`HIf=6HB9P~)HSJF zQum}DNj;OYl6oa&C-qM1n=~kCXwtBx;Ys6@sHE4D79=f9T9mXnX-U%3q-9CVlU5|H zN!paOJ!wbMdr5nf&Ln-7bT;Ypq;pBm2JH8yp)QZ#lL*PB>0F zK5%^K_{ed}@v-9*$ES|dj?W!e99JD*JHByz>-f%b-|@i7aPmCf zaMg6xa@BU#an*G-bTxCeb+vPKb9HwWxr$vSuA#1BuHmi`u92=$uFEJKZj~+wF0C-9ES9o$L;|YrE6k8ScjJR_@mB zzV3eR{_Z^Y0QW$5zI%|nz+LDrc8_vTATGKmx~IEmxL3Q^xLHR zc5ij>cJFr|aKG<9;lAd+?*794rTd2aru!@R*Y0oJ-@0$Re{?@|Kk^VB(xdXIJsOYJ zqx0xJ29MEW@|Zm~kH-`8ggtdV^*kLtojjdAT|8Yq-8|hrJv==T=rb|eB=4nbI)_%^SkE{uh1*0x1G1Ww}ZEfx0koSH_to7TjZVMo$8(Do$j6Co#~zBo$a0D zo$H;?zUE!(ecij(yT$va_o(-n_qg|c?+Nco?+4xwy&ri`c~5&Uc)##|>Am5-<-P3# zKHNw6NFT$;^s#(wAIHb_34C&2yie!T`)oeDua2*-ub!{IuYs?juaPg^m*H#dYwm07 z>+0*~>+b90%k_=+jq#23jq{E7Q9kIK;G5`s$v4F}+qb~C(6`99%D39L$#>9q$amOx z#COzp%y-=PzVC$Zr0J_${?7g`{;vLR{_g%B{+|9U ze=mQwe~7=xU+gdO5A_d=o8%wvAK@SAhyF?a$^L2n>HY=&h5kkU#r`G!rT%69<^E0n z&Hgw1Tl{bP-}CSFAM_vcAM+pgf9gN&KjZ(*f8Kx9f6ag0|E>Q!|M&h|{(JuW{-6Di z{ZEpyWRT2A<|gx!k^awz3!%KIrFq?}6m zH086Db14^7uB2Q~xsmd9%6BQZQ|_ibNclPCx0Ht|e+94r5nu*5fw+J$APL9=ihw$x z3m5~IfGyw%xC6dGN+1+S3)BkK4KxU(2bu($2QmX~0__8x0$l?=0=)t`fxdyfKz^Vw zP!t#%7!ep97#DznmjW*brUhmO<^*01ycSp#SQ=OnSRGg!*bvwpcr)-;U}xa%z`KEc zfrEh~f#ZRbfsX>81kMCL4_pXb4qOX-8TcyjZQxemhrs>7Pk~!Gs)E{}A!rU-gGoVG&>Kt+27{@=n!!53`oTuQ#=&O6mciD+cEOIpF2U}> ztYGh8Zm@rFV6Y%KBv=w09vl@M8>E60gOh_(gENA&gRcbV2NwpH1eXU_1z!)Y4{i!> z32qDS2<{HP6Wkj-5Ih__7CaIBF!*usbntBOeDG56YVeET&EPk|?}K-O_kuqLe+m8` zd=z{f0wFTQ3UNdHkSHV##fOw3O-LUyg%U&dkTc{7`9pzFI8-B4J5(>!Fq9E$8fp=0 z6>1ym5b7N27U~(w4)qE33k?Vj3JnewhlYhlhQ@@(hbDw3g{Fk2hh~N5hUSG9gcgUE zg;s{vgw};NhTaHm4Q&tY3hfEK7up{>6gnDuKlDN9ROr*tXQ6YUi=iu_>!BN=uS4I3 zZinuM9)x}l{T6x{`YViui7+$F3CD$nVM$mXR)p1IUDz15gl%C**d6wVlf$*bwZnD7 zb;AwAO~OsX&BATN?ZWNDox_8}CE=mrk>OF{apCddiQ$*RQ^HfjGsCmOuY_L>F9DXzZc#cJ{&#~J{kTb{Au`H_zbzo|K>Y&tu)WX!_)M2T^Q%9tZNu7{7Idy6WOTp0m{Le5xCcuQ4 z2$N#*oif{b2Ih_|?uz~`-6!v8$;r7c9y74PO3Yc< zyR2ja-~`EFvh4rYQiS3gN|joJvOxx;$!tlq+InQRtE3nt zMf<#xe54>TVmW#t$~7WUB+hKtp=s-)++lfzLyIGdL{>=auL$W5HEmjq3N<>?H#Ke4 znf|k7c3wf2NR-(wBd@5q1a&mHu%J(FQMb%?4QY$bjF^I`{7EgcM-~n(DMpvum5j{K zZJAv>FiRvYlcQWGO&diY+qh_OC~-zkL=z#{rcw(Dkv;289H**=kejg&y=mQ5Qq_4FS+I7=j{Y^hO}TW5*n=+m;1S7E!K`IA!ub(+K; z_Zx$uaB5nOnzd@9(H2JuDG4Q~6qK6MQO1pR>(y`2uu*zOW6DC=DJSKj{8WGnQ#Ghs zRNc>-HBV{LG836DVmzlPH@6_Ffesy-HfmQ=ga#oJ_32CP@dk4wE5Zyr_5bdB(ZYCwAWRVV@4R%Tj z-9fUyRDuBmGpTqg;eY5LIW@I1guz2HkuO#KFC9c7gi0kCHawHkP}*nipd0O}kOXBM zjv1Rt=_$ki(jKwrGNhG0f5OB}%0!u;xjnL+P=oW&~)doWWQCA{XfP zZ*8AJrBZ2hdwC^YL@crN>D7NuH-7u=8B|U5^S8zo+|f7f-8X}(P1T`qq78x8Payd} zaa?AG$%r~+2#1e!&urHy55)EgAHzyeA?N1G+^zmhh91$~!SOIc; z^wi)>3mDwAwhgrE4UylFWrYo>m{E+WQ0$b1$`!*{Q!F19BThi2hnuin*gjNfcnbRh zyMsLeJYWPaR5;iO6%95)WrHn1OOT0*2it&lsC=*!=mNTd9v}8h96aUU+Z358fB=j~C+8 z@D=zfd=0)9l?YzMui@Y0KN5f-2|ghs;!!!Eil|Ry5*>(6L>HnPF@cy(yoO5t786T} zBgCh~dEz2*nYc=lq?lBYDpEu0$aJzT*#(vI^+3gZlTqQ`B61123>EGjC(oeryvyWO z@;WNWlQL9{5Ti4rE2BH3Cu1bz6;x!mjoFTJ8!>w^M=~i?9QP7)GIIqghC9GKgo@#gF|RX!M}=>IMWE6*Eh~r$-RhuHw+5`P ztZY^eE0@)eHG#DR6|!w%ZDSq4BLBld^k3|F>A$7_u)~ys+i77gZX+$)s78VeXIf25Nm{`V;NXutO=T;B$0VW9+@l@ z8&ELa9BYBK#4@o~$Vl4IQvf7qLUJx7=Rxu{iVw-PR1Fklq2Qri|H9#!*~9YsWuxFY z`ce6x^^0;*h)mzrw4it}Dz7apihd+*nLDVkXk_D}?7{sT<@O%huU~Fa_l|kF!^{52 z61ggeD^EqljdF|g`W4U}wL>v$3Eiwhlny0%=(D`s;vT4ddY`<~M{>$m6+N*2m}3*x z6U)MSVcA%3EC=g@P_WCvN0s{AUPP4qi9A9opTEN`2({=&hl=amZSmV zZQ$U-yn+%G3e##srW0GJrp3iW=_hDn^cK-qmPj4ra(lF7ihZ?3VL#M$thO0w=~kw- z@z~4sT9CpZa#Itrm#|6LWO`af;Uzr{Iw{wBYzi{fY3M%-HWQnLrZYZ@JNf9R7S%Ai z7A#%swM9%JKuAUH8n&cYa%fqRmtT@gho0#LG#!1SE7SB5gR{}fp-DNBT=N8mqV)#-P^dRaOhyP*ldW_h1r9PbNe(H*`b(T+X!hP zN>vwq0B!ZRQFh@1c8R{Q zfl670U8d?*T)2iNOLSp76k@D=tAec=F=whH@}s$X&87Mfhqh1*nvRS}#u z%9m+n4|{<9R4(4nRHF*L&8q~05;$NE*cW3j0gR+q%x^Cw9~TCW*G54<)%k_b=rE-S{j{~XjPCuGMcHV z=C&qzxkcINm;}1RTzyC7i|A-S^dPFHpUCPwxAa-6O7{%PZJk|$#%Dp<^02xNN=H$& zU*uKjN$08Y)A|gZ&jNCgunNRetthni)#cQvmsu}jV8c+jRZzCNP5}%&`_& zKq9aL8?aODsSZ>}suR_DEpPxQQi~gSs4i4@q>`RgFIpvZX6z~PqvO4*!=MvD$SLH~ zX^p?p^gsC$I$2i9L6(Ug0;$LjL73{g3Zzlp{(}zzwLzVyEECiR4a?g$qI#6uFlY># zJbh<#(6ao_Oe(A5&NiTJ^v01-U4b1WQaMx~ zDwpa^byy2}((?w$2ED1ikvSue8c?Q%a;IG}3)m1>71L<>n2Gx4Rs}5!`{d>I&7-H0 z#Q%I}>2y;jVSg}yrXi2&w+alT`u``g3&G$rVyesm!L;%@0F;1Xyh5`^w029GWU=o-NUItUZR4@(EG>9so3aP==5UPkOrb?)x)G%uJ8(;>Q z31)#=h`zbBp8@mGZ|HAo1T~VHjehvlT-xJ6G6VfXe}Jr;PCAv%d*wk09mk;0%lU3U zaxfivB%sgAMgn3sH$R%8L04$gPcJGeEGnNA%cpPpQh7&Dx1zJD(J8!Yvq(@7@qB{@ z7a=E*+Xux5IRhi>_+om5&~CA~!AM%PsI;XYv>jSdl1HbQ=_FhEgCq0)-(k^%6@6Ak zYhjd`jrx{#K(`94r$*8Kg?3q+fNl-g4Bh}+sL>QfO{ChE8O%1Y1B+h`-U8dHG1S=A zU?HQVO(XrJKzU!7u-Yt-S1ZRln!lMAhwH3vWrS05p({~K?TulEz(wQL7yrg zigQqKl8vJ2qPE!u{c>C6(%IzvQd!drP<)S?ppT+$Tc8Ot+Fcjg0?=~?(Ye;L=T%%r z_VTxm3v;OH=qLgv0@MsqcM21;QnExX`y%_O;q`jy2(j3Uvi&9AvRJd&TfeB!(7b{| zZ+>2HH0Pq&zw8rtgBIy-I@jw(@t7C=5zYHXC#avm&uAPq>e#-0?uhchwT%5W;1}>K zRwwoiDAGbr%Va2PhIUhsgoeVthM_1%&dEoyTpvST9~AAz#*k@7aB9ZStZz zdwJQ25|{DU1&!X3C1cj0c7 zi}2z;+>a;YDR=-6;vqbYvJ+`2KT#89C~Bh|MO~DosE_g#4N;~d9px$-qijV}l&@%x zx4>KCnRqL_HQokqi?>4=j1DM=(FtWSx}ZEpHd55)8FL3jbma16$W;6->bUV;zBhvCEV5%@@a6h0asgOA0>;p1@%hxi11BK{IS z37?F=j8DO*qO8btd15!n%Y3UN$sZgQAeo{sWa3?>I>>y>Mr#&^#}C?0tN&;2*eO1K%j-d z41pa2Hw4KLq(M*zf`$+@fuJP>Z6W9cK@SM}Krj%3ArK6QUcu~ z{8flAfcO%KuYmYEh`#~x?GS$l;s+sq4C1FC{yD@iL;OpKe+%&+ApR4?|A6=tNH8G5 zgM=6o36Ri1!VC#JB;1flhC~<=wIER+5*d(a4vE%~=m3fCkmwDG{*WkuLdo=>_-5pB@eTM!d=vF5HIJIV z27d$Jg1x^9_YX2DH;QxTr7(O@8Q)$P^G6zW6TWg7Mwd z!Wb?Xe+PdTe>dua@x9<4z8Bw5EfTSjXUjyMjoma$)Zzc=+3F7-jMk#awYghFyxz!& zi=(}7c7dlq@>{lolEVJQHp8IooT5Sl@0g58 z)tHoA!mm}KSk|NBbtZzK4(@gJyl2!3lC{-oy# zpSFnnnD8Iqzf^($EB+h)JGGJ8L~VIi_fKOl*@Ch8;BhbD&^#+39hK9f9 zdBUf)9}_;oCgT1MAEnp@gpk@wZKHP4@Z%#%A_K|*l)f&Zk}DvjAYl#4$jga%>Md#q zwKEoeB}&+t*#ol;wxI=dE*phT`Gp1jY)OWaLW2#pvX#1c!cF+A(Nzi& zK)QOH+Dp}lcxNI^t0a|3BWh54sCTLNVyUDyDxjWr zqJrnBlB{MZpVrEnkQxscAwb9YC=1(=qM7RVI9WgFHXC1X6 zI#i>hPDE#J8^d@?jV(Ei))Q9Lx9Tf4X8DgMB zO0uu||3pc&oCB)J85dhg*+gOa$cq9iLcqv~lI)A0vyz4qBdbx;XkrXf(lP3TG9`_t zl|&Jcm_Qw;PEaRfDQOZhnV4J(ehO036k;0nzDSJ*QcZdw*|S95pUXgMh!&y)W4X3T z#4NNYYND6HL{z9(kWf;QEjkVi)ep8wNRMTME!t`U^?tO4B1@F@zj?Q({aM7Fp#^J6 zN^&(WkM?s(WsYt!vAi1ntRz+;{d`27F4NEJw0_nS>xlK#De4pI(^&f1L~JHDm+EH= z($5xREA_D`9_eQ~(vN6wmZ#RfEe{%^YZ?=w%i_9{<72Z$rpXyzDk9BJk=>Oz@jPSTqBfcTL3 zh&oH1qt3_D%qM88{?k&;oI#p7L!6~P7nzY}8Y0cGI%kQxJ}=G0nr=QJE}+_hOA*~f zMY@VaQlZyF$Rk{{T2-%|Ptf79olilziQ4g_Z5kjq{g3PCnTFCg#I0%+c8B-@DeMw; zy-Z>EX@xx?ek6XPE>l;jYq1peEAlC`OHuxg6!tsukh+4@)eotQ*YICZ*RN=7KPH|; z)D;nk#HlNyW}=h`@x0{fmGvtzfS6So2Fapf&>)bvex5-b$t49<6+((gF;d8v)HkIH zA!SG*q@0W=6Q~>1SJc-r6oN`y)TFu;NpGZ(-lUGYDY8be0LhD22&qEj=Ls2|ccKC% zB7qc9ftb~*1GT9bJJB`{>L%Sn^vAz7a7Z^ZfO1sFU5%LY?eEJ&2{KUKI;< z64@fzo9sjVh!oWpDT;mQ`7P8Hk<3+o%#}LXpUjUsj>-u>vVbf^3BF&b-^&cLh{jh; z{Td73uuAwwAbcZGty;>2hbUM_Zh(M59CV~Pa6E4g+QsDH4RTu*4&EZSlRF?_ zLcoHkUgg=ck>uMn2YVo3$Kv3P)kOym{>3MSy zdoVm8t0bn$U&-Id-yu*ypoBp4tQ^p}Y4R@!R53VUR7y@WaBz=-Ge`*N{6$xqgR{?% z14YyhVj2R2&8U)|X7CvTh7bZB1bPTeGzroU1w&DNh9MnoIG2p9l%8gw^ze!`i~>d>1OW&_5S1RruBd{XoxGnFwdVudvzs9mO&nY0zof}mzB zUCc#iW?m_Esq>I7<}qG_pq5C6v@sh&5kJWi75$@Gy{Gs3vgj(ehJ}Mr8vGwIPDSuHg`h3ErTqXp^YX9QK-CZg)nXPDj6Wh2pozI- z83lA`%|M}b`xq23F?3K6M4cg%0Qb4a*5Ohaprm88$WuheYDyAHQuCdT7&@OLbDS8xLGgV9!U3Wv+ z3lVk!=Q(b?p>q5GT$0)jo$;!~fq_{i#%3lmtxObSqZld+f}9u}I6=Z{ritlO0Wpzx?8}zqCBeaH(P{Z3!ksAM!3g1!)-^ApwDPh*<9CQRg4 z`$2TlAqICXDsh*IxXWa=hM+$(qUOkmSZDyf=siLvlBk@$$`bt_xa-X9UWL0J%$`hS zarqDof?zOJqg$kisnW8RnL`h}J`fbd;;dhF1FtZu-RHL1jTYkQa7N_psUdenbOUaof>hzC=pCzcszpU&&T7Qa819fN|E5nIShfk@Z?y1aaw7N$?fG}07?%6cp zIS`DB1^CrU>Yk4P&u1=xU^D_;f`&-klIJ=^%JjRKSxx-RT*-{a&toB=N+(Sw9X~Ts z{5&oeoDF|pw=*|GFh1ff<9>bq6K2%_;cqz#=2qs8Dr(%x+(oN#0t6FdsF9ADnJ8v{ zDHiVimDGr0X68ZWVF)H6H4Z~+;6KZU1nad0__Xtm&_Xw%z$7f1atmlGLcEgyUcGP zI?onkrn-gpvA-ytRZ+alyu(EC?ra3IHUh~(`KA|KP>D{qS6TDr^v}&1*qT1_UmpMc z$gC#ZMX#-hhP$soFu!c%(%~)>g}blDV1R{H8o7}S6pMghUS#C*_0NCgK105Z#bWXP zZUqcJi_a27f_vmQ(OHSe`i3P&Xjy2#A=Wtumb@b0#!3M9SP3j81dEWqb7-S(_5ATx zquwg{HuTmJV>N)yEK3A1+Fx8z2G~XewnMNimU^8P>SehRU^mMP!Eyw601f!)^9NjY zE%S7)oRz`~R|7VUg)&$ui-YE(*UP}xroq;MV0A38^($7dtcD0|LsmKjYY^CJ2&{Pg z|F5f8R#R5XYA9&MLQylKU>yV-%P43^Q_vow^QF~0G*+jI)hnwDqM!?_8w48=1@9sX z5~TlzzMo#Zva(n?QLq(JC94m5tqxjspqK%r-L^hsRLL4ZlQ9sYgS9cpD5!`k@yG!l z7CQU(X2iF#n?1ihvj1|Vi8Yi}TFhLDfl;i{tT7P01;KWRjsZX0UMY*B8GsP%h{eE5 zl^BSe;bEbWU}uy8bolCDI>E%6&YE4t2IjElve3+h5|?`*c<)&mc#UQNO#$!3VqkFv z1JPqVtYr|q8)abf^JL&Z9%5pxVy&&hz&h4?7OLym2f==bPIf<|4ZJ}!umyqxu^8A^ z!9cV=inRlRgHZ-vf1V8d$8$`qw^{F1VPG$79}8hW0>M!T-hWmG4$};vHpgNyaJ&)& zkqRo-NeGTd894m>82E1mVysiF(^V)q!}^SM76K$7DjzxZtQ1_JDYyvHq5c@I@Ja;* ztZQgqxW@Vdf{)O=&>qbT>@S}u3IDl@jP(`kyDB7n&$`9B4Z$Z6dX3Y!@4)slS8(EqK3v zRto$y1<4THj734P5(SY0Dt0OaUqvZ^&yRxtQbNYA#V$=sSA<3E`s@bmh7h17{C5!C zepUuhmUN;PdCl!G9|tW9P94MMz)|q!0W< z@Dn=m&n{pWvIj%(GX%dt@Q`MqxD)7WD5_0i4`UB!qqHq@`@ci*M=WwiSJb93 zBUvH#I0#V5HKK-5_-~vIWYZFr*75&MqH6bX(f#FxDW&&MDMx_f{ugvCkUgCpjq}+v zqq_W)*5w@bTs8{yQBvwL#EJitE*H?cT*zL;UJSt#hy#enDxGF8t2j!?h}5>QS3(?% z=u(W%us^r0mFo4f4C%4-9AT+6=q)Fu($tOBq+FGyO*WS|Nk!}VfBckM*_rlA2}kyu z?CsG(xhjm~jhzlVuj>YSh3SQZ0DZswQ z{sQ9YbiT+$GkfIUVwM)`Q}iA%biC;)vHl@ezhmF2%IXj7yX<=qmqA<(ab*lvf1+9a znf(jI;~}ny#p>@BtRfiqh)>y%ARav)jDPoUaY_p{x%6n?(?Vs5YE^Hk`33)jt#Sws zs|u?eHiyIELR<}T4a5!Av&s=5RyjhB2;y3Z>tnFWk)oa8ai#k+6xyGmI7kPPng=n7 z3M~H>9}p3WLWgRRr81uu>Yo_@932OJa}Fx!VpsCD95ctlNrbow;%11W>hbFQDkq8N z)WLB=+yZfHEKWTYoN`b_ImgFIhIk?x{~2ifGk^NGSVdxSLYy$oY9+BmNg^Z~?F0T1 zd#%NZt}&kCwmzo;ry<0XAnt&;CkD54Qv zjD>g@;;9g?6@yvyX28{)2^{o#y)=l&s{Q6nuEZ>Qe+Xv^I&p#5K+G1?gYMsPut+BM zHB_%fyMoFx{WGBeXD(-cRZ3suEZ{7JcpZq>g*g4n`D)51IZJ6umvNRuydK0G#4^@Z z6_hd~wLP5IA&!d4k*V_0*QWhDoFbt(8#o(jPAdr|vWqPLps~Kmsk%(y?BML=pk+cj z#4{k?EC#dh(9FKec@N@^A>K3=v-{CoAWC0a#6jgYoP!*+Bxr(+6(Vj0D2x5?a7&AI z5k-Bpy;c_MAF|gEI3HKF*H1W~a!y0M1;krIymd7thn&w*4v2FO;+e77yjZbaj#f1H zkSDtW@m3K#WuY_0|4OO%f2c>~e8KsuDi2?CzM*+&3-NX_c(_gTa0lYCD!w`QDso|* z4allCaDIe%hX@bkr591>#QBBuM^$7GIge;$ogm)1dSqM-A>*RtN0%5H=8}~bCFQHt zuF(PiyoX9@c^a3)jn=9^6>>e~3QMtdk6??G?{Mj}pIo#U>k$i2LIs|RHDb>fi$}vX zRHG}dsT2kl#NhzNGmGHEn@gVn^7Yk483Op5Sk^wIkPX}(7>hN?c#gktN zPZo^_8Q`E;cycP?DPIQ^yjVQ_xzV?x{LLQ}l;Rm&2@m~d6mBuZhs44&tP-B`_`B%E z;u*~yU!8tnDV~x_cqY+!CPRE^EId;y;VBP%hrL)lv$(HRhi6_Xo)MMsETr))g80Z- zc$QY+sR%kpy;wY}xY0_RzuDXRQaocS;n_^%LGK(N8w=0Y>f+CFFBZ>E?w;!O^KK~~ zsuG_4G@b(xhq3S+uE4`R3hr@_a*v}o*rRxQ0*a@Fs9Nwv1qmm)r>X<>Nhzq8DuMcp z26YzVlVX87UkTJj1nMFey)k|=0yU8a<$rOYu5oWv2kNU*P*W;_`i=(mJ;bNR0(GZi zBysN|PB0&qSa^wigHLC+=_6f%>Bq)Qn1?{-QylJ-(SSK=D9@rg-S6C6C}S zAU+F$+KE8P-+f`Acx+zur6o`M2%ex6)SL=XJP88DlR|uMEKu>4Kq(L?1rL2W!Yc^W zE*jLG7Y9nqi&l~U4V1YQ)VxZd=rVGi9pdw2fpS&?h04fzZk`w7uOU#o5vX|XivyL+ z3sqx&ywp-qD1%cLee-J3pwKr_EQ$rHUd5Q=H9(*m@ESpUF#>fEfl7D**{{+i60b3@ zd3B&#mV#PZ2~-;z6k6=YD){GhsHCY*2vjFt7lWbML_X-Mz@St zqAg=yHm^4?2jZ(Bz8d0@FCne2jw9yVfq4CC_<0at6HBN073Upz1qglt4+WI3Blv?6 zd;uzbc=2bqpFZ!vE8&f(%F9UJDBfs@uZQ>sh;OF1(qnUgUUI#Pho=p_o6d_?i#%m9b9i%kuRweY#NUMYTQoDz z@ZAjSB=&dEK3OqT3(RWKF z*#6^rQ{F0GG+gDai4L0`^srgSThBv=u@mAbk-De)N{jzwGFxam5P!R4(eYNruwg{r zyTn7!dYh(0%+LD&V9@O0?TrqaccZMlOS7_%x1WciTa+{23-JU0J1a+NR*pe@Uo2Km zR3rwY^}@UlA^KvR2rKBz7XD!?N&kQBy$5_$MfdofWbfU3?`E^Tu)S{pA))u)1gR20 ziV#Dxfj}B5R7;M%V^^$nUAv-U?}{B1dqo9N5J9o~DDRoM_ikZ#qv4n6|MPw#&+e0C zckawN^PMwiX3oqsEW}$fBMoF%a_Y7?a`MgO>dEEha-2x+_S~K6bn;Fv&iSHFo`Ia_ zrHQEA4~V26Le8_9B>g18WPFAuVF)MV_*{U%ih`*Qc^;(RX- zWwt@iYlMsD0t0i&N!q#J=l+m;7;;{MoL3+xQxttJIlEdqmp&KIuFm~6_jkaXh%VM$ zgK9G1b(XD%L{d;vhGXfmJoenbnDJ!cK`f6NXM>m?#!dCM8l*A&3YS z|58AiT2PC#!s=YHLBD|wTCGuQ)jG)84mmp@=k4?jI^DXQ8n1<2uePYIkb@KEJ2OD8 z#`|pK8*RkXy3`nYB8LCl{cUaJ($)nQDOML!kubbNDw3mE*E2Onr>0hn&lwe2(ij;O zJMy1|kah9)=@knjQ-{@JK>1M`?xOBWHH=2$L&-d-yAkzuSNDLN_aNtkOzP_$KM-5o zTBz;^IpW>{JMN_Vmv>61*JtnCn=pigUL`4&5f^l&GUEQvUa9(wL>B);g$`GbrncrN zg&waSOBMPtQ`jpM?~7`cN;;dCl$7(t|D#&xs!OO^6XU(r^VOwlTzU8ca=rw-qpUf9SWU(R zY8(^n&ZOtc_?}objtSJ&Y8(^nK|MEO`Q7td(`r+9FR>#(E@eA^{fhd?@`)vtcsLKn zhfb@&b9olfdtu~`UEQD-M+iw8S)pF3#u38Tkb~1i-!`uiGD1+}2w`6)jhvOB5gZ|? z&r#zDVLxhQ4QeEen*v*}A4}0l>V|NtkufpxFH%cE;|Uu8)R(C*SK~0?JIKL!%^#W< zpE&<&bp8)z694+R_~K1FYIOd;r=6y%s!fIOo*oC0g5h{-)6z&0Ic>ChfppncOe^cu z(lmCWRyM0|RpYqeN65kGR6J0=nK6Kx>=RYvFe=kI^Xhx!T2bGRP~5M^F#tJeejP%Q zA8k{;`~!bi{jgdb10*$zC)7`>aSVWN*dLHXkDSjqa8^G@H1Is+WIAbHy)8ilFQW!t zR-?a9j+$SI8t~xOs5WdCsptIBW>GY8bPR#*YSH0OQo!5lchv8KA`2ARfHxF2i@=9O z0eE|9rp*%SPvZ(;9C)<0L;X1@@SJ%RU-43#il3jpVMwhYW-ep8*rOI5|0G@PQ}0)Q z3koGDI8e}&=QG2AUjI7v_n^ph-n{z9xGvN`BMd*Q@uF99-aOGpU{{-JBXzDsgdxtt z|MId@dd6UWay^pJPqI_lSF#`J#8wz zyIB@w1o8}dmQ)p3^E%|&Kw$ud5%7k~=9)vEi>LrE3pQowC-Qu86^IjQc|lO%N%N=z z9p1_PAGl}5x>Pidnnug(nAe5sC9g9bS}8i<&?>KMUO`?VC{Q(aP`HR*(oMYngQ>N= zUPNoXLE*@xwSMtg6ZtM-P|zW1Ymc!S8!9UCFxK&T%DmIl$=Q?#RL%lW$Y;*yolWFC2NapkoX@5Tf{X%EKW zHSc)D{J&A59rBw$_9Ab6-sW_I-j)}og7yQ&Kv_`Yx#!&livF1dO+4X6x*-YhF5!Pg z(7!p{BJZKRN7Kpqc-|9K&cUDIWk@Fc)49O(t^9dCyUxTC=`ftjaaqoWKD|up& z_E8phN8X!M&Jmy(Ez9{fk@Fo;jLanG`w4Q&R~;!v{X260-9Z(3pXP~CEk_BuJ8usa z^mtHUjKA20lBkxvZ$L3Nlc3)w2ucs*!0U_@P~ydUy@P6zI(=-;wk04wlf^HEt@X#wq&6Gte*Acr;#(4-_YXVkRi&Wb%tM4kI-r z#9NaOidmUd(m6hc$i~2}?C&&PK|w?C^~US}9~eeyx@&r;s-=&nuLipybPMN!qNLej zl!nCFXwZ%qXHvni_()ns1M)N@L2(M9Lhr+CCH~V%70vM)G4>{jiV2#Dnn|E21w|Ps z7BnyZR3d&6C^7}bYi7j7*UZd5sF|sm4R|U1#kvnr0o|`{Qw4ZZhSH@q)eUtul_T*2 zg$1#zR5bH6^HU)x)s$%>pr`=FB2ZK{uZ0St1^n9LOb}EhoV42)cXIdD)PkatLXiDx zo9e)nqJxqWc@ja>pb_WVld6A(W~F8oC~81~Wvp*ra5C4fX#z#27O_1<$&7Gjg6h5xGC$0(2eP{{p(`*3+hL7t`M@!(vTZYhN;RJ2`gxdH? z^9v|0Lv4&gZK!c2ybT-1F)zt!{?HsrF&Nq`ZMHTC6jy@cDo|Y8tX{NA)Qgq_MW(Q8 zttze;tvdUlR;|T3coKHK9`(}kf;QF5->uVX4O(&jJrN77Rog*}qlPu0xE>TYH7`Dy zf7jyt`wbbe(E1X@51{w~Z3q-MHeIa8>t3_;qjUak`70x(3uA}yYddMXrdEG}wouy* z6t{q4EhsiLFF%<{*Wyh2x=ix-OOSs6%0ECm2o&qF`oBT(`)qAf@l)3srcNtrD5;Cf zKTJC+RsPZ1G1}unu?ZBLL4n7XH?tzG#VDC|S{z4bI?P-(7JziU-6|V=<)`;Wj`*1w1t<%-rsdz;&j=Ppd>c~B^-txMdDsTR{DZ|Uk>LT^Hh|^Hx&2Pk0;(GQd z#*^YYmMkv8-xH7F>m=tkGUY6neE5J@ZFF@pvZ4 z)@ZNSUN0&1MpWpH+M7Y~n9fFwY&oiQfb&04DHcj`Zc3p@yKe)PZr0vT8?yE`5#y%_ z#&>A%)Z&c$)1bil=oeam@%=>WTeQgVv!HlBlh(H;X#Ek?`Xk!MK!M@bdb}kKbzc4- z=zJ^g8+t&}xmYBW9E(KCgD0)cO^KYWUr}AU5C>2dD@z)X>QOb-5iyXmq_(y)LauZj zFaWPXYp5u#s4b~(7?kkmQIYbJ#>$4GNJ9fgI@QNwR<+M-UrJXOuV`PTb+HW;ugZA8 zK@`1Ry8{$2f#Q`+ir&eLXQXpeweO&!-_gDY3KFn=80GR}NJ|^u&y?O=?8Ix8#z=Y= zOY{jX5h>53|CXM2X~mONv|otKzfPFnqy0*|7Zh)RVmm0_O3!?A-TAkqLpuP99hoZQ zP(p|H16IZl+8;sjCRWD(Q24>8v}uQy>dj6YNw($4Lq6@V+W(2@{VuBHZK9GtwSQ@k zfCATQa9sk!rT=Mfrely!9jn7gB;+kqM72(c@6|&l4l2gz)SwWfm2=S4o!qJ?oXWux zG;ln_h5}L|X1q>EI6D`FJtZG|v3l&HmNb@BR+LxZA*a}#)kVr9b&=}Qh__)y zZN!^TGZ-*{ezmxwAyQY;P*XQxK!#l&hO-1SW@q;uJK07%kdgQshiW8bv9ZV zI;&V2A7f?c>^g_e2?}g3pMv6x7F33hREA#{0L5pZ_&fuhx^TQQbRDw~;>lQ@L9vUt z7Ox?mRXzWGTS1E?ohy}8B+?HS5`!$?_$i$@oBrZY@c>#`wLNrw(y6weu0K`nZcyx% zOstMf?CWr1e@`Zr4T}e`>u>|DZiH?WD83>pdl6MuxwuVLR;;U!9erGZRAL`fL3<)^ zO}V$Rx-3#&QH|&CN~#g5OzedIVc*on+hfRp0W!w2xzLT(O-QH4NxI2YjkxG}Kvp9z z5Uke~>862VA1J=fq|1{M@SBCYoTZxs3Jl5C=WHkV;jYbpyQ|WXBFXqA7U}RSwszH${j9a%PzNCPIf`i%nbPb>o!?<&B(_)*N&;ORb z<+@YTY4LR38B~kdt^Oiw@l2w{vq14vCh*P`rs2t;bjyqm&z#Ynue%TwKVz@_GIFOo z`2TA?UaAwLjgIPPuF_pi_4peo{*?8I(MIcaYjilP^*bmsMUd-mQhccRP*UbCsLWe* z>p<}bD)UEFrU}oRZ&N7KdYrnOl-cYRNoBf~mWh;TY_V>Bif2!ZUE-do1ke5dW;Act z-7R8!r`W9@A>H~tx_fo^0h0wxHZU}R{h!Sk=pG_uZv`e(G`sH6cxB+7<_8rux+j34 z(d;@rIKSu^y{i!uMt7Y!Zq&F!vP1JIr>a4$YnD}uz7RPA9*=#mSQ){Az1#yo zqkAEp7PjeLqFPV_BgoLbN<@4O7%o%e-5$TBl^Kr#`{Q+Q0mBn-P51tPDB`=i57UYG zvF;NpVlFTmS;SpL#Lt0IXA*ID{K`(m_#k_QZZ9x-L_~eI?mv`qzwTf<8Nb*4KxNbc zW0Yn5iOBdfFqw|z*ZmfkQE@4fda3Szz!+#Xe*fQzsL#?fX++d3^&Az^3`_?}M7;_{ z)MLF`GE}2p6Ca7=$-cP$uh#=3o{yjX*MBIZSuYJWl5CRRp?6Xl?Z9BPJatI)9wMU` zm`suH`T*m{!}e)cntKy&55Gwt21eYBor9-J{8tu7-&tRft{%JTyHgoGz{pYWda@>= z?+r|*sCRw8II5!4r5^|kje6JT{D)RmKU6<5os6UPW2lTlVC0B*{Wv1y3BY8Ec-K#i z$83o=kLafWLnGexIk?^RKdZ-S`kCouoUNZjW$Xlu9PO^3M`SDpCR4P#e!gOeVu;A9 zc<8M@0t}6I*XQ6o)PE*pg}#c)s2BG+G6m=(=&SWL`dVNLf$0WJ&woDj*EbS1ECr@} zCbP66K7`e;%08%Hr9Tar9_X+|uz%6uC9$Qg=_XX+tY~q0q@PPf%05gnw zE(*NB=%m&lixM@zGBT~Mq`JPgrjDK-^EWgVMd~U_Dq}RgrGGb_$nWbvpdyb1Mvh$9 ze@sM1A8u4ek>fp}B=VOrk#8*4d7H;Pwg+7QmHt3h=gs=P`mgoh==WuJ)PD=iSYXBh zgLZp-(@bC{Y|aYm59$x$`w#lVxDke#2+Yak{}%wWkeCS9xKX2v7S=4ATwS?hTs4kq zBK2gsVI&4XV#~slnDFyak@<}asO~E8Z@9jV+tu-tQ6r9@RI;>U0hzg!zCW?1EK;oN zknqf@jn&ooyb+Z(rHe5U{iva&bn(cVs#>zHhl?UJN-7&8GFpEava>pG(*IBYr~WVf z5d#i*CIK@U80=e41ZL_cLrzx5td0iOfFppSCR>vYm>Iy76H&}^QAaPwwUn|**|>&C z73LX||317DFOn)-LBy>dQ&Tr7vTRC8V|}EIN>r@tj^7(wvNSTTx&kN3Dl1pW&lx#o zI#s~}qL_shmAD{TEv0eG&n}8!+(Sd8OwWow zCjsY;iyf1s^fpgt(45K7z{~@t1ep0vQ+67< z8VXR3Lj55__u28Br_(Y4gFX7mz|6&txSKa&{5@P=Ta$D>NIq*~`lu;g62Ex#65D_Q zB}+>xDv5SGb`n+I%h0=6=R}!?*Oe};SV|S&fR~jmphcKcQc<_w&?jri-+V_Fq@SU` z0o_S-IZnZH&z!c90O{?nW2G--KR_fU1Q5C8R3peAfhm=xbqp#aEz(;rqU6OxGQ1Kj zLyTt}5&sj5Kh`j=Sl99BDv8T7H9}e;RtV)`z2O8R%0K@8$$iU9dd%<9tzWOQ`Q5Mq zu3FWti?`cpUA(J$^y}Hh+r3-Q-lv@=wQR#ALs3@ejoBf?lB2}=%<4UeJJP?pts?OJL`66EOH9p&iN zuSZ;tg@zimx`qnFBEw=srJ>4D4a^c?>VT;SrU95nV3wlUH7vnby`dp1NQ7EO-j)Ni zLKM!6g_uyYAZ9*C)HH}fP_u$2p;%`st*NXmsYUY?=N^q2kvcKu@pUzgwIf#0B*utr z_+rf(Q}~ZcF{7fs0yQ`l%~d=%Vx|%wi=QGC$z>8->*?9l+H(Zd-19Mu_M51dO9?(>`0%y!{5(q1}o^&J_d0!c+ zBWFTrFDbU7o)`qG$+YUFfz15G~-7gfsMHLN#mFl;nzGHgZ*cB|pG ztT||l?=ajss|0(28iMjH`p{{Sx~f@pk!oZ~ePlMh5RsO1HvO0u2AGS0IaeSS_d;MU zejA^7x8WYcy#@@B&fag>f+fMauf!;VhEWyuwUs3+il~vAiK?rbh6|3<8nAG{TtJ?1 z-dmXbLBm6at+OT-72xfPSQKE+pHWd=iHkv^-FU?CC^nUNUqipN!SIOTv8*98Cl!fL z7r*+1;mM;EAu0iLUT=7c*pnnJ#Xdah?{V!dtEnp!AN`!+dC?HWbWBqxRl|D23nUL> zE}Hq4jL$a1%UPY*8PFlUbe-W9U{(_bedq+#O`%J#IHnkh?#+UlI_&+?10w#(xKZ^Y z?r)GDb~`YaHBBwn1!BG3_=<*tap+fKgF;70N?m|$CuUoA8qj%MZ+P4A4lq{$bLIN1 zATbM~Eie;*q@MU+6Cx#xBW1FyCeL4lMXZ-qvD@$!Nw)`>Yu6d}0&^Wns2??BS`mWOKoU?F zMihO2wtIu&Tf+gvcfhOx<`!VqH%*nF^u6JyEXxMN4~D~rAAz|Zm>Yn(af9J!^wWL? z<|g8!-P|;AEn8?B+H2<3()&&BwnNrYcyschhs+>7`Ei;Eb^a} zuQAKWq{-LFW_2`jz^oFZllNOHTsNxW55_RhKyljJ}{es zxfPh(fQbTgJ1}d4N2vld&`Q|5qEk8Vk_%4H~=a z4;gzJ3yi&ueMq1AATUo-#{iAqQ@|WV0IYpSWckE4}3 zsUD?Ap%*wi{v$S(U6o>_Q*)x#VayEF=|4xE4Rh8X>>P5|J9gXGk91 z6cR*OPew4w4o>|%SqRzb58%Q-kyXx=IC+t>rPYf1SUxiD;g$oB)g%IGVn}8mDBt*BehXP6g&+ zU>=LLRpWHytaP}~#x{d4=Od)eJlZsHR;0u^K`ttb;hNbow457U~B~D8DO3T z=D7{VW!MN-0E6=lSn3y=2F@Y2YCLwk=m;gTXB6vXEYg5B9czRRL$&hPi^Y${?3+mT z0L+W%-x$x%(i+b(;*pIVO2y$@(t}8PV73AC-TTJ#jTaa%G+u$=c=Xe@1LtV3r*gKERMu=U2Z z#&y8F3e4-VVV`kz_Eluug9XCr>AACp*Og)XZ%x5MXpbm<0i}3*r_QNJ9KS>^0uQxtOypnVu?KEyhnIFzRXnfRo_eto1;WgKh zIr#r|kxCqeEsYQ#Z6_97%;E{-lhY>^VZE(4K0zL-t!toY=Z!BIUo>trzGQsah_&-BFz*5LJ}@5u^C2)F0rN31I6w7i)c6{4M6l)V zFuqA9iHunBpHaUATQSZ_?MBU#2K^0b(DtI5#=26p{$&xdDHPPxIS=X|J5xVI<2m%4(r9P*j zX2Aj+GK#x-@i}Qqlkgnk1moBsH7^uscw+;)?)Zq*kICG}n3~Embf!hB$(pV4b6|Eg zO%eaF8|OKUdyHR^7cltA7vg)@u^~OU+?9%rF z^EKK!QbO7xMe66tO?g73dO^cNF{7Wet!ta6=vB|lZ2WHglRWMZGnjo9u-U*Imd)T8S_vjx2iml;TJ&b$E$A3_m=FUrAJ(0iESA52w;xkT?A~K{;vu-1Xw5g|PN982LsC8x0 z7-1J1v#x2QXH26Nt4$+q&7u8vLT70jEq077?r5~dI>Fk?#`>=GEvY*+-E6uIyF=40 zrnRPZruC)`rj4derp=~Xfpq}u1l9$t8(0spUSNH|`hg8ZO;NEsG~H#o+jLJ>&~zWL z;xIiA*nD6+0^0?M@+dY$%&CiDjP0NZK3=?&9%U^@eQT+_gGy`TxNKqI~2TaW5=?KbT(eP!AUY!6_20^1AN-WyHd znD%8~W%?G_KEMtn{w+JWX~0Y}AR@CMv*?(J{4`q}Dv9fAqyvnN++!n2S+>KbUrBa9 zntn38IYgV>UTKnO270<=G99O3BFpHE(bSS<;@mj8 zd&!?l%Ug6}635v|AJXKwsyZrCUs_jDivun6knlE%qn}QOI8tfN3Nwp?Su+Fdpmk&* zaWb8K!g;Rxno4Oxp9n2~U1i3*$E3+BGd95?()zMlhvQtc-i)SgD6k`9rrvBe+tLhE z&GxL0W^Db#P!sI%rhzey2Zn(-I+Zi@nM3K)hcP{xfsrKrC>$rpDk?B+)ecIm{D7|J zzFD24<^pq}xtqDWxre!@xtF=O8S5J>`*^?$KPcu(9&oG|^>=a;61a>O0MZjX; zJ{{N@z~bMrU!Mi+>^sb}%(KmN%qN@Yn&+8|&8L`4%=68qz|H}76|iRkdkL^xfZYms z$Z1{~E$oeMWE^9jvjZA83Y_)jjX9nC~eNN6+%09lX zq;_FyHAyLH`kqtjYRLR}QDZHQ5J?8HAn7~By8Pzy#Dz3jmomId%ni5#V6HRQ1B*`P zy!GZr^HN~ZKU~x_Ai>EouacY`T-5e2@4B3fD!Z1EcGGn!l2(rs7=6o2d-v|vx4cL9 zl5UA9o1~PusiT>cJ^S|RR#rN{n_RH7%;%DVoozk`*b-ppuQ#7(J|9?Y8D&iarmd{0 zshU|=Bd!hy#2z^-i}v5r zr_aR4mf~=Cs5IOazjzb*;(6j%>9?fs$`9Hoeont3KZSfn{v1yfBI(J$Yvj){qjL0f z#h%!Fzj-Tmjpi-p2Sh;^16wJIyV3kG8r}2Ej{#dnY&xc^ZW?eBSztlVa9Vp@bhd0rx)zl;xkl?Yx-AG(B=H!$?O zuRj@vY77kBaoK54;}7B!-y|vCGVe6MO;R8t4Zt=^DXz6mTT4?M+_jUW2t4)RC4El8 zAH<{|k)$7+KQVtwk}d;wIj}3lq)+W=n!Ssp82ZrUcb}#|eD})JGp;0@p3Lfx5^;E?(*l`Q+)0MUt?PWzx*@LOABxLxigRdfT}>&*EQ}j9 zxOb2K{lel$Wb$+Rbo^WY(cOBF?%uC^*B<>wbnn`$fA_v!`;Qqtrfa``-NuaS-*aTI zp2K^{HTsMBH&U`+fjwiL`FCKOh@rNQjVu?NEwRe+m1H^5Ulu$Lex3OUu&~aO4eXgT z5t`jtx*|FcG?jE%*g3B1R?v<9*TvgU`bmyvuqZ7&KFh)Zd-ghu0PML*sN0uLmN(!Zjj;x@^LSQj;?>`efF#MSVuSb{pj?hUSOVAR+3A@A+A1(6+OW2Z6rkI-jR)*^c=Mbn4}+$7j(OHT=n)y2BgH&vF#YBj^2MXlL?tRMp_CKaVk<`6=_UYYS z?w2eBEu+zWwhXciwhXZhwG6Wiw~Vliw2T7wN?@-7_G)0!*k23mb-=Cx_IhA%h+4*o z<9Fi@%Xl)KZNb@}8{^a2?9F7DfrE#2qye-~XSZlN+cKLN1oW2iPF>o4STJ~gqoF@e z<=~6Pv*9%1DMZ6^w`+-57Sb`hWdR+t--6T5mPKS1n_ZhSX4hwbDch?WOC24gTb9s4 z`ugUQ$!V5b&Lp_3u&lJKvYcu;&2qZs3`>&*fZYh}CSW%Mdn>TF0UHJOc3|%S_Rgr~ ztQaomQ(P_r_O1k6?vZez_o=qy(lT7GCAeVQyj#ZQ2E;{wSbvDTF!q@A6ZAcf%X-Tu z5toe=mwW$7z29NETV&-f%F6x!B+Ubshe&_;Ag~Xtvup+Sp=A5~xMT_+#9^0gpRtE7 z?;4?_B(%?Ubj+L1G?(`687VKD-={og$DXo0Ev_8Mq&{a2ktmT8%k!2OEH7HNSzfZd zYy|ex+bugRZ(826?6kaXdB^gu;V{Au~ia>SZt&9>%P6;{T|T9sDL%3B4i%9?9cTl1_MtJbQs>P?kaqt#?JTP;?r zwS(1WwObulr`2V3TRm2<)o1lv1J)q04+Hxsu#W?a^LkGM`z)}}1N$PdF9G`su&)98 z2CzGTeGAyPfqfU)_ksNo*pGqz6xdzBegW)mV7~(PYhd>Qi?d{SVl`K$!)~98fZ#RDzNRr3#d4P-;M_1Em3!CQw>H*#VSxP&z^B2BjC2eozKM z83tuXP<94o7f=>}vKuISfU*}T`+%|^C2IS-VlfO0-4%RpHU%7vg@1j-a5fL(K^XG**e8~qIIgZ$U4nB-8#d1l69ta zmUXsuj`d{gT-SV z4c12MQtLA7a_b7~O6w}?sn*l1r(4gkHd(=Xru8iA+17Kc=Yn!MC@%r!22ef-%59+h z0F?Vc`3G=$z-vRzB;C}}p7X&8=-9Z=y!b}jVKsW=0%RpEM!u=pT55oH(><8h0 zpi+a%397E38V0JVpo)NMDX1<4)eWG!6I4%vYCEVt1Jyyu&4OG#fV=?Y^-8iJ){7(y@7Vjad5|KGw_5;x+@S3xD# zWmL-Rg<@UVG3F)WiS^f29^WS2&s>aA-ts|b$#UK;<-M&~SJFm#rzZ-xwNZdyZUv%f zd{F!n`$XM7EMZNOF$Tv0{H8tXtk2s+CnM7n#`ccGcwa^ zYAQcZA7Df=J&-y5g#i*XdocBmMf70ql{-rlk`=tCnJN7zFl{7hMGEuyP zQg)vg>*lnoVx@W0G%k`nU;Sm99ut-*}^ew;$1u4pPwLg2Zfa1H^sW*R;}82b4}A!JMdDr`-^q++9+Gxe$<%kqjkuW zay?M2n|O@5CUtZ8ONuS%V30C7Sgfl&#!OP%W;30tSc0Vfyn|IL1D>_hy0scBnM8Av zZ`i>pWqY`_y>VhE5}MFN3?0V>>MGnhp1v7%@JS{4saSVyt5rf|c?k)#s4tZFC>JfP zh*Xvpi#B?4dHHCJk6wW#`r9uQU~GJ1D-27;{RLO&TCKQ*nWK6x`fJK~w8L>y_P@1~ zHxe5gre@Vm%Ic4{v2O@QGLpTe{QfM~HMFW`n;RgKZ5(vpUvgOnNM*s$+O|6SGI>DJ zVW^m+GP|{BH_i{T-lJetuo@6(Qq+$rgIy@crm?j-!7CmVqAl`c?I@`&e z%uFfs++y8~W6b<$ol_&9c7WJnu9REeu~U^^RM`g|Nsc{9CV9S;r?$1G9ORB8IhzGi zHu_>+d21-LIn$JCkt?O#jsGUfDdX-AOQd3$+s-4D4hm1~c$Z4KT8nklk5TpMsY)|# z*FlOGQ`(N*NTp^*M{Vi3lA_F%j$+*@tty-hSnS4+WS-BFlamO;2A<~;rhqRl3eF&q--&K=U9E4qdNm} zc_H2bALZNJEajNr7QRg;F*it=c50g@MP_I*B9$Com8{;|qBfbOl}4iMdAX{eM( zfh`3!D0>#`X0?W#RG_2@+oLjkMv|*{YtNgC$dR^`VMK(tDv)V#W#40O!%0<|I8+eL zN1Cz1t5T-@+pY~ub5F_s@(wBAfyeIVrM6+({Yx&a986kB&TA_;s*>N4avyx`Q^rZE zmZ{26vmZ*?4Q(5y$YfB4oIjIt9)9fJN0OlUi-=N&{B}$Ejchxd$iAEvN6i#>_(sZi zbg^z~YnqAF5yE#;PRAGP&X98=B>uC(?i4&J0gt4qsxO>aQaZV4W&uV+(?2Av-xZA- zAN#nzY;n?B9o|z|Se(wCJ}eb$+`q9>o4jD!;a4f|@x{7x|09(&;0`_1jCdA*vbXT3 zRJw`B-h*VYH0eEXTaJ|B$=NMX^&NjaUEFj{SuHNNJ&fz)ECrD7BvyStmJ zVd4|S{(4k%x9O!Er?)oku^cnTeAp~f-Y2#8`d`M$C7VOaa@MhX1~I{sX0~E~Om_AZ+IFoo*}Jm!mvW4>4LK{)jtXruOux3ms$7ObyQ6MM|m?2_7kx zqoTF#gS^a;YJkT|SuVzVt7OsJydOy4q9#g3sXF%QrzD3{Zb-Bp$IsTMzh(e_s#JuU zwuoJb&xJG}yI?y>D#eo44quDg?DREovXpUsYqvfzW1;}MTQAAWvXw}=HXgfCiwTz0 zMIrTRI;V0eyJfB2$VA@A)YBN8Rgv~S*eY!GxJ$>j$hO#4X{)kT+iGmJwk0+UmR|wN zm7rV&%2Ppk8YoW(M|vRy}cK5o6Sts%R+lozD#?$WB{WH;N^(H%RswPeSR^5W)_$!Tu2-AA~& z%@(!YZo9*Fr|mA=-L`vd_k!|LP_72$WuUwqlvjZAN>E+}%Bw+nP1JV3#LYvtt+t1e zn@2%;t<24hpu7o`YY8{)n*nQD&drO28{7$Uoy^TEgqv4wui@(rP_6;x_4NIQrYX8; zU|2YroSn9JMRM?vNhIfHf&d;*h~(UoN{;RtU6ahgr?$^Uc6L#A$j-ow3FS03 zJ17%&1}g6*Edtru(r$BF%#K}&?ASR_$~yz?cqR1y0+dfi?S(Qe_FjY*dtXpK72ijy#1m^N zEibgw(sEix5?XLq-qVt$u^*4L*vA_BlNTtTA$yMLdz_X@_7g=~rchd*BlTWHX?Z?{ z7QNrntP=TrxRLiG4A_Wxl=CUS^Nj%k2y73+)wl+zI#+C|?HUE1-N8 zl&^vEbx@*R+z!eeQG2C`i@nyq#I8nMaHHUxa>s=07H<>u(YU>f@n+=z5r?L8QnzHk*uGli=2FVdI|P8sDL3z?a-$B)3|wPhBXV;c<>vk7 zlF4aqu}29vYwhdo>+Kut8||Cyo9(ySu^0LflplfeV^Dqq%1=T087Oyw60PAEQTy#N zGjk6$Gxvk?%LFsCM=~>Cw{z2SZk{CEJO#?#GB?j=?X*+p=MOtNKj{B{(_At+&Bu1Usv&Cs#Qv%MGy5+4=k_n`U)p!uu`ApU z%5On=0F>W>@*pVDtN9+3KY;RZ)V?={%eNF4{P@QNTz-~t`K=w7mgDjV!R3FT#QVbO zVHox!1ee2hHF=S94Tujz-ebLzL+KDGE)G0q7Ax)-tanE)#pTyjTo}Jp^$wlGNUe** zKymrKxny!0n+m^nJ3JQoPf-2^$|JyK0hbM24sZ(Kn5ZKt zU$1KNe#~jDW zj=7F`j$+_6z-fWg0jCGf0Gtsx6L4nWEKx^E43~0>O9gP&1YGPAE_f|)`%ybBJSx{g z?qhW<1+IgP%L;%bHJIs@lS!9`ao*ZhT! zOGH{OrnI=5OC_hd(s2`^M&)!ZmnGP+Z?ZmxZq_UXj}@LOD3n;;lNAoqmDNnZ#i~4-gdm> zc-Qfs<9){mz;y?%2XH-s>jhkI;Q9d97r1`F^^ZC}5^=HDI(9ie$G+%G;08#zD0c!k z7`S1iFTzV^+l@<0jmtrT3tEwZGA@USarqIA3%-CGMEWB79ycz(JLvTh2OR&SxC|ln zeuUyOG!+-+MN-u}87D_^aVjY;BbrMlr^$0#5f`V%sdeg{dZ)o@bef!IrvNlO z3~xc-pTw+hot!z zXQOku$jvg!O)1(7=Spg3%2K&m(WHA$rl845ou5CP==@;6w4k|!a+(XAR}ykAbYA4V z*m;TbQs-*tWzNf;R{)2eEDEp~xJuxvfU5?s2Dn<_mPDObN#tDTTw}K&Iq3A%$>cNw zx0K9BBRMPD4Nc1p&25C7C~);MId>9r?y|i>Uclib=?&sLA*V|+IS)9uisU>*$yr8B z$0O9@EKemT*C8|Tr1Kfk;yg{cS=n4NIn6fbn}nN}oG&|HalYz&&H1|X4d-^}4&Y7& z?lj;|2ks2unt%h~&IIl(;LeUZ-;%g_*ZH3FedGp@MLS34<~-oe2ks)m&Bg89w49r- z2sh}to-1>+54kb!vAscFbRh|EBgF|+T#5_~6S0w(u$@0R@#0dvX3O~_<>mrnIPi)l zeA!{ zx`t3-T!SevcPnT$2beqg`WM$GgV5#<@;#jdx9OO$2ToaO;8F0Nh64HUWpD z>05!j4Y+93H8}>%GztuQK({9VgU6&&VD4=Prscqt5@5=JyF&(M0Rd*Aslc_6bWwMb zE3ojLm>Rhbt6fV(TxuyUcawUrr?}jcii^T0CtL1XCE|kq584;9;GHpTda1Q~u6}X3idjz;gfqN|Kx>)vTT$j79K>LEW z=W)4bLXYNY;GQEr)AQ}Pv>cbU1Q%?oPsq5Ci!5B5T$^2+FnWP|61bp9o+ zt`}S{y0*Dqa=i@PHsD?Y4u5zBxL1LD4Y=2VL&mp9U9U>W%yR8;y@|-+gv<^Z85};n z4cvPKnfKd~X*n{V5oC4&_oj@@mjs#Ju05{ZrcS`U1srM{ujBnWZejMh4v4^fOMxM) z)~qTJd z2rztBbIIg1E8J%hU{<O(Bbujf!hf>ydf2x)eU;Z{W1yny0?h*+)wE-H5wOZQhIF?%R60aEW@ zQ(}Ut#MthXlO1p$5^+HX2#rm+xny#hpFMafSk(QC`&ajG?%&;ixc}$=)BTtG2=E<& z?*x2j;Ew~o3-DcmF95y}_-;{8wup;|^(Z}DR?vecsJm=zdIR4F`2NJ$3~0xt#khFP zh>HjBi|8TY;;|tv9=raK$B9b_JkGnE3_Q9YxP+klC@`#BlCAOhJ$P>`+8R%glG7Iv z@Z?i+`lXT+W_6E99C*5Vx>0sKg_NCv%_Wr6^zjTsc07GO{XG3W13UvggFJ&hLp(!) z9}N5u;PHoHzz+w01n?t)9|ipAsAsrrYCL0zsqu^heoTU?87G;V3GM8(oSo@}of*I% zFS9cX*>P?5%)vo7y0}jPKbDTVcgDs~o>M%fA~5qQFei|Dk5FL7rvj5BFK&Ald8$NQ zDk&}#n@c9+Qtvs9;L_k}^epu(^DOtQ@T~N#@|+6%WZ$T4 zdQOkwau&q}?@gJRfXi$Nm$~h@v>cZ!2rgFwKTF2t8pOr%ImSZZ3xiCEsiE(2TyFBL z6>+(R;xdQS`+ADY$!T!uC|CWhp4&xSq7;{T%_Wo5-0OLi;Bueme$N)q1D*#x4|%qF z9`-x}{3*bf06!o2QsB#gj{si|`~u(?Mm>*-xR|f;JWZCGJkJ4NA>o2|u=2R3NtT-U zns!`Tj>~p}%MRcd$++MZ^BX;H+b$t5;1`qOHhssQ=|;I0Kk|Gk0`mz4rV1AsJ$UyO zx)s%_z;tHhWP3bci@@xqz|=OEOiuHi2XBCndJcLHdA|4j;5qF1(esn%XU{Ld*8yJ- zd;{=}z%K=U8Su-2Ujh8esOLAymHE^2m*+@U(2JKft&&}tCg1`1vj{L}w*%8+V7z$< zj2DMSr%J$h^$3jD;5FjQ4E$-ppHAP;AZwGpBuB<;^ExRvUI*poOtcuL?ZnWq$E9$i z+aw|24S2&88*hkWb53)q)53rG3*iDah!Dy{gZa zonLRMw_L;qJs%u6t!XZ$oLi-LDZ!@7TkWm!)_RwC>%8^e1}|Ee8-TwN_?v*oxq(}N zUkm&?;MW7cA?jTwVq<&Ad#d*|#O4g(H_F&xnp=U#)k@&+Xve1I*jz-g!8W={#%49a z<}%wG&l$mHMGoB}OU&sm9d+BYRe|Yh> zPDJL;<`T+j?(jZHkh#-)m-lY(J>Gl0_j&L4Zt*?<{N2Fc1N^it6s%;TxR=$_Ka8{fRUykCko<_ikUQ_Urm zf%(RJm;kfSyWjh*_kj01??LY&@AuvxfPV&foY6z?_Ico60RBbbw*mhW@GnQbKZ?M3 zfA#+6{T+e%AMmfp9u2mG?ZCf9fZ5p&OpAf>@d%6$XS-gNfbppj7+;?LkWWh{XI>*C zCjNCYCPk0No8-~>Og<|m$7iAB>_7l~HcHN$spR->kQnf}eLl*K&r7*^ySZd?ntWe( zQi|1Izbfd3BogHd0N?8^8We2s_;4yq0%xH3Ni{|hlQzqaGja$L?L zxZq&=dl{GWh?zOxYxbS*!+{9ee{>x2{V=*RZ^*T{+INKr3~t&-_xC4K^H)(|eoh4@ zl&gC|PI$fVCJ`BQe6XH>Yc8RjW`pl8g3LzWCf{b?t-jlQQQz&pJA8Kn{|E5c#^_kh5WddJ|Jy&&+Zz$mB7RsWvvLlKt`2rh!Exny#hUA}z; zm(P7)_`dY*_U-X~<=gA~+V>3zY7nr>H6Um~(1D-_!2p601XI+vKh`1P@fC>6VGzvm z4oR?z9g<*g$ED@C;D-Hmer%f-2^YWO?{M*}{CN}?znbFG0qfnbrMTEqaFOcWZ}eLz zD}FO&#qm$lIQ?N{#qaXF{T{#9@ALcp0e{dR0>K4>8w3vsUJ!gB_(2GO5CkC<_2-MM z_>c2<@psJ%`U^n_ORNZ;K{yVC0%BSU+gWKbEB=9ml|dln%d8AVR{XnVZuHH>XR3C1EgedZodVT!&}- z&l7Pum*O%Mr~UmGkktZVSc;9&=lvolyVQTVXl5>>xQuKrnVjZY|2l%pb^bN}>-{(Q zZ}i{fzuA9_e=P{3K^OzV@gR%^VH^l2fG{3}2_Q_2`qxWlX0!iRQvu>~I|!3xGcy$g zr1dv~%ZzqhT8<0u+h6D33c_R=mq!UMkC_VmkNKYjVG7w^fbYVI#LVzXV{8Aj{ue}U zo~PVQBlcn&H8aywxiP*jGw_;!yT}dhltMFeQgg}VH1GI7Biy{}f6xEE{{#Pr{*U}0 z`#j$jW~BJw3Bm!Xc0s&{2c}=n5f1mCdD<(^vvtL?~blbO_i2_JAYc z47dXB06I3+Ak=_R3&Ii*>OiOmp#g+O5SB&*J`o}BuYqs?y`4ZO5SB>@@o#{z0)$fu zLZ`JO)MA7Jy%C`RdIrlSgaZ8$A?IDVZ5v-?+btqQ-(&N@fnkA>A~Pc>Gb>5GkEYD5 zN?}H?dQ7hR69N-OT+j(ZTuyH;nVhC5FqhymEigSWBXCk+W?)uec3@5bscr%RKsXbG zvp_%}>>Loz1p(cb^P_=zA}+=qfl@Mf3ZRv_K*9xQ^Ms2?dq7++ZO5hMxYQ9`ux(x_ z3oIq|6$n>@a1998f`ETt6AfG+ zW91gg%6bs4PhbV7g(xexw6oH3R_-RO+yerxI@05b0(f50Mnix7A@U-px1wpG?{QWh z2|O;c@)%|1CQ|QDQdVwGVMVVTC*$&5;6)La7bq@kn@c9Ac`fiR!R7V98-eYC9f3Ck zZv}P+-VVG20y3}xgpD9<0%0=ZQu`zOPW2l(`QOmAIu6WC@#SqiVN9e zn=zT3MhF@am!K+`8&n7Lf|{T(;V8IlC#r7lCtX$A#{imVKwtUUKm(u@vHCajDJ z9v>VV92YzxI6gQbI59X0gcm?~5rl0Zyad9_AiM&?t024v!t2rC6pY3oH1ea%n&jp_kz7TvdxGnfn@Z})d z6zoI~fbbm%2SGqn_&o?efN&UuAEUw7Vz|6Xad{hrpAvAvBXFp{`+GYsEyraS!R2!h zaEm_mcZ0hT7aAdhQ8IFb42hG8crpkkvT zLBz%OP)Ot2oD~e|L8X*%!M)fj9=FtBr=(J~f33Ut|M{x;tCb+1`(a?YAxQ4oi=&?nAgnANIRJs2o&4AD-WF<5(G$=GU zG$b@MG%PecG$J$-R9M*>P-#J>0~Nwx0F@C`CQzB9q0zEw37tSpOK2jfEOFDK>L8jH zRr{KC%g06`+|0HvG#gY_nU%T7O0yejLuH`_A}i&T6&tY;w^7rwJH@m}HX>9Ns-<=% zR6|)IYu108W@)I2u(B+)JhURTGPEjmYUs4k>7g?~NOT^_)iVIoc&X`O_Y)j|~g3AM;2SX2q zwuT-KJra5}^jPR|P!)ix5LDej)g4qlK-Cjey+G9)RDGhMCq-OB&xW3J&qvepBB=UG zrbRUnRD;NY6=<1;wByopT;3wM>;zRm*|fZixcE;Gy^k*(bPNVnfBHUvtUcyir+9yKu4TWatKS^^a^gDs(`_K=e!=WETKZSk{ z{Sx{$^c$##gK7k*uwxnps?net1FGXeH5OFkqM<)TXq>acS>f!gU|0dF6C`NxuwNB+ zPm>8WQ`(_vF*IQw(-egJAur*=aJO*xaF1}$aIbLhaG!8r zP!)k{8mOj&Y6hrI0@X}V%>os6taGB_{vt2o!Qmm!yO0+|3&%p_AE=5!bqX$nksnLj zd1*N>6A3SqKs8t9Xa3iS7LA3x> z3qe%@szsn$45~^{Re`EH8eS&*GT~E+FB3-3r$*w2_%cgKD?n}<+PP^tH)La5_+n7i z%G{8RZP_@}MP9&+A$Eqo$9$RaHDP)w+kr4%%7$a4I#Ta9P+aO$aFOf%mhgJf#;l{P zH2#w`w}tN~tVF}NhwljA8NMrgcle(0z2W;nwG33tLA3%@D?zmiRHuUKG*F!msxzYD zEs~Ad8h$wZ2(t1RsG4LOb2g~X0o8egmGj$KX*ny~2rDmv3S?GZMOMPEVW0E{vZBHz zXY7+m&qQp@amhAjXIQ+KHvA5S=3E3IW2~mGuZ+zn;aws&pHXbcA<`LB$!Wd{A0pW7 z4SyZ}CcH1aKm2X@K=`}xK~P-;DkS|9P+bbD)u6fzRF{M53Q%1c4SydqF+WoigO1Nt z2`1(m$;7N_$EL;Dxu>CJ2h z@(q-hYq8$*&D6wPmttb{oP6+RzCGVXamja5T&`~}nVeN1zboRBAIuNshx7CEJLY%F z@0@>Jeiu;P2&$Vvbu*}L0TuR~>p-<0R2x9GF`AFzndF~wM}AL&OMV|vZA!oeX8~xB zbbC84Eyra9!3D<~n`K;Zf7?diMfyYebm|B@zsg;rIaAN)x>cHerrnp40-ZS1V zDyNx|KTBj~CS~Q0f0Cv+zk;xGN`6WH{QT1VviwMXdH#ZYbXx8L)!m@F2UPch3OlI# zLA3=`4}j{yX#S!YD>amrI#4~7zzVKMP*xsqXQkz=oK9FlcW|rB%9+HpEXqF{U+0oF zM->JO;QJ$S({e%n#Ud*hrH0-M*<+pY5NMf|EAp=vS-Fa`^29$$b3^_n!pe>LH|5`) ze@p(_{B`;3^Edo|?7eqDlh^k@{)DCSjDWZ&PO`@nAi*7yAgMqw2_V)Q5h9`pl;N)B zwASw3+C3b#rF&}kuy$M9+S)zrR9kKB9=7#&?tSuvgeBPb=lA`Gci$&X!#(G&*FE># zbI-juZ7U=`1BuT<;&YI=6B3_?#9fg10wkit<)xN1+yNl}q}`czSK0>rH)85#*?M^u z5?>=VLF?u9Uaa&SD;V*;DGklRS7fZB7XKkW+wnh(-GO#3M9zt zMa8NFiWL=4vGQqmcm}9OAy!laRfAN6RYO!mRl`)nRU=fmC$Jw95iwstA})@` zsuI;46?*1y-S#6S{sf6XL*g%x_$ws-28q8z;vX%lQ^QzUK(SH|iFg2s`~$@8ax8?E ze|xdgbF9=7tkgl`Uouu25G(kq(xoY1lPGU|Q|TP?84=~JTCF-m!pd5TmA|pyRT%J% zSoxQdEZs>@YZsIF99rMguup1_4o>WWR~c~$iefy-;E z-Ky7BdsJ_z-c-G%+N*jS*#5w#06PHKfxr#|b}+C*fE^0#uol%m2`)pot3D*B9aWzI zJ3Isz418fn;SMS)8g@)CTzU?dLj*3^dn07H96`8@U!wYf5Lpnhc-ozOwpuN}sOXy| zM^wL2xQr(Kj$7CWm(=!fNsuoPQvIt|P`IcW3YW26v4!BG?xRjdxTyQ8`>7MvteR8v zYC)}3CjmPi*a^T+1U3y=6|ibxHNa|t)wQVm%i2Xfm}nREFktl&+Qk^sE@CfSdJGr! zM1+ePo7@nBi&}Fc?V>iTY0T3RHO4%lb|Giz)tMA7=Js$=jFP*4vU-{Xm#Gvkmaf=j z9;dp1z{RD`QO{K8s@>{S)U(ui>U>}`fXxKf3aky-EMO-AI~mw1z)o#Zd%|#`PqnE_ zfSncr7c{qs(}i{P!lmbMDJO8L0Cu_z7xGja+Ah0Oz8;Pjd7hl7<*0vm|HN?8aiy-^H3kHS>r>m{4iXbCQmv4RobT}NT652$Ih(-AdB zJK;>Uusb^9sQPDV8v2Q1g+wlNs*YrQ{i%s1SouqRO#Qd|AN9ZL;~GYz(BNul5wMlO zE(W#=*d@R&1-2U4Wx&?7XyRn7X!;SXXgFXaA{W?D}p`w0J|30Gk{$O?3pbZdl)YC`4SCI zRC4eFnTE&)JF!~M>79mpJPm2c^CcQo>vHgd1|z=ls1fc$-!Y6Mhm6QBG=AO}o`y6F zH05*}(k!HKIh*u5#yTNf*0;A>ViM%8U!swoFVR#}xR6kXPT6Fh2F)1+E{&Qd&2r5O z%}UKG&1%gW4T9r5V9y5@&6f*-y$INgfxQISOM$(tMYB$Vi{>oN*_!pJT{ZxFd1xkL zuLgD_u-6f|T;B_qp2LMaU!u7Z*egOak%l~9qPa$Mt>&7cIB@YVXd_+;33yFI(wXCC z7^3!zG`DDIxYH30hCAV;MB*1TTPbonh+i1$Pns^{;7*Mc@U6L+8^Rwm` z&99o@G{0;9(EO?SOLGj^`+I}kxLbaiS9(m>QRpYk}z*=i}p_KUD~^~_h|3c-lx4^i*wKy zz@nP?3RqNb-vEo59|ZOgu-~?5Lt)-Sw`(8OVwkt~31IQ5bMg<6-J|b;#rxuc{jnD= zJ%qwt(tfM`PJ38;1lV7I{T0~Xfc+iVKY;xc*uQ{9 zYv%73?GKV_L9F~jRSTy0rxhz4BdHcHwihcs#)=Ma_THq61NPq#R&;$3E1GMPkLnVM zse2_+E$ng9!ZKELf-ae2MVCad!YQ!dbty!(a53#w%jNkYxafxHhEurch7q`Mab2;= zJY#fPgo|#hZk%qsZh~&2E={M>sdXCQ5`gOiTwmb&0hb6I3mgX=51i1V(@Ag{aF5PB z;67%&E*&^!2rltyz$HVx4pj@6(hHZK!(|46iygQm87@v@wd}-`(?}3Mk-&w1w!&qW zu0VoIK7~tv42{FL`Y@cXgSYzRe)sE2B&-xutPJQ5&uO|!f|dEYfNp`VOt(;1uB*@m zb&G%-1l(ZYh5$DdxM9Ez2W|v#BY_*$qFXFmExKhywdm@A8y&(5TDTk<j+udfiq6mm739>Tc5Ath+^bt8SBSvu+D;s3TOssewZ^qXkX} zoE|s>aK;whZDF|FN#Sx2aHa^jh#|OS^und*aCwZt<#FK5GF+ZQxC~v5uOK0jl`}DN z$!9BEcIjS{;PN7c3yDV1y+YxV-X1QA56WG?NB5Qlmp3U~GP`1vdEV1~PT=ys?gQP2 zx{q`p>pszas{2g0A2=IuS-?#KZZdFFfSU^3G~lKKH={-OMHnszC|nSm_+S9}hwMso zju2dOdg0P@xco-o@;h+ZGF<*bxQu;z?YOP^u5=oR`n3KxAWg$s#B&?iv1 zxZ1--IXKkydR8yRcI&a%um@*$#U}F%(39A1{XqR7{b2nN{ZRcd{c!yVJx)4q;7$Q< z7I1mMub$MdS^^1-An@Kf0{RWK_}%mmb4KPhz|E zXbJj4aM6?4?h)^g{CdRu_&jx=3!%^3(W<;N}At z0B!+rWxy?L(a)2$i@uC#7kveAvjfy?Q@RmgB@M7XGaNIpu4 zL|>9+5&3L|%Njks&+>@=3<{S;q~Dtq%_4{u2GA z`pfi}>#xvXslQ5pwSFUTOM$BfZW(Yjz|{hWwk+159=L`UeJHkj>^A*PLsuhKZUqjn z>Yy_bUY*J8 z&`Yu1dK%l!t-yXChOdkqfP@2`V&z%=^O9cKNwKo3J3O!G-zHdjRsWiPxBhkg9{n5o zH}!An_X4*DxV6Bcb-oU`Gl6Rc4uCrgxU*aI?}YWr2UM?o4BYw%y@F7sdZqUUhMsQ{ z=?@aD90Kkf87qeoD_!1Fr~g_1n`E{8O7+UQ*zYHbb<+Q>KQ3YAUy2oS?ZSz84Dkjf zV#SbP=ws+>=x0bYum;Y+8wB7k1nwf>E(Y!r;4TI3GT<%;?h4?pY%wIsSTPJFSTW!t zJL1{}Zes{5y)WJO94m(Lh!w*G;N)u;40xY6Vny=%lL<(6{D<|5!DtXERt#o}6%w{^ zqF49~Hp66!6~iQo74p3O33=>>Sp+ND28Y3Ea2aw8GYz>0w*d{?8-TkJxSN2x8Ms@3 z!+B;CaGQbK(qhPyuwp1Q%pR*mtoVVGpSS0>0e3sO#}ntEmfkt2$8(Tj0l^BIh4SQiVyFuSN8u;ADRtb8u~D%uhH68t1ezKO8uH40r+0OP3>QO_VWk9` z6%;fi*5QOa>kQ`+(41*#Hh|$Q!`X)QhI0%X4CexOH*h$A-V5A)z}*kr1He59+(W=U z++sLi0?ojUhD!{WB4|+aJQA9W@O=R8QQ)2+py|DQ;UpByO$0PJPPd09Bf};HjbZb| zB0|9Jz(cIkCx*GiUM6>ai{WkwE_YG5JceCwxR=_wkGHd3lFxiIIrco6^I?M&;ccK1 z-W<7wp;Jzo=P3h;@HRYcc*gLo;W@)j!}Eq+h8GMk0{0AX&jR-xa65r}9=Kh=y#O5k z{!)wKfX zxQ~Ft2L9v+ejCidj?lY1Qh7(<#YBU(l6f{N?1f30UUa2zXA?R@C|V2{5c5Rp%!Dd1e%mLjWdbiYeduM+lWQd;gI3`eJ^Nw4w_;D zniAl?3(ZT$xd@t3 z1{^x4{{ZgK7UQ}wR?ena*#O*M5m@;rgq7pHSm`-dNSL?rO5l#kSRrBF!#Lx$!#KQ~ z8COW$-{doKQh1SMyvca0gq2$;R{kXu%Rw?3^&Q{YWMtfCY?1WJ9Rw>p(;c4sjE@nl z+;4oq_@MD2BjN6SnjE@2z1AHv-alpp|p8$Lx;QIpK5BS6u5<5YWdRmjRcpkDO{4fVv~6e8-F8kIb!_Y_=EAN@kirN z#-EM97=Hym1^5BL4+MS?@PmOL0{l?mhXFsl#rS&|E`L+F90z_x1YAak;L>{uL(eT; z6N_*$alqpx3ws%XQJU~d@2#e!EI5A*hMnLPBSf#;1Zy4AyE&VvdKJ) zOmzeB1Q|sg?_feEI5An7`$&zut6{1eY5rTu9VIr))CM7SlFHvw6^4gWiL9G^0P=Y`Wca2k<$- z7d6Xoo0#r0Jwh;bx9J|!y{7w2_nRItJ!pE!^f2%7{Ow`~xW1)$BrURyf zrbDK0P2T}u415XjbAT@eelGB*0*_PXX~55KF&&YBFyJ236T>*1i_p%IZ(+bFUEYgU zJ27<2dJWwk8@gr%0>O-n4EYuYGv466H4Wd9B82N^qFm@_7zk$0tfX4PEYN-@w=kHK zsd6cAZ|KIX2z9-Aka-xR*CR%muePbaJm{#c zX{@iU_6C<%HB{Bs%nGiWnr^l(EL&7&vM$Ujw^~f)rr<)eC2L{EBCBbkEod{PXQnT* z1{Y>bY%9cHR_U(5qEs!a3f2=z%gu&NgSn%0p1MZNt$`#mO>A6M7o6HyRvFm{X`x0~ z97sC+|Dq8rCY!j(Twy9JugF|vPG3}(Wj3W-vw~uPFEDzi`*sBaB|>qa#d6{*4F!i)xmNCNq0>} zaAhFL*bSb7rezC*^`1rE+7%7m%%vQMT6JMnEsk_1F zuU#6f!E&W_nbuj>7|f}vZVc8Z?F%HSx;yke$uZ7_b=6f3jV9AOikR5A_=G-*bH*=6 zt%MaT9bZ;ozPJki%Rj!cwru z6?d@Q;NfG&r)i4D*ECgE@8bn!QgZ*40RsmWk1ww-YiO8PTNkV^!~XK4$_OM4Y$TP; zsR~wCcxV>IWz|jidvblS9QBY?F?VBd8MecyU`^S=>R?57Q)6Q-@{l^WwrN9ipCqO^ zra7)TVeb%r=&-p3K0~O~w>HP_9Wip$=($o6YRZ-c=SW|J4J8FWdwqS`s?DQP=M?y) zG9drhaknszB1vRxz~aTP3vr8*MNuo$1RYGsDo(P%|Q9W!y|2Gn?@-^O%LqGNzFM z<~rscW)JfwvzK{?d6#*g`Gh&h9Ads>jxxs-aSBeMR18s!RE$!jDkdn>6*k3G#WckX zg-fwWu~c!9;tpxQB1R$on=ys{9r~AIm#?h4TAnH0=0Y;sPchFj=b7`(1!fQMD}l!~ z)oS3^0KXRaGstN7;%N7qi$bG)9Ubjw0^i&_+IuqEvvIU{caG~F?L_zVj`sgL+U1eH z(2S3aY%`aeE6hRjB6FpAG4N*re>U*zfjC4PDp^<(b9qH!-e?jj^ z@4-kXvwAn}xZZKzJI?@xfWKt3d7T+&>dSz~aM#Gi-ulo& z=i)%pLV2-Q5nR|*sb3acR$ISHUs+#Pw-^_`)M z8LZDMYpN+!m@g_*3i(K8p#-$^ZB8iFYQ*&8Rc1)VCG5W9AcCk<|6aujApC( zV)G^DOU>9EmjizV@K*wV)mHNr<}1xtrQr6-)xd8A9&e{OKo&6rDnjdgcTGcMSxtG6 zn6;;sWA*CG3d?G6O;H;4UvuVHR5g@W*ER$z3ebVjkZdj**Br9D#y#tOmVTAXbBh^| zdUjHt+sxa{x0CW*2mJNG-$2WgJY`LUw1v^q?lt3e7hBBtneR700Q^nB-va!mE#`;J z51StWehcsqg0fFE03Hu@!_9%D;zd=}!ISWDWaqi`#KmE33^p_x(csRns;Dwh?@3*K z?UKk&e{_Hk-dv zpj-dm=5@`JiltU7mTDA8>fccXvzSTd@63k-Nh710q-_&#F&{C1&rCZ}vOrP_E+X49 zcbK(YgCEU5F&gx1%bOMEU(J6Ki2P>$-TVje4*`$$d1Q9XDM0?O$2%e=ZrWwvj&y|DS>#203Sf&Um_HYjfPaF*<;g9Ihs6|eK=V4_ zp8_5)lPd|;ERZx-YOW5NCSuqP?KF|p9>Yj`3ietpF;y4j^ z!Jh^GIp8sX=6T?E0sq1_aiW+eowZS11^kPk#0Q?{$^WN^u*W&jfmK$Avq~y0Vk#CK zT{4ZUQXS~AsH`P!XLLA7?zFav=-cn!%OWaOX!LZ@ zT9TB=)|90b;G7vDL~5~g#i;v|6;s6wF;ldPHZe<_Bu*Bmh*QOB;&gF_Xcx0Zhv*bt zVvaad%oW|@DdH?KPs|q!M2}b~&KA9*PxOmLVzF2v&Jjz+x#FqfJn=Mfz8DY}h-KnJ zv0SVWgW@8wQd}%niA%(#VzszTtPyL)I`MR|UThE>#U^pNxI$bht`b*^Ys9tU8R9ze zOtD!6@htIdalLqsxIsKuJWo7dygSIsHt}}x4zWeNQ@l&OTf9fSSG-TWUwlA(P<%*y zSbRj>F76N?6(18H7oQNH6rU2G7M~HH6`vD#iqDI?#23UD#h1jF#aF~v#n;5$;_Kob z@eT1!@hx$$__p|txKDgnd{2B|{6PFr{7C#*{6zdz{7l?0elC6?ekpz>el30@9uNGgk}dr$DV712ftEp*!ImMGp_XBm;g%7Wk(N=G z(Uw%p7|U48ILmm;1j|HAnnh(%TQnA}MQ71l3>KrsWHDPri^Y;|$*^QvtQMOk%QDF_ z*)qj4)iTX8-7>>sw`5x!7N^B!$+66|bv@Et%S(aFqTB%imejPY1+0{<59dx6JYp?84CN%39a-vj=A;6DKVL*PFG z9u?guz<&z-XTa|V{&V1QZu%1VuYkwUiEn^E0Q^DV4*~xz@VN7M82BT=e-Hc*z@v5d zBk(@~|1% z2ZT33coT%TK-dey+aSCH!afk*1>rpq-Us0W5IzLqBM?3Y;S&%(1>rLg_Ji;_2w#Bk zB?w=E@HGhEfN%hWgCHCN;ad>C1K}_TM?m-5dH??9}xZp;W#K6P%1zf1IpND?_NgP|B?RNElm)2ULa|-g6?WGqVe2> zzWlXo?M|oL@Aeef^8!BSET5cuB~3lBU23l*H=Je-O*6P{8WiL8c>J=Ybu`tucBzUA z3q4-H%NZ!lv-@*A-u$p!pd7>7aunP1+|GbKvIOgC$~1)?y`PPwGCrTnA1JgtW(D%? z1@0V|&mSoA<^>A9t{nFqxkTquE?t<*m7k5pXyx?<+y%(uaTYoJf$X9JXP!%D#oKGJ z5wS9%3|$3wT-OCW1p%iEb94s0E}y5!>u`lDb1~&GhdDY(irHZoUdM5vNJ+Fq0Ln6r@Rt-sV^WkysyNa;}2lX3!HYZ zGmz)b_S(Jf))vGdZ6(Le@_1bV2_tfW@XQ@@j&92t z0ur`ivD;M=E)gEf!_=B~spmNIik#Ty64(Mcm}#KEp5NMN4^YOmwv01f1un1M?;`L< zCU?QifWzYq!~5ZmvvU`mD7zh$aYozh!jK3_2;{o#h)`c3$Lq<*q2y9!8`1nh-w9DsSHatl92nZ>qc@j2|67Drb^n_)o^H=)9X z8~s@-AhoRks((UlM^uBH-}5y2*iMs|c)YWGsFT92{32z@Ix$1QH_KgENV?fM3!4o4 zm&%ee#*4BL9D^0kU|n_XDiULZV;e_6VNPCz0@+PdjfhHR&-1&y1*9%By`CbBHIt@@ zH@ZyfDM9SWN%zvE!#k0hAAzZTG^MJOl!Y#DzS~Fo5&HsB9PWhoDchJRHXL5r?gCdJ z*X_hUcjwz@wx-8uH*Ad5sPs-(VVm2zNWr?o6)9XfcGRy79Nh4f9zui026~+`s>tRmA zqH>aFho~;YG~uWYC6ew65YWgKJxUV~h)V24Xhlrxc%~CG9vYQIE@7eF zpDT;{ji#Frl}?^poj5C#sSgJ+4s2hz_J2|yeH2f4V#V2!v=ojCC+bQE7TliiZXNv? zciXO9WEjblt6Z+*G~LLkJRF|F(m-LZ-RDBpjpHbkHa&)>jqZ1vKo&}8KWZ#+Y{-1X|ib4hLTCMVrhQ1Cr=&}=`2m27A4hPnCmHUc~F0L0;Y5f2*f6d z?t*-~!{eLNIS)n-BG0&}oczUIlmNS-X~Yfjmoi ziwXioXvQH<( z(v%}QNr@JUSB7Z%xGsg_#2*IFM4EC`Cqkp`igYziJXn!eRYSrl*RGY!PgGxI-jvI! zqp2pergD~|)r2#7K8`$hHqPt*(l!=LIvx$dh8x|Er^xFi`ms$pM4EbJL~5M4si`21 zjKWr}n4Uq?rnRO;vtkz7KxmGkX^&3MaR(ou(es znt>!eGHDAcUayjG{vCS6r>>n zI8*y^_LIfr(?kQl(_x5o!ipsg_LPvD--GgTs8#!rG;U^KAL7gYZ|($h^j&{ zO)?@Pi9Z*696{*!c=966kMvTSGy>5cDXB9m6*_ULiVEXCY^dhjec1T{T#LAHHAYMX zxdHI-4Dv*@5+aDU0Tv_N@e669QLQDN<#H9G&FL;C)(PChp-VBJs9vN14Cg5|CMKvy)Bhok0^bzgma~0a@%0Ys3z=duDxyE>f3>H74 zkL8|->f_Zk)zH>T`mjes*orV%)6ZyI)S`lL`*k#)n%l}Pv3m>1$|f%wV`tNJ5mmw_ zh=5sP6u36f#99SeHdj}zru&I&*Ago-&pnq|B#*=EBKUR}TS4-(vQ08Hg%+xHy%%mAoE*TzF!cJC2CG_CT5pKfP%pynWwUjM2 zlFc>8WXs%16GnAgYeGp&Vtqra5L~84 z4W@f2^SH6Oa!#%SbWLHu%I)+aWs6b`C0=Y_?6r1k4JuJB$L-Sn`f+c#=+fTVBwBc$U=^ag!Us9g2ZFr(sb9{*RacvmnS-ztz z4pENLZ8*HHxgE+sOjA#3liDSF4ADtjgsx1qvm>&?StuL5wsbyj^}MG4(4nZXH?Sw7 zexjmuZA#@UMdL2N)wLB_rm*h$m9nZkX6>S(|Db#$+VEkohp>r?NQTxinzSukC_uW% z;9ts>s_<1+*3g-nxKaZ?_e}Io;&}Dvxu~re$|OS}m#2MlX@L9XNjW2qCdJn3AZY!!mqf|g-FZbggUIzBK?P_~ zz{*B_b{UB%K~MAAwP8cSk6MSyA=Y3~c*&75x)Vls0m(4D_6Vz$aE@asQn6%733IJs;{gD&*`lW)}z}j4}B~F+{;A(`vN}P`}E^7#fyuD0>2$mhYM&d zQx1AZ!2$H1J zLS2tu#sXI!Du(dPC0DY7ib^{{Bjx24=Lhoq9+|6>a+yxRMGD|`5j!GewaV;ED7&Q_ z?ARmdJj%y`l#MQhaMVS{GAd!(2_#5^-BXCOu6wRD9aLf$*7~kbSDr-YLkOL zHgsi#H*GQ+C~HPHSpB&;tvY@79MT$Cme$@}PGy{EDAOSra*}q8u~k%#u^VM6D)4%6 ze>czLDGXz3E#*GZIF?$JbZJMeD);Z1R94%O*VNEhyDZgFyQ~h+1=OeJRF_raQX^#a zM9tS{b=V?Z@)zb6p%cBx7bWK$DyJ>ZI+i2*!W>Z&&g-Zqc{sZ?l~v-_2?(mFjD5JG2M(TB@o_AU0 zO3S&{rBufCR7#t{7+vX5i{X5P>aj5Fy3M$WvbLE%I%GwSibD`5phAzE?0M5jn$iIJ zEW=xf8MmHT8ZPi~P~%`gyC~%2c81nW0Ux3ObC7#u3ze4MRpYb@A@b00igpxbY@;H& z?9dMRT27pGs6}a<2|7M=iVC8wjk~FcHUqlDmMyen_y~rMP_J)Tx!gzj+src2{JvZa za>MzmD7<}@@gU`z)K!~FlS?QdN{*e8*6R_C{|FV-M#IY4qn+r`YGn(~F=tNaL+Vi~ zr;`EMfgA}|G6bHW-1d&E6U`m!4@Y5PXtKbmTe1N?-f*KnP33hm-eh@1Lq$kK?}iJf z!w5t2IVz=-uI)sM7oEg%t#(oVl1^(S?IM#6YsvB^8;@vc6-Z8VqB^CRDeAHhFZDt$ z^>AHZqPfiMZZ48*k3>rOsP|l+FhfdSF8ixgY9|T<>)xj9p>_=U4Z~KfEbVnFEwj62 zjFJ|v=$llCt-C_xirS0(9->_3vb;^j%;;2%bioB)?4fr^vskD!xO<3rX$O*bskk=A zLBs%x5+`*uRrOR{8@I;?RMzC~6-|;ASva(V%hTbI!XX(n_3$C(rq<>lF>XbZVE-_eZPAgZLSp7;k-3u~*Z%JGbm1Wht% zu|aY%UV|(@^8%q!93C^@Q(0|PSQoM|P!NMz-C-R4Ncr2~sAGOV^^M5|ATBYN*Bhae zf1#qb;Y;iml<915HvB^+ySrOpX|U5G zJ3S5>KOimI$PzFjNF|e@aytf3*RAZzFT{wSY>!j+AZNz*tc>AC&B5q(YUl#=hb=VjGC3+R=OhHmHS9pB zk_zoPFf-Eweow$6;!eB21F`*2y7I(~>_Ff^D$sEfm8T1a4kQkt65H5xo%eDC!pXX$ zefJEf@=iv75R(eS+0eO{7a;n!1L32n@NN(E$in86cyjC{x@XhA*kh<<*GV)i?qHLc zEf+e9=yqH9KtkqtDzmV=GQ$It2FlXl6EB@lbFeXR$b0du3kimm2SOSZ-|dkV7B6W% zuM5?5L1Z*oriKc1_PD(AMhiv_p^nSNoq2g;%hXemvwJL3Dx)kIx5F`jC!$%x@=a8J zxAk+IHjw3`DdYDLM?hGvh05)=lIcWlfvbe<1IZnhNrkp?`E_fkVYIol)mS9&)n#T; zVJ92`V|g&35riz{iX zRxW!s&BJpNdH7uDHTUEZ@2m@BXk3AOmp|8oc4ox<>Y~!SJy(aZ5YjXlsOt?wAeYMO z_7IC`jgZma9;&mb$TsV(ZlQ`8C34(MW&st`?U5Q;GW1)bYV{Q10$A3v?G@~7D*t4_ zUx>Rs`F48LPwsF(6*j-S9ZtGLvU?Fsp~z|6YL-DuMt;~NZ)Xu_me9=FtSCBf;E2rR z){wnXXli1+VQ3|BU$oC?F3sqap45t(nxy=ag-qRl#3I2lUf`D_=`&BGg1fCHBl@<8 zxMp$lAJ0q{DTLKUIThJv+23_z(>5q7m{ov> zV6fr@EMakrsJN4{mvD!{g#pu2gn8>0d1lo~7mzNCWhlrnDIuaes4Noni|Q}Dl+LXGZ)L+nbVXss*Yw|-jUL~`{>;@B*Gs` z;Zf|GL!ISzZ#a}cbIl2g)K-QQSF>p55i_;e?e!O-nd-zfu3V&bR9qWZTo*+`Cl#8b zB%G!L*JvhCX`SPO7B1X_QDqAIS>=+g?@r0Wvhc(m2K$7oC<8V;q|T+%I`%b?rEA+} z^WydnM%Cj^9Ukwn=au^0VNn-QQJqg+ZAJN7XPSJB0+8!>F%{GKAdhY<$+UDANN3DF zIXM_H?8%YByJd-&QHh;vp|%CH`#og$Jv{yST(bj?aDYJadK`7OftP{q(nPvSr?KlBK5Nh6eTiNmi8H1P@U0otq+2#SOP?$f(BnKq*cs z3c(Lkk)5xvI~GZN)x^j{lSvjUmvILb*tu4T5*T5G(Rz~uxdHsKb!GK971#O7DneXp zSq+9XdU2>kdxli&VVXufFZ?)kQCCD5s~2;nXgcOOPBm%PMi|RaT;<7N%$0W=58us3b|yxsyx+R zQ&znS;{=JPo_uYnYLGS~R;^u2&e%%*FU9Xj^D)K_$^dIGGN5gOb1|7gBBBy9k5HjmCnt2KBkbipO69mtT225>5qdhT zAbcxH=Fe1S!O6+Qjfrd$WGtQ1ZEr&TMunepa>6l=i9~v$FP+X54i6qUkh|&6|I!lq zZgTw%?j_;2X>06A=HFCi2ZKJ0-G~{koi?F;Z}(&LnY<;sx_I4&F`WGe8KXj`l?2pl-o>DczCzSOYU@_`*md1OvgZY zj#oZybekoPc#AmEM)s@0s*soL1!UBdeMUA5I>F(>tYr9=vzOpBEW$j_+t$wTe-< zHhV)i5?c*cqjd8#UN01J$!_#L%yMFj)r!{_Thpx>)=W_L1!X@_CT_9XtXbAcpkzUr z49fl|aVvC3_l(Q8JV#yyei9dlTW8?y$5uNi@fGXvZO~Sy)n(1W+n|+7Pzs>LhZFI- z@c+NAVIOCI?sLUUSEyp-W}Rg%h`vAE>QOul$|Q1sc!$?^cle_$t;kv&b(gob)LOx4 z?zGOeo@$+EJ_%r@!MU1pcw=FGO}#dN$=*OFl}Ic(_>cl29Vh9nJcC&^{X z$;`HA+4Ls7k6E9dDQ4=k>=u*Wo-XEOnXKkamo+<5(itI1L)%G8w>fhx_+4l4-z1eBc(x;m;vh?_aL+=pH zcww|DJ>4Z{L`ph0Bxz(jNqALeM!H!{*Jq2_nfi2Fx?OKGIkAYDS+;bC&1AJ_L`k|R zBx!UzNtT=}Y!~ErTGBJHb}qZ#Znc{AcDp4f+h(!YavV|Zba_b9n0At^*mKTIyG3tx zWMu2po#{4xwpGNtlku8lXI7Ra2lYW@?KXxajcX^#jCU-%oYoAz=*+U})9qPUrW^Ez!tYyu*I#}S$dn9yzhwcaEaOSNZVq)jnQnfZUv=!6TXQd zJU)yeQ`ToXllZ*#1@fm| zpfvSF;;Yu(gzYs@ialX_%lbB9+Y8F{p0K@d{je>Y+#;V^_me+;21;vBBz|o@zzo`C z{RWg-o2&;xIjMQ_Y2-*aUIg!JtjEyNlF-8$az00_zcYhctlwLIupYJkX#L6hv-KD2 zuh!o{IR%tcK{*YS(?K}{lsL;|gVF&?XN&a@M#YS`9<%;!{m1&R^*DoC)73l_pXgQQ zfN~}%b3y3_PJBND-*;&!sjA0UF37tX zN#XRx_^@kPO(VVs6PZ@Nd=_U3>F3Bxh{Hcha&yX-RaLJdZzs|+NI#O>@~g?|)OLly z_hHNH@d=$%mz9;*Hmo$84Cag?`W-J+s#xAwK?|#|CinR0%kh*}6F#>yiT>x}+J?sB zm3SaEGre$repz{TZS7LLgx{R5vxFMj*55V=%?n$KZGdecDDyy>56Xfqw!yX`wxOW( zfU**lbI6ov!v3uD6!Ii&=(WRnbZj}OlnE!O&q!HGi{SPsKAJKZBwxA`D*K2moKVY zzGBTf=^fIyrFTg2h0jo{h8`ou$3GiUe=J1EH{jc$W13@&bIS0PV#V772ML3Rjl|bM z4NHTo8X_JO-8^Jyb6j)$=HVln6Piaf4=gV5<=_jsIA{OX6(4}!i0%wDmDJa zhlkHG(?#^m9^c^QA`Mjj&zRi7_htDVZGG%D ziAhS>TR7Y6>*z^W(#}<=X=-awr)>86Ti^Z zrC(gj>K2zZVCzZ0W8U*lqpccx8@4sWE%WdW%);4$1*r7fcHEY-h5inH#-F6_Y3*W^ zP!SA4YjcHvU*+PeCBo9`Wi_=}JEAyiYsib?c=psgGn@W|*z?tum81Uek16O`R|-h_ z<4kj^3I8#Bl17>gS+>dfef#u!p`o$Kj|W?w z0SR0eXFw5}aam+q-PU+m#K6{uLrXQ2Qm>H(5yrC}N zm*XeMcDo#@4VXwmx%~Oty9|9%_HBJ`VQQ-UYd8O$TwYh-$S{gROmD%5(aQ1rdi-9! zqOp$reiXkCSh$pYkBKAS>#>0NeF*tpDSg+`G}8AOKeji`mw5$rh|AF5JEDM%3Fiadre#dtM7UOple&_1Zk$~T) zFic;rGUEHfi0_Sfc?zaw$V1lkRh5eyQ&r{aRC89AEj2f|0;k7DJ-z9!zJi{hE~{C^ zFjAcf7t^1#Z7Mc$ra3D!Q!g5@`NRL~@{i$EU4J2cE2a2(HtjRTpxv#%weq(9R=b&D zY`}Jmx?}^vZm_BRMM#BsLq?}Qya*j!VR7_AUV~@g?1Z0Y>rwiwW_AG9zIF7h%%6`60Y$}%GQ6G0RaP(^u_=t_Q-A~ zE`?=c=iQ8dQH1*~uU|1kMqbJ20}}4>JN})1Mt#IwivJnYP*s^qes*~Msp!02PQK%q zARqBeBBNvmFhiM9%s4c?^$dBzdNMPEaWSVb9>&jzP}atxOAZFY_R?gL#s9j(L%J4PUw5$9%->XTGNITmObHTq_iP6ucruF;p=c z-?!E(M10|T8oq9wr|>FD6$=!ViW)_eVy)tA#f6G16xS;@DOwZ{C>~Qhr+7v2mf{1& z=ZZs$pA>(^#Kv$j17b$TOpGzc*kbH4vts-)r^QspoF20}W_`>hG1tayj=4K#d(3k& zuf^<(*&p*=%&)ObEE_v0c1)~3))woC^~BDNT@+g%yDs*E*p0E9WABZ9Jocs7w`2Fm z9*+GpE+H-@E;UXcH#sght|+cN?)12IaTmp1A9qLG_PAYfZ^wNecQo$bcs_nayf%JP zygPnQd}aKK_zm$J68}Q{zWA@>e@jS67?hBfU`@zPC{0+BuqNT6gqsrXOL#Wn zt%NTVe(lqz&(J>FK2!U6`jqu)?6aZIb$#yc^Gu(;eZKDVM_;z@=)Pj#oW67W*7QBA z@5a7&_IBu7$N(z>J@k{(NXFX`9hlw@>&Teljj`oNe5qaaWDoIqvBA(c|;SuN{Ba z_zx%an_!!;c)~RkUYhXx#I%Ve6VIKvW8%TIA!+Wk)oFL7eXQbD(^aRdHmlxIC#Y@e zrRtm1Z)##R8JfkK8#HfdW3-vtD(y|$w{-EkEM1Lmv+g}Tr?=~u>+jNkZWv_9Gn{4E zVffxS-ZXlFa zF#YEA_cKy5@-xoO*qQN9rZuxZ^WMxu*74}lywUm|t{e+(7ujCUiqFcnAUreCOnYQ_`jcr)-__<s_DbjLoUc zxhv=B%#4|9W966KQ5S1P*bqO!+6}DD?OhSrWKxE_{8jl*@d%jnEj2{>|N`9$(Mq6OWo=F&7bYR z)c;YDs;H@GXR)$)UU5tD?eZ)y zJuhS4hI#LvmUi08(_WcBY<~6prvl1AS>T}s@e4{8+_~WIGEdp&vR@av7v8w=Xt|^O zn)2@|W>j2NaVR)7ct!BQqN$6nSah&*YUP!chZav?ym9g2Do54zRX;AtU2@Bk-lUutdFHq?*Pr=y^UUTuAQ6_r>t~tHy5g)~&MrCo@%1CuH?RNloSEm` zwL#cWzu~=eC!c%Ed2#1eoww(F%lX%x|L+AA7rc6*>B5Z{{(VvTMXz3LzWCaUk6*Ir zl0BDZUV8Io376Ge_U`4=FTdl8YahLC{B@UI_xJUSuitk=_6_&lIO4|hZ~XnHiktS{JmcnjZy9;Zg}3~5Yt^mq zZ<@Jj`{s$8H*QJTvV6-oTZ^~8berwAmTkkfUAXO^+iPy$e~0&uT`ks@mODq>dFfp- zcQxI0= zkqfpfwy)ZLbjRWy`yVZR^sUEEd2Hw7lOKQN3Bwb&KRM>f8=e~Y)TK`+KE3|w~+(-EI;{!IPZefu-_KlQou z^W9(gzWC_N@-M&ps^P1@zh3_h|INk&qYtzk6c0XmDCf|d-=6yI*WcBBckJ+nBgsc@ z{9g6_!#~XUVfWEFN5B5D{>S4#UG($NpKt#q{g<7;7XJF_Z_9o=_WK2Y4E^JdKW%@$ z^jFDW2ac`yyU*X({-gfq@qcIi`|h0EsE{;2=P6l>3rm(`osl10^- z&2)7WUSL*8tNG1r<{ah{v?4a64Y7^6 zgSn5{&OFV$!t7@DpbhahS`qItAD|s^kolSUOA)I`QVdq4D#oD&k)}{9(iK^XV#OTA zTt%5;kz%o8iJ}^LjPb^l#4Li*?5q$IgqbLJML;?6%lDV(*N-JNBX2M`NFkeKvMy?5?Dwq=89elO`mIN!Fz4 zN!dv=ljbD_h@pjMm~5Y&CH=Sjnbg>i=%vJCxV zpv3WN>c5q~Am0zbLWy0`(9=sUzGeQk}lCR}zC z*_&;R%(VIb+KRGOsb!6+rp!qhV$!#ghjEo+)FvhwJx21LtnCcjndsOiziqNLgK|mp zBq`x`z9exN1BaPj5H5vKEsU0_2=kpBo9&v z(n2I$yN<3wsza(r!gcLvTv?7@i?j~uHl!z!UO{>v=|iNCkv>J*kMsr7S4iI=;aYF> z??`_l9YgvD={UorBIZ(Kk>ZgCAWcQWrCe$Y(rZWu7-mci(nzFHNNGq$hSA{PG_NDQ zi}X3tw@A3o)}Tyn0+JGG1d<*J(`&KrS_@JJk`*ZnX)+S#r!7Fj_R@Nhijd|Yor;9* zqFsQ5z5{I#X(iHyNH-%rjPxARQEXZ)zb+Z6KhkKVbfioq8xpp+ZVJ*gq!~!q#yTfb z4pJ`CX-EO2G9=7LhxzC#k+AJ`)kw8S*!H?6By4}(^+=B+9bp(fww)g9ruQIWKj|+* zx)bSTq5{twmDUq;FhE$~K zNQf1~YNXqcb|9f#!#@mTOhm%;Moe$S`Wvwijf0R>NZ8g!Yy%^(*GPE6Q;ChR{`5UCys`^$v=Wx_TyVI55CkPthjOOUYqrYn)IM!E)R zE7I*qSbo#pNcSS$kMtN4mfiFU65`#o2kA|uy-1%S?MM0?=}V-eNLU{;_Nh4*DIN*? z)Z7mV`_znmWFCPu3JLqvJQis@(nKWeD>K&HjP*AAkg)9L8<4R5%pWs2Eh42LVc&`) zk&s_Rei8XaY!k5n3HwvT{uC>aunojYq&lQCkv1SD!W5Yi(^ zJCLx>BKDt%{U>7n;=4!((S?U~vS2|hh#w2)XPJ%UL&AJ5bCBjDRU@rJ!Zx?8K{^BJ z0;G$PE=9Tm2{B{Yh_nR>%V4<;3ESTCFcRi(!Tc>x{(mIhb(Gfiwg=$fOGu~EGZ>_b zARR+@!!UFVL+20!4BZVwnsh7ODj`T3Xxb9l_S@(}S@BZ%n+54S) z);-=i>}C%~k$chOoZwmz6iZDu%wJ4?#pG8^e#PWhtRSU{pd1y@bFnJOs#t5}QEWZt zEashJ-YK@9gM7z1uJR{lFLpf$irZ`PwD?XIf0fK+#oZRqhaQT*&AXIBKE>rzya~-{ zK`YwOmUeW&u8Mb|8)F!U{)$gRcEuBz&P?Q2{3AYL4)a)m-4*|VE4&DT64@wDW4uvf zAnKH``w}uPVcrtvEn(gg<}L9*e!|=(&hsl5xyc>w@qi~h!y6?767vdjDVd&d++|67 zDVY~plzb20<&uS|MIGErNja31LrFQ5>`Yg>)04rBLLMdMQBocy-B3w4RB{#{AcvB3 zvB#1-Fn`IDoW?9A%~C26dMlNOGStU={v|_DY6R+(`kYm)VI3RT#1_6_TM(2^P6o_V zx(Ib?&s6kP+C7*4ggGo_C2E!aG6*8vO@y2xl9G%Rq#_OJP&eXLGLeOB>y$?3D`q~Ta5UKPjQD43t7T)WE!y=8ANPEmJ$DDu^r#-h;P`3`-}LV!yMxT zr?9_>pZS$bT;VF$xXEqq@_@%Y#Z8u#b=f4yxok>gT-IHdm2cV1$hK@4axME7?xJjd z-lZUgDMm@$OWAT%qzcukh258JKqH#aoK{5Bj*fJ}Etid@5B-Q|FvA$h7{)V+sZ3`U zAMy!vS-@hJ@foXF%LX>{1>4xkZuWA3?>NL!{>P7;;T*qkfg8xM?0p_0$FeVjpqvcL zB_=6yESH)$D1h0^nYo;q%eAC6W+*oiw^7a<<)-02%FX6_5R|u%@)^iVcEZSs?91ol zZRB76Jt`r?^0F&0yYjv1i!92|XCd+^zmyd`_b;WhkQ+5Bs8OL1_E@15WhhH|?6E=& z-ROyXuV6P7<}eRgS6IXnmh&tKD!Q49xp)WjS9Bv4-^YDaEKLOEs6bnMmn!x^?-li4 z@l*6(QSTM?UQzEA?Xu$2AgGiHH(1I1mGoXo@0IjksRVkjr1wgCucY@%&Cq+LF6h6K zH!69fk~b=Oqmnl&d83jyDtV)ld@9MOa#HkMSF-sM*RI!IDMJbM%s;uH9r#Qn| zehz}FiP3A-WTYS!Y0+ENI0iG6;f!PgzBg5;kic|4!TeRtU)B6o?XarvOx5F@z;~dk zxvF}z>VI$k8U)qqGZ6Kwsb5X~YU)>8$!gZJo{ek?g6b*BLQdY`EplV#>SnHP=IUmy zZszKCS6wL8t5Jhm)S*A|3}Ohw7{O>R1wjq-*D!yLG^8T~uacPxR6^Yv>ei@etLlcET`Y%{S3s%@uskD%P-$4Q$4J z)Rbk-i(JN?)T&A(&1p$%qUl5zy3vDJWKm1*wd7uFG-DZ$+-u3bmN#l`7QMZoy>zKce z`RnAPAih6!icpLaw51&#FjE~f)#=W6{KH-D^N`0p;dv0$%}ajX!S9p0g>cJtKVUBN zS%@31`#GzScU^hcm3Lk9*ZqdQ?B^iftn1CX-mL4*y56ko&ALy6pk8y#T~DUzWF7Hu@!pO8i8)Vu*rVV7;K&B14V%7#naJvnBcN_e~IWF-VZmq#p z{tAMI$;rTL*k!}4RH6#is6j32vK+M=s@+iShH5udyP?_*)o!SEL$w>K-SEHKcaUvE z**27Iew(Z9HdsNAR-rDl{pMA<`> z+m4#VQZ}Gwl$udH_?rFbH|huE6?KeTJi=W^x$CHxLC`oqYBpB0vE4Sd+s4I6;B)lb z*qt?YXN~pScrSWwd>AzwpTI5}>$&kW)NGQ7B&gX$pG|xRo2c2O1f`jUJeugYiJDE+ zY@**La%iI0CdWC6{WkdtJvViSO%wA9$9q^hsdM3JenuP8_ng>yeQsiUJ`jUkH8zv-AVK9*jw|X$f3D>o9nsx&-{wI&9CqW z_SyUn_wiPX*Le%~(jqT*+rn;JOvNr+=)J{G?6QU2TbQGTIa=6d3p2FvRts;n_=Su7 z#_vJUG7ag;$ZKRK8-w|T<=AJ-b;!QuChWGQw_5JTJ1y;^rL0<-siobvJjL@MXl1Xh z}>>PD*@t!}is z(dxEUw{0%mSX=els@K+SwJnEU+v>G#ZR*hgy|%T0w$a2e8THz#*LEhev4fbDs2ihh zjJh%E#;6;kZj8Dy>c*%Wqi&44G3v&s8>4QFx-sg;s2ihhjJh%E#;Ds)-FEpXhI;MP zYgYl;wyTNR+tnwMD9qljE$!*ZG}LRSUb_$Zm^nevJ}vK{*Y1 zzK5Mwu#(mM$QjP^Grw>#2s)R=yq&w!9sPASZ)czHyb9mr&gS%OL2Mh_=Y1 zo2gN4!-tXp(Zrig6{6HdmY?FceT5_i|+2N zdndfp-EOh6v13CzIvr@J@0?_v-8IKa335ClE)Qj{{3r92gJhdpXjkA^fN znl8w$M=aj$A-f*FKRw(|k43o09?ShBr6FY9GZR_JMh@O05BYhQ_ozZ$8sMFtjTw%- zdXB-KddjS)%z8fYPtU3qtM6E!jV*-lQ>+WnEjtpeSOnu(KTYcP8AG!3g*FN&@Bbz?WIKp2%;2AH1pl?7T)ae}0 zy@NdB&hRhW5xKZWllCJ8H(M8K-949poM-mpC)@Q?p-U^x3Zfg;29!G1{PJ zKQ;SxM8^HT!S4E9Ma_O{_EWRpJ)ZD92&_5iuV(+Gn7zOI=wBE$`em!Sh{#;Y0c#^Pf+$R%VDe;>PwmutKX2C6ww z&4FqTOo`hVDBFQ*4pehs1m#e3pxFoNbD)|7dlSbY{@^b5KhUlQ%5|U&2EBql2dOzI z9T_N$J_o5es3Mh7b5Jk(pyr?f9OX~+J4nqzY7SC!uzm+8ClzT?bMULkc5qoLpyuGJ z=yR}|gVh{t(SrwaoNLHnu$qI_9HQnBH!#HfL(-5QHHTzE4nxXQ2{ngQ$LvGY9HQos zcm{KVo5*0On;L5WL*+VD21C^xs^(BNhh`=#vK^}CP&J3vpcZNlHTzI~4pnpLFivp` z84Oc%n3}`X943QdG98u?eGXG|SaxJPtP1)Zrsl9Z=yRBw!_*w6xnUzX!#~JixSGS& z9IobY84Q={@Yl$Kn#048?eJ>UM9ty#F#B*dhpRb!I3pRu&pZf%5&9ir|0C>bgk6o0 z!3Z@+s5v5>H+YK@G@vSdfW^^;aLz&$wPkLp#TLbjPLW5ula_(s69pPsYx*NRC!L#j=fBM zoxHq_8dD3Q##FgZtwntzX-rdOFm(*$n7|~i2SI`y6EdTAg4zkqFn5A^6U>{?hdA71 z!Z6fHP$xm11pOw+GhqqK`J7eAAVCHRGDwhR!Y@HEtvs@v)}5a8LhWg4Puqk%r=3%cb4C!v+g3}Su&n2*?Bg)UIDx&+eujBIQ2PV5Kj?&8_+T(Y8Nn!I@xc_P zF_YQMV6d{80RH6z!>5bYSsr`}f#7Dnjryt$m7XR>wC)n}F0f|UOS~Bn| zZsy|(sQt0pAFp6D+u6x(_V68tILiMx$$2htnJYo?Now5cCu)D9_9p`v!(^s1otb>X zTo$mHrL18+o7loHTtw|p)c&*@jc7qDqKTmk-HD|SaSUYyqZ!LuHlX&WYR}2UTfEJ? z6y$wMQigI=q%w7=Pb5(cV z$c5jtbA6ZRsy)~Db#7Cd(-OBd_ZyDzBX&IZEI%WYxxe!#-kp1s2R!B}_B~JSdFGpE zzIkqGULlI`Axl`vYStl}d0%4Z^S;Kr^Y(HG`<`dt^G>4nJoC*r-~2@QeK9{7-H2y6 zvY9^yzq{s7#m?u?!n^Yw;rvA`#huOn9JS}0Z@&5F|HL`$enEL;zn~GaS~9%#jg>L*%rI2#d&bEi}k%YiYCZ!vAbHl zgVU(9_!>93#Xmga3D1LINkAg9qUR-gULv<8a$BP3C2B5FbBUcS(esjM^t$9WvREpE zrAbMSES6?KpG&iloiNH$jhfi?(t5a~rGpuYyqC&*>CfB`f@LApTc+MJ*)B^*X0oB) zve(h;vf`+>Os>oHxU40u8P6o9kiZP|yIj5H`dV&3%VoG+hRgHdK9(1v2x=}biMq?% z(VbZO5XU?gvKaThd_@rWuV96mE8azo6~$0vMQJKhh3dGq73!|g?+X2{(C-TUt{9Jg zSLkS*6Y@H@PYa$uRFKbFPZSov&(2bK26LPIN`h zRsGQGD!r~U|Ef_axXS#i*0T}wuXg9F<+i#Z?tFD)>}0jnB}HTqej-Wv7RsJCVf`dRY_clnp6ya)oV25Zf| zHYI6DPe$@n7^wf0dEtV=>F)LEy_I(61%!*15S&RgWB z40gZHovy1z9qeS?KnA1#b;FV8y7Soidb6$9n=wOOB=%TbXk*x6>eZdPxzJJ{TvSbFm*^H{(lmf#LIyU#6ZZ&7=T+FR7#qV^WG zx2U~E?Ja6=QG1KpTh!j7_7=6bsJ%t)EoyI3dyCpz)ZVg`=RvSFC+|`OHMg35t6aCL zxmC@rYHoF7Tiw`J^KVsitD0N;5Qmyu7qS>Nx2_0+FS4VzFMR%s+SH{1k+^{`TA{}; z)cc|X1F@Sg)c9f*z;F4s82(pXhLhe^OalrsuS}3st^5$XAt)DmHm9B->>w$Eje#t zN88N5O~2bBu%m5N@y<4RY^#Snwlzl<+hnmV2H%HmZfl!^Ddr2xH^X+!Fy(WE;%Xa;4*YEbT+zWyo0m(=~YSNO4tmMF3JG`~S z_icxFc6et;VOr7#x$LmJ9eeqOYv^^yT^{g=7eTNyL=wEU(_1?;;+>t|*_j=^?$ql} zz3!CD&ea^i-goMC=g<7gMXutVoj1A79iH$!@P{8rgggGaAnzlWuV=Fsd;fY5`#8vV z9K$UEbOC zBhPpl1iR(3J24#?&Jv7z^}1KDd-b|kuX|;%SIxa@ z?v?dk8SGVa?;pru?|(Jj#=aWpb6;NuVQ2efyl*5Em`nnC-8YNRvA=z?-KW=m+qjHg z_vv+?TiADz3$iR{;`Zl&HZZb*Xw>avi}p-q2_+Q?sug7cca(+>h0I- z{#)D$f&+DN3kPI+K)8U!L;c8!v<42XFk)2J`=*)(>j^uzGAw4}%2)W@{pggnEUV=^mbTphuzZQ?by>{*&hCuA2^I#IP9(t|BbyJz8eHba*&fZ zQ2U75N7O!|_7Sy@sC`83BWfQ}`-s{{)IOs25w(w~eMIdeY9CSih}uWgKBD$fwU4TO zRPCd0k(+#sLG7bzA65IP+DFwss`gQ}kE(rC?W1ZRRr{#gN7X*6_EEKus(noDV`?8$ z`f@;T+heVJ+9~Dd(iW7Js(&1xSo%zeO%4sk9fw*AoyP*+{ypm<9&)yoRXB` z6V&>jTK_wUK2K!C?oZ^!UQWD=&z~rU&zG<9Cqg(&c&zwq1GE$Nn{hiX^DSJ6(FQ;;nj{+1zhNon4%6Irw4DIPi zXS$)MQ@6Q`o=!bPPp4bpXHLh`8#ABokC{)8KxU`MF@d>kWIJE;4Q}bQ{7(Ok`lt1O z+IRJ|`e!2P$zWu6W(=}FW9~ENJ!9T8A7bBU=CBTR&m80sNBJKod5T%5Y z{WJ}G_-Qt3{q!;a2Eo}^NJBa@@*2J?XXSSGO>&bLcXPHDjc7(oWO%kMZshD#ym8hW zXT5RuBkl&lIknEIb?yz`qA~60N_S$B=ec;ye{L8fk>|N7sCiD!b84R3$!_-Ge$JWy z-1kB7a~|fgk_~KPD_^n;KmW6z|M^?~`}q@`;T*qkAqdX9q4OzmL+532J_E8i-xvEl zzko$7;YTj{#aGjgn<_>CJQuC6`FNa7>YSNJr zd%P_3%N41N952i9vRN;yd-+?;dHFczyll?P=W!R8FJqR=X1VOW%jURjj?0gN;5WVh zmJ9dyTRz^wE`D3UYBsS2clg^jzF{Bk_BVI<+acW2Z|3?+s$cb6xqG-TaBnuE^|)JG~;a-)qp3z6`=${63tKOu$|I zp1=%dF&A_Fz8G)*ewbs}_wO?M{d5rg@h&xKLTjS2zd!Wwh@ zIJwD-8~juMe-@!QrHG&$)u}~Yy!of^(Vz1Aa~Nj$(+q$9#Qh-nD@1ZqVt0S(|F6ts zBaGL16L0)gm3lNJ3c3BI-e2ndHJ0&AWD5TT!L_X9K_1r%QkbHYL7&&;bFB*Uxu(x+ zvbiRkYfZ7&Yh#f0HCbPq#8l*RZ4paY&S$uxYa7{uJzU$yUJmdbKj3?C?E$_A*Pif< zmqBnnHLsEh{a(+Gd9UXtAMc?5>*l{+3K?J5`}NLrqX)g{LqFX8bs1crOajyS2z_67 z|JN7dCa_K3}vZ6WvbEn_D=> zd9HGeo7_g`H)Z~JKw^^O?Z4gH-)V4bf6Msq2DqQU_5AlCe&j4aBa^=`p~&A4gW#4r zw|xHAtGLr!?(|j;-p4K7YD6bwbW6=!6R?Y0c5!P4`#HjCym3q4w=N*_TUYppr$KN# zL=yCS+k3ZT=!V>HPh&0H`I>Lo$6=15@7up{k>8NTZCTuw#qGyI@Q=R#d7b=3(Hy=0 zGn18k!EW}T-+vDBJtwfof6j0Yz5gShe_jN^9ecbZ%RBGz9`d+Tl;YH&F->TS_wMvz zI8!js9dFha?xrU%b?D0whNAvm`QM$09o${a zIyPg*yXxHCg*ora@9qIEaSJ=RC;xl$zbF5DY4FZH`@R>3{O-Mld%b7wdlhL*4@NPD zxh%pv_td{<@AqVP&#v#?#9r>%%e{L%;4$94pPJmr@qQ7CK5WM+t6y|y8JM-{k z+{8mS@lc)*Kf`T2T!Y(qsJDmi_2FUu>*Eejg5Z&PAEhM&uaSkEyh$$dlAjV(pf37( z)RY#qrURYnN)KYu+ave%NMDb>Vh6jB$)o+q-Di)dz=G3Ki2bOH}Tl5J@y@YY=@5vQ5d;C*5Bg=tmGJXco_u$X2kvc zTb1t2#LxV@n`=DeU!LLTpClp)_V&b^Ph|AuZ3vCpD=R9;VI z^t23i`BYC&o70Lm=;`Tb#xW5&JUzf)xR+;HG3T>VG^GV*dDfQpbfPOg=!LnSnd_Ok zo|)^}3}&O|GjlvU$!X5=Gkbd&Q)qXCk7izz7OE2>A4r;x4pQ4nYG-Yx7FYNS%yk0b?CFXt+ zO*=Z$g>Ll3>@TLW8n^bsdoMFn3ZHv9l({V9Ggh&Nt?a`0K`2PdYlM@NH^{~N6sHssRHO>ksY!j>FpZB{$7X)uB-gne_$%0`AIgt9 zq4Lxqisp2rFLCr^08>ymG?NcdKQxD>Y`{CAFWAOTcC(lL{Er{;cm6}?xXdl?aGys( zD3QM!o+u6Jd6mrMp$KM9WadPAO=R9g4QWIZ^qZ&?UFktD;#q{=5-sO5R0u$yn>aiW(!}kouB!YOI+b9 z*SLv2B)%JjlGsI(l$bq<*^`((iP@99&O5xv`xK=FrIAAt{Uxb`ohR|P_><@@Nf){k zOCLs(zzk;d5ev{~lC{`dlFfX>J`VCd|3lwN^qoZCN&eu!UhOK0T_t%Egp%qpsSK0q zDXE^4mPLL^<(E``N%fahe@XS1RDVg`R8svV?M4sum{gBR`w`C|hBBPF$S&MUHidP3Ov!SS zm$xZ^`I7mLB&$SKYEhR4m@QchGnvC@$TgY%lIbs*{*vwF0N-(lqsTa!K9ikCzRCUx zLdlbpiJZKNK9c9-9qd1OaY_+EIpm$Z4MSMKm&hUcxBP%SlFK9c3A~Z~E)S4Fav3C- zK?>iy6y{HnmJIm4kiu?L$RUMyQ@Fnr@8kUxW$JNBBQ5B8cu zUnzz&k}-^9I-jtduh_vZ_MrC^dQYME6namg_Y^Wpq4yMja-F}CRSLUI@sNLchC4|a zA}exAslSvhNMIp$kn$*hA%j$@Nk>L9;d7~SAp2CZPbK?QvQH(0RPSNdR5hqgJsJ{) z*;9EZRcqSPo=$XOF2~S!YPC}Pxzv*}Uz%jNr!+%Z!Di%WldB9_y@*)VO3z3-AWFjj$$jO`J;(bcvcS*Vm z*kQVA_#Kii5;LVUQ#v`OGgrC}bf+J~7|$f8;?B~|;sfR*<8&)o!+JKcg|CrwI(ted z<8(jsD}MK-GfTQZxW%I&EGaOiV%T&N$*b5+eLbP zr`LCSeW%xVdOJwpgI?H0`u@Z-7Bi$bLwYl$mtlrPBqceiNK1O&p(JG}M@6bo4R@G9 zy$tGQn1GwhkbpgBkV%GxEM^&gUuBek#)1^480uzJH={jdY)(5m;-)ipV+eB1_%U;k zZ^lJI=+*4xq5yShg!x{b$cOmZSN-g(|NZQ8K4&#++0IUOvo{F6R*Cw^?=|_oCcoFt zaD|8b%QIdEp-eK$B%@3+$|R#qGRl;J+~mVvGQErMaV9sGsVF5VgzkJx&*t*YM!jCFiTc@%4$zp?J4U4zT*eZa2_*dy^NW% znknl|{;U5y2xUu2I?R;KcPLwS!twpd_7>*KRv!D$R+SpaKU-Z|(28i`Q-*%z^t704mGTG`jLiLKaK_8r(+_C4(9Tg;kWX4#K( zlGB{U?Agtp-R#+a=TENlH~(;thy07%&Hge7<#4+>>^O(p&5??4Yv6mC!9 z_7rYU;r0}6PvQ0yZcpL%6mC!9_7rYU;r0}6PvQ0yZcpL%6mC!9_7rYU;r0}6PvQ0y zZcpL%6mC!9_7rYU;r0}6PvQ0yZcpL%6mC!9_7rYU;r0}6PvQ0yZcpL%6mC!9_7rYU z;r0}6PvQ0yJ{`LWU%+CP1)-dYNl!*Hkrj1v+DA^G&FQl_eKzM+4)5_kAL8ELGSge1u__4V%1kcu;OBF_i+Z`#%cWi}^>V3~+dgxf zKlf|cVQxFj-3K}59?2NSa}o38zQrBx2cbOX&(no&^u&$lIfa|ba|Jo%kwael%^QiG z=C#wjcA9q!d)UW8z7InA@=_Exl20D_+(^DpS;6P5W?c}ZzcgEjWVF$i1Nb6x3J2dprz6h1^^rw^_(Mh3u+OcMftAyDH>n z3;i5~-mi6_Vo)%ce!1Wydjr$s}+U_f+-)k9it|%Eb^%Z{irh|M-=Q$hMr!%A2XYtjf!( zysXO0s{CfYVK1^MZ_Wy}Xi9V3UguI#1LRTH%ym1`h3>@Sp6d=`JX4s)Og`dM?7Z#* z*0O=G*^4{&_hCbIk8m7!R@Z!W%~SWEAXG0guVByhQj-q7*ULm!a*&h46vKDBUMb2@ zj*3)4uJvkSmU{ZGH-Xi7x8B_#RR1-6u6{G(aeMX0V4nIDF-!e9%x4ixS;6P5Vl&@h zp8Dpge+cu`H&1=HSl_R@LLB590%8??j@8uTHK{+OY`V1_Z0(Tu~~4VJMF{WSD$!-6!#=Nf*1SsLzS zH+Ix;KXPhlj)rG(uMID7nJfIm1I*O$X%LDuQ>2+9UqSuIEMy}u@8Z2k`--%y$kLR> ztwp-ANV7zmCDJUB{V+$QIU>ywX^u!ciL{f*Nz7v*i?NT$<=980y+*FXokf}@ax1Imv~Y{H@whl$oN; z6jcoMqwFinzM`67rl>Z=(21_}z?@O$iki%P7NMW06|7_p>)C`EqQ1giMIFU$MV;VB z&Tx)jxPZMx*-K-4X#6@=@NVO&$fdE*HI_vavoy&{4$RZ!4b0M{2*oKy1m&qnEt=Ab zXxh=4ZuF!V!x_aiX7drBvVg@b!+cH5(?sq~PT{-JeIh@>PV z1*u3&23{jGZmg+Un(Di$??uz0c(>_({s=eKapjF-lO1GL*wEnpdG3ZmfB2x-fy&c(?i8Ak;!GEqtzpELxbQ zh3`*`F_@>tM9k7+4sNf7+iT(WTCCu6wz3^F`TMz{7G`Q;rWS`#zr}eja04^7xW_}D z@*?mbX@@ymnyaN7Y*_?1)lxq#BPdTLs!{_pw5&%A9q2?Cy3v!~#L=ID4CZ6L;2hp< z^(Jy@<#VlM(aJ3Tc5cYu&JDFPPpdC6ORMiW%rSfyTAktySNIDvwYr6wTA8WUzo_3j zC27cxnOeU^9^TY2$m;#`ma=dD{GeS=v0}3D1L&f6F=)otUI#BnxJW z4#!N_`q8DaujrcCPqg=IY_R`KC+EtOb?HkjKmb4*;_VlJdW@CENKLbGA2E z`=9xnfB3JThy2SkUIw8Ki7-QlQrq3v%h`a~);T z(JUSPKIrK8K}Yj+?2B1Cj>Y%A<75(;!7LWC3^R3Hg_$~ml( z;4f}q&W`5ll!7pP?>p(IQy%j3E^ez+Va(8}B(F6F?{-dw zTsr$)XIXSMOK0Ds&b~*T&C_`?X6d{c-}lbj*vW48@B?Q!&jl`Xm20@a&bN3Tg#4o_ zp)U5+B^|Gkh3uHGi}|{kuZul(DM1zV-$nmj^xvf|?de2UdeDo$jKe*3naotCF_RDY z7_)RSOP2-g;2iqt>fNr@=z`C6U5#0~p2U8-p2d#3Ucnq)Z*v#lp{|d45`?-XCOw(R zN)Fy27kRO-ZuZly3^k~W9d&C&Gg{IH^K~;%x1mgD7H+cJC(K3f-Rz;;GTc_TRea4i z>}5X(`JTfZ* zdc02&BB)6{8sgr1G^Z7Atw#*KiK9QGnSdSj@O|lFz8>c5VZI)7SjiXYzlZ*N=)cDa zPVo~z^DCFQ!bAS$DbINsgnGKIo=HiLS$dkKr(5e;fI8@>r+0gPg&XMUbFsc(v1W;_ ziv7ga#*Si}V2;>!bi|FscBd!y6g!krjKy5B?kCpXV%3jzcd<)Z!DhS{yMtZq!=7Tz z8G8tQ#9qZLvCl9^FLU%VM=x{qN<~^S@EUf}>mAJ0t04B#t0=xRy-H)2UgfDs8-}qM z@AmpD2=z{h&-J#q-e&1NfI*n2_i)V8dj_-lh)sDGxfHs-e&4;rrvu{zqft$ zwy)loF;nkr+~f}Td4xIpn5$1F^7AhG=~I|ul%x#hFhidz_&w041+8d9TiVl!u5>3B z`|Xp!8jj=LzFCkM=*9CLLnIo+kOR+fjcr^{+#HqOi06cGlmV z{ms>XAXAuze)@mF$IM|qi!ej~6>MWCyZ8os>3;xw>3@hL*l+(6*u#J{6vn#)1|ydN zJ~u!X1I!Zt3Mnv8d|J#B{|33p%i9#7An#L}>X;|qJn@m3C*C~qt+BUwdx{^zNX9T8 z^TnGl-hA=)6u*S^=s#Zn@%oR~fBaGY$B&%h9KUdzyVyniLmu;#7lHq9ZW3dbfyv23 zRl4Hcfg3rA&kge38dQvO_zn%SpF!0y%b;eoqzy52pcC$IP=Dk%Xc*=iG>(a=KPUmY z4qAxs*C6i=+QOIE)u7#&bI^YDG3X*@8T0^i3^Klm%&XLz#P0g_;L^$k{F*GVrN6lGNc!MG0%{A%rayWQ<=^zKICK6 z8RG7S_NIb>}kj~ZgGeE{L3?52L1!oNl!TMQ=Eh@cWc8_krguyx2xfHH9SA>QV??vH`nmGw52`z z8Qzs1*vD}D7~UT<4EMbm?t3zPCbRhvyBI!)`7B}y%lVA`{1${pyn=T})JHBOd~Sp+ zMwn&9c`jg{5mzwF2)8%F?Tv7IBi!D|5Q#}jT5@2Xk>(kh7xRoX&&a~q+emvFS&bSr zrUk7rVJ$v4>UIzsZI;nl$c`P2ejPcDHpl2LEM^)#mFawdJ&m@f(dHa&uF+p{h@BtL{gHIinN$v+-v0H z9STs8_bEyVN)thOD$<5wEXKRz{t80l-;7S;qT4Fn$o`89yAejGuw;(fE(} zlzA**5o_7RR?Id2YraAK@dvQ4@%AQ=mFr9Urz`GN(5rNN59D!LTe#R=y zGjTm;nYf4je2eeX#3LNzCw}J|H}M^rc%Mf+!QT9>?$D$(_|8mvowvw?`6iiflKCbT zp%V4c|0MlS(*Gp=Pl}}v{fK8Ub~ni`CfUWL5BV7Tm}DQ57P5q8m}SyR+|?v~PIfnw zy*s%faroTiFF3`oT*7`P|G_QHG1(lGp9i5S0f|Y9I#W`Tg)q!D#avU|;1ul;%0=v9Y7Q#k-Ki5urz71BA{`%YC$kXXhto_VZ9mLcY9i1{3%C%!X0G(?UeatzU%A$l|95)YAS$g{xz>j`1>WvIRk zm1SrI>B)#b3^i9n-DjwChpy&C5Q?@gTHm5&iLSzj)Swm(kt14vqV*^GD>~4Tp7cSc zXmyO1DO#rJ80;TC4RaT5?xM|BwDY3ZvVkpZN6u)qkN)o-ey>Xvm&K-6&2n~WB6#|Fo(k@G8ywSd^x|dj*XbX;XBxkz75x>;b*wc9q#dfr$J~$KoaB|Abe<8~#?`V|S8)f!Jo4wJ=NI@#Hl9N2hHM#(=VgJ#E(XY|^ zHM%@{H2Py2@EOg}v(aDhC0*%@ETiKY&m^WI$7nf5&tn0L*o;i0cd!e68Lcm)^<}gy zqmQ7!qfhcE2#t9W_Zj2dG5wi^bz}4`R+iX|WFb2_$cG%U`V*@^vBfD#X{t~inPSy3 zR;E~)Vw+(9SaTO^?qc;QR;Jhi{7f`@7OQ8ma>mLPyO=F($9-b=@+Sv4%rRt$J;Po8 z>?rmnnV-_K%-{Ig3v~rub#7W-S}|9l7F9ahrd*&wuxM8id9MBq2Ge zkYQ|IUdDSFYqrL|%Ig&79g6ZUvW%_Icf{e`vFbHWUB+2At`f40>p&+u(*;?^4dfSw zGMtf&W+L-g$P$+G8|&D}CiZcVbNq!_8s{@$+#T+rPvhhpFVFa_yv7@tsqsZ9j=PV4 zk0|tGync)~PvbwMF->VsD_YZ*c6^O2oX~He+KQTm7G9c4LvotXmk?7OJg2*{hu8HbC zu_0z^qWes2fj&$$Qxm_U12Rn1kBI~LnZXQY7%}L@#5l%c#wJc;4aa#NgeEz6QWex? zl68~RVv;PAyq`(l&m?&!oj{gJH!ypX%-$rkH|Y^ig3#n-WF#9o$j!^Vf|;9Kh*FfH z8a1iI$9zg-njzn0c_yp-EX(XXlcHPy^bHFHzV+|)L7qbJUsI)o97A{N=E$~INDsnhXZrfy(Ahd9a!PGhd7 zUgR=Y(UWN*l9HU1q$Yy&$U7|y+0mP6?mX=i{)cm?{f_L@t($K4rdOsGb&+R!17w+Q zKBl*)Bj3^mnWp#SXJnc_44J0OG<_`gpRPyK7w{W0P1mRCTQOtP_wpxlPM2%?%^)-* zOfuYOMjFzR0lk=!4H;(W$&9xtN^we1iZZ-Uc`9PAXPCDcdN89ub8zmA+d*iiy3Dk0 zrdrID#dp7lX7)jznFEkzrgt-Q91}4oGp93?C9FiIndWb%OfzMgxdZ#pJjP#KL#CN` zxX&Y=@;nI5l518@3iA%;X_ouUDot5Fz+BC$j103H(~K6Ft65*rhIV{SCpsg`tQZz? z5a-TTui5G{+q&65A`tdeFd3j%QX8Q_MelS zRAfb_IeCbr0I%@|a?X)!&WAL?OwDnhIjw1n*_zXlZ;`=w(ud{@CYs^IV7BJOGL{KU zVk-JFXCr5V(A=arcW!mmWv+E|)ncwJbG@UvCy;0ES!9`emw$Q46P^d5c_GqbM&`*h z??q&qC)2$A*neJeN>T}#=GCA!^=U{WQFe%=eDwr$L_i>5*mr%e=y?yiQ@> zrYzphe3|A~MW*>O&98_3=YP&ObVa85J?TR~2J$m<&7Z+ae#85i?>_T4W47k+#B9w^ zM27j7_?xR-$862N!#y70&CGv_EDLh+9?fv>0`*#;E(@$ncmY{_-+jpU-G>sqql7ZZ zl2DU6d`tsAqcQeL(4PdE627AwG9~oJJ4ui$VI(po=vBgO=ChC`$e18wf{Y0p_=6M3 zkRU^X3<)wMJmy&tS{NcJDM(FjUP3<>=Eqzue2q7Fi+7M`;k)R;!fzRaa~GZpLW=^d zTU3FTwBu{!S=1R>7WHQkgNbGYGA){nJ}r`I(L7{YB-5hh*ng2;Ez+w+hmmQ~Y0mK% zS5WgsaxRi^7lty77)G&( zME(gv%bdHc4C=DXx@BsyOqOM4e%Ws1S@tKgEIW_4w9H#tc8#0d=2;M0o&=eer$VOX zGA+-H{g=N&5lSG_^0Jht5>@#SxqR1uXn7BM;(aW4pXL2ATfW~vwA^ehAAt(8ndag8MD`i^QmaqAS@92tLEA?aL3}$1dR=Us1 zMJ&Z^tz6AoWLUYMLmWXbR-V9Ytvts?%+|^)$g)ZgR=rAfoV!ZBR;kM>>sCDsLaSw2 z?H#T5j#d}sHDp=+9#NE|B2}oyCp1E))h&=|wM?tqWB=7Z@FV7IwM?r=6UPK5GYvUc z%jLHOLaPtpeXMq$)h9WF*;;*xzmZ|J+4?O^GE$HV@8!3&WFRwHc@cg2tt1Wj9_RkH z33XXx-5Rx6Bg-1^XpMKYMxHedk!8(Sbf6QR=}LF{5Y0%&5YI%WFrAq!<9D{P6SK5t z9|t*td~4)c^KTGZ>mF-gz)Y>pNEWi=?rZZ9iGHm0M%I?bn_R0GYd@d@m8r%@)I^rG z?!9&hW`C`7*FFeB>vCY-x+Zu>>-sYY?`NI&)Idv$t+O39Mlwn~`hX zZvMdj>-24%KCM&Nb$7VWBc2AK^?J2F87WDPzN{}mDP&pyKIN%IRpeMN$9ivN{l|QX zUaW7=*XYN3{aCLb>wBQD>w96&*6Z(j_grsoHaK^~t9*!c8)V$@D|)kGCBLzjt;n%K zjt%;=L4P(J=OmZ7i~4PN%(Ec0F$u}hw~c8~*NwR;#9I`hIC{0QEc&!jzK!y1Y|1x$ zM>qb*54iirz6{`J^lqbGY@CXj+Bg&a*r*>H7qEyWEJv1&?!ED!AoP27ocnuoe!{xn zw{U^$+(Mq;?;*>k6zIvO2-1^@EWAuXWZLv5GHsG+Q%UT<$-Hg)ght4;sRgZRi#}~q z?@e-T`h^KhW*Y9ZX%70Z$xLlp%ra!yw2QqYq8FRY)TYB6<0L-QHl0J3%^_Z*BF^2c zUYpfrvvr$q2ca#pY%ynBa*-ErXp1acit;XIZ;RR6V)nL_<3k$Im}a!Z+->=a4s@g! z`m|*zF^nb-`L@WnMZPUFSjtA+e~bHXasMsuzvT?)xy0XG<7N=r8piwBsux>RVWzgG zB?FnsiY!}mqW)XmbL;mwck3oD2BB@%Z8PiJs!*GH=+Cx>v_Ot+a%}5FXS&jz{``VW z+lC|4Hkr1K!~Wa!X`4Q6^QN}Rv~4rn*v%iP_cl4V$+hiP5Za!E1aPBVk+NCbLtlQNWS$6px z*k#^#En*3>?ApS1yrW&-(XKz)&lxTv)2^$?v`eO4|6>2$DNxVdW^A`iyYrHtf)wHn zd2HR zQ(^<`pV)>j{12HDf22Qy7|c-QN}R(Q*7G~=lenE-=tH8JN<4rJiC4JJP4ptsOeLDB z#D_fLSrGa&ge-sR!JqHb3g`Z*UVo~~pVsY5k1YGVpMBa|~84p?`f46^u*iO>P>=fGFAN0tM< z=tDmS@(V+VXCg8kn2t;bWIB+5{SRzl6XxuIOb3o|oHLx~5^^4p>tIr{;e8x*pMx)v z53_afHQqpmgJ$bsC93iv)$v{q*5P9s@F|VamxJFkmUTGyP;%7ekadUD;*czdyrVn5o0=bGR0DsgKz@+z1&Cx8OUv(Sz^#fgkD100uFbq0D6m*Mraz=N>7Jx*W0Y zh*}(x<%oB5WDD{f*@-MiPH>uYT;wuWxR1AUM5d!*WI8I-(FpACcQZmqBPonbN8hCs zQIw-1avqiIXiK`_eH?Y4qrK=uKg`zAUy$MGaHcVn+05lv5?IVKRIgr6IeIP)fNQ-ore ztuv)4!~1wMXDTAgnO6M7Oq_d0z0Ru3S?kW$Lzc7N(OK{4tao&_FS48+O&sHx$P}ir zkY&hp_BUiYE7RGn*#GQd)bp$vJ1f)KoBYFl9`Pgyos;XFew=%q!kDRZ?sKjLr7>IQ zKA-|Jocolc^D>>kgZ(cgAvxykf=m~3l81a0;5FpDAlHQ|e1`XN z!F?{YqBUmgLVG$Q!v(W-VGx5E$}qf_3!{i-EaRDkzFb(x$slwwgmW)eLtQRfcTp`a z%5u>=y67EUl;`3pWVv{YyZp;Tp71OPT}p!)xg^u2tjKgprc067|56c(Qy!TveMk-J zQlEy%c}cEIUHKU^b;*4$#W0#U%+{re$Z%;oD_G4M*0F(2Y-I<#*h?bUgV0|u@HWo< zt2^rQmvw)s#b2^q_Ky5UN$9dXmm`qna$a8M6<+0a-sCMxQVDr3%X7Il@?4hZawGKZ zvOZnz$T#$&F9VSAay0sMS)VSCVFruY!gk#Mvio2DlLH*)818%d40>_-Umoy?|1vxe zLVt%zMha3R_usEk75DkuxqmO^5Y}CJ5m~O3qau2Ar5fsVMUE>?X~E}wNn7l5r3W%y z=|ewcx-tZPyCT<>$xLG=OIXQosQDFrx}r~4b|B{!xvu=hfA@JBgsui8Avvj#;c7ZE zk_ElEsux%F;;LR;eTQQBOt@N_GQ5vWSKa^W4@|+iSN{$|*V16!wVHIGEAm|HiA>i9 zGMtg<&9!*OGm&{LM5b%Yk?ERD*EVARYx_9JIb^zah3nkm9{P1n&g*hr&&q4Of%{x9 zLUHut`g=qn!*zYR-hj_&OjDZEiq^EH9beOlq5MiB&b^Txb-7{P4Yjx-%MJ5(V>a^K zn2#(s*7G}N@P-+@v5P$%<1{kexQI+QWV&$+``-+amQ2WW(@fpWLnQerfLu4rQ=f*I zt()$1vjt}BrrEmr6&;Y_W?u#{h+i;UH-{0!Xkr##;bTMh zIlF7d?#gucJ9^NQ-t?8girKn%n}3ku-lHJow^Ks@ zrY9qrFNG|dcNq+R@-wL#30M7k)FY0pNy8CKzUzYpc(fy{#bH5d`-0wnnzNZ&` z=*w`-$bFgak3**WGTonv{r%2K=)O6-Z^rJ+bpHp^W~dC-w)7USFp>h(}v9$NRX8L~X| zjvjhP4~H@gSsqSdI5aZTn#fwt2BF8!ef%2g z^4Pk^YVlZ>$KKK7Rmk&r9kM)5WIu;E$_Y+!6*KZ!rpNyx(_@*Qgs}gUjAY?uWO`DF zHz`7KN+RbIxt@GNTg=oG_j&RyUFeS4deRFSp7bM@v5aRTlbOa$<}i;1EMyPYg3#0S zIQMBo)a9vlPu1e7EKj|or2+jz`aB3d3zLkLq#=SFcstKzdiDx3J(KC#+t~kE zIVw^InVx-0V_NVzUn1u-xt{eW4)5cc`#hV%bY@|;p3O&wXG_@14tBAJKiJ1Xj&O{V zoaRXodY+T_aqjbhsLONfo?i>XK^iiXjU43S6$XOpBl#`GprFWFlJ4)#trTha~Ql8}ke{qHD+~i3RP8C9? zRNhW1nNrD=DkJt!l@IkyRUDa8y~hVspfXjFE0unv>c;=@K2o_)s=f@sY^55)Fl0zI zgW1eQFH$YQdr7sF6|7O43%wR)vim((ZIQbRW|MdD68)rgUFp_R^WXbb6ESN6cQj{>YVX6nd3zJaVO* z&MfSoPXE&BSGw)&!FlQSbA;oZ;tV&DCA}=^Wl5g}Inv9KUXJu~q|Z-53Q?91(3A8P zsf^i5U!7X`Oh_+F`cKe@^f4^Qx#^z;;S4WfT?QF5_&mrkm}o{Y5?M0nO@`UbV*!g; z!Wwpez_l%#? zm}Y#7dCjO78GG5BVg?n!U- zA+wpvJO~*wPh<+y(2LAwDzll&JfDRuW*M?%)`QGOj(=r1#M_Y2jt4C zA6dsUiK)0x*4fO%Ol4ifQe?=wlRf-_US!?RA&zo_Q=CPXY7n!m*M5gRAWp9Q3vwuf7%vpAsvJYVx zqljfJa%Pt+`$~4<2iE*~)&BGsuwLY-NAQ6P^X(7X!SP7n6~aG(?adeR=UM zYVs}4eQ`DFlEbh9Ntk5?7?4M%{ z`julb`jf+Xek&!M<9D{O9X-pTKRIN{AxjQfay$>hIpxSHM@~6%%8@fI8OTgQ3Sq8t z7Upfd&z$d43Vq2bOU@6_hnzi`jB|5d4#K%oV_hy8bG4@n-SK&l>jz}Xr8l`^7)>1G zn7~{TkSW(PWXdH|t_|2fmwx5auUzIVmrS|-<{G#8hx^ExTdv$$c$L?2pWN?Ij1rWl zEHdOaqkiurocmK6(S&BS#*1LlhOLjC_$bse^oxdKalr zk>4Uuq&$)GM9LF60(m0ki5$xWCL>FvERicQW0CSiuE&f;Zb5${^(Rt)BL5D;FQ?=U zocr>3jKR8>_3mZ4@`XrB3gpTsS3Y_2$&)XV{1oIh-sL@H%2y7V^2wA>&+^$npE=6c z9P^gXS^2v0KYpMe1NjB@%{PqkOk@hvgK&O%^ZUQ^Ph%!?g77PG%wQJ!`pWzuT)?^l z{;hyI6wuQGYEVE83aCK=HSoJA;Q|La!f{SuD&+Z!SD zrLZ~`?t`8e*7L$@P}rG;^}O%|^t`Y$3p=y0GYdPju*`*JE-Z85job^uZxy5wBk|wA zCF9$fgK&|?wB>8up@{Q}^q?obadr`B7a5MVMaJ+r2p2UsMN<<&db;4<6*Zql{e4k) zE$XgC-LK*= zC{~USsfQUW_9b7@flhS8tQ9kB#eT$Hif zqtqC@t5SzKgZq}c#AWPPTK!AAd+C&dD zp2%h{1mX8&f6q*n9nMIcUp5|nDLaX&=ug?%=ug=NEMh4uSj}2Cu!*hgU^m`$S#P@R zLDZ-0aZYg-XP5npD_rLmclnoxJi)w0$r~kal)O>$M#&o`ZC#W0#U#-a96Q<%;y<}#m!EMYmTSi^dLXA9fe#a{m80EaooNz6)= zS&1?$QGas{a~O4pdpzJV&w}v#A(E1U)I^Y;Ol0Lna*>ypd4*Sbox;3BF-lOHvV1@V zDpQT>)S@o+X-FfQ(t^+VlCS7MCpy!W9`vL)Khd8-3?`Zpj3Sn?Okgt8n8_S|C4t2( zVs7W0@rU9SPgyyuOHEn56N4}*C-T9tg^r0UE`Guhj zXCz~YXFQXb$_!>Rj|D7ZDJxjbS~jqWt?Xbof3S~(9N{>pILih8;tJQf#a;g8Ay0T7 zgv*6VMoQ9RGG{))V7LzRn)f1gCJbhnN^eWD(_H?1~jJ?Ll{jQ>)FmO%uUtjLAaVaRm+R@ z)m}%Ps(CNfyq9Xuuhxq`SYK@ldR%P-dQ@#U|L`;je;D9Repre!G^7Qe(~qHeGas(N z`VTj8ioduLgg=TPD=(tfA62Io-T0Bd%t5_BT86bBS^JT-)zgt3wX9wqeXd>;HLNZ} z_3o%)^~p?QBWhS(4XfYaK97QM4R54|8LjaW>QF-+YN$gEJ+IN5pU}q|`dC9BYaHP$ z7lLrjOyoi>YnsuT?q1V7srem0AVW>Ht2v*A?Bh6c)KtToYFH~k{#q~d3NqAcz-N5R z_vlA0{j4<+{iwA8y{M%ZwJvd!J3+X14)Rfe_mQWzy3|&a+Gga{vK?>KArH(9h)UuA5u5$=y*LlpdAY9k_x@M|w zVLrqjbw9yAb?sBvK6Mwdnzgul-3M4-&)w_2!CN$^E$&|LXJSx;da~D(y`Jp#tgUBl zJ!?PCNq)SkkL%MEv-oj;q8Wj6KX&fN&i(ip=TX1<*?0-(*RMuh>`{LJ!*F)}m6)OW zo6-OJX0ZPCApA*s^zRdM@JS`~?~^)wPd^6oE6cFQC+E0|x;Ies25R0w%^Fms2I}6R z9cHM3nl;e#2D6xpdN=SH(%^IuZkU=(*rVaQ=y${Ns8_=-bZ0ViaDKx-k-6c?ApB_( zULYOsP@1yzM7=&8#5NLf=4WBjkQRUYSp_Qd1z+>wfSsqK3ki!FTUT{9PM!+@=lVnZaz_r;Yoxai6w1F+Xk1Puo_g zW803ncUyb6ozHFbu^Nl15c`i-7^TY$GH!uRxJAo72E9Dmn2A8+9AI-AMPy->5xTiDB= zLHIlU{O)xM(-ZgpZV+bVyQ7>4!di`yQ*QgH}S5zsX@0N7=XRH$<@t$yUEqvzjari?&{Os`tFmN#(C_~{bmsE zVUHfp>EZ8s*r$hmdf2CjIq7i;=l!n`?({!@`#<~q&p!XN&-VeTc!5u8$rqT5@AdQh zwL!RNQp`|K@2O`!8q@=hWKKFXhB!R`;#?1A0_K$kv3~9sD?wF&yO_ z&h8V5TJ%wS-&-E;)0>~z!y)|bPj65h`~B3HAq>MFKbgy)%x&LNl&2CyaZX=3`>J_g zHSeqD{q(<|fA3cn>-)tqjx+rC@7IEG|F>{Xf3wuzefz6Z|4FE4f0+iT=YaY&Mg9Rx zS<43e%>aKh(BBMv7c(%>od)(n{(4zHrqK3by;b46moCozD+?H?Y!d9F& z*t;C!oFT8`UPC(5liqB`UPHXOq3$!(-wk!2q2KWXKVn9P{`c?ugK)HSq6?z0(awoB zN73>{@4z|H2ZQjiSMa8Xy@Nf54d7=kaGhI0cz9)MQI{E*?crv7M2OTx(2O>;V+~u_ zj-HRWiG4=g;du~_(U%x&W0D|4jJb*_ieAN-pBVEIQvv73RHHgIale>faqpN@oW(t3 zoDp*$^B$w`Bke!Z-XlBEmA(vOFwvN&kz+7-Bgc|}+K&7abs4F4Bb_nw9QGY)-;wqm zW#3Wu9hIC^yg)iKk_B}h^(Jp4&nS6D$umlxQSW00N16LkRr!zxd`e@~Z`3HJFpZha zLC#TE(Th=PIO=W?9{noCDM4w<@-4mTLqE*$XnpWKyW!Eh*o%B)+cNa#EWn zxWky1e1W?7uHEn$cNnAQW7KGjT93JnJB<04he0^DFy3fv6y>N$6{=yMSoezUg7*+> z{$kBvtT~Mx%5X-a7qRh-V>a_xfEkNj%5wB2_B47Ddy&hiORT#1PTg><{>14|oc_eg z7?+a#yo0wLr&e)l6{l8l@6(7jwBu{O!8?lUN(_^j$_(5o&Yj}svzoPRU=v%}j@rbj zP24}2nK*Zf`|nQAgK&HV>K*?w`W9ajHH%lXcr}Yxvv@U&HxuzS(2w|5w8kCdzoG-3 z=!`qY_dq@4e?YI}-8tSJ!>>Hr~bzjxEoZ$UC+pdNFn|){Y&G_b^ru#>zcb z?y+)@wdYv5$DZMF5FVGA+`P)`=>Ir19;e3R)OcJeDkH}@ImXrF6PnN*xyH#gPOfny zSkG1Npl0J!kd_QMYrOl9&qE~oIldsT;q39w9j}JtD^Zn?s7ZYq(uk%wcf50b|897^ zIUL`cpXkpZhM@-I)nL3Dj33Js<_6&fvMjLo0(&lK$rrf$0(&h`#|7W;9ewDBUM%>9 zp$x}-FR80-xJg+L7fsl#XS@3pJ2ZPJx*{>-v=1>eSqPF0oW^H z4DRTA0mBIsnT$7@;Eg6MU?Hn;UV`_Zu!Uosj|aj3{hy@a|M#CI Q$Nazl{Qv(uobc%X0LDVBZ~y=R literal 213637 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

x+jgB~Iq z+j|vquzmh!bR#$N#5MCKr?^2A&h?CBW>i@WvY+lTq4`X8! zEhmL4ds=Ovz3_4M3|BQ~;%2jZakr9Tg@wZlIScRp`)^jv1eHC!6ZPca_F#vuLOE>y z-;v!H^}CrWaFMIp4rU9gsmen`E2+{{$0{*H-Xx<*wN!?qGRprfsOU&kh(@8&s0fWg z#i#_0MR%i8P}q@dAv=m4%@(m^*kZPX9n0R$mOhKh(Ks|7jR*QB0f|0zFZ=|*vt?{K zI}`rM*xB&cKo}4F!+ikS&E{`27Y`%_Jjxl3PVMG@UgQ+`zbS$hc<3=B67R$0G zab1h|w&H`HMc?6|AWcJ|5a+#>g&=`n9;);M%R+5Rhm9*NE(sMC4ux44{PN0A(zCj@Pw&>L zU8fMZN})Qkw(+Uy4EhL$RJ%UCdKFBpaxW|8um*jMKA~DB{sQZd?)S!>53fO3-`u-a9`XH_lM-gKs*TFg$LtY zJOtN~i=bBtdV`?133`{H4+%O;&?SPtBIrkg{ven~ zu#{jm!A61|1p5dM5u8bI3xeAb+?n9+1otAiAHjnN9zyUif=3cuMDSRG%L$%H@Vx}H z1V2dd41#A9JdfZ71TP`@NrKlA{0zY_5WIunR|tNc;G+b;NAPKa&k_6?!Cw>nJ;A>c z{3oFqLW>ElAheFqWIQ8h0re(dM}}0BlHnMzenhg2z{Q=mkIqfp}!;a zFNFS+Ff?I=gn_JwiZD9DmzB$rNOA5#dyWMzZN5_ZZ}^!^`BR-3V7A^roKmEJXG&L+id7iU)Uin(PbowvBW zWMrAwJ|-`}w8Rc(rC>N%+hLWYtj15pNm&~sWg$n(db|N|WEZiE*`@zKq&&}&vWZ=i zh?Ey*@|Cc9|uahbCkg3P=Az+EQbj*AtgKUE43)ui}&GI*=6i<7Q)6`(}~wO z_^-1o62X6~2K>VS|1f@=eG=f`$-#f9KH+m3QIrt=ar}NQ_#fbt_!PUEUBfHNJM&7xDGH9P(+R}TD;n48m6)B*QVAN+f-1`vgF%Y{2Id+l4efIky*iD7 z+;4tixjny{uA-8%f-*Z~HVYt~Y=ro`Rogs@{oL7_sX-^;{ICAXR zIw_BJ(^IRPii9$vEqEy%xT!%9a3#fL#5+^ZGK$a{b;zg@-56x_GP}D{M$I@GHK$w9 zE!pktPIgx!8MT3BrmPAq?LbED=nm`-g@m21LVu)|)c&AFCQ)-1bJ`U`4 z54Hl3W949rx0=B2i?`6{Dsulj>vpp}io9qoolC7WbobEr)gd32CLo{J z*h7`_d61LOL-aIyI{P~NCi_+*`OKte(X%S#GY8}|hn~y6p-2Y#%mVo+cIPVk{iE`U zJE@RFNhF(@Fzw8TZE~D!;vHHH9damiF{Txp>XyyS>ba+))iU;tc#91%eg1c{`Oh;? zmGo*(K~K_a>X6Jj`YDji5%zecWHxe=d76HPewKZkJ;uJ1NHUw~&GhC9$-DrPd4b-_ z9#uF&GHpRJf_}M*0re%BMAOYCdON*?-Wiikyi0qaOGZUlp^b4Z=w7#UHo?OGf}5Zm zfOfKYn=CNX|G0c^X(+u;AF4xON9eafVDGZ0Dh2iqC$Qu63Hn|3J@y0kWFmom05+wh z0_78!|iPkNw4`|p$dlQVy z91IQwSnGOq;=ZJ>)*+B@>F+=wr`fZW0{M{>$WQdo^e^lg_G9*wL;|@^|3?2-fg}qA zl12Z?ex&fkuprgHAdu@Ye$F!Sc_-E(h6f$e$2-KYTO8MGjGcHJG5ZnMLUHZi8aRxM zsl(Z3)C}irpJzX-kQ2i>+l(Fxe2nY`_EYv!0y#03YB@1Bbds?_s^%gL96#tB^Wg25 z6Le@N-paVSfm6{TAA3>JBqk@OtWG&Wo6byyXI;@I2yImHHlyly;4l%UmS@dmGL4wV z?C0zk?ANy#s58wWP-j}OUnUY%>*_$A0bPW$t#<5JAgG=oDB-L17pUuFnX96Nkvh|n z=^8g2HS>8)Hq#yQc~{x*DiyLPhcAcyCK0|qHSqNVd{B_aehc_=IDF^o6JIP5kr>}# z238$!j&7NJW*Aez{=ojo{&K7GE#&ZzVt-16e@qShC4j$#xtskN@b?D%BC7uI>%7^$ zx_9iFC=bPqVsE(**Gd;u9pgRT8*dGz04?fBg==*Ub zu=PiR&fBq9_w2+R>||Mfjx)7V(oi9Mk~u|?k{}g9+FRv-%StmJ6QoYWL5;LDa{)NG zz+)QI zC#-wtm5webt<3oHC>~SGB3$9|d4d=T7J}>*(>_lOaCtC7tO?-qlB(hI6zC)rnu8+Q z0PGL|EB&JW!5V6T9h*0dtBa^Yo6IxTf!53eoFMWPg4~s8?HpPMLC!>IT{X~p0Ii4T zBgh44^ElB$TvWfS4NyH?3oTSn6hMN%q__%i8ZTT2-YBm@46m0Uez0dI3&OM+4X?@$geq#x=Vuelc9e5fkP%`bs6rz*f%ybgZ_jIZ!I@;b2_ z2udR;Qi-=KL{+?Qylh@~g3<{J5fn~@yl3^o60a8^@5O_Kl2Tff5fo zRV9v^ol3B*#Oqm|+N%IDBnEZa$d{P?R@v6{Y`ZKJVsLzFe+wt!>E|C`KDrV_6AS zFl#AiaY=bWm0I4ztCemB23Q`6G0>PGsMd}xt??k^yo&b_K}`}dFrx+oGl7Abyx9ab z1^kZ!eic*$|10>7weXKGfVBgdF{?P3$6HW`7A)c|j&aa}pw^WfEaf7i3_zybp6c6?h{3ZIl!h4qYTnv8}LG3H?Z|3lCA*gL4 z{99|_e+lrv#M@3#JHWq`!@u)i!hZ`ou$#B94i5J74#YUPgFvlw#W;AK;{a;3Iws=a z5DljyRak-}z`+sTQGz-F2M=?00JfO?D>_iy1%dL);^Km$s$p<~_dy*LoZ>+l8W_W_ z1a+^ZfOD;R;97S}M8P@UdEWU73N8W#7kQTm%2p_WgzZ2=G8n`9o|J3*m!$>eP|Z;V z_Y2;Yzry8Rh5d!!64ZmBo&@!VElPD%*YY4ey^8k}ftvHWgDc*zba%RY1$ywVdDnU1 zUH1a)C4fCiRF6w;|FO0-2ewpIbHJzgwR~(okI(0WkKLD`egqAwn*+WC@mKSud>KLg z2^yGy2)?3vaTwI$B=0<5P0)aNI(+)=&--%y;p-{{Q{5khmFp3lV3J(|rE}%*l7`|D z_Tl4-W3?G}*x_Y|lE9+a67HD7Di4-#=G*_OKYRy2h3_P2FhRKl!9rxFB? z&d@~MrB!ps52BO&AU{k{9w<>4P$B^gpxeDV$cG+PvUgLD{s-uBR76n8E#@=${W$b6+QuY8Kd3sn#~%zDGnfzhRSX(K z!(vk4e=n7F=j2LKiB_+S=&MQOOAp+mp{Lj7#Hvta$=lJ(7g%7$ob5C@R_G1 z!o8w~7{O=eujGTzd>@E$Jcv;SCnwaSrK=R&#K5^4BR7_T;$I|aPHg1LZ1q2KZz12tzs!ey&o`T3 z<_iA`|7y&+pGOdEiipMe{O>rl-xHK*hXeno>UYxNuM)#*Dc&l8=y-k1 zwh24e-x}F}*vus8EvP7CuED?n!9c+vf?&z`8G>TlH*R4=mtY9TKpsKQCSqV%4F+Pn zcLXB{dM?fYY`glG_AUuV3rcF~z*xcE0&u4{69it#)?3wq@f-u-I=_&JfqQB&04t^V zf?x`P?aUB0D}~eQlYzh8z9b-mhiWk}O)y}2x5~h5j)6G@ZBN9&ylMvG zl~IEE1a{HI7+71M4E*g5Cc$FC6SWvvCRi?jeWkkz+C$L3TV-H1$G{qbUP;8jQ#BZf z)lLau+v?sp1N-Zbf&Ww*CU{P;r4|J*2woIyB?vrRNZ-DGs}yYKDA+;J!9*17uBJfn z3d{?y2=)=!Wyw1PuOAZ}6u<#HoOf5l8onhsBsfgan*_Z@(2-ju;TT84 zI|Lm{M8dn(BrvfeD!~T?9ggXN2-P12|Dl9Ta9Z$5Ee6gC&I!&F1kuPbf==8j1D7}k zJ|iem;lALD8VtmWs03dVbUe-gq*>~3KH!Sz5?0O#z7_mfi-Dg6KMQ^#=skkoCkP7O zZ)rQL;5Uu|NLhc7NC$4zU;umqW~&erbTZCB@A_llKNXP)`9kquDG*A8QX!1snDbO=*~kd!`0 z5DbP-ZUsW!7%`(B%dc@piMOc!nWw7u&uB?L0`apFp%Tm{rcnJKNXM(I|;kRNDy}6 zw)zwFHSF~lW(&Iu?+ z*QUg?LPA&-fnsZ*hF9`$>jWh#oEA>0-bBcY)wT#h zr>@0hsf69@^|rK9w_K)F?;xz`4J0uudebUFlWI{`G=cnHMH4v7>9*`26h0z+EIugb z#Rd5%C&>B21wu$h-5{7En5kQkb*(}RA+5ez_=Ip7!H8fw(I|Y9hLl%4H%rflEmHG^ zs|k*8*~ha%hyT%vq^iB2e}D3T5IQA%O1K_zTR^KjrN~f3IhD#)H02gz3%KL{?c9Oz z!|dL%a1baQ6;N0V#|D%SYuYq7H`27}(7dw3{9HKLA5Kpl)0{gjs%2$zSNN=Ob8W7- z2wxDsNHCvZ0l|{GS7(JUbG&XB!WlS1g2jn=-CfPA5JCarE5dyQb0<2afPKRU{w-#? zZf%C6y@1)9y7dpS`lj$mZC2kF9u*!VSVnLX!KwtTzRR)tp74EwCt~#nSP33nu|6{d^7TW6KNB3^Zp}b}<-cPCxK0g$?X;k&{F^)V zkBt96MYtBHB3i_Vcm$gWHWLih<8|3pkq9^yiA55EEd<*Va4Jfw=2Qd~kWXi(t^L2*DW%n9bvu9V*HvI7)D$ z+HcYD8qC7UA)=A6;{wAjd_@@t;onhL=#%gjsMq35LCrq>Gp>N>Zqc~fl#Ulo5WyLP zjRDpZnhxGMn(et(Sb(3hbXbZvZ2?o>I zsg9CE(Kg5diC!Z3jznzks9r9Ih~^|%vfTuCjOnQWwiN#>rQUy2k0{zFI#`>B*F>*# zJai$rYXTk)b37a&I8nv7=vZ|wOf&B`PK(ZP$nGS# zM*?K$IArGu?wLr!pVkOUs-o4L_<*nPp;A$vCi+4YuT{Uvd) zDf*G%K8f)BQjMoNM(lfg@%%2P>X4NfSK#SijYrG}JYtB~2PD8F7FXk`4jKpERy<<4 zSX~z$Z3P~1Gr+pU@ z{6#+56?h73;Ni|h5$6y*DiNMOHSkpV-=l9Yo`K@ry5y5rfoDt&JOvz{;RF{a!c$lS zPnF|aa(nRX9Tq3ZRaP-yxW*#-9VA6!7lI+Xd=f z@yWVCeOLkNp&Fn*=0JTy;3WlhZ#ER4uOTVeYAL=bzC`eJ0JRlBX<^6h?E>|=IDTl! zUu?wH3Q!N%0QEfw>IZ^nCIarQ1@FWWOpxB#BoNs0&nj1t>_KRGM^2gaZZnyhH{6 zl8hRXY6PGfNg!3V7(jgwpe%cCpQM^gTE{?1TE>=)@#C;$ENLUjlC&jwDZ!BGSyA_r z@!y;dB&lEC}CAU?T? zm;RCgl7R%TBzP6UYdKyLo{%JgXoh7i0u5eNCzc^ydsa8Mu_LGT*jU zE18|zd-VRYiC;2W60a7yiJ7sIyCtOrgI}_q;HNoeZlN$7T0#iETH{hEq$r7YFml!t0`R-oM>%Dj|}%yDE7gK5U-lhRrm| zbP2rl<~f3&CwR+$KWyf3bUZ@fH79k?#F9s=hYc@w?vi8y!J9ccl(O9a1A}IXWLbRB zERD1BBFD;d$qEU0x8MtIBY69N&&pbkm30K(=aPVx4b_Rkc)hR$UNZD@oE3P@!auAf z?aN2P+b|2txn0S%x5aTM-*hkTK74p(orq+U1sL6Ou@>XpQ4oMD6Am6)};C%$Y#_7f16$VPU zGqfegB_|~B5)7yh5S*xrUc#MPU2!741Wv7%oRXX-ct6mz2xwBlTh{+MmEhj(R#lXg z;6QrG2l%?=6FAxz79J}4a~}GmFvnC>RriZI07TWhP%0XI76ZXSD7;MtWs)x>@vN}q ztN4I^gB#FSCErNCCHPH(AryMM?g3rbx}4-ESUr;bEcu1tLj)g5q~!1>o62|D@Or_K z9=#-g5F9W6H>T9Lk*l+~PjbCl7V$1g>8dW7aup3~*XWdtjo0V2E4X`HLG!A^{<#ve zG<#;lsxmSuUm7ncznNjFR4R)x3}sL6R+tB=0_c+}r7D6Us63H?KB>0)DD3#wLaCnM z_}&2{?4-KQJEiO7Q>v9rffAC~+aW9ZXszla?Eh?7o6mxR(YHvbL+Xy(nwwNs>XpKR zIjHRW1bm}`2>ys*I9&g4{9!2<6G$N@ z_&5>IU90!RN+BkYW=kO^_yl+!2mQAW{U@z<%-yRwkq2sR=P#R7Rxq(!UJ)G51NEW3 z3gKLy5wSPIR8H*DUeb7ka1$f_r30i8A%K0qK=7r%XM~Foq!1xoOvFfj4MreBkQPWG zLiiLIc^nw=z^1@|ZXT<}NbL>bF-AI6!5=NHC>pP^0YExddbbq9fXf7bPViTM51(`X zrQrO3kqG`h)$rr**pY(s|7C2_6pyJ_@R7RJA+7~&;MAt^1v%Vlqs1dCUb9uj3XxW% zv1_t2O*&mVgWxL!UnLlhlK;D5!tE24&LQxIxCG{CUNtMy$3Q6_lR^x@9WlQOl)}5Q zUU|6%e^_RULh}gCC$#AA&B0|3|L25Gbkw}`tLl)DiEWyeUL`afH4o^Oo9Y$4 z^>1~dN(H``{#=`aU!=cEuMt{8Xeps%XU->9fj>A3;C;Zd1Qt<-sws#k(q!=J;G`G@ ziXZW-PuSUM zYj$_G4BLAPEkNjsQbLm|genq3vVllQVhSD2u_I!`ilS0=MX`&$V=o9O_TCj6SYOL` z?wy%rLyE*d=<|F}%)9fF?A*ESH|Lyt?z#77DJw}2VxV7Ee_Bs3=(HW^vyLJ490)pJ zOZ}O4vQ7tFE=*1U2A%)ks%NX)Xk-n~I=;F79FsMc)-wdUsMenoNIg#gT}yku79LEF?{pk=+Me@S#iX7|(6zMZeAc{% zdTJ*nfiC;s>CeC05+kcTONl-?2;7>iT3XRApv%!ZltiCo;bH78EgHyLo>oz+!I&AK zQ)BawbcZ_Pt#5mgb$Zs>&GqQHSu1Hpdw{N&R#9TPXRQWZ&z9cM^c`N*vyniDG5r6I zBx?11q^!%c);3qqYqHkSdiDWbf32R^lX|WPUEh}Kxhbtf)kBZ~Pw4#@>)GPk{j8g^ zlpyVcz`ZT&c3RJ)0gnt;HOpP3o_B-pn3n2!Z(2RIqmFa~|DAgN-9{Bz4`(S+EeBQf z$*di;qJuz(G5(4QB~dL|&w_4nOBH<~t)g@@4m{3CH{{=`=-+Hdk+m!9wdTNmJ?jlx z&tae&snwHgvY7P_=!Umc&-CMZP=(SXi*zIY&3d*B?x$H_HdoKDv-Z(?9uK;)T0Orb z_52=mqg$%yfwcal`)c5^M7lBmPCfr_V~MQavi?*m`nzHmk0*BVU&ah$Cg>)B4o!pn zmh9pd#}Gym;%($WH?f5#F^Uai2;)(idyPjKjiAF2eDh2kNLlg3>?7z?IJAM3(PC6$ zYO>NA#@Ny5Fgigu1$0wEH>1_Dq>*gQX!L<@T1$-(Y#2+6G$hX$0o`=Mg%retC5~Vd z{JmSnm@sx}!iBM`v70dmbTdJB66j{PUVXADqp=t0S_+Fdrfte-#7!BE{f(#&Ff88u z1~x#CD~@Ob_?rx-iz>=%sw&Ec;t>jS>km^g9%mfdv=#DlG)PFdESgZz)RMSlmFrGAU)83pyI5E_E4wL@VBOx7qqIf}ZsaFyE;7+Z#1N zrSTMF73j)AR{^@J)*FEM+l`ArSJ_g}r~BKfThX`zbf?gsXD}q@2)_Q&COuzPv1nxJ z+T-V(%8H=?E9QUJLz&Bty;AG`4q zrv^|<3kNn!H6L@#z%~gfsRCU=O7CDJCA79+vsgK?l3Ce_C^>yXMEoH0_e^L z-8rB;ul3d--ge_FpgXrE4AQ*qM)bBDUo)b&eI>R=9=66&I2V2dUyOe|DQA4!sCeNU zwaW*_4~^)BKOb}`2`*~AU5FRnh+g=X0kZg0iIqpRUH)#S z*0|sJbJLgP7vrzS-#~W>=+=Pl^46>WC#gP8*Ie2H7N!mj)i*Jjdrgc9XErXYJ4eE^ zR5PSu9sce5mnDnl)o;UZ5>3V?^*5PJW|IWED?xV^=&otC{w6!t-z0->ZA>@Rpt~Bo{|l^spY2Dq`b}pVCgxA7DXeO!f6$~v#H8bIikaf31n8~>9qI_&xV)7) zX%kt1Y3d5PmbNoDb#JJ@5_n?D1s!f@jnu_x?aE8=qOSoehVHWf>D@_ibUM6BQfG^p>jwtj=L5n ztH?>Rfs(3<1%dde34@D^tCH0?jZ;$*h}Ysiak)JUaId&T;rv4U9pgaemg5$3WdFEq zb*+eLzDcpx4{GyMOlYlRo8JMtdsKIgsg^Y8LK9l%cY^NjmLOYdT4q|NHs}g$&=scB zKzEnfNrY?(Ht7J*f6$~@C|yaDLXr3W2sG(Ard0~YD;13IB^aM?T5Y-jboYS{jkt%~ zfbkmA>X(`>1Kk6ld#I&WzcQ`W*J7)$HC+Qb47ipu$syJQO8$d3zYGCQ-iTi)%8)Urp=~QbA7SZgu(>-;!)5&so{MqY3SQbw}TE1=OZF&ZDPlFDx&o|F}YwG+(qR?If-Loxq#w%$GZ8vttZquuv zdk#C}cdY!t*+*2NHMM5*hmwUk+K|umhUp!pN#0VLTij)u^IQsVyukEh)uqPEnmzB}ZLf zEhw!?Ru$G%R1FwVf19S^@&mDWc3@s%b)dW=kSr;|g9tS>_mk;2r89m}I^$K+8UHi= zZu$dsuYqna=-xW?&ML?CNteyV%UHh=V|vIVW$v}UVWIdI9;sA87H-KSbJ z;sn74b1!pm(4k-8la|`DUmAV`uq_9ej{zM9WlJ4iCivmH&3{`}nMsi}{L+i`f59)$ zJhHiVJKl_Q2l!^AGX%rC>HM*I9Kmlq=voToHcxDrQoupM-ppNQ9C;{#+#PV);t>^} z|1Evf%_lY2iUsD`v=vc{e5bWy5oyI@(0$VqcyonbxHl*@k<6tCUa5IL=)Og*{48>3 z{`UXtcC0X0H`k7}=7qE!e*oQ2T01TwZ}Czy`n>mpuB8}q^QpS~b@!`{S%-~TXFeTt z2e2^@U}M^F$N3`)WwREi`BXH!sv4E)Tv{elqLBsWIZZ5kBJ9#vMWtEp|2Ltz%6uVh zZu4qIt^a~*-F%VxVl%o6e+3=-4QUAbp?M6CVy&59{|~FU-TXjv zReZ>dW1U}tVSwSZDn3T4_&6~7ma4d;;m}URc(1<7{0uPEAeA!B|6v_pFz;-xj=Rje zX&nV%j?(J*8mZ%6U|QOg-~47n9d+eMYPtCxU<|YyzyA-b_<{M8=BoIa8Pzm)qY)TM ztKwIrieCd`YN;E)Z5WB;-o7~hZ~g%oWrzICKmWrz{$y5$8VAXw-_1DGz&cui!FYLU zkVqL=M=2ASmSW!}hUtLY?Ne21Kxdj^g~S0vW8b9?xUa;2C2=H!WNM}#B}uZ-Iy!*S z;@%}PCn3qev=sL)IU7(_j4sIo42^r2I{b%HRSHOv=IR)e;QbsS~MVXJA^2 zd6&91L~ZHl#;H;dU}(&{)BzW~{%8HzTT(WIY|N^3w1h(iWHkhg7Vj>R%^;;gz_b+a zE)CWBbUuYuW!qb6I50HcUFv{-sQ;{v$4e(ad zZouRK(;XNDtLJ8^BqNcLkV>VKfyu3N);WRc1I%zz6}wi{VT;j=TAVB%Rg+wRc}BIr z4=%$)WQv!N>Xr|$s2Z1CG@-DzI$2C>RABCb_l+!Em>gAJio@fwvL)JchEAAFn_w z$gGlTH)LKT)zmEkrWY{1XI9lz64!7b8V&T=mC-+AfV5azGIQLdv9&dYm;t(kH%f~$ zKgl>&Nxv-PkM+`WVEWdLdR012s>{I1Rq6E1z0#S|S<>0kIR$2OUPV#u0#cHSB0Bt^ zHL4hYqu!|rg*Ef&9SaIe%NzcT%cw?SQ!XA~qNQ#4t}X+Z{=f_arXMhQ*nZQBu=~4V zg&Q?Ow_%HuMQHq0ln*OkSc+b7Qi8k+l8;jG^D@~@(kkhEX|;3#Fav-&7MQ`n45=Ht zTe?`f1naRz%9k#i(U9|GS|(tQMwo#ah_7JxK$_(}So5l@ZGDWk&U|v-gf8hf9_(Bn zFraW@VQCp@-9)z1W4^GX-ehOfbcissTHOeid^+90jXIQDPu(JFF{ zv`)GVnB#y!c{6ZY{yYL?podwn-hlm&H6;X)dTFV)kUs)5RI9D~m}2rq2C5a50=Pgv zpu%#j^|Zf~|CHk2EZtIIP8{4N4Rx8AByS;h2<2gew2f5dknf+_x1_M=oSxnL^(vmz z9bdp@%er?7bYIaWu&igl+%AD0-E(`dSfRbycSv_Jw?f$cpm{bSzouZ<8vMMflbzFOeBNj70PdAs)uzrRBx> z$;CA^eLlL?ieHmnmUc?7NV}xnNb(-()r?$xCtsJ|m|lp|pn{+@ojx=_S+!s~byE&4 ztWM4#T)j{o`v;k(kLHe3t)u@r`zdY#g4UM;`qN-SV z^mh_k_C(UwH!)4!s24U!Kaf2B<}Qt%1JeJ9=KN9mN%~p(Mfz3x4VaUFnFUM%FtdRv z1ZECVoqyoxuZ)N#lc>xhaw#U4Bq26{1sYQ^w_XJfsi+xFNu{a*#d?9+R)ho>R-%e& zkX@*doCl>GQB_e}Ib;b>FH>n&)l&96g?*@Vxf)invtW;9r0mUu>|>#wIqKw35W_COibt6$HC zdUUp+D|)@93ozyDEofL&kR(C00jeg@IhU$r@ldpG=2ldp@<#)Rm?xw1s+E@Ni3-+| z3ruC*DD07XWjDICrrW6UY7_~?4pLKh!+O;hudihQN3D=x*pQ66&sFO42jX{l-MA+?D0B4ExSRG&%EBgL6aS5cQHtCc5J z4r=tI<(Bg^I^AkESyot1wVY2v$Zl=q8Zpp=vUK zX>8wA&(bQP+5BNtcBHOaro_fe7B@~s#4oXdiHSVEr2Yw7l4K#R2kNnd{-V{)iUn5- zMvJSIHPN_L4riT>%+;6emN?zD)z+ArGavLyLkT<=h7xu1tIw%h~EmB3ux z@UGrxd8j$uAI5j)QDCkj@66h|e$(sUned=h&orWZhvnJk9`GEJ`2sN45ct+wgugOn}FF2%$B--ClXmT8m%oSDgJ&2?S=0;#%c-``~WuN66%eQ#{cb4xhKUnr#4p@G) z{ABqV|MjcoH&pk<>aeTPuxK3Gcc^b!CKNb0(O$0<8&y>q>~*VGU1&De7S+^NC26}`bvRvQWvqH& zZU$ys{ix5fUm5mbfyiKJ`rxW!4E(F;Hm~`yQsy%mrp%YDlGT!l?qhsEZYOiEQ%U;{ z$jQkeVyZf44hC7}Xd~I`9QBboWu_FB{_6^uKF@i!_+EU zJ7Sa%>Mre(+Q52))j_P$=Dyl(b!C{W7@}N*dHj>#(ZMX^S#-7@5qHENAnV+uF(6 z+1kb06>y<2vmKawfw>Qu`+<1?m0g{wUWIPe)a5~kMV_W#qHrEtT8_dM*DVE`{hB;#Xaz=k z7S6>t!QbpXqtInQjaXs?H@%~X3=yfE?N(7zQk_I?)$}tlFDSuvWr3e`i=t7y#w=Fz&b${$9co5S)pYH$2d zxrJ1t^uo36;YYrsqEWMKtmCZ{Gvp1{3073+vstVOR&@jKd8Xmwf&?O>jgY{$rZ?oSiY0Ip*pBxz>Hj=YcU~jON zlf=z`x!YQ4Jq6$VJ(;_$IFy&hO{&+`N}HgekoGq^dI07nCDR&fExvj62{u?4W*nRT z2dx1YTbC%~i!?E4U2a_=on<}ES_cfOqFq!Bz5>kK|5OZ~k;!hho@qVHdbaf(E1HL> z2ww#TWf>|yjKorOlQ+vR*N=|Pnf1QdciOaIt z$#v^SJkp&6nC{Me)w&tw-)8F#z>wV~`_yGvRj<`w|6F7@nrv>S9?Hvc6DoNt>a6$c zZ4B!+>m6ugSZ}r7X1yJl4}kd)n2$DE@09Ybs0Kf#Rr}=d*cjFaN%kmwKUHlE>!X%0 zf%&XCL&Exm<$!gE^(o8G)>YPLtsn^!jurU$DMNm?Q$`TVTG> zm^?2>Xztg2ge+ccRi3pJU|2+Z%QCbLPX$!r#zm3)Bt z1DHRRE5ekKm0`><*&H@ERbVz3QDFLv4K|O>3;ImZcc|;voYJxd6{Tf;T6;v)mY_<@ z7AHze&$RZ4wyLWZ1f5#=?zZ0O?6UQ+^|a;MdV!t?y#RU<^oC8gKDNG@%WeHZe-!8? zU}B)R*7co6Ml!^GF`W)($iHSNV;p5ZjA*Xm=gUp)b`A)w?qVZB^n;L;p!~5q0%UEL^1c#n4V`{H;1IMIFgFKyLIU zO^(_iFIinwRa%K7Bs6Vs2l#`ZPR1r$X(!llCDVG_381&ECt?N<07k8g4yx*kGS%Bh zDy`i<)rNZps9q-94A9%u00G-cI6$?{vK4^d4thtuFt*LHl{7QHw9U;(*h)b!V@v2e z*7d7z@$jHJNBa2GR&J|mE`2qouLV7sFVwqmfLq^D;XzAoYxIDnwlgz2rEJS=%WW%c zr`k@l)!D#yy6p_mdq9s2`#|ppeE{@9(1$=D27M%j4?o*>j_q9AO51t1RkrhOt4Tgl z$hsb~HbT~&ko7WT?S!mdkVPZoZ9~vqF~70`*DF=iy=-xOhpthV>LpN2AZpfD<2)rA z|J5_qEpMq)6%8rnSDakMzQg%iI(t)K?mh-5GKeRk4Chda8@wQjFLnqHG>U0L+zJo} zjo9-zp3scCsW^H@MSpSvH1>$9!peC~yGcz+ z)8|g8svwT-Nwt-P=!0`^bWedf-ddhG!=kmN2Jgc*oMzl$d&KrA=zD^`*9P0;HdJVR zKtHIiZ<-lndqy#1^tlD*(BiI($#Af1F?nygE=1C*(FM`Bq^NiA?tM#o_9*P0p7KRC zW$#u~=JxH?y|`#jcdcMMZM#XqUa{>0eP7V`+hE&cdlmHkK|i3bZ~oGXiUrfEDwJ8> zurj#J$e>oB?Jc6c-?qJDd)J1p;iEx65cJ1_{y0s$e@MRn2p@+(pg)E_6Cc|j$EnAu z<5cBAUy>X5D7VtP)O)oDeXo2^@6et?ZqdH~Mf)D_(7wlva6qh8@-I7ss?nZd&r~Wp z81zGw>Ta^@QRwcmqi!BbWG$x4tLr4@PXW)AHJln4jHb zH`^t<1@yx}KN9p~KtDk(j~(N=HrZu-sDo5|IDO~{THf$+-+cbgAZ*6)aXT+s@hJX7 zd7_V`@Y@6SAW1O_^v8pKw3^}yXa4mx#kcS8CMm*?+`YQbZ2X6k6gN%XWY4yDvUes) z$AW$w=*KHbAK6(q<9(9ixO>LG_9*?wH_tsv{-Px9iAk02X`$Wh{q4BmdcA!B=qIkX zW0T|bcN%f_!76c+3e0mgR&nhI3b(Fv6zPVzDt{;_#&P9wl~ol*7;7*pZ(#49{rkm~ zugHjV@?`v5|6$#G59`sdN7tVHhVWOA`0QixP;nEBTdjkb>^iLkGxuD4@5O{0lW?AE87L>)L2 ziNYc?nccf}r~h>c^i%((MIqQH*(Z}{<%534dixa6&urW@xHOu0-}EOIm=`zWI@Fwj zdC7&zG7KT8QaqkHdC4j=Z$O$PM~%ejT3EBNxa{O5wdIQ!EvP-YWZ}GdbITW2Ex}3o zrAu>$)M6M>4vMZ~^n_MpdXyAeO0C+n?6XNx(L_3Fy}c0hvq-g_ngZ4&mF99(CMoUY z_EHe5k>vh!x^t+9#T`(tE1^Pl_VCrXs9uIl= z&ng}s{Mf!1Q;ULsQSXfX6g!E{NH6ihb>3*Nw$~8fP^)*f;D=SLefvT?`gS(h7ugqs zz8Lf+8|+K%%RoO5^h+9}QKzDTgssrtn&Q%G3=v5#m{Ya{Um5h%7tJpyAt5Zsl^qo9 zHL!0Di-CN#Fkes8A$z@7zAUduV#eey;rzG@tD&?dRE7 z+0VDHwqIbs(0-BqV$h@celqCigT4&(3qW5E`U=ojg8r10eT_DHw_iy{@Aj)fU)3;r z*Vm9?1`dlBkr$xd58Wm|wEYGm5N-s0wWj8_qWVBzPd@ojXAka{+(SqsXUaO%hjItdpSNCSK!1KC`78^nC|rfZE=@k8hA!!vq@yI1&sB8H z+ni`F>YJM^DW21(M3ZCkQF4~z@>fZf%`%=|f2(<%EXfwxD%)hcEXy5bhwPMHvRn4Z zUfC!6<$xTNLvmP-$Wb{a$K`~aEq9VT%U$HIayL0g?k@L`d&;?TFS)neNA4^4ll#j9 zv!{1pQjjUjzDUL4Q5yH-H|8+*?48 z^57=W-wgU~pvS@V9iYDp^!I@NUeMnU`UgS(Fz9i_^El|A1pQN>$1Zvf^e=!OU(B7L z-vxR!T3-V_zIktg{%z2|3;Op#{~_o<2K}d?{~YvRg8pmJe*^mOK>q{i4}ktB(EkGZ z-$4I6=>G&Z1K1A0GQhIH^1zC~9tErsSTnE|U~Rz4z&e0+0qY@-Zq^5E0N4<)5nyAa zBWBBm@*KHHE|!yWi9A=HCzr}6%k$+jd4XImSICv}DRPxuE!W7k@%lP@;UOk@=EzUd6j&=yjs3MzEHkMzF59QUL#*BUnXBJ zUm;&9UnQ@Vua>Wo*U8t)*U8t*>*WpdMtPIGS>7VwAm1pb`Gv-1@=y0p91!6V7~{B1-@&*V0U zVDNyUD;SOgJR}%T)HPIs0RT@vHQdnn9lS$*2QU2R(>P6M-pS%YG^z{GJ64U;Q4RCw z@^&@5iw|dZjVJokvwKj@Zq4C78(LW!N#YNN)Z*q2RgG);n40Zn1?Cf*8Ix#6aeeT@ zA%!!jjY?K$Hq)@UCjlJ>T~S~zKCD^RhvpZgEst$n-RIT3G4B39IMy${zjvx7x%zM) zQ$mJ_q~Wm*(3RM@`md^)t~)Zj7+|*D=2cdvSMyCZ$LkI^){Q#5Nk!jNvt55=DvHz4 z2UqlCHOGxdrlKwNDDFT=U#86k=JEgVWok6Hjg$EW$?D47o{hozM$P7i0`shYm`(Gt zw?R5#*nMrXajv*I6s;VddUyDR6A4CWD)oO+v)p<(cR^}6MVP)J>F>uMYJRwqX7&+k zSTfnNVqlpU*P_w*6o;U>L`L)AQ=Eil(; zE&qRxh)&nhVbW1?D&mygVgM|9aiB6q5q<0}Q`LapM5 zrTZJ2T-%_uG3ztcjCU89Cm+^~n|qH7)y!TkFkf-lGD|KlB;hpGIocZXN%KmRWyJ+# zL(K8z<4a10VF3FQ6z_j~LpNN!kd6Uv8BFEx-U9R4T5%7Z#={~FYcQ}2g`%?QQsbVR zua@qO!~K>XBq^wcknYs!SgGdx*5MwWlua{yufROzA78 zCKyhZl{a|6JKmsXi5nywv2$P2^SfEiZ~u|;g)GTwL0aNsKH9WD9`2@1e|;Krb&s0m z&jsdFw0HN=_47Zp77GfR+KUgU1^KnWT&5M|NXjxrB{y!2N7XX?@5o5;B{>*-Nw!yN ztRr`*x&HCb#b+ZO*}@y$T!o)gv&IEUN6MS3I{ngLFWkSFV9sXZp1J= zS`=NH20h~V(^C=}S;=_tBW)2q#ws4x7CFccrN1^+;P0y0b4Nzr5e42X`5&qI3WwWC zphhPa3?&<~HGbPZSMxL+ZZB`EuU$I+`_vL-9d56yR)Xe+jX$WFnhv+&Qg68xH2;SE ztY$17nJom<8}@fKE9>Dj6Nnw!yt;N|s`=Ru!<1LcHm8GCv*~!ac~QEK`01O71cyP* z)OlnwB}1vEnVQv1-34actp6}=Y0&aOqLK1<;0bb6273>;m%8B%X(<}O;ZpPV|MPKq zBNKqi`9=$z8~e%}el^43k(2o9G-~5Uj;Q&D3(WHmYY#W4=$aKsj%>9E(E@X&R)iz2 z@+;8bO%^UllU9yyYB}Ns<`S(O|7U}jiV;=&X_59hWD`m{kX3@g9X%Yla3baC>Bx2T za`blearAZcbM$v$Bv&@Doq+8OY!_g=0^1GP9ALWx+au*TMhi!E3?|{Ijyzy{HiV|kJr06R40Sfb$KSm8L;aT?+Rz~-sA zu%m!I9@w!M$jpvw$EEGKtR}cz0PHXgmx~E5mpIno=Q3c213Q9VN7jusj|~sX#x+&= zpVpmg9qSZwuA$_NCJ5l3YDmtQrsRlEYRNV^ZcxbCLdhB5S~4xoEspJkoNbO<9k)4d zciiE)({Y#MZpS^qBJ2}^odhi6JsH?3z)l5r8nDw-j(h6`%|lesJPPcLG(j^<6*PtI z=W zEAnNtc}sYZvI~l4$~Z4^UZ${fDP`v>0>KrO9o*jYpbdB=|3l_8H4@f2uUF_n!w2bE z*IGg?%@*fvgq|CmH#$?!o19ynH#=`}ZgbuW>~+9i5A1qiHvqd4*iFE026hXuH>8}m ztMuIMyvMm6>A4Ts8#Q`v2KE+UZzJ^F-mab6E^KxXdT^ytN~7mlLeF!KHO}XpF9LfL zHG}cG758*F$Ov}6;@qQ4f8{M7lG^K<7H&M%!`Ilp%91NJUp?*Qxrq?|<@U9CFiZ&)^ylbLD z&Iy#9y#xU?dQj%P-jtj{k7yK3cg^Kgq$K*u`B5+am{tjbCtSI zcHxNW9bn%D_B~+V2lfMCKLqw8U_S=-lay+Dpxg4T`AX1uC2iS04$Ei z4*>fkus;EdTIm;He+BlplnmjRp(>EW1mdfHCUV}zc^ zfz|e=bfM|9$@P@$Y4QOUT^@fbSEMI%llhqNpiYhXdD*o~;pY{?50^vPu^t}k6*xxNOD1C9qy z08RwX0Nhc)AreO5Oexnl3P09d7w(9T{QLx*S(QGx-35nRaFX3oI6Ql?-QsDZ#pCXP z{J3?%Nvia5v&fH|lh%xH};(?w~v54!a}ns5|D4yA$qg;GDp@fO7-q0nQ7Y4>&(? z0pNlucV`V3cXxt|I~TZ68ZJ>4mqa@*Z5B7~;|MND1RfPhhvn{}1eZK1pL~Fe5CfTB z8*n+^JyyYG48}x_gsR@EO&u>w!6?h z$6e$ub|>8>z;y<$3vgY5>jqp7aNU9H0bEbua#QYk3NFt5?geBz%3TRuFU_`j6uAD% zbQE`VJ1%XmR_eS?7;Eo0EIN%WU z!N3gxZYXehzzqX#c*?y+;l+KEd#n3qpdoqh2r9oC@y3Iv&Cdu8iyx@ zxOki%m&fh#c)T8;$L|Svg1{96mjn)V)Lh`^0aps#$-vDAt}NvVYpThU@MLF1JgCLA z2}~AM(<#7J6H!ysE^68=YCL@r7f(Onvf#Gz7>MMa@@QFAnt# zSAZEtfuR$aEzK&JKh#o<^-NHBL9++N3)xPv#kmMA%@hyreVX!2^-S|j_ssB|=$Yv` z$urAS0Nf(r76Z2gxTU}?18zBRs9;Y8?zEJrP!lhn5+Yta$WmRJcv0ssx%TQ(VaWWsAwQG;2KT2rid;F7sUOxx#a$=PJ)y&()r5fIAPkRluDO+-l%1 z0PaHIE&}di;4VpduB{g@8$Fv4mo326&tIZ=xdOPgM7&(xE?(L$UhW{c+zFgEf9bi0 z;IiFwFMjaFy$ra^=@qBL%`a)a_^{_O1(-)EFjtbE$K$Wi7jsop114%P@6ZxH>v=&z z=6Qr8z73w8wT!y zG{r>b)d)6^w`0?0Y`i&$jTapn531OBa}gVFFK=&eFAS{V9s=%Ra%In`w|l(Ea!Fz&tqIZ%v z-#gihLnD-GPXYHdaA*=e3*2+SJrCRqz`dCAPOHb|B#O&y;9g3@Wv7Y@JxZoMu%=Cc zHQq9U%L3qD)^MprTv{C_c^7$?D!446xV%F8eL2NtS5sWf*K1u5-ZK?k&?>?{-qTt# zEzNn}O9?KkyytsYdoS=_=)K5$vG)@18sJ_7ZZB}J1NR1SZvuyE>TTfO0q)(D_p*9i z)>2&70ry@SE+475eA+Hu+AdvE1ecqDdtbxl7R1Fl)_W^{ZbzX498MME^}`0~a+i0z zg3CP=myb!m-$!x5Lj(^Fy>i~Hb^XI$YW&RdqVa>ceAZerEzQ&3R|qc8c%St?=Y8J$ zg7-!5OWv2gJAwNGxG#bG3b?O<+XoyvTD}GDJK(-gd3V+0vX|n5H2si<%K;UapW1P0 zJ1(CRTs{MCzlO_~e=A+S_a0Di*-vr#@lg8xH}4;cX!)J8^7A32@#%cHp?S*3`1C&3 z$N6}l;1hiY-%-H*3fynNq3h^(;Qj#aPvHInJ_Gp7l+UQJ;yT4=_1Q8aJ{kB9Dl6=l z!0UnM(Qx5~c2?TViZ6t$_`<;JR91X3WW^Vk^2rBy2H!*FN~W&01ND5}d_5>GzU~AU z9#77m0}s7Xu$vS>dyR?*x2TB4E0;v(k1}))7{&1wN*+vL0D+@xG1t*$nI> zz{lw|L85@WH5yR+QofrNXtq*lIul{Bjf$BrO`wsS`R3y^a_;g`>t~h^tsj&!Ijtqs z(mdpQnvnCb?-AdlzQ=rz`=0PU>D%FZ3iuwt_XIu{_+G&G2EGsQeSz->eE*d1nR+Sn zB9$^bfgg}2WpHRm#?<_A?c}tboVN)%?*M`02pU0RBYaXQuo^6<}Pq`$xLYL1574IY|Qs?c)NBOC`X} zX$Pk5z)U5;V0+KffH{#`F|Ev1`{($RRKEC&DK4`~zt5$(6gI_$ovd|znV%Xzv;1iM zpnNH6Et!_4)_)qoWubqOf3bgwf2n_&f4P5!|5V_Uz?T3&7x;O=mjZt>@biH$1AajY zcMXY^GZ%}YqPjMkL)&5Nsmu8mQW(KsbPx-0YGs}-=58^_ms#{E^rMbiZAi?EM z|6TsO{rC8{`|tJN=fB_o0Pu@|Ukv;b;Fkiw4EW{1uK*q~IxXdYNWsPbnE!GA6Nn3r z-?XV}{!HM{0{&bgT~@YBm$plnR|qb6CYCl;?SGZ1qu2a<$p`q;fj>jJ;=o#16CT7j zGJXB;`ae+6d7q*~jH1qs)+*>%SXg2ciLL z0L==Z0fe$#CM(pz%Alg~xj7d*OgyN1gJh)du?DW80RM`H$YA=i3KCU9BcN(C2`=}!QE zKk4_i6qg5@;*#~5*7er~r~x!9fCdoa@=$BZv@|yc?jX3N0yhP=25t`A64(~FHE>%1 z`9NP04w4@O{&C>35KjV+xT1gN=~UoO1((3~z`cR{P!plu^NflM|2*(70RJ+vWOlaW z(so>)Cb(elJ*(mJJi+A!&%nS7xHgi|m#0=U^A$KLP$z;6DTYbKt)K9w!*T z0{&~@_oaf}6kLKmgSo+88Id4*f^o?;`2qfW;C}%ANAl11N$a)`uY+XmesC!8-)guF zM_hs<9IpgNxN)%b9pJuac;)({`|ii^pe~JuOTqC$W$k|O1S)6t69mxmLH%%`DLL^Q z%%5r;%m|)DMNM!fWrs{+x0p~%Qxsf4*eMPsgC)Va!Fj>b;K{-H!7|`ce*6YJ4w`-k z{tw{)1pY4&GC;^o1XIi0X`1_;_DcJOS% z&N)&(`GCL>gN9y_oe^3uUJz8)><2F*$OvQ(JGh1*BQ!II%~`Z$R|c=XJ1}hr=1~F+zIAp@*gQ#q*@3{|2Lzb{L$37}aPaxyOVpAH zzDRK)6WGC>6c=Yx36nWM>-txNuPeChrMS3TOQxlHH~2Zh<-Oqh!4HBT20sdZ9Q-8s zY49@;ydd~M@PiNlAqYYUgfIvZ5TdEz7xlP&Lvi^YgjgCb2^E*l?YOiZmp=$De}WKK zaS3H2E|#~YeDVQiGr@&k>v0M3Ap^xFBvM?+%IQ!R#idgdT-1IKNg*3$C1jKD`9pzFFcbG;115{RyX=kO)tc3a_E1>}(;A(2>w+jtKRxl16e?qv98NW-=>)oBFouAQ$y22(?c^tCx&K*P72Km6@YLY z2!lWv48jl)hJug>!Y~kqgD@f$s$b3)qRZJrr67zd-YHoB+Z^5GH|ux^glIQ$Uys z!ZZ-3r$W~%qQ$vCw2^H08`=VbwmUSgmK9D?w)+)kw~Lmxix#q+Ep#Uc+V0RHvYain z-LWRL9Yd*vnPfvnyz&@IrS;)Mp+^-p^avF#vq--`PSsFBQ(S^qYssDt(M9~TLeEl7 zRM=WFEzQo*n*^6vLc2n{LwiE6hF%Np4ZR+E1B4Vy7gUplnJ`BUmoQ6lsctQqmL@CQ5pf9{!=|t~EQKv$ zYuFaHhp|YtAfQZK1j1qvmVmGngk>Ns2Vq4j>`U{cf=*!!?7paBaD_~9qu|$t^!VIYkk-^Jb+4z;4VMK3mvSked_cIAjEU&A0hgNaA_bR)6qn0Mzb~Pa&CBK_`L9{@cH4@;S0hSh7pUaK|l*;9SGNga2*KOgRmZi z4Ipexg)gbc;UfUsG^TApjirOmiR{D?~=0K!u$E|DBBO?ed z$3~8e42len42cYl(7Ey=2rq%~G6*|Ccm;%AAnXQV4+yWOA|o~F62T=^h|2^J zUQ3fMID<~+rG@rQ!rSh2iOeLppe49h!)5m0X`;y7$jJ&Wr4*Mpu;0DC2rk@1O>oir zy)sg*uu?@?A=`rgZJH&KGYBh7Bg-PoBP$}OMox>=MIeI1ns-2W7lijfcprohK==>@ zl#d^S@JT9iW<4u-FbA@NX0Wy`IGI@dTxI2}cG1#y(Sjk~>myfzplu5txdvJBZN}BH z_#x2?sEO#cL9}d)Y*ARjSpk&&Ul18_BNZ)QHep2)wSB-Nw?uAJaJiM@LUs^uF`0(g zJ&{KVF54sbM(&H;A9*11VC135!x7Xz-+=Hf2;YJ5JqSO5upfj2Ap8izPpQabswS$5 zJQaBwad{SmpEXT{L+IZ?_=AX+KihF>J1!XFy*`4L;4hkJc>{5YyeZ|A4+v;v;FyS9 z8*q6)@{xkehZL9pk$(S#;_`b_T$a?CpU^u0tH?JBF#9Mlf3=oSOLHLdCjsWi$WM`< zBfms`jrl9S5~9Z8y*yD%+0K5p~B5<%1saf zXfg6d17L2Hnn1InXaXTL;X_GN8C^=CIVD;Zt&Y}2YoiOJi=vC8OF)c*7y~g5Vgkf$ z5Icd`8N@Cic1=Z>DbNIaM(d)0(3}BcHx(L;u@ifMm`kAP)ecSDp}CMia}kI+8Z>K& zxVcoyCm#^I6a7T5xF)H?ZCck~9lch;WgW$(XKV68>abc%wmEtuRZvk}+JVIMZY`OX zW?S@LLd>nv+oHEe?}*+Ry(@Zm^q%N;5c`7I55)c;4gm3J5V4#CK|B`3<5E$K_a;BS z)zOE28%yq%b~6Z0Y=<|PmZYsBEPwoTDpjy?EU1L6=eDL}3x zP(f)iPtiA`Z!5sOMS;m9J^wD%OT(J#CDx~P{zuVI6=2Z*L10F-mP||Yb@V3!%)aP1 z(Ql*QMZb^!5Zxa=5d9IvQ6L@<;%E@ZfH)S!aUhNdaRP`Zq@q8odg*`B->F{u3&e?< zUc%R4vZ|M+wFA>;U}6RYCUz8vlT=`0CIrTNdvq81;0|Sk7J4OmDc(pg#X835;Up7c zPRh*`1R&<2+)QoCjnSbp5DUg4l$%(Xax=ZPWLla|v0lhctaGeOtZS@WEGO1I)+5$4 zmJ8yEAkG94sh$O50f@6fECg{5h()PbZ-tv!|JZ=o(HW5#N}ytmn|UCXf{1h1ATDU< zrtRE}BHZ8$o7A|$HEo+>_<9o~f}JRO-a0Q+iG& z7|f*f%x^-EB_s3Ry%M9XQ;N-rDa+bobXl8N-db7>q4_bgtSwd+TM#RcRm3V|r^Kpa z)v+27D?vO3#3~T0LBwBcL0kypA`lm+V(PNC*wWat*m6YZR1lYF2rUP31&F5+gzDN6 zYCA$?SzBxsh)Xquv}J9vi;1&_ENBC98AT{OD9{+5%VSq5@LWmZITZnDF-}GU;JTQy zxGhE(w~25lX>N>>#ci=v?55b(*v+w9V%uW3#%_z<4kFsQXM%VZh-ZU%4v6Q1xDv$k zKwOoIsf*jJxv_hRhcEU3i07-&podSqkW>kwxwsvgwnIY}x5d!fSgk=r7Po~~V6f(j z7`o<;o6NpQt>VtF7X}&mv}D_x2557hl;Zz-4rNoPx_(ip!luOdwg!E@RXBJwHBGVPy(s7+eyq9io2Y2H1w`E3j{E?z zT2OgXt7UIHE^Wu+v_@Z^qw>za4)k{%-ue z`1>Hf3F2EIz766#AifLYdm!Q;KLGK=RQy8)m%#S;XVG0KUA_eIBTc#>U!S1kfJm3m z+i__-Ev2hBCK!rKLPv4=6#G4a(cNgceAW~f z^H#O%6NZG5;*!9Z9Ia|H``uzPEsZVVLtGN}gq-M@a3q`wSHhj}B)lMg1>)Br?gQ}~ z5WfZSI}pDI@dpt1rxJcmx+Ee*x+HKe;Xs;n`AL;7zqI4hW?T|@cFFn#T7o~SxFqnH zw$@k2CXP)ER&YTh_z4i{GJ2F47zy5Vb*$F!BNE3etc;?p{EDo!xT01|Ga)g9uyR6T zVq#JvKQTEmB{4NIEioO$|AF{Bh<||iCy0N6Ap;DVVCVn_T`F;6Ju9;*D@9;n8dxzP z)S1B15e-XMdaqhjP5+E?BG16H;YR&EA^w(34{ zE3)EPqi$1%i`Q`c%%dj4@R;x*S0e{qVte9#1)BRPG-UaG;z0t9p{an8OrplkV~Hmf zZl0jrkmdI+CezY9m)JwNc|P$%;>E;EiI)>Q6R#w8C3b_s3kDw;{9p)xAqa*L7{XwP zfFYVnyjm|~Fw_URc?S$>%kK>&QjEx$_T~5gfSWG}H(!E5TYjI|hup+o4jmvLbj^`f zZ1mb7V-6&KR&YT>0A)-z>30mgLR^|Izn4rMwXXj&JCov)ok4LSEAU%Prl!f}vL(bN zo6i=q#cV_NQQ2A9#%xnI3YBhP$N@ulF!TUJPcYgP~6<+oIqSTbkW5+mR8; zc7dU0vk1Q}rZj zGmG$_ii>41X%p6B_) z-|zLVAvx!B&iS72nfKg#R|eb#SH9pbHxapX6F#khGJLc45tW7pdMKjd|SX zE4!$#xY`ou*_geeuRIs?e9Q|myJPmmycqLR%*!#a5V@Pk3yHjl$l>Q6A}=BGQX-#4 zS1~b8OscSh3Upenhk1=1xeB<+# z6Vz8K(MR-~Bz7(B54GwmCu4r``3mlM!!T6cmN=&s;i9kn8FMD)ub8tjf5)6tFbbIh z3+6dQ?j`bCBCjLzdLo}opM8xYvc)%3>8|YUQ!xST_uPAWn8^h4$ zsCNYx8kpo>(acw(+Di}jPzVYYbr%Khc!Rq%oG+TcJ5nSmCc<45$qKC^MKMM(RxwVI zsu-`BK;%~v`4S>uO5|4&`7$EEn#ivq@@t8F`8I{l=PnAPBEA1oxQmI%SNPpUzKY0K zlMY(ZUDo{PE*I}EPSIU3=C738r2y`tn4*}fn1WY=%C95x>&3s~D?x`%j0{;zE8L1= zpWhTwzqtVp(CRrm$pL07Dt%6a0Rc{PV_V|XDlQkDrcP0>n5&qln6Fr%Sg5#6f%Ogc zVAc}(EkwSK$ZsX`^+djb$ZsR^+qWsM@HtJ7v+k0>5hJf_&CcwF&>;z`9*il>SE zULxN{ga@`6n@oj})K!JO-z}F)%$U*84H)F^@I(7@2ecT=Avigs+eJn!1a4 z6Mw7GBzO5y@e`xis5nXFPi|EFOyo~DB)`+WAJesaf7y}l0~NnFFeKs;B7e#inO9O) z;TaPb7w4??cx&Sd-QK!5Lv>MorKhT{Hcsa)t}m;qj;kmu^t!!ep1?PPuBN8KlVdWN zglziTg19b%tzHqYF$+Oq1ZEYE_} z1a)$uyTq+ZE=(y(j#m|_Jca7`l)}W4WL2Toqg5p&C6pw43KK^*6>+#rO~q(TWhG@E zuc$Ov9h(%ZZYi9lrVgpqih)!k>lV~_QtRBMLG4y)@EhT6SLAp9FN_ec(rQZ7#VU7E zaZ-sop~Rh{RwX2-cr+e&O0hc0qjo1J#U~}USh!FlsACgiRhMJ~livmh{~y^P!IM<1 zO>rm0Cu_B;#KPnRPkg*al@PBfPQp(mC7R+wwYI28+fw10+8{ADp`~Cg`vJo-U6`)Q zY^9x1Y*pqc%}R^Xs+_FEb{FO+hl%`MB0oap?-BX?Ta^x_v&SK2o-$uqK;$0~`G=$( zcF#W|a;&>Q5xY&b$zTj|cBd)N*PQfdPR8Q0x@xc8Q{gERUD8xl?3wS1jB7(2bA4r@ z$7?CERnMz!V=6^xY8BS%+A=XIS7c%vQb{lK*4813MuWN{W7-hUQC;q-LcT_wH>|;3 z=SeTCsPlLu54$2qx3%e8qQVS?H5FyGbt=^%Sy*^PyY?MA=MSHYaTNtC81D8K%__sc z9K-9XYx0Lz7tV%tYjM-Xvb$W7UCnm1drz^>ALu~GP7ZH%bzOt(UOC&l|B&IM6wcvQ z^%WI|xh`EJqq=qP(X&_X@S+NLZSAz`8jshF`f{Mla7Fg46APJM=BX&Q&?Iu*74`T& z%IhgYKjbTzsm@agI}GwvxeF^i#cB0*b=8O?mbuZUwGAC2nTD{2h=%qD`*3~xO)=YJ z{kguYA^hNgfrAE5@nxaPUFpg9ee~4kne95S*S%oVpy+(F-IoW%A3E%=hIWWFV&n|7 zJ*U1-Oqhn-JYrBZejn}sUCAR~E_9>5>=@_Qcs;eE1?_dH7h0GtLTp_01w*+a`!>qZ znr~ES{u?zIRcAUfQA|HfL1GvUlgyZyY-TcJXQnZQOeIst5aw3q0cJn*Hgk|U#JtPA z$9&9u&75GqWll0@WDzn})>YO=Hc&Q57A+egOOR=0sj~61i87+DnzQlx51<%5r4|ksl@UV?_QLksl}W&x!mCv9(vD zwa-y{{jL2=+S!Ci+Qq)-zt;XwTf5ZK7b};EExkcWlvgU3 zD3>a+bBL?^-xB$EME*UI|3KtFiY@&bwDjf575QXzuMY*0)Y*MaMVu$xvBL8iZa)T0kynhgu30?7S^e=Qyxgrat#a^+e zu)b8N^i)=R7YL1kg`9bWSDKr9gJd&@;>Eu<^4)*W1c4R zKZ*Pdk^i+txl{R|@}cf_B0o#ye-rsRY%z$7m>$LcohnmRZJoQS$Rkc`rx&4kUbod< zg*8P%$iMPu6qnT&RaDn{ip|(SsEtxPhc)=;UBh0my+A)o`FTdUyVd;cQNE~r3Hf1V zgbgEXIL%MgxXXgn3PaW2P`)K@dF)fZsoYQ4c7*Lf*iM_3Zz~Td4-!^R*nWho4t0Pd zzG`6GyCQQ-E^U`CE!!xFn{>X-IZU{7%8JWk>F!C5w|aJPrGMm4t)nZ_b&099vM1=R zt7$#iWBz12yCO^fC&|V&Pu{?Kv#*E-zZQjcFkFLtc1$dN6m zyL{gTho+}+ls}2PcRv$0vLWY?@|0}9>{VvO5-$O(VCMw7&#=7rrZ_!2V{k^hGzm7hHtz z&iCMZ61G2K2M~7PX1+Jyhwn?+L4>O$96bYakuD;H6wqfIf1Rh*msJ$oJ#}^1*{t>d z64_FC$)!TvlKK>N6<&M*EFVqS!9lLV595dPBb28JJCv|P2#cTLAph(34o`^~zxtbj zddaK`K2|iVQu#M85Ox@Km*JabxA7`o-LQbLBM3XPAvw=qGFRkKpSfBvO;EGz+iD=6 zJ#f3mMqW!;oR^jIF_urmoSPrVr}E?Z3H(G}N7&JXjUlXpuu8)6gcY_%Ie3G3I)%@W z;b{Ii!eWDa9Q}Zk0?1~-4_nAy4*CsjHTX8tJjKy8NHofY9h*8_PH{yJZ#CD3vf7#o z_X3~9u%KZ6=nLp(MQA8JcGBE67~VotS`e+r)=6o#cm*fanv#|oV`h+)&tj9Avv)O^ ze4ic6*_~0cRNl$w@_BqdU%*e{r}ESI>HG}d#n0s3d?8=N7xNyzgfHc1@n!sMzMQY% zEBPwEny=yK@Ls-_ujA|ax%@nSKEHrp$X~`U;xFf~;1}}^JmIh8m+(vZtN3O7)%-R5 zwfu5^1;3KNj=!E?#joaX;Meds@;C7}^K1EA_;viP{Ca)^e;a>0e+Pdje;2=z-^6d` zxA1rKTlstVd--kref)O*e*OV|2fvelkbj7On16(Slz)uh#XrtJ!9U4A#XrqI!#~SE z$3M@%!0+bw@GtT&@h|hQ@O$}J`PcZ@`8W7|{G0rK{w@A({s4cFe}_NBALifXkMQsD z@ADtB^pYlifWBh0QasG4u3;s*~EB#d0wc(TFd4N9Zf`6Z#7Sgn_~!VXzP_3=xJ3!-V0&2w|i!N*FD~2nsR!qvhx!nMM3VTG_#xK6lUSS73$ZXm3Ruxi3;2pdn>1i~f~Hi@vwghiW9A?z5! zjwLLbXDVUG6Ltb&ClVIzIgPM-!Wsx`By2iiGYFeWSQB9<5jKmk*@Vp@teLPD!deMC znXop(VqWJUtdp?0gv}#tK4A+8JB6@Q2|JCj(+N9+ur9*RB&?gTg@i34Y%yUyge@U# zDPd<3wv4c|30qFs3c^+rwu-RTgsma$9Kw1DTT9qF!qyXZE@9^pc0OUz=Pe}cWrSTs z*vkof1z{Hxwt=vOuvZdx31OEK_A0_IBka|Ly@s&Y5_UOZR}gk3VXq_X^@LqT*wuuE zmDUjUM#A1i*qaHvmaw-Fb{%1FCG2{_ZXoP!guR`xcM$eY!rn#LjfCAq*v*99LfE?r zyOpr_5cXceZX@h{gxyZq`w9C1VRsOACt)8X>_dcon6Qr!_EEw{o>Sny@Db`wd~gCG2;E{hqKt5cWsHo+Ru~g#DSYzYz9U!k!}R zZ-o7wuzwKtG-3ZF>>0xTMcA{1{hP4o2*(gkMz}D-g%d7B8M;|SM7|BG{Wf#XCR!BaOs50AY3NlOoW?6xGchD z6E25vX2MwrXC>TZ!r2ICC!B+DPQv99E{|~egexH26v9m<+%&>XC)^Cexd=CtaBjjC z60V4F#f0+^u7q%4Kz&erePpsvsfIG(j7F^ux6p0R;$J4 zFdAIeY@H+BV#^8WZlp2#H;s|2%QhKYy5Jmap&>`fbl3^46ANRv8yzmIPM_t<(V0!@ zM!Uo1v}L=jHeb3={^ZtC5&GkXQ>rksPW36<{*k9lGpnmqV8kh>w&0 zh_5_ve6e^&hd$F~u^EguDX%zRgqVG0zDZADrnYF2y&xyJf^e3*<#3j?Nx|W8j~l{` zXhAPiXA|quX4G49tag{d6v)FfG)|&Fj{m|c>M1) zG@H(5YP8_lI_Ej2E*)*hBep9y5hMF`O^HC;?&FJ#^h?Jo>Xw1P)WBMHlHq12{ z^8z{APeUu3h0fP!I}Nb8&)Hn*NYrK4lm1|bz zI;%C?q}Pe{>oVp$jApS)Tso@>4KTYvvhc?=vZiTX?0Ox-qICt?3>ksn_%jzU`cWzn z-Bf_~KYrVZU4xX~aTFmA%;2f1s9qqR7(?4e3$UhV2X!Fd(NF_ILg}&{Mw?kIONPzjv`T_Mo;Ro^556M> z#i4$r-M#de_4`h}zbFO4IF#0dqZb7HfganyIrJ(RHI8Nn!CMdz3Y_-e~|yl#YIMz92=x%@2suCq&*C z#qKBw%qL=TV+4YQdaXa0Z&WPENwZ{2jUpDu{1ALph^on&X)zlu=s#O?CTy4>R%jLE z==2tQe(Q16G|sS)lpML|OC^EE2yIb$I?PJW7b%%W8Y;{5xQlU4XVD^B1=1*CbDCXF zOyl4ul3mBp2*X>6;15iFIbby028-hNmt}dpRi27yZ0OWicor>!(>wj6rX)U*h8)mJ zNX$@d0Thj$vw#X&xrV8QEwe!4s6&d>V^yjD@*^-Dt}-!Y8Gq#LmI)5~tM| zt^(_W*r_z?@W!Z^2l_04;oXu)XXN^96N(k^ff+PPQ0W6vq&`c`oMc}&4LzhW0iSws zP*)my2`N0D&x=|MQa9%N*EX1Hi|v;VZBl4FFBqY_H>x8qW{b;e3h2$IA$m225DnqN zNbSJrC&^UOKqDIiiDq}@nH-s|&!uB)Xr!Kvk%SOdbfG)#}iFmzQBQiQoQ z$bg_Aj!e`zoX}yhWCu?_Vi(Y$K^|@K1vP|(!p<&i66Dc=iE56{j>>moEn>uKOq?P} z23Snv1X&3lL~Vd<1S^g!?^55aZ!zBb5Qu3X!szz*^O2mT{-w%+GWJHfmGsKXyBkamTDrT zj@Q#reH#mDM~(V@D`>(RdwbKYI?Vz5wbY()0}y;CNH`))W-9ZQ!R3w-n z$jz)F&b5^WR?5U>b4A%gdTnvhB5@X(ZJHv^$T2@a5@qcP(y6qBxcohFyv zw+|wj@_rh7gv{zLDtDLCAwXR96ri#&ImUbgoiHXT!Bgefoit8ta2&nODEha_oNl2r zE7Y-`&a)tZDYVWet(Ic(FjZKkUvOkPEkk0y5mL(8V>ICCkboA9903zHCKlXEpPsQd4Cw16QC|Nl1k2Qr z#`GqQJS?~bL6Myfs}r3iHq~^2M*8;ok_${Mj90yNg4vA zxn{a08#6502}-d(qp^kt$7(Es6hF8|zi6IJOO4l`q?8QqE2CpyP?MJyNdDO$PRpAe zrgT%|4DeeTXK--Vq&O|iYk#1j`?M4~c-r$54K_R^n7AyXO~HlPM{}q8l|~7v4XZN^ zn>39(JH;<$C9`|P zQ~%Lccik*;d)T+_=pXN#aF&okFAjI*(V7U2)!5Qo7%1a#_6Tu?Hc81>#Vw7jaqVe@ zVND`PqkKzAbfPf^H;G|0PH9n}rJ=_)32l^i46#Y;#8xKe*+EHR6iUOcEgg>=cV6SV zwkQ?Y4ZIksZd8hIk}G=wCU-fFTU)_-lKP&wo-}Gq%Tdo`=sq;wfF|)!>we!vN91>{ zxc)R~Q+J^ba-IYR(OA(kds%4}9jV2wRF~b9f!#^8S4Xyy&K0FZhDiBo9^BW!9nzp2 zH=G8AwOR;jrW0Xt`O#u3qiEE=EkzC9d5BZcaQzy?VK*hPk>xPz@Yo@G-6&3=0f#gO z^lw#T(;wXurb3uTI!uAZQ=E#1hqp?3_YGx@wh11`;^JxO(T$cLinG~C6d&=8uS5aN``MK>EUR*3e)q#m;zogJ%7 zv6Iu8vYi+~q;ij=0tyJsuM^VT;-L=gG%s2dm?${V>rfqWHs}m2IpQX?647K96AY|9 z0^Ld=#WWgmNV61u26Tw~+#$9z((t33h4)V>#c~C5h{#gGGFwT8CVUaDfn|yfiv_bo2d~2d8hJ{`?ue9=5~@5dR9TPnQqdWnD)D|c-0>yp8jNYq3|evG zgi_qD%@#WgNviB3r1G^%s2*|M2R)4XxQ-(3{Yz36R4S!Sx$^fzv}4hW#lz(QNvE3X zXfB{5Uf2_79@tpGvQ8JY)gR}j0;z2f2=oWkN?1FHbsoHH8&^-YCR~gb?UAHHg{=1C z=2JCw8`KO1nB8G2MmLxAl4&k$bIE)i7J5ir#FVDH;!MjXU0sd4qRl1qRW`j!f<7Yy z*Rs%;S@Oio`GLwORP918DOQ@l>aojcHfEz^2#j1(A(v9AQ5P^$c6M%#E8Ag_VqHyR zsV)#p%z(`(&LjM@Rw?>&8a=)Z(NQDVJjy{sO2d{y;M7IjbyQ*e1r&UZ-D1V4YntL~ zkFY5nD1%lbajU5qe*rPEH0ju5!&XM%qD|b5G-_fSqB=4$tQzdPbkQ2fOJi-Wr5YD% z%CrgkH%VLev0JH5TpRM@G}|n=zME~aSOY$F8;yOTcI>mLSfwplRjS`RsaDgLS6^FK zT^X&fuB^d50^aEK3U?`%8vaR7$auY}MT?v_zBSv4O?0O{MCWd*)6~ye){*wY^dSoO zwp5aAj4t)=Qd}AlD@Bj_oy%m$^%rqMi)o(tg=C5CG=6MoorK2sH&LBE$CYI)z;$bb z6nO`Y+@wN7BkNt_c;-ZhE_xL`7b3-eh{ldNU($MXD@fK}fU!?H^b_|eji)$YJd>F& za53Qw+76FhKvs)Myyi_$(iFI`XBoJJ827@3)v&-rqef%EyvV=DZSb#|Ty}T?Qjlun zMXHu?KI1fshDqZy+S3G;XW;Tx+(8;^%=v8Q8(jPcqNKAkzV&*L@efm> zCOxc_Jm!gdrBa%~>GShjZ&L43omLuT3pzfxl3d_J8e7+LaYAGJ>qBp~`UeXP-M%@X z#TGE?CsePM_9p3xJyehyb~lU|4ud9=$EZpxRojY+4V%PLsXnLi^I9#H?<%r*!P+eNWYr+M34@wLn2nQW0%iMWll2oDPfFxk`EYh0089RmS(Q z3q0gQ(ECO)e{OK~5dPB4Nq(bpO(q9H4Jbs;SJAYqr*ciUJx)`tv2DwmPb)Zcm}zfs%gedU9JgfHm-Xy{24O>%VFZ6TFL zP7`Y4QF(5!xIY+et*$65!Yx2P*AyEq43dfS8shRZ+vRV?QkzkAp;}G4u=8l)pdb#j znj}9`MbY?8{HW#l4!SocWkB2#Gumv8eX^t&5AEMy2(cMx67;byV@>v$*&O*=|+!qq0r5 zPTC-=OT(28xUV>Gfu^C^v_UnHDx2DxVP9jXSvFYo^!$Kt(IzedgAS>vqN#4n&U1b% z8*{8U@snmTNIS@?VHcOjfKk(NdYw-7b$apG1@@1`33%WjjcO#-ZPKH(!K#=y8UmY7 zsu-%0b_o_t!}$_1SNvXUV|&`juvD!mt1&p z8rgziA{EqMLgDFxp#?=PRctb+YrU3(JX~CNG_RhqRPR#y4{=I`<80X6%XW$VZ42V# zsd$?kdT?fQ#Pj5+Bzn!JdA4;_*?0+t#T9Jv%$5-wMf7r8;D!X1fofXYsu^gQ^q?#~ zd}5>HX*!I7CU3*NF5+QWsUc)g`8Kz#fV{8Qvl-D%n}bh-sU}fD!$s#;y3m4CL+Il& zab-R*u;oz6$rml@%cCTW%i%b{6J(ZvzLn~?xqohA14$oK8HYvO2ngufscxG)nO1bo z#ys&lkW^v0RJ6&KUz?g5PMiBKH9Dnhb*cg?b}8*vT1xn4-cshK{Ub}#T?h;!z6~T? zYYSM?MRlER^?;xzOONA;)lTn75hs+5i!0xyS}E^^G!4roq+vH=*W8jV?#>!&^r&KdSC(Y0EfSO81CZ1WCw4%NRD=eOc&PmYe>>L*or9Tl6=)(RJ^#5eDS zGx<+W<5IKav|`H-Ov#(ii09G7nye^VH*ip5k~O5=C`>hBHyo`Lw=bF}w2&q=>0(Mn zry(8kRU=_I}Caw^>BUNWd|o#NIkF8<@5$y{7CZ?Xhxpt^1L=0MB9 z*?sY=gwslml$yKW$HwoGgrS6ey%%_{>I$Piw3BenB%AsKJmt1@>8` zoNZ}K&H`Gv;|_;?0!5S@HqfN*p=vGfHHb^sre?F@@(xbb<4PTF@6crz*i8Yc`>0gw zLswHNd*euxgHr%f`5vG$tvB*eTluDzCbRDzb4z+UP7GVpeaE{c#RsWk>%CCZjOiQ} z@#=eE__G@)yYztrN~%YwT$A1V^SB1K@KyPZCmjR!+C_C*pOv<-iRs&mpy&O>8!M1U zyAB(4jprv+Pg2p=m%goux(rU=ExLh86D}+3rJDg&&rsRc7eB4Z`Z6hvoPNV%)`PR3 zj>d~@s^>2;*Hm6wWj3Fs?D;3T4q8r#xhJ6&d`e4$Urep-O#fa-@)<7fOe~Fe2 z+MNry2HpMh&7vd|9H8>8Penqq8?dZ@QjPP0zH>?;9(;&Ow!Xe@SyJ4q7AJX_GD)&h z9*t_xo_uB<+wa;>kdg5;vzRXEaU!I(l(_L=oYc(fD>w>T>?|nqyI(%xELYc17i@cJh;%82VECY9j6Jj zsUK?5O5(94?7f%_7{v7A;TepzjaP6~Us8Fs#jf)o3&9BJdkRP32^hZfAz}#MBO`*3 zXQ)ol`0?kBABc$|LA;$td!1c1CXkC@NVgb$xiaYh<$J(-5-^GXp zix!FZ*!t?qw&442zKr@aBwni08R#iO@dJHkM__RMgG#1dv}BGk$6~`VTBMOd zJ0>ZQXQ-g|q6Oh#;`XN`^EZ{5aM3biThOJ8JNrR%CAF+I!}$y*x{dg{A@TfkbL-KL z$ZXfA(@RGF45}ljTA-Haq{qQfyp-8}B6j4piUvuju=(o?zS;&r3@QbfyWU zUs?jxCK!vw5hUnTf|{eEDVHXip_g`f)sa-kc*#00OhxG3VdlV7Nz~n`ruot|abY4& zJY?*s zs@X!L5BP4-2-mDPp>?lw;PjbvC00F{3hK{O`U?u8Yr+wefZ|Z9*g~h=_AL6Qj?&&{ z@J6?K1XXXLBW=4nJr&(}8dN=+N@o5O6Zm&Gf+wVEC6zs2L%5)2#fb;Kj3BvG>_5+H zOP;ExvN`9mfZbD6?=7ptpxk7D!p*x*oA^uzdc96uHPbc_7^Bq*RNM5Av~fxkJ6o8E zHQp+sPNur~|40`nzs2ku#oJeK08hMVZ^Ug1;)N#3;$vts_J1uIJRZiHhZ~avm#x*Q zGzIIwmO@UJc;lLM|Co9rmH%gT8*C?Rj|BR9J=H#6Q@^m^1Z!h?qqj=u1k~wN{d~Rt z#i{3FSdoq&sZCV8zxZlH!Qea4gXgX|vKtSa`=11?&QfRlp8Sj(`GX#{8~Pk(DX>-T zz~hV6lhrmg9+g-_xH*LLZdNbYvdDDG3wQ_oi~P%l(pre37JTz!RlvATh9iwJiG;qc)~!Yw7-GQwR$ zxaEXfNx19pQ(viGqF$=LO1(^dwfY+Mwd&>S6@*(&xHW{kk#IK=ZY|+%A>6Hm+d#P6 z33o@xbNtn-eUG^3E_X$0q!&3HTAGlOn64J$4SKaPL9b3%X$`?jclwo<3OA->a2|7Wm zG9ZgdDcS_RR+X$v3{l$VSGu~HQha&}?1K1)_=H51&ZrY~$;oO#r;ATd)5gbZ)Ab>C z+TmBawwY2gYR-_Pix-mhiD^QDAwesoC2Qh^`1q7~LrO|~da^e7ovZ3c{7NgDDXHV* z6O4xBL_uRnNfr`xDacd09{)@*8k6-Ynv^7cO0b=t@GD){Oi7huRKetGAz71TM4phl zlw`GDFvh1DRS7z^Mw_e(R(jU2w5pksPG?L>Pee{qREe;7d^{|koR%VJ)#Cdd;T}d! zn$*%>Q14+B8`ZlBcf&@!6T|mvj=(d|n?8WQR*JS){aVv#(ob)y@v@9iMd_z^)Q82N z4iWC=i%IMQ^+&BK9#wxP{&b9R>n=v|EA9tKG*RUE+(?!!&6RC;PbklSv+!n&!O}MRuyN7W15^fve?jziG!ri}3(~}v^ z4A=D0^wsp!^w$hvMicIVhQ4@JIk$swI|=t7;T|H~!}v;DP)Fa5fk#bFDXTSBl$Dm@ zeI>5QUcRplcz*`o?^2sr=EYks#P?=I2Eym!)x_?qI=l}iIIQ%*S&S0CuY(^v9Qe|w zo9?bGt5_huJCWwW_oevc{R;7p)MlB$`(cZ`c!kc?N_SCp?R>Q=R-NdipYbGy;<T*1UU!B0mONNfq#AAA) zQK6f}!=4`{++&2>wONy(Nz^0}?s3BHC)^9-kf=g^>5A&g=3>rn^VC#(>%{H83Xgc} zti8Un((PT~t4h14l)ldy4+Lx$#lItnGB*3kQC3&sp^yL9jAPE;tx464*G$k%)ZnSo zPY~`o!lB8(NVr!TOj6bjnoKe4M)dD^(Dajpdx~&RZyvl`Gf9(0I$~sfhH%e{Ss&Rf zv5=fvy*P4>QsKeF=MR{M#}wH;HF%{F-hb(P2WY58LS%japzlp6VxmWcG0}Pccj8C| zuxs*KC_wb%ngZCq;~Ru~p4xtLw3F_qO3_@Jq86elj2aJSF!EJ|+ape5Y-6IO2(vX+ zEkx*XTvMZ&L)wia+)ISRD~|lRJjf(6T{ZPgvL!0Y@;`XR=+4M!IorL*puy1!Wn9Xb zvExRh>P(ZevUBWtQ(T1=-r9K!eJ>w<$M^D4yw=liO8*;3&30WKI*mg3c`aTTI=CS` zH{Fff5sTmH*{e(MegpAJ(AaX%g4&=rh;HiBw;`gT-KPEn8rnDXYv`G4wx{E@%Ls{= zSX6rt4;eaac$X0)M~#lbFLvBzjzml7&5hH{c7vz3$Xix}I>(P_hAs_V8+xPZAZHFSzSHEa#chg#$at2XFYjV5gT9THBBXoV;=|6R#Y9k$NS`9j zBo#f_tIPO_8z(eGHuMs+lV%*aNpEO~YUs8pJ)@y}Lyv}@c#QY@Z$AMc=4dQ*MdVOSvh5-!&Em3SH z!?2lnN@jIfB*RqVb>T=pI=^5_bcg*+7}JSq&!`#3T~u3>V^4R8u4yvrqiYe!=cdx% z-`-{Ddtl!YGOf|k(zk8=Z&Xo@w~k?CR)mko>&%Mqc_}_u%&V&rzdwo3JqpXk&tVbb zXD>2{&wa$trM}O2XA{EsK2H=s7gtslBaE2mn&Qf0@$*age9hc?4?c%y%GynVxz*Pm?lnq$q|FH6_gL&<|*-bJ$RR2bS}J1yln}y zExe8#eN%KN zDVGsjUf$rZe14D5_?`X@`4hGZ{|u`wD~%Sv*4rG>*k+w8eny)R|FmN|GhLY;OkZXY zGYk`Eff3(3J(iis7@0|og>f(i%nYW8nT7XHdzpF6BD{lo8MA^}&D_kaXYORSFx!|N z%)`v%%rnex<`w1*yqo$k^C5GT`GUTc`Zv6nS|;lt<7C}sePx63R%)e8gZEO8$2+OB zWj0xXY^JPKRwb*KEs`yft&pvet(R?-ZIeADds4Pr_L}T~?0wlW*$LUtvOmMZ!`QGM zVFSZPhQ)~Pr8uy4aog)`yu z@Lu6V!i8{cxIWwxJ|(;)+#7yH`10_z;hVyDgg+I&H~gLOqv79$pN?oB(LEwMLWmd} zks0BPD2kX9aYe++i1iWoM(m1sDdL@oV-Y7K{%*&$8_-VKZcIBUgG8WTz3G#&oiDD(7kW<<1{< z{zWdA50$6LC(Fy^4f1vJ2j#EIkI7H7-B<;yXQ#3C?DgzD>@OV0jpQbBQ@A?r zdTtx{BKHaRN0;thV!N2S6n9zNWkZ);T@H5np=+nEBf9Fk&gi)Ni5bbYJqcafbU zM@H%+-H}&BZisv`@<`;VsP0kfC`(jj)XJ#)qF#&ox?6{CBfA;96?a?OZF9F5yB+Ty z-hEhiefOg7OS*6A{&M#(dbIB`s)wn^>>ew6JkVo*kCQ#S^-SoQ+jD-;4LzUjd9+t} zuaUh>y()UG>h*B1cYFQWdth%}Z%^-Qd++Fdu=nqM`uCaG$J1wdpPhXU_xZDLbYElN z^1e6peZ23-{UZ7)`c3XPuiqX0Uhel@{~rCv_Alzcy#K@fKNt`;Krz5J;IaXm2kaYg zYT%%O83Stu-a7Ebf!_`4HE80X*@JEx^xU8mgS!tNKe%l0O@p5w{7rPvXkBzg^t$Mm zqE8MPFeGzG{g91A_76ETbktDi&?|@T9QyIF&cn3BN`~DuY|pTh!v_z~8NO)v_Te9l z=rlq*V%CUTM(iE&`^Zrv^G04h^6`;hkLokZG-~0f?V~;#&5fQgdd}!gqYuTjkI}}I z$J`$CwjxZCsF<@9n783`1JV2@lVA6l%P!T zB;1kkUSjveoW!dW_avT8N>1`7?MOP2JUn@3@@>gSv^}&|?Mm&dDeY3yQWmE?lX7}Y z(wMq250CkAtT48G?0sXu9ye;7XWW)?$5V%Gl%9vvS&e&+bQ#vh$9WP*FbrU{=- z95%6d;?{{@>0)%Vb@%IjNK>VG(;iFvT|Y*Dx&8%1xFN%^+_2x+&FD0)H-3^nG`%!^ zd-}Exv3NtaK0DT~drXRXirEL)N7&3-B;EN4>A zjX58gN0_V3k6Rdv$#SFRW9umE9P87Q+fTMm-Z1$~o7%R>w%6VrPl3A6{+lDsvC8qG zbF{PGxhJ=4?zG%(xxeQb^48=X&5z5!JpYY?eg$O(PfY1BC3ni!DW|3yr`|mEi)o3| zmQ8zi`l#vir@uC%-;9bG&$_z0+^$DvwwswZ^S+sXxh?KZ?o)-P!rKZ@7U_#_Df+f} zV)0GICp@X1HJ-0ZQcKp9d|jGadSmH{SrcZho%LOrzHEKjPqQ;;-#PpDa!dI=<>xB$ zDt1dG}&{<%EN`8+UCQxoPd@ z_M7K!{&Gw1mc4gt@7}hx-_{jd&)!pY&(V8r_rA0(dE2)82Hdx5d)W5+?I-S^cK_QC z7#?_Hhp=Pg&R#oLJjgs)|KK+d&3x$HhqE5u^N9A59gmK9^tQ*kKel|AY}bNaCm)~n z_|Yc{o;dL2q$l@0HTJ2;o{oL`o@a(Uv*FpE&#ro|^K(m|JNNv;=TE&*^TKz#OLrgN z6hG>Yrh)&)wZuSUq5pq{lwefO#SAIZ)?6i^WC!VqrSiGhtWSg`s2hO_npi? z`NdD(pU(Zf@|V89-1BR~uX|2ePkr)RGw-hsf2}(k zbM~pfv;O|*T;;iQSm4yvhb&w+&9#O68zJT|kk-YU=8KD}%NEhqO<*Ni>|2g+x*V%2 zta_S$&vay>n10M~CWg)|OiVU2nXxl-F_T!rtYmIv?qW7!7O|CifO!;ih`r3~%sys6 zbAWjV^N1tNC(M`3Ps|^fLv)e#lns&%kqyHfVw5Z%a|ov_kIo;8WhJs%ve}qL)X2QD zI@w&=4YGS=uggA`eJ1-{_NDA=*^ih%{3`oRc3O5uc2;%{bBN@yl(4a36X_hn9abDx z8RiWmVOND+7q%wsUd$pM3VSK+)vyo4ehB*|?9Z^X;T^+!hW8I29iAF)4EKbWhL?qx zV;(Ut{POU{;Us(sM#V#2k9GaL>rY*O>-u-3EV6xM|Hwh&1PjwIX*Ox5=@mAi91>m zBMFCXp*O`3zPEu6J^zlCxGKjk;rRm@@VZVsKK8~#yoP0|a5bd-skx(Intvl1Ig z*J-X7H)QJYEq#e^!;6ElAHDA&gBS2>R%>p+a$C&6Ce3PQ{0v8Rv3o(ZyDnOtFeV|< zw;Om9b9N&Wg^ixT#@{*(-fB+2+o-`sumcUrzL0kWLi+x_sqvMfn!9D~@9X|ruK}8S zHQO}zX|`+b*F2!vq1j0yPLg)mQ^p?uyM%j>aPJfDL&AMbxK9ap3~z7k-jC_py}#^8 z_ko&6{Z}v!yCMrN@%7PxcVyRki{dKrer)V`c^qDMRjs(A8e3FT6P)0a{sfP>BJKZ1 zg7tM}71-#EGkE6Idtzq=C8hksmlPWn^rdExKm89}kwyPz`n2FB*j7q#CAd^^;!DG0 zXN4AhuRrOJT#p~f0`1uTkGP?)pZ_AmFTGG)jEQ{U?>pxcEoLvF<=6i406FVFoR(R zj0Uk_EWrNE05fm`>=6w>m;quK>?sZK0Bk)BmcpDr9 z$G~y$1^5b_0N;Y|!H?i4h8c*g42%KTZyI8s#0G4^XDjDAQ<^Y4l7m2Vk#ibUm04E&~`F zMia0EECbho4PXb@4UT}%878JX7zq+UB1i*ypa4t-(}4@P0qhq8`^A(3?32Zmg9dOV zSPGC%4AO~N4psu}6~wFoutm%|upT@MKE}J%Bf)ThvMIa(b)nb^-UP6#;tz&Vb^x7# z9Kb$G*iRV+kY{C2fcQ$}T{#*k0DMFl3sgV@P$s1w6oLidc7Xa-egJoZExEGLa-PR02}itH;;1jC^vsSK)LxF!Cl~Pa1Yo9 zV1NEW@Gy83JOf?^AA--oj{s%o&oYeA8KB$($}MyQJwPuo44~Ws$}K2?0OG(n0G|8Xl<2h0MqK?OiM zD)@;CX{nHwYB{(LtOD>471CC%1xR1D1>6nbC#u)M5dizCJ_oRc3ieZd1HJ>lgVW#) zI17+xwG4!VegO7RBYic}S1$rr00NePtH3P)>8X*PdMmgWJO-WsPl0Cv>RF9?R__OI z0oX=;5S#$NF^mTG(ZD_$)CDe#Gn(F@FX#^jg27-27zRdwQD7oS1IV8y9b|$@ARCy0 z6~LYvC&&W@U@E8u@KMc1@C-Nte!*n|w26465uXU46OX!&p9>a)E5TB*48Y#;uyg!6 zupZn7?f~1tgWzHCD0mV)4N(4gls|qCcp1D2V1xLNz%g(fd;w4&@u-jZAHYe5N$3bV z1K1*A02lfZwa4+(+rcy0i>504^jbi5=+1=FdM)p601NB@Paxp4;%m=fL{T8Dhc(O zgnTBUE|O3eNw8~@3%CJvk`OB))d<;GX#{kNa{1t#*lfMVBX)@|L8UB`x@+JQT&fz*l7-$DzZ>=13 z0q{j_4*=V1(FU{w0c@d#|7k}8*j~$nIG_QE0QI093&sN-fM04ez$B0ZP#0R*K${B+ zz%&3mXbXV{z^>YI0Gn#(0N7ItdukVg%RvKJ0^oz%Yr#qYU(~JvHv`n6b_2KrYy?}t zJ>Wj@0C*5Q0(OBX!7~81*1|8fu(S4602^!f1K3x42*9>l)TI`7)gA@M!I$6!_zwIC zeg>z&9{}~O{hMJ@WFP``0G$B`B0+c13-kp8z+f;Gi~ys762t;ENC3%T3`hkNfgYp- z6UYV@U;|E&52k_{zzvE)DVPl^K@F${bHM_z2rLFyf~&yQ;3fbYrrZwh1h8Yuy#O{$ zxgYERuw%+g;B)XjI0;~blwUEO90*XRF+%`+WemzSW)x5Wq%-C=unjT8?~pq|FH2ORi5^-T{XJd}iG541+8&so?;5PetBSRRDQUMcz}9_f+IPbu73Mz&}%;0w{kf@}7#k zry}pE@WoW*Jr#LRMcz}9_f+^?D)OFsj$y_l|KpLyc%(5NX^cl20_aYF%_kIq5&++sPz~k)_|Jre0KPNf z3V=2_0rfgz1y}=MrwMDpIJ@}Gg(z*iZr$Ijr`f1Qln+Vc?0i=UWkOek@onRMu0z3uadub?h8p@o8GN+-; zX()3V>Mrd=@G!;5Tp99e1e=rch?&+|5I?_nb24-Ldc7S}Q!w%`NL;A-6_Dw$qj)O12*9?<^I?X_x zW*KLh2@cpkh0(0(#r2m8Q&@H;pS z&H$7t17*q#11@k4SPoW#>%nTU2HXsu122F*0R2hkUYrDhFPoG=0}?81OhUOQ!KRa7(@BHD5P&u_ zDF?uBCQSyg=_DsWStq>%J^-l0NuL1t*rcxj>T}Y!;Ct{R_ye3{m@FAUU1p&!vpN73 zKv}X-mMoMd3uVa~3)X?%;6?Ba}&yBNTCvnxS0 zm;>g6g#f;meFbO$cY$r-ey{^P2;K)Df{($c;28LvVRFU+Xy-sX2iiH%&VhCgv~!@H z1MM7W=Ri9L+Bw$(*fs~Y&4F!mo&-;WXTkFT<;r=9Vax+SGBAKFkON?2Gi+?m2UEZ_ zFayj4&^ANc3~e*C&CoVO+YD_pw9U{qL)#2(3$!h;rv?6CnFL@Uiy2q}%3>)1Q^9oL z0*e9s!mK`|%= zWdM1$p)J~O2J66jfPC7ZX@jQib+8Y-#W40!KnGxBJ2dUkw8O@B*uh>1kXQRGP!1{q zY-~qf?YDy4z#RZSZil8Fn)dzRZGiUWPy*P)f&4mP0|$J9j;9fxM*AO<7>)MwrV0Ndy30qQmnY2{e~(#bX zC{rHlHm?M%0;tzK*e4HlkcYa>+W^imOnyIry3CISuuHxMB!IC1Y2{A@NGIP2P}lj; z&xhUeQP25ECm-d>hu`GG*YmFjs{zu=zZsljn1VrI2p9%N0B97zCI!fA0kjIBRj?DF z%@w=|UIwVM0@PW-+u$AWE_fe&2tEg2fp5Tf3^S!C=mSuWDFXn~n-UF>-V~H`3hHXg za{#(ipgRS+Q{W3z4uZqrJpkP)AA>K!2_WkJz%WyL1L#hL?o{Ybh3-`7PKEB&#{hh6 zD)gp8Zz_Ci>RSMLor=6p{Rn&tjsfI#>i6Iz_!(Qu{Q>l*L2uenFdU!`rridhI}N(i zpgRq^)1W&Iy3?RL4Z72yI}N(ipgRq^)1W&Iy3?RL9lFz@I~}^yp*tPA)1f;Zy3?No zuK?&xhu-u90Jfd}0YKTO9|gz37XW3S{uB5W{D$rC!2o(Qpf_VA7!8!*F7OOMUT2`L zX27O14gutK1~g|ta|SeLz^*gC2GE=V%^AOg(+uN+rVBpdLLOZ)0GciVsK9El9XtV^ z2fM+G0QKnF2T%qV(sQ8>T}J@YaQz5i2iGZpG-kpMGf`hNk;Y7&p0{#GJz~4Bn$^huOq34bT$g?{hAm47- z+6`^@bKnJl`gDH_5Z`@{VG3m+9JB*0=nA@lo&Y{q2pbp10kp%yWH1Jd10FC7%mx*p z3d{lf0m@tWC-@5>e?=&75#kq(1*u>H(1A>l1Zc#aaW>F2e72F2y0CxeD zyEqCA0^ovpcVkOXkM4$youNdhSPX{HS3?Q$?&@H|NtOw97hHf!*i#Gw}+0zT4 zt~?3=n|fjaZ0bSzJt)5inx2Uu4IuBHJTL_y9S`#FxdyBN*MU{w25=Mj3BVpDuysiX z&|FwTm-GSs!9W1Jm!M1~NWTQ>mmrN2q){>r%mAqLlHK5A0G}vddMH;1pzz~4;Q;IZ7Ex-mGAQ$9=so)9lGS~<9gSWv!06#4K2z&}Y z1D}JF;52~kO3yLOETlUNwws0aGYh^mOAX+Uvy#A#0JffW57-8_g9pH);BoL2cosYl z4uem?F@SVteaSFoT>

)&roP%3!lH*sN?NfL0muU52=2y8+r$8Ol(GGL*dqkpD7h zmK^~{!EqpJe$6nmqX0B#LvuDXXG3%LWdOc6dn-U5XYT|Lfky!HIUD(${Q^Kbvyskh z*lG3wa0t8$V2koFfI28|4>|(WcX>Hj4sHQ=0NA4(zE{2lpbX_Z0MaRkP0Duxl&5?T zKpN$H0qk9lx-Lgum!q!BVf%8}z5>2cF%K*SE5LPN6}SPc0~-L+tJnxOgZlx>RPiuC zS{3l63fQFr^;!XYSHLzECvZxB23QEL2G@htU=6qlK(i8>mC&q2{wratN@!L>v+^s-&DcwRnGv}qYCz@ zdI@|FV2`Sw!LI=JsJ4JIFc(0x8k*J6tX=|O_iEUs8fB=4X7$Yg`K*2p>;}-Reg*sp zpji#g>fZotTr(MzgZTiOHPEbqX3bS#C0GSuml|l++yYSc8u&-eivXH6uY#WdG;5$) z^9MM?Fmvpn62QiDpg9McbD%i~_MU_C&q4X;+ytOG2mUzcNr3Xtfj`WF=A75TF94cz zpgHGHaF$`bPEZXN0cd)m>4m2ET7dFUC4%>!Nl8`LfXsH0tc7Ono8T<~&03Vb7Wu4& zW}OT~fN5YJSPD@8b*QU4*tHHes9Oh+&pK$0X z{*~WQv-9uhvx}Nt)a;UwB!tleGw7mb7d5-6*~J~`B7c_|%tp;F3owT+M>vL>T}}l- zxa{F-hN~H#n4~nKH)as-PKDclxVeU#LAaXXYKE&BzL3S3ZMd4@YKH&8nIPz@W>?v} z>a(kwU6a$4zL-H*HM^?WRn4wu(A7-4&PAVH)$F#dv~W7dhG3- z-b+|c49@B8oIdF(MoCJeP9JspRA4X@n96kAn?82j$DQdTZy$B~tmbu{UpT~3PH>9T zLC`lo?or>wyvbYGdEfR#GmROj-S<4Vcz}8J{fB3P|1t&Y^i!u_65O4B?~w)j?U#ek zF`s_5sYe5Tq!GKY*M9cU?;($aAR;ej7g3IHsYqq)B|?n|H6j`kMmxIE8_h)6SA=~< zxQh|y7!ixzM{Ed!{_kTS{mrqzIrcZl{^r=<9Q&JNe{<|Vi#eEMe{<|_j{VKCzd80d z$NuKn-yHj!V}En(Z;p}jN6H^*j*;dVX^xTR7-^1?<``*?k>(hwcBI;o{$@m8M&?L& zF7i1qc@+c$)EQuo1JoFx#(-3ONOsI|KpxCzKt9Z1z)v)$Da~nx9tS+(8Se7{wFjs@ zun=+&tU@(v@B{WS&@2b4GtiqF*n+N@=RmU@IE3MhWE~sX%vQFuGYAHG&x0ya74LJ9 z+Jn>{6ot%#%yZCE>}AkO*0TvU2F3BZhPe(p!v!vJmFxcNb7n9&E$MiN_vnc^4qk}b zgVi2<1GxvwJ6PT!@koF>IV3si3{hu@Iz#k3#5{+5Nj|=zAZ9Sc42GD&5VIW8mLr(u zkQe+H1VaPV9;)`xl9=aES%=o99_Bf;3HC8mjiG7`ZATvlGlJ2KV*+L{)C`82!O&go zVSf+|`wVj&R*O2QJ!~@baW{vV3Ns;$wUw2 z9WjbAj3)~3VZ==4Aj^n_$S`6H+i~Uya~N@l`#j`v5R5eAk@hpvOh>lCOh6L# zQhU@tK``1~7@d@4q$D+FF**Yu@DcwbC%O5OuV_FRYL8ZXwB3(Bj=haO#|8evoJar7 zT^{g=mqDP7U`%}8;B)ez_87ItOk^%gSVj!1*nr)R*~Sij;SfhS#tHrlg0Ugg9;^0P zZ(?jG>~w4|`VzqqhGWNL$1)Q(a+Dn0(@ zMfJqIqee592~5OHqRb>}F3ycw#46U{?`)K}9Hn-Y_ZoGbo489+?$X4nG@uD~Jh3IM zF_Vd1=!SDA_GS?N_)Q#veNR+-qI?tOo9Hf0jN_Len3R<-DL^5LVm6b?Vds-7;oM2z zQxE%|WZ#n-qxK~ECdoHxJpNuxn#{jJFgYNPd~z0?J2@M9$cuY6`5V-p zEZ=1LCbys!c0c(DWua@rs1(d{g9`V)s+*e#-42m|7XLpV|nsnc5t?pW2>IgyY<) zJ#psL`K&;;sqWR(b-1%r^*!|p*D$}S?$xyKXofn|deDo$L@3N#D zO*6M?dY-1{G&QH$$uvDryB7r0^*X&DW-;9ircWdqvzR^yeNJD*QkL^8CpnE>PyaIr zX1GT)l9CMbo?+fIS~C!{ouS?g^=6puj9DyX3F^&QiC$;yLA@E~Izx{${^m{)%uLUF zWFQln(eF(4X6kFE{meAOnPxcC3}?C@GvoLLHD~Ta-I))0!K)yc6^{huBsX8+e$UE} z8O~C3))v&5wHq~N9pES@IEA}5OWj%eou%Jd`kkfU+4`NW-`V<|t>4)nl7&gcqPN+5 zad&4Q;xNDS2WK(Q*%x^p1aso^CgwUPC24q@A{3`2r76p|%)@@>{Khf#I_D&(gJ7;& za}#1$bJd)y=G-=Pryu)c3aZx={Xw@-KYG zzq|~BMFIL+G=wOoq0S<87OAsn33jt+C9$mKAa=jVJzaE$b3w2;AxTJz{uigfJQugY z&KJwJSdWXRGmAMaW*OeY;?=A{pNo&UL z*uZvVUn2Vw*_Wuf2JPv~8dS0HHEPPBh`lH|FYAugLt>tPh*XQ!X9OVRdw%lBotGC=eSpEWU zYek4p$w@Bq@Fniy3ioq`+AGvvq4o;3SE#*0?G7(* z9iw)P+A(U!s2!7+QN*x?Ur;kf_84=GQ8Px(7&T+uu^4wOM*bKzW7J$3j|8Z>GB;nK z=F0pmMQ<4W~bJ`RFaNwAw$YOMN-uPHzyn$nz>?8iP<-RCLK zd5L~jCq$jqZ;^sjyoY3*-o$=l?I%{hvHFdTCKfx2l|NR$v4^mu*xzwZta-%#iFw4{#4KXXBKAQLtnnV! zxLa%VyGFljBACh|V$koJHMp~Dw&I*M_O{0VJGf>aM=|p?cDClUf8!-S=CW45YxTRf zB?B1CWTr5knJi#2%W&3OXRY<#);edcbJn_ZYyajh=CaoA)_qS~dZ5>Jkqlx8qZvmO z&RXZJb#rmfI_Io&N7m_eonF`Jb)C7aFGNl3eZ5}Sx8`Ts(-r5e?@d4YGn`S#vwl48 z@%ruTz+5)`k0RLnhH6yj2Ws;p&e`C8ZD>I&IuTBHdNPlN=y!vDH@?LuPlI5a{9v?A5)N0l;vCOaa(8fx=pX!deR&BZrfS@3xe%3Z`bQ~y>3sB`EFNpyPDhex;;BN zD2|%j^}4+Z?#6b#ZdY%+UbjaufD71NTmsaNGmkjCi*rVt+HrOlXLoUS7iS)E1u)|{ zGmdlj;>;t?jN`&Fk2q(@bTRX0gL8c9_Kuv)Ex4JM_In-#g4=hgs|} ziydaML*F~hVuxAmFpC{#vBNBO^x~sfq+S$%@yu-Z*!?frQ0EtQeo^O_e0)P8iekRM{J@ViqAAT8!+4^Y z#1x(c!7g*%CHF41cgegfE6&)Z_O37R4t9M_0qkp6ZR*jGForUMQ8;6lx4g?4yY2_U zZuxhswOg&-dB}@?cNeA@B`HHW8qkcEwBcv;xm%yRr!j+B%;i-O?D0nTsIkXh_Sp9x zd)Z^2dumXNx~RFw9QJgf4`#b(0E38OHEUSM1~v!5-t@@5wL(_XXP zTZj5I#9i3yUhVCNz3m;y3RV$|+I!XBtM)#%_o=;4?R{$RQ+uD<`_$g2_CB@usl89_ zeQNJhd!O3-)ZVA|KDGC$y-)3ZYVTXidNu{Y{&c9lU+w*B?^k=j+WXbsul9bm_p7~M z?fq)+S9`zO`_`a2dYs6^FCnS2h={$ zk)HIyybq{-U>W9pKsON)vKB(?NJs(u}pq>v_N6!cKd{EtkdOoQ3 zK{XE!V>IK4!aX?{$1m(=9|!m~2oB{ytwU-Zs*OGm&ByK!ZNy# z-x2*Cv6mzEa%2^o*v?MO@Q7I)@rI8);t5ZA&dVV9O;5k|XCQj|&EJ6E^z_?p{N`wg z_{e-TF)|-bjhP*NhxhoLQdFc0-%|tgJK7KRkLv%Zw|Z3lqgR5!I)Y=#FuP;vF#BV2 zACvc(yvMR(-^X%N9CeS?rU79zrYWN^mt*5`e~y{YG5L;X#vYDmMXlqXGJGvn=;P)q+(2_Q^qXX{H$?3R5C(YvIJj~+M8`$TmJbcMlG@}ze=tW<=-BUvt&M3w* zo@uCgO3hPho-)T%zhU90PH-v+{>aZV%=wQvcCwqj9Ofu~`^W3wp5_u)@m~M1i_>XI z&%3xYr!(>)eRv!MXX25Bq$J0T&-neB_wd^@etX6}JL7(x$&H+6^6@ocxLaqM(j0R; zV{T^-^1Aj@p7VlNL2%Y@&$g#4-RXrs&JM(U&YI6z^Eo>P^EeyJ7Pcez*XYcb6 zXPo^f2+mc++2_LPO<(#m05#94dCttwO<*E3nZtbS@tm2TJI?Q%;&c$4m-W25=j$Nn z`9{cjUe5DB(}B*&a$c76&O0y1c{$DxL+|I;;r^Z9#MU7A(=PtZLlH_-7WeSa@A#gY z)W$vhvjOhXpK|?arhhu~&q+*S8Z(%M{1?={keO_JN=|ZNPZz$S5Jf4D^DfABp$gUL zftg(}vkUI&1v9&FhNnSr@eSU>y||c)G`xp*~J!Y z<19D0#{=x|qW&-b7X*KWNI)Wzkeau72WS3Ok}{M-hQDO^YYy8v#BuEJuRqZLUw?6h z>v#u$-R23;a3BA2=A}MYFX z>H-$A6?3>M|J8>HAu1-0N%YaR;vrVH9K0?=|OL zyMsG&Jss~;fU>v)*WH2ZRq$r6*G1pgThfMhn8kIoxNa8L2cqxm%UH`rt_Hykz23+~ zK1x!K3RL2IYGO7w^nRlYW^rQ-(U{|nnap86D_Diu-dN8jw(vWTgWzU}bi6}uzQQ>- z)xY@@=5f;=Z$>bH!I;U-VT{DNH)pevo$TcR?#NAd$G4_px3}ECTZi#hZ~e(%ct^LcbBjCt%gZ2eMDTY!-oQD3zsXzVq6|OL zmFejB?}O;|Z}tB^g?|4&!vkIg!R^E(MZdRGlA8C)$OnAH$9zIb8sqNVcK>gi+wJc3 zq7P2(k>!pZ-7%{>B`8ffDpHxM zxF2^~F#`AD&NQ5LXAbjNz%GvBj5{*lk@wDdF7Sw#L2x$#=6BbbcaxEV3}hiI+4+nw z$%h@@Er{OkR-hL8xZ9gSjAsh+-?h`b?)}{*EGLH5tiew1+R0sexT~MLmvDFP-ryb& zdCXIu2f;nP-E)8M>FZu8%JMB{a<2;Jajzz|@we$-Lw=$O&C%n%w%FOdu}okRdcCLD zdwRX6*L(9>h@S81`QA!mS%)3o+sszX^`8Fjf67 zLVpJ0eLe8|2csB+y*+T|12cNCmJMuTFYfIFXFfQ=DgNXyE^`fYdthb{UIf9zB%~w_ zX7=!1KE&)EeoQv>{jdUp(2P!apO3rK3uiudM;}KqnW-#dDJziWNmBIs#EhQgqBPY||A`qr zX^t5^ai5;3{Y2d-=JZ6}C+^XcSlpK<8`;8kcCwp&9ON)&_2dfIkon0i?r@(+JmDE~ z|ML#{anJs7-am6NvwwW|G%=r$n=i@7*A(Ylypg9>_@0{7A`JaM?MN58;r>4DM!O4EZ zar`}aW-ian;n{z@3WDbW@ko!l&okmqKUe>GR%CiE)AQE+Ob6Vt=UwT6nLQuM2u3pw zXFp$#ojI+`Q>WXu%1n9Wjp$R={~;H?|*vy?_-?(UmHf@yZ?^jPW|_smqFlK1+UzxS4l}r zdfp==?$)c1$b~$w@>2l!_*Dr?qy8(oUb)k+e&i>b;O@N&r#rofU;u-W@s&)k_VFk7 z{^~JL`IrBK(EtCRH~rtqNJ$#f@eY~EK|U%`m&P=sC2eR&H+s;Ue)MMmbJ)%$UId{~ z65b*Osd=09I3x5m1t~&tN>PT&RObikP>&WkH`I|XI6u@E=Z2gc8q83}F_lHcu$r}O zKwqJq>|!tbInFt5@-hg;3y4ob^d3*|@$?=~@A32=&y3>fJzh?7^Ce~#?;8qHloFJt zEDbQHc>0SsgQHvyLh)@Oei}Z<4B}U#2DPY*@8XAH_VLX=zS+k&`}k%Mzaz57AHitG z5yfO=kMErLvzf<2mavQqK`235^qoMh1b&y`a1eS!zBei|h&XQX6!S=E9tq7OVPcY! zoRnnb13uzozQw*0*2caPHYAcU=q;h%66!7CEatKRJ4(2mb=Xb9eV9+e6P)4<=h1h< z8$94KdQ12({{^8$`b%U_iBj`EnaIrl_=N0yK|zX8oKlpfJk_X61Hx!bGg{DvK1478 zJ4`f;@k~UfL^35Z$3$`^T0{&R*uepQPdez-4*-IK(2kyzh}^_^JX ziS?b>4ic{<7Q0Bik?L5#=z-ZHGV@C|lWklILdoAC2Nm&M z^3lkhd_9}kiWwv~-{j_+++35N;tc1xfNaU-O78t6f6B|ipJd{reu}iD=YPnQ;xlrQ zm;4k!&J=Q`s6{KJwy2B~z*| zP(M{ks!#)&Qh7tEexwoJPpam~l`0bZPc@Vgn18CV%wQICS-@rP^MHq#b?SKdO=`bM z?Ki0xBXeq*Q?F(%8`zADsduo8y&T|Ie&aYNac@(f;{uoPZc^XCyGd;xshyqr^||Jf z`d|JF{EyU-fJB&28uLk$k~E~_UCb)Y2YkfGWFrTklLzxk;~u1O57HE-80MFz4CVQb z%2dNV)0k%(^Gwr#FdEa0mb9TA?tdEhKaKmJ#-7vkA%X!6W>^qP`zble&6nik8wydB z5|pMK6{tj2s`CTxP}=&~Yg&6vYp-cr(3+p=KxewrgWmKbl0gh*1fv;86qA|C3}!Qr zg)Ct?D~V+t8`;8kcCwp&9ON)ZIl(E;;Et!g$Yri^liS?mAy0V53tk1Gx8v~!iAhRw zQjwN)WZ`47k%Iw@Wjqs!=1~wz=Z>U{PePK=3NuO9onG`sZ|QEKpLF_3r=RrZo8Dg2 zn`wG8O>d^@^`8Ddum5xXrq}N~wK4m5nxpnRZ8?D4@0{iw7lP2c_W7=R^sXJgTOB)m zHs3KNCxxpZ*7M%_)P}$&tU!;%|D~e8GGXHWbB8#lkrdf<_>0& z(Tp?6lPL^!GnqvuGt0CUbI5dvBOD7tAIS7US<3Sr=JCOH{N{thxHBKPGar`WdumV% z@9o1K_|1pEah#JuD05zlQxe}~RyVUVGoRu#W}o>&5cBb(WVem~C2mwd(7 z`0nFz%w#s+*T)NkP}UMSE33Pa)hx5R8(H<8^)`2Tz~dnFNgbNeg4Xb7hwiVF`w)!k^fUUK9%EB zIX?B-t@zr%qe$HbIN(2NBHjZR&=F1z37YI_&2XZpZ^zx za)nSkR};L0T%8EV?{k@bF0;?&_qohIm)Ykw!`zMVd;bn~D7X5#FLH-_Jmg6b%Hu!F z(;2n$sFlard9I-^|F&}|kG~mt^zcPP?C^`Ww8!~h9K+dP$n%9gesMhreOZH_XpG%| z*^>R7k>i*G)N&xqf{KzyJD15c;MbEim(M%s!$4f7~y z9t8(6nsG!inW;=?2{Ei@Ep}3HD{-jr-=Yl_Jb}Fzl&RoN+`obkc+6AeEF@Q)4YPht0^u)P(rry?oHKxY2O zC&*Vsz9RA!v8N&>se=BC=)Z{mi?rrvI?$P}^q@CmaG#6VMUhEFGmV+dL6#!26j{t3 z+_j=_;@qOu=!EZzuH$#Sv7+`^Jr%R3Vil07*!R?=F6Lb<3_1P#x1nNv7|R6oQ)~*;nZ;ZdAVV?xD7KxQ>|zi5 zIEY;oJIZlR@&`|XQ1Q3<2Im&5!#_cT^$=pW_Xc$V)!H zrZnGD5xGj#pcd+vsE>V>u&)w5abAf?1~Hsb$XQ}M`X~{DEG2d$M+rGf$WcO$5+^vt z8P0Q`N61v-Dc(v6cdMko2_@qrOUcC8Z^=(6Lra`nauvt%U8(fQQmQB=kf&5xWGPjf zdNkxGn$V0+bVH_6c2!EIQZkhqiu$GOtCW3}@@7iORLb9gQft}7R^pJelw76$#4nBnuz&3EBCKTzo-Z@?*cHYtos?IJfl0AXLU&%J{B~S(K5b zjK2eA+9OYyF33`5FvA$h7{(LDB)q3GbC9Xb8rGwB8F#RZJZ0>y%wF8LGN(Dq4enrH zWghX27rY8WWo0azl8of$OY))rvV|y$os_kcvgPo0$~GX3M#xaM8TMMX4ejWF+-1Yj zds(wDtDmyYE%yP%@m)DPD<@02rL15Tv1~z(a_(QbgSda?j&huH+~h6~u(NXRT{-v8 z|F?apyuSzKQ<0X;WW|ok+fn&EcyOL={lzZHbOO@VX2{ef=y?%U0r;WF2d=i9%LG>b>RFJ1aF65~oPlW>5R|Wg2P>H(yh#ggEihLF1s~}&6jzlmD{a4U`1^ri8 z!g5v;%Q`l)g(Do}1Sk1}v;4_l$WlR;3hvr>3Hg}vIQP3TxC7t$?z<;JsN&mX!hR~s zQ_+qp%2M%b3Q`1jq+%(`U{4jR;@(x1r=mO+TOdzGc`Djh#V!nBFcXNztSin$zKZfy zl&_-wR5bsJ`_O+y{a4g~#VcIr7I(PMBmN0OmF%FBw_nLFE2Sb0>3Ek6$Wlp`N?9mI zL)@22&aHHS+d-(Z?<#v=l`B&V`>8BXWjm@YOJ#4Sa%Z~IgWmK-oyx;;?4k1AjA73S~X9}ZQi zi2kcor8+-QhkD3dB@BI6G50EQIJasNa^SnF_EmKR-ceO~s!m0wstbt09jUsO4QysB z>Qt4h>OuZMo~jpd->S+}^>6NSKL}L|h)+W7sMS=5U9Rd~7{YM$Q++HGn8XyOBSUp}tok}OVi(o7;*M3{$!_*>fL}Sn?I2X+Epp@B z8eK7$8osMx7Byt4`38xRr)Dx_srdmP@iE!RK~4%#6q#z4MkfEhaj0e$)UO#vW7;EA z&2IFhACU|~&YE)7^bTvTXA}CV8OJZ|VLykEq2@8Ja)Vpk<}MF-%u}B8l2<|KhYS>? zA;iB|q}iDugVxD&Y;)@`h@8L$&Hqj|RAhwc5~u&X{AZUi76u z190zZ&0;=_SjtLbv9nqm*vkp7BTKD2+~*PhAV)1ZY6rx}E^5DvyHz_Q_EOtk{QJqF z+V)cWQ*x4v?`VblQ`@<(s?=>NKMzt&ycpZ_KHV{nW9aIzt)GNG38D zdFsehX9e=qk*Cf^Hgf>?t&UyQImcgILB={}UgsX(PaV6en}AgOk5ABlUH#Y1&6nik z8}wV(J*(?Z)vdt~)JBH7_E9&C#`wEXw*_+79gJPq)lXgL*7GjweTDDp*;hST>dj;h zc2sX6=2TCPdRy3zcT{gTdpW^rWU6-ond-?@?-sA?zrcN~{}wXUPfL0-U{C(t&sQY7~fM9{nW2VLw=$O&5@ygTkN8KBm)_YebgVpXvQ&tNkn50^?&Di5NhDu1|=|; z2EJ=x77b)+aG0aW)8HhsG`PXv+{HU;@R)yi7K9omBq_;}tD!sC@Lkkzm_0s!|F7m9sQA|;Sh#1im}MiP>zOEn2udEbhjF=Wj*%N&|VtaOGA5UxQo5) z=UNc@QJ+7$KR-J6#}16gcR$Mb;}h&AEFN!=h?K|?CP$e4gxOEn$9zIwzCot2qR12` zQ`ontALibLxp!f96ed$xN4n61-q=}~oMCc>&0rO4&`;PVwi3rL>_LXGL)b;wC9ZG{ zdkOm+dkK5MBkU#2UVgHNpT43t&i!c?=JJ#88kt2SSsHy#9^`414_O+OqXLzvN_A>d zizc+B4RST=Ojp!z)C>D+WM7TOU`LJSFrP&%$IcqXvX)&OMV3a_xy2psBS#}S8o8&9 zUIwAY0cnt_@jJYSy)?F$#`e-!md2l8zl}emJk8NhW9K$L&XXY2#CJ{Xt%)p6!f^MS zG@}I_kfVwHG_jv1kqlx8W3i_ub6LP*Rqh;=5+{)y!_1O=1f6(`+V-kfWI#&DOJtt!(EIN0F)7DP(FUQ?pCFu5VAx?5TMI zWNQ8vDM(9t%)7aq&E;zTH5I6YewtV32kKCtACaMXQ@YU;yJ+5*2nH~iVT@oj_R`!Q zn*Yj!Ak@OSEec>REqvF)ELzCYVh{U~r^R7pX>pOuT;nFUxyy^d|G+jfwM>LeEoEw% z8ueRdAuC@ZQ_F%Bp(JG}kDM*#YT1nL^g=%^`!kRsxSK6UAw$avEMy7GSiwqSS;s~; zvyC{;^D+pv%8YYcwZL3j`L2~&w34Nj``+pq^0fLd2(^}_bxORW*4|O;cga8|a*!LD zTIWNi)-ts&j{2>uQG=h5sdY=*(1Ff$Mb6f8wT@yDOVLm3Rjgq>?pEuq$k6&1PI8*F zoaX|UxXKM~aff?Bs7*3HqYBP#GYNBPnW-ceicsI5G0b0SOIqLiRC<)}bK z>d+9G+BQL^wlcMChx%>%F_Lk})OIq{nZ;b@BUjrUoZu8^&`;ZoxLa+n;cm6PjSN4> zCn1S>6L;(96r|>DyqTZhLzbVvp%y)H?$74+v$?eMUAyea;@`LqweybJc}MMPBTKth zw52_r2&WtBw6mXfGPN7Scw}lf74M{-TP??`HsrS)L#GXN3as-wtp6cI=qkXIyAt0 z>M#&_It)jq4ilNl9PFmUB9^k8O>9S|4!e=5gG?QML;VhaahFHP)Zsa=f>6hJyn(mV zQLc_z$j3JnLO&f#;BIxakB;tE$4bc1u`%9C#}?R0M|Z2EyVbEHUFb>=Wa${q2F~H! zPUh9gTsrx#(@lBeM9nv_qW^a};;5(A&y`d;m7%%KRC;uT;wuWgHTs{==u?5aBkO;m`hjRbv27_vUGFbyJbS2 zZds6}+gE%|L5fhEl9Z+zKTrp`y8T2G)bG|3`|4(2-G<=2ZetkFWTql#w^`_;+ZJT$ zb__YX$Q2z3u3Q};LUR=U4QGEyQ-_qVa%?s@s1aGcwH8yAC6 z58w6pAF}lLj>^c>qdKzmXi5uO^D`ajL_Y>1QxCi9AyW^TdQ3$99`@D4zIv=jrXKzV z^w`N>4)7~-_K>T`-@FP!J>#LDo{33Ha#E2N8G3p%J#&(qFUU(izM&9BDNZTuw`U_F zn2&RN-U&jz%%zv_dYMHpS$g?9(5pA{^y-f+y(Tb;DNJV;bBMv)=_OOIO~}+sre3>I zzt>4la}Ak#c{jZt@DI;is^SlL!6u&QAdfQ;d?x(7QbKXh;~1XhL&Z(Ux{} zq%&h#$qAg>CnM(4$9H|qqK_T`snsMF^>x46ec zp71a3U*8b%Nlkj}sP89yMlQZUw!X6Um94K{`c|SYdhgqwPK48)Ui76u1989ldLw;j zp!dFWn8!kvupBx1uEuWq>bdXzAk^<|oZGKHeehks9bDulw~?pc17wLvfcF#O{X`@q zB{D^PfcFt0Q^cpp6d_Z@SEwIhM-lE)L@i{BXh0*H;@w2pQG{F(gNSAtGtp1Pd={~k z6|6#r2zM#s0QL}ZnBO?gNlxSMLByZP5@84ZGg2Jq_BXHo=F;DH{qF>!NLeD&@h%z2 zge;M{`4aCZ())=lL=h@b1(_miB2%PHkzuGG*@4cuOOY}~4rK&mnSgf_DQBcyk!#t< zLG%-OloOod4Cj#{@-qMMoEQ8Tg#6bhLIdKHkR&7}IrcIjC*RQy=ML~52bjwM-wia2 zfwBxNO*!NlSP@wUHsmL~pMl=bz*e-OJMPFpnFbC(rhzgI9F6(|XE7J=YM@L5H?WyF zeqj%C4wP%)6`tZw4b;z|5D7?xyEP~oG7L&XRD;(%CJdH zVLCIJgS`y1hhZ0k(C{~K?(mA3%W&TfH;du23_r~|B>j|3#+ zJ>(f7&xntaXM{W>a$|2J>}fjJDU&iAjnqqf?TaTvVb1&KhZrVT&SlYYoF#;(T5G)AT|V^M#MeT}iNF{_bj z%qF(7liln?&M|V0xyEx|2BER~85^I3B;hSmAj8%Q)YSGmCMujPr)Zc|+sm8P^+G#*M~%7#GE4rZSx+#30kSwa7G1rg3qo zKkg{**|^KdH0~yMdB9`-2}0xL8lQ%&Wal&VGyV&{;%f?01R2Ix=Lc%zy^MFa#{Wno zn$nzB$TEH?i#UXHCz#g+bD7|~3Eh!p!ffWTkj2O{VKdvL^pcU2RWnVik?Oc z?o_mXqBpRaZMa*}yO1IJ0Oz^LC9ZIdo80Ce4|vQ!L1;=^zT^j-J7osuGR1dO&0?x7 zQ@x|9xsYdSUSyeChVpzzWvWq~Fua|qGEHrbOjBi=8jku?2Q!RG$TW2(b6Cg{mLum> zxuzcEPrQ$*ulu>qE$-lMO?`w6Q=bQ+X~{@QYSNO9cges9WafWlr6fNw5a&+&6?2*H zyXj^zU6$$I(RA-XGEJY4`qS63kv+&X{V+#4 z$!X3Z=XANI{~Ls6BqtU6nUS9N$cVc&BMUOj$W9@OQk;^MrW_ThL>0cL1|1l~8k{@h zWe}QaE;D^M(=2AnGSfSn=^f3KXXaRBnK_pQEM^%otYRC#Ak)nK$TU-?nI}+x=2dR+ z1es?37ldYoNJtXiLe5!o&H9wW6hl9=%21x~aJObvLxx$kXhmDv(Sc5c)16-QA%aL| zv7O67Xtr}_e}=it_T6l=m@Ug}?`XDnG+Un8amX_J7{BueXZe$h+~FZI&3=YVb7Y#6 z0QKj*%}0EKOmlMb1z+(s1(0h_O4yw+CKAn5rsHnSnZtY* z;myohjx2Ky@pllKn-b^FHLtnmGS_!=w;;=0?`W=fG}k+tdmCBiz6wI~;_(KFNlG%_ z;{#-x_c1cflWAUV)Sp+JQdC8zd9|rW7>#L$ob%+GH-JgFQ}gsQZx(ZLx8^No88XaU z&2IK_fJ3-j^Nw895Ssr!MRD%@L72;Y-_19R1+pygjuxaxo&_0@Wx?m< zAustUKq1QGjx3OAL3LzWAk%_|sK1~c9qEfq3kEZc(TpPsITy&aAeKG2Qw#L7;0VX~ z9d~QNS!7u77ms<$b6)UY5Ly@_0f|V$TO=n3-_jQ6E?kSbEcD$Xvsfg{BJXHX8RS`1 z0a+H+=SLdRloqt2E8fl`nHKd&rbRL>8j1RgX0Vi%$h2r3o7u(=enGB97kJ1MypKh% z`*{_F7Q0)E-@x5koD>-rXXbxoB^&P6;+*8>OT3xIUn9%nALv3f&RuL?OUz}7@0OHB zmL=ZN67OhX~{;^Uvhw7IfG0~E^(Dx+~GcQ zE|qI(3O>S}TB@I=IrtoRYiVBcBg4|dRN;GS@B{AF(t0%HCmPcXds#Y=dF;cv%Ti%3 z%Y3)YESAZ#%sW~(3wf5!N0w#l*~C`j_=VjZ!yQ>B)3Wo(v`nUDH+WtDIWMuV%OU!ZZ2ceZIac@>ScV$nefmp|D*IYxKdXAs7jJ)+9jzM1NX8)FDtT6|Kp(4iv6ln<%5Ug> zl|8IF%{lJz5Ib092dnI0)eBw)q1Ew7Kq6#Wt?$*PX@PTBujClMi%rK@6rnh!u%B32 zVrx+sJBba$9f@sbVQ!DU6Ez2x3kvWTkGzvwVSn3Od^^EEXA(;Z!(0|u45zWuib`yt+lVU z=XrhJRc>&H`^dTWNf276k9Db$WnDJpSSQCiIo8RsEOIkAo?_%9SoVz|P`S9KPZpgBJ7ITqj{UT&pzlp8H@e6y{$5H;|GS|4tT^`{6 zt+%%g_Ou}h>3E+^WF{-w`3(6s$g|;F>hmLwXi5w8zTsy&&>8#K;J$7ciCt_M%XlUd z%`|2(8(B8!d&7kwv@rqB-S{1C@!iIi9N`bnBG1N)$g=SvcCyhM+UN~!d=-Q?g-~Zx zB2tnOcW;w@ZL+UTImykJct4v;Q66V*s!apJXpC%|WZNX$ruOv3{n|8>Im~AfOL4C@ zt-^cRv>rRz^eew{j1!#XH0O|a(_dV{ZZ_+Aa~8_t+|8qqeY5X2yL(&Gkbw`7XUqSP zWsCc<mq~DM-!Rq~|?k*{biYwdjd+xBkM_AhgYQ+p<%R zs#NC(>}Q)S+gjm%Y_pSXod~BJ199)R$+T?@GHsJ-+f>xwwv3HzL#A!J*v}!3a1^<= z-3db5LnI&(`q`e0l-R@ebi9iU+jH>+d9jP_UsI4G6sII*kY&3aY>#9i&fRWaapn@| zySN(264wj&EUrHTkR@&+(Rep;?q1v+=CO)($P~8)nc`%M+l%^fe{hx?$P{;hC;YgJ4#R*8Fo~l!T+^%-(g+XYahVBzprWJ#=Xj!dymYS zdz-5S6_Cbh+7h*0wrtw6J#FtY8>hWML_!b|5kW+TxN?vw?&sC>Jm z*sYWsv0EvNkRjzUmh%+$D#d$Ad4ZRC4ZD@{7P6%L#`YkxrW)>DqhD+EWsUFFtU{JG z-q9NGXiX8t$g-xAf2iUFr-MjpKph$&Q))A0N|hY zQg7pN>{P0HQlH~R>{jaQtVD*?_xYZm_=VrFTd8YE<4@MJ0dq+`5JcA2r7!MXdk6Zm z)^}_5Vy!G`-cedj2Dw2>X?N09D z0haM7a;C|Z_5nX&r_$7umP{(^uv=+a$dH!HF81;l2ROuGj&hunoCzZ9BAmxCF2lX+ zK0;sC`7T{A(q&2aj?xDqPx^3VNuSOvW;2I461X03CtarWCCHR6Q~G^4KmA#r=WS$4 z|CrBM%{P39oau6HJdrekaZIaS%g_+-G<%D zx`+F)TUpDHCCd!5QrHzlHn?|#er?c~4Zhp(JhE)?jy8Bl8GM<;lK^+qnxnm3==Cq4sP$mHi~E? z-bnVxe9Gsn;w!%8dw%2>WXV={_Q@c!u?_Cscny!?yN&DdjyBq}jaA6A@l+7WktL@d zW|Cv~a_nACOU|V$y^twq05avslrsY7=gi;|E<>gqyOiTy<=lcf<=l##IdbLbd(Ma0 zsT}p>e2F>a*r}W!_!${;%p+$r`4q5??UY~^IlI_{9m_coL^jo?8`E&_rWetdO}^Wt z7rC-Rwh#+{z%bxjIqQq&9VlrV&kPPAkr12y?jy z_ij!_U-EpHrx$s$XT z)%=P~d22~0i;d(WXP#Vne+Q8*H8=qWjS`QA~!ca$$r{$t3J{~B-dHt+EvAM;;+LZBoZxg2*&3l5a&2u*Uj}d?>e)IRyR~%;c5CY-WZ0U>75s;*v0Gag za1#shX13mnEL&gT8}e~)fqoU}OM&kSmLW@lcU0gV6?jJl-y%yv8h?^WHk;T?DZ7xV zU_UYy$W(9)=NHyQKMUM6XA8?al2Ni0Ez!Y6o& zXE2Mx=doLbukr?VtMDCUDKvw^9YJJUb=Nwqi<5qH2--W(x_uY2AD3+zz zJ1X{$isdPeMwa6CbfgR2=|vv~GoC3-V-v)s?;1xt5E|PO3kCR9u2ThrJeCkO3k9QCuUJ?jdr|foQDti#SS7!Ih%%|WWce8^|W zRQ44zmC0203(hag!mgEVN2an0_Hcko%&Sb!a=FSIqW|U1X+>+=B2Rg5`f&m3DA&(& zcb2=e{9C@~Cw|4wl-rqdy)3sgizIEXsR)lsgFosDqM&KTt1`6j>P zyNa`Dk6u;uqAz+}F^q9cWD3)m$tA?2rxn+;fE&@%ilscjGVEZ59jUPU6)Uj&74NYc zxhmwUkgGzjigje5uN52FglrYERqSMU5ZRTF|GjG$d)XgEc5g%G-TTn{-IYOPkMH*Q zwLK>|9Ypp3b$=mh z+wcDU?%(hJ{d&H?3ils~q84?DrV&kX{{g#jU^@3>)(6yl(7*ThenbwAtd9!QDsPeIys(9w`VSM@KM~Y0TtOeqb#d@bgF2dQ`1P)p}HoN6qZ0 znH`n!=pp_NB2{Kl)r^h|;6g?+342&e@2@5#H7`=p+ns!d~> z(GqXwl-)VihyD!2ew}&^eLuAt{W_)Jr}X=j+D@%QeWx~89hGJ1=-KosWY+6 z<%%GT?4XPa_V5=6`I{pg<0NN-Fbt_q6t$>JG>vFV3(lnt?deDty3>ok4B$eBFr1N$ zVLX$V%5-Kin>oZWpUe3V*Kj>Iatn*Nl{>hbr98kg9_0z1;#r>OC0^wX-r`+8;A1{x z6<_f!-}4i{@&{{3<4-clW)pdAWgEqmvXkBH;{cWXLlq}D9fZ{)oWBj{OVkj3eim^;!G8Z$0ONe1E@g#Bu zS8**1xQT@<<~Hu+9`55o9_BHY^E4}XftPuWH+h@)_>fQdoGWPlu^MR{^B5ibA)4@&ZQ0Q=|~s4(~G_g;6jEl zoRN%SJd>EpbY?M|Im9ua%lQx2a6LD23yZjwJGh&rJisy@AZhM?H;wh3CJb=K0GT8B6sgthgywtThqw)RBaS^H9M=YAgIL%!r|wy~4l zL0G3g&1r?bsWTmYs&g~GuX7jrRL6U%-)C8Z|f&= zEqYmh1?F7;P4uw74E5KchxHF}I0&N~poh_V7<~~Fn2a|PZAYVTK_8;^AzB}z%{+Po zIhbR#IYygfgD&)C09SGYdfC8^Hc)#5@1(&RGLfNy-ZeNKgbgFKr#o^q)We2)*l-5& zH%wv)GBo^*M^Jr+E4G&-*jiND&MrP4yAR`#f^(^96o<<&j-hbFgPa5e-BRy$c zjoQ@X0`#KsD9oX;9F5h{_$A)rUCg4f9F5JQu`G>cX(CG#y=-Eqn{>k6O{Opn-#4*S zP44AYoYCY1oYTZPO`Ov-q!x8id((;dzNy-q-px|J;TGKA{1x888O`%3#@#K> z!49=(jQO{)gDr-08Rpl*9<+D?^K0=o8RW8sQ$g6W2F_^NkD=&$OFeI?=PmWD<@3CO zzPJ1dJJeFoTAF#wDozApEB$We_mEb-na7nlqt(NhcdHfXSF2Rkafsu%|J-)Sd~Q!J zA)Z9;=W(87J^FQSeh{A5jJCM*yjjFCA3uBEbG*p6{K_Bf;~&)8x+T7A-HCD7i`Fx_ z55HHmUd~6DPwQ{kNC8Db*e0YFX4FQ`HiOWwHgdMnt2TPo=24zS&)TGugSy*Rqc-*M zOcCWLN zWHQL267y;2ZM1JqXY{)LG-5HU_VTu0jlAs-V3L3VYmX zJd=1FIXjteCqLUszD^s1uyais(uA4F)HwlXclP^C=hrBtoLxcKr4{GX8GG8r`{<&N zUEb#l^rFj74p13{UE9;0UU*YoufsQ8o!wQ=uJ56auJ)v>J?UmYyV=if_N?11;+W4{ ze9UJ!yPJLNW;WgXG6Y$>JG*-lOYn2u?Q!?-`HLeQ3&I}i>7kw;>glln`_sez^!OTm z?C~4w?&0hnr-QKPD9o_u#XQ0@=wr_`%(3UDAnetXfehwBmZN{YJU!T!TVH!_jZhib7*2jH)wox2}ef!|fzQcHdH__9+ zXM(U_6tz%$ze|Y04)jxdKWFvZ%yvqGuzx>>auJWQ0_XKFL+|<@48j3^eZW{IpbrD| zVSuv+sAIrx_66Yu9nsed%;bVwS;_-skjs`J94P<5?)bTZi?|y#l5UY-52Hu;UGIQs4G42{UE=040-}H8MGBW8f=FK`}M)SF_*#1F_*!Gl(Q=c zhv?xDJshHkL+-)58lne7GRebPL**K(-l1|0^=m`*XQ=)R_5IL891g-^{c*;y5jbO* zdxrVBVa^%moMFxxZcl~}#C^l>L`}o}>~QA{cg}FCLDM7=#{=dI+-}^&5UK z8D(yx>)}m~Zi$*kU&Xb2#A^J$H~MH0jtQv7DD2!AcaJfXG0*Zm-ocnMDuQrqSNh@Z zu?x|Qv3fstEgQ%Q!g1%(2|qjTZkFM^ahupiaS-~m#>4UUa=g7A{}?NHfg;>9Ud{=6 zK0(hX==lWmpWxRgyo~QB>}FpOPV9qUpE!)AxM!kWnyB81`ZV!i5Khw1Nit2+&q?p| z1@cd>PFJI6G!FKaz&N#pqj14rUrtfSrxmjyE2A4(g26`&fO8 zbw{i@`SX3lSm(w%H`cka&W-h!{CU5jKkqk;y@VL%qQ|jj8M_#HV&#dICsv-=2YDE8 zB6c}X@fvUN7VnbJPIj@E{XsZK&N;p5i#g1>kQ=yzySSJ8`7bG?V&CSN@7xG=sZT@X zo2&M@v8Z=$Jc&Hd+o)mg2Yiga%-x3?=IZ%eJ({Q2^DaOQ^M)`SJ2!7B53r0!d4eZ# z&OCL^`+=YNjb!ZTyp80t1+$n}L@|GHkiR*?F-`H+$@1cpN$A%Q62YUgd4xL$3L9&6jKb z<{(Twi{1=G&l0CFi`lpTma24j6xPTjRccOa}^)T@2iBi?|iDU1+uom!htP zX1nkaWL>zClR=o&5wl5>H%UK}Mk8~Q%t_AoX9R{xvL)$jlDQ>0H|aqh#-1cSfjvoj z204@DOnQ^I_!zxSa$nN7$d)8ql59z`CFNnxN%AEXQ;M8PyV*+>$2k@Fzb?@GMS8yI zdh~qJEv&^^i}YzxK85&xk?$An=THzXjzMo0Uxn`%o7v)2a>!*11wpu^KO@nDCF7XL g8+?KcOIGn!@W1~#EBwEI_TBP-|NQ^|4sWggKiqAGU;qFB diff --git a/test/bleMidi.xcodeproj/xcshareddata/xcschemes/rtpMidi.xcscheme b/test/bleMidi.xcodeproj/xcshareddata/xcschemes/rtpMidi.xcscheme new file mode 100644 index 0000000..3b0872e --- /dev/null +++ b/test/bleMidi.xcodeproj/xcshareddata/xcschemes/rtpMidi.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/bleMidi.xcodeproj/xcuserdata/bart.xcuserdatad/xcschemes/xcschememanagement.plist b/test/bleMidi.xcodeproj/xcuserdata/bart.xcuserdatad/xcschemes/xcschememanagement.plist index 47e8994..16bf0a1 100644 --- a/test/bleMidi.xcodeproj/xcuserdata/bart.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/test/bleMidi.xcodeproj/xcuserdata/bart.xcuserdatad/xcschemes/xcschememanagement.plist @@ -10,5 +10,13 @@ 0 + SuppressBuildableAutocreation + + CCE329B423C2037C00A197D1 + + primary + + +