From 9d682f0f98c7f4ecb834cd43a37d3b04442ae185 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 18 Aug 2015 17:20:29 +0200 Subject: [PATCH 1/3] Remove AlethZero. --- CMakeLists.txt | 66 - alethzero/CMakeLists.txt | 98 - alethzero/Connect.cpp | 65 - alethzero/Connect.h | 65 - alethzero/Connect.ui | 126 - alethzero/Context.cpp | 83 - alethzero/Context.h | 84 - alethzero/DappHost.cpp | 148 -- alethzero/DappHost.h | 70 - alethzero/DappLoader.cpp | 263 -- alethzero/DappLoader.h | 111 - alethzero/Debugger.cpp | 384 --- alethzero/Debugger.h | 112 - alethzero/Debugger.ui | 300 --- alethzero/DownloadView.cpp | 201 -- alethzero/DownloadView.h | 63 - alethzero/GasPricing.ui | 181 -- alethzero/GetPassword.ui | 123 - alethzero/GraphParameters.h | 106 - alethzero/Grapher.cpp | 195 -- alethzero/Grapher.h | 116 - alethzero/Main.ui | 1439 ----------- alethzero/MainFace.cpp | 104 - alethzero/MainFace.h | 167 -- alethzero/MainWin.cpp | 2160 ----------------- alethzero/MainWin.h | 303 --- alethzero/MiningView.cpp | 116 - alethzero/MiningView.h | 72 - alethzero/NatspecHandler.cpp | 103 - alethzero/NatspecHandler.h | 62 - alethzero/OurWebThreeStubServer.cpp | 185 -- alethzero/OurWebThreeStubServer.h | 86 - alethzero/Transact.cpp | 631 ----- alethzero/Transact.h | 124 - alethzero/Transact.ui | 336 --- alethzero/WebPage.cpp | 30 - alethzero/WebPage.h | 51 - alethzero/alethzero.icns | Bin 514931 -> 0 bytes alethzero/alethzero.ico | Bin 370070 -> 0 bytes alethzero/alethzero.rc | 1 - alethzero/main.cpp | 12 - alethzero/plugins/blockchain/AllAccounts.cpp | 144 -- alethzero/plugins/blockchain/AllAccounts.h | 64 - alethzero/plugins/blockchain/AllAccounts.ui | 137 -- alethzero/plugins/blockchain/ExportState.cpp | 208 -- alethzero/plugins/blockchain/ExportState.h | 70 - alethzero/plugins/blockchain/ExportState.ui | 183 -- alethzero/plugins/brainwallet/BrainWallet.cpp | 69 - alethzero/plugins/brainwallet/BrainWallet.h | 44 - alethzero/plugins/brainwallet/BrainWallet.ui | 136 -- alethzero/plugins/keys/ImportKey.cpp | 222 -- alethzero/plugins/keys/ImportKey.h | 44 - alethzero/plugins/keys/ImportKey.ui | 336 --- alethzero/plugins/log/LogPanel.cpp | 98 - alethzero/plugins/log/LogPanel.h | 64 - alethzero/plugins/log/LogPanel.ui | 99 - alethzero/plugins/namers/NameRegNamer.cpp | 108 - alethzero/plugins/namers/NameRegNamer.h | 59 - alethzero/plugins/namers/NewAccount.cpp | 171 -- alethzero/plugins/namers/NewAccount.h | 56 - alethzero/plugins/namers/NewAccount.ui | 260 -- alethzero/plugins/namers/OtherAccounts.cpp | 99 - alethzero/plugins/namers/OtherAccounts.h | 55 - alethzero/plugins/namers/OtherAccounts.ui | 95 - alethzero/plugins/namers/OurAccounts.cpp | 67 - alethzero/plugins/namers/OurAccounts.h | 52 - .../plugins/special/InjectTransactions.cpp | 87 - .../plugins/special/InjectTransactions.h | 48 - .../plugins/special/InjectTransactions.ui | 95 - alethzero/plugins/whisper/Whisper.cpp | 178 -- alethzero/plugins/whisper/Whisper.h | 60 - alethzero/plugins/whisper/Whisper.ui | 176 -- alethzero/plugins/whisper/WhisperPeers.cpp | 78 - alethzero/plugins/whisper/WhisperPeers.h | 55 - alethzero/plugins/whisper/WhisperPeers.ui | 32 - 75 files changed, 12691 deletions(-) delete mode 100644 alethzero/CMakeLists.txt delete mode 100644 alethzero/Connect.cpp delete mode 100644 alethzero/Connect.h delete mode 100644 alethzero/Connect.ui delete mode 100644 alethzero/Context.cpp delete mode 100644 alethzero/Context.h delete mode 100644 alethzero/DappHost.cpp delete mode 100644 alethzero/DappHost.h delete mode 100644 alethzero/DappLoader.cpp delete mode 100644 alethzero/DappLoader.h delete mode 100644 alethzero/Debugger.cpp delete mode 100644 alethzero/Debugger.h delete mode 100644 alethzero/Debugger.ui delete mode 100644 alethzero/DownloadView.cpp delete mode 100644 alethzero/DownloadView.h delete mode 100644 alethzero/GasPricing.ui delete mode 100644 alethzero/GetPassword.ui delete mode 100644 alethzero/GraphParameters.h delete mode 100644 alethzero/Grapher.cpp delete mode 100644 alethzero/Grapher.h delete mode 100644 alethzero/Main.ui delete mode 100644 alethzero/MainFace.cpp delete mode 100644 alethzero/MainFace.h delete mode 100644 alethzero/MainWin.cpp delete mode 100644 alethzero/MainWin.h delete mode 100644 alethzero/MiningView.cpp delete mode 100644 alethzero/MiningView.h delete mode 100644 alethzero/NatspecHandler.cpp delete mode 100644 alethzero/NatspecHandler.h delete mode 100644 alethzero/OurWebThreeStubServer.cpp delete mode 100644 alethzero/OurWebThreeStubServer.h delete mode 100644 alethzero/Transact.cpp delete mode 100644 alethzero/Transact.h delete mode 100644 alethzero/Transact.ui delete mode 100644 alethzero/WebPage.cpp delete mode 100644 alethzero/WebPage.h delete mode 100644 alethzero/alethzero.icns delete mode 100644 alethzero/alethzero.ico delete mode 100644 alethzero/alethzero.rc delete mode 100644 alethzero/main.cpp delete mode 100644 alethzero/plugins/blockchain/AllAccounts.cpp delete mode 100644 alethzero/plugins/blockchain/AllAccounts.h delete mode 100644 alethzero/plugins/blockchain/AllAccounts.ui delete mode 100644 alethzero/plugins/blockchain/ExportState.cpp delete mode 100644 alethzero/plugins/blockchain/ExportState.h delete mode 100644 alethzero/plugins/blockchain/ExportState.ui delete mode 100644 alethzero/plugins/brainwallet/BrainWallet.cpp delete mode 100644 alethzero/plugins/brainwallet/BrainWallet.h delete mode 100644 alethzero/plugins/brainwallet/BrainWallet.ui delete mode 100644 alethzero/plugins/keys/ImportKey.cpp delete mode 100644 alethzero/plugins/keys/ImportKey.h delete mode 100644 alethzero/plugins/keys/ImportKey.ui delete mode 100644 alethzero/plugins/log/LogPanel.cpp delete mode 100644 alethzero/plugins/log/LogPanel.h delete mode 100644 alethzero/plugins/log/LogPanel.ui delete mode 100644 alethzero/plugins/namers/NameRegNamer.cpp delete mode 100644 alethzero/plugins/namers/NameRegNamer.h delete mode 100644 alethzero/plugins/namers/NewAccount.cpp delete mode 100644 alethzero/plugins/namers/NewAccount.h delete mode 100644 alethzero/plugins/namers/NewAccount.ui delete mode 100644 alethzero/plugins/namers/OtherAccounts.cpp delete mode 100644 alethzero/plugins/namers/OtherAccounts.h delete mode 100644 alethzero/plugins/namers/OtherAccounts.ui delete mode 100644 alethzero/plugins/namers/OurAccounts.cpp delete mode 100644 alethzero/plugins/namers/OurAccounts.h delete mode 100644 alethzero/plugins/special/InjectTransactions.cpp delete mode 100644 alethzero/plugins/special/InjectTransactions.h delete mode 100644 alethzero/plugins/special/InjectTransactions.ui delete mode 100644 alethzero/plugins/whisper/Whisper.cpp delete mode 100644 alethzero/plugins/whisper/Whisper.h delete mode 100644 alethzero/plugins/whisper/Whisper.ui delete mode 100644 alethzero/plugins/whisper/WhisperPeers.cpp delete mode 100644 alethzero/plugins/whisper/WhisperPeers.h delete mode 100644 alethzero/plugins/whisper/WhisperPeers.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index fac5bcfd8..dc5252071 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -504,74 +504,8 @@ if (GUI) add_subdirectory(libnatspec) add_subdirectory(libjsqrc) - if (ETH_HAVE_WEBENGINE) - add_subdirectory(alethzero) -# add_subdirectory(third) // reenable once not qtwebkit. - endif() - if (SOLIDITY) add_subdirectory(mix) endif () endif() - -if (APPLE AND GUI) - - add_custom_target(appdmg - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} - -DAPP_DMG_EXE=${ETH_APP_DMG} - -DAPP_DMG_FILE=appdmg.json.in - -DAPP_DMG_ICON="alethzero/alethzero.icns" - -DAPP_DMG_BACKGROUND="install-folder-bg.png" - -DETH_BUILD_DIR="${CMAKE_BINARY_DIR}" - -DETH_MIX_APP="$" - -DETH_ALETHZERO_APP="$" - -P "${ETH_SCRIPTS_DIR}/appdmg.cmake" - ) - -endif () - -if (WIN32) - # packaging stuff - include(InstallRequiredSystemLibraries) - set(CPACK_PACKAGE_NAME "Ethereum") - set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The Ethereum Toolset") - set(CPACK_PACKAGE_VENDOR "ethereum.org") - set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") - set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") - set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) - set(CPACK_GENERATOR "NSIS") - # seems to be not working - # set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/alethzero/alethzero.bmp") - - # our stuff - #set(CPACK_COMPONENT_ALETHZERO_GROUP "Applications") - #set(CPACK_COMPONENT_MIX_GROUP "Applications") - #set(CPACK_COMPONENT_SOLC_GROUP "CLI") - #set(CPACK_COMPONENT_ETH_GROUP "CLI") - #set(CPACK_COMPONENT_ETHMINER_GROUP "CLI") - #set(CPACK_COMPONENT_RLP_GROUP "CLI") - #set(CPACK_COMPONENT_ABI_GROUP "CLI") - - #set(CPACK_COMPONENTS_ALL alethzero mix solc eth ethminer rlp abi) - - # nsis specific stuff - if (CMAKE_CL_64) - set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") - set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION} (Win64)") - else () - set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") - set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}") - endif() - - set(CPACK_NSIS_DISPLAY_NAME "Ethereum") - set(CPACK_NSIS_HELP_LINK "https://github.com/ethereum/cpp-ethereum") - set(CPACK_NSIS_URL_INFO_ABOUT "https://github.com/ethereum/cpp-ethereum") - set(CPACK_NSIS_CONTACT "ethereum.org") - set(CPACK_NSIS_MODIFY_PATH ON) - set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/alethzero/alethzero.ico") - set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}/alethzero/alethzero.ico") - - include(CPack) -endif (WIN32) diff --git a/alethzero/CMakeLists.txt b/alethzero/CMakeLists.txt deleted file mode 100644 index a9b2e3233..000000000 --- a/alethzero/CMakeLists.txt +++ /dev/null @@ -1,98 +0,0 @@ -cmake_policy(SET CMP0015 NEW) -# let cmake autolink dependencies on windows -cmake_policy(SET CMP0020 NEW) -# this policy was introduced in cmake 3.0 -# remove if, once 3.0 will be used on unix -if (${CMAKE_MAJOR_VERSION} GREATER 2) - cmake_policy(SET CMP0043 OLD) -endif() - -if (("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.6") AND NOT APPLE) - # Supress warnings for qt headers for clang+ccache - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-inconsistent-missing-override") -endif () - -set(CMAKE_INCLUDE_CURRENT_DIR ON) -aux_source_directory(. SRC_LIST) -file(GLOB_RECURSE SRC_LIST "./plugins/*.cpp") -file(GLOB_RECURSE HEADERS "./plugins/*.h") -aux_source_directory(. SRC_LIST) - -file(GLOB_RECURSE PLUGIN_UI RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/plugins/*.ui") -foreach(ITEM ${PLUGIN_UI}) - get_filename_component(UI_NAME ${ITEM} NAME_WE) - qt5_wrap_ui(ui_${UI_NAME}.h ./${ITEM}) -endforeach() - -include_directories(BEFORE ${JSONCPP_INCLUDE_DIRS}) -include_directories(BEFORE ..) -include_directories(${JSON_RPC_CPP_INCLUDE_DIRS}) -include_directories(${Boost_INCLUDE_DIRS}) - -find_package (Qt5WebEngine) -find_package (Qt5WebEngineWidgets) -if (APPLE AND (NOT "${Qt5Core_VERSION_STRING}" VERSION_LESS "5.5")) -# TODO: remove indirect dependencies once macdeployqt is fixed - find_package (Qt5WebEngineCore) - find_package (Qt5DBus) - find_package (Qt5PrintSupport) -endif() - -qt5_wrap_ui(ui_Main.h Main.ui) -qt5_wrap_ui(ui_Connect.h Connect.ui) -qt5_wrap_ui(ui_Debugger.h Debugger.ui) -qt5_wrap_ui(ui_Transact.h Transact.ui) -qt5_wrap_ui(ui_GetPassword.h GetPassword.ui) -qt5_wrap_ui(ui_GasPricing.h GasPricing.ui) - -# Extensions -qt5_wrap_ui(ui_AllAccounts.h AllAccounts.ui) - -file(GLOB HEADERS "*.h") - -if (APPLE) - set(EXECUTABLE AlethZero) -else () - set(EXECUTABLE alethzero) -endif () - -# eth_add_executable is defined in cmake/EthExecutableHelper.cmake -eth_add_executable(${EXECUTABLE} - ICON alethzero - UI_RESOURCES ${PLUGIN_UI} alethzero.icns Main.ui Connect.ui Debugger.ui Transact.ui GetPassword.ui GasPricing.ui - WIN_RESOURCES alethzero.rc -) - -add_dependencies(${EXECUTABLE} BuildInfo.h) - -target_link_libraries(${EXECUTABLE} Qt5::Core) -target_link_libraries(${EXECUTABLE} Qt5::Widgets) -target_link_libraries(${EXECUTABLE} Qt5::WebEngine) -target_link_libraries(${EXECUTABLE} Qt5::WebEngineWidgets) -if (APPLE AND (NOT "${Qt5Core_VERSION_STRING}" VERSION_LESS "5.5")) - target_link_libraries(${EXECUTABLE} Qt5::WebEngineCore) - target_link_libraries(${EXECUTABLE} Qt5::DBus) - target_link_libraries(${EXECUTABLE} Qt5::PrintSupport) -endif() -target_link_libraries(${EXECUTABLE} webthree) -target_link_libraries(${EXECUTABLE} ethereum) -target_link_libraries(${EXECUTABLE} evm) -target_link_libraries(${EXECUTABLE} ethcore) -target_link_libraries(${EXECUTABLE} devcrypto) -target_link_libraries(${EXECUTABLE} lll) -if (SOLIDITY) - target_link_libraries(${EXECUTABLE} solidity) -endif () -target_link_libraries(${EXECUTABLE} evmasm) -target_link_libraries(${EXECUTABLE} web3jsonrpc) -target_link_libraries(${EXECUTABLE} jsqrc) -target_link_libraries(${EXECUTABLE} natspec) -target_link_libraries(${EXECUTABLE} ${MHD_LIBRARIES}) - -if (SERPENT) - target_link_libraries(${EXECUTABLE} serpent) -endif() - -# eth_install_executable is defined in cmake/EthExecutableHelper.cmake -eth_install_executable(${EXECUTABLE} DLLS MHD_DLLS EVMJIT_DLLS OpenCL_DLLS) - diff --git a/alethzero/Connect.cpp b/alethzero/Connect.cpp deleted file mode 100644 index 27813d5e8..000000000 --- a/alethzero/Connect.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Connect.cpp - * @author Alex Leverington - * @date 2015 - */ - -#include "Connect.h" -#include -#include "ui_Connect.h" -using namespace dev; -using namespace az; - -Connect::Connect(QWidget *parent) : - QDialog(parent), - ui(new Ui::Connect) -{ - ui->setupUi(this); -} - -Connect::~Connect() -{ - delete ui; -} - -void Connect::setEnvironment(QStringList const& _nodes) -{ - if (ui->host->count() == 0) - ui->host->addItems(_nodes); -} - -void Connect::reset() -{ - ui->nodeId->clear(); - ui->required->setChecked(true); -} - -QString Connect::host() -{ - return ui->host->currentText(); -} - -QString Connect::nodeId() -{ - return ui->nodeId->text(); -} - -bool Connect::required() -{ - return ui->required->isChecked(); -} diff --git a/alethzero/Connect.h b/alethzero/Connect.h deleted file mode 100644 index c8d56bde3..000000000 --- a/alethzero/Connect.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Connect.h - * @author Alex Leverington - * @date 2015 - */ - -#pragma once - -#include -#include - -namespace Ui { class Connect; } - -namespace dev -{ - -namespace p2p { class Host; } - -namespace az -{ - -class Connect: public QDialog -{ - Q_OBJECT - -public: - explicit Connect(QWidget* _parent = 0); - ~Connect(); - - /// Populate host chooser with default host entries. - void setEnvironment(QStringList const& _nodes); - - /// Clear dialogue inputs. - void reset(); - - /// @returns the host string, as chosen or entered by the user. Assumed to be "hostOrIP:port" (:port is optional). - QString host(); - - /// @returns the identity of the node, as entered by the user. Assumed to be a 64-character hex string. - QString nodeId(); - - /// @returns true if Required is checked by the user, indicating that the host is a required Peer. - bool required(); - -private: - Ui::Connect* ui; -}; - -} -} diff --git a/alethzero/Connect.ui b/alethzero/Connect.ui deleted file mode 100644 index 1ace94c8d..000000000 --- a/alethzero/Connect.ui +++ /dev/null @@ -1,126 +0,0 @@ - - - Connect - - - Qt::WindowModal - - - - 0 - 0 - 343 - 178 - - - - - 0 - 0 - - - - - 343 - 178 - - - - Connect to Peer - - - true - - - - - - - - - 311 - 0 - - - - true - - - - - - - Node Id - - - - - - - Required (Always Connect to this Peer) - - - true - - - false - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - Enter a peer to which a connection may be made: - - - - - - - - - buttonBox - accepted() - Connect - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Connect - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/alethzero/Context.cpp b/alethzero/Context.cpp deleted file mode 100644 index c734c06d1..000000000 --- a/alethzero/Context.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Debugger.h - * @author Gav Wood - * @date 2015 - */ - -#include "Context.h" -#include -#include -#include -using namespace std; -using namespace dev; -using namespace eth; -using namespace az; - -NatSpecFace::~NatSpecFace() -{ -} - -Context::~Context() -{ -} - -void dev::az::setValueUnits(QComboBox* _units, QSpinBox* _value, u256 _v) -{ - initUnits(_units); - if (_v > 0) - { - _units->setCurrentIndex(0); - while (_v > 50000 && _units->currentIndex() < (int)(units().size() - 2)) - { - _v /= 1000; - _units->setCurrentIndex(_units->currentIndex() + 1); - } - } - else - _units->setCurrentIndex(6); - _value->setValue((unsigned)_v); -} - -u256 dev::az::fromValueUnits(QComboBox* _units, QSpinBox* _value) -{ - return _value->value() * units()[units().size() - 1 - _units->currentIndex()].first; -} - -void dev::az::initUnits(QComboBox* _b) -{ - for (auto n = (unsigned)units().size(); n-- != 0; ) - _b->addItem(QString::fromStdString(units()[n].second), n); -} - -vector dev::az::keysAsVector(QList const& keys) -{ - auto list = keys.toStdList(); - return {begin(list), end(list)}; -} - -bool dev::az::sourceIsSolidity(string const& _source) -{ - // TODO: Improve this heuristic - return (_source.substr(0, 8) == "contract" || _source.substr(0, 5) == "//sol"); -} - -bool dev::az::sourceIsSerpent(string const& _source) -{ - // TODO: Improve this heuristic - return (_source.substr(0, 5) == "//ser"); -} diff --git a/alethzero/Context.h b/alethzero/Context.h deleted file mode 100644 index 4fc07b0f7..000000000 --- a/alethzero/Context.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Debugger.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include -#include - -class QComboBox; -class QSpinBox; - -namespace dev -{ - -namespace eth { struct StateDiff; class KeyManager; } - -namespace az -{ - -#define ETH_HTML_SMALL "font-size: small; " -#define ETH_HTML_MONO "font-family: Ubuntu Mono, Monospace, Lucida Console, Courier New; font-weight: bold; " -#define ETH_HTML_DIV(S) "
" -#define ETH_HTML_SPAN(S) "" - -void initUnits(QComboBox* _b); -void setValueUnits(QComboBox* _units, QSpinBox* _value, dev::u256 _v); -dev::u256 fromValueUnits(QComboBox* _units, QSpinBox* _value); - -std::vector keysAsVector(QList const& _keys); - -bool sourceIsSolidity(std::string const& _source); -bool sourceIsSerpent(std::string const& _source); - -class NatSpecFace -{ -public: - virtual ~NatSpecFace(); - - virtual void add(dev::h256 const& _contractHash, std::string const& _doc) = 0; - virtual std::string retrieve(dev::h256 const& _contractHash) const = 0; - virtual std::string getUserNotice(std::string const& json, const dev::bytes& _transactionData) = 0; - virtual std::string getUserNotice(dev::h256 const& _contractHash, dev::bytes const& _transactionDacta) = 0; -}; - -class Context -{ -public: - virtual ~Context(); - - virtual std::string pretty(dev::Address const& _a) const = 0; - virtual std::string prettyU256(dev::u256 const& _n) const = 0; - virtual std::pair fromString(std::string const& _a) const = 0; - virtual std::string renderDiff(dev::eth::StateDiff const& _d) const = 0; - virtual std::string render(dev::Address const& _a) const = 0; - virtual dev::Secret retrieveSecret(dev::Address const& _a) const = 0; - virtual dev::eth::KeyManager& keyManager() = 0; - virtual void noteKeysChanged() = 0; - - virtual dev::u256 gasPrice() const = 0; -}; - -} -} diff --git a/alethzero/DappHost.cpp b/alethzero/DappHost.cpp deleted file mode 100644 index 19059e8dc..000000000 --- a/alethzero/DappHost.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file DappHost.cpp - * @author Arkadiy Paronyan - * @date 2015 - */ - -#include "DappHost.h" -#include -#include -#include -#include -using namespace dev; -using namespace az; - -DappHost::DappHost(int _port, int _threads): - m_port(_port), - m_url(QString("http://localhost:%1/").arg(m_port)), - m_threads(_threads), - m_running(false), - m_daemon(nullptr) -{ - startListening(); -} - -DappHost::~DappHost() -{ - stopListening(); -} - -void DappHost::startListening() -{ - if(!this->m_running) - { - this->m_daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, this->m_port, nullptr, nullptr, &DappHost::callback, this, MHD_OPTION_THREAD_POOL_SIZE, this->m_threads, MHD_OPTION_END); - if (this->m_daemon != nullptr) - this->m_running = true; - } -} - -void DappHost::stopListening() -{ - if(this->m_running) - { - MHD_stop_daemon(this->m_daemon); - this->m_running = false; - } -} - -void DappHost::sendOptionsResponse(MHD_Connection* _connection) -{ - MHD_Response *result = MHD_create_response_from_data(0, NULL, 0, 1); - MHD_add_response_header(result, "Allow", "GET, OPTIONS"); - MHD_add_response_header(result, "Access-Control-Allow-Headers", "origin, content-type, accept"); - MHD_add_response_header(result, "DAV", "1"); - MHD_queue_response(_connection, MHD_HTTP_OK, result); - MHD_destroy_response(result); -} - -void DappHost::sendNotAllowedResponse(MHD_Connection* _connection) -{ - MHD_Response *result = MHD_create_response_from_data(0, NULL, 0, 1); - MHD_add_response_header(result, "Allow", "GET, OPTIONS"); - MHD_queue_response(_connection, MHD_HTTP_METHOD_NOT_ALLOWED, result); - MHD_destroy_response(result); -} - -void DappHost::sendResponse(std::string const& _url, MHD_Connection* _connection) -{ - QUrl requestUrl(QString::fromStdString(_url)); - QString path = requestUrl.path().toLower(); - if (path.isEmpty()) - path = "/"; - - bytesConstRef response; - unsigned code = MHD_HTTP_NOT_FOUND; - std::string contentType; - - while (!path.isEmpty()) - { - auto iter = m_entriesByPath.find(path); - if (iter != m_entriesByPath.end()) - { - ManifestEntry const* entry = iter->second; - auto contentIter = m_dapp.content.find(entry->hash); - if (contentIter == m_dapp.content.end()) - break; - - response = bytesConstRef(contentIter->second.data(), contentIter->second.size()); - code = entry->httpStatus != 0 ? entry->httpStatus : MHD_HTTP_OK; - contentType = entry->contentType; - break; - } - path.truncate(path.length() - 1); - path = path.mid(0, path.lastIndexOf('/')); - } - - MHD_Response *result = MHD_create_response_from_data(response.size(), const_cast(response.data()), 0, 1); - if (!contentType.empty()) - MHD_add_response_header(result, "Content-Type", contentType.c_str()); - MHD_queue_response(_connection, code, result); - MHD_destroy_response(result); -} - -int DappHost::callback(void* _cls, MHD_Connection* _connection, char const* _url, char const* _method, char const* _version, char const* _uploadData, size_t* _uploadDataSize, void** _conCls) -{ - (void)_version; - (void)_uploadData; - (void)_uploadDataSize; - (void)_conCls; - DappHost* host = static_cast(_cls); - if (std::string("GET") == _method) - host->sendResponse(std::string(_url), _connection); - else if (std::string("OPTIONS") == _method) - host->sendOptionsResponse(_connection); - else - host->sendNotAllowedResponse(_connection); - return MHD_YES; -} - -QUrl DappHost::hostDapp(Dapp&& _dapp) -{ - m_dapp = std::move(_dapp); - m_entriesByPath.clear(); - for (ManifestEntry const& entry: m_dapp.manifest.entries) - m_entriesByPath[QString::fromStdString(entry.path)] = &entry; - - return m_url; -} - -bool DappHost::servesUrl(QUrl const& _url) const -{ - return m_url == _url || m_url.isParentOf(_url); -} diff --git a/alethzero/DappHost.h b/alethzero/DappHost.h deleted file mode 100644 index e2fd12689..000000000 --- a/alethzero/DappHost.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file DappHost.h - * @author Arkadiy Paronyan - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include "DappLoader.h" - -struct MHD_Daemon; -struct MHD_Connection; - -namespace dev -{ - -namespace az -{ - -/// DApp web server. Servers web content, resolves paths by hashes -class DappHost -{ -public: - /// @param _port Network pork to listen for incoming connections - /// @param _threads Max number of threads to process requests - DappHost(int _port, int _threads = 10); - virtual ~DappHost(); - /// Load and host a dapp. Previsous dapp in discarded. Synchronous - QUrl hostDapp(Dapp&& _dapp); - - /// @returns true if the given url is served from this DappHost. - bool servesUrl(QUrl const& _url) const; - -private: - void startListening(); - void stopListening(); - void sendOptionsResponse(MHD_Connection* _connection); - void sendNotAllowedResponse(MHD_Connection* _connection); - void sendResponse(std::string const& _url, MHD_Connection* _connection); - static int callback(void* _cls, MHD_Connection* _connection, char const* _url, char const* _method, char const* _version, char const* _uploadData, size_t* _uploadDataSize, void** _conCls); - - int const m_port; - QUrl const m_url; - int m_threads; - bool m_running; - MHD_Daemon* m_daemon; - Dapp m_dapp; - std::map m_entriesByPath; -}; - -} -} diff --git a/alethzero/DappLoader.cpp b/alethzero/DappLoader.cpp deleted file mode 100644 index 605a9c953..000000000 --- a/alethzero/DappLoader.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file DappLoader.cpp - * @author Arkadiy Paronyan - * @date 2015 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "DappLoader.h" -using namespace dev; -using namespace az; -using namespace eth; -using namespace crypto; - -namespace dev { namespace az { QString contentsOfQResource(std::string const& res); } } - -DappLoader::DappLoader(QObject* _parent, WebThreeDirect* _web3, Address _nameReg): - QObject(_parent), m_web3(_web3), m_nameReg(_nameReg) -{ - connect(&m_net, &QNetworkAccessManager::finished, this, &DappLoader::downloadComplete); -} - -DappLocation DappLoader::resolveAppUri(QString const& _uri) -{ - QUrl url(_uri); - if (!url.scheme().isEmpty() && url.scheme() != "eth") - throw dev::Exception(); //TODO: - - QStringList parts = url.host().split('.', QString::SkipEmptyParts); - QStringList domainParts; - std::reverse(parts.begin(), parts.end()); - parts.append(url.path().split('/', QString::SkipEmptyParts)); - - Address address = m_nameReg; - Address lastAddress; - int partIndex = 0; - - h256 contentHash; - while (address && partIndex < parts.length()) - { - lastAddress = address; - string32 name = ZeroString32; - QByteArray utf8 = parts[partIndex].toUtf8(); - std::copy(utf8.data(), utf8.data() + utf8.size(), name.data()); - if (address != m_nameReg) - address = abiOut
(web3()->ethereum()->call(address, abiIn("subRegistrar(bytes32)", name)).output); - else - address = abiOut
(web3()->ethereum()->call(address, abiIn("register(bytes32)", name)).output); - - domainParts.append(parts[partIndex]); - if (!address) - { - //we have the address of the last part, try to get content hash - contentHash = abiOut(web3()->ethereum()->call(lastAddress, abiIn("content(bytes32)", name)).output); - if (!contentHash) - throw dev::Exception() << errinfo_comment("Can't resolve address"); - } - ++partIndex; - } - - string32 urlHintName = ZeroString32; - QByteArray utf8 = QString("urlhint").toUtf8(); - std::copy(utf8.data(), utf8.data() + utf8.size(), urlHintName.data()); - - Address urlHint = abiOut
(web3()->ethereum()->call(m_nameReg, abiIn("addr(bytes32)", urlHintName)).output); - string32 contentUrl = abiOut(web3()->ethereum()->call(urlHint, abiIn("url(bytes32)", contentHash)).output); - QString domain = domainParts.join('/'); - parts.erase(parts.begin(), parts.begin() + partIndex); - QString path = parts.join('/'); - QString contentUrlString = QString::fromUtf8(std::string(contentUrl.data(), contentUrl.size()).c_str()); - if (!contentUrlString.startsWith("http://") || !contentUrlString.startsWith("https://")) - contentUrlString = "http://" + contentUrlString; - return DappLocation { domain, path, contentUrlString, contentHash }; -} - -void DappLoader::downloadComplete(QNetworkReply* _reply) -{ - QUrl requestUrl = _reply->request().url(); - if (m_pageUrls.count(requestUrl) != 0) - { - //inject web3 js - QByteArray content = "\n"); - content.append(_reply->readAll()); - QString contentType = _reply->header(QNetworkRequest::ContentTypeHeader).toString(); - if (contentType.isEmpty()) - { - QMimeDatabase db; - contentType = db.mimeTypeForUrl(requestUrl).name(); - } - pageReady(content, contentType, requestUrl); - return; - } - - try - { - //try to interpret as rlp - QByteArray data = _reply->readAll(); - _reply->deleteLater(); - - h256 expected = m_uriHashes[requestUrl]; - bytes package(reinterpret_cast(data.constData()), reinterpret_cast(data.constData() + data.size())); - Secp256k1PP dec; - dec.decrypt(Secret(expected), package); - h256 got = sha3(package); - if (got != expected) - { - //try base64 - data = QByteArray::fromBase64(data); - package = bytes(reinterpret_cast(data.constData()), reinterpret_cast(data.constData() + data.size())); - dec.decrypt(Secret(expected), package); - got = sha3(package); - if (got != expected) - throw dev::Exception() << errinfo_comment("Dapp content hash does not match"); - } - - RLP rlp(package); - loadDapp(rlp); - bytesRef(&package).cleanse(); // TODO: replace with bytesSec once the crypto API is up to it. - } - catch (...) - { - qWarning() << tr("Error downloading DApp: ") << boost::current_exception_diagnostic_information().c_str(); - emit dappError(); - } - -} - -void DappLoader::loadDapp(RLP const& _rlp) -{ - Dapp dapp; - unsigned len = _rlp.itemCountStrict(); - dapp.manifest = loadManifest(_rlp[0].toString()); - for (unsigned c = 1; c < len; ++c) - { - bytesConstRef content = _rlp[c].toBytesConstRef(); - h256 hash = sha3(content); - auto entry = std::find_if(dapp.manifest.entries.cbegin(), dapp.manifest.entries.cend(), [=](ManifestEntry const& _e) { return _e.hash == hash; }); - if (entry != dapp.manifest.entries.cend()) - { - if (entry->path == "/deployment.js") - { - //inject web3 code - bytes b(web3Content().data(), web3Content().data() + web3Content().size()); - b.insert(b.end(), content.begin(), content.end()); - dapp.content[hash] = b; - } - else - dapp.content[hash] = content.toBytes(); - } - else - throw dev::Exception() << errinfo_comment("Dapp content hash does not match"); - } - emit dappReady(dapp); -} - -QByteArray const& DappLoader::web3Content() -{ - if (m_web3Js.isEmpty()) - { - QString code; - code += contentsOfQResource(":/js/bignumber.min.js"); - code += "\n"; - code += contentsOfQResource(":/js/webthree.js"); - code += "\n"; - code += contentsOfQResource(":/js/setup.js"); - code += "\n"; - code += contentsOfQResource(":/js/admin.js"); - code += "\n"; - m_web3Js = code.toLatin1(); - } - return m_web3Js; -} - -Manifest DappLoader::loadManifest(std::string const& _manifest) -{ - /// https://github.com/ethereum/go-ethereum/wiki/URL-Scheme - Manifest manifest; - Json::Reader jsonReader; - Json::Value root; - jsonReader.parse(_manifest, root, false); - - Json::Value entries = root["entries"]; - for (Json::ValueIterator it = entries.begin(); it != entries.end(); ++it) - { - Json::Value const& entryValue = *it; - std::string path = entryValue["path"].asString(); - if (path.size() == 0 || path[0] != '/') - path = "/" + path; - std::string contentType = entryValue["contentType"].asString(); - std::string strHash = entryValue["hash"].asString(); - if (strHash.length() == 64) - strHash = "0x" + strHash; - h256 hash = jsToFixed<32>(strHash); - unsigned httpStatus = entryValue["status"].asInt(); - manifest.entries.push_back(ManifestEntry{ path, hash, contentType, httpStatus }); - } - return manifest; -} - -void DappLoader::loadDapp(QString const& _uri) -{ - QUrl uri(_uri); - QUrl contentUri; - h256 hash; - if (uri.path().endsWith(".dapp") && uri.query().startsWith("hash=")) - { - contentUri = uri; - QString query = uri.query(); - query.remove("hash="); - if (!query.startsWith("0x")) - query.insert(0, "0x"); - hash = jsToFixed<32>(query.toStdString()); - } - else - { - DappLocation location = resolveAppUri(_uri); - contentUri = location.contentUri; - hash = location.contentHash; - uri = contentUri; - } - QNetworkRequest request(contentUri); - m_uriHashes[uri] = hash; - m_net.get(request); -} - -void DappLoader::loadPage(QString const& _uri) -{ - QUrl uri(_uri); - QNetworkRequest request(uri); - m_pageUrls.insert(uri); - m_net.get(request); -} - diff --git a/alethzero/DappLoader.h b/alethzero/DappLoader.h deleted file mode 100644 index f3ec40dd1..000000000 --- a/alethzero/DappLoader.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file DappLoader.h - * @author Arkadiy Paronyan - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace dev -{ - -class WebThreeDirect; -class RLP; - -namespace az -{ - -struct ManifestEntry -{ - std::string path; - dev::h256 hash; - std::string contentType; - unsigned httpStatus; -}; - -struct Manifest -{ - std::vector entries; -}; - -struct Dapp -{ - Manifest manifest; - std::map content; -}; - - -struct DappLocation -{ - QString canonDomain; - QString path; - QString contentUri; - dev::h256 contentHash; -}; - -///Downloads, unpacks and prepares DApps for hosting -class DappLoader: public QObject -{ - Q_OBJECT -public: - DappLoader(QObject* _parent, dev::WebThreeDirect* _web3, dev::Address _nameReg); - ///Load a new DApp. Resolves a name with a name reg contract. Asynchronous. dappReady is emitted once everything is read, dappError othervise - ///@param _uri Eth name path - void loadDapp(QString const& _uri); - ///Load a regular html page - ///@param _uri Page Uri - void loadPage(QString const& _uri); - - void setSessionKey(std::string const& _s) { m_sessionKey = _s; } - -signals: - void dappReady(Dapp& _dapp); - void pageReady(QByteArray const& _content, QString const& _mimeType, QUrl const& _uri); - void dappError(); - -private slots: - void downloadComplete(QNetworkReply* _reply); - -private: - dev::WebThreeDirect* web3() const { return m_web3; } - DappLocation resolveAppUri(QString const& _uri); - void loadDapp(dev::RLP const& _rlp); - Manifest loadManifest(std::string const& _manifest); - QByteArray const& web3Content(); - - dev::WebThreeDirect* m_web3; - QNetworkAccessManager m_net; - std::map m_uriHashes; - std::set m_pageUrls; - QByteArray m_web3Js; - dev::Address m_nameReg; - std::string m_sessionKey; -}; - -} -} diff --git a/alethzero/Debugger.cpp b/alethzero/Debugger.cpp deleted file mode 100644 index df3b9c301..000000000 --- a/alethzero/Debugger.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Debugger.cpp - * @author Gav Wood - * @date 2015 - */ - -#include "Debugger.h" - -#include -#include -#include -#include -#include -#include "ui_Debugger.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -Debugger::Debugger(Context* _c, QWidget* _parent): - QDialog(_parent), - ui(new Ui::Debugger), - m_context(_c) -{ - ui->setupUi(this); -} - -Debugger::~Debugger() -{ - delete ui; -} - -void Debugger::init() -{ - if (m_session.history.size()) - { - alterDebugStateGroup(true); - ui->debugCode->setEnabled(false); - ui->debugTimeline->setMinimum(0); - ui->debugTimeline->setMaximum(m_session.history.size()); - ui->debugTimeline->setValue(0); - } -} - -void Debugger::populate(dev::eth::Executive& _executive, dev::eth::Transaction const& _transaction) -{ - finished(); - if (m_session.populate(_executive, _transaction)) - init(); - update(); -} - -bool DebugSession::populate(dev::eth::Executive& _executive, dev::eth::Transaction const& _transaction) -{ - try { - _executive.initialize(_transaction); - if (_executive.execute()) - return false; - } - catch (...) - { - // Invalid transaction - return false; - } - - vector levels; - bytes lastExtCode; - bytesConstRef lastData; - h256 lastHash; - h256 lastDataHash; - auto onOp = [&](uint64_t steps, Instruction inst, bigint newMemSize, bigint gasCost, bigint gas, VM* voidVM, ExtVMFace const* voidExt) - { - VM& vm = *voidVM; - ExtVM const& ext = *static_cast(voidExt); - if (ext.code != lastExtCode) - { - lastExtCode = ext.code; - lastHash = sha3(lastExtCode); - if (!codes.count(lastHash)) - codes[lastHash] = ext.code; - } - if (ext.data != lastData) - { - lastData = ext.data; - lastDataHash = sha3(lastData); - if (!codes.count(lastDataHash)) - codes[lastDataHash] = ext.data.toBytes(); - } - if (levels.size() < ext.depth) - levels.push_back(&history.back()); - else - levels.resize(ext.depth); - history.append(WorldState({steps, ext.myAddress, vm.curPC(), inst, newMemSize, static_cast(gas), lastHash, lastDataHash, vm.stack(), vm.memory(), gasCost, ext.state().storage(ext.myAddress), levels})); - }; - _executive.go(onOp); - _executive.finalize(); - return true; -} - -void Debugger::finished() -{ - m_session = DebugSession(); - ui->callStack->clear(); - ui->debugCode->clear(); - ui->debugStack->clear(); - ui->debugMemory->setHtml(""); - ui->debugStorage->setHtml(""); - ui->debugStateInfo->setText(""); - alterDebugStateGroup(false); -} - -void Debugger::update() -{ - if (m_session.history.size()) - { - WorldState const& nws = m_session.history[min((int)m_session.history.size() - 1, ui->debugTimeline->value())]; - WorldState const& ws = ui->callStack->currentRow() > 0 ? *nws.levels[nws.levels.size() - ui->callStack->currentRow()] : nws; - - if (ui->debugTimeline->value() >= m_session.history.size()) - { - if (ws.gasCost > ws.gas) - ui->debugMemory->setHtml("

OUT-OF-GAS

"); - else if (ws.inst == Instruction::RETURN && ws.stack.size() >= 2) - { - unsigned from = (unsigned)ws.stack.back(); - unsigned size = (unsigned)ws.stack[ws.stack.size() - 2]; - unsigned o = 0; - bytes out(size, 0); - for (; o < size && from + o < ws.memory.size(); ++o) - out[o] = ws.memory[from + o]; - ui->debugMemory->setHtml("

RETURN

" + QString::fromStdString(dev::memDump(out, 16, true))); - } - else if (ws.inst == Instruction::STOP) - ui->debugMemory->setHtml("

STOP

"); - else if (ws.inst == Instruction::SUICIDE && ws.stack.size() >= 1) - ui->debugMemory->setHtml("

SUICIDE

0x" + QString::fromStdString(toString(right160(ws.stack.back())))); - else - ui->debugMemory->setHtml("

EXCEPTION

"); - - ostringstream ss; - ss << dec << "EXIT | GAS: " << dec << max(0, (dev::bigint)ws.gas - ws.gasCost); - ui->debugStateInfo->setText(QString::fromStdString(ss.str())); - ui->debugStorage->setHtml(""); - ui->debugCallData->setHtml(""); - m_session.currentData = h256(); - ui->callStack->clear(); - m_session.currentLevels.clear(); - ui->debugCode->clear(); - m_session.currentCode = h256(); - ui->debugStack->setHtml(""); - } - else - { - if (m_session.currentLevels != nws.levels || !ui->callStack->count()) - { - m_session.currentLevels = nws.levels; - ui->callStack->clear(); - for (unsigned i = 0; i <= nws.levels.size(); ++i) - { - WorldState const& s = i ? *nws.levels[nws.levels.size() - i] : nws; - ostringstream out; - out << s.cur.abridged(); - if (i) - out << " " << instructionInfo(s.inst).name << " @0x" << hex << s.curPC; - ui->callStack->addItem(QString::fromStdString(out.str())); - } - } - - if (ws.code != m_session.currentCode) - { - m_session.currentCode = ws.code; - bytes const& code = m_session.codes[ws.code]; - QListWidget* dc = ui->debugCode; - dc->clear(); - m_session.pcWarp.clear(); - for (unsigned i = 0; i <= code.size(); ++i) - { - byte b = i < code.size() ? code[i] : 0; - try - { - QString s = QString::fromStdString(instructionInfo((Instruction)b).name); - ostringstream out; - out << hex << setw(4) << setfill('0') << i; - m_session.pcWarp[i] = dc->count(); - if (b >= (byte)Instruction::PUSH1 && b <= (byte)Instruction::PUSH32) - { - unsigned bc = b - (byte)Instruction::PUSH1 + 1; - s = "PUSH 0x" + QString::fromStdString(toHex(bytesConstRef(&code[i + 1], bc))); - i += bc; - } - dc->addItem(QString::fromStdString(out.str()) + " " + s); - } - catch (...) - { - cerr << "Unhandled exception!" << endl << boost::current_exception_diagnostic_information(); - break; // probably hit data segment - } - } - } - - if (ws.callData != m_session.currentData) - { - m_session.currentData = ws.callData; - if (ws.callData) - { - assert(m_session.codes.count(ws.callData)); - ui->debugCallData->setHtml(QString::fromStdString(dev::memDump(m_session.codes[ws.callData], 16, true))); - } - else - ui->debugCallData->setHtml(""); - } - - QString stack; - for (auto i: ws.stack) - stack.prepend("
" + QString::fromStdString(m_context->prettyU256(i)) + "
"); - ui->debugStack->setHtml(stack); - ui->debugMemory->setHtml(QString::fromStdString(dev::memDump(ws.memory, 16, true))); - assert(m_session.codes.count(ws.code)); - - if (m_session.codes[ws.code].size() >= (unsigned)ws.curPC) - { - int l = m_session.pcWarp[(unsigned)ws.curPC]; - ui->debugCode->setCurrentRow(max(0, l - 5)); - ui->debugCode->setCurrentRow(min(ui->debugCode->count() - 1, l + 5)); - ui->debugCode->setCurrentRow(l); - } - else - cwarn << "PC (" << (unsigned)ws.curPC << ") is after code range (" << m_session.codes[ws.code].size() << ")"; - - ostringstream ss; - ss << dec << "STEP: " << ws.steps << " | PC: 0x" << hex << ws.curPC << " : " << instructionInfo(ws.inst).name << " | ADDMEM: " << dec << ws.newMemSize << " words | COST: " << dec << ws.gasCost << " | GAS: " << dec << ws.gas; - ui->debugStateInfo->setText(QString::fromStdString(ss.str())); - stringstream s; - auto keys = dev::keysOf(ws.storage); - sort(keys.begin(), keys.end()); - for (auto const& key: keys) - s << "@" << m_context->prettyU256(key) << "    " << m_context->prettyU256(ws.storage.at(key)) << "
"; - ui->debugStorage->setHtml(QString::fromStdString(s.str())); - } - } -} - -void Debugger::on_callStack_currentItemChanged() -{ - update(); -} - -void Debugger::alterDebugStateGroup(bool _enable) const -{ - ui->stepOver->setEnabled(_enable); - ui->stepInto->setEnabled(_enable); - ui->stepOut->setEnabled(_enable); - ui->backOver->setEnabled(_enable); - ui->backInto->setEnabled(_enable); - ui->backOut->setEnabled(_enable); - ui->dump->setEnabled(_enable); - ui->dumpStorage->setEnabled(_enable); - ui->dumpPretty->setEnabled(_enable); -} - -void Debugger::on_debugTimeline_valueChanged() -{ - update(); -} - -void Debugger::on_stepOver_clicked() -{ - if (ui->debugTimeline->value() < m_session.history.size()) { - auto l = m_session.history[ui->debugTimeline->value()].levels.size(); - if ((ui->debugTimeline->value() + 1) < m_session.history.size() && m_session.history[ui->debugTimeline->value() + 1].levels.size() > l) - { - on_stepInto_clicked(); - if (m_session.history[ui->debugTimeline->value()].levels.size() > l) - on_stepOut_clicked(); - } - else - on_stepInto_clicked(); - } -} - -void Debugger::on_stepInto_clicked() -{ - ui->debugTimeline->setValue(ui->debugTimeline->value() + 1); - ui->callStack->setCurrentRow(0); -} - -void Debugger::on_stepOut_clicked() -{ - if (ui->debugTimeline->value() < m_session.history.size()) - { - auto ls = m_session.history[ui->debugTimeline->value()].levels.size(); - auto l = ui->debugTimeline->value(); - for (; l < m_session.history.size() && m_session.history[l].levels.size() >= ls; ++l) {} - ui->debugTimeline->setValue(l); - ui->callStack->setCurrentRow(0); - } -} - -void Debugger::on_backInto_clicked() -{ - ui->debugTimeline->setValue(ui->debugTimeline->value() - 1); - ui->callStack->setCurrentRow(0); -} - -void Debugger::on_backOver_clicked() -{ - auto l = m_session.history[ui->debugTimeline->value()].levels.size(); - if (ui->debugTimeline->value() > 0 && m_session.history[ui->debugTimeline->value() - 1].levels.size() > l) - { - on_backInto_clicked(); - if (m_session.history[ui->debugTimeline->value()].levels.size() > l) - on_backOut_clicked(); - } - else - on_backInto_clicked(); -} - -void Debugger::on_backOut_clicked() -{ - if (ui->debugTimeline->value() > 0 && m_session.history.size() > 0) - { - auto ls = m_session.history[min(ui->debugTimeline->value(), m_session.history.size() - 1)].levels.size(); - int l = ui->debugTimeline->value(); - for (; l > 0 && m_session.history[l].levels.size() >= ls; --l) {} - ui->debugTimeline->setValue(l); - ui->callStack->setCurrentRow(0); - } -} - -void Debugger::on_dump_clicked() -{ - QString fn = QFileDialog::getSaveFileName(this, "Select file to output EVM trace"); - ofstream f(fn.toStdString()); - if (f.is_open()) - for (WorldState const& ws: m_session.history) - f << ws.cur << " " << hex << toHex(dev::toCompactBigEndian(ws.curPC, 1)) << " " << hex << toHex(dev::toCompactBigEndian((unsigned)(byte)ws.inst, 1)) << " " << hex << toHex(dev::toCompactBigEndian((uint64_t)ws.gas, 1)) << endl; -} - -void Debugger::on_dumpPretty_clicked() -{ - QString fn = QFileDialog::getSaveFileName(this, "Select file to output EVM trace"); - ofstream f(fn.toStdString()); - if (f.is_open()) - for (WorldState const& ws: m_session.history) - { - f << endl << " STACK" << endl; - for (auto i: ws.stack) - f << (h256)i << endl; - f << " MEMORY" << endl << dev::memDump(ws.memory); - f << " STORAGE" << endl; - for (auto const& i: ws.storage) - f << showbase << hex << i.first << ": " << i.second << endl; - f << dec << ws.levels.size() << " | " << ws.cur << " | #" << ws.steps << " | " << hex << setw(4) << setfill('0') << ws.curPC << " : " << instructionInfo(ws.inst).name << " | " << dec << ws.gas << " | -" << dec << ws.gasCost << " | " << ws.newMemSize << "x32"; - } -} - -void Debugger::on_dumpStorage_clicked() -{ - QString fn = QFileDialog::getSaveFileName(this, "Select file to output EVM trace"); - ofstream f(fn.toStdString()); - if (f.is_open()) - for (WorldState const& ws: m_session.history) - { - if (ws.inst == Instruction::STOP || ws.inst == Instruction::RETURN || ws.inst == Instruction::SUICIDE) - for (auto i: ws.storage) - f << toHex(dev::toCompactBigEndian(i.first, 1)) << " " << toHex(dev::toCompactBigEndian(i.second, 1)) << endl; - f << ws.cur << " " << hex << toHex(dev::toCompactBigEndian(ws.curPC, 1)) << " " << hex << toHex(dev::toCompactBigEndian((unsigned)(byte)ws.inst, 1)) << " " << hex << toHex(dev::toCompactBigEndian((uint64_t)ws.gas, 1)) << endl; - } -} diff --git a/alethzero/Debugger.h b/alethzero/Debugger.h deleted file mode 100644 index 38a643deb..000000000 --- a/alethzero/Debugger.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Debugger.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include "Context.h" - -namespace Ui { class Debugger; } - -namespace dev -{ - -namespace az -{ - -struct WorldState -{ - uint64_t steps; - dev::Address cur; - dev::u256 curPC; - dev::eth::Instruction inst; - dev::bigint newMemSize; - dev::u256 gas; - dev::h256 code; - dev::h256 callData; - dev::u256s stack; - dev::bytes memory; - dev::bigint gasCost; - std::unordered_map storage; - std::vector levels; -}; - -struct DebugSession -{ - DebugSession() {} - - bool populate(dev::eth::Executive& _executive, dev::eth::Transaction const& _transaction); - - dev::h256 currentCode; - dev::h256 currentData; - std::vector currentLevels; - - QMap pcWarp; - QList history; - - std::map codes; -}; - -class Debugger: public QDialog -{ - Q_OBJECT - -public: - explicit Debugger(Context* _context, QWidget* _parent = 0); - ~Debugger(); - - void populate(dev::eth::Executive& _executive, dev::eth::Transaction const& _transaction); - -protected slots: - void on_callStack_currentItemChanged(); - void on_debugTimeline_valueChanged(); - void on_stepOver_clicked(); - void on_stepInto_clicked(); - void on_stepOut_clicked(); - void on_backOver_clicked(); - void on_backInto_clicked(); - void on_backOut_clicked(); - void on_dump_clicked(); - void on_dumpPretty_clicked(); - void on_dumpStorage_clicked(); - void on_close_clicked() { close(); } - -private: - void init(); - void update(); - void finished(); - - void alterDebugStateGroup(bool _enable) const; - - Ui::Debugger* ui; - - DebugSession m_session; - Context* m_context; -}; - -} -} diff --git a/alethzero/Debugger.ui b/alethzero/Debugger.ui deleted file mode 100644 index 6751655ae..000000000 --- a/alethzero/Debugger.ui +++ /dev/null @@ -1,300 +0,0 @@ - - - Debugger - - - - 0 - 0 - 989 - 690 - - - - Dialog - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Step Over - - - - - - - Step Into - - - - - - - Step Out - - - - - - - Back Over - - - - - - - Back Into - - - - - - - Back Out - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - - 1 - 0 - - - - Qt::Vertical - - - - - 0 - 0 - - - - QFrame::NoFrame - - - 0 - - - - - - Ubuntu Mono - - - - QFrame::NoFrame - - - 0 - - - - - - - 1 - 0 - - - - Qt::Vertical - - - - QFrame::NoFrame - - - 0 - - - true - - - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - QFrame::NoFrame - - - 0 - - - true - - - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - QFrame::NoFrame - - - 0 - - - true - - - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - QFrame::NoFrame - - - true - - - - - - - - - - 0 - 0 - - - - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::Horizontal - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Dump - - - - - - - Dump Storage - - - - - - - Dump Pretty - - - - - - - Qt::Horizontal - - - - 577 - 20 - - - - - - - - Close - - - - - - - - - - - diff --git a/alethzero/DownloadView.cpp b/alethzero/DownloadView.cpp deleted file mode 100644 index a29b1fd31..000000000 --- a/alethzero/DownloadView.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file DownloadView.cpp - * @author Gav Wood - * @date 2014 - */ - -#include "DownloadView.h" -#include -#include -#include -#include "Grapher.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -SyncView::SyncView(QWidget* _p): QWidget(_p) -{ -} - -void SyncView::paintEvent(QPaintEvent*) -{ - QPainter painter(this); - painter.fillRect(rect(), Qt::white); - painter.setRenderHint(QPainter::Antialiasing, true); - painter.setRenderHint(QPainter::HighQualityAntialiasing, true); - - if (!m_client || !isVisible() || !rect().width() || !rect().height()) - return; - - DownloadMan const* man = m_client->downloadMan(); - BlockQueueStatus bqs = m_client->blockQueueStatus(); - SyncStatus sync = m_client->syncStatus(); - - unsigned syncFrom = m_client->numberFromHash(PendingBlockHash); - unsigned syncImported = syncFrom; - unsigned syncImporting = syncImported + bqs.importing; - unsigned syncVerified = syncImporting + bqs.verified; - unsigned syncVerifying = syncVerified + bqs.verifying; - unsigned syncUnverified = syncVerifying + bqs.unverified; - unsigned syncCount = syncUnverified + bqs.unknown - syncFrom; - - // best effort guess. assumes there's no forks. - unsigned downloadFrom = sync.state == SyncState::Idle ? m_lastSyncFrom : m_client->numberFromHash(m_client->isKnown(man->firstBlock()) ? man->firstBlock() : PendingBlockHash); - unsigned downloadCount = sync.state == SyncState::Idle ? m_lastSyncCount : sync.blocksTotal; - unsigned downloadDone = downloadFrom + (sync.state == SyncState::Idle ? m_lastSyncCount : sync.blocksReceived); - unsigned downloadPoint = downloadFrom + (sync.state == SyncState::Idle ? m_lastSyncCount : man->overview().lastComplete); - - unsigned hashFrom = sync.state == SyncState::Hashes ? m_client->numberFromHash(PendingBlockHash) : downloadFrom; - unsigned hashCount = sync.state == SyncState::Hashes ? sync.hashesTotal : downloadCount; - unsigned hashDone = hashFrom + (sync.state == SyncState::Hashes ? sync.hashesReceived : hashCount); - - QString labelText = QString("PV%1").arg(sync.protocolVersion); - QColor labelBack = QColor::fromHsv(sync.protocolVersion == 60 ? 30 : sync.protocolVersion == 61 ? 120 : 240, 25, 200); - QColor labelFore = labelBack.darker(); - switch (sync.state) - { - case SyncState::Hashes: - if (!syncCount || !sync.hashesEstimated) - { - m_lastSyncFrom = min(hashFrom, m_lastSyncFrom); - m_lastSyncCount = max(hashFrom + hashCount, m_lastSyncFrom + m_lastSyncCount) - m_lastSyncFrom; - m_wasEstimate = sync.hashesEstimated; - } - break; - case SyncState::Blocks: - if (m_wasEstimate) - { - m_lastSyncFrom = downloadFrom; - m_lastSyncCount = downloadCount; - m_wasEstimate = false; - } - break; - case SyncState::Idle: - if (!syncCount) - { - m_lastSyncFrom = (unsigned)-1; - m_lastSyncCount = 0; - labelBack = QColor::fromHsv(0, 0, 200); - labelFore = Qt::white; - labelText = "Idle"; - } - default: break; - } - - unsigned from = min(min(hashFrom, downloadFrom), min(syncFrom, m_lastSyncFrom)); - unsigned count = max(max(hashFrom + hashCount, downloadFrom + downloadCount), max(syncFrom + syncCount, m_lastSyncFrom + m_lastSyncCount)) - from; - -/* cnote << "Range " << from << "-" << (from + count) << "(" << hashFrom << "+" << hashCount << "," << downloadFrom << "+" << downloadCount << "," << syncFrom << "+" << syncCount << ")"; - auto r = [&](unsigned u) { - return toString((u - from) * 100 / count) + "%"; - }; - - if (count) - { - cnote << "Hashes:" << r(hashDone) << " Blocks:" << r(downloadFlank) << r(downloadDone) << r(downloadPoint); - cnote << "Importing:" << r(syncFrom) << r(syncImported) << r(syncImporting) << r(syncVerified) << r(syncVerifying) << r(syncUnverified); - } -*/ - float const squareSize = min(rect().width(), rect().height()); - auto middleRect = [&](float w, float h) { - return QRectF(rect().width() / 2 - w / 2, rect().height() / 2 - h / 2, w, h); - }; - auto middle = [&](float x) { - return middleRect(squareSize * x, squareSize * x); - }; - auto pieProgress = [&](unsigned h, unsigned s, unsigned v, float row, float thickness, unsigned nfrom, unsigned ncount) { - auto arcLen = [&](unsigned x) { - return x * -5760.f / count; - }; - auto arcPos = [&](unsigned x) { - return int(90 * 16.f + arcLen(x - from)) % 5760; - }; - painter.setPen(QPen(QColor::fromHsv(h, s, v), squareSize * thickness, Qt::SolidLine, Qt::FlatCap)); - painter.setBrush(Qt::NoBrush); - painter.drawArc(middle(0.5 + row / 2), arcPos(nfrom), arcLen(ncount)); - }; - auto pieProgress2 = [&](unsigned h, unsigned s, unsigned v, float row, float orbit, float thickness, unsigned nfrom, unsigned ncount) { - pieProgress(h, s, v, row - orbit, thickness, nfrom, ncount); - pieProgress(h, s, v, row + orbit, thickness, nfrom, ncount); - }; - auto pieLabel = [&](QString text, float points, QColor fore, QColor back) { - painter.setBrush(QBrush(back)); - painter.setFont(QFont("Helvetica", points, QFont::Bold)); - QRectF r = painter.boundingRect(middle(1.f), Qt::AlignCenter, text); - r.adjust(-r.width() / 4, -r.height() / 8, r.width() / 4, r.height() / 8); - painter.setPen(QPen(fore, r.height() / 20)); - painter.drawRoundedRect(r, r.height() / 4, r.height() / 4); - painter.drawText(r, Qt::AlignCenter, text); - }; - - float lineHeight = painter.boundingRect(rect(), Qt::AlignTop | Qt::AlignHCenter, "Ay").height(); - auto hProgress = [&](unsigned h, unsigned s, unsigned v, float row, float thickness, unsigned nfrom, unsigned ncount) { - QRectF r = rect(); - painter.setPen(QPen(QColor::fromHsv(h, s, v), r.height() * thickness * 3, Qt::SolidLine, Qt::FlatCap)); - painter.setBrush(Qt::NoBrush); - auto y = row * (r.height() - lineHeight) + lineHeight; - painter.drawLine(QPointF((nfrom - from) * r.width() / count, y), QPointF((nfrom + ncount - from) * r.width() / count, y)); - }; - auto hProgress2 = [&](unsigned h, unsigned s, unsigned v, float row, float orbit, float thickness, unsigned nfrom, unsigned ncount) { - hProgress(h, s, v, row - orbit * 3, thickness, nfrom, ncount); - hProgress(h, s, v, row + orbit * 3, thickness, nfrom, ncount); - }; - auto hLabel = [&](QString text, float points, QColor fore, QColor back) { - painter.setBrush(QBrush(back)); - painter.setFont(QFont("Helvetica", points, QFont::Bold)); - QRectF r = painter.boundingRect(rect(), Qt::AlignTop | Qt::AlignHCenter, text); - r.adjust(-r.width() / 4, r.height() / 8, r.width() / 4, 3 * r.height() / 8); - painter.setPen(QPen(fore, r.height() / 20)); - painter.drawRoundedRect(r, r.height() / 4, r.height() / 4); - painter.drawText(r, Qt::AlignCenter, text); - }; - - function progress; - function progress2; - function label; - if (rect().width() / rect().height() > 5) - { - progress = hProgress; - progress2 = hProgress2; - label = hLabel; - } - else - { - progress = pieProgress; - progress2 = pieProgress2; - label = pieLabel; - } - - if (sync.state != SyncState::Idle) - { - progress(0, 0, 220, 0.4f, 0.02f, from, hashDone - from); // Download rail - progress(240, 25, 170, 0.4f, 0.02f, downloadDone, downloadPoint - downloadDone); // Latest download point - progress(240, 50, 120, 0.4f, 0.04f, from, downloadDone - from); // Downloaded - } - - progress(0, 0, 220, 0.8f, 0.01f, from, count); // Sync rail - progress(0, 0, 170, 0.8f, 0.02f, from, syncUnverified - from); // Verification rail - progress2(60, 25, 170, 0.8f, 0.06f, 0.005f, from, syncVerifying - from); // Verifying. - progress2(120, 25, 170, 0.8f, 0.06f, 0.005f, from, syncVerified - from); // Verified. - progress(120, 50, 120, 0.8f, 0.05f, from, syncFrom - from); // Imported. - progress(0, 0, 120, 0.8f, 0.02f, syncFrom, syncImporting - syncFrom); // Importing. - - if (sync.state != SyncState::Idle || (sync.state == SyncState::Idle && !syncCount)) - label(labelText, 11, labelFore, labelBack); -} diff --git a/alethzero/DownloadView.h b/alethzero/DownloadView.h deleted file mode 100644 index 4ce5dd67a..000000000 --- a/alethzero/DownloadView.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file DownloadView.h - * @author Gav Wood - * @date 2014 - */ - -#pragma once - -#ifdef Q_MOC_RUN -#define BOOST_MPL_IF_HPP_INCLUDED -#endif - -#include -#include -#ifndef Q_MOC_RUN -#include -#endif - -namespace dev -{ - -namespace eth { class Client; } - -namespace az -{ - -class SyncView: public QWidget -{ - Q_OBJECT - -public: - SyncView(QWidget* _p = nullptr); - - void setEthereum(dev::eth::Client const* _c) { m_client = _c; } - -protected: - virtual void paintEvent(QPaintEvent*); - -private: - dev::eth::Client const* m_client = nullptr; - - unsigned m_lastSyncFrom = (unsigned)-1; - unsigned m_lastSyncCount = 0; - bool m_wasEstimate = false; -}; - -} -} diff --git a/alethzero/GasPricing.ui b/alethzero/GasPricing.ui deleted file mode 100644 index 39a3b1661..000000000 --- a/alethzero/GasPricing.ui +++ /dev/null @@ -1,181 +0,0 @@ - - - GasPricing - - - - 0 - 0 - 416 - 286 - - - - Gas Pricing - - - - - - Qt::Vertical - - - - 398 - 45 - - - - - - - - &Bid: The minimum grice of gas that is accepting into a block which we mine. - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - true - - - bidValue - - - - - - - - - - 430000000 - - - 0 - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Close - - - true - - - - - - - - - &Ask: The minimum grice of gas that is accepting into a block which we mine. - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - true - - - askValue - - - - - - - - - - - - - 430000000 - - - 0 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - close - clicked() - GasPricing - accept() - - - 387 - 264 - - - 240 - 262 - - - - - diff --git a/alethzero/GetPassword.ui b/alethzero/GetPassword.ui deleted file mode 100644 index 753bca565..000000000 --- a/alethzero/GetPassword.ui +++ /dev/null @@ -1,123 +0,0 @@ - - - GetPassword - - - - 0 - 0 - 400 - 187 - - - - Enter Password - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Qt::RichText - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - QLineEdit::Password - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - GetPassword - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - GetPassword - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/alethzero/GraphParameters.h b/alethzero/GraphParameters.h deleted file mode 100644 index e1669bd21..000000000 --- a/alethzero/GraphParameters.h +++ /dev/null @@ -1,106 +0,0 @@ -/* BEGIN COPYRIGHT - * - * This file is part of Noted. - * - * Copyright ©2011, 2012, Lancaster Logic Response Limited. - * - * Noted is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Noted is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Noted. If not, see . - */ - -#pragma once - -#include -#include -#include - -#undef foreach -#define foreach BOOST_FOREACH - -namespace lb -{ - -template -static T graphParameters(T _min, T _max, unsigned _divisions, T* o_from = 0, T* o_delta = 0, bool _forceMinor = false, T _divisor = 1) -{ - T uMin = _min / _divisor; - T uMax = _max / _divisor; - if (uMax == uMin || !_divisions) - { - if (o_delta && o_from) - { - *o_from = 0; - *o_delta = 1; - } - return 1; - } - long double l10 = std::log10((uMax - uMin) / T(_divisions) * 5.5f); - long double mt = std::pow(10.f, l10 - std::floor(l10)); - long double ep = std::pow(10.f, std::floor(l10)); - T inc = _forceMinor - ? ((mt > 6.f) ? ep / 2.f : (mt > 3.f) ? ep / 5.f : (mt > 1.2f) ? ep / 10.f : ep / 20.f) - : ((mt > 6.f) ? ep * 2.f : (mt > 3.f) ? ep : (mt > 1.2f) ? ep / 2.f : ep / 5.f); - if (inc == 0) - inc = 1; - if (o_delta && o_from) - { - (*o_from) = std::floor(uMin / inc) * inc * _divisor; - (*o_delta) = (std::ceil(uMax / inc) - std::floor(uMin / inc)) * inc * _divisor; - } - else if (o_from) - { - (*o_from) = std::ceil(uMin / inc) * inc * _divisor; - } - return inc * _divisor; -} - -struct GraphParametersForceMinor { GraphParametersForceMinor() {} }; -static const GraphParametersForceMinor ForceMinor; - -template -struct GraphParameters -{ - inline GraphParameters(std::pair _range, unsigned _divisions) - { - incr = graphParameters(_range.first, _range.second, _divisions, &from, &delta, false); - to = from + delta; - } - - inline GraphParameters(std::pair _range, unsigned _divisions, GraphParametersForceMinor) - { - incr = graphParameters(_range.first, _range.second, _divisions, &from, &delta, true); - to = from + delta; - } - - inline GraphParameters(std::pair _range, unsigned _divisions, T _divisor) - { - major = graphParameters(_range.first, _range.second, _divisions, &from, &delta, false, _divisor); - incr = graphParameters(_range.first, _range.second, _divisions, &from, &delta, true, _divisor); - to = from + delta; - } - - template - struct MajorDeterminor { static bool go(S _s, S _j) { S ip; S fp = std::modf(_s / _j + S(0.5), &ip); return fabs(fabs(fp) - 0.5) < 0.05; } }; - template - struct MajorDeterminor::value>::type> { static S go(S _s, S _j) { return _s % _j == 0; } }; - - bool isMajor(T _t) const { return MajorDeterminor::go(_t, major); } - - T from; - T delta; - T major; - T to; - T incr; -}; - -} diff --git a/alethzero/Grapher.cpp b/alethzero/Grapher.cpp deleted file mode 100644 index af8aacdcb..000000000 --- a/alethzero/Grapher.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/* BEGIN COPYRIGHT - * - * This file is part of Noted. - * - * Copyright ©2011, 2012, Lancaster Logic Response Limited. - * - * Noted is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Noted is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Noted. If not, see . - */ - -#include - -#include "GraphParameters.h" -#include "Grapher.h" - -using namespace std; -using namespace lb; - -void Grapher::init(QPainter* _p, std::pair _xRange, std::pair _yRange, std::function _xLabel, std::function _yLabel, std::function _pLabel, int _leftGutter, int _bottomGutter) -{ - fontPixelSize = QFontInfo(QFont("Ubuntu", 10)).pixelSize(); - - if (_leftGutter) - _leftGutter = max(_leftGutter, fontPixelSize * 2); - if (_bottomGutter) - _bottomGutter = max(_bottomGutter, fontPixelSize * 1.25); - - QRect a(_leftGutter, 0, _p->viewport().width() - _leftGutter, _p->viewport().height() - _bottomGutter); - init(_p, _xRange, _yRange, _xLabel, _yLabel, _pLabel, a); -} - -bool Grapher::drawAxes(bool _x, bool _y) const -{ - int w = active.width(); - int h = active.height(); - int l = active.left(); - int r = active.right(); - int t = active.top(); - int b = active.bottom(); - - p->setFont(QFont("Ubuntu", 10)); - p->fillRect(p->viewport(), qRgb(255, 255, 255)); - - static const int c_markLength = 2; - static const int c_markSpacing = 2; - static const int c_xSpacing = fontPixelSize * 3; - static const int c_ySpacing = fontPixelSize * 1.25; - - if (w < c_xSpacing || h < c_ySpacing || !p->viewport().contains(active)) - return false; - - if (_y) - { - GraphParameters yParams(yRange, h / c_ySpacing, 1.f); - float dy = fabs(yRange.second - yRange.first); - if (dy > .001) - for (float f = yParams.from; f < yParams.to; f += yParams.incr) - { - int y = b - h * (f - yParams.from) / dy; - if (yParams.isMajor(f)) - { - p->setPen(QColor(208, 208, 208)); - p->drawLine(l - c_markLength, y, r, y); - if (l > p->viewport().left()) - { - p->setPen(QColor(144, 144, 144)); - p->drawText(QRect(0, y - c_ySpacing / 2, l - c_markLength - c_markSpacing, c_ySpacing), Qt::AlignRight|Qt::AlignVCenter, QString::fromStdString(yLabel(round(f * 100000) / 100000))); - } - } - else - { - p->setPen(QColor(236, 236, 236)); - p->drawLine(l, y, r, y); - } - } - p->setPen(QColor(192,192,192)); - p->drawLine(l - c_markSpacing, b, r, b); - } - - if (_x) - { - GraphParameters xParams(xRange, w / c_xSpacing, 1.f); - float dx = fabs(xRange.second - xRange.first); - for (float f = xParams.from; f < xParams.to; f += xParams.incr) - { - int x = l + w * (f - xParams.from) / dx; - if (xParams.isMajor(f)) - { - p->setPen(QColor(208, 208, 208)); - p->drawLine(x, t, x, b + c_markLength); - if (b < p->viewport().bottom()) - { - p->setPen(QColor(144, 144, 144)); - p->drawText(QRect(x - c_xSpacing / 2, b + c_markLength + c_markSpacing, c_xSpacing, p->viewport().height() - (b + c_markLength + c_markSpacing)), Qt::AlignHCenter|Qt::AlignTop, QString::fromStdString(xLabel(f))); - } - } - else - { - p->setPen(QColor(236, 236, 236)); - p->drawLine(x, t, x, b); - } - } - } - - p->setClipRect(active); - return true; -} - -void Grapher::drawLineGraph(vector const& _data, QColor _color, QBrush const& _fillToZero, float _width) const -{ - int s = _data.size(); - QPoint l; - for (int i = 0; i < s; ++i) - { - int zy = yP(0.f); - QPoint h(xTP(i), yTP(_data[i])); - if (i) - { - if (_fillToZero != Qt::NoBrush) - { - p->setPen(Qt::NoPen); - p->setBrush(_fillToZero); - p->drawPolygon(QPolygon(QVector() << QPoint(h.x(), zy) << h << l << QPoint(l.x(), zy))); - } - p->setPen(QPen(_color, _width)); - p->drawLine(QLine(l, h)); - } - l = h; - } -} - -void Grapher::ruleY(float _x, QColor _color, float _width) const -{ - p->setPen(QPen(_color, _width)); - p->drawLine(xTP(_x), active.top(), xTP(_x), active.bottom()); -} - -void Grapher::drawLineGraph(std::function const& _f, QColor _color, QBrush const& _fillToZero, float _width) const -{ - QPoint l; - for (int x = active.left(); x < active.right(); x += 2) - { - int zy = yP(0.f); - QPoint h(x, yTP(_f(xRU(x)))); - if (x != active.left()) - { - if (_fillToZero != Qt::NoBrush) - { - p->setPen(Qt::NoPen); - p->setBrush(_fillToZero); - p->drawPolygon(QPolygon(QVector() << QPoint(h.x(), zy) << h << l << QPoint(l.x(), zy))); - } - p->setPen(QPen(_color, _width)); - p->drawLine(QLine(l, h)); - } - l = h; - } -} - -void Grapher::labelYOrderedPoints(map const& _data, int _maxCount, float _minFactor) const -{ - int ly = active.top() + 6; - int pc = 0; - if (_data.empty()) - return; - float smallestAllowed = prev(_data.end())->first * _minFactor; - for (auto peaki = _data.rbegin(); peaki != _data.rend(); ++peaki) - if ((peaki->first > smallestAllowed || _minFactor == 0) && pc < _maxCount) - { - auto peak = *peaki; - int x = xTP(peak.second); - int y = yTP(peak.first); - p->setPen(QColor::fromHsvF(float(pc) / _maxCount, 1.f, 0.5f, 0.5f)); - p->drawEllipse(QPoint(x, y), 4, 4); - p->drawLine(x, y - 4, x, ly + 6); - QString f = QString::fromStdString(pLabel(xT(peak.second), yT(peak.first))); - int fw = p->fontMetrics().width(f); - p->drawLine(x + 16 + fw + 2, ly + 6, x, ly + 6); - p->setPen(QColor::fromHsvF(0, 0.f, .35f)); - p->fillRect(QRect(x+12, ly-6, fw + 8, 12), QBrush(QColor(255, 255, 255, 160))); - p->drawText(QRect(x+16, ly-6, 160, 12), Qt::AlignVCenter, f); - ly += 14; - ++pc; - } -} diff --git a/alethzero/Grapher.h b/alethzero/Grapher.h deleted file mode 100644 index 564fe6654..000000000 --- a/alethzero/Grapher.h +++ /dev/null @@ -1,116 +0,0 @@ -/* BEGIN COPYRIGHT - * - * This file is part of Noted. - * - * Copyright ©2011, 2012, Lancaster Logic Response Limited. - * - * Noted is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Noted is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Noted. If not, see . - */ - -#pragma once - -#include -#include -#include -#include -#include - -#include -#include - -class QPainter; - -namespace lb -{ - -class Grapher -{ -public: - Grapher(): p(0) {} - void init(QPainter* _p, std::pair _xRange, std::pair _yRange, std::function _xLabel, std::function _yLabel, std::function _pLabel, int _leftGutter = 30, int _bottomGutter = 16); - void init(QPainter* _p, std::pair _xRange, std::pair _yRange, std::function _xLabel, std::function _yLabel, std::function _pLabel, QRect _active) - { - p = _p; - active = _active; - xRange = _xRange; - yRange = _yRange; - dx = xRange.second - xRange.first; - dy = yRange.second - yRange.first; - xLabel = _xLabel; - yLabel = _yLabel; - pLabel = _pLabel; - } - - void setDataTransform(float _xM, float _xC, float _yM, float _yC) - { - xM = _xM; - xC = _xC; - yM = _yM; - yC = _yC; - } - void setDataTransform(float _xM, float _xC) - { - xM = _xM; - xC = _xC; - yM = 1.f; - yC = 0.f; - } - void resetDataTransform() { xM = yM = 1.f; xC = yC = 0.f; } - - bool drawAxes(bool _x = true, bool _y = true) const; - void drawLineGraph(std::vector const& _data, QColor _color = QColor(128, 128, 128), QBrush const& _fillToZero = Qt::NoBrush, float _width = 0.f) const; - void drawLineGraph(std::function const& _f, QColor _color = QColor(128, 128, 128), QBrush const& _fillToZero = Qt::NoBrush, float _width = 0.f) const; - void ruleX(float _y, QColor _color = QColor(128, 128, 128), float _width = 0.f) const; - void ruleY(float _x, QColor _color = QColor(128, 128, 128), float _width = 0.f) const; - void labelYOrderedPoints(std::map const& _translatedData, int _maxCount = 20, float _minFactor = .01f) const; - -protected: - QPainter* p = nullptr; - QRect active; - std::pair xRange; - std::pair yRange; - - float xM = 0; - float xC = 0; - float yM = 0; - float yC = 0; - - float dx = 0; - float dy = 0; - - std::function xLabel; - std::function yLabel; - std::function pLabel; - - float fontPixelSize = 0; - - // Translate from raw indexed data into x/y graph units. Only relevant for indexed data. - float xT(float _dataIndex) const { return _dataIndex * xM + xC; } - float yT(float _dataValue) const { return _dataValue * yM + yC; } - // Translate from x/y graph units to widget pixels. - int xP(float _xUnits) const { return active.left() + (_xUnits - xRange.first) / dx * active.width(); } - int yP(float _yUnits) const { return active.bottom() - (_yUnits - yRange.first) / dy * active.height(); } - QPoint P(float _x, float _y) const { return QPoint(xP(_x), yP(_y)); } - // Translate direcly from raw indexed data to widget pixels. - int xTP(float _dataIndex) const { return active.left() + (xT(_dataIndex) - xRange.first) / dx * active.width(); } - int yTP(float _dataValue) const { return active.bottom() - (yT(_dataValue) - yRange.first) / dy * active.height(); } - // Translate back from pixels into graph units. - float xU(int _xPixels) const { return float(_xPixels - active.left()) / active.width() * dx + xRange.first; } - // Translate back from graph units into raw data index. - float xR(float _xUnits) const { return (_xUnits - xC) / xM; } - // Translate directly from pixels into raw data index. xRU(xTP(X)) == X - float xRU(int _xPixels) const { return xR(xU(_xPixels)); } -}; - -} diff --git a/alethzero/Main.ui b/alethzero/Main.ui deleted file mode 100644 index a26fb8f2c..000000000 --- a/alethzero/Main.ui +++ /dev/null @@ -1,1439 +0,0 @@ - - - Main - - - - 0 - 0 - 1617 - 1371 - - - - AlethZero ++Ethereum - - - true - - - QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::VerticalTabs - - - true - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - 0 bytes used - - - - - - - - - - - - - - #0 - - - - - - - 1 block - - - - - - - 0 wei - - - - - - - 0 peers - - - - - - - - - - - - - - 0 - - - - Tab 1 - - - - 0 - - - 4 - - - 4 - - - 4 - - - 4 - - - - - - - - - - - - - - - - - - - 0 - 0 - 1617 - 24 - - - - - &File - - - - - - &Network - - - - - - - - - - - - &Tools - - - - - - - - - - - - - - - - - - - - - &Help - - - - - - &Special - - - - - - - - - - - - - - - - - - - - &View - - - - - - - - &Debug - - - - - - - - - - &Config - - - - - - - - - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Network - - - 2 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Vertical - - - - Qt::NoFocus - - - QFrame::NoFrame - - - - - - - - - - - - - - Automatic - - - - - - - &Listen on - - - port - - - - - - - 1024 - - - 32767 - - - 30303 - - - - - - - Public IP - - - - - - - Automatic - - - - - - - Ideal &Peers - - - idealPeers - - - - - - - &Client Name - - - clientName - - - - - - - 1 - - - 5 - - - - - - - Anonymous - - - - - - - true - - - - - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Pending - - - 2 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - - - QFrame::NoFrame - - - - - - 2 - 0 - - - - QFrame::NoFrame - - - - - - - - - - toolBar - - - TopToolBarArea - - - false - - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Owned Accounts - - - 1 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::WheelFocus - - - QFrame::NoFrame - - - false - - - true - - - true - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Block Chain - - - 2 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - Filter... - - - true - - - - - - - Qt::Horizontal - - - - - 0 - 0 - - - - Qt::NoFocus - - - QFrame::NoFrame - - - - - - 2 - 0 - - - - Qt::WheelFocus - - - QFrame::NoFrame - - - true - - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Settings - - - 2 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Name Registrar - - - - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Mining - - - 1 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Javascript Console - - - 8 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - 0 - - - - - - 14 - 0 - - - - - - - - - 51 - 85 - 221 - - - - - - - 255 - 255 - 255 - - - - - - - 51 - 85 - 221 - - - - - - - 51 - 85 - 221 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 51 - 85 - 221 - - - - - - - 255 - 255 - 255 - - - - - - - 51 - 85 - 221 - - - - - - - 51 - 85 - 221 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 51 - 85 - 221 - - - - - - - 255 - 255 - 255 - - - - - - - 51 - 85 - 221 - - - - - - - 51 - 85 - 221 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - false - - - background-color: white; -color: #35d; -font-weight: bold; -font-family: Monospace, Ubuntu Mono, Lucida Console, Courier New; -font-size: 14pt - - - > - - - 0 - - - jsInput - - - - - - - - 0 - 0 - - - - background: white; -border: 0; -font-family: Monospace, Ubuntu Mono, Lucida Console, Courier New; -font-size: 14pt - - - - - - - - - false - - - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Blockchain Download - - - 2 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - QDockWidget::DockWidgetFeatureMask - - - Nodes - - - 2 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::NoFrame - - - - - - - - - &Quit - - - Ctrl+Q - - - - - true - - - true - - - &Use UPnP - - - - - &Connect to Peer... - - - - - true - - - Enable &Network - - - - - true - - - &Mine - - - - - &New Address... - - - - - &About... - - - - - true - - - &Preview Pending Transactions - - - - - false - - - &Step Over - - - F10 - - - - - true - - - &Mining Paranoia - - - - - &Kill Blockchain - - - - - &Import Key... - - - - - &Export Selected Key... - - - - - &Inject Transaction - - - - - true - - - &Show Ancient Blocks - - - - - true - - - Show &Anonymous Accounts - - - - - true - - - &Drop Past Peers - - - - - &Load Javascript... - - - - - false - - - Step Over &Backwards - - - Ctrl+F10 - - - - - true - - - &Force Mining - - - - - false - - - Standard with &Storage... - - - - - false - - - Step &Into - - - F11 - - - - - false - - - Step &Out - - - Shift+F11 - - - - - false - - - S&tandard... - - - - - false - - - Step Into Backwards - - - Ctrl+F11 - - - - - false - - - Step Out Backwards - - - Ctrl+Shift+F11 - - - - - false - - - &Debug Current Transaction - - - - - false - - - Dump &Current Transaction State (post) - - - - - false - - - Dump Current &Transaction State (pre) - - - - - false - - - &Pretty... - - - - - &Refresh - - - - - true - - - Use &Private Chain... - - - - - true - - - &Enable LLL Optimizer - - - - - true - - - &Enable Local Addresses - - - - - true - - - Claim Ether Presale &Wallet... - - - - - &Go! - - - - - New Identity - - - - - &Clear Pending - - - - - &Kill Account - - - - - New &Transaction... - - - - - true - - - true - - - &NatSpec Enabled - - - - - true - - - &GPU Mining - - - - - Retry Unknown Parent Blocks - - - - - In&ject Block - - - - - Prepare Next &DAG - - - - - true - - - true - - - Co&nfirm Transactions - - - - - Import &Secret Key File... - - - - - &Re-Encrypt Key - - - - - Re-Encrypt All Keys... - - - - - &Gas Prices... - - - - - true - - - Interpreter - - - - - true - - - JIT - - - - - true - - - Smart - - - - - &Sentinel... - - - - - &Rewind Chain... - - - - - true - - - &Hermit Mode - - - - - Dump &Block State as JSON... - - - - - &Bulk Inject Transactions... - - - - - false - - - Debug &Pending Transaction - - - - - Import Ether &Presale Wallet... - - - - - - - dev::az::MiningView - QWidget -
MiningView.h
- 1 -
- - dev::az::SyncView - QWidget -
DownloadView.h
- 1 -
- - QWebEngineView - QWidget -
QtWebEngineWidgets/QWebEngineView
- 1 -
-
- - tabWidget - urlEdit - listenIP - port - transactionQueue - pendingInfo - blockChainFilter - nameReg - nodes - jsInput - - - -
diff --git a/alethzero/MainFace.cpp b/alethzero/MainFace.cpp deleted file mode 100644 index 9382fdf26..000000000 --- a/alethzero/MainFace.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file MainFace.cpp - * @author Gav Wood - * @date 2014 - */ - -#include -#include "MainFace.h" -using namespace std; -using namespace dev; -using namespace az; - -void AccountNamer::noteKnownChanged() -{ - if (m_main) - m_main->noteKnownAddressesChanged(this); -} - -void AccountNamer::noteNamesChanged() -{ - if (m_main) - m_main->noteAddressNamesChanged(this); -} - -void MainFace::notePlugin(std::function const& _new) -{ - if (!s_linkedPlugins) - s_linkedPlugins = new std::vector>(); - s_linkedPlugins->push_back(_new); -} - -Plugin::Plugin(MainFace* _f, std::string const& _name): - m_main(_f), - m_name(_name) -{ - _f->adoptPlugin(this); -} - -QDockWidget* Plugin::dock(Qt::DockWidgetArea _area, QString _title) -{ - if (_title.isEmpty()) - _title = QString::fromStdString(m_name); - if (!m_dock) - { - m_dock = new QDockWidget(_title, m_main); - m_dock->setObjectName(_title); - m_main->addDockWidget(_area, m_dock); - m_dock->setFeatures(QDockWidget::AllDockWidgetFeatures | QDockWidget::DockWidgetVerticalTitleBar); - } - return m_dock; -} - -void Plugin::addToDock(Qt::DockWidgetArea _area, QDockWidget* _dockwidget, Qt::Orientation _orientation) -{ - m_main->addDockWidget(_area, _dockwidget, _orientation); -} - -void Plugin::addAction(QAction* _a) -{ - m_main->addAction(_a); -} - -QAction* Plugin::addMenuItem(QString _n, QString _menuName, bool _sep) -{ - QAction* a = new QAction(_n, main()); - QMenu* m = main()->findChild(_menuName); - if (_sep) - m->addSeparator(); - m->addAction(a); - return a; -} - -std::vector>* MainFace::s_linkedPlugins = nullptr; - -void MainFace::adoptPlugin(Plugin* _p) -{ - m_plugins[_p->name()] = shared_ptr(_p); -} - -void MainFace::killPlugins() -{ - m_plugins.clear(); -} - -void MainFace::allChange() -{ - for (auto const& p: m_plugins) - p.second->onAllChange(); -} diff --git a/alethzero/MainFace.h b/alethzero/MainFace.h deleted file mode 100644 index 2e9f806a8..000000000 --- a/alethzero/MainFace.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file MainFace.h - * @author Gav Wood - * @date 2014 - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include "Context.h" - -class QSettings; - -namespace dev -{ - -class WebThreeDirect; -namespace eth { class Client; class LogFilter; } -namespace shh { class WhisperHost; } - -namespace az -{ - -#ifndef _MSC_VER // MSVC does not like gcc compiler attributes -#define DEV_AZ_NOTE_PLUGIN(ClassName) \ - static bool s_notePlugin __attribute__((unused)) = [](){ MainFace::notePlugin([](MainFace* m){ return new ClassName(m); }); return true; }() -#else -#define DEV_AZ_NOTE_PLUGIN(ClassName) \ - static bool s_notePlugin = [](){ MainFace::notePlugin([](MainFace* m){ return new ClassName(m); }); return true; }() -#endif - -class Plugin; -class MainFace; -class Main; -class OurWebThreeStubServer; - -using WatchHandler = std::function; - -class AccountNamer -{ - friend class Main; - -public: - virtual std::string toName(Address const&) const { return std::string(); } - virtual Address toAddress(std::string const&) const { return Address(); } - virtual Addresses knownAddresses() const { return Addresses(); } - -protected: - void noteKnownChanged(); - void noteNamesChanged(); - -private: - MainFace* m_main = nullptr; -}; - -class MainFace: public QMainWindow, public Context -{ - Q_OBJECT - -public: - explicit MainFace(QWidget* _parent = nullptr): QMainWindow(_parent) {} - - static void notePlugin(std::function const& _new); - - void adoptPlugin(Plugin* _p); - void killPlugins(); - - void allChange(); - - using Context::render; - - // TODO: tidy - all should be references that throw if module unavailable. - // TODO: provide a set of available web3 modules. - virtual dev::WebThreeDirect* web3() const = 0; - virtual dev::eth::Client* ethereum() const = 0; - virtual OurWebThreeStubServer* web3Server() const = 0; - virtual std::shared_ptr whisper() const = 0; - - virtual unsigned installWatch(dev::eth::LogFilter const& _tf, WatchHandler const& _f) = 0; - virtual unsigned installWatch(dev::h256 const& _tf, WatchHandler const& _f) = 0; - virtual void uninstallWatch(unsigned _id) = 0; - - // Account naming API - virtual void install(AccountNamer* _adopt) = 0; - virtual void uninstall(AccountNamer* _kill) = 0; - virtual void noteKnownAddressesChanged(AccountNamer*) = 0; - virtual void noteAddressNamesChanged(AccountNamer*) = 0; - virtual Address toAddress(std::string const&) const = 0; - virtual std::string toName(Address const&) const = 0; - virtual Addresses allKnownAddresses() const = 0; - - virtual void noteSettingsChanged() = 0; - -protected: - template void forEach(F const& _f) { for (auto const& p: m_plugins) _f(p.second); } - std::shared_ptr takePlugin(std::string const& _name) { auto it = m_plugins.find(_name); std::shared_ptr ret; if (it != m_plugins.end()) { ret = it->second; m_plugins.erase(it); } return ret; } - - static std::vector>* s_linkedPlugins; - -signals: - void knownAddressesChanged(); - void addressNamesChanged(); - void keyManagerChanged(); - -private: - std::unordered_map> m_plugins; -}; - -class Plugin -{ -public: - Plugin(MainFace* _f, std::string const& _name); - virtual ~Plugin() {} - - std::string const& name() const { return m_name; } - - dev::WebThreeDirect* web3() const { return m_main->web3(); } - dev::eth::Client* ethereum() const { return m_main->ethereum(); } - std::shared_ptr whisper() const { return m_main->whisper(); } - MainFace* main() const { return m_main; } - QDockWidget* dock(Qt::DockWidgetArea _area = Qt::RightDockWidgetArea, QString _title = QString()); - void addToDock(Qt::DockWidgetArea _area, QDockWidget* _dockwidget, Qt::Orientation _orientation); - void addAction(QAction* _a); - QAction* addMenuItem(QString _name, QString _menuName, bool _separate = false); - - virtual void onAllChange() {} - virtual void readSettings(QSettings const&) {} - virtual void writeSettings(QSettings&) {} - -private: - MainFace* m_main = nullptr; - std::string m_name; - QDockWidget* m_dock = nullptr; -}; - -class AccountNamerPlugin: public Plugin, public AccountNamer -{ -protected: - AccountNamerPlugin(MainFace* _m, std::string const& _name): Plugin(_m, _name) { main()->install(this); } - ~AccountNamerPlugin() { main()->uninstall(this); } -}; - -} - -} diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp deleted file mode 100644 index e05d296e6..000000000 --- a/alethzero/MainWin.cpp +++ /dev/null @@ -1,2160 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file MainWin.cpp - * @author Gav Wood - * @date 2014 - */ - -#include - -// Make sure boost/asio.hpp is included before windows.h. -#include - -#pragma GCC diagnostic ignored "-Wpedantic" -//pragma GCC diagnostic ignored "-Werror=pedantic" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef _MSC_VER -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "MainWin.h" -#include "DownloadView.h" -#include "MiningView.h" -#include "BuildInfo.h" -#include "OurWebThreeStubServer.h" -#include "Transact.h" -#include "Debugger.h" -#include "DappLoader.h" -#include "DappHost.h" -#include "WebPage.h" -#include "ui_Main.h" -#include "ui_GetPassword.h" -#include "ui_GasPricing.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace p2p; -using namespace eth; -namespace js = json_spirit; - -QString dev::az::contentsOfQResource(string const& res) -{ - QFile file(QString::fromStdString(res)); - if (!file.open(QFile::ReadOnly)) - BOOST_THROW_EXCEPTION(FileError()); - QTextStream in(&file); - return in.readAll(); -} - -//Address c_config = Address("661005d2720d855f1d9976f88bb10c1a3398c77f"); -//Address c_newConfig = Address("c6d9d2cd449a754c494264e1809c50e34d64562b"); -Address c_nameReg = Address("96d76ae3397b52d9f61215270df65d72358709e3"); - -Main::Main(QWidget* _parent): - MainFace(_parent), - ui(new Ui::Main), - m_transact(nullptr), - m_dappLoader(nullptr), - m_webPage(nullptr) -{ - QtWebEngine::initialize(); - setWindowFlags(Qt::Window); - ui->setupUi(this); - std::string dbPath = getDataDir(); - - for (int i = 1; i < qApp->arguments().size(); ++i) - { - QString arg = qApp->arguments()[i]; - if (arg == "--frontier") - resetNetwork(eth::Network::Frontier); - else if (arg == "--olympic") - resetNetwork(eth::Network::Olympic); - else if (arg == "--genesis-json" && i + 1 < qApp->arguments().size()) - CanonBlockChain::setGenesis(contentsString(qApp->arguments()[++i].toStdString())); - else if ((arg == "--db-path" || arg == "-d") && i + 1 < qApp->arguments().size()) - dbPath = qApp->arguments()[++i].toStdString(); - } - - if (c_network == eth::Network::Olympic) - setWindowTitle("AlethZero Olympic"); - else if (c_network == eth::Network::Frontier) - setWindowTitle("AlethZero Frontier"); - - // Open Key Store - bool opened = false; - if (m_keyManager.exists()) - while (!opened) - { - QString s = QInputDialog::getText(nullptr, "Master password", "Enter your MASTER account password.", QLineEdit::Password, QString()); - if (m_keyManager.load(s.toStdString())) - opened = true; - else if (QMessageBox::question( - nullptr, - "Invalid password entered", - "The password you entered is incorrect. If you have forgotten your password, and you wish to start afresh, manually remove the file: " + QString::fromStdString(getDataDir("ethereum")) + "/keys.info", - QMessageBox::Retry, - QMessageBox::Abort) - == QMessageBox::Abort) - exit(0); - } - if (!opened) - { - QString password; - while (true) - { - password = QInputDialog::getText(nullptr, "Master password", "Enter a MASTER password for your key store. Make it strong. You probably want to write it down somewhere and keep it safe and secure; your identity will rely on this - you never want to lose it.", QLineEdit::Password, QString()); - QString confirm = QInputDialog::getText(nullptr, "Master password", "Confirm this password by typing it again", QLineEdit::Password, QString()); - if (password == confirm) - break; - QMessageBox::warning(nullptr, "Try again", "You entered two different passwords - please enter the same password twice.", QMessageBox::Ok); - } - m_keyManager.create(password.toStdString()); - m_keyManager.import(ICAP::createDirect(), "Default identity"); - } - - for (auto const& i: Host::pocHosts()) - m_servers.append(QString::fromStdString("enode://" + i.first.hex() + "@" + i.second)); - - if (!dev::contents(dbPath + "/genesis.json").empty()) - CanonBlockChain::setGenesis(contentsString(dbPath + "/genesis.json")); - - cerr << "State root: " << CanonBlockChain::genesis().stateRoot() << endl; - auto block = CanonBlockChain::createGenesisBlock(); - cerr << "Block Hash: " << CanonBlockChain::genesis().hash() << endl; - cerr << "Block RLP: " << RLP(block) << endl; - cerr << "Block Hex: " << toHex(block) << endl; - cerr << "eth Network protocol version: " << eth::c_protocolVersion << endl; - cerr << "Client database version: " << c_databaseVersion << endl; - - ui->configDock->close(); - -// statusBar()->addPermanentWidget(ui->cacheUsage); - ui->cacheUsage->hide(); - statusBar()->addPermanentWidget(ui->balance); - statusBar()->addPermanentWidget(ui->peerCount); - statusBar()->addPermanentWidget(ui->mineStatus); - statusBar()->addPermanentWidget(ui->syncStatus); - statusBar()->addPermanentWidget(ui->chainStatus); - statusBar()->addPermanentWidget(ui->blockCount); - - QSettings s("ethereum", "alethzero"); - m_networkConfig = s.value("peers").toByteArray(); - bytesConstRef network((byte*)m_networkConfig.data(), m_networkConfig.size()); - m_webThree.reset(new WebThreeDirect(string("AlethZero/v") + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), dbPath, WithExisting::Trust, {"eth"/*, "shh"*/}, p2p::NetworkPreferences(), network)); - - ui->blockCount->setText(QString("PV%1.%2 D%3 %4-%5 v%6").arg(eth::c_protocolVersion).arg(eth::c_minorProtocolVersion).arg(c_databaseVersion).arg(QString::fromStdString(ethereum()->sealEngine()->name())).arg(ethereum()->sealEngine()->revision()).arg(dev::Version)); - - m_httpConnector.reset(new jsonrpc::HttpServer(SensibleHttpPort, "", "", dev::SensibleHttpThreads)); - auto w3ss = new OurWebThreeStubServer(*m_httpConnector, this); - m_server.reset(w3ss); - auto sessionKey = w3ss->newSession(SessionPermissions{{Privilege::Admin}}); - m_server->StartListening(); - - WebPage* webPage = new WebPage(this); - m_webPage = webPage; - connect(webPage, &WebPage::consoleMessage, [this](QString const& _msg) { Main::addConsoleMessage(_msg, QString()); }); - ui->webView->setPage(m_webPage); - - connect(ui->webView, &QWebEngineView::titleChanged, [=]() - { - ui->tabWidget->setTabText(0, ui->webView->title()); - }); - connect(ui->webView, &QWebEngineView::urlChanged, [=](QUrl const& _url) - { - if (!m_dappHost->servesUrl(_url)) - ui->urlEdit->setText(_url.toString()); - }); - - m_dappHost.reset(new DappHost(8081)); - m_dappLoader = new DappLoader(this, web3(), getNameReg()); - m_dappLoader->setSessionKey(sessionKey); - connect(m_dappLoader, &DappLoader::dappReady, this, &Main::dappLoaded); - connect(m_dappLoader, &DappLoader::pageReady, this, &Main::pageLoaded); -// ui->webView->page()->settings()->setAttribute(QWebEngineSettings::DeveloperExtrasEnabled, true); -// QWebEngineInspector* inspector = new QWebEngineInspector(); -// inspector->setPage(page); - setBeneficiary(m_keyManager.accounts().front()); - - ethereum()->setDefault(LatestBlock); - - m_vmSelectionGroup = new QActionGroup{ui->menuDebug}; - m_vmSelectionGroup->addAction(ui->vmInterpreter); - m_vmSelectionGroup->addAction(ui->vmJIT); - m_vmSelectionGroup->addAction(ui->vmSmart); - m_vmSelectionGroup->setExclusive(true); - -#if ETH_EVMJIT - ui->vmSmart->setChecked(true); // Default when JIT enabled - on_vmSmart_triggered(); -#else - ui->vmInterpreter->setChecked(true); - ui->vmJIT->setEnabled(false); - ui->vmSmart->setEnabled(false); -#endif - - readSettings(true, false); - - m_transact = new Transact(this, this); - m_transact->setWindowFlags(Qt::Dialog); - m_transact->setWindowModality(Qt::WindowModal); - - connect(ui->blockChainDockWidget, &QDockWidget::visibilityChanged, [=]() { refreshBlockChain(); }); - - installWatches(); - startTimer(100); - - { - QSettings s("ethereum", "alethzero"); - if (s.value("splashMessage", true).toBool()) - { - QMessageBox::information(this, "Here Be Dragons!", "This is beta software: it is not yet at the release stage.\nPlease don't blame us if it does something unexpected or if you're underwhelmed with the user-experience. We have great plans for it in terms of UX down the line but right now we just want to make sure everything works roughly as expected. We welcome contributions, be they in code, testing or documentation!\nAfter you close this message it won't appear again."); - s.setValue("splashMessage", false); - } - } - - for (auto const& i: *s_linkedPlugins) - initPlugin(i(this)); - - readSettings(false, true); -} - -Main::~Main() -{ - m_httpConnector->StopListening(); - - // save all settings here so we don't have to explicitly finalise plugins. - // NOTE: as soon as plugin finalisation means anything more than saving settings, this will - // need to be rethought into something more like: - // forEach([&](shared_ptr const& p){ finalisePlugin(p.get()); }); - writeSettings(); - - m_destructing = true; - killPlugins(); -} - -string Main::fromRaw(h256 const& _n, unsigned* _inc) -{ - if (_n) - { - string s((char const*)_n.data(), 32); - auto l = s.find_first_of('\0'); - if (!l) - return string(); - if (l != string::npos) - { - auto p = s.find_first_not_of('\0', l); - if (!(p == string::npos || (_inc && p == 31))) - return string(); - if (_inc) - *_inc = (byte)s[31]; - s.resize(l); - } - for (auto i: s) - if (i < 32) - return string(); - return s; - } - return string(); -} - -void Main::install(AccountNamer* _adopt) -{ - m_namers.insert(_adopt); - _adopt->m_main = this; - refreshAll(); -} - -void Main::uninstall(AccountNamer* _kill) -{ - m_namers.erase(_kill); - if (!m_destructing) - refreshAll(); -} - -void Main::noteKnownAddressesChanged(AccountNamer*) -{ - emit knownAddressesChanged(); - refreshAll(); -} - -void Main::noteAddressNamesChanged(AccountNamer*) -{ - emit addressNamesChanged(); - refreshAll(); -} - -Address Main::toAddress(string const& _n) const -{ - for (AccountNamer* n: m_namers) - if (n->toAddress(_n)) - return n->toAddress(_n); - return Address(); -} - -string Main::toName(Address const& _a) const -{ - for (AccountNamer* n: m_namers) - if (!n->toName(_a).empty()) - return n->toName(_a); - return string(); -} - -Addresses Main::allKnownAddresses() const -{ - Addresses ret; - for (AccountNamer* i: m_namers) - ret += i->knownAddresses(); - sort(ret.begin(), ret.end()); - return ret; -} - -bool Main::confirm() const -{ - return true; //ui->natSpec->isChecked(); -} - -void Main::on_gasPrices_triggered() -{ - QDialog d; - Ui_GasPricing gp; - gp.setupUi(&d); - d.setWindowTitle("Gas Pricing"); - setValueUnits(gp.bidUnits, gp.bidValue, static_cast(ethereum()->gasPricer().get())->bid()); - setValueUnits(gp.askUnits, gp.askValue, static_cast(ethereum()->gasPricer().get())->ask()); - - if (d.exec() == QDialog::Accepted) - { - static_cast(ethereum()->gasPricer().get())->setBid(fromValueUnits(gp.bidUnits, gp.bidValue)); - static_cast(ethereum()->gasPricer().get())->setAsk(fromValueUnits(gp.askUnits, gp.askValue)); - m_transact->resetGasPrice(); - } -} - -void Main::on_sentinel_triggered() -{ - bool ok; - QString sentinel = QInputDialog::getText(nullptr, "Enter sentinel address", "Enter the sentinel address for bad block reporting (e.g. http://badblockserver.com:8080). Enter nothing to disable.", QLineEdit::Normal, QString::fromStdString(ethereum()->sentinel()), &ok); - if (ok) - ethereum()->setSentinel(sentinel.toStdString()); -} - -NetworkPreferences Main::netPrefs() const -{ - auto listenIP = ui->listenIP->text().toStdString(); - try - { - listenIP = bi::address::from_string(listenIP).to_string(); - } - catch (...) - { - listenIP.clear(); - } - - auto publicIP = ui->forcePublicIP->text().toStdString(); - try - { - publicIP = bi::address::from_string(publicIP).to_string(); - } - catch (...) - { - publicIP.clear(); - } - - NetworkPreferences ret; - - if (isPublicAddress(publicIP)) - ret = NetworkPreferences(publicIP, listenIP, ui->port->value(), ui->upnp->isChecked()); - else - ret = NetworkPreferences(listenIP, ui->port->value(), ui->upnp->isChecked()); - - ret.discovery = m_privateChain.isEmpty() && !ui->hermitMode->isChecked(); - ret.pin = !ret.discovery; - - return ret; -} - -void Main::onKeysChanged() -{ - installBalancesWatch(); -} - -unsigned Main::installWatch(LogFilter const& _tf, WatchHandler const& _f) -{ - auto ret = ethereum()->installWatch(_tf, Reaping::Manual); - m_handlers[ret] = _f; - _f(LocalisedLogEntries()); - return ret; -} - -unsigned Main::installWatch(h256 const& _tf, WatchHandler const& _f) -{ - auto ret = ethereum()->installWatch(_tf, Reaping::Manual); - m_handlers[ret] = _f; - _f(LocalisedLogEntries()); - return ret; -} - -void Main::uninstallWatch(unsigned _w) -{ - cdebug << "!!! Main: uninstalling watch" << _w; - ethereum()->uninstallWatch(_w); - m_handlers.erase(_w); -} - -void Main::installWatches() -{ - auto newBlockId = installWatch(ChainChangedFilter, [=](LocalisedLogEntries const&){ - onNewBlock(); - onNewPending(); - }); - auto newPendingId = installWatch(PendingChangedFilter, [=](LocalisedLogEntries const&){ - onNewPending(); - }); - - cdebug << "newBlock watch ID: " << newBlockId; - cdebug << "newPending watch ID: " << newPendingId; - -// installWatch(LogFilter().address(c_newConfig), [=](LocalisedLogEntries const&) { installNameRegWatch(); }); -// installWatch(LogFilter().address(c_newConfig), [=](LocalisedLogEntries const&) { installCurrenciesWatch(); }); -} - -Address Main::getNameReg() const -{ - return Address("c6d9d2cd449a754c494264e1809c50e34d64562b"); -// return abiOut
(ethereum()->call(c_newConfig, abiIn("lookup(uint256)", (u256)1)).output); -} - -Address Main::getCurrencies() const -{ -// return abiOut
(ethereum()->call(c_newConfig, abiIn("lookup(uint256)", (u256)3)).output); - return Address(); -} - -bool Main::doConfirm() -{ - return true; //ui->confirm->isChecked(); -} - -void Main::installNameRegWatch() -{ - uninstallWatch(m_nameRegFilter); - m_nameRegFilter = installWatch(LogFilter().address((u160)getNameReg()), [=](LocalisedLogEntries const&){ onNameRegChange(); }); -} - -void Main::installCurrenciesWatch() -{ - uninstallWatch(m_currenciesFilter); - m_currenciesFilter = installWatch(LogFilter().address((u160)getCurrencies()), [=](LocalisedLogEntries const&){ onCurrenciesChange(); }); -} - -void Main::installBalancesWatch() -{ - LogFilter tf; - - vector
altCoins; - Address coinsAddr = getCurrencies(); - - // TODO: Update for new currencies reg. - for (unsigned i = 0; i < ethereum()->stateAt(coinsAddr, PendingBlock); ++i) - altCoins.push_back(right160(ethereum()->stateAt(coinsAddr, i + 1))); - for (auto const& address: m_keyManager.accounts()) - for (auto c: altCoins) - tf.address(c).topic(0, h256(address, h256::AlignRight)); - - uninstallWatch(m_balancesFilter); - m_balancesFilter = installWatch(tf, [=](LocalisedLogEntries const&){ onBalancesChange(); }); -} - -void Main::onNameRegChange() -{ - cwatch << "NameReg changed!"; - - // update any namereg-dependent stuff - for now force a full update. - refreshAll(); -} - -void Main::onCurrenciesChange() -{ - cwatch << "Currencies changed!"; - installBalancesWatch(); - - // TODO: update any currency-dependent stuff? -} - -void Main::onBalancesChange() -{ - cwatch << "Our balances changed!"; - - refreshBalances(); -} - -void Main::onNewBlock() -{ - cwatch << "Blockchain changed!"; - - // update blockchain dependent views. - refreshBlockCount(); - refreshBlockChain(); - - // We must update balances since we can't filter updates to basic accounts. - refreshBalances(); -} - -void Main::onNewPending() -{ - cwatch << "Pending transactions changed!"; - - // update any pending-transaction dependent views. - refreshPending(); -} - -void Main::on_forceMining_triggered() -{ - ethereum()->setForceMining(ui->forceMining->isChecked()); -} - -QString Main::contents(QString _s) -{ - return QString::fromStdString(dev::asString(dev::contents(_s.toStdString()))); -} - -void Main::load(QString _s) -{ - QString contents = QString::fromStdString(dev::asString(dev::contents(_s.toStdString()))); - ui->webView->page()->runJavaScript(contents); -} - -void Main::on_newTransaction_triggered() -{ - m_transact->setEnvironment(m_keyManager.accountsHash(), ethereum(), &m_natSpecDB); - m_transact->show(); -} - -void Main::on_loadJS_triggered() -{ - QString f = QFileDialog::getOpenFileName(this, "Load Javascript", QString(), "Javascript (*.js);;All files (*)"); - if (f.size()) - load(f); -} - -void Main::note(QString _s) -{ - cnote << _s.toStdString(); -} - -void Main::debug(QString _s) -{ - cdebug << _s.toStdString(); -} - -void Main::warn(QString _s) -{ - cwarn << _s.toStdString(); -} - -void Main::on_jsInput_returnPressed() -{ - eval(ui->jsInput->text()); - ui->jsInput->setText(""); -} - -void Main::eval(QString const& _js) -{ - if (_js.trimmed().isEmpty()) - return; - auto f = [=](QVariant ev) { - auto f2 = [=](QVariant jsonEv) { - QString s; - if (ev.isNull()) - s = "null"; - else if (ev.type() == QVariant::String) - s = "\"" + ev.toString().toHtmlEscaped() + "\""; - else if (ev.type() == QVariant::Int || ev.type() == QVariant::Double) - s = "" + ev.toString().toHtmlEscaped() + ""; - else if (jsonEv.type() == QVariant::String) - s = "" + jsonEv.toString().toHtmlEscaped() + ""; - else - s = "unknown type"; - addConsoleMessage(_js, s); - }; - ui->webView->page()->runJavaScript("JSON.stringify(___RET)", f2); - }; - auto c = (_js.startsWith("{") || _js.startsWith("if ") || _js.startsWith("if(")) ? _js : ("___RET=(" + _js + ")"); - ui->webView->page()->runJavaScript(c, f); -} - -void Main::addConsoleMessage(QString const& _js, QString const& _s) -{ - m_consoleHistory.push_back(qMakePair(_js, _s)); - QString r = "" ETH_HTML_DIV(ETH_HTML_MONO "position: absolute; bottom: 0; border: 0px; margin: 0px; width: 100%"); - for (auto const& i: m_consoleHistory) - r += "
>" + i.first.toHtmlEscaped() + "
" - "
 " + i.second + "
"; - r += "
"; - ui->jsConsole->setHtml(r); -} - -std::string Main::pretty(dev::Address const& _a) const -{ - auto g_newNameReg = getNameReg(); - - if (g_newNameReg) - { - string n = toString(abiOut(ethereum()->call(g_newNameReg, abiIn("name(address)", _a)).output)); - if (!n.empty()) - return n; - } - - for (auto i: m_namers) - { - auto n = i->toName(_a); - if (!n.empty()) - return n; - } - return string(); -} - -std::string Main::render(dev::Address const& _a) const -{ - string p = pretty(_a); - string n; - if (p.size() == 9 && p.find_first_not_of("QWERYUOPASDFGHJKLZXCVBNM1234567890") == string::npos) - p = ICAP(p, "XREG").encoded(); - else - DEV_IGNORE_EXCEPTIONS(n = ICAP(_a).encoded().substr(0, 8)); - if (!n.empty()) - n += " "; - n += _a.abridged(); - return p.empty() ? n : (p + " " + n); -} - -pair Main::fromString(std::string const& _n) const -{ - if (_n == "(Create Contract)") - return make_pair(Address(), bytes()); - - std::string n = _n; - - auto g_newNameReg = getNameReg(); - if (g_newNameReg) - { - Address a = abiOut
(ethereum()->call(g_newNameReg, abiIn("addr(bytes32)", ::toString32(n))).output); - if (a) - return make_pair(a, bytes()); - } - - for (auto i: m_namers) - if (auto a = i->toAddress(_n)) - return make_pair(a, bytes()); - - try { - return ICAP::decoded(n).address([&](Address const& a, bytes const& b) -> bytes - { - return ethereum()->call(a, b).output; - }, g_newNameReg); - } - catch (...) {} - - if (n.find("0x") == 0) - n.erase(0, 2); - if (n.size() == 40) - { - try - { - return make_pair(Address(fromHex(n, WhenError::Throw)), bytes()); - } - catch (BadHexCharacter& _e) - { - cwarn << "invalid hex character, address rejected"; - cwarn << boost::diagnostic_information(_e); - return make_pair(Address(), bytes()); - } - catch (...) - { - cwarn << "address rejected"; - return make_pair(Address(), bytes()); - } - } - return make_pair(Address(), bytes()); -} - -QString Main::lookup(QString const& _a) const -{ - if (!_a.endsWith(".eth")) - return _a; - - string sn = _a.mid(0, _a.size() - 4).toStdString(); - if (sn.size() > 32) - sn = sha3(sn, false); - h256 n; - memcpy(n.data(), sn.data(), sn.size()); - - h256 ret; - // TODO: fix with the new DNSreg contract -// if (h160 dnsReg = (u160)ethereum()->stateAt(c_config, 4, PendingBlock)) -// ret = ethereum()->stateAt(dnsReg, n); -/* if (!ret) - if (h160 nameReg = (u160)ethereum()->stateAt(c_config, 0, PendingBlock)) - ret = ethereum()->stateAt(nameReg, n2); -*/ - if (ret && !((u256)ret >> 32)) - return QString("%1.%2.%3.%4").arg((int)ret[28]).arg((int)ret[29]).arg((int)ret[30]).arg((int)ret[31]); - // TODO: support IPv6. - else if (ret) - return QString::fromStdString(fromRaw(ret)); - else - return _a; -} - -void Main::on_about_triggered() -{ - QMessageBox::about(this, "About AlethZero PoC-" + QString(dev::Version).section('.', 1, 1), QString("AlethZero/v") + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM) "\n" DEV_QUOTED(ETH_COMMIT_HASH) + (ETH_CLEAN_REPO ? "\nCLEAN" : "\n+ LOCAL CHANGES") + "\n\nBy Gav Wood and the Berlin ÐΞV team, 2014, 2015.\nSee the README for contributors and credits."); -} - -void Main::on_paranoia_triggered() -{ - ethereum()->setParanoia(ui->paranoia->isChecked()); -} - -dev::u256 Main::gasPrice() const -{ - return ethereum()->gasPricer()->bid(); -} - -void Main::writeSettings() -{ - QSettings s("ethereum", "alethzero"); - s.remove("address"); - - forEach([&](std::shared_ptr p) - { - p->writeSettings(s); - }); - - s.setValue("askPrice", QString::fromStdString(toString(static_cast(ethereum()->gasPricer().get())->ask()))); - s.setValue("bidPrice", QString::fromStdString(toString(static_cast(ethereum()->gasPricer().get())->bid()))); - s.setValue("upnp", ui->upnp->isChecked()); - s.setValue("hermitMode", ui->hermitMode->isChecked()); - s.setValue("forceAddress", ui->forcePublicIP->text()); - s.setValue("forceMining", ui->forceMining->isChecked()); - s.setValue("turboMining", ui->turboMining->isChecked()); - s.setValue("paranoia", ui->paranoia->isChecked()); - s.setValue("natSpec", ui->natSpec->isChecked()); - s.setValue("showAll", ui->showAll->isChecked()); - s.setValue("clientName", ui->clientName->text()); - s.setValue("idealPeers", ui->idealPeers->value()); - s.setValue("listenIP", ui->listenIP->text()); - s.setValue("port", ui->port->value()); - s.setValue("url", ui->urlEdit->text()); - s.setValue("privateChain", m_privateChain); - if (auto vm = m_vmSelectionGroup->checkedAction()) - s.setValue("vm", vm->text()); - - bytes d = m_webThree->saveNetwork(); - if (!d.empty()) - m_networkConfig = QByteArray((char*)d.data(), (int)d.size()); - s.setValue("peers", m_networkConfig); - s.setValue("nameReg", ui->nameReg->text()); - - s.setValue("geometry", saveGeometry()); - s.setValue("windowState", saveState()); -} - -void Main::setPrivateChain(QString const& _private, bool _forceConfigure) -{ - if (m_privateChain == _private && !_forceConfigure) - return; - - m_privateChain = _private; - ui->usePrivate->setChecked(!m_privateChain.isEmpty()); - - CanonBlockChain::forceGenesisExtraData(m_privateChain.isEmpty() ? bytes() : sha3(m_privateChain.toStdString()).asBytes()); - CanonBlockChain::forceGenesisDifficulty(m_privateChain.isEmpty() ? u256() : c_minimumDifficulty); - CanonBlockChain::forceGenesisGasLimit(m_privateChain.isEmpty() ? u256() : u256(1) << 32); - - // rejig blockchain now. - writeSettings(); - ui->mine->setChecked(false); - ui->net->setChecked(false); - web3()->stopNetwork(); - - web3()->setNetworkPreferences(netPrefs()); - ethereum()->reopenChain(); - - readSettings(true); - installWatches(); - refreshAll(); -} - -Secret Main::retrieveSecret(Address const& _address) const -{ - while (true) - { - Secret s = m_keyManager.secret(_address, [&](){ - QDialog d; - Ui_GetPassword gp; - gp.setupUi(&d); - d.setWindowTitle("Unlock Account"); - gp.label->setText(QString("Enter the password for the account %2 (%1).").arg(QString::fromStdString(_address.abridged())).arg(QString::fromStdString(m_keyManager.accountName(_address)))); - gp.entry->setPlaceholderText("Hint: " + QString::fromStdString(m_keyManager.passwordHint(_address))); - return d.exec() == QDialog::Accepted ? gp.entry->text().toStdString() : string(); - }); - if (s || QMessageBox::warning(nullptr, "Unlock Account", "The password you gave is incorrect for this key.", QMessageBox::Retry, QMessageBox::Cancel) == QMessageBox::Cancel) - return s; - } -} - -void Main::readSettings(bool _skipGeometry, bool _onlyGeometry) -{ - QSettings s("ethereum", "alethzero"); - - if (!_skipGeometry) - restoreGeometry(s.value("geometry").toByteArray()); - restoreState(s.value("windowState").toByteArray()); - if (_onlyGeometry) - return; - - forEach([&](std::shared_ptr p) - { - p->readSettings(s); - }); - static_cast(ethereum()->gasPricer().get())->setAsk(u256(s.value("askPrice", QString::fromStdString(toString(DefaultGasPrice))).toString().toStdString())); - static_cast(ethereum()->gasPricer().get())->setBid(u256(s.value("bidPrice", QString::fromStdString(toString(DefaultGasPrice))).toString().toStdString())); - - ui->upnp->setChecked(s.value("upnp", true).toBool()); - ui->forcePublicIP->setText(s.value("forceAddress", "").toString()); - ui->dropPeers->setChecked(false); - ui->hermitMode->setChecked(s.value("hermitMode", false).toBool()); - ui->forceMining->setChecked(s.value("forceMining", false).toBool()); - on_forceMining_triggered(); - ui->turboMining->setChecked(s.value("turboMining", false).toBool()); - on_turboMining_triggered(); - ui->paranoia->setChecked(s.value("paranoia", false).toBool()); - ui->natSpec->setChecked(s.value("natSpec", true).toBool()); - ui->showAll->setChecked(s.value("showAll", false).toBool()); - ui->clientName->setText(s.value("clientName", "").toString()); - if (ui->clientName->text().isEmpty()) - ui->clientName->setText(QInputDialog::getText(nullptr, "Enter identity", "Enter a name that will identify you on the peer network")); - ui->idealPeers->setValue(s.value("idealPeers", ui->idealPeers->value()).toInt()); - ui->listenIP->setText(s.value("listenIP", "").toString()); - ui->port->setValue(s.value("port", ui->port->value()).toInt()); - ui->nameReg->setText(s.value("nameReg", "").toString()); - setPrivateChain(s.value("privateChain", "").toString()); - -#if ETH_EVMJIT // We care only if JIT is enabled. Otherwise it can cause misconfiguration. - auto vmName = s.value("vm").toString(); - if (!vmName.isEmpty()) - { - if (vmName == ui->vmInterpreter->text()) - { - ui->vmInterpreter->setChecked(true); - on_vmInterpreter_triggered(); - } - else if (vmName == ui->vmJIT->text()) - { - ui->vmJIT->setChecked(true); - on_vmJIT_triggered(); - } - else if (vmName == ui->vmSmart->text()) - { - ui->vmSmart->setChecked(true); - on_vmSmart_triggered(); - } - } -#endif - - ui->urlEdit->setText(s.value("url", "about:blank").toString()); //http://gavwood.com/gavcoin.html - on_urlEdit_returnPressed(); -} - -std::string Main::getPassword(std::string const& _title, std::string const& _for, std::string* _hint, bool* _ok) -{ - QString password; - while (true) - { - bool ok; - password = QInputDialog::getText(nullptr, QString::fromStdString(_title), QString::fromStdString(_for), QLineEdit::Password, QString(), &ok); - if (!ok) - { - if (_ok) - *_ok = false; - return string(); - } - if (password.isEmpty()) - break; - QString confirm = QInputDialog::getText(nullptr, QString::fromStdString(_title), "Confirm this password by typing it again", QLineEdit::Password, QString()); - if (password == confirm) - break; - QMessageBox::warning(nullptr, QString::fromStdString(_title), "You entered two different passwords - please enter the same password twice.", QMessageBox::Ok); - } - - if (!password.isEmpty() && _hint && !m_keyManager.haveHint(password.toStdString())) - *_hint = QInputDialog::getText(this, "Create Account", "Enter a hint to help you remember this password.").toStdString(); - - if (_ok) - *_ok = true; - return password.toStdString(); -} - -void Main::on_importKey_triggered() -{ - QString s = QInputDialog::getText(this, "Import Account Key", "Enter account's secret key", QLineEdit::Password); - bytes b = fromHex(s.toStdString()); - if (b.size() == 32) - { - auto k = KeyPair(Secret(bytesConstRef(&b))); - if (!m_keyManager.hasAccount(k.address())) - { - QString s = QInputDialog::getText(this, "Import Account Key", "Enter this account's name"); - if (QMessageBox::question(this, "Additional Security?", "Would you like to use additional security for this key? This lets you protect it with a different password to other keys, but also means you must re-enter the key's password every time you wish to use the account.", QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) - { - bool ok; - std::string hint; - std::string password = getPassword("Import Account Key", "Enter the password you would like to use for this key. Don't forget it!", &hint, &ok); - if (!ok) - return; - m_keyManager.import(k.secret(), s.toStdString(), password, hint); - } - else - m_keyManager.import(k.secret(), s.toStdString()); - keysChanged(); - } - else - QMessageBox::warning(this, "Already Have Key", "Could not import the secret key: we already own this account."); - } - else - QMessageBox::warning(this, "Invalid Entry", "Could not import the secret key; invalid key entered. Make sure it is 64 hex characters (0-9 or A-F)."); -} - -void Main::on_importKeyFile_triggered() -{ - QString s = QFileDialog::getOpenFileName(this, "Claim Account Contents", QDir::homePath(), "JSON Files (*.json);;All Files (*)"); - h128 uuid = m_keyManager.store().importKey(s.toStdString()); - if (!uuid) - { - QMessageBox::warning(this, "Key File Invalid", "Could not find secret key definition. This is probably not an Web3 key file."); - return; - } - - QString info = QInputDialog::getText(this, "Import Key File", "Enter a description of this key to help you recognise it in the future."); - - QString pass; - for (Secret s; !s;) - { - s = Secret(m_keyManager.store().secret(uuid, [&](){ - pass = QInputDialog::getText(this, "Import Key File", "Enter the password for the key to complete the import.", QLineEdit::Password); - return pass.toStdString(); - }, false)); - if (!s && QMessageBox::question(this, "Import Key File", "The password you provided is incorrect. Would you like to try again?", QMessageBox::Retry, QMessageBox::Cancel) == QMessageBox::Cancel) - return; - } - - QString hint = QInputDialog::getText(this, "Import Key File", "Enter a hint for this password to help you remember it."); - m_keyManager.importExisting(uuid, info.toStdString(), pass.toStdString(), hint.toStdString()); -} - -void Main::on_claimPresale_triggered() -{ - QString s = QFileDialog::getOpenFileName(this, "Claim Account Contents", QDir::homePath(), "JSON Files (*.json);;All Files (*)"); - try - { - KeyPair k = m_keyManager.presaleSecret(dev::contentsString(s.toStdString()), [&](bool){ return QInputDialog::getText(this, "Enter Password", "Enter the wallet's passphrase", QLineEdit::Password).toStdString(); }); - cnote << k.address(); - if (!m_keyManager.hasAccount(k.address())) - ethereum()->submitTransaction(k.sec(), ethereum()->balanceAt(k.address()) - gasPrice() * c_txGas, m_beneficiary, {}, c_txGas, gasPrice()); - else - QMessageBox::warning(this, "Already Have Key", "Could not import the secret key: we already own this account."); - } - catch (dev::eth::PasswordUnknown&) {} - catch (...) - { - cerr << "Unhandled exception!" << endl << - boost::current_exception_diagnostic_information(); - QMessageBox::warning(this, "Key File Invalid", "Could not find secret key definition. This is probably not an Ethereum key file."); - } -} - -void Main::on_importPresale_triggered() -{ - QString s = QFileDialog::getOpenFileName(this, "Claim Account Contents", QDir::homePath(), "JSON Files (*.json);;All Files (*)"); - try - { - string pass; - KeyPair k = m_keyManager.presaleSecret(dev::contentsString(s.toStdString()), [&](bool){ return (pass = QInputDialog::getText(this, "Enter Password", "Enter the wallet's passphrase", QLineEdit::Password).toStdString()); }); - cnote << k.address(); - if (!m_keyManager.hasAccount(k.address())) - keyManager().import(k.secret(), "Presale wallet (" + s.toStdString() + ")", pass, "Same password as for the presale wallet"); - else - QMessageBox::warning(this, "Already Have Key", "Could not import the secret key: we already own this account."); - } - catch (dev::eth::PasswordUnknown&) {} - catch (...) - { - cerr << "Unhandled exception!" << endl << - boost::current_exception_diagnostic_information(); - QMessageBox::warning(this, "Key File Invalid", "Could not find secret key definition. This is probably not an Ethereum key file."); - } -} - -void Main::on_exportKey_triggered() -{ - if (ui->ourAccounts->currentRow() >= 0) - { - auto hba = ui->ourAccounts->currentItem()->data(Qt::UserRole).toByteArray(); - Address h((byte const*)hba.data(), Address::ConstructFromPointer); - Secret s = retrieveSecret(h); - QMessageBox::information(this, "Export Account Key", "Secret key to account " + QString::fromStdString(render(h) + " is:\n" + s.makeInsecure().hex())); - } -} - -void Main::on_usePrivate_triggered() -{ - QString pc; - if (ui->usePrivate->isChecked()) - { - bool ok; - pc = QInputDialog::getText(this, "Enter Name", "Enter the name of your private chain", QLineEdit::Normal, QString("NewChain-%1").arg(time(0)), &ok); - if (!ok) - { - ui->usePrivate->setChecked(false); - return; - } - } - setPrivateChain(pc); -} - -void Main::on_vmInterpreter_triggered() { VMFactory::setKind(VMKind::Interpreter); } -void Main::on_vmJIT_triggered() { VMFactory::setKind(VMKind::JIT); } -void Main::on_vmSmart_triggered() { VMFactory::setKind(VMKind::Smart); } - -void Main::on_rewindChain_triggered() -{ - bool ok; - int n = QInputDialog::getInt(this, "Rewind Chain", "Enter the number of the new chain head.", ethereum()->number() * 9 / 10, 1, ethereum()->number(), 1, &ok); - if (ok) - { - ethereum()->rewind(n); - refreshAll(); - } -} - -void Main::on_urlEdit_returnPressed() -{ - QString s = ui->urlEdit->text(); - QUrl url(s); - if (url.scheme().isEmpty() || url.scheme() == "eth" || url.path().endsWith(".dapp")) - { - try - { - //try do resolve dapp url - m_dappLoader->loadDapp(s); - return; - } - catch (...) - { - qWarning() << boost::current_exception_diagnostic_information().c_str(); - } - } - - if (url.scheme().isEmpty()) - if (url.path().indexOf('/') < url.path().indexOf('.')) - url.setScheme("file"); - else - url.setScheme("http"); - else {} - m_dappLoader->loadPage(url.toString()); -} - -void Main::on_nameReg_textChanged() -{ - string s = ui->nameReg->text().toStdString(); - if (s.size() == 40) - { - m_nameReg = Address(fromHex(s)); - refreshAll(); - } - else - m_nameReg = Address(); -} - -void Main::on_preview_triggered() -{ - ethereum()->setDefault(ui->preview->isChecked() ? PendingBlock : LatestBlock); - refreshAll(); -} - -void Main::on_prepNextDAG_triggered() -{ - EthashAux::computeFull( - EthashAux::seedHash( - ethereum()->blockChain().number() + ETHASH_EPOCH_LENGTH - ) - ); -} - -void Main::refreshMining() -{ - pair gp = EthashAux::fullGeneratingProgress(); - QString t; - if (gp.first != EthashAux::NotGenerating) - t = QString("DAG for #%1-#%2: %3% complete; ").arg(gp.first).arg(gp.first + ETHASH_EPOCH_LENGTH - 1).arg(gp.second); - WorkingProgress p = ethereum()->miningProgress(); - ui->mineStatus->setText(t + (ethereum()->isMining() ? p.hashes > 0 ? QString("%1s @ %2kH/s").arg(p.ms / 1000).arg(p.ms ? p.hashes / p.ms : 0) : "Awaiting DAG" : "Not mining")); - if (ethereum()->isMining() && p.hashes > 0) - { - if (!ui->miningView->isVisible()) - return; - list l = ethereum()->miningHistory(); - static unsigned lh = 0; - if (p.hashes < lh) - ui->miningView->resetStats(); - lh = p.hashes; - ui->miningView->appendStats(l, p); - } -} - -void Main::setBeneficiary(Address const& _b) -{ - for (int i = 0; i < ui->ourAccounts->count(); ++i) - { - auto hba = ui->ourAccounts->item(i)->data(Qt::UserRole).toByteArray(); - auto h = Address((byte const*)hba.data(), Address::ConstructFromPointer); - ui->ourAccounts->item(i)->setCheckState(h == _b ? Qt::Checked : Qt::Unchecked); - } - m_beneficiary = _b; - ethereum()->setBeneficiary(_b); -} - -void Main::on_ourAccounts_itemClicked(QListWidgetItem* _i) -{ - auto hba = _i->data(Qt::UserRole).toByteArray(); - setBeneficiary(Address((byte const*)hba.data(), Address::ConstructFromPointer)); -} - -void Main::refreshBalances() -{ - cwatch << "refreshBalances()"; - // update all the balance-dependent stuff. - ui->ourAccounts->clear(); - u256 totalBalance = 0; -/* map> altCoins; - Address coinsAddr = getCurrencies(); - for (unsigned i = 0; i < ethereum()->stateAt(coinsAddr, PendingBlock); ++i) - { - auto n = ethereum()->stateAt(coinsAddr, i + 1); - auto addr = right160(ethereum()->stateAt(coinsAddr, n)); - auto denom = ethereum()->stateAt(coinsAddr, sha3(h256(n).asBytes())); - if (denom == 0) - denom = 1; -// cdebug << n << addr << denom << sha3(h256(n).asBytes()); - altCoins[addr] = make_tuple(fromRaw(n), 0, denom); - }*/ - for (auto const& address: m_keyManager.accounts()) - { - u256 b = ethereum()->balanceAt(address); - QListWidgetItem* li = new QListWidgetItem( - QString("<%1> %2: %3 [%4]") - .arg(m_keyManager.haveKey(address) ? "KEY" : "BRAIN") - .arg(QString::fromStdString(render(address))) - .arg(formatBalance(b).c_str()) - .arg((unsigned)ethereum()->countAt(address)) - , ui->ourAccounts); - li->setData(Qt::UserRole, QByteArray((char const*)address.data(), Address::size)); - li->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - li->setCheckState(m_beneficiary == address ? Qt::Checked : Qt::Unchecked); - totalBalance += b; - -// for (auto& c: altCoins) -// get<1>(c.second) += (u256)ethereum()->stateAt(c.first, (u160)i.address()); - } - - QString b; -/* for (auto const& c: altCoins) - if (get<1>(c.second)) - { - stringstream s; - s << setw(toString(get<2>(c.second) - 1).size()) << setfill('0') << (get<1>(c.second) % get<2>(c.second)); - b += QString::fromStdString(toString(get<1>(c.second) / get<2>(c.second)) + "." + s.str() + " ") + get<0>(c.second).toUpper() + " | "; - }*/ - ui->balance->setText(b + QString::fromStdString(formatBalance(totalBalance))); -} - -void Main::refreshNetwork() -{ - auto ps = web3()->peers(); - - ui->peerCount->setText(QString::fromStdString(toString(ps.size())) + " peer(s)"); - ui->peers->clear(); - ui->nodes->clear(); - - if (web3()->haveNetwork()) - { - map sessions; - for (PeerSessionInfo const& i: ps) - ui->peers->addItem(QString("[%8 %7] %3 ms - %1:%2 - %4 %5 %6") - .arg(QString::fromStdString(i.host)) - .arg(i.port) - .arg(chrono::duration_cast(i.lastPing).count()) - .arg(sessions[i.id] = QString::fromStdString(i.clientVersion)) - .arg(QString::fromStdString(toString(i.caps))) - .arg(QString::fromStdString(toString(i.notes))) - .arg(i.socketId) - .arg(QString::fromStdString(i.id.abridged()))); - - auto ns = web3()->nodes(); - for (p2p::Peer const& i: ns) - ui->nodes->insertItem(sessions.count(i.id) ? 0 : ui->nodes->count(), QString("[%1 %3] %2 - ( %4 ) - *%5") - .arg(QString::fromStdString(i.id.abridged())) - .arg(QString::fromStdString(i.endpoint.address.to_string())) - .arg(i.id == web3()->id() ? "self" : sessions.count(i.id) ? sessions[i.id] : "disconnected") - .arg(i.isOffline() ? " | " + QString::fromStdString(reasonOf(i.lastDisconnect())) + " | " + QString::number(i.failedAttempts()) + "x" : "") - .arg(i.rating()) - ); - } -} - -void Main::refreshAll() -{ - refreshBlockChain(); - refreshBlockCount(); - refreshPending(); - refreshBalances(); - allChange(); -} - -void Main::refreshPending() -{ - cwatch << "refreshPending()"; - ui->transactionQueue->clear(); - for (Transaction const& t: ethereum()->pending()) - { - QString s = t.receiveAddress() ? - QString("%2 %5> %3: %1 [%4]") - .arg(formatBalance(t.value()).c_str()) - .arg(QString::fromStdString(render(t.safeSender()))) - .arg(QString::fromStdString(render(t.receiveAddress()))) - .arg((unsigned)t.nonce()) - .arg(ethereum()->codeAt(t.receiveAddress()).size() ? '*' : '-') : - QString("%2 +> %3: %1 [%4]") - .arg(formatBalance(t.value()).c_str()) - .arg(QString::fromStdString(render(t.safeSender()))) - .arg(QString::fromStdString(render(right160(sha3(rlpList(t.safeSender(), t.nonce())))))) - .arg((unsigned)t.nonce()); - ui->transactionQueue->addItem(s); - } -} - -void Main::refreshBlockCount() -{ - auto d = ethereum()->blockChain().details(); - SyncStatus sync = ethereum()->syncStatus(); - QString syncStatus = QString("PV%1 %2").arg(sync.protocolVersion).arg(EthereumHost::stateName(sync.state)); - if (sync.state == SyncState::Hashes) - syncStatus += QString(": %1/%2%3").arg(sync.hashesReceived).arg(sync.hashesEstimated ? "~" : "").arg(sync.hashesTotal); - if (sync.state == SyncState::Blocks || sync.state == SyncState::NewBlocks) - syncStatus += QString(": %1/%2").arg(sync.blocksReceived).arg(sync.blocksTotal); - ui->syncStatus->setText(syncStatus); -// BlockQueueStatus b = ethereum()->blockQueueStatus(); -// ui->chainStatus->setText(QString("%3 importing %4 ready %5 verifying %6 unverified %7 future %8 unknown %9 bad %1 #%2") -// .arg(m_privateChain.size() ? "[" + m_privateChain + "] " : c_network == eth::Network::Olympic ? "Olympic" : "Frontier").arg(d.number).arg(b.importing).arg(b.verified).arg(b.verifying).arg(b.unverified).arg(b.future).arg(b.unknown).arg(b.bad)); - ui->chainStatus->setText(QString("%1 #%2") - .arg(m_privateChain.size() ? "[" + m_privateChain + "] " : c_network == eth::Network::Olympic ? "Olympic" : "Frontier").arg(d.number)); -} - -void Main::on_turboMining_triggered() -{ - ethereum()->setTurboMining(ui->turboMining->isChecked()); -} - -void Main::refreshBlockChain() -{ - if (!(ui->blockChainDockWidget->isVisible() || !tabifiedDockWidgets(ui->blockChainDockWidget).isEmpty())) - return; - - DEV_TIMED_FUNCTION_ABOVE(500); - cwatch << "refreshBlockChain()"; - - // TODO: keep the same thing highlighted. - // TODO: refactor into MVC - // TODO: use get by hash/number - // TODO: transactions - - auto const& bc = ethereum()->blockChain(); - QStringList filters = ui->blockChainFilter->text().toLower().split(QRegExp("\\s+"), QString::SkipEmptyParts); - - h256Hash blocks; - for (QString f: filters) - if (f.size() == 64) - { - h256 h(f.toStdString()); - if (bc.isKnown(h)) - blocks.insert(h); - for (auto const& b: bc.withBlockBloom(LogBloom().shiftBloom<3>(sha3(h)), 0, -1)) - blocks.insert(bc.numberHash(b)); - } - else if (f.toLongLong() <= bc.number()) - blocks.insert(bc.numberHash((unsigned)f.toLongLong())); - else if (f.size() == 40) - { - Address h(f.toStdString()); - for (auto const& b: bc.withBlockBloom(LogBloom().shiftBloom<3>(sha3(h)), 0, -1)) - blocks.insert(bc.numberHash(b)); - } - - QByteArray oldSelected = ui->blocks->count() ? ui->blocks->currentItem()->data(Qt::UserRole).toByteArray() : QByteArray(); - ui->blocks->clear(); - auto showBlock = [&](h256 const& h) { - auto d = bc.details(h); - QListWidgetItem* blockItem = new QListWidgetItem(QString("#%1 %2").arg(d.number).arg(h.abridged().c_str()), ui->blocks); - auto hba = QByteArray((char const*)h.data(), h.size); - blockItem->setData(Qt::UserRole, hba); - if (oldSelected == hba) - blockItem->setSelected(true); - - int n = 0; - try { - auto b = bc.block(h); - for (auto const& i: RLP(b)[1]) - { - Transaction t(i.data(), CheckTransaction::Everything); - QString s = t.receiveAddress() ? - QString(" %2 %5> %3: %1 [%4]") - .arg(formatBalance(t.value()).c_str()) - .arg(QString::fromStdString(render(t.safeSender()))) - .arg(QString::fromStdString(render(t.receiveAddress()))) - .arg((unsigned)t.nonce()) - .arg(ethereum()->codeAt(t.receiveAddress()).size() ? '*' : '-') : - QString(" %2 +> %3: %1 [%4]") - .arg(formatBalance(t.value()).c_str()) - .arg(QString::fromStdString(render(t.safeSender()))) - .arg(QString::fromStdString(render(right160(sha3(rlpList(t.safeSender(), t.nonce())))))) - .arg((unsigned)t.nonce()); - QListWidgetItem* txItem = new QListWidgetItem(s, ui->blocks); - auto hba = QByteArray((char const*)h.data(), h.size); - txItem->setData(Qt::UserRole, hba); - txItem->setData(Qt::UserRole + 1, n); - if (oldSelected == hba) - txItem->setSelected(true); - n++; - } - } - catch (...) {} - }; - - if (filters.empty()) - { - unsigned i = ui->showAll->isChecked() ? (unsigned)-1 : 10; - for (auto h = bc.currentHash(); bc.details(h) && i; h = bc.details(h).parent, --i) - { - showBlock(h); - if (h == bc.genesisHash()) - break; - } - } - else - for (auto const& h: blocks) - showBlock(h); - - if (!ui->blocks->currentItem()) - ui->blocks->setCurrentRow(0); -} - -void Main::on_blockChainFilter_textChanged() -{ - static QTimer* s_delayed = nullptr; - if (!s_delayed) - { - s_delayed = new QTimer(this); - s_delayed->setSingleShot(true); - connect(s_delayed, SIGNAL(timeout()), SLOT(refreshBlockChain())); - } - s_delayed->stop(); - s_delayed->start(200); -} - -void Main::on_refresh_triggered() -{ - refreshAll(); -} - -static std::string niceUsed(unsigned _n) -{ - static const vector c_units = { "bytes", "KB", "MB", "GB", "TB", "PB" }; - unsigned u = 0; - while (_n > 10240) - { - _n /= 1024; - u++; - } - if (_n > 1000) - return toString(_n / 1000) + "." + toString((min(949, _n % 1000) + 50) / 100) + " " + c_units[u + 1]; - else - return toString(_n) + " " + c_units[u]; -} - -void Main::refreshCache() -{ - BlockChain::Statistics s = ethereum()->blockChain().usage(); - QString t; - auto f = [&](unsigned n, QString l) - { - t += ("%1 " + l).arg(QString::fromStdString(niceUsed(n))); - }; - f(s.memTotal(), "total"); - t += " ("; - f(s.memBlocks, "blocks"); - t += ", "; - f(s.memReceipts, "receipts"); - t += ", "; - f(s.memLogBlooms, "blooms"); - t += ", "; - f(s.memBlockHashes + s.memTransactionAddresses, "hashes"); - t += ", "; - f(s.memDetails, "family"); - t += ")"; - ui->cacheUsage->setText(t); -} - -void Main::timerEvent(QTimerEvent*) -{ - // 7/18, Alex: aggregating timers, prelude to better threading? - // Runs much faster on slower dual-core processors - static int interval = 100; - - // refresh mining every 200ms - if (interval / 100 % 2 == 0) - refreshMining(); - - if ((interval / 100 % 2 == 0 && m_webThree->ethereum()->isSyncing()) || interval == 1000) - ui->downloadView->update(); - - // refresh peer list every 1000ms, reset counter - if (interval == 1000) - { - interval = 0; - refreshNetwork(); - refreshCache(); - refreshBlockCount(); - poll(); - } - else - interval += 100; - - for (auto const& i: m_handlers) - { - auto ls = ethereum()->checkWatchSafe(i.first); - if (ls.size()) - { -// cnote << "FIRING WATCH" << i.first << ls.size(); - i.second(ls); - } - } -} - -string Main::renderDiff(StateDiff const& _d) const -{ - stringstream s; - - auto indent = " "; - for (auto const& i: _d.accounts) - { - s << "
"; - - AccountDiff ad = i.second; - s << "" << lead(ad.changeType()) << " " << " " << render(i.first) << ""; - if (!ad.exist.to()) - continue; - - if (ad.balance) - { - s << "
" << indent << "Balance " << dec << ad.balance.to() << " [=" << formatBalance(ad.balance.to()) << "]"; - bigint d = (dev::bigint)ad.balance.to() - (dev::bigint)ad.balance.from(); - s << " " << showpos << dec << d << " [=" << formatBalance(d) << "]" << noshowpos << ""; - } - if (ad.nonce) - { - s << "
" << indent << "Count #" << dec << ad.nonce.to(); - s << " " << showpos << (((dev::bigint)ad.nonce.to()) - ((dev::bigint)ad.nonce.from())) << noshowpos << ""; - } - if (ad.code) - { - s << "
" << indent << "Code " << dec << ad.code.to().size() << " bytes"; - if (ad.code.from().size()) - s << " (" << ad.code.from().size() << " bytes)"; - } - - for (pair> const& i: ad.storage) - { - s << "
"; - if (!i.second.from()) - s << " + "; - else if (!i.second.to()) - s << "XXX"; - else - s << " * "; - s << " "; - - s << prettyU256(i.first); -/* if (i.first > u256(1) << 246) - s << (h256)i.first; - else if (i.first > u160(1) << 150) - s << (h160)(u160)i.first; - else - s << hex << i.first; -*/ - if (!i.second.from()) - s << ": " << prettyU256(i.second.to()); - else if (!i.second.to()) - s << " (" << prettyU256(i.second.from()) << ")"; - else - s << ": " << prettyU256(i.second.to()) << " (" << prettyU256(i.second.from()) << ")"; - } - } - return s.str(); -} - -void Main::on_transactionQueue_currentItemChanged() -{ - ui->pendingInfo->clear(); - - stringstream s; - int i = ui->transactionQueue->currentRow(); - if (i >= 0 && i < (int)ethereum()->pending().size()) - { - ui->debugPending->setEnabled(true); - Transaction tx(ethereum()->pending()[i]); - TransactionReceipt receipt(ethereum()->postState().receipt(i)); - auto ss = tx.safeSender(); - h256 th = sha3(rlpList(ss, tx.nonce())); - s << "

" << th << "

"; - s << "From: " << pretty(ss) << " " << ss; - if (tx.isCreation()) - s << "
Creates: " << pretty(right160(th)) << " " << right160(th); - else - s << "
To: " << pretty(tx.receiveAddress()) << " " << tx.receiveAddress(); - s << "
Value: " << formatBalance(tx.value()) << ""; - s << "   #" << tx.nonce() << ""; - s << "
Gas price: " << formatBalance(tx.gasPrice()) << ""; - s << "
Gas: " << tx.gas() << ""; - if (tx.isCreation()) - { - if (tx.data().size()) - s << "

Code

" << disassemble(tx.data()); - } - else - { - if (tx.data().size()) - s << dev::memDump(tx.data(), 16, true); - } - s << "
Hex: " ETH_HTML_SPAN(ETH_HTML_MONO) << toHex(tx.rlp()) << "
"; - s << "
"; - if (!!receipt.bloom()) - s << "
Log Bloom: " << receipt.bloom() << "
"; - else - s << "
Log Bloom: Uneventful
"; - s << "
Gas Used: " << receipt.gasUsed() << "
"; - s << "
End State: " << receipt.stateRoot().abridged() << "
"; - auto r = receipt.rlp(); - s << "
Receipt: " << toString(RLP(r)) << "
"; - s << "
Receipt-Hex: " ETH_HTML_SPAN(ETH_HTML_MONO) << toHex(receipt.rlp()) << "
"; - s << renderDiff(ethereum()->diff(i, PendingBlock)); -// s << "Pre: " << fs.rootHash() << "
"; -// s << "Post: " << ts.rootHash() << ""; - } - else - ui->debugPending->setEnabled(false); - - ui->pendingInfo->setHtml(QString::fromStdString(s.str())); - ui->pendingInfo->moveCursor(QTextCursor::Start); -} - -void Main::on_injectBlock_triggered() -{ - QString s = QInputDialog::getText(this, "Inject Block", "Enter block dump in hex"); - try - { - bytes b = fromHex(s.toStdString(), WhenError::Throw); - ethereum()->injectBlock(b); - } - catch (BadHexCharacter& _e) - { - cwarn << "invalid hex character, transaction rejected"; - cwarn << boost::diagnostic_information(_e); - } - catch (...) - { - cwarn << "block rejected"; - } -} - -static string htmlEscaped(string const& _s) -{ - return QString::fromStdString(_s).toHtmlEscaped().toStdString(); -} - -void Main::on_blocks_currentItemChanged() -{ - ui->info->clear(); - ui->debugCurrent->setEnabled(false); - ui->debugDumpState->setEnabled(false); - ui->debugDumpStatePre->setEnabled(false); - if (auto item = ui->blocks->currentItem()) - { - auto hba = item->data(Qt::UserRole).toByteArray(); - assert(hba.size() == 32); - auto h = h256((byte const*)hba.data(), h256::ConstructFromPointer); - auto details = ethereum()->blockChain().details(h); - auto blockData = ethereum()->blockChain().block(h); - auto block = RLP(blockData); - Ethash::BlockHeader info(blockData); - - stringstream s; - - if (item->data(Qt::UserRole + 1).isNull()) - { - char timestamp[64]; - time_t rawTime = (time_t)(uint64_t)info.timestamp(); - strftime(timestamp, 64, "%c", localtime(&rawTime)); - s << "

" << h << "

"; - s << "

#" << info.number(); - s << "   " << timestamp << "

"; - try - { - RLP r(info.extraData()); - if (r[0].toInt() == 0) - s << "
Sealing client: " << htmlEscaped(r[1].toString()) << "" << "
"; - } - catch (...) {} - s << "
D/TD: " << info.difficulty() << "/" << details.totalDifficulty << " = 2^" << log2((double)info.difficulty()) << "/2^" << log2((double)details.totalDifficulty) << "
"; - s << "   Children: " << details.children.size() << ""; - s << "
Gas used/limit: " << info.gasUsed() << "/" << info.gasLimit() << "" << "
"; - s << "
Beneficiary: " << htmlEscaped(pretty(info.beneficiary())) << " " << info.beneficiary() << "" << "
"; - s << "
Seed hash: " << info.seedHash() << "" << "
"; - s << "
Mix hash: " << info.mixHash() << "" << "
"; - s << "
Nonce: " << info.nonce() << "" << "
"; - s << "
Hash w/o nonce: " << info.hashWithout() << "" << "
"; - s << "
Difficulty: " << info.difficulty() << "" << "
"; - if (info.number()) - { - auto e = EthashAux::eval(info.seedHash(), info.hashWithout(), info.nonce()); - s << "
Proof-of-Work: " << e.value << " <= " << (h256)u256((bigint(1) << 256) / info.difficulty()) << " (mixhash: " << e.mixHash.abridged() << ")" << "
"; - s << "
Parent: " << info.parentHash() << "" << "
"; - } - else - { - s << "
Proof-of-Work: Phil has nothing to prove
"; - s << "
Parent: It was a virgin birth
"; - } -// s << "
Bloom: " << details.bloom << ""; - s << "
State root: " << ETH_HTML_SPAN(ETH_HTML_MONO) << info.stateRoot().hex() << "
"; - s << "
Extra data: " << ETH_HTML_SPAN(ETH_HTML_MONO) << toHex(info.extraData()) << "
"; - if (!!info.logBloom()) - s << "
Log Bloom: " << info.logBloom() << "
"; - else - s << "
Log Bloom: Uneventful
"; - s << "
Transactions: " << block[1].itemCount() << " @" << info.transactionsRoot() << "" << "
"; - s << "
Uncles: " << block[2].itemCount() << " @" << info.sha3Uncles() << "" << "
"; - for (auto u: block[2]) - { - Ethash::BlockHeader uncle(u.data(), CheckNothing, h256(), HeaderData); - char const* line = "
 "; - s << line << "Hash: " << uncle.hash() << "" << "
"; - s << line << "Parent: " << uncle.parentHash() << "" << "
"; - s << line << "Number: " << uncle.number() << "" << ""; - s << line << "Coinbase: " << htmlEscaped(pretty(uncle.beneficiary())) << " " << uncle.beneficiary() << "" << ""; - s << line << "Seed hash: " << uncle.seedHash() << "" << ""; - s << line << "Mix hash: " << uncle.mixHash() << "" << ""; - s << line << "Nonce: " << uncle.nonce() << "" << ""; - s << line << "Hash w/o nonce: " << uncle.headerHash(WithoutProof) << "" << ""; - s << line << "Difficulty: " << uncle.difficulty() << "" << ""; - auto e = EthashAux::eval(uncle.seedHash(), uncle.hashWithout(), uncle.nonce()); - s << line << "Proof-of-Work: " << e.value << " <= " << (h256)u256((bigint(1) << 256) / uncle.difficulty()) << " (mixhash: " << e.mixHash.abridged() << ")" << ""; - } - if (info.parentHash()) - s << "
Pre: " << BlockInfo(ethereum()->blockChain().block(info.parentHash())).stateRoot() << "" << "
"; - else - s << "
Pre: Nothing is before Phil" << "
"; - - s << "
Receipts: @" << info.receiptsRoot() << ":" << "
"; - BlockReceipts receipts = ethereum()->blockChain().receipts(h); - unsigned ii = 0; - for (auto const& i: block[1]) - { - s << "
" << sha3(i.data()).abridged() << ": " << receipts.receipts[ii].stateRoot() << " [" << receipts.receipts[ii].gasUsed() << " used]" << "
"; - ++ii; - } - s << "
Post: " << info.stateRoot() << "" << "
"; - s << "
Dump: " ETH_HTML_SPAN(ETH_HTML_MONO) << toHex(block[0].data()) << "" << "
"; - s << "
Receipts-Hex: " ETH_HTML_SPAN(ETH_HTML_MONO) << toHex(receipts.rlp()) << "
"; - } - else - { - unsigned txi = item->data(Qt::UserRole + 1).toInt(); - Transaction tx(block[1][txi].data(), CheckTransaction::Everything); - auto ss = tx.safeSender(); - h256 th = sha3(rlpList(ss, tx.nonce())); - TransactionReceipt receipt = ethereum()->blockChain().receipts(h).receipts[txi]; - s << "

" << th << "

"; - s << "

" << h << "[" << txi << "]

"; - s << "
From: " << htmlEscaped(pretty(ss)) << " " << ss << "" << "
"; - if (tx.isCreation()) - s << "
Creates: " << htmlEscaped(pretty(right160(th))) << " " << right160(th) << "
"; - else - s << "
To: " << htmlEscaped(pretty(tx.receiveAddress())) << " " << tx.receiveAddress() << "
"; - s << "
Value: " << formatBalance(tx.value()) << "" << "
"; - s << "   #" << tx.nonce() << "" << ""; - s << "
Gas price: " << formatBalance(tx.gasPrice()) << "" << "
"; - s << "
Gas: " << tx.gas() << "" << "
"; - s << "
V: " << hex << nouppercase << (int)tx.signature().v << " + 27" << "
"; - s << "
R: " << hex << nouppercase << tx.signature().r << "" << "
"; - s << "
S: " << hex << nouppercase << tx.signature().s << "" << "
"; - s << "
Msg: " << tx.sha3(eth::WithoutSignature) << "" << "
"; - if (!tx.data().empty()) - { - if (tx.isCreation()) - s << "

Code

" << disassemble(tx.data()); - else - s << "

Data

" << dev::memDump(tx.data(), 16, true); - } - s << "
Hex: " ETH_HTML_SPAN(ETH_HTML_MONO) << toHex(block[1][txi].data()) << "
"; - s << "
"; - if (!!receipt.bloom()) - s << "
Log Bloom: " << receipt.bloom() << "
"; - else - s << "
Log Bloom: Uneventful
"; - s << "
Gas Used: " << receipt.gasUsed() << "
"; - s << "
End State: " << receipt.stateRoot().abridged() << "
"; - auto r = receipt.rlp(); - s << "
Receipt: " << toString(RLP(r)) << "
"; - s << "
Receipt-Hex: " ETH_HTML_SPAN(ETH_HTML_MONO) << toHex(receipt.rlp()) << "
"; - s << "

Diff

" << renderDiff(ethereum()->diff(txi, h)); - ui->debugCurrent->setEnabled(true); - ui->debugDumpState->setEnabled(true); - ui->debugDumpStatePre->setEnabled(true); - } - - ui->info->appendHtml(QString::fromStdString(s.str())); - ui->info->moveCursor(QTextCursor::Start); - } -} - -void Main::on_debugCurrent_triggered() -{ - if (auto item = ui->blocks->currentItem()) - { - auto hba = item->data(Qt::UserRole).toByteArray(); - assert(hba.size() == 32); - auto h = h256((byte const*)hba.data(), h256::ConstructFromPointer); - - if (!item->data(Qt::UserRole + 1).isNull()) - { - unsigned txi = item->data(Qt::UserRole + 1).toInt(); - bytes t = ethereum()->blockChain().transaction(h, txi); - State s(ethereum()->state(txi, h)); - BlockInfo bi(ethereum()->blockChain().info(h)); - Executive e(s, ethereum()->blockChain(), EnvInfo(bi)); - Debugger dw(this, this); - dw.populate(e, Transaction(t, CheckTransaction::Everything)); - dw.exec(); - } - } -} - -void Main::on_debugPending_triggered() -{ - int txi = ui->transactionQueue->currentRow(); - if (txi == -1) - return; - - Block b = ethereum()->postState(); - bytes t = b.pending()[txi].rlp(); - State s(ethereum()->state(txi)); - BlockInfo bi(b.info()); - Executive e(s, ethereum()->blockChain(), EnvInfo(bi)); - Debugger dw(this, this); - dw.populate(e, Transaction(t, CheckTransaction::Everything)); - dw.exec(); -} - -std::string minHex(h256 const& _h) -{ - unsigned i = 0; - for (; i < 31 && !_h[i]; ++i) {} - return toHex(_h.ref().cropped(i)); -} - -void Main::on_dumpBlockState_triggered() -{ -#if ETH_FATDB || !ETH_TRUE - if (auto item = ui->blocks->currentItem()) - { - auto hba = item->data(Qt::UserRole).toByteArray(); - assert(hba.size() == 32); - auto h = h256((byte const*)hba.data(), h256::ConstructFromPointer); - QString fn = QFileDialog::getSaveFileName(this, "Select file to output state dump"); - ofstream f(fn.toStdString()); - if (f.is_open()) - { - f << "{" << endl; -// js::mObject s; - State state = ethereum()->block(h).state(); - int fi = 0; - for (pair const& i: state.addresses()) - { - f << (fi++ ? "," : "") << "\"" << i.first.hex() << "\": { "; - f << "\"balance\": \"" << toString(i.second) << "\", "; - if (state.codeHash(i.first) != EmptySHA3) - { - f << "\"codeHash\": \"" << state.codeHash(i.first).hex() << "\", "; - f << "\"storage\": {"; - int fj = 0; - for (pair const& j: state.storage(i.first)) - f << (fj++ ? "," : "") << "\"" << minHex(j.first) << "\":\"" << minHex(j.second) << "\""; - f << "}, "; - } - f << "\"nonce\": \"" << toString(state.transactionsFrom(i.first)) << "\""; - f << "}" << endl; // end account - if (!(fi % 100)) - f << flush; - } - f << "}"; - } - } -#endif -} - -void Main::debugDumpState(int _add) -{ - if (auto item = ui->blocks->currentItem()) - { - auto hba = item->data(Qt::UserRole).toByteArray(); - assert(hba.size() == 32); - auto h = h256((byte const*)hba.data(), h256::ConstructFromPointer); - - if (!item->data(Qt::UserRole + 1).isNull()) - { - QString fn = QFileDialog::getSaveFileName(this, "Select file to output state dump"); - ofstream f(fn.toStdString()); - if (f.is_open()) - { - unsigned txi = item->data(Qt::UserRole + 1).toInt(); - f << ethereum()->state(txi + _add, h) << endl; - } - } - } -} - -void Main::on_idealPeers_valueChanged(int) -{ - m_webThree->setIdealPeerCount(ui->idealPeers->value()); -} - -void Main::on_ourAccounts_doubleClicked() -{ - auto hba = ui->ourAccounts->currentItem()->data(Qt::UserRole).toByteArray(); - auto h = Address((byte const*)hba.data(), Address::ConstructFromPointer); - qApp->clipboard()->setText(QString::fromStdString(ICAP(h).encoded()) + " (" + QString::fromStdString(h.hex()) + ")"); -} - -/*void Main::on_log_doubleClicked() -{ - ui->log->setPlainText(""); - m_logHistory.clear(); -}*/ - -void Main::on_clearPending_triggered() -{ - writeSettings(); - ui->mine->setChecked(false); - ui->net->setChecked(false); - web3()->stopNetwork(); - ethereum()->clearPending(); - readSettings(true); - installWatches(); - refreshAll(); -} - -void Main::on_retryUnknown_triggered() -{ - ethereum()->retryUnknown(); -} - -void Main::on_killBlockchain_triggered() -{ - writeSettings(); - ui->mine->setChecked(false); - ui->net->setChecked(false); - web3()->stopNetwork(); - ethereum()->killChain(); - readSettings(true); - installWatches(); - refreshAll(); -} - -void Main::on_net_triggered() -{ - ui->port->setEnabled(!ui->net->isChecked()); - ui->clientName->setEnabled(!ui->net->isChecked()); - web3()->setClientVersion(WebThreeDirect::composeClientVersion("AlethZero", ui->clientName->text().toStdString())); - if (ui->net->isChecked()) - { - web3()->setIdealPeerCount(ui->idealPeers->value()); - web3()->setNetworkPreferences(netPrefs(), ui->dropPeers->isChecked()); - ethereum()->setNetworkId((h256)(u256)(int)c_network); - web3()->startNetwork(); - ui->downloadView->setEthereum(ethereum()); - ui->enode->setText(QString::fromStdString(web3()->enode())); - } - else - { - ui->downloadView->setEthereum(nullptr); - writeSettings(); - web3()->stopNetwork(); - } -} - -void Main::on_connect_triggered() -{ - if (!ui->net->isChecked()) - { - ui->net->setChecked(true); - on_net_triggered(); - } - - m_connect.setEnvironment(m_servers); - if (m_connect.exec() == QDialog::Accepted) - { - bool required = m_connect.required(); - string host(m_connect.host().toStdString()); - NodeId nodeID; - try - { - nodeID = NodeId(fromHex(m_connect.nodeId().toStdString())); - } - catch (BadHexCharacter&) {} - - m_connect.reset(); - - if (required) - web3()->requirePeer(nodeID, host); - else - web3()->addNode(nodeID, host); - } -} - -void Main::on_mine_triggered() -{ - if (ui->mine->isChecked()) - { -// EthashAux::computeFull(ethereum()->blockChain().number()); - ethereum()->setBeneficiary(m_beneficiary); - ethereum()->startMining(); - } - else - ethereum()->stopMining(); -} - -void Main::keysChanged() -{ - emit keyManagerChanged(); - onBalancesChange(); -} - -void Main::on_killAccount_triggered() -{ - if (ui->ourAccounts->currentRow() >= 0) - { - auto hba = ui->ourAccounts->currentItem()->data(Qt::UserRole).toByteArray(); - Address h((byte const*)hba.data(), Address::ConstructFromPointer); - QString s = QInputDialog::getText(this, QString::fromStdString("Kill Account " + m_keyManager.accountName(h) + "?!"), - QString::fromStdString("Account " + m_keyManager.accountName(h) + " (" + render(h) + ") has " + formatBalance(ethereum()->balanceAt(h)) + " in it.\r\nIt, and any contract that this account can access, will be lost forever if you continue. Do NOT continue unless you know what you are doing.\n" - "Are you sure you want to continue? \r\n If so, type 'YES' to confirm."), - QLineEdit::Normal, "NO"); - if (s != "YES") - return; - m_keyManager.kill(h); - if (m_keyManager.accounts().empty()) - m_keyManager.import(Secret::random(), "Default account"); - m_beneficiary = m_keyManager.accounts().front(); - keysChanged(); - if (m_beneficiary == h) - setBeneficiary(m_keyManager.accounts().front()); - } -} - -void Main::on_reencryptKey_triggered() -{ - if (ui->ourAccounts->currentRow() >= 0) - { - auto hba = ui->ourAccounts->currentItem()->data(Qt::UserRole).toByteArray(); - Address a((byte const*)hba.data(), Address::ConstructFromPointer); - QStringList kdfs = {"PBKDF2-SHA256", "Scrypt"}; - bool ok = true; - KDF kdf = (KDF)kdfs.indexOf(QInputDialog::getItem(this, "Re-Encrypt Key", "Select a key derivation function to use for storing your key:", kdfs, kdfs.size() - 1, false, &ok)); - if (!ok) - return; - std::string hint; - std::string password = getPassword("Create Account", "Enter the password you would like to use for this key. Don't forget it!\nEnter nothing to use your Master password.", &hint, &ok); - if (!ok) - return; - try { - auto pw = [&](){ - auto p = QInputDialog::getText(this, "Re-Encrypt Key", "Enter the original password for this key.\nHint: " + QString::fromStdString(m_keyManager.passwordHint(a)), QLineEdit::Password, QString()).toStdString(); - if (p.empty()) - throw PasswordUnknown(); - return p; - }; - while (!(password.empty() ? m_keyManager.recode(a, SemanticPassword::Master, pw, kdf) : m_keyManager.recode(a, password, hint, pw, kdf))) - if (QMessageBox::question(this, "Re-Encrypt Key", "Password given is incorrect. Would you like to try again?", QMessageBox::Retry, QMessageBox::Cancel) == QMessageBox::Cancel) - return; - } - catch (PasswordUnknown&) {} - } -} - -void Main::on_reencryptAll_triggered() -{ - QStringList kdfs = {"PBKDF2-SHA256", "Scrypt"}; - bool ok = false; - QString kdf = QInputDialog::getItem(this, "Re-Encrypt Key", "Select a key derivation function to use for storing your keys:", kdfs, kdfs.size() - 1, false, &ok); - if (!ok) - return; - try { - for (Address const& a: m_keyManager.accounts()) - while (!m_keyManager.recode(a, SemanticPassword::Existing, [&](){ - auto p = QInputDialog::getText(nullptr, "Re-Encrypt Key", QString("Enter the original password for key %1.\nHint: %2").arg(QString::fromStdString(pretty(a))).arg(QString::fromStdString(m_keyManager.passwordHint(a))), QLineEdit::Password, QString()).toStdString(); - if (p.empty()) - throw PasswordUnknown(); - return p; - }, (KDF)kdfs.indexOf(kdf))) - if (QMessageBox::question(this, "Re-Encrypt Key", "Password given is incorrect. Would you like to try again?", QMessageBox::Retry, QMessageBox::Cancel) == QMessageBox::Cancel) - return; - } - catch (PasswordUnknown&) {} -} - -void Main::on_go_triggered() -{ - if (!ui->net->isChecked()) - { - ui->net->setChecked(true); - on_net_triggered(); - } - for (auto const& i: Host::pocHosts()) - web3()->requirePeer(i.first, i.second); -} - -std::string Main::prettyU256(dev::u256 const& _n) const -{ - unsigned inc = 0; - string raw; - ostringstream s; - if (_n > szabo && _n < 1000000 * ether) - s << "" << formatBalance(_n) << " (0x" << hex << (uint64_t)_n << ")"; - else if (!(_n >> 64)) - s << "" << (uint64_t)_n << " (0x" << hex << (uint64_t)_n << ")"; - else if (!~(_n >> 64)) - s << "" << (int64_t)_n << " (0x" << hex << (int64_t)_n << ")"; - else if ((_n >> 160) == 0) - { - Address a = right160(_n); - string n = pretty(a); - if (n.empty()) - s << "0x" << a << ""; - else - s << "" << htmlEscaped(n) << " (0x" << a.abridged() << ")"; - } - else if ((raw = fromRaw((h256)_n, &inc)).size()) - return "\"" + htmlEscaped(raw) + "\"" + (inc ? " + " + toString(inc) : "") + ""; - else - s << "0x" << (h256)_n << ""; - return s.str(); -} - -int Main::authenticate(QString _title, QString _text) -{ - QMessageBox userInput(this); - userInput.setText(_title); - userInput.setInformativeText(_text); - userInput.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); - userInput.button(QMessageBox::Ok)->setText("Allow"); - userInput.button(QMessageBox::Cancel)->setText("Reject"); - userInput.setDefaultButton(QMessageBox::Cancel); - return userInput.exec(); -} - -void Main::dappLoaded(Dapp& _dapp) -{ - QUrl url = m_dappHost->hostDapp(std::move(_dapp)); - ui->webView->page()->setUrl(url); -} - -void Main::pageLoaded(QByteArray const& _content, QString const& _mimeType, QUrl const& _uri) -{ - ui->webView->page()->setContent(_content, _mimeType, _uri); -} - -void Main::initPlugin(Plugin* _p) -{ - QSettings s("ethereum", "alethzero"); - _p->readSettings(s); -} - -void Main::finalisePlugin(Plugin* _p) -{ - QSettings s("ethereum", "alethzero"); - _p->writeSettings(s); -} - -void Main::unloadPlugin(string const& _name) -{ - shared_ptr p = takePlugin(_name); - if (p) - finalisePlugin(p.get()); -} diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h deleted file mode 100644 index 2bccbde57..000000000 --- a/alethzero/MainWin.h +++ /dev/null @@ -1,303 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file MainWin.h - * @author Gav Wood - * @date 2014 - */ - -#pragma once - -#ifdef Q_MOC_RUN -#define BOOST_MPL_IF_HPP_INCLUDED -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Context.h" -#include "Transact.h" -#include "NatspecHandler.h" -#include "Connect.h" -#include "MainFace.h" - -class QListWidgetItem; -class QActionGroup; - -namespace Ui { -class Main; -} - -namespace jsonrpc { -class HttpServer; -} - -class QWebEnginePage; - -namespace dev -{ - -namespace eth -{ -class Client; -class State; -} - -namespace az -{ - -class OurWebThreeStubServer; -class DappLoader; -class DappHost; -struct Dapp; - -QString contentsOfQResource(std::string const& res); - -class Main: public MainFace -{ - Q_OBJECT - -public: - explicit Main(QWidget *parent = 0); - ~Main(); - - WebThreeDirect* web3() const override { return m_webThree.get(); } - OurWebThreeStubServer* web3Server() const override { return m_server.get(); } - eth::Client* ethereum() const override { return m_webThree->ethereum(); } - std::shared_ptr whisper() const override { return m_webThree->whisper(); } - - bool confirm() const; - NatSpecFace* natSpec() { return &m_natSpecDB; } - - std::string pretty(dev::Address const& _a) const override; - std::string prettyU256(u256 const& _n) const override; - std::string render(dev::Address const& _a) const override; - std::pair fromString(std::string const& _a) const override; - std::string renderDiff(eth::StateDiff const& _d) const override; - - u256 gasPrice() const override; - - eth::KeyManager& keyManager() override { return m_keyManager; } - void noteKeysChanged() override { refreshBalances(); } - bool doConfirm(); - - Secret retrieveSecret(Address const& _address) const override; - - // Account naming API. - void install(AccountNamer* _adopt) override; - void uninstall(AccountNamer* _kill) override; - void noteKnownAddressesChanged(AccountNamer*) override; - void noteAddressNamesChanged(AccountNamer*) override; - Address toAddress(std::string const&) const override; - std::string toName(Address const&) const override; - Addresses allKnownAddresses() const override; - - void noteSettingsChanged() override { writeSettings(); } - -public slots: - void load(QString _file); - void note(QString _entry); - void debug(QString _entry); - void warn(QString _entry); - QString contents(QString _file); - - int authenticate(QString _title, QString _text); - - void onKeysChanged(); - -private slots: - void eval(QString const& _js); - void addConsoleMessage(QString const& _js, QString const& _s); - - // Application - void on_about_triggered(); - void on_quit_triggered() { close(); } - - // Network - void on_go_triggered(); - void on_net_triggered(); - void on_connect_triggered(); - void on_idealPeers_valueChanged(int); - - // Mining - void on_mine_triggered(); - void on_prepNextDAG_triggered(); - - // View - void on_refresh_triggered(); - void on_showAll_triggered() { refreshBlockChain(); } - void on_preview_triggered(); - - // Account management - void on_killAccount_triggered(); - void on_importKey_triggered(); - void on_reencryptKey_triggered(); - void on_reencryptAll_triggered(); - void on_importKeyFile_triggered(); - void on_claimPresale_triggered(); - void on_importPresale_triggered(); - void on_exportKey_triggered(); - - // Tools - void on_newTransaction_triggered(); - void on_loadJS_triggered(); - - // Stuff concerning the blocks/transactions/accounts panels - void on_ourAccounts_itemClicked(QListWidgetItem* _i); - void on_ourAccounts_doubleClicked(); - void on_transactionQueue_currentItemChanged(); - void on_blockChainFilter_textChanged(); - void on_blocks_currentItemChanged(); - - // Misc - void on_urlEdit_returnPressed(); - void on_jsInput_returnPressed(); - void on_nameReg_textChanged(); - - // Special (debug) stuff - void on_paranoia_triggered(); - void on_killBlockchain_triggered(); - void on_clearPending_triggered(); - void on_injectBlock_triggered(); - void on_forceMining_triggered(); - void on_usePrivate_triggered(); - void on_turboMining_triggered(); - void on_retryUnknown_triggered(); - void on_vmInterpreter_triggered(); - void on_vmJIT_triggered(); - void on_vmSmart_triggered(); - void on_rewindChain_triggered(); - - // Debugger - void on_debugCurrent_triggered(); - void on_debugPending_triggered(); - void on_debugDumpState_triggered() { debugDumpState(1); } - void on_debugDumpStatePre_triggered() { debugDumpState(0); } - void on_dumpBlockState_triggered(); - - // Config - void on_gasPrices_triggered(); - void on_sentinel_triggered(); - - void refreshBlockChain(); - - // Dapps - void dappLoaded(Dapp& _dapp); //qt does not support rvalue refs for signals - void pageLoaded(QByteArray const& _content, QString const& _mimeType, QUrl const& _uri); - -signals: - void poll(); - -private: - template void loadPlugin() { Plugin* p = new P(this); initPlugin(p); } - void initPlugin(Plugin* _p); - void finalisePlugin(Plugin* _p); - void unloadPlugin(std::string const& _name); - - void debugDumpState(int _add); - - p2p::NetworkPreferences netPrefs() const; - - QString lookup(QString const& _n) const; - Address getNameReg() const; - Address getCurrencies() const; - - void updateFee(); - void readSettings(bool _skipGeometry = false, bool _onlyGeometry = false); - void writeSettings(); - - void setPrivateChain(QString const& _private, bool _forceConfigure = false); - - unsigned installWatch(eth::LogFilter const& _tf, WatchHandler const& _f) override; - unsigned installWatch(h256 const& _tf, WatchHandler const& _f) override; - void uninstallWatch(unsigned _w) override; - - void keysChanged(); - - void onNewPending(); - void onNewBlock(); - void onNameRegChange(); - void onCurrenciesChange(); - void onBalancesChange(); - - void installWatches(); - void installCurrenciesWatch(); - void installNameRegWatch(); - void installBalancesWatch(); - - virtual void timerEvent(QTimerEvent*) override; - - void refreshNetwork(); - void refreshMining(); - void refreshCache(); - - void refreshAll(); - void refreshPending(); - void refreshBlockCount(); - void refreshBalances(); - - void setBeneficiary(Address const& _b); - std::string getPassword(std::string const& _title, std::string const& _for, std::string* _hint = nullptr, bool* _ok = nullptr); - - std::unique_ptr ui; - - std::unique_ptr m_webThree; - - std::map m_handlers; - unsigned m_nameRegFilter = (unsigned)-1; - unsigned m_currenciesFilter = (unsigned)-1; - unsigned m_balancesFilter = (unsigned)-1; - - QByteArray m_networkConfig; - QStringList m_servers; - eth::KeyManager m_keyManager; - QString m_privateChain; - dev::Address m_nameReg; - dev::Address m_beneficiary; - - QActionGroup* m_vmSelectionGroup = nullptr; - - QList> m_consoleHistory; - - std::unique_ptr m_httpConnector; - std::unique_ptr m_server; - - static std::string fromRaw(h256 const& _n, unsigned* _inc = nullptr); - NatspecHandler m_natSpecDB; - - Transact* m_transact; - std::unique_ptr m_dappHost; - DappLoader* m_dappLoader; - QWebEnginePage* m_webPage; - - Connect m_connect; - - std::unordered_set m_namers; - - bool m_destructing = false; -}; - -} -} diff --git a/alethzero/MiningView.cpp b/alethzero/MiningView.cpp deleted file mode 100644 index be8f1b53c..000000000 --- a/alethzero/MiningView.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file MiningView.cpp - * @author Gav Wood - * @date 2014 - */ - -#include "MiningView.h" - -#include -#include -#include -#include "Grapher.h" - -using namespace std; -using namespace lb; -// do *not* use eth since unsigned conflicts with Qt's global unit definition -// using namespace dev; -using namespace dev::az; -using namespace dev::eth; -using dev::eth::MineInfo; -using dev::eth::WorkingProgress; -using dev::toString; -using dev::trimFront; - -string id(float _y) { return toString(_y); } -string s(float _x){ return toString(round(_x * 1000) / 1000) + (!_x ? "s" : ""); } -string sL(float _x, float _y) { return toString(round(_x * 1000)) + "s (" + toString(_y) + ")"; } - -MiningView::MiningView(QWidget* _p): QWidget(_p) -{ -} - -void MiningView::appendStats(list const& _i, WorkingProgress const& _p) -{ - (void)_p; - if (_i.empty()) - return; - -/* unsigned o = m_values.size(); - for (MineInfo const& i: _i) - { - m_values.push_back(i.best); - m_lastBest = min(m_lastBest, i.best); - m_bests.push_back(m_lastBest); - m_reqs.push_back(i.requirement); - if (i.completed) - { - m_completes.push_back(o); - m_resets.push_back(o); - m_haveReset = false; - m_lastBest = 1e99; - } - ++o; - } - if (m_haveReset) - { - m_resets.push_back(o - 1); - m_lastBest = 1e99; - m_haveReset = false; - } - - o = max(0, (int)m_values.size() - (int)m_duration); - trimFront(m_values, o); - trimFront(m_bests, o); - trimFront(m_reqs, o); - - for (auto& i: m_resets) - i -= o; - m_resets.erase(remove_if(m_resets.begin(), m_resets.end(), [](int i){return i < 0;}), m_resets.end()); - for (auto& i: m_completes) - i -= o; - m_completes.erase(remove_if(m_completes.begin(), m_completes.end(), [](int i){return i < 0;}), m_completes.end()); - - m_progress = _p; - update();*/ -} - -void MiningView::resetStats() -{ - m_haveReset = true; -} - -void MiningView::paintEvent(QPaintEvent*) -{ - /* - Grapher g; - QPainter p(this); - - g.init(&p, make_pair(0.f, max((float)m_duration * 0.1f, (float)m_values.size() * 0.1f)), make_pair(0.0f, 255.f - ((float)m_progress.requirement - 4.0f)), s, id, sL); - g.drawAxes(); - g.setDataTransform(0.1f, 0, -1.0f, 255.f); - - g.drawLineGraph(m_values, QColor(192, 192, 192)); - g.drawLineGraph(m_bests, QColor(128, 128, 128)); - g.drawLineGraph(m_reqs, QColor(128, 64, 64)); - for (auto r: m_resets) - g.ruleY(r - 1, QColor(128, 128, 128)); - for (auto r: m_completes) - g.ruleY(r, QColor(192, 64, 64)); - */ -} diff --git a/alethzero/MiningView.h b/alethzero/MiningView.h deleted file mode 100644 index 518a1ed35..000000000 --- a/alethzero/MiningView.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file MiningView.h - * @author Gav Wood - * @date 2014 - */ - -#pragma once - -#ifdef Q_MOC_RUN -#define BOOST_MPL_IF_HPP_INCLUDED -#endif - -#include -#include -#ifndef Q_MOC_RUN -#include -#endif - -namespace dev -{ - -namespace eth -{ -struct MineInfo; -} - -namespace az -{ - -class MiningView: public QWidget -{ - Q_OBJECT - -public: - MiningView(QWidget* _p = nullptr); - - void appendStats(std::list const& _l, dev::eth::WorkingProgress const& _p); - void resetStats(); - -protected: - virtual void paintEvent(QPaintEvent*); - -private: - dev::eth::WorkingProgress m_progress; - unsigned m_duration = 300; - std::vector m_values; - std::vector m_bests; - std::vector m_reqs; - std::vector m_resets; - std::vector m_completes; - double m_lastBest = 1e31; - bool m_haveReset = false; -}; - -} - -} diff --git a/alethzero/NatspecHandler.cpp b/alethzero/NatspecHandler.cpp deleted file mode 100644 index 40a2aea7c..000000000 --- a/alethzero/NatspecHandler.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ - -/** @file NatspecHandler.cpp - * @author Lefteris Karapetsas - * @date 2015 - */ -#include "NatspecHandler.h" -#include -#include - -#include -#include -#include -#include -#include -#include -using namespace dev; -using namespace az; -using namespace eth; -using namespace std; -namespace fs = boost::filesystem; - -NatspecHandler::NatspecHandler() -{ - string path = Defaults::dbPath(); - fs::create_directories(path); - DEV_IGNORE_EXCEPTIONS(fs::permissions(path, fs::owner_all)); - ldb::Options o; - o.create_if_missing = true; - ldb::DB::Open(o, path + "/natspec", &m_db); -} - -NatspecHandler::~NatspecHandler() -{ - delete m_db; -} - -void NatspecHandler::add(dev::h256 const& _contractHash, string const& _doc) -{ - m_db->Put(m_writeOptions, _contractHash.ref(), _doc); - cdebug << "Registering NatSpec: " << _contractHash << _doc; -} - -string NatspecHandler::retrieve(dev::h256 const& _contractHash) const -{ - string ret; - m_db->Get(m_readOptions, _contractHash.ref(), &ret); - cdebug << "Looking up NatSpec: " << _contractHash << ret; - return ret; -} - -string NatspecHandler::getUserNotice(string const& json, dev::bytes const& _transactionData) -{ - Json::Value natspec; - Json::Value userNotice; - m_reader.parse(json, natspec); - - FixedHash<4> transactionFunctionHash((bytesConstRef(&_transactionData).cropped(0, 4).toBytes())); - - Json::Value methods = natspec["methods"]; - for (Json::ValueIterator it = methods.begin(); it != methods.end(); ++it) - { - Json::Value keyValue = it.key(); - if (!keyValue.isString()) - BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Illegal Natspec JSON detected")); - - string functionSig = keyValue.asString(); - FixedHash<4> functionHash(dev::sha3(functionSig)); - - if (functionHash == transactionFunctionHash) - { - Json::Value val = (*it)["notice"]; - if (!val.isString()) - BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Illegal Natspec JSON detected")); - return val.asString(); - } - } - - // not found - return string(); -} - -string NatspecHandler::getUserNotice(dev::h256 const& _contractHash, dev::bytes const& _transactionData) -{ - return getUserNotice(retrieve(_contractHash), _transactionData); -} - - diff --git a/alethzero/NatspecHandler.h b/alethzero/NatspecHandler.h deleted file mode 100644 index 61714f7e1..000000000 --- a/alethzero/NatspecHandler.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ - -/** @file NatspecHandler.h - * @author Lefteris Karapetsas - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include "Context.h" - -namespace dev -{ -namespace az -{ - -class NatspecHandler: public NatSpecFace -{ - public: - NatspecHandler(); - ~NatspecHandler(); - - /// Stores locally in a levelDB a key value pair of contract code hash to natspec documentation - virtual void add(dev::h256 const& _contractHash, std::string const& _doc) override; - /// Retrieves the natspec documentation as a string given a contract code hash - std::string retrieve(dev::h256 const& _contractHash) const override; - - /// Given a json natspec string and the transaction data return the user notice - virtual std::string getUserNotice(std::string const& json, const dev::bytes& _transactionData) override; - /// Given a contract code hash and the transaction's data retrieve the natspec documention's - /// user notice for that transaction. - /// @returns The user notice or an empty string if no natspec for the contract exists - /// or if the existing natspec does not document the @c _methodName - virtual std::string getUserNotice(dev::h256 const& _contractHash, dev::bytes const& _transactionDacta) override; - - private: - ldb::ReadOptions m_readOptions; - ldb::WriteOptions m_writeOptions; - ldb::DB* m_db = nullptr; - Json::Reader m_reader; -}; - -} -} diff --git a/alethzero/OurWebThreeStubServer.cpp b/alethzero/OurWebThreeStubServer.cpp deleted file mode 100644 index 1015e565c..000000000 --- a/alethzero/OurWebThreeStubServer.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file OurWebThreeStubServer.cpp - * @author Gav Wood - * @date 2014 - */ - -#include "OurWebThreeStubServer.h" -#include -#include -#include -#include -#include "MainWin.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -OurWebThreeStubServer::OurWebThreeStubServer( - jsonrpc::AbstractServerConnector& _conn, - Main* _main -): - WebThreeStubServer(_conn, *_main->web3(), make_shared(_main), vector{}, _main->keyManager(), *static_cast(_main->ethereum()->gasPricer().get())), - m_main(_main) -{ -} - -string OurWebThreeStubServer::shh_newIdentity() -{ - KeyPair kp = dev::KeyPair::create(); - emit onNewId(QString::fromStdString(toJS(kp.sec()))); - return toJS(kp.pub()); -} - -OurAccountHolder::OurAccountHolder(Main* _main): - AccountHolder([=](){ return _main->ethereum(); }), - m_main(_main) -{ - connect(_main, SIGNAL(poll()), this, SLOT(doValidations())); -} - -bool OurAccountHolder::showAuthenticationPopup(string const& _title, string const& _text) -{ - if (!m_main->confirm()) - { - cnote << "Skipping confirmation step for: " << _title << "\n" << _text; - return true; - } - - QMessageBox userInput; - userInput.setText(QString::fromStdString(_title)); - userInput.setInformativeText(QString::fromStdString(_text)); - userInput.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); - userInput.button(QMessageBox::Ok)->setText("Allow"); - userInput.button(QMessageBox::Cancel)->setText("Reject"); - userInput.setDefaultButton(QMessageBox::Cancel); - return userInput.exec() == QMessageBox::Ok; - //QMetaObject::invokeMethod(m_main, "authenticate", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, button), Q_ARG(QString, QString::fromStdString(_title)), Q_ARG(QString, QString::fromStdString(_text))); - //return button == QMessageBox::Ok; -} - -bool OurAccountHolder::showCreationNotice(TransactionSkeleton const& _t, bool _toProxy) -{ - return showAuthenticationPopup("Contract Creation Transaction", string("ÐApp is attemping to create a contract; ") + (_toProxy ? "(this transaction is not executed directly, but forwarded to another ÐApp) " : "") + "to be endowed with " + formatBalance(_t.value) + ", with additional network fees of up to " + formatBalance(_t.gas * _t.gasPrice) + ".\n\nMaximum total cost is " + formatBalance(_t.value + _t.gas * _t.gasPrice) + "."); -} - -bool OurAccountHolder::showSendNotice(TransactionSkeleton const& _t, bool _toProxy) -{ - return showAuthenticationPopup("Fund Transfer Transaction", "ÐApp is attempting to send " + formatBalance(_t.value) + " to a recipient " + m_main->pretty(_t.to) + (_toProxy ? " (this transaction is not executed directly, but forwarded to another ÐApp)" : "") + -", with additional network fees of up to " + formatBalance(_t.gas * _t.gasPrice) + ".\n\nMaximum total cost is " + formatBalance(_t.value + _t.gas * _t.gasPrice) + "."); -} - -bool OurAccountHolder::showUnknownCallNotice(TransactionSkeleton const& _t, bool _toProxy) -{ - return showAuthenticationPopup("DANGEROUS! Unknown Contract Transaction!", - "ÐApp is attempting to call into an unknown contract at address " + - m_main->pretty(_t.to) + ".\n\n" + - (_toProxy ? "This transaction is not executed directly, but forwarded to another ÐApp.\n\n" : "") + - "Call involves sending " + - formatBalance(_t.value) + " to the recipient, with additional network fees of up to " + - formatBalance(_t.gas * _t.gasPrice) + - "However, this also does other stuff which we don't understand, and does so in your name.\n\n" + - "WARNING: This is probably going to cost you at least " + - formatBalance(_t.value + _t.gas * _t.gasPrice) + - ", however this doesn't include any side-effects, which could be of far greater importance.\n\n" + - "REJECT UNLESS YOU REALLY KNOW WHAT YOU ARE DOING!"); -} - -h256 OurAccountHolder::authenticate(TransactionSkeleton const& _t) -{ - Guard l(x_queued); - m_queued.push(_t); - return h256(); -} - -void OurAccountHolder::doValidations() -{ - Guard l(x_queued); - while (!m_queued.empty()) - { - auto t = m_queued.front(); - m_queued.pop(); - - bool proxy = isProxyAccount(t.from); - if (!proxy && !isRealAccount(t.from)) - { - cwarn << "Trying to send from non-existant account" << t.from; - return; - } - - // TODO: determine gas price. - - if (!validateTransaction(t, proxy)) - return; - - if (proxy) - queueTransaction(t); - else - // sign and submit. - if (Secret s = m_main->retrieveSecret(t.from)) - m_main->ethereum()->submitTransaction(t, s); - } -} - -AddressHash OurAccountHolder::realAccounts() const -{ - return m_main->keyManager().accountsHash(); -} - -bool OurAccountHolder::validateTransaction(TransactionSkeleton const& _t, bool _toProxy) -{ - if (!m_main->doConfirm()) - return true; - - if (_t.creation) - { - // show notice concerning the creation code. TODO: this needs entering into natspec. - return showCreationNotice(_t, _toProxy); - } - - h256 contractCodeHash = m_main->ethereum()->postState().codeHash(_t.to); - if (contractCodeHash == EmptySHA3) - { - // recipient has no code - nothing special about this transaction, show basic value transfer info - return showSendNotice(_t, _toProxy); - } - - string userNotice = m_main->natSpec()->getUserNotice(contractCodeHash, _t.data); - - if (userNotice.empty()) - return showUnknownCallNotice(_t, _toProxy); - - NatspecExpressionEvaluator evaluator; - userNotice = evaluator.evalExpression(QString::fromStdString(userNotice)).toStdString(); - - // otherwise it's a transaction to a contract for which we have the natspec - return showAuthenticationPopup("Contract Transaction", - "ÐApp attempting to conduct contract interaction with " + - m_main->pretty(_t.to) + - ": " + userNotice + ".\n\n" + - (_toProxy ? "This transaction is not executed directly, but forwarded to another ÐApp.\n\n" : "") + - (_t.value > 0 ? - "In addition, ÐApp is attempting to send " + - formatBalance(_t.value) + " to said recipient, with additional network fees of up to " + - formatBalance(_t.gas * _t.gasPrice) + " = " + - formatBalance(_t.value + _t.gas * _t.gasPrice) + "." - : - "Additional network fees are at most" + - formatBalance(_t.gas * _t.gasPrice) + ".") - ); -} diff --git a/alethzero/OurWebThreeStubServer.h b/alethzero/OurWebThreeStubServer.h deleted file mode 100644 index 3e95d41ea..000000000 --- a/alethzero/OurWebThreeStubServer.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file OurWebThreeStubServer.h - * @author Gav Wood - * @date 2014 - */ - -#include -#include -#include -#include -#include -#include -#include - -namespace dev -{ - -namespace az -{ - -class Main; - -class OurAccountHolder: public QObject, public eth::AccountHolder -{ - Q_OBJECT - -public: - OurAccountHolder(Main* _main); - -public slots: - void doValidations(); - -protected: - // easiest to return keyManager.addresses(); - virtual dev::AddressHash realAccounts() const override; - // use web3 to submit a signed transaction to accept - virtual dev::h256 authenticate(dev::eth::TransactionSkeleton const& _t) override; - -private: - bool showAuthenticationPopup(std::string const& _title, std::string const& _text); - bool showCreationNotice(eth::TransactionSkeleton const& _t, bool _toProxy); - bool showSendNotice(eth::TransactionSkeleton const& _t, bool _toProxy); - bool showUnknownCallNotice(eth::TransactionSkeleton const& _t, bool _toProxy); - - bool validateTransaction(eth::TransactionSkeleton const& _t, bool _toProxy); - - std::queue m_queued; - Mutex x_queued; - - Main* m_main; -}; - -class OurWebThreeStubServer: public QObject, public WebThreeStubServer -{ - Q_OBJECT - -public: - OurWebThreeStubServer(jsonrpc::AbstractServerConnector& _conn, Main* main); - - virtual std::string shh_newIdentity() override; - -signals: - void onNewId(QString _s); - -private: - Main* m_main; -}; - -} -} - diff --git a/alethzero/Transact.cpp b/alethzero/Transact.cpp deleted file mode 100644 index 70fe404e5..000000000 --- a/alethzero/Transact.cpp +++ /dev/null @@ -1,631 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Transact.cpp - * @author Gav Wood - * @date 2015 - */ - -// Make sure boost/asio.hpp is included before windows.h. -#include - -#include "Transact.h" - -#include -#include -#include -#include -#include -#include -#include -#if ETH_SOLIDITY || !ETH_TRUE -#include -#include -#include -#include -#endif -#include -#include -#include -#include -#include -#if ETH_SERPENT -#include -#include -#endif -#include "Debugger.h" -#include "ui_Transact.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -Transact::Transact(MainFace* _c, QWidget* _parent): - QDialog(_parent), - ui(new Ui::Transact), - m_main(_c) -{ - ui->setupUi(this); - - resetGasPrice(); - setValueUnits(ui->valueUnits, ui->value, 0); - - on_destination_currentTextChanged(QString()); -} - -Transact::~Transact() -{ - delete ui; -} - -void Transact::setEnvironment(AddressHash const& _accounts, dev::eth::Client* _eth, NatSpecFace* _natSpecDB) -{ - m_accounts = _accounts; - m_ethereum = _eth; - m_natSpecDB = _natSpecDB; - - auto old = ui->from->currentIndex(); - ui->from->clear(); - for (auto const& address: m_accounts) - { - u256 b = ethereum()->balanceAt(address, PendingBlock); - QString s = QString("%2: %1").arg(formatBalance(b).c_str()).arg(QString::fromStdString(m_main->render(address))); - ui->from->addItem(s); - } - updateDestination(); - if (old > -1 && old < ui->from->count()) - ui->from->setCurrentIndex(old); - else if (ui->from->count()) - ui->from->setCurrentIndex(0); -} - -void Transact::resetGasPrice() -{ - setValueUnits(ui->gasPriceUnits, ui->gasPrice, m_main->gasPrice()); -} - -bool Transact::isCreation() const -{ - return ui->destination->currentText().isEmpty() || ui->destination->currentText() == "(Create Contract)"; -} - -u256 Transact::fee() const -{ - return gas() * gasPrice(); -} - -u256 Transact::gas() const -{ - return ui->gas->value() == -1 ? m_upperBound : ui->gas->value(); -} - -u256 Transact::value() const -{ - if (ui->valueUnits->currentIndex() == -1) - return 0; - return ui->value->value() * units()[units().size() - 1 - ui->valueUnits->currentIndex()].first; -} - -u256 Transact::gasPrice() const -{ - if (ui->gasPriceUnits->currentIndex() == -1) - return 0; - return ui->gasPrice->value() * units()[units().size() - 1 - ui->gasPriceUnits->currentIndex()].first; -} - -u256 Transact::total() const -{ - return value() + fee(); -} - -void Transact::updateDestination() -{ - // TODO: should be a Qt model. - ui->destination->clear(); - ui->destination->addItem("(Create Contract)"); - QMultiMap in; - for (Address const& a: m_main->allKnownAddresses()) - in.insert(QString::fromStdString(m_main->toName(a) + " (" + ICAP(a).encoded() + ")"), QString::fromStdString(a.hex())); - for (auto i = in.begin(); i != in.end(); ++i) - ui->destination->addItem(i.key(), i.value()); - -} - -void Transact::updateFee() -{ -// ui->fee->setText(QString("(gas sub-total: %1)").arg(formatBalance(fee()).c_str())); - auto totalReq = total(); - ui->total->setText(QString("Total: %1").arg(formatBalance(totalReq).c_str())); - - bool ok = false; - for (auto const& i: m_accounts) - if (ethereum()->balanceAt(i) >= totalReq) - { - ok = true; - break; - } -// ui->send->setEnabled(ok); - QPalette p = ui->total->palette(); - p.setColor(QPalette::WindowText, QColor(ok ? 0x00 : 0x80, 0x00, 0x00)); - ui->total->setPalette(p); -} - -void Transact::on_destination_currentTextChanged(QString) -{ - if (ui->destination->currentText().size() && ui->destination->currentText() != "(Create Contract)") - { - auto p = toAccount(); - if (p.first) - ui->calculatedName->setText(QString::fromStdString(m_main->render(p.first))); - else - ui->calculatedName->setText("Unknown Address"); - -// ui->calculatedName->setText(m_main->toName(a) + " (" + ICAP(a).encoded() + ")"); - - if (!p.second.empty()) - { - m_data = p.second; - ui->data->setPlainText(QString::fromStdString("0x" + toHex(m_data))); - ui->data->setEnabled(false); - } - else if (!ui->data->isEnabled()) - { - m_data.clear(); - ui->data->setPlainText(""); - ui->data->setEnabled(true); - } - } - else - ui->calculatedName->setText("Create Contract"); - rejigData(); - // updateFee(); -} - -void Transact::on_copyUnsigned_clicked() -{ - auto a = fromAccount(); - u256 nonce = ui->autoNonce->isChecked() ? ethereum()->countAt(a, PendingBlock) : ui->nonce->value(); - - Transaction t; - if (isCreation()) - // If execution is a contract creation, add Natspec to - // a local Natspec LEVELDB - t = Transaction(value(), gasPrice(), gas(), m_data, nonce); - else - // TODO: cache like m_data. - t = Transaction(value(), gasPrice(), gas(), toAccount().first, m_data, nonce); - qApp->clipboard()->setText(QString::fromStdString(toHex(t.rlp()))); -} - -/*static std::string toString(TransactionException _te) -{ - switch (_te) - { - case TransactionException::Unknown: return "Unknown error"; - case TransactionException::InvalidSignature: return "Permanent Abort: Invalid transaction signature"; - case TransactionException::InvalidNonce: return "Transient Abort: Invalid transaction nonce"; - case TransactionException::NotEnoughCash: return "Transient Abort: Not enough cash to pay for transaction"; - case TransactionException::OutOfGasBase: return "Permanent Abort: Not enough gas to consider transaction"; - case TransactionException::BlockGasLimitReached: return "Transient Abort: Gas limit of block reached"; - case TransactionException::BadInstruction: return "VM Error: Attempt to execute invalid instruction"; - case TransactionException::BadJumpDestination: return "VM Error: Attempt to jump to invalid destination"; - case TransactionException::OutOfGas: return "VM Error: Out of gas"; - case TransactionException::OutOfStack: return "VM Error: VM stack limit reached during execution"; - case TransactionException::StackUnderflow: return "VM Error: Stack underflow"; - default:; return std::string(); - } -}*/ - -#if ETH_SOLIDITY -static string getFunctionHashes(dev::solidity::CompilerStack const& _compiler, string const& _contractName) -{ - string ret = ""; - auto const& contract = _compiler.getContractDefinition(_contractName); - auto interfaceFunctions = contract.getInterfaceFunctions(); - - for (auto const& it: interfaceFunctions) - { - ret += it.first.abridged(); - ret += " :"; - ret += it.second->getDeclaration().getName() + "\n"; - } - return ret; -} -#endif - -static tuple, bytes, string> userInputToCode(string const& _user, bool _opt) -{ - string lll; - string solidity; - bytes data; - vector errors; - if (_user.find_first_not_of("1234567890abcdefABCDEF\n\t ") == string::npos && _user.size() % 2 == 0) - { - std::string u = _user; - boost::replace_all_copy(u, "\n", ""); - boost::replace_all_copy(u, "\t", ""); - boost::replace_all_copy(u, " ", ""); - data = fromHex(u); - } -#if ETH_SOLIDITY || !ETH_TRUE - else if (sourceIsSolidity(_user)) - { - dev::solidity::CompilerStack compiler(true); - try - { -// compiler.addSources(dev::solidity::StandardSources); - data = compiler.compile(_user, _opt); - solidity = "

Solidity

"; - solidity += "
var " + compiler.defaultContractName() + " = web3.eth.contract(" + QString::fromStdString(compiler.getInterface()).replace(QRegExp("\\s"), "").toHtmlEscaped().toStdString() + ");
"; - solidity += "
" + QString::fromStdString(compiler.getSolidityInterface()).toHtmlEscaped().toStdString() + "
"; - solidity += "
" + QString::fromStdString(getFunctionHashes(compiler, "")).toHtmlEscaped().toStdString() + "
"; - } - catch (dev::Exception const& exception) - { - ostringstream error; - solidity::SourceReferenceFormatter::printExceptionInformation(error, exception, "Error", compiler); - errors.push_back("Solidity: " + error.str()); - } - catch (...) - { - errors.push_back("Solidity: Uncaught exception"); - } - } -#endif -#if ETH_SERPENT - else if (sourceIsSerpent(_user)) - { - try - { - data = dev::asBytes(::compile(_user)); - } - catch (string const& err) - { - errors.push_back("Serpent " + err); - } - } -#endif - else - { - data = compileLLL(_user, _opt, &errors); - if (errors.empty()) - { - auto asmcode = compileLLLToAsm(_user, _opt); - lll = "

LLL

" + QString::fromStdString(asmcode).toHtmlEscaped().toStdString() + "
"; - } - } - return make_tuple(errors, data, lll + solidity); -} - -string Transact::natspecNotice(Address _to, bytes const& _data) -{ - if (ethereum()->codeAt(_to, PendingBlock).size()) - { - string userNotice = m_natSpecDB->getUserNotice(ethereum()->postState().codeHash(_to), _data); - if (userNotice.empty()) - return "Destination contract unknown."; - else - { - NatspecExpressionEvaluator evaluator; - return evaluator.evalExpression(QString::fromStdString(userNotice)).toStdString(); - } - } - else - return "Destination not a contract."; -} - -pair Transact::toAccount() -{ - pair p; - if (!isCreation()) - { - if (!ui->destination->currentData().isNull() && ui->destination->currentText() == ui->destination->itemText(ui->destination->currentIndex())) - p.first = Address(ui->destination->currentData().toString().trimmed().toStdString()); - else - p = m_main->fromString(ui->destination->currentText().trimmed().toStdString()); - } - return p; -} - -void Transact::timerEvent(QTimerEvent*) -{ - Address from = fromAccount(); - Address to = toAccount().first; - - if (m_upperBound != m_lowerBound) - { - qint64 mid = (m_lowerBound + m_upperBound) / 2; - ExecutionResult er; - if (isCreation()) - er = ethereum()->create(from, value(), m_data, mid, gasPrice(), PendingBlock, FudgeFactor::Lenient); - else - er = ethereum()->call(from, value(), to, m_data, mid, gasPrice(), PendingBlock, FudgeFactor::Lenient); - if (er.excepted == TransactionException::OutOfGas || er.excepted == TransactionException::OutOfGasBase || er.excepted == TransactionException::OutOfGasIntrinsic || er.codeDeposit == CodeDeposit::Failed) - m_lowerBound = m_lowerBound == mid ? m_upperBound : mid; - else - { - m_lastGood = er; - m_upperBound = m_upperBound == mid ? m_lowerBound : mid; - } - - updateBounds(); - } - else - finaliseBounds(); -} - -void Transact::updateBounds() -{ - ui->minGas->setValue(m_lowerBound); - ui->maxGas->setValue(m_upperBound); - double oran = m_startUpperBound - m_startLowerBound; - double nran = m_upperBound - m_lowerBound; - int x = int(log2(oran / nran) * 100.0 / log2(oran * 2)); - ui->progressGas->setValue(x); - ui->progressGas->setVisible(true); - ui->gas->setSpecialValueText(QString("Auto (%1 gas)").arg(m_upperBound)); -} - -void Transact::finaliseBounds() -{ - killTimer(m_gasCalcTimer); - - quint64 baseGas = (quint64)Transaction::gasRequired(m_data, 0); - ui->progressGas->setVisible(false); - - quint64 executionGas = m_upperBound - baseGas; - QString htmlInfo = QString("
INFO Gas required: %1 total = %2 base, %3 exec [%4 refunded later]
").arg(m_upperBound).arg(baseGas).arg(executionGas).arg((qint64)m_lastGood.gasRefunded); - - auto bail = [&](QString he) { - ui->send->setEnabled(false); - ui->code->setHtml(he + htmlInfo + m_dataInfo); - }; - - auto s = fromAccount(); - auto b = ethereum()->balanceAt(s, PendingBlock); - - if (b < value() + baseGas * gasPrice()) - { - // Not enough - bail. - bail("
ERROR Account doesn't contain enough for paying even the basic amount of gas required.
"); - return; - } - if (m_upperBound > m_ethereum->gasLimitRemaining()) - { - // Not enough - bail. - bail("
ERROR Gas remaining in block isn't enough to allow the gas required.
"); - return; - } - if (m_lastGood.excepted != TransactionException::None) - { - bail("
ERROR " + QString::fromStdString(toString(m_lastGood.excepted)) + "
"); - return; - } - if (m_lastGood.codeDeposit == CodeDeposit::Failed) - { - bail("
ERROR Code deposit failed due to insufficient gas; " + QString::fromStdString(toString(m_lastGood.gasForDeposit)) + " GAS < " + QString::fromStdString(toString(m_lastGood.depositSize)) + " bytes * " + QString::fromStdString(toString(c_createDataGas)) + "GAS/byte
"); - return; - } - - updateFee(); - ui->code->setHtml(htmlInfo + m_dataInfo); - ui->send->setEnabled(true); -} - -GasRequirements Transact::determineGasRequirements() -{ - // Determine the minimum amount of gas we need to play... - qint64 baseGas = (qint64)Transaction::gasRequired(m_data, 0); - - Address from = fromAccount(); - Address to = toAccount().first; - ExecutionResult lastGood; - - m_startLowerBound = baseGas; - m_startUpperBound = (qint64)ethereum()->gasLimitRemaining(); - for (unsigned i = 0; i < 30; ++i) - { - qint64 mid = m_startUpperBound; - ExecutionResult er; - if (isCreation()) - er = ethereum()->create(from, value(), m_data, mid, gasPrice(), PendingBlock, FudgeFactor::Lenient); - else - er = ethereum()->call(from, value(), to, m_data, mid, gasPrice(), PendingBlock, FudgeFactor::Lenient); - if (er.excepted == TransactionException::OutOfGas || er.excepted == TransactionException::OutOfGasBase || er.excepted == TransactionException::OutOfGasIntrinsic || er.codeDeposit == CodeDeposit::Failed) - { - m_startLowerBound = mid; - m_startUpperBound *= 2; - } - else - { - // Begin async binary chop for gas calculation.. - m_lastGood = lastGood; - m_lowerBound = m_startLowerBound; - m_upperBound = m_startUpperBound; - killTimer(m_gasCalcTimer); - m_gasCalcTimer = startTimer(0); - return GasRequirements{m_upperBound, baseGas, m_upperBound - baseGas, (qint64)lastGood.gasRefunded, lastGood}; - } - } - return GasRequirements(); -} - -void Transact::rejigData() -{ - if (!ethereum()) - return; - - // Determine how much balance we have to play with... - //findSecret(value() + ethereum()->gasLimitRemaining() * gasPrice()); - auto s = fromAccount(); - if (!s) - return; - - QString htmlInfo; - - auto bail = [&](QString he) { - ui->send->setEnabled(false); - m_dataInfo = he + htmlInfo; - ui->code->setHtml(m_dataInfo); - }; - - // Determine m_info. - if (isCreation()) - { - string info; - vector errors; - tie(errors, m_data, info) = userInputToCode(ui->data->toPlainText().toStdString(), ui->optimize->isChecked()); - if (errors.size()) - { - // Errors determining transaction data (i.e. init code). Bail. - QString htmlErrors; - for (auto const& i: errors) - htmlErrors.append("
ERROR " + QString::fromStdString(i).toHtmlEscaped() + "
"); - bail(htmlErrors); - return; - } - htmlInfo = QString::fromStdString(info) + "

Code

" + QString::fromStdString(disassemble(m_data)).toHtmlEscaped(); - } - else - { - m_data = parseData(ui->data->toPlainText().toStdString()); - htmlInfo = "

Dump

" + QString::fromStdString(dev::memDump(m_data, 8, true)); - } - - htmlInfo += "

Hex

" + QString(ETH_HTML_DIV(ETH_HTML_MONO)) + QString::fromStdString(toHex(m_data)) + ""; - - // Add Natspec information - if (!isCreation()) - htmlInfo = "
INFO " + QString::fromStdString(natspecNotice(toAccount().first, m_data)).toHtmlEscaped() + "
" + htmlInfo; - - determineGasRequirements(); - - m_dataInfo = htmlInfo; - ui->code->setHtml(m_dataInfo); - ui->send->setEnabled(true); -} - -Secret Transact::findSecret(u256 _totalReq) const -{ - if (!ethereum()) - return Secret(); - - Address best; - u256 bestBalance = 0; - for (auto const& i: m_accounts) - { - auto b = ethereum()->balanceAt(i, PendingBlock); - if (b >= _totalReq) - { - best = i; - break; - } - if (b > bestBalance) - bestBalance = b, best = i; - } - return m_main->retrieveSecret(best); -} - -Address Transact::fromAccount() -{ - if (ui->from->currentIndex() < 0 || ui->from->currentIndex() >= (int)m_accounts.size()) - return Address(); - auto it = m_accounts.begin(); - std::advance(it, ui->from->currentIndex()); - return *it; -} - -void Transact::updateNonce() -{ - u256 n = ethereum()->countAt(fromAccount(), PendingBlock); - ui->nonce->setMaximum((unsigned)n); - ui->nonce->setMinimum(0); - ui->nonce->setValue((unsigned)n); -} - -void Transact::on_send_clicked() -{ -// Secret s = findSecret(value() + fee()); - u256 nonce = ui->autoNonce->isChecked() ? ethereum()->countAt(fromAccount(), PendingBlock) : ui->nonce->value(); - auto a = fromAccount(); - auto b = ethereum()->balanceAt(a, PendingBlock); - - if (!a || b < value() + fee()) - { - QMessageBox::critical(nullptr, "Transaction Failed", "Couldn't make transaction: account doesn't contain at least the required amount.", QMessageBox::Ok); - return; - } - - Secret s = m_main->retrieveSecret(a); - if (!s) - return; - - if (isCreation()) - { - // If execution is a contract creation, add Natspec to - // a local Natspec LEVELDB - ethereum()->submitTransaction(s, value(), m_data, gas(), gasPrice(), nonce); -#if ETH_SOLIDITY - string src = ui->data->toPlainText().toStdString(); - if (sourceIsSolidity(src)) - try - { - dev::solidity::CompilerStack compiler(true); - m_data = compiler.compile(src, ui->optimize->isChecked()); - for (string const& s: compiler.getContractNames()) - { - h256 contractHash = compiler.getContractCodeHash(s); - m_natSpecDB->add(contractHash, compiler.getMetadata(s, dev::solidity::DocumentationType::NatspecUser)); - } - } - catch (...) {} -#endif - } - else - // TODO: cache like m_data. - ethereum()->submitTransaction(s, value(), toAccount().first, m_data, gas(), gasPrice(), nonce); - close(); -} - -void Transact::on_debug_clicked() -{ -// Secret s = findSecret(value() + fee()); - Address from = fromAccount(); - auto b = ethereum()->balanceAt(from, PendingBlock); - if (!from || b < value() + fee()) - { - QMessageBox::critical(this, "Transaction Failed", "Couldn't make transaction: account doesn't contain at least the required amount."); - return; - } - - try - { - Block postState(ethereum()->postState()); - Transaction t = isCreation() ? - Transaction(value(), gasPrice(), gas(), m_data, postState.transactionsFrom(from)) : - Transaction(value(), gasPrice(), gas(), toAccount().first, m_data, postState.transactionsFrom(from)); - t.forceSender(from); - Debugger dw(m_main, this); - Executive e(postState, ethereum()->blockChain(), 0); - dw.populate(e, t); - dw.exec(); - } - catch (dev::Exception const& _e) - { - QMessageBox::critical(this, "Transaction Failed", "Couldn't make transaction. Low-level error: " + QString::fromStdString(diagnostic_information(_e))); - // this output is aimed at developers, reconsider using _e.what for more user friendly output. - } -} diff --git a/alethzero/Transact.h b/alethzero/Transact.h deleted file mode 100644 index 723ff07db..000000000 --- a/alethzero/Transact.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Transact.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include "MainFace.h" - -namespace Ui { class Transact; } - -namespace dev -{ - -namespace eth { class Client; } -namespace solidity { class CompilerStack; } - -namespace az -{ - -struct GasRequirements -{ - qint64 neededGas; - qint64 baseGas; - qint64 executionGas; - qint64 refundedGas; - dev::eth::ExecutionResult er; -}; - -class Transact: public QDialog -{ - Q_OBJECT - -public: - explicit Transact(MainFace* _context, QWidget* _parent = 0); - ~Transact(); - - void resetGasPrice(); - void setEnvironment(dev::AddressHash const& _accounts, dev::eth::Client* _eth, NatSpecFace* _natSpecDB); - -private slots: - void on_from_currentIndexChanged(int) { updateNonce(); rejigData(); } - void on_destination_currentTextChanged(QString); - void on_value_valueChanged(int) { updateFee(); rejigData(); } - void on_gas_valueChanged(int) { updateFee(); rejigData(); } - void on_valueUnits_currentIndexChanged(int) { updateFee(); rejigData(); } - void on_gasPriceUnits_currentIndexChanged(int) { updateFee(); rejigData(); } - void on_gasPrice_valueChanged(int) { updateFee(); rejigData(); } - void on_data_textChanged() { rejigData(); } - void on_optimize_clicked() { rejigData(); } - void on_copyUnsigned_clicked(); - void on_send_clicked(); - void on_debug_clicked(); - void on_cancel_clicked() { close(); } - -private: - dev::eth::Client* ethereum() const { return m_ethereum; } - void rejigData(); - void updateNonce(); - void updateBounds(); - void finaliseBounds(); - - dev::Address fromAccount(); - std::pair toAccount(); - void updateDestination(); - void updateFee(); - bool isCreation() const; - dev::u256 fee() const; - dev::u256 gas() const; - dev::u256 total() const; - dev::u256 value() const; - dev::u256 gasPrice() const; - dev::Address to() const; - GasRequirements determineGasRequirements(); - - std::string natspecNotice(dev::Address _to, dev::bytes const& _data); - dev::Secret findSecret(dev::u256 _totalReq) const; - - void timerEvent(QTimerEvent*) override; - - Ui::Transact* ui = nullptr; - - unsigned m_backupGas = 0; - dev::bytes m_data; - - dev::AddressHash m_accounts; - dev::eth::Client* m_ethereum = nullptr; - MainFace* m_main = nullptr; - NatSpecFace* m_natSpecDB = nullptr; - - QString m_dataInfo; - qint64 m_startLowerBound = 0; - qint64 m_startUpperBound = 0; - qint64 m_lowerBound = 0; - qint64 m_upperBound = 0; - eth::ExecutionResult m_lastGood; - int m_gasCalcTimer = 0; -}; - -} -} - diff --git a/alethzero/Transact.ui b/alethzero/Transact.ui deleted file mode 100644 index 94b329842..000000000 --- a/alethzero/Transact.ui +++ /dev/null @@ -1,336 +0,0 @@ - - - Transact - - - - 0 - 0 - 604 - 695 - - - - Transact - - - - - - &Debug - - - - - - - Automatic - - - gas - - - -1 - - - 430000000 - - - -1 - - - - - - - - - - - - - false - - - true - - - - - - - - - - &Optimise - - - true - - - - - - - &Execute - - - false - - - - - - - false - - - - - - - Qt::Vertical - - - - QFrame::NoFrame - - - 0 - - - - - Qt::ClickFocus - - - QFrame::NoFrame - - - 0 - - - true - - - - - - - - - - - 430000000 - - - 0 - - - - - - - Copy &Unsigned - - - - - - - - - - &Gas - - - gas - - - - - - - - 0 - 0 - - - - &To - - - destination - - - - - - - &Cancel - - - Esc - - - - - - - Auto Nonce - - - true - - - false - - - - - - - true - - - - (Create Contract) - - - - - - - - - 0 - 0 - - - - - - - - - - - &Amount - - - value - - - - - - - - 0 - 0 - - - - D&ata - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - data - - - - - - - &From - - - from - - - - - - - @ - - - 0 - - - 430000000 - - - - - - - gas - - - max - - - 450000000 - - - - - - - true - - - gas - - - min - - - 0 - - - 450000000 - - - - - - - - 0 - 0 - - - - 24 - - - Calculating gas... - - - - - - - - - autoNonce - toggled(bool) - nonce - setDisabled(bool) - - - 374 - 196 - - - 451 - 190 - - - - - diff --git a/alethzero/WebPage.cpp b/alethzero/WebPage.cpp deleted file mode 100644 index 34a840568..000000000 --- a/alethzero/WebPage.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file WebPage.cpp - * @author Arkadiy Paronyan arkadiy@ethdev.com> - * @date 2015 - */ - -#include "WebPage.h" -using namespace dev; -using namespace az; - -void WebPage::javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel _level, QString const& _message, int _lineNumber, QString const& _sourceID) -{ - QString prefix = _level == QWebEnginePage::ErrorMessageLevel ? "error" : _level == QWebEnginePage::WarningMessageLevel ? "warning" : ""; - emit consoleMessage(QString("%1(%2:%3):%4").arg(prefix).arg(_sourceID).arg(_lineNumber).arg(_message)); -} diff --git a/alethzero/WebPage.h b/alethzero/WebPage.h deleted file mode 100644 index f2df30663..000000000 --- a/alethzero/WebPage.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file WebPage.h - * @author Arkadiy Paronyan arkadiy@ethdev.com> - * @date 2015 - */ - -#pragma once - -#include -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpedantic" //QtWebEngineWidgets/qwebenginecertificateerror.h:78:348: error: extra ';' -#include -#pragma GCC diagnostic pop - -namespace dev -{ - -namespace az -{ - -class WebPage: public QWebEnginePage -{ - Q_OBJECT - -public: - WebPage(QObject* _parent): QWebEnginePage(_parent) {} - -signals: - void consoleMessage(QString const& _msg); - -protected: - void javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel _level, const QString& _message, int _lineNumber, const QString& _sourceID) override; -}; - -} -} diff --git a/alethzero/alethzero.icns b/alethzero/alethzero.icns deleted file mode 100644 index 105afb3d780caab0272375b08abce9146b9b414f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514931 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
  • c!Gb@F^dIQ_soxZhW`6*AU(qe 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ⅇ(z#Z(ZxKEFJ5Ha~*ZPrNxwFh}?kym@>ZKUlA3Ak62K zj(X^|k|7u@K-C}B$L>nL&$&-cD*s`br5mee%sbOponZNFg=GI|02VTRIj#!^t@UATX5r?EfV zdkC#EV`wGpUCLCRo`t8!Pl@qR+*2|0jY>l^h=LwrN~{yD;xC`0K%36TUAP}mTp;2) zZ-QU%E6Ep$n{8x1Y@132&4KcPEh>6fHp9F8{tnX2>TXwf$y`S)mFjG%|w0ANRFTd zj(IB|GQwIOG-I&}Iy?Kqrrsg8aA9JHbcc&W`a16m9UjF=TQ)*7}cXWYQ{@Zh3R#iLjL2yIzVMmKq z)hU1y9)CYHL;k4Y<4RspiUN{xerBFIQvwntS+~Ujj#|Jrlk`}9g`Yn9>W`NKKa(!R zIBOJm?EGZ+oE{UN1yt7vyr`g0dNC}OnDb#&1UN>6wR51qwkny=l#hMGcv8{u_IDdj z?w6IBke<@lZe&=X1#;I@_9Y=J9xDrh_Z^}fuKIor3p-g<(Rfyas_X?%794ELSi5iY z6Qk@zI~B{`bPB)yVDtH_QOj0qexK~SJ&%+5HRM(0U zR{++~hlceXwEikv%h8}^*6tEf%x5F1IJ!&Je-p@|7|s;MQu~ZH-NKa$o8JaOXG}3+ z^Ndx%=5NwQS^G!@2+f|%r2gCcF-D6@zcfP>6bzM`AyPQOr^Hxwl^L@#%p9wuTbUyf z_I)0i)&3e0{HOze$v4LLHTX4xw~Ow5(}+zF3xWy3Ou~qK&-o*S!?9MDvnu{hW7IaR z?T)#VG@I`7)V)wvDlKcR*@4;2`pcs?7|w3 z&{z_b)Dm;QA#YRj6lO#=9&NEF=gPj!wu`Ki3rG+7Coe=$&x)F>a#+?}K*9d+&CN}3 zwny#_=2S34;sXa5A`VDqJWSIpYJ_v7`mpb_-7p@fm|4edw$x-DK6!iM;eLsxyZC>) zYO4QIC?wvD=z)d8bZ;TjoOS$v*m?`5xY{OKbY>XbgS)#1_W^d>l|0BG~KVXB&)hEHjY&5{AwZdmE zIdRULGz#sXpGE@U0G;~Sv0QCZV@{8fg9rQsVB))%|29rM@sUj4LUfavky}^0h^$pg z`~O&A_RqSULl%=Yom8;mwi1@-FakF!Q{poq9>E1li zoFLAg>c52gPSU8TeB-S)wdelr@xg#5n?vKR1gvVePyggxg>(#zQHk}oygjf)PSNKW9){-Pc&I7CcNJN z_$~_1uZbFA!-{&O3or?d24B?87ZJTy! zJH;PuF00UHXYS}2`Y4>s@%QbHjFWtSBN-p&xc%=O!#-bl2s+w6cTbd;B-{NGU%bMh zpTOc)P^@cYUm|_Ij=0dBA`=B5#9Nf@uq!E=$D#&jU-7k_y{@Eswf^z_Mx1Kbrs)*+ zkwlPESO(W(gFThX0;hsR?wwujCmik}4D0Q2T)yFSB7`GS`9HC;%fR&lR(x`?KUI5(oGhR^Im0i?*Znd>ofjSM}4ff3VZC7Bx@bo@e51_iRq z3EfZQSPq7erH935U&iudMPJE-X)aZmyTjLky{Tw9W4RRFyhrb zZlezUYB=_JS^Um=$qA5P85I;zR1CDuz1Nsk&MH_Rz5s8whdfl0nWdtY9j(ypgjO|T zo?^8Tj*RT#!1(^E$mizLr2F`0yaBUc7j$+KRHlU^I?Ndv^4@NeUVSQv8jzNEhbR5> zzNvCd9O~G@~@}xnot@@K}Ri{0(IU7w20HNY3TXuWjK_M&*jywP3!puz;ZIY3~`tZ zK>9cqG8u!3Jb*39H9a?R#|7*IN28|GYwGc3c>i5u>9>8{nL$gg=4FC)OQTo}xv1iq z1mCAscUHTI_*aDPxXO%s2%BwDpCtBl%lN zDGO6MWw&k{(6()`9NQU()87%jW<2$oV#<5AAsb&dDtnI){}uxpgGwuTiYIV#G^OU(?*(H$mGl2w7ViB1vbw+plvP0m zp+^AZyU2yi!^kR-jCOK2w7KTB-FlsE<>FN|U&R%D7F$riJDnDyTuM7!_RctN6q-Qs zZmVxU3Lmc6kOr9OC=7D16fDE<;BZlAM!65Cv3z^v5dC8^yC3jiy zH%2+F7gGJ?SQ{n)(R$?;S=5BwMaZ6SLfA{$K%YysMNhiyhEyF{cMDW?b+5P&Z5PjJ;b&Db8!D|$2lR`sD+`*RoE zg~@;7)3ZH}=7S!NZp4>Y0u=q9&kO~>)M{C1j?tW?;&g1BB6tS*32-iVzR;SN(8h&> ze4!v|clf_30}VzHzwT@ZD|k&J`~BdmAS#)FonQ#jk@w#X_Tn>bmP&tkmNHZN9Aj{B zI|L(M*enweCHugs^gk7EpiaWson^aPJpTG}A9PI77 zABzO#>oPgsHWqO;{Peo2q*-%*#{>?f3*9FoB}<2-?I~##tmdmdZD54zFm9TDwI;y< zs9iYHN=Rm=vWAN%H6#S)V_<>5Vphoqf^t7m@Bj?(qeT0$4yHeHJDiQbe^j7Ct)EuN zI8XAg?h*+ZC(;IBIM@nH7=3#>Q|JfH_hJ%aQyurs`~S7IRHn-+(`8-gyky1!32Db~ zvZ^rJC#8QM&l0|{cJl-1!52%={mJ%6tQ7_v2kO$U&Xbw34F%PFMS?SCOv!`-;5$6 zaY)FOa))zpx8Wj~4B}k5*{Hjmt0IA3buWVOCO?GGhhoS%o*n+&;X;M*>CflsK|Va; zF04+eKfLy%8j!fA!JqJd&VDx_e;${tHH5!y@wwChH+*os?zv1Io-J!|nbR%w>;}7s z{Ynn3`dcuklc_-53azdlIr8{R2x|tib^s(a`sukKAQ)?8;s*~xAJF>Wp`p0RH$x46TURPjAQEEQ9bCyacjxnLw4gs*YD3e(ufc$)gy;^;d-I42iA|bUdQ;jk@1F$ zT7sF!rEy=MbM{$g#*)WBrd<lk_uJ4iWo_!Au{IEVp3!uy!6((+` zx>ss>^BzgkpQje3lX3yI86qS3H*vK(X-~TP#Ox!)y8eUGa=0~Y;&D9qUTP1uPj#xY zBl?YumeudisdZe6dNb9v7pfL)D6JpBu?haO(TwBTl^%6qs39PA$hR(_t36bhYho&u zs0+|JuY?9V$8Z2@_jzf#pg%OH{w`s($ZW;|tXg>8av?e#60z$=ky*Y%p6$C(s#W%) zK6oDp^|x8?Eu!L}WY1z6+qzZns|$d=tz8x;$GCYlrxlLV0%7qzvB@BpP_7*``ld{a zvNz)ib`(`Yp0M>;sT)c2FKCe4X?U~R?8hqkH46V_DIylGni`30YUEHmt>c`2mOYYQ z*uj|gnXCIP_~Z9`#7iVavCv7|8he82qGa(Wt<2s4>6HgvM!VxAf%QkOuEPKl?I^7p z2@FGSXrLb3k9MhpuR>x;u4uTO!6BLPrsN9J*=1n#e{==kAt)GwVg3!be>6NVqrn#5SOzkFlKu>eNY-p1jZl8g06i*jV>(|n?M=!@xp_ijI~ zVLFO2ugj?1jiz*#6@vbIB92BRlF3?MoK)2vQTRFDgfg$3rSA z$n7b@CRM#YQR|s!5qj3M)|{Krkud=pQcrE}5L$xCUSKhXXx5wiO)Bd&$!p0zb=&)& zhvB_ES}B{bf;Y9P2K20TXMz*{IDK({{p2bIIH>F}#B%oL)Spa`Qa+XfPC}!YG}FttvyYEHSxohWi1jAx)_-B z5iuX$;A9OwZo0gmJ1$|`DBNO&Phvh5*A3xt4)}W0KM)57nTe6HtaoYX44yH&?=7kF z`jY{v4DHvAk*-}#o>g4}zWUqWpHPbyNxk{ieZ!BJYYvn>pxKRX^nKbIEDGvmkzLzm zxJ5)Wx{f&Kh>lewU8%B~EJAt;F~l&$BoshX=bf}ChCpG0sWzWkrH)9TzimPgyh;Uz za~?5@bQ9cvb`d_@elqg7JDz(wPW;`B^4(B^VTHvwfx9}WH_`u#e&$Zo)gSDKNpt5h z)EOh5S)k|7$#7AlM?LbBRh`eijEYZa+dnRo_O8e~{3m%5dakrRnB1d%J*K%jnK{?%Pf~(+yVXrIxGuR+S;a*4@iM} zYl6XoY#+dN?*L<6Ovra|5S#Drgq@8e>A^FbqX@y8tfX<6wyKgA^o!tInkE z#|Bovv)!6C3`7!$IF(S~-gU9G!x;`Fy{EJ0B2By*hmIC{Bf_CE4vmYbAjd(s?$|9M zlt<*n0Bcx%bqS>o^dbpi5mM@iD+RH+QM$tzXoewoOav>7iSsz0BZ7TK+FM`7INP6B1Lf|lWZBHG*a0cMG??NYkDj+S;p?ji0@9F+9Hl)aL ztM1tsJmVMP$q0WS109RCSK;-u%2M0sx5^C;h2On54Zfa~0cOriu2|H+M zmEf7DMo;g;U)TBBBX95DNtVM(2cB$+u7QCaQRrN7ZvYW*Gym>E%t(X~_#z;!Fi639 zvqjP~v&5iRA)Zxg_m0Gg{CljKimZwRC`tTIR7k>uc#0~7%A86jOFuy7BD{~vK<>0C z6>{4i{H-_`ScvJaA$Q3%C}~6dYbq7ct;@>zP7k5K?oojh`SaJhc@*-ipk}^krU|dh zUkNAH*NUxg7tGeo-=vLGvlSwC09pXnyg(#F(+Nowgf-I6<3bK39C6Asgo)`()N6a# z_aH(15dBOy>2|E4{cSSK;_aB+gjkAzJYa`rK7fCjq|Ofp%pPs#NZKx;1$td$S5=^l*o&KMQfR&Pwk6+g@MynK~wqLwqBz z%zm0eot^UoLP-FhrC*D~?dNXkA@ycBnlnba$_s#ey2l;O>Y)l*w0E`U*{*EHi3HxN5Cu?eQ3S|&`=W=gng01Y?Ya?8Ef380*gYKJY!m%_lWr;1f` zmF`>XM%i)oZYj>p79l(6Q%bPeHsIQhH@FH~i^5&gIdUK7XzA*EEt~v7J3NlX(In^> zaMnc%nv6Qe^(E=8H$Td$-p0?h9LxD^4mBhw5nrMH;D-@36CXA^JF6^}qBCCP=oK)UA#v-0?VV};nc1QpY{XfA2Zy^@*y7g2424$SV0yDwEKb7v(ennc z!2M)h^vlV^yFeQ*gNnHjBq694>k0*V@HV$*!P{oIyApi~(`n)BTLe5P)9VV%eMuf< zWteb^%oOf`@MSpGH-{(gv&Ij$_c@PDXZ^|3x2Er6IxJ{Q_?&-ZK!1bqZKhb8=`op= zRJG)A_}Zw`Q_e6l|C2Y2V*tj37x^|K*nEgwUP3KIh@N#Q%!oiSOUe+;5OwG`gNeIt z4yfaLw7Yl&w#fu7`Z8s*o)CQJ_S=W;<(fpUQ{vF1nGpdCtV|Jq!!nhrcXEKZ7;Fq9 zsz)1+7(wcrKpN z2Bq^o(%FtnpPiZ2IG2y65MVF9`aab{lg5B+Q+&gD95HGlWh?J~yp+^3Uzf@0H zXDMqC$Xv^yBhv{GIh7=YvWS`>K|zxqxZHqiJrsPDJ7bcB;2+8PuTGFZai>E$JMcMo z;}<%r^XASSvcxlWs#vP~r-K0DVnh(7+=49}x~;2i;~9?FN) zt?)QV;gQ)_79137*uQD)hX7w7+B1A>O)h)l*5z~%0;5weg#P~AiFxo}xm`sEUBInI z>T5&~f)>8r&2lt%97oMt2+YIsn53(aGY1q!-;Gvd=4P2m19icY`okuHy4I|n(@sk{ ze}GA6ziK(lhPl{G#8-!p6lhivff8h5`5CV$BaBT?0`+u1^q&-0MNqH*s4(>OP?a4# zuD9!ekNs1*-8a@+x|l8Pby(>f%#@t?01uHg(-=8IaC9+kzYFx)Ov$fMus?D>oKSh5U`8l=b7W5XsP_dy85`NmOLNX zGAPy%{(3c*{Wc05%0YN{O3Kmq6ERaZX)0aAG$bS5NCY%4=U~3OMZLoA_w>4It_-T( zetHp3(_zEyL{)fNYx)=ax1%04tdJ3ggUKBaAik`WS zl=Ip6-u_)^P^VpV=jRpigHIQ~X2NkmyJl5asU}$Ahea0Odmd7Miw*#YnZKUtu@i&U zrnBJn@^2@;9t$}86bh2&Kw%bSMhPfGx{GBX6j!}(>x{lf<5POMs&YiGNV=FWpuLkGzdy*TLFHg3}(tx@X`JOWhd2KwPP3 z9!!_86BZeTc0SyGl2;5X(+xLeW)Khpk!1gpcqJZ6!i?b$<2&lN!44v~zPIYh>Uwel zrP`2~oUwVcD+K=&&RXN$aj`UG2?f9p7acw%-Gc*rW!8vqIDyo3f5iO4`p<5-WI*@t zab%057ffA7Xv0as*|*39G731Yr=Lj;-jA;Y-3VQi$bWS<%Do8Z_@ib)gEE9<;IxCkKziLa9-s!^}<&beQ2GX)aD$i;MG$n#UVxtc< zz-*fisVsk`RpbtTC5-a=$CUOs_=^7sBu74I2`T_0wjAqw^fr$>zv7)$f(nNF*3v+@ z{%4X$4vxKP6h5$Ym}weT7b#lq#N;~ zh19-pk%iNIv0>qbq<+a3d3Lfq?V(WUAEXJcD${U>@$2B&BQH#A3Nab~qMC^7XKs=L zIsnVMFZA5E*ZJ~^MlxfsU=U|jff)7UVNv}B-}z2aSZd%!!UXRj(VsUFYbQ;fmcY?R z+{5wky$*z{_9!cqE&%`2?fxf}fKTk>Q^GwNwa6U6lo-k3zZM)X-;5Ku(S|Ed^sI34 zL*t|1cZ@Xz<;Ch*zgF|ZuLxgP+1_=Ga0p@83CjXuZh#cvOQAo}NF+z; zx@Z=|LFiWPr>Adaa7sby0y{hpCjvoov&#Rk7XT^Pz2_qE!^)ZX;(@soqHwZ%(KN8= zP`R3ZQ}hmgEzpbHja&fA0dpR&EXvUDS;MQEJjS?j)muulSW3C8(;GH8DWI@AzhU zM2A_D9vqMOO3RIt?P)YUb(QY;Y{$AGwLjtP`p22ml^;FO*Q)AaMt-4Co-uo7Z^R?z zYW4DvFhl{HWRsPycAa66PT}D-4mEbgr>AM5<+KGPJcVw`f`G7xw1$eVQL4SCYV=YZ zj;E^I#i~agi^qw@pl_=o^w9KyDjhrjH@)3dx5_gPw;(l!-{Jswi%m?)2EZ~=*Bqz#$Yt}RRM??FkxW)fu^@(8kPUFyiB)8LvZRy%Lu>iwI?RSb|!ZB97g&iH$ zp991fGkl%5&YSgCr#XETfEZJ8mUdr`MfGsG3ikRcw+ZW+RqI3-7fF+l&DdA3Aw-UF zk0=ySKNzSEAWxvuka&Y51cj~>CVx*?rlVpHJqn%k>u`~sd)gA3G{qdFdHkMcv14Gv zbGx~+yxQ@rt?|L1=g+YzhL!u)Z}$9t;l)euDsDc^Vb{*j+^L!txFrh%2;&LM@G6rc z%J68m%fn5pIv(R0(*v`otIgxMNjus+{Sj^q&_&;1j<5A4X>6+ zr~&_|#;@A>j{)TPRTCWfR7?Dg*_Ks1;y~e=ir6LP$EEULeDMd_DrOKmM+aU&9fE|>klq% zV~EO)JGnwvksr&1-ND$u&n%PW1?S+0SOIFKy1Pj8Zg2eroLXb;4RS2>Tp7ZrnQKM@ zftqFgiNp9e&s2}k-+AhxIi;UC>k|UROL(S85+7L_YVYyhaGMlNuiYtf0P1*e?LYmw zzM#ILn_Y!Ehob?|V0;H%vGRRcNRqwT!S>+q1FmaBv94+|w_V1x2rn%?)!t&gyYD2!Z4D?(FmU0{B$C!k=WD6{)bY;Hr7 zAw`L4$DaM>(v3VId%Zs&8SoSNT|FuF^uU#IGR54P%4i)?L#}lX#`6aO@wO&BZE>Ln-arLBIQ24%g)#$T@37gkJZN#%MpC!9 z>bt|9TQtsr?E8NcONT&{< z9rWWNA_!U&wuY&nTf524hC=~C z?sF0VQ0|MajC*h2yn}v%IUN-Ys9vb?WAx{Pvtb>@jkX>BDW6_uN9UX4X~KfM2!T)5jeuAE9Cf1zyw1}LoH@hxIE3? zc4nhG@S5ovXCF$?wDc#`PXMaXQ?0oh>-2S(!&-%pnp zUiTbLEc?E7c~It3ts_l{=LhYb(0WM*@D|MYuP~iy$r(2xJ)xS{^tk`T3?94<$y<{{ z*l~b#Mp69-Tr5BZ1$tNywj3d@*spbbHaT)8>#NEu;1!~T^2=wEbAdChBKwroMnPBR zU34pgGsM!)@`pI~FmIdRblH-eBxuhls8A4qmynS~6I=2h?jfxv^bRO=!8{I##WtS;VW#X|#ZqR33*^4q^Q zr7l61l0>#Wb?5o%ekp_S>DZ$rturAmiS8v)3cMuB`Nza_njpZ`18rEx zQAO+DFscQJf{+~2lWjywpN_%ZT03=J8_sasqWQIGd1wZyCr zhk*d7Fbwmv#;$*15y(~v4;&k1t6SDmbfoz-ndYmMKL1_khd zu~lLy-A*2@7beqxrYQ_mUzJDKqu4yJ(_`BU`qnRsC&l!Wnbx^5whC66kT;EzgQf+Z zvSj^}SZHeqz_CIvzwJ6CyS1H~TNVKHdk68vPM@^gh`<=_$)$e|l%&Iu+$`BOmQH z@UEQWQFTcMMuG)1S*4yT{RC6mw-R+~)B-^Q5SW2qmsBmzcO;e`yBuo2DI$r6AXdl2F&1j_gkj6KSNIU>Iiix^lgpgy5#M5 zk}_gI96&b~ml4{Gd2Qj1p%&Hoi9V^MX2lt+lrrdt?e`P4)VfkOUm}}vx$M~l$(bN3 zB!9C3Qah6N;2ua!wioF{(eN-)n3u%g55~q;UY#?v=}Tj^T{<>KuIuyHIq&57B%6Yy zL7H%!d@w2&`~DPJl^KxvMCz>d6942c59tg^ZLOj{1%n9YLf)JHvQM5|`8cs_^r?Z6 z)3&8C9}}J9%QX9!@HgeeD_PNv4l)~+knxXxMU)Ix2nY+o28PJ90Z!P=AixDi?sO7C zSOYmy+&dpe(2!cg$(PEq*Cwe+BvE_Snr1VMO%o+1%Jml7h`OIl4#QUpI5)!oj9hkR zuVLq8Sv*}EJ{6ry_`SXj|6Hx52*!GpJby2K5gs4)(tE=I+s<(9Br~O@_3kIVnop$y z{NV1F3P$CC4(SC&0K8*qT(SdO0nA2`w*YXQ)N249zsv0BSWO ztn$qMFAmSqE%MrEz+CVr1q=Mw)IY+IkU(vwqVC;nkIiLD(^VO(%(-V2%zzYpCp)pF zCujJE`c%1*TJiw)CS2U!30}ITNQ`ZchzDWk-P$oCTUt{996u|rUgqDt<+YQHlu<$>8QWuG;n41j(W%_R!B`V3?Fy+-_Gj)$bD$8O2xNJ%$ z`6uiemt(C2EDh%lx-ME#)3Nr4g7W}uU3Dr;Ow(c7ug#b!_8f2hdwKBaxD^NfhAWRY zvJw;Q$UOTKUIrsTSZ}LCsHT8wr}6|$O^@kLSK*+};tx+W7j*v!4{cAMi*%T7?Y6jv zoL0*l+Qoh$0MFN?HL7Z#YB! zZ=-aK^oa9+`s}Q<`513VFe3ZbsBozK2b=PuUSQL)Bapa{08A#N(>68fbx|M@p`QipYC0kvG5aHG6oUL&)T?Gur9JUYjgJGQiz@O{_M+E zzl45*11!$wa5lz=&|S;7*0_@=`x_)b!4Dt{3-r=b2~~^@>A&oW2X;$C-_LawUdD>$ zB*vyhv$7a2WS06jy(vI~vH^-jBk$nYNphYm`&4F6k`=_ADy1}AxS=*x;b#m&()8zjo(+TETRunVjTmBj}Dq|&IJ;AdPA zJ3rqsY>BF{gT8YaUnkHvFJ*dd5lQ9Uv^emq#%wH2N52Lu@Td*yr^U24xgBt20rS&! zzuwE+g^7EN34r=w9yHKOsgJQpEvdQ2>XwOMd>a)mZP*VG)^0dTZ3r7q)B~RN^%oJ?Jb}f@v9gPDMAt-P7S0lAFX8y>r~iQOhS>L6|>Og=u)#yyqXLV z3*k48M^3Q>K7bibO+;=F|H1+1gT9`Z#oR^RT+dg-LIam4NvM+sAf#JGXj9{^9=HYO3P(SJmW&ilPbju(qf~ zTGge)A}@WJ0JrEtmLQdJ8hS$W*#1TPRydeGf`ru5PynxOt#TX#ruLKC4ubJom;L() zG2TN?9Hs@}!!zzxT-iI5=p1@UjPe>67OAXR|NN14|EGTBVr|~G>HkD_c#h4ZadLt! zFhQn^*n}xA)?uM|a{M3LpQHZl zn8S}mgXA$@-nE)a$>^qsPV)CV&`9VI!2Ga&Y_aP%|Dv7o8{w?l!iB0x=X{1qYY(2k zcex`1Fwz*0-Ru6I0PmfpW)+0`Ap3p;=t00c`6*$P?60O$e^P6{;AY}@PU@t6bj>C* zrDx4|CYUTq8U2~`R`JoKZnp)y%P4rJH)su8ipu6mT=Uvx4X_rtC;OoT@gU%f@b}1| zw-(tWPm+3{-@jci!V0^^yH5*EHh!6Kg3pqn1u_jFShC4-VGXQZxeXk6+84<7R^))5 zU&oQQpsHsDv1%4Gv*}tRF=LA%C?TW)6Y)aqpc)EnT?v~JZ%P%bX;o}JEB=rx4i#Lp z)eJo0Ek=MlK?TzFavGdHH{qF78GWHBns(5G4~!@656@FA&s{Tf0SBSwniphp(`SC; zZV2?bSJCvW$x6JfRW&uvQgh2~$k-06asjM_B~&2MsTa1lOG}Lg&3jlJOwUpREBFrH zIqjLG9;o&?a?~YrE@%r`=>h5Ay}9@#qDA;C&(zh-ac8AJLFiXp`^fG=lf^>)Qucwq z3R%In-#~@Jyv$kh2l4_nT-e|iGh3qb8FKd!9-|o@>q>YT`?PLX^tdMM>xmngoF59T zu$&z>zn&lNM^4vF^_$HJlQ4j%Tj)2Ie964dsU7&o!G1KiZjbQ`uWH>yDNc<)x&4z- z&y`bpqeBXqV9)5~3nyj%Q&fY)8jrB19a73m55Pyi19A(}%0r!NKaL2qp+Nb%qyVT0 zKT(Q{OjJ@cIFp0Le!A8V`zq-*qC;Fnh2Q#;zxf*G z=XLnQ_L!)0AgF??6IH=$48E^Y)kQ>!84CmI3{-&0k)Aa(m;=|WbsvyV=a;ryVxipFHbUFaL z%PT{D(FXgawFduA85|)60jx3Sl=b4$?X4k;ERd+V=SZ|BSP~UlI^y#2BVv~^17=7z zwhqfSx=9K&Y~)(k6emo+t614qOF5gE;Fl(9F>3mXoiE`WQyq&Ffdn8l$5vC2_pA(i z-qLUtBHrj}X%}?c`KwU?*EhXFQZVm$ zdC2X`)6LvZ<#+jw8KAQJYmIxhA(b4INKjh^=b!)P};PwflQ zc!sry7>wJ*vpnAF78Jcmj{2Vw%&s5yR24TeLAZ+miRWERc7K z&qH%%W1eWr(81CPM5l&=bOIRns=gX7HNB+j>o<8kn5}0-gJI%`Dr;> z7@*F)Yi2?x>*bz)9iOEk$1zz087TA2hd_itwtp4dA`Oe^WcHe1=J2#&HK@$uSdA$} zF)UpVwy&M48iuOLneaLQW!OeQG%9(4IcLk=uyKB@4&zG*)?i4IN2@im%szW{km{88KKHa)*H0D60lpqNYBn{XX60aUf zI7is)PN(qzB$YWBoq?p3Vl2qHASu0jf@!owulR8xVW(2ADTI19YrR;Dkn=)(X0`|~P5B)CO;o5z(iS)e z9`n=poNwF6Nmc#MgVH`7gwOfK9TZAu+D*Bxcg9DNo3U+o)Z5|?6A zekhWC9@}&2#-28BR8OSATDBO!dNXH7D{aym;wnHq)Pb*zWcB$o0eUy@uDY%`+W#`B zHO)%~z494c%=`o%AX(tenXUe0FYxXP>+msoBOT??W8g$-%G%M7+#bd--WM>GSNWXB z?ArpnSoNB_ER&_bOBJ*yLj!l`4ra{;tQ6lCm~lKpuG{+sO97f;slPk(U#Yxqrh1TZy&ph(kKz<(o{BQEiT{R=|V^Ei9|YQ!Sw_g0sUXrTLkIIY9NP@ zKEFeodfB{L?4CJyUXRv)Y8oFHYs@juN?a}7wxZlze&h?iOq_+=QUOl^w-i9+H*RTF zwlDuBh(_n_H?$azw`?qU&~xhIT--azgz)ZHk>AHKfG_y4b&ze($~pSbPdU>kK&6yS$w<6}Id z{Cr41iGbM^Ux7g9_EUD!dKm!v*d5pMXpC4SaM+fa{iTq&1NI{hHN+q|8SGy>GlW*+b)Luj2rF`bjN_ z%Qpu6L^{~-Igv9WygWz9)-*zj2T;hFGY|x!4Le8^rJF@jv~2)@E~(R1g6c|Jp#Afa zF&BS#l?(qk(#6khTbpDuJyStfaj~uN<*bgo*~<7clhd>B#w*!706g?45d1O}9ypft zh5g%hq_mzWN|_909P++Sb{qSVswcV=dL-Dr{hPnrAw!jSw6^M89Kjok&nK}MxzS}? zIcFFQg7yeA4=c_gZ-o*3!Ze+2{94J$rqOablNs1=%v}B`W3yvb&f>kHgTVy$I!*fe zfZL^7iIVn|I)RPS!8*6I!{yw<)WykA_Js3XIk%z6v>ukwTctNf3Xn{aPB(2uc?@^h-j_I#GB*WC*` z@0N|<;(~Dc@i-dflwgg?L>oT87U!sTdE3g-3gm|E?l0OmM)hNt!<-J7>Co=DiQlS# z;@7-7fs?Eu;6CHg^#a+-RN zU2@;DO1u<$YvV_0Gu3{ZlzuH2WCEJs$^FNn+Id09iWBYZu?cXndN|~j{GOxekL`Nl z96?=Wv2$FxjYf@C5Mbn#(EN$K;seQ!4>LGr2@yeZrsQmU4|x`IBAdQpk-BVX~he&+a46+ zUmI#Es>m~06`eZ>KJyG-Oz=GAj;vcAR;WNNPr9{IdOZ zV=l9SEAUO(f~XPAhR*BwvRDktR}zn5QT0~($#ygiRBr)j54tG><6%iuu>>Q#<7rxv zc;)PJXrkO&#N-PVh6L->vL-gBC@1|QbT39z z<7HQIfyo7l)E6ETgo0DZaUucvmHlFI+`vEG9J}eEd?1lQn#w$_TGuBNtRh#8xQ?I4 zr?)+?=kx4HVO1YBWWVy^@DHQ;aeW9PH20`nGW`G%N1A(hLiXvaYFe@Op{SMoLN;!j zqQbr7U9mH7BshFHo!sU}>PJ-7i6`lWWkRR?BJI6;3GTNY$*l*9(%I`uoj)>!T?*|N zfALnV`Yl#`!^>w-y&{ou7ITK)u4Y=)sG^f z0aOCGhXzQpl^v*A2#bGsb7}5m?k##Sw+BQ})PXT@pxOYz z`FSa8Ks>TEuB1FLy5Dc?;IPN+kX2S%8OhcoxZjLwS=?I*hcmIcOOO@=t6vG#T8Oi~ zZEOD6*U{hobtEG@iBcnszjCI{j`S|mB02Pg%!CfZ-p8j*nepe&ub8>*?QyH%HhG8A z`k;gDaAwB;C}u!J>m8~L{FpY=sr+|U2_BTwRjdB9bfVzC$AGEPZAiXsUbvdPpq%ZB z^Z}D>GVP@Lxy`q}6KuMpjep(Y?4xFl`sECZ?#Zrm$7zKWP!j2%BKRsp>Y~jxL4QC; z-@4Yn5Fv(Zw?XC`G8n#KCPwsWdxdEjSqVU#L>Q)Sx@pZz=lv5UB^4px2?NY;FV=9? zQDLW7$lU{v3JWq&pe$Hz2RrEvk6(Er2LTgFAXe&56Q&|T79(jWp#cXuc)B`u90&CJlCq%;x& z64DYP9nv7(El79g%rkh-?|eW1hc~>v*<8EU+Iww<1}(m7&QSl4AXlYF7>G?>&=#gX zJ(T_ix;Py~8M-)Jz&A z)fxO3er9}tpCj(HPSROPp(9nDKEsDuQ$w!u!_V-xHGOy6VuTYm0XuwwT2b`G2|=yUM8MzF`o(Yl z3o6=*D~Xowv!shB{V{)IC_>>}R%+;Km^{U94{G!nNf7ss6<4+fZ zLR2|5m2d8(VN0=kUP;l2&$~-}Fl3>eSr#{jKR;5Uz<}v+c61%9Ex}i>a)G-S$%_~! z8^_~}`S%%n9~7ywqc3Rhj+bl^mlypnS~^gPOrH#v3C~|{s?TRbZT%pOUIJks-9WL( ztA@w2FP;NlO-)Yy-Qw3_B-qtpT+u7WZ#JbEq2}m+rd&isxbArG+q#xRzL?o2gR$V| zD29^hL6Y2ZQD2yrYE|3U6bTEWG8e!TYwy3YB61Ppc^*BY=go{2b}9*bRGa+H*WULF zqu-kZMSMNfkaes{-dtqf#_`{p?UJ38L6Xf#6F~vGuYi}KA{$1&v)s{fA6*!nKYMp+SaUYpTbj?4xXpS zlnHLVOi9r|X7|`oFMKB=%R z?v)oC7&ru2Ou=lyT!-`OuAKuDiQ75uhvBUS?gu>sGGJ}N^xYrt3BWez!K^?tW$zrj zvBda=DDO#UGaV0X1R}L!s|V%))HpC)MJckQ-oAWAol4IrBY|N{L1=X9wa0{`7Tx$T z`hXB`7bYkwINUKI?piqz9G-j=vuPcN{cCR`q~r*QXv+!Jt(Gz;z=ZJABct*4=J?ag zpe7nqxU`Mr6E)GO$}@i5Jf2uX*YxZq3Gg|gq`T)6Xd%g9^f}5v7KFyiEE(e~!$jiX zYhvp9H=UUkqme;~6V-3N)0NqeUaQ&+SB*KCKl_zmT>i!0ezRebPYq0whFal$BsCGR zkC#BePbT%1HYn-A-Mxh$($c_nW3O?hISP+y(-!VpCiVcfq+jD``t{?JtLF54n*ph$ zwJ=?~hnBhef7Tjs68n8=-g@Vx44Tw?N#A^WPUs#CTM?eS;ZPh^K^i zL>R?vj_&(<;sZM&ffgkO9VY>il$kJ-EdI}AhPQZ_XuWp#t6FI0-*48~zoJisIp`3^ z#K3k8Cx4_km^9OxHChG8`O3}Yq^Q>;t(%SrC9U_F+B!REjUM$5)8EQI|8m<#fUU=T8G=if@oBH<)3u^|~KR6=Zl zzT!7gMLEkaYC=*t9|K;AUq824`dWJ4YSxsSY7*+DqprxHPXS4fK5K=Kwt3Nf-~6$Z zmUi%4BOdSjXCQ~y+f{4ZG~Hbh|>h;tLl*-x6bC-Zfb=NiK{4&qa@|cBtU6C zUl8&hZ37<=l%45@nc~tuGlLXfm}!FDTcE`8&qk4;4-d|PJ=>e?kWcayMB>3Q} zh;~Kb)pV__Y;`9WkC`l1ZpoG({s0qKsgm5#faZCUcg=(IUp+@mLmfHw_WDS#^vFWg zKoqfPDSd3h)BA(mI}ML=UlT@D7uOo&I`OHnt{q<}eq0Tf{JGZW=jV6nTw0;%0e5+x z!S6KeE*gXR`op@{#75rOQ;a7hw^3B>uoe=O?{`~H{h;G^t2lF$_OBAZe|!x-xhw1r zT1bubSMU9ezq(X&Y+re{n;z^4!}BJg8pH|#7u+kdGfnUX&ET)Lj&a0^u8pjV^YXZ* zX0`nYuE-TZi17bY?i(;2oi%Chbmj}$G2=5Qp|@nKSbajGkud;7WDxSOK<5U9;P6)v z8=FB+6h!(DU{8s(=L+>u$L-6E+8dz(&dM0wsL2GB#G`6{>;$Z|OKz06>+3ob0LZ@X z1!GSglkkBa?2l}w(&&0*zBS)(`kvQ-=$cP%uo4IhZC@D=AT29I%j?Ioq&-jH>SfSs zx$ft*ty6Gwx7=^1L_f6r953^iZ?JkuT#s+1*F80ukp}y0vn2w2r%p<-2{x94xWJ#; z7SouyY1B0>&^62bj(mCvlq z+OkI0j#;gr9z}g+FNp9v+N&@-IQARG*M58&{4KZz+dS61-}X)d1E0vE)Oy3Z zvD&e=-?J;(W%}eqM_dq^s?C$0!`%l7WNPn7H8c0Ad2JE zkm{*gKCm45!;_!{;QU+c`|mNxSlAs!-&vpG+_aFaZj#?Gc*l^Z&zGaKr3n`O)$q!|6U z)JVQ42FxR~_Bukb_u2Yw#fQymUR7XA{{W3r92{GTucY@f`$|G_Ua`|meB353)*%eC z)xjaCXt&b2?-qhIx#-M44x8|`qmGQUT!3Qql8TzWl0b z`?j*ET*tpiOq7?UCJx)Ycru+LF-#n<^L%mDwO+gd)}z>2chPbkg?#wa-O8xBhHHM) z{|ScpGREnk7&_}u-JZRG^a6XxQ$rG||G&%QAfa!IR__IMKbM)#7RHvp`Jsbf%Eh_n z*3?X;ej&kK4Wk=7gV9yn)kn2ds@e@nCk*;HD^0`8orH;DPL;Sd8Y2xr3<^Vl3JXk| zcM+cT3G-t+#Zg8Z_2`?R03-3ZXPAxzX0)trD4A#=b?UNb1woGQmVS9FaY@MREGVNW5$@m-8O2I((3+ zW2^`v_QHne`<37xhQpOet;w|vf>lV5jxmS?o%p1D`nYE5b%J%Lsf&H}DBJUcQt-9X z{J6v}-pxk~uwTHtKV*h^lbM*5fe~y-+?tkoZ2Jm&>CuX2OS;M=yVGUIqU$Lss}E3* z-vdo@h?=p$jB#gBmSQKouqa$e1%DN!?DO2d%jLCCFArjM;*gD@Q9%2z12ep;CIgBSRwKPPf< zixN@Dk?nLHx-uZE9sKq0^^TRIY<({V`X4Sj{gb=WF!tWhlh}hIi>=^0ERVnFvq}wc z_@s$|;<&!xOI?@{w2b`}e#CKwW8}Ig8-SaOfw%yMhw?cjkd}=2JYC{XF|t<8%?}Sp zzjoa0L6LTYQL8p{^lto);t_jD>acJYnQZT}!0*wpx^kjh^_HvO$Tt_ZL$jQ=A~qNJ z4ar>AX+y67sPpq=Thj6tkw))TX+9W^FW6=C=6tu4?2d%53DLd!qd$}eG;ImxL2V37 zD;7=Gte(u9u~r%ISLvoOwBAJY5yxPQER4rg4);^fy$@cUb@}jA3k{c#p97gl4Fe-IpAi^T zjT!92_>DNkTbmR=fsc9r`6S2hbMPRH0LD#53!jk*ZC?)@L0Ku|euMGG7(11ag|)-{ zm97!4yR7$|WjW^MUTgf`zi}6_TtWv8K3jKTw+kp>l$!7g7NeoB8?;enr+0YwJlg`xsU{Cf>*Yp$f`Vy@o!2aV65Tbgfl`EQvm5b*^}p`b{ZKsYmdSS1+QSK$M<;{j>A6tF|(C6P6HWLT#b=4 zvScqsk#T!GzfoEV^uA~!=p#p=vWQ+$Xd8*U2N`#YyA#ZG`G`DUnT^|}nAVi0)5WAe z;{QxH!;pNuR>iT2-i+!FV_KzqeOt^%pWS)6L23MWZ<d>-Wh#0+L7h&Db-lHd98fd#!qE+4)7c-~sjL1>bGMqUM<&bBlJ^5wUSX&J_WB@y)e!l1(c(p7@~p(N9PPVS zHi}yBM=uVh1*wv|xSAY$&kjAB74nRe?y5}^?8h8Q0*gXUg8JU$*Gf0_WVG`EhbUp> zsVeP|@TUuA&qQb;yB6XSsi*BM+AziLK#UvL{cwh#3a~&jhWpAh{$F&8EZi^-5dHPz z^y|J2*P89r^>@8-|8V{faUqZqrN~czf4+}U{@$n@^>H3V^(z_?TGw;pxqf^+V&Z;x z>NO1Ki=5(|05!^@JP%;tLMut*wdu1FPl;GL0^^v1u=SB0{FJLto%V>1kus7GL>Q)D%ujVhPdqPvPr`g_i z4m)k`*zvV|Xt}JaOr$Tt^cRh(XM2E!O~nwLfcG)^z#|kWI}-EMEBY%wl@a5r%%e}v z-nLpQwo`5yMsYpn*tr&BOSg^!O}D>XE3Z@L1to8(?^y>12BfJ|#J{f&H7MQLuG)O6 zfa3-$7KMU8iB6y;2ipXG0e}~6g^6btrAk8OWA3rfLIOyM6z-VHZj>y|De*`ES0vX_ z^eDg^cu5L=HGRC)6l;%kF-a1|UWCT-NT%iQe#bxkEFb-mT2wwy$5+j7mVrxN!<+-cBaT8kaoL z!f#g*$JGcJoU;_+74o>JM`;e@Y%S-zjXhde6rG0q_y5!*3%kS~%{cT-L2Zwo!=0Gd*6D5q>9m@Wz?IMy_tQRkWKSpb}#4d~_YR?MS7uNuid)VvF|K+O@0(wJ# zy^^Gs%t&-ovt>QW6&%7ERdn|`cc{V3zI?( zNV=;$z4E>^O^H|089<)MG*x31xi{?FyxE`^ZDtP??e;h@RYR@kTf)DJUxj^Pqvf_> z(_@|sJJKwHDa@S745%!PowFg%vNMEfSn@{HdVlhB#q#!a`?F(S*lNAxS!3Yfa7jS$ z;Nv&q`5)E z%69*;g8rlQTX8|xCB>+~vZ!UnYiaa55HUb-7auG2<0>OL+DfVNN>&}T1mZjrsShOu zg)p`=zd7I4V@`AMRG>I?12O?SMon2lsWEiM z2m)X{r;APjDM^U8umxfPqKI()f~Mtr`9@8iCn*-NoU;kM>tU=(e$$l|B3g=jpG)ZMNa}9_%W7-eN-P z(+(!6jYOhu4bfbH7yZo(ANmK650rT*0v-iDiIpJ4h@;fp=Kt>Vz414y#Z`fY7ueDu zvpRI+*B>QRV$Cq)BN+H);=Sft-v!fI^p4+kw=bN&}ZO_5L%M>Nvt4*C9|xZ=Ikv>z|V z(Q?7O!I~5)AK`}ZfP}`>MpmddJV>wrFW~E~g^_+u;zV|oZ}Pov4V_1lRm0S?qmDD5 zWeT*V5A(XFGNluiywBktoDf>`;>A~Dg5>+W)o_#n-*30B0-y4;QPdr}HERt7=X*7X z2SuX84sUQZITukE7o2k{Vz_{>zOMI1lb8DF%eT?HRey(1ha(ZaR@Ni7Z59lFO%$aO zrIq^1z3f8c)yL!eP1f^e)9Q`0TyZ*2`fuHc@TXX|yTkjo1}@QpBa-3d@0*+ae>fS= z2CaD`Xz%ajFYr6?EJcIRbWiAeCt}s{>i=9*esR6{r1M&7k3>KB13^BVLzgfs7eli8 zjNdIgbW6e;DV_G~%{ANRW_u+*G#ZYpTAJ~muw@h4wp@Ri_^ny8!%9ltQ?%Uorckww! z=Ri|yY;D7BM$?*Z4;t6?oj(OUKAsj+f5&BNMCT}lEe3%gPctL09O^*x zn@)o?T8}R}`HAU}%8^u1P;T8Yw$KWc?^8d=;=wET#wY2VG0XumM-%KQ42)ZjDzl_v ze0i8TBhV_PAU(^#wrwf!1*Byb?DDnvK5zxoB82e1$RESkd#Ji^qIWgl;z`xCWx zBJ->zcTnt}8rMrV3wvVut^XBz2Ws29J<@*CVOGO$^UgeCDtS+@lb&(Ke#mVSr*`J5 z^R?wcEf1XaROePz<<@BDOuV?BT}l$1(r-0?46qO`bjWnI*A#pGls;z|uSP6Rp+IF7 z5!GrqUNH_EhFECZw++VMPRF*A@DvA&>QmMEOgQ%fOw;mnessm!w8VxK(++j3#kLY_1oi=($Jugqq_C2M z7ptxP8?mY4ShtloC42Wu2k81>HUQ7&v~V^X23qHqs!F6#JJR?B1f&#p$U^>(=46;?UGsS$`$d#HC zD-9fBm`g7aiTH0JZ+Ym~Zg*zSa6}^~0_ShDa0NuGM#pln0ER}oEpeSYbRp3-mZc>; z{*V8s1)$QnxJWs-!J|XMUk&fpH!}f4_V>G9R4hOHuzt=+H7pme@ffn{UH0}=m5jBz z8e1d5QD}|J@9?7}JZmY&as2X=M6C#?1L8S&Gdy5hp=}(&SV*yiLe@1+?P~B>C5=ZV zKYonE)5#7pMEycVDHYSz-Ay%C1_cisy6lFk_x$QV&Uv77E_n7LxXM4qTbZKQcrYcZtvD`xo z5}3$)M?b~!9Fk8<`%b8k!A9%H1`~Bfh$1A$3i@~lo!7Rayea`u7F8CvcYD_2i~A?7 zr?5DzC20<%=vi^o-;V36t@xR(nG#5uf(2{8RlQvQJia_{QO?AI@=1a5wf+MRb4UJQ%pNJjEVo?3 zk@Gs+#%;#0E6qV4;QC0dR3CDyNY#IHrJp@ApLqSuA8c%~iJB2XjLi zhc5_^Jd@8PHS%(dbK<14ZZ>HOtE@z!mT6u7=|A6EZ##Z2I_lXP7=ad_K-NkQd-VQ- zT2c>%08)F>XH5Yl=8UK~C#S{f4!s_g7eh*nG)S!l*DdG`>D~4M^^c!>bxS z;j#p}$rBb1yA6|`+LGwjaQ`f+8p)dbv(DhbW|x7@q*kX1yh;Wzz$SRBf7lVyQFD4~ zglQI7e=a-Y_4OoxZ4G^!*5{s!WLgtSM++2P^n8=65ATkQsuH4~u{@d^9A*$cSSz4C zz0$h)zbu77hX5qaab=xD6-+6g#^eZ+(ZHxS8FVS<4oD|$0!m^s=F{b{xAd=&w$On< z&;clCxO7Xl6BJXWN8G40H~j>vEp?rg2U-vKQ1tT-*(Jh6EL*VTBRP-e^&3|-k2VR9 zCa%FKn`=8h>VQbvGo%^nf<|!P)UBVz?oO{;CVWQ-)t#QiC^^X}A=QmKNjkww|H&(i z@4si@C##*fF~5EyX8iy1gFz3pD>j-zm}C`3T`(sPcTZ~K>1@%`-rBmEq03E$@8Kd#I?m#+p4mM{#)}i-E4SL zSN1FEp-hO=jII0;(KFUIvLew57l!{F9YGTvV2DX;7h37zo}yH-&OTn{mYyJq42zZM z73<@>Ly5-+mOw{nkW&0SX$vU0H;#iq7dcTMAVKbr(^5W*3ewMuf1&j?4B4dxZhr2( zj$9NhuLWdYel|mGNrUDPW=_tm)6)P&Vn7T=mXE<~B z%COFFsBRIA*YV>!Lr=Eq7$5I%IsOHlGZD%p`MdL9zlLsGB&#K8OPECh4PzSBCAVa% zmlP5p5M?iEx3{UMB~{1y#i3>uzjU4N`(^O!KVxd$`0oXA(`!Of#ly~bbtxnlYqZN^ zH^7O9vd_T-9;+9c?aR;=msOkktKgEhw^9?jYdvo5pG96|m-GCy)AtWU7)Xzl|IP6Q zmKn|cetP1)Ia3wdD2qh_xMghN#WSr`)Do1f$0rxW6f>x7=vX9-IZa6PLu*FrQ&q@a zZSC5-_x)H}ZYVpbqxhB`sW}VyYQ(6nl-|EepHh745+Ae>XdmlI@P#%fvjn3n(HtoW znlw(l5>=D{^2yTAO@_KlaDV652e+Jg_}_H8s{HkDj0gW_)Jl4)$$_NV+qHi&&uKby z6}^7}L-o1)72GmZ=wmNGDl|4=XO*~C@y*f0!Arj}{Eg5&3O9yLW3)oOUE|UxCm$!0 zaQyAe1Ng}7N1=}Zr%o)51U@M6#ZwwZ$DF~O-MCBbCVV+c+8~vB+t-qhYH!WYy<9;m zAdI`XJHiVW{;DSd$ZfbICOM2(_O2{LD~JZtAL#Gbu{`K&Mc{B zHTin>D<;QbDXjJ}t2@ak^h!ET3|_7_EnVcc=jPeJ{82N}N57aa&+)HBx-dP0(AM`$ zE@+FB>4J70A?f=DF?zqy0$q=Hc3a7084p|e-7WN9rD`Nc}? z>m2gxp2{Fo8d;d}mcfM2nxUb}AVXTMzqT`fuw4)+c@?p!lRpAIKRor~O>I0n4mnn%=gCo$V@u5@1*yKdjp$pFq!GoQb~JgT-6 zE(Ga;$Yg51DVqR<9C+)@x=yx_VEn01Q)hkSztKhB5iGm3qqbMF-%+XUpuY!rbPQz9P3^_rYHezI z)#zlKnfF?TTy1{wD#(9>AQL^JbEgAY`TUHOk|H$lFTUR?so)8c$ifc3kYqf7>vm#n z5ZK`J8QN)x^vCgDj#@R{E_ol`h_1O^2p?DsQhz$hpc$UnSk(|j51M_+b6pRqawjku zoBJkJCUJEptx?ela;5R0`VdYOg)cXi<3(Y+`5NLIoxGY-tLMKqK%ZHbL@rieHD9*;;# z=^+s>_i7)YV$&XL)5o1ZEh{5E1D8vBL|XXXR?^Mf5PVy~4YE zZJ5cIA?Bk;Q>Cj-#3x`4p~$aI;d=Vpfm?Ebzhv=UW8lb6efiqcJnaNZnqeoi>pvCn zd8RTomeC{VlH+s1WuHx&Fv5q%7fKfLz}^v5@;#tQ%5c&k^VPDY!MzIXPIwR7)VyJQ z(r0amj0|Xn_(R4#C;!?La0{%faZ55fMRpH7hdXF9&zBkIO!ZE_z>WX@Oe&E*HkhS^ zUfgJN`#Ura$&MS_X+0# z9p=|P`;txM{{b)z%@;IP}sIL=PeU(d8GUHq6*gBJwtcjXtE={Gyv`ZbzT;E ziy-7SIug+1D_n78W2so+ggW9JJwsX^@CoIZA36IxiM`^8_a4O)RK$i-5;*(rl~?)b z&S3OSr>BRF4P3M#KCQF4Hq_bcx>licg78_6lXG;i0k(7vZ$Afk2Zg+dmwMcms0&jUP)F;91Hw`Li^_N|&bPH8t`!~ho z6`4~}-aM3tO@#972}qQ6YtQ_`Y)pnuBW-QU_FpIR(zO}gkCFHV{dH1T?}s}2s4_7g z1w_O#T+>nh$Ai>^Y3pZ^Pey@!GIQ^-SxoD%+{`Dxt=4?g5pu!RY4?GxX-2{l;=c-m7g%U<&Hz&(RZD5u;R)`^vcJPK_S=p(9ibp<^&$ z`<?>70flfmnEU#|2jPzaWoPrt8`I*5jp%xz+$X zq5U$-(z>+}rHD1I&wI-_Azq02w3qd{>-k?ll*_V9mc|prEx~%%D>B$t726Rz1y<+N z>bRQ*{rG-ruyBRB7&q94VA>d12Ykjr^%tW1xA2V-MM}B?uW%M4T)83JQd@Q`&e$) zX8V&sRDX9@{x)5_T8U3JM36l0UAo)?3k1Ozud*_*wUMyJ_YUiDbui1??1;(~g3GAv zsRORe)o+RHfmDX?v+lCnH&UPydtn#wiR# z3cGDAu<}fn0zyTxR&j>ny1f=FJyu4IS+obI3VI?V`845S0pxGgrUs)Fgh5)Z(Gu|i z=6e-ffSH_B3K^*bX+>EH#t^>AfDE)nwP6FaK-{TYl~e@a0s4~sR4JbPHIAbNl-G%@ z9}=@!{W7N|?a(Q!`;P=Ei!S7d&eNdt4k2mzpK$d9$@LW?aY~obIOV<=hNUvlnQ4JWLdE2{klNsx&60p zNJ(|^cF@>wfX#ERsN>+WAx)R=<2XaOGSF;VF+C~(?)LaZF;F!>l8&x+hR=wdj@c*y zqrXCIJb$}P`LL~6Y(mr7jtrz&9NW4}%Arb0x19xQQNQev#J$Cs%-b^Sxmt63fwnT= zDqH>^LmJfPrm$jPDA_-$a>u%<#gDbZx+S4h3k*xog-b)XgX7i6+aq146(=MUQ27*r zG4w6UQxsS8C46HP3Nq0Nu3@&l*Qk@>!=1UURPP#(fBpJJdsCXG@UD6=+-#%xI;ueQ zt+l-%f1*lVsq5@6H|*;oEXCi?FTnlspjGqHJSfLeP|D}0wU=PL;TEUemH)<1EwONNZ%xoDuJg(^mD%F^D2^1Dc>itU z%{BnE(_Y_sG+Z!!&i(^Q^i_&OMg>j~TI6b5=LLR0H1|KqA^K?FTBVtog=|KMl^j z%Wu3-3r1D)gjyq8=q!bcYTGQcgt|Zfoy04DutFmv%RMSIDkuR%x;Q$h!Of@dtkWTx zqRC<&_a*2knvM32j|gqPTZ09~8vd!{$@Z_9x`yg%m1!{e-Nl{E$eD(4Z}P4m?1NK- z`ugy>eRbglb@_d{d^?>n8$f^MfCGYDWGVxz8^if9`pB&q1L!?@)BQ449_CDf+(4B#vK@l)u55||kVsK&RRUoU0WDCD63(j) z5w&>ydVt+FDCcdU#kGt;7S336v!{e(W9yIS6O&Amz8*esyOOn#YX&fhRN(aB-)g?GN{^4Dq5M|{aoyly|j~8U5l;z;1(;)sVDi6o; zZKY~c9w&TzUW8l#M`x1RK&E24-w?>`!3sHqrpMh~Qz z-fk*(wwL3g0@*!dkU`9U2pIYYBS3-veO4k6tkFKZ`DOsyqU5-4_Yx*OPG!5&G9~p# zg015bL8r1a`Ee%9d@Yvl{@M#3gIJPG>#Liu{FJ0X@CjNnZ^#VCw%B%&O2aFW{CJ-? z+DvzRZ(zvPB|Dqlepj=T@=`pGYb_O*m{2kQ*MH>HL$i9-g2A?dBuHn@PJ0+MT2!v- z2PKqt1$=|$p&V^e{g#hRa;S<@Nkur)zd-Z5^vHgEIAc!xIaFCo)^%)tIGWe2nEtMH z9Bkz$U9VHKL5j=dHtykVBk-$MXbNfG$<%%*OViV@Q`pOmNH}b?)#tQ;4QM$W=Dfs2 zLVpOFAYLnd0&fkJtHS~^0nyFI=1_<9Szm6A#cQr{aVB+!R@RSV^YdI|F!g0m^44yl zy4R$Ja3)1;>g9bA)4WYz>EWt-#K0~nKhSOr0euqhPI&O|#E4w=XV4Lof!@)V5nphM zl!n05ne$p79Pz)xwS^VQN_?i*R;(nR0_5`gr5jSOuv!XeA^(b8goDEjh-u?eN)Ls5 zSpF6Xd~%fGL@p}kiK!4jYUhVM!0K!XN{agg`~ZU79KWk|o>5D_dg?)?ix!p7rf?a5 zwKX1<={wcf_v``mrG020#n_bT9-u3WBGk^$&ttD@PV43a$|mmL+gphGlsnjqNq>N^ z?{Y0(=PJ<#ydv*2S@;^XI~W=&GjCXky9}+-oDM{{clVe5jx=+(%7bnx8MJl5eM@}F zew;UY72BH5b}H~IN1Ljx?Em>2@z9|z*4*CG!pwTZ7IJ_ASym?=9{rsxq1GvziY_D{ zDl}juuZ6Njs)PD+DQ3ltR>B{V*0QgL488H?A}zS{e@r!!qLj(cJEdAn7;vb&kTE2` z54HZv+qd)Mp>c=O1tFS~Kn!2^LuFYh%*E(#8S;8j{;=&~2OG<70om!0qwGz$M3#?3 z)E!`ACou1vAN({!&?}B5=MCGkenDi|(RTrraprGag51(r+f0S8@1>u|Yq84Om~{77 zF`DBsV*P=RA+uqL(qPZKeEEfb(_8+(BJn|A7Swg%KOo+Zp=sHPXJ->bS{mtKB2Az<~8NC4&86RE$j%Se@i*tPer%F>{;%1?_X5Fmmf`Yk`fa9 zNZmxc;$YQ$G_FB3T}4EKa?O3nT!@%VTxoo0V-JIp&qz>|P7H_(d*i<>I}63k*DPuc zoFsZWRZb2FSpIBzU*huXekc3xyB7B5s`>8duk&574Jz;w&Ph9C_-4i@z0i;^wiJ9y zULCp)2I+2Z1*?BiC`^rAZ%~=3P%ghi`(LI)z}p@eY&N0V?+3Nz#wCO9v|A#?u(|Gh zOo=T^3GvbnlC4D`D`3`vgbW{|Wy;t!TyGu9LJbq~{hE#QSyzVHr6t^Q@KvJ%QAXJQ z=tm$hf&3SnW2HhJVwu&QvCxKkO-s>!AL#DDrZ_3&se zX5vi4cDuUMR82#Q(|}WmjVtYAR|RX~AHtPqmr$bL(=|gj;|pvj?K|c#CCFoY3jK#g z!#R*tW7fFm>c&G-jFJ02sDwR>oTQW>StLgByE$JcB(xp_e|&L8PJxH%sDHpR#IF@z zLM^W07swoa*+?RfJsNJAdd(j5*hId*60lLudYs3c?x=8V#T~`s)h`whmw&wZC2cV( zceOJ*dh+=C^b|YGw%Hl6F*It|^L-)5>wFVlTV@RVBF3Mht*!i)`lV5wyXbK#y{6ML z$G-hm+lxcy@P~514gl2^OQ_D0F+i!twC4i1Oq(tf>@KN3bcCoE^H4vKQ~@(8$0c zT(8loF|OkI#-q5xni+>qJp?1WGuDn*oWb>{E2G`b^Cey_R@W`J22)idkG{=1Bkm`; zgtRIwwVD~do0;

    K;~?e6nwol`-@!qE?K8I4piY(Ygtfs<+&^ZBpl<&7#IaGuR*#Y)TTzVvjBbJKOW1LeE`a{q2@=Z)* z+*>e`b>2-ZFz)AZr#D~I`+G&}PtNU&k_x}Aj1D)eLJT&(@hM{dIT+T$+5Wm#o8GV* z*6V9kU}!@xPvn7_x9TnSp)a?d5;DRb+Wj9cNP3Dv(#1}%aQsds6lFPfDcO1|9E zQsud6nOLp1OkcKNN`-Y2lm@O9LeX?3*-_?F8rA)3j^B(zGr?(lf?} z*rR#@)$rZ>%%R)w&H+tzCidNQ<_ib?9ii5(i?8rHf7vfP42ot+S{f9%$TVvGScGEe zXTe7(azyC2o^hh6^<7}XOxDN$oqm4s13xC$ww>Xpb{n=utqE62WUv2tMXU!#oW@oQ z926>l6Qzhfhz^_gdj6blVa}lOJEc6KI8C@gX;PBH5l!B$!ebPBS;JfX)Qv%B&XqYR)?Y|O^H5fz*gboNiYRgYnPz;y6H4>~$X z5qv)*Wg*UX#`3RwT>To~$3dPXc-(Qw9aWVVrrEFSm6NbsX|KoTLus!<2Y^`4lphvNTvBw~?m0)<+hb$o1UO!y_Kvb6CPfLW)8 zaKf#;J!$N3yKjW*3Jz<1N7c-6FF<}+oB1vWci0r>X_bcU&>PwqH4!j?&>2^Bn-x$i zT)U2@KSIb#ziAbt%8W{Q{c^{L;Q13{mzHM^Vd{r)+r#E;X5n94(y>Pv_(>ww93|i6 z^u20H32^bc;yVA#%@QH<$JVGlOFEw3ovPrR4M$cK^W8tl;>#)q3c%m*}Mdq2;At2kSk1~kgB!<;&@lq~4s8I10?#0*y zjg9spJ0JW|5?ptU;XvfoHk;~rwg(kcL41-KE@&ILdQ;!0sf=POPp|G+htQpkj_w)0 zV}tV!->468EkEa4t57R(@2R7aC8Jaw4+@R!4r(K?e`SQYpw(wLtLmEUa(leuL-2F= zS+^cKfwy_LN%j6O-!i=!?TwU=ZZ#p@4bwRDKd{1Oj5iB#G0XBU@dg8T8aj0nF|1JM zP**T9cB{VvX@o~RT?vh=ALHAr{kL6y;zaqd^QtQKtc9fpx!>Eup-&r?Wxv# zonM3Ri09SAY?QGCNIG8{RIl>RW3Mgs^;IwRwY%WFXzhuz${;CE2!ZiNC0dqlTk5d1 zGoJ%J)#7XA)QJCHo4&l12++dee)5(GI!q98&$CD<6Q|}n1IQnNHzQBCCb1yvGu*6LLEwZABttm};=j+DsF_ zqVa1H{pkM&bIA@kql2T1VPucmB;jkor(#+F6JV8e>Xt=v1=*{U>wexf&=QRMQP{aA zwGoKt6Qc&~VY7pnM~=hA$KEOb8ekxd!}!%2g4gpd^T}#kL^ER`VjZFeB z8k<*L$t|2Mt}U^%PId-Eixo)rjp-+KC zV?c^|&ov{B+8zM*xKeh3PtUs&*%iGKqowtlu4F+K`DFm>!=w*?2$N(FPYD*Z(*I@I z7bW3M(!QL+pCX+1Vi+$Qr{|wfaQ3kchx5CAdhTOm=u>Xoi(}sR)5&}ir!fS4liOYW zM}Pu9&-Lo%{wAIEEVFpb2RQN|E#+@oir~(?`j;2O1nGQRn z#loOp$qrUzlbxa4z6O1OW7NVLTSR@I(|XZ8_GtmFWslt}rq;MVQ ztrTvWxTH}LMiG_ZU-l9?s*Cx6ktF*e_EXB$0h)|&-{aCaf^QH{>DxRZw#r`Q6UNZ36quL^(1aW3wA6(CZqY)h|;uG`xW>z{dBPlXQN&> zqh8t>79!^xyQVH?uDev-P7U8g^Y>x#F{}nO-+}!Uh5!_^U^H=5r`2-@GCsluq6;VP z{G4&Aa3;KP8&-mfElG$1dTxjmvD5dbb>)QsC)hz{LCErAyt_z2bbuL^L8vn3F(mr` zlb>?K`gIQq?_X_h3vFM=9}Cf8_HF7ZkpOQYOLFi*hvF$=YQ#Q~!IusZyVE z8y*gJ$)z=bU!7~UW(q{XNvB6qS#*W@hWIP`T>k9H)AM1&#tU9X;kYJ2PGX^9;pu40 zWa?0j)L#S9VN+azi%$tF<>;_U|ErsTQ({2}eAFM_@(G{lA*o&ZE$#_6j zcWjX6pck7IxBW5E+s%RJ#`kuzgYi+eM)>5{gotjKcT6ovxjW;Cqb!Jky){` zQ6AG;ffdY_+gOaoD?iasi0Guh*ODwivJ9JA83jTjA3zO(s|K-TpQ}+6HCY1$%*((U z^amu-{d|c*ZUDcVte=j4T^L?VjkKXXGbpYL528M^k6MeeOmt6c0qc+cC^D03{*&lo&X-S5 ztSu-3eYx8vOCx9YH{&tny=awp6cu1u1QXKaEmgaq6Z&8bw#bT(0peERLS@_2$9Vg% znEO{>PQ6Q~B~hx;z`G5V_`p+WA&$rKJ{2@s$E-B4ctPRv(~C29LegFzk|pSz9(g&2 zc?|{fk~}8l8vrSAa+Uj&(V(Q5sC`?;POdigO;5;&OnkPL4oh_jij`!2lm5)49}pr3 zXnt*75hD;Yx&>!6-`aLz-iEkq9D`!(=29+bEFm;odUb8WmK3zVNf`eL}H>D?Kya z0zLeCnLrZ5;{5UAy(rG~ET?RBmKW3s&HoCf_iVn5LB95ST9gy;OjTOAj?+MS7Jk|S-(WEN&kIj4m*I|R%Kvk~ zIVGScp$56SaU6Ww)`JE*Sy5A0!zdTqOp_C%g@{G^*W<#hyjGbEnui-rAZ@`G7EWUu zT1U)%|2b6y9L8}&4*J}$FVmbqU%a;cVJ!ocg4ugS{_a5(?CYZ>B{qE&d%b z)8jGWLAo>*FAGr?UDwJ0qJNMF|f!OcTksIvC>S>0!7$^C850sHXzV#Gniw?>?RXD^E$88TxPeX z!G<5dwO!NI@x;Bh>ec>P`&_O0o0oNVc|?AOWtgnqAZMlf*4KUnpcto037iSkA`nK5 z1wiEhaDhbE1#rhlV+DO@_^VC+J>+)aA+311)@Hb!$~*#KuCGiVH1f&i-{=Y;qRxn` zLpf^R!y+E;*Q`mEHgZSR(#n;zP^ElA&Tu-4z?~)Ix&Vzy_tu{nIFr0Pp z@;Ka|i;Z6O{S69?Pm6IjLYBp%_aS3jil059Isk@R2npAdX!Dc)$YeuwI0>* z_KmMn{N&&N)MEw4`;KxXbbj*33>HlU$UX0u%!anB7FIcbfz{2*47)}RJMZIhGhz@d zuW591LzK<>OCX{)SsvIciG*?=q69_$1j>KrP7gV?x@1SL?lS8z1^ zvKp2s^2R&+ik)q_%n?>xT+x4EFo!Kdfm$L2*n=4pLr+o@+U2fH>V7EHmIl4bjeGuI z+sh^e|Q`iA__<;lTmsd(@oT01+^=z`I2*~SSCUyEN@NmG1e*bCe0 z+k?lomQV8-eYi(k0Trt?hr!vC;NaM8t-0Yzz~--_CQnv09XPQ3^XeYX8WsN=GS$_nb20-3A*>AJI)XE)f5}0p zu|xgqULh|56)0$??Kbxecjg}-mG}AYmm)SM?%;{;uZ2h6r(q*RzOXoBM+)_l(;7BQ z!M0FJV@>-y-(<69QBUv~H8HRGal3b~-|x~oBBxf59fb>Ic0%gF(0pdnPVrA z7qk7}05m2Do|!mP)kxHe$~xxWMzc|%@i~Dl3kfQu1jFcrpkK-4i>kl%@Fzr?T<^p~ z2J%IP;4#nerq1pF8qhJW)mQ?a=J)nUq{bbrYuu|f9W&iZ1H=#0e|D%>S7w_S?0+?I z$wGJt41*4#c0ns8-$dwkQqYLfBuh6v???{^Slz+K&tl}aLjgE z5t;_dXfPpt)iji6j33go3#ggDI7}3I8V;+n+Mg>WU8XuD|C%n}Q@!>Rs>{GWS8AIf zY;Bgi2X+*&2qD!!Ke|Cr0(cFQ#Dw<6E8 z?2i{mQYp{MtR$y(~&o9LyzQ>Vw&$o$L zwg&N7l#du%QWz{JD4%i;s!O0d>Z$Hjq9Y9uy3}~R-W6nJWEYw6+P28{uz-G+`72g4 z__!48C6D@dJ1dF3d%EqgTIz>KUMjKm{%pMbFcyv%tgZ`EymLdgTY+A|B34L6zBl+V zkP`fjfF2B?_W;TXQYZRhj!g`v08Co*qG8Ms1|bCWfut<^Oefkbro%}mL<#)988^S& zf;BPGQ5?nB@3V?&xYia@D`Kc)JoEBb0rH~M`C&~EC()V3vE#d6W>VY6i2i%($wGs$ zA=#uDdkz&xQl>B~96s2LrHS^-T{PeM;wGIU&cy=m=C2 z{M}G<;yPSf-D@=+w(EFtFRC{6kO#RDBu>fGa-AqmEcgJPL3p*gafCroZpf?1uiHcY zWWv#uhXlB%&xLg_m2rU#VB-*0G|b?en0HN?x57mAK!fp!48i%`CP|g%bD-H387V2I zOn;KAXpOWh-6wA!1^lIi!F;3>T=wCPEsThzus>)4qOnwlvtqCmF^>zL?snTk zMs4EEn>~1m-s8mkHks19si~>aG*&Nzy6?)iQ`H{h)ic?aobgf>-mLQEh|DUSkecbl z5V9XNi_*yPf^uMkN~6@FL~e9V{$I(22`$@F80}3Qy;Z1m`YL`Qb1!;CeWLO`@F>*H z5jmo-l>Ros&#?t70<`P3x^;FTymOZltx;&$<=-YC-0CE?>%lYSl|g$N&aZsI+4>w% z5KCj4;a)1M#)aQRf31^3)5Goj(DY+#PY9y9uPqu^!nbGl^z`x3$&Ndx@nr}EwhHA{ zruz>bfTbWO0XWVMr|A1LVLZBqEb+vxyBaopsqhBPl6VMaz&jvKwOeGI#@IONuV9sq zsm?@t^}ESD;ne9x0ve0u+OHeVhLzh-vr5b%E=22uQC%uJmw;6!YQ^8&Z8at7d5@_@LMBJwka_FQwY1k1Jnb7(I#nPmoGbrfu5ZG zn6Z2!-ly(~3mV#?yrVe$n;z0o3FdKk0B4k&ASuTvu3{ASHIXK`ql+y3trFD!pdW^O zA>P!$&>4lJ@t{D1I|#vUqY>9CDrzJgJkv)@rtoeGjZ)w1WcW6`Lfvk*=<| zbU$KGK7N3wWzH9VK`?0SJ9ZjkR4KP*?8&@F0%my*_2i=F6#LnHi~X;KjOuUnCx(zv zS8Tj>X>Tn^LIH06b^5@V4Oyk`pvl0b*C+A=B8PjGd+o%BWl!IIj-{urJ0HUi*JHXn#U(+im982huE2cU zWfk|~-fD#0HGw$)13-i+vP&QN&E~8IqA;egyKOZwH1a|6oTUmaXT8%kIkv0yH` zZB{e6O@Y?a);YTKZVsW9QCM7nXK3=TV&_r174+81+|H0mR3?~fNtts0RhW(lkd-1= zTq=(?%A3Df{yalK^Un-ipd|_<5EfvPKPjYgL(-`%%KQKWCPB4hfK@Tx?bwzvj}rRd zgO7BiWL;VovFSekyyKB9AKh5L>uV?|R&T;fV4?b^A}pB;WW6EJJ|ZSCi}AqN0KHId z#b;7}1P-J<(kFD2thgr5*(XJTK$`wweV3^N8+qv7jekDU%kxCD?+ZG-Z_hRdZTG{B zToP8Ts+CWUafjDa;4gxaxX2TUB&!-Ii^1px2?cdqcIJsr-45EUC6BX-Iw6#2n_+#9 zpZQjU+s_A&UNoC8S3{w~ymC;~m=bLZ9r&6=8l{ufofQLwjem%0-jOf_I~@m#863Gh z0GmKnqCboXNFxluF6J^kIq#CVj{BdI0gy!kSpF^0XCxIal^Go3P+dALsZ4dE!txe_ zy~i1ZwguB1$Oes3D0t>bdf_OvwH?qKLGztGx;s<)Ztzg>2B+3<%ZacJrP)t>K|ukr zEe8>*S#&{u>^XEtI3`vonxD?tk6kr8Fsri1cdImgN5uPfoT@t%|IJ28{-zSMA7KVP z;Xk%T?XOZ2^f5iO>2Zh8v%xplNgb=q2&NwU#S!&3wdx-E;T;fSyarE9)s(C+oSdzw zcBpB0G={6OA{p{&@-!UCB^8xBL5)Y1_X{!#C91JdenVKu!6tD^&S>9%Do6x{4y~dQ z4sx$c@a5!C5O!MflOu8$Z-@=3iHVJ2fJVt$*-AF0nS-Fpp~wD1Z@Z%bmK^h3&{wM zX(nNhh^?MbhN=x@j<*HBFLd|2TXmY8Jf-4LMr&mJ5Kr+^Yoj0hJgq)luwvL2*x1(Fl*l7Ht$vj6^LzOLZ=#j9^KCT~+me}G%YYSIWM=VN zePHr?#fL{iJz+C?N--9rb|Tof$X?%9MV8l8Zc^fiT`zp-4WgHqaip(uKZ5_+Mver3 zKTw9DlXvHiF7&j}y|G6~Z?*C{{L(4sN8chVO05*P53&gX=7`uNE>qG}ee&2+$Sk2r zoJmwJLB~4hAsRKU#4;}s+9`%R!g^{hU?c2&)phbI62%El$zLT|5rdo!PCSwgC4*y1 z`K9(j^&C!6CPmmmW+ZHUF$KYkX;)wJ?7=wYzs_j9)BaN$ct_41GC;2A`?XJW8KR1T z*Aps=0Ta)3Z2aC(_3+({6rL$hZ?Ok1WzpFhCB|U!> z!JiE_$ve^CCaYf2jb@vGQXNy+{_-wI(!ZbR$dIe!^LuGdoLpE$#KWfdde^ja$gAVl zk(;J@B&Mp^ zZYS*9gO5eQAJXB@TJ^*^gtvm{Qwp#0mJnI&TG6#fTzu@E&aQECEbAUU>5!KGZjDCchDi`C3|Wroj_R6`FmSFUikw_F#&3Ky^tB@J_M{Yq@!|>#?vT-TP<=l_yoCRuxdUqT zlo(!A7-F=bduyTR$`BF}wk)HYw-T|+pjruhQTMMSU57D7%i-fC^cLb}->6+r;Wu{J zzqZ@xfGqOMM*~*%N$%kmBa`4`lsmV2?)2(<45NxFV0YcBZfN3fV1^jk^eQ;xTL9*` zMJpKX@BI#dTry!ORX{W=^apHOAt^nqIVjbuU~Jm|;2SRGRey6(28g+A>J z)9>9*lb|sa@)zUrYv$>FZYjgS9klLz^4o%AsqY0p=Je8@Wwt=HfXEqJ=jh*ZXiF}cX< z$xDa=NJVQ%x%lA{l5cItD)Qx}kM@4&I4f$h`E33A`jg$ocQOCskr;KlgzL`ZVQ+kD z!jyX!Lw*y&?;ACH24+&kN71bgmFsW6SMCJl;XkdcTsnUJ>ZiyPYfac60k9F`@wDOR z;UPPziD8AFh#PcG#mPaSB71)$HUQuSRm4`EMw2~+5@aB!2#G##gy;?YM+N@{QF(Ol z-cGINS0OU|x6JD}Zb(IVwiI)OF&7Q~w((oC3g=a%kU#6ztNwppe>oQT7)g@&c4n3F z=_CwQSiV!Jp{CkPqEB!BTVGj!#e4{d4MuFbksN7c8H#su}CCtJmttC1YS2%Np&w+q5l*+ z{c!%Ch_ywuqBq~E$aShUrOnF>3;&%3Fl~q=Hv6^xLQ+-D#}F;`^xirk849TAln+Ot z=t~|R3Vo{k$83_@>NER^f0j8T8WovzuLzdphe_93o2=;&n-3NBuDKcwW*PK0dw+;M z{BkOMI7A8{<4u?nM2Ah_8G6x1#ZDrq_*v~H38tvgRfAksLxE_ zYO^#cbjhiLt|91qDY+nn{>wzK>L{*iR%z9gJw!P+6fczH0_7csQh!_|(ji40eCMA^ zfwy;mb|$_p>EDq{bz-}E#S=emu*#O`gd7KQT9UX{=&^iE$Z%ZscppB(Q=enmI-uEH zHo#ICAOy<7J_t3=bC*+|bGI(5QN@}W33t=CBi>_D53qC~v?(&Ji zV-p72l7$Ts)AEOBg;Sm9!$*!6izlQsUr4tz{ZlN}`b+*AV)9-$^<%~AK5@Mbm>i9C ziFWDQC~ir1`bDa*Q=Gi)s|EVbZuk;IZ<)Oh4xt262hBiV7GnDBz!q4&JX6UGH(Nc} z?2ye&PQ@{`X44t8TJGs!EIrR#3>7g;pU;=&881j>*pZXS3&wm}K5x?Vm^d%5&Sv_l zOG+#}=9F6i|_M&3~F5U@J=q>yEaq>w(>0Z#w{pPe_N zPVeUuL9&hqDS7>WWr`zAFxN|ZZ(iBFq++t0K)N#Oj7u8+dLc!Jh$154MRE1-Lya!z+cwc&DV3mh#TJk2RR=BzDcR|@WW zuIXLXATDtWXEuchB4?p(__qr^e3Z@sYdZ_>Q+0-ITv~#0$3cFmG;_fem~7YI%ZV93 zmqy?^e;IHfcS+J)zA>-(};6ZZ9C1hEAzEL~xSvu3dL| zp1%4nG4V8A{@ho$WK}LNU8~jFs-v_$U~-RI<~dZ0%YKwo$zASv?T-6KT8=wU1+x%Z z@EbnaXZ5nr?4)GKs%@)KFhPaZ#a2h<#P~=3sE7$Q#dN{a9jOfhP}a#BO1q0FB{aX;kKlhxhJb4>48v``g(_A;P3T)y5j!Uf2dNQ9yqK~F zV2prHo%sDw_X{c4G-+i@D{RixTh||L>}+=%aHjN7ODPj2XiKUZyV2|aK=bLrdjy8v z-1I9ffIJBEH)W&;{N1*_&7A^@7S~5TCQAQ2Cds4E{N~5nV&lk*x@$hBzw5KvSe}xu zz2U0V4BT;fpNN6nIRYZpa4&;oe9%^DCYt{JH1014y^a4jlf-vux|ANnKv1Yt#p~qT zL6Z91bZX?(Tj)Zhbd#>%@>?uq|ExCxKb$ljPn`(F&I<|ri3}Z*NfZ$p_@J8IPbRfF z^V7R$6Ar<0z0k9Wu5Kt+P;7&ejzd3=qOs~`FShJ>dTPj%e-kTeM0i?`>^AK zuN8JY^+#Hd5XhR)MdB1o8a0pagE+Kis{rW`=)&dbVot6U0 zw^s61KX!gU&==nwItnEr5yyG@qvLFvALZ40_Vt!&r+J6n=N%W_YB^7)(`Q|Zt!#EB zBTZvagPnCQ=M;^!4uF5u{7TR}zUqcWKg4vzgOq?TSRt56$||rDx_eEFABDK-!PW&x z8{*e_A`55FFJ3!OSKZI}l0FaZK$ZJu1v2`_-$prZRJ}D_&V-P!vM=0HlROlTcKDW> zYxiER9(sn4H^6@kpGshb0MbY-LdwVLl|@_Im4Ns(>|2=jezDJVpRX=^5?8u8RxiH{ zjRcXL+1J@?IxcFD4sEwI<|*V%t67>DqIaq-@L+WVI$_Cz5)hHR0O)$+Cgt>+<{H>e z9q2LuO-dJNMYqQ0vB{0Qol+tF{|S`$in!PyI?j1DR8Y!`O;yxGss`afYh3BTdvus) z4)US=DLj@7dwwlAj@M?twCQ}7WqHi0Ct{5YOu0M^506!lo^FV=aYNv2-m_jxU?t3F zZpMu$m55IX`b9o3J}>IZ91r7DQa_gZ#4X+Me_bS`Xcews( z&UgN@i6S61%HjCy`ybX4kcI)%RC>+%rwk$zHefup3PA{66pgtWezB`WOdw1X;2#`i zg!DHz>6xU(b}PYC>!nmVO$4GfIi#md07cq z(^J+wVfL=b*yCmxRWtn|XBy0@YMryRm!rGV-ujhZ?klyK3f_ctM@{Tl2e%0s_?2RL zyin+=F_EgAr2>z2GfMuh(@I|%%cP|^SgWI68{HkF@y{P$o^Q8L2e^E*U9wwrIysxL{N;qWhaGJ^WM zMucK%3f+eA0;MTIB#NiRP6aGF^!Q-Y6puvz`5Mfb$JSA+9M!YD(2cJM9SHfy=Cez&r4+Z08we(vjt-NcFWyvB+96uuB4*9t1!pz<* znb+sbry|j99%ND`T{mp#Aw$Ol(UumQ7DOQ*E!;waAIED5V$)be&B3}ee!L5L1@_{4 zJM2>>3hSmS^*+#%Frd;ro4+++WRK8#+JtOtseNVk^UadD4J^d};L7^15cQ%BKh>K@B#O=CYM< zrI|=S+Pe-v?0NyV{z+XmB#VDpo>)lK{zjS%tDdNjnZZ4sD;DT3id}ap?EgHDL|k1K zTtci{yPab!tAp^w3BF2xa~x559Rv?$Ngqv26L^45?(q{QERqL*-J@DR+L9BPFc%G{uJZj zURES6n(Nq2e_ql{(Ca`X`03m5+#TEJk6xS6>`4N!s*OP-wbzfg**Bho&KV~9ciFH_ zWR`txXF9D?_^+9!SDx%_);V*QF(1+`AyFYY7$_#yoydy%A)lc_Kn`Eo1Ib9jc~hKP zjI9ZOk^Zx04G`~Z=7mB&L9;CY9Yyoruu!TMZt-19U1?}h%%mX`eYtG_vdr5^UJa7{ zfwAg%e{;6BF2<1QSEmaOwa6Pa={@9wIpU@WG${c{b5urVdUeL>@q>5gOl=aKeRv7_ zkaVaN{pX^cWXbWgp3=}d@zM{q<5PA+u(a?Y-%bZUKu$yaNqeh}d`DKUZgww!a;=;bsx@g2?o6i{~$_a5h+El>R z?T#gk#@1*flU@E)+Ake?^*zS*Guz@TJGBwI)urK1Jn)}ckhvfd5fz%zdvUxBfyfY3 znAj9)pAIepa*&OF>|PCfZEm%4g}PDy|Mdh3WE!OCrtkeY?AN8ox4!2U$hXTXCb3+K ze6+d1sfVQLOv}kIqvGEJ?E%Odd?v4_#9sl#*^u9At$CW)J9qsqWo~$srV3~}`nCmE zN$MKFdA57e>_9EkKqIjLtzS{5uc`ZHoCz|ci}$mMB{VE5iaaXuJ?yM4%vg0H(Y!(+ z4f4lkmfA9e;teU%&-X!npLJY2tA$CuB8kXAdwr@cpA$(OVCvS^ zOk0Jvq-qBkxD+fop)|)KvubndoEZDE%B}EoADD{8?eT2yQFI*qp{Pe!?7D#!vLn_!1XHx> zP^=8bf)dFM=fw@#&{AUrf7!4B;Y{jNQ8Mb#nHw?mP%Vd@x7=`PcT0wu7N!8=8Jh}M z4Xue4V4Lv)q3jzD2}U4}l+UiDcFcYpx)tv{=>%$q*yr;8n`DcQ8;%f`!Y}r9Sku_# z|1ecAl)n(l4xq;RXPH9G6w2vNdH#>zk0O0$v~4vUrg^F2Q-LgBe|bz*#0`n2!eC-A zn(TvXn&^J+~i11o$BwvNCRZ?QK6*Yc{zTbBRXLaUp6Il;2~Ean*X9huGK1hAN8u z8QB8IxW4hwE~#I5K0G{h*gIN;wxp(~D5#AcD=z4=BNHV6Li5;YYuNfb*ykwFa;(1JBEcugNgm54*<0_88@0tnpli~TswYsD8SYmu3I z<=`y?`QTsQ_^&*M#(Xm>hiy+g?Yw8Clt2vQJ2L_IMpHzl0-(A3oe~&o`8I><^kf3xRAuD~@%1jic3+;PN zZMaMqEsveGBQX~Om2KxeZIqz%@$gCMo3~NsywqXiL?l;~ z267q!DhlT|Qegx?)1`iDs{MALmzXhq)p+q)Y~IDmDv^>_DMluBtjhf!Oc$ctj+C*B z-hiYp-WHUlol_2F4omt1l51&dl5oGjH9R(a#Gu`Md+95;hA;oqV8ZLT**?d08(XZN zRdw8)N&em^o2&uFnL~nzHmLyQ9^R=2P78zPgAiu^>{pC+KMMGCpgHw6npSNdg8*l7%LDSl~)ur zLEX?T+W*a}brOI+P!a+)4sEZAj0=6af>h6FUr>z2-59mAoFNS>(Uj*ap#! zE-6uqp&mOkX!62yzv2r!N3w|+==VKPyU`g4$ml#M@+MRGdysj~EEW0BfzqCyyg%F8 z)*N_u0L;hWzpzMp-xe^QikeP7Gt9qL+T*{fAs@m~;&1tJrKwOe(!YuCQSs|B5Jp6F z1~O-t)}h7D$#W!hV2a9WfI)L=SJ()+nnvQJP=v<>nF}Nn`qBMF{}?z3JUNFy1{7k0 zkt3BMYwjw_G0qR3hm7!X*kQ*eVAt9icww3kiG&OKpfjB8uXboAk4?3!Yw-8Qi9iOlE>-_#T;DDmGHfBB9*{BjCCW0E4ss=h-aB@tu*=QE6=st& zqJJ|AJBoe>Mr>l6Y!=z;^KQOIS@(ISgeG$6NvA({3!ABDW~smV`TE?aKpySbMI{j* zbQB6CG|!amp0b;Fjg_p%<5*DLj5O<^8_n`?P$9dbHb>6~MO4_~HsV;5!CzZi7EKz<-tqt08}X&~V_ zofXHnZwdV%>{Zh1}Lt9OQhB++n!Hke-`w#U^DB8e(2FG}cx znm|VBhb>QzzJ5maeVt_MWGV{|8}4=b@V0I#>_4T}^6K=tv~gP9gr!i+Mv%=#@ae`VKaka^v&56cC+IUKrH!WD?fo+_k$9_@`+&F-a$m?C+m#M}k)`J-VP2%~Z?I;QKUd z-31r$;5@2%Q#aP~=qEcz?hq~X$h$))06+YyFrl&wfUx~CK_skG3}H?B0EqvQw~r1K zSJiKbU{1dQbSU$eeOyBy^k+Imz-m5LLZ1+dYTD&+vL|*ps92Eny%TCwzqasBvz?-^wN-sjcAz2qmT0SQ66EJuB@Ej7w>6 zofY-*b8`ZNM%G6NmrJgB_hu>Hf{!vkJpP&Qz%Of=rB)qBkT6PkK08a?uI8=);|Sas zeWays#OA@4m==p@>yI>Vq-RjY$qu>YGe>+TzIIAG-mRkNrebPgYytp@gTOGFNOBm7 zCDyO6k0$$lq5+R+;IKP6tDslWOh4Jx4C43Y#{0Y6t_}H{Pi>+7c;1E4UmfGz-tzN% zQe~!=mvq@zj6yd0pr8u(Cb4a1#~vkDf}lfClm7@!G^v(lmlR9S{=gVab4`M4WiHiq z{c?-Oyq8g*t<);^YI2*G1`~sx1QpbqC<`lVN)EFZdmmQWH}}WFm)tHl&TXBJ;LI+E z_TIp8QG-W(D=p+l&10vLEly0;FoOa0hvS@!#V=iY5@ZJ-NYX;ao{!;)HH(Q=Pib0p zOT@iqJLw!SpihR04~opBC240r+ref779h7Exlts8Ybrj@0pS7SPalQ*Z46;`2(cyo zRau=x*vni~{)K71xRBHdW6CtXIBJ0@{pM%;q|5J-A6U_1QFQ$eyE>jaN_-A49fe81q=S`-0^Iwm6Z(vu5Aq$ zP~GrxI&Z&Zr{4sQEQT0%>Ub;zfAAbj7nF{R*VwA14 zX7h&WHs^5)?GZBW8dR$0A@Z%uy$trn+mSqk6b}TdK0(iiT6zce?W+mo*o5guf%WvkzZ?}3B^s-iC%HY z1sb#DEWwlw_0sREFI#zS9o@G3(x>PBIvL5udC!Uc7a z!#Tp;C#yJRx(4dyb6kF-jz!QhSle^(0hqm993_My#!` zdS>BA?X9e8eP|lg;f!OH6e9SB5WAEV{IsJ&dC4!|qoft@aXq<}u&>5;rSd7VXX*Im zWgB)m{}wE~^^?fC)~=?T2=j& z@S_NwG(~oUUQ8OP?pg>D;VA^bR|sdv@;XKj9tG|zSaaZ;^KK;C+_mE?53zIU zmy^4o>Id?(*R5Hyotw=bl6nDLK6#SGezxBRy9a<-ldI=|C{lg~Buceu?>Amb*!&u! z-y!^CA4h}m$Z31g_6y@qhqQaaN}aw@%6(MDx`kz?i-d`2$MWS9h6|j1Y}~_`ok!MU zR3D!t(aj*y%;hzC=3d7YD?PLpN>YV9`QC4cFeW@D)2%uRI}T#{wY0Uh?)*y2&3i$T zJ1Er%!V0l6fhBpxad_EJsEWZi3>-!K0C(Xo6d}%QQrHx{pVZ=4HfDW7s-uuxt{OLcYW6wJtKJ}e*u=3U&*!n z6psmCk_f3h2DnK%G?0cQND9NAu8i=@!4^W>LQwd^%?gBPQmdTElMFlpP_>_hyJx{YOI`qv>!J{3sOE}(CCf}#ZX z&%+8EU8S-?J}q2B26YrQB;Hbj{Q0|FQ6^-=rDnx}2NF*7GpR41sW$nQV!;v!KBz_1 zLpe@_4fXZ&Wh^8n4n{qlCrX|UL5x{+^2Jl+evs@$uEUNc%DLvhJqOpgKXBM`HoF4*TpNDh6zF!|`1%64@ zE^)@;y8O9SPG=fZ~yrG{J_Hz@w8Y+pB_&5`plTk9V zvop-J;qBto=lME5y<0r4-<)|X#8peM4slum6#_`2F{fz9*s>4o2D9Toh^+g9fH26Z za^HbZU`OQ(Rm!U)%D)}17prL z-|_{gi@IKRFP_;78AyHy*W8I-kAj5V;Jo0bLlmqFU5BBOioy#*$eALFmUPk>DJNnQ zC}S3@Ik|q0{M235fB!)?In*|vIJFgkx>*%3C>E9g$lc50_?+p_Mo3yESh{ z6fQn_w8*WP`ELW;4m70kt-`B%S&#X{D8#nGYst{Q!V~ylB780}rYm~%jr^)->8tGW z`}3obDn+qwZ>7`-W2TA;zn(YU_G$fo;f3pV8n9?vxtIDN*uNbimCsAck;>o^eUd=U zo)xO7Eg*x9x=$P&9pYXUW7=pOD+x{ZZTbz1ON=P;XQw;56x)2un=3140mXjpyX{R5 zy|LL60>apzIUcJ`=}dsrDZO3__9xg3LnSu5!x%L-oqfGzrOO}_>lIWh zvP|3k(~S&r+pey)tY*;R>O$1>nLk$AvEZ!!@K4B76>$PJTy5BBT?)` zS5-Pz^L21o{4(X8V2I>u8cJ1EHSo=ZQl1*yJaP{{7t9^(wg)Aq2Vh`G6=nW!lZzh_ zd^h*KO5gJ>L_kAz*G}2^&mX`-uPC*x^bl&iagg;uu0=JPB{+ZX#QglqJxqiaVv{}_*3d+_v zRcj3a%?4|xX%nF=oC(7GGD@@a@8<{5rMOyIv>tMr@!KgGZ(AE(Yt-v{EBogTUmg09 zG`#X`bPd-E-Hy`Vtv@?0mzWpCKR{sqq8x^$VvF0&(5T6%xaj2)MH}dzY4URA77)1b zG(Nk1k%=T9FMUf&_BR^M-gEoj2NednnOYjDt2POvh@+zMg8DFUA;2zS+UM}d zuTH(t0cjzRcXIwKO_OB;I}9fzkj})ZU-gb2TcHuk4`B6@Ci8D6ODx4z z_Lhq1xcTpW8T`JfB)C-GF0YW37S*9}Yf-&tC1g+!|MeV$Wjl$_{(eAU;KP+uV#)lX zwn)dHZM5~)>&23ZsaUCLhMyOdh3S%W;bPp~Hs4sd+V- z<}jo-Xe#PT82D` zr(jq~hJSU1mZeygy_UT7?YgsVbzQ?AwpU`)X%mdtCCyDR?6DNA$PVj4&B0g!gD$~a zfzOWMbJ1jSp{Np}`)(7%_f{id!sgnqQ}=1`*A93&>y1{W0dKw;p1kj=aYNPto9C1Q zrpK}>d3^DM_ZZ*d2eGsEpi|{)D{|BIT&oS1k?KbT_jljli6!!*mjuD%E6!u}gxPz; z31+C-D@G1o7%;F2QO6xQ&A?-Sp?88jabgx5qNW2ZDynlcVC-9@14ut#T5W(8#fP8& zV+7wjl~*KyXKm@Y#XH*11S2d3(l1_wPJ#O{&*39ni?cLCm!6oBy_a1w1$9h zE``-Fwj=+jpgOs5Ql%zL@kcxv^~^mNS7>jmVb@|*{(oeBWm}wWu;d_vySqDsJ3$7Q z;1)c%1$Sp~cMZYa2~KbVL4y-4xVyV9dC%GXvVY;Z?x(uDs=C@{1({P=Uh@NSa3t@Q z&M-$JKDlvQPDz}WHt%!p%jxME@z~sCW3+z>e*RX<3hrF+w!nNaz!z8L9b(>?idaxN9({?o-7;wKO%njGF;|tbmHU>@$u%kI~ApPVy#+_U5b6>x}s>|Zf5`$ zk?+nFs#ZzXsYwGmj2GO8>lDAE;Gh=Kb54>L>gQ=yH2d2w+tq2MNwL&0!^=;Lt}ZPh z#mC1puEb5_OkBz43j0XMA!k|!7x2ISe9y0kCQh9^TXhw-5%~REXb(3l0q)DsVf2K>LIcv#%@%L?9Jl~2;{3*F5Qrl#!Z0@J;Lhw_;3n9M4T8+}5r9V_^mYozf5_qe-L~SJO zPr@bI$Ypt^KQcK}bupjBHs1n{J1vuG=2L0+b=$+0svDR-A~OWR_RB8rHS@%QKb$>Kh>|c zZ!WtC4T_npsHgt4u0<_8I-%n0gj~#(d1$KQx)wJMvq?01JJcPVX`=;5>U6V-xJ&q~LA z39I17Lowj)xkR^Q{RyN3iUSc&h_Uwcl0a0<~^-k$gT}v z<4diWWJv*7;MI7~opG63ShX7CwnxSaz)q-l@%^%`BzDjm`-1V=vg7z#@!73Cn#YuZ1LJ*kw(wh04G+ z33UDxjBRo8m@PF*#9=1Z{GEztk~Pn@p1Ehl!KhT4}!vND%0H@^#rcp!DyW{MA+ga~O9ky;0=R=5u=-jq022 zy@R7)-4bvv+MY%GZF0^$ia%Wi_(`P)LtPdwXvj(dw>Ye4kE8zNla%UF(4=M1#!;K! z?FUTyYaKR(uvT<2YU>qy{x8f14!OiCb zOX@X?``1;{f2C6c^chlkCoE;55hl$gci~bQ?gME7sTwc@1lVbXa~c%T@^wFvKWw`H zDFdne&jUJZ274{1aELbD;p5z;`+$IdDaP`z-z7jyk6`Q;S=9^jf&FY`7>^0Ju&0%V zmp@~vgL_Q?Ut+y1aO z%B3YG15$PFef1XpMF-U$0*1hOs8y#xak25QJ=@W$S-r}RGX)sE-q@sEq3x-X?db5G zH!{S;e~((x^RcUsJXYJM%9KI!Ny`IRaz?X2W6Z65fND#X+&-+8siU&=v_3CT0cy-u zyM5Aynu04X$FHsHb&(BRb&haX;r(hHVxxiQiHlc;1*rXb_~%QP99}Db%z+V|62w4t zDCb>$>(hw(5R?(iRaGTnF$AeOEdrI)Q7N~A=4ma1^P+PYFqEStnyd~OCG z*Q#0qbRU6%%qSFqd+r;^(2#oN+z5If^&#@gfRr7k>ly?z#ExC+&a=w{5B4&$Vn{tG zk2?^>>axHL!4oP%EZ;li7J#D!@$YvLf(ELzRiwaDXoGo}kTvlBy_t1%5cmU)-$ij5 z`O^ogfT)*?`+}wT+@AOy{-(0STsn#Uu{+g^wdlfiikPeub}DKAcnycL_^hE53zol)z?L{TY@8HuFO(|5y>Ll1IQKJOnPZg3XKkc?#YAY&g&6W>}zmq*?-YeE9H?hIdv{TEHTi*2HHt(69B#Mc-e|l?ACgCzy^!M z^*_a`36}-E?TimZOw`AR3i>@r_yj~=pA*PoyX$}Z=tZqkd2VTnaa(%*%KQbjf&*)~ z<*5orB13~><=w$`Q^+uQeBci#bo>fhx(VKhvm_UBTgl$(6n?7jyBx}KO_UJlEzZl< z(eokL>iw2!aQw%{^hC71Nm5M`Lx7t`4W4nKpj04#Tzl+Dx7y3C zt2ONyT6|->yj$RyvS|9@}g3v!Bpfo-aJPXO7ysRYZN291i`96HM`;_VmobAR&R zuRd|64!3PG%zX`ooyn_Ey_bl;1{7TnPv*7_61sVN!EEtRz)yQ#CrHf)-vkQB0yi~x zJii9M3i%5{HB!JdQwT%{Z&Yk$3B@d*9)7<&pxd^vo47z*ZcQoiA%)iD-25c~(+I2H z?sl|VphMh^*s}!cLsDr}rBA5LF$aF(VBSW&K2zT$YVrcVM5hcdm?adAlkrF8gc&<5 z)_J%)g-8Wa6ji7upLO1BWKoP{mCV!8%IW-!=7uVCNk|m9UD=qSh`Y2vt`F4RO9RdC zAvfaD5HeHgBo`pE896(AP&~fb3WkwyR1Yj9N(C|@cZmOMVm?_t9~Q46AnTKieC}NI zf9pvv+D2|z#F%>f3{bCO$mFCRZ9}pMV2&%kDA?z{K-M^kZ*IwzNiKAGvgxd`st_4L zoE9oNo{^M;Cmba~54%)K0e;S~z6dq_n~WfTc4d1@RzXZr?Rp?ag`Z~udr_a#8PwLLwGy0Wws#s%6@&)kaHJ{RIWhVQIolS%3(4Z&CU|QdI=!0X9Gzn+5^6;(p#Mi$y&{SjZJ{{zt_{<7+U%C3GaRh+Ev@->FEhp z-B*OHCd$I4k!AR>XlVW$^hAXeCAA9rAa0@C+4#%b0Sarv)UUdjOcIKPn?$i@TvVIDss>||RPB>*qJ@@7ksyvE`w2D8KGWIt3hh@da zWi`eg)*tP%d00&Q)UNuHlMOq5JXH3$eeKlx!c@icR|c3)tyBK6Ti6*5Bph2p&Z!J(Q$(d+_7Vf+F2iFJ z`$Tjs6rgUDqq$L&xSjG1XQaBCkau5$8P1hROS|iSJeaY>_0pktrM389o_%OrX79cB zCjR_H$;RuifwP2a$euY=P0ccD$~R81c7;TPk;NXNM49RX`nU-2zV;k5Vu@7pZ)kW} zhdONuJ^DNT10TEF)rT*ew%(d^cj(xzX(fksK_#;h=B%VB{+Zu0_6|w99ZHhoaaJQN z7}kj(h=A|hdEpYp4uhUb1I?55I%-xxpPBuSRdC@w#TaVVQlfQpbdO&EwL|<7~T(;Y`zFw{g$fyp8H;3 za$9pgVs)fwmo~Khe*ndgJZY>r4!ptQEGfUs=oj9Ka%6DCBsv!waQf&isIFd(?s^lo zgNjbCUilIY_sRFt?0(xdr@ePHNwq9WBr2F7v118CazmGl_N4gN2bd3yeFRfwC$N=X z9NItt#YnV~AWEOdQEVbQvDO|-Bj&lB8Uzl#6KEI&3#i-vVkBj;idp2UU=~EG@pEE2 zYh~TsA4a`c;#(4+_D_Tu9I&-?M7V7#{%rmt-t}rKL}J>_AZujqMkLoIp)og9IsS zU1{a;0tQso1W=qQ4Fg=yAdnvXRUK>t#ji!MFdP_H?6AR?jNNke+JDK3*l`%s9G5_pXBFvt4G|nLQJ4B!w73H^#P-Vmqb)L7}jQt0Kkh#qbQn zMu;4j@ojWrqPb_#bXyM6<&nG8Il>Dq@n|A7>RL>jl8m!`%}|=bBp4A zzW1y`5(#!@fMG&NmC$$wN`sGrd(5nV1DVALUhcYP0uZL(K+(dz9(I*Ru|(8|0hM3c z7%xnSL;SG|iekW;GCM%Sek9U|)pI_2nfB4<88_YR1Mg1Z+s}a2R_y)}H4i z-L`Lscd+c7#($GFwnLM82rcew^fH(c^9hSb!}TgGd1R69YG?J<;%@O`c9}=f2zX8q zZEAEsv%X7U-Rm}q$KELU`uk$J@Z=`eK1qlUfm~CrnY-+~<7(rr#8F>S{^u(+#<>#? z2NeyJ=B#dBTv28LgCUT{IfpR?%CIe3;nlgbCKd!ba8B_)d>t5|Je4{ZzwFw-sJsi> zOSjL;;p{y)aKYdgmSHnR+?l;tc<7CP9p4dy1wMeu?$t0TE|BW!pp&SmWD_MZ7~R3Q z^Fby(3PhuRaml=tgiQli1A9%nAXc_FdpEli)1YiMH8TpiHep_Ym0CU-{nqbb7#!0e zm5d&MRhjk0xy?s5eBopY3vr}81!xs)CSMcJUdJ*f4FHPHe>BMJBM5BnZyV@ox~D3N zS-Oc0DIO<3Af=Yc+?0UDYr~jyzAlh~>3MEBHukWyyxMTCo$nJdOxna+i=MVojA@kF ztD$7*jMTsX8#D_>P8SSS0+ChQVA*qm&tYqAN3w#WF);vj+$KS+UZW+T<9p_)DRC0{jIlINioCDg4ab=c(p*u z4CXe4vPbR%#czqz4M~J>20P$CoL`(@4-dwZ`MqM?B|FCc{`}*Ic4hoHfRHaVgm;`n zRU-P^fO;-*68DfrxExk4$|F5~&Dr7S{td7`1JT(Jj~)#DzfL!dZRF$b@s7EY4{8HZfa1jZ8e2a`}hO@5c|h#$e9 zhLtT?7dX(Pga^+Q9+^CP>i+k>-g{Jcyga`cxD#`n$^zb);614(ay<&UGAf=Zwn;uH z?dTaCB34!3Fs*=|UoS5Vi1CH&y1szda zm%#)8JB8&SMfs>WBSg+rR5ody0kyAT(p+xWVT>%tSA-->SZdax+vt|sJs=Z)JPMx8 z;U~TW^qMzq@b0yN3q^Nl^1^R@a%gk+G%m_ihpR)(*SJ&$lGsEK zr%98SL??FUvdWVvriy&e{)gWO;Z90v2WL@CLfv3C>Sv%VvB;KCD(j0PoG7w2kq@Ze zr5l+jAM}`S<$M_ zutJZ=pN`Uo5OgaWqQw#U0raIbWpogZhqekVB=O@c{3EZx9n3rW1Df~L>?|d9zQG#T zff_}x)5V41;ltAWD_=qe7+rCgeA_yaK z8^zRQ8?ZG91)#`;a3ZP*$lxPu3TwUh|L1MGkXs(2Jt%*|ef6IBA#x5zkDOz(DXdU5 zSB+Q9XY?(8aC~>?-jDIuJfB84*LwGDuPHiv=fG90HUB3Ee4ffz?8&NSnPVMGe)A;b zVvh59*LsCn)nYh8WSur(8lNHCdQNOmhY$n6`45M z;-iPVpPN42WbIyF`i^k9zgzLqc$WUA@x10(aHl2o{M9Nxwv7=|eBk_Rd5qD>$|alzeaI~1gc z0!yuV3a*W5H-1M3Lz~Xt4hVRpqZh-=b&tM?d?`3qSfg zw%yep9p(DR+=*=mu>F19xx1-2*6Xx459C|=M|s8?z8;Qsn;@%%3W6gazaMc;X;Km! z6P~eZd++u7qre3ODq@lOc|2B?7c#G?2_%YA?hA-LwUB?~J5G+?_U?u;ucZ5F{OFSD>yNc?T+3yqVdwJ#YXHJAQ8?el zJT14yWQhcTZL?OBz2n;(C|F1XIVxn^+cA@YO1QW9k3*ifhg{FxwW2&it5%@kSu6Tj z0+FPkgPtqLlV#t9*{?nE-!#&dK2o#8OD4>0^tM4i zdvOYdS@k$?|IKX=PM$DdT;3o&DPvGru9eyQGa6~^`}pVHWjwyt|DNqWWLHd#lQ4z# zG3z;0Ve(44koU4#ll<+6b?k)rK_1LFxyBe7#IeKq+kpg;q8iRlyWhl%$_<=6=TM z%R>0=>GOlNP6piY1RBjBs^Fiu^yC;b@Lxr^66W&ZB67@xv zBr~=+FB+(RrCuad4GkNn6l`uq87IlmLi05vZS~|op`NbplwY&Pv<}^H(NvDfvu$s4 z{4O{c=@#mLUk~Uu40?C^C7BDFCDuDJz;R2dmPy1D`l1Lmel5qwTLipIL#7O!rb64r zrM@~WI%AdpBhsvW2auZY>4ARwQeBm51wfam+F&a@UGq2&77~&OSn~x__#$Nlkc5>Q z8aX`0b#{AnbZlLdY*r!KFL&4K?cU?6+vE4~ACiz?Te{S|G|(ika?MJI!_4M}-ioA%b{PMg6Vvn;ND*ESo`*ZYPhOH zL&@EUvM=C*oXpvWpyf2}H?!U##@9Y70#@=#!}~@uMMADPa8|_;k5ZZFQX(Qdi)INW zrxsY(bIC?Cb5#$=bJcf=2NsHjTHg|I?J(tDnZe2!lr=$3RCSrKMbVguoD}4Wm3aB3 z0T8p1TSw1Fo%L4hhM6Dq!)}eAUDJ@Xa$`-T(S36)U(?bxMIN;$ zv84A7{2_VoMe6>QREOi~PY%zxdh6zcg|3nmr47hRuWx$mgKz@Guh|v6v{Jmf2*;r~ zRWJLIjY0gmiCz|3u$GroQ)z##V#L$zK{BIjBz@QyBwpMYD$s`U5vh(4>b7ldDXl?T zId)Du1N|5WfvFVyJlHKC<2uInRWfRnfML2mukX-o*4|rPHFNgEQ3cVS9Q!Ukbcp5n)P=o>gfO?(87`gM3nE=mA%AC0O= zzBsz3&(I6i{8y3cS?D38|KY0ZwbzeWQa62;dR6=fr5F{ti^NLcplHDlDX?ICue2w~ z=KHa5QW*Iz^2gVP#v!c+etl(}9h6?t-pfK_zFo_sup6@V9S_bpyM1|6Gn0zNAtWy> zMm?Bk0Ju8viYz>@#>uEDd_0yMt6Di(az!7{`kDR;51J?602pKJk>>F!2rZ?39B4=%xh2lfSyE$}W3`>_94#I^!JQaWaMeUh>a z?(~;92=ab90N_jkuP;k`Y(CY;MzEWfQgUn%HX}n*%rkz0)N23TG5ofCT z;X*D)`1#TA0p8!zdw03x{|P`_{|1QFd(prVKza|fD}#k{j<5J7KmFE8sEO<2NCXwL zX~!fuHNzS*krAn0N6R>O^3CC`dh4&m#>16z?%mU1X!R#EP=ki}~kSOk4&d>-Z zR7)C0%Qkz^fE*pQ6)C2sxrTUe;9gSRkU2kEQkt{5p7@fj(m<3+c!mq+pb{*dKlvRC zwXTrifEXG7D$V|PbATOjgjxEct+ zS|PR+Z23;u<9O^)D%B!)rFB92P(ffCD5mZMU-OFifApI^7V_krT(59ww0XhT$INk` zmqgc+O^#$sN~}x_?Xd{qF5=Kt4(M4_OV8%cmwOLpip{^jg!h*V!HFXasAKwVV~7Lr z1y-*JdCi#Dk1cs)RASYk%G1!eZy1*9(2M$X7@pr>a5p&gTCMg3y}x%qtruozulC{J z6}g1dc|qlu?xnK;iXZfUt5(b()t8w6>fPtV|y8Bg%)IiuY6Ps;`3r-yzqK+19a^ z;E=!<=m|MjrHx;hZ^;-iJnez(1mT#kpB$fXVu{{27*8pAx(*gC4gOk$L`E)RY9*Bt z80H3b*vr5=<_!tc85i`uuHQGvpufhit-BpGp*v!pDg7t9wTAq|z;s8|3dYVlJO&u| z&eeT-4$PC*a4(biovc*=8$bwuN)7iYjYereX8;?St(W$$@8_)-zQQfa7hKuB;Gw}h z2CTKhHe{TPjns|Lg5e3IT>z7Lg#V)F}Aa7j=y8mAMx zI_Rgn`F@j-#d!6bfU@Lt;RK{#=g@e_PyqR1F8iGrsPlv355sMf8kkd8i2=|1iMAKw zp6ydvaoMkiq<0HHrQ%KipU}fZVuRPYRg+$f-FXqe(l)A6r z5yj>db3SQMHBp=4Xh46ZxqW6pxbywHX0fo%@X@c)*2^-HPoEiybWbt<_HQ~oEwtgy zoZKL6>{%u}t*D?EcLoAy2~2Ac;OmlrCV4x2WZw~rLsKs$GZI$#oJf&+!d(Ov8*KSn zmncfJIG?B_<{L=PH{u0|2HzX<@RhmHuf4KGm#f4gqoLkDMm9;_EPx1&)kYMi1Kn7p zo|~J)*FUFI%pJf2N2GNQI)|(5d_8C&h=`>?#IBk`&tvjbPyOQIr9=w#x8V1HcK>YX zxQQdEev!;xDlhT-SDDe02#v&-vxvll0ktrD1%Tr;KO(h6kIH@qF#+aJFytjq_f9)FgAuh1`(C#&q7bE}4oF za`vNAs-!tquZdUEHXCtMivS)!Z)oxj{cIJgjDnj|1i@2V!^;YBB?Q zW%>ryJeDcCroJ{Nr?*fM*!f>h90YF!u~l};IAchRLm)De*YAtq|-*u>lYSTCLGv50yv z+?Y%C2;sfncFr6wXJp;mbJdF_qwLYcu9D?Z4rTA6^}jtl&R4tbAKMn&5DB}z($cvTNR=ST4w*aGh%}3eCK^4O zkQ`pd1p=Jj4Y90it#Hc^=<)HNa!qa7 zEiG^Zpyf{SkEH1lQ7@6oe#N|6=F3TZ-2=&8wVt*1{Rz)~GXY+?*sneuNH*MTkzbi? zb!JWN0dyOBb~0#n1VNnmkr};LS%?f9%9gvxsZv6f{|Q{_)Bna;HP(+j<$R0KgM*Ys zuI=GXL^Ls;hI^^{mcUacrh&8qf}vMtH#uiK?#j;A&KKnCZ4MYuA=c+0dz^cf%^g}p zF$aMH*XuWG7;vZ=(pkB0@OP|Z$UVY1`JWKjyxuY?_(4w`+Q{e;B+c$&u|frZPYW(- z`sgr(T_|qJafl*BWK!jK+89ZHunG!z0!km*)U1uJJ^?$Z!T|I3XI{XzV8=d6Gvh)r zB=b6LSdO|hoQYF|usdd)utak_Isvoa8XSirzzxh)MDH+K-#DR4O&atfk_5}^f-MM~ zer{$L0tO0)ryFai5^@9kY+#5Eq&C*>~-}<(p~s5)|QJ4X-(;G>t^?y`sq*=T zuV?|JZaJ92tRF6I#~LN_-Z(4dh2r{7Ox^>>^A=7i-OeZj;Z)g&y!U7Mrf>nn%a?>o zKfRU#`%(E9B>D`kOcyPJezgoU{j~5rs38g2EpI7I)F_bSOut{0@Xgl7_cy}XBaCNw zSLICnmGqiuvCr)wz3pE@R!U|Hmz@WRSbz|`Z=Yh8^kV1k|0bz*vx1#?M}f>#sW9y1 z(yCEuf*)`mKpU<7zlJx=>)L_b{oWb(6PVA~0*=RvFw%UwsB&C_6((_kU*NX=JHq}u0fB7Ai1dS+(6GZm>-Yl&UR zM2}0@1{AniHlRiU6EbhA(0S5z(B@!#10_xbhQx)62`d>4(SlpEmex>y-g+h$RJvP&sr3A(KSi-SGNaPLj1~(%fjyyrb#%YM zqhQHHjhH1NlQzP|L=@PI>FG!V913olNP*ktgcUUtqjv!d1AHNjbrCJLPqQn3pPJS_ zTs{f!MkGP6EDnDev>vnhSRoQ;hCW2jb^Qqm(h~*8iEM=ocA(R=TgMD$P3YjW!7f{Z zW@=xihtp+mq7iy>0TtX%KFV4SHdA(FOkg4>#mjne8Dlwd(WJ8<>dgJ{QNhins zrFUJ9&>h`ftDH&M$Df-gl`!g}FB^>%SA>a+R==T; zE^K-yN1~EdvI%K;g^i5@$czr@f)Bc~Qgb<{U;cJb=^6nW-D_;EL7H-7*a-K)-kRMX z-7P%5A!Jo85Mz`V`S$ZXfmSwvb_vVvF|Wq3wh!36oU*dc-L$or|fadhw_A`c{wycmLV1jHflfK20pIZM|Pv{`{BtmXP`qS zd_{mag z*}QAzK~AIBA!v#q$v;x3O6Ha?44c>7+b$wQD^wxTpX?x7;0l=5f@mOY(^nG4m zb8}R-;~PS-BW%LDaxEF2Eg5@E^LCN@{MH)CKin?jM=>}Y%KHU843~yH7QD!PH?xpe zO*tyD==@yUw5H@@?PMk6n{{r1F?v%#Q!z{+#hQ`X%axF!cpTWk;fm%T?O!G%kZhax zNLptt7{MR;_{=!@TyrtTcV!@Y^AeD~TO10-Rs6N7#YXFjl{$kDZ~>2`Yzxm(N*@X_ zB_4Bg9vH&%CwWK}x>26-JeR`wMGiEK-}czaifrWnsAy0*VJ&^aJM>}$xfOd%hY>(U zHzX&yzW-GKHeD0YjT!e{J_kC+XyN3lKjc~h53=AfG+LZo31C-i4ch9aoKKPl%mxb-eIrU2oWt)%m&K*8}m)Zn*Ep*g@Oerf%2p;wMUHR++QI zoDO8=VNzm4(l`b-2JJc$6A&{isumCT=4^DhFUBo;oEPex1-@sV9k#&*hgEBqVK1*+ z(G@dvU0R>p>bMC=^%TUGV5My?*d>wZBwfHs^@1a&bo}Wkipi*Ha)LTk`oW_-zlIMM zhJH^pP3a8CUwSJ34i6rTCtn&I+#yOL-F#s7pspP9u{t0yG02o+g=W$na=a|UYKXjn zW~6-Blf=;Wb}ybfN0IKRatD=a`~7Els@GYU+DvfAL3$chq87yez6J1i9lr@L6_7YS zr!o4((3hG>I?Y6v54`(^#+*Tp zm-U!dF*l16@j@ZXV4PWK&@*<`6YOc%&(I^}bRnI1D=M<`a@H-vZ$Y-<|F_jp$$fL? zqiDZUDRql3%k|29@5xWX4$y>!To(-^wWv|gDI3BgZocL>7|?m%JWz&w5Fk z7qN84tZZ%(LsIvaX01aYQQFBYBPZ{z|8Qoq6T?4`Grt} zk^#!aCK{Zs}CjqnZ48hQ$Ez#lzD#eEkkb~qm081?o-B3 zVy=>LW?giFoZb}*&_zecAt%&TvJw{lnSwG`9>CuI?@FwHrjlKL%QU`}KNR4dtdP}> zD-b`w!iG)|0;2dnRDv;U;J`Wi8>NsWV=j3DunfVtSPfpNmP0J7qXmh!brcAbze#d@IJ}y8XMxHq3<`Z|P(^z9q2t2zOVJa38&EGJWdzX>5m>f zu7DJTS8?&Q;NY-&_Bij41=c_tgDFiBGOXyU*N9=;9Ddq6Xj%d^YS9Mj-nEe^-x$PW zRVftu)OwGqDc}+rNDJ$TEYvLtS5>0+A4b;ojDF~g zUOy*ckfx;M#fd^K=ju2nW^0Jq)A<^{O(PTpuJr#0rN9b z6F1M`;8&-=S2ci85tbt&6@?pXTfJzM&)?*or7*se6NUYh4f^a!LxzpgEc`*=so@-) zNcrUx4Scgp7};G?$W47qjNklE8!>mmgV3Li_L&V8Rc<{l?3!hl4D`IaE_27{1-~K+ zen<4|!E8Y0!pn}lZY`B2787vsw!@tOsll*iT>INxN5KTS1CLEvk=NiWD6?{-+GTX z11uaVzPzlmbqT>Gzh8H-FQlARL4}M9mG;!ZBqbF{ArZVeVvwqoe^6d4*dmUDiux@S z0V*sGX5zwA;O1`RMa*cGs#{f)k&#$O`0twzls3U$3&&IApVRy;Z=| z0;W4}Zi0m^ve(N#v_>pfD9%5TKbLaNXymQ0>$5onF9g^ix;i6Bt3m2Qm4s?A?g-i? zE-AAEXg1Z0rFNG0o+l3uT3Z=}WF$g$=x8HkpX6hX4g^SQH>c`a+l~WrmBeWlhBBJc`b2bhCL&w_MgPGd{7fs4X0s&fa#&h~4 z(Y8Btax;zNU$njC!Va@XzxS_yuPx73&ymVa*93=jr*dIo?R3CVqyz0mc;eLiPdvMA z@i;@#Q(-(Foj#L}fqcH*}Efq3@t?4j$}dBnreqHut6S(XTTDP;TG`*_Z63zLD${@46b6 zWpm@ZHU6fYYI>V#}O4jZ*mP0v_3O`jfEvNuq~-L(-~bwRPMEytWrpX!ARc(`*jV ziJsI$z|Q2K8|SU1v5r8&zrBu~)dH>3NpLs7U@Ex|U=&qxhD#z*c_3}{k0aI)l;Hs=f zbxv_Y@Khs_Fb+yI#g~Ps%1RtUvmH7X0`mm&2*CCq1kUbbr-4GsP+6tEL(Co5&HerV zEnWRLXs4#hj7IzA+VsnkOyiIG1?S|XzeQ4``3SGS%0Ujl=h938rn+IQyIC~Ka)X^- zf8^~qDyxc$gl00a9{cn?r2X)msd8JboTonnGnz9g3Z!HZVxqX%K->D@c-s@1-^XuY z1e^ku?&|j31Hvtul^x^9@b3y?nKjc63L-z>iuHs9!NRp*q)lVGIRnAow4iY!pjN` zQhef(9IjNZWWg)b#MhYw6We|#C~k7R=nJUbE9EPYue;~pI*5nqQa;7h;I$7#L=?L`~+%9-Y) zvjb{lqm#U(W^EekL4WeR;@i+iA$(v{q!o-J%s;lXx@T{m?$S7mT(Tr5C_aM}@vkSR z>>!vg6|4pp;hW+dfEf@xt*sKYN9tCTDwWBqrBq=YUgSkb!ryweZ(%AuDM&%E-=F(j zqMN7`^XU?xcSLJeJ&(F$d35 zjlTN(Mh4yE6SLIEB!np@FG$tj(M0vlOuD#Ja`_zdmwp@c8U1Uh?>yVzV&7@XON7lu zaq(@;xh9m_1j8uY0>ac48DNE=+bMT^yc6&fDnI2li6i9b~KqF`b`hs>ANyU|cB z)BTEN?q5NN4SnoJe7vxrT{xAICEXMN6?rOW+s9?C-w3Z5 z558Ko;?zfFY%w;}b%;!fh#9^QUbSz7wEqURw> z0$f^;qTpM#;QxX(>_e@n{w&tt+|zC;Wg{B>b0gU}UhI6Wa9i}@f0a_625>6Ca}2L4 z^OV>$P?TRIer8Lu@r6b6>pk?KK-;SzWRDNeTxyQXk-NAYL5;tTa$x(mVbAeMY@UGG~m~l-l%`eiLDuV1TRJtAH{G zLKnd%mCa8&ip2W-B4kF@U_M$3KCL&85jNUU06UZxGcO8QcxO zBaMoVKA%eC4t=1M{YG&C@3+SvoToklOUa&BjsjojHfY6%@2WV&Pq*q8_S_(J@QSyI z-hGschTpJqbV5!s?m)4S8wGG#x=(AftkSDwE)}C4n;ertm%V%`C;t7l$Je;GH|;A&+Ae17Q%GH4}40~b7bRUJnOtR4?Y#L$F!=~9-R^1 z%*DH!nsHd}$cYXW6a0RS8$3`=;>b+nOv*4xjw4LGBV}z#_p>}RRZW<05aPcK>y%Ut z5e#|(e&p&cG@X-FwK1}D1to_eBZ+z;4CsLL5pQI+$QXN#97JnR19?+F-7rHC- zQtPA7wjp9c&au=~f{>P|k}c)GQo^+<8W_};mX>~4i5GqCmhFXPNxHZ<5A%Kd=xm(7 zp8M6Z>zmSIUQ4uzbTX`Jc(N&Dy-}q2dlImmWL-Wr!n+G_b&b-pm-j0bP*u(1s(hXt zEqr`wY3ZnkS6|5U9700VRwge#etDrCe87A3Mo1H_1qW69MQmtDwLjBwPeWCsC!S&? z>Syo*;zj^>28h3qWr$1MrHY!tV$F&`n%o)EN3Z-U<6GbHBi^U2A$mTnWJ(Z9u@48Y zB2-N=dT$bcqz+POQY}B&Rdt#Fe`q=f_Bz<6YwsP~Hg;@Vjcqq-Y}>Y-MvZN@!H#XW zQ5)OVm-~5-?>}6}H8X3iIR`1y9W;ZwvmW@WWr@>X`@b$SQ0Oz*nosf04#P+(CP<^% z%gz7@LW6i`?1v#0bDfqdng{L%k_La|n-nBAWS;mcuAZgyP#4J%r*z>@4H54nJS`nvNq zAldkR+hnwFET|dpWA5u=|GXN5QD@p-`PMsdB0>Cn0Ln?+M>Dyez)!eSZNET34}p|T z>+c0#`8wqz7Rb!#eU92Q`|rtf$adlS%Ftl)P9N0K3f%Af*)J|^SHpaR{!O| z2$=P__IQ>d4zDO>{F+uy?AyLmuAoA3ABLt|QpA{}nE4X;AeED$r^&I=REwImmE2w) z9$Jx>1mQc~$6(PYE~2^7Ukvd5%~lgdvCrC-A*0ys`3Ln_7EfnbQlI-P_7DTgD`|GG z1MysC6S1$a?S8(%m=7Q5$1Zdsu#l51UaqL5$Uq~!05t%> z>8A3i9EI}uG72yw3t*g(J`jR1%erw7aHp;^?EJ4s5Bvp9OI<4F%l<|gD0VAXD}r@p z;yD~{M&{F_Dm9F1B2T8KlMAHkGa`Vzx{yrXx)XPVy!>cojLT@WJT-In;TQZJiyh8J zZtV#fcbBSqy!aV)S!2t=v~vDQK!uQ!-ZbhocwEmKGaj-gY&QEh49vrO|MkM;5S7%$ zuI)S3eci>Xcu9dZX>ZNg*VSsGEsunxw_ztkgYYjCT@(cBR$zACzML-@X5>@x7HOh| z;RpCF=INS&$uZx-=aQN<#D<(I!_3!O%%G?v8a%rD8#_80!HhrAbIW_ZTR zw-s#aUQOu>4&suWO*{bqGezvpGU#mMoT=|snSMqUo~4U76i$Mkzp#Wm!aPKPQN5g4 z*qI`p5m4R75$P~+j58eZzG@?7wUV9qF&`v=IO~sIknxXjmP8MH*nAhbDw!a^b>A#VtX!XjY7c4E&VPp>XF!N1+| z9`O_;#%|QdbSrDzKD!y~BF02O&NDNastX8&8KSyUH(;_(!IDWN{qwNZ`kVz* z@{P_BPUO8CHD{;ck9m>9gSN(1(fG>qQnmI)oYMMT-yRVTpYro8ga(8eSaJ_(cNUs~ z2UHp?5hXm{xQtvERGbfE8*VHdM8x6i)^Z@?{iTg*4re#XJC#FwAY!S>eZZx$&bbnxjX$LRe$WTdbN zBuJa>IX%5HQ~2UI_ZeZ}=I7_P&M9su%sYB;D|XgLTYSnzCp)75u0Wn$xC(3*L5dq@ zR^9$qK?J1$Y%?6zjeXsi5qW$3c*1+o9ZpwPP&Tq}E890;vy$WGh@OC!VZH1W^@e4y zZ}HNRms_RKl!ptt3FaESl5gZuyhucTRqz(f94o-M4TnxtH(M;G73Ak%_33H7H{%r& z@|O%5orGFPRSPOgZ)-xV;fJO*tcxc_Jy;OGP^BEROtgLFna zK2JGe_XRVFFtRLB!2#+CZxoR9-H8P9ov*A^4~h(OkTsG~^vEFN@r!KGf*P${pWY!e zrx?i|gr44_jlC!DDMog|2B)Y1Q8;^HsUOzRXRbv&*(b~lLRZVWsMkP@>T90>I@rcI zc%x9vK9Ov2;)jqw5VzY2GzL!|P3x0rhD(sS#6~Wi6XGVPwM!sexI6sYp&*o4$Ph2L zKYLkM=?vU>4%elI38jnXHMJcMF&HhG3ajgu@dyLRjkDJ4n^W~>aZx(zP7OuKA9Y(n zHfZuSLfXL5Ad*f_s#Is8JBM8YkfbDS(?Io6<|=%FCKD~pMQMdb!^4B*srp|vuaAVD z{urZ(kHjPWW0bv8I-A7q8}&lBCS5CPP8*f)Y&Z4DA}=)C`zt9(AX+@>6}nFe&l@)X z!hTfBp9c@g$_Tm^PW%|evATCbx$Q5{@jI!dnV+bB8ST;4dRV4{7SWlAT8#DZz`-j< zi13(7HIc3e5O2jM z=WcY{V%59A(>nM`X0xN>CB`3)iS{+tIk&J>7~z`$FQlum&fUQ0u{q-lE1HB5rYNX; zu$}mrts+ib4&#Ywgh~8Z40nXkZvd+}b)2yCizx@pXi)xkMQI*E@mC3-YnsrH>&U|c zxLfjB;Y9O9wAVi-SRsG<2=j9Vi(Lm;q2sCpmBsU>~2TPpXwo}mO>1Qn=KY8-Px1@ljY z3ZcCNbCHO4-QK(*1E_M7>;1XBppszu>)Dfth(lzIag*bd%;4=tJGm=y^RBEpv7|gs ze-1fyxE}Jt_J9#)I9)w*Gf&hl>|fiemK=b0yrE?2vrrVfXJGv#x+I#gmE?`Z+oRiV z)OSK&h}8iKM3lcy{K390zFr+oe|gPYk7s-#>-Wn?jdz{WqY;uIiJk-mtaDGp+)u`V zF(S%M8WPfjgAk`qnJb_6CuGBG?5x+m3@?xg4*`?vNf2G!b9n2obomy(d6Sor;)V&D zhw^iI(^A)lh^PG=P-uqXQDEFu<`(@#xV~_}>Xz*Vmwa-g9 zO0Og;#F`iYkN@B_@{Ymvo`2azONFq;M*zc8bHhfoUNbVSAeFm0GE zKHl1Lvp+EQ^t=O<1hzP;IC}c*48J*dFXM|TAV>we17&{;K(H`jhjXL4@DiU{AT>qF zP+2IT_B6!mwzth9}nQ zZ+~Pk!AU5eQqj_&r0py-Ejm`JiSg?TMTQpYFUP1QsPzJnHywJ=4l3y-aV|vQJzMbE`l%s4djf0nsmsA;&;H?FV@xJgi6#`EQ(6s4rc2JdX*#`XOF9*kXC;*MB|+? z@O`2Db1t%~^ZpOr!7Di^FmJgr$M(OOa_ifFJt&h@WsipLc8Y$GpRk6$9IrX!wrE}N~o@%qwJJ$4}6DMm+%lDcxy-<8cx1sV&G~w!e(yapty3^}l)u$os%& z-nd6++6INoeR6*Nz;da0)=5ZEaensW75ZG7beqA26d2^)26NNBw`U71&NCw&6}{Yz z_WCyMYm_UbN(1q6E>x0$q|20=EGy_AIO>mwi%Wbp=jeAr+z1rUgrC4hW|^6 zr|4{dJ79`!q_Q~>JRj-RlkiK69pZTYf&1YUyh!nzhx3^xNKNv`3gRbu@%GI!pTkQJ z>smPEgE=5SWunAXr1o$=Pp{TPdr9g%%Ec7}?L+lXH1-G!7VwzLg{Uwasr&s9JyW6~ zXV-aVXCN`ZUhwH4yRwqfAnmy`rTI&4Wb5yiU+vNxR$F|`JHm?5dg|#hLwdyl<%Wd4 z_1`HGgPxRq$XDMeaZcYE52S??I5Sj18FLyPi@FdKt13#oZ`hL`AGP(uzq$TgTZw;{ zFzV&kb!6whQ1N#*F$6J&Dv;PEcY zl4TV4<;$BuR8rgSqsyTnKMG7V+3QZGZq~YdzV9245fSQMWI^agRGx#v4pK_@7>6u; z{~of$^1;k5>eGEefF+7yfu4Z$ZL#T;>|cfoA{a?m3xcsFqKcyh9)x~5#+$bb+e2E? zy?LOa37}VPKi>C4^mLjNlk0+E5@Ce1h>2;n`u8?kMK6xa=V*~V0~q8VyKGg}?WJG; z*sg-eDaD~@p$YgX_(@1uY7b}Ooef)Svc7dV@>c)*+h6~ife=|{oh4zD17OJziQAS`$wOYogJ{tbXkjnmB;Oxx$=Dk)kVQ}aZ$H(r z5&E#;FHfjw%>4vOjjKP-p#3A!n$at0DKS_sl0fKA#oSpW!CCU%5N{QBy5ZsV(8{zn zF-6GXxcB3|SKF+b4g2LCd*mKRqVnFuQ0L+LOZW6uPMr)r3ankFag;b&Hk9tR#karM zY7WgV$(LVm;lKaxHSd2@_FTTN+&FP3T5q)#S^jgD5p8zgQm~KMRI(-R{!TqW@F~A@ zGgP}1{Un=y`dIUwu@IE(dtAX7P^uKwLD z22;Ko?BW$`IVF`VYc3MiIf*YtVKc>=uN=hp61}9Huk$9({{9)TBycb3Al)sZB|(7q zbEQ(@1@v^9YTtGxi82FwJq0h#pGct+3CrScOsA~gW;yk%W4;}dQ*ar7`(hPby+ZJS zBfiDgYv!ROUF=#8QYiSbOXzpQ81x;8274AxFHQ#)N3S+cQ#vA|ds0{fc;)@@uOl~O z1jnW%r4jJrd?7+?G-n3>6JhiYXk;GS(}9>stNry@sBlO3D46GVVT zuHVeMDOMgr#uYp+5z3oZOyTyMs7;?k?T#~ld$V-F#=-hR4n9oE#&fY zh@+e4w58N?l5~_%!;oP7)h zsuq^6W0v1pB*ikmVa=#4eS5z|o&|)gQZQCEg%z98OwH%GhM2`D zm;TD3W6ZS9;oLi9JpVfewV@`!#M!^`7mLRYYWHw~shrAh0RH=JgbnN}Xy(&r{PYw))K{MGxM88JZjPr!#~F+zeq!%@`+hOASeAkXRphsZG z*BVHY4PnI$ZU&Xpfl(xC>27SWU&p|C_qfd>aRdQ+n9ZWISAjw;_rXQB_QOWD6*ap{< zWkU?uVhK?|V<68-tm2kDq^Jj(c~W&Z@&JC(|L=Jk^+FAE;~8Xhibb5{8y1DZS}-un zdwoS0Q&KA^>TdXuMi&egGbV++IIGwa+TiP5=Ogm4kJ(rIDPk;x*H*=DKb-ZG;aFV+ zefPL`Pv;4y<4XwbekqnMP)D`{j7pKA_yuKxaU=rpE>vg+3N0UaPwC&Vl zI49gY>34DM_5WD_S22k+W$`P4^vPg<7SAA+15uxmw599yKTW@1FQCPI3ESzJCO|@Q zcx=!$$Q2&qGw$C+3Bk@J@w~H_P1YYAo*i$ObH%8YQY71vPpgX;o4%fs9CAFW>LREC zU$I-?N82z!F7vbTXw`J*E4#)+YB|1uYjbX+Z}lF*LT_vF<89YRz(_P>FYtW|72T?5 zu@ah3q!ZNLrTwxUJGK_1BIR8#vfmm##$D2n$n<>VTC%own2qj0!COnZhJ+yDUUFqvG(G!PQjg0L0q0Ehb z(j5$KW=e%#-f^jQ3*>W$VMcUU6@eZjHB8JqU^R0klrkm^4if=bSlHF^A)?;{Ao*fO zi7JCGC6u;=^n*SuiwfnFkhWRglo8d4=fz!aty%x)ETu_oQANX+7ou_g@9eSg7pGWg zuQ#gkE%!7IP8}_Wn67UjOz;gr45#Zt6)G_yrKa!ja0$)3xsf-<2*V@=1rd|#{-WGl~oDZgL1j?fafO3hN0n{3aNWLrVZpq65%(95!; zjsvU;thsPn*>|yDOzc){V&+etB)TOL_{TEA9n2D1=bgcx2w091u-(=wGSd@H^MgQ} z!e|X3XCYcDmz$XId`}u~X{V#hKjgWB%ycqGY7& z^@uS+@4c7wg#>bgB_>2HNbiExDWRB*7ggMoC8kT9wLUktCZu(#>}}Gdcr955@d8Nxt`19r}2bX#scXrzY=rP`r@;LagTAJqUip}hM%$75gthpxo!;uFF`5-y9 zbR=B2cqKoq;io7+o=A5b=Z1@Z`8*s5rZ5C21ikPQ0c1Et$B9uSjRU?9m^hN&fVCu= zYnC0ED6Mw`QpVI}VIKJOGJMFA8fTiV8shCxzS$KPLToUMdcPN~U$$9=Lwy$fh5r@& zBTAjy-XyRim8jgR$*yPqa{}*_6L!gH=DxRTT}+dq35PSZ%oH5D8BKuITaHQoYTL%i zbHIkg?n)2>$oY{CH~@srcTuQ>Awt+N`U_QPCvk`}D_hY77_0R5pt#ElnY@G+6_e#7 zzIBT;tQ!8btA`}eiwA}!EcRIOeKMEF-ldhn*j{xRI4fAKg2e<=Cox|Q_MuVifEc3J z#wV02@ljszt(Rb~8blvSmfox4H39k|u2nD3D7Qyt;ivk7za2EI!*fXU6*Q`iKZI3D zN8Ui?Lx)ETs3{mk5L0`E12P9}LZs`T`#(K3Dr zErL>P(?~NnV5{}iOiq1?jznW_IotbyVPXyI z<)@BC_D_VLhcT3Z(cxx1$mIzKrAZ(@uQ)m(526>gw}R07iMN=rMyPhZa1KV;(C+F=h*LW&^~JSE zEBv&#^=iTN+CZsz7wqO_+35ZVg-%lgju_QB;cscV`OBu5^J)yT+c|%m2;WGI5)t*7 z#lDUcx9CJopS(Zt5b1ujC729w0UDPME6uqqNA~RK%;fvs$2MnYXWRJRZ+`1s@0mc@ z^HnWsQ(sI72QQklf6$`9&V2bebtdBdemE5SFy33HKD34NUy%>~UyH-#_<9Uf z@u!kB>mp{%n?4EuoDYz@P!cnVmzKiaLF7SiKg1yW&nb2rMoJ8VOQIOva3tZH`eQg` zFsUN-R0>$#~n=4fr)Mv-@EufKqG??n+O1Guc<=rO5LC8Ut z9Zs`x3y3*ijuIdTLHq?3t!Gd`VVQHmAOd4K5l7Q!fqwyoVJNTVD0>$0`Sk?Rj*RnH zmP4-pwV#1KP<3^TUlq;B6IiOc=wTgR?wK7@a#CARpQ7s6k)}ET8+vN*BK?{U_G{OE)10Vn*(TtlpWl zjE@Z&hN1IY7&3&^T^G_s!4xe!qcwOXC=#aAY+5o$2Uge4AHn;>#qtCmf9&rfk(Jin zwLXEBKDH)LUxV6EcYGHtfs~wR?iMtTILf&+H6P!y^_^dzcg$z+X&V^4nqNS?p>m@R zy^UgWML`T@fDGfjeP&w!wz(&3yZ5ZT&u};7J6iIKtw|lYie`N7Jl$NRiaUAh%pjc##2pvd8#(4g}|B~82Ean{><8gsXl*i82l2Y0~@uJIuz+5+bhu0m4 zF|gtS7pr8tU8k=@h^zZHRqt-AF|XOs()Wd@#|$sBSzSImi}qW;3&M=J?iV5;-X-f} zVIG;sRk`Pm(FfJNjKF|6iChFO;P6JYK->f{&&mhi3QPNSR|v2;R;Fv3^!t3(W7$Ce zCF_`hMa%K|JH-kLW;Q8+%n@c$YayR7+nGK@Ubl9%38oGJ9|okLgtP~{|9rr&J6-R% zX?N(fv=iJslq*v`CW*`l+|sP47I^CQ?%!);EUYNb6h+N5^zC|sP`0Ha_DwqgVe;EQp`yh-djzGF(S4AP zZW`ZhOJyC3{1mBsVdjzMS7Bdw$V8>!LuihzUWJd|A*8%*0LrT)1A+eo_ zP9QNxg<_@hV;gxiL8nj4hx%)APq<~gUmQW_8W%Q)lAB2 zA73(8#QMhr&D~*)&9y&dHsD->nm>W4Z1j0bmB3mjb+L(+Qy@Q65QFIUlPQbgGne@V!l)Z6;8zRyBnA=YBY8<&)VU)8jy-&KJ!&(N`wIZN)My)~#}&T# zZT04i39FoRFuE7ID1G4cu?u#m;2e^xduqKYciMgX@rPN3pSW5kuC9^+$#1_kNS}(D zD5nM&(Z@(k0Cgoeys)*M+hD@?@MYOlcKoL<(btYTTgayb_K2QnCUK44shd|~-ZotG z&X$ndR~)%J+^(pCXkA%~98ACujDPUO^iB|91A?&g1j|39$ObQ%lIV%4gX4ZPIWz1% zPzPiBcWQ*&9PCXeyD$|R)*tMDOTeq1jY$7cGPnL&*@KiHmO2b&QH@l6-`(!^S^WHj zJ+~_&O>yv8iy~UkRF0nw(t?RP@|z(&gB){?Pl_}QO!!RGchb^-U`OfwW8G`&m+2by zc&!m3$UW<0YluiV{q}NJ@`~uI^{V?{T}ovN?gz52?Wo_@C4r47fF&~=WVebBI>X+% zRB9XvgPN<>&45_(hA(z9a_azKA!C$g6|fv@PW8cRp^9^V+FVtPHjJy#>sT~2LT(VA z(atr?-AGq%JN+uq-A0s9R0?p5Occ}vK|2ZkNFf-+1o&+;OoiQ`KvR?R6U^q+HQT-V z+h;w#C`$AU?qU0JKW|AR`661z4FDh$AuX@Opw8XrMGw{`k2T2C!m1o&yCTkj-zK}- z;M6L=MIg1^BQL&uH?LnQRsg8^(e`sG+2=_}Msbd;Hr4c)3qh)Ea~xCNWdb^tNV{%& zY;EiS+jNCm&ZQtkxqzf-^q_8?2BA>|Sd?SC40BDyWYO68T}5$R5&iD5*dTOy4-a7> zFPA6KXXa!H88)YkuXX>{y!H2aAK_wzg*;f-y95yhfG&lYuDxvvNZq5O)XpasoG<)W zU4;GFL0v{tU3Ln=84)uVuM6d5N+shWe-4ppx-j`(U*auQu(9u=rk7l$1&U2912480 z&Qxc9e6Fn9K@rg}T3F=7kN-n1Ebb{gjBl5y^n-*KoFJ-C=coaiM3s1$J(_OZsic$0 zR6JTX6%Lf#%VyjQ9~X$cmAA$te`zg$n|li*;KS}|@)hkFsXqu_rfiJZZRD(Vs$Gtk z)H1%XF1`O#q}9nJH|(yYVhdG>;1t}mw8_KRhzkA^V?f=w~Ef;t!lpx0^0B-q1UK+rfK&&^=`&e=Sl?&48 z7#CLn{xx?;BCP#N2XD&)mWqu*7tz$c#*?*V3)(F_$vsP4nWS3DMl191?F{QKbL z!grSNXQ7m0Q@Ej>KIr3s2+VSy~-WpIadzR486U_^nC?F^G+{IP43z@A?r zo?ITj!noDW%0*W1(a(@Ny2y!y#Lc*K@Jb{LlKgVU;y1x_`^S1(S${+g^bnpCuph|=ksif7A{t+yZACaVoC`Y@H(e_f7E3Vs)x9c@sP7& z!!#or)_R{*`iDObOfikvkGn$3OV(GYRe#@nTE1<}%@|ehjybS;C1J zt=`bFMN=VO-sPNCs+&t1ef9k?h1^+8wFF$w|f) zGtEfKH7nW}J?Y!t@qyH!JJleSOHAH-xc_{VUpRA^>g1Z_?P_*;Y%n+uU$_11|UNc95JcF{iy zb5*+Du&dxTJ&*DIQ>iBpmdz0T3&`4?qkGnp*{)9lFE3k`;7Q#~27=QQ${;`>1#&AtW`lSRB$<`!(vyG+cZ3OMn zOD&0Zj08cel2a(VC;K{U%PygfrYt4|5enA^n5U@KtBT1@a1B<5aBqPB#uJU3Ywu7n zeDEtpgU8E|W#xOj)}6}@7fKoP_%g$zK4x~yYJ3!EMgs``+f>tdeJjZO-NKPrI=PjQ zH*_J{y@~7C9=@WTl+v>I@GJ`p+G{=Wien1P1&~```xZll8)}ojCPo)Fm-FMz>Iu`V>1(W zlGM$RioBL>re-+xn#C7rr($9v2y_67Axr>fLUe8<-8U75zis41vbRb6@U90#J^xZa zKhnoK*=^5wQ6Fhs1Oo=I5*G%)w8+H1%^azUs|T?Y*x!8Rp=sycbA|1JKR?W1D@9tk z=bn{Ne)lH~yaHi1v|~xH0xpF+&&-BFv6LY6CU^i~;Bx8e=*Y|av^HG+ z@l>$BP4A23&+vIbatweiKnG%d`fs356_JueMTCFl!@#R1EWuLKd*s7>`STY07NKjy z(v;nt0unS`gC_z+7mW=!fts=}z+n?OwUw2fXQ;xDg&Z!h)b-KW=yVAxpeO<~_;}Ia zgQ#KJ_VXS!(*%fDx0Ic{e|V#lP*G|T^Db&J=ok}$z*>2;Cxl#pMOCSNNe!jOj($`a zvc16Z5W0xdhFD4&u3T-~DztxVkRDvPA|)vlP&F5x{t)5{;x8$QFsfz&rX)8Y9`rXVK0(3MuZ2! za@#(9aI|p|%oYc0CGaI3!6r9|3#f#y613!2TV+e{87doUP8(sXu*mT(P<-f}7D8rD z6vCt=%@`57$pf$}i6Rw)CrNi~%tpPM^bMfGRx*fy$L4Y%id`m3LlD8+?sT1bD>nBj zVS`vF>ZxAkPjY*S32#o>O#IKGTNoMGa*jW8ekCjlGa zcLGTT$a8Vomq!n4zg2(#>D;ST@ZMOoqIzLa**~V=7JN(^)(Dp$#2FL8#@-tQfw`sw zxejvU={LSS>D#{6ZkizdB~`%ND`5*?jAw(Q||d2R**!rmb z{l_7!hdXg3H5SdjQ1fDkWmb+8At0|p;N`;xvZ++7?LyHaO=^UisE({T{W#>Op`kGz z;OEC4I)u-JW{%SnGHu~k(`P`cCjVE7ti0R*0r>T!^-~IBtK}mv}K5 zTI+=G-Y6ZwE7<63N!b9M1XRd^OsxRLkA%kEL9HRG>{nDH-P|6r7_h>a$-kmPN`3=a zluka8vkX)mV76e1&%Z!J)Js1% z8r6iwx&OY@7?7yCV8LsPNS2)!nHOdg=9u3AVb^dDj5fiyCO%hvqWGl#jl?e(Sd+O2 zQ2X3XKIP?vi74CAf$6XqonT`7o>{8vq+nhBTjH#^m zI=)$6tVp3?0qFIOpo0*3;X7&3)-5OL$O0l#N5MYfvAzdI+p37$*FBzq*($A^ct-3$ zb)-2u3tHRMJ$cThE28f0plWQ1Yf8r7ICv(fKq7itZ#Yy*@nK#yc$CRDFWLz6!AqQe;CG z_X9isrE5s@;A41R#D#(w^ofb5a7V4Da_IkqXb^e;;FEnRtz-bqHKd#gXeX>bi-zwAcmYZyZP85 z!JP?*>S@Gy9LS{b%ie_|3niTy{W6}-=~9UF6{hkNIshmBhE(`Mn84-L-@KNeDfyy% zdTa8kE+;G^G{t!M(@A-Lu^p*7z+kFGS2f043*L@@}wg$wI2k2hn|6G1znGbs_XGMJY$GS}BIzSRHSGDOt{yR_|V+lcU zN)-GTISyl)RjfacCTi~bg*5zbEK?S>Gw=1)@UE5MeFyj>gnp9rx&}iWieHw?6%aA# zFNpVVBEGqK2lBOSBR|j*`@roxZk(?(z4M`P7G;E`>g)^XHj*^t@t}BAp1gm{HqZ;= zV^cX66#*U#0Fj0x?00`CUgX_;-g6~lrM@ukf)i_R#Rum8&_D+(#nh~5Vkaao8blYH=_aLA8RFay*{0Z4{dT61&m35| zIovf1wK5^%^7?q96y9#>8MVNV?g=*=GZ^H}R>WpxG= zk*)QsaJeeMNaD>%IwgmxW?aV>t=DbzyikJl%?N)SoLzSbt*&~>RKm0*3wHgf?+$&1 z0ABDhV5?Q7LKj0J0;Kw3!IVW>oNic<;op$YvazgNzE%cQ-q4BIU481K)#;yYmX7VP za@I-KZq^xqV{CO!Y&6GZTU-(; zzSzrl9jaH%=80@62KBh}gGg=6G^j-8pI*kVo4Mi#sm5_`BK?x=>bnLm; z@BV1(4e`D;IzDOBdV`>TL;I~$k94Hq?@6@H`Z^J%>v{-9hMZIeT+HN&Jlcu9m{r$E z!>~YCA;cl--lfJanq}HtI&ah?O(kw20@8$%R|-{VdGO6{^C#=DHB~9WT?MA_)XvtX zu@1i!zveAAgqDjUi?c3`l zqE4B&54v-Bky7=Se@FgIZ!8{q|C#h=GM`UYVVD=I`%^bz2PK6LL@T(3jNYTz)$^r= zwKpqBRJB35JmM@nXfXv^qd%E$W3lqrBTYLdkmUvM@&bZ5QL<8UnaF(pVjCuUr!WhB%*t{h++DU-aBw`isO^ z{|rygcIV#$7KJcT1Y?EQ7)H4-4>a^CfXa7K6QS^{UPzmT;@L*ef8b*GaEcp(b@#A+ zk$6duHk%9v+CO^OX~&A9KPF3R>eMWLI>5zYJ;xoy3vM;fh>wV%oNfYv6YAhKo^){Tv4Z855oQmV0 zILT#{kE1O&<`p$2G-fq4u17VvAajDwG$}^(bo2iEq`;G*7w^)kow`@)Qp?9-pR?aW zQEkr~1i!8vViLG#7E#alAiqC=pqi96EcEu3z4xK-V9U>)r7j}!++9bck#T~bTIG<> zWX83YY4S(n+1y^|MS<3SU3Xi_N&E_wQYWcI9E3J+F~qYnR#BGa&L`fb+)tJtIt((>d_{N&BghUSfnB5LG3C88QI);9}6xfQ-DbI8-mhzoI{k^-N^Z zB%*=qg7j_3X;2{N3YFc;$g}lh6lq$J@d0k_;d&r+N=Oa*zfA|6RkeQ(DY1L_Rr;+`k#BC^&(Q4q^9a+2N|jie4YlH z^)G_eh^%(y$*1sd2uYFI6>PaZWDL0!6T^bX+hX~|B-!cVwJv8(|JH=8Ef4S|7c1`b zcfYS}f8MhFQ9%6<8Ac|_8m0>XkfyFw z`3vnT$pOVmKUnNi>YhIsU}-ZQ@DJ%1Dyh)(9?ZSz#i^g%3st#H{WrMQ{q-|G&HCxX zY_>=lE5+UL>!nw6N5#5ewHB<#wy(+5#F?|iqsXl1ESvu+PbG3>1?`7K8Kje@Rab!| zH?YJo-9_z>Ft(5}uclC`=y%Fs@ncWHl}@MA_j6;f#`ebhG423yuJ^EWl}LU}`yXEV8yDhn<7CXxO** zmAJ!;@juUQ>A!N{rT2s@%>ue?qDn%6DHc2RooUI@O2#7r>M3D^O6g?F7!jlx;_ozl z%{IhFrW>d-GkqO06d$tW6eUS`<|*-kf|pPuBVw{XTm*9mYT{uqFqBu*3iDG#M5Q0_Q$z)@Dlz)w?R>+!^^WY4;vUt4})KRS8p6zm{XxHI! zfTM8I<;L*ctAlx*h>J!O`eJI+e#_)kK$Fw6Y~P5r%&Dlrk;~f=mI9kczk2i$8bTW2 z)19@%PcYGrdy#=uK2^jCQy2JT*r zdejh$#L@l}F-$%D2`cs!Ti9Kp-`oGS_xtuc5mBqCi0nWVuBd;=38ocobO9iB344`S z4)bC4=9w_x{fTXMo0PKI67&8X(CAbn>z$2}J(~L4uxn7(MwAs~wc=+_^)&|{1nSnU zR_u*@StRBalW1705KD_uO}aEm3*s`_l_ft1W^W<8?uYdi)8f@a2frW%DkmgOx@VVB zRH<83dWg@(L4*IGDZ$TWegb$OI5;&H2gYJ)#?^l61&%5VGw5v^x)cwgF_)}Ihn*(p zo}-o@!Wu`x`LDOHbNo5aFV_B??JnADn$y|7jI{|eBdi0z^OozzT*ErH zY+SGz`{I4wU@*Eq!ixOQGB$Pr{pZSCGREY8ww^z!M2{7av;Z+MLY>Zk(vYaxBz0{m zU7Hvg5RMUo@vsLGBj&swHb`HURk&-_+I!pBI!^B*x+hsyRJ<$51mj@*WumEJFQSC|wilka_ zBhQofkox__Rq=J@1Y|;VqA7liU535aD8e@_Cz(r@#=nw`ws5g)aYzL1a{V!H*6M8p z$;BZKU0E%5uKPdVil|BfO0|{PxdF)N$i%85PrE$(J(X3&%MIHkI#Zkt;i9WWwKXfw9?z3j*{bxuGU^bc;M)VU| z?jKgHdP9$n_QWbRgtUX0$mm?eVRU)uw#k;~w;_XU!-;@qTz^HdNsQV5VW-0t?hV9f zYg{@I^FF6DQ&Z0BH|;oPV|GD5NRsWZVCw1xh>W}`Wz$cZ^l(InM~DZ(PtZEL?qAmPst}JFX`iU z+}*R(Bc;JN}x9`=-74qc+4 zy}}Q|m9^(iQ*UKfawYyeLH#qT+iqTo|M{Kt|M{Jjlohq(o7Z#0#h;V?6}3AVsi<>z+YL)=?J@G!8cS?QeiOxyT&;Agx9*kINvibe&M75>xML1sAJuXG(c(gfC22Ng(Coe9xe?e>WTa4&kVi%wl3cVYc}wVwf-TSW$Z2;-TR(b!8@y!b1T_~ zQ|AAniEusiKpmJ^&e#-Jwkbzc^cw7mAF+mslmAo?@D0j?62|RB6wfC-_sO4bKIxa7 zd!DB4JeE~%_^fdpZG66YL{pgC-1MGj#laUHL;&@Vg}$BCf!fwU>y1v=r^p+t>K9l(h4q#I zTPAc@&0BN6<}DO8PJ|!}OzQpFL<*5-Na=xIz^)53C*U>eI<_7a*?;AK{?HQ|!#oqJ z;Ei;EE$*cA>#h3Vew+Br{n;h1BF1jK@J-ZhOJj9(;doi^C{_IoI|ijejoOZ#{4;bq z$D6oB9~rCpG!Tvh_?InTR;YxUqS zgabqzINFla(oFnIzJK`nmWn{Pt3E-;wPzQm&62-s=3>pO$)3b#y(B5sn!9L&c~tR_ zLXrwWfZ#xUZY3rIyb_%z|DCVcDNNkS@(G(tK;=~2KW!)EWMs)rqWqT+m+H~)?xZcs zq7U^%BHf<$^V+)xShQ!&l~dQtQ2e;_zrSY=PLhFD^dk(x>h10XAb zqasO0`4j##ZzoBlhv(75{7z_Z9x-^>v?Xv|dr@eh)8i`R%cydoqE^Y<%`vbIpVC@Zp`V zPHmx|{5~D_L>nlf4UpwkMl3llB*mG^^hPNo0 zv{b*A{+%5v)>a{t6B63G-Vq6EzJt1*vmr@YVV^ihrwk9`m;#@ZqWd|#3|IQQ?HJ{= z$F2G-GnUtAyL?uU>x5Sf1%>(pXII)OvSd2fby{aUpI=z*p0@y4>N7*A9m-TQ1;H$U z=|Dc)^QVov@y@H9E-#*6J{Ks&{24az{`u+>sFc&?MPYDhK}I8OmMyQJ?ZERq{Ua<-A>W26JO9ix^Ue=flvO6?EkV|umAjAuIim%mi7`!3V={Q51=Nfa%?VQ$99QXwN; z`peygGD~T6f;Hq|vJDYEXbwGTZvunNnrnwm)l%?*Z>x(=oYN`xojq4W)c*cOD{6@W z&tSH{Lh?|uIiiB4jQqOa+1~d3fA#-)C*rbUgzyRc>ypjoBcH#2Eo=few((;(Ns3k` zf7wA0Z$jLMoABy?2lGNw#;#oZ*Jp0Vx)mzD&|6z@rhZe#h5<`yL$#2EcV?MDCPJpv zD;%`@fmu@Dv{F^azD$vIDNQ0Lc(rsi9dsG<$MoASX>g^OvC@zL^7h?uZD0YVyOz6| zQ5@Bb^pRSy6)mF(P^=mI4o@4gdJPyG(<^cU%=dn%1agvaP^%!JMOI`>!c-B=2!XO< zzc`TM>1r-0=FVJMys8&*vz3i{>PdZ*qG%!ranqw5LMI#_nxqhl#M+|1kTqPn`8!kh zv`f#P9o6m7s-G~{wJLo{2^%=j$5`3FeW(%EVPo3ql--FQ^>aQ`xdjap%{syYu+Yf-Zt!K#!$jeVF>zy(i+%um232NY zy*O6o09QNpR{eDfHajHl@s{#(*Y2y;mLr~)Pm`UBd3JuLg=bEUMVi)>+TP(y2d^nv zpws>ASTcj#l-exGA7e{N(T34NMd;pMGLbZtvEg-RbfnuVtkV(Uar5x6rZK6UVa$4Wf^ol*byS+keHe@;?B zjwojc=6kkmFgL})$=xf>hE29Mm~jn-COO!Mr3~$;CHxY7P3dIOBq);XVcq)saU!zX z&&iW}LyPjq1Q19&`0HmGdZF`lO=Pg4MqUh_I_Kv? z2c4!GR~qFqwv?sjB0_MinSs&qOUQyjRV2kM!c3rT?wrh3|JvG`bct=|)By5c!Tzt+ zxtZtX`1v=seO*Zba&%`&t&AK;gM1^7qU zdZ$w=68rx*^t{2L9Kk6wcDkn_&wTZH*)edi$Fi^h)?tSiwUS+@h+l3clgJh-bBTW1bNh)zL1qvUF*OzQ2eh#LY3VasL^|WR92z)3sYH(w#t?3*rU@D$m>l$aK5Oz~qUF>Y z9bcyg8IKC_kJ16OG~d#^Ir&n)+$FjHfkg+SAWR6ym`RCp$(s{ZqU157a~mP;9^=Vx zD`mu2%kQ$nzc#?599LPM%myY+=JImJF)|ZBWbxDpM-5Ef(aG1zr=VD&)UtxFNaj*q zrqn8tvrUs|WD-)8&%HZ|B49ADahU^p#OzGi|AL6O?r-n z6WtFvlsLj=gLKG>!*!rSeAL_gOu#&OIGk=}$T($#3bpgKJ?rNJQwr5a><%U#{ehni zBqZMK#_iWH<4!^U?&r=p+w3;XGwiDTe{&y0_#M_#b~(Wh9_a8dIcMb(gb`r#=*`$x z$4{}3LIi(wKlcgYilBx}3*0s)#-AF|u7D_OBQOGW)+$)5H~V(ri%_JRu=oRzQTLhG z3P?Y>=!lvy4-Y6$;!fv#N9pj5aRPTR1W2haDa5b{TmV93=mG~YxpFd<{4{c<$E+;% zaKI%y07fN{B-k>kIlV(RKj=c~!|}?Ch$Jg;$CXG_^%s$9*ix*@`^m%j-_QsVv72vC z0wxK-1Y=GIE`pt6kFXD(3>b7v&f(a@lft)3qQ-O)!$@YY421{ZCH2z#*A4wFti1%6n7Wo)E1D z*_|jBAeE?DXOo4F)Xo~k8-*wB=oxL}cOJrTdCo!)VG1y#d|A7H$$n!q8$cXaCxl~> z5krOHAk>%`NjF&1c%;rs!7^@mlp*6$`}26|a=5+~E6K!~d+;PAA#>bi`+*Ebs%cM?`P=N2TYX#C3sWQO;W^U&#;)gz?63aOn|S=%J%{r{kG_U6x@V1_O^|~ zXM)~5@SR`fPo;X+*WWiO(_I+b(n3tGi6D3!2j&>F zC9vYAT)SWaS)Y5@Tg2^LNo$uvGAcaYf7XNIcekJ(ahN*Cx#1IJmj89v#(AJO@ahIJ zM#NK*H`kjZu`V3Beg`2z4+O8Y|1WaO=H>Ev3;&0fM`Gb8k)3MqA@lzf{D$v;K;4?~{7&7f%BK4v?k`@3Wj%&}G z#%^)jALTrn;!yO&qKY&Bi<4> z0Y-Br-F|TajJxMtV5Fbu6~JZO%l8nJ!c%jN_}UhZ*C4_Qu8%-j=QB`q&*kaO%5W z>;pI~@;i-dTh^Uh@Pm>#FFnUGh_sqn$f=j8utWw&t+_i2(8&go*EyuB12>&nW0CrNt&{sEmhi=p}|^RA4G zy*XPu4Vnp1TMmlIrM{Y5#Qw7snYB*e_@4M|zr#f&!RV*{pBhq3em5}rFqyGoXvmos z(E&;~U+!(5tkYBuC+aWFiZece^zwn45UQdIvYR!45303C_v=C~=IerMfPr4nWnYG) zx1e1q&IPp%P;VVBopR=*ydM2*P*dC+fh;BOYrP0%DVA>$<4*X4YBJxo@nB~K5|lEW zTk?w_0YnW759Sujya#e%O<-huR(+?lRQOVq!sZgoh`jj)HMW+|H8&wvYdvcoD@+3< zJ+Gxa4aHZB54k4h6kz$WgyXapV6woyCzaF@I(1msbCtPvbF)gsp>j})p=?%sg+U?g z2WP*BO(YOG_p_6ptExqO-YA4^A}it8E5lIG;sq@3R|V;-3~2&X9LMNtP%12*&T($C zPjufpt8q|r^HHtLNRj;n)U~$VR!=W16g&QF>-9PL1D!fLAZ*T7lCx8bA@Qf5Hl!(~ z2xM^MPv!z7|1lhjR7H%>6P&C6&$=Xu1Bv#xgqfjHVp}q4_|8#q9-{;EJYIhZ3RfQ$ zmZjuZO7Y1WR;P$^kGfA(`KNB}JtZs*H;%~Puv%J5_jYm34i)IP817%N;jP`0fgR*`ElD z#Jo7F8lSt7cUt|OD>|2}+MKih^XZCFL7NXkOwK+}Md7{eF4yC4G%8rwB06!6zgo1$M*T zOE_pM=zLRLnRP7(5sN+PEgmmH^N%SX*nWWCh6I()?s&rGgtzWk6yE#<`IKI__Rsc0okAeP`M?*{xjeLx`rp^`e-4%?XdwgN#3u@q`C>o! z148%1J>S)$dQ8xgn6F#h)(r2t2PmJ_UL}H4bIsWvxfpi^>4+r zk0fY|1z+^`1RSO<0S0Sop1vyD+DPEgCQSceU0|yAoW;`Ri-w*XsEupCOq$&qk#}5zOrDjyTuBE8bDgww zI(ORT4xG=hmzjmU3#(axVpk`48-#z_=F`h7`Gh@`{wGn0Dc(q< zmC!=IboLPSOu))Jk|VlFt3Pd49i39+7uuLeL;~F&MFb!uh&zYSRF`N{n!EGL1!nkM za0Xr}`oaO6$;pe-C`UC}@XoZ*lh_km8YPiq0y4#1iuWSe+(6w0jsKnoub6LKg`x*b z=LGeW4UEh3;Umd$DKjHq>Z#AxR5^f9AVb`z2+?JzVzZRgIMTo_QA!<2!k#aG zgQ=(1+a#W_!Kb`Q6FtJj=n;ArMP4gKFA3iT$qU$fD1u%&3r3C~D2`&G3dN;q+8fdf z6P{QzS47qA{1Jpw*V5zCW+MK?FuE9M=Ztb@zu=7dJjBy&(7%niRyYBSZ)}iyZPM5V zbLcOA#fO)(D42JXc-C-*o51GCK@ zH4~+;k{%VjRWS6-Lx3pqD|c(<2iAy*4&~l8*5cq zao|-aV@{`O@Z$itp1hd~7M#3{(H(a~mZqNPx6WMWZ>6q2@3Dv-nza#gt&j_uC>0#YSj%Y6tmViWr26SY(E;KWNZv-6(oYQ2ctLXN6X5R`< zyuH178TGp(Yr7jbJlAtNS7t%@;nYJcg0PG@9{<41O)23H(ryX#7 zOddB7!?&9=soRoQZV*eFfV5uaxJ(zj<1fOvjE;;`3SX8oHTILQ1V-i7`Z~F#K@yrA z{=)SPPjv}TSDaq|ndW;SIC`)(6kp8!lsOT0m}K5@pauHx`=zMx=P=X&LeA#|-X@eo zQR3{E2m7!@ru9TjQ}!8e-BykBK?ZD%23aH(Oqh~lgVW85MbUL3VdItd$P4m7Sv}2B z{V!Rir3SNNH@(_bN-tu(N9{>@oD9L9BI8hkF?nt928%do;G?B9j+_qPCpW%f@8!95 zsh@8Qs*A6uG+9qtD3XLMbBH--TGZT!MB=+fGztPWX%EEO{q6&E`x^__j~mo1Z^n7s zJxS35p})u?@U#i*&d2$I&oJ+)T1ml*t;dL_s7AefujgCq6HI#o9*y($CPDVbT)*hR z&%gUQ7Lw()5c+$OlSIGSTsBCg9%4FE%-^N9V=nS#&lHgKewK{COI>mEN3PMgkzx$K z?Br0{4mL->TP%1z0#K|t2fb}<%*9vU=@|#H%g1wqY2s-UvZoULF`Q`m{_!qx>xSC! zs;VNU#dG$UOa;bJNh60{eh`Rlge82~Q z3P$Sh7r5trLNx^24Kphf!tkVN*)Y}u3;^{%IpI>nu`otL|BZPeNNV^YGvzK={hV;6;MH0wkMG&M|u)6=4G4m~rx7)zUqoHRAu0R#&9=$Tf zkYjNXL8jWoC;cjg!g_)V3gcI!CL*#x@(j*66)^4{DLcgKI*X%zYz`^W0)TWQf*~Ob z*iLw~aG~p4oxnb^{qGA-f4@KV?2)=1cMlISV7Gv!aZw&!@I;S+zLouG`w!UGi& zJbH;<4zO`T*pgk~yR`1OuOkj{48--OnM&&p;(#I4{qnlTfF{wS7dqHIDZA5*A=5%! zi|d`TR56vPXLF7Vsx`N|KL_l?6iR=%1fo*=PQr!Mv%a3|(pOT*){#i{Ns~V9K9_W= z!RzjZ7~7eQyjW004Wi984+;OZ16alR@ zB_0mt6~EYsGQZ#nTWaL(x!_uL-B0BNiJ{hdGc-TywmzxESU+ z>zswh45wHSPt!B6moIOBr&?7X({k#nPTCkV3Al@WH8m7jLTn~tV2Wc?!T=cn2(%?1 z_=tk^AaCC`xKQS_mIfEag3czpFw}QAjcBmOCaF#t6Qb%?+($8vi=)V2pUK~btgg0q7+e2FL_au1mXLJZ93^I%(qWj&@bf1APK;h=T) zu5m~#`z;n({@)0uXd=0P{O1;wWfYN;d^rNfrW6Ao``0?J7Fc`g$2A^|aTHODjLkqb zHc$kp2GO-R*VC`&iNJNir>BC@R7>0g1(ltP=bvZYxB;)y2mcwHedzw%V5*n;HzbaV ztkeR>c3Qie}NW)k_v<4#z)5m@#r*m>a54bL zbGRjfrsS0Q&X?`=^EnNj)S-K`~-RZi*a{8T*6U;6Y`D06kI{i(~ar-ll)h}T)` zbc6Rb=yttDK7nN%<2vAOiH3{D%>)b=6;9iM7pu+Osuyn|Tt;*_o5gK)1{IP=m^;c=un>*ZXt(82wn>-<`;7 zj2|+U+}F7k&PH)`Ef_zbdMN#ZX#ny?G0+>6jxcOc?ZQB@51T|jVg!`?oA8<}+?YJ_ z9PyNqdlHEN^5D0Ed;tByI|BA1gg7n<8Hz*E5k+_eklP?zJ`77tZJHQ(JUsQHIpu#& zo0#NcJe!y+Prp9%;jFpa3VvfRpY&mJ?u2(k-NnCehId1R7C0uK?ctApa4`ewa}U<# zN|ylqPLSz64`4;H{UhrKO8boBKup^tgfC7cr-`KbrSEa~ zC+=vVrNXc8RUmvVUvfM=O;pQnW>X?nKV$tk&BhRa9ZhXdO&!|QvEaV-q{diCoJne~ z;v1WOpyFOKsKLq;6L;Lt%s^*FL}UUws#oSWBlkVD5B%xhDK1aCo*9a<<)r|MEG;?5 z8*LG!S$%tcN4H`Kc?rOn2eI=bf{W&iWd%%H;wRHjg9haTz4n95%ju0Iw?m2v!x5GkTWARXlB`@Qm2BjIJg^o@IN9-pPKBXT?m>FR2?eeEzIJN9PEHu%CRS4F?8?+uqLCi; z?fl~YxnJVF33ZGBE654~fM>>+Z2C{ImI5pBJIT-yvS3UETeQYWNDwL92+2gnJLGrk zIlS7guL7Tv+F%wGV2rg#9~l4~&4@sEeZ?YRzQ$FH18N0bQVmFCt1@tb@&wr9?#3Pb z5KJV?RUcn|0mFY1;?fL~@p(~PO`x#M%a`zG6VP^g@XNRIGi=Vi=ajt$6qtA4a5VJ1 zr=!>B@pUBPmYn7M`0pep8En=!iJb!OtAC~SGPOfV?15i7Y=mPp-rjI_qsc=)_QD1{ zp-|&OJT9XQpBy$j>Fv7N`y~*OW?K-uy&&O3!rfX5774irMA(K)sW*BNMU5SF*Kq;* zfAe!?YQU*t=r@9riA3mlYSa-l01qtzc4XTV2jo9mx^OJv(rbC>!h@{?A2DwSlZdXJ znB1P_us-mq?fObl*H`)-8X;}fGUg19Of{emfQ~kk5U*%ywiF0>j5K_yIzqy)h}kb7 z=!lr&1jeCTjEE0Ue<~d(iIc#DW`*`E#r4HWqSuC)*dmVPL_ZX}^a5Ar6rGuv>%~IJ zVgnm!B<6~dq$ej+k@fo^P#ol`!Igxh4JD1vQh;W zBNgmN*x~ON+Kc^I3z~$EvfcC}?b*9H04z zK*Dca98Yc+rYPF1Ks-|EWiXM%x|F{(ck!D1MoSn<{8f}6LS|vK0`uS_!Ju>6{wTgi zhmVNi0C|FC!p99ms(tujMKGO+&wH@mpcU%_Xd~47d3765NQZxX3Z33 zZW$@Pk5)9Q6@&wuQo-Y^S1CdD=0;jQ`T;+mwo*$2ZG`mZHjYDx+)DssdMg@P3|o2z zner-M8@E^=x}LPWLSxz*8Q&ASpvc@Du-E-Iw2wx_tsBT6C5cq-iZVm9iv>c)2njBt z&SB(eg!yt^O1sBaR>?Qin7$(4#6*wm?c&q1+!G{PO$s;xTERWu_}E#sny{%-TIYTn zl4xNHvgJ{gEWQA9s7*^3PcM& zkd2UgY%121ZSq~oHHsXvb*Sg?%D@+I^QXh&$d~D9{B@bdzf5E%1vy`Eylj$h zr~ZC>;jdG#>T%**Y_BQx03%s zVAAoLq(%=8tB!#bdXZNYUSm$exLDxOx^Dydq476hD|}MXeNl(n%C9)(=0rntFg)K#X|7%uRb5<+GIQALXS_ zAEYX{bx;o%ks5um`W44@2W<@d3$3^^T(odDmzyxo1Se16m~e6iQ$WWiE^mbsa4DiJ z=Pqziyd)G9pKtz~4@$I5Uur+$c?rmZYLP8#xBZM;M2Wr5#N2;`{?$WwB~4S&VvrL5 zmT6hb)|dINsv-ue)zMb_p{?L4KJMbN9#-xeFB#RcRg3K<+;17o2zf&-V6<1qsRt%lMV4>e=#Kxzm|aAM%XP|gABL8J{JOqd*@ zO)kxMY4-$DZ41<<(0AcPK8D#bF-pAM$;L!HgS0C!NWh@x2LWt}e~_-g#!WeTCmRx> zgU57}cqvi&t+dQZS)Hw?Vagek%J7q@^7yih!fK)_LxVi(sVwDDnqib-E+UgwWp_Ja zyWT!tK4U_f0?`V4$tGRzinxnna6QP9tAt5ql+X>54`%d=g?MU5_l{FEOzlRKP!O>V(@8{6C#SL;@1cX()1H zDj=q<)pV(?!#hQGI&=dyX_SAKIewYpCciQ9rE7z~_>;>IS+w;zCMXPJosL9MO*m0n zw9X3t%;s6a^!&GsJoS(SVO6HBc%`b^AWwW;$&#z(zLgYDA#So`i`B5rmb@X<5=q{q zg=U6g-slAlx?ZrI`sCi5QCj2iXI^H!mrXIJU<%9s3TN@J^j`k=OWYQy-@=*F+$(w= z;mxN~(+`B6`>V?lwlbqAh=V#UT};Hi5+fmBD0Fq~gY1ucxP*l_tXs?o{;g#BBivWV zg~ZQehPbqJd=(}x41}w0s)~dXs{tv?U>Sjc(}Ji}~* zXKnVFZgl(AWj?;Hw?QH=4AKK%B1Sj3Jhsfql-f%6xpqxiX#ytnzBPk4(43u;ELM!? z?(Q%s7QR?cSje9vl<{mhlDWqg{xy)^)8)L+cx#txL^o`S z9O)S;De3jdjw?xlWPdQCDGVt-%6zn0rvM^)Y#Ad%stZg7(^yQOV`vF%9Q7wtdH*r_ zdp<=ZsMz+|mDfJ2i$LpiW2#FK{>2ER)lL>V@y|gTD}^IhbyBqCjSZRF-{{stO9Ddc zf9xnuJo~Z>`6Uv#+kYTXN&;l*|4qrvxTzIsD zgHr9<)Xzk1QG*T7Jl0ei-7zMvjk``xZz>*;^Jb#c))?_hi+Ed;Oasg9+G%pw!! z#LpqP!|HU0>vcgO2!fBl*aGzw8D7FkDVtU2hkb9Hfo;a~JxPJ92h1?wH2lH7i~f=9 z7*6KAx}GlW2tt*g5)d#u{>|cCIxVIGQ-Xz5NjTEHVq0>%P$!g~0j6#7r}uJd%4)}0b*R#;0BD})kI%$G%m zi76OS7tBeWiOs+9tS2_b~gSfVa-Mntv!Zf)&y}Rl|Imt;|V**7iDUF{x(As z<>jA8tAO|ib|j>z>!Tg|sB4r&CbI(im>9d3aU21Vx9J%~{38{+^kaz{XX`3%QuY=> z03T7bvp1Fdf<*;I5_9e`A(N>*gkDJO^O~$*E5-dpa=hQ+Ld93nxc-q~OGlVz&Fky5 zQw7M!@yPL`lV5aeot`VlWc>6asq<*Q095MnKNrXj;vd{zB^>f0&a71~&SIv5N zpJv^f8=qn!t&3=^?vkB+@~0Ie5kb*!>m+|4X?Jj*`UVlo>pILb#wqZ}e`6}Sn_&~Z z+%%GvnexbW1Rpk@NdB8jq}(Txmq3e*3i>r%Jkn7Ru+?=s8wxv`wwEdxplJ`Bk5Ztr{E0E*@L4!ZoPV3V^9>U|0z5N6C^5v`^2bN@t}WDgRIP zIR8)eP#hq(V}G+_M%Q_NVz2A136;*aO76RHhwkQ?bgYqi}x2t_~l??xd7Z*meo zfjGm!Iy#8h8c4hJSa{;exCOjRU*hgxZJa})68{q0?&#|LNNQqqk;3EoE*KmHadxEY zBq@Rr=3zYMx<8+Pz5hZz+-NQ}r{EB9dFNLAbE5F?JpzU72OD`ZPl4QllM_cbguI!= z$*NMCU+jMg{%OYFq$2bqdll*b-c8j-OR%#N5oyqK zISLs##g!Crzw%K*GD01E`89CyuC}(XqWQ(6-+HZiYYXA~4-_I*)-ZMfT}8j>Yuxxsy)pb12z|?9qlRk( zJ{O)RDzcOng=@C zTj`6@OG#m@HG6=K1jfLcQKfycq~$g{kqy?FNfEeX5uqFsEs(?)lyL$`Oz`pBykoax zhd$f`?~}2$rN3!G4-l(7cxpGLdJ;FixAg`thzBqh#XU2BP*&c49q?=YbkkFJ9#qa8 zjX@7zan8!+H3|ejPYvqMp;tnf!+g? zpq*Ke9j2^(1?;DfuCO!$l!MROetnP>Auh5~%NOP3+e96}7><1fykiv(be9S=z@9r+Gt8Ct`<-WnM2Eve#;>6r z1J#33MRt!;$6Kvas|tx;Z4*9SCqq0GU`7&3%d$c3_x{ePqG}p&^g9e`}Ylsk{?mVsX)VU zl-QMH+^fMAH&axVMTb?ujT1j~qZI*0%z`IuqivJu%2Q#3q*fpAev(3aAo$ZB=(BZm z)%MkG66#G(&!{VNElnVcJop@e1$pjTbf##OuUKFps0S&|zgq{^iQ{)dNFS9d89z2f z^*2I*C0~}@X0Dr^dmfKw-T2LYu)iN#5{&wCsjY9U!gRt10#SD{z$VbY53>9Ce3STp zJF|0c*v8gH5zxJU-aVp>E!dg@Da9O_m6%zJA?o}VDeA;X?XGoNZW+Ff@IzmL z7ur!G!JnX%B~tc;d_cxAzx@fPDr%*U+*L^FI2IF@2Qn@b6K65{Si@bPmdq zQQ&Y<`!Zn`n9rew1Nw^m^6KL8qr3HG&&T%ko3=btO_bZ=3$1o$mKxSGRzB-Sj5MD| z>foB0#?vuv%V=`vY`GuK|7#%iLSZ^#H%&}`JgdGxIScVAr#$%nwL6W-BT=;>Q}`a9 zF*gaJhkI63x|34NSP_SD)d_aQ+|6ve>~<4axY*e zUf(QiVu4`Fll6`D5YFsNTnE;LM4@D+6e*5*Y?pC{V3Z z1!6PYQboigFNUnk=et!=I0?5onZ^AVHl7sy#69=rS;ud$AnHMJq0Clkf|(;`6JBgu zH;S}B8KyOeCCZRRzTcuKgjGPE_56p%7kJvSi!ukuC**z3GUHx6#23LY9FJpdx34xM zBHDbujW1I^z4tx-qW>xNRhW(cJv}q{FDd>v8De1-^NoBF^nSfZnjARheRWjJ#p0ob z1dj8Wm*t1!!+s9HM2B`}9sCu!l;R6Nac!q?{cB*D$`J zHHcJxR^-xj=Vi;43DCwl29C(#%Kyr2>^VpYONHpLef;r}y&8rS?V2b-nUrn?b zB*F9gw@(Af>51pvm)+Sjz|lzTieA&3Z7-*I>)M*p^;d#YCg)U`+ga4i4U-S)xdd>5 z+aF8^D3$M#5%3tc48`NUfSm+p-!f5tsADOY(6FahHzUdkpVGkJZTYzPU-gCNCaQk~ zn4W^S?Ie@2Wi^|xjG~ZqtH@PLDkGZWuw)c{zx~|@-wWjd(i&i*1}z3Ll(wx;s~z|b zshmasz?AFmUt=QESY^;N0QOKV(d*xV7>7Hq0KdpsMRTx#omBZc>9xK+=4pUTvhS*W zlRf-Z7!%LILAibU(0G@6Hi48Uu#1$AZqT@O_O@@bH|y8*h&xYbZf`vqF+I&B ziV8HkLv^vK$*UUj5ov`+PRAGpSK_%Ktz0bmG*C`S8dEZwY-r!hPVvfH%f_F_eiF3P zKAph`0mu5@3zbRkpo#zbn+)yH!|gK$QI|mIe;2;70qT@QW*$JQ($W0~<#!clBK8Tu z^Q4)0t)FqfRHIt3%!*)y$eH)DWK6$$ODnokj#MyjBBdSPLt&D$wG>KNxtwQ-B_{mH z^g4J5eg4NbfDh|b38w}}95ggTQi|iDB2ihxU0WE{w)3Qt=y_5%c=R=idL0rblRPowUVgiiv|a|S{4dtU4D}q5RG4PyxsE1&b{8#}D9NY!QrGF+KkHhs-R55u zjH(yCi=|q$0Qa$ul9=2@si2qM}Bdrj5&~Rl5uYh=|78s zMnhC3X~1Gk{}3sl?(f9@Wa9x;pRo|I^;(8rWY9yTW}e>+E@3*FT;jcK0>BN_Uo^K( zxce7S_4joN^X1DX|A)BG4A-^g?~J(Nm3*_}nLxM&+jz}+I@?yQsu$vz+s|_%XLh53=!|hT={Db-`G3SOW_h4%8nbJ-n}O+)hEmFD1Tp=DDA>Z%z~}k3K{4Of2Dz5dZRqW?`#Yk^9k5w)p78>9%5S zif(Ic#F!ykVno`@|6Nt)Kjb0}Et*2#W&J=i`G08o#<)n_FW#vp+ikXOPnx)4($;3% zwr$(BVXFVOcp4)eL(5a?h+T z=C{ZmaQ=)WF_B**{Nc2G@r%}eGr#8<>v8vS;J;j#AE9^?c*NfW#5QD{QMa6sPtdw zY=eCh_;2nEn38xrclm(cJwMQ6Wc{z6xy;h8&p{68Z-Kq^mht@^C`9_uFoooDU&S%J zPlq+_-w(-CkMA<~rQiFxvSPSX}9!+-?@nbx`yh z^{Ks^TJ9;em@!cog9oxjVVmIAm4m1Ho15B7P`~{lpzc~>gLqinnY`iY)ySju?E(#o zINH|VBPl9lN}Wmu)(&W$36K8f`s2@_(jy5ShfP9}057_D3mm*qFCwRm0An(>0=*su zMHU$=Z9Q>VolwffS0@3l`;hh`!hS)^jpsMdEw?+;r`4J+|BkK$9G)5tYi8nqRoZFl zF7mSGub_-Jg@D48(zyRCXE>n&oP`Ul!AxYyJSTlNX3 zT@D}abvdaNVx-NbiUJF}!b;_*iO*g7%(dzh@+1r#SDz0f@HM&+%mQ}5j#Eeo&zJTLG`B$67p#C!h9UpH>}V}|v|_W-P#J@mTh?mU0$Z1)N|wbK z5n^<3S?AHJ&&tE2o%bN7YW>Blz9F%}8P}dp)QJUO0~6l%Xbo{~R!=LM_-ksdtG9ta z49Y|Hbi&JxGji_#RwOQV1TXxL2Nm+mkVFPq!l{_Xd+*b3_wLHDEL0qd%Msz#9E6V% z!#AOll2AyG=_7~*)AP3lYHUGFh0rjjQHWZ&^V*1D8IOk-TEBZET>`1glHYi3U|6Nc6|wkp zYM{Je@m^kB^hHB59fo)a9V^lkyazDsS7E8|yoj%CM8+7g5l`$Odg#aAY>ec6Mdfvd z&TR=7unJBmcGr$l&|9j#i>Ueg+2yU}+vvN9D}#y;v5h(N80NN=k_)tsN`Bj#%Fn1C zE~K<^gf}wjSxYL^Jdrl~4VW+cqOo-%uEezjSJ_Okut2E;=mb58x=1pXU2u|?x-kye z(}rG;PzydHbWIq5ezOBP!~%&9gt<gdcokdyAM}0AtU_!26ys)8~v#SOLY1zUS8P`mRVP zeb==Lf?)|STbE>fxL81R(>K}AeZci>k6zh^dl{wUfZn$2O@dFezo|JgXOO$N%c4Kl zVTll#-G}wNhNbT3{DR$s^Sgv6GX#mwYW$mH`r!uht1#R(TOucBrDgppAt+tw*45%F z1l}O^BLdb-?0l!CyyaKWz0T=0lg22zq{88?klUg0Z@2mz9n>@hU_DZH4|kAy8D*$~ zn=f9a-B+n?XeHR+W#Uv(u@mMFQ)_hPWab>-kgE}YkiQwNU_9V&V<2uB2rRGlc!7?% zJhJD>BytxXd=TFClG9XSCs;_d-&1MoK<*JO#f7)Z>Fb+8cFJH{<%3!6ESK`v(SrYa zCx66$fc$~u%oXba9={~smiS|zaHaaxfd%-Xi{(BiWaVvi`!HG zrUxA~-C^_ljU)FFdQI(?l{pRY3&~{wPL#1gp44SvnWt&goWvEX?xE?iIf4U>O0W#t zgJdbd66OM{H#ur2ATec!Sx!~ZNq4!ay1psk8Ci<1hrCcCNB6bkJrL}rjq>u=a9re= zl`$rsNXXw1FSyn#(oP$KR6sjrR{h0?p#XqTz8~|2T6|jojFXpV-$G<(X9o$*vs@@o zqC3fNlkTMx_3w;>dhB$@sSzN+;4NQ-USwOD`gQMU|Fe zmLXx*ChNi|o1<}q5#A31K2cAFI$;@vUz!d!$9QG(GcTlz);#5^1#U(YaGH0rUPj|u zSNNFa;j-ikR#1V$nKQP~gxtzvk;H=9Q(U+LAR|~6{OdcE^ZAEaX?#&6lP$#OI-LA1 zv{*^9(Kp_~Ip)2m`@##5m{m`C*IC~>9ePi9T+eEMx-Qh>dgt4=D>3zTwzi)R*5Wa- zLw8Ix6_e~cd(_w6k`>`hKu0~5vm z4D8HSL4>lbrs&D0sxc)uOl>b8qNWIDu6(l1dt^F7WyrIbn6(&|u@>4Xb&NDsusXS< zWRqhUWBumF+!K}=vw(>q)YVnUIaRp%nr*UIlA6I-8{=(W9SZx+S8qNV-xcQx&MgBb zj*xLaQO}gW6xQ*Yl5sPK;X7TQzL(p}(`*ntz45^DJFTk3fP3&c4)nVLtuB-|4}l*LQD4;aoBSZ))<577F( z3+iR20q?>>gBK3?kO=amo<=FB2`4X@g^?7&02)t4jMHJRl~EzUGgYembyv~BYJ{ig zjh_z@B|5wlMzv93^Mxp*T^8VmFrW9a2#d?%dzidr`q=nPb52l?En}=k6gIB3M5s=x z@h^N^xJnqw&HAPA_@;xe!mZ@9zb%*j5z65Av{QPH%TB8&JdTF%C%vrrP1EHUZ>ngC z6e!2WD1L$ZPPL@kii|qw-hTuq-4hdu#k8F} z^exT;v2#e*NWWqdwGR!D{fE2SSWv<`&A_QYFkW%~53Uyr}OA6Rc=2SPqm}1F(_rF24 zyM@Yivqw33`S~5(0zQ*VSLr`a|Qz7<%fRYz`hWqv8|JlMo15 z#%iLX+IF4o8ovK~GG(+;<49ekRv!?{4nr|TUfoIR6ev9ne4R)L5s2F^eSDQ}M%mki zG6Qj56#NNCkq~&R=!y90w2+%1E`lBpi9R18z2yrZI6K=N-n8vAOf8nUzEuA%p|ADG zx1`Z@<)DIgMU|eSIB~#8y%5dJbPNfWwZ$mobcSYkv*W#GrmauBa=y8p{aZjv+AIk3 z86%s{^)unp`7L0}!=mT|rE*kS;uXlUM3s5&8?rfP88N=3ny-HQIzPr_2%6Y>p`fG7 zUXCS*(tzL$5tD`M5=yl8uSSP#oSuGM=}>4z=W{}FzMJK#onq6gH3&FpL4~B-G<;Q98aG@G-C*Ai(AmeR@uFcG|%XXWO`-RM!tYXS%Ulqj}LJ6gr;K_3R%sEc?)K zS_=Pvrl{a!F@o8msOjCT^sh&Y#~l zcU-I2>(f}_MqED7XSl|w0oE4tL~Ir7JMVRuvCYo6I(-XoI*5(1IiKJiJC+D zIkhL2DkiJO5J?QM$W;&I3{io;HYQMAh*X8L0&^r{lr1^n$cOrHz90!0-ylJAGJC z@gVS|_Xi6pTE}pnYR$A9ee+}tA>|Y$Ai1;zg?I|vFiA~ao0D1t_EQ)tZYnpI_|ASv zrY{1@q{7&6Sv1~95L$#0!L8)6O@#DDbdR)ZWp!YQU-a|QydHZz+?#?(_=?4_J95YXPG>`;2w)0xS_`rg-uKjLR`3*CctC&z1u#xPe0Oik$ z2#Z?T2Ik?hleEg<|3>dV+K=Cznh*s4#b?}A&roO@8oxkiMHxmk)q;$2I>K3TuH2lQ z!32SOyN^X&+}#mtIn?dum`?(YRw^`=){;Knz92p`VWnbp`zC@j|v25JjSW5~#p5 zg0gkHgF8uY@bzmu!FiqTa>V_1C66Vj)#bn?Ix{~aj2`@6aNvUeVTNG~*R*R*i&iy7 z?(Bw%=ANU!(T*Hd3{r>4Xvl*hJU~G+xR@)eR3)|x2@U#GjniL0G&NBq?_hb?&+l}O zTY8?(0g9R(n;>!-&7O_SQ)}sZ{h4S*x!EHX*#Zo;(a^b0DET_TPlc3hB+MCl)y>3J zs8+GSqbA$(axk4-MWRZ;U!*{W5hU)KAnM&gmg3r>O_&Y>3+blm51(Lbio`=;o zhO}%rpKN5T`WURw4)tJ|lnG?D{D&SnBfpsbH&}wQ7_MRV@jQ1~#0r0%xx+w5?jmy< zMD*Xt5R(B~!ZBcQ2!<8v({akj_s8Cm?!5C3hTh>n{SFv>PM}VgnW4@cqO4T1N`>BG z=L^gT5>QakEd zyytish9dvO+vs>EYCv-2b3l4sA7}FSAB57UFbGBC$<#Pd(1~V=>;py9%Sxd^Gdan% zcsyY~GFZD5!>uLMPM|P(elTK`*+qjpUf?|XB<9hk3Qm@gFQq8Bt?@q>n8KpMxlP&d zFwg(b0toj4;|b_3;)F$D19vQAcb_WodTkKZzG~hW>wVE)n(^8bjYue2em>{_O;!i7 zvo|KJCL=p*raNdOOX+fI z+L)_FN?=NSp4$w{d6&9kPq{A9j&Y$J14XFEpeQA8!uT^Kz80OFKTiRmt$gxr&c*i5 zF|iwM64O>c#5+*Gs@F`Kto3;n%9MMh-Vs`V;+3iD%~G5Z)b000YUpj6tD{!EB^sm- zBE;i@OpQAZhD&_>w?6c80}kZl?!fHv%gpaEUL@F0-rCRCa-AnF7F#^L=6@%h_YIbg z{-F2lU`w~=7994u62sF$-frCf;$gWhEa>EBOwe0S>u&*j%uCFKU(DLPgSL^slRGfGb<|c6L8~zq z0jXYsN%)q}n_A9x^nK@#IFt*YWH!s#nz=x91}C=N1^>z7|FnF}oczxwsrT$Hyg4*d7+nzy_H? z{Rl|E(O8X^B!o$T?|j58p)J-u{pZ`mcfMArn>wVkas?^<>1tMYnJVgkioz%~ZGomx5RRJQ_*$ zh=C>ITuA)XKaCw9SMn?LKC`m$4d?d7h4irpSr*1bL!}a4tb>oWi72vj`qn!olrBXGe|mY}aNf^hOnG|aH}M5@;~*OGJ$c54CtQtCmqPeJbtHVY zw_jj;Qd8#r#}>_UDu2^`r_Q+aT1B@@@Oi(9Y@g)-5|;>LT9 zY7-b?Y#3k~OR!R{?L9HuozvG(%kZ4kJ-B%^N>~Shomt2U*}CxB^UHi5$pLA+90Tz|CE~5Oo)tGCVdk4^ zF(Cz66#f>^W9C6jj}pPY2$(g8@GmO-Xd8wZYY{IxlNK)$T`WPKhX5B^;ezF+nM?1ams!Ek75t!JXxzLPzbNfsVJ*NU_Jw1;& z6G4SFR&j|L%K{5P$wfgqXldT=7XV;KO- zm3Og-V=>ZK--HA3#lECoRb|h3iBN0e#d?Srx;m@Ubko|O|-J2uLE|C+qjWYgz~RD?^p-G z{u9687vUObMNH!*a{h_g_>nz!b&T}ohtcw90>*yQOOlBtA7kA>0Rb#ygmC_a%hq_P zGMPNam^jmGP?;B|?M9swpJr zMMaJgZVsJQ87EZ&Actl|Xa=~V#|PQ%y^sOVMy^9<{gc(VPWra;y4(e8>F%D#-^APJ z^For>4=QmU;{_8*bW?74_j@quw!{1YO^b1}E&6+*5hP`2WA2vN%w zkK*$IwbiV+6AyA(Nr!}3+Jy%n&5{CAv^_Q7FMeON|s^;3;+*gj^5t%32)DCR}2E~9xmrW z+x*n@UkY+_^BFbhXzLV{ihJmdcfpckta!>AOo<8L3Ottn3Wz=E!?#@@*;kg)2){B) z#O!E{)qo<MX6<92nl~=6)6XMU4Ha33Ma_NglGzmGP6M(KL&|U`g^Dy$*Dk|Rm>9w{;0gAtY4*obfO?Mwxa zkf91wqS8f*_Mr61FO&(A3DqAZ;a5nNFxrPlZXJY3DPLz`PwnDiy;W4!ovx2U%@rjfx2VOtfE_XAmhH>ps)0qCD#?QsOrg*{xc zhshav1jwv}N8el<`C;G7;YzXjkxz&GF)rxn)c;2IU&q!q;`5YUbQ>w@W~A<5g)-t= zmRi#Ph<1jj(?FBBc$EYZut#kkY-Pq!`rx-rmnRjRY!Rd$N!%NujWUK)R=G*?9cYwr z(;yfls-fJg6Ao1ODScWh$XEVL6n8c{=yR9;!q5l+zc*T;3uunH2Mr+0eMvuFJ|3{Q zp^AJJg-fYXpD^>a(~DCx6Eru)-Zbze<1{pepJKIu&)3fWUeTWzhrP~bkc<9DW*`0k z8rMB>|M!{qS3Pq4M;ehMo5o~m+T>6=*);tcv&A_~K_oJUVk)5~k^S3HO=T*=CJ#24 zrEM|(MayW~GcQ0q-tImTModTXjI+P24gf?&heLw)=S}97Hk6nFhq3}#I4$FNH=)!F z9H~S}QOFo-c6EAAr{UC? z^*_q0Z59M!<=b9}Env`wm^jH1W)20cRN-_hEzY*UI?Ykje&aksbc=bfzN(XN?vF4o^Iqr57;_0r}wHyVVlqAjcoCjS;? zDJ7L@jtyC~DDw!oE{Mj+(NV&-7$Ef!TK|n-GcaJdbyiEZ)99USgAHT{sHbmpUilTx5kAS*0y_PrSFRbPabPF7vh4tpSt;>#0kLB) zfD$7^Dy)_8*3G12l$Kvg?^|1zc1uTJx!DjNR>S)u7mr>{-JIRDmyRmLD5}FDD|Ef=}%6F>iOb3xBoh}Di}rwo@?j19Ihx31-+}5 z^?&9z2j#P5VyEO*)RrRl0A>QBjBa70$xXb;H<$s^5_=d!J1HY%(%Y6y7uB~j=e7e0 z!C28H@m$T}fV;C>q5^Jph?%Zd>#~^RD8c(5mQY{i z!>NC+U_-%7-HWaUYUNdZ`slT_~xJEmjPA0{_8%l{m2$b_Kx!!_t1 zMX*X=;@I*DYgT;jT3cwzjTuK$u;^0RU}Tk`GK{k-<+Wmr#jBJflv<+hvG@@nQ{Rt; zc*hwd8L#F_$uTqtlkoYWx>5h=zf|zK6zsgY{{6HD;(^k<(;9){r>qo~wj?}^^#{V@ z{yVfr6)Ow`Y+?0RHfJ`NRFswgbvy}x1LY&kXcE#@!$nqVhn=&?)t`TY^@8@DLNq}o!MXM|}L zmlC@89<={En&z)vRE+-+S0&OvH-wb$=Za?K;%V4zmGB#Z5 zb>REP?TYkC_x>dM@bwMG_PS#x?2=njLkuIj=hS)9z&vo7+E`qUNgAGkd4*V!h{|=l zrio68*t@ePyeFRi8mBj0N*0H(|T06BSOJIe$NUyb|%sqV2gzyPidc-EN zr?dxokZ_iv&*?t zqTl_}*J#6Rs zUE}b9dDt-AI$ey917UsX9DjvIK;rPl_z4$tc+HF<_N&iikOq{m<%l{3V`8t7kd&4y$4*Blr zFz#nNJ$%u)C1_=5a?xefDCq4!Rj~)JhO9&0wYa?8g%2GZY=tR}03Po9gbW+U9I2`K zP-w*Q#cXuyfd>W2=e|oHI$GyQFEa%Nq_06$(E;=X0A2w7l5B-o8tjGw*bC4nM0+Fg zeg4m_o<{=Sx1Z#=$Yq;{U^Qv_Z1Fut^?{KZPpB_YB;6=<@m2rYD~qB%u{v%OuMc{W z=!={^x5tFStB#IRC+b#roqRkGwyr63h4xS$C<5=+T^`y3Xcr_8PQ_;5e@Y8O9^+#0 zEp*HLIpj)l%x1}}3BagqI}`kPV{&8o5N`3`u8MdMKT`)2Wg~awq$}{`Z{M}OdMFk? z@m81R1`Iw7OikwSv5X6@^gBh&V_!>lsoVGU4kudVisAMPCc<7dcvVRN3?q-w#2i9@ zG^zvS;mPZyMI+P<0BASXE6C*Rk}uS3Sz#c=`+0Drv>p_!pqy{&M_@YdtOC`K-RHCJ zW3AK6x~`3lP3?0OA)gP4Z2J=;pU`S9oJb+(i4L5qB5PmB1=RQ_vJ(GST*Vqkxg)OJ zQ_hOAe9wFlgb>TZkx`Y5O4s5ZT$y#D;fVK({cR)Z0@~p*FPr`}rY|^^s*p0VDw$aJ zPjqYYIAt-NDt;id+k4zL^>9`)s?fb*7enOfIOZStQKJAF2AK5QgcMI#0=QxHUmvF1 zfcI@n=Z3=!`SEb;Da{FEJ8`VC?;}vz@M>Y-FrYN$>BN76q@xC@f63iRuSvp-F;cPfz;^O`&t^8SB zVHUIx9T|aE((5Kjk8v^R=52uHeQzH@A;V12zL}f(mUagMdHz3To$Y`9)Iw*^=f97? zlMoqWi|Fnd3W~u>+b|uMquEnb%2IG|m*DYVCBV$VPfo2UxfEHJ7xeby!_wzRUG4$! z+hIq{_B4UDUP_gY3a2u9L^>3YDev@4fUR2wX-`@t(A6^yCSx$N zfd|kOE6s*{)ivzp;YIq82n)n0uA}}sAmv1J!CznN{RkduT+wgFpgRUP=aELPJh-r6 zG{gSkDhYLX5Es^_|NR4hax9{qB7OTSg&i_2618k&WmqT!>$o7+a@h?D28BCuN2Aqa z$w&IfM2IF+$=iyRknOO!F*yPMHtZYq!ZN-WB=ZZk9o_(>f0~|TL`|L}kUaDTY74=4 zX3Zj~UHJuII)zf$Ias^!nvwV0V*ujLPZXTR3nSS zUOqx|OA|-2vyD#d(`mB$yM+6WFL*=;eYZ7E>=v^Zv|o%p*~J>YQI>eQDJ?i!tX~l+ zSFBXbxr2i9M${a#D^8&|uR@lWKw!^JxU&0(J?(b(RnlU87D$A9^tI&j0)d7o$#^HF zb<-<0-?@3c0MqT2kc#LFYURx5Pj)Nl0u!IQ{ynNAX&B#=$ZjT}q<$^UR&L|>{5m5>l#8V4Jr{`bs8^eeZxiPUORAN7A z$JrO$^LpgSrENs7g3X=py6I!^*+z4|9zjenIH?$8l{64XWKp zzgKQ&=~YUW&5&RxER>AH#f1rdLRjcce7oBIls{Aa`!VCOY~U312KKo6P}BV{bAeCi zgK>J9{5Jm1{yzu26_hI2;t#(kipm3k`--zSfTRonq0*CnwCbjiH72QC=%)55Z%cw7 zFj}39S!^B|BcxAXCQk+jA|OyBiyE^$Q$1hO_Pk0-LRC8#@+Mm=V-Nz1@{*RN82hkI zu86M!VZ{U)erjt=7=?#S&6nT18~$XbtVNhO>mNF>BAem1`5<=-ogm7&hB)CNf>eSblK8K?@&FOK`(cp4QC)l#H9|s6a+aL zyO>&rsv!D1dE;V44m;^vZa!XyZNBWY28lTn&Te9yOw51~^OLXv1L?D`mpbxS$}qa# z6j+52J?J&e&DCbSbQLpiCvO8yKQ3FZ^GN;QC#Qevb_25GCJ@q^`p5ysg-P!qyc}D2wKIW zEonD|{%yqFuoWqFyITK;R+X-__QI8e*-$4`uD*hHWh`YrG^2xCE%hogW_gJAtj-65w-&)W~;2 zFOnZnCFnkoTV3ki z^43jXL*!^JkB1o4%T2Na#Vho~zRDL$gT_Au0H>X=A24ej)&)^|y(ehQPc2#i@8=*! zI5|v)ycBQw5G$FuTb~=%5Ighi8F>T`3~^KuexF%fOSKU^rE%prr}03@$KAF@jX)vu zL|hfk)Z$pf(r9v8A~5R}Uncw2%V2{J9F_oKdX4~gX!O+D3=Mw`)nhPzv z31q|x(p-NLFKc@VW*?ZsLj#+c$2-!w;@Mlo+3sjB?-j*W#|)uU#i{`nl4B^o$OPii z{V<6bbudI*z?mejK;wr)Hn+#&oVXWcx<;6f#8^6};|O$01I!3nXM`gzU*Zk+?_Oum zEHiJ`k%)L(uLC8hJHh0{km`A!f2Q8*eYk-9?a;zr*2$Q0dBjLv zEb76#i9;I`=ep|K(q__Pe*<-vc3Ozo=T`CyXn7yUYH>E#r1I(Tb$;h0I3o&&HOfBz z?0`M>Kz>TK-_*EZ?1}JdOT{&n%j`nq!ir=mT2d$&%+mr^tH6Lv)Q;&(fAg++1r(Wy zRS#w{TLRs7;G5N*+7l={;i(+>hWU67PwyB6nv3082>tduUA>JP9Zu|1nPgvjbYYsY z*8s!;6erVC4LM-)eHFPgjwjY;Yn~V9N56g?@;`X~?~~6}`wwk$5p?uwarsZ7JhKyy z$NSUL<9zeoIOC4Z;E|dkO%nJlrH3=|X^f7J$4yF=j;HIX?}z9kI-+xA%=)g+efxTe zWa^W9thJhiL|HmCA_b*9j_FTbbaJkNgn*HW3>s*_5fm=Q8cbcGtr4>;6tz@p<$RVr zdkYW+pN3H$@fW~6*T$_Q$zhWe?e>&gBbsAj>}F>z*j&Aqp`niP>NCkdpm6FC=5|~m ze&KbpXjyuybBV6D;NZDPYWOB>tIp`C}co^3+!{N&95D| z307{Z_v$X@l8JFx&~IE7g#2-HcKASjedq@^EE~~y2oIF6LpYzdb^#t+_jAv5k-rcz z{cO-VYIBXz^QfWYPd7&~+dz}(d~8|%Y&|WzzJIEG+>H!X*0}M3NI}Ae!T^Qn5t9$L z4`BhS%8;Ck`4YO2zfE3A==F8l6+q171G9z*B>%Upt`R&q)#vqXI`F>#3cCDQ;I8&G z7G3&vs#)Zy2@S3JuA*nTVsmc)xF?$dmocMIpd}K}ikK~EU4+clsiFluE~ju}WHsaG z)WSf-A~QK73)?oFtnaY-d_po%Uiase?2Pmy2w=+-=qs18)5*nAjVK;{(=ryL-p#;xPxbdtvEn zePjd8!sHj)$sfr$IbwOA`D1z0spv-X*>~0J+D))tCA&3kHOW<%gD=&!;{{y%`JLBO z(BWRE--nKGNr~NMT!jO802lLqGIygWP~p8yQ2=B>XY%+|H@D=LjO13X-wY}T>Qmm{ z6jkI5&5}S6QCFAY*Gp!airl0KfSC2N=4rfH<%*-DrMcItO-uQbQLa0sPLq@4I|oPF zEIM*HK)_zxY1?xZdsNB+8*ElV1;teYMIhBP0{L z_Bz~P=cYN}s!Si$<{39-odmK^M;M zsB!?sU+)Zh$k;gwd{ONGBgKaV=BTQ;{!1g)4`O5lu0@jizVnyF8Wa8 zC~SaGr$YI<|3eEUQ&!?4w%?3^sJK9C`4+}v)dNo1@N>&HY)N@YkiuXAH2=?V4clE@ zMIRH}>Q`jB`tv{>jk(XYQjnrStD+8j+R&nbEI4bbD{^IH_|Sk0?jVrF$&Dx$&c0Kv zrBHCtPLf*Xd)pCokAAfHafL~vD~DbMPqu^3-GWf|tS$g=7pmU?qHAfSnwhBPSVdU) z3p7LtiuFgt|A;F$u36PyABc+5Gb0c{$ADbwWhi7FP?n6+Vx<< zuE2C0`FVO3ITNZW3(HMM3(g)GyhcnXr;k0@&Mtbtxfd1Y8$7;im1rnCygOj;(bLi0 ztpt21-Xu8a=unU8Rv;REuyVD_afAWz?wq@>*TmB=KF%>l+6;1EJdh;(0pEC|C8We`MG z9+w6R*OGV4R#5e>bgS?)O%f;BON@i^`m;_)MNLRP$MO7l}Cy&}2>J~#jT2IcY% zd(<}rvfz^Zk5`(O2&J3WrOxLr`FE?@jo0_Ur!1Mz>-(O5@{88=8-ez6v54>l($Z+P z0aS9bXdky+|2iL75tD-4;sZKJAJ(F5moF!CJTR}VemYj>EV-J1lbY~2r$-)`7=vBR z;NfJsjj5j?^OB4tUyYFv@}y;z#Z3p_LB8ye$pA0sE#jhUsAbB*f1yc@KE4l@@ZJR7 zU!TpeaRpnD`r4^z2|p9lFvL?0g0QPAm-d~{_2YZ-M14+~3Y3wr&dYbcyd}MkebgsA z&|em)1=xy^$~evWs91iPtps~lC8gGx=C)}Ohsfu$@`!AXKl4B93v9m41_lvE|DwSG zRGBKxz?G+!*PkLkWgn&Hxx<*Oo1{*{Dpvy0Y2H+ zB03E6^uZFPo`vdotw4x;Pz1DO2T6EW|D4HV zHr8z~+|wN3s_VB-W1< z+B=PjGHV^C)nitHC#!#3J0gR&Ht>bwvAlOl(iZ-Z$dj8Rsis6|pb^5EsYZ2MReadk zP&L`hR~U={K-u*CgyopTFRT>FjPK%XA6Ql5>OWi%^}ArSuU-uxw?Ni3$sZGWlKTs0 zW?ZayG=nyBkJ7^vXigr)Wj+yX@m@t2OeNbitL&IMJvj%qE zR0xSb$B6L9IFz830FcJHL&SOPS zeWoJX%Y-H1!*-4CrFI{k8U;1=eje9+vr;ES=xCzwwl21Y{#HpTA!FGN#p^9iL2*x~ z@a}>u>-AdlXqYRK`_}L8PXrtzAV5>U$t|)Z6pyqdwPwUXQozQ~W*8KSkXcR>Y$@G( z(z5CesAsv(2B>|GWXIT!UaKKL1${2woer;S?zI^OUU|)r#dw}R@gCMKu>%R9*`T1A z0T)=zl+Q>gK?>1gf`m?8)1prSpn;dJ)gSNYe-}Qx1&t3#Co9my0>t-{{>>3G&7>yO zZgx+0biccL_`M>usJ>khe_q0c8T!}hboUz7P44!p;kHi$KAPLaFz?;3wB2lFrG9Nzcyyb0%qK+S_|*)=u9pT()3)BDY&Hvx-UC zZ=t4~ z;ivrpc29%v&);?6U1;{2k9a*?Z~txrJ1JUqDdJS59cbDtBmApqtiB-yTUWN*j;M;# zTp+G(?zYOlcqxvb{P}~h$+hF*o_{Lr^N~*F5|_l>|U@@KPrgymh64E%csCU@-^46q^Znru3dlO1VrM)4O+3RJXoVQzr5g{*B-=iZ$auqyD5&xzW2iT^?C( z>nj74NBPHHbPLXe`<0#nFJWB7|RO zKM{43_Iba1czZ55^wuW5COPQe`1QYjsW1FrIqqM-rD?ndy*2Y%MHN-())Fi1h_@XYPnIco zGLS*ySFE=izkY^*?GrI?Hy89YteUg&Cn?UupzJix1!RFP`(NSK^ zF@ShBInsmOPp63i{tdD3jb0aJR&vehxIjDkZ;--^y< zM3hKRgHmIQei}++?enTbr7*hw)gq1gjo9F??wrf|$v?>mhmL9;9b0h%>6^KhqLf$S zx|CNyI@mu~O2sHNZv>ruGJ)Z`=M?@-E*W@0-4#DwUZ~Tdk8j~D-c?q4n-l$8OH{gkp5tWL$%i@g#q@Jymqcrqm_%y3xByZIK4 z^7X_fHWH2~%~{lWN5@t?g158X$`==7BXO4@mR?_ zo?q+}Qg6hIJAy!uz&U^fe`tW4FM)bjj{3Hz7hz)JH37 z`q6)Ju7qK z=P_SKK!jJ^z3FmnY|uU6EQta|RN-M)c~49_ctq5G@aVC&(5e*A?u<}l)F9M-rGz#e zxyv{Xl$jwy@g*>OrMR6g#;Jy*E{{0*OZ(MLboGz_RrTgSVTUuimX8SF7K0pKRH9ST zQyTF(3s1=Zq3ImsGX1{3U01ek+qP|E@?_ht$*xJ0ZQGh`*G#tUx_X-5|9)PbpZ)sW zd+B?uwR%afZ^cQD_jK~rk<-ZJM17T`wDGfue?LYK3;ek?^<&5*b@$0s0i zq#^5tWB-8;E0WZplIZizGV5C9$n&Dr=MNHBJrRVNa)GfDbhOr%ZABPINQ*zikY!$s z3Ka@^#UNTSZQcXf829KrC=kgLZywk-{Zor)H{}4uLr~(K4R4D8v=5qlA^}JL+A%oK z%7P!(*W$_YbL}HLJ9c|Gmdl`$6VqTJ_E2FFSUXg1DdqT#{sUyh-x1_b495_h<{t58 zpE$LnOtf0fyhkp!50zNpSH$S)^e@AS9!$E3{5m~9Li;|LM|iwSk-2Jn7o3WUX$}Em zR1dwDQq9yr!>ueL8`9k&8=s*`m9yuLsoC3_Chp83&U?pTXz}N~^cKK7tOoUOwS;#6 zD8+T(+Ms|aL6s!9CWj08gIZ8DCH@izbGB75ShA7Li5CO#p}GL;sHlj$2$#lH1wOrx z${OqIkb`UyD=k0G%_B=g=ry)+^32=w`j80-!8+`;k7F6J)cBRmru&1A2pr&FlzBEU zRT!${t0#l^ZoHOVRIsuRC0rB}c(2f?@ORp&Z$^$wpq7{oMZSrT-iYyp3#1twF|Aw5vLl%EtrGkBJ{Op;%INg=H2Y zuMdzJG?78a6T2_rXDidhxdfI8O9zu97~5jvhxNFiKW`3F$6ZnwKcm0>R+sw?;kTJZ z>^Xta2{f;!uaAOr zg%GC|a%&AzAE8M1<0L^vWtmlo`eQjEWh3TDhdKl?djc5!#dr`}K2Yb8GN9GPs+|4X2?*9zA zrct8!({kr01qhEHJkUb40>)W~2u^^Pb-YPSl`9#8 z7mo=RRF+@W6C$0IKqh-jzzxSOnA}yOypBttg}2q% zjb59+hsBK3W40gr{(yfW)&oR9;K%HZ6m1$h17Z((*KU8W@6K`wU4t**47wK_&Yq0W zDEJ~;JlS@0-hd3!1~a>Y20IKZoM(J&AzI;xoZEu^W>we6W>)zqDnDyMX~xP~*C+4| z9e)iE-hIH_r(UaE9SK9Ew$ht7M^0932V6ZrBq^#qi6RRcCJc#A5XtUCabQ*GwtFY_ zD%KszJy!q+F8tS?=8DT zBiGWYt08Nc=4XA^u-u`BtD`nRt9I9;jW&=&H4SVf$jiht-J)NUQi94v;s-7%Z^Xc! z#q@TvTeUxh*VD$QszQ=y47y^QqCQLPx(2unrcuM1XiIJpE_e4fFH*d88F0?8rjJD& ztNHdXU-j>okmnVeg!3a0@xU6(1P+pic%!U{5MH??_LJ>&L3m#eCJE4yv#TyHW1NKr zOB-*n4J<5`g0Lh!u{!#AIDVvRhQA{!zSo_^#{nI^jg8B^2zh=ZF!il0UpWeV5E0_n zt$g08GxIV33JZG(0Iphi9wA96_h$Od;4EE?&?;r)IQGM^HGl5r80lIsWFKnn&epYi zd!Kro`#wq-9iKw^Po)y0{8vrD#seVSK>)Yq#bhA5e~u#Hx0h?WoPh3)#(8O>s zxL)J@5zQ)^sOI}HnTf^HGN`{pBM4doDpdCpC^c?fVL$e=+kgKW6e&G&I znpq|;AU^Z&Tl#=k>P6)pW9ie9kU`3p%5hR?&HZR}Fk1gpHND%}hT@iO3*{C&UGt~L zk}-Wr2xM@Qr(g#JNHTfiHqd_Rmu0unpE2iD9zHAfch7Bd@j468r1h>jvegM^+uyX?yodFs3`vLArL zLp|@YVTWiM!XA3#5j53vn?_KD?aFr>s3ILTBldIBxLvmhHU$xGpBoENeQJ zifiOM&aHyTaWUC7vRD7ry9@E*opQ30EZ@K{w4*?FXsz)@c~V@tHBg`z}>ZC~*z#CHGlykE7(gnynGDU$II*OzC$wnHHfGcb2zn=_P>x&0_8Q!>wBGIw%^ zIMhbY7=)crE}1pbL7||-!Sngx#$1?chC=En#2pj0#c{>j%tK(<)R2X;Nzi#Rz1tXq{5Xj zcFhTou^ndduw++MAwi#Cn~qd*k=MFrRdU0TXz+U6`s|GP2uw-L7f*X#6N9Smn7{RT zRGVd}BfLX*|8{|p0Bxu^MNmk_l^~q#N!uTG=QmiofSLMRm&2T4qu&~h0;cSlV znJV=F^z!~aX#w5SFd>xC8aUGDq->vvNYL85#IwG!x}jgllhtR%Y@nxC^>|AtM9E+% zl0Wh-ecZ4BZ-fb>m=&~;FK$F9^N_z;LQHu8DVh|12Q&drwCl_9VwLya?2OGxafbJiN+r-9 zkfMJr(+x)@Dh^I?SBCN*H4E92DqK?P@x0!?W4ioF!EB1p?Y8&mBbREmrNMDQE6Yw_ zRR%FkvlmJtB$Tp@-e#VS=sZdt^ma=+9PtS!kRYo!HU*ylJrv{`Em{~8(=;~G%Xpvg zvPx+Et~<`)95lT# z%{}wkEcm{E**9#!7TiC3XK-E5#rE%n7IeqA&g9V7os2eew4jt+MH;ShUODb*eG)67 zQH$Ls7J|(w;l5>UBWc5fLx`5B=dn!`;qDC8W~Zoe{K>HtNEMiucfjN3K>7K~^z5Xs))AS~Ebe&Ug3lp$cvZ!BCHZk1BU6(JO@92+S`dP&c4?}T+?CQw8AznHK zKMqe7{k?Y22dKGk0hJ&vgb=(rJbRNJ-6Z+}$|rYFp8+l{=}acmwnSgr9f;WWZ{j`x2ot1K3)a6A1WBO5 z5urN-Si_WwiD-09)q8ajUJC{68UTKTI0RGPVA0&Q(GM?D{;C3hB52R{>YQJo4sYS6 zjepvvp<=HFjxso*Fod22D~8YV5aK#G^%&1XEC{3_qtM!A5mZ?`@O0W3RruqGoFI0G z*ctL{PQG(F%l6g_FxGLE*TUc9ab>t%_novR-u&q3Xqd`=i?uqHs?3BQ)|%k*Su+Wp zKL&uJp`6)ZJ4hv5`K2ax0N|h*l{DSDtFJCTz|4S=jqRdlh@RnXj2&_%C@gkKuf z_)dc+@QW7|WD|6H>agNSQ@-p4#7|gJ8{z8JTu0dU+Z#fJ$jnLB4Qq@v(MS|L{f1Hq zXycf>^iP)*xatpq;**lH=`Jjs4+zw~v|6P;7Cpil`#^!;Hm}`$KXB`u^T(oVPB)hp zz>*C)YL+ozU6+AX>wq2x<%aP(MulbP-D}@wo(P-yyR+G?XmN3KISly%nLtC*3`agL zE*lfgAEB|g>nK}4L)hs3(d{)@@kyn^vKbt1B5<^=neN;{eOle6yq*9YBtX1|W&!B1 zs1BnryLs$wA4e-%yzQ*-DZxMu@MLFZRvL6ZJc6G>(QB-HYaoxaX<&f}h+$DdwL_iA zx>aKKKm9HJr+th_k>Y$0soeDC%RT=f4U9%pmyIZybAwpIyZ$Ym?1}wjQxO#+&NxQq zHp{d>&4rcWK6MB$Led&v7mRZBc`&8Xr`MmX#4W6fiY{x~CL!ppy<_MIDnKiQIH6j;@;n2wBg0A;sMfx&2!fRS(>l3#4rpKQI zr@_6251$?15d(Ud!S3kmuiyE%WWEzIAk(C)6zO2T7MM=n2Ac=RXbLZKNYj(+l*d(C zH%fYW_ehrz>*V|-Kw&_8Du2vjy}9qE=@TC6YTD*|%LXc9Po4cd#ha?nFf{q3vtpEx z8HhfX&Fk+KQM@Mqfza{Q_n z8({bs4AV#ESRmN`o$dTP7#@H{uTs^j$*!`e;MX#D3f^9sS^2hSX&h|nu74M3DRiby z4r+k)xt8Jq(lljPW-Jj1XrLZ29E4(wC(t*w^f)RJ!T7b66PMu1%nRR&QsY^RDz7aA zj%-uZP!92@G=8oWjW6HhZrvM5NpY@8uu>1JjIIQ4&FVir3>$#;FO+X{lpCNN`iiQu zNQBphxZ}ff&C3OU_?Xhj&+{}v+V&#|@4-1y9mZ_&+F49Xh z_LrnlosYY#+ZmQSf&4`SI(_{iLewYjB5ScL6sWienZXHdcZ1gB$loyCP9kloR$894 zWE&;BGzq^J`0AdJeQpO&TkU;?wQx1)&zZ5w?~-HMpH5@)U%~B9*C(%{Xo70Z3?_v`H->9LQpT zFQ>aFgfun2(L!A;mgwQ*1V|ZBNhq-|p`1sO?W5nOrW&Z z>*V=(Y}2vRhH!}at)jw37uyNp(EStZRfD@*tUcKCXM&R`I&uq72PJ;EQ{69%O4M5ugH}3g1vOVc!o(4qW0Qsg8eO%d6x>OmX_RC^D5<0?ya-@X zHO1}IRe|&Y-cQM-7`lw*^*Mz8^+hr9k;>hmB6-voJ?ZA=71kffd4AvCE_H>}h@fe_{b6{g+ta zXq*6!#r__mrxRbo_=+70Gv&3|9!hiT`jk-9H5(o8a7?T?ah>Akp}gUm-{6 z29Qih0?}X3FGr7jg;W7-1fqwWxzt?rwLUK|l(yXr4MpxmS z9%NFTzQN+^z19oid2XznuRrJFa6YA0MRDj%CA`k?%-l^}!iW%;OQ^J$e0$`MV%VIR z@3+Tw`qt1#@cW05@H>SjgUcjy>>2Z7m%ZbuYvM$5h)TY9P_%BqPc?K!&&co@_=jYU zOC8RR2h@J9SvJ8POswAR=TeSoUO~`f{DJtFt__lWc`70N7TcMB6w{MfAh$_Zhj%V( zYskxQb;4Y|bcw-YE0Hqk>uFJI#a3l7fzq=nE=|pv`(WX+_9IWAHqvK7AI}9KBS4AL^!wj4~_&PG=w9v4;T|*Fbbs zeu-vW-&x2*NOi)u0QrYSbtS@$4z~?)F3!asn{0lxBN1RV^-g6^uC>nauT1-aCWW#H zQE!N~HFR2(+CaP3B86}lm)g4u+Vk5kAJj18mTY?|NBq1GgZ=OMt5jwaJ0x~T3CUGk zUT+(plWQ0-TPluhuB38}d57T{nFR(!{VW(CV`s;h$}?;pEIYS;eZ4;q*FmjceNc0U zlC&MfB(8A*AX@C$b4Tr?F9sk|Z^+FT)NL|6hRMcnhN0o3uUF_VV-7wcKD}PA+uL(5 z;*4u#8&_p?badX`f^_B?4KYcH9u&!$H2N8-%%&SO%BVkN2 zVDkzPHR#|yid-XA#h<;@5~F@wj8SPL|L95UjVjk4we9jK8?hB;0*dyJ@&7;~J=}ko z#yma7FKV&vpW=a+tD`df9Q5tq&@WYT*8G};ZHWC!5^0EKQ!E?@KYC-D?Z0(j&h_pz ztH;MQfRM$_*D<1)oBE2ki{BhS{u%)8b|AEUG$oL}M@eYNpL)$SO@zvC?f?(wo0 zcp7#}AcEE~@ju%u%+S?L@sAP1s(0$pgy%_o3_6$)y?f)5?p;)vDa*0=A}%#tVYF4` zT@cqCC4x5J z!g+S%ACXuICDTd@pYc?zH;Um2=U%}$eobT7w@%Yw73PdoKs4} zk86{q464#hEUzU47i<2+g9Yh?{yO-Ocvi*d>mPg@eL;;+P&{|cLZoGMEp^i-$D=;! zO*!@hV^LU71>HtM!+L?bTzkB2JZ0z?bk?z>dIGn4v13r~e$N>}*rp{0&z4&a^rN`o zL-ObuPl(D^()M|+PIBxGL<)j>iEATgCGBflMHwf^&pck*O2cDXwTib1=XAEe(pYK+ zKC1^uBYa6;eEn-}Ll=MwjFHJ11B-a%Y2#z3> zHj>2Zy_FLliHqp|~OMhvCQLxxRXo4_y-j&_x)wW>H-`j#vL z7-{zpVE+5pH%!+?cGpS6_JYshUBbfGmy>6zN!C4e|0g@v5PFmyc(}0D1C2%+LwcP; zkMz~s0ia~Fx4Ijt)Y{hHq8MHoPnucryZqS402QdI+Na|=Dt1HXzX34{-OgrS z^>aP99R<^pfLd{#(^#@fB@-7I4kp}n+5sV9)}3Nx6~vTGmcCEKkIC{Fz|xforjt&n zEJ6TTBwsH6rSId*+~xv-5M$$CQ+(+h{KegKR`@8Exeo*gxoZI)E90Hhswy3>irAM{ zhDt9ePd!j}TzH9{3}P*0a+06^5r|OG1ZJa%BjI|2p6Bq(LIP`__d6;hWDQcaqQe0- z-Uq`0x(TkN@59`uZNYP3ZMWJ!3>xRMo?UdRd-b6o+2i7!u#KaP zw}&!Or2wHadYFQE+>$_%}+Yae|c$UMD88CH?jnSwRyBP?oH1a@+ z6QbxP-Ojs9&R?JJB4pyB%-tzMiHmNFl{^TP=H{D`x?)&?1oNdGHNfLnC_^r)Jk`o1 zSra3M&Eq8Hl$uJ0Cs~Y)Jufmum4z$9k~IkjoO^XE3Cz67vsnB1^K;KQ=0HhLqvSty zL~ze_DL2pPtkSOHu5KSv(f@KkQ(Us|H7HkLyz81rBx{QxuPc$>KzL)yXXmmt%b zOrl46^p)-|T=l~&W`&46e$MlYA8VLfoH|X?sGjM!cFpS0Q5IWQFr>5u)+J`Vq9}fmVgBFaH`i~HXjdCQT{hIL| zlwCNnMVF>2Mh_u&SO%HTMZTf{4tyNk)|v=h|4wO?=0+OC0w%dn0rg@_l?KU=RxFX( z%&4kS&-h6U+I4Z$71*8<>}#8EUG8pH#uPeACLVOoZ!?e~$=w$h8nA?kTp)?((VP*1 zsOC*7l|1X?^$+);Jc(EnD>W}Vg7q|Vhw!u?bPc+{wAg)g=IEstjq@YhV3+iV>XE8@ zS0c$Q!Y4vP_}yBPCi!G`fsLDEkFPgQ7GQ5@IhP+u{`2^Zx5VWEcgq{OhE|IsX*>ow zVk7QoQ^K=6BD(wHcd{y@b{b-lJ6aUTiZ}S2G#gA6nz)pJH#NJU&yOCUB zDQ{X%B&FStNj|5j>nVd~+ys^9f||dBm8Ch*9yIEQ=oY0cLL0kg8*@pE`?XX2l#B*P zQDi4b0H`;1wE0dyX8kqKgz7d(+O^EFdt23$S8CYR)9Z#$ zbIC?@q4CZB7}nHFF<#@6>_>~adI`oFGm3O@foPNCNnj@664mOE>>{459o{@~zBlD{ zZ{-##9WL&smhcb@v_#7c(E8;zZsdYc)aCN^*zaC44 z(fyB;8i%6TbjzFxI;c!ahf1w=3 zH|0mSFS?NhAkH6ESa{*bkE^pgb0gtN0qyM&E|Px;ku|df%bPt0XN9`rMRHlJddp%U z_jn?5E;TX=iPxnkOsT(psIRK{yImb6iqN`9)MAg6SXd9%Mx+Xs>(o>!yh0z|)ZI(2 z2=9e-qCQNdrYtTCz5FUPJG&W5{4WhzxHl4`6{oA%K0?zVT9`}luDK2!sI*t#|u#vqw3*51~6| zxVz0ZEAW4E*x6*7+eDN0h;tEqpE9ZAKXeQ%g%+CD+lb||B82lJsD-g1Bae6ps0sOl z)F5P}A5oZnvqHb+#&y^zd2qf$@ttLHaWq>p(f?(^dsuEN`KDzi(Fp)pl15gEWQ%4I zva`xLMU<$Y#S{1S`b4GlqQ=BLe=b5Tl;08&80AqGD3hkrN<0chB|i@lJZPVD|AgA}t7QFAm?C&d8Ox zK75}X4_4^~$7)rZA7Lc)yXLc@!}xE(D!A&Mvp*U@`f@`*M&6`$)jok%(35!?xVjML z{H~zr*u=Gc098ckIt*}!;ongJrj|1`2vcI5nDe9|6sWTG1$VmavjLUgm5>EJ6eO2cnF=~&y)HPVaWkCQ6r(LA4VL>sH9&f7oh36!BAR`iQUm?cb zjoT5`I^pXb4%TK8k5eKRxmx`>%#@|VzTQC;o^%-&=#-W*RldljA#q&tk8FC}O`^xF zC3eluwlMtsT%RohuR`kir7@X{7UM4%TsKIzJha)m_APw^9|HWMQ|HWK}qK^>RfLeS2 zdGA*eeQ&6BbG+rX=g_v?rn&>yuDhQUr|L|?V9GG@V5Lyq?ea7wqy$)b@pXIH&$=KJ^bvGWfeD=Ba3RV!*@BG=jxADi@0-+v=ad4GWkZm!ZBovPnw$ z<6JY;ZvJDt#XggBBYC5F=d>_hnn83V+NA97{r=>Gjr+ldHo7e$>Qy`Up>rtwKKmYq z0cVLDj=)VQ>^iJ@!l)FKSBc=>v!Q0Cos`bUE*id2F>IbXcGg8&Tv{zz$@86(pr!rJ z;UOhIDyKgGR-fd<&Cwy2__NHg{8sor@cvEWo$<(pR8!&Bzr$h2?Q2F{KX$Ep?dFfl zPoDylzo9qzV;IZ<^rmb_rf5KaYvfRxT?v>PSc9AwLajEXhUe|VQX-(x6DVwX2z4P{ z)1QSF9U>d8$@P>d^|}JwJ;%q^IofH`Pw3;mnai|s8}RXuAdD$^o`XgskdNTl*j)Ue zqtu{rcI5`pAK2obI_CxN2h{K%U#s5FMFfVYCiNUDG|iH}+8PRGGYf1*X#zX(2J?(3$b zLZy||B{9B<;XO`jfz4itN_Mq22X=o3LplZLxDA+p-v$zPV!xr6Q=dyPyaQkM#v1-i z8vf_duu`~iJ3Kik$Q@Mth>|*j3~X-czW3UbRLB(bV-8}N6qQOqql#58A5{JbLY$U) zvb_2b_=nhUa4K17k5S9UEw83br(w#TSuUDD|BkD1!HoYPhA&wA%Q^A^M*hRC-;1DU z6}V7vnP9R?gHi(Gz6l_Mt$N>`0Q9mnQcjmKWER^+-N`8m2seMN#%XB@JyM$2xN>il ziGnKsBso6--%pGdCHJ8|FQq^EZL`+q37wT#y$}gwM#H&`#6XDB2g)=-QRnmbS?t)p zH7ZJgvY<;$0Ss%2_``E`O_-01$yMrmXN903Q^a9PMZCU7^Ekl%qm&|&i(DqekPzD` zsTFQ>7Try+JXRy~>cjVt)Wk$e{oxmgOSw6vDaWySxYrlNHd zC1ssMgtbH&gU`$^~OpF^8gF%K|z3WIMCX}r@xoO8CW#Hh+5_|$3iSd4l)fw4y)W;Q3U<9ro>{N z)J;s~k|f;c9Bb|igTEQQoljcIa@%R0gSp^{fhM#p=kp*L>xp44r-uqK z`ldF4oB(uIwnPT~#UA?=f#V;GAPNJyZd#io*D9l%*PrcVngil2jWJpZB(cFETI?xf z9;0lp!5LVQu61GA8~-OW7|{NEG{w4#k7i%KiV)!AGb0`KVd;eOyQ8I49oHId>?5pV zoY%M4_!_e?r`7*$n(y-uu~H$aV{6Z`yGM3j$Yx-3q$oOuPO6KkpUNIwDNn;Muoo&~ zoXF1Sa5Qeb-`084!|Nm(a0DRBDuJYdSYu5Jk}`n|W2{v~@&+o0^Tfw|@kBzy3LoE- zhUHcqHc&OptcfY!Swx}O>Y#EZv?6(5M^-p6^tarqN$E@^P#aieACE-rqhuS~{GPPR ztu)|8Fg*(963^cXK{5_OtuM2|S$_1`LhB~*D>vs?Nd1Vu!K?#ZFiUM-5I8&_?^T4F z<}qF@;JW;Z|DzjE!W6hRI6Qqs^!;Vk;@<-j!u{7kQYbPd81WC74nihIYb0P6VuS5y z`AT6g)awUmAyjSzj_85ApvKZ9V?Wb{U&K0HW% z2MLmuGG>#4=q*0uq6J&k|3qqX-|}fCw%Wgi(BMpLbS`$JLb3zN4IYhTLE){FPFyj% z{wYVB1;lfa9E>c;PiyzX7MDD0z_l%4c!p}n(qLceqJ!Br>=W9xYXk^6E^Y5NZ4Xd~ zIT6PzG{E(^SFS75i^yNzw)YxZW)7P5FE}oChch(+sd^T9d`$a`9Uvp?tb!7%uYEZg zXvS5i8mQn5e#xQcV^Haaz+vF%A|1PnE2>FMOY%vrL=GC%zU_?d039kc&fsJi;{-hN zyf%el#d=!md|lR?&NK6I&>D(F=kl8*(glSdw`=)3|lG#QV4 zdVII|y&jo_7yxa)YV=s9Rr#g%@Vof{!*-k^-DQfgeir(PR)H5a}oBrvIzEcd`Eq1LYc1&ZC*Z4P?NN zLVVk6J?7kQtVPTK-;|u06RK#Fmzv#QwDSSi>BLdrBS8(xb;Ol5#HYw;pNH%QN8sWI1Wt09XDc>F}^k5TTj-Bo$HA39Y9cW*+eCcnG|TCr1C* zb*<<9pIE{~^7iGfv~Yu%97YG+7(w^e-6gw~9RJh|z!8htUsu>4b4W-&HHs!g^IIM1 zINQx`d83sjvgpPvE64HSpKDlSF#jHhCkLUuB#&k-jlrtx?3r-&{aK%Po6fytZ+aaW z(kg}+EqolzBauXWCj6+qES@n08Ud{_ytm3D$TbGnShVgE_7Tn^-MibK5KR}$Jk2gW z_tmzh+aJ~vQkRAf(Uc|UmOe$oyshaaa!}BeP~ko$czkIOXeO}TM-#>ox90E=?BO?` z`MieZ&w&!?x$F#Sa^h^Ev9&YZO|vVk&%^u9#ZlM;p4@AtvaCTUna%3$-Zv(I2(UQr zobE9k@*&N=H^nI-@ahu4cNydS3j`*AcW>!!Fu-}WY_K^j>`kiU>6 z4lJI`9Tift6P`AY2;j#v6y*5?^XYPgRz47-`J6)mC;3AP_Mk*+{lXO`dc^%0M!wUE zjAJRs9Iw78i3gbn`2ZWSM;^46i)TJ9iH}GKzH!6{5 z={K_H19D&|(UR+xkl%ZJLAlfA-`lNWcl{-B!3vc(muFCF@k8#pj%8cL&x1~(H#!XQ zt7xfsL5lBv9}owUw9+~dGYI6kBCyB+WM|OOdefh^gav6pJhYKQUPS%@9K=I^iX${H zPXY8U@(PTUD978$rd4{%DgJ41<|i?$z`?7k&r2O#Dk+(P@?!*J2$s_B$K`;|!V@;s znXy)Jl~iL~szaSMQbfNaw`lYeO^KSICPn#~%{9<+?T4)C<^D^kvu*<`Oz9wy%#oGE zZ8@aJfNePB!jjksAui70*k6b9qK$qJaaJ5P`932{{8*>Kc}j)L0f6~{YHIQ>5#d&; zthldnGa0QsxR?HiJmF7BD}s_zQ0L0q0P%~zFE3_|syH^(9h)Fn;%Ok?6@$h?3XajP zzvNy>2{07%zgw;bzP^id~G85elH*^_y%oI@BN6M+Th`a?^6= z<}I8*SG{J#yOY7`R3V2ebwQm_%?!*wfg3!EJIdE%!p&U>_a0GD``gE}n6F_HFc*ne zbM1dL3=_sbccsce^~U<|ErF71ftvo}TjiDG64yW;IFn#xpe#2Hes?jJPf@ngx)`2; z@Qjd|Co~<%CEWERxMo!crDDqibMurEv4a$f6ok z(mts9p>V>Ryva%S(gc?~xvxwJ@Pa}Uw z)`$%~v*x+suj6hb`jQupEKK8_1OfNE@ppq2Rf_`!B5RYnRHOI<@XF=H#g-y!w8_r+kpoTazl11KJaO>SV1n4to^B;`f&rcY zL2Y+fWe7x7f0m=rtky*QN3)1QJF~IIs{YYC{!={Zd)B>|%kL=|pS()9lsKipp7)8hXqc_d#%7=WQPb9>?3E`$2Qgmh>j*<9`5tcT8){mVrf3w~9{k!Pu z0^1DSYp7~MIjmHr;x+~5&j_=F9x;}P3)SuPqVC+$e%{gKP9+HF!Ge!dkdr9M0P735 zaa6{Fl6ff%(^RnG`KX|vpy=q}5F%?eCCXXJ%A0S3lP~aLfb=kY)1zLgR2xY8y<#Fp ztQWriz6&hx?>4J0|I^`UQ2yy~?Y6dGW&g0gTw#!>uupx@+x@FB&nXKuv~FKp6V2Ks z5-3hv2*7ncwpT7SN@amVi#iuI`vT#qrd>@WBm=g>$3@u5Rr6IcQD!6*$0g;;5+`*8pgX+@T;LZ(j zd08mAp2$n`yhZn~k@aPDzS+hoc>n#LB{RaFFv&sIv zKE6vXfar8Wu%+R4y{qEaL{yjphi*kd+*ku_qh!-vUQdFVjdaB&Qy|UK^>(lGVCRGm z>n;*G<4K?OJdRu`!?gB0I!a!wlgUHD>=uGafKc>?k#kZdPIIJ}NX_J3FbhLe1fZ~8 zDkm0s9wB~Xr@wT>=W_*0f}|D@@!fU{J*BgVyWZ+w8v=Y#?Z0AQ4*3)6|JJRLYl7qdjqH8?mL;14`}I z7eYt;+xRx7p=lYxA;qj1dj?gdV+DcWLpoFEw4p)P>SPcI0W~?Oa1OFCcytXnWaS_sbC~n?ym#Gdc6Bz-LgI)MH_Y2R3^y0gWo?4HRCWUDB^gfTZ%U%UBP}7XvD3{kPUUU^KRo}{T%Jc;7$b@wdw@pF zc(aG&QcpI_E9<&+!2U;bkBT-%s zU#Li;;HSV;iX^p!7=@_r1PLawP5@4Hxc!MpZp$q)#%>SU-@o43Y@|Yx8@Z0^SD0b! zaw%Nab!KS)37y3aWdKNHQH}+d(jTsbC~c-_2I|_$vu%F7EZS*^ns-DzQc89&?In+V zVdF@Vfv)u`^1;%dW+dcCps?~8(`bqY+S=)j7ms!_mDQux#fo<5`2`v3DdWDGbZ92| zyKtz(&}I1plG{o7+Rq!@Cj!R=4gt^CJH7rv9|`n)_3Vm7xgExTJ2+a)PQB4e&G5#6 zG#L#*5cMQegrtCzltVC8dJ4q=09K`J1A*=WD{3HA%#nr9E7s$kGf5y@GrwtQ9j`EY+`cKuYsi zh7QcZbpHQ#IMcFu5@u<6eY9fjb*`9V=NlSJN?} zRqXNRw`N%`BZ^J~NYi_%>n!kmj{JW>REdb!*s0WuCvD zXS)(EN0S*9OG3x)mm6=s+Y#P^0hd_?(UapEO&I(gkBhf@x~NKpQQ|M?D8lR9=djvW zbu6+LAiOhjRv;PX^aTHps;>%&YiYV2T!On>2oT)eU4wgo5Zv7Zg9L)RySoK~Lk5@x zcMT4~-CgDmIp6qQ!}p%+0!nSnXQ*)e=Ry@raDNLk8LS?rYk2?4OUgo;lzYO@_)9B zR9Q27i)E8R>mOZy&h^uBN=o}!;w>F%p7Lf2*&=?;>NYHMDqSugX0v&yN9OTkjKZ|m zwB4b#(-A?&bL~(G81;bt34ebgnRC&Dr@VTa#o@-mB=#f9yPgeMylA1}VZ!VC`xHhJ zul(cBzGDq5QJ=hm-k4>8;Q$~sIeSXUSYosQEj{t6jRBZI_?(8xkf+GhkzxtCO?NDD zNhA$d^Jb&~AXoYGyS`G6_Cga4MwJcTjixX>>1`?tSEdcmHEl{O1g>H!>vdG3N$ETVe*Ov@J`WwC$=-Yg0e$Q$x zW+oN$ll!=1s}g(%p-Cq!Uz{Kn^M1~7G(l4WUtERl9P_^9oZ!OHh{JzCfN=$6M^4Kl zNx+A9^I`G-EKfSv$S9<1$shnGzQg5TRw@^x2lPA@wys|Ip$GSDqbq`>5*RrtDL#1wjlYHL zlh(CipWF~JHOKI)%(N{jD33%*PER3A)H)dTdt5y4KI%Vy-)W7<*E&|m!PJo)_#m5r zDiX9TNz!3qkWz_dn_{zn&uwbOv#M8LS+_8Jvu!YaN#(4275Vwk;q9Yo$BO6)!I}HF zpYx;&5~YuZglxt?m@e&T@`_`?0U*aVCb7Tmm#0K^T}W{Dvv~MK_CIl?IXD}WCPHKl zb8QpW7l=XuqSH@)3iY>xHRF)1>gzO*C5=aM0pN9xPK|9|i^{G8-u}p2!$JfLpfRtF zc$F;CJ^Ni08t_~tRE8l6gX-ARJ)n3)wHdVKeSnxPj}_g`FWAEmQOGPyV!smnmea*T z8_K>^V}vVv&9YKmXOYpg?iabg8D~Mqp}Bd@d@Xi-d$Klg*`pE;xz~f%X`qW#nh3}m zDk=@3gO&b7f+9amRi{HDgZG%kt&X#WxrBvPl~Fp1KHc;Cos=w~S8=sm=wOYa2;awZ z;`rT!i>em+8yZz)G5rSC>;eMJdgj%%uKk z8*qt-hUj~&ojLdxnl-s>!-_vC#N+{hV&XO7u}>!}>||eX?z-0U#~@xw>bI9Y z`AcK7D2#9ojP3N*-GM@D)+5Gl*#|PDe__H*bzb0Z`#L~5(HKC#*5^qp1qx5wGr{7V-yOW1;QYiHe!Fw9-219YmIzwYWJALeY z@OrzJ7rxbVdO~s4f@#%;!!E;xec%5;aw1t?6R$(r-ana60^4vTHEDiD{0;3Aek^~= zdp)uq?`>X1Jwd}<)u^Ta>Ng*f{(yCng;uxL?=EtlZ{i{24!xJ6kUrIyT`4K%f< ztt>(eLpJSL6E_&QQUEh#ahqAFsSM~@u%z=jqK-~@}?!VOTHt-Cr7 zBP{tkN>QX`FLA0-5&DRAIdAkb@?|>BlPZY?Vf6CI%%)*&eN(WUnP4{MU`o%(ZS zIY8@L{&Xc#^<9{qEN|pGt)C%>#k*M;=^}ocoTMyP+{Yj;+hG6@gexyo_Kjw6$~!t4 z0%kzPRPR4^lafh`9jY!Abh|tG;i_FnQ>0|75w00=gBa3<>3RB`2Rgb=F|2>!>rt?r ze5DeB$jU5G#8W=5D1)Pi)s$KPBN;yz9QT_m)N`J+Db4f?GjZukAd2RB2rNOCB}tf{ z1mQ5Q_Db9`TRXr9zz@!(u!tW$*4f6e+xIeq zKKe*h<87IPu`opP$dhQ6t&wUDe<~(o26|yfkK1||Klpoc5|Itz;OP@M1ERXJq<@ki z8o49N<6|SfVK2^_=->2Vt(M$qcAPaxt>}=%V^N7{;?CgybXZpZtE7i5Ded;VJPg+W zd@^DT9%`~L;kes?BRns`?mo-#%#lXX;+HZ56YmzCERzsbdtPMDy(;=Y{nBxg3^o0$ z3^N*eMPSPW8ADURMw7QYQZVZ6_Z${x&ZvR{%Vkbq%yH#t#%77K_ zH=1-)0y7RdNwHk+OXa0l`Qm;m)+({4d#btCioQiFx}rUv81>P4Fniv{BAf4gBaxv< z=lp;i54V1mqbW!Ob)%md;x@n0zvbDNIBbVG@KOB?b9H3#6Z(Kgbi0h#-cgCiyd}%u zd^pcrWpMTT`SG^Hh3wYSN`|mvK?C3T0Fg?v0`C{c0#KhIcn!bXK%>QduGHO~!_LtXdqD@7l(+9?58~oVw|qdDyP> z;hJ97gCfLqp0pSr{g%{s9L#h*Rl3d^gqJDfg#5tgn<82^W%G5Qr5}~E1k=B0it$7Wb%Lj|iTv2KT*3zm8(n{X2nA%?d{ho643pru!1 z^2ZZlzn`%%qjRjSD{yfu^k%FaR&fPIwkh+9=*_2cWKs&i8*C+`#gK5VAvNa(Sq#iU zL4n`X2l~5&l0n1|W5XZspomT6nIYyB9)>k>$9KuKM~A)FvwSy_xB<@KMx{I7tsD>y zqRl6MHyO-FlADpkwA$#tgGxuzFeL3cdfBOl@?~};dC{)Pay$C49v&m`0}lG4=?o|V z{`oe@P?om@ZoNwCWPE-HqO0rMXU3(H!ZmBK*)=!vv{Y$n5{;uG7pBbe;YTFpxdE>t zKK(U*KS#ky9zz1J&F;cRnF}5eCv=l-Caf_J!Fa~zR40FE73afquyzI8pASv%TRB25 zA{fc6wU5efx58KJ5>7nV3Hy-ra{D_E#meCCy+2i1$vuhYU0i zCO9RPNf;Ez&CQ<<*yC8ZT$eS*^c^grHm=2d4l=J14zWb^eNmyXa)Edrovz$G6)>m0 z2gSCg5OZ^f1E8z(kAZ9YKkTnZbZg;;CkXjF-$t3FAx;^J-LF|1Vo{nIOeIS~WT+2F z+{U$St=60wFNI#ZXO@oD|E#Rol(})~8>MIFk|GBGS-9!&$X?b_B-Q5 z3vfRng7q_Ch(Nn!PZ7gCAVlM{Iu}-+cYnv#Igmwfj3AO-d(b&aH(1Po5` zQAh{_6o^u*=Bb(r3}d3&Y>j`6&>6Jl)6u1OOJQLo*59%dwTKCOUsb7Us@qx)jHH`c zO(nAzgQ0D@fylyH00BVmXlU*`s3-X%%S)6Oj9s!?Nf7cBqZG=+PO3_o%>~;u1teSf zQ)fo;Sn2@%{pwphoa;lB19cM4iia*n!dL;mV2*T7P6Pm?Cp}?OX{#pjnp5ObKCCuw z>^7p2^_n{0(1e6?0wqv2Q0mE~s?ej`wW_wqk}pgR6)nje*{4UE9KHRp(vreiiMsiG0n;2!6FE%e3vT!|HE7d68*jU%&fhg~B zITxd@i1$T%;$xG+)b>T~P;;F_mHQb95$jHC|HbP)M5lHj)_7)+o_# zZfQWe`i75_hABfw+A;f1e#WNT={vP%1C*b5Vy3CIo|^k+ACb(qVR#ueAteXUi&+6d z|BwxuymBK!-6-7?Rztof%W7kjhICaz!AoQ``8RB#J*S5uvL{MO8CP3HmCa<*UptGq z+sSgEp7z~O_OGmXv2WD$_8;y?5*0@3olG}-JAYRPI)o@=v#yg$ zIwuiZJFQ{G?w8nrm5SQ1r?Tj8PyAQalgBNtKF+bQnY6tW-HePZs&VLj+KG z5u=N!${zn{~^4Z-&dT#d7#jZtA6BblXVFfKd*fH*)wT0$#`lZ0Fr1fva19%U~c zleZ$ikt*z2m8S%}gn+9@9{O~wmEXhcKla3T@y2zCnfqjS3+<@NF2zx-K0KW{(|39w zUxO-J-#FfFB&nwq|X8a*`Ntka^m zt3oqXZk+i2d0eNN1)Y>Fu9YEj)(go!9ykm@lG}7Jdt1t{x!K82Pb70G7=h0rA@uTo zIyX6m7!u-kK}7_C9JB?t?APWzt=tdR%6u@bLB%SDwo*gBmiJiAF@0}>P5`n!?)U|# zimZN_jla^B`wA_iKJC$S+Oo|)Pcx5YoL*y}kDHxfdU2oBmRDl*2-_iE;Ks7shrBT+ ztai=_>x0iQ+5A{Xvz~Dy_vk7_KtK$W5;YERnO=f_S+WZvxXKm-)VEss5o$E8;x*}6 zMM&22-FmN&8DqiR*?ax%w$*2<1RgNK%@QA|0JFYT5*iP3gKh-2`HFlQ&FMQoSvJxBOoVl9mGLu z%XPHeVc8FYJKQ8&^l}dsb!hEoAC62ww^5Li^t(+qUMGm984#l2=NK!;xCle_*@C); zIPzFtSVjg=Yk|F#OxV1I%-`cHcuKQn($|`>5Iy*-7#GmYP9~Qrp5|A;nM3GX&{kWO zwR8O?K_N?sGNxZ>$hkEjp4PE40+l9f`Fl=E<3J(kNXxReDCBo$K_kh`<#+Nhnat+} z#=^pSFyTT*Q`_Rj(3WH>(h6;kdjnNwKF~MaLfy2DWyvGUBSolcLPv-mZI|Th4C_{8 z8``&2REdE1T^N_bzqmhu`7bFR10a3YcU!TQ($6#}*M-O>Z)8M;fiIQY?H=Lx5i*Vo zcEM3xVWv3}?Z7wWT#WoWDq&BP9562!GY`YgV%Y#yhZjy2$#%JQG^#@&35a@%tUse) zI{qB^g)KeyQ9WC_YvR&#J!b`_X!7o2d-&4v@-GdJ0&8VuSLB)n^lp}Px*cm?iqOgR z(o>O_>-x24cQ=2dRM3}M81@+V{q%@ehcS5zU8Fkd0{T}lkaN#+lPUha zRj8p=YiEFpaG<=8DI8vF@u5ox;#2dPKW8lVkUJSrGC@f{_=yNxL>bAeEnWFxv<#2COK2{hjYZza5!r$v-?^L+6zJH+_68#ChH3`uFo=Oq2 zO_923pJw)hdoosGg602bX8>#fjE_1)ng+{?{h8l+`K4**Y^MHS8JA>Z<-}fb^hS2H zqKvXd(&&W{-{)%;qK}vqqECfpE>&r$H8nD5Q$Y-0Ey)%Dm4Py;pTOIm5!~3`iU89O z@ZB72oOb~8?_9xaXQUEW%GzfT^QK^3>iF?P0zR@?{eer`3tqnY5}n_GDCJE)!rcS; z={h`XQE!TNfDBgUEQ5}vn%NpR%dj(9l_hauYDtohOiWsSTT3xVV~h$$$xiN&t(%Og ziChh&6DzjY;&U*n1#oTrsr!%)`=K0qF*waJUg$TAyCv?$pEV3ieoHOQ3r%*XBU&Ur zqn=DwDvm~+%690kMCj#@y4?DxZg^8FpDxQvrr(B~$Ke5l*``rrqeaM&V{GWCK#1E~ z@ii~SAY{xlvuIRo21s1UfZxT|q!lT6qxi9J3E1^3W???PysOBz>HZ@JqbXj2lk`^A z#F*ObS&PjPko|J(Vp{VaXekqw!I^;Fi6o=1+78L+02+&{Q-6*hrlOk(p(YKeK z*rCSGpA0U4I*fLP-B_f+hYq`pOs1lCt<>z;3Z5AE8frWJ5c-?il!9mTxk7u(=8d6t zn|eMnj~rqUTFBo6ol?Ox!d80G*pm;`L7P5jGs_A7r><9V$}UJG$<}lzO7f+bZeVwn zl)BR8>THq6MajP^h(*q9k?~|Jr?-woz8+l@uuQ1&aPd(}e^%H2cwVj;)cg#;uSAsi z>gmt8Q@vm8^Bqt$_`a3=^K^U#`!YM{vgGCjp?ReEL6p8#M)%WSA`A*ipf$k9ix;VbOUgU{6%UzFrBvK{(kbva*PLjF;#b=p_ixme;B zic{&nuvwtxWWxBk2?>?v7{yheQ;72pI_(jAv0 z2YUyRb3gsN>r9~ktY@*Bku9SvX-=)!Y+dOYB)|{Jc)0Jb2Xi3<< znr44f55@pw8b=~>HujpUL}jN(4mC>h{N)dYP>VC*8?mTg6jp512s?m)yN!@XUAJxd*3w%Tf==idV4LocPKY+0qD;UM*-2e@d{K1%!xa6QvHy!a2wM&sCqP7_4a zVW+?+sSsqcak%$b1t|KQ2wCL50sBM;&nw-Obx1w(jCV?K6h`ltw>zEF@JBPHgcN9X zC8(*wAA*41epb6LK%qY`M=g3z(X;1|{+$km%K!1DaT+N6Td5c9{$o#aj7Ns-Pkiw) zi?QG%`|M0I8;F`b7omHji@s(<`Y7}DbormfmFN0n%r7i<76hyxNWIZ90AW$OKZK#D z_Vwn6ds(nIV{Mlx12RqMQK&x0insl^!=_+6gfmAY|7^{;nEi(6Obun^jmW4w{Wi9$ zIzr&!w$xur#5f$&!6O3;C*h+NJl~FBcv};TKK2jV;hHoolx@>{1c8quy#yQ(DrFc_ z5v9L0!@&yc=zcO3M}#uV(tOag)7RrEU~-Pn z7z50-;U4}sm22YA6k!eU&6oz7yj7wM3>*aD#LXp@`;lghqQff@;%Uzm2pg#*2u01= zNfH@&agzlEd9-|wzTme<3jZU?1@KIZn6n>|#r5{lXOt>vIP~!e6`VESUk7~vxJi9L z%iyTP+uKD_LJW&lCQsmmkp~3wDa@h?L{+9#+J5xG4a0f@M2xJ*h25U4NSQgR%+J z(ea^RszQr#XnA?4`mp)HS#ku$wANIz$SD6itVA;-Zu@X+GE29p71o1P4Jdm3Gtgqs zgyNUxTjd9M>mlItSJg|dbj&kH@@+YZYf3KSOVO~+896}Gedz5F5_1m8K z(wI`(_|6+2bqt6aZ6fta3#2Tu$%^;4TyQAu4_MPIU|k1J(O-pg=;Yqv!Vkcl(E}!j zp}bO=CuoM!OHf(K36;xDJGTC(@#F@8okyjPpy7+4Y1(CvH*vE0vkf~DJRFzuZ6*5X zSE?*E_u16@<%>wZ;bPM?1-oz>ElrV{pI^@UjbLBc-xrhDSPXni6`|GGhYh@x?-QBi zS8LHSVkT~1k&n8vua;REh!Vo@Y7mRaq7J!lyFXx@dDhKQ^dEI+RFdS|#WHUC zjzm|=8O=+JS)74)7t)!>{Zz7osc9nEwgqjCU{3S0#tOoPA9_!HX~@oI`ecNTGEbM4qG@TYOdiWQBqg?x;i#iI`1fk@)vwuJXPHne280n31hVg zlZ|@Jj6OF#1EEn0<10Eln>KdZJlT0zahT_kg$kRSbB1oacB7$(&6;ht>0>;_k9jg3 zJwE1`>CS-sIm*0`13Lj~cWDVgB4=+!S(CUO9?5o9%wWgx?lctP9O7+Z*%rJf#+~?j zvR~@0+p2V!a8C8=bwbaLR>02Bvty8y<1vuc;^=U@K8GSp#ByG-0#GFThZsi4OH9D- zw4p@2$3zz_KF5DDn)Lb-Rz6ywlT^eUHPqFiwYTrwKq5w@i<@Aq%dmlOf~u%J<_wfE zWzT5-^Gyqtn=iYH+f!(EV)s_nkD{q6!+%{;;iHffnyL0J3kMC~Kg2Q|r2Q@OmJdM| zP71_RNK29#%g~V5kkUo5ag;6PL-*g%QD;7KIJ&Ml8WgG8C+mW-MXop@_!_ zxXYFMrAC^rdj*EqgCkGMx=cTMRyw?%x3}GlrY9L?D(Bp1%V`!%-X>&$ed34A11o41 zk)Ew^;>lqxO#L%#^Y9lnUHtJM9;1tn%}s4&7A0MO#*qcN(A^cB8XjL?3#n;<-Xc81 zGEccs?dDv)C$j=H6X=Z9a2qP^vUG&WSAFkgPZ6NwZ5}Qupkv`B-j}lwvpk;mdGrgx zP+0bUX4nOFN&&;Wb&&_&(_2N%w0&8`g}p>hdFzr`0`AT`T7_Ojr&`~;8V7u88D6%2 z`5G}~!c;AqgzqczL1X6;tR;t}qY`zxt$()A*VmP$2ZS4T*#c#kdMp3WRbSwPHs1t_ zeJAPq7q-(GVYg=w2H)1Uq4PwGyq}9TctIP}oW<@9qiP?fil$>}q>TjYX*W>)!ap#d zkfLvva1^>Gk|nJyP53(c^|y0W3K#PhfFC9O1gHe-y4bzPTFe4%L1BZ5P~hG$Lo1;p zdjTw~^DKC17(DI~#nY?1U(wxT$navtZ^J3V4J$V-estirf@;DwZyZZv+ksXDL#gRy z@h!g)<3yzq?}jl`-lLT47CZ&7$91w8p<&@^$bDr zA|8B&ZMIO_;ppYh%}`u`yZ|NA6myNRO}zog5c9it1|lrkSYV zN$`gEuE`C>GYAy<#e)0^%!c+& zw$+bndGUa3zW0q{Z3~?-2F&%$L|fOM&O`;{PM8_q`7g5Lqa%AV48#tdlBvoa^^a`u zd=|_{48BZKt#=IRI%Sa*%^hSLW%x@?GU|f=SktPh#+YF`2JTU*_G2cs z`XMbcHi+aaKZ*%#Wf!lFB}wmzVpBmo<5aPropE^pX|{iT2;%Eo2&E%Sr)YHF^6-v@ z@%kiHElxlo>Ok%0M@>9jQNXmKoB!OKsY|_lk6%;p;g*k)=1eh%CkL9E@24! zv-%5SJqBQ)eQi?rL4$5BhMmia^ihGe~!$+q%BS#*HxJ3Gfw-a{-%P^rDghUlP zO-n-Mbnu-|BTU)nkDi`?KhH>p1$UKR;w-E+I#HPm`%vTLCe0loaX%-%*VdN5T<&J$wK5F&Rr&<+yy zR=odaF=wxhJ6}=6_XvJ5pQ6-SrXvIR!u6#^vDYN4iA7dXWEieJ4PG%~-^s$3zyaDG z({+6k2#}k41$#$=1@l>zW5dO?UJl#q^L2Yzh^$@h8YU=lVA_mpDq@L)4G1Z<$i?TNc}$M{8I?py{rT%ms@bzl5o zsdbKpYCXDt)E5y<>b=L&R9DH}Ex*(qdFKwe`)8%>EQy^}(&86uoK1c%;!`Kvn(fed_@nEoGMPp6XGRo+NHjpEsbqq|X3x*0$V`CI5H((ANb{^c}pmlL)GXo_0e$!K@ZX zpDMew4r@nkP5hl+Jh${x*FR=x3Jv?yV*ucj<~}~n89lN*=}`qC%EPlat=sd98aoWI7Q|+|=?IG|>H&M_8$jp^hO^|8 z1;kxHNaF*)vatKJ)KOj`WE=&8=U940krJw6QHT;Ssuq>_&Lw;X;vIOykaON@WLv0Z zNnm+6x^4GSYgMPIGHGW7HAD>+64OLO^uDcy0s)M49CQIsMX!mRgpu)&+4UmFBX+-$ zQX>7=j)uJV@N?(7MapqZ(wT)Yn-qWA)vk1ZPwlxM!GW!ozeUTc-}C+^}ME z;#8I2itNB1aeku7$V^gdtBM;mfWVHfxr;z%RsloR5=9K(VNCMGxoPrHQe1{&1fWLz zL`}cc_eJVkAg&FJ>$66q%FnJVhe09k@NTcSR4hP#$!*FJdPFbHcsf&|vwp(>_T}B^ z(926VN4Jxq!;h^%u+KJ)T}jCxfOGURn}R) zqqixR(E&h5gcwHs0wQ0GaS2Z%-`^nN_D9IGCM$t?pBAN3MvY|r|H#w*tLd8(0ZX%=^VV73&F&+Bpl}pb#YWDipgV$bdwoHV;a^Ykqby@v=59;CRd3O z4R<|l=`h-^Ej-HmrNDLbUwscM1iX3e1!4=7bAndLUrS8!${O1}tw3u_g}()~pGJI+ z=~Im=xag9r*%LlHEM$CUyW8xl@-_*4rqaTJBShHgQ3#KIO^f8!o z$h*U8S9%R0-WAAHMkr%SHu+L>($i;BNCGHNsB|1JGD)zu0nM5chC_i&q588whN}Bk zQcLy~GtEu$V*LU*JK;EHNp0Nks?_n0yR`b{grr{ojo$)Z9&SB3M@{gRkOZ*9HpqH3 zwA@;EUf+F~uNk$g)ig5yXsD%KEAFGBH1*X&A4A>lUDe!=*1zpZ$H)C4gXMe`bBCw~ zP4n0yZd=!lN1;Z7Fy^0PXqv?SDEK#t-evIs()*NI-M_h+O5uq^Tx&oh+yc4QQ>jG~ z@IP5#h%a?Hy3$$gAdNI}Q{2STF0GXJNjbFHS6_{Tn1_}tk6Dd3WH%$(D+zX}ZFBxA z?2*@c2_1qK^g!psa+r<*Gb=zEO^E8;)AZM;=Ca_qxBp_yo7bjB7OF|cSBMUBQV=)( zF_bwQ;fOcNy>BEZbhsT&$W>X{$Zb(uxiDNx-sO;PMIR!8N!T9ex$XC3IT%@|Gm#0F z7!G>Esn+*1RmGO!M8F;VR{om}Cm$N?SD-iMhS_Il6iH@(r-SID~xnus>TT_VYi=@aN{>5hh{_nARK?$%7~#VFTuR(Za*s?r0oS67nV zD%UPDWA|a;D#cGvmlanVA4y`15;=9&*}|SH#&8OS>aATH-BL@!Ip&8~SogL;&L5?` zc#h*#D82yos^3ulQuuRA2aW-UbdeHk zC(G9+(YN#!U%e1uMGX(Ye~pgg-@8Upps zbw8@Ws6QYJ@P?H>q10@ovgUN8sg4yD@*i>5>JrH(##r3c-Thz9dJ`Y{lPo4Z3CJ)s z9JO$2#RUSn;AEPtS1|YhwYA&gnKd&AcN7>wqJL*;#Yq5lJ3fB1HwG_=gY7_ul>9SF z1;z4bT@C9OuO!+(L>Ld4e$XR7n;Q4MJ#WegQ7vEOs4GtoEFEN#HHRC;M>U)XAIkC& zlH@?7k6@v$u^s|m!9ER7ZJ*iji5DE0SL1v4YTt}GEQ`9YPYAHBf-faUhAeLla%~Kc zX)ZB&cqmXQ%51UUo7JiHvU`Qr14TjJqeSSpX=tULbv(&S3Y=t!){)xQm7&E3Mw+42 z!vOA>s)16K@8`;q@QPSi$ob(J@UN0w5TUC0%VIZ71W*7iV4+!yRnTfgq0wC|J=)0~ z!|Nm#={cZl&OQ6!9>Sxr*}~c6!ZYgrh61+pt+u_UwtJ~B*f;<(S%fJ{_<4i6dAU!r z4-zF7b%pZJFFCuC*|A>76W)FKjtc#1N}g|~75D3AjId!xTp*B1$&D-aD|*%{@95CG znU_QT+>XmCASu0itJm#`Qwx5{w2<45t0D5(*Ulk=c4pl5hBg9WQCUhXv`X6 z&;_BK?283YBKOO%PKkhEwz*8^P5<+1h+!UxE%fQGL+n{~zOtzeSZ6)!Rrt%6F_XQ4 zdn}3OGMxlXo9AcJ*2eBitt(OqguIjf-k7?Ye6x$?3JvpZg|e`k*TR$0Z!K$w*R$tgf$1DUhm-}GMLYSiyX%8$F z1%I`3K30@2UCXqzyDO-V^01i8WQ$|4qZiU<9_;aPh z1e-IOS7A$Ls>A`x%h|8t*8#{drjMT>r5iC#txabwy)~^KMq8|lmhaj3>{{gsKGuPF zKm+Zwk+xTIN&Rsr{v6$piEf0eTIgW+S!IrQ${B7Z^etA?tZfvG=IN* zxd>WVyW4(@D761vW-*_C4u{myNOn(SJH(pdd>y)U;o_8Q78o zJIhm|s@<+5Y3@EU1+Tq}_>ABpoV8Op$ZdZ2hPR*Jj%IMq?29Ymp`!MYBmWIj=FkoN zv`0buhXNbkD?kZT{=f`b0L;5I7lCS}{}%Hza&oTRle$(cB`FKr1#;}5Dc(ceH*imX zl7djK150P^Va#yqO1lR1y%L22k*7=_FW;&}oRkdiB^{4KUIwj;m%-3`Bc4F%{-rhl zP$j&Z>vf_t^!60~nV=gzV1xPHDfy3<>0c1JvE9z#wo{bGhfGsF{4teWtI%9pg|`vO z+SMJl>*Jr!2F5S%$>(#voly!Ek!JqZsx43oth6vFm6s9cgycOA7NX+>RnSvOyO-s${p*@v_v>8qJ=^Dg9L-MvQ^z zby58IlkeaQ{3e8>b!em{DTD?>Z!_^WY#8?3NFx0!WZD$9$s1@`wCKT)dUGFJh8XrO3ugAYw-l&6{j7E5L98EF09>K z8zJVW3SX`d)@B9f35mSYct*4F!=gNcf)W`fVHUFk+WmJSzGC6Ue?bi~q0sc^lzB4s zpLMKdKpQH5a&h{?K}|(^eVhimDexjjG*w~xJMZ+T)(pcK|96->QNaQV8sd2Ix*o$_ zeRq{6S2rbr`OM^h_*8h%z@G>bASAm3fIu9=&#tz$)?}wcLv|itcj{UH6{osQJ^*|n z&aA1GMb0qnPh8WTdylK;Zrp;Mr0^S?0gwppojPA*i0yFK7ZvrId*S(LVWkP0?s0@T z!M%WsaxQh=`ds&b*q00PA{Hq8y#lt0Bvi)&qKNpi{rl(+?07_9o8sMjZ!u!bxg^Cy ziBugD8y!7`UNrMR?P10uWqUM{o9>;huBPyu3IKV;azql> zo;Udf;SedR`ekkbn4e1m1x?U|;0_1o>Q*Wb)UZp*4OvGFoI!StzQC(_`Wti_bL#(a z4qENgd>)=(s~R6+eo+pe>##BH!nlSYD#D;%J!j!%tZ7~hB5py7&p~hJ`~L$%D9`=$ zO0*X+brfP zZo^K|54Ppmm$fZFto+QO;+(u2*{SAM?k0teH4CutIM!9NFH7Pe=Yjq$kOGG2sZxgo z;tUXfz?AjRw9*g9DRE4-imRVxVU}^TyuawZC;{o>J@4k$o%0XQa7TcJFEFBhV0I;~ zZqiN=O+roLmBXe50{l>Jf;@x%#UBrN#E>AtbMUVUz1G?rw=t$#i$%B8V}307 zWWr@cTL*+)S>KahyUD*plJ@(|eox*a;+f)f%v+9o(aUt{R6-X4dWDY{OPjc09+l7VDfre(!t z`oyMNG57*?@b>P~=-`MTabR!PwOik%Qqy|qZceVoOWlB4(peDS@j`na{7^zXJyx8Y z%M2(@`WX`za(-Iq{8YbmJk(rDoVuyN>ma}H{V(@pLx<|ao!n)?o?oG3e*cz=EsS1p zehR$ecW{xxw{sA)Xff={D3Q)6fyMRlJ*gxizUI6RixHOqmsfKOU#@bn!i4RJ4dX5g z(K9}g&%lC3!)IL)&Q0gHT;3r24He>58{v=8Ei{|@z<_>c2e&8Z{5FO!vVSW=5~vF) z>DBKTko!Rtp0^YPJ`>r7tyecsfA1j*7ALAAd85>4b%v#}sX&`pPhc1A2{6^_TJay=G{bR%g0vh~8%OZIAG<5OnzanDmqBhkuH`q{VXZb6joEz=DjQxYoKx zHhR1@7PLZTgq)lSJflgmff&T9o9oBZO|pm6`3V`4-nO(*($;}q#_++_(4?lOh3mKA zZYbmUvl_=Wvz2XU+U`pT_W=<5+bZEB?zURSmo)!;kN;)eGPuyJJBm(u=|7o{3r4?w zjTjvRBwkrl6A@-oesU;TmyJI#FN+dbO3Q3$i6pv4f^>q1p>!Rp!Kw{l5 zRMyh$-hprxMOIzDU8$hC!bdMZ%Q;9G|h`1H%)hC%Ub+&M?Wu|Z*B3{vJ@x> zCTaaoNcN)>e+O9Oa(>|dhfL6NSJZ|z5Xkh$_si)7H{<&QJG*vMUJo#5D?9Pbb27hz z8rbOU{vM%8Cr`z%BMaQ)?H$M?T$)i^YTJwkF*9U9j-S7Dk9o!)(>#k;1eC7Rib159 z%g`CaVsQZGe(GI;u|T}g6{>W5q@WgZQ0v}Aw6TK6sw?X8PHnVg5rJzxu_=~+dJ~)e_{7l1*+WqbozVc^PllRx3W^D z&b8Yo%yN;NmhPW@Ock_K+~AJ-s4L7S$^D_psO-Gm?vU85B}jPx4o`@b>0F#lyxVzT*92#lJ5+!unB7pY>174plsZ%LD%gkq#J<|qwn zJ80aW6Z?)*n0K3~hT7DBO{7QThtP*mp*xZ{p9YjyKGBIfl19x42nY-?`TU=Z`y~FV zdcp;j#r;p@pkj+2md_|qp^#l&FLi8XviVEol5G@jhX1e_R(p73pJ1n}b^+3LU|o@l zILUc_e*Rgzm(y9R75|iXP}n^b7Mf2XW!4R!b}3Nk(;pj#OR3-mHB4xS)kPXoJGI3P zs59<}+8uv%nmLOKZe798$*s$)-rspYCa?J*=AP1J@{6vzot5@zHJw5v&t^B)M)5%B zqbYy;_155tk-ZEFq(1?8za$kV_HSQ)AaW=3>i`@%`>5Uo;6x12cxzNjINT` zmGCyQ?vN`Is|nf&tFHmwoNXrW5D{j|XDR#qOpxz$9N<^K{^yYsPJDCZZ{-0Mb6J(z znZ^aTE)TSjC;(IH5B#GN!uig$+8njSC~`QKQi8R8M^Q<|88$M0WHr>k3TOuEl=<6hrPl- zG=5S2i(lQ-{r^lTSLTzM+1p>2q!phtYK2olMz#Lq*DYQCaK;Cy%?)EX2~W>Yma%rb#)dX4=8@uH3v|& zrb&^j$)q_AA*SCb$o8wk=Rd^d!O56KA95;*4JXo$CxY42pDZDt?7*Za1ca<0j{=Pv zqhG3hs=aDPYCN@n5T$0tqqUQ$rh9qu08Vvlt8Lru*7x6{X_-xGp6UO*x+D~Gaj>E2 zsN~LRt^1F&QBi4HHiD0jc^#n_i*M7$~lSoXX)?b8P zZD{8*q&&~| z2~4Pv`r8-}$**hdWHjcHPl$`_CdKmb$gb((X&i6X|7~~-F+WubH_AF7yj^C;X?uT5 z^Z~Nc)5lAP`>uzD7@{fMxHkcHAa9;mF>;n)^+y_XB+8U9J{x_jP-mry{uJ4CumNu@-jJC;UTx|>}@KtVu3I;EwhrIwKH z&LyO~S#tMT@c#au|I6hK^Eqc`&dfE}%%pO6R1iYt>3EnBV?w0)ZB@z1VVdQGn}&wS zdc38O>+ZQWpGoNUA;SqmXe`_aFuRvp*3Z18CDK<>Cc%?t!@kKgC{DR5XXD-FkG0z}(e@^?h5d6B-0*i5?3r-{Hh6`v_opD z%QY4aX#MGRx%3S_-cu0(iz|(1cTSu2a!lRFd?v4&3&9`4JR3!x+{5QrD|{1Nshnll zfg1U&P}Knc!`@BE*z5JUj+7I1AR_jdm!A$avMsMD|MnrTdUT&2l1kWB_us41BNSgk z?!?bVPZAciCzeC9`Rwifmj2M0W=y$teabb>SD$K?(kImDNZrR0^PRQhTn*Lx+%HDl zfLy?o;1LPWI0+s;VA$<>Tf)<8m3Lq*{|5noz)-3Hi-b#tn6~N5l z#e58mZgH;Z;$qn5ccIZr!zppR&gSWYL#Qjq$-D1Z`5P$-3$pF4tkf~nk{w=Czut~& zimrL}9`S07&_4tP{r7V{cwtvRnjZk-@95d1YkYV&2nfM!(sA#w2G&v8{y<4enB)2g zRB`O>T0~N^DbVnJ7+5(4Pks~Ui`F%c;G z6Ly#>eAEn~L=K*K#J&9b%TXi0;&>sovKZ~z!LF-GF_Pz>J>K)Bt5~OWISh|lQt7Tk zddYBj9PZqeQzmqap|6^cq%DIQYzS#-2^mleJ|S~L)zRKuS!4|aIYj32Y}^#j)k9#1 zjF&roaM>Jhnao#KG6K&@jpYvIB%qF_Aig*atIVA? z5kd2OrBcG^3EDe%TU;cA>weBj7Rim|bqFt{WPP}u>9e>riNt5r^0<%2l)ZI7XvI>= zF9OQ+1&zkJe^M3|xqi)C%o#P?6%LPqujpyyFLX2navf3rukxf9g%sALM)1uIvOv)) zL?{wnq43O@$I1o_g?4-E4c*v81O)I$SLTUGf8o(pj-M^Aouq27$KNfj`KDom+(@zu zl?XqhHo#ya029}9u7cFjN8El2d{vU>`_wtgfII*XqOZq6l-KgJklT<65Oe<%UYuL` zoY9pWwln$KQI98gW-lVDime$ptQ@~h#BiNpUdaTps&(5wPXX16t2?1+l1GBX%ttjI ztWH((p1}=wSH4&4RwT{knR85bAwrHsl(Q&hM#Ev4ox>X!nxXNik*m}%-$bk$ZG9uU z^3@(}9wS<-M)ZmQiUxA?1s}3nYqU&mOTb`=_SdctUBr0&V{{lM4KX-IZ4QA<#rI9g z;5K%1r+1_2=Z%NX(+drvkdxK;(`jp7!O;M5?hM>w z$4DObRU)3k|G=*&_XC7Dea37P@53P~)ZvDngkhBr<~HuRYY_7;q6x%zZ`|U_Fb0TO z%A|}1uhH=)ETqChlKJ_^(xqd@a%=Wbiz2*^Ct_~F=I1#tC^`XFrr@7#iWrLM`N81Z zpJ3e?;c4WgffYkew;J$DO*G%vZ9=9 zRbE;oVA(%?P(sabCTl?Ee_d|nd?=VQj$+=+m@rLTc|6x$Dn1WzGGm1Y9w148 z*)JcoQqqsRn4RLH8gkXgF z%3&>I^9(otXoU|~;bempct3|Ui{Q{R+f`_l^46bX+dEI~a7sQe-H1_cTp##6&mfBe6;i()ycsa<*f+$X}s4Gqpz zz3R3aAN`CAq{2Y4Zq@q&yqFnq@;X0jQRO+vo4*J9J_5e&Ds-}l#`t_iY-j7YxM65g zVVI}N4S-xaKn+Gf4Ga1{H{qoK%68AUZ=h1}X}DlnqvjcJM0@mR6rEf!B%^Ef8{g&m z#=tG`Y0>nP{7iaZLhlGES7X`H-#^a8?VJUiB(>cp;PeUYpl)tN%dP9#r+=}c2|F@Y z^vP2t-{(R)me?(%0 zg=B$1S#vh{zs)BIC~ALTfRzCsZ?&V?4HE8NVcy=v{18W8bdw^wb2L8nNjh$?`g(CCK=wC_DfH65eSTa5q}f z{lPj0hNu>|Wg1Pa);fS!gYGwGiMQMAxFEI=+d_<3jHK)>N!9iah9j@8xPybC1Fy}2 zt7$4^*wq*|>!Tt}&8;0?KW6up)++wuq%Zx@3;*xkUHUIOO7^n5P^X#a^F2|Dwwq%E80acs0dSSiLro*Vn2S&{)9-h3yQ!UB&0On!fMt?ocxtDM?` z`@G`-;PS+>QIY~t)PBl{ZIKHPU$GR&>GF5wqe~9Roidmn+J1A#n%0cKm>ZrpIw3EVl{&qqB=VLN7#LCP{lOhK`g!KdjZ&13rVr zK;M4`S7BC)3UV&q(6t%H`es7LrFY$-9-LC=L@{*r#$FW08va;I_wRch=+#~o3^pn= zGWK!Bjcj%VjUaEGw*#!^iL#vndcQ$RyTz#nSXwNAXO3ZkQHg4psUtgc>uTU-Gbh(FhG#ha_`Un8GdT%NriAoRExRIY<}avQ ztgy<)+tBMIv@!IN!_1&rRVW@I01hkwI+D8gm3Sl>ag80hCHZ21U_2C2$#$(k_HxE3 z=tvvXXtPZkPJ3-WKJim$33)2k(_G$1P19bm}D{gL-bekT&{% zDc7fa4J0&`Y6w8yAWLkk_nmAL`sejF+nbI`4)^(VYS&RXzyP3Cv8{no;?qfEs;f&3 zY;|nrt^F~uX3+Dv#H1M8X`Yn;UY9H|vTGQBqYD1KrWD75Dj(ije?bpK5S&a91~MJH zJemb*!xMeBq&pESP9SeefvoYS`lA^K>w9%LXYRGOrRrMdsu#=wzRHzC9#eFELwfZRUj~Z)&0^LZ_FmO!t$0 zoquQ!eb@Y;(AnJQ^7LZz6|2N*=}&et8_N0lIlrPtw2Dq_J+ALhCRCg*w`jxm%!SZj zvyB!iTcWCyfvr6P9?!aU+i;&NSD$1atRdlnCsOS3iN2$pCnb?{h;G+0+IOst<90*Y z>r23{kgBrj3yw};0!}1>E(iiUiwtt!pWf~Fmh5N=IhH;KOAGhE!ti^Tiav9opv->nc% zrbH*)SXLMBeW=ZE<}56*H7ZRrx;cWgbD&6o`N_vo9U2}KD)}UE85yPC7n&8(kvzmV zFuZS-^YbAyjkoRoQyRxx8z7O)F^FAdb^dO#>%B-lby}m#-G^Nj$WW4dDOV_KUK`C@ zP?09bcn>V18Zl9q-Yv3x4VUh=dAbVv5={4y)OJTAoGeDql;x+;Wc5>fcj8!|e%;^ubGPVWDRZA&zR;TL}k++`v%6nOsecdCj0-J z1(4%In)~8c-spwb`?|>H$CSbBU9_tZ zfh&lgYc;C~yPl+pgzk1ZvurZV=e;0jgK!P`>);JZy8yk;e$_+U&XGgqo+=4C{F?UUjRZ*_;0=1R+@D(&V#9`o%xPESuq@+WhbC5(o+Nf@)*dV`)sGO z)OlW9Rt3v-!cAubK)0Q3cxM4Um|vnmBAYnG+!FPwcWN4^kc`(k7&#R%HZ1SDp|s>; z>kU)?DC$MTpZ)8`=|OT%-4$^b z4%nipUg(}l!x9Uw9kHSifOZz!V^d)0cnlF)5!Dy&)#23EkymmJF0>XycDaq*!gB^y zHEIWS?GNheoS<{*nRTevkt}tJrhM}uO~@U6E03j~xhBPZC820Us}=zOBji`e=1p1m zyGF5vRnbO%tV$Z(4r2txw13>9>i&&*dl!z@`oT;d?EFr6FgDemI;Le0-|L!HEe%;o z8i4c8tU|f!$cn#oU}+1G&q|%Abkekq!=-|}4%;AiV}hz&!G%NUV^oa)`=+FOXUlJD zmO^)bg9=jOC|%zq=2htmdXH+qpW1N5*8{nD^OLJ_Ix3CIr=d;-uN~T^SGRAso*?rK24tLAeqU6DP*Dax zJgqJsm=eB3R?$`N{cbiPm0W`TDIB!LzP+x2^s^nxxC_&=rX2%J{rcZX zd-G`&K6im1!?GCFT{C5I)a%fswp&FYG}fq;PvqBh!JA#+*qk5g{AF3E)|Jk>fLN$^ zeWE64a=Bvk148}u_0?k{7m8T72=sVFASS}Gh;jNuhTqfOuz!#1e{v6Qe7~tqorSg>I+-k7bkVT`GQ~QUN{~B7d4%0lrj;p4nss z-Y)YE2jv#%DVa6VTub-EpT;kdM8nAxAI(A-msI}R+6gWA)5td)56fo8=-zoW2X3p( z?>9M$4%QOTop>si;@8tfzjy^S1)Uw%IooJ@pgzf~$h^b$?A89w&da6dulhkC*!DPv_@y%b ziRQp!?{wr001Tcz7`nJ{YKMj&&!Tc<0W6|qI6T5l zBbvCEPh=*w*q9?LzuRS4i>seOrs*9@v7c4#3~m$GYBdfdiDc%7mEWK-OowBckZlpv zKMr5!POKVs$-S9r@#PIT-OTCuT=xB6uF@imOw9wFwX2^!d{Yl0ML4eO~aKpo|W71W;=MEYqZ8C}s7_RKdbF=?ZPHI42|rhiE06h&tM49#djU1GJ}C z@ywG5JTVEFoZ^VE#?T6zQe!!+C3m|;qp{5FQZ<}^w=);$d#^EC*F6DMLsc>!}O z;d=RHC{q$)Q0lr#!w@G0}N*|}N>>H<+7;xNXn^RzUhS4o*?rPZ5zaJ)5>JsHX9}>9I$|1r% zxyZgJ9#T3p;}bhDm~J57A=Q6;X?GSadtGn0V`=#sjva_fYdrOQ!$)CNoe*5Sk$mM- z$P>x4aYIPKOW$H@(fkJOO8C!4MqJ(h^ROxC-F;KTa|!Q3G#jm=?cpb>XGV{+v8$Gr`;+>^K z!%b$_-O)=x51O-US-0p|SI9u4_gA(f*Mu`?C#Q1B>VXn^xe^f)_uNRNL%Rnh5>=6v zHWM*7v8NCE6;GhPH^qGy14pU-bFnX)qgbc%4BJsdih0P&l?$kmggae&*Hgoz4P6X_ zi_1iQgyM6Z;rC~=o6E=oe!YGB?JA##vm1Q%Hfrtprw)M%4#jpXz69IWckE?K-JUN1 z0>Vcn^WCeo`%h;Mw_Nmj(#lrt(YqF@xd^9J>=BekS+5Hg6tYLtn-4Zhx$yLq5=ikR zPhmxx<%X)8wAMaVRwh^hYQVuw<*bZ?L~^yd7l(`Q78+BdX6B|o{a^wAoA`vO%z?BS z<(DkpKVs9aN;T%AEO@F9>U!Kw$v=YWs)utJxr&2J-_qh@T^ysL79c>`tWX7Nn z;YE0O=f&CHu!u7pJv#$?!NX9K18t}wyHda|<;p@Q*R+hQbXOpl)WLw@`~SX*@BXWf z{*F)Fe-#BPhA4Cng^x}FWKTlbMeJ1Llx*aaKU)#Sk>m<(Jq}3K(-B+uS;>177{pE^ zG1>Ko>fBGGKXdN$>?hwhXj72MFv@NIM~=RK5;E6OmTA_oeZsEdCAO<^J~K<9if9UP z$d*4o0c4QI?Y5uTIMN&^)bhfLAGI_*KN3WKli40BcmZ;OvR81Dvzn>x3(Re-?D299 z6cY@`C>@fqd4KF^E#l0aTp00zvT`7c;Hy`pWi|Kua=!%q&fy_T?dCJY4R(z1Jv@)h zb6PD48F0b92F@w>6IGCYq7~(6a?igxW6!%0__DA~cR*3eCu8;Tcn19?s$-XijlWl2X40=^R=M3e+fMjhZ%9!ot@P9k! ztsr7sQ?LB^S2Fv0*HywV#WIH$qFa|gSEIGR%_&)#KDE?nQs9&l{n?lk__{-4AF34B zy!2-!#1yAdyzVG)sWnfs{8laUR&y#=^&dqz;Jy>`s1(bX@WJHdh%d{IoWkNt@E%h; zc&=9M$sZ!ul_s z)k2~;1Ha-$TWpELSp5c9aUDO#emlv<)69qJ zr{ggtNvClo>9xwH^Yk2&$aD;KnSgGP*$)o#n7B1xQ^oQf8~nx7s2j_MsjS;s zT;bl|d*Qzr&EV@IqXU3y3DOq0&9F&Q8zF}a4`&}%>2alW08%lOGMnLuiv zfG=J6Xw9F-kT$l@kpX#=w(Q}L3P`UpWeC(80cLm4Ha=-ve&mA$>0WO$6I00F_M#od z{zRx0_}404E9Hp4U_b-3Qx&eLTbc9;NE?H+t_@w z2rYzGY%W(Z?F7y3moIcl9(hb;{^t@1g3IrVu+uIh_z&m*`57Rp9)#t*c$+AnbhY^R zDl_-Afag(rr9l{>hx#k0{=O%%!dqZ&;!g?d>$W9VQ^7f+SJdKd` zcO7uyZ&&5>gMs6{e6D78?MO;EackY9E2^IB=`M)fvyl7|PlPBsqEZ4XcL&m={HUgmBPK?BP|0^>Slh8fyV35qwdw+T?OQL`@ji7H_MyVH)l$}@*f z_K!|z9SqCt8KtvCK5L)itieCLlK$To~_QEa63A)y9+~c5^l-FdGQ0wg0 zxIf2T9LuOcJnQ+$P(kV9Y^5Xo?rOXM7Em|(2B3vC&#w|^IQP~33GEh#wm=-k@*k+W z(8?ha`b+)wenT1`BS4cA!AfvpI6G(5P*)3gS?!C*H*j}9Y~fA2XdJLj3;hd{SKPN% za(C+b-S$_9dA0laD|efCU6jSw)%_b@lzoMJ>?ny1DRENadVcQ%C8Ficvf&$<4Ci=X zuEf3NwatyM9rz69eRV_PLEJ}82F41okI$(xifb;hJeXjv)zHO@zE*?!ndd4fgn$D+ zakzYRSnNGhei+uRE zytU@5vtBzHqJ99gS%%R8VpBY;u3WXMoUf=@($4Vt??Na9+<4SMKa}_?@F-ZAXdTEM z*Izba)>j1N+O;YO){^|M03%OK6}<-dHu4e18#5Kr}}%{ajlaK^_x6Y? zfCzAlw|qu+@9@Exd~YZL9^^B*-pxp9((VJXG7 z^Ow&3_S;1_h=WnrioUe+SuB46KMF69qu3}YYqI-64Mf{VL*uq>p@&aju<9++{JC~mZaztWX<1fvwXQzAdu(G-xt<7axA9tbH zeVK%k#UqL)(Ic|&w#&f1KX&lOZY9XAmDS+R1mfun0XXYvMmF%FceRE5J|E##t|q?! z7PEJlUu4e>4Gj&}4nMz}4Yao0Jgq*oVV~%Yw`+6)`+ zi)0D5+U+a(=D)Xa%%rgaVR#oKvw*q1AJXV7DPZ`MFM@&|2a@#OgWzaMcz=Y%Jam4( z9=3eZ?O!mI_IvNKmfphLZ44)wk%E@^Tld}tu5Y$2zp#_R=S2}tYZ{2vQXMbqJj7hv zo2By4Ep@gh_x>grqI}QIO(xubm_CUN2{CyqRdSy$32^{7FFdSL2K%Fl2j-)(4Hqwz zO$Il^e5J!iN%tDVxw-#(2o)7QUn=G&zY!RJpJMw2GX!H6(4#mF1XyM(|Gj(d4vzry ztKNm<0}zh|RXUkoBl?+!$2C&A0&`LRWOOS}d#2Xvq`Kb@NeJG)m=Mx8S@R|F#t4fz z=yrv@Au5Hp3@D~wAOa>3Sz#e9cBcFVAF`6m%Xx9-Ll%2rDWO*L&tHq6<%&LA z_rrQRh=Y6`k>|5Oj(0x5-Q2jJWf8*QGg&H>4b|%?6jsjbdm3RPX-(q#t^l_ zAkq1GsPt4TTIuVS-T++^E3xt<=&$4zsj#6ij8-8ICR9Ehs;-&0FF$FwwD#xA5(alD zF1MbBHqtLW3YPr(UU{60y6p(rQ13%J{In`Uv>T6%tJv2-akLAD14LyOcz;A%Z510G z!J9yjfKMl^L)(<~Dz+WcH@n+DXMkc%{xxR<2q}=j6#$C)?;eg+Q0MsQu`gD9X@J_b z*P3J@rsQEd#mbvCilmWw0uF8IwN_Qr3^oZs)iO`CgkO%<%{OT4rZb*Kli(hp7Mn(Q z)!^?RS{ckZ^vH>65nbqnBffkV&vAP0^un+>p(PCK`0}%JwiC_Ncrdyj3L!eq>3&d8 zo2BagA-NEYD!Cu8Nuv}C9W5U#9jsj~N18Z)OhJ5m0gtpnKZkwBL0~nc+ZO%P@pvRw z4cB!$6MZ=GW9B1nS;kqQ3_jonB2E`mEHdi_O@^E{{lu=-!p2E3l(Wv@8(36WvN?4f znDX+{hnOrKL~LJW71j^=cyV`l{CLEmep9mh_`7ew)#$*dR(h;2lklghKZ?y5uFK^R zU(s4ME{8eUEs{4msr&0%_Fx^Uhe1b@nHSJ&Nz8(~hILi$ET9(WFm}$sYLvztMDM#e zB&z+TKA1cdIFbFp#C$E6eg+y;qTihU<)J*s)}*2e(r7 zCXR;qupGDn#5?lh6%%S~HccrGMll2wuxSdiF>t`T(QJfRcz{N<9|Y%(LrQJJ;wVOb z?+%x3iF_8{#*AgpSiWiLwIoXT-CNoI?zhlO^GD>ngP|f+j+BF~+qbeJwmq9U8Z2>1<=Zm; zj>a`pt6t$j(|;Y#7g@==yNd{J+3+`Ba-JGc^a-=a9Ip&y;h0x%V4?y76cc6RxKGLJ z$ID|FQH)_RxM*;0k@~NvrW}9Z{SNkgbIq=sQ{6HArCq6qchgGyQwuRTRd+$`A%djD zILrt(svg(~sY_l_7(QpRWNVAqon)t1)@X3ze|QYC9TapQguzQ})&2=RBP)^F%OK87#tDL@-`&Jv7%#p~D$b))GgN zit*slkMsz?CKPCYD`if2xj$1Yyeo3>W&d(@al;Du!mPiz6?Qs%6^+xBV&Lm0Oow-) zkOM8@@_CZ=VZ&ahlw;#!6ODfPY<~gOBM$q!oj%GL zMZoxLX3@v509!K%`^7}GMmL1**`+XnPndeKY4*({s!M5!9IhPHFi^@zwQ<|ao|4M_ z?QOyIpUI)#DWz5PB0-z9(~egLToszW24o$R60;58-uQz)-3UuYX#So!gn6DJ%tmBr zzh?bcpS)bWPiFmdvT6TeZ|A1}fe_(smzLO(RQ$W9tMTPc5VV4M43WS8R6h|c~SthjVPyuC%3WA35A%6E)j?VA&Y z*StNkPAI(2?X)J$5nrujr@S6&t2ZKE#|3&bGl^5IJS1m9e6yno=G%3C^QN@M0^1UW zPggK>pLzj&nkAzL$Z7pX_?vDT&CDBF$o@n)vV@cF#b1l~b}d!r+^-cY&m= z!44M#Tnre~{_1q0ZUcLXc<@aA1h2Vae!Bc(ohI<;tr&dD7qZ-ULa?@K) zd6;CHxGQsJ`pbg3@pkW!27AMH9;MEc*gCFaFURXOLvuQO2BIVorFY%5_qfo32iXW& zl>gQf@Zwf{G3C}L_B~b#Q6{&bj|W%{6E^4`7ZF%iN+JLcU+hH1C}eO$$<6B9lx&rQ z-Z)i{NtOf@?^Om338m-vIu@`(a(w-DuvFmv zTo&>4tCr0gJ>=%E33>b07ajmA<{iLC#~56Yqu5hZs_=P_fDZV+nh_c9zluP;aDY^Fz~%wwcc-kD=6@>4!N>@z?3w zz3q;IOtG3@$K`^L&&WUgA4Wia-*{qWd@yCLK=Q}+ z+~C+1!C!Tg8Yv=9ge zG+SrHGSKb`c@b)}Q|sY^s*c)fZs69C0FjbPgzr|96944N*VK%+%I}jnbPEAdwq?m{ z4k(xMgB-0dZq-QL7h@P%o>X_RMUeFJ_o{xw%_LLs&f~~_I+WMwxU7Cj_x}R}s1MD! z?YXiKkqb)_*h!=I`JBIBx$?A+#Rlzk`ET5LP43dr{O_cEa(12)3b3B^xkbF4;R$ zVxIft(j;j=)C*cxx9c7mJ>R0s4=dXAHtIpE6r!|}6WuX~h0D#|;JgA;1HU<&_ca_K z8fhHm!HeP9)1j486LoavooJKPvu@pZE3Pcm}tru!_e; z+#~cM4h>z^kmEV#?l=c)^HJBdW{{~V$b&jF(x=l`gN*gJx+8Hs8XG0}6IBMu8j86V zEiH~mUYxAd{3hnD9_DSw?Q}Emw~NdTAX)zCQ4o-f9@n4RP^006|J7fN%{#Ll+^$mk z&~I)GF}(px)?{@>ZCP9Lz00o2tn{TNlJ&tMI}M<~;W#t^f$f9geQJ$lMnZMu{c+I` zvL|Vy&grxJH@}wW1+vHa>N1maFwcbw&1pt7*y+FUeqZ3gGgso)&$Vu_Vsr?h4ci_O zUXM02!Hos9EaMPrHjPE>90Al>!1;=+E`%dM#Ohy=dkH+ekCfRe)@IwJ4pQd<+X!!n z$~>MDm-H=OlsK03Ydf3l!x_q>#Qw`9hv=sf<+*yJ!vy==wlTQE*D$$XNqR@=V0lYl z)|p?7EL!Gz+@mp61xdg-xSflqsT#TRak_sh|^L@Ic z<6X`!eVR7kU9rUQyWBfigv9J%?2qWbHs#G1-s6MUw~vIkjLz)^S*@&||G;Zir&52d zF(s&d$rs@-+z6e#nSmhogfL(YaFcDJZIFpBNc5fkV!f8DtX@f91lO!W_KG4A{!|qcm4`LjVsf+J zU?mj-t--j({C5-{IZri@hk|mG)<(11-=l3_jF9t~%vZi1!Z;mtS+97n<+1tOyeU=E z@4e%Z?0w!!AHhYN_~0x>(OXD=EX=)|OSeyl9d8w5Y-Gxc)>EN`Tcx{6W2J(n~hA?Ul zzm6Rvemw)=!YwoMdy(r7>b|$3El;No>Yh%>If?2it*5-ZCm9Sp7zSJJTSQ=zT<&RV3BH4z|f+UF_7HUsj<{ioofHgE!VVf0J< zG!`vWX^u*yRg4LGmDL`E-)m{RGvDlC^_Jy78To+sFfede zrRqVkkpD#S<_+#kD{8x|LL8_m1z@xejRxW>@dApKpHV3m4^w5iZ2 zB{-fLmb5)6I&`*PGz8-@68RaCZDe3#GH3aspC_#`nhF3x>FA$+EXl>^81VBKy_wsu zu>n&o6z%J0+nK2WC7BF)TvkAweu2Y$h5GNEqruWk@80m0CkZ=88kq4#lFDh4$j$YS z9o*SgAKx_BAP$MGDruENa1eTx2_Bk^_u{VIlfc%>UJj-`=!5_!4U;OqYbC3UHhvOS zX*{q-pRy&ghwTp_-R?k$r~XX_mb)uScP~o=np2jJpGjX|ysxNfa!IrRSW&6$*>(!& zIG7l)4(LG#ql;UiHhqatJ9A&=ksXwDlGbATTnz%sTuMSCR!7qp7dJG?_O%OCxid(j z1Etwl-|K#2se4q#{k>A^s=QDW6M;)Fn|j=T?s$<^Q+{1e3&2?VrogIv`p|5PEKJ|e z<>o~ZNdIszxD>iR`s4ZdC-nVI{?w?T@rnRdK5G@q{QY^=yD!1&p!MIfRu>0+7qi5B zk{odXtitWIPL0paMR=6iy5oMg3Jc3n`|J`m*j1UkmpbUJ9E45RyN57M@T_2|^wN&HR zdL&$9`-ltlXgxxc3}|87p@|I!RC~^w9f+xYMk%gSj1f4+V>|58XGK+2u0KPv6 z_iylIBdA&dG|>m@5#?9Gd#WfEdMr6mY56?*O~1yBsc0P^w9#eT#s-J*HfPoIl}qyl zW%thzULtL6fugk|>2C*tB%M&TsTYzEyW-}k(N9s0mdav=DfeS&kQdPua6cF5Bzc_j zA^C`VEA?*74kAhRiaNcaHMPCZ#Qk-$zp52g)4OKr_OWUQ^k|r=T83Zq=x$jcCg%>m zT^}7usHni8@-Cp-3^89}C;COevEjY2)X#Ikgoq%u?_4ex-)Go#WNOs~=nItb+I5dn zn)r!UD;fdAQf>?hJl+I!gOYtionYlsw|L8XmRryG`t_=t+`|T;(+P zK^YGSZus=Wa66AbP4;+aWTU>=J#F(|mx3YD_t2P_Nwx65zufMlo2mcuX;QeV;E=E5 zn38y^;~=AU=aInv8nNH%wP&A(HShXv^(?RWu85>qEh9iwUtgrEThv}UEIqlltm{o5 z7>Gq1AKICJ4j4&>j!0%5q#!5%Qe%DbWIijkY%iOpB)MUX^Px6jA!RwX-QT`j;>B-o zf=x9_ird`?g1Sqm#6L{tbB_Of78y#}Tga!u!QkWD$o3bx9W>~cy=;TOHlzn3DBQ8+ z6LrS_Pq~o8AD$sA2e(nnTNeKrNHZ4A+IM@5R-cb6eh{kTVXO5^tEYnFJ5t=uuI-+? zWvfpsdH2KC!;poR-;p5|1-J!y&CTm?KPjaWaZd)Gp;Z{yb%@sGX|pt-Cgp!PE*}Of z?*AeN3!q$>kFT0a1B6HF=a~)|eE?b41%V3csoxbh$8@&Q1EsNuz;WF|H)Zx0J-cs(J6_;aXZGdRb=_Bu=>=l&b zTroA>!-p6TXj|JP2|NuY)}j zF_eMiH-UX?32~bT%2rcDvtGNUp?3Ca$3uNnCzWL8hTiEZF6r$dieb4lf#*9=ob?o<^G% zA1vKq9>*CHbsB&7rYl>3u5)EEM+3HjBt=|$1P0366j_4cf6fg5cj&yC_h|epcd-W& z2N?7Ao7AIK(_NG-qm=a)&M6MkQaz3XM*oIReTJewYt6X=F7vy9pyPsonM1g_z5OoP z#S(F_1~X7dN4L^ECkL?EPTB3^DK!1smYf|0BthEDh`J;VfIUf*Gk8H%7tM}N{z?eZ z!9-OWmIJ>NQlf|5*f%!b6-<+pkqteH3ZNH1;%dOxrc8^sT8_^%(C!oX=wjn& zbNzC?k#DqC-{LCLN55iatkkeMbiAOB)PBmmy~eElxk||V>V;z=y4hE&94@dza~^!G z$viWr23~y}gKG}jx_fpKQvw3wWxLd$EiXnjHZM+%<=G!jE*S@`vbJaVK?HWm3GPhU zl-MhUVxxOB=03`!kVdyxaA0`Ru~@d9Zy?@^CjY}v$z z$gar`yKh{`NujF_d&eD2Zh4{zEL2iOxXRhLiDQs4FC*y= zJPyhfO~>48=KLP-Io!deuZDVBJ;H7BSE^&1!-77gQiKT4x@{iUb!OkYQ(*gNA?ERpZdJ&~T%6tw~HPtipfDq4n!nu2J;e~MBpdQ%Nv2@Z;ZpkC;^7ta!y zeiAT>j5}m%$J2Ny#?%BtPRrFYB!KfkQ|q=)zbt)GM_nAngM3v~zHSwi?u~ROT<`*b z?J-?iOa^N*_<~@YhLAV{VZbY+lgIVOjtIIiYi!69@is%h-m7f!eOeps>6Dp%J@8wl z0n|JJ{5DIcuZT-`6y*p~%5`^=SPPvJBlFAAj#FqUwLQ3ZeZjK#2~&7L@YczLVfZP$U`7P10EP}A12J|_wuA-Ae z&0A^MQ9stz!|fEgZK<9NGOLE%uPbNq7i-yigb=j&u8{(_QaU*^t*>QaC_dGT-Jmph|1d*AEGWv(k+_U>@ViYgxZR+>UR zhan2(|6pol?D+mZp`PTF+WapiK|>ub*xF^=xp1j)#~z&xs}Rd;qtZj}_*+3upRRt? zEoe%4WfXf+ZnpHQc9enk{FKA={e-pRv>-X7-(}TWZBADuut;CMaz^ zut~hiPBNTsq*5LO{r20DpIK6SB|~9PXgE0v4I8}WSiCm04QRh~xcPPu1W%ePw-6qw zqI~}gv--=QKb-85Y{RkKx$yGW$R>Z^PY5GxJq$r zF$HWGk^caqi4@&8@@eZum!;mjPM0Pu8VU_rW%uu-A^u)nPVG*qa*mMKbr*4(Zs?Uz z_D|)a1HYb$C+yC6W6gKn`*^KQ9%uILDTfZ*W!}axf`ljzKy+cbjJ}b4FS{nTJ~96p zG&l8bJApuq`SlIpq66WYl4lQvZ`_p*8hTSL0==%%Ga(ySRfm|xLFtB3ae0<6D$#P8 zD@!zwwUT2FBm=LPQKEC^)#F}{35%U3m;pqNAfR-EAf3`Zgn-iBjWk2UP&4x% z!E=7!&38F-v)6w2v(~fvb)R)wMqJ4{*5u`q4DfO2q&!RE< zhp3F}e|1Tr@ju61kQl}p_2;<%l=V!t#OE(7Bkl#&l^aykXp!Z;t)nthEuYC)+nU{L zX4&A#hhL>SA;)SpeI&LJ$BR2VCJ)aS@=LVM1a?{;ujWl)d^wNYbNUUEe5&wa4s-rp zeESjoq){<~w>!7!$vC3iT-RNa>MRj;;nRSyfQH?mLFxSig0a)`S!IHhFV?WPdD41J zO}e9yFU--B%A;>&kq}*&BpR7b_}!^G)BGvO3za+>xZP;yJdb-{=RK=L5dQ|Fi&xoX zTGNhSys0n~^(UU!*0~Y(;9^vB9nVM4U1^_opEUwxXR4qR=c|>4^X9C3Eo~w|DSA^A zb0R6YA^v(~6NGw=%CY&#|23?hG`--`)O6&*XmvHi6CPw}QE$yNLQqx1)o;gXV})`9 zpS9O+zWWEfx~)TTK6xEw#8D=}>>ECBgr3h>qwd$DpTD}$=sVE{sE7gxN0H3oj7kZ2 zzCe@!$`_!4p5+wZg-3WnG^7L9aO}Qda#-F51tr1L^r6wk8sIB+kcCj0zNo1X#Z_Zf zim8#DxweGq-i9;ZEdFl#WX8|El$EwT(gghLrI%d-h!7hc)&;H4JZMo1>F*gQuoEwVORr;CZ}QI@_DgL3gL@ zX#KHeCAGp?xt=n9hI@c?!8%8(W8mgq&A`?+KVZ0KHcxTJS@T@LPHW6P!2JO?@$v-! z${}DY*qQc?}n$E(9!XeJ)ATR|QsGWCYwl~+~$xX;3vo$Hq@N(!cR<>}r^o0J-bfL<= zm}ojD7P#$SZUnRD`;@g8)p}*88KS@3RwjON$s%EwYJiPYiVC8}AV8XoY}!;lkVS1tYacXAK5IG~{OD=ryYGwY zCoNm^Fse&W5OgHYI<98HE|#l4nJIu=rl$8Gp>+!*V_`1+?o7SyLWEg_8~?r__v1hN zgkMsmtx1XYk^*uFsAZA*7Iqo zR$P`p2H^tN65yre--gu{=0AoKBI6$Vuc4HZHSicWB6#?U5wIK2*4oZ?K*~4}1ss@B z|46t~rxf8gmZr~(1KRu~8eMVl%DyQC8W`>MiKB156}J??)DL#EZf>{AiYwb?Vg?A& zUItA=lmSv6VP(hQ-VpVI>!EX*mHpnujZQy`lSoUyBY0cp$QLAg{3D>H&w3@B`5{hw zWSscm$;yCVU7!~R_r9q@=8F*+!z09y$?$ClC#pCl{>Ll!wUc>!cW0F*`VwFBr^R#a zazz=)_j%!G$W2KS<+Y+Ufz(6wQBeVzhD_mHw+h?xQ*kHYeATY(JaPs+_^MD=?e(;;joAF+0LkRy1KyF>`rOt?b)-;lCOv+@6)aB zoDplUArC{F@m<2YQYlvaKtOfatM+ zj8bI!Y$!^5jvRxRrUJY+`0Dg1>$OCCLM8heLhgUYF=UEOA93F8E7ll+R)`P*Jg%q~$cgo)pO1t3f7Fk^-c|murtJ*;!$ms4r%JckckVBk)j<;bJ*~_Tof@y{ zmMj5}Y+y*<I8NBKoJHy|fGQSFH<*ZrQ92YNy=*+|(n!mQ%IQyd3!D10oD zl0k1v!>IO{L@@bxp70sV41#^D?*-HbjaYVu&I=~9Cn0UzH>jnWc-odKUa{#!&q<*G zoZOQ0(Pzi~cyxfCu!mWuuPlaXyhcM41Eofjp%+{t95?ez4&_BV**#u zMD#uB^Q(+em^N(z&S+Ng3raRQA2G`dAKaH=9Kye;Rm9h_4B?@-?=Y^=`(=<1e`V#m z)bJiv2fQuOp)B{G^{zCjx!*qC;)N-(ZIG~!`?|*Y@JH-rxSAcZejlqwcW8YqVV#FD zG75JE)aL{Vc=!F>+A^=QwoZ0rt*6fSg&k@xxB$IEzKQ3(UB{=_7smOY*)5(3m9RPJ z?UcES3@WY-KbRi65ma)t=^+q7tYej2KI!wdA>m4t*3J;|`)-!nE$lc|uGQPP=j)KK ziApV;{<{m{5pQgT>SYC21fsK&X7TgPei%<*;`6Sw(NrpvWyPJ5lh zl|8a}kFsdYCf&bfLHH!<*Y4EXe2N;mmu*mwJ*P#&xj?q_HIbIqjd4qhD1`35Ov{M% z>q4aQnxf>LMz^^IE z)(rRL)3QGrQ;vmjvhvwtM{R0YXBqi;U6RH176!fZ!#?Y$8aTWk-A{FGDF!WNmQ2?7SMG!uEaO7qFmcoaB`9^Z)}XYb{6``kr#$(FRw5?AB^2L z-r-t-T*1h4d4sdXFQe2Q=!@aX-_1&`-rEd3t^kg{V2uq-+5a$B8qw--t+X<}$&oMo z_K}eSmzCPH8Pu3o@$bWKlM1-0lM_^c276m@!|OBNi@{7M@K^f3U1D1#sD(#4O`h)S zf2Cf)42MG3?JX{irXCn^+V|CQWc z4(tn2+J0OBba#Kmx*`8InI7>BjLV8@s6eX1soz>B4ciW{-yc4H1(!|eNtL52lQne` zr7yXk3bm_BnDU+S)SFrXB*~s(lxzO#ee!Y^xk2w)D}j*qg0C>A&dtHb_-IYPWO|*_ z2mxBJIdlFjXGO)}C_;Vl=XNhl%1F+?ZJ@2OZ728Ui2d$|a${Du=hKP`tz4bWgbM>d zxhCYsbJ!oev)k$Crh&!{Fj4;&o|7k`(A5^h%7Iuo53(<4&;_79#>9~Y7e>BH${d>e zXUT{5bc09+aDm$LW4(?1P7h9$XY~29A39=^^D~AvnHfvlR$F_=K6hT2wbWOa>OzpH zQAYbY=@Wgyq?0<#M9+7$^j!4J}DN`zb6LEFXR_=_4Ib+bmz9+ zmHD$sOmyPALLKJr2@1tl(0(lm>x?nI2;o}F6hRB;ImF&ZiXe!-+5(2o7- z?X7u#bZ|`uC3cU4w2j1_N}^idJN@gr@#=>5>tyCK*dl&-Qj(Z@ExNS$l18B!C!F7> zgvScNtgdo6-sa$UR!rIEirQG}kX*Jkg}rk-!-_Z;tP~QC&zov z@Dr>|s6&YH=#iPjy@yB=I8`5UA)F{vtkDhot!kQ%KWw0Iy9-tDM?T}Cg|M&}1FJND zc^f7ygh|)BarIp_PGlmyJ}-6?J{9}B5)PFIDEX6d*Wuz)x{Fg+FcUsQiM~SSGLiDs z&~?!Rq+6A^p(Nw$2|gukZDU~zy)(BLyB)hV8{7G1*Px{>&*b@qg?T(Z-rib+F?IF2 ze(Jh`ko`1@w6R~S-f|saF64eNbf}^1QueoTd~Vz;R)ui{Gpxh8BBz|0*nYNhj*^YH zey4uGh7*fdjpQ@qO2HdHl~M0aRGM8Bq5pUZp2In zeYXD9vBX#kK$POGzQB;LVw5Ild~#whe*@tn_vo4IuPwO9lg*++;IrpVHa z3&lp%15G}T7)6WwR)@hmjb`VH-WIJlwhq|ma4OPq>m&|mP*WqV#ZsJag)`BKxAL1&I5$}k5R*pA%*HpB%_oD}m>d!sxERRZk12#B91j{UQtu1wb0UxhO z{Pbi`29oCUU&e zqzu)f48D$9Z**{MOqZVwQ;V^7spq$!YdJfcPT{W=4z$5F?U)Z!1_#Q}Hu8MN2DcQD z0f+e%yObk}`Bbp8H}>7xY3dr?#X2op1^6p_#a73eCS3MUq4nwb9*_XI-jyxj}`+kc*@QbO|7-)=x1SP`$BroZkvHhnjeyY&xx*+Ey3%- z3VwXPHhQ&8oG(gd@tZrk#|$EZhJ~k&J!mR{-&d)&!ytA$yr(%D%};QM762t41qGsG zpC2Mdj23cgd(LXCo$!5mQa(p~4^dz}XzilQ zNg^ZJ?$=YBZ;x?5V@d&AvPS&8JfQJ@GC$zbXjzY=%ASS)7&Tl1R24UhvL~vn(r^bJ zMHou~(22oqsf;Ev{#BiwLEAU9oMrXn&y^QR#6UwHWFA}myB+wSYxE^ACZicPZ7e73Re|ozHm#;6t??GzJOQ}45vxj%!}gZKVoqJE!HX5 z2N!zetmHRy^n|m;HVO8mAhkkZz#F+oQ`TJ{6nq{RtreJm<R~9FAX?4l%Ocl zA9Vhh);hJ8QWSX#jc6x2;h@4~0HEPWEuZ2s0Gxd@Iri_PWCvg(qQTpWDUlRdCP4S~ zsRk+#r-egC!iR{eW-*miv*)7Kv=lK~^je9<(6C^3*p?LM{ z9GLMlCu)54Z|HsI>7a!EOLLQEhF9^!gf~>V6Z%Y4pVNqME0a67uVRQYUPrY0HxzU9vbKv`-J($BW7GRJVeLAd>6Fqz=)^6lPwr$g?DzDk;S>DhtNBbk?^NE_y=YP0mY znyT?5$PekW=3Om&MtrS}83rX0STvC!Vsqn45*dCjYQ6`N`2=4$83A2A_zM;j5iDXr z(%@!P(;v~fq3C%SHnp9Bnc~C=V$3C{0gPP@&CZ1s;B$_BE}_6RwsnkWk(Yg)dPRf> zUi%4Q7hZ zfY{?JNuT;~t-g|Hgg7N&?^$&HT*ocGGP0g4)2d@Rn@>xsoFI=Ul41h4UkpZGZ8I$` z{npUwC{h2Rv;hG|2n|)XtT-QD&UWfwqt>3!Hz*(xrM3b4ADlM=OOonX;=6jEe6>N^ z$Wo4IXV6O2HZSASc4GPr-wKMd9NtV|006;u2Wvij#UfZ_&q4-N$9Qf~(NK3M9IB~p zT_Z-d0Mnbbq$5Yn(GiU@2J@W!8td?gp4m#8Bs4e-b?~bek?J}%R62+!0ThUaqq{9_ zbCCy$JH%b6B%PMx0(2PT;eBI#Y@^mg>%E`0WZAg5GA;eb;p`p1Vusz>Oz>P37Z({_UqaqsR&k~SJCz$BPbnOrkEG%JP)x0Iw+%|qPwlMJ^p+#{=D2bjPN+KugY zqxQEV*HsGnyOj?6n5P(8z3-AJw>_z%>3h~ziX1lm@U5H%Cw4YL+73V@5XWlqB$x@R zK*=@sCO(8&*Z0OE<ecM-JG#CsE5|9m5zRyHOKXmwVk!b+8~=h+M0KZ@o0g)kNn6y<|K z%<#msU;LpSlu{lB1JD6nCd(YR=3Oxz{3usYKT$ybvC2k`JRM7X+SjS7+?bQm{vFE2 z66$G!cAAwBKC{*pXz)i8zNbFT?)&pD6L#bE#2jH1-|FJlM}9VCJ=#0g+61Ki%(qfQ zlh%L@#UXR-F>{qhAn!hZTZ1+kBUitFnwgBG&g`F{K9S5_r$TmAQd@D*ac)R&S6F{@ zxZkonJsVb@ccT=>yOu3jjQTKviX$JJwhJ+;*`0EM;WvjEB0aGX#4_ z-6L=kHcmcOGwuAaim#7G|H7)MCKMJiPm$sFLLe1&h0wtPJslLc_DQM=m$X#{F(pR#ctKC(ncRq-OQX+9A|Bm30HBa>_BFOfeH+$~`sqj#+&-Hi@sUte>e>}9(Cl5Zn7!$keq#`IPiNznFrstu9}nYjTU0|sid z$(OQ3G{^op%9+6Sib_aKOr)yXOei|Lq<>x<__VKOCis{q{K;2<)ZzrsY>Wl+1yy9L zh=k>}`M*XI+(!RL;%LCi)Gfrh`O&#N2M4att(|YMJXBHj^*$BtQC_)4h~jn1lVCZrNZ*F2l6(5*e2PnB0%h#^#yq zo(;Qx)MPo@uKdUcGcI~*DU1cUiX$}HIP$VF{jkwc7pQ%5(-1*H#5w%_zD$!^5`%J5 zIN_*!z4AJ`=ezinc$)uM=zfRkleK7u z68@yHI-9<{wkm<2Zt+L4g4*o!_Sir%I@EUjggjpW2h~cM`p2ftSBreZ1GvXsLY+k0 zzUsDsr0<}|))SbCdB?o0ef9mUZcm14W4)W{EM({Aaf2@#6sD+3@g<9F$83l*V`#TfI!H5bYkFgY)O7#ye2H{pY@KE3yvJn|HErqTMR>hiGT5!r^-pT(ACrNG z<4=T!324Qplfb)G$b2J)JW)jsHTyCD69QeKL?I=#EYn?Swg*zhnD6n8Sp4&vh59b( zpms&WUM0T+xhCF5(UhxuS)(^OoTT8Q4}?!pd$M$J1$jW?ix)oXnEIaIlbv1rr6ra@Qc1Yx5j)m~W(%$W!|pMu2{ zc)wvpo?H9rvXbW`xKKsGTg#WH0zd+t%5 zVKM+@-zUhhP}8cq$bg3M%4wuE+Intj-aJPSS}~Vo=%_IZ(cM_g@dXQ<1vwPqN~IeM zYvmx_m*QHT9$KGfwyKN2j;HidOSoj=s>}%qxo-Mh8(_Mg9#J|u@7GZV@2^ZHV1??@ zY$hmn<68MRZhP1L%2`jL%9#$HGV0nIJV_N7EK7>DKWCnV~@`| zD|^>2+JVO@%-8vHI&TNm8!jfA6@`3SdIcF=+jroZ`}PCGD~|CWwHz>j0c~DwsFMC4 zI_Hi@pIo^zjo!b}KI^R1tTZHG=cTmc-;7ynD4B}Tp~-LE)m%z8uD8$qb##9dAEJ}2 zi+ob}?ZWAj3SE$xJg61LO^^4+Pku4yM8GY*wuv>w55SoW9Aof*a^0)8cKkj ztBhV5cp%l8;724AHaMF$h6%y0yU}t~adI&NAM#95s{3B;eOW>|h|H}mI`}14kQiPp zrs9@stt3rLz>yF@k>6=tR$3aMtQc!`^r;V%Lb-6E@CH99^^U}+fT)AF3j_#>-|A=c z5&Dulcax#EcZLD&DdDa>Wp0HPUY~8Ve(6MUncdj9=RR(}2>afJy_mIeo+$OGOvKb? zPsoeJw>untWkOcgWTM<&N_{vf0KMSkb|6DjGd3{NY)V1 zfn+Ew<3l$GKHcQ}Pi|BMc@bqYO?xM|9+=|0*&~NM+kl?$HqVSBmpEN_#XNo&>)~f4 zip9<9yDlt;bnyy?!PUgxHT5{mf_}zlp?hEQl-`?Oo`0ThwzIF7#)Vi%U5NujC{M=kjARN z{zZNYJH4llw(KA#JsIY-XKX*Da=JQnNcXR|C;3Mu>D$`N|3+$DIAWPjjv^UfX5zwI z6G9PjGKc!=;e9DS5&e~+yOTpWj>5BU+1X;gFR#nSWLOV!I{CPWXy%IXQs2Hed2G=W zA!phq#{rn#{UNBg9{mBKv;whmLt=Fa^gbCvd3enu)b5Zsv4IkzRn9f)#y&%5dQ+j+ z1}qBu%yROK7z*JZo?REwIPLA1QPt7TGQ~1(O^9LqO^2WoIEpAshP=PCt1A)rhU_ADg8%ORZ*mT_WS&rkE&&J%!9u9=hS@v{@g%MPXwo^N-J{) zpAV}ow=swbz))>IegZ#dfZ_54)}{n)!!&9jascqv?)c>tVW|%Te#%ctI=XU)vVgNx zSl|`vS}A%2wPeyILkZAOeO8>bEB8$-OReU7)v0yWPZ`5TKij* z*rtZV&Fup#=joLkxclI`8_4J3mB8}|v49w+&K~Ib)3HLY)QNSAt{>$3nq||T73Lqo ziCv#_QDJq){e$>R1hjc8bp*L)A<`WYi(InCFrfJ>FaagX%Oe0u)r;MdqxVy+f>?xG zY=UDR`X}+BrLWoN*z>*jq71oHwuiEHDupb*ax|-Gb0XdlU1Pgdm+N-#yU<*x^3j5W zF`Ikqp&|+E>Qgg$DVGL%Mc;_q%xwU(iAS-Tq-~?I*&uiNGTm)39+LLQudTkpqs0&* zI@(EF4ll>&*K{ot4$fEPiRmVO@wski*skEO@sqm-o-zTNL2c&!A0tp z75^Ol^`E1M6S!dB3ZA5l78|8(bItb}dQRk?El{neYsF^NPZGeP^uF|A`MvlJ4@q|# z&YM|Ldgrd=5;r7bQ?~k>3GC*w*ntY}1oQ2NPlRaH#%3au;N^8R5dp&dw*w@GZT- zTw=PkB6g__0lMP)cUPuz;PXlS7&F>$|Wen!0XC^g?21p=l#t@Qwu zgc_E3Ej+Pk1@sPA6U+?v4&8ep-1t;U5G=l96v;;bhpNojcD&w5?u<(y5K61l?0A{ zOZ_pToX{=pz+`NT zPU31~$c14*I)hX8Nznb`w>zz%8yFd&eknS81pVwxLAM{bbhrP0b}B;B!;cjWJXY*a zao-z5v^^yTJ|LY^oVSOicTmpargzM>`}&u)!?Y8 zb|L0?F=f%4u@E8KrCNt`N$Z*)bFIjMpU8+_CvW24T?$=(e`QT&M_KXIYkOyl+t1+a zim8ZQBPL;qeM)5)&!MaB`E&@ohR*}F8=gHuS{UJZ_Nn3$=&{4=z-;-=FSXW@%px5; zhh6I|ZrVitSm#Xyx^r(~J_9%#_v|Xtfc~=xk}NK325%gh&k)KO-(PsLl(T*#(37)o z1>KMJcHG#DXGjaEQ%`RwlZN_gR}_&mY94*oEb)I8zgF&xow+nS>#+0~pO+u~KTk06 z8A@P<;4afUcZv~de4cS9Qo91!v*iv7mw`f#PDl{alDJ(4gsB0I*J0$KW zH(i5opqXG;F7xpLZmh-PBZBCCcU0k)DFWM=(5zO@XolTiS&013h?}teNpSb}M5W$^ zl8Mix(7+Jh?JJBbpE8YjIb;kTo0E%n=4L_=3>Z%$v|$ryro9C_0e@hMMAH47|}_FVrrtsd?2$ob%`czy@nSnESn z45vb7btfe&i4?#joKC>;&KWfN2;R<0+)y;)nGGLZv{fxMR+A23irtaVn2QrrK?7H~ z%$)2!gbj#n!s#r3Wz3TEEuJW$NQE68$%%NaL|)t zQ>#+TRW@(N&Qup9i>|r)0?DG^PEAT8eaGo*mKx8$K&ri0${QAL7ojY`R_uD$1ja@@!1nlx$dLY<6LBR^>yM}lCbVq zTD=1mS9U0`u)W>P(p!<;kyciR|M;c(3Cf`|dcdcQaT}ytvk7J_VoOi2XE5El@jjw z!a0G)o%4GfKcB|`>ccEM9lszWGPLk=bGSeA!l$K}wA@Qr zn*x1{gO6qL%#CX{wuL{{{RUUlzF%8Ux2Ux~lHd5yaYQ_+2w5%?W4iZmJf^{lI$}); z&w0K(O(Y3w`Go_ERpZ%!54L(=cON(CDb1f^q)NLCj(&45;6cO~CtoLRnG~rz;g3J^-LN_8;6%G8a(I| zN9>hA6|X8Wgc8K9LYDSsdDai)Q8SwqkZK9^=X*$D#7Ro=9 zZ`u@`VxuG@5&D{;ZL56b?Kg4?$>*pfR8<`$(Cgrrp8q=3E0Ah(LlVahUvjeK*fZ{* z@Tlz_T4^5)>C_E`)9_0)udq%;X=LPMCGv-@r|dnbBGWB6h%XFLUNhRNz;)H0Q_Q=CBX#I;qhtyM&gi)6c(}o#wA2a#{qk*x(Sg@ze;~b zbcuWxb6)utnki_q9j?s&XBK+h;#(X>)sz9&vO=bQDb$ zRt^#lO zNljhT=V{Ee2q~xG`ljq=KBDeRS*bX}(nLLMfIQLM=knS!^)vliYio7WJ~`O3a?{)8 z`7oTyVs)rK)+OM@47ve}j42w`0myejB?nDq3E5yg@RbQ3C=&4zP4#m-U+%LS(=T}{ zQG}jvv3u;U`x2MR2dc{gO#DtHD_@`Btp&1k$$veoKeb+w%v*~DZZ8>v+z;qz-D7Ki z!BvzGNrEZd4gMFHg8yXW0NAKG?pt$ogIb$+DshXkTaQFg{j7a|*3%vmG+RpYu)QQ@peda7_hA8<-?K#`r_dT) zoJ;L$x^b*wDUo~MS|bPP$AxF2O_7BL5+NgJBpz4DAC%;Mg?y?9D^Fz_v5h$&;JYWM z-{+>62vmb~ryo{2Og)75pw=F3UV7K{M?v27L`zb4uk}M4){78KWt3F~pJwx@S;`nBl@=DxD1{$Fk`1?5C~4-f(J!~P&W zsE~rYZ-v%s+nP6WHoBUHDz}6Kw~1$02<;3B$Le!SDY`G}Qh6y1ZF;4jj4%BA*Wo{- zh!Cmw!4&rnt+fCOo@}MW0mDrby02YG9J-DUapRfyI5Q!w zWT-4jYDMeCcltpCSn~%f3Ijr~n6OH7Sp-Sz5EB+BIPe(Bcz ztE|LHuP@vGa`Wx$pn(l~9UCt%DgyR9nv`{p%GAF=BFd;|_1pw#x_|?&+PGZ?Icnt! zUEvE*4_{kiTUcM$o?kjZSxixa!OpV?@*@fUP9H`{&3-8o95VvmSOxuc>?U1gEvx?Z9Y?OeD=9vf;`9)B*y?12iM7z^E|x5307wxSy`( zg_K}pOy<0u4gWBF$zNKft=4TNZ!;7hP6Br*-xeCYKe3VDh|H0I+U23|**h-omX{a^ z=dqy?uu8}Bs;%*@s%*pJ$fOi5#PunbFAYFf{eqE|m`uW#DqO)NSS+C?#|pi)S$jyK zzSt1LQt^7one!TyTGH`qWnMID>OyCFfV?Xtl#ku8v}bn10GHjEtFpcH8WsqDM7u`k zFeHn}Tv`*{?4tgUfHVK-_7L4&;DXBCM732^K{C5TGX2{9x9dk_J8TvY=Qo-+wZwbI z_%1;@oAdexLUVe9t~K03R5V0kVd88Q6)Ne07ES%0_7EQ3j_7doVUj>T>^5^4Xe=Z0 zr-}%YZ^J22#SNQfEOt+G7M%Rkiy1E1qUXcKI@W z7~E_RxF5Rrh$<2|F}oZ*NMBE?U2q12^GFg0#ZYVd0EdB>t>S7mRLy^=!F^xchur!<)z`vXHZj--Em|lUrHaB#Y-)us4j)m z7#Vm?$R>3i55oZqf3~QMn=a!k37VGD38D9w4I7EY@KyLycRCk>Rqo`v+9_242opT| zLHTd$;}3>TB0N}ut3Pl?bLRMLdAUCM- zSQL*DN~p`Yblc>R#@%u#&+U2v3RL)D+SbfsVHI25{5x?Gy>6jsZ4@c8mBxhkOgv9^ zx3XVSd^*s-&u!*0t$;vSpeI}NU;m%s@B_-TKKvj~Y(RMHGbrY^oe(zS;%x;&AS&gK z31@>pD}AFVe&bh(S*!N8?s`v1_pBc{J8HOqA^UQv<#aSR{?og(bQcrhL!|roVQlE5 z^cHI0B}p-p+|LHQk>)KBx#bm`gQXwnz!wqs-W2v{R;G66l-Et|+vAp#DQqI4qwz3` zvg!SsXh!_E-zr(5ONs|WQMoh@2|k-IVmuDcTx$niugpgA{tdc_z0LlZe=~Xl&c7M> z*ULUkZFNpwuXQh|G4v6nUPG$d$o{Z0`V82OUc7!g-dJ^SCL?{mg?R#$x719HOI$8n zuPqqdh|roNBlvb7uyd{<4XBEEl$JjZ;$Yh3gXFvhn2v0LSn-v%k>Xt?O)cK_DrT2& z%jb0(t1H|uo#M}(&U zS8kfB+!7^mJCapyobxPo1<1+!HM9s}5vLc9s2k9vb7bp0glBiovX96lnde1rKfKiP z4;%)JU43R-&o&T?HJ9iDqHf+bU7$x$#q9ltF)akD}xpo)d}rK&lOuFFD@D{KqPyn zt-~|$|7KtqoU>6F5E_Xlq9nRC82JV!Z(z(EhGMm+-dgNdx)jx{sEaOpPFIHfqO`1f zOXYRHK0{txJ_~fP+EmMLsBkvd#pf>~m+}C3bP6S}f+^0BtoPdDC;76=)v3;$V17NR zbE3u)X*TKKDJi%ReD^6OU7M5pD9Y2g@HQCb`nN((Fa1^ePTNOTTAHNU=tqCeKD-jF z{F~DVihYc-2fw_P>*a3^L=qhuuRhYp5O6}Z&c_TXuks5lu%a=JpD)t@iIrTL@)vyI zTQ?Rg%d`1T%3YhtEs!CNMS?>4>Q>5@wkMrRgQtt&k z^yr4WJD>IDcKMoZ$E?*XddyEYk1A{A#aP*-@jQangipqNyFObn@(baguDeFWvSGxY zB#~zQS1ats&AQh{4SVDK;?8WXqvt(^H}g8MxMv(Btc}D@yQEs$g4d=47l?{#xJw$N zNGqCIFmx%j11yy}fQFxIALh$qOL!Zuro;`0z&*v(YLM0RW3X#4iX`7*rpoiaG z;#4);@Ir=R9Gn=YyXKCT+rKt8EV-0qCz2c1b*Bh6XnImfqx8r0^3}v z|GGflomkvh|4(HK48TqL0=hh#$}An-?O*K(Wy~A1OmSa|h#l4Hb(JRObXEe5Ce1ho zL`yhFoI{6c5H7k!XdEYkaYg?qPJl`^GZXL)76MV%scKWGy5Ya2w5=&V&^e!1`cr6+7?*!eRs6N1dxisxH>a>(sH9GlU-L}hD<0VP8#j2IV zSqJV9*Yc*~j(AHJjPKNPB(ZS}t(rz|SLn**h(LG8WZ3U9sbw@`=n*+fNuyC$Kaq-N zZ5e?Q(v2NZD{Kb3vX*dY0J6?e7Zs#@`+*RnCD0T$8mK~~10}wlBB#IouL$iN{6{<6 ziHH&j@93QQ^BCYJ$I zhDwi%v9({Uo2(lrNfGyOM66?GRC}?OfZ1H+$$XiiXY*BBj-iYKPPZJN#6u#l{iu7W zrh9K_-;lL&)w9R{x!TM+05mY^&7t%59lAZxnJ^ggp#KOcIM;M&`oBsz54TK{+2?rs zyiVE$+^2Y7Lc;B9$BEcH6``LY>)Agup8AE^92WbY(UbGJxhIL8zPpW#X~pW-{8Put zyUuy>oFwVAmM%__b}pHNHFBxKg8$z~*PzEf@z+cTDJ3jiS2r)AzdhF-NPE9|m;ST?f{d13bAfFgI-8~bAWRrCZs8X6f*a%pZWuBb7}r5J_zS(ohw!@# zGlz6N`^_uGw-y3RJQn@(qe{Hp7NWn%8uIeyGa<>9i7% zJRCeett^+1ik`H+&xxbAUbMaddhGd64>=x)H=IG@)+DpSL*~M&8QS>TSB?HEe!eaW zU}HD#E>5=qb56nHTQGPh5KmvaVd1U9zcHjPyEHV~zRnl_(w6;n;Si7G|JZx0*f^VK zeQ?Ge$IQ&kjv3;ZnK5Q&h?$w0VrGh&nVBiJV`gS%=D)x5o!`-FrPW^S&0d_5M)MA+ z=k4n1>Z+%o>O%gOXY8)cslSorrZlPOBdI(gY0~DVplH`+xAk3O#O=x{4gSN}>g?*k zQR|1-Q_^;+d&y-^A}f50ZTuWyR*r z4@e{bV0`$XX86xv$wqxf5=Hw8+oJyky?&C7oSmHq9WTnl9k>Yo7TvYrmMh+9EkLUr ziutQMi_k3Rn@MOFM#7FdfOjP*krPEl$LD*Pu5LWt{av2$k>G?laV)=u7(D=nV0s5O z{aHB+x=L7n7R8Zn&+~#~-F33k?EqWl#NTO6-L2Y%r z5jPlEL6A~pKCK(^<)uqecWFITDrt$HyE zxAkQ+!ocUjZlVs{{KdPku_Ni=DeEhpYFVU$?eDLn?|pPU?dZ{MF76&>(FttF{Y*)( z>3_P|n*Ys%Nx=b115?t(qHzBU)%2tOENZ*XlXf)`Twl=ZupjPuOLj?{Y)Mo*Xrc$PcWRbtlvhoWQ)^N$V(A)+_^ zD>@`bFo_%k>Ya|^6JE58J*`j^^<8y^{pbYgPX@fz@)(ML;c=Jx`Gh4D2np=JP3$J? zKUq~c*)-?S{|+-h7zroA!_8FT*{)>bn-#IJ+8@Qz+*RDDXN&q#CaVdq*ZnyV;D2I> z|C_vlP^X_s)fFly{CiK;yM7av^w-kU-+hf0llFWAJ9)N0qC*u`000oVgs^}THx}Su z2Fico1plh-|Kp|XCt}g^L3!3{*YO{n_Y?!Z<39|Y|L6UGVzK|ADF2`j|1Yin?+^al z9{#VO{#F0~mBar(b&W&|&hjV(>6H zFrQz+ONa|A0sz3zOCSL1%jb)heX$7u03%>7BqT2(Bt#@{Z)0L^X$$~}!)GSBDE(N% z2$|^M=$J$yAtJxUafc?F<`PE-DTGP*%7X<5QaB4kh@v4=s~9PD1I0o}3`Njj1N;pZ zps$hS2YVERMfTPrEub$d*lyO--iFjSmJXU0mP{|a7Fq%Ful}H3M>U`?YmOS)`ALr! z3hHS80~i((5J3&ty=7to5_=Q|n|d0(_o+cuJtOtG7Tqy87W zoi!`6O@2L%d@C;!l%thGzG<5032EG+B#{Q#d!U+`dCZUoFruaEjvY|sScWl+pkbef zU4sFj68bsY?GYlLIL)#Eu7#$%;h-=HgF@tm6!X2qVUy>px*tylOtcAoGFzdp(i6A! zaK9KaeXDGeM1bV#R;gyOXBBv7XX^9&W=~y98wB1z-gt)HUzD#XPA9SiBD2&tEKkcB zIxqnDWE$!Cb)AXIfO@Mh{CivFau-B^YY0I7dd3Ywu%%91|27;YY{coQr2{bAf}Zw} z<0aeQ=1*5J=R@k~`HKoyAts+6sRTNUvB+LwQK6LZ*cco_@`Tab1JcJ%H>dgdNFQBB zb~ol#(4n%zVFGkum|0s8x1U-Jy%9{H&)k*|7CR**ws)olnwgU>z$=JTzF7it*oFrn zL<&x3&F2p0b)t#H1T);(ZdMUnr&j&l#E>IX&uYzlvV8o@RA&4fvw|DHk5XP&f8Ao~?H?mKL)$TP3Io zaUrtJ_oNSgi{i?)on{^F!XL56;nKj9xD&<)&xc?mnsBg-G6q@$WZ{oUoJ2%sNv4E^ z19brP7Kq%-s^C{F=SUKa4 zkn0fklJsH_i)Tr`N!}T$h%bw^NIXgQAeT#6NOnoqrO&3+CH9egFMMqVQ|RIE`QevW zt&$_URo}}KBq5TPn`jVfkY*5O5U|ZQpg`Up=NH$6B3HtHR6R{zK#U_eQ{Xn;TrX4q zec5=K5nqfW|79lrXyBIcu;UimnA})%k7^HZ4`;9LkK&hJM!iQCMeKse_{g@%=o{Ak zmWiE-74|A~osV|v#3veS8qY+MM3Y2dVsxprvdtXYTxO|NsoX5%Pl})VKbL;K%+Z%c zO%zSIWKCr1vVQEoh8$P7hPgLC|Geuv<~feXNyF*H!NyU>NoE~n!%nkK8%f(sJ768E zH`9P^0BP)L95m=KCZ?W`DVdPhMR4X+RGt-mo#M@3E90p!EUr^C&6BPBi>e(*ugM|M zq}BApMNm$PL5)GTO5q}hS0TG1JHJb;OVj61_axD>UW7n;PjOCoPM3a`e%_WLX=!ZP z6iuE+9@pSE!$!OCE8ZPVit4aTi8zU<5t$#0v+GKFtrPVVa2ES!6s%=zZ9}=$tLp0I zqVvBw`?!Za^W4&(XkmFG)FLu5)-ZJG&gg!8J)t91r&fnhv#LL?e(qcDPqWZA^co8O zxno%Ow{UI0p`zsLhI7}M7gw5g^%_Q-Y}>>=!ad0g#S0T8Pl#(s2g1Xmqcc@opw}Go z$>CP>->b+SNJBW+iJ$MkEJ)FkJNRw&6!nR zN!-ymc^;Elh&piYx9VS8xcGTd z#QU8$j5mrGwbQw?%!}bs{|)TT`FZVT;qu^l;YAMg4O9+&2$K&I1*t&t!ZJgnKsbT= zdVoD`{)7zEx@20j7+`|0Le4?l&}?wp=+6#V^mMG{6sK;@%C6q7E}*XlBEmxbZQ{|x z)5BsBQ5aGfE}|o110r)`G9n%#$s$t8YIN##yP}aAkwk?&7=*a!9%Rn;B@feUQXxC1 z+b}!l^ekFQb*Ibr4SOY{6O}Q#J?eHe1h|Cw8%Q5vsJ$h7(v`QmEiQYYh4{9Rm$-vL z+JmSo?MLI+SWt3cZQzt}a=&(%p+uzwy2K8coIt~-Q?2f`-)>1lOhO(tOUYEpxOrgx zWBrUExqf&xtu_k}Wd}naYaXLe>mT#Eb7jacY` zYu8Q1jI;kJj3Mve?xyWpkK&KqjJ$ZWnXtJynRYtA2fy~Pom(JO1kG1!t+dFxX!o>k z-F2QsTM=1_FI|p`jz$^dZdiw}&no;@sP5D=tGn1A6l@Vx*y{NDR};ZQ;H*#7XXPYnQ2yu8;7U_*LwLSddu3P;a!; z9M|juM=?hNdv8?SV9k!*kj>lXosb7=*^xX;Udtos8!_kA_Ru5YMHU?Ql3Tb}=@I2y z_I=}|Mz}`K{OWvIV?MjNhqTAWk?%|<{$KpBeCZ#aw~_a$X?1^0r6ywkqGzOYX1jP_ z3l0WdMTB97d{=ekZLQy(&aAAiTp#sIuF|<`u`gNaczIP$E;Fs<)aLTa^y)YZev6tX zXv<2{J@qy}YPhiKII^vKOWLXU)d}Hs@T~p9uzug_wfE~I6ZbPK|M{H0)8j*DmFLK7 z{cQ@e1W|`?%>CP&*_+|%PA(;k98Fd!U&Y(p>=}{9n;A7<_uUdP zC79*2ZCh<5y_omb?!oqc{@*)7-BGW(z*HfWNqn853zV6FlOTXTFg5RnA259JNh@dD z-fBYAG546ReZRwMVbt#h$sPc~XMS*iu)sEhg()Aic)h+u0Y+07O()F=Ko&6B@g#yk%}H@~eh*G~1;EXHgm0s+_-wXbDgqTT5yBx-_+?z{M?xwrP% zWXtT7@BheAY_Ss~^=mB&`g^CnJGy@#!r8=*>)s<(K_)WL(ZS2t``gg1{-w?UT<#Q%b zcfe385tIJg)Bu1|?5c1?sbPONcH^FQR>6+FOf zlk56d7{;5vfCI=Q9G31ZuI_RTw=5pp{vU)_&D>9^{(O8l2$EsW-|?N30_NW? z>$Cxl`~%yTciFbNF$2yegj{Sr1E5A zajT|JHA&r(s(SY$p%E|nm1WMXg3nj$WZftji#K7fXu>{FS+(mR$R^H7C#if`?f=Rd zktu5$=5tt$2*hDBM86z^-abbc0<6YdX4nuljYd;a+{8Yp(Ph~fAFU60^|}W+ELlRZ zey~%P`6Ur*`S$6v_;W!;Mq+QM7V*3gc!EFQ$z|UX0b#%SJ%joj^yZE{dOrs#9gKcH zd+#)z*)v~!n{Vl7<*Ug;BU^!B3C-W5`orp0p=(IO$xUB&-<|4}vVN2*I-$Kzdn>0a z`xfTcuGm;5G-Qa&Z!D@f-D9Y-sRDO_3hk?qP1|x*aV}m%2JCp8wI2~xJMp!_0)IJx zAyw6J@tQH941{z!y{ao^^7I2mv>`mar$uQ+Zm1!?(80Z*sk->+U~s_0V$uciHio6w z5Z>2ZwcSK{mHGqa5)%4^ap!P+gf@t8(uQuNRjmv)XU^$a6R3eSvjRM&w6f#-(1}e2 zCNf$4&0j=`55L48c(Q=Hg$Cn@C~KZVf)&@)xSwc6g$ANAWy@)j{=9BmIj18)t(Mme zI^Z3G(~v2SQwfd#%|mE&tK-Ldr0(85P=sPe4j^DQKD1`FP;^xc;i+e^p4UZNdt3Ub zSvozIq2+tZ_Hh*@ESmYbKl!VBVcH=OnlqEVt9#ur{I7M&5PGO5OEB-XjUw0%j_p@l z%Z~|W(C@eCDP_$=#a9KT?1YsMa-_29yE)T!SdkdMh;hYlmU?fvKi{e}NFv~MiFuM4 zLKXiQ!Q`E9b<-U;F++l^L|C7qUk71HuG7`^kb5Exagk-Ogr(>)Bavp)v1O6=&KFJ?ob6w4^}XjpY05yS-Uc`kfs9w!cpE?8BWcU6dy8bNxA;&f6DI1`IMOT&FoB;K;6WY0H3Lcxf@$6iYiYY|)q;q*dq zYo*`|)qRjfAYl9bE;OZ=&omdjdH5*o^k{OQ;Vhja$nOBj`WzNu?y~f>THJ)4pdfo0 zn{A57fPLOj^H|RBRR8o&0P^p+{{!Ls;)!6+Skq%~;R5M)oJV(_91KfV!~FgRN{8Xn znKO9E5bQ0yv<&sv?~m+q#p0uQ_xx7u`l_WhNyVYmd1wFhtuf>YenGtcG7#b-D<*AZ zYlM*TP>PT0>#`y#%BZ1!hehLfR|`C`b#Ew9Ig(TYX?fBsOuEPiS8|azq8~(T|ATK0 z3@c{b*#&1XpuUT#MI*v&o)D4xHQ>ePZ|*6jy^8m<1OITh5>Z!JD{_NwJX?G{5X}yu z8U(sacRcMj<+EGF)7cKCTqmxg(`xpe{Syi%(_8hnt_Q{cf}bv`xo`6JV!V2Tl}sD< zm4WMC%QAYMCuUd3-HZK0w9NdJduGZFlqL!!R|Sx zN+!^6!^rru#NqQ3gEtSv7+U`gro&NhUN>8FYF(leu)L11YTOYS#9}s&cd2-+pRPzb>EIm_tH+Wb4V^xF7s@ z@?4-u?({V?_wb&r3|_`5u4TOuN$;C)W6*=sLU3ZXXt|%zxsL$Zy<|-a%tl3NZXh@B z5G1l^A#TGHN0WZNjqi*?A7-fgjT=INfaYtE+P;ri_B*LqJo9QN^!V3kxAT2LUt$0U z=KFZ*TE$&-SdRO(@cKn+6uJdR`IDWpyplI|V;=-7SpB_g7%||?PU*O51pjCVI@0y{tMG{;x#@!UWP@0j(dAACuH!?6 z?vI-ZE$d#bUxSpcyWP34Tc^cW zO&fif?on)qlDg&XuJW{Kp?O5DP1q+J)h++kJ!%Zv5PSSRynxPa2MpCa>1YD&c&rWI z;K`p|2XH{MF2jJN7LvDKvV?3c^t+_-+?6)FwFO$%p421pZHx968OY=dBJ*B66Pu4L z)K68s248lVqBJABg5P9X3bZ*tWNmT|2C!l(a%^!H-N0*{5H3FSV8)EoR^Ptjl7lpY_``am)Jm3Syea7LM0sZ z;r;3rh|eJb55%=w#MdCuMWR)B{4%SQl}U|cE}EY&*PhIMaxT~RkaCm$*$!a!m8p0E ztZBSUv#Hoyt8+oh#Bgpxll|*bo+2b=ZA@(&Pxbp9j+Teu1sl{<|0wNl(w{iKrls;$ zD+7^5%T)vrkSHs7Ov?h!mg5PBg^I%sfTMKL_%sSeI_L#vihEWP;J|wp8?%i2rxDj+ z26uJ_r$}Drn@M;z;S=LMj@I1YDqTuruj)s&(K)R3_{ViL!w9QQ_YmueYCwt}o zJeV$|la`qm2dJE~GYi8imW5?3u&?YT%gt*9%J?z+5;MPycTG))sziHFdHQWRH zFro6Q^Kn+nwySCcns;&anp9wgr}Zh`^wVWEpHr0xZhuzsQjZ9u5efgUaY?oKR1x>> z2CoL`C?_KRLEp_NZi~md5NZq$oBMFYtWdc>8IexQzqsx(q%S2@Vg09by#Y?o_D@Ce z{x$$H%ZBAqS-eaRO6K#ui&J((iTiN5=WXIN*;#L0?~tdteIz|9yYzr|@1XNJpUL4N zzU}KEpz%ODZ+MuLtWll1=iyA9sp5V;=!ANHj^exJJIIJ~F_ns7e;_Nl{Gp*Kau~rLy>ORv!G`6&F;$=9SkU=nmJ>!Z1~9VYj6!JWRsQi z&t>U?sbi*EmI{d+GT2x&9iE&e(4dORTs^*~25K~HmpGEV^r_qOiV_=aa+|2b-Ot)( zuRs>$XlkDmfj_RDoV&l|UmmYQtdGVSdzD~o;W>J*FnP_iDDR_B6V z@oS_{C+s=Hyn+(zcts<|s#QzH+ne_)3R83_>YcCLKjXEc?i}VQj@fs#FoCXU%^zz; zrQvUVAt68NT5vjJEwn?kWY;ErZkz*Tmr8LS!7i*}f~nlud%y_ADrk0jv-Y5Z)e2CL zThcrJj5yr>!c;TMrJ(8L{)K$A)Xh@|YiV{SY`7Jdx~rp83KEvnl1;FNHFJChx`A!r zBasHI@Kz3&EwX+IKKXvxTh1z3Ot$f!ORX}B$J49C*0S#HmyTwu>q_Cqy!oplORN(3 zdFQE$_LB|0)?p>5T0-A0=H!WAUR&o|-%q9s%#l{_K<6nB{Oy%b55*y8L+R{u9f4u4 zu4KI2F) zhnCLixD2NV`dlLkW4_*z2>~=<;#8?asNO>%b*_D{;urCb)FN_TkK!re>0;%l(V?A| ztuj88Tb;(6!fXH}Uua_lEzw5pmyOs|$I&G`KTxrcvO!?o!f-k)!ZxQ6pQaS+HSMX9 zb{Y}aBe1Na?XUCV-HQE!cLxbOHOr{AOG=u0Xb5-k83ghg$iVCYQ7XONZqL-gid{-w zZDE8kH$afWpxP=V_0wVjY+UH!oVo)hIH`ZhEd_m@80^272uzMlIjdfi_wHgh^R`eD zxc+hoA*j%_Uebr+)Oy2k4RJj-JJyy>n#hD3QU7Hamm!`Q5Y<;OQ2FUHnS)cV2cLFE zr$re%d=@q@MVBI5<5oY}fCG>Wg$YrrKCU&Ao4$KDe^Q!9{R=56oG(T!>89Zh8zxC3 z3Hf1xwP6N}4eUNuhl^WMvGXSef5VsL?!?6>{82Mv_W0{{X;)rxEf!=h!OiNii2#e{ zDYUQ%5%U?Go%^t42rcQfml50!217Q!xOjnBW&DP|79$pLkdtwfmTDM+Ps0U~J&5gO z39b;h^+oG22=|Da_KV(hZEL4SZnaBQ#EkE52!g^F)I><3FQdxdz&UhNog~@-(R|}o zJ3=>{Ra6$f59mgWj$S~sNRL|!qgnlu+FB;`2(?gut?z+FDa?VTP8Z{Z6l(mh)zt5D zPLC~ce*5qCD2&)0Ubz>14!gj>q_P|ObXEx+4;9bj$hKu)Gz!9=9g zUuG!ntXycHw&n1-Jl?ddx!=nbEXoofd#5Xin!16;VrBx-40zYJZScKGd`4FA5Og!y zUTd150o}q=T1uusQO$?X(Wn5}HDPd(-<(4(;wi+{JfFVpiAoY}!VWj;j2&+P_UV!W z0;;zpV}+Si$hO1A2md5Lk&GvN+m-N5@eLKANVf%#X;`HGR9v`(N`I&mx%$Np_oo5L z-JXlZ^5rg$-MTu_jc|DC2^NNkvh$%sU4y?m z!6jjvxQTY95(UG^aIC9D$$G6h`WrL9fw953)x(RT6s3;th)|)0qf(SPwMpW04lFPf zAD@f1?{$pX`{NlcRRvkBM+K(06Z&NFv$!sz4_ihONr;P6Q z`KbSp+{;h9HXC?}uzc0xfQyZ`tEM}5?WZcR*o(1CTbisC)v(-#wTIsUtT9vK8;|_R zSSXqe7n@TPHiKY;E156v@?FETj`SfrqqSU{R|l4=wiFTN14fMQPr>Bk#%3qw^z^?eP%|?_2lkhH@#UbvRZvo45Ze;|WRF*tQqRxe&Vy z#+X-CFZG803GYLMHUjEsS%v~>eM>rsKj594&UA`gaGaGQgyV>Nki*_7ehk!s#hSQo z0CxssMfKz$L_MwiralK89uWJjn4iq)mLMh(!Rjs^!D5_&>*oE>!`($%kmKVQK$CXG zE63zq`X!AgI3C$&By@<1#AUp*T$PL)iH?h&W?e@LUaVJJ1coy(wt{l#|ykzb`k zC5<-L*#}kPD~wBd%9}>?<1C%o8)qijz`~tS6{pSgN(5&lH!mNN)#hW{-|XiTh||nN zT&#yn&0VKMu(TgAH)H6ZfS@le;6SozHN5M#=SOxt^&7KeBBjpn{)F(p9Wg=j$sFg~ z4n;njdmc0JuynmBwNfnea%w&GNM#!-BkuhWou0VCn_^(Mxv8MA6cRcIfu4TI5 zJ~W0)uXbWXPw=!r%{ptw**bN-(ubH8gmEcZH+SCTK19C8k2lEAXxu3T*8(ZdlmBX= z)A)xPkg9F`C#poE_obpzJek*>`{G~ONu5K*3=D*5%+s^IA6n|_w?$1h3qx<++H&e0NF7H%z@}U9jq4h58k(-4QjNq5FDoghHM_GBM2}7Zj!fK>5LCHu==Oy znOtA#Jr7mmt2Dum%3F)r{*S%K{(AjLs!2~GcF#Cs06ek%o`c2}CgxDIvRSUF=GVCw z_I=MTR(4);RFCHdKF#OEm+7hVUKuRv{^m~>;-ZAhZh6K{!J7Wm6X=$BL})b^VCd8` zs9+4$%?23DOz&lQ?7_yX-oZi42jF8C(V5 z`{`T|eDVY%PcPF+f5>4%t6t zh!4MiDXMcYeX#lhrFn~NfbRSKwWGK28uDX|INwqX(?rD({XEd(-MvazYhw1@ zlb|Yn&3ejU;K)`up*&8dZtC|n^x2$s9K&Z6`psTBr zl%xw+P1v;O{4r0CB=~2({T^9maWL~?_y;V6oT$Z)K%c$taWIbJYEpD1;#oC6RkUbD~GygQSu`d3W>-PK7`O2CZ zxcYE|cq8UcNZ=>W^ewH*hcUgOXl|W{Z(3f7zarfh@?0m+%X%u}bL{alQdn;X2@-l; zCb@=HPTFlP|H3LTjYwG1YeH!L5L=yE7(nc^^cxm|B{6ryLlBd0wQ-Rrt4}gX44bhM z`woTq#fcwYmr7jrJU+3!g32|VG9h>XA@!d52=bN#zg)};*6S0$0JCv{IgZSE;H6G- zMXb@JUFWusV;0Y^1?4|Z8_u2b+d8OIZHk!I0B`&rwMw+mbFUC(Q6dtdOyY{&xU=A1 z9BS~p$vlZv1N_eA&A^j_2bf*W!HTTMH9fVe+P)z^VH3z5bD0q-Y;Mo^4VJ}1FNG(6 zpJi+!!K25Np@5}`ibh0VB7J(&j=8(3Q}yJg=~P`N3m>1ZK9!Y%9KIGBOw^gu7MH65 zf#pb3#T7q!#&RUX1`hQyph+OZk=+MV>D6(aVt}BIelN22uKcnE5rHjsppiSpjJM#4 zQe zv`A@xEv(xQ5Lj%q8i@>m0xLtwL+5SeXEa9KAurt%(z&{LNkPJ&c0qDQH!8w6J%<+0 zRm$tG#39r_i%8%x-iYhcpJ$Do4&c%2Ms67C_+r{FYT*Hg0VH@U9IE^lZ{yrqzj580 zlkKZH%2<)3A%jFy<lid>k7Nm<=lnO zc@|S8|5ONG5xQN~VJ{sBLE##exT-ItsV*4SD^_qH5l=h27Gz)tus=iXZz5L4zNhc5 zbKPR*ht}ao1q={XXN>P$?|F7EhS)+9L6P(Vk=nRAwV{NE1=_g8tAF?P>{nO#`PoHV zuC(jrEy+Lm&^2E32?!`*4s!gy0$PNCFS!b>Y|_M{N@%q&OfoT8k}_W%^KFbqMiIvJ z>|D1JwK1^YS*n)t@i=!IUS2HfV$$-4OrVAbDiT)T^A5`p^?~Qh@vr(YUtMZ9N(f)` zXYn7NnLJq(e8DX4dFva3hGFlOQX8Md6XdQ=)&EwF;tdeJ|QX)q=J=~2dG_g97$iDgw zrM9z;fTVfr9f?i=`P(8LJ>3^>rYEF&u@o+GidaY< z${)qD=$U-&$snh_gM-g47q(3}AdxMRhJhzuhkFsc;>+#pyg_M7oAKN0fIjj_(`Qv? zVOD>nvF23B7g8Izc{zs^KFULCes$_kYZz*qmv4CWdp$ip9c0cgfOxe7rlD zg6FIbF7}hN#_%PQ)Qv!(dDDi#x;?FDI!#WURu^=@j5oj3uD~|^azmMqqWIWsrfiw_ zUD{rDJGxW`O1qKf%Ine9?>&q1%D@6lXkmLlBpkOKad34lek`r!{sWD(D%_NX zzd%+Mbaiu!A|#p0-?5J0%bnYlZR#|TC}bM(guoD=y8~P^+NVq)i6Cl33TMnYtcG=N zw_-jWa(;XLqqHs)@*H@P#~6s}B-cjuvSnqFOm*mCf96oQ&V1Dk^Bba-FUgn{tx{BX z7bLr|t$wlWf=hFvcqr;;Bi|9S0*tWq9hwbll)wjcn$_rF2mX|To~wKIQB?@P3CEld znsLCG3q!kBIMi9=n#~SABT|CVtAc*yVod|2qhoY`SChSiSh@H$kt!RqPCVBeDDxmX zf!auSuFD3MS_QY^-i+VKR9s8-hU|OakOwZDlFpH<8m2%tKGpVhzHc*>YXg|>1t(<; z+$|Oh?{)Sixr7un`M$XQ)h14<{Q}E1a_~Di%xru(lJX+N) zsn}d>mT)yyuIjTUc=ha469n{f1WOQS#)}dqOwd*S>m{v*Wau7Nl&<>jjL&R~>vQGUD2|4oPl9EWIVO>LdHBkAx z_S`i5Qp5o~_RY36;|~anWUp^f4XrnvjXGzlU^6nE3)q|hI#`>@0Q{+wnh#%=I~txY za}9ZUN3wLO28wIc{tytN3s1iCRG*)%q&zEoI;k&xpA^89JmqW0rWalDoEd+;pJd$~!XZTl8%d3&k(Q@oe&hD8 zQWpPwliZ)(7x6@E5!(~x4R5J)N02XpW%ZiZb2I@%{L6+Zi?VmM%|;TeWYh=IZ%Sw! z^P>P!gWo{AnIJ{DDOVI_-{sM&BE_6z3bZh<9thhJFCrNHz#WY{F2-{X7y$zwqBKAe zI5*I~^b#Em_?5scGys{{6{@YUFHY0%z%RqNiPQ!#x==J4pm~E~&2&8Kqgo;ON@DwdcdSMBMot^WYSG{2;@4LBM~Bx!O*+~;PZ&%e^N-2UU*4~| zk9jA+3)u3IboxhK;VlW|sDl6rMD}db9&n>xWOl+c^A~+HFXZ0{vnOw4n_a8AhwMwu zg3X}1Inh_>atd)?b`s8JLb9%I>iT}*2B5LDw%qZ2fMs-EguJtU<0sqxet8B@d!wzQ z>FDe%N`+Mb^LO;Qblx@c1=A?kSM3~e0;_3!4|qld-+8_-G_HoQM0`BvHED)l>(slC zxgZ2%1q&{tR7%@DB+0Jj>9GLJYggH1=siZHRgQ&u);H~@fvJ^374Uh0;MdZ0HMuk#oen;e@$+~QBHj57a{9A zV#d0V)U1lpJiwqvpyw=ZtVfvjLTwA7RVtr0bUSt?VX(VmBosl6`NG3=?Ee6>z6OeG zS#YD2lOCX?(~_JI;<1N_%^UiTTZxjn!P$Up>k)!Sx5UAP48Z2A-k#njhx=KZVOA}u z|Gs#gWW6#cQ^l;9H~XGsUM_IYay&sy%b5b$??Z9lJP~Y}^j35)$X^^UP${=y<9l*+ zDNp3aT!l-?EfVJtJUXzZT-QBw`qM{uMsi-hc)%`Y&F{yju6uWT-3a@Zjf4C>`n_Ug z0s&MPhpymcv^A3>l2G|};6{Kzz-GJbRJY%?azQ~5%Xn}utbjt3bz=$*W`!n`DVQYL z&g^GSSP>F%RbzcJ(jyxwRB5dtkutk@u$C0;8l1B#1xXz1x)2jUE3n3wHV{DsobjdCNU|UN5w*Ks zk5WLKUv+_YVcJqq5Duomyb)+&Un@^-QdHSeVy~ z+tcl9&(Aqy8?~3SvF5FKd@Y~jk<)w`$p%;+~Z~_yeGSeA_ z$|a+ZC&D#Alsj>JI~3)YbtZP7Dp{aJ;x#f7RD;pERsolhb!@6A?1emrZJ=ODGC$q@ zo}H`x_M;>P5wg;VwADRYyJSIySKC`SVEoYSYc2S;u$Wn`##i@4rE%AIc{qC{Y%uA? z0*8gUXP->@mFk=)WDIly51HYc+TwsX_QSG?iRJ3^wgbil;bGfk)ejlO?>A=1-Q&*> zQt7T;!sqEfo02*_DkGUA_O4mWcl+0xN&=7|{2%-I2(KP6U@x`EgxIwis-F~tN@?TF zi|w+bAU0HnWFCI@=a)REoQwwpwxE7vcSDx(L_%s&OP8%9A+lN`=z_HuskoCVSH=fOuBQ9{3*vt1|*UEMJu;T9(mlxpP8{E<@dy zd?t%A5s1>~?pKxThKBB>TLOmm0tNUv^dfQLs%h^DV82V`1)wR@_Iyn}qBG=$%68Ch0Zc1A`KSBE!LtM$5n8+M^-)fHA8D%J0y(Y%GS$ zwn3|^Bz|lp!TXHivmOuNhmIHjQNOaYw_?lpA6##n4gd9;2LyB6t(>*t!gjSMw|GRY zi&<3E)^6Ezy6CR9ChHr?SKg9@qg00>ByOl2(qsVk*9vxuG ze;S^WHlMj;ylGM<+SKVX`vsuoJu@CYxCYVq0jMXQNEnO+Fi?Q-G(ybQp)&7~V*JxI zhenD^YKh@6tn(RO3Peg|@OamoC;21R^tH-q8wfCW;$Zys&4FHW=Unb&Aq-tJ26X8) zrZ4w>@9V??u~dUlZyo8mGb~V#)&Zg$WBY=bbU#8$+1{b;3sgCB_;(|m0>Fa-mb@c{ zQV3tJv~A7gd>Bx{wyh(RdXz$?0mIgGXyV9Gp{Ik3z@W#UzEz|+M$y#wreb7g~PqqPC24_@M4Q(l2WAPmgyOr6CfX<7;((0yAEl@KS&1&(Q_-e z!e2H-tRLKSxSnW48jgnHjwdKcDQHgVp01Z&6k)jihDkBgqpjJZv=yBDRKXiS@3O&w z2R=O*`J=SWTc0`My_(we-BjCfhNAkLEU^7<3~g14+@OSE=__R0TOhwqpdqySwK)sH zqFC>?2XDF@(ss6a4_9|&$38_X^tV_zCnxL^sOz*_JiwRJ?+?h!`tum4Ml!3G2HXNv*`3qCi0326V$m6?K2bxV2;Wv zU<(y?(xcF}rALV{{G^sdMnd|gLaz!*we=+w?>Tl68Z*_x@3DHLZ9PZTGa5^}5Oo0z z=s!e%<=YMsLXV6G*P+jOi9vGJYNMCzL&)8{Qn`@ys#pTj%p!Xi??2X2h&am@17Ok&nu_BhXlcWyQ-Ao5}||(AR#|4n#2&%(q)!f>#%KvP!Q7>>TSobTaT*0DNP|9_kNd;VuFy0VQcQLO@`**amu5Mc>3j>D+HJpuoV0>-~FWBM~$yU=rTD1E=?wAe^Z z=aO#>4Go3b!3{2gJ2-IW3Gpp~7%1k!%H08aldsf&4gqF~L{qOq)WhgP6liHt&tEB{ z_q;!eIbpeD#L;{-F;s*h_P4VHAvewAvu{HPGK$q`=)c{L z9EccHd046JnCDd@B82g>Y+TSP*!#Vl+lJBdL-@cphW^K?L){Kh!MRUJ|AyIRNP9VR-ezJYM zi4OE0+)xg^0x|0Bq!hM#F78iPTU{oHP2Z!&BeMJh)S?trziGNyuNQg16f2GaF)Rk* zk|;?#)8pK5fPfc1zbJS<^Ckut%ByiO+@X>2Oxc6A=;&yjB=Cu< zt3zWDJ7Q*A*0+4z*T*XHQIesmtJ(c0cw_@{e+zMs@Y}mT5ONA{q2FLcSBZc5(Ok3J zo7MDirr}V(;TyX{#{49Y5JB248MaBBoH(oN*8z%g4`vH5{*h7~sEMntQ zeZ*gamz%zwAvuc~7Mr#ZO0?VHT{DsD(5d)a@GLRFA@N{}{pRsR60(?Fp1{M)uLi!q z@Q2HMM2z_#v~<77#1cT`Z?o`e9hk&UWr%sj!B&nu1ISSA?l0sZ>_zgxIZQq} z@Go3vw~#^IQIl^!h7ca$PaARzOJ8k@3O3_2G7?XQ&DfZRt?hbb)%I97=`d{eLzn)?xNN4N){@t^~NbyiDlh@J#$7S)BTe(ru!j#9M8s2{E#)aWtT_< z(5Q{ZPmsc&kDo?`0(`+I&R}grM3j^KS%W2~l#u!1I9j;ZHvL5omolz+!>uk3gi| z^>)rK3c3`Jl>futI|WDf{c*b;+nR|wwkEc1+nCrB+jcUsZQIsll8J5GPWsLN?yWlK z=G3|U-Sw{Sy}S0R)x8%!-{%>;%l21PNY|u^k)Z11+vF!Mxid$>|1&+!k<>puH8r$8 z-pv}@Oq>%8TZhA_um7vUa7{Qx*%y^~?;`=`mz9OPvYYMj7mBmBO7r*#=P)=)5^;8l z$T1w^6JiWy6YK+~kIBtY0B~)AIf?u_DYgs5T5;0VQF&ZBH52eHTNJ(9^V(uppj%wG zY_#C`jcJ$BVmp^uOG8s8O)`CS#8`wId_TJ%Bmt9yE&)|r{y9Z2WLdhSvc{Ch*>SO(@l`TNKbq*T(C} zhMw|;W?-<~vA_59@yTBvZ5-`)_Op4M=5>~a5Bb)@g*YK$N^IHc^PQO>LHQV|1eq}ZPTeBinv|+tj5N#y8`Q>uG zqfgM0RK!=;q5}8-NA!_zE_GNZk$MX?@k6ZCcRZ2C(~B513PbmsXx8dqH8o%F%LN3C zs|``1ghH&JmEYM33^;gM{P86Ue?LwcVSnV{g7qZ-a{9+qYrqd;p@4ud{;0g*KS^#g zVf^;?!Xcbrbm0D2z#C68o1j6XsQ9x~d-jvNzgg?7lmZ}4vBhvo;L&Xn%3y|;6*Fe9 z3yIfeZ3si}SI6$a>MhFi2# zT&g5}4vcbD_P)4X@LFmj>uE}S?pZg>Mx1Q+tI*xhnGdRtIyPRJ=pKn$^rFN}I95h6yx_W_nl+np_@HTi4dsMLNUySK=^ zw&_#<)E`clVF`u|R!4WOT9FWJnF3ZPRgdzV|79k8osyhXj^ym7LiCgcGbf;v zeq;a&3+GN+3%{L|%J`3NjFR5+Np6bY$h{~WsXrM($Lh&iYCM#uDPd=Xj!kP=r{ei%uG^A$?pKKI+^-K64Wx0Z$>)5u z$*&JQex6fSTYZ>lHiL|HoV)!q#MxElydQ^;U0Z%+4~so(4i7}FV~?{#;F3Qn1x${U zVV=Qrzk3&b7m5Fun8@PS<@aUI)fM@|7lY_MZBMje)-OnPK>tc6&N|%%XS0JGbU`B{z za^x@W%{@A@2Iu2*fYt|j!#-?)WTFlG$s@sPuZx7|;r^$$6tfWO!0n7}nW`)_ajDvOk1Wi}SK;Uk2C!Jwe`!MDvR9N6O+NmK(v z8->?^M@ax|=k&-YU;J=!-O*i)xb5b6VS6q%aB4Y8L8do%LH$$7Zx>R{ST}E?MkCehFG5lpPM1+(Q#tU<{U~E5fvalK{T&_|a zdEzE-LzmKu3*J@v&G@xWfLvU9`G_wZuF;q))oOS0mmj-RDq{2BnOB=Js)!{N6>`r1 z6-p#h5Ph)KtFj>b9+e`k7P#Fy9er$&60;!{^m8Jo5`>SJ1r@{}!`OLx3weQ8oI)wlW zd}D7D(tDg(v80kvm>4LvTj6}D8Z3kZe5ZLjjps7G#VjXz^eWuhZN*ESPRGbhBu+ORi#FMta~SA1OAd}} zSI^-82#fvgHQWtJnT%Oj!&}?%zMa|GQq47Q-*=o~TyBHNP8iUdL4X#voPS8cjou6c z4iM}>%^f}@W{dk{*Zg~4Rqvgj!|Pw-(B~d{cXwxxO#RCbSDmS?;$aW_i?#M7*I`>^ zA&P`t>E80WeW%`|3wDWmC4+lwv6B|k9$!8$(k%nTHl*`Yo29`DQXW6oNjHA5LCTw# z*{T8rzo(T>lPlz>uKdxBAdovRn8ObJ)CA8gjKFid?DtoTos+57RBU_3yT>d3Z%H+{ zmwUX(!w1A#dBuhXmo>-1h&8$!cXsXTNAiXFr^!=JHy`V40%+t()&_z&#ATzni#6h@ zHN{0+9<`c;_Z@;{QB0XMso4T|OJ`wEIBC#DTg*yy*iV#yMZ$kD8vw zGFCX`?F!DA%j8r3u(q!F{j>J-rBc5;4AS!5vnNJY{==$*@v{CH!C~VbwPe+Df7ZTxt7~d1YFdc)t{E~PBmV{ags=q~IAFj5Fujl2 zGD$-@hgdQnGUE;yKO}2w%VOocZ;=87x%z*yqh zf7>pbyu5oYj?OK+j`R#0Mhn%Z>sSyg{fgcyNV zFif&7a<4Yu%-;ON&pEhplyD2SKpDJ2i@N47%Oi_t$s(P@TCm)>d#8wEtt?n|Xm-)t->m1wGnBUR4qJrKyw~?_ zFH_m>{Jr>s$yJqDldKEcT^376q{C5)DvhmV=GO9gSxsA&*SVJ~;-eEKyKmtUZn#CN zo_ZPjJTd~u_baRd1kw9k9@5U>-e@>l~giO3;i4wjy85r*8 z`()ynzd?$VT(ERK!yfMR?bogB9HHFlD+&sl4)te8v2&gC_#H%%c#uRqZSWI+TzxHI zj(?39oN42?7UI+%KvOZMdoPiZTk?XVNReJ7kpCsdbpEHg1a$!_G$(FKqlZ&X!R}2O^g?y#@5jQn-bHU0X68RXW zEsY61b3s*Et>MN050BJ$%#0VzOwtL_&1Z1EgK~}5LwfySj&payyDBvG=AOTTtVDZ% zVd9JKvDhV!%~@67T}?;L?Xfi!7n`DW?2ZsbAy)9&=Xr5Ri~#@!?f=0hcuJ{pcC5;<%ZLO3C&7 zt;t|z__Mv&hXiLBU2a8~&9?ED4;9SVG#Gi^cCSKwh2U<`%R7Lq2sGhpYJD!sp?EiN zSN1Ti#WQD>Pw8@h(Xaf6G?3ViHuYL>D>b;2)(sF;UZX;PZ6IWCx9R}%zH=WASF>~e zHfPLCS!~o8akl{TMm01p`$`-9_AfihLPduR7OK;v4+(i|&AR-}%%FRSb%$y|B*lJA zyLeJ@yR}+xHsuK}uw+``*G@^tRbC22RZ=y)>Q@1xO1k|~nx4?V8E)=sV;|X_(=Yrk75%MD-3&b#5PZ>pFd?W8#`*1cqTB-AWFdtfr!{4v( z5Dn`&KJnv@fmJjo+IR(Yi(2qeskwMS@AM?vX8OJ@a1fCozXIsK|B8oAN8Km7gS~^Z zAwv(j=G0B0p`s}&c(;){2q~82Id9dWceB$@m9joO57j6(I2F7EYQ7#QFnZwQb((ahq|F zu?hIJ6M1(dq?Rq;EwKxNT-b(dfqy?g!<-^J1P9S8zp0sHRfgE>A+e{-n_p8g<_4z@ zDZ9|j{sxvY(7OA+{T7Ht`NqU8LX{9L;T?b}85JXY9&c{Ho=`^41!#(DITC4{4hxRq z^*$uAl{-Ocx5lCWvIUz%%Q{?{+&l=T zb1;34mce*)@)(i`z{U%2BNE)5=p>tnKk*LWg@tYOzIsK;6(7;IlO9QfOS>*tED;hi zTmlb>Q2$8u_G<4s{IL2CF4!lbu3IJ*Zx4*%itfmW6ll}{y_zi%o&;{s@NW&~;BmJ7uMU?ts?=Ss4=1XEHp*N>Pq$e&KQ>}e zoUv87kw|d%5I34=-6t~?;ya}cVr4MG&Ei~XoIPwDVLhO{zh^m_<>^OinX6Roc13g2 z$HgDW?b+a{7_2AwNKYrqeb9w9=+jVoI{1DE)yORTof!9pb|74qi9L02)Q*LuTgppR zr(sV~aK4RSpZ`Z3>96k21?9%e_mu}mLaw?@G8&g9DGL4=zRMSNH}ZiB9CZAfK4+`upH5e%>|4 z6e5M~JiNX!$)E0hf8WzPLxORlLHg*ut34IyG?bpnGnnpQsPi6dpPUiS0eG93xFuzo zj8dJ6AbNQ)rknI6e#qb4%@x}A(XgY1xg$E#Qeg8Ma93|Vdm5R7M;=S#Mkp!vOU1UuQ_=Gsp?JDg2&iO|4bsT8skzMy z8NikJqrYrF)6a~lH^xP$Lj4CUASu+Cqo6cg4)^Zq?tEeEPd{Gqesu?JZzbj{BSA>G zYr;ZAc6?UG<;9XY_x>@W`_yF_mB8(3&6FR3?4^KBooq>0$|4FU!K-xyW1BiM03&31 zetT>%0EG|AbxT=OP5=2|d%5@Etmc5U%=N(aV@KFRw(I{4 zEeIIP>Tlp7;I3QMSU_RT1)vh+NwdxZA^$GZE$dEd-pyrT2{1}Z67JVN#^f@fS3;-7 zEWAx1JoUDCJy|vEs(h{PUji0udPJ(ayGS&AEG2g z{9(nARMz20SJF=W<gyCgS5#!TV^~t()TnT$P%>vvjPL*WBn2Bi2Q#K~STD?snv$QH<_JTS0MY;`P|WPFBi8UnHn#WLk?A^*|>?<{%$KB z|90EQ>P|)yMvxlv4$-(s|90OwqZq*iYFPKY73xYg% zn1bG@5P9nb=~foojF*Fa(eSL~nbVt&kX8pc*bn~bgtzpc{f&5(uUgZ`HLdBi9q?xxY1oo3RbDF`U~O(IV!bX zHO)k4Y2CGK>92=kiEVhl8e3t5d?J)~DEFDMf$yxhCt}xYK(~5_kG70R=@!xa;7W(P z2QZ`^p?ipH0-_!&=FSZ*6%|K|&IRp}%iq^S**3B7LfDf=iyAoHZPZUNB-ni++ljvZ z4iH63mq9TL$p?q9U$gEGwZnx6@_fmSHJge}HE-W(gg3WZ{!RP7@Ewu}8&=FD=CsKs z!>F?t6xI>2JoJHG&c0Iwe=laHw~*D-*{el!#?MB#i7zVKe12maxK#YGW_>}G>6w?8 ztBsZdZpz83Vv+-u%bHf4Gu%xv$-oy4PPgFNZ{%mQYR1%oK@Ruz!(v@c>m!;Bmex#` zL%{P8Y5X6l+xA0Q8(=p%i2ifyX6hqzQCzOX1q~x-b~}JJAG|yt z&#Q0XPC;#g`)u>ZKe8$+IA2y{yTp3)ka6>Iv%55Hvn4%3)Dn3~rN+DN7|@h6Z=jfu zVXUyPmO0O=D`=#7h+O_$kVIhGhJpMy#D%R-ib7N2{9!vG)(kHU`*Tpp!EZ0tY}m8q zbzb~dD*e)N&=T^Zqw!wR;wa@qqJ0Go^sX0w%lV=A`jl4cL83pn;4~LR>zJaMA?8H( zc=W;xc()5_y!za%9LRLD))Ov3-n&~d zbU1Rm9h81|@1N>kAXk)2nJcd`coKayrD~^iuzGD9htDl~p%8gNIr}~B+iI>nVrzID z&|A}&dlmvFr2Sk8;ZZ+Ja#lTV(Uw=c>^aY9Y7;(NdZxmpN4Z82dVYJSv$@*ob|yY= zVn1MAlaJN!wOt1T{94$^fvQh5B25BaYJK#!tN$pLz4Thc+^39&DA3vYX8udK3?~vx zNVrE3LI~Kv&Wm)x{(HR2z|CUxDff(q%H%e_G}pv=_$iQ*aZx?j%jIjU5q5XZXeI`o z95eQ8U!)D&@ygdEtg@?cD_^s#rY?~|z}J14gMX8M2!kk?-jUU>svnP>nQsocuo+i}CVC5{2`zNUbzhzI{sSx$pB( zg4kE-Aq?_hWci>C=|mA8x0QyyzZ&pY}#Gb6m z!xDzfEAlsH%#$U3Y^jBG@t{Y+m*K&ylSvSJsB5}6f&o!9GzMe{jjN7p{VNAQjHQM_ zO+(l2{T05vr2hczIb4x(r}Y_h;=)p6>l1~E6X|FS1W4Sx={;YDBUE0B!2$ z-Y|$jpXKR88-<;Nq+`X#jr6ppPu1Jos>03iD&0GQ8EP{arU{GE+-{}G!Nn=JpOjqr zz@l9^8*pk;MaTH*F!x%FH`j29OPmM|g3)q?&T-+YOfORP3D&+^ zQvaZHji?s!kU5hWBayW1hS(H zv&Ir~G8Fufc_Ci-2oZZx;0&syDYFQjAb?0BTJ*PB@$eZ()NsPzv1OgjgIg>Sx}O{4 z85MghE%w^Nm?5#+3?Y~*OE%$iGMHB!n_eUv2i0}>i44Q0o|mz`lxSGAIp zT`t!b*$^;*CwGntT(clE#XEtnG~V zJkx{RFnr3XVEn3Gd)2c#JjRR=<-?6oR6EvY<1fnQ_`{VTzd&e#(eP%7ol8CTLQSbzWixBX&0R0Z~nX`*Z86Px2lTzJ4WIL#g4jlyAZq^yI zm6x={Knk6)m*i;rdj(tr-C;i=Y6HsiWlJi)hdp_>6nM?fJxLw#qkMl*D;75y$HQCt ze5TD2V~&wISlnYi?!fNLG3ab~l<9RzlqGx!RjfMyIiFI)z}I4;L!~>c%Ehch%_&xbvr*guD4#d+8jzy1F4d3mRq3x^-yZN_lu~*Sf2?ebs9}i zkHd3j9Q`Np^l{%pZv8u)`lS zzAS&@=qZm32$5fLMj)v-prnIpyt{{qE7U7YHfPmxyq9*oQDy@z29v&p7~GV&1i|16-oE?6XL;EPBfy2&hrB30 z=9rh9ChqA8mgi%Uaq=b#ABoBOVW*l-B1>aOZ={0?i=6|pRHNbw)g+5m2 z!*K%PH*U}FFH5b*qKwrg5tfa-QzS_IR)Q~HJp%MJ)rgU1V&e_Qxl9C=ald4vhj>qn%`l0 z9;Y5>xAFQX`mu{yBf_K4gM{XNyuP%{j0Gp^SU4YW2o*19-F+Z&l^gFZ@F$9sfW!Oz z_(9{l$fYl~Xz5zV0gz&E$2sP)wq7~SnicY!#`aHn$lXn8RI7i1P^BUR#_r5wV}+k! z`Q((b4CBA42Tk&KC^AEvD1@Mp`Whm=-2~YK{1i>2kyb9;?DTJw#H+QYamqVyhWY0P zNYEuLS@p$m{sINWmE#lC2+AAJ?wOy^9moFsF)||6!)7xfYFBp~COhxpA;9T0n5h0r zzD2(XIN%p*CEKnjiF7v?9{lqZ9}r`1@CnKPFF)i&x)#oZGGN0kUDp> z2F(pIKR}8+>`O)VV_5|70tBt)m&Gg2u2W&VEJVL^o{tyv=6kP~ zoAjD-W|M@77MvnU;L_JM4X|-V1uD6{fR8@vTi**S`S>6^f%e5QB?ZT{3~ufu%9!Uk)g7MYvP$lnN^UljFN{E- zkjPb+0ud&8J{1CU@^@JIf-3b~nIY-GZ;&BM293pKZTE@}q9YpOBLChp7k%!G_txb} z`AiuWf&?p3w7XY%clXf|2$&t7op}te_#qzeTx~c#5yIrC^Hf;S{@6s-bbP?%!KL=$ zTXGxJ*+uD!TLyLV-4cPvl=K(3PFOL3j6X8$w@U9s(xSDtd`m>ufcdJ*x{KGFc+|l{$90mYLGh*Gtm?E`8-com04Fj20TBSY zr&)U)T4=r%riNz0JJ_aTO;EDYk9WE{9QK2Kc`a5JbI4QNm?c0-4v0cotN4dy(=#V{}LXMI2kfcg@3d{gR zNSuq`qk*nl<&XoH#ugA`OY0n#fEghBEAGC+iU!cUtU@{&hA_IP#jI8xByqfdM5Nv? zuzsx0uVgM=N0cq7V7ucCoc4H^Bo8Q-j4drmnGAqCAtvtrYnnKI&);|?fBP&F&SbRt zrwh)l2Zi~dTgUfk^G#l0=O*eq-Q)ISi3th^$K)xu76=a^+}%|3YvBk5tqz4~!4@8J zlFN265e4e=Yg_nins0S6xf1?FfC9~Fk$TJl>vHjcUcfa1DvvDhtzX$-zRyC!BD5S(6)tHm`$y+t5Mv)S@Aer zhbxw^HOiNZLO~LevXQwnXtM_-)k^KybX#NOV}s2k83gQuuL4_)%=ZqJ2De;3xv|Zd z*i{YE^O-^^CR#@i3eG;Ha>gyJX~U2>W9PPi-BTo@i>eVp0OjZFK2t*t+9ES)52@j8 zubilWq6}+dWFq{)Ok~!jOMMOPiZVP7%aP}qYq+y^-5UtSGM3t6ez)%aw8H2}S$D(< z3xyDB+<=QkFX_L%gfK$}c}zdc$N_B7_vFf2J`?^zjyy=Ai$3L2nf-BKY1Is2MQ2xo zSJ@H(AmFcw%Unuuy3K6SwGwdxqh3>n%M0~rk3N&H6TWKZk2^u2A<3NDa|zh`ZWIFu zEIdAhrVACUOfflku9>YlF1O{~l0pTxgoReF(2D1X@sa~#_IGodtgS&&?lSb_`{>ba z@a{_83uoPpP>X9E9|&8d_mh&-@VhTjO&Wre-}BF*XEg)Cz6SP#mwBK*F5~s*p zCIo#1;9+(mB|<}iB}MN<7%*Y1cVCnBnD9uuvGGm6JOdE1q>S%c)d0gUzcZbkf8h** zW)1Prh=kFk!Mg$dN6e4sSWa@i4edrs1O79X+9@^~zK;Ux@KE5J%MtaJ#Ndu3yjl-= z4og8a5MNQx#Jf&~(S#NN3F&gd;^A&}BACK-u(T9hj0OrndFmwX*E2+mjg4)2e~F+) z-**IGkP+-`$H_EX;w_k;*73xbLE*Nj>t!IRVG-U(P*4-m0nAE43(E7`T61kY9Fi*r z%rMSz6M+V%Tzd%d$8bCYowr4A+0EViJLmSK;GAFvV81nPF~n^N8ve$tK1kKdqhWYL z1tu)^B~xGJN$K>)7KoviT_cCw+in8cC9}^%$bMia`cvSZ6+YwPxc3YR)gn{Y);NWx!ZyI^VejuWlDXvRpVzl+!%!=w z#CCn*($OkHS|RsneQ-=fQsLO95V&MV;ldFj)qTZ%zQWc4@Fj}sI z80kU+w0KTid$yz~Ok0LBdod7}zCwRrm>6ztz*`4YI<&KMgM8XA`ZMrpv(4wFCTu8)nGv#V2{Uv)jO=W+WE z=$+2()DBc7h#v&Jd~F26Y`K6!DL4H>b2i72oha6cQ2U0tM*?9dfiFnJLBt+(4Y6Q4 zl!L8k&&No@98fO5Y4-;1LF}6rEUk+3RAb>0=GDkUF&DJ7M?YNmOYDIC-cO+|RlX`5D z6FHJT`3B*0FsdEz9C^#M=()0%|5eYy^qp6d@SCdE?Siv|o)_g=+`*?^TEZTK^hVm zUrKa){gHvItyNli)!bn5jV=)_FZ?jF zo7dHzFYnW*f4ETD!JA!i%O}}Mz+v)O83pgm5*q{-8bjy6vE|b0Epl!R-7Dv7b`=gc znX`TSK5DfF{~HWEM$bv0xQfCjfteG#Z%UPX)^TA8JNG-Mg$=91x0b|d7Q#g+EvxfDdv8$kvUH><7ISzWjCXBeU#Kmni$})!8UhOJ5l>c{5#{j z>-BVSWGd&WBGsMR2OJxLdi6a-jI;<<;AOf@myBg^ zpfvy!bp1X_D=oQyI%x<)jp@?s0A7L^1Uag*KU-ja7s*C`91r>Bp!^`zh1Z1H7OErG z@B61CcTmi-gH}jX>@p-H>oq9fm||q;?56 zhY-Pxv3}u8A!!@@hd=;0pL7`D z&e-v+LjKeIx~%muh$PR?V`qe1F{BCN>uMG^4>L&o08ha1hC#jv;03Us#n&`#8vlWb z`mNpb^uu{{;y~>LmF@U&#z@o&?_BCWZu~y}1_c>V(ko8=!N$pJ^h?n2**mKKrM9`b zi5LIi=yJjJ?C}Q7!Piy?a+%VkcH zh0W{ht@z+`Q@O?US7Y2ijNE{2i@~GU3@B4qj~Uy&C>}GWb9|+iLW)zF1%Z9rL_hkY z21yI8Va~Q_Xa&CECdBvMVnqKttLZ{S;xN=OVBU7=M)C%<#pcV=Zo;K6)@tBNa1-ChWU~B@-|G~lZg<)eLyXRNBEs*rymkK2@P3_ zCm$QAl|M-JgUSN8>Zi54=sltUGUYtD5 zbN;k~$99C*Bx5mQ=z6wpMf6;Rqkko%Op%TKvlRZ#t_3m&Q%hm>{l)ICYgi>CKH##| zj`N44w-hC~X@k!%|U{IW~$*L9j3Z>;mZKvBHsNyLC!% zA|I%UQ)?zG=j00l^T7gR*Y8Nx0;LqT+B01AqfUbgeoL^DryC3m6w0H4ctLuz#RT@& zRqwbJTeGsepN*~RmCBt_4UB|i3y8?$ln7TnsgwkdT0GygXC04Nc`aCF_ko9k<0b1 zJdt23gWko%cRi6&`rJv=SFwq+q||{p8k^ff!r^eV|NVvoh5hE{1e{dAcceK#n>Pye zBr%?XR=QDmS>+28vO_GmshEUIlksC3-u%~rW$NRzT!CmJAp`L^Q_v@?fq{XTU)P!$ zI5nce^v<|vn&`Zv{l!@r!w~89ydkSt4O2{E+l3<=6hX)CT()4NzL9PjuS)<(d`qWm zflWkQ!q)$E`~tUI`!auDfKkX@jo$awG|;>(y}cdA2e_1rq(Lvx$Bb_MtmlN-L)Y*I zE9qB_3Mt8#R5wzc3PVzhyMK7ldK;D1Zwwu-ORv#ie;1;x`a1pc_7wj+KY&V>cz{(i z%fNfpD!CftIgH+y$?hg_pzGe`7sc9S%>c3)ztaPfg(br>J#tJYoJfbkhT}mTJwX#L z-II#Dksb$Y7TPg4Q`z(HF%nh1^vs1?zk5}7%6*rTF9%Rk2*Z)n^Pr$KldI)&Ha@>6 zP2oTvd*_&dJ8IG}df%JAIaDakp1R?O2qO0aTujaeCMNzzySP^CjqG8LA89+#{J|v= zU%v;@8K6($kFl}V?=g~(60ZUB!m=@V*iJz3o98%ON~3R~sDpRlBVgRFdt&(}+_>_q zxrTzAkJsv!0@m=)l>F8WTm}k0V0rNh(x}`4jvr7a7_t@v)^&s`qvxHXUZ9l1Xj=FD zgxCw3dWyPjO!S9(YN}*Pd^6gZvDAoiy*%e|=+{w?N>@>8b0n4(*%*G^gV=UuEgrji z2IRpK+i@TY105Ld`iN5seg**OwBa%?=uJ5vX=|6IRtju59^`UPcT@HE}hXYy#5#iW3`qlgZ(5?Abvw!EDk$jXz|J z?nvzg?uD)48b6V#ypIID0nf&3Gd56iFsHgn-! z9|{LBGJDZ^{I=KGbZ|?P%}207{q!#n%&5gG16>#pwmnyQGlE}Sy%q@v2+$Au{L3S* z73@z?n#I~Cnl#uhy_Faux~IoA)|@-=Y4P*CwmfG z7V@iqj!0Pc5?J1F06w%PT}$tZX$=)4Uz_#wvYD4`Xl&!jcqV#XC1X3}gSd4X#5MHk z{=HNiJnenPYzlsjgXB8t)qCZ>)8ltkKocuf-%$k>zy|Vbnx$3Eu4k)uYdMU@E2bvTExti{^X`cbtxc4<~-czjZuggZ&6?V-)iFesQ(Ju=LYE43m0^Iz?bfTaDXdk&SO{k+rQ?ZXN;dUf^wh5^dQc zGB|HDv#Q8TexA+`3DguAl!27nav|E@8wJqW7-0CDzEquY`q?E)-zS7gOKdnSGTlmY zo?X$nHMc|ZDAktyEl)iD*E>A^j9(@=V70WeUARNwYDgFSyrQD*R5Wd5DMDN%Q2QQO z)k9aaV4Se1R=f`-J!0dJx@EKcPSuH`32}W$nHj!mg#rX@3g`Us?bHoHKv*!F9f_J2 zLjLz-Zr8v75lZ6ep9Njr=EDRlY@8b|jpBq|jlhS={tQ%n#vj7u%=#O(Zw<(uuZdEe zSFIr^fU7zGWVBzW5a-d8I0_UZ{r{>-l%6}%PNs*NCMV84*{ql>?}#WUem_v2D>nbYf`PO zmNC#K#26KKtHg!JR}X=0p3CoJ3mjt>^LlN{8LE8;VLlael73^-YcFgaDD0rCO_0~c z?p1jV;OpN)E_X9F)&WahEyd0QDfkOCa&z_G+(h+OH2hP8NW;i<<*HoC;juobsIOW3 zBJ%Zg4~Am1^(Q^%t&J2<{mHc6QepG#UN>KJSnnMYIuosHlqPPCPuGDk|@0K1^7_ZK-1mn)F+_z63#`c3Q~aU~ioxPQD(c(oGE5)R^1%W~bj7DBehp#rqdRc@iD3la|LWhL6SUOiWPfD` z#=D_^(=>tP5Ujd6`+APyWFJoQ%C4HAevFU-eC?*)?Sq zE!}*M?+Dg33MJtplr@Vd+zm!|y`if^H9hhqQH+DI&+y=qn1UwRye^mTTyY=6pWEjg zpU}V{bBY>H?xXtVM>JC5Pk-Ml=9m1|XBQkIe=+|~|FI#=PE9W_-Q8INn^^aRh56q$ z=8!`=^z@apvGyRI)%WFvR6zvLFzh`aWH^KY=G#oepCR*}7KJE3k0+NoGT+`y+V>Vl zQvYgzPkIO6pQ-!}M(Q81qVG=FdO$^=gRwB0lo|pC^5hV{^^o2HSVPEHTyTp)6LJTG zLYf>D@w`-6!OmwgVvJ0qBC@k^nd&Ff#xD z4*uWUz;FRIPeV?oKL4wo=wQK0S?14f!rY__3YC_|8%nV56zkfFLQIIi-mSs~rvg-E zJ$G1f(LMtgwHiW|0F- z>DO?}rTd`4_~WzQI4h~SGdC7|d!}49CmSE%VaY7sl9LG;En}2H~xDbbzTn;L^+6r)cUJHNJ!|ubH^wEx_F{MH<2JGpV_``S%yRlL{O|s1Z$>s3alovFQwMiK*9ffM96sX z76_{8Z8<~04RTMJcn~TAGEp^-kqG7R-eSwK%Jy<#D3+I zgrWO(%Ep!RrcsPj!|*>V#&*Uu24rcEIXe8`?Jqnve9#6qNdjKU{lNu4V)-7skYOG0 z_n4?ON{P5$q&*IwWv2bEIKGdNbuQV1Bz2AsQ3$+WBBt>LZs!dk-{BJ&or3de(K4qF zp;?cCsxZ?quJt`|c>u+&y|``zFGz;vD~Ny*9Uf0tzY0Zk2uv*sD(Bbh>+6-=?_`r5 z8v**6dbZAG{e+Pfrq1P!UbE@E`LEhn)+cQzCjMsffHuX=Rgn-rVekjJuX}tY^gI7p zB{f{Rs+P)(Wp(YQU2Hn=%`h&PHQs*tb-T`Js-?~q>y`m2H6W%cGx_?&ga0@-)Ba&V zeE-LPk^nx`xV!fNj@2%Vx#|k$9tHsGP885A`E}uD&WhzyPs+R|m&cye1D`X>Qfbi{ zM%17Wm>$pb>mCs7DEDO&xlW$$UxkxU{bbvkpGkRX1mVE4a0-2Oc zdsj9fsK_$(2y%RICTpnAI@GMq)OdfmLj0OtqD>Cnw!XYPz?_J^ug5bW>_Zg%K^(va zcwpaM-fETw%s-t8eL~fa z%16iGd+i_RoAaM34&sq#ro3v_qGqWYgA@OBT zmrm2TN{~)QAS0=RY6qb*!TKl+{ZS328}N5M##I)j%Vlr>4_RN~6=l?YJq$y4cPS|? z9g-p;-6h>E-9sZFE!`*$GJrI~AX3sG-2&1jo%21s-@Cr=x7P0un7Qk@&w0+-d!K#J z9mbogIJIB?6gY9+hbQ{`gEb}`8TfaB*PuMm?6{eQ-d;vXF>7bSQG4f(TYr08q_(@i zCqj~VC@WaQy%$CLQWK*5ue2x>Ed;j@nqrQUL$6>GTPlL7j6@F#p_U?F6I!z|(A^bl zM6BAqacc>Rr&0;?AwJWxjlJ3JNmD9O@A_1?tzhO1BqsO*rP_fC4IzyBqUo^XcxbC~ z5}i5d$KkWs=dvtadIMir@^Ee0G1vq1LWuN4q`>7c>SItDy!?%(XumFD5<6U(k^MDC z=kEID(IM1VgTNy@I!@w8##1t82A3o0t9*`hmIK$azy$2q2>gf8Epq3vHHBff=IlS7MjCG61)??nY>i~Vl zsyP5oFs@x+F_D28xrEIx8xW**LIe~JT_U94pz6|zA5G6f^@!*h^vCkN1)2h0*yG2_ z5XDqXt%{xh(<<;14bSr~TPW4L_;X|QwbKGk5#$ZgCePlYq7(zX8L8nc2}chp!(>ta zZU{9hmDZa^Yw+5QgV`sB!I&FDl>Z* zN*xHgH9lIi89K$Iz8|aoU9s>25lb0Dsick^@)h(9rS4>L5=Fh_ei&n9O*WQueA9C- z$HpcqfACA0+HWSm1Aan%Ss;Yfm7$! zG3n^v#Zw0vM`!TfAFvVX2SCOlu**K;0Btk~akT5(vD;;+LrOxa6SMWsblrF4pt8=i z5mM&m;14VEyd35svt9NkSW91W3?qq1YKzM`DdjM>ehp7(ntSr3vJ-{6jRj4V zUUXq@y+7k3;(iTQFzY3dLNe>c!4O2pFwO!w-JFRYbjFiRt$bk>d?_$>l}c6+bRHi2 z%s;SmoLPN+U-zSA7>`2&RFCWMpRHGoA+g+G^VfiFI^4^=>qp?Oq1$(fzX-NsON77m zTGn0HocsvBAw0nbKoolx2ouEa=LvIGSR(Hb^Szgv7BPX&FR`rQ8Qg&O%_YRu1T z4Fg?DV)QjUEX0fIM_0Rl&6SN!D4N7W3pDw-(X!54_TRM!E)e25Dj6suEsd=~{d6CS zhx|HY$QG`YQcp?#*E%y1ss>e1Q`klgZetyC*d0FKR2ejRNad(m=Hf+cRj7@K+^ljE zCg~cFXA;sHS}qduM0)!>TGQDR_+zd15TCqt@8II}-vH#$%n}q(boab-6qY(WDF6)N zgijk6BV{R|u=WPyLoubp@zSkW+pgWH6???23Xwb>;vaW3nyLh?^ImY$UzGN*dP+%u zZOwHzV4V12$na6PgS6MJKV*VbB*@}~H+?vN!yu2mpnS*q-J-3OE)gjeNBCyaT zky(1DQZ)gPfgBmlRCY>%*|+_xr>fzX&3`9}WG#`=I-Rs%rWO)^@TlIbWV+)e6_!$S z)+$VUmBeelA#G&q(;ol~&%3(X(3-L>j&DaOBo*gC-kU88T%vKy10jHd59Aq4a)=X{ zumuxoD)xd7$NN=z>XD1a8vXp(_0aYx^|gGyk8ejXf*CgFxOP`YC9vI9^~sy2teXJ_ z5oYj!N+RsmI`_H{@yBef*PU4f9TYs7+7<@7Gm4(z4ek;cfZO&@(&qFGL~d@Ca$% z4$g(~hs%)uStJT%Xp)keT5HFt^LL}88>5^NnjCozUyP^sAMq4tR`f6mg|(Lu;i2wC z8yaV86-F6ps`q=>dJ9whvoW7Yg(Qo!gvwPiC#@(Jf z=&7w>5f5|Bv*c0t{H9UPuHCbn8E&%@ePUpVxF^UU7ZE4-Jd}#wZ6$e(O`y>^C^Mr+ z41g~hqj+`r7i9FOXT} z#8;G;UwcBIjojc$qL*Mka6R7;@*{3#{q0lIBt{|z>Hc;zvrK}cfE$DEaTDhVV_j~Y z%P283;qLnO*fh7< zJ);DS`=Gqc`f(t9zuX-(z6EA8s-b2ikH|dbxs28n7zs`vsj+tP)UCC zxOzZAGaWeZ z5*B!WpR8FY{@2rAlu-`DuFWLEO7g7wjxq)5UCrxp@g(9+tS|NnjD^l}>{#n_67!^U zn{Kx{=|sh8O1GY(A_AClX}H-!K$oP=mR&SwpvEshlrMg-#~d z<(|aDm98yK_<4nN}14B4(w67__xvNBYag}Y5E1y3ll_f#qv_i9$XVlX&<${^zTO>_*^caqP@&u^YZ)8W$NsZ2~G3090liSXl(@zzvH7KVX> zk)kGjkz0<3yWT5~ZN~xP!a5FDJu6$~X#Jlz=Re=J9>7D51x+t*7rmRk53b8uW7p4| zJKhvoiv&b@Jr8YEd&1h1eRDn2((qd&ZT%S%Ze7Oc5oUta4VJE;Kb!g7kv%Fx^LhD# zvQzBrwe0w`1LME==UDs&53YTSlBffZVi0~AvJ;bS(nP(4+cCYOD~v<#W?PLkMiG#` z93YS{UOmp;ZL#o_kqQYqbsj$Nwz~?LqQGgo*ZE-KecyY!?r}%lJ3+4?$ZfT0VA77T z)|c)y!?Acws{iAV4&eF(zCq34>s==sQCs|kQs29#)eLLf`HWA@z`$cH>LXL>a1U)%9uyLV`pS+FI#os1L?bD%eAGQ%x?fkYQuC@55 zXJbX;N8(^r<-o=;7DF2R>*QTtbLHMKl9x*>JOlk3$$f$^ua>?%lFN95K5*(Nci(=Q zl5vt?Xl#M3j0DL9JJlt8<)q8brw;tL^*u3IhEOpq1DQAd$|>Y*iLeQ?N(RUPm;iEW z0aJ@dLP&E$R_R&?>Ffdui`lr^(OzdGi$CU7)~1HFbn)En(<3jz_n>tF z?>htM@<6zuOi^2DQNCAV$_<8DlCm%2n&QTOUqP zHF{{2NhGlxB{#auG}*FC$;;8wJ7}(Ad_gL)Y2Zd_K<5{r4gIx5zk?K5qn9B>0uUM`Rtu$CRynuW z9Uz}n{;Fw1*CcihR$(VoqglQ4k$`Ugl`5|YV%GTLH_A$3XfB>H^s!@4Ffbgbo+$t? zGgEwTX{}(E9t0k;X=z)Z#rLXs#5r_cwQN4_vbkq;93dW^Y&)=v7ZvXsPn zo_61`>kyAf%aS`+{Bp^Zt+*nTuTU%LnHZxYrZhoj;wC2bDeyj&0TGCU`5gxphH;pb z?N~aVckSX0%SNj84=yc8KS@6-+TA59u5H|bn~+}RG&SQ=WD?@<4?6_+M3fw2VA5>I zpW+;s5nW^?WrQ}vH!AgdNnJFLnOJ`F@?G;Q$Y?^s+)Y#UN+*}7ay1avxKCk?tH(it zVVn>$zEpqMlP@*dwQ|wH0<3}CDS;__~>!}K9EfXw4H-) z15&@!!X81#?!nOco|2Wl164{{ropuxP@4$k&&UfDNy`*Q@zFOzKLu1mAWH*92gBS_ z$4d=9F*oPetXTE#27GWvHk1VjIl<;I#809kg?m+na@(m3hb-pq`z}&kLVj{skVbe- zDE`3?vq8O_8tp3LgDz!2H$Uc2Z5ft_?k2P!>wjq+i`wVV7-0)fb*(X;yvav^u)Lz# zSx~KK=AG+e|7S1gZjI#Rh(sT%dB$qLrekv&5Zy6A6#Lf+{thY z0=M>Mnt0Cdbej=>?+(1tG`JFgL9Zud1%Lb|aFL*G-KT0V;rpu*HRn9YTt66Fa={^T zB%z!b{&+L^|;%URN7*@M2&Q~3fpV*tRGDrnP zHU*zmFiS>{C_cRErwoux8qDIkQM1OJFDff7>%a7%u6^OHM@;zeN%6y%=1LmGSNJGT zr4D5vl9RVj73;51O(ua)s<}4?T&cs-R{;xct~Z}n>6&CvjQSUNLWeI=pwB}|-U3yK zM2vq9CLj~iw0QVp#9vHha@V_E7;N!?I5b0qLh&NAU82oIB;L)^%hEDVzuSmz6u`f= z|K{WBm$}W@pKsgwK%1?cS8SiI@P&y7?|t6( zA4zUQ600)RluK9=gMw`QcSLkai4(VN~H= zBO9>c(?T;JL*8(gpE(Vaov6H#;gvkqtkC}TgT~Q>T~i2(F*iY?2nbH>?)oqd$51I* zkL~5Web<|x+LKmnzv%TvgB-@r5`(ErE%*o>fn4{|mlQfqEBK^fN38UIkF9 z28yOOXG?=nwUJygVG-{?V#VeDkZw{7a$VFiN&WS&L5qm03V8iW#9>0=X-J{GgPPj* zozl%uxQ7~Iwq2otrx%ke((3y@vibI#7PY|tYDAGwi~OkjnUVyjMk*~TIvi1Lyg8DI zVaoN+R#3Tm@O8T0Oze8v9!@5gA)PrBe03{MFJm^sfd2)goAkYs4@S`h`dXXbZ_2gVH%1Ua zFHa@(UH;;A^DGPffdHXCC3pwY!k=50F3JFU@u(pCwtvx=Ex4J!!h1@2>|pgQ?}|8X zP@GW&gCND zuuTD1Z4<^+G`QuI@OD3GUMP$qlp!b)F>(w@8AJ0E_{R@sIvKK&fyLUtaPFM~@0VyZ z|1w4|u4=_4sO^Zh>i&6H9Y_jifX9Z?qo>T)p!!?SZ{<*kJ?JB{ULoGGrh8?y@46&* zZAp|{aA}M`JO0#?Ji7K>!R+FR9A3mzH2IWs@I+j&jJwAq1fBo?BG!b3g3j{~g9;mMrgS+2L?%LL3{V!6JxPy$ytR@o1{%3_ z4vi@d%!su4dus=hO)Ll_$q*+#_<4;-xr0!TddknOX!op7_L>f}dCgt>i=FCD+b7ZLs^?Xrp0w)syNW^he7A0+b1f1D2-Y&SUHkjs;zd8+)UbAXuX+!z57T5MQ zBg1vR3mgRE!cJ+;>xoqO7tbt-xObdb`7-Hwk?|l7nR}MGH0H|YMbt*N$%{l>gNg{p{(o#* zqe38rG`K47Y5Oh-eqM63Bbf?!yrML{0_M?u3s@4AsZ#zP`1j`ucQ|KzZ^do9`8!7` zusG58$8BEaZDa^9hwGJm_KNy1TNdViRmAw=%Q&46+4R3A7X5`*AMHOh;D=3)Gq}+z zoDwp+F#$>1I0iRg7OclGj&Fou?=JJ`@Yw2f;I$x#Z-lU ze%pnqu+I-c2Rp~0wqgGITCS3^=@22V*z5V{;B)KJIX}1G4^A4f$ALrO;yHQy|40#f z3_zyQ0j=9Jx}ksx6&H-y`q&1FHC}n|3`*u@Qv1GGne>wE^{B7Vn=n7bJmK=gWMn!) z8TXQ9@Bc&NdUpMJ(RAf*v+PCW1euv5$ec;HzA9A3%p}J2zv51J%1>k%)t{?3 zyb=Q_;=5+aa~+d}qZgZJkTI*fhKkeA{u8VV#Cp%GE$rDB>0Y+uf|(f=1V2`?4kGm) zRjQnC{n_l)ba5&-X5Q5g+&@PByo_g}{qh#s7=mp2EcAv@iUod?@?$><&JNks-?%lk zcUXLQAFFe1;d1c%{AY4)=~-5A4kIvvsVtHw{so6MPG*+wz~;Aqc_7nntlAJ7*(q>G zm|b^7zDgq9bmesQ;v($rC!H96oD$|3LN}F%zdF7o`~b@R8V_>#Z4R*U@b__l!b1g(6}KW3ZBN49#S z+ey&N#qRvt$61LfPvHxODz?*n;MqG<0Kml0nqsWP{12YEPf!2rv8MRBH&Kt~=FZ7P zKXadIuqm+|cSM610W98GaEk8WzJH?+JvT9X09H*M>%GkFQM|FXLI?d~sF+Le8m%nn zD`~!uoNF~<2NlL|Zs04~^Es&7o>hfUtgPH2^{%+dH~u2z60=wRNc&Lxdw32j80v)8 zkIAKew~xO=*YjW^wm7?L-iwB+6+*(yga2_E^$|2;X=zIVczJP|TVGuSZi0%ztU18QBA&*TC2PPrcBDHE>$&{pE5!G!DSnle5yq>bQ0|PXo6FJoD`rid6GBG)Xqkr8)aNW~f=m84 zFTAf&F^uzpSI#wtIz}Ig1p%+mITtC6-6>hW;UX>7%=+D0z?@1Xub&Kv(qBn4uLZ{S zYR3l=GD5nCSRcL^n~SWhpF#xds$XdisL;?*%_Eirxr~yWx`D$9`wSYMB6`kfb?g5D zOCT8bc-=1@xsdm*#=K>e(9c$Jf{M>%hm~`0kIt`m=?v-~os0RDCOPn;pmVWN3D7u! z`ZY|@0?Cg;1J#&j?~ZU1ipPOumd7yu)G}e!XRHeiE5~?;A&%5>)2JL|7}Ww#sIQTr z_YvUHKr>Xo>*jK7E)U0Nba)e^EAhEaDOx@?twi(evFpNMT*@NP3%PH1+^m;xNo_(X zL8|1mK2~vX_M+dLo93aTxqR`|$=r1b@rx_xH>ERPS0?{#{)3Nz^ImizvkcvMPio+| z%BZH-RDw|Q%e?5fk>|r}^JS7bxwL+U8n2s&s8(J}g9C{E%$T%T_IB!zNPs-lYgCZT zPHg?CP$P(bhr59jG+Qthr_lsO6b->g(i7YXs{vAbn6 zDFjsIIx{1ciZ3_M{^D{iSvH_kX~Jfn?!!{@uOz~;Gfdh2>A{$yAh)^_-v4yhhVTIm z${N1buK?eQIdF3MzU!lsl7ZP;*RXYuUM+}0aqx%(h!55J2p$TG@<-DJTNDl?Yj!~p zI?{U6kqU6Wr~Y&QrR3v;1C!XUXTNAiXhL+MoX4s&J0tPgwXCnpgLxm@|gFNK&ix ztRWa#q-HKGa&yS~Tp1~mfi4jn3YvVGppiD2A~QQjK|Vhx8~^j(w-fL&fVI=36N66J zq`a8$czfHB#?R8NyY}~YHGn>6phFbm1ZU_QH`1}@|7h{(7Mc=P$P9Bx4~_& zWVJ0I5|nRG^mle8gpAF?HvYc5g3i-Z*KBEKo9+G{lqpJjpB(t}=+ZMgDSD><;q&Ib zsOMWm=oW6dUL5t9h)zZ`TCqSArC}R)&Otz{dNqFcN!wMgk&py7P7c<1#3Sgfq>}yy zCUeNDCA+U1%>JzsJe!(Y#W_ck+Kz8<3q#>pmqJBWs(o1{Nm$R+ z-$?+HD+*}9S)#Oo2mbLPNbA9`YThjd=Mcz>DW@(C@$Wp|@YW}h@>Y&&{5P0vT;c98hL@L-1J zsor@k)yaz6{FdR@RWA9Dg)~qB(L<&Ef?E(tK%@2(ZIsbv@FB64rBqFu?Zwglflai=>f9b$RqbSHDiq1C;D z`&zt7hmN;GW^v3T3NC7H4IEV?JmnjymeE}p?Z_$A$FaVF&aNbKdQJkDIEx=4q}f2x zBh6+_Z#G1Cb7^kpT!J0qIgR!SzGL4T+_hZI%-%y#*uVS+3=Y{8?ne5B*mKw&Pg`ug z6aY0m)QUhf0ZEE~=xvnluu1~n{qWI==Ui@RsY9AOya|p}ld_A(DRuj6_=JN{e-WaN z3~TBq3-F-;b7gcnFOH&hDmQel7=M-W)vljhg|10z@)5~DtDB=DH&N$@-I@ONzV~G! zqF0m^!Wk*?pIxM0Ntl=jMP^Kv7}8|2U@jq`dDs5fQfL2ATf50+wwMIheCi%*s`rWN zQX)xEy99rhoV?4y-u_gdHKDbwDsi#ByLpYISTCP@w1$dKkBqc^0Vp(0Cj6k2a)SgA zvw1x>ixDo;TBk;S7UhywST0hx`jB^QdZtpVKAWy43udb_;Sq=rk5-}Z5%@?8ANx9v z0;uD9eE{I&8h(HJOhqTg-TXR(MYZF8jG9GkdFABI_2&?_pFE0_zb>QuE1!eJz;IV& zcY%E!b{|^WpiT$Iqr^AG1QWMb%)%UCoWwJ!sYj-qmf7=Hbb3@Dmvgm9pTi ziVhK)drVjN>_N6h-`5(zreh`RGYy-G^KLK8Bio`^rnYAPLpS`KEEh#j?HE?#0g(zt zrl3+(0!NQZmEU+rF$^@=7ToPynBP`^@eSfqTSO*iDhBbOVIyk9p3-PLL+v)MSl;2g zcgIcbi>uNT4&xgZF;gtTH?5}=Q>$9j>a{pc3A`Na@Sk<4&Im6naLdUDqwJ7{PN_G9 zay~`+)CJV9&U&KyW&#eqO=X|ykbr~b%PYxP+_QeeBNtCl2+N6pXf96;?Q@ZVkW+2A z+AW;JSke6XvOL)YJoaJ+v$|O-ryV8^ajK&SO?mm9aa12K#BKrXBPMe30)n>Z8E~H? zph8sIuXcZRzL}N5uuequp*mn-KYmrGD+0ECp$w>L{JF+_lRFp73q}X z(#~D=tn&Su&RwKgmTSn3=kE^4l^R0`THFsXPNUrQ`EGw z*qif_N5exHH5!7ap;oCD4bc~s8qeUz$4V$QM;;eD$S1!(WWj2}OIZ`leNhB`l1c*o zSw;AoR>|x-rq{9C*s>i#8RHX5B0|O$+W%^oVrrA%3rv8((kRw6*FcFBT~lMZ?+Vj& z8`{)PNb0Q@eCc^DiH4>od4wl$n8L_ZxR2@^SGzSxM~8BP91@|L?op% zR}d7-oWfGM_01X+zkPP~*0$5^K3)Oq3F-U>{T@=7HI=lTZV^;Hvg_JHG>K6PlGewZ zHn2b+>o(7?O){^ayO`P$sZ5A-+%w=0Q<~h*_H}j&fOM_UuJP`X(0efPA)}!)No36Z zclj?d-kjW0&89+*Gqb3D1$p^8${rt$Vf_~hPtG*qy^9H3B8vwfr@gtye&#I`c|Kx> zlbiKApb>4je043GLmm~W@E&%Fwg?TPuQ)R?oRWl~hYhZN6MJ>oDRnSYS637cLq1VV z;L@%4OFfBfTUlOeI-TWu7WoJw>xO4I#sT5r=qO$%L`HxfA-cM-613lsotl9;f4VN? zvS}df{6e*4qEwj5Omv)K0Z;Vt-Op-T6Nfh4KX3+huR9@M@$MNV0S_+Tpxc0H2Z>`m zFDK{2xeFE;d*PONT;o^D%4mju2@~MTI#32uI9;s+_~YuaX+PFcLPf-z>kdrbm!6xB zW0GfcEP1MG4O2(XQRJszNH}L=ubV3aV&l7T!G$P1DtTMNMvnb|SIdcGvofw8@5gk? z495Ax2mTs(y*o}&YYFVUnAH#loDsS>KpE8?Q8$;}mNrv;R~1R+5AE4I=QlNrFuKlWABcNnV&t*_obH+xpefaRSgXJ1+=mK&9CeyC=H^n;EZqsUo?lCA ze3LiMUlWZg7163~{s8qlf?O|@QRgCYHcLfqIj<3!X~*`S|D2mIcw78x^Hj*?t3$4p z-Hm5!<}Q2Mztr0AG^;>^R|*IKM|0vjJTmmxpE;XX>+eEq(|=juYjzUimZS*#T>kb^ zVrtmId(*7Ntl0f$74s^tX&LMH-U-T2FzgbtW5|R@01l9umBoNF-eXW2`_^=?&tDg>&iZM1Fn&5Jrv*u`OG^BqHW@{abO1CJove1sF1m_T9W zieUTDqKlz7B3sD!6@F_=VmVSvX5W%y5?CeM0uoy)#coBM%10Efnf0?my=BWKs(~O) zDQmp(K#KX5r9Be834~U`?C`0)El>=#9b-T)TTL$-mr{o_BUtTTGf!MiJ@UzSZh4~8 z&$KVbUf`lFJlKk?9aAC!9Z`Ii%nc@aS*`7Ge9m%y3D0Y)H`eEo#)8O;uMbZD&a6b& zEQ1xW{~vFxS$#|@a+?)f?o7|AOpDch@sXzb6Jb9R+OGP$!(7JJ3x^W@E??Mo1|z5x z^nm~!w+K?gI@-dG-x|5?cLmS-4$T?D?xJT?%^6yL1bxBlqe04me4zVk^VHBA`5f(B zOMovY&{pJg*RNl<&Xw*Vd>|MuT94?bQyKo)vF05u)J+zEEH{bmbW^**3AF>a+!w@= z(4$|g6A$&wz$?F!jpmA;=h;=;>j8My#l7vd@Apyke)6>4-BaZ4p{&LC?l%^v*o6A) zPv*FF{Euo-vDAE`@O{&LyRAclY48bQJ#!VnsjfUlVJm*D_HC6R29B6NySvwy@Ou$0pMh z|IAOz0u7@o+iF-z2EAG2otM8w`>$;3Pu9r;%y+@JOWa*|=27NW(^T`yJ*6(=M=9hd z+k_`4pY;e}DJTXGp!SjJ$@zslN21R`i8L#S1~p+Pe>T$ySaQVY)_Jn_MVp3-+BSk! z`cNGupv38jx_PY}VC~J?^|YDB^a=&iXU$;bvlH=W(IE+nuz#wm7N*+ICGtj4V(gR_ zX>dGmGhT@gGmG2xcX^p{aHqkQF|42jYc8?8W0Cs2DQNc?RNZo1wI3%Vk{F#7-`}tZ|A`Z=stIB5qS9n(>nH9J2gI+a+XIA5pvK>VQ zbVj8<2?`<@sSl$Gd~o5E~Xh&eF;1u7&|re2=06V=Lq*;9e6 z#_nMZ)6rvCa}&0Bx7;qF1nbVre#1ssK(*L)HL;qLOT9ch{@Xv1{)IFqb-U*eP$SpR zz^XfBln}pH;6`$SbcPTc>t2GI^r5WI26?*E8|3BsgC%hh%kha1&B*!H=f5GPIQe8+ z9d^Bh0H=?op>&$FM*q$1(PL&H=iH`O7w~X%Fn9VKjTX^TN+QotX%x-4NM%MK-?Le( z!TdU~2N`2H0~CQK$e>C5IM62dv?_sTejUfd>&Ne@w>7>$nnam1?RUTF z?;2wGIaaFx`UZlTzeXbpVH-@aW1VsL;mQ~)o9Y>xd~Ly+QH77IcJ_VW-{*n%)8|}n zER+#;nch_PRg;=vqYL6N%Zh~gCT62zS8FwkoGy5U%xP{*^C2&3 zS0!BdSd{g9O^xAoukq&?<`8xX?F?~6N`4iLVym;XUy&LOhJzj)5H!ZEmc1B5BVIcj@ zn;+o|@sJTo#=APr&d;|9o%53s0Rj-k{iyJf6>0c7vTb+VH*sXwjz&kFaaiy0T673nYL@MZl{<`Q@$ z9NR1-jQL2B;Ou*RM1vQYM}Odf6!x_Ww*v!%LjXWs90KpFj}0;OWnR#H^y-@0+6^S? zssBB^c}j<=Hc;cW2}D*tpG^q<*#(_n5a1rtmid< zjJpI*e%TaXPXKcFwR3UxudPaEOkNzVha$dCkNE@TM5 zT;*>utG|($chKa9SLkZxpVF6NOukA+xV-_Se zo;K^{sO5r5^i^F&P2Yq;RXX2O`7To~8)o_$Xf4O$kEE|@%x2c!c{;x*oPi2<+Krk; ze6G2MH4w(8R7#;rE$VZ>SZ{&FFW7jToy$Q`IkaNe{I=<|F4Q!?)>SptYh&6HL%}Tc z$;A;GYVjURUdrp%6*Izr#hI{}GbbxkNjd*^baQh+B7fUiHKRGMkPX$_VSTg9ZJ_Q; z6#|$qa{(B<%o7Q6C=bW8pcZ&=vUM$4cL0!cLdk)H{ z_w`RabAH^iSC3xGU^h^1zDq)H(=KP2U~q71RWit8OcJpD!JMwX)p6KXMczijpn9xm zY7C($EM{hHNLFmb#glP2(4L00xNyMUHfuSI!CH<9Vr8FQe0D*+itGn4pq zl3l{M_Muno2=k3UR9-VoVv6;XJnB_ou+{zWXUNb$X;)vdAq>nf4oJ07aW2iB-WII1tEBq8kD#b&-JTu*}PZU{SMPzXc`y}GEGtWYY$kUWa{vfw_w29K|xQx5nN?DHe zmmgJ+l|XIe$w_5i0AZIYWP+$y!?C#L7|e2Cd0Z2;PaXNRKQt>V?;G>19TLk$(b9@O zY(&;jy#>6nvLObU7BFH)7!QPeg*N%qob#KQGOd`-?Xo_Tdn#aZo*eJe=Q*1AMn*|U z(MD5OW6Kd8wK4RqJKehc@Bfh%2 z&(bjoejrG)83IX9h37J?5;(4$6iJnzC1|!<{N)Rmudk@vE;6^ynVMo){DjYVTlHtN zD_1tst1AH%f!_3F$nR+ve>72}Z<=qju{hWf!fcJ%I63goS?~`2Nf*0((-v@w%m^EP z3W_W=P*pVX3-5MH+~ySq)>EN|4l&j^ouJjT)u7e2wbO#=9vmUrpIy2idPaLL+0XC0 zj?hqpKwqhr(_FqigBTVeRU0G0*h97ht`dJ~lx7>-g4y#_Di zAk7}6_Y~lIYwxell7<~`%K}k#qu%z_k)Dzy;+|o>P{hQIGP`2SgAWZW@;B@&6`1=r zAXnALsNxevHu?VDyw`N75JRXO{gV$6@O$J6A*F^4NQ5f%2ZhzVk6w0p{-XCZV>Ey9 z3PF(+w!D6F^`U;mHqD0VPP)I#&!ZPBBL#%9h_n{+;kQoIU*fXG#Y3E*$CPvwzMY7J zP^j+f8mkmch8J~<$iUISbxnJ=oM;mf*+_3Gg zM}{kQCnhogUYe?P;T1*?k^sZD@HFc<6~kdb+xr#7h6e1VK&g+)7s5{M+=^Cg@MhQ{ zIP4i=|I3Qk^EQc2i*;wAP%qJ-nprKBmGCE}5-^9W5D(>WBVm#vRI@e2Fbprsx$=eG z0rQu{`^^kf;&)#&o%D=+H9QScB}3PPw}*&pjcmYe_PUBG7FL6_I1$CodTc6-cL#}* z%7lZdu_LNhm@;s(kB9XyF}OUm>iiki-|B{v0~SXj*t`==Y0p11O-5)7OJ|NXkCIx# z=Q`O_G-&1+-HDJf2hXYU6Gm%rM#p=72ErB-aFmOEC7dCNG`#5Ax$?jvE0@}rD{lw! zzExQ37pWaD@w=-k7t_u3{TlG`lf4}{zeN_ynC_thf&c5W-)OpfOfz5Z4771)%@Da* zjoIzqMv->A3C9srjJ1;5uMH2FUJ~qfd_l(@%!%X)4&+Rh^TTTga|r2NuM(q7RQ1qy zJK5~PblHZbNX<>^(1a?F)W0ODu`u`1cL)I7kpegf3Hx}m-?(ST-`U>ke0IDwbmUbz z^u~T`!jhZje!gEZZylJP_C`@VZ06Dd=m>5Sg@NHRlO2Wz^o`lXihP9_W^CEXHl_0U z^cbnm$2)$D=gMhGj3U(ks^Vp3ZS%wHf1PM~Fm@QW`qE->Fh1Fn6|(hbI?#oeCKh!} z`@^FKc`9Bbc4O)`R$nluhS$qtuz5EQhSW^YT<-aiM3FIsrYV4O!QK8k>%awU6v#eP z-|!Wg`tYzXyYADJm~v8xp#z7mX~GGP9V$S#^AyR%e0d{CVii>b z+hsyI(nFNh!fI_z5A7BgD(fanq5X)$&GD##(2L^>LkK^y{_0kc z9a^Sz{)F3keqEq$^QT2e_r;L#kGdlt2sk-@)=yaAm(Q5o+2g8*FGKz8*OhT$wj{BWbL%i!B#&91RPYt@X1k@?o z;i`6M`;4e$atF)M&&E*5fNcr(IBV7J+9Q|OZHstDe(nAq1IW97{`F3d5#clBnL6IJ zU9~;zuZ+cUnN%_MjphYCHcV}N9%GN)c^~k@NFi!nao{X&VZ7JZ2}p6gHcr~5?x7@?}7l%4p}O<@zvk)w($<41n{r&9eiEbT{jHH8@7IZ2jZ;#^d5|Kazn5_LXRGPQ#B;=Nnh!2bV!w4U!R2GBkGgZF;(!YJ z9JFZYH9+z@taOOT*{SgdBzkJf5=}&Os#fRiYdJj&nq?tGZK0jBLZu}LBn5i92-&Fl z(m(N)VZ~E(NK@V>{@c*jzbmJ?^QbY!CVd~#R8EStBHPitSLbQ3E$X|9iXL2~VK?Td zc(G9Al!x^?->2XCI&Evzr}2*eLk$7x6(6AQPCvUwPVa|=TG%U{c!aT3w*}QXdHb6= zSgaYa5=5^1nf1PP`3O9vP#@lLCm1QQe`;lX>5MBJ^KerxMdMeV46&|3MBD0tvVA@U!=P8>2Mj4fyx-5wNxf zl-E^k%+$qz8Df%D)tTcf22Xp`$wVP0LT(-J0gwgZp;Pi5X~fUedLa5(C!d+?UHZq+etfo4=b5LA~ojkT?gtLy7v=TltU(< zPCIKtYP3Orj=jEXdX>kE5$oOK?ra$2V&5m2Oe1&JQzcS{q`i`;YVw+C>Wb=9>01Bi zxiVOXoeb#obMUoJsD*tttSa;(>8P2+``(}vTE1tTqVWdcAZGdUOeb)vLX;#poBGQ^ znP4X?H`9_&Vnoh%-wQT$Y#S|D+w%8@N{KAhb4i%V0o20^QExLQuJ$rz?XusedgP}z zLOh|$YMl{oU(-e=(*Ck!b>r0btNQsEI@#x2;4GRlUj%|c{_BEG2$ zCD*+DMcNXhy)xafb!h|Rp~J%ap~WuRIIksLQ!7~W+o!X^CCnyh7lVbX{0g>WJyqUv zFWI>dZXTmY^YE_Nf#OU2Tmhe`L=%k_7N@Y50)g-9G(3a65VRHFNjzdkkq$Cn-Jl!W zj>^CE&3nx}CPIBQjyp#(=Q{{Kk!6H|o&pMlU-v-|U7z>C$f)@dm!NsW6pxY6miYI;Z|4!oV|IYO77{XkDP2k4N8Fzdc-Rv#)A+PEzt9w zX(j)_as-=+6-xB-cg|E>C)MabEHMuL4(`{HXF6*I!;STQ`+$al62ktcJ9Soxp3)^? zzmM}OxTrGDU4qY(Uc~QQvXogq0qzYaHKh+ELb0EK<6vSV)@~Bn)N4tOaf}nea2&W% zu2GF7=vvlHq#Ly!l#{7ST|rDFyGE&1FZNvQox?zxy|sC}r@oXFV*ZSA6Busz8U z3ZP5m%o!W=j zlGt{cw6DUUFsJbQzOu|S#-i+3LH}C0v9YNU6^n;Q>IYwihsKLdrj^4S-p%CwC89W?Er+x7eD=hU?Y2zza^5IshIt7Y&9^0`#0>Nv3Vna(e3$@ ze~ZB1*EK$5Xls8icz+S`wm#B(vz{%FL5l@zevrt!J(J^~8c zzgzS|qP2_nJ?*1JAwTrRH(*wBeQl-J;q0~0i*3g97!$4lZr*u(-N46E+=|~C)c+6 zDlf#ZcYyF_c#Ru%lopXdKlcuIx+~!e#fn27$v@W{LxWX;@G%tSBQqydJnT5gwZ%B2 z;smi(MFAgs4~4MfyXgLUe9$eARQ47={Q~twl<%w&UslE7MEAz3z_-DTEKkF2CPdri zQC@+YzpTp8zb(RAc& z%2EwZi8ve&=IE99WKz1z-6IorLnCQQ!T(O)c3pp|U{QPDp-lYN0{&H)A%&TN!$_>| zkHC|N?P$ZAQT@D8u^06&MbN43VT{S>EQpz5L8nYH_f_L|Z8WOdtF0?}e<$xol1rhU zCP|ztZtnSUd@JWhJU$U^`!E%X+#%2Sur(~*CBJ;KykhzQKaJD4Vovz``V4c5Zbm!Q zZ(w@P-~5nt(!xvRE(b~^9{k}KeQJd*W$bPaT8 zOI}9cWBVI_Ol`ukPEdUFrBlmB17nFl){RxY@lJqe zIbv-#j>G69>gVQ$j?GLR*0IXGee&rP&*kiE^S>b#bl(PGvC)bU8&CC%sa#N4X8492 z9{0e>^GfXgdA|f79_-_gj~~GUXw?F{aGFAV5ERGPau>q!8N^Q;Ts;ZQ9!LqT&NAm% zVdM-e)Sa%31WaTZzM(VHv~Fi%WrG_SsOy%Tsg!<|V6<;oBaUxh3Om*k5`$(|GP(Q{ z!J#`d3bNbnzuJ6KEmG%YTuyqC1E41oncVKQIku@i>-N#RVA4;8?tPXM800+mA*iOc z2B(}sodT&nqgbItI?^c*#q>826VC9P~cC1eP((H`;K&r z_(2!O`uI#V4onhU=TFOr4*WZ3;o*$BA)hR=)}sz+1jROmKnKW z{UXFjkk1Qb74oOJ8H-&%^$F^w_O!L+#r|wxnZ{qeyt@IjYx!HS3IyF7g(H_iEt&&F zja{JJJ$1zw)&f-;CQD7f19mBQ!px6q_5Tk|SHaX)*R7M_?(XicrMSDhL!nThcyS3( zytq5G#ogVZxVyW%JKVhA%$>;($T@qRC6BC~0EHKaLtA635=wBxt`kEt&8kYI)T566@ZjVGzy`i0`wLi~Y;To3h#$i(#$XD6UpG?Zs zs%UNLi3FLtV>X6MM;(9X@52#w4oBwhhx&KVOrYkaNMZg3q5u2(_G+qX6L%o`1)vd0 z1E6;d2}py5hO%w5Iq_442Gew5f<%b`F6hWCW=TLTy$Gl(?AhJ0Wlaku8SSG3e-`bS zlSV^@gx;$*g_(LgflohZb20>pk^3D|upQtNKa`W_Imz*nA)7c{-_(1uP1t~sz5gJj zL=2d|q$7&R{Uc3I%04T52$P~yFE#u4<(sqlwk-X!GhQDMzFQs(Gxb}2xS3!6w$_3I z7#7VhIl+$osa5pI9PXCgEQp0{_AZ%@VDv$II)7PLx0CrtP5xU>R<%j-+;Sd=ZD}#W z_f0X?6=LXVm_ZQqBU~yrT(b>%YJ%|;N;&d@!e*H<%nX#Z=O$^Xc&Vl!ZX#gNvp%t# z+X5LmB>kLz-}w&}l~oSUZJNYfO>4cO+1Uwi`<8#kPi@(J!T-0(#qdM0!D)7@{*5VE!xiEhf^%kxFM`t3UYK;It+6 zDTC6>QewycHi*hK^``bC*uQ+6g)AUF2apOQi<^j|SZ*H+D_T_LDpJcQPBOW_oHY-p z4QFF@xloT)Rn%)#^+f_UFN!P7#?svGFy*fvOOxTbQZwa2BLgRV;9m~m<%ilE9P$fW zI-?YK$S$RnUca*}d%LCEfc<*|QdVrGmUuGHPig#DA_-Vjp=$xwg~#`mP%)OI9am=W zCFP=*NQcW96YD??5#p-fu$6wcS*X0G5j)h2ofipGG=n!aa1B>WraAnQx^>Ct^*a#t z#vEg?Sz06Da=FF^6p)V$#+v^L7$%w~=P@M8zMn$B73;ccdg zMs?Xb8PB{d|3k%hmNwTl9=B9~+jB0cG#pi4G}=02b?1gZ0C6SI`D?PKu&@9ic!)71 zqov{%v~+}BoSynt9)I^Q(p59>28$!#w?8_Bq6ywe4c_9pH@}{kbvmOncN6-o8DOay z^|suPYt-8Ku~$Kfj7X3vp5$5;>LJ{pmj=SGJd(pQqZvGtv;Tq~u^X{OWA7D2>Z~a5 zAi@B!Runh1MwWWQ5qr&EeWqs-Pw4iv-!^wLT=wEVP$;O_>4 z+i9-Q5_1BXoKr(xd6+JcIy5$12B_`@fA=A^B_fl&D)qcE(7#_I@V7tD(h0^hs#Ap+ zb|NDEP4yd3MUu$@`bY{y078mIY4`#J1=H&HN*J;t1fUD=vA&Kfd6TtA#U-ZnD!7v? zSMFwBdqSOuFA0AlXEth=UJl+Yg9<+d$6F9Wxd?Fay!Jc+Tg1aX5D~hf)qjGaD?~-Z zC70bkzY+N>XbZZPbGuzX6?R_Pr@n@^ud7x<^oXWiL!aFSW}_o+Zz0GTwR6;Duxp zELa<(KrP`#*fRK^$X4aLN9hR^@E~%OQGK#9$mPjOL26j=V2}-rvBGWr1&eg@q7{OA zAbBf``JA(}hsWiq3XE}8@D~;b`M=~vTzV{A7G?rj%6IJz$UZU9#{XG77cjdY{*$4c zxjU>p%~x97sK;_Udx{hJpBrurqS1t_zrBZ?Wfnb_RZx-@4}}u2sLiZ_BE@ zo_0G7N{S&Q1BGEKeWtfhJe^P-lTuZefmBA{^L>Jt-gFvwliVl4OHWJAY;8TfT{`DY z9Xj)bWXI`3qVQEd(9Bo?`Mn`s;^>y>@0MNXz#bq!QlN9+bOgANeAJPL3C;#)|Ip~z zB%YIn41+0Eqd1m8CBHyLtNtUW{Q(fWTQVM8+REfUZsxq0mNh1~tc43NiAf&FPVn&< z;J*WXUrW}oQTuj-9R11<=D;T%!X;3QRTamKC{%V`)NwI8dO9x8^sRT) ze!?zkc137StMOb2@_YKcr)j10kwH){rc*JC0xQ%7bRJ5R&yN=}!8&$lgb4$c0CI)l z4)R4mx_*$=w!p3@4IeVYHpk{<30_XjXi$mFov^g?7P=F$4M*!k<+7VP_AQLB4DvkF znB4>w&gGV1P*GpFla$5m@K5~&3&SZkDYp>=E~^1iXaT+g$-1;nWLYipqdBxe&p{u# zc9j(X(TAR}M7*g${MLAC#7clAD*8P*SwfTuLC_IxQ$)&GogBfb!Fepu3hbv5<3bN+ zpCUY^7u;8sycHpnGF7HdB(Sq}zhKsCnwOSvu6ta~*dE%PQe+hN8t*?QV}wao6U6}} zV@SMtxYeF5JKp5zowm0!?HN)K^S=f!70-y!CtWkJ<$`IJHiPyH%v7z6^Ou^jRZ~T( z&~56y(qi59vb7?vWow4$Mr!Z^u}r;y-3kE-uHdbNV*dacMxX0dSe@HSCI$fWkJmDC zu*xl5GdDWDsJ!qTF*!3(TXkA?$Vk*k)4HeYO>9xT#MU%CUf}{M9z#v7v|r!#0C5Sx z2t^tx6$q#J)i!5rXMqXxf&KZcma2QY`pW!<%9jclIMeN0Ace=f+Xd`gYdr@@OFC%f}#hdAq!Gky;d z?znw=u2-x_N0<<9m8C*A7Scq_%m*_9GV_C}M>Y)%4A|u$(J8qsGu?(Z=v+GHq`L1(jDX8#!gY~DSF2xa zU;W~V@?L-lSlImAIUC#B+PHf5ed9LUXKL2AURIIc<9Glrr~RUlpy2P1r)4*T@7YS4 zrm(H|JQoi->d)BvU4Kz>c&91u1~=S?ch{q(0_8 zI`p8ydsJFKf$`AE#t{L~TLGeY7BKiQ9`KoV5=h1}KQ&iru=RlZh5Arcm>4FYU)Hfu zgON+Kr?-o2HAj83UHjiJl&lC1%PV;5>K0ox!k_-gZbUH`wms|RgY{8VePOHInNzRJ z$M08|8?qPrF|`Ub;b9S%CNU^uR@PePEUMhGWY>7)S=E=-;$$#8E#b=_If(tz6?l zKr8Ga=aOe!XU~wU512ojHJZF%NHO4LnTuJETK2_kQ z#bSn}mTZrKC#|&$wEo=*6)%^(JY+vE4)@vBw z=5@5mU`jXQBz1;_i4>?{!^6M5M{AZ19$qdm(rj1h()ICK6MNGxCt0}1kF1%HRO+}@ zr{8GRVtD3#zvi>hnPQvVpxngpzq1ECESkZh<9ytLl0|N{F$uA|^AK`U>L~%tbXnr# zQf9vvh5MMxlM6?IuL0>$(0s@ez%mwB+I{nY_lR7?tGje`(4i+3jVPWNHcP$qC!$Lg zkt5gE=h%i;nz-pC>9+ zyzUQ+56E8IW&8X`tzBI`4OzV7Y?$+kRzPfqDYuj?&cHgjv?!bc?MifB6e#1ME@6x` zA6h+LFYv?#7G7!xvUVTiXh$)@I})8O3q&0=kb9fcB=}xPK;;A$4c46{CC>vRVg~HZ ztg-|n#~$W_k+$F#F_Ie_I)oF7feI{`Itx5X~o?#S01>n-h3N+^fsx^94QOO z5nGy+xP6NwC$_K0)~vz*odAQT!OMbaf+2rfdAq~6i}jmopQ%L#1T9(|qNlCF%YX?g zt2Km;5Bv71)x6Ujdgad1mKN8ibbq?lMIr@5a zJ5!1Ygn)W7$pf%K7vt|zU~-~gwqYSfAuUQobV?bhrPJAL1E1fg{`yUUo95?;K?G)1 zi?L1p?KlEpwQ$(mv|JZnl0Glnyj%XfV-iUtJd8vD^JXPEm$DN0aMv`4JP%(Dq8z(Z0w5 z%|wAAs&V(^ROL%y^qK)^oz40EVaO{8ZIOrFov#G{Fnxm@M?(a3M|g+mlM_Y<=RzlI zY#eL%+gg-bgxinw$meHS$g0cmHC2PCJy4x%;npJO=+z4cVC|J`Y?bTuU9r2*-OSkowmIyV8Qn4+D&je72d*bxmd~cfV#^br>o1bevvrq%Y^h#MmW{MY? zVWq@7ybOb|Rbjxkj?>=HZho#O6`w_j6s#rV#w_KV(`4xW!TH0__!C{eyTiw?7fZfD zS=zBAz`YVpA+g`~ZlXc4M{*uXr#`NsdkKPI?wta|C!cfAm`=dk&xyA4EweZA3DTpe z9|6_nemq?%r+qlDW=?I~UkQ111@vI(bybTC;E?d%4U5J^f3yA+#)qO02D6d_#W64{ zOhef|v?C@1*Co6L_$f~5V~1ND9rv5MY)j&q4dii}M~-ZktZVh3X(6IosJ|1GQ~TEr z6%AGM^tlk5#`k}$m7Q%XXY0Gy_HST|!_}{xh@-2gaSqDAgdduHvP=1eqR(J!>)|pe zvm;^iD&qlF1-!7!{Z}Q^B2_oN_apMyvvd*Cbb0v{B^w|tFlht^uM8)~3~7v*d8^6d zEn7_2m@kiXgqShJ<^^IZ6zkmNfTieS*unx|hGL87-vi8HxS3&K(352GyQHY0Cp~Y& z%F2UCt&xMLsXiqyq}T?_Qlt>59K_ceW%)Y9T4dy_mSr&GhEyg_yMPg*E6RZ-?M4Xy z^{MizPG@yyi*(H+3RHaeBqO-k@xy)u?>b)~p?82Ty^;V~g=7#^Ge9=|v zyow9YX|TQ3@)SGEGeRRI-Td;Y8@Y-!gZen@@@_>f4{hqT@3CHA!1GGr*)@u|Z~2l8 zf4SZas4HAfQHq&4Mk52ebYr# zdjkKh=j0DUg&O-ywKL^-=@~Opul6UwOTn`H^v1KXU}mb@gZc4w`p5B0y#%lxx2v9O z;TN^u7_IGu!7XhiA7*x%pwr>j1{!Q3DwS1HzfH{p)!LY3>;sZ0qiqm-;y;;V!UmT^ zm%*TUYfI}_Z5ju%TzU)GV3kDi52ty`c#5;P<2-e+`NyE#UsX^KAZCZ?(Gm-bPTLt<>G*m*nQJJ6}r}tgO%K-%0aP}xxLCWZg znpIY2692|!T64UZ)xk~O^~WHO{7^7yLVik(1-!0oW1-Ja3w_mZYbsX&*oXH^)sQ+;JHDuwYFZ3CiRsru3 z6z~=}G)=oG7#jbtu3mu1nfo;hi2&!ao=*h*P$x;6ai3lkRz9rv;l8@h>9<5AmO z8JA#=hXBfv<5mM2DCGsMP>5tEN#|ik62mW+=mWdUjwprR3day$i0Q8PSGoKy`2^s##AFV z&!9JR9eFgzm5G`Q3r}X-xm}-0LlqYrKW_3#a%mIW@{a8cj_WecA z!a)!G>V!gG3U>nCegN>YWWu=)a24bnt%)j8rfY;k{X>Goy0U%M6<}eA0`D{RrAoOI zQbv9VRM%MnF9)X9>z{<&7VcvXQBd2X;YX#vK9a~RwE!NL zgzcBe+b;@iQuyRIBGo=kP+;8RJ_J<^N@omF`YyCxELD0XC5AwNUL~#~0-N1i#Cudn zEP!f+);(W+80UIuNRiPkV%tCSykTvrEjdXlt86B5X2`;BH{xEYeMu`1GF=JkSJ|dg=8B2Kg{la@>4?6L)YsLW&k#X8e3iPOk!DUIuPdYE*ypN# zRs@PL2|I4pSQXq)Q;d;Fw0@*TUlASAy0J7?agd=)ia+{qeV!a3#%qCp;?G?5OsGAIVh=Q zzp^?y>1Qf0payj>OYgglX@Os)q(}n~%40hdr^{l0TkL`-L(K(w+5O-G9vsW8p?`+| zR7#@hrQz_O8|dV2O?j?>I4s4n`|2fFN!Co?7q_*8#fg-0g5m5sT7OGc7nQliTJGp^~{y2v+-7K%o zoK|>vi%K~9d;B9m`tas2$(C%;4AY5GJUNDDWz?P|)+vC}uYlTC{g$C5rv}TqQ7dNT z_kR(K`(%7?E`{GEftclgC3uZQt_N@eBCfKRfv88t(fPd%NtghV-}FuD;K(EYsWBu` zrj5RGYm9`VlP!K}XmE|JDMmT$O33#ym#qh7W>wwY%i#d#mwqkVWskL1cD~K`#wEJ0nKy{L&68X=5t^Hp2XPS&HVxI~15z0kGbO<~(!L9mTN1THcP9C)}EWR5C z2~05L%bq4~+v5Y?(7*@Wt0f&(p6(PwEMW>0H}%pgmx15Fq?`R*T@G=7BXY$Yjk1T8 zB-p{;;Bi9`F6GlBq9trC7#ix9_LEJ>tY z|DTKt!=>!5%QJ~eG2DKqoJe8c*!^nsl>zoK$ljf#;jgfXM9EupIA&N<)E|KjDtPgp zrZ~^}yv6F9h-%>M*S!JprSN`-uI;T^&`)xq2b3&rNqXDn`J!YBSW_WNYgM@c8kBa( zmE;6^b46Tb)-E0mcoAuyUC=SnC?t=C>c#rC0`9)4SVqF_>)u(+BON}%WdHCr!MS@H zt*FA4*Afk=^mQR2n{JKgcl8dQXiN>K2{hSqKSTZ8ZU=jF`p`?$uOgfUj^Qvm^xv@d=rO5!~E3dKdadd21{CSiOQMo!*$ZJeEe#t zTuAf_Il(O#U89JQ;%tw7Y^6xy513 zV$c8bV>tFq8+{9&Y-A$kmW_duMESdvP9Ed< zK?pi_e}@Iiw2s4?)kiDUF{+EMeh}4FBUG|>pqhSMba1fYF#^zc9zd~UM_G?q(jVT z8dPVrDK7LqQ1@v0>}bnnGkBNIzwetYq}j=~u3MqiF3{EDQ^;k9mW%96BOpokIYr`C zp)*-i__a_Uz?$`w$t%BS7SH1aIHot42PQYoO8ax`VS7gr_gVj!iw)vuy z^dB~&HPp$;Co|sZFq3Q`QoQBM*X=(rH}Y;3q9S;oGGyV5XdggA8|ea|_rg6T5nXC^ z-R}gCbmq3_9>|jzN9={(sY;q*KuwIu?#z6KuSS#dVx}LaV*4vC>=}Yw{hup3d^VzzOT#dI-bbt*98FFYr4!?`SU2l3J_!y*nqXCa#Y;}o0 zy5=x_$n5Ol=kalS_{Bd{J|Bb|nLlIU^j*AOu;jKd*cYR~{}4OH5$xaVBpM)5cVSu? z$Pv#k!U#_k+v$J-amtI(a9XJg*7jTlT>m*_PH_~u!%PA#;KJa-*tX44z?hyU@^1MEiA3-p=h2$LvR0Is+`kp0OMlpc()AJg-^yUtC7Rbq#Af}r5WCZuLjZUKL< z%iVYXaJuQdte5q>HO4Qo^<_W)3|Z9V&m3VtyWg)b%uAM+PL<$-d4#h_grFRV7QI$- ztgZ`4OVcdn`>D@ziF|^(jhXypj_=`J>)ru^*}^`YtCmMi*sLt!?~>GRLKp1uB6tos(;$iBK$SaTG%_!#U&Ku0XC02uchqOB5Jnz-|E zTRMy*&5>XA110Hu51x~^GkPY2pyW9a_a84lB0Zrg2PwepQypqJACsZc(?QR<%8;1u z2q^#5+$i$N&aOm#G?eGgM%lsDp2MIWd!aT@9}$HPbL(53eoIyITy6S)pUz|%*Uj)7 zr`w&qU%TCLb7>w&V;Tz2{vref66SMxrt@lFN7?Tj$!)CrM!o>`h_o#7oxakCev}LZ z?s>)VhmHcw`wlUO$7@Uzt!gI1(fVud?%XbVqtB@<%S7cW;SlXJZHNi&9REkbRgj*s zJ&aQuetE}5gRw*x3k>T5_K*)y9VAPs11*5t?^axhav3Hq`{L`xz`uySU34o*{mee^ z0ljg9tKH`)M8NXHto|IT4)pURtk@aM~u_A&R}lK~6si zV%Y$}m~6V1{e`AwNEfbtp~2rmN@O;+;XZy~gwaGaq=y-oz0#eE%qeaG^iqVF49sEp z_g1NEIW3v7ET9KzENBu9(*BGCBnRr?!qPW@nZ3Hg*u4bT8uzZ3METioAnWsbO{~Ao zRC#^5Ac+_A57KrYZ7iFK^q#J9n2oUw{4bW36la>V{>u9k!MgeMS*+cXw%bi>59d`+ zbr*_|#K8TFyV*FpeY}sISJn|rsx<$Rt%Ib?e%CvQ=BAu2F^D9H-ytW7EuyuJ1-;ab z6i7hx-1QnK4v!!zhA!3Gv_JaQ)&63(Gd%_5fgI)p#wcP1?`P$woD;A#<8>tFE45{< zLM3u^brXpaKzqbR0`&a2w~%5DEb-gR7f2DNVh6UmV(4W*HB*&j=v3LQ2Q7G8 z4OYC)2k~5yOJ@el3ec7Ew|64HcQlo!kcK@gB&b48KHY+nwScG{s#T=M^Q82H5wr9J zx`0ZXaQd~b)(vMZZwcB1|J+kb+N8E?r_zR~OvLj$ zLsdadV@IwIcqse0?0z(dG5EsT0+i3yi#U%a>JM@&c)yDNSz*DnXHh<5%!b>!WXneLa#!fh6Bz-MFISK9}AmMWv4?M zFHif2X+`}dyf*W&4^L1;p{0X*pM2c@EiAjWYZq>S^?|gZy~{X}PiTKNrt{%o6MuTFWYvQNtb_PqEkMqM|FvDZ4< z{EvaDm8nk*HF%;zoC8Q-!&68CsXuRR$Z$h&_(x=?7^%pBlC#PznQe3L5<~!=LUp}w z2PN_*nN$Xy2L&}6z!Dv%rR&2CXHwnMd>dG2M1K&s7W+;a1g69#zl%i-ldD4QF^*Nq z|LvDNr|Gf2$%}8aM(n_ii#TLTK_vXsTr9X=snWLcp#)GRz28<|{xDABZTyy|slCA} zH#qu5!$k)5^|TQyypKK*^f~K(UPvH2f#EuZF@hchh>Fr~A;*`RI*hk$$Lsb*{rQ|$ zRrIOu8A((ta+Rs?&Iex?D^{%e2w;eY2!V?~A6)d==-JiL5oJHs*lcDc) zss5{fJe+FwCKp7$XRRXo#aD(5A|iySnU5kf8if~pgi&r8W38d`XYt)R#NOBd=+3NB zswhan_`FQsOCe1@!)K8F%25ouMbmq?R#AZ09YR&b(8iGLw_wshxcM_?;`b08&$CR&w8F3 zvgtJ*<}x4(iXoJKp7BCBy?`bxr!~wqfGVP9;OM;Vlh*JUo~k`JNlqJDtQl;wi>r5Q z9rFrt_B9E@*lTxkB}Bp7Y+KEyb-0Gy23}niLeFxU58#`+1CITT$OB(N3@{# zI5-INCDwkvu&jE9*7T~3`iqRgmlqmH$r1YMY0=~D#JHJs-0GF{^)F=3u>Pm_En1i% z85~@(`G*pL{v1fc3?=^tY_kP?9#yDWU+n4H&#A<1Rn)@Aih%pZ zv!}>OprI<4@x{)D%{T&59XIpoXP`GeuVyX$a6NmLEy#5kvrO2t`SzTm@kizZ%c!)j zj^D(xW|0^Fb{@6q6dG|0t`9B$J;9_inh-$0FM*_Ycg5GOSz@HhPz6h0WeU_irMCd^ zzXo8#+5%QY0T>K8ee9-|b-9d=Y(&|~m{W&?x4Snc+p+3~C0_P!t-Nh{h9jYLbTWP| zu&_R3?r~tt**~8cOgRaOGjylwQRs~Qc*yfyxh!%t;zzhlAUrTn~svsH|2y^WYsZ~FZ)uu z;=V>!_ru=vVldq5-48diLUVXD_51qCTJ}8A=+^;hQ9vq1HBw>)6agTv3Aa zh~|Uk10w%`12F)X=p`)R(+)4*1bn36uQ{1$zl3lzGyFj12n%PvcRAOAUtFqfj!WkG z^^$e}S?r?VxzpX9mP!G6U^i{l-a+S)@P?e-PKtjF6HufpyLaygYsy=@51HXt7$N}I za(M9?)ux9Y#jz-X2RdpH;T#2AtZFAYK-9*>^}wj>ZB}FcGt4YL_)fStMMRkM1xp%W z2|9fAYS$mN)JOn+974_P1Z_ly(D~(C9@9XRqdhJ+uI+qVdp9esb;#+qzOg1clH}$2 z!HkdpZp^&xe}4V)yP<0NzYI24aA{eWGh+GrezX+|aXZCY0@ZmABL0mKwh!@5uC*U6 z5R*P68#3|`pehT;DN2Xh&OuCBIqDuT)OXjhtHp%)`8Oq@^1%OU&+Nda4>q|9`xz!8 zJGdndwZwD&3FH;>oX4-&Ogyth%*FB`)2t?n)X`+VAs~wgb4(>(x(my}! zsm609D5pquU{@wf$cVppUp&2id9bQo3hOp?Z1{n^x^w?yl@f4|XG_2VRK%eHU8)Cx zOk_804;=c!dR!%61TQHS0pZS66$<1BtR33j1{GOwTcff8FGwT-@(5G|Dq?Rm<(=x_ zc@Z8Cw`~!q_c)VX=VtohkMF1U8?Uy?6J0`S#J2O!v@t`}9JIbs1OivPBFHg94^nD> zimA9_BS3rOtDRkzu_X`}dc>)_OOn^^4R=#|yCoFV)SVjb}Ta`&$bBOTZ^b?M2-T zR~unhbmx^j@Mu+PmB|Ukho;nmFLum?g7FG6(w@c+)t^@!U?&fiBmcbA(<&%1t}}~7HVeruM1M*K*8HU=z(uK(t7YQDs{0N+x-EnHhn^( z9mlXIQJa7j`tFPSjep3(1N%VFUY`PVQNe$$dRrnSJhL!=x@zvow1G86b;=jT9CQBaySRn$!PrAY>>FHU7@0F_7$Hj)xEUgB_pS`^sKBNr} zq949q6VfKJQZzTA*XpGm&n~`CWD7puZm^x;)#raDVWAq-e=LF&HM8XL4H@XCG{p|y zh3x3)@(bIu)u(P(?Ou!8;E=AQ1ZiKEgB;=eyIwf5w~eMYJI+tuzU3tDi&^VJHFo#i z`vU=Q3jka&WNqzer%glG(@hZYR@jynTSBpIgMq*P2ughhhDlpR_-vRLwQcXjmW zMOr%hgQ7!W>Fhp0h;Q|djWDa8%>+9$i7-Bn1h&99dUWDR#m9F0w%R+-5Pg{}A6TMD zCaGH*3OTO1G{{Lzoqt=g;capAHsI^%{d(aSmCVC9n02ISN=ZQSAyuE99S&nfiU#{O zV8^RcIWp&#FtS#Yl46NR-YG>Rox5JNnMEFiAS~<4IzH`A;;RlJYq--Y*|E*d36O=z)@KO8NTov^%D+Gk+d}#a-ZBTWpr>9?r2PT?)Gwy=r^wx5fgkx4EmZ5|JPx z^8H7D>fg07d(Po%sV^$+J!5k@3-B3T5#_3+dMKjtOKccD=%tnbM zhvwFn7M@o!D<)HS(fovyhGD8b3QGYu^jb)AwL=`H+yZsr+9-dorzsi^8XOoQ$|D6wZ z{pE+`62S!deN!dmQOD&`*K$Il%xsTyHjQFU^Q9`Sgbz;hvbmU&f<|qt^VhfiE1tC7 z-IWWEg@siXgAH62?KH)Po(+QR zbGl!_gN2X5P%>v$BLh2feCJS9(6BbFBnC*?lP!)Z1s z#dBXB*1puI>VLKRmmNZIX)R2YQKD7yNf%!2EP)R*brN*i7_tkr(ZIoG`!1Y*%BV>7 zS0Lh5`pi9GxK*9RgA<{&$2dW0j>a|g?~gLwpLZvw=Ww|2BSYAyI>ozRt`1jSuyzJI zg*csFZ6{xI8dla?8!x=Z3h(AS_*}$KSco0=S#bN{bb5ETp0FOGQOF(#WIe9MB;meJ z+Tm0N@3ZBZ9Mg;`Ko}D1_2%Z;Y=%*RoQY8xDi^rpIXmzkp;i~v3FDqXlzaih9q<1Qmo-UecmiovI#2}3{Fh-WWYDnMHv7v!jWPdJ!P5bu7&nLMudCHqRdez z@t5$Ri$Jt|P{N@x;~rJG?xik2|J&l}?PQF4_#}fd({cUp)3ej{7w*m#{lHIz$HIYfmaC>BWyQfSZ-!x+Wr0mbnXA=pQ zuT^rUof7dIvr{nV!pe4Ywwu(e74dZ-|3@)eqE{BP3fab(n7$&WqFui@5ALDC6_Dj* z3BTPqdOUl!8#~y1Kl3f`UUn;`Z(Qv|x>u4;NHhCkNt=-=B*5czTRP-%C`*f#&5Dia zqQoOx&sC}noP()4rnZkDip|yO2gOiESz!(a)c$Hn9WK}b9^Tg2Rn;$&kO+lgEy5uE zCN=IOoZykK0>DlW^;vM_AW_!kh5&#s&@6p9DdltpP#;TA{H zB;X=A0rdm}-LKw<^#m=XARB%(`jwlQ*c&>qi<#M@opqyY?L1lO!sVr*Ly5N~Gs!uR zFeX|gEh6fjl92T6XmB#mVS6>)re40oPe3!@F#vU;uk+Z#1Z(DXI%u`}Bw6JAaQV(4 z?e``G$AQ(`CMebG?GvXG$w>8iAK}94eb_n<>D^kHo3Gwd@=7R2vIjDm5Aa{c3%JVj zSYGB2typwIs1e$X*vP}^_-UDg9H}d+@tDMQ$TCa3^aqhoJXa98=v+oDwSldS`^8$j z@4_1@-Se|V9Ekm+M60%1ZF1JUFxz|oJw}Q$;DBv=|G4-h5i%lHDbwAHhr(dxg(i#{ zH*{w-UU-ged}=4EjHHWD6wVkvasAZUkWF}}Lej~Hp6Y=uB^Iw-=+Jd`*3^6UZDYXs zcldcw4G1Sc^%o(PW1dB){6R6~q8Z9p%e8yO?raz`k>E!c+417t+98Hc|5v|{+d-&s zNe@icj`{I*l8frkEgPvUmu@6hN8A}vzo=(ZyLV#VzVkaiAJpsfMt{L1X~FF9+h!}t zx~%!?|AS522vDl9G4jpGs=lSc&DG8avQ^a&t8}l=j`ve-SvL;GI%AT2L+S+d&C@P6 zXRt=UIA?-#{~K|yETHW$}T(okcyOG4rWsF#)-lR*c#f5^37Lsoyb&pj#KeI;l||)no3m8qZ>Q> zy+-s50`%^V>qGn8*6O1ztjmBj`LiBlzXg91{)ZO7<8i1)txRWj*tiH9AGy}apSq3_ zq46bu)vDR$>GcOU6NLv`Pqi8=^{bf_Z>YQHx&JZT!clB@s70;qZ)@K69y22K4d4CR zqxbBVT%9w4@mBTvsAADqwI2o^}P(b4k_*#>L& z8z@&E9(A!QS*W20|7_c zvQSB;W@ttvJ&XUbxq3#XQ)~R-%R%dmrJoE54~5I1X>I*l^OuPe;gwpai_iEh7unhT z_hTb=2JNqis-kO!m4G<5E8ORR?|l9~H}eZ0TJ#{l4f=g#b&AO%s{>^c?_-CrRs--o zE=ReZhH@GiVfR1RJJufTmVJ83s^d%9bS62Q?HYz%^64u_9(!-Th=@2JUVX#}fJeLE zqt829O{*6v6{Oi<5Giqr5gP%Vu!QKEv&$gK!cu<-NLwlb$F>m!JM5Y*cBwIZ``gB( zTs`;j{b;D03>l5|S*0%a?n%J@lxXpdBWrV2y_isd@RtQg22JWqsiKG9WoI<8$F2%z zntZC+w8gOri;IZ=TgT`3p5s$5tssscg*BOD_KnWfli@Pi-q#`~FV|FB{@-E$BRjvQ z2H!m7QObF>cAK6vY4IBv{Yf#6Xspf5lR!rnmgD3f)3&v$k4Iw#xn*`HDZC_?A?3?| z`kXLQ_&Ui?8jRZ0y4ryPz~r=cl_vX>-~$_!uap?eqsk`Po43>pW2av4RbCXN0G_J> z?E--N0NhRBW6ml_ejUu{YP_6T)}=+>4q?WC0u>fm;Pd=XYST9GT`EI0YNKyO(-{hd zJ%z8bM;Y1pugZ>o@1NSU`ReN&+E!K?-g>=U9*88D)+!c=`lVS&atQs;BjcXBFJKNr z{4pU`l^#smf1TUO;-S4$7gx7!9qm>V4$BZxqowCUgSr;y?lnqQAD(>k>?qs8fi#1M zu2A}aTK>sCEa+|#gnt>0`Xo?<qaDkNf@>jQ6Kpyo3#VCP0(h z0~+Wjay5ba!H&x`rboOVaGsq-cD~~JVsfmMl`*rFuFCo~UVs*7oMyn^ZFiIHotzNj zhgH@PjB%dKu8I%sws%-rUlzU`KYwq}xooiWRch$cr@BJaVAe*^{Kc?GM+!fN;>(xz ztAqovi z;hY7hW~b{r_JunZURUqK1M}{(NgG=7bH!Y41tJ8KvUXxn4C{kO*uii z%!h#8pfcgUiQwp`!VrH!LDy|tz>Q}J^i_tv|6Awx)!XAvhJ~!pE}mKRhywrY%97Qu z;x14il2m`Rtkn;P!$W!7mjifo$4@?xjqU5tEFpJmnicZn`sESRV(1^$zoh`^-iFJ^ zlf{K1T%VkdUrOb<>#uPBhjQaH=(JH-UYT9taf+VBQZJp`9<6FJn$`1MbEwhNs*O#Q z%?-8K7#&-{Xn4!WJe2Zh@6o3^=sAq*^^J6NrpC;|wmk>C#uvkKT|H?uYkDMFo@kYh zO&9Ym_B#i2*|<7~&KxZrxiy}KNf%_N=VW+-0wQbY^l2iuxgZ`=X?$o&XC!h)K#0m5 ziz7#ZU`!Y*M1v^P{al8}eVK`-dK z&*FQH>z(^Rt@YhB3Oqex$G6Cy*^f_h{yzZmKn}lrtlki8dc8r%G*a`UL%;f8^ZwzV zLUGBhL`T#%R-Xc@0I>QrzU({X^V#`^rjmC$UHiajEiBup>NLert&*P2W-{qwStD5N zt^FQv*LHyw+mi9vup|jq;Po+NMY!w^EN`G#MAl$xCK8@`N~f#lSWT?}8~`z2tZ^o@ zx7XX!d%fM^x-o@wN`+FWTFvFt#mrX!WESq~a^xyD_t_?T* zzh+y{o=T-57jn`0Qo(;Xm7I8BcJj!V0{+RzsOT4NO`88XjQfJSbN&-Kr1f>8FsQS= zbMyN)Y`Xc+td72Y8m-=)&BP+r()@{fJv~hoB`Y31-L7TJvHc9Vt=JSQh%*1n_%jf3y>t$^NX}FsxWv^6| zTe~-GeP35+*KNS($pG=|@GA9AlT1WM{WBv!!5(zP*JAH9=w&Yw6op8v#%Vs5`A0r6IX?6NK)HzVugYPuSlS1+-t_VQO}Bl@VDEoNG+x*7s0%7`*;qM0 z_0aJn5ByFHzNL}dL#>2#V3_P`Ig@`uCg-QC-_=cDaid;dVo`fe0tSBESKjKF3>vonXkJap>G zPensxk9PI!{tb(L;GR;Mw^+>#Gdq3stHXl_zK$NPWDxSo4^VCKMHEm4fESUZdA~rx zjuNY_<#@^9F_}HxqG)rMikWycGWn}$WNtsp)rjg1$DJqjej{iyc~y zGqM^Dv=2@PKoN2atkfn#f<(2DO$P}53;mhqg+?PD4NX=n4Z&#kblIJ4J+f@sj$M$` zajdpliNk$So+;$gal|;JP-?i&QpzCE&d5PPQpHM0C(S#PSF2~L0C43f4_$w$U=Nr+ z-M3iC&O=Z?I3JjJc*Z|=Uu1sfq~79cwL98hzpz zY{)-({9B><>Ei~AdqYqEZJ*K`TYRM=9DVVjZ%|BYfU=U;`ssZFjj1=M|Zl?l8W z%@1t5;p1Djz2+aL{Z*aEDKNS8=zYI@@IT*$d+C7fuZN$#zGv?n{@Lc*_zsxkwbhzN zYqM~Sz~y5zQ_p{OX5!er;c)mE&ZqfbHUE2G-|qjmeWiQREW*bPyTXhZ18)DL}(c3c@~$q>y4YX-ug)$YafWEY5@7I zHCzrsQ^?IcbNui_p9lv1M{)UTYSre}j=mfF`uBXy;p)3960b6)Qk~JuOx2ToLzYTN1(kEYDV$cx3d^`M}VR=KYhu1W%p8x%msb?**N8&f0G8-gsAU@2=mh z*7dE7*4!&fW`o%*GV?RX9}CPJ|5iSqny@%sTdii-Mv7Yq2F4#UnA>h?>D>DXMk4`j z@c4a`6Hk3A7W4yfNcH<)&Kt+pTXp65k%tvtCI{Sqqz;=Gx>Zv z@Cx_6*q;?3p-d(@QLSW0OQl?-Rw-ipV4CCdl*L3MIFw3; z28*Rql2j+uKag~UD5ykCD}{z&txz)tE_Nc$o{vXIO#?hjjurT{P^k~>exYCw7{8Wd z8r5>CmLIbizGzs>=q2-mKf1@WBD ztADHt1yliGRmgfp8r7m4=qX8WYO~qfHnF_9H6HUHjE1KVv#geJ`MPeiJAJztsT8@l4ah4>z+iEA*BqoB*viiKRY~l(ovDmOizwH{a3?7&wU;xeTUFLGWnB` zzfuRu(p1}{+S=Oxw(Yy`_>8A@$A=m^XKx}|tZ5qgJj=v~Q}N;NA36B&pYp6|>h9V0 z-p=l=@8bo@GB$?b~kKam$}}^z8kEP>i?REwxN|?#RC$KKSq_eeK<^aXZ`hA@7JoC9rTRo0tT! zI3R0f~HGSgV*~zhoR*9-wS(ZuTVC=50 zTlegHhu2 z@^XHX`v!Kt)8pOvPEK_1DOW|OB5tw@pQqq!(=i@f-XM&%rifFKinBlT~4ReYny`tss*4q=HZfi zQOFm9EN0Q^Zo63!Z2|(1oEl9&n2IGvD%g~4X6FDW3TDJ4>1x$Vq0y)$i{(5@g@%U` zvH6pdB)M!hk5>?_E)A>S0I)u11SF)2OA= z>F6Xd1~pay97uYbnd40Zu>8BNR%d6iS`5ddf#)-+>~sZX36Nl1(`gyh8RA7)1w?YV zE`%|vZh@sqdii%uf$9Qyc@n+iuT=0_3+P@}P%>5^h-NeK(NJLWk;%!EKNuZ8@?GTU z$9np9{F>!AqpjyPvfg3TX=~be>ayhBdRAJVvP*t&& z1o)thqk`1MgTcV)eTbk10K{u!MP+hjgHo5?3; zGzgZ4xfMS_004kGnP9OEX;l1x3wdr-0pLQYbpCV5k`BFJNu|~5fPM+bRxX@OgiZwJ z#_#vfjQ%_{p8y1RDer9^c*EWs-}()srDt!k%-dlq&+)okI-j0;aCY+G7luw9_`;(3 zd=(g|#Ue=>JI9$U+poLxA3J*Y-BYZ{ZMl4@tgWXLntJRM0{y-+KR5O>q$Xs0`*(i0 zy}kdKQx&m8pJtkmLHe3Y<6SUY>Ry|bfh$A?VTj-4@}8seTsohBEwTeOvv#~=U8iP01H zQV)=~yv^6zd8^g#*&#_r9|8q=WIU7_jan6*f}ov)k@*>Elp4#LTP%QvWK0z1Qy&3|IqIR35U2m{#&zE?k&1TzBDx_zF^J5RN zEN|pQ-onCcN!9=s<@q>H(BoYXlR9=Z4Qlk&vXRL2Q`uB#T$VUJndAX9WUSWsPL4OW z+MUjRv(ey*$0N(r1~0ICFMAqogcW%8Gr3G5kk3Si63Mwifz|LfyQAA=c3ZHS+BF)f zRhINltIgJx&&5Y)XU3l{=8N;SS|z7twF1D7jI35m8#Dw86$4N%?rLg zH@ctWwJa-EE2VTQ89XsNGyIduu@nChjryMy1j&Yc{?~e1xBr&W+;f*~^mU^+j>PF; zf14lt$@Jvme+~M_ejW&nKY?42sedJ+`_EC_0NvZ!-nr=>m$(0IcITG&Nru+VMibm= zx>7wI8-=^!&=LP>ihRvfkvyatAsnaav8S zS}In=Vo4{vTY9#8y`6VRdP55#{?%%lQdN(7KBW?EXe)M5wZT*>dO8}Kc~X?LHJ;Nj zfKcHwxf*9QdAnQM`|hyWojVFZL@VVJW3^f_oJQUBO1?x8$2B+tfVQdxWwDB}cBOQz z6&vBzZb%gXE^G#1=~vAC6xojls|KLUOl&L?nSClSH}PP2e&T^>G(2ZCx_di&w!FW) z57qKKn{R>p%1|t%W60t=j-owJj*jjBoPX-{&rqhDwB{wV`Gs}imCs^P4b%?YEEvPK zytk)s@9%qCw!Z~1KJH8=m8upalT0OiBo>=|U~Xpoe!bDy>H;LU$J=>3gcdtVf{61e zLR7BlbUMD;K;aN%F9a|)o-?*>-~Gma(CQ3^Ty}mq5jpwIP;l~5pmwTN{$6=r*3=p2 zNRn%+=W1uqOM%wbzBk@*>)qc9$9Wr71Jn!2;U|9itvAAtU+nJP`Yx2?l^W#9gaB~1 z0s2Cth54_JQh(u8E-_KaBxc;+o;x;fzTpowI!Av7OCQ-xRl8MJD`cl1pPD@Oweiy@ zzk9Zg75zldC3+gMbR7 z7&^MQ-0AhU-EK75d$deLS7$IvY-}o;;L_ZvE`TLUy!5-W7LawS19G-TOJ#b~sp!z@ z(}%tqn3;SO*VSO|??Q0hZ?$*r`JHeKnRE;%nv6Qeq_367M)rShY~fQ6ZmAa`rn`d-JgTUyeayb?m`}xq|v;RMjZrL54-445VH|lK| zF&vcbMZhdM-ROPs;5o^h%0y3}I{M6Kd-}J&+vVB%LF^x{_7(#Zm_2;&)4%%B`{|0M z^VRqDLjlzSuzu!J8A&=F3*~ajLA%|v%V>7niY3M>%Pdyy@OsMm zr>r_GZ2YTZkaVx(0KSLRdldf?j5fFfOYzv;f!XPk-xW9w+t%K-siBcsq!M)sg1NJ$ zz4JCv67;2FHUt4qbQy>+t%8Cy(n9Cm73tuXytZ~uVbIt zZ15Bd<@sEp8chgLNGHdKp8Rwq zIQWBdF*|26T6?Tk_cn{!-Y1C$7Zo8Qu8-G(;7_g~3T)7E`T{_UP?C5M-n6*M*7s(; zv113E9!w;7{6`ZLhyOL3PEIY-O;s2d39(+@Q~_YU%;ds2NVYGg5|JUB(?JDzcBZph z&g=DTD?qECof*Afmh~PT3VoyajtC`S(JTp%Cs{fn6i|v2G6rmVsN6Lq?WN<9>(Wj@k->&C#`2CH@-?PlbS`^;K^z^ zF(k`^sZhw3ip3g%2=yTSaihUx-wB&7%W{=QE|c`fBEccJIP$f6qe2-1*ym_t=g2KU zBfWNaF;xIKceyJCd%*8C(DtDnb<1>?|zL&{F53;PrkFBaK5y`GlNSGTzP z-`df=`(qYI?{?q{I8%wxWT_AsL6Xd4q44RS*MI;j$(BxE+lJSfjJ6FV?8AjoB7^^e z0I=8_EDBm0KrGhH&rSR?k%*r1dHe2S#kSjOb_ zk^T0_@R4sKYk$UWZ@KyU8{hIpZ~KmqG&Ig_u|%1XC9uwV=tOk>`7aHgc>GTSfypP) z?lPC!*}JU3C!NXU?Am?(?Vsx1c+>yTimkUKQW_CxSd7SJqmjUoFN_U8_xF+T?4b?4 z+uqyOx#=BNn`^s93HGU#P)nnHK8Y9RJ`VPPIv~13(-SAYpU!9F8wOtccN~%zin;J4 zmit#C!HGv!Yb~z;UDPI4fC8!jumVJE#wN1a^qeSidXL9LRsgG{w{$zqChzHygWp8D zZ(7z{+o915vF zOmi-osvCIG-0SkT-{kRncOaMe05*^1L4qsBbAf%3P8O2m;o0#AWwB9rx$M27Y!MKr zpsO~d7MH_!eMei@t%ZClG&?)-P{1EMTx;Y~ybfq4KsbY`0K$Nd$8c$c*tiuGffeiD zIb>|AKdw~)KyiA5C2Ev9lX#{P^seKf1oNZ)pM(f6MOO`oT)Wx|!q6qCw9wye{P*KKbZhoQ97*5{@25?Tz3HPVqUgL!`*V7x25|vMzgaYwm2D$AkLSp zd-d}RC1mn|KwK>3LPw51_9>gqw{6qr+y63?H*}dzI;K+e?;k$(pU;}Q1#DlGP`~=EAfhZw zLKG|Y0;-)Pb7`1Mb1}F->*NA~TL26IzERQy$tSw*k84u^fTjz^50+0A`lz}D9t=Fz zl_J(aJUVy4KRb3GFz+8K6p};mj`=)o{qJb&*zr-Dv;R&}@A6=I=%SIaXQH9u`?9I& zhX+qQ^TlE@H%nP7i;v7XjQg@4Bjofs4Aw0+XY0PU&RxIh^lo}5QVToanUmAW`LR&o z#1CQee=eB{><3U+-0g0=1#Ylg%s~7kn+91jV7^1)ua|zDK>`s%bR>cB{z5u2?rqun z0he$4YmgqqWYXi0`KOQm+x$Z1LTY5?#&%hRQ7>K%3aFF28dPnrHibK0_r4!WhMqTt zV-=>eO;V1kqOq~mph9^OM1WlsG-6MK}( z2_x8O%MG`@=}Q`&eIQ$4&E<+l>##{M7No+_`H>%=IKKZM(&-2VMv*FZUSZ?q?tP)Z z-EhlYU-Y(ad0#TE5%L8MZ!!vuL9SF&iK$0Mh7SC*fBN(^C;%aflA>re$p~N==pbC2)~yCi@jOp~RV0}Xl(31yA}}Hf?2J(ZCpD0j82Fq3 zx?}guK;4$X96@lM@rT3nFHKJ$`T4}?;h*R88L!LLb<<^6y!~fVS?jf>ina&pxMGu0 zCMXx&`#iIIzdJU(>)XJTAV>fWb>ogRK4+-&cV4#j?ROh3t3Se5^s6d0n$~IM0#PMA zH8Jx17bi#eezyc%PkYzu580hvH$k|kA3J#(aVu$a#kl_GEZ*tEMI{f^*#Z$LfD_TE zXLli+4eCsTA7>P1J6}%6+|xV1=8w!hL$Yh9zpwf8%C$f<09d(eOJ-Jo$kbc(ggmFy z8rJ2Dv`Ma1JEc-V6|7(X1!bM8Os23Rea@V~#=X8HAb0^hNFmB2l+ZMzVHkxGE=8P9 zXMG^^i&tt~ghO4FE9EliL)IzPc$CU@27!=nmB~~(z23A60wiHb1Sd{2{TUC#)BgUZ zek3W`Y&JDt$j9evWiG<=xiV7xj9j5Lp){ZcKl&*q_^TygF- zsH9C+*H)Cq)>)kEKV`D?LrhDh1ND@+ko6x42ZkT@dq;j5^i4mROvXv}ia7s<+^0Ct ztB1qYeWS_T{x*Z9``u>y;2mJ>)`82CF64rvp}^>qkpjv6w-Lpfoo#`T+Tq8?8O>5=iWqOT@gekezvQc53gx zWRpqvtAlI)u;MMy3;)2{h$T^4y=!Af*T9W(rMxBRn|vml&3Zxf763*djK?TX@}mUjK(Zm2DfzmB4$Njn z2LQzJ*H;W>e!|%=s6x{skx9oULjIX&eeSW}`aJV50<)5IxO(5c@zR@qXmPCnkWi%S zNTt$6N}SJB%c1?~f4}$Wp_jj$1no8MPtw-f=tGVZN;DeNz{XA2|Fg4w(Gf^bb@pEIsbZ-rDr9D!3k61ghPwX&y!H=&_{oWy$BMGR%6h)7 zsHJKAWWZq7v1!XY?h@0^tJArvK(ER#9NP2PC(*|Ae0Sf5kF#>Q8I^t!4^$m!0nhf{ z0Q87t%}=}@lEYB(PNXO$-JYOmIttK?31Md?_bh>CfFQ}BW38^SECl;n=jvm_a zm3TY|6}49na@|HfgecIZYLFroIosBJsH=P9XQYg=BZIj^;G`%K<-9~4&FdNY<@Chx zgSakbHapfC%+AdqQd$e`0V~WQIwdrOCoRTx)^>SyLQCg|m5l+wQUM1CP%CoX3W6|g+Loq5w zE;nLhL0aQ*(zAQc;Kelr3?%6)hR6_$zIzp<(?C7K6#y;BM50z-b^YoMS;*rqcu2K zrBNpo$$P~j)})Z538N13l}k&Dnju!?pI0RJzVvRob>K z5Y3WF#Km$vH1WHjcleiH-}r-G_vG(+1g_xHI=y|hQR~H69IcnPb!_~!&d~dAg{J*& za-~U4No$gHe0E2`H+)|)7dl!l6{8^VavDswjcToNfMv*iNrnJK;)!(s*>hQus2n8_ z(&Hfj0R($j24Th0pgQN(H%_5j1qjQJBrt<1)MfPoVfmo!WU#F zA<2urLg14W3YD%E^>aVW@+47St4emRxP{;%l zasT0`GMY{jhv6DgwSTJ$>R>1a$;HH!{7+u@T zHPZ&L8&X`}^YXr(zx_0vKhe@4pSk97ky)U*=oi_7pPa7TJ z?ASA(DHbyxl;wM&{&yWf#VGMt2%q_R9ps5hGP6}YeYiq4no7kdGMP9S)?Alv+Iq{~ zd`)Fcq{;#~=sbjms+lBepQC&J&F5Qq8ET83eCR&Tt^J3`i_CYOFs{Z-1o$j0-CQf z8jV^8!5&^Pdi>?D`4+|=K^@#|Y!`##XwbLr!c5|e=u zEX?ft#ptmYzao{&)h0{JR+GiK71=YDSS+HkZ%0|}y&y#_)o-?1Yv zep#V%Ze6wh?f39iS`ZH%f5JWU%GX07-_escIM>TG-?xk{(98fVYa)fsXwr4W!roosux~=6HMSyah_pBQ%a?Y7olflyBI6{;1ieyw(A>oywvy&x-Dz_m|h1I~FIr;VRH zP-5ZxDvV?emMuq zV_dJ1t&KQc^H@$6Xa)ewX|)Zi(PlMAu1XLqF(pJr%^!c=wnVig<*Ca1~N zvIa=)jTN+8RiUL&$R)kmOk%9eacR5`k61!3CnUiQfM-BLB0c*$1Z<5S`Z=6$IR*eH z(*3Y6oIe=+FogoV#16n6VBdp%Q+M}zabIj)e=YOVd9of|*Z+PUd-a#hPfnU^SY z*+dkiea8~v(O_pMMc7c=2;E-W$C|2#{^NT5ayPIJ)22)wB7F8ePX_HKD?k z$)u8{LSP1@dygg}6Hi1EfdfiL-O}2z>iq_zZ4*PwjY#vCk#s{Q;yj%{p*zObALgPn z*~CIPxbSi^k(lZlxau1^Q}-YO-ai3q`=hCQ!6ES~{+4ZST5)FDHFO zkm#JQeim;k6bf;lck&6)!jIbR`c@gk+M%&7NoE8ra0=Ty+IntLDOJXq>En;3)A7l4 zDhw)QuqdEq5UE=Q>C1+zB5jo9YGhY=uC_Xh(Vpu|>Z@1>ku3)zAPf{O7bJm1$cjW# z;vCCmE}2b7MyIEb|6=U;-XElr(Mi48zTuKfZ~As?=cQk$NvxN}lQn@9;#zDsXYZE3RH(b(5lsl{pizb@=4!n6<)MR* ze-ikUr;J9|w$9EqAF`Td9Eu2Z&wtlXW(1_JrK(g6R>%A_$K;FMqwxiw%<8c7xcycF>~mx=&LIyG_VKj&wT-IqAoyr>U%{@Hm!|4Sb`9TxS#n zFp%t=X_*r2gc@g|n2+YN@zHqHJ1&<=0m{oHQh?)&rL0Y(wOO@#`+D?6cY&^tu9W!< zI`pw4ETc5gu!A^iE(d!Qa;dormkG#Zv@?EZ`@J)h%@_XASsa#%WUv^ZD2&*~Wbh{n*q3gs&W+Dttl4t%AM^X?7=#vjZk zGYe{swiEQdH=E2Y0Qxa1e2xIHEpzzZSSJj_Vdu}JP#&3^8vcbEngM!q-+N0HU7L*N z$^qZuyJx3{ehMQj(G1o3EKl>j=VF0o0B|l=TVd}(8&H`mrKh3h*R51pTCme~R7#oo zd@eehMgKgj02vAL^2h`FjLXiq1rPG+q=GI7;Ja>AJ$%02~?~sZGTqYeEiO0jofe%>VYo#0>!u1p^Fpn(32Oy6P zvW12Y?Ho_Glmmb|?42Zqq_{Igs1=pDV$L6ny7!_R;~|u19sx+WA}^=@BaG2{OBX+XrQxsn-s)7hMt~HpIy80rteh+#Iat1S7v91f9>kr{6&jn%?${G_-uUqfoO2@k#st_@P?;qzTl#b)G1VK(%+|Vq*=_7)JB(>=p z*#nBC5-<}hoghImku<4yVd9}w(tk*;rezk3xuaU8h|rLZru4lXUEQ~`EF}+zeEUv2 z-x<5L)Bb)gKh{t?&O$K$NILG@D+iX_XwM;=kt&yAw(*3}jKxtASEP;$a z6q||7P(QGsx$5*rNPj>dGk&GYOt>U7{$1*<*Teh4JJWKl!?c}!}lIO_`A;) zbJ+!}z4c00YwxX)>D@xptO4tdj!`I0HZtA+nmd_fPS7-?7#}CjDAi^w#D*L~G1F4!_`F7k+I&@50m?h}nz^0tub?p~q8bq%sn)mzmru=M zcUnNgRjE|zNqM3LoC0g0%ZAPh;?5)zjB_}Zh%fNyQ6~?7R0E{=GlTC)Z6nHgOUeRE zDF6`Fd-{l7$UnqJ(CAJ3V-epz_rk>E-i6Uefb<71h0d-wxvq4&HhkJ-9k@ZEwzlH- zqjFi_NHj3|NIW|Gl+S(q{&+NW{A4DGIR7&o_jxY96!g%SD7BU~PTSx|Z7pj)DpxvM ziIQR=ADWK^N1sY1=YP-T664U5aI1BeH3$f=*Xk^5DT-0o`7~-g+E^Qlp*ej{#D0}Z zwUo)kCe!ioF_~Q3?drJvOA@I{#udWeu01 z{Tmn|iBL$7bHmCOIM=HO>GkekbH(3jG%Z(^tIAe%42U&qR!B+mg=Avpse=cf{rhY@ zK1$HxC~frVP0mePoq097AN0ulqFVs>#X(gnWg|7qTgLH16N)TbO(nTogy}BEF+z;63f#mwZN{X}cnsstVx1 zstS2EOG$G6xv2yHas1f6@1Hh9axXT@mgHO{P%E2E_RW2RTmMX>?YOB_VdcqGzNVB5 z%2H9*4afidkpnOMgBTT|*3SO-noZ8FP{`Dg?LJVmaQaB~lmC%shDAIOQ!-#T^n%Lx zw`eQepwYG8lE|ogt!A0P?>qF<13Mr6_#$4udFo|sfo29^886;q3>}U(3NHKuMw4T+ zLS@$F@+GOTmJ8-{Sr6LZ+zOSp70qu94wZ#(*AGsn&Jy z04;=qvoH8PW53aApk{704OD8BAd#xEG@~DA?;N;QsZ^*@4qZTdA8GwMbu?_eC=2AG zq41GVWae3^kV`lnmQ{ETGugaITI6VZdt3i)dV{_lyFyPe=-CqvdG?_P+fC8~NDJ$b z;?Ti-ggXH0i^L-?o-I#JzJ3Xq6j!PbgY04vTcO2{)FducAOd(_owr{iBa)JZeA4Zi zpL}F|bl;EWW=0+X?jr1Tc3!!0^UXh0>jyqq7- zz6iYLVsQ4?&1JLM*7grx@ei$?m;ZHv(++?vODSi?0);FWof+Tx)w!udcNO!wfYsi0 zeM@`Kttg%K6U+zfSRuF;Sd^HwZtMSV|Hl7BcK<{ju$WCPq|)J0h01lcT-Ck};95bz zz5gE1?BO2}!mGw#xp~HwV1Z@;uo70Wv2#EwF+QVFD=fhM^_FCr(tUsjokS{;Gc=#&^OGSobG5?qnU`4IY ziqe73ArLZ72o1HV6begKT;YqkToh&^jv9#f(25^AE$jF$ROJ z4IKkop-9#P6o6i%Gj`$C`DipS$rV!b`E1$)P1hW>7g*p08Q2nB3nb(rr(H}(jPt)G z0RX8P2~p>-r~B*Zekk>gd%?S~FhBO&aA5j*(%)}$_FQXq^u1GO=zEXO)N{RDX;cZS zg<2#q`e-aN{*=!<`anFg@MIzpn^`31FSpy)fuS%>;~{0pI)! z$etXs*}8A0*_LZ+0!Beg(!u%Z1K$e-W?y=pGc^CxMQ(v+0C17t0DoxuYMK*vV<85eJ09l4;B<$TA z4$eNyvNhhI*A2wusXWAv^cuZuZCiWqwa8ysc&-@C=TrVzEOfkBNO}ceTtIn4iry^> zAT9vlkr6-?K*E5UG<{VX+Oqqbk&NrPJA*M3~KS*}31(OuYP+8ML(}ov{-U0rKGx^~k|KMX{KEcD7Nm6H4U=YDtJ?K+*# z?sWCPU5K1F*$7vF2Y?*#1;3XFP5@p7B&vL#WaN{{z)-m?s_2aNEvwgE`+vn!qbU;2 z2t>7FMycRa=qlTLe00}$!#>}h##!mVok$+063;hlLcdbMp1*OdmNV-u*4b?_Zh>$$n1 zU-;ZpJ76cm*-!p8>LB;(slZj#*SGFt?LC|RSFyyHie<)3No7(a1baLShaUFK9KMH) z)oinGLS_dfJ}Nt?t5ifM1F`Rkj1o!pU*H3oB?Z8+@$rd+KhgtuXmbpFD4JGwIjkyi zHZ`^Ll@}klJ)f_u{9WLYH7~cEEYQpVET`4Fz+(k-Y6!sLpwZ~KRHiVnrLs_mp6hTS zmzc|>(_R(OMtH_k$ar43Ou%V2z*D?l%NA1ctcWxJ^OOWf0$k?1=I}&_!_N@J|qh-|xbf&)d z(lYycncSd~ig`HDxtFFUc6~3MaPOof60uTk=q8vLjn>?c5|oZ`SR&U?()<_J@dFS; zvJ3dg$#`g0XLIrCTrNJN);OKBLLpBNDTH*_>EuwHmrWGkP@WpWCGbAW$lySyG6^X0;Iy z={G%iTog!ufCMF=SVQ5Kkt;2HiO+iG$DXN_lamY>`oR}iEpk;*(;`1@DA_89Ab{E+BlY5Ogf5>Sh>S`futg)3Gcvr8v{IB{4w|_O0mq^nY5;K&`8bz&8;=)H}XAb{(dSd9l#*e0cMq)n# z5Gxw3&TU&Sf7j2z7vG-B)C7eBSJ5a@#Hhy5(?0pw#Mpr!Ld!l(bmXn}j$8D2xC86Z z0$?G9@^S@0hSK?!1sY!hII-&|06(JCN9cQ@l29(B(3UnoJ27Zo&isy! z^&d5vd*6-LO(j;uPFzPA6EjlA z@9hGyt}mIciDWWLq*F@-pzb~V{L>G-yI4#noNYZ<+HLLEDwO&zilS6-^(XKrq^<9* zI*_?Ra79!np&?K!kBsd399;unWNjaw%&j)tZo=j^yUn)E&9-gZZMJP}wl>?g-g(|H zFlT=EIrpCzVmw{EMpTx4O&ODr-xS03iE&r%W8>aFs&Gy3+Q-MiClPyZHEUWd z8`+Aaoy7`o60CL01y6e-iw76ZCuY2xG|MLH;n6G;B(3HB;4A51x+(lA`XKdTi>{?% zUub9)ixtHxlL8Eo$XV|Ap7xD=wg%_(9-K8R>8F^tgD7(9St?5)%EQhq3nag5fYsme zJmlFf@Qli;0`7fF<09omgb=tz`W0vW-&vUHcA4cgL=4+Dj9q@Ggjsq~@AKkA*joL_ zy%C_V20YOUhCmd9C2;{d0Yx#^0&>yuS+783=|5l;fZcmJYwAUJf2N5y z+uw=bh;lN2J|ZlJgT9e{bMMJ@-97y^t1Z@x&ia$=wW!|+L<#Os!{xJ z+s;MTguO+#Y$?M7u7U6eYd|$Tjbk?GE*_cG)+kHU`T5fmaKGQG{UXs{+*a|``o7j2 zP$R5O^YSPgL-@{@hH`{u2AFK97Wr?em)u$&$wVc;lr)&28LWZ}qhc9}gyV{3=Q@xs z-8Y^(?p~~UAp{_<=1yy&J`1Dr=`xi43l8bPV1n%gR*ny!JPhJfdi#9+8((#Dlb{r~ z*Q8xKa0o`#EV)mMUDS85hNOuW3J{`oiY>}R4(pBLR2e|pjdPn>lg&r+DOIHjQs=6I zVMhTt)CH812@|%#>`LiSYoJr(P|)os^lFNPwkgse^aY_>o{fG+P#5`!^Hd*;{C=7& zD)*q&{cKcY_F9%W^@SL^0b4OHuvE0X&R)*;D5KM*^)+mM(SsO~ z>H!dQ9MZO9&dl*--zD-T#(X#j`zUIyFxtpw_k44PFK$l`N|-67-eKQGQD!&fJaR^Y zL!~sy87JS3H`1Lxcf{0ss>=3O^Tut(xBtQ2g9WlR7ot8f(GEgv-f8Bk>EqbyG^U^F zR7g3W19tiUh#Gdjh$eE2!b*ctvZy|+RZe`b*OsAO3^28F_&ko@Gq!@$>-eK?P7klEo`fGLW~Q@RjBI#X z>@uly%B(wBt)g_ug7h zcdyl&829lK9=gQ0M)mK4SYmggp>ly!3G|eJGxAP8$2v&Pplmd4tK(YoXLbe@iLkbS zQxa&e1hN?+5~qTe1h-wG2l#p-;rMxE6D^~`QAj*VnFO`??K$kYjW$>jqIMM4jr$Q z%Uf!XR^=6AjHUfda}NL4xxWd_O-d(hrVtzPiu!R-=>_w7# zo8JZRds= z(p_RWLZOXm)miL_c--=JCy3&}l0vIuf38f~no?`jqpw$fFiRjYDup{g$iJai`KE_| zCDn%k3?M7XOnofTYvInBA;E*ox&I);cc7EzPMdyz1;HH6p4m~|(x&P?bEs*eo|EozugW^pHPc{6L5a$Ntld^YV_h5b_^_jb+iB);cu5VKee3 z-0hGQAVp1hlr}47`Vut#%=smPnL~C~rQbwv+TfVExYV3&s!m2@5tr9AwcFxEswQCj zgQ-!Ol$wTKn&^uW63n2Y>xuoxMLVWHaMJP9dvBn|iz_=uI`_{%pBL%@P ziL8y$PWlgJl!Di2LG1#*)0%>ZjBF7hfB9*~SLaeQsG2y<6 zlC_m-QshDdVvmvNZgk*7!SeI@_jRV(0i}hA_Ly$O`!axwI6z?U_sviBl@2qH+tDtB z1|yJ`Z5iMv=J|&AdUvDc$2Ywrw~un|d`b-EdM*mBD98_CejKj$qqEDG_)sj1P)#Cg zmyeI?m_Focji+W`)1-@3G#OaqioXu+X|x9$)3M*Kp2d4yZ|$!cvDIoe9#b(r-&`_O z)PG44kqXNT-xkpqbwf*?Ai%YUZ8Vtw0d_-)AMO1nogu^YRF<*XE^fkhG<>kc zUWk7*#Rr-NhpvWdO+nC~r}DM=SR@0I3&-WfsCtL}Xlht&uYBq0L{_6Bn z#qa?_d^@S*t=O$6z8oy}*P-De0gYaDrVZZ7RmE>&*;B04$$ynql8)j>55LFVgn7t% zv@DMR7PP2Os}5J(;e$rq{VtG#KONfAt{J3x>$VAeftdHG+9Fd2r#@O{TP4#NoNL7B z7C$j0tDyU(1LAzGuihv8eW~gv?X>Uo3(55VdSHnd$&jP;is^h;Uoj!84C znk|~EgQ>xaiiPODzezJYWSQa=tJ><)8>u%)mo$!TKc9*46`3T%%6#-$|0)!JJDe7W zECla+Nu>-y{wnS8y)MMn*@A(mu*n>lf!s$%VS}rHpN>PUQdH za(uA5*gz>vG;v#apdr;z{V7uNu;KS#`=)|b%9Tk7VCV8?+ntE$!d5d_VWIPL>pJm2 z7FocbV^Dw6=$I2<7m$_OR);AHgv%MY5{w@teu@B@hH4!e`ex?(Ydu2c1=eT(n$DFv zRdLF-$&V(yo|XM#CoQEcd*pP2_}3=wqDxIpZZMBBw;*H;{E04^r~y=P3ZzD99LP{T zpKFsC2TMXW9Cb*V<&gNEuD%W7w;&F_4;hUT4#i~OpF*5Jtqeil1Yw*Ne<>~& zL=6dF-?lGA-FjVbX0ZFc=Iyyq1hL=Prfb3YcgNJZx_4;bf@h(kNgW*2XbL&jBV~aS zquW1W{_I@dm~#QsOXIep*{Sd*PR$m9j91mb;xqOJlWk$irUs}2$-l;iJMyH=H(oqE z4{nrrgwWQ4(!JiMj^pf2l3S5ZJ%rzQ+)HFqHt+Kq2%sF|35KYY7aI zxv3N>zKVs$hol!FdR(r@UY`9pgT2+nCmpiOHh$KE!!5Pi|MolZy8lG8aNW1<eabx%q?s>2rr(Aujq#0p}xBq4k>w` zf5Tn~SGx8hA%Jgp1%G>B4it(ME4+~TBjrTc`6A}{W`cs-E=r@e2Cuy~i7_{ypJ!GH zIZI-_v-3sH>T<)%!)`ML2vaU2MO zeoNs~(RFBNw^VP~J#b9Muo0m~Jm}nrbOXO*L}=UZ423On-ajalG6%#nLPz9? zx%y*tC7i*i>V2ltU!=a%c)W5H%~A6wJBkX@GZP{pejL5u_jwA`@K`!NZXR1+c_Ksl zG=n!%4|GaOg!m1`UQ+>g-fjjp^BWb=p1qZNDwNBIsxM`7X|6NC27TjVq^B-dpN_>9 zsY-n^V|om78zb*TCIQ>K+D{>qKe5x+m4N&2d8%D)iiJ?b{fv=A5(;K}O7h6N%J4FH zzeEFx!|u!IFJLgCBSNh)AgT&dWXJkQ@@8?{Emh(Qr zNeEKGe$B34xu;`FbcJe;=}Q?b8r1J_~ehdrXqCt=QK1l$5-_5%2S_lh}febh{o0si#jwMg3Noj znm+*3gBMv$iKiXOH{hb96WCI-X*Z-My~IXDlf)KRCMKGjoY%zkgM+{6&gw0e_lp9q zmm1UasOf^BVyi|K$76_Cmh=V@?!0!7%A43MtHFRMKr9=!!*}7s!q~&_Y8px~_Z?j? z`R~M|b8fsmEf+4>@Ouu#);I;JxE(iZMti$LgL#e_&i{d`g+rPF!XWws^Rr^TYNj*9 z^Jq5lMuX*oLzkK9X}%=aQOKxNrUWfmTa0`_l^T?-`WmvqE|Hw^SbRqw_PZXO_}J|M zyhupIkC^Lqao&zrL&~bTw{bq?9WRq~oR!O~D-eQnS+SkS7#0`|Dd zYYks^g3PcHuL1bt{`|%C2}R99w6OgPLpZB|`&wKcm=GSz>+N0sIGI0KGh4$-sAc#u zx{{4}OjHy!p2R45U?FsQru-N7ay-oZyzk?7=D(?olZQMK?;I+O9!A(+b6o2sN1#I% z|KdneKemMu-cJyA(h;V6LM!*k5#t2q9jOp&4lJe0Kdoi)E^A!qw4_%;5E&;|S70yY zfdxY(%L4IpGTaWd#*W_`pcr;k^M-Bf8h?|ONA!|4#=9HR*pDx|zu|SFM>_rNe}wS~ zl@9UyMA{5wi1V3vi*b-yE{;=y+>U#_m@v*}`04+B+sB+x1|ci=zu@z-TJ!Q-9Z>$5 zS4?++Ep}m;Y>GEo`ZE#k>eG;<4uFn3U9bqhYL3HhAjSRRF>DFW2P4S`38Au|()UZcfgOiZt1yJW44xX&Q~@e53eND@C=ua?{dE&#JyzdxWVmMR;75old&{M*@s< zp~vPK8DuR3Cg|3Sg4i}EjSksS`O)Dbm~-H$#bRbx=3v+q9d|pCYYp#^MX7KijrA;Ouiz6tc(wJt15luaJG7K~6nGi%VbCQvPRF zQyCJ=39?v{!P@3I2}Ka!zix8nVlH2FgQv|VQkv=7J=lG;|F9tkoCy8`$Mus_2oWG} z(T?$m7Xw0VGiL*`>#5Ft>KgXy88y$Xs{POPqC?SLS2%9R^=DkMl{ES8G#MUyBt}+` zkuOCphYuSKz*d_pw%l9#SlvR`N8qxSG)-L`j+SExHXbe>AN^e`SVIW=En+vFYavMq zIx1s4SnzY&^&tUHwQ3oSk-v^QHIqITlsPN%Vmoto*AA3 zS#sN%$j9#Y?)65QvN?9wdr(VHyx=5`%a2vf=HDxB15c2oHhPp)1w#U?8PV`y0wHh6 zSDw3aAd}2mRjbqA7up|$O_KAIqx(gvLAFdC?|91p!dyuX^t|LPT`Yrk@=(z%dF(_y?2lBO@*`84t7~c zwUBU-)$+Y&s>64&M6RW=`Xxwm{fBmc)(A&$NS~p(++$2NmMgf zN7n@|NZBMk;BKTmPv^VSsIz~ON#hw6%SblVGnCABI@IxZDtn^E-ez;Anit3n%*N;W z_xoc6y^PE|9%s$;1C>lRUvtfEFCeI?`v39f7=UrM+O?(KXxU7S*EzBT^!zJO7<0aS z+1W~JvsR{5T91c}D|jPJ02@CQ^qyPo8_ye(l}HQ3Zj&vXbsaZP#`y;ZMtqQ)8u8aY z9P->N0KWBz3viKaTGh8|)ztVK(!3&Jn$oORqXq2;E_U^-2V62@#9+GeHY{0HGMob1 z$~Wq6a6aAWssU3gt=Mb_HBwwI2K1CWArh>ZAyR{dRh5{fMWRa`=S8)qkjqH`M@B=s zasnOXa6@|AQNRDJo=h~sr#(sLqtV2-tD}*JD(3Xz@>y<1B6aUYwdm%>il( zhrHYva-DmUezoZ#dWaJNQxVcrmi%40ba-1%?w1}!aN=1F0LL(=77K6RH5fV|oP7nD zjkW7go?1tULN3V)mzwoP5a{vDBd`XA2Kb4%y6>8=#Bp}(Kv?8P+$I1p^e7;0`wqz7< zBkfUKcu-eTJztl+3;y_y>w%yko67B!+pQ4-Wu^AT1y>k@K$w|2`Gxe?Evh*4w}$ix zfvOTHpb|szu4B(u(^c6tW_(+pdoS6H+eobAQY@QQvsd3*{VS6HAXA#OiYRj)Vsac8 zs`4J1_|w;CBua+I-xwsAimnUG=&5=!5U^ixpG@o-w$`gS-Xu&(xZQ5+*E-0&gyJG~ zHq7>`d!y%V3&N`UMOE#KO)r8fGC+HGWxC4|=93Kl_M*!!&{FrrupTt-vini>7@SUb zJ9|>Jv7`QtXv(2BV^KtMwAkcLW6sZswA?`UlaA(Y3fdWkaP zTc|G=hx4`gW!oNd(cY|5Yw&B^=nJk}txfhv%R|-LXKZ7^1@sRSO{f&U?@S2&%1*mu zC*e9<*X~px`MKa;_#@lqW^1KCf&wSoJ)ZxRj_d!+^T3$@^8D_~gCRd16{_+b>m-2J_7aMD z1BrwH%iN;YrCGPVjl zwsU8|ij$xdt&R)Fh}4z=QoKUQc4!)HM)(N|7CM95hH5wj%{9fFfRX$~YIFMegCG_P zsgN}uD|{v`{g+u@fPPAyM`4ocajPM-vV~95vE=TQW!KlF`xl)3ZZZ57QXRA1ovi#W*p`o<>mKaX+YFyenE!601 zs&Ow&c5f!SNEVUB@M0`%h%J?nDWgQi644w4*Q*aG80UR=5CNf%6;!Z)(&GcYJ2P{1nV}{WfKl zA*Hl7^{x5Eu2a)0*>$CfAu5SO$fs|izTccXIrZqjBgD2IjpWc`6vpu_HDye+Gt|`r z<~r;2WTGzLm-e6IbGKi+McZwE5Ji_%H9S4aq;5K-D$YCNjnL_sn^m4JfEzHd-CRFk zOZjqe`CK10CaJhSRDXn36hE;y>bmrm7ZD`}?&;~;c-NRo6h+7VF#NS@?r`6`A(=e9 zx>Wb6bdxku0%@YucD&kgH?-viIhE_A#rog5OoB)I%mCK}GO2WZFa;P}3cDKKTs+S( zeB~NE*zAly{XC~Rz&FFUR4NqhwZx~n{gRAoeTN6U+nS)eH$C#G{oWaFbi9hSf%e+) zUSQ!4ZAs9YdElak4U0=}Q_a;fSJQ#h-#VPCCq!c#P+s6(N(k@TN51HiC9~IF;-}5Y zTstd4>Z$>h^<~Oc$&xQwL=N@3+7M(GqxQpY&OgTmrh7x=q{!DU%LV3#Mjvc6t0VzV zo`bxe*rhB;iB;x)A^}-zc(j zzE(If*CKNcVk0EuHOAU!GFb_I5?8$# zs+Xe*$N7l5exneBPx!MMj8LGZ6U@J+g*8p1s{cE!apO*UlgBu5J|=YZRs3rD&YL+L zmRh+nt^D13VI8XSwz6tP;RmgFxD_-P#eg(bsNG(eEA!&qA_>$F>naE zUs}qyJnbZt2lf~_OyPS#br@dbczBwxvE5!3zk;QNvnEqRn%~5~zrgc^VH4ov zH@E0l7Z$NXl=F%qn3B8)j{|Cn%98H#&5gkh;h&sz!_;{O) z=ySW)9+%hsz|&6zmgy{>jgv>-aXMDLrN-XO|HwCPckEW(dy`rMu%<2My;xi;iyO^d z%K2Hxp=!-7P1f**n7FXObF~U*dVM%!k>hCLyxIk&4ckp{v+h8c`fTwcGUf6`ddsG| zROn**xt{4)Z7cOJ$W7vnn&xKud`Y}(x0NuuY?!Q;y>JP@ul&BkWk<8|5l zuc1|kW(X|UiO)(NJ~HKL%f@%N(KkS8yP(vI^^(b zexqp7tg47GM~b4NV^06ay0X~t>XIx}eH+Mg*f_?}+%?77)2FY~V)JIhKd+_g+e*r6 zGkOT67#;Fmez%BYm;ZI|qa*jzsV(WgrTKAdX|>}M%{0;q?>I5~*pCeF6P4yEi~SMf ztq_IPmy?`FQGYhf(-nBmrSEM0S}8Q&952p5h01w9U~YG=01M2nMyoTtn9W+51J#WH zb0usDJ*M?V#ZR~P~H%l!vXHv-fjAdF=+gpATg@OrfE~5ov#8f>fkOa z&@z+MZ`h>1q&n2E_z9`@MRNyCnJjH?-poW?s?G$)^vMCXT`@RgS($O}2_)lB(!)3S zuiHbf=noTFSY<4tQkHDQq{cDKug-+vwH0do;^IQjU(e|6={#-53{mn)=RgY2Kkny2 z0CFhhM7rZOsp3u zbX{hyeLksLsy%}z>+o%g;HXb5ypobojpC;|>TzfjuYbFrsE`iqs;K^;%SoN% z!OD;sp#qsc@V_&i1Hj6XZDW(WH^=RL=sty8@v#mJv03bqQf+;|Y?+~gtCV-$qDi^C z-VQ?fvBUR|prJkZ$dhL?aKR>*X(<*W8SCHBfzNUGeT~0H1mL#ol*#uuQYC_pl0CX? zCd=u%jqM+OnNkanl}pI;$QL7`c7znZt{MNsK>;x%qd9H~NwaagDw;p5hG#yiB`UQ| zu`?9uNQ}s&U&KRnUq-^~!eIo=luz}XS4W~K-%QNUSOYH8%dafpav)HZHC`!iLdj zM#kn}@&Zutt;&GR3zjeHRj5zHhBq{ALI&}QtZuid4f-=}3=kk?oG)rj0S*mme@-#V zWJwc&jj`f9%m`60aiPApqj<|)7F;%)JbYC(+NgSM1MM(mcHHO^pE#sfxa(VOae>X{ zC9dn7Pk$Rf5ql>l)GdKJA zfh5e}MK28C4QVSdOdm7 zWo3HX8w*P^KgObK40frpQumU8@PCe&;KaYqQ7fPTpQ~xOPP@I-%tWXMvIavvPJBuF{5Kd zg%HFolMVe0g1p+aD~;#cNRLyv5f7J;vNt=U8Py`t1E5!80}4rKObdQohro>2vj_Io z$y(WIFRgXoG$1X%Y86G5vE+_pIM7_(Fk^9|!pZSvg-vwD$sP%-R-FA!S=w|(IYLGc z#1BS{YMWX|KJxwk`~A$?SN=tGgCF(w9DHOTK+>#BM2NeEj6reXdHcsP;X8#S_sEvr zj|@h0P5t=)_Su-Ly_54j-B7*ooT|_?F@66Y*;xUlTnuUwRG7L9$+YgAOeygdHsD}R zTfb;ucDYZv2NH#Z<@+mCL=@pFK%o}L>5wo9rnN49Oi%de$RM5xuW`M~%92eJFCq!j zoN{GulkNI%xj7&Tjh}Wdxch zI@*04GB&zaeHLjizPNN3h_(2O^~;OKvB~kUdR?C|h8SI9QA-xMtaY?x+R&?&v6c8_ zB$SQm*Ut8spS_!TMb(|bG&LdhEuGIoFnX_AJO8%1Sh;VL*8RO`Q5>M{@i-Jd%eysZ z+7L8)LMk1bWl(j^Ak6O2KtZ#TEie3Jfz6=XamziN5hF*pTy^G(tQ$1Y|5sd1dBX?0Se;vxSieMIS zA^Pi&KdxW0r7vxse6s^j)lttP+sySU_? zFyV?N;3dK;naNE-)c9`RbZN>Z-rCPt7?AYGfwXM-)S)O)G&~r(9&NJy=^$Zez+9ms z!@BFL9G-2-JPS=iWHCaOo*K*XGusn{JNwwjr_>r(O>KC?jGkham~A9HN8~ZM?Zd4k zei&Y6yVm#=fA)nm1{rl+$(a-++Ejg9RYz!6C(dbBh-pk*{=4a&jPLyy)4-!~XCi~3 zjq+bW#u}WMjLeFL+WkIFD1-*0n{H|Xe~}+J7Naj@w&vQdLP@MBA zD?VtS1Vh{{t{hV zaxK}A`wWSSg7v4#cc4XQ=F4^6wXYsLu$~(K)UIY-7X)Ks|M|ZEC$Kxc%MHfB+xoxx z5zc?b14RS+q`%()C0*r>d&5vWms(L&9&|J9J~|7?A+^P%Iz^s(-}Lyn*1SFeWjCv2 zNLD>>DlKe*PdnbPD1T?hIZ66AAXuPUU3${A0W_ei4Df1`r%8r)$Ek4mt0IQ+6COR; zfjvD&t_St{+ZPXZhF5*o5t?OF`@kxQK$N)JCYry{D3B;1NsA14*1IR}S>ALEIv0m` zH>*xVkc%N~)gmpxFkL@I_Pe-($LSAnGQ7PBkLTU$d&`*mY8tls{7lgT^{<@=QZx9y zCzyV!IRd1Iw=2CabSjv3V54gZV>5IoMZQQUM*-UT4wB@k8TU}^EMQc?r!W8bFz{YV zbwM4%15{0rJQ9s^JD;Rb1y9Zi0pIkq5_~#wtbpV+lOh=_HmUa1NB{Y`KhcCV{ztm5 z(ec%(?%hsvbsw@oc}w)n$}I{}x#N=>l*EhP!gb`l?R;VgjDLeV=^mXIJ0=`qIyS$X zp4L%`ob#j3%ZLU@?p}0yidvJ>=nLZdwkNmpCA9>Kp%W?t+YiC^?hs?E7ks7nXR}Su z1E1Kcj|r1{X~s8g^XFqny|i2|7hmy_-nZ3uhdg{&F;R@lzCrFe;Ex}Xs~Sx zeX3gel3!%L?0C8UO5%4=r741}u)hxBM*~$gDs9vnXjKqo8bW?96~OBgS)7oa_$26< z6Pjt}ZAOEoP>Pf%qKSX9pk%q*U!2T3EK8zt*^s zIXR}zdXbsDXZ&@5&31IDQVcYTs1zEcCS&y!TFv`|W+SrrRDT&$rSL~ATrR!p98;yb z1}_Xp?6oiVSL*iF6HHXbPlM4jS6s&~pn40Q*uSv=E+-QTQc-E@fWMMLiBh?-rC++g z-fFippEjQeyM@6YgaPz`2Qmcfv9VEew`1V32@O&@fSXuq8%0#Z#?&#m;=2RLa$8P` z^%)G(lWIa*%m=XVA_gu-N@4`g@fUFxIN;z?n*}Sc3pj_cj3>AHIbyH-XP)Eq;&y@@nx6CX~0 z@piP@`~30qSw9XFwNwqf6tGZXtl6pa;^i@ATuu!l3vDKj9(T^~;5u>JZ07mCQ(aq^ z_a$0(;NVveLxxuSH6UXKej8Ldg{)j9BjM^AIz8Tj8o_ndT7Iy4UGD1nV|FYnG158Z zHo@Wbe%%A@MMvLNd3DYy=Ton}n;KM{8ay+%Ux;XAadx?Je^zj+J?&Vef$_n3vGK5S z)wiD;j5hQ4wVCI}k4_XI8MBQ5w?O5;y*tPv{>b~n4Wt>C_$#I&eK~u{c6JryyhtI@ z(C)}}yTRnRcSaAFCWooSoFZ>op7ci|0|G&^rI*_SEEmT`is?momcmG;$AHbeX;;cN z{7QzX|6WeGG?-TMrC5aZQ8QXU+vRA+Mt&!i_Tb|!@up0Cr)YVEBBOLu1jTg$!G9UX zqN@>R-5*jFmAYu&-`kYbu~IX>FWKgd2)}zr&YE4zmKldIFhJ_N&>Z5g} zP6BnAgcXx}N{fmhzwSfY_KZM8f7NHtb0+-Fka0XcGctW?-8hk%Q7i#4*^Fl4ctI?6 zK-32SDUmKa`rp}`KL+{>iFAZ=L`i~FhsiIQs-Dvgy+-wpH_;zdr;6KcFROu1rp#rl z%hP>Z5_vgrdEoNXbA8P?kd4Nq4l^gUt`Cn$8Os9eD?26SG|gC*H+w~ z+ZHK5P`xTpRdu9!yQbf}YtWrk-HJz_BHAgICH}li|t`d1Z|NV)c`o5GZ5QV3t#H0-6 z>KL~(+Z4a3JY~m18ZmO{KA@6@D|CYwl0w~p$H>PIV@1`vTLEla9!y>Eh@QjX0CMHy z#j;8@g}6+S4~>5iF6Y}+^S2(c26oECG!J)=-QsC8v{_-Q8i=3N-EjgRXua5euc_ag zQF4w&6{2KhK;#SUEMH0B0r9syM>q3}hg?dM8y#lUe~e>>=o2eHgCKyZMxy2t`irpG zFFwR}sEUe=kPr>AS{F8js%BR<6ydBtii(O8=8*%pzBF35&iG1~eQPw)u7xDF6;TAB zwiV@vtg6}lm%s8@cTIThlXSL}M-MGXibup&#s3JHXt! zR4D+(Da0F$`-%zqNw@yJ{dH7X7Xz*>?&80JsT4G+8Lwrq$zPhuNRJ(LaCr!MbqC9q zRm+maLX8_|1UIegHF73!?HwI&9yvy7L%~MK{Yn|cuqiHKbC^*HZP>`Q4sLk}`V`TQ zt0ARfxJ9of7Gcc1K2FPO7-ea#haudbvNg`XLlq|~W#SS>hF#yCfgpZ>HnN&R7J@QQ zNi{6!m8tFa4rf7tsaNSv%{HbtuX$?`OvzG-W_J8__$`SpMMA&_QeU@?|_Ze3EYj{`BxZ`upLhLT; zDMOHzt~GrLHWSEpy2dx#N|3}jsDp{M3EB}*fems_E|uLBK6=gDC?}b%a*BSx`q!_afh(_#ZvXQF)D9xM_;d)z=R% zdLVAsJJ9Nau^#F*i>MR)2kD=UUBm)f@1h`k&uz)y{PW4MaZnvkj{S$)jF6Wm9tAzu zXI!Ag7T)hG^pIa-w|aKHvfkBtdnboU{NM%lM&Y$Qe)=ntw?1bjAa|=*pet(>zf^Bl z_>NqjZluTx`=@wWYAPic+@#_Mg3G~#UTp>dAmeaxP@{W$@_bKcjd>jG+>Fnz9KEhO zXfe?G5?)@^-A;eV3&eH}sa%th&!9juLFbVS21WDWfrUX4W2e;psPqh+Jh7T*OAiAE z=dh)d!yWpJE|WR|u@C}ITdT5ZP>cXm>>;X`Fb(`lWvb4N z6E3Oh5imvlyWfWt0RUjuFA+iI^Fpw%T_v%hzsW~C?5O4^_W4|n3cMT#S0Ow|2GJ(KG_n8b9uv1?-$TOupMZ_S1}X23fb{V6Kw<}BoKok1(V z7+`bnr^DhCt$z%4`#ZaSi?#l`bBl2DTz3-!0x$nP{4MlFO!U32OzlOE6M*II``;Um%GK{=i;>wpS^dE|4ozJ=y@EJ zwMIkYW&>ye(F}stUo_ywLJWflS&K(!t=+`&>^UtDKXuq!d=HQ1{)!aq?^W?d7y`wh zc&Kq!3{@Z$z&P3DRe$%+^OHX`;3j^}3fH`M={r6kMO(jVx6S!9ZA_uGeu)!MviEXfiZQ|(zp zepoVa9s1A07LSr7n%jb1p-HpKp~Q;yh))@?Nv@VS28l^x1;q5?!az9Rs68p+H>LM> z-H)W~s0pN`jNy3-PCps=x{^8CK_Z_a|LAB?T5xU93eJA41O+b%M2v>RS ztv8%CX`15RNTm_iFYo-gbbe=~-^Biu#e$Mun!)cd$>vpPig|Hmi z80!51Mj1l>XJLJX-`@yV##Jf(82nUId>o&=U&;uz!Q7Q(CL6Mv)^|=%8`OC>n##4S z&0qY~L8`q!X8zW8HmFkEANp)t*<%4JUzy%NhckRNXhRxKjs-PTn5|x0eAW!la8y+k zCI@3TvD7);827m$ne&q3y(9$ zw1f)zGqa974lRg14Iew~o8Lg@;_3P>JmC35a7h`8Sui-zk$>KaZEKV7ny_l=1}Vg( z&63N*cm#p})j93`+x%Dk?aG86;yE5F6Koy=U__7wjgu`C=40>6e*c;!w+WVQL*yqt zTcT&+zz#Nb>d=@psh3|6vz-`@+q2|0(U&RScd-Tj{TB|*TROuZNnw+`71S90dmX1O zRjR2h7@6)S9)=@d0kMmTI{a+EGrmDR!oXFM`(gSev)Xl7z?o;L&guVB6aRBnt|^0E zy0F5Yx_%-vC=@z(vJx}J5qnpR@{-Gz%2S%fl_p&c+Stmox1$nF^uy;ibUzlVIRPlGG{#hFb^keF zRx;42nqW$it>|*>y*SxaRIOL2BbQw)H_XZB!V-04Fa2gF9VRn;77Y)$GS-a%=w0|;e5e_2wQ=JUZ0Wsq+!EV1 zpwN5W9Cqz@NRmf=VtjAzDmU%C8Ix1hS1WS=^kjnuq`W)7UqQBral8(gkyT(t7W7x4 z#*~Nf6-aD_^vMUL5r2V+-~CQG0?kAGKH18kdeyfKC~>YYnf69pd{yYjZ>*X(KTX=s zHxWDBQ>%cNz85EQ;=%}w?9Ki6Nj)e|@J_ef{K{=4nL)PZB z4=}T@dUCe;fXHxOlMJ32e4mKvL3*Leg*w5-Ak7q+wF;?=@NU(HWP-hRh#!7iKmb!> z$0N#3|M%ovkin@+jTxS?%F^!gA>*q_@~b;dM)t464@DLgt2mOd@(cke^Zr!01Y$OW z7Fj2Y)p7&qoA^d`S_UYr5u#=;p0h53!kz@iSsocH5eDw3!GHHVo;#2yN+Sq&lK>`OKyqiFF9b=3vp`XmNktgo6qgHRrr8S6v!Js{qHX z@}%F?CEM+R7WI*cs8V&J$(6!K4uxRUxaeweaAoQVIdT{2r1@U3_-JgF`V(_&Zj8Eq7RS6T3|LQwz zJUKmIsAi;}BJf3gjZyfbf8H2j06F#00($iQwW@@Bub-Ck<}&-^f@A~vv-bX35lkUr zDa^kp^4Y6n7LyN-WV&r$a(_qA#~#OBl|<~0qV2RyW}b)vAHN|S^*aVb2>}Pd%Q^xf zg8Y2jHG|o5hbDwbo1aO6r^omk@7*;hrlB(5mBNKwPW@NQKDOqac_F~rhQUDX&^V~h z$}*K)PhTTU5jD}$laq_JpfgWhpZU<0wNAXT=L zptD&8zyRL>pC`k#Ftv8A846&2VZO4eMaINTH+G)l)6TqB&F?O><4$c^l{C58-X7C2 z;+OtoJz<4JaKvB}kYPpuIFudz+r^I#!miNLgTR2Hq2!9{*_=)Pj&hZZ2q1lDo>e=z zsR`~b1g_JqEf|ULc5dB2x%nniNc#}lxNZLuZL-Q4?=Irn5{j=r7>EYX?oDv=+DM7* zEI56XZLY$8h|DB_^l4kxmhU;3I@Gg>#w3l2jQJHo=c6mZWwXq11en4E6k8P#&+2bx zlHi^z0{E9S`4~BBU)QXJzIcc2wTswsds$^Xx@D=qV0Ire{%n7WL zP^weW2#qOSMl*$+2Eq2hrkVTaPnEVfrGtG26;qqCy8h6jHIl^3^nNkL-8wqBH7drgMAf9KK;aPm|e|50F zv-|EMZkj+{8nVWDN{qjMKFBEPr-f^)_}ZGb)gLP4e|i-b6k#M+P-*~#-~-}<96#S^ zbmW;Vc)$3n@B-|}5}Kj9x-LCu&W(XWJljvNX7dx*4xp(}tXxm?R~i4`5=A8@Ry+kq zt8H6!_O8wUTJkH@{zn~Ea1|L@mGXAumKNK(HEw)LmW{%*U<yS?FGdBc3vNV z0gxQmFrep!`2H|l?g#D8RtOGw#2&TyAA9c<9N8DO4|h5p+qP{@Y}>Xuu{FWOwlfpk z)+7_#nbvQL_k#y#hlO!Fp zX7lTJa-60eelOSVS*;4qyWt9~SqXT6hCQcvKgr{}tszSW&~5+W35Po0xbIKThm9MO zL7Ci>J7@DTLxs+zk7ioz-TR{$P-X`aZ1C|yVs0#5gX}t)aTu|;=C+QyD!#L7ews z7wFy*m8st%t!eK4`3jULarbPW=3)Vf{kmWa$pxFWodB+XAt3G0q|(&jB=7tjIsFg@ zVQq(@SSMCfp(Pp|*<&BHXcl-|c@tQmgzt|+?{kn``7XxI)xqj_5E7rC)K%B{3~5X& zt0|{VK4SU+Sy(OzN6{XF!L$2-0%zb0%!JvQ=NRVaqy-lNbaAk=`siVf%n#=TNT_0e za_&9TCh_d>|JINglu?;FUyoe~EeF^vG<2x8V$ptr>=OQ|2W|zp`veY*wOgIk6r7!I zyy_2>0Ot<(qcr@Fb}1q~1MoiG`{oBV131%D8(K1w0D1ss3Wsh@aWtKHT$Tw}rSuy& zM)Nbb7LNyQyI73nbUJD=MNHQ*Tj;;A_1!xm?EEU~z4^!4!>s_^i8qrwD92ETplG%K z34PQc4kkBxrLTj(>*-;iObK};ftiIVMUn^+*a|E}4hvQ+4+5rk zXqnq2?=j`asYs6?w;WBW(KX=AgIqd#FuslqzKDlZ z6#Vj`Dy^_Amh!FJ>b{Gw%T~zcK!+n%Su{hR2WiKJ-Fj@LK|2tyzUwZhPf-oW6Z&7( zJ+BzuUF{;R_a#m*eZA+7SBXj592vfUm9NnFK^25VYv^#DMiCrTT}$ZK?Y57~Y5=h$ zMwW*P8kU$#4~$tlY0=q)RMF)w8CR>XrkBk&-^9c$j8p+!LN4Yo6sj@-to9`*Oswg&ArRlD|*|ZqnWXUByMgFH#df2|%)f2rdsAy&oA65711K zPbv)BOOjifyuaOi#KW-ks#4o1fF*hNWXAG`dV9y=E4;c*rvlFr6NB&RV>o&uB^^47 zvXH@2u{5PDna$Qid`OFaknxH~MW!MVIB~>vO&7zql$5qGJ~bHO>Q=D}4kMU@aP zcEi%*<@{*#@ryvXl=d*2KH}lHF=pn_wF6*)f6W38?URNekbxa3grbP!W&sGr1v%Lg zUY_Ps>#o7IUNS;$#gk>^4Y6#7@Sovh(hk_xI1_HfGL)0cm1)tYZ~(;}czVdVT_7v^ zd*;qA$u-M*XbeWe!S&dfeOrpAW9y}T>ag8Nm{yuE9y6xoe^ zPRMg&{};~65^3Pi$PlSWMX1asJh>ow72!4pQ@M_9n{H}n=O@i8^~Nu|zpW#3oxoA# z6S1!uY%SMx>qF84q|$^r#>7-Cxe4?A;7_Tna;iR-qdV-o`m>_k&GrT;VDg_3q2Fp! z8Js9W5NNPzwhZSy>!dhoLfnrBXxt**Ve+VT7MY7JmQM*HFAu&p=@)vai}!{U?b^By(nJCw`*YOu-odht zXkyi&2)xFDn3KU<7zYkjSsDlp!74w&D4m6u9r-snU$m~yS!P9(Jp=9>T=K(*)@*{c zddEmf6J}xaP#I074<11I{4GRYksd2utZ1!_Q!=G(>vF(PxA&VqV<|^v_vQDX`_%+Y zNdqIJC<dNCNYTx{R87n28fyCMz^yKA+XsMYxxu~Tj&D^NW@ z35c`q&q=hnW9{eBalX@J(YwATFrAQ{c*uNeKY_I4VmZd5SL$GiJ(=4>LFlc>AIq6n$(M z&>>+~tugt;g(SC}U9pS|3rc}yj3u248_OLVLS~V)%D?*5>4bS|zx6E@4?{fKOu+S2 zI`HGxoFM}9`2!r1R-|-k0L=oyhbw=|OK4zctqr2Rnys3Rwa-Pc$>#?dGwMt^Xk^W1 zyAVrV92Chfb}g0f5$Y_v>z^6{xIXU#S19m+lC(4hm)%wIA`{;W51!38$S!*u`-a4+ ziusNGhS^h$VjWmxFE!EKiM|#vbiO$bAvlF z$ncE%Oo=Z4A}W-zrs*0b1v0{hTO|7z;8&qt{a#91sO`=*!Ad#da*o6u zxuV2ziZ3}eDMLk9Das`pvpHuefFK@PIAQXumIMmGP6LlGaaS^*1Uc6Jf#o$ad-i3J zC#bSIDU~tY+N9^h3+HHrBv{qtU#!tNx(?E_m>A9kQAAJ*j=o??RGYsU5wSfLRu9#1+&i@%6SB(x%gtNGsebf7UR{G{XjQHtX8 zD9~NK@%jCy zIZCJ`<*y}+f{?1qGXT33DzkEVm?Y?-^F8JDN%Tw*M?@B$!@NU`Cio z9JNQ1DP8(^LG6~72lr&^CjPX{w=72O7)-}fsI9+W_zTMM{AE*v8L9vxog|%lH8y4y zs7Bz9>LxAT%g!C==PYCJKeZ>a%GIugkq(0{B4eXV z(Lc?awJOR9xSgKA(xT-Wl?V>nM><7GKbfkxldQ-3%m1r$!2Wj@FX#!}Y zn~o8(@L2obX#Sd$)<+KU_e|B6J8zhd9@$ZgKOP6lgz_Q|gOB@B zP(*<;CTUI_o2cxQ%gz|cSP4~}*TA6S$PJy@FHG>odN(vpu`)T^` zaAAa^&R!KakFV?u0I62tWQ$nnbS^F)VUI^6&APt?b%7s!sNb8!vG)<478@=`ietJw z3|aD}r7u+|gF#wRV9inmLTC8`nobL5o`A|`Ul0`R;Tf|WMp7OW?2W(YY8c&UO3p-Z z?XF2F#zR=0ruzz0UL6nakIVotd5#>Cj#p#rq&`tOnkmK%UrV;gx|eBV^#tkHJ0wEi`H)c(`1K5C?8yJh-?I5%q-_ZojTBx2cxC zlRKoI8D8O>Xrgi(*CH#8i4gy%W8bM~K4eauw7IAbAC!em(M}B+S=#$!r$rk8nUpNcL@s`g>Y|n#lZE>;`Gz3sndm7({zIH~`rri;XZKV{&frOYY9|A7Y;#Q|ziG*NaPt1YD;@yRl4w(0iA zOq4{KctL7hnr=XA+en>H2#-J+AP|zJdq2Ynf_3}_A3nHPZtSUJ|3Nf~qPWKVF+*qK z(h#VO{&YGyGmO&rC~R__!Q4&aO%2}KRgwU6fL078co!IuLdc>I&dshqRHhl|)O)WR zp5KvpbanBJuQ>>$AfA2+6}2qK5nwR^%uJx(xcT+5vGu;_&t4)pd_cM5DTDXg4%5Hrbh`JYIHk)N9Io;m zSABGuVrevdRB$J#$}4W^=xX_EqpteA+t2QHiFvDK7nnu6At)=jZg+UV!BbIOwIsOR z3p6@Wj}^I$l?ymAsjws7NOyVw+!Yb(2*n>~gQ!7X3Bx%Ul-SP)4%zJFs_uq>IV|X- z-}lWab!%?#YTis3i!x6=r3)r(?<;a7={h9fb+dse(<1 zlUo>v>ibxQWMpVxMl|q9DDULC5)ikWpYP3Md3$Xuq<8&2KR;MS0YT}~3r4MX{G)cS zWOmTeze*nk3I*;|C@+9Z;o@aXDR>#J@U&kcOU^a!wg=HDyi(eh7FIh2bjLabEoB>} zll~RXh(E7FtDZR5dx419#qGe&S13EqC;ciQ^|}(-UXLZS!wELtaw8zONkbUqMKFKr z&^AAEsB>{?)uaw=UEmsZoks{atcRZ)kbiEbw0i5Tttf=7*KREt-ZbqIR&@I#;k~`_ zI`_iw8xb_N(0V=?Er+4RFKW>kqdWscLlO+R#IUX90P#<=P=fs<9`u0+nH_kHU`kP} zoCUiQ+uko`28PUD(gix>661E~<>VFUkV&D8gP&$th)p~U0TG)d*AH2kl1kx&Zpzl^ zSyA?NAN^i6)9;EZYbwK;h@BA-4Kq|@@R=j*# zk@&ffQn4wA$N9rwwYBaT3SpwD%TS|m^pbZJ$KoAOm_(6C;ts+-) zDn^a<%erU3wk*Q5EoK~CbZv* zG=vA06$^fBtpW1oqew0OG;|dpR<#QA5?S}6(V|xZuJtaYJ1$++9hlcpmTJ9lLd`6Y6H_5+;m;lx#$0G;{ zQoxLu{;^meAIHG!!@e-lWp1!;+oXh3{F=WnExEskuaMk@U~`+8zY+Je0{J zKIx3`<9pUv)Y~>~I(x`mRck;*@ynKU6ZXKk?AlnA_6PUx0(OOuUw;hyy}+j7;y=^y zuPXg2HKog^5O~|lblr#sm1cYKoVKe4JP0I4Ni>gg8@U`@4aG5bIj6BQmn3nd!zoX)>&MOlsP5pOw*E0HT=)EPIl09 z7S0Fq_-i&T$JDqQU1u}rn~nBJKR>^pv@mge8eCfnS^w?FWAEn7t9HBk)xqZMZP3-~ z6}-$&@;{lBOfgLG&+$u)icyzF7JSQUOwMflm78ni=6w4M?aY%i74Pl-j-{C9ikbOa zF_GRy^Sr&g5x@x_jXs{8t4t&AhkYFX5q9*8yYts_KyXAC2>X7M1fHGDbZ2T2nhp^-Ot9wN!P9>?_r;&uRo=^ku6b9hE5m z)&#`-o*?nX12-oIgr6%ym8R=2RA3Yg=%+V*Kr}qNM&3dSV7H9v_+v)aRi8_S`U64) zt)13bKsM1GTn1Q1&6JKf-$$=1>7Z3V@Ju!5n{~6!R~k&V%Vdqw+Sq4jm*!P}%2_=y zvRB`75ZB`f1cK{p;k#ZgoJ2^UPaiT^WjEa4-_>;pVdwfPFdmU3=X8;f-{YB&34uWQ zw<86{sD(*?Grr^Hpxt`8pQZ&}dLV8H2)Hf;O<;we-*YpNWdQvii2U!Bhx|Xm%FG>a zgZAOOW_|xTdV*Qz2|2;Rl?VH%H#7~^0YiT;Tds0FBvyuObeR}slQ9pW2CPeQiA$|A zbK{<#1TX>hui|zPM(OgZmoFDHWyR8+FRdF3%MDjbnpNo0n7r)=!nbDXcmystVj% z4bGn+&)1uiy0uG!OjEr&YV)L?H4Xo2XOjhKg`@kb8_B$SILptUt+s_{6iIr5etOIS z>w(Ztg6Nt`6_OCtQN(eOV`QRLq>B;}M8&R?JrEF)hc zYF`8~7W}}a{xGu9iF2~N??~ngKLf0LmUPU6l0=%&!1ia8EauCC9f(sWzl|d&|JhcO zfzt7Q`n;BF6k*Ka_N&nX)+nk?gujsUbMK&eHyTy@E2lH{l!9(rQ-_1E z7`?@?K>j=ba=b&AbYz7Q+P4q`-z)1YZ*LZW*3NOU7H)HPVtt=XAu$}-j3O=xbrb_0 zivmLLk}D*xe~(5ap{T|7P~@vk5lBUBQDL(;742+rXysHDMA(R?M18MB#Su|O9BIsj zVFWl~On#VL8Q-JKBHAZN0%vHC%rrU3EBAWe;5;yY~LN;*kBV! zgAzsZ{$WznP+?QzKxc82Cs~7)v~Gj($sd1(3%Y8&h-7b^WXB{m=ma&j7+QYN_5aB{%}S}@rI56YVKmUQS~2CHUC_26bx9$JL(5G!JhT!`Vqh}XL% zm}?T@$I=BqJrBJR2Oi!RH18DU`hi~wQ<7jO?dK39HhCS>bl>xXrlA7=#v6gaR$Ku< z1d$Obcg%W$L#mm?{|{M@^OVMyzXPZQG6PbITHhb{_8ut^FYv+8@>X9}7OyCCctVVozSo6AAtY}%pJ3^sSEo2I`ICE(Q4`Wt9Kf0Zu7G3FJ?ao6H48tA5l7G}d1z z%7QOYipk(v`4jHtzL#N1+*llNXd{ zra1ReF-J)ZCZRlWJs@<_y=FOovP{Q+bVW70-y%7_bZ2=sixTdJP<`aHQ19)E_anc( z*9ZiI?@{^RJ>sx=)@#CvNCZKrUr~YeWo;FDx>JoD-x>E7yz;$ygN=6rI5U>9yJuye z;E9&u*2r`lAR_i+@+hu3xNo;!Q<*L4b}jHTJCznYM{@pP#a^^quJa4u)(JxLyjqb`qHA%xbyrd);Lg2q-So5YuYcz>U}3g&{!%0Kv?Lrhof*jVks{94Jz#K@YNI>zd_ZeHD_V%FF7G zV$`;YSx`cY`aMSyPvpCMc4`KD@j&8MEN(d%=H&cvVgu@ zCOXek_ZSS5!Vk<>T!>JqSrVx?NYFnE0qlu^HyIc3k#yD$edL||f4>m{f=xZr|33WR zXHZxK_ZkEtt@;f8S&9+>e#uHINz{s&gxZ?3u>%134pAyf(n#?5@Zg`2WMw44TxNjC zzc(y2_*iNCc?$r57qt}^SCJJLCslEEwz74w1Si`e<)wRRsIOs1&h+r~%%YQ%Qr+VF z!jaDN%V2?2qhy0sfDvKTo)S<}m}qob78?B!(vjrml9&izLd{m-u2EHn2UH~_4>x1& z;Vx>pZnm=DMs&B=j@wq&tS0UEzeqhpU?W5+InE3PKrAF6Y>FFRuB8q3U}J}AQ1oyP0t%#ZC-*~+Hc{T2%< zGRUObvHs={W7(r2n+-U8pj}va%vAueVrCgn9#a=NM6pX^;+;ob0|Bt9Lwwz?$T3fR zHu(VWQtN|gP?W4$DcVY=?cwiHtLLjG^(QknhSWjD-LKvXGq=r%@vJz(bf}_4Knpf1PGx?&i`MTQ6NTT}ISDqL8U zO;@-;h)yE21$L7T^454Sr8yj0ZHj3>@>wj!WLQK41v5@cJ2@cd%u0$2?3odqd{a=SnqfVBIO zTo4e0rA6Q)2IN^GwnA)SL&4$wV$sS(?C&U9V#}xmdayp?qAI+YkUzzv5>b;yo@S}b zap}KQ7Ky6}-cq>ZcfuNec`k&RCFO*Eg9r#i%LFc%BCP^igV*Z$31OvwOzcQ_W97o& z^sn#AwPOn*xBbA`CAb7Ih8zD#ffX5rg`AVpfhD+-5KGjdgg_&+Pa^*gtdPu3ME*|D z5hs)M`2Z3+vdAzdoY@a@F*dpAdPZA8(J)C9oaWfZd6!7Sx8a65ADgGKjQGedXOv zzlC`biZbAKY35JX3m-%nM7*6qGTcX#2&V_K4@DtMC#7_t)Ii0DJ%)V?L;Jz08d9$8 zP9A~kGh|>!*ATxd+AT{+t(1Z(8$pSqMoE{|9HJp>M{Y3ME-sC6$&MQ(2BsQfy6$Pp(762i%FQL=CCjX;G&#volXmxkn;EE`UWkg(Kr8 zV}GnBr7Foj?IgpGN;!2U!z;s>xq!x)EJ*IX^tBzRIv_Hj9`dbTt4M0M`G;V*tYmg^ zn%P&gY_lk{FMC`+RjIm@Lz3Ijl`BO4)X!6ukl~9hl=#fIH!C)O`epfxl}MWB`^!Sg zpP#oRzk6=sEU7H@4`~kx5AhG1#?_#Iu$nw_sNt2wro?u|CfslybKZA3a3oqL#do24f`N7PhB6CCz~uAH>Rk*y11ob(mB&SgJ^$bL(N&m)iqLFzoDyJEwx<8Hz+Xb|IH`o zi2*?{Mkgi@dlTE3@r+TO>4cF)mrfT-$Fccu{qx|jp=^6Y^MH{EyM6Pf>C(-kmYNEt zZO^{50RC*l`c3RErLLKKK8T`!AS4O9^{8rcTd``uz)4Bli$1T(^s+kFf@KN z4GXem+j+Xvbkj)F-w+USE^!u_a9!s<@3s@VCNWzu#~ORP6fJ75r|s*VJWndF#2tGM zISy^E3a-7izc8T4qa;bkjHH&O9OKU*7=6vC(@xT^YfFAGyRf?`6Z#|+B@`!w(d*e; z6~OXn`UZUSeBQiSxjcSec~J)Of~w(u!+!@!fwW+R5ZK|+p*%o?0}umUp(HHx#*_w& z*g&yYanEo8I4(p(tYQkR~P47T&FA$TNq=fiTmrTOw{HSzH9JV~Rm(-Z_ zPst@|MM*!&3`zM69Y)=z1F2ZOSkh8KY!U)2KT1#6iii14`N;j#J^1}|W)6e&rqf@p zEr%5oGqs7v1G=B-i3v!EwoyN#Fn&}VD%9Q@cX%CwR#LhmUy_f98II$w3?D6DlRz0^ zjbU>V8AFCq=CZZ2ShD*-Wzm)$k4EF`kb{cU#MEze92IjFQ?_BvkIf5WRHo7O42B$n zG(9YXoZnc*JI8I8&NVT>ol24vXx((Jx-#S674BqWDRZd4=pr=PHEvl;TNaF~PNE&% z9%LUlO%RRUjJ*VMS#f!JSoeCqN4ySjo!cYVgfG_`tam7R84h&r-u0d&IFdTbtX)n> zO~hFeY&%77Evgo(*7us&G+i7Gi*<;p?)ETE>mxh-bii^r+q7z`v0Kj|H=4UMo7juq zQ>NNTKH1g{(0M1InC z7wT+2n9r-Nuicsm$*42B>Ts=C?|FIE%&4-ii+GD$Chp2lH$Dxt{nK*c z*z?Dw=`DS~CcYOc;P~0_g=Oo$GvF}(BaZ+w2KxD&x!3Q*XhZN%z}DLwOa+RO@T4#A zo6Vc~>3%T{yfS@$rEtyL(&LI%MbGVN;fl#j(^u<+h<0(7kF=*cI03g3sk6}_0>jwJm#Ren@XD~J>J@`ro9_NI2UI@*2+yLn;%q#Fpf zDdAjXblm^|Y^r~62w64CO8@|6>|gqvH^iBqt&7G=THwXj%hpL?53DS9)j%N>i1$8o zh^$rArYTGT6NZM|qH3rjI%rZsEUY1K@>NE8$>OxpTwFply)rA>kSl+PS6FP)jI0oX z#)O7aBXRO#V+xy{84g{S(- zGPHPKcQosJd^lGPP5i^FU+DfUe(|~cIOi1h&h?zlklnAx9@owIHoLJ0A=HY7V7@5l z;`yXe_saZidp(HXzgG{YtQp3p#s+%BCJ<7O4Rfx?e?1>D*$1QK#>eB7F431E1;@uD zcUsR7cXhnYDdYVTDXG05fi+Ft=gVg^JgB&eOHX$U5%l9;tLI*56<5Fk2+(gYFH>dd zbqlijUx`zv%Q0gj3*;aBC>4&2eOc*^j({^!%rMw!R!CKq@nCUM8hU1${wx3khI%^% zq`yvK7&+=Mbl!P_5SWJTH4YMD5hZh|&7W(|5^9=n2iBVX_R7(p6{Ih5;Pj47Ch63Eh_3k|v_;PCWVSZvA(!XrPFmNn68N5;g^& ziXEP|`--J{KEjj;X{kiib^j*Qy45$Tk{<`JSb5dQso~iU!B=+_yS0|cD?cN)pJh-7 zdrvaof14UyVth@;RXzUNef|^Lz`{L6?2VomkTlxob9!z!j)T!46pk*N8Tuz-iRKV~ z2yFoVywcvM9eK2n*3?xLqF<0iX2Q0^dEHL2gI#&$y;Oz%0B;t6cNr$)fcjnHZ9}lY zhcgvE#k7jngpLwm)V{t&oaCXuhDze=7d%%#gNJo_K+g9Yt`;CjIZTrQ+j(z!n#ZSd z$Ufil3mY+5VYWDPkSJ<55R%)&;E7=K2LNiTXfb_vsNL%9*|81llL9j=pu)u~WwX(A zy{3{|;~S0dzCZJiItfP5Q}9f4%LyySpx`HZ3e5Uj+5>cX}%upZ_^M z){j8sy-j;N8Pe;U_eSwOIKM)c)v#krsWkj0OM(W?;XUfpB=JKe$V50b{0~KnP#Zdl-is$XC_alUPo8!bTqdsQ9 zyGpsgDXoFlVG0nzzjw!94i6*;Kt9$%@ZUA&FUqKoR*rp(X4|UQ3VoZ zggF#ZhV_xO#cl_gr;eqXwn|-Y(`ZbLuXlVT!e}S?Nf|Mn9JkLbzcLyXwD@%$peg=^pthSozTm5KNgcR|BfGSiRHR+J~s(~$I z)_YzLBQjV^0GD#J7p%};)j1B?u)9S@|F!WXcxz|7wIT(d8|Ze{UtAzUAv~#{OZ$m6RD8_F$s8kRTEjJ-~F9)**s^|>;N>uf-2hX>jyuT9B zP*f&qVC3jk+pca(D_QlwKA8AJj&j)QM}&&}utBwM|GbIVXWDp)QFrQRhB^R2N`q_v z`a3JzfG=3s@4ouWAN#>&Zo{|B+h9`A7a=|!bmR=}v5;AGQPkN*QFsF;#_~s-L-jl6 zqrObiXF2u0k-)uQJHoh7oq$zAib>@GeA-)akwRjb6@U{~$reJ{w1^*ofroi?4oYn& zd-2tP{XUC9XY9re%iwp;SD9t@5`@Ler^HdXJjfH(Kh$E9WoQr*SP%t^$rNs@+ zwy_mfqB7WH02u-U64k{BQ*k}p{1+jhzbD&?{je@cwQLb;E{@mB!~NMZ+;5g`zs=1+ z0I*01_-yjBCy<;yuCj6*eD&=+BZ6ZLj>!qD!or&j$LM%U!`R8&$%4aFHzfiKm}c*IP2BZOAXeeY zY!M}3RQIto_h+cN?yC~S4wZXbAEJ0p&QD%-wmZ~GEFZGRJ(vOB`-bfe+uBmux{`$k=K^Fi`z1=yk2RQ4(Bkx>b>u3lIqnxm*DooaY#=Mb7nnhqc*Q zaX0a&LB7TpPunE5ddrBXER&u@kktdB4RE;#iKsNdyf%#d2dI*#nVbAU2NG1Cftv z@!T&MBD;`_XYWqh{KK#RTJQEvy1u@}bAPOpE}&kfjHs?!RZ`I)^ow5Ygjn6@7=Il9 z%*Ilb=Q?aeCGmGlw0_rInpoaKnw#yK3z#7k3*6x~hN}J!>${^WjX#0%Z6CmbtMtUj z7-QK1SvlNOYwLc|6&CbY;bFQBA8xpbG(hE_)_G-gn2(t%V+ zrRC)gXeMpZRg5KkH7tU6X)~?!L{d^6sJCT6;&e6=F1Ce(4R!$c*9thAwh}~sS zv*PvMReoNOo#Pqf0^f<~D14pyP$F3z@H?Q@qAS-4+?%Y~?;*WepnN1Xie+=;Wqbly zPm>%s0>kpLV34ip?CZ&jmJWxpa zE?#as@g>HWFppjF z-EmhsogxnUk4Ee56lcyh;nq>^#i=l5<}w9z#4kkA#&h|?0ngS}=IdVgKH49^>SuB> z#sU4$&W>cr!MqcVR3r7`>j@qgyoqE7Xu7U_p^oHuR2jv$=ik9fhfCo zs6u$q-v*@3ZItRB8^_D@>b7yobr2{TT8z--(;@D) zy?^!igC$)k;5Ks(_|l2pEnB`m@bPJ@=cW%~_hD`S*xhsboOhrlhcD)(;$kgXw*{+y zK9No;9@midcuZaRfCp4?LM1BbHX`*68$=A{eGggv!LLDlQMQGJE4UT+ichl4Qx04#5LkfwnDj?3+RK}RlDQ|a34+J45?9%3;Q2fo;2LCRDnI6Zjsfp2O)zu4~{mo*nVv-6d)7}S+8>=U|&3r$#XIWs2KqbeN{viO~T>M}| zm9aV1U8Kx&D(?g&?Ht^c6|7z1%oGT8x&Q1T;ko+`P);Bt|1NM2Dn5urHweQ<`4%iF zQg0EHz6%}nJYGapM;82)e@&fXcbiwN+rM2V%h6UaIs-LPDZfJtX>GQOKL^za@8t8S z7Ig@U&+iA7Wd!_K*^kyQg$%x3etfiydU}YE*PiCCF@?&HG*cs0?+#Rf z#v9w9Kli$V06ZlP%w_l?3%HHrwExK^)IpDU><1akEEFP18^|6KZZq5D$UFt?wsl7p z=3)a}_7GE60@z;-NSphq6VdzIsQN#4mmnaBp<#@^694)P{YE_IOl}&Zs;z-e$iP~A zdcN6}_xIQEgQ;KlNHa8NpRfVc=l80SPOtO+d)qz2^%k4HvMHd-m!z7jD1=L+A+$dK z8^XcMo{^JlrEV06#pdxZZqqVjw0hf(hh6qLA01fXA`1m*rdBrd4QxBB+Z>e3lL{|E zdQVv)0`|)vP}QY)gE-+hU~K9CVoj_(006tw{|D9-4E|g2|6omnLZ%b{VNL&GP5)s{ z|6xu4VNL&GP5)s{|6xu4VNL&GP5(b&O$ZnO00IUCAUhWq0HB%pU#uwr&O~#mF0EyHJ!`<9=;?4PYVg})sSq z+=;~t3!V4jKMTiYKNTQ2Y&ZuBQG+F8u&;(zL!n|2a3k{6wBLqLoG$ou5zX;hr&g1P z5L+gfzsQk(;BcPp|6s?}=m(#%RHdCWq>%scUf=RG8xvZH*n$T=*~a(!n~}m&&OgO2 z=cs++h$ZU`c7ikt9=aQ#kmvhFX0kxN`4m|^L4%9X=bLQmEAcuzW4fhdx}=7QzNu*H z2)ouGjX>FkQX{*L!T`8b+uoj;(|T*!ZI)Xvf4u1$%L?(Y>+E$dt9HxZ_#-YOrvmca z1(ud`qxF;Zy6ubBAC<9u4 zM=lZRy(ASQ%33oL=>*Xr)6my*Nn*Py_Sj}nmTZe_V|ne(TL@Sd^6?^X6yU}~?hNK!-Xu%~Mt>+QU|MF39A3u)_DAUnU-Gxyx)ZD^JW9`|@l$vd{hwDJ z`jmfg&6?~%ltA>8N*6}PJ|78oZaq86FTAw&cTv?7v@2&IyTT537anj}ZANm_ydO_y zX@j82xmis>q{t6O+{bj#A(9>fdORkaNE1v0`PBSWD>NN55Z9 zN1GaqD!GcP1#_eKV|Vnt#I_^`~jQ*?XNXDZ(D5C_*t-a84?=_hM;}a@uACKp>p1v%&^q~u0hiI5<#CG^ef2+eM2s3fT zcu3VolZ^n^H#bBu%E=4o@nL_B4s-;+>}=(m2@OH`4v{;MYMUewM)3Pwo%*aOQxy@w zvVK-W0EAnD9;RwXP;EcRid?(v6Uis_Z=fk#0hZ9RZ-HbGxfY1GZtJ^*ah7E zJ&24-(E)tw?_vCyqKMo!+`m#B_1M{R;twpt!dD2Kri#+*w6%ja*;|+48+uDvFj`CK zQ_zF>O5^f8KO%&?lsz$JgXH?krYcNwe#XqNGfn{DW({evW57*+p=aVqp)0gJKIi_m zvO;A!B70Y7^v30O|Ek|>rK`1b`JN$^YPgn#xFFl!)}`TPVg}9H;2u)J(@QhPgyRn$N@0=(-&TXspNzg%k53##j(_Xvn9B>388nfhb=Xh4lo>ipn z=|`-w$qwL&g$0D`VmeLHwmYFuz-KI;2GuN{6>wtf@g|!r1?8g763~(ioHY*rl{%sM z7L)##DU{-KJ$aACFm#ml+2^qr_Ak@w@5nHLBcwPovcnh?;;#S zZtF40^?W(v%=S7s-2GGAK#X}Q7w26uiwC_@RqZ>on(v^{SX+1IpC_D-4@26>3X?iy zvTCLJ&vR{1KkwY^c+Tr?hXj3_;sTigY)e6N)m75<)weaz*aA; z2CNh^srwki=8-7$guQlaw#!mdAgIq*fV0RCzD*Y~l~Z*R6q>e#G@cv-`-`t9Au_1mn=27qV z4W25q1(pKFDAFrwYw;qsE;|`ZK9!oN3P(o0Q~`!|wit&gzSjOf_TDG||DCzF*?ml$4B8sHaD4=wQgo3nmBOua9=d@bnlrp zYpq%DnK`r9daaorbUAOa&BJWIQCZmsSeM*^KL;vpRV1FTMKX7MCbLC!^Bx^@!BU#f zRhDR{u_jR)$o;q@nz+2!duBvJPy2Xpw}>!R%63Nk6OA7$$9Ji@6cKNh-DmDfka01c zM_1WE$}f6$tD%-GRvW*)H&QRyoF(F>YzKoKw-p%X=af0b(|{S~diI_PgQa7nzC}fJ zyqaC@U(Rn^y^KO|0J#&3DiUf2v4=cl{=J2k$=zhPZSa6*MGyMOgw1s~s0I!vGn3b8 zSQdVoYPzdW{pe!T2NTqLlQ1;x_7#=7h^ZS9;mNdq&fVN@8C%+sKhVa5+>Rf#&3oa5Aa}nU3O$jmC||NjV!P_)7p~hZ^Ey67DffLfY)q` zpq-~sP+Ad2=M$@GqPn^FFB^PLg9+`C3wvn0_R~E+4BLkGmI(rOnVeTgJug$FrgJ~W z21p$>D+xYKk6}lWQFO6z3RYPE5Ph45&79dq=r86n|`ozprmnC91&NQ+^NN{)47Hzi8n z&Mc988otokW9W4fzA@MsFRNgFQ0(>nF3`{$LkQ!?=(2KdYLxpgK<#O9;dYI4aYL(J z>Fu#$eV>@Dcp(GiMLv9`7_H^!2GSShgy=^YX^GJU1HT<1TmeE5Vk8@U+)4Ak)w zX7F)ZcOAzDoZ&iA=2w1LoMdWK))DlRMcn(E_{_^$!oZhCo_cSrCPPfFwk%(mDLdA> ztCqxSM^}wHPKh$(_j%Zi-B$O|@2he8__R0j;ogLa=|8Kg8USB;@x>7Fj8>`Y-rNT* z@-z~8ig1qw=rfu2N7j_wzwU@pKn27J|rpe zb@!p*zrr3*s59mCR^un-85SRYdz)((`*HQ?BAnVvGg{mWlW$rnE2xy6<`5fuwdy+~ zflRJIT1VzN?tmbQNFHg6?bEQHY55wJP+G3H8p-S?hn36?Ug^0Li zY%pfp*zUQZR0w?m{|n5RGIX}t>rDAaHrEy!U%t|>rssLQKfcxr+CUiTD4p#U&}gs5 z7RV+i6KJWHce4^&H{ejhP8ugw#i)Udyn~twa(rHs{|1v+9?%fJB?%?Co&a>GGPuMO zk~wmT3i(Xm^t@HAqWMyK9z*kCO=Qm4Ajx^TLm&r7gn!}ND!Qg1cWh+coOC`;FmxzF z_LJ7EZb98-D@}i=i)E2j#Z1e^mkgY}#QIpFrV{IbB8$VFMZMqn1XL8mi_P2B%FcHY zsH!))>8p5XYqq>H?`?6Fu&x=msK>`X75m?mUbHYE+cvGXKYK&{AX_ha%iTA1f+idY z`-G&HqM@c|T|yHO*8c#Jo(MT#5p5%lIq|#l?Mknu=r&QY{A)7rC{i7_R%e_m8~#aQe8rmk1i{F z@bPr~#7FeI8#hC0?*=&~G&p32w1dG}UwBx%xTEkmuKhfaLx$=ipJjn=qSsEKX zl7nQA5Tnp58$EEpOX_gyzyNzwwN7cno6QW8;(Eqr|CO3B#BZrAPfqE5w2z%&t z9{L;S8Q(E{PaX>K!S3oftUytsM6X8ff?;&Qj48%}nTSFDVzO--)((YYmDEIe27~LN zhA;JMnj`c@6!}n0w&u8<#ekarQIjt%4#J*PrO%G3t(Q;>d03PQd^IoR2l`QqFkY>m z6g^w^9mOyY-@+Fs6?|4|ZDB&cOnx({ct3%!H39y@M_l9M+aU70q6Z_kytZrX z&nJW{;H=H_ZQ|?!k`(-waRck$to)2)ITk!y_HMh+acC<398-=03V+L)bQ!TQ zih!RFQJ{f%4<6IbndUU!rgNDINBvgK%DPrZtY_T%=WYSguXYs1vs#Zt+COfJycqXN;tvFIm9^w z)w!1n%TB};r=vtqqJMSTwbm{`-=i;RrR!^4!4wWE4!tx2`1_^NGSi+QE5$}+f5Of@ zK-iy)6L>qgV)vxG=-oTSAtceKBGGlxJtd{ zBZ0HWQRsnj>u2ulxzPfjcZ!d0Vl9Fz)jkfOuYI9?zV-QIsVf|#u8xUR& z?kw_zp+qQxpjYGi2g8v$BKYO1EyUmL31<+}ms;FBqgMRIvy9IMIFM?UFgbikL0Kpf zs++=xZF0X{Al8hg`E-byo`dkv_c66x=1=WN2u<6oiVdOl30;B0-GNdvG87aKhK z<@Q>GAASXWx)Hc6Y9rmfoh9Yp=v@4)^AcJ~{LLq$(&$9N;%%b8RK>v{SC12xYO>FI z!-IeqBThaA0W~vz$h+=4vq&%Tt=?VGUt=mZtZ~=6aXFC175ti{#f;FDhJ7=|IxN+> zlta&T7C7gBn0-i$jMeMT6+hckkw6sg5~V-kqr__^Od`QXwL(8ICE6D1{K;0Wy2jtj zjoW*`Jacn#3TTyFw&3>2v?ahd=8N<2Ycr@`TStD%#6&D4$cOaXIkO{vao-}?Qu=%M zwq6mVa$4YcC$+w{L!>r9>9386%>X>tkJ4ggMWVdhgYmaK<7=HEq2JW6xS0Ex7JUb+ zd8*%}&KmRspC+6AQ9+@L6g6)}$jQn}RJ@&Cr;XMf#NHnc<3&p(+>h)!r@xp~G8p>) zUTv^3(5z8sH94E;BQ`M#Chaa!p(J094|~ohTwouV0BPj2|-@u;1 zcMdovmPKXdI5~d&`iM?92I+0n!RfjQ<;HkIF(uY-HiN1k1p}2WYqS|>qNH|-+%)zj zt$PS5TpGs4&Q|XV+bVp+bS(508`rFj)48new=a2ocHf2K2R7?68r%$I=kCoMHP5?^ z%PP8G5}+Fh5JrZ;D+X}^8mWFUie_{p*Ixa2ZgH1$VAnfmB{jvIOO0B6cA~zgy+&r10$&g7R~le)n>1Jd65~dJk|;wh?dVpiv(9^*`~;3%pqyPR(Fu)cd|2 z-0=kG6IU9M&V{BX7VF}C6!o1yqsaDkp{}9}r`O4%vIBX*6jsEld45YK*%|M*edXLk z@WdB8wfBXC6OU_}=5H0BXu~?cn#HfF1zP9Va*4!dOF>6IiHge!4Kw;$cTTE09Fu0r z%P3P1InDe!I^ro`%xmu36=s2`@Q2Kh>QcS7c#;@UTjH(hZDsZRz1|^xo?h>Rj~THjCVzI);Z?8#P_EF|H5woQ;VI>YeSMaaa| zgm44_4}XoTmTWb~{F)T#M2^nzGt>AIm#eAW@+r5*aQ$k%cPM+^dgaAH8}{JqYG@bv zkD1Gx1U%Fg#?$dG``yIor}caUQucW~I8*@YDB$ESe^wwN?@@Vu+mz9ZP)=;mOPI!~ zj%NAn)dvPf&68~xVnwpxN1K^H$e(BQl2Dg*(#L%Dsn!hSpKZD$RpVWe2w)ZWAR>{e zEkBnSwgo=^UdA0z6AsZ$j8HJ3PGePAL`%Uwaz1Gj6Rxt5Ghz^3i+xbTh2kK|_ez_4 z0K8yBOPUVt#%1&sWw+{)?SlUw->ybDd7xE6_6 z3~vOFxNiE<1|LYJ@{jr5!4dPC??F%AtDZhPQ}Fn7kHv1>&a+dkDPX~^4<2j^W=Y-Kkid4QgXiWS0$!j~jMmwb{ z+}cVqxglcM*mZ6<<@Ps5(9zCPP-r~8fh0j-HZ_2R-iR%Pa-5E93<}(QOZRLfZW|R*Gh0?Uwp1cvN#0lx|)m zR0hmldTPoRr(A*l+B2`$O+H&iTw;k~7hJlLZ^9aY5hF&+^f&J>_b44I9W3K%nufZ1kQ&*l*Er&%8!>+9>HX!WEVh>P4^4LCd0k z^}2)iU99^r+Pr+A^I`U5v7b>u$IvI3?aDPwVt#a%Xtw0nt*5;EdUeG`J$j|+vDgIt z$KUJ2xaG(Gk4cQP@Y>8?VKqR}k!9owLq#woDq?FSJs9;hZ>FuI&B>*IL?srg>?uhP zs@w=3{=|X6QB0%o4K#}J-xWV@JczuUB~^KSIciqYl6Xsjhx>f2=911*hX*N2Nl3@7 zP)Q~co|agMArb>2*(A?9?;@c=XOXhjYn}agcQSO2oJ{~<+X+l8iZY2U!LGyhFYZ`% zoHhAqE`!u++6&#IPdeL)M|>X&xrq)rq=Zm1m|wG_J(xCnEy zwfTjSvL%dawh-{K1lpeRdqm}jAm$qB$>Z-X+~u$9L-AUy^|p?-1?_94*{?qb9KQlo z$51;OvP%I2im`Ce?O~#W&WllzwNJs<=Z9@(jc6GZhYqZ#@X4+rKFIMC7p@lQ zV)W=^#9>OVU0Gbs@8{3gqkq(r-TeGozxdQC$wA8g6I+rf9`Go0Z=YYp<3r2ZK8sxW zRMczls(xhI;MSR>uv7{_`^AB#3XZ%W%EgU6~y5Ur_kg z8TJk4xvoMyC43!Vt|~Vlyw_#$Au`Z7@kOiPq_g95TG8m09>D#kA0yAL=O!07(!`X$fE8?bK0RAp;hEh1oOfs%j-fZp^a?V zWq}&_iLw1%U80B&cz}cyhDNA!vJ1`nTYvE=VF4UWkS4CI<5`$-xCpssJH`l~xb~Si=NCkz(rmP&3C;WuG+Wb+^_g>G< z#ANn{P{yKt4t4&pTe>|7=dJ54=+DnFX>ggcP`OgKenVW2A)WO!nUupxJhxi?-N~}q z49_5JK-hNrYZ)Vqb{E;FVx1XoM;PuYd0!eA7;#pp zYRtVqphwRjFz@Gn^-yXpF1nR|dL!nVSQo&2>7tP$yzBhGS-HY|(|l1GHm zyO#St)lXn@yiVsQyCoG-?ANOmDMY>(!sjk2s3X~f2212Ol0eKOH!uFpIH6#i#3%>* zvzL2r0dg2}jv-@xohcOJ=@uSE&JL-q(XEUG3XFDdHxCPJ%ST6UDl3Cloj^A#`HxK- z-{_?4VR8v86|S0$sT!D!k%H;;OI2Bl`3cx?c8alsoq`TUj%;9 zKL+n0)7MDUvxbze-*^Z6e3d+P28V>oZY^uxz5fwcWH-m+{1Yj`|Co4veOR-%mTci| zWpcV#Q{|;}P<1p{g2Q!}kcnMMrLU|GhSkv|fU( z8^_9@I+wKlTC88Z)KKozQyRYXU<|g@pN_*9{V4G~2uHQwPMB_sobQ9)1@pot|E^ol z?j3SMTQ9r5gI}{*J55|VM6j?^E><<<(Bml)^n7i8`k=*ti%TvBdWYCG-ToOVdvBaP zNyDp6ycO#a7ECWg_Usc&6p?YTa( zWwSnQ^I#eGf5POLyh_yimXwXTsXE4LfzRCNpjE}YqT%JyfnczhPve4G_qw={zm_9%Z?-Rr!J!B+l8lJtt5ehrA%%4DM4#(o^ zd;UVy6;G5ZFZySYf>YE!cJQ$fgyJDTfR@P-(778DZ=aZzJlQfs#rR5M8PX^7ptwML zP;7bjAiNd%x-(un#Pqlw;^&}6&2rY(w#7&f?p`Rd?buOM3QjH#H(8|YiFER|zX{Q_ z$;$|fAsq%82!|*Lg_!f9jQbEbU50jAtC+Lw)_wF!cG*_(Znub*cy}8RF@X?&lcN@b z|02JfnJGctA+Q*c*P2!7Yg4sITZ@|hJB2wNgVUXq6`l33d&@zQGWGlH`sEoGjTb;7 zS;GwvFLfXuQ^2>5M~j~FT>|}UgmFLF5%0nsgNm(1hTc|~5EP^;EIdxaLBv1rT${6n zIG+4!3-z}PEEW=!85!ppF<7dtBpPbp8i1i)FSaeT2Yr3XdC@YI8I}|jcZKXb7E@v8 zm56eYWclcoSI&;YE9g}lx|Ol4UeS=Azf&X?SIp)*$!AZs^K5^c??H1nuv!a_ZfDd| z^K2Sq$LX8x)!7P*+{^Lphz$f!t7T2;)ay`|VXChZVVO&*ZVDMlP^TgN4+u#2g7LmGbB^A-zE3as}XZ^);24XdtJMx$#0pM@H z_858VEe`6W-kkTUSFFEF`fq8zPYD}YSlFzRp0yYwP2y#(LfI7Duk^!flfEjra!;OH zNu$?@ir4&n4DOM&JAcQgUXl&=x_38Onu(59F1?2Hd#I@mCcO$XAtig^Q@wMt8CZHc zk~?7Ov*@~f0eiHYQD&`{)8U!_3-@#jBQlNBX^eDZTuZmE=B?R_O6<>?b{bnpSta|h zpzREJZ(nvv`;8F-zh{g{>~Fuez;E3u<}ap6a_WD~!v^TD)V!qjKG5YwRkJk*D2erw zYVt`O#Styg#&pJ(dH;|**2jT-&LHk5j|RT%CC%>N>sxW3P5}M^y%wE%vAEicN>Op z9puhB-ZA}{_IlgN)rj~3G0&JwzxWBGF|(RZOWo;c@t3W)N31qut_79KR1k4?q|Zs$ zp&w6@+j}`THg-nQ2zW_ZmO53@mp(s)yn6f&&c#FGo{6DZ(U46TeM|doFd0o>9To7J zmCuP-T++QfU{lqjb?7hIe>ARN?(pQ<^QIk)5vYa^Im!Bt*s_rt%MpahGEwGec=+j4 z!bEGarkA+hVnczKS)NewY}U4I);_=S*A6ajjR-nSIXi*_U3B^56@+76hX^q8(;O)q z5`=WY0e%H7#0lb3_RPUl%$&5T$qN7I8f?2_->Wajd;;K!@iN?N;6=psS1bkwSpEEG zuO|=a$tf?!ktlyY7lRuK;37~&?I;k&3bxnHydz>I3&8z;G!{)pQBq&2-V`7?lBN#W zE_1JuynBB*oId|Zk}h{@O3U9EN_hhhlTspHTBQM?t8M`>%?J=$jV1{-YtrviFRB%HD~>w3?4r zOsh%f#En+D^}Nj%mKb$|o@!#|&NY?AMpx;^B)(z#P?%4PHgV@_Z*EmO5iqzZ;?I3u{mm+2S??AjYf|`Qs$?5_ z`<0P;RG^!_*R>D@x45Ht^~k}^*^&!4RsNMm*jn4$sB#|(W=m5MBd-aP5(0xx3^^9f zV6%4!#8VZ%89Tw8(Sf8-$U{Wnh!prlW9CX1z4XQsEw`st^K1l>QslvdC@sa?svLEf z(ytIm_DQt@On0-Tt9&Q0=oiJ$h4K*LgwT)W;{m5F4( z64}jSQO>IGro1L8$?QpQOTg#(m2^;G?#Q5bIA9s=KPM0rM}Pp1$_iW}LDO%Saybw> zO|hr@MT%YdBDt8Fj|}&vi&NNvyr8-~yI#4LOwJkh$2SMK+{CKn;~mIH5^HY>Ro{5@ zWYfwe?*wVS|fz2AD$-FJQ+$~bLCVy-tDy}LH&#e`$fG4sNTmdS*O!FFkj z5d0btpUd0j-BjkAD9S|~lQW6FY|UL3(mYL&=t+6pb%7^5dXne-z_0{38Sd-~EEt7D z!e$9?Ux{fJc|Wy(Wu+fGS-POh*z)A@ zoNm*#KesssZpj%JqQFXc=m*G~6=$hXdG`%WqQ&^g?B_dg?)uSqLR2Fo04!8826=)T zf`MWqOfBNzD71=D#FLzk{oxi;T&Vb4R@S7%)@tkF69#P~nkKp_v+~jy1=D6PItyqY zM@V4M`1n4ZfwqgI=E9wbEh0d*Y>DMGcX~$6FnKY6C13*P#qJxE$3Er!+Dam=wNGD? z2K#7r;+=a^&4k>7F_J3I5dtXo4U1hImT(Z{QaAS+$3l$_8_a$uMn5JU^WGcu!GA7j z>~VV1@m3tX-*TqKz$9D1#|?sB&7x1}`&LA#AYDDr2*rE}AA?H6S6Jj3#pgql#|J)y z0m3SIePewO_`eK2-e*P{QeXb(Kc;!A%OMcQ?Haxpydg_q7RmpdZ05)XW}hHcR{#)6 z@hkvAL=u2!0LWT^5Ra@Bpp^k2Npf+*WN2Oj$b!sVFgdU+4M5WZBsf@j?vI$5?NlQtqsH&+xQ-sM10$MQuqNJdZq;#m%Lz(+xH8m9_Iq_HkQB+b&S~64$ zBBK(n3RO|yiv^Hmr6j;Y_#aA;Rz*=Ijhfmsd435w85&RrEkKlmjZZ>SLgtx*sHiMVRus@m05AkuS-JS6WMz55u7MpB zPXr#xf>vVV7Lb+$ts|X$Z(|8=R(56{I1DN;%bNnAYXQRStgN6}|87@QK{hsSusLYS zbl`zFFEg(kOy&iEdT)I$m<(up5FP;@SxG=V6F?A^0^qLzh^SNrPzE5t0eJ-wP6^q+ z!zm@800Xq11ITbdiH}=J;T}*iRz4+Vu=Ee0GCXX2ipq+ze*+Xmkxvl}LxF&bb8v#s z%1VkLWfFj)1<3HSbNne$QUqbR$5@z+gM*z{Ng1vL$b+Ctaj|o7v2iOXDJ%VH^#@cr zK6VaPR$gg!Wkt9WL_s_Oc%&uD%Em4vB`2?~rTz@A1eFKiG2j`MfD}82h_oC`7N)7C zrLCc&tRQm_E2_MR*u81wWaUG(khHZl)s#S35oBawuuwUOtbDi@g0_~5R4f2hgu&o) z2r!T^Obby{O z6%zm{?tzt*1K=<35tRj@jlX{Y?lJ)+IN)Rt+`R%2j4c0-v8AlB!{0FucqVFO;RIrA z#4lxJZ2fnPZRL2uH#0{-3!I2|K(soqkQCe)uy_t2nh1#qNrf6iLDHoAp=qzcCwgCr zXk_Mg--`!HI((wSg3_VJ5F@K3;2|8a5EBv=<&!Wpf*T{4fO0{z!2!2t{GtK^lG@g0 zM#d&aX0E_p9DrSBz$YjO)6g+;bg(ryHa4>UJI>Z(!it)@dO8LU4q%O?v57sP6$PNd z0WWn$9X&lAJsm^1!vlLqM|(>v*JuFk4sbTs*U{C{)zvYKbU?6o0q!F2`{C^2V5kGv zh1`>)I6BxnIJr6kchLYg+(JLl(m+>7$It;Rb#QXGw2i$VV2)}^_CBWi_k!&mTy0Fv z((W|^r?S12n6|r{u_0J$Z)R-b`UiD0K|VPHKYK?93ln3|l;ZKg<2xW;mtR0g$<)fk z$k@p85AH5Xyka~uCSbSC{r---jiiteSn{W1Anrzjg0jXY_h_U7sBi$T$t7!IWO4WW zenvaXNf?9Xx}VYJvL-fw_)GBGCS!|N_c*&d+ynjx_jtgO-^l?05K-7iEuYi>YbPOqL6A3C-`3o#^mQJbvO9B+23G(*w^bE-v=xA!T)Fg0hoEDvYM+u{HdS% zzVM@zUx4yo>mPfo&>EIDR=uy8nw(v4*Ch3Y|LZt{0z@%h!c6X;>OM{V769huBKkUe^Z~?wA4CuU&C|y- zI0R%QIFR$RH)|PJJ|4aBkcvuH| zz+0R89sheZ6u|ZOgg5nMLjF_w9}WlrS8z~U1I2%D4w66twW!a^|998^A^qM65P0x^ zQT?A3P=FNYe-ZvSn*W^N;E}W(0Dw9FU($prz%~?r(u6(y{g3}j6aFhr_^&kKztV*N zN)!GoP57@g;lI*^|4I}7D^2+SL7MQt9ZCB@;66=Q7qwN#!4X#rw=MZq_DuG|p0iV7 z%exvRO>;@}Yc+}nCxrFFZx8mUcD2K5`33LV5RalZiRdn2H zI4Pe;VhU*Sr0ndPS*|iSTXUK}Ir%ilH}7INzdjwB_ZU9Q-hUIYhnug5k*(yk?rR^+ zW!;3l*tGJhce*#*i|oe^?1u~o!ba0jM6DA|9d_R= z`-e-KFZK=w?d5vN>NpPOtz)TP+NB&3^8Og4=I_s1`NdxRY|a&s=OTQ_NBQ|BcH8Co z);RghvV*L`pi=0Yl!bjjVq_}7Dd(iC}J34z*zh+&r{ z;gB?Jm*#3l%&UqN!z(P1gyvLA|2j*Qy)2V1?LwpKj)7x8QP^oVm=YVMoP4S*qX!ib z@N?W9!h3Z*f<2V|XtQBLG=YQ9%HGA!c|k<1T=IhnZc6s4>K^X$;-WFXvCE~L>|NkA z%w#2kfdU!fyFglr%4AsnocIn2<&LD2G=te_TfEI016l3^oon5vX~Ik*E{&X)V_q`#6Jx`Bp$>xawfoKr^wE3n zhT|QX*i*Hnb9JP-1xVegvve}(ng|?U2?=;mYeVyypJd4UU&ZO#dyQQ{}c2e5`3`id@jS-GW#+Sa6#%tH6mv>LWmbWH>xjuMmhGynnE}2@n zzxpcIlN4u#O=b3rogI|Qe;PBJIFS}7C^3(JTr$;9OY1w;YUFbTqW(R}65WjN4E@Qd z`43;vCSuCtJq7e|JnDm=-IV>7d%WLHr4BjKlrIafb0v;3V@uIejI@ZglV@Z^ zp3Ju}`kFTlVSuam`-8pd+KsiV-p;oAbO=GBTbdn+q6^HQRuAdaInAY!v{j){zWk!_neD><7XJ7ejn-lyMNu6! z-X!Tf;eCXllPkII2r=z|8b*%b#iC8Mu2LBMja@K3`2Z&7_oRy^xibfgkX*l~*)7s5 zZzS63At)pR_TPqIn;64lPf)0s;Q~=_d!-(0__qn&cK(J_T@$PaVUyC){^qoTe`;;H z>d(=n;4W4?oDxrm1TsHyWho|ETgsGX`HAOxAn+vor&jNePPb2|ClwgBp&D%p!wQq) zZKXersiKzxgM3TO^x~K5($QU!^<3FH&?%@xC^YFU!$e#qux36&D^CMMmL+-j4{kE| z%O_fxA=P#Tk*8f)a4Rxqd!BY9xQw5}-N__|Ei4W)pHzrrhi$`)o~d zJ1xr3nBc(6XCki^Szmsb+Zu78LZk9OxN47lDKm8Q)PUxqx3Q7p+w1*>+dK=SHhO&# zpTzEoDay+a?s6X@D)m~wrf&EuZ)>-{59(9wivKVy{!MuLs|I^*Z2VnH#5}C*0#l;< z5G7{OMZNlTcQWlLp{n0GfcH zgrw|!cn53|3ZRKegApTDRWk{ml2`w{@fX#oN}AX`uw1Ys~P6AJ)bk--1xDK7UnJ^2*=t|u>-k|F>HIl}=V zc3wp#Fo*(jR^Vpg2IB$un(~1X)t`Z`{(DU&!MKNlmX@Xp_zG$&D-V-{X=!U|DE!e> zS_F)LXlXu!!9ae3+@cDq3JQvU`0=xWtU;oCO?h~f6#u5FDBpdI0n}6i)G8K$Sc7_i zsye~{m{iZ?-rEkwgDhl??C(v92v-m@GK;!bRa;on$ixcJ0#$+o_A*?cm*3O}xC;kR z75Qa#Y|M>J05}{#hXaO6n!1J#j&_!|e-ySd*45SrJ?)MlLr{M^J#zzndnX4ATi`AX zKvkDAG`F)bvHYX55}zU%AOPSXPcUpCD`pJF8SX&SXaNSY#es2hX{BM3lC}3#(FWxyQKps_3`Y#SQs7-Kp!av_ZuWLv^{a3law}1kK{_g(u z9hDgWaKY&Ygcl5T^n3nk0R;rJ@~i8or-rA5?h7D*e0pO|)%fZ{A?$DOREEZxZL3vw zeiVNgKmbMWXYPJBjfVeJ$tuhueKP7F3P1sD&#=By)PINr$ylP=IQ~g}?@%324M6x@{?qSwPXXSobbl4qvG2s?Uw*&8{CX%{pI)j%kTG>-|sKK z-(P;ezx;mxul;`Fz~7Ds+-XJ5q|xy@HxTeC8*(e6FGl|)KbxlorKF^Zz|1tQLf3sp z&bxupJG|V%wePY>j?jDSC`L@|7=D3S_eBy8AmM74zu?_mc$NJ|X!FCtvy+_)?Xjqt zg)c!0uV?l?lo1El7wtE0z6p3Nu^f7TpY30_*Z%+5!1Oz2o{q9&bv}5@FEa|Hm}_GD zFxp3<;H}!!mybnwzg4RmDIzT>!P*KUC<9ROI=?H5Din!Q+-3H3BV@X2oh4)gy{1L6 za-%mc^7AYET6ptLRi0!}8it&ja({hnfxt=uPf%JxW~We~r0r`stTT z@Tcw-Tc{w(bsl408#&HS5Gj^8x;QC1uXk-Qs&825w|rQi6dm4tCp#iz{CDADyB^OZ zOjuk739lNAuJ>^`BZWcx^Quiy0!rS4ytZEA00R?5){@`hZIc01)r%PGafo_DDr972 zzAL}k#O`*_=&&v1XlX~5kLu=;Z8x;<2=>a^45tlfR88*tS9#dGI7t9;kbK#_5;aF^ zf2~YsXVc=GlSv|WbHhb{db7~qzeR7EFU)d4qV}EiJ&P0HUCzRuQ)IvfV(4W-WUCC+ zOBO(a3lh8TI0s=>%?PjLB-RI|y$mx*|MI9)eJl0zaU=bwnVp(GoL{CfgEQvN=1)y% zGEZ|1M4!0q`s)N?buChbUedy$;x|bmr!9|BTuIj08FY#%1TGZ(HqI4?L-zTe^wKm> zx!l1FHa9Rx121BSNyLsOOc1Xhrn0$5PJB-0B(7pt?9K6)7SKJy8bxcu5wrb2CeAIy? z6=nR~>4SB8US?_R3c(w17Aqnvs#jDI-?Cipl%%BQvVM`$oRXtfSV2AP+iK_Kc8IY{ z2%sLn{OcTUNOS81)_i{aZXBHW8GrZYS<+4_jl5T5OEwVx&Ms;b@k{r}o6j8%QC1C> z=0AGMWDj`d8kDh}s!K~lZ76s<+WbSKZ=|6ovH%Zo!n-=XRI3C`oIJCU8gD|@rEEzj zuneOd54y2=e4TDJdWKBw!l674CtnB?$1W-nk}V>XJd;)@}41+HMjDj)_C!X)j0Lt+^LsUB`GkfnU*?=$!nwM zU}ZB8&!H=`bzfJ8&*s)#14>d;=u%U*uUAFdrdd;qOAR;X+1zIw87FJDNQvtge$!IW zRx0aHGtsCn-H-YG!@k8zQYbh7`2|vE>*JPNq{_Z$35g^DKYr%hh;FNP6VqnBxYS{4 zt!rLJMOlL6VX-qlM1+$@N_rp7m)@A1mOYonc4QGB=~b@3Ve7}k4B2fxCqtzO{eC}6 zzKaA;`_r)7obj1|+g@_g$y&@*dWrI$lP6UfT_hX4HukBv9Q8o#V|4Ai%5J1ANC%xM z9Me?cBgv}Y7mZ1UQl+CojPcS#yM^b0qvyRCf)g=T4?7S*?mW^!HZV0}YOeF^CA@&4 zEora0?Wb#Bb9|(xyT9k181BHUU^Vw1B#BdXM5Uvm{7_{0)vDN)Tp-{E`dG#jD)CpXeI%bJf zc9co6t4L1jc3bub*2~6F=z_X-sp6=m=-YMr-_d73wqZhL3e1M%=m>~IOR7lrf#Qx5 zS#`laZR`}L4ka2UY38=AmD9c55MMPckJr)hqFpcV7h^hT2}D=rSK#;}(4hLJ8=8e>kZR z{7U@O&qmOI2Z>H3^YvB;Ng!}(xVLOQaEL*2JzP0aI{Wl4jtEYqpo#$h08k-SAIyy* zsTN)jqJCSJienl1;W?dUZ5@^KYqW}vhRr+=Xtn#6G1VZ_!AKpa7=I_<>`&_qVWjdoESzFY{g zPfIFtq_g_@y}A`4sJQLLH+;H<;Fv`@4rVj>RJ)z=2>u{3+WfmL{YV_V%7PLWA{o^6 zuY;rNW}fWnOgN#g!$G4(C+!c{-F~y;ut`H)k!$Ki2Q{()^HbgC=c+6iJ|?Dk0^I;^`#HeT=bab>>Le+bwle|(yK ze!D0lc4?IS6>B}NkiVwKqWb*(L09kv_Q4}?6UFojcnC20c~&{Wmhqqj+D9w8S98>f z#39t_)OLy|DuiFsV?Up(>1h+;qAX*e-94?ib+J9FFRQIXQpX*bCCzypE#yf`Fv zKzXlT^5kh;d8oC3%#>2fL;PiS&lJcq@*4=kXhyRUnaR{a$8DwN0GFIq&zHIH8vzKR znT1F|bmxpy6q+g%KDaULz`i$JthfaaY*`jHrhv$PfBsUaY0GxVk||lR-gaIHnnG3Kdx33gkdzs{FI)%hsE|rNd|8r}Z0SI8qh}$Zd|A zoauSEF&-5^%4n}R@cG46oHX)Yh@^0stw|Wz`1Az~y_r8dThkb~DM)O-gQXN?A-b6^ z@SGyE$$>)v2@_mr9ugutLa`ejLdN4x$kDw;O49e7)s`t{hR+8!he*!la(sMSg74_6 zrX7~AiivqP+smJOlNNVURsjM?f#`>)$clv%KL;mXk^goS)nZnQV36~cBc5A&*rPC| z#=RH@_Ji}@V6QqXYGKRzC^cU5*H^^6t%n|8p34%x(CplIrO_6On(QGufKd$x4|DKgGJDp~$`zqwnhBu#`E|w~F$UUcSh^2k&_r)ZeX`wDIC?fuT%ODdG zFGC$lOyRniI?TvZ>lBpvvReq;zNighkSWnd`SCkttp3Qr&jbyI_6Rp#3W_E} zLFCeYSLAdS$oQ%VH-i^dhCwAqz~dYlSH}HWbiLGgxmC<@CEMk%J08+8&-aLpVZPw5 zg7Xo5wIdJH!yYBhSM*fq#9}obXE%4y`h!gugG`p#N;`x$87OSI7uA$AkJu)LmLfEg zPBn|0c$GL=I zzMV|V`K22&SM0|TEGL-7_G(y&e*+s|FMk!kN^TqLJ z#m1eEP(xmmlgl~pdhea{5{9^y-%c&E`Bnk}QC`%cwJP^}ZL!|z?(Y&Emj;@;lXz^} zG|}Jau+rD)+k;kr%VUqQaeC3{|_vhU?_svfs3EYdl^Lr^Z zI@TnC(}TSk+atJ0GvIEzUQ22af%q#69LOgkx6@ba^z6m>e7ufryVRYwX943+(Cet*MUY7A0x>~2Y049DRe-o9*;+8>MM(a?k;$crEnj3H}7~YDj zQTRx$%J43#m~N=`(aV>c3zjXI;Bqemew1|-toC%Jc6>+m70yrGo?JQ}RsY_cV}>NZ z>aH;?e6h68QDgp*W6X`M`xB>QD<8`CW>azxE&$&C&Vw0&BlX;o67xZ()K$oZU*+5! zQ7q4bApaZsFj1ZKZpuT8x0^Xld#uZe_kCl4a6_0Go-sc{H57t;*>LnOd4J~K@-6!f z8UJL+MkLz-rkqN~!nZdx7byLQ4l>uxr)e(_lJpJD5tJZ^nNY{-qz^3QuX9KOkJek0 zgC()$!(JkAWSlv|f6rsrJuH_5SAd7$&Zz-PA{>c`p9NncZ~Q`T8<1DP$l9Dp9e1%} zb2&_Q{u)8}HoL4cJ*=Uf{c4*6VZP&6NOgc)Ti|py@HmtsEd>AMyMmZPg6!z}C_N!yrl2!br4+~I%5*lS3i7P|IhT{C4V8OYNbExPl;95~Y+dKXngAaweE%=~}9!j_<5Z{fbC`uK$kTK{zP;`o0N89oH#XnTbG!bm_`RG~~yI zcu8pxo!UFUA%-XVX2LHA5?X%o28M&bo@wBBnW?;+g%!*+1HQ1ASnIWaj`%Iwxm5e9 zW#hjAE40ykOL`6v6@j%8`!chg*m{V)NZ z%&~9l?Kf^mBsg=3pwe5Wxx@X3Ysk&`HDyJ3Rx@PV`t7?II2smgZ-h_hO&AMGL%H%a zQmBMz{tr`M85L#Ntvw7wcX!DU(n^Pd;(&9ESsZSBVhcZG0;$SxBpu#W;mb4y8!SkqExMf*S zvii-X1?nN`K}Ea2V#T$NK5!P)EuEqUFNVd#w|?8exyQm~;l1N#J3bT_xL|bQp~NBD zRIl))n?-ezY-VD)jVt4ZH=yCz*xB3q^5u3e5#@43S>ryJHLflP35HQDWOT9Suq#J$ z##nm@%p7idcQ?CpDyJ8|{(fqq>onMSqLgVAV084f|KRsh1+blo{t=*luZ2B?j@^Z! z-Ikc1u@k76xI}|%-K#d{$CsMzC!CxngyN}Zh<=Jt2@zcyF?2A@KWMwF!Nz81y&DwD zjBkMl=VSxv2q7oH918zKlrR6FDqn0pacP^*-1*Q!ic82x4)xavsR+V9*kRVMkyWEz zfq&7V^zG!s{PSL#<*~CK?f2Rija`1rEE*U(|2)^~V#w<~`3Z|l8XN@Fx~7et9tFd( zE{M-|({1yQtCf8Y;z6IEXiBT1A#dDtJl^cAz9{ZWl|ptl|EWy$8^oLPzN;3f%fU3F zqnMmn96Igm*I8-r(H!XGvRZPU$}PRZ%?C0?=x@#h2=Kub9K@XfvmkJ8S)z&IY@^!< z-MT;UK-1ugr55!#Aa zuX`wcCF1+id2ZFLFz51%3X6KKT&b(rJamZ(AHOMl`PooP1FwV)^OR~+`XSkSc$TsD z2Wc|#e^br6)#pkYl)CnvZ+5!MgHeYChEgRHEm>LJ8EPPJdASkXN@y09~NHz3Lydc<=Z`0JQ~_! z4+SSk3|4n0O!mcS8h%q}xqJR*b*j@CX8g@aFGOpW8+51knf8LK< zzU-&h6Y;klIgbmVF0|k!wDtetDEuguu~KJy-LXM#(1cT`D3x$9X2uiHlb#eJk(se~ zpU{Q+ilFdyXwS@5{W7QLQwM0x+2}0b;d$PnFe2t%aQ>g*cvu;NQq@w_H#>aL4^kV- z5)~5m_$T_k*ay@}YC*1pS|p*jR_VV0FDrr7EQcP(=AA}q zwLIOJTw#`N`^e_o?;6$o{;Ls%JwN1k^`FFe7&TI1e*WQ*YTfOTbR<)jM~1x0^`n>l z%|=|S)XF=B&u`5cur<#1-gi4lA9pguf431Jv};NwvFaIZVw6}d9@Lka`BLg=XX7~c zz!1ms1vki5jrb`VL>hzuBGCYn=yE4u{KnszwzYb-5Rv;~HxV?7$3&Sq#3|goyu6I6 zEiEBrvZ+#O(*f6aV)W8xLk##o0Xp$*rMyszdO&4WN{=bm#@`WwPt#R#eTm0}^2ou;dGu!j)mw&4`x!NTpEio0-w!+)3(473oBaDv1&Ua zO*;P`S9;?^7+_IB^yrB*6{tQ|bDNnIqK|s;^fz#0))e>DmR-lVj!p4m3oeb(7suZk z6NXpYC)TMZFga5mdBmfwd{-4(lj!QUUmL6f+y^VWz;z$ zF5vLL53wT56L6S&?2}(_Hl@q#B{C62V+dq1*^_WRdsQXTsIQS#ZCjUE%M4GRd$6)4 z*}wvUNd`Fafs7Td#kPW7>WP0gBV5wIebTg@$!_S_Uuaji-+o<(UnUE*O99*g%IEUC zV>y`+fJ6*OWkKSjC%?nXRHb?6m0Hs*@;9gcQmd8?EX^qYR->CMQ&XMhI)MHFF6{U^ zn#5m;z&<`J{im3{4V#s9>LSpar*P8VBx2T$LNzrtT-snmdi&SU-I4=@=+30UFH$sS zKxSvxx4}bB1ojSiF2Vo!F8hdl18!&0-7O4 zQyxpfXvxf54A9|LD854V?J!@Sz(@>M)zzEK|znM=C46z1~AW%zoA30oYleo3fZ&)G|@VL<>~3Rsr?{PkTC z{JG+0M=}*^eM4z_-L5J7%Xd*gx=gvvZ|l!8cL--ocgbCgxv`xjP>iVUY5SG(HZtfH zhtsuO#?((`Zpnr7rgs)i>|PYheD3xhqlLh(naa>F?m95#_xV8RK!-@w zX3YM|VwJ=V+fXruZnu92KbjUV__)1)bJB=D^&ZALX3Ks0j})QHfao;ZfVEFxXA~fz z!o166G#qxNE39(R}McC9JV9Wy_~JmK=j1T&qWjJnIP_xz)AI=}g` zV7h$2QN$KDMrLLQFlW-KDGO3DGl?|)Z@cs+LcBA}#V68Wbw>5tH=+oNXxt!ip=}a- z#I|t`8nL{uEjj(+GsZektjkz#@riwb?sW?;kQpp5@U@h+52^d8ROMpx-$uKpqkXXv z^RAxX{xRy0B|MY&ukVnJK***qf^G>VSzxz`zxU%|?4S+3^*hr~whND+qqJ`<91kWh z{v=cto~H+7f+I*Gio$qe*f^|k($aN$H-4RE157)ysvtBn6TsGBo6gW2l{mVo(y8)= z1*pXO+h-Z7&i&1j?<90oeYx%)ZnQFQa|H*$;5HY_*AMm3rU5 z?t9&FaY1GuOzh$-V`#Q!TK58R&&A>KT`uVfTJfGwe_x06fy1<_X3Rwhi(TXxFNpn19oyrMYsW2wF z5pT(!=Rx)Mj4EtwdHEixd)Zm8uAh)g^pomW+Q+KN!C9<;KzpnnOfL2Nef%A|u16Em zg_#xeZZuRa2njO}{?{ecC&18$57xB&mnFzx4Tdw>;fc}KQ^AnV9nPu_3JEC$jk0~F zQIrf~aiC!$=X*w)H*HQg?D`n)+b+9_`q?7!3aYehsRNY7Pl7yI^j$fDINETmn_h&+ z;ebQ@mdUKadqFt%oV0e`_dGp66+5YrGNVD9*nY=*8#w(%mLaH_0ip_V=bfA#qhc^? z@HMoEp>bkK?{$b8>P*IBl)HKZZ@Zr0Q)%{3;H2jEF{>PBaCpQteyn=U0@KAw*;JNF z#D0rL3~GTJtpo*frBp`n_CFZpp9#@lzAI5qAwXt)XMI-pgr{Rb=opxC3;{o1mS&rL?J ziYNnrSVjvdypS1G&bm9gxY?!CuYPj)&Z{`iffpV)8xIk}@5Ih=ThU#_PUX9FV z<9H4aZeVo8F@7vW%b}(fZ5oPGQcKAItrq=U>bbmBd$fxk+_>)%od1d?B6M<|6| z46e=34Hm=sU4aQOCiFajGY0Do0U;D!5_2ABtkC_K zCGCVuYIW8k;H1glH{gVa^YkjdYF8lKoCJ6_BiYzNLVSAc@}Yqg1SoTwo|a6)mz`s0 zyIM_<@oiTe`#4AUWig>Yo^a$GQ)YjvFEZcXxw_!hf84bJe1ryN1zYWrhiyh4*gLlE zda5L*Vm4LRZa$!w3t&(jJmDb3hjKkQ4+TZ>lj*!Q3I~!Ey8r+kX|4W9r9*S9=10$! z#M789ljyEnk4S4!Y($={>xu(AnD~7B_3!z3m>>G!W5VFJK`Sc8Bo>kYsa^BLVdP3u z-^ANqCzeDl|F~@N+ws6qi_=VF)w&^|6eW02X6L2>8xQ56o(E?X_9fr!JX?%uo+#3F zq!iZ~6+$qktlLv>d>vqd!2hEHe8?PK0Q2Os5I_b%r$@+~Jv9YVVZH7U_+7|wIdS;C zdV8{D<~d;vrg@r*AJ$c(+01QBvgc3Gtu&t2J#AHGhvriF_(*HAjld%Xgr_TguKdv0^9U+}B_y4=BFG+X{3>2Fpj0 zfaYYz!L@-aNx54n8etHX1|}^Ljf$Ugr3LnZ)oGbQhU!GlecM2Za%+T0P`o|X)7}va z8JU5uZy8?)&e2m>Y-(nh?N0Vd=f{6e@cVOg<(3g2FfiCe52O+6y4 zo!Wr*oxh&apqV@Kz_&@g9KZ9V`MTRsP#ha46Kgc|37{mQsJD*E3|aZW?&S>qq@)PT zpr%%F$dn-eGqr0~>N^h=kc$lF zQG)F4&fU>YEnWOwtEM*B!hVr0bf2VE6f5@6#oNcSs7#^k8x~mk=|-;Bg_Z)}PJU^0 zfLI=|rZ=!e@`aR7Z1lRgcN5j630q_Ao6T{dDBP2Nw9$L>7o}k^NC)-V0{!|Kro%yp zWGCKm(Dkv^>b}QlIaW}I&5HBY=Nmg-t;e`pjy{n$ohsNv3ed9%k_}sagm;buJNWRS z8|{Tc%EyXV!SJZ`v9YHfVUx(;I>V$%W@5X8y;$+}xA;a9*0^bHBnXl#g3y4|MQHsF zd}1I-YXNU6j28kj31mc-6PfH?m|lrF@9c+3yTA@{ojx#NWhW<-dOWUeRBO^@%>C*_ z{b{v);1(eehnwx)s!6`W?o64$K5hhVK6*S&$wA|`75^W2FwOEj?_3wFXUGVg?=75W ze{CLhSbOsu^r{rGcPDIXmYjY-J>b*L%3-&1K5%PFVWo7)Yn?BzaG;f>q2DhZlJGY`o- zsyWwklnwC|uP1$o=)h<}PNY7L^73P_zEJ;Kny+74Azte19WG{h8E66 z=pml{@LvIA_PxH{4=ZUIdvJLL~<{xXQ{|d)cK(Irdu8lUQ9&v3NnH?Lj^uF3)IW8 zV`D+c-~{mjO(qNG0sNt^u91^Y zxu_MKh197&;1QLQrr4zSQb&^ovq_oo2*8U+E1&m-cuDh~{-kYo@t1(kv#Fk)D;_|_ww zp|{pL_kQ2P{I2|`mp_-<0x~hvcK{C>HoQXgxsA3kRBhvmW*-_GAJ?}mtVoU7j;>oo zPOt>rHl2=5tY}TCSK-vhzT#kq{i#NEfV*1)8&AF%WEG9x!b8%A8Uq@*WIn}z8&HM$F70rh?-R&j6 z>t1AEdM8Wil~2!(E6DkIc1AKJ&eJyE6wV@}lFJ>s`i`PzlJw6oV;E4=+vSqn5v zvb9+;e4V~ok|S{bOFak;8c^646@;!n1q-i_9Xb|uu^Exb5x!mAUgQez-B@Lhci}TE z3C&+w%-9q4K!C(BgrK5}6k4RqAA}|F@OLZ6^TM%d{~U1-Da)^~s+qh!A3uIn?XAIw zmK_N=Q%)##H&yN-?lZ!uEDsX!njACq`q%{ox>5+*UNVl zjowGz>G#()n`;#y-)-^;|u(JScQ4(SIBHyr`E8W zUuM_=Qb)%Wg$0dD-k()1Mpnhc=9v%zOPy%_Y%L{HL`B7ieJ7}<^T5XY*!b=mf!A&~ z5@={@5=VIahlyaOynR%!=&H>=Iy#gSWJsuLiffSqYVhfTx5+6UUao%>b0SOW<}WKu z{Fa%OJL`6{hZuRRXQVR;m>iIwF_o~MY7|gCvgz1_*NajLkk&+=*0KaXRc~C}n55k> zI-1%Lsf>wnJTTx7Qkp!>{B3XN2k2O$-QYbSp?6{8gNB2qKPS_K_AbY)i7XyH?e}J%dYCs&m*|_rcFBY3>gxOuDDsIyESFA=chX5%^YYSS z{pk$Xi?Aoe;l!|1yJ$o?*x89y3z89_hl;GsFZ=KJU?-(w&YiAFJ8tL;Ik2e~j1>w| znTd=t%;SkX8UHD#HL-2h`3GZAcfS|(66>5+|ArERA635jP1(JS7z=gs#dK_;uyjvB`qhdO6fq5uAD%qPthITz$E5*c7>8aOG4cU0 zjehNyGa5pOWP}b5VvOnxshi7eOPQ$}mxWRJ1a@uOHA$GV5;a{keb}8`b#)FjsW0Qi zW+`30LGuW7d&oqa;P=M(0uXtNQTTqUL8`uF2&|t@O|b~ybaUCE4h=mi&Z%z@20P7U z9Ef>fVq~!(INc2^f~J)3VXaKgx(ww0K593s%gUmpS-cl)y10?j_$6nQvnmo^D6Cc0 z@Fmdw2y`=FM4g4i*&rFd>99&<_CBin;?L|{uG0568>fPfm9|-yHn(m~X}j#nXGv9U zG%E;$R}xVGcIL#@cx32re{eRe)Z7PErSx0iYqk^O794JVVgy z4SrK&TrpB(+TTUHc%Vv#1t_XelHHOxiI*rsGyPAAdgG>Jcr8J)V)|&^fh6;r51)|e zO+d8rW{1z?ZJuJF`4|Iq)ns~Ex0p1T7RqY#mU--Y;)z$TebWtJk@i{?S@^ z^_UU~;fUh1q^&c_$!Kkd;Byx9iM!oUy|cOqGZH{vczbZVHN6~Bu>_RI{{OtOV&y45 z-+4xKsXZmLG&xF#?JG_BH^Lqyv|V-M!z^&qrEP&;hZl4^6$~f@d?7%`%?A~*4mWb+ zH-&9`U&GSd0y77&JLq4kW)3Vp0e<5Br9nyseW9!T_-yD6{fKa=BEXmBZ_f9;@6oGX z<4SQAIuHmEse$*?HF=mL12ozpYy54733@KIBG|(4*g|6AyGv!%8d3 zhO0c7Sr>YM<5(sti0i4b(n+P6> zc1+CM-94C;3g=@ZR`AB|A6q@Wkq*}%L)H2bM^uowiKX5%GM=pPZ*EEkVHlNJmqQCu z>CM9K-F+-t`ZK7%Stax`-v`_+a(CRDhnrhYQOzlL6*`U{C6b?P6P}#>&?SH-qUhTK zT85^^=jQM2h<^CT(JaGj)r9PQUYdqN6GDG9&5^Y%e5@_0Y9?5r57Jgdj5uu(XZPg; zti2hVu4dE7Zb3i#^l6M7b|SuXIwS#M_HSk7LR9-%L>_QTjGe-K4GzX;qve=jv*=wP z$JeO`_ZnQOgYt^dhJp|GERsJq#7qyuwofR_ItLP9QS^ww2FWYz*)Iq^>dvqINZo$_ z7!uhL@`B&O6RabQ%#vH^QMVk#Go$fD*@B`1IHyt{2lx{V)dbV{ zy}Pg|c%76(5ukq=D$q3PEI*SDF(*bqff8|*iPz`sL{-v2_9R4CV|O)zYU?trIty7C zFSUp(LOZiF-n}HurCR8?9$U%GqF$OAo%D&LXOqIDZgKk!sN?$MS9Xt#0`YzWtRp8# zVSs$J>L#d28Axxhm7_boMP8~oSQHcfFgo_70Xe7qViHt{lS8J}YST@K;Pg>6l=ib$ z=#$K@U1s{S4$ZpNzK^#Dv!{$`wD8745;=xa!wB#Kl^KCt*G82F^IN|zWQ@U7Kq#63 zgC_CY=yD!>40(4nf$%OBPg;qG0r)oTsYjx)^o3N-GLM2t#+D)2Bm$(v_S{7Gdd*t6 zBw@adTrb(xT1h9T3s@$zpWW1a%#Pnx2@yILVQs6ZFu3V9 z`Vq+tVHba&DyBfmr-Jd_@;tdeOrzGI&y@p&2HtGki!?Aqc2XU}mPj5b7&bohKm;ZmoHI=DR*0UUNKNc|CIVLsj<>9Sz?`}96*eCO8j=9tS8KNa zxPxn7oDA_304T=Cfi|ney@G${kJcHCPNKP6Zvrjb`TAdjUx}A!ancwDuoHf2z0AP; z8=U~dd{(V7DbVfzl3)y0{G0nboe75_QsRu6L*J|mW1m=)r~?U(HkMRP1-nl%g&yos zF&F|*B!Pm8Fc(zlI4aRkM^B&TtfM(+7}1ZO_Vlzp(SB$!NVstMucE6rvn|Q+n=(NI zQAD(nG#l|flG41=fl7jY+I$#ktG*eQAh1m4-g>8Yk^8V|tynPrb71}O{hQ95j5X5W zCdm6})8ADgvCIe&tZ5!?6(1c5z6v!`MG-|g{i*O>kDQLmJKX#wGr4W^5IwlisMnIW zpwHi+fSN2x$8&NRWmubaY~1C(e@CR zT$AAL?Y9(Vffv$M|B-X*n3Q8rZcW`bF-_IPYWlG-J~u2NmJ-S zoGC>;YW~)U{K3eQqi%yrO&Ei1G|35?W;12uUB|m#uUjz;$@h|ou|*H)t(G5X;}~EK zdF**AGf4NU*6btbeqHtVAC<(;<(<#A{tJ_EP)atUiwuZ^W+4Ok#VT9hS$zyeJ^aVl z?dEj2Hf!cA;cC21yB|Pnt29uG1(%1AJWg%w8&`^`o73O;P#`FXm;QkB6>-b_!KrKm zYt+B&bg|1HMn0C@BUoQ;qRYvw)MkFa|5AWR*svg4W4HBJej^qnHJ)axrSPTPar6}( z1x>HmK2{uEEICQ{ zJ15LgpJfNa@0^+GX^P4@cf%VSz2Z6B4yvgQ(RnXXJ#5!DI-Gl}f0hwIsa2HQFuj44 z4^O?E@g4>ll%khAt8;B}bvJA>2MPN6CRQZ;Ek+~|u|KH&^{;9U>$0%BFleAIE1DWZ5DJSKOh=3L zTc~|fyL|aM15}A7@Mt&JPjB_CE4fsGSTR_F{LlwLsKd|UwW&u>s3(a~r#a}AIrhRa z21}G;j$#(zLd5#l?QYHTU!+TnI8>?A($j@E&q5m{b?V9AehT61K&-}WzA)S48-gjX zG)`Z!akpn$}RQXm(C zS6VDxE{RP2UW<3)19!iNZqmrgY~^mbvc{%jN&FEv0%z)S6I4k8m7ary1=g|rCP9)s z6$S9bs!R1&aVA z^fwp;KqbC`m$*emEW{2?cJ?PXp04Q@rFHj1aK&n_J|5x$1mm;``iqGNhSogO&wk1{ zAN!#&Z9grok&x<}LOiQ;zQY>cP?H>?*}$#d9|%+-Z1jYi^6xE{`p|6^t%7;3E-8`{ z22Unue2OI#Iga3pHdkud1Q81z;?A6qTj?OP?$IGbN1uu9w;D0!<$pie#lsE+NH!p# zlq6Ud!wP}j@=3mA@p-Iflf@Qqh+Iuc^>)6wRp!J5!@@Uw@Lk!zjgBmtF!zpFKqz|s zb0EK~MeNB$jlO=a`J=_bjv!`J1c^8GrH?OtH47A1n>-|8n~*|U>OL@NLLBls>n&MyR|D)0ulgo8A5kkXZl>+ybn zWrj5Pcv}WhRk!NRm3H)$B%u!sYk9&Z&XgG?o36ZQSYeaUN-7}too|+^r(wxAiVX7o z`#JZiAVG#8S^DQ3AR_OPC5V&+=@k!>@9__=_#Cn1$jH`xnmU}ba1E!34_;b3x&Bf! zWS#tx>0YX*!`rnRD;056`vTG`Oa`{< z1!Tl(;F{*Amzfdn3_$~kuCeN3d2-IgFuKsX)|I`q0Jrh0k$1+nxfvQP*&Q28Mex!j ztxNY{dVn|(x{0S*&8ZLqMcCeNKp$yLp*6n{*6QFfo*ygwHH_R4*YYIkXApb%`0N# z>oP~vjguzFdji?c7F@a=s10 z5mkt?l-#ch@ts-}=(J;_;|}0Nas&EtCdhi@wE#H;wQp94QO3%;Xglpc?m=~44oZ@m zn^dC-mL949j8|h}{!8D=kKm3Jh($=~*OUFaJsZCEmL`Yu^wD1P>O-bL_MG^IufX&d5BsX) zAz6_rGm$v3_wd+{mGILt?$GusTJCkSP^?|63c~F?MKUp8TK5-ULDj%^98(T+6=Aio zTwT>gyTc8XaTcMnuc5TIdB?bgclm)ZZRc4Ga<2z%7dXW!q3^5JU=z30*MqupNih!*#%*rZN5ZJ0ruhr#(f(JuoZ zihAJB*SvB|?eYG$3O6&@an5j1pxYUQ0NHzV4|DNP~>3TK#GrtBEpRQSWw=@t-5=yAUGZF~JEE{Z6J&ztwKV^U$gx%GT z+cHmz&UZvkD}MP0apm#319mc9fqvL14%5-;eS=1Qw5|KIzPwiXl``M!|w$+J16 zDfcnv*TCl4wf*cx_=rNio~K9>Cq;6;^>Fr^i{!T!H68i+kB(B%Tk})As6gbz$F*v& z=g)cBZ)?;fzZyM5g#dKFAE56}y|_V6=>Y{sE67iuf-D|Kc6D1Cio-CYDDR&$&V{4>x2prPCtUtOHIf8VWSmS!D8ONxQeALePjm z=#?>kz41gz#QKbh0tw6WTC$q_ha4;j5NhV(WAFMkLTT{I_w3ITBHHR(TwSt0T^$Kz zh>TZNXO1c9JMB^@69JhBI=6mCfGiLXoub!J9e$eDBhlA90fba2fnK8ih=1hCmbr6p zUh<97Rft-ud+iX=!8#0Rk$CseLfYzeSjr3#t}y@X)LT>AxgWQz3>gcw-&qw@qxJuH z?B1s7UK}Gztowkwvu=co{Sa$1h1_046-Nn4ej{F1?>=4M5&l=DW9`gsxvv^K0in~+ z!dBY@Ek0#H%YrWBj~Ylk9`xG-i}#EYHQpgOh*^#t(+P|!4<#PpBb8=A6BOLZT1qStQKl2-L$0Qg1dQE_XL&?fA4$^~6VQ2!A?_q|X0B z@*leZS_D)W$i&CY#r`xG&p zjd#tC7{0`e^7uprnrN)hX!+Gd5Nubw_63Mdz*=l4?uZ#h%HMotoo-}1Jm<kL$6 zfu{@L%z60<;);EP&EQ%Xd&7E}?DMLRtc-63O0Fk*=o=*P0R%-0z_>G|=;K!me`#Wg z60y|AnPhFR8u5=M($>e;6Tu>b2!no*>uboAZ-%XuA;UmEQq z&g(`m?0q3o$SfBN^MH|>()$sid>Vt{U}D2pZ{uF7SCJg!7{vi$I55L3!wLz&jf|Oa zCu$8KGfkDcgqTQXl~Sullu^{!wzue$)kmAv6SyRDY4ij-M_mp^9!6e{Twu`s@_73Z z4Ps6DT1{CSJx(rk=OZuT%-MjomCmDMUF|@;As0;LNA2IEe9qy2rv`!NJ^yqlkl3ww z@@4)?CRQ&@78cgmM@VYvWMv3lhsrVaH~A%)-K8wWmexkJ#uDy^@Xm z=hXOH?U<$A_v@Z}%~Hy-w1FNLC!uvNeI=!3+BL!!C$iT5o4cqOFQ4TIdB7EN+Vn^A zY%6_3`cWtqHk`9*(G3nuPkpL>pGBESJcZHudgZ%Mh#`OsbLeIek=sG!DT%F@NdK1D z=4Ix!?JG;a0Ox1C@jq+g#>S?Gmn<9}sUK7d4UB#_nNlQWFnXLhbPc8nW zNbd%Z(O#gfw;&)yj@apM_)D^PIh(>sX$l!%M^^k&xhJ8Ibq(vjU}whX{1$d;3AvO3a;Bg9}kyF7eYVul}3z{t+V%URO6NB-K^R9Ys18-@w zGKlC|Gh;BZL!?|=e`5t_zW9X8H^7swN3eIICjhLSXzF{_N@MYXuv^-LBRx&{on|3H zWc^}gI&cTBLN&4*mcD!HIy#(z2-?m^lT=|mt5`%`jegnavLZ)#vdt@RvLW8xy@a=e ztK6u=wD4H^S!3L(j@X|R%eL7hXHK^U`YZe)BPhy8X7;Ff*wLUHi&3z`7_ntZE-!l* zg^-b-+8MnI}anpr7+&@jDCl$G~#=Xq8?v|L&PjO9C4J|`DJNB&Y-verHhhvU&4 zy%e8JQfH}iXv}6{C|NP!>_n;K=4T0u+UHhfVkHY$r4U0RGXsaAX!Sq-XA#@(BWr3o zW1T`b>V2Ysee>f8li|5PGsC=gkwVs+y6vh6RJAvo*K$7g9(5#Ff?f3zIM>|VbEEi{ z4t03E!tXx?t59SOxWxpoV(Bb;=a6N8r}y>NIF0_!3Hw}=YEID!wn6;`r01OE1ErAW zT_JbaQX=u-53&`fR?@i}5$%{u${-^%kMjs5YX-P@-5j_k=ymDn>&z6q4#mgzF?4Se zOHoy&mB7R7DT>WaquLcg%s=U>*kf(~n1(C+#`Riofe+TLWsT8}uUj#Ebtam_@GI(% zhT7JRG;P+A((HZmsYJJ>j2rVUND1AqUT9Q=0_dZg`sG9xAUG{#T^5hK_k^(&yJyZj z){_VO81nTiuotbIe-}oRhYtwE@%pd};`jmJqYWq@N1Q#77*w8a&an*U49?S;Dh)$~ z$Wpz6rln||&x4El)-h1mK5!;cdY1yxeqjySDZLi5t0E)@OfRQ#`NRQ(cBbWJwp;p} zJ(Dbw=A<1@x{-YYPsG!>U1&3{le*SEMeG7ezva37{V;|>&hrU^YFed#%IV+EpVT#s z6-1;hmH7Cb{uX57R?EQ>GM8KbeS`pP`4g=IfI|rI`-5PgX|6(EL!H7t9t!%dRFGG{ zKuC6~(hO!}XcHFLCrFJL1huk>d1fAhXWNL1r~Mi(xZ-MMuJ{GL}{tt#B$VGt`4Zb2qj)B}=)!#3z z_{%g*7V9T{cPV#*&5x?|l2CEV5VepM%)f>O{kP2|*mLHQk?);$^U_W;=+zi!gk(mc zcQ{fIz(nsK0Np8N8m0+=ZQw~GsnmeGo#_>!DPIBCkU)UFeiep0D>lcSE803nrnThj z4_>ir-z+T-cGgs9&WP-NB9E?za>{X;bVN9Ejx#unA2cHJDuKuav2oeNdEk+ z%UZK5Q^PskSqpw8>~TYd+!fJ*TN`@hhE_jsKa868l75l<=+?Ac1Ild2N+rhL8Mo43 zHt77lU<-|^qdz)tD^0wt*cuK3uT=E+Ff`ccSG;>nFK^Y1NHih>yO8}sLhn>0B24>K7ik_)@K1Y234)3jkdkE2bK4@h zYk_vbV;;guH+h-DLNR!)GhQ&Sr`N&ZUQ_Uxn_X>MGBuz7%C4*g!(mlQeSsP@j?xPR z-Jqorqcz#mrzM$;;Z$I6E3KBBpiCg!c(2lyNteABBmD;G^{)HY$!Cd;9iDN-y5;hN zkuz~p8;SSL1Y3gtNv(9Odw&ms$bT-i9gY*qW# zR_XG|=VnJKE`T+i+(!qW+Ps6iHD*hneGYGsr*RwpH`37XhW=CVrUKH_15~CJd){+s z{x2H4bS6EUNs#UXblx*WCKt!!@;n7Iu+qd%ASd%-TfA&&ECmE05=eWn<_F|$H`w1- zwR`9oK`l}Cd+t^=??RXXZpeAbg*LQ&Nc6;zE5LBjA3!0J%~rXaIRzotul3~S(1f@sCc!I54`m?3w&W)PniR)iV(fTbcR1Gexo`LR*U5i(#p(3NlTg{R)+X#9( zx!q{$T7`&BUronmihn0qHi>22b@5p3>x#&Ez;c$fKwg_2!YqE`EMu}44}leU8F2@l zFWi*hzUP(i0(7p7a}za)o0&s$?C!s&KV=+$kM4Y9R+7)n^ z?Px!D5wvw>NXtd6(ws==Eu1cNDv?CQ7_k&&Q?z$gg&b!^+kR^PR9YcmG03qUFH?t`#eX`Yb$rza3XOoHh`M$BJjk{WqU8kJewZ&%{yH1IXWr*mJEqBjJukzhP7&K19+gw z5(6@H%KLfNMfw<5M`gk23pezr9C(Iz^gLfd1NH+}csyNVSRIuW?NkH+uF8`7=G?Ny z*Lbi8yh0=;d_?Yu7^4O4V{VB4=}%It(L30<)g%+0VW_O&U{e0 zXxOrBcP(f5^7yr~hKjX&{!7{=qd}IDkF~p<-o%lq^hiJyfFFA0JITGBxyQgcBTlD& zlBj}`gw*!ev+#csWYOK9J32n6S~ke74dfytR)FqXDEsDb=P&|2fN1MYmD*CDfu=`b zZd9cx?&6@SAjhPU3L0K8?VX}!gq_14&FS4^J$$CO@6^- z@{!!hmCLEF@)tJ!pr~g`xdELI?@Xh0~V_p3ISD0N=Ck&_Yi%g3RKb& z^QhqSIJ+(CICV^Wh-h0@uR`Pz&0tg*IxJHef;S|XzqO$CRVcF|C3J=UX^$LjmHhk$ z0sdkvCmuN@M)-v@b|v@bXt@KJD|Y_tGb#7A^U2<&cieKm`5?$liYXDQt#Pon_$+EU zdMLJah2CyP5(7Gr9%s;iu6*SrP$fiz2ps~nMKMvjs5|C-mojUOp&3ly!f7$(;^O6X za-fD{0uB4X>7@9RzL-~^lh@K*BwO{etsdJi4rKDY;yFXudHoziIrMZ|xSg)DJlBlp zbMcm@3Oq7e>BVD;)O>sjKg=q=DX#+e@)mVoC)8p7Sx*EFSKXO6;T8JJXQCGpqNeoo zvHZ3j?p6}$_@f}MO8kbSYr)p{dW}*^6O!)Y*zMPsSasOdO$gv}>^|T#&8*}=dxsA& z+cedIz;`M)Ab0HWBixnv<1USbYwv(48ES1E>8vfxB5 zmO!7aKef3`eHQb(7uQ1Crn-mGepgu39%cD}6WjO{wbr_gh@qPdo!9(r_5?2&`mhX@ z`WX$_ABFilklROPp(nwN#tsF3A?%O34I9axqma4VIT!BM-vTh*qsDgKX-c}ij5m_# zP(Kg{QBXlwI7}Mf3jfIpc7*gBNeC<0<xrZCX6amnHMr=8M(M{8y0Rqo*Xkv7 zT~6-b;XrMQ&&?J)8JW;xl$hG*Y!fK*q~h+6H9*eeF?0SiGrZ8tf5&8g9#S-wS4zML zKK7(3k6RZS3x$ZIDL1ONQUgw^0Wo+%{vs)Q%#C!}&5DD$%prFn@I3pfN`U0`?=RoT z#)8RP62X{N04rSlD@clrBo&63Gv2C%tcfN)#^-vMpH;bA7`c}u3*~EQ@yZ7kWP*OA`NdPGXGLK#!wTJW0 z=eha^Z7uAZMhw(K4`Fj96B4Y+XD_+)AWUeeO&b4|qRX%bL;+d7~0cu)Nt z?Wi;Pnm(3+8nR#_GasZ*rJy7?$XZfKV2~V}-`OIn?nM>*O8|%aLpeP}?E<{W?xnKoKB7)|-3 zUGC7_vTmgfXOsQL+om*fR2{j1U4u*G0+W6HNiXMb5rn=o3de!2=?>w_=kK@yA^aeV><)dN)Bv$UO3p7wWcTY=nd{y$%p~ zABS`gVL!dRr;fa_?QMpi>0oW>jJ%p~T8se`S(oLD*fSd1Gwl;qlSJSt(q)v@OIwUd{@W{nwo zSCB-h_+o&MZ5A9HwDF2YxAdgk>>tRmV{Y#?|^h(p?V5nOkQLf5%l8Hug&k~LdWKog-^lT^+AwLM(t3f zL{N%JR1jz_NRrGFg&f5TJ|U7Ky&w%z91 zT$}l1*Jf{a@xQAAEMv_P%*~(*Vu?Y;1*D zsg}t0S@RTKY5F$y@0%aHgj1t)qKA%@m6V8HJ2wTd1N5%0UHA{Bl^eY9sfE4d+zO4G z9O(-50gD&&#`C@7#2W^i`}Ynnfs!j1hbyj>ylZ?IQm1r!7qUGVv@qgOs;ID-J+!hY##q&W8wq`!mm1v6M2v|ohfpVJ z#NHR1CP`19QdIy@RQi@o9&?X!2O((kIon2Q2g^cO^)OmE&tLea;}+V#eG_#$jKY&B zRh=$nDjhP+@c38%$%bW%mya8?G|NqvbaQg<)WNLVSuW1$Gjk63Ds|pz(r>l?ZFu4P zxZ$_dlWw2ZtzJKX_iKEAroRW&Xv66@dvMXI#htZUe{@T${9Wl84HxY#Xiq`3SF7L{8j0UK3k7 zsFG$!jW&n{f{1nVvWdF_`8*b;mbjrcA+}fZ0{@2eAKG;F+no4z&}Ozf_&gq$ACZE( zWCsGrZQR|x4ViqC>=+Bn)_^RA>Gu>&t`JSInQ_=9+O=rh$dJaNy~603e$;y0K0#Ag zn7A3;NZJGRABZ&eOkj1)P{DnEo8U(&KBY^LXqfIi30Ywf0!Hw`+&WVjQsQwz z5aJH(GJ0BTOSf=JS!e`CJuM)Iu^8i|KC`?}=Ee)B!xJj}w8}l>zkj>GWChZEBaLj*3OS=Rp)Y@>9iuEbuYfr8uLNL3UE^=pcXOl|fbb}1 z(_8>MG%?;@1qK(|RXZjUWRkKU2rlVEjWjyjok5q68L>afaWVs((Fuc?)e`J8{(Z%T za(9Etz0>almCkPh#`zOzXwN(k&b*wr?~;OoyEpFV90tUYSf}A_fzhu+lO2DbH^#=R z%@1jmMUy}S1O=Sx1f+O9N%B|fm)$|V^v|!~z96A#^x5*p0N;K*amgZC;?$yHY>%M@ zN(HDx1xuC0yO@QbVFfjb6(CaJgcgL8BPEWiG*)R*98AJN+>h~N0Tbui{=*3SQo9-6=@g0JYCIg;vQd@7h>CitWgUh4W z_NGJo7O@KmKZMg6N0@EixbyauB7M<%g-!8P|DwiA5Pa&-y{3y$p2-2cZrW^Ij}6S9 z_epv`1>qsFdV*~Y*U!j0>10FimAQe#aGXPDJGy9gtkfZz=9Xk0Y3d{Q_aM;zOdMhB zI@Q^Q(cR9^lFFf04GjjW-J9$32UZ6Uq;zHQceJ^$R-Z6XjqI+~og9iBQB9Q?q8Rs0 z&(yw^#%~w^H(6Xio<@8^QJ1+`zw=b!9cOKkVQYv09|#^0{PH7dVBKhBjg1o>e%gqB z5#bCVIr00iDtz5-^p>(k)Dc3RW9i-^{{-ZN4Y2V^Gq%p)TYmjX1~@}DhtmCTgggeI z4IJ>KZGo^fhM$uUrZJ|efjH0$;aK*u$ zo>S!J+DCWIn#Ad$UrGbq4>4z1*na|xW^BHD`)pb?p?0DMe{*0KYX00$dK1Z;u)@54 zbAsHS;>PK7vN$t7>vYO2&)6a?VzSJqrg@ZU0$3YHhwZo%%J+t zo5N4V!r#$q5|v^*bOQL02nXV{oILNEUB;6I=Gy{|-nl3tVtSQK;dAB7j4)E--9Cn) zSgO!L_Rh1uubu(!XEg#MgbFs2NfVax?U^z(e_;dR<^lCyWP48y3V&1|g1)USk@;@~Is? z9kMCmGsH`NPMbLT+u8ZBt=GOHnbANVyM64$ZpEfi|CJgns)hVDMKN=D>r~THw@6z6 zwrPC(%Us*jxpuL+f9v=jWO2N1#f~t(exBr{94q|P?w41|D-?eL)7T7~O_3J^Q&^h} zs4L-ySslEom=&qJ>wg@R$C{^!mZm8zCa>56Vg`{!qjSr!qtB5fh?#eoEZ?&v^iKG5 zNk@wrgKb_whElPfZ8jM4Ub-F3pz8=M@#05-IW#9DG&EYOEMBkF7pQ6P`^c*5P!b!Y zuvtpJw54?WFj?|+e3hf*Mx$JRr$meFV%4f_Mx5~4AG2;j@bNX(5EWfU@c;T$c~zH- zCbQ+Hhr_M8Y@baicUH>ExY+nSpHmLA`L|}@oHd8Y*9g7!*|LSvU&vo|m3nTHqVikp z@3p+eE((oM2}riT^7SFrkz{{4&AonDQ!7NB0S!Di>+^fx@V~mp5e=+flj5y5n?dLb zS6h>y`^ilqz9XaKu9J2HSU;hk02HvnR6$3O>U9((%ry{(^|~!(FG~ZnWito-|JHNz zhN3`D{G!~OalZCW7;9E5O7T&!>^r~nZY`Oc>GNWI2F-e$zBNlgG~@I(b1cPv(VL*Q zpE9_ouI0hV%M^4u-q}KhDMg{QE*rFKc%s~xkW73+6s5NhW&QD2=9Hkt?bvNNbkWAr z2Bb~pL|Q;=0TZV3L;TZaks_J=;{CKxJ;?lXSnii9@DCt!OfPt0kubT&xN=_A4d67$ z|MP?#FmFmtaV9#4IA~3smgfy~$-)|#z0tvu5~VU=UZ1H!lMgzZ%nNU6_T7?^PYu_r zCg=)xKxTZ`5m~@oKL{#^;d)9J+zw+H>bt zhell@f7KAL^KjZb1p@Us;!&6|CMCMjP-b9dD+~t{dyhv>qz@Yoysh8<){*24$}|c7 zq0003K2WxspiXcv*$$UIgcp@7%WY2>4e4JudCFhs5C}+G>r%g=XX*I<)BF!kyc7p9 z%;CZd&Wy#YSimrK%XV}|VbsfvK%bYpqFvVFqin?H+N-m=bx;Gj&$02rpbAEYmGx%W zoD?_8Ma!pZ^BzGRd{@DuG@&AtA-HHyuYJvB~(I6?gOniF_x+p)1} z*8JiLC;D5%p+8Q4P6~>FY=G4|Bp|w_7Rr;-1obp);3ioPAjpD!K)w!CMpM+Rvo@3X zJ1NtV@587b)YjL03iK+D2qH--PH(V))0J)gAp}5CsevGd|G|rxkUmR-j#U#Z^?SFn zBowat}r@E5r7 zA)VRoHJ~7*e4rFc5zQoNyv&Fbc*TDB!R)glNTGGW(nXbd9i}a!bZdMGiD}=W&yOJi zo)^@7<%^OK6y?s%LJb2>{bipi{6NmWteJ=Q<=2>L@~OHQ6t@#hk(;P;O_)E-{tw)Z zOnSdDF+hcJ#3Adn)b=##VAMGXaQs*zY|(4Vu3 zG@kFy@Pz{tS7z6>OP@hQ6$cA1Y5GNSWgE+~NC8Wd)gK}_mcQU3Nn1MXO?E?v>mxlN zEwbrZ1sh}BagZ3>>BZ$;3 zhr3Yu0EA2lr&e&Ml;2ERD8r^EDSJ`3$ielozEF)$*UK#Gq%!t1mDExT;AKhBb&a(9 zrobYFM|LMt@7D$ygi}5MuZm9LiY`jqi@J}gN~@$q7Xr|$#ZiQ3ad?mZi0e)SP>xZ5 zFIFGLz8x7+r1y;84a~W0*;wgJOO?v4n)@*~V&SkK{ixKnqE!f@z3|#Kd7ERD|DkL_uTCO-+|`gkTR}tuAn^on6T1#wacEwQi6Zo;*^* zfm1b61&42jJ_eCGfTYX{!5Os=Q)3+)396#}bMW5p#R)tP9Gu+A_t1v~nOjnDM2Ap_ zMuv!{0Pkp)0HVckt{KZhwjWUR?l=m2r-%^I1%?sVRWj-Ac3t`?&_^ivNbu1XmGoJNEm)3 z0LCWJ;JhYHsH|iXouOFql|cb!a2%C;OOz}S+UkR!n_z&9jE{J=OAW{LF#QW|6{d0; zuA;u^vzeO|7Waw97t+MvwRRv}5o>TWeZ%Qn&VXZ6&X^PS5Q+v7IfvL6BDll2jR*(X zJNGA811s1=&8OFLdayQGE9gJmhAK5d32scjIMZ$L?<88@=s3u24lfw7bdypmD;^y@ zUpHUbPNxWYeJ3ad$D!&5-cRhQo`H$TpRo3=tkLoe)=jF~#+^>B8izt(^qm-6knCNfolFA9Yh>`wqH^j;8;BK8P#ET zwp}cIl&D#I@T1daQkdh~&kTd=-5b~sZuEJy?Zi8zE58ezQ>zGK2*!$=HCApAHosTO z{OfXknoODnLIYbIC5uHGyL=VM^DBQKXrRJC_KPUf>}lkswGh&t=2K*u6?U3a3yn?sz_e-AN*Me3FJp0D zj33RV@OmW>aszJ!ZxPA#04@*+>#SA4FXQ59yuOCS3;;=6eUm0wvY5YWbg2}X;~-9r zu?RHM<*zL*?lBGJ$j7}Y#eU|p&A^=8x`#(OY{245?5acFL`QAU`y5xCTY@yAp@~LU zfW;?d4{-)z;Jj7ix2B?5QkLjL29#$=Hxbd1pqVL7)o(iDY$UMqD6Nsneb9(O_#^(T znd0_;{DQVL@Boi$sVBAPd*xtDn8MUuv$V=}h;0zb_8>>EQ_`>K0x@T!yip|y)*#=Y zNkbqG#mh5-B~tIT=rQzuSb<`eU9)9(q`_0u4C0AOz^nN$PnER|ht|j!VWL$cvintUC$BZ%?W=IXHC|;m!q^l8F0(|Isgv zR6^Qf42jRxiYTX56CjXfDmC zfN0>UzAllD-LX8qNnF7Tx<Vj$lZv1@RQ2RIVuuC^8m6D|!3XT7m`#^vbXR z*-V@Yw2uNtrvgsFE?`kvU}sA_Z!iq(kxsQ{t&Unynff0Dsm>~MsZfBZIMgBv5MIaO z*C>CL)@fvW(nHB(%i`q{&g{*KIUA;ev~=Jv^xs=0JU%|(770IwMTElnA@mx6WkdWw zgX|!5NmFcZo4;@Ex;ujHi@s|}K1>|kw*w|qiX?CH^|}sTT}%QGK5notBqNNd8k85* z>29=tARkeSSy5N3=5ViFe?GQZNVAge+;%{zU7@KZr<2K!td=>LMuRWe*K`SxLQk5e zFsM`?z?}OZgHQ3Fd0ekI;CGsS{A74DbigKbD)nE(;2nlVfH>ZO7&XUWH9+DI!T{2C zQbC2xGwCK@pDrWz?t!`^J9+|AOUw7JQS*nEFDckvGs7pN&5Eq~6ENC8pzOZtr2fN3 zv_^W^d1NMgoaWLDM9O#kdHMo}7RElT!&L+y(?={^5gdbwsbky#v_3fJ#G)%5?uR`= zV?7031xND4#?c2652})8=#W!mvU_s^aP_ECK8&=Zlq|nQ%@B*KV;-3w+M@rBo0YPl z^foRgcqug14?O_x&v`KnAQ~rJuqZsquUOzM1Y?M2VsEvfXUT%Xcl1P6u|>Z5Io86A zaOxE0m#_8PY;yZjj2D}Jat*#h@xgX%q(~7Z`Mhol5B*uCL8n07I}JE^W9w_Y@eQZh zV@6l60I$#c%VB?>g;M<~O#&lx`C$E zEP%s!R*62t0zoRp8o(XL54=Blio%N?^f|l8z3U|ax!(T> zjG~z>%zfK@*r5NK*j(jNG-AZi`u%ZpX;HGea;5?&h)Xz^SP0UIaM@=q-}<(M zq%zY|esBd+f+qh(=dVMWgU=gI83U`WrdXvm*6B7Kagvq91Zn6Etxq_1ebI$O{}gxxfl&(*?Os3Lf3WnR;Dp zJ%gkcxlQSPY6$BcN^ElRYw8?8B;G*1ZX8-={H|RpBC|MN(6y*_%6|z+#F+!%;RwnV z>G}G`I_oEv0>1KBx)8)JGMDx*a&QPGcm4#6My0r?J^c(pSyfdf#Ov(QE=K!8 z*qH_G zOmz}a|3pFZ@dww%*A*>?PEhg^0_QI`9s(_aDH{pEjIRkLiig3_=;i3orOJqy?ijH6 z+}tSU#lfLMeLRBe!A{x9-I2|p3u~#dP#*!A24lyzN&k0U+CpR2zoRo<#c?gZ_Zf z1EJyoi~b{wQOO#!gzK6=V5tK&_xJ9XebE+FR%PM}l&}d88MefP_D=s%a5W?sEKieP z48MNhph8=siG@V=Li`~cqC85IQirgB*!{5PK#H)I*0AcWvt`k)h!<7r>$CW(=9H~5LKz!iLV$;5fkS_K`;fY&6Fsyhf*~#Rr0k9EOiX_HZ$LkJxXI80dSHK@ zx|Yj|8PgJ4sK$~e;V|`oNr1Ev9UK_imLNu--bhv-!Hw2~+Z9n>);sX}ynYiK+qpWQ zuUEv$Vu7LB-^W|4=3;zj8=U47>_h(LvXbIld+sm!KtdQ#zX6Mldy+1PS?$rn`kB5` z5#j{cze#snC-={fiHpiQVyU&}9(g*5x~vcV!>FFhc@o2jf_U9>l2{^IyO>ZbeTX6W zRIk0DByl)+Q86^Bj<&;bD|g4M`JSwFpchi4OAvY)bI@UKarz}bQ#)?=k7A|H+;zww zY`uMiqWDl=NihJu0L~r6L<5Ur1G^x}7u+kvXj8ExdtEWKs{b@Ilw@dBS#5?bxH}Bi zd@hG^-H|HihO0`@l!|xvV!m~^Ri~3gzAB`sf+L@0LBU)?*ag`k(%^ko`ALsac?MOZ z%WP3fDn4*2LN2c3)Y{>B7T2O&XQvL@c`AJfcr4HquF{+kmnRi{D^tu2m- zQ}xt4btLH_%+LhL^aO@|RV_ddfv*e9S=(MISx`|@ff(BgnZ)6 z!R_Er|Aa%YgQ87EONP*9+V>|y1gG!I6a#>EHpCSJ2=oqB9y_*s&?m=FAllPIw*TJV zYSlo%FdO5$K{Dk5@i_o_;419t;;%jBhy$KeL>tEkz;gre^WJf)r1ezE=*=S2THI}@ zTgdfvrH2K_&8%pqWyH?INj#`d^emU+CY`6_zvYO0EIiXTIMsNS2Kk0QN;!7C9tWCb z#k$|!*7P<@UcH(Aot4E|2O~oh+wzpGTE;~xY1A8H6rr|zGSo=M$}ntH zu~1%21;ToP=_|U;h+iOFJ;*Zn=-a|GD1Sx*0rUje1e&5?N@63zt?^rGH+rM8>{$J8 z^@*rh2rI*b4?02}`2PUM30B0~by)pIcbk@r-|s2fLw~=gS9D74HqK;@P@0Gr_e7`y z+a^xjop6y4aaaSWjuY^NwfQMt>zA>gP1K*{)^KCX{#s)~cjZ#NqR&Uz`9&TM*_HYx zLa4T9zfOUhS@0m#2=CwLEDNXmp}xpQor@=EiHKH*HVX?e7Z(Qz?0+t8Ly?`0XuUok z9HkZwlDx>^*CQ^dx)PpjjLt~Gh|PTM-61zCIz_^s>;5s@;h?lF&XvV{Ybpk(dK;) z$*9eEp=-bu6=EMkw2De64*4Rmvn9g`#^IllToR;Wf-5d+b7gkTeJc&9JA{z0G$anv7_Vk~R`QC_;lMaL67K5hCU4Q2rPvsuceW zNL$eK+T7;GGuj|>;>1B1F(oGy{?A-2tXZknzV@jCP$zxZSzY}!N$hLznps!I zH~8K|2CB6B;JPI;H0IHQ*uFh(O{>-Z87zy@`{^-?P%sTha{x6-CEB9diC948h+hUb z-UvS%tcfZnLXSWf8&V5kX5|Nrnm4<rJOpu`*%KWR@)yZ{`9!{00H~haamqMw z!uY*SKT07^zrtmc#^x)A-lOV$*r=!`*oXdW+rEw8y-3TA`JG7hu(Z7lZ@_k|TmnoH zXrUv?kP@>2X%Ie!1OVt?LeScPZL~jj1!g~!dh1=;xb(nV*I^ou`1PDp>=vS_Q;smOgKrKQxCj%e3P`F!>E}Cyu53kOi9o^Zipm0*&cc=m@H$rqv48!`WiqxUFAar1 zfG$dYz+h1C^9V)|r}zMZX@Bq2f8@%0nv5_%uzSf#3N(kuhs={SPWC~nGS*vX1O#0I zCRI09McO)yU!-@EV{2S?4LLS+f`hUGE5d>=THjT=%C9C(c}+MX4^){kg>$BkActSB z(&PT(058bDux32Q2?AdeTNCbya{-v2Ky{O@aKk_?dZ&+aZQnBWZ9CN<^Z%N;8c1h1 zxEQM-kdX}`^$U%cqGRVm9kp+{ zqNcYl)HoXGz}ml@#(#vg5PPZ6F650US>2hzSS@AoMH1<&o*9|E-fgm zX1j<2p7s)gm=RL`9ir17ATX}bu(|xF_b|T}$9k^5m%O9DtAA-#C{a-h4>KCpmg_)~ z9bZFLF8iy49gA@^xH@hZ)6PL{39RQXdAMJ^%9a#3O<1NJ*xA0OYZS?RVj5L8HSwBQ zHY{`F-7liFokJn)zz(1mf25f7#1jB$4FQu;>r5eZ&uJ|Hyr5t# z7<<5)C;*)fdw|u{vZ;XHnT0Sf4P)kb_{&~Pk*hDIjfHw=v5 z#P_5i%lRTcI#YH6qHNunX1U6grWMWOWzhO?0)EO!MaHrrQhFRt3pvDT}c1Ooq2$`KDSylo^l`Ei0d_kjT0*FE9Yy~gBj_68ncnC+St25N zN;9PA!bedSPEwSPuwMY1vhvlvpuaraCa#wg;1%ChM94$@t3C5W+kRMNDy$b62&}A@ zABA43ke&nP?2wULFE3Ft(h;cd`8Mt!tjZX_eZP10INf~<+_}B*l3_2Z|DiC5pb;}M zKN?)Bj4J%lnu1x{?c3c^w#7vXt+_ev=XU#t#1>!lJ&G!B#Jt{VwdLqhgeObj=|DA^ zBSkq~svD~|O+rTeqwnhF{p*u;<4RgEz4_XxA zV)NV;f&54^*>`QH9sT@v?zjcASDxw>$|SO1bfr!h`NBr+ABWF>voC^_AoL`qR#Z;O zkr)j;m|PcqpPv8sUzgcJ1MwVc1 zWbAv+5q)N6`Oa0L`u4WehOtmP-M=nKi47Td3;qvW+lkhbpHZco!^FM^jN0rOv33&O zfka~pX2gd-jxFzqg%{S5p1~UIrDV;eve;|~1jZK#PFV%p&>$$8pjtchHm}p#1qLw9 zQ$4vp`e0xN!Xo+=R&28J8H^duFZ`k_oSv1HOYl*vYI9m{7|+yUKqTPn+wv)Ga1{S! zbxS~<%1qwghSsQ;c{;!RF_kCydcVbThTB|hMa)Dwtp8jFE^20JlUp)SFPVzn+)H`! z@zq!M7wa#5?%MqpjbY)vsVUO_Oh@^`j}QH@r0-j8oeu1LzW&w3-wilmad zl@Z`@Eo6ctF>`6VX2<>8)7OBfyWi?6ATEuIemM6;)06_A_*1GmFE0w(ngkW*eaL}Z zrFLw=Gi7X}AwAs^m#jyMO1faPY&(}M6kb@?pLufjJF&kyn5^N*vDxLU!~B5=7Lgx5 z2Y&h4m~h}4rIzug()DLzA%6)DT9fEsf5S32Va~|wn`oTnBV0D8t>F<@pJFynC^@pQ zv9k2KmQypGv5y)coH`0!?^Rj}xTDoVlxrMeGvzeskd*UOy#?$BMM}(MnGCjYRJ1b{TmBqVl`!9ii8A`V_E1Zs22c^9kV>=!jh&oyZtPvONu|YoD}$+k zJ&Vw*GY)r241w0V+k83clp8Q7 z3SLY+bcT}o^BURUVuvEyI5}SY5To91lav;;%9SMtt-@9DQa5IKwRBeP*FKtQhg`m3 z<+Sm&IYZyd`fpx1{TvM#ePoyfu6u!cGGli{+be);YZ*_N()r(5x+dDbpLxeGrfexfg2maI@c-R|9W%0?uNNH)FZ_1 z0cJsK2pD__R9Wvnz!0Pnx?Yv+<#UqnG56ODnib=v+O*>%M zh8?mLnw(NiD1aFfo6Yw2`8>LD{`{$N8A>S&Y zCUmLhM3tDM2m0K(D5O)?Zs_b7>S+L5lw}zJM6@&cE?W93;lpq0e~bv{j762R&W~8( zVK@GG`OuVOWBLQiDBWvaUf%cR^ZV%p^{8n&V}{e_pXV3nn{U1w{yg0(Lu&#%82iyL z(_VB}B19+&eu0js%dNoRavEALK&~de%)-+D?*d5wK$z0x;3`#il6|^AHIay`aQ?{j_sy6*ziT8Er5`RX<`D{3Z`879 zo)hvKvyw9wz{vKocbPP+mGN{V{i7Hy(Q3YA5{iG?CDm!T1Vk{AyV zOmWHA0bpiF1}xa}5hSXkPt7D z86EdQK|u0;GCW=Aw7VW<*DT*1z^_^C9E`Fw&~s{Gf;k784PCE4OB1;~UVSjg{J9Or zabWaz@hkQE2gE5wvNQZX#yBwhpLR~e`*+qB7VCGEd{U|r9U&OZhj_1(`Q7EYEU$}4 z)+~C!)ChHUV$5-T@~q5JzSIrnWWtY4@G?u>tS1pZt{bpibRj$Oi-En&_p6OA|D|^n zn%7r}Bp~Z&g;ry|+Vs46X`b)lM}ibZ@Da=I;c5BV5AcXsr%dxG9s!M67?Cnz+|rlb zdgVQ_#n(kx8$%PVD4acd=FZpCl1K2MLfpfHmf?jZC6=sQ>ePF2(bj)qyEWwcGwL$5 z0f=3k5lcYnTxiiFe^d^BXodo0x$&sjmj_KM687vSJ6XQpI6~JG2nzVTABK#Q^ul27 zUYy({zN#1ay_Laq?MZBX!kHZx`(-|(Z!h8f8?W>0QL{dG{8tR(-x%EiyDSyC*9}&I z9xU2MfJ%j}FRVH$(t z>?z8F?>Loiy$(10eS2?-O8eMUp)t6;-1%|&;^Vzu!r2J`wt_!)&A?>X2ZU&}pNTly z9nqw94tZI}lqC2I(9@E4F62fK9TDxww*H!%gr>p^?23;mcWz%%RpRoWJy}^FHR9*s zq4xLOpSl)y)}QTR+=isdUiIh)EqGJ$KDBtAPa`xMWqR@=Cq+*iNyH=jIB6rSw8)f%kTZ|2f{As=2B{>N|&$FV%1ly!8yZ}>WT&51O(d<*D`KX6!a zcg=xFwrc-2FquvYeDBmnhkv<}lQQ{M-qo zOQn1qv2FcLk9Sh~+M{I9_Mc4pw#Ng0owB`WJAvM-1&rUm|Lop-H4NqfKe(rU>TBFOA03Op-ULNn`#F&FY z7YIRBbfdHuki>F>^BVk(C(!S1ap_Zw78tNadx)e?K3!&gq)hC4>SSd-1oy}7q`=!y zP9r<=@xRUPjVFgyzkbsCPWgr-&trUS}*$RajbA2X=hTcUU2+z zGSWwigi7+N(vb7(mQpM58_Ykl(<&qE?x~PM z&Znc#^pZh~*TASK-88zjF{e-h4M|vzop(ap-nuy%l^N)n)03+3mR5yWEYBy9GFA$j z<|PS3`O~r9jSRqGw{e#yElTl&2`yIok;tXWBH3TK(hu#R-t1Fd7OD`m&;Z;AKpX;a zwjrML*MahzLG>TjH*OkZ9+~m}`w$}3A@8kAFD7msxvqU&3%|x6}5O^7r^wM_)eH0#u0k*3A z!Jz)zvzsO!(LZx_bKlwBWj*Dz3Klh5dM~x8Yq9U&BIgd^%D2ytvm6~s(|PF%W&P9g zPY+;1^@+g$&2H5vh9s!ANRU)eY#+68@O1ia;Cq#8l~UYlNOv?kc+dDBz`RN`&#f2* z86GFf>sgY5q(EE(y>yH%G1QyQ#8fiA(Pwq_&9Px6XK5i*pDRT^!E}xjhc^EI@lO&@=^YH>AlhP_kM}U#qH6I97Oc5oO-?T;hyanB zDU?rE9EJ%!qQl_Jyj;@DHTO4@Q>EPOxs@zcW~*d=YV1j>p+L|5ZI%x*0D^=_S8(uS(?tq2_ZUWh#Co{H!4ZtAx zqGhLm4bYCNW07LKm*mW_XBGI<_FS0$k~wv}ZlyRo^Z zbx7+)DO=!8OV`t8b!9aHq!FE>ph0UX^vVm8q)&%~#UsEO?FS6@7s|H$&;rI|zn(tRD^@i z<@Bvmp0oJ|`+q1m9-U4nx#f-74KBOrMdFv0OZ$^`O?tCtu3I)WT57e4sj7vM-*!f) z7SI~LGBQtsYglX#H9T~vM})ug^GX6-OMtgeaK9yk`xsnu8conjdLMInKuP@z zpD2y~+eRVhC#-lDd2@%!sjhxin`jO`U1CF=>UTvFJ+CHrA3OQtE+f^FGV|Qp`Tt7# zD`)q)!2aFJOL$50cYdR{UK=LHwX##rLDlMHu<)Gy#9WV3_q_U@#A(Sh7<(=GX1VSQ zy!Q43n}t-{ISQjwfv)7DsU0;&p0|8y<)N-pHGl}fW>V!s-PpRcHtXB9vGbcP%uPN_ zy-a`NU~X{Sf-65}0fJDnMcD%BnqPW|gVpD!?XG-Y((~>+13E`njN$ynQK!PMsS2A3eO^n&T-1l48Q8maspdKrOsXX~&a$MJ$7xlhC z-qai~Q_tJsbl}IxP}woAqf*u(OcpR8q#U2b=8;C&@8Q&sWZ{sh&V zxf25v3$vgoA0Z(nY$^t>UvP-X->CUsdha4gKt)oAJ<0xjfv5{kI{(y`brcqc@6x8Y zNLURcV%d%F+;Ug0hj(G4;{$H_V@HRNXO`a}ZQHVGEo(JX3_5rm{7rPMm%jBLjR0=W zuIV3?Qxqj--Z>~m`bgXdmdvj>k1bg+u)<`k{x&x~ZY^vq1-33&xJm(2dSazRhd55I z@#;dNoe_`u)Ea^@{Y>M``_UNRZ!7sn?10{8Q*$8+~ZMwpFH_#PnI z9(hwcYF4ki3fr=IfAgW#>OX3F6)3}LymV8BNbkC$%O~KTvY0DR6TODPG$9wr0(iy&lPcAmOdTbha!ndlG$^H)i?s z#KDzUP~^3sL|d_?sSPX&i>lO=vM(lYX%ixD{fXM`Q%xlGy4&dXam-QdIzCm@iv|K( zrC}mj5Sk`xRW0J`a!W9LsDW?FoL{)}WVY}8D826%m(~oa=7QU#9f3B^pWuC{Djx;9 z;}iV3-+W@B>E{uFXMaNzpu`F~V7~x}kt;8ESB6*=EZW+W2YXmL8qy z#mW9sX=C9iGPV%&+=USn25#-(Z9}@bvx__khhm8J<2f1#keg7IVMWnh5v%5@#X}^U z6O~}$-Vxt355uG>NsyJa8Ib#I9^F@Rzky+>m3X7XIhU#y{iuF_wLH50S(gFcU#fO( zlj@^n)04wuqUwY4vNRI{DLR$^beadWs78V1rl=Xh8?Cy-lM<>TyrdakUVlYAO)LTq ze{JsCH4Cho9N4dcJ{Bi8NE4AZ7coG7QOElngCU=?UIEVnr4gtB`1ba{H0i0d3qOac zJs*4xe2kB796CFS{f}fAA1^=jL%FET8;9;PPaq%k9fn1`K?a2{Cwnk4z7i^*-|}Y( z4g88Ji2QE~om7;CKjX}qk4(b4%av-_q38WQQ{g)aCQuzZcJ>Tfx(-Q8-nDXv=vdqD zkNtc6u0^)Od{2TdY9sQyx~;DWKUNM`pHVXQnisO9?HiqAdk?;HXiNoqSnV!%?KnT< zO_sixaDDokY+Zh~?7i~%k*8JJBT6ANKw$Tp&9N2sZlkIski53`jt^i;l0qS0-Zne= z70sAl9!kw1t&`!&(xs!Zipv*}bWyxiW?SH*6~EogIB*WKl-(?fMbX30qGqVf8*o7 zk;axFZE(lr)utZB3%);heYaxIToA?YL=&$(GNk@D;j_bgr84t)Jf3^K^|tW%OATeZ zmp|X1IB&1?Apd8b4}>DMcWXHxF9F-js!N73i`y#<#6zQ+0?3v??Q`#9`7WXqR zz0(PY?kRT%p(~8+cN{~ch~q?` z+QRu+b-YFf)mBT=(FSlZe@WRh)*Nk5*5BZzDIvaHKl`U(s`%66+(SCcKD?PsBXRD? zRUj6?(;Q&`mPBm-p$H{ItSn<4n&f*%u=2GrOK{|RJwP-ZhUjrIcbFvh=leM2-^kMGI<>9HHfs8KC&3NIKL#Z!cz?);!^9M;Cu`EoizK@LM_VST$PgB8 zTCK_f!|X{hnU^3VqXa3a5Rd)bq*{)89#CkCir16&m0-cOJOgnOwuB^;MC4)PrF{-{ zi6Jg|<#KcP@nK_Ow*Icj%6{r0a;DxsGmASnLm2Cp^bH1dCW22W^h#M}q#u)teZ0x1 zlqh<6=doe?-D7=m_4k8>=h9!EKT}tIa(>Ljy!crnH+zb9uQRSxn7z(zk1ZcOZbVLS z6DmSxO+KD@6GpX_^Kp(z5qzev(>;?Azu=Z?vY>BrCMyH05dOJ0w1$182o`=49n;A< z*)^`Lao2aYbCKMU#)g-oHddv%y!>`-6!7n$Z&vqlcphGI8@y)gkZN%jv<5G(`|B5+ zLR|B>QBBfa+W9ggS;3ssmHZ=7ZOXn_q(3#Ux}f2j?gD>LC^FrH;3x&X3;d2 z`b8^iTQf6HRtZb3EI6pdangsV)R;RnKGnwmL1TM_C$dMnQz96Xort+08=~LV3}u7y zt-^g)o72mc$IZ#h>Z?8I5q2Km*N>C(zR%Ok zo{K=ebD=f26;1wp{C6>%%X@#g53TnP1}+7i^4wIv>6%%znu|5ZHJ7n`&-?TDP}SJh zHKt}ougl>c65;1-8vl!pS{H$}C-SRE39340`s@s-I$pBS#w27&9+22)iNQyisyP?} zAJ>#$!J4vq7kv@nnG6lZKKv>S!m5$%yTvXaev1SJ1o4w7mYso70Kk>$|UhYbP$W z?BQVnH#i~xy5If464X$DbY}LrXtq>>&X7t`mJj~@*9k2_uSsbv$C@L6`hV$ z>6bG-%sSuO%=W%g($AR)_utZeCpSh;ExfJAmTs^=qH*GnkZBS?r*j?ym=8|tPdDy; zE&UekvLVdE@8cXIJ|gS*Dn`ns^Y+j>6CZyZ-NP2nLC8;}Z)D!@08J*^}chtT0^K03unR?94qS$U0C* zwYIf&y*|=VQScE*`MEo^C48c(;hZi0JpQhfF0`a;8}ol`6^_Bhay~EL6@$UPEN_gi z-CE6SeZ*s9ZB=${vPdhAn;BKp+oX|^6cIdP;aj8q;~}3{Pf%8=$6l>oF5#9fdn+Z= zA}x;{-+ouD5CME{fT5mW=WwH$5pepIEFU;D;I$bI>46jS}gTvUC; z)v#$cZ)?BmwSV7VKYjgPJ}_Rporid;v`CV@(YkbUeUW4#fr#Lf$}uvG#^@qrS@eGZ z+CU}0eT&Pt>w`R?JF=;n<5Q#0d}elPgcJm_5}tFvS0tT!Leo(|6#$xUN-nBH8l?2a z^0~}ZduPW@nY;$twdCw<^X>G{j{YK-iHyiH^6#Pe38LPPe4lOv_@IrWg4D%>!NBO_ zqS(mWZRVarp`^_hk*pxt+B6&RBT<8J!N>WIjEc$tPws2$qJq6+b}$0DwA~ zV6hEpRQ!Mod2Unz;6kW${&UEZ4!vJVrPbU;`VFI{XK%60+hHot@w!|(pPqVfcJkmChE5&$!lL@5sxqPXtt)~;3dh8Se{k}3kH}*56CS-g2cYe6Nz5mUq?Acjw)Zl(V z+3!qjbY^DsXEwWghsCzxu5@1VnGID2e*b?S9(?ZeAjA^$SN;Fze^}Pcx2x~~u9>l~ zr;ft@Z|~{b{H8BDeVcE~W)h{4|Jl#X&yM^MZv9F}NAK%J+2E?6zAp_LQT6q5l@NN< zv*B>;m`>Ih`?_`@4|)5qvx3VPiRPF}xsWv)Y8g!IpnyAKcM$hEGiKEfKyQ~7gEW{si1%I z;faaSpB4)7SwQDnx9+;_Z$-&>L!m7D>J8E6u<03&EmV@R$w!7yKKGA-z}S-6oCNBX zT0iHk#er?teXOVF`rl1vv~smBdyPh!vlz8ZJUagP^yIN`#lnFDK40f;R-1dfs5kmp zj+H6xmc(cZxJA}&)jvD(^JC9H^|_tbz5N?4oqOJ$&*d6H|I?qEn|}TqsZ?t6BFLtm z+T;{aEdWhEK^NG)8Ul@?cAKSLZ?J67mw2PiX4_CIq-TTkV-K(_Z{$SY!oqAx)&Lge z`8ZC{<6RGvI(9S-YV_5zk;wE@*;Hs;mN-3`4Bg@kU zFR*(rdm3$o6?pYCxlAFD&qRk3$+F-ptX4}KGz1D2TKN1F2d_|F0Ou#o3%)%!x}W2 zm^gjlU*hrb@fVOu{d0{|KotPi_yjKRzJ{siIhI9kpKGVy;5MTcfRITB_oE(AjI8Fe z-sHt{2RcB#0y98ehZG-^$<`$rj9$P5$HVjEj~8;0Az9CHT1~B5Dptf|NhiBodbWGL zop(rjLkl7P)oPkjRgZc;r4nsuD|S$|!Bi@GIvSdJQk1kcp3^XZP~kGU8fP?lyIb1( z?y%XNI|@KVE9DbowOTQpM&0yEzC;kmH8=u*wyFeWv5K*FrF5(n8{yS%NEHAsYzAQI zSIqqs*^dXS2B6DKY%CI)eJU_F@nCp<;(=&1JZChzdpmo!yuZ5-)$%->Z-M*DP%NZl z$l^PWqCHQJj_v=Pf9mwlP^O!-<|VWFg>~VT&tg#x)DGM%7{j)_x2JFK?|WOezXdQp z?o1|?sum-YOeK6I7MpxvZf5*`z0ug}0wlM`+j%>L7CT9Ti1R5zRIcfCI=I{Zlc78Y!Ir+^{aPm>0cB)nWUU^>D)EVbUl548xYG=<&f!5Z( zH{NjT-QNnwc^g#&)C@H^Pr!?C#zAE|lYy8sy1@0C2Ve`a+|H`LB*rf8kUv zF;U1QX58MMJ2q~<;SV)BM}G!OAK6S*yH!^!WTzjWnmqQk@zW>2d$x@g{Y1|tdT%nh zTbw(#ZM*T0p}4#{SKzr!w%9Nk0kT$$o$yZ|``X0VvF{;+fC{4+I=Z*q>GihVZZz3@ zv`j-+XD~`^Y$}@I(%h&nfF(-2^t-Yakaem9a<)cGWqQ-8=+NoYhrSw^nS2!2)nM-L zLU7%0wRi3Lop219bPOk&j5@}oua(C}_J3|{TMV?9F*-vz$`i4=za0v zImw*LL{FbO`pjp0`nSH@<=Of{>>sZ776TKQJ$&!ezxvVp>58TE)%W#70o4Mqe&$jc zNje=1<#NeEyWO+PXm;C*CB`btEL$z-{n3d3h|ys0B5)7zddm5ytU4@g{HtS-bg$z8 zzK7I%6#o*8Hn;;z@z~sf+3Azt6*vvs*50+Lp^;gn5_JlKxwECc^EOcu^rd1p1Oa2E zwF3w!2(!v0LfL$31X|alD4sUk*4lo(C|h-vn&8oB<#vy+W1rb<@DvN>`EW3KDx2{? zpUI}?04`(@MA@d(auRLi${4TtO-!`_oPW7fl|H3T23g4kdR|~8%ZKJC9~~cg{_EqT zr@kAD1V((m_T2+pZ~X68=fFLZq3iXmV7J*UMz)ZhIW{@|^gql^o&1m4>9PAz)o%>< zp?v-oXPQ>Gdu#v3>pt4nvFoFvvFr7MxM-vl= z|23OVPA$?+RTviuv0mO(0bsq%ewlAg-B6aK&zjf8NFYY z^&TAxeWUn}2qj?AED4V%SvnyUP>K^W25fq$+%+WarQ?y~nN;|YPE*ODo|!&@DnE=y zv{~#e-A-5gHl7#TkrD;$AsqtoO61EYt!E`SzDh2Wnnl{+$!a+@poRRB15xhn;G z!0$EC_Msi)(Ews*Je3Te0{Y$KGn1#jm&rsAvaH7Bbavg)*1hv1?VWpm9oSm~)tc6n zNzRW}i=ol^*<=4cI(*P7TG(!o|ev6x48S?+R?rHV-`p6cHjy) zQ;E=IsSp@JlFVbF@adn|fB-7VmQG*WhS!;lwhbig!-Y{Iga3j6u-F?c3R)UKEY{7> zP5d&Eh@SF!`|e`Jw%clT&d6)xlc$HD`s?}GiHBF9|7sIWN&!^>Xwr$f#BQBoyp3ux zj^IDZZ1e7@HzclH%w@{8#8@_+^CR*XNdd-|Iyn3?UJV|qq|?DT035zry-a2R12hN= z07Bxi(D75ppZdpqCb-|_G`CpouFZj9j;S^bKH&Gix_86IH$u56mWt`=7nB{o#G$os_&0>Ifx2mf2}d{L21X#6$ulA*HZ>@!G_{r1T4k#8bvf5vWa zx%v7V-||Io`;Lz^G|p|YM46E#u+DnuM0Ec7FAbh}{7(Xb$tTh7GMC!fyR5(`oyp|v z+I{`)pX%Ls)Bn(lt+ymn8WCt%jL2o9k-(8Jj152c_mS}Ip$)y;-rLr>=^a*^Yr94X z_NkRnOQU=~i5KQR4)%aLAi6`-6DPi(&S&Er244Gj9FiA`x$q>G`&S~tiAPpzEw2Dw z)FxJd0;&M80z_=aCbHS|oG5a7kHx8+g&&>+-hW z~k;NW=Q}F&d*; zua_8s%|vG=p8MR;@n8Nq%X6H=-Ey6`rTaBTv$G$zI2nx~&X=rv_45lQWb%MOTrA{5 zM~*)BDVxo=ZPVu4|1y&|beT;$rc(6pA3pWu-z1aCS&Z$BQn7;LRGVrN3aA1=lT5^F zbfZ|v#1YC=f%$Ng!RWSXS*e?8sJa9m3_RAABGy1WI(NW7J9Zy1 z?;k1@l0)#0`8;j??`Z4T@ll(z|4vcw@?d%BqLHy@qM_mYvZ?8Z2Twfn#bPlxOIa(6 zkIXrY`?4M*%O+mUBBt{Zh9wD3p?PMlheuhu~6W|4`K3uE}07K2T)hs z?QXjTZm?U-K>Q?|23ay-zC+=!mwuc<0ue%VB!Te$LOL<-ZQ1$(mv8%PkRHTj(&LZ$ zr;q;I{6ghIYGmccc3Ff`FJ27_sFS-IRBf&{g*#sNz8^}4o;QVK6{fRIS2=$8f!`e- zJoM$>zU}Wv&Y%~&B1_qUFV}5gf|K^7<8^`_-a{5;PW?a=dz8uvBiLxm4Y$1MOB$Vh zAX{L~<%&k@ut_i$q{7kpksqHpzW*Q6=?Dczkt%jxVdLfQeWAbIaLZj^^tNt!Uox!` z@&yfVG75}Au2fTrsYgbJ4*au!`t&cTEw{U6pSz{^)fTg@pQk`U$SD;60J)$BUh&d9 z=Y@8pY0taXvH%tyH`4sU{86w+2gXlNdaYO}q~{W`z@e#$!S6->FMHnsD92fyyLD!E zw)cMb_9|Uf%a&x>mJ6;J(@e9e3FRfg3kjsW6iNv2AOsR1u}vt(1RG=Hj*Yvl-mk81 z@7sHCvpc){zJDe8Nlvh3X|H_m)eh)3@6P=H`Df>x|D5l9U&KFzjuTB!PseR--5Wk5 zSG8>nh6{LUwWd#@_B1*?|+xg-gX@V8Va{9Uq#yD5AOI+zaPo&ADJ*8+8L9Hz;H+B znmZ~2+tyNr)mu%1>fW6X-tJu(f9UkLG=E;X7HDPwR_@xKnpq_roPAy-rj;$O?v1%T z+T+Ukv{=YRQpxy&L@HIVAPvA1ggcoZ{U3uu{IR}Eu0KBkkw)26Dp%-S8kM#k-2%m# zsU!D-Bm91b;)|VKotw+NNRZA6B`NZhqpXc)#ugleS(`8q@{by2H>$Rndwg>9CVv|uOC>PxOJhOYhJ2t%Q z+rX3{NB|9WP&+lXB1{T zUrxu|(>uTBkIX$ovTLWmule)JwLmifSh;IUW>$a5)LZm~Jg3td*5!+|Nv>2orBXo^ ztY7~HWu2-_rm!M?&YZx;y}lzLcmX^}A<83^&@`iA7=;loMVwA&eIWCTS87~@LtT_B z+e&bsh|1DRjq)k@WR+PrpS)A)X zWwP``OiQH$^^~}f^&bfbh9C8NM}8UfO+T4T#!2>yIRA#+r#R26hr`uRAx6m_do4G&eK)0Qr;~tv&A&NbHwO#JsSOoq2M0YVW^flS%ihgKPe<;w{h& z09O1GpO~Pq#%Cc87*(h(>s175$hu1AXyxAo}zyn%i@BSn(PHH(+&1ICjSmarVB~e( zz>RXHyd~(Hd?uUCdO`FS07f8;$0$$oqXg$bvLTo$`MQD*%w|Og0L1avR}5u-!r3pV zLenCVNyjEa{+VZe?y=wcJo7ICvyybUdf&bA(wly0ajgH4P^9ZfrP4)8oX=Ftq5bH8 zzxU{&m%p3@?KSRC($?DOLyi+lG#b;u#!c7%v$K8EC#8&iLo!|Dh1Fb6SdEV6((}(w zjqUn2#y;KFz3#)V_Wt+i43_oyXhICTj271l0Jez5$?*oxzy1v-9|lx zDA1*9kRla1+tz%jt9#>Tq>Qm6gSkWCq$m;PyhI(%>lyjw^u+LkxGrTjJJuP@&dnfF zS_|y~E6gD}B{YO5Eyi`$c6oI|OXr7`jRC+?0S5fr2v4QlyM~Xx@{M>rI$S8!P<>A(7i-|K0G=j(>bp=WM=sMOdJj z0ay{scy^OO+C9USvu-)7b{LE;?LslD5u*vPR>_BB(dZ~cF)BtbH)3N!TH|oivwP0q z#We&BBPlhip0(JeEyI-Eui&RBKHZncM*9%CyPQi6E0P zY7`*oTqff`>x;hel*t4tguk3*1fa<3DV3AnOe!)(fzU{!H8@zMQ7071d&MHwq>!Tw z0_N9zJ~5L@goo3q_zYN$@)X(zF)0~Rt_%~|ct(UiTZ2Yv&(EDzMru}VlrAbXmYm#()c1OTB zd|xpaI$ACjqag5d8cep0YOQgAWypO=h5$t3iFE(jb6Jt793>Fa=~Dz-Clm~im-$l8 zXjye9s(#K&CC_>0_Iw{IoA)jffl;Gu*F4W6S)dsJERtcD;AzQYq>2>%979Pcqsekb zBwk^R24kO$7K^6=;*(0z9ZboL5`3vUir1?JoHjw6xc-R37i11;FA;zm97=_ zcULZ(1`V-$XD%BY(yHYebYN97IZnitX`R{9)^D~tucJUf$b)(qN!t{hHaTA-RMSq4 zQb_Ot@o4a9C@{N&^mDVURGH3XO9f7%P^oPlEv-G*P?SW+L+KS%%Kl_BHV*Y2il z5&;pE2BpwbA~dmNy34dQfT6F50HB`gudf5y@{=qL?mMnf$OIB`|KXr#_UZY#;fE5j zh+C=DTTIsWYx-7Q^%b*i&2@z$Z2`egyuwEpDx81s^z^=eo|!y)Zz>U;B%hB{H%x=R zV+gh(~arL}| z;Bs)AiSU6coaoRw8FZdSy8qR&lR^ksFmd}&*fXCg7Be1{<$Iz2 zcO5{*DDhVapZR$mO=V1^$^tm(JcNd- znIvkTqkI0%=UaFgZ*BAgnaqWF4;o@BYMD%JTf6bv?-(q7+e1+fDOe;$*-DO*WIZ#J zhkoFhAAK~J%Z2a|*LHTc++=fgzKy2j2DpE)sMUBpSV`;PVvLcDa}kb}QUbsYMSL4l z{iG!oU2u5__KeO?58odO&A$L#M+~U?j)B2TKM#rA_r#L|ny)e%jaml59$qkd{N=Ct z7RDYx>B$QtlimKJ@b<&;>swm;KG4~7>E|J2r7dt$HO~u_G^jS)p=nUA6x0_wZF( z5Dy)H!aeiK*Fz!S(UUef*UL2Dw~Q^&%m6Io#XFCoV|UGE4LW@X_{7_5B8AOp(sjhb z-d*9aZ$hIrwjyhYv^VMzGa&MAomdw>=8rPK|&b(BuF;pQt{9bQvDB1j~)3ruq^vEMq^)R z_r^amT6=G2Rc$u_^I=h`)J(Y;m_ob%{c|&i?m}7M@nkYQ4r7y+)J6bM&$utOT5U^L z|0SOSC&isgb?2=T+S033>sjRAGC}W=pL*O!??XxKuw1Ei=yaC#2BUeMT&{7E)=Z3t zEYkT0l?ad+a9qRyh8-U{_jW}KNSWXsb z1^~-xwHi29-~o8CsFI*rrBki3cPJF5&T=u6C{{CbrCdHrGct`79QyT#(YbFzFk<2t z3Cj>^9h6YeCAYH*O$+{73HoMU%%nocrIJdTqQshPwtzw>gobqXPP4gXJ;liE*Z>tN z2%6+_f-F%7Y@iA1r^;rN3$d_gccm1cW@w7SRCW1c6&wd9r^(c^21xCV6|`Gbp`}pB zCB4~9Vyw(@X}k`PSVAr*B*6`UXFx(CJ^MNYY>giJIh=1f1^_40{je{bKN$Qlg$iWr zGU@mfcKa`TJyVZIgY&yNu8`4ct^J*y8$Z?Bx#@FqRm(t`mnd`DL=>cb#}eVuU%Kax z{5asBe-SKr@pCZV8@)vckZrqKZSJ=?y5HH=v-yh}UB_iLp~95Oq>`mVU5S(%P}={RX3L6GO|5Nb{GGbVDZMJe@zGJI2-@=Atv%#6mc@@NzPdnCcq1 z>Ki&!_aFk^LOwJ3kl!=@Ajai+qe(UY`^vUJGXPlG>-&1MD?tHl(rU4;Hkxc(Jiff3 zqoe%_mXT1CV~6gcDMmxHG807fXgF)46+k>WzMa!iFP!5Ps76*eWX;P6Fmxu1>oTYb z8=~RBp|O$O-;*(X#$-}Eph08{MZm-+P_#H&I<9MN@4A66Cw)Ya=$x*87H=vP3UQxz z@(IwwkJ|0}RvE+Ep|LJWW&|v73fnu{dTvoERmPd=53@T)>D4=B!sapl< z%Z95WZIt9{WLJ5vwmOT^p6g5Mt5^q-Ee9eX3=}OFB!NW8ibPW49Lr@cnN3GVr>Bqq zV(j?dAEc7eNxj*=;gU;l`gUvQrC+E?te3@;HGvf3w@P^_myL}-@XAXM+!+dbUPAjH zq3$L3al;R!`wfHZulh=7@0Pz*sJq`0O$h3sQHCn!YP|R5p@WZq68Mv+j7HbC&dxO- zvDn+L!M(#0RziFniU@Sif7efDMGQs&k;o=Y9N+U@$Y!Q4*>c18GX-@I3`waJ`N+Oq z&-`g5;vp@6&Eq1sKr;Zi$ZvpLCOVD2;)31Ld3mMA2+E~0Fn|Or7&uzwxRgd^=!U}v z0{Ohs0RPR(q%=St?WAo0hgQbOjfH%A!RwxQ0tZ+7iy4@=(3n? z>-8pcUnZGdIE{y$oVyXuw(b}*nM5R$ijFL}M}AF%KhEWJ4GKk!uvn5Ps{+Puv9)f| zX|=5&mr2dfk3W}41Pi68Kx(dFRy-**M4T-uNeG+uDzV)?$N5qQWLzfha5y z969pT=RLDW?+KvA6}~zPY`7{l}cHOa4qk+qVfNIy>%Vp++SX&WykO z&5@Cp|GtRM5`babE%vS(^d{>j0Q}6z8i9Tr7!m+xPYkUAUs2uxyQ92qcqU4gE(p~ z2YVE9sksW53CLu$3cJiewI)`w3ZunfaQ4cTy7gdHmDMWMd^{eSP9~#sC~{=6lPi!i zH34z~oDP6m9UnltxEk(w&TYm^JpdqFlmysETGx>7$BrMV{b)KF8AU4lMacC2+UK2p zjs%P*YuAmAmeqIKTh@I78ddgkxk}}8kvaJKkyvQ#{)w@D-v`(fLRGH{QIWMhpW}@8 z15)U6SUPUBI9I*T>KOcp#?ZbB}=hN&P01O zUKA8KO5hz@TqXC!UhY)FcT}CAVD#a zG^uxC;-OU1e@LySWfqIMqgthi(2$O%^t~Nj-M6wVB@c&u`%XLG8N0R9{(de$)=)dn zLNNYFI_}#m2bSAt)VIr6wKS1JJS0+e+Z`R(I$Jxofj9nnyzVekuVck>F@;Sm+65>z zc700HF@PBo9R*}j-m0>|(h30TF%bc+k(>$A{lJ?*X;L68fs8*CntO3_;>b_Nk01Cs zT1Q7(JNn+;xB7~IFj+VJu~2H+3=%6!qoM?~I34i05B|r{(2IW)_WSnaaxotkxlx&_ zGwvg$!O*>V^G*M1u&(|X#kj8JtE@r|CP7M+iO0gj_Z~j@yU!JK*#)b;^-5Q3@2!yO z-9po>0qc#9Q7BC|GTr~0JDFro&@`hMA3OL%bVdwsyzGX55mU}<1Oll{r{)V2W4piQ zaZlCNFkkc5=C2pA1)2fCMZEa0nR>Y*D5vlck*hV90Y;{kAqA@>nE=!<-PKC9%0h&s z-bPG#l1OdnagZ)%#re&;2jG!Z%iOyCl`8e=W@mwZ0RVo(BknuGr)n+Ti zh8#jM(^BU6yhexGd{tNh$~*R&xt;H?pfM<-8WA3;*0=T0p{8sZ{And7=fJ z0&AelhRzD&&Lk3yb2ycVFYxG5Cl7yA1ElyfgYQUfBg%P8$^uI%01(xC`iNb~Kg34R z=uP`$5#K)d!o=g=h0#ZV^an46&aOAPu5`LKeA;9kxIv+|w&M1qa#`O|1%u-c`m*b^w5_mwU#wb+u%oSEo(k1S2|jWl42nrnvVrXpGqa? zf6wI-MUz1ic#13G-^EBSR0F>IekvVew9kKl*z;<)A8^znOxiL z>bU$%5~)hY6~f-I@5q0^o(~dM%m&-$^kFoAUWOKEjk*xb~?A3`(z8yF#pP)Lt+!^##o z*Q*EV_3mGD#ouW(EmxJR%2sp?h&5_fNJ;XAWMby2g9o4e`)oWuO3>jbZS?6)&P`gK zc{REp^vL|8TLAT6>06+jqL_t)mqkQcTOMwW8r265bNe3nDAgqam ze1*#wvMF~o?%(TMn0yvo6i4tPzN2H{J?-6>d`6*ZyCRvY3gE!13VAh4Npk+VsRRFU z{Mf$lpEg5sFE+}S0o$N&71126o8 z7!{$`&i?nBP0p=Q$kdVTK2Wo8`bhPY|B+^fMLZBwGGI6Kg39=}Xe->H(Y4=_$f$d* zW|_e6JM_~7J0Jb{B3{0E>Sb(!W(HsxFWzDd9ga2%F8l*VlVh_&W!B~LC8@BM3+8iK z58B_{3YE4M&2J13AQPTyi}qkUac;QBdfF6Jykc6$fF4z;)^+dzErf!zFZexUztL)- zW^OeNRBDtUk*cvYqaSGR9Jp1fRH#u7T|j#uY5h8NG;F*m3*@4q@R3kt=2@wbOE?{t zRd^0F*}O(#>|zmHp~a5WBra4S0(f7Yw_hS7l9Gjd((Rd_d}Mrd-;d^IMjip~ zBJ6Z_Ub%7e%|BG@2R>NjHQl7SLZ?CXsT@2yHMZkx)8qT^T9^;M2)yQEaQ4^DWwY7V z_77h153QY-|8;@W4uC96DQCq3g)A4H8Q=NUxv4{U74x}()!ub|OMB0)D4q2a%m?gP zA-EP;l$f+`>;G^6#{Wci|3n?Im`yFD(&15s%5}9|)xHhjT0y|Q{~pim;U5sftHxis zdB&Asfo1@(5>~OXb3iIFKBG}9EWrKsmUz~n)u~&ENDkWbcF2)~h1icmA{2u(XYpxp z>(~I&eSim@L@JRpG@~W`;Se26qXQt#1BjnXMTTQB|CkbBMXknl0I3-XQRlCx`|Id_ zDD{nd!Mm_9Kla;jVETE|-*0pFTx)goy;EoCdymf4bG=+?R0*nuS|l*~Xe=`Rl+Qc* zKs>VWWFirpStRE#x7*vVXzN(>5w))K?K)%MdzEUd5gHK;F1a(}AAT?yn}4oU%y@~q z9?CyGMvLPzrCjYoIf$_MVdGCYugHDYsARl-~0>6o*c5-x^Jf0mTPJP zMnOx`!TIR}-wOn0UwWN0H2>2@Zh>Y1aFO2te`xyUQYLT$58&7Y)iNVQa>}SD9s^H6 z8f|zCBV&!&x)OBz1$fe7lqA>yAdu{?q@dwNTHVE}RE|_EJQ@nlJrxTF_Lxj6Q20uX z(O9l55UE`jTgQ5vqxD9Nk*`(wLN;4PHh?4JZD?5lS%zpN?A;p<&OXbsHQu1t4aDQA zJj9Ol8og_6TYK-d$X{4^t{BYcQ~p>ibi7zddIexyKzT!o-Yp6sE&$+>5kM3`!hpp& zE@S{eQvGBmWMW{p$5%ihN@(kgLltt|ssW1<3;E{|l#~ly{oDUZEY+!tg{VKDnR&z=n0TU;Z#W)i5ogsr^@X;; zqTi?&dP2?XHO>NEU28wOcGFEi3`B%1^vWxhlKc7Res|yPI-Sn$boIYoh@3as2v>jy zfE@4zzn2J30A2+os(hYgHM73f@so+!SD%*Q} zbk}#oKHr|kS?Rx>Ne(s|3#&4AcJ*BP1*?6{+d`2X2$ndGk`}@;x)7Y6IPinXu_F)R zop~*KwQUa9l?J0@6R3}M@Eua*J9w0iv6F0chUG$H0Dy*smxAN3<06s7DS=>V-0z=# z4uG`BQmND|1eweOtGE1_&eU-u$IBh0#Z#+Rh!~0!VAucaxw)ZV_}o)FU?;-aPyRLP zAouF2z*W@Ox9(%@J)8blvBa2)WyVZNWl|#qdprw=9`?)}zK4v}Y_o4dW(OobDm$pF zR758OvG0kD5=r%6-~*W@1;DWJ@ri>!(gS#Ca}0banpSo>tSWIfHMR4V7azDipRcR@ zUEq;5FSnd5(98fVr`5W^V+C_+2*BZ>(df8TrZBLjvQUSf>u@2Ln9HQoUKP+rc*ax6 zcwV?nz-czXQ@mcw7E=@}Lj4sxeIa_S0Ts(d;t~JeVlEMq%W1VnXSRu@Dpj>cx3Ds; z%Vf5#6H@|lI+>V0?R1U$5mEtMB8#3uw6o0unH^#nkyNeLxny#^8ZC@=ic&ardQ-bf zrL?4yp(8%;+}=Vi??d?*G>lS~u(^@8L1YIYlSFbX#KGV@*;}61fwwPW3E%{aA946% zDHeu89h$;=9meJ`DG@1!IWu~Kd5CYTtF*4&R0l#Xy%BG*sS{1?{o0}w;93;4*%cxY8;bMfh1 zEHeEj6Ca>l&R>-K5BdBs_v833%fC2iP*gs8D+ zqG8`YqsiPO60?2ToLFhK8oEF;dNk;t+oc2`P%5EWQi#N6wGj{LH$8Y<6i9!71SOzY zL*bT@D=mD9&wA#^o~e|RlMER8!53I9a#eYy#%i?&dzZ=V*uu~%V~~LPL?z-1Bl7VK)G=O^KHkIWgdgW(Qc|HtV#ewV7ZOqv0^X@7 z;_=8dQCaNnx%5vvx-b2LM&Ef!iKn%hbSjb0c#qb~p+hsX2fpi_AAb}=HEx)fba6D& zfq`IxHA^H)t<%+adr#k%ztCHHZxBkf)^s}05Uw&gTY7JG zIJ<9F$kk5b^D(a?0$$v97ufledyP1M$Z0}DKo*Vr4n{)0J;)qgCY7~pFY$~XWJuA` zV=w%5$Upl$c{vVZy9*nn)GyoovRo|C$Pd?YnR9cTZ_Wbb9uf7dzUH4gd#?Esn8pOY zx!wQj_8<9yq#~va2I~en94|_s1wwc7=1$%CSCiT(cFiJera9D%$0Cu~QRw`5SFgGJ zulfhKe>IbrNYfb-GnC63MXgZc!bfIj4*z(1V(7lckEVV`Vm|^9D;llNZCfvY*U!Kg z-=50U1cd@u(I`>GsK(IKKKa>M6nG*v@}Dxc7IT$Lm=9LoNMP`DgstxC74L*3-A?;}(1G?Ec5Mn#MJD}(0#R9sm!tp6Kax5Y*2s-tSbk;C4nWu1YiiH@JtB#DJfE= zQbw$lf?*CMGxI+8q>gMrPmPhB`YaDjrvW7Z;`C2!N9!nb3eKMp<27G1Sy$glG0rPR5{*%*LJ7SF_@-~@XA84O?)7_)KR|$#crAM8 z>$Y!%-Oo5jci)CT>gwJ0R}|~qE~boqsO5`*YZ3b02mf<=V&`|fp3#R{rQG0fc3x#R zw_d5%ntBPd9x*h6t_mr0ou!c%=Vh?3R7@*?fh`?7{PI^xAz;xd_Qy<$$v0t9j{Wf*h;svHWH#+Az?eSZJk%h_~zNG3yZS}NA% za)lCFru3MP)nIaL1SyR|f&X6!D5QajJg(?OZuiZkqA`R9 z1OVjPq|lFVq@_Q*km}g@Cr&VzYY3lUanR}0_ZoGY_7rgBlGfgR^e#pD`Git zC9!fbFdYqz-|v|__+zhU`l*x7{|txS2&>CL)}+_lHmWuDOWeHyqNaWOl;7q$PNLMZ8FT!aj^;kG=l!8hN$WG&FVQI_n| zEWLp-jK+2CjURZ77nlcAX|Cq5RFnH&dHBO__tfuu2iAXtqLoGzfW@TUYw3)hG@+qv zid{6+WzvacblkfzxeFN$rlWWL$6G+{iXCBhILhH=LV-?=dVMW1{^IX{^-ciz#us@W zqVDc>ceHh_{Uc=hx5eTW0avODpf|wlHKOY9k>|cRdVKG{k}(ixX3<+OH5*$tvq}}g zUMNs;;Q>bDu}MXsayDHUjVS>j3oRu<2zJF#=`F-#@xWms;XF4z@+^j$l7WZe@~dvT zTc&VqL&-%^C{zVn4S4${`FJW0_Pk>+eLWct58<`s`Lk%=b=`*TU+L`K{Ka?*)WP|h zn3NneU>3-v7G4^MTA*ic;&E5|s(0G#t=Fm5hTeLq1vpYD^^r`((m7Dmq9K><_s=|s zF+Tzksyn4j+x1xvoWxE>Fns7q+$Vd!vvdaB9LaLAKr;idTvlocj1zqL`BWlsNDkr? zqsi5QhpLRCK+z+t04(S^K+|%)OfEOUDWO)qXwUUGX$ew1C6xg<8#peClBxh+w9!&V zozJH|^V1{uXA*&-xuGH!@&Tz=P|4m->Y+qjExNIOA z_U;M>rhl(i%G5@azLR29qI9MP&Omh!;h{I%tZNIY$e7=|@Jc$Jngt<4TtIY`DMmxM z8n7QnCk9FaZ`dsWe|ruYfO?%D*AodPNcT%+gtvg>a^ZN$vuhp_y_569_eK2f!wyI5 zC9aNjA8%>j^ygKf`4Vu^D-{Y_AZLnM_w4?E9XY<^Yti7;v$1e^3j`C=-8@IYFx;z zprsYbm^zqsiQK&8)`h_dc_g@!{js=je?F7)8LWdJm8+b6f@-liKfUu?p84_np??uS z+ncWWx~2tAS)dsJoU%mo`x{w+JZLLKBA1a-EZW#Mr?O&Jr`2|d#XJY1mPcs{%r+G1 zk(L7Vwy2xCHyZ01{~ddJ6me0*MHE0%sjOUW!#LHT^NnXxp@~W*=NF0id?AKHR9tJwXU@jlsI%D z7oAThXI@IiXP=&#IC^&?=0B3lkwh!J3^2JL4 zmRCc_Dx8kb?o6lVo=HR&o+In6V6`n~vvZr(*0!BySR*NEkf62B;JStep(YhnvNMES@*VoW|Zxh6HN$YtIBe^m@4Jn&yNl7_(#8Y@^SDl7+0^|_LmlW`*xaDSV>DC zB12F^@}w=Kz6ML_3kkZ2-Lq(?oSryz7b7$D4y?WDTNQv;xx8;U5gotZy$}RfLb1{8 zh)c-~&9N+^1seVkTg0(8PrZaJV70bgamkijeq7|WUBzOVmov%Hy*nPd6C44PzysVV zrR7?p=67OOwS)%#>QJzu7a_w+)aa_E5?|)i)iP=v`E(edwghN;6>V+nKiS%`;r0xu zXwt~ZSNO!NoGC>X7LNR6a^&#+I92A=(>3-78K`OPG%d5}&8{o@S8e-Sfmkg|r3!*V zKH-XF6@P~;+g0y_GX0v^jt)=@$oz65UmC96Al;@Gi<`Izbh)Ny3WUgcfb9;2{&KmP@GeX}vEUtlEEe<V8{i-=@zMINBf-X*v~3 ztp>tOf{=e~@BGYxeK}fDP3qF@S-EAZ?1?^K#5ObcOA>+lm0|3FvYNPv%%2P!mxUWP(a(!%4X82bgei~ zxlqWG`s=AlHX^7dsrEQ@1Khbxc3vnbBw^DK($qp^EIJfQlUXcLbb}}mw8NTK?9#bN z#6QLr3IUW4V#soo(KkpDnONWhfYe6<SR&r|~>wF6|Fk?u!EgeU|G zvbp3!D7f&lXJO(Iulx9;L=3`YZN1cFZoAIxSbc}V)O({+Ww8kb$d)7*_9miJFL>NT zKb@aFj_g2Y?qs>7(awprI9j(rn)+6QrRz4cW#B_fwX+4HO3Gwn;ZPzn@q9cy^>`*5 z9tLbdOu&6+bIUfhO5clgzaGm3@@Nu}yv1#Of9L~W2dn^AgF+PAMi-LF@JJOz($1Dk zKC9HU^_2NSEgCuYz&zxTVdL48_gy3Ixj!_b=HFMa1)2fC3SQhroEmxHa8S29tWg6z zr?+eihB=|j)v{SCt?^S6$L?dn9gO<9hN$?VD7}b7X~3z8PXP2AqvXL5h_*muk3y+* zCF0@Xsfok)VMlpTqhd8^4;u)Dvn7#K>#|rouV`s)yB_WMAnz;13I!2%V#QN^>znucGe4W@dG7ndxz4%Hx!i9VXX1`$38z;RH2gMkI`vfq?bQja*}42YvkKr0nf3Pe zCndYf*x_Nb1l{d`hpdq?XW!<{GZI1WO?a@3iNG)Y@qG$ zkd_MdAB?@C0d2ot4`}5#{J?nfQSL5RDI2W1kjtgJ%77T~i;Iz+yjXcWl2oGkugmjgeL7{jvSQwVYaKRh`OVKAV=_BJcu;> zu9Wc{78@oa%o+=-vLHo%w3jSz2EWZxHJ%$c&C_v%|Hfa9>dT4Ci!GVfW6*X&uqy6L zcGcoJN|*%;Vbp z!B;1lIrQ!0Ikk^$vkN^Ozh>-r{JNr&VJSKULLx9i- z^cI>g*SC({wTqDB-{x9MFl8T8Ffd%7(L>9Ry~d#u55iy>TYW70;7}+k|LsbCKWsNa zWHB{?cBDYRtBy`kbM=P(pt|fL2MJvgM_j3dcy4lDBg@%O6;ulOq3twQQ4MxT6pTmX+w*YW^x!2&Z}t(yLL*LQC|v!c^nHsDTPN<0`H+{Wys- z!-u{55sLfr7t+U-vl-E;>i>bV z5yTYdJN_EuD7RD`rwZJPdpRFB&Sv@+@MX)_oLCMqEBC+P^So01Y^wn%d&nzh*vFMP zH%vAqnE3N85&rVSkgOJfi9c1afUshY$7vwL`|dep2`K<8EdYd4-OFi|ZtTM7=xZ~l zWJO1r=vEn_mY6V&#&Ee-`t~zLt*m0h(n`;&u1R~Cr6EOhOpTL4w(n~KtV^Ni#wi7` zh6x*d>&3xpo8tz@?5OH@V;)a?yTdQ2@F_dEQ@uy%#SpFEpFcbVxRtYq68BleZn)F{$%)!4Vm#Rh zbK3NQ0Oy*xDe=VGBXjN!d!)HPcXv83rT3{DZ_K6a=2xs#?)^%-u+-f(pWxuP>-E8b z9rXW?O0k1a_YwCH9iWAnyD&BLTQJL*CkYqc6AzZ%jR36bZ1xxnVQymouk zl1p<#lOC+c+E}=+DCODO?&BmM(XXeN1c--+s!!w146CjjSwz|@kZK((0u`$CmJ5lm zz3tA`dZ~&zZs%KYb9cP(1fJ{H6|E-QW%vF^Ai0emHBG^w5PL>60)$ZLE9#}!jsn;u zvqsJ8#P(eKow!kYZenDwD3yeWrsf=7@&SXO`$1?0o(hkQJKKEWZ2nrW0BQI5O!u*t z&#nXLjP)(3iG2BeHt6!seTdlO+$*!2i_u=-KcU*>u;;`hI${QyG4IFfXtkx8j(UJiPVn62Gc)*Vw}?iKrD453pOl zRZq72EtDuUH&i_bORwEBscm;?Q!hdGC}QOw`h5Po%V~eR*nQmQEIW>Bf@tqN#|LjV zNe{doF3Z#T;ymIKP-N0@O2ams4gCZyx0Mck^o7QOWTB_YoTd61n1S8!H1~FQgs7L1 zdCTXbmAC?NwdD;0H&y?Cyg3FC+%5L4Y1cn(CdX=>*aEx%75o@=xp>~*Olq}O zp;lgt2gVh=5+^{6oe2BPuJn%O4a!TU1>v^J7tXkinJ44@gMc92&rOZ^>+lPB<{gO8 za>xTXPd2UWU9oCxumzfzCrnYB)o35BMv53nSJ{H2s7!|cfw7EC+XX40 z8(rCNYV|WV+fkhypN9!EG6~pRSU?0351M zZ$0b_n9-AqCi-w7%X}~zN4`89zOQ6WA1a&SWhT+^Sx}E|T3Gr{>%$8S{5$CF&XnuY zo%Fp`56M%K1eA)Hp0XI=#-qdEe0;ZfFNPP-ZU8ufJ+YX7{i4a#4&~w}#A>Wvi}u(u zOcHuQQMlNoH;l+gU><=pAkr^L!qat|EC1~?6jo$B6ZqfCFr8Fs`;_3YfzhtH-o|dC4I~4}AEN_DH(=bBDE7 z?8$vPQ;fcozRmh{kva4H{jzdlKE=L)Hckr20sS*V1~^*U59|9W-n}WObQ9@-=E{e@ zoa*(m=u`09Z%hwN1=&z(quy$X5GwuSP+V|{H2{L0u2q~*f7zsoGk>j5j}WRXfd(lv z74JB8Z#G_*PGQHl_ImVCOuG-qIxWU>ST%X~uGYPv1PrjG$*PL8<{>4=@t~{hVn{xI zeng^Wc>aw+fi3Smw~U^wlK>O@h4&~Vp5SV{i{nkgl||d^H@~le%}c1xQ)j~MKD*Yt zUpJwws-D%72hMSq=qV;VJ zWR@+VDyh>@d-~1yrCB)F4FB&B(NUvdjJX|hU zk{7MJs71Ro$}J%;ts~F)?lm^q@6Gp>s~@oq1?MndO|+m>1ir8!_Nh4Uj2{2e*}U?g z0k5A6=|MQOYihDq&WDXJu&^Nt4bb&9p2RWIM$XzH$c@;-7D_92VwUB@zMBwO;;p$> z*vlXWMzcn1^$H6eZ*_b9Q$DKuFVBNw{>$?_%lC$Y3^eE}x9k%De!B~3)^!vzBCzW~ zwBw*5E{_6Cg*6Oc-xmP;?4yo*eW9z&YEwCf{b696DphLv89T+C8QbUz=*ZrK2`5g9 zLA)yN7gnUU9Ej=#O1@poXd}X3Sh&yy(k@KXF?hBy-UNc|FG{QPx35I8&?trM@i@Px z)6&12ssU5W#vZ_dVq5e)_Q)n}beH+-#@g~omf|1v%%f}P($6|zuv?^a& z^vFgo5OzImI}Je(AS-1)@i22TvdyEX0d-Y zIeQu9ukWzKhkOx@rKA2aW{fdszVI))4tI{t{=6AC{fFMjVBhG|5%WK%Vd6dRX(g`M z5@_sE$O(XcJd#&!E@ueMH}S|)aF+Yo5zwLWo9%IhC}p8vRP+%JdY`adaap*DB4AgH z$wyNX!iDDhfsn@CRuTOOtQ34^o|Y9pKv(E2hscK(J;Q^LRUkhFdriMpMRia)tyN=l zZlUwUv{HUed3=yY>HzqN9Oj4Y(!s6A_ysYx<#0HM9;+};V6ib{yp5^01~A)Et0xzA z@wT}46ra2G(k0$z_mw2Nq_Y0;K`wQ}F;!{KiC~yP$K0&qWFFFhiR1d}=}N|ri^uos zupvp+?Y`x(VK++5gM|LW>>ish$J@5y0r z{Ne94#Ra+XYg4sc$>FEu6t91hQH|eFzfWr;OxK2I9T~>*IfYwC1$et^ zAaz}-N@cS2a~6qXovt<%g~f=&kh{ybF`=oRPz4#v)r&HrxxtZp8?8!dfV0;CzZWig zZ%*fe<=4THWbB$pm+~ZlTHvY%CH4fcm<+6c(!pLYQOfB+i7EE6RP<4rm~%L< zdnCaev>F=b|2>2RyXL5Zu%+26Ys~LsutWN$15$Z~GX5yh&vX6(QU5|#sF$XId|57ifmpAV*tuWIomp#8 zxd(6&lL;DPbdfhcCRmdcr9PmBc7NGU!Sm*r2JFA>!n>F}`DH`{adfYlWCiot8mv_b zJU1vXt!x@7G4#?_9{H0Di1jAttYdthHU5(l<~C}jP>64G(^MoYV@}{}6hrrLRpPlE z($=jPVhMWPH*%aBhAN#iN1_qN#A}ohsRMbGp1L( zT`R0bSJ_fgD=&PfmyA3uL&%Mk?Ar+9Zb$kYVRA3M47P}>Etx*`f?d*mZa&Y>6kt|w z)Ww!jvFOs?6K{O7E$`u^axyEO-2nt(VK==!p7)*ucr|K|WZ|Xih+5Awo%Oh8$qYtrmd{b|C)hh3jfK{1T_fmZrbI(L!Lrlaus&iGkdSa`|#=W2au#3mDw&?p!tUahnU znzanX-SSw5UMX9TQ8cmm%O0NjES}j%EDTMZmR{L1pK7z0O|EJf6noS-X zY#_ksB1_#4RrF9tj>$a|VZJymNCNTs3G$B%MTPV(xr>web^O~i0$(^T5g}nyvwl@! z5j#{FzXYNw*;~jMpoXM0={Dco7-BzuD``Vtt9VvJDCD<;@Ye5S)jwwdRaSI|O4$a$ zh9Oioao(@H<&d8EtrN+sQ z$x!ERc{80zS49qaV259F(JRAP!pI>ACy?9EoNZtx-hnm|CHe$OXXz&)!3Hzt?2fhP z#Z@2ZNc^`=gh{H&ue z^`_=VYlK2UAbTnnV zyczz{Mc1B!7fjU~AM>=U@huj7ssa@*eeTT!$HV6ZM3$)91(CeKWI7em{kbPElfthk0Py)^G9zDkt)A#y!f!(8(-7EA=VI+ z`fm2LhK?yddz(ksn5Uys0KBOj05SWjmngKMTg-X~^=6hT9TFICWb}C8n8UAyOx3Ja zSsr1I5=Fznn*NV{d7=KrHCd$UCW!B#VU($u=G8`U?x&hx3pu;Z$N{uc zbm$kwog%Is!I$0l_S_HW)}*`UriabNmG%z|(?~0Vqr~VVe+q&Rbh^hZ&Ihd5LNs__x&7G>I8b&KMy=ubOxE%&xNZb!Xr0#1 zO7@$v(#0x`o+Q(smstlWSu|$2#@A$}=VrPGmlS~*mD4CkJPLJVx`Yg{bPth+>t~UI z;S&y6uHZ#X;n)jlf0B>== zdNoY`*MkF!jINYcfQ`57axL$LN@xm8>*bq^3}-j9_m1ZYkRo=7!)HV))Hz4atgfIwdy(dnG{Q6$UCTEr)S z0r?kvc$fn{wD1Tz9+{b744PC1WszU2hHekqwoS{;k=t@}r2~|#u+xdmiFHDSZcD5+ zPsf#uRi|rU?4+dFW%o0Ij!5U&IbVy3DsaE!6Riy)H!J<$XQ810N3{xpnu}|7E7U4# zCSAk=dJIm(2ks)z0tJjukqjQf0?Inw+=ubw5lH z_t)Mb42-7$W%5i0KE%WlJ=J_9bKNT@=qc{5x8eJ+5d2oH3gzBWVu zvBQHOOKRbfN(p5iq6w!Qc~VvS{v?!M zr7f}Dr>)QUGM3xxr2Z{k`>8|U`)?qo{o&H%W)3WJoN%a;{eMN`q?7tq0T<4g85x^@ z!4E(uv?>L$&RaffRH8o)8D7)1iWtNzvAf@-*6UBVGC_ei<9yO$3vp@625?JICrg_M zt&bMxVMmC2ON#Wi9>!bdvf*>soLsd{Sa~_e_N8G5 z&U;`1znL*1$6FI{iKqH9iW-C|eZ|qsRG3P7Z@A-ShRxW)VCje|b!sGusMyxa8kp z&mD;htV!cNEUb)acjixhC#B=pR+IICewEG0icfR zi>qDN^(ad(KZ~MD*>cCQ9O*8vS#h}0;S~h3!pA$~~9{PQ;eLJ=GQ+yU*7ev1~gB{n{fQ!?ihbp(VoLDk;82U_d_bH8+fo}pswaAQXb{gr(6Cl%WyzsM5Rn8lr(T}j z;JC7_U*OXiFaFJzE{1#H71SggU1FzyRam~HcPp1|uoYvdxt=rO02z%iAXa)Ec4+G6 z=kqiYLn1}hFn@940j7AhDVV#Is2aw@$@+PJ;fB#iWtw#UEd7bGf=c&{C#z7Jo^JGb z?Jc*=b=7oYvR3%qavVt%2q9 z$!KwT%LFCq)IrOOTMr51QBw>=u%YP}6s5m$io*DLkg@I#zh!=nqiK!haZAno`O1(S zrAltFCzSDwV>(Ry*Ng(gGh4fQCf(X32mA2WFcH7Pt16|*1|&LGIJ4zvlo4c}=w$zX zz}(q%2DE*kx)9S zUo+Efe)?wS9aVb@+t`TGyLdJO#q6_U?P6l4`7rovhJSO^v_5#` zm|QkC%b@arS*GW|{u3V5Hz)wKCPWkwrkbkDU`k%KG%(K4?MiweKkrZk8H*wnvdGMk z!wHJgSK!v%ni(CF)Ka9b$S^o}oQBi!w<2m`RmCz= zu9USZK@o{;tMmt})})k)G}=uXCccqgq}2iu=iy0gsmpmLWs+8;J~<9bv|whG9DjoJ zcsE+4=Odj)V^G|ahV}W{zO+lG3Mg54*I&{Q2INZ#XbFd^_mrW~k43MoP#l3ZGT7{O z=j8jhqxET#=&^+m!+_|RUTTJO5O(n^_)YTKgXZySkZ45r47HPr_47ckMGU)u2Pr^* z>|yPKBYkn>7}*{&RYxO>c=I_qpMtk*Wp&jpQ_1WIMi2ni2xv&qG482b>f}*$#)dDJ zLXZltV5Kw#OXIuv(`Bg_`D;F6VZp0E_GRVECJ)3x;=e**>M$nS9`_Tr`^|rpXIOV$ zmLYH~nrC51i7iB^G1B5VePnxqd1vo?gw#LB)KcqTv7;whrDht4&ye^GZhG-6NbiT1 zIIc85B%l0%#$cn4O9hjHM4QU@%c=;is>E5XatY1xi+|TW6Y)L&V(R%cZ%yP7wbA|y z$T$Pz6Omcb&^uqIh($2Ka?=eh(09sx$9&R?eaI`(LI6NY5yiZ6{%LkF2by~>W!V>l zm8=FX&k8^eRgn@;m(5BGD%q+1l|GtJ;&p)XF<{Bz!kvAdeJm^9lUy{EA+aG7u`zM z6+S|vqTmAP@*U|hSp{<4b{wh(_N^z!KD4XY*MuQhIKRE^{SN9%?{tSX@Ui|6Kf?R3 zc%Z7soCxsmr)H?Q_NX6h<54e)%7ba5-@{}BJES(7RHZ1=?wKAP)tJ{MpzUOp49aWd zO{Rs<3uwpt7v*nHyClil0z!nUG-M}C>%jnBMWA=9B3&|q2VS}3UsVaLZwQ#lj-2T+ z3f<^e$e(<;8QyhShZvTPZT%}?0a4;gt9br=gHWQ7G(9TdN$-xdduhWd_)HSP!>lR| zQ6Yx7V0$yLBv*FG4uXz5=-q(!D&&DCEkB^j};QqB^UuK%H=NQ{x zEk}s_;AXkUl|dET9%5uQVRV||xX2IX_%KjA-%*+pJ>w3VlMR9f^!OPN9}d|=ts$&K zypOI0UXMhl(k37+QqGriOe8S%q>PYG8Y?6{#iB&Pj!UjR`QCSS7C zM8V}j=XqEYyzX9nYLZrq+UOJN>ZUul;yJYhnyCXi1J@tX?)Cs{vj=jy=UbCa_q~9` zimwTa#-9viZS$uiC%v>>9#=of;hxu(Hpe_g1o&qO<&Cc1k(4<<>;O4UI2ed6Dt($7 z#**(8ew+lk0m_oM(0@{d+2Ot)AdCd5X;#>%*VC&a%GHN{TP#4(C$TuDIQC7@F()?D z%G-#BNTC)hOT>`;U_;CDa5z7)@gvLAsw!WYH_g-paXW5ZPesRGd^WRfK7Fq8qH=Rh zp7x-!_)G`rfST+XQe~Lvl+dX($xTM4VVqf6Vm);PL&}Xws5`hu60V4=^QvW z9CpyY*jujM(?~E;9XkoZ%v^RGJ%{coc;rN816)ib6r`fl)q=h!g^{H4;>tdEeZJOg zWu;sRbGW!z* z(2HhVR>Bvs=PCgyK~81_$@Ld$2GsB9T9XB*s0%oQvW%y+`ZnyK`+JV-}s>I!GDWlSFc0Q+%~>5ugylD-y6-9by;ts zWjh{W)etbO%D)~JI|z9|^#oY4LP5sUIe2ok4LywS_H*gp>Sd|3`?uMVywq^Vr29CR z_uExBj5h;gXT{|iw}Nk-_D*VWacao)>|P;~k;Uo7`rT>4iT0FJktWtV^ZEMy@@4N{ zZV1No-E<3@Pl#MRR~eRP(HSZuxo!gv^Tr(+yI+@b zBz<=ZqJKi@rJsw%*dMf_^|M_Mr)?CsQ|b5LUlXrOCAW)~hN&|CY>1(`%_9aZ!CG`S zz^(-V)zE2+<^p_7$(<^+;(L>APDu#6wiT>7f7-F)5eEf|d~r8jkX7_B+5g_+qXvma z0cV-m3e#(4im&vf6dDU4R*F^;XeryNSeEw%3{j^o86YD}(Clvee5@1-;^ViT5I4Ks zsmsJIFPYGUdwX8Dj?Dh+w;x(7((!H2+&+}rn#B;p=_xjga%+KutYNRQ{Gu^ZOYSUG zn@L5{(ze(Evof z15gqfvZMc<`$h4b$m#gePS=VdOXnz&|N^_#L)%v^=^k~Xjy0SFY zyD62I1D^+}I5pebga>ReCU=}Zu5r76Kv~Cz`z5BXzN8krwkqK8)_B>Y#BpWC>$PQ( z@)doj2ZQlVr28~8Y!V*2$Nny}7q*9`BXQq7b{mpAACUKOXKMQUGQi9a?ydYJ@^%;1 z9<*1!;l68DFD^qeRnIPS7+Br$GF^ShHhMib)#oOa=lkD}=&tKcsRT=SN=i&h(Jqhh zJF-m)i^@{AEo6}*2k!za=y<}``GHg#27E@o{#eUu)?Gg!wiF>Wgbx|H4EBM`@6VQ% zYAK|pN&*;y1MoS>lTFCo67`(aiD{l5o;$@;W*9S~G}TbwXuINs-Z6S`{a;eQG@<1j ziT{X_lLLz{w6pxALHnf0c~0);=l8kPWY;>Z=>M2U4Kc@;zXd~qQjNsTrSuozaG!li z?a`H#n1N9Bu|Lmk3f0UmZK!^+e=RC1PMAXt+WgdP**q2av*cH;g>fY!wWWk61ihuC zIA~SH8L;%3r)El{`@ZJw`e6~dAaT3c`)H3nW!jRSAtxSdS(g!HQwMYJpwmSynDd z7mGBkpAucStW_(Rz_+!xzk22vr45D{q4p_fkiw<7hRinN2{z-X_PWN`TgpIEJoJIYngs0#=%9K9XV(f3v)^{_!{iRhHGw{KnHiq$XCq97 ze{+F?LwlcXnJ4p9_E7NiybvmY6CIJ|E;jTL)7{9|N5KcLGIW09W?s7DGmW)_^KPh{ zwRVi!5S;ruts>flfC0uQV^@j5mfI*`&zT+NYd}5)E*`qm@ln8Fs}btr_=B+5+O#W- z#QfV`xgP3s>}L0lch;MFPtU{T z5dmA&xASFC2><|PeHRl}IV*(t+)sZ|GAf%?+jNKY4ITG0sZMEuaSpjblj3?;en=_xsa|)yKY=FzV zmkvirvi3gM72x8A9Bch~>mK3kwdO7Y0$u#O|6AyXl<0R;k=lbACj|9H2s$qyI7E)0 zEkIg4=DVSQb$zo<9gjD0-@u)sia3Zt=}%nj6kK3oWC<;b(suKe5~B)WlFw70S?o>p zPk208I?kX7ZRU4EY?+l}*Uh8hvx`P9Jd_U+)0e@)5U5T1y;&og>bZi5Jx#hDSY#;x zmOl(8KIbz#WC^RW@%P{4u-*cj)V(`hoQdTbi+9d8KlZZXThG7e>~>=IYmq4cG$6G& z4*BT;zoRpf?V<*LaBLZokI&S6hIn&wZnT;{$wwUfxP|EJ@F`1A%3eHW77vz6s^x^P zN#)IegXQ!Q`oKdjxgyzLo`@n4cr+o=H{ej0rO-!TRa-zU*$WBa2_&=vTW&?BScrok zp^#>)!QM0MSa&{lSwxcd4T&GxtUS$+r@qrYO0@N>cI&KfHx zFC}7m=XQE^a*ACcq9N$}g8U23U%AUqIyycm>_I<%eu26(P(uW(@kL#Dr8AtSPeuxa)l3yjz+!jHTIPW2(HWDGy5e zufqOW*bz{ZMe|y4{%F*ybS$xAKNL^_Y*4BvjsmgCtU%b_JXnZl>ovzEf~JfUIA?e5cpOdDjy09Ua8oFY#^|zW-N}kwiFY|g`GLK4aY1Ibp z8V!&*nMqA@P=WA*H1ZCF)*ymELQm-zNMFAz$QiVIGc^?+yx36Vs@BJw>iR&Y^RC+FDdW3GWXz#J4OC!j$1IkTNd-D}< zRhF)}CsKLX?b9beE?v+C#g;UHn$o}2KU47!<3_P^q6a5|z*+9ft$2Y_)C%GHy8P5t z7$bJ1=-j}dH4_KCfj`HrSX|r-kxx4#yLl9QccZ18@}40(*!4%grYX8=^X_6QeVmX1 zE69tj^cZYPH3}f*;YiVfLv?Ko0q2=%kv`kTD(M8w?^M{jO*Mlao!aCL5k~H>l_Y*y zCPd)9%j00%7CIx@4;C^ZUx0Tb3`Bjp0S^x4D;_E+N|3wl`C!WR&bo~z{YQ9?d<^Yg zAhR5?;FGBS4_jp7Fv6)!ArA43^_n)IRd$4A1Ns;pKo&AzLKr+8|rKPCoZ zH*hq#-I@0w;J6;up}fL?^59AUASuFz!II=JO`Vuk1D91;-hSCR6Kr_n*-5~iV_HIk z`jJ^n8HW+fnMQ~kj_lu`xp1W)%(zauS?#=Gfd2xFW7xyhaH%X|?3> zG#*A2d~r#8L!SGryICIBLpmcsXMxK@1PlwaVQ_O~!oKf*I_zDsfgqtO&uJSCHM9ZX0?~VbAOWFBKb5W_#!bcxcAJ3eZye*H7R_8znm7UZ@2xVxl%2a z4J*^b#M5y2Gca}`QAd!&HUk;@0T#Z3(jVJDnccqK0^U4BZC3xgy5#T6GA%jWKl96+ zscXk_10rFw$IF2e7boNv89`U}Z9L^LT{Dn9+`V_(U+c&N7oey+4s_rRfbYV|f>zX6 zf_(g5M_#sWON*|Xs*hGOAnMz*yJb|17^kbiY55=QsKNoNwAhMJ zenN>YK;L{o8tEs5V*$2taPbFt}gHG8~lz(WU)m~&s1sVxp*ltbcIdNFS3 zQtWiYi2F)KRH`}C<;oDEhCwlFo_97oJKK4Z3_LG@JvGe+c4l+1X+qW|A>&}M^rZ5j z;giNpinUbx&%x`!xCwI@TOoyATs^r?+At%74{`$FJh=MpQ6kvcwvfyNzgp!8vyyYXgug$ZHzJf3W+u>@KS#wK!iD@92tzxN(A9G{%c zS1~hA68Ry$#QgYVd|Dr70z3841G@DCepZV1TsF$4i_hsMBlR-TD? zED;x+aeZmJwD@Q>!O9cEsB^lp#!ojpy`_}F)>2poEjo+FR+w#%1P-vu3aGl31e47! z1OY$>d>jwa!`9fhWc+~e5BHN-D>5c!xwiL`oO0o}YI<{}A9HTas-Vlw_VJvGk-P{P z?G7&_fhUC+2ZkE~;L*1AZx-I$i95so><0x74knjZ&E#wZw3n%7M1UAO@~qk*O-=B3 zpzxh<>>$WQw{mO$DaO^d;Nvu3ROK+Da?pfm2c|#@079Ge@(NLzlD<0Qd@G2xo{2Vwnyl zBMg>wIjs~*Iz+pBn)^_T-aIg0l64-rsH<=&1wS!DWVimfZK1&7vmMAH+uoL`nvf8r4 z@#UF9XDW?L^j4Y7d#2Qbn6evAE+3%)o=p#sUg z2)>vH3jjBPM(?Q!!emtrk#+7~9mA!ViZi`s6f z*re{z?8E?{z74A2^Y$#DY(&A{&X3QSjjj(H>c4GFndM6S*)~DX+TI|1a!EP(Ww zrU4^A)R+6AGJhBkjzUPl1MY}L+@u&P4aRn773Zd!@KJZCcCE__qsjU5%;Bf?sNnS+ z%oj9H40vr(K;PNcPw)Ed=mAb3V!Y`eg>%r`Z=5C@K4}h$~wR1sYMRvW*d7WRJDq zxPk9|>78$m5~1f8dbhRsQjrKJM=OihUO-Gve0z1<3zQ!1cU5V1@?nEVsJuV?@Dwcp z7+l+rsPNjJkZG`6vus1W?6lw|fcDmwrk|ZmVL2h}0I?s~-|V{1)k$1iy$fsO{8G!3 zW^1tXV59--c{>JYH)86xQ0x4DB^{Pz*S%#O0d7&A3w;XRy8B@gdN75Xhq3kl*WSz zCAwOiS>S7am;8#M%l*PQM}e<8GX^&tZ@9WJoO)hM-6<|=w5b?~ zhPDs!=EmEaw6~yzPxC%(@_-jo|F3|1GFWTzY>e>X{#Vg}(%e-Ks*+NZ0twIRjgI@6 z>I~T|HgtGm#d$;YS)h7!@SV#>GK@9x@`vVP$^_L=459aR^~;j({q;8TT6f&!Liht` zjACT``tZ=hn@p)nAC(_6t&a6gGKIfiMHQh}htn<^i#Ei92w657a7b(>#W!-{v{7Rn zN>P)u_^(n;1^xF7qjgNoyf8(;71VqtL*5TYfa$LInEs6dl}Poz6ZGc`^5t9ZWRuI% zuLPAunOkPy0je)Ub_@wL9^UlVHN9Q$>Y8HpG;q39*8sS`hLYzE6$GfSb(~Y6q1yK= zX;8krc-rb8mvQns-T4O8H?R?2epM^YRD@`8@5RUZ7^j|n@}pz9r&TeTv|E0P5u7dC zu(G1os&Q0ue7ukp%!z<~)P0+{LXgV4|F7rpWF02fqYTid_Ab&^lZm6c(xGOX>Y3}- zD#r}e56GD-2b;9F!jyAR@CsGNj02EOA^iXNjXVtZiu$O=%f#pT?Zitjj6dA1KjC4R zxRopY%Y`HPaAm^shJOFR;mNzcOQ8b4BSr?#v!@XBI7&KnR0RR;g#t;+?_}m1k1+v_ zKmGKUTuRgAh`_=T#}!QsixN`WyqF|^#Pe$`?kU+c2oj24#aCzZ`IkS*M(XNc%VK5d ziwsQZgULhPV6caMHG`&llXd%>vdJzSxf4{eAtJZTjc#^N=AWwsf+e*3 z8T6r#hjo!t`;M&uZTuT%Ftkq^fJg>zq!9B%4;%O(muXK?Ss>_`& zqWlxdU?mJPJ94<;HH$Hb19WTcpcC!ewJ@luL1j7N~wJHCr5z$F=HWGmHvU_FpsaSN7 z-~G?z)u(9f9C$3TCP1mTY!OM(XsWXy4I2RsOhpcI$f!JjhTlMTe@H-{6m2~cA`_e@ zcH!~Bto#+wejV!a32DN!qb?~bJXc4%laRjl`d4vo0=+A znuJ)EL3nye@+QQo2c~izTGZcGP0x-Sm1+IG>L^@8;y8t;$RT1~(cW0B?Dz>q3y??_ zWE&MxG~p!7@j^JGGR-XiT#RV7YVS$^u0?Q7%Jt;q$1;7N}Fu0qJem$=@Tg7JzknBgOnLV)p)JW@P& z?k5v^?D|{f;YYtz!z?H(n5s`^Q?~B|{gNaRVKEzSq4f?p=t7Vc3SFV}a3-8)Ym(Kan@*@3`z=$c%v`)A2IGPW*F(tE=s#mQ-0&;V-}|KRjp+$5<-1bmdiH=hpWXz9@Dh z04QGy17zgru~J0xSAMgLCpK?f^?GS`75)U3u$6UO75P0Z$6|_W>+1fZKmnh}1u&x2 zb7DVGP6|N|C2tvHRMFp0;TA%UzU|m-b98)+&o9t*`HD7PqDA!J%T{5-#R`=b4&RYg z4tb&q0e}+x4xdqi`TIAj&#+s75joX%#=o}a^V4@&_STt`<6T0jDQI z>uy0gJ^NpTvbZ)nWc~udpBORa!I#rjm9z0P!6N&rp)tDcA7_}K!P{`nVm2nIiRsGc z77ZGJ2o=RHocfJ8F9s9feiIhwm#iA0nsEZ9hPxc?cuSmOGR6?4k?#wa9LOEuCfy^1UB+qt+FFr9YMMYO8 z%pn}PK4Zd%C>oeIroUQ60u5lLLBJQgFP@Eu8g2Q+avPpL59;UgE31f40)?3AcYeCz z91N5A|Iq&rYqX1~hH@<+hSx_D;+KYAn@0l5jvDV>Z9`3cpaw89N!LjwQBJzO-@APz z>SK5se*N?rT;sraLA~ z&spQOnD8^aQu1jL`!&~S6O2SO7Dlx_r(_x&!zq9TfA$RRpt!ST?J92_+=eY+5VEm$%*{FvP<0Cni4qTPQk2OtTw0ar`nUO3ZRXsKSWH&gS%+&?si+x zCd$tArBK%QUKikvk0SCie4LaNL{9WGxF6lciU*)`6a4qGBw!vX0#vC10+%YP%7q<+ zwHp^lcj;19>dc3!mP(u&w0jhgcDG7MMpX2Tf0+%p)XKl83qi1e@FeO;Xs^L!d+O9k zBDw>m;m+*B+#0XY4R}rTUn*xK|7-6`|Dg)o@EC)}ZtTQZ2H7iHSwgn4ry3z!WC=xf z*$JV>GTFzHBKw|gEHg>AESZF|mQW!RS%-Pg{C@9;_m6nbw{yNc=XuV#*Xz3PTaQVJ zp+_|3Fae`=f6L~{6imty$ku^@C9P@19KlckyK{B9aielj7uWYI;F3mbSraOt;Oj!! zZ+}fLY-EbtWwud2R+twfhhfzmiiM#a%m{jZaJ%j=lYovUM+EAF$Epu{Prk-&>4fWk zP=4~Kw+DpRR|*q<#H``j*mS{2=PV$MY#7!d`6HJ$&v1QuD`#b`Z}}Bp+tp93Lnd5R z);z(^+GETR;x=-7V=}LxkI(A*hE(nxkT1%D3|qA`?>?o^R#8#Y4mxl|)&CN#kD~Ol zziQUw`Ob9ssqxQ1X(}$rL9xilX!{x>24bBISe9xCOfeoZmKCEgLYIG$sHN4dHsto6 z#j;PU2fe4#I5^jwnakwgRf{R*XPOz4e!@^ug9hd!%YvMblHM7iuV3iB^e}KbXT#!; z=OSLEc+z`Q(4IAsohh~cgW1;6bwE79YEO@}rwQ=`qQKuA|4U!=$741S&Y| z1Hu1sdSY;bV@OPVKuhP0;L51-PC9P8r6TcT-}1^GjtvJn#diGDG2KQ`E<*9Mkl$r_ zPzmUKi^^GSm?q|#@Y%Cp$OV#}Yx9p1_FFo<-z`U4MqO;UM8ddZq=A&KvHp`xkGuf$wQ+EAe(<*j-&vB$VKYT2}7*lF8 zblCBIUpGU%wAS??$7W>P0c;67-1sp5o~`#l+xc&fLKi$#5)kcb1CT4oIu!v(fxQTg zF|6<7#LRwGmc30w=vRlWfAAn2PHlMBM-#)m5g(`PR>7^qaqZGJ*!SU2%lLm$OZy(O z+zxSp44Bvi*R;!;k!@(7N8|9{SpuTm*=S_{ps?p)|ItN-NT+R9WQoC<61oxt$g}wx zCvcUF8!$%qqOx+JMxO>wsY6Cv`BPhM&2t{{47^3^)aTL38kVcz%ca&TajObTLHFcA z?}^%3~@}EjW%4_rT6vpJ3PDpjgv#C|m=O<0JHzou6yV~_9-9P&=eDZon z=ML=(WCX1ozIaw+0E~N~hY5ANiy__pfWoAb4z#1~7y+1yNVm!s!8<3^XllXf8v{wl zUj|Y(OIWMrSb)O<8+`TM6=7Su`>*!IS?)#dMzB%w$i06b%!DG?Cx5M{iw=61pDTBd z`$AX~;tEaX0@+lb$%dK`hv|ALGqiHD?Vp+LgVHKG)kvCpUXznOg^DNSwh|ft^~uS; zYH=EbUk`v{8uIq0owj+&7zyJMQfWxfu+BD2?PMIui$4aw6C1t>Q z!zR)$ip0vA>TvbjoNGByx}lKkT(tAyx^a&4`ohQy*6pb`Ej?CCkJMQ}b)H*Cf43w5duAy%=MCwEZ1yXgHt-$F2gYjOG}^ zJg^LGg7agU)`K*UGv8=h6%$M!kFS08Y2LZtOiYSKX1H6##OWf8n+*F!Dms{Y7ZeJ& ze#w9glbz1!Rg9SnAN3;4n+w!@DG^q!^=ouYBh6*ITRHGU{fqo_k#zjuY5@ZlDhM22 z7mEm)4{9$Bc4=IimdX6)zwZ-YgYPQ;ZEs+1DPtmCA>%f*8n|DuY}{q2qd;h5VYJtx z12I$1u1H=pDciUz$^FIk%^Rnwh3+3AqtBm>m%Hzens<|PNHcGlq&lX2x8h_aY`PR- z6`Wu`+G|pAcz2OlHTLt|j6<`Hw8xYe*U=ksGoY*0GYrQ`^~X2g*p&gj-mlmW8@*^p zTL>7(DNK)?Ibs-(hCavmc`n;l{B0w+IPKJB>SHvkIfm97;dH!G!s@fw9}?)C>U*JZ z>LI29wq$L9Da{a^lZqdD8Wwgx>hF)#K@oOj>Ar7;|hz>B+?FQ#{!uoq$# zmohz|%0A2^YOyL5l!G~;n|BSZwepkiG`)?}xG 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 - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - Q_INIT_RESOURCE(js); - dev::az::Main w; - w.show(); - - return a.exec(); -} diff --git a/alethzero/plugins/blockchain/AllAccounts.cpp b/alethzero/plugins/blockchain/AllAccounts.cpp deleted file mode 100644 index 7a133094c..000000000 --- a/alethzero/plugins/blockchain/AllAccounts.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file AllAccounts.cpp - * @author Gav Wood - * @date 2015 - */ - -#if ETH_FATDB || !ETH_TRUE - -#include "AllAccounts.h" -#include -#include -#include -#include -#include -#include -#include "ui_AllAccounts.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(AllAccounts); - -AllAccounts::AllAccounts(MainFace* _m): - Plugin(_m, "AllAccounts"), - m_ui(new Ui::AllAccounts) -{ - dock(Qt::RightDockWidgetArea, "All Accounts")->setWidget(new QWidget()); - m_ui->setupUi(dock()->widget()); - installWatches(); - refresh(); - - connect(m_ui->accounts, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), SLOT(on_accounts_currentItemChanged())); - connect(m_ui->accounts, SIGNAL(doubleClicked(QModelIndex)), SLOT(on_accounts_doubleClicked())); - connect(m_ui->refreshAccounts, SIGNAL(clicked()), SLOT(refresh())); - connect(m_ui->accountsFilter, SIGNAL(textChanged(QString)), SLOT(onAllChange())); - connect(m_ui->showBasic, SIGNAL(toggled(bool)), SLOT(onAllChange())); - connect(m_ui->showContracts, SIGNAL(toggled(bool)), SLOT(onAllChange())); - connect(m_ui->onlyKnown, SIGNAL(toggled(bool)), SLOT(onAllChange())); -} - -AllAccounts::~AllAccounts() -{ -} - -void AllAccounts::installWatches() -{ - main()->installWatch(ChainChangedFilter, [=](LocalisedLogEntries const&){ onAllChange(); }); - main()->installWatch(PendingChangedFilter, [=](LocalisedLogEntries const&){ onAllChange(); }); -} - -void AllAccounts::refresh() -{ - DEV_TIMED_FUNCTION; -#if ETH_FATDB || !ETH_TRUE - cwatch << "refreshAccounts()"; - m_ui->accounts->clear(); - bool showContract = m_ui->showContracts->isChecked(); - bool showBasic = m_ui->showBasic->isChecked(); - bool onlyKnown = m_ui->onlyKnown->isChecked(); - - Addresses as; - if (onlyKnown) - as = main()->allKnownAddresses(); - else - as = ethereum()->addresses(); - - for (auto const& i: as) - { - bool isContract = (ethereum()->codeHashAt(i) != EmptySHA3); - if (!((showContract && isContract) || (showBasic && !isContract))) - continue; - string r = static_cast(main())->render(i); - (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(ethereum()->balanceAt(i)).c_str()).arg(QString::fromStdString(r)).arg((unsigned)ethereum()->countAt(i)), m_ui->accounts)) - ->setData(Qt::UserRole, QByteArray((char const*)i.data(), Address::size)); - } - m_ui->accounts->sortItems(); -#endif - m_ui->refreshAccounts->setEnabled(false); -} - -void AllAccounts::onAllChange() -{ - m_ui->refreshAccounts->setEnabled(true); -} - -void AllAccounts::on_accounts_currentItemChanged() -{ - m_ui->accountInfo->clear(); - if (auto item = m_ui->accounts->currentItem()) - { - auto hba = item->data(Qt::UserRole).toByteArray(); - assert(hba.size() == 20); - auto address = h160((byte const*)hba.data(), h160::ConstructFromPointer); - - stringstream s; - try - { - auto storage = ethereum()->storageAt(address); - u256s keys = keysOf(storage); - sort(keys.begin(), keys.end()); - for (auto const& i: keys) - s << "@" << showbase << hex << main()->prettyU256(i) << "    " << showbase << hex << main()->prettyU256(storage[i]) << "
    "; - s << "

    Body Code (" << sha3(ethereum()->codeAt(address)).abridged() << ")

    " << disassemble(ethereum()->codeAt(address)); - s << ETH_HTML_DIV(ETH_HTML_MONO) << toHex(ethereum()->codeAt(address)) << ""; - s << "

    Creation Addresses (" << ethereum()->countAt(address) << "+)

    "; - for (auto i = 0; i < 5; ++i) - s << ETH_HTML_DIV(ETH_HTML_MONO) << toAddress(address, ethereum()->countAt(address) + i).hex() << ""; - m_ui->accountInfo->appendHtml(QString::fromStdString(s.str())); - } - catch (dev::InvalidTrie) - { - m_ui->accountInfo->appendHtml("Corrupted trie."); - } - m_ui->accountInfo->moveCursor(QTextCursor::Start); - } -} - -void AllAccounts::on_accounts_doubleClicked() -{ - if (m_ui->accounts->count()) - { - auto hba = m_ui->accounts->currentItem()->data(Qt::UserRole).toByteArray(); - auto h = Address((byte const*)hba.data(), Address::ConstructFromPointer); - qApp->clipboard()->setText(QString::fromStdString(toHex(h.asArray()))); - } -} - -#endif diff --git a/alethzero/plugins/blockchain/AllAccounts.h b/alethzero/plugins/blockchain/AllAccounts.h deleted file mode 100644 index fa268406f..000000000 --- a/alethzero/plugins/blockchain/AllAccounts.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file AllAccounts.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#if ETH_FATDB || !ETH_TRUE - -#include -#include -#include "MainFace.h" - -namespace Ui -{ -class AllAccounts; -} - -namespace dev -{ -namespace az -{ - -class AllAccounts: public QObject, public Plugin -{ - Q_OBJECT - -public: - AllAccounts(MainFace* _m); - ~AllAccounts(); - -private slots: - void on_accounts_currentItemChanged(); - void on_accounts_doubleClicked(); - - void onAllChange(); - void refresh(); - -private: - void installWatches(); - - Ui::AllAccounts* m_ui; -}; - -} -} - -#endif diff --git a/alethzero/plugins/blockchain/AllAccounts.ui b/alethzero/plugins/blockchain/AllAccounts.ui deleted file mode 100644 index a1bdad535..000000000 --- a/alethzero/plugins/blockchain/AllAccounts.ui +++ /dev/null @@ -1,137 +0,0 @@ - - - AllAccounts - - - - 0 - 0 - 405 - 300 - - - - Form - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - Filter... - - - - - - - Basic - - - true - - - true - - - - - - - Contracts - - - true - - - true - - - - - - - Only Known - - - true - - - true - - - - - - - Refresh - - - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - - 0 - 0 - - - - Qt::NoFocus - - - QFrame::NoFrame - - - - - - 2 - 0 - - - - Qt::WheelFocus - - - QFrame::NoFrame - - - true - - - - - - - - - diff --git a/alethzero/plugins/blockchain/ExportState.cpp b/alethzero/plugins/blockchain/ExportState.cpp deleted file mode 100644 index c0f45c0e8..000000000 --- a/alethzero/plugins/blockchain/ExportState.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file ExportState.cpp - * @author Arkadiy Paronyan - * @date 2015 - */ - -#if ETH_FATDB - -#include "ExportState.h" -#include -#include -#include -#include -#include "ui_ExportState.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(ExportStateDialog); - -ExportStateDialog::ExportStateDialog(MainFace* _m): - QDialog(_m), - Plugin(_m, "Export State"), - m_ui(new Ui::ExportState) -{ - m_ui->setupUi(this); - connect(m_ui->close, &QPushButton::clicked, this, &ExportStateDialog::close); - connect(m_ui->accounts, &QListWidget::itemSelectionChanged, this, &ExportStateDialog::generateJSON); - connect(m_ui->contracts, &QListWidget::itemSelectionChanged, this, &ExportStateDialog::generateJSON); - fillBlocks(); - connect(addMenuItem("Export State...", "menuTools", true), SIGNAL(triggered()), SLOT(exec())); -} - -ExportStateDialog::~ExportStateDialog() -{ - -} -void ExportStateDialog::showEvent(QShowEvent*) -{ - m_ui->block->clear(); - m_ui->block->clearEditText(); - m_ui->accounts->clear(); - m_ui->contracts->clear(); - fillBlocks(); -} - -void ExportStateDialog::on_block_editTextChanged() -{ - QString text = m_ui->block->currentText(); - int i = m_ui->block->count(); - while (i-- >= 0) - if (m_ui->block->itemText(i) == text) - return; - fillBlocks(); -} - -void ExportStateDialog::on_block_currentIndexChanged(int _index) -{ - m_block = m_ui->block->itemData(_index).toUInt(); - fillContracts(); -} - -void ExportStateDialog::fillBlocks() -{ - BlockChain const& bc = ethereum()->blockChain(); - QStringList filters = m_ui->block->currentText().toLower().split(QRegExp("\\s+"), QString::SkipEmptyParts); - const unsigned numLastBlocks = 10; - if (m_ui->block->count() == 0) - { - unsigned i = numLastBlocks; - for (auto h = bc.currentHash(); bc.details(h) && i; h = bc.details(h).parent, --i) - { - auto d = bc.details(h); - m_ui->block->addItem(QString("#%1 %2").arg(d.number).arg(h.abridged().c_str()), d.number); - if (h == bc.genesisHash()) - break; - } - if (m_ui->block->currentIndex() < 0) - m_ui->block->setCurrentIndex(0); - m_recentBlocks = numLastBlocks - i; - } - - int i = m_ui->block->count(); - while (i > 0 && i >= m_recentBlocks) - m_ui->block->removeItem(i--); - - h256Hash blocks; - for (QString f: filters) - { - if (f.startsWith("#")) - f = f.remove(0, 1); - if (f.size() == 64) - { - h256 h(f.toStdString()); - if (bc.isKnown(h)) - blocks.insert(h); - for (auto const& b: bc.withBlockBloom(LogBloom().shiftBloom<3>(sha3(h)), 0, -1)) - blocks.insert(bc.numberHash(b)); - } - else if (f.toLongLong() <= bc.number()) - blocks.insert(bc.numberHash((unsigned)f.toLongLong())); - else if (f.size() == 40) - { - Address h(f.toStdString()); - for (auto const& b: bc.withBlockBloom(LogBloom().shiftBloom<3>(sha3(h)), 0, -1)) - blocks.insert(bc.numberHash(b)); - } - } - - for (auto const& h: blocks) - { - auto d = bc.details(h); - m_ui->block->addItem(QString("#%1 %2").arg(d.number).arg(h.abridged().c_str()), d.number); - } -} - -void ExportStateDialog::fillContracts() -{ - m_ui->accounts->clear(); - m_ui->contracts->clear(); - m_ui->accounts->setEnabled(true); - m_ui->contracts->setEnabled(true); - try - { - for (auto i: ethereum()->addresses(m_block)) - { - string r = main()->render(i); - (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(ethereum()->balanceAt(i)).c_str()).arg(QString::fromStdString(r)).arg((unsigned)ethereum()->countAt(i)), ethereum()->codeAt(i).empty() ? m_ui->accounts : m_ui->contracts)) - ->setData(Qt::UserRole, QByteArray((char const*)i.data(), Address::size)); - } - } - catch (InterfaceNotSupported const&) - { - m_ui->accounts->setEnabled(false); - m_ui->contracts->setEnabled(false); - m_ui->json->setEnabled(false); - m_ui->json->setText(QString("This feature requires compilation with FATDB support.")); - } -} - -void ExportStateDialog::generateJSON() -{ - std::stringstream json; - json << "{\n"; - std::string prefix; - for(QListWidgetItem* item: m_ui->accounts->selectedItems()) - { - auto hba = item->data(Qt::UserRole).toByteArray(); - auto address = Address((byte const*)hba.data(), Address::ConstructFromPointer); - json << prefix << "\t\"" << toHex(address.ref()) << "\": { \"wei\": \"" << ethereum()->balanceAt(address, m_block) << "\" }"; - prefix = ",\n"; - } - for(QListWidgetItem* item: m_ui->contracts->selectedItems()) - { - auto hba = item->data(Qt::UserRole).toByteArray(); - auto address = Address((byte const*)hba.data(), Address::ConstructFromPointer); - json << prefix << "\t\"" << toHex(address.ref()) << "\":\n\t{\n\t\t\"wei\": \"" << ethereum()->balanceAt(address, m_block) << "\",\n"; - json << "\t\t\"code\": \"" << toHex(ethereum()->codeAt(address, m_block)) << "\",\n"; - std::unordered_map storage = ethereum()->storageAt(address, m_block); - if (!storage.empty()) - { - json << "\t\t\"storage\":\n\t\t{\n"; - std::string storagePrefix; - for (auto s: storage) - { - json << storagePrefix << "\t\t\t\"" << toHex(s.first) << "\": \"" << toHex(s.second) << "\""; - storagePrefix = ",\n"; - } - json << "\n\t\t}\n"; - } - json << "\t}"; - prefix = ",\n"; - } - json << "\n}"; - json.flush(); - - m_ui->json->setEnabled(true); - m_ui->json->setText(QString::fromStdString(json.str())); - m_ui->saveButton->setEnabled(true); -} - -void ExportStateDialog::on_saveButton_clicked() -{ - QString fn = QFileDialog::getSaveFileName(this, "Save state", QString(), "JSON Files (*.json)"); - if (!fn.endsWith(".json")) - fn = fn.append(".json"); - ofstream file(fn.toStdString()); - if (file.is_open()) - file << m_ui->json->toPlainText().toStdString(); -} - -#endif //ETH_FATDB diff --git a/alethzero/plugins/blockchain/ExportState.h b/alethzero/plugins/blockchain/ExportState.h deleted file mode 100644 index b7c012356..000000000 --- a/alethzero/plugins/blockchain/ExportState.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file ExportState.h - * @author Arkadiy Paronyan - * @date 2015 - */ - -#pragma once - -#if ETH_FATDB - -#include -#include -#include -#include "MainFace.h" - -namespace Ui { class ExportState; } - -namespace dev -{ - -namespace eth { class Client; } - -namespace az -{ - - -class ExportStateDialog: public QDialog, public Plugin -{ - Q_OBJECT - -public: - ExportStateDialog(MainFace* _m); - virtual ~ExportStateDialog(); - -private slots: - void on_block_editTextChanged(); - void on_block_currentIndexChanged(int _index); - void on_saveButton_clicked(); - -private: - void showEvent(QShowEvent* _event) override; - void fillBlocks(); - void fillContracts(); - void generateJSON(); - -private: - std::unique_ptr m_ui; - int m_recentBlocks = 0; - eth::BlockNumber m_block = eth::LatestBlock; -}; - -} -} - -#endif //ETH_FATDB diff --git a/alethzero/plugins/blockchain/ExportState.ui b/alethzero/plugins/blockchain/ExportState.ui deleted file mode 100644 index 96256bc7f..000000000 --- a/alethzero/plugins/blockchain/ExportState.ui +++ /dev/null @@ -1,183 +0,0 @@ - - - ExportState - - - - 0 - 0 - 490 - 522 - - - - Export State - - - true - - - - - - - 0 - 0 - - - - &Block - - - block - - - - - - - true - - - - - - - - - - &Accounts - - - accounts - - - - - - - false - - - - 0 - 1 - - - - QAbstractItemView::MultiSelection - - - - - - - &Contracts - - - contracts - - - - - - - false - - - - 0 - 1 - - - - QAbstractItemView::MultiSelection - - - - - - - - 0 - 0 - - - - &JSON - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - json - - - - - - - false - - - - 0 - 2 - - - - true - - - - - - - - - false - - - - 0 - 0 - - - - &Save... - - - Esc - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - &Close - - - Esc - - - - - - - - - - diff --git a/alethzero/plugins/brainwallet/BrainWallet.cpp b/alethzero/plugins/brainwallet/BrainWallet.cpp deleted file mode 100644 index 3301718b6..000000000 --- a/alethzero/plugins/brainwallet/BrainWallet.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file BrainWallet.h - * @author Gav Wood - * @date 2015 - */ - -#include "BrainWallet.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include "ui_BrainWallet.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(BrainWallet); - -BrainWallet::BrainWallet(MainFace* _m): - Plugin(_m, "BrainWallet") -{ - connect(addMenuItem("New Brain Wallet...", "menuTools", true), SIGNAL(triggered()), SLOT(create())); -} - -BrainWallet::~BrainWallet() -{ -} - -void BrainWallet::create() -{ - QDialog d; - Ui_BrainWallet u; - u.setupUi(&d); - d.setWindowTitle("New Brain Wallet"); - connect(u.generate, &QPushButton::clicked, [&](){ - boost::random_device d; - boost::random::uniform_int_distribution pickWord(0, WordList.size() - 1); - QString t; - for (int i = 0; i < 13; ++i) - t += (t.size() ? " " : "") + QString::fromStdString(WordList[pickWord(d)]); - u.seed->setPlainText(t); - }); - - if (d.exec() == QDialog::Accepted) - { - main()->keyManager().importBrain(u.seed->toPlainText().trimmed().toStdString(), u.name->text().toStdString(), u.hint->toPlainText().toStdString()); - main()->noteKeysChanged(); - } -} diff --git a/alethzero/plugins/brainwallet/BrainWallet.h b/alethzero/plugins/brainwallet/BrainWallet.h deleted file mode 100644 index 6b472c6da..000000000 --- a/alethzero/plugins/brainwallet/BrainWallet.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file BrainWallet.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include "MainFace.h" - -namespace dev -{ -namespace az -{ - -class BrainWallet: public QObject, public Plugin -{ - Q_OBJECT - -public: - BrainWallet(MainFace* _m); - ~BrainWallet(); - -private slots: - void create(); -}; - -} -} diff --git a/alethzero/plugins/brainwallet/BrainWallet.ui b/alethzero/plugins/brainwallet/BrainWallet.ui deleted file mode 100644 index a0f63420f..000000000 --- a/alethzero/plugins/brainwallet/BrainWallet.ui +++ /dev/null @@ -1,136 +0,0 @@ - - - BrainWallet - - - - 0 - 0 - 511 - 508 - - - - Dialog - - - - - - <html><head/><body><p><span style=" font-weight:600;">WARNING: Brain wallets, or human-entropic seeds, are generally a Bad Plan. Unless used properly they're a terrible idea for protecteding anything of value. Read up on them and know the risks before using this functionality!</span></p><p>That said, if you're intent on using one, make the phrase as long and random as you can. If you're sensible, you'll use the Generate button and memorise the list of words it gives you. This is the only way to guarantee a strong brainwallet. Write the phrase down on paper and bury it under an oak tree or something - if you forget it, you're screwed.</p></body></html> - - - true - - - - - - - Please name of this account here e.g. My Brain Wallet - - - - - - - Write your seed phrase here. Make it long and random. Don't ever forget it. If you want it to have any chance at being secure, hit the Generate button and memorize what ends up here. - - - - - - - <html><head/><body><p>You can leave a hint here if you want; don't rely on it or there's little point in it being a <span style=" font-style:italic;">brain</span> wallet.</p></body></html> - - - true - - - - - - - An optional hint for the text above. - - - - - - - - - &Generate - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Cancel - - - - - - - &Create - - - true - - - - - - - - - - - create - clicked() - BrainWallet - accept() - - - 462 - 484 - - - 449 - 504 - - - - - cancel - clicked() - BrainWallet - reject() - - - 381 - 483 - - - 351 - 506 - - - - - diff --git a/alethzero/plugins/keys/ImportKey.cpp b/alethzero/plugins/keys/ImportKey.cpp deleted file mode 100644 index 6f47505d4..000000000 --- a/alethzero/plugins/keys/ImportKey.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file ImportKey.cpp - * @author Gav Wood - * @date 2015 - */ - -#include "ImportKey.h" -#include -#include -#include -#include -#include -#include -#include -#include "ui_ImportKey.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(ImportKey); - -ImportKey::ImportKey(MainFace* _m): - Plugin(_m, "ImportKey") -{ - connect(addMenuItem("Import Key...", "menuTools", true), SIGNAL(triggered()), SLOT(import())); -} - -ImportKey::~ImportKey() -{ -} - -void ImportKey::import() -{ - QDialog d; - Ui_ImportKey u; - u.setupUi(&d); - d.setWindowTitle("Import Key"); - - string lastKey; - Secret lastSecret; - string lastPassword; - Address lastAddress; - - auto updateAction = [&](){ - if (!u.import_2->isEnabled()) - u.action->clear(); - else if (lastKey.empty() && !lastSecret) - u.action->setText("Import brainwallet with given address and hint"); - else if (!lastKey.empty() && !lastSecret) - { - h256 ph; - DEV_IGNORE_EXCEPTIONS(ph = h256(u.passwordHash->text().toStdString())); - if (ph) - u.action->setText("Import untouched key with given address and hint"); - else - u.action->setText("Import untouched key with given address, password hash and hint"); - } - else - { - bool mp = u.noPassword->isChecked(); - if (mp) - u.action->setText("Import recast key using master password and given hint"); - else - u.action->setText("Import recast key with given password and hint"); - } - }; - - auto updateImport = [&](){ - u.import_2->setDisabled(u.addressOut->text().isEmpty() || u.name->text().isEmpty() || !(u.oldPassword->isChecked() || u.newPassword->isChecked() || u.noPassword->isChecked())); - updateAction(); - }; - - auto updateAddress = [&](){ - lastAddress.clear(); - string as = u.address->text().toStdString(); - try - { - lastAddress = eth::toAddress(as); - u.addressOut->setText(QString::fromStdString(main()->render(lastAddress))); - } - catch (...) - { - u.addressOut->setText(""); - } - updateImport(); - }; - - auto updatePassword = [&](){ - u.passwordHash->setText(QString::fromStdString(sha3(u.password->text().toStdString()).hex())); - updateAction(); - }; - - function updateKey = [&](){ - // update according to key. - if (lastKey == u.key->text().toStdString()) - return; - lastKey = u.key->text().toStdString(); - lastSecret.clear(); - u.address->clear(); - u.oldPassword->setEnabled(false); - u.oldPassword->setChecked(false); - bytes b; - DEV_IGNORE_EXCEPTIONS(b = fromHex(lastKey, WhenError::Throw)); - if (b.size() == 32) - { - lastSecret = Secret(b); - bytesRef(&b).cleanse(); - } - while (!lastKey.empty() && !lastSecret) - { - bool ok; - lastPassword = QInputDialog::getText(&d, "Open Key File", "Enter the password protecting this key file. Cancel if you do not want to provide te password.", QLineEdit::Password, QString(), &ok).toStdString(); - if (!ok) - { - lastSecret.clear(); - break; - } - // Try to open as a file. - lastSecret = KeyManager::presaleSecret(contentsString(lastKey), [&](bool first){ return first ? lastPassword : string(); }).secret(); - if (!lastSecret) - lastSecret = Secret(SecretStore::secret(contentsString(lastKey), lastPassword)); - if (!lastSecret && QMessageBox::warning(&d, "Invalid Password or Key File", "The given password could not be used to decrypt the key file given. Are you sure it is a valid key file and that the password is correct?", QMessageBox::Abort, QMessageBox::Retry) == QMessageBox::Abort) - { - u.key->clear(); - updateKey(); - return; - } - } - u.oldPassword->setEnabled(!!lastSecret); - u.newPassword->setEnabled(!!lastSecret); - u.noPassword->setEnabled(!!lastSecret); - u.masterLabel->setEnabled(!!lastSecret); - u.oldLabel->setEnabled(!!lastSecret); - u.showPassword->setEnabled(!!lastSecret); - u.password->setEnabled(!!lastSecret); - u.passwordHash->setReadOnly(!!lastSecret); - u.address->setReadOnly(!!lastSecret); - if (lastSecret) - { - u.oldPassword->setEnabled(!lastPassword.empty()); - if (lastPassword.empty()) - u.oldPassword->setChecked(false); - u.address->setText(QString::fromStdString(ICAP(toAddress(lastSecret)).encoded())); - updateAddress(); - } - else - u.address->clear(); - updateImport(); - }; - - connect(u.noPassword, &QRadioButton::clicked, [&](){ - u.passwordHash->clear(); - u.hint->setText("No additional password (same as master password)."); - updateAction(); - }); - connect(u.oldPassword, &QRadioButton::clicked, [&](){ - u.passwordHash->setText(QString::fromStdString(sha3(lastPassword).hex())); - u.hint->setText("Same as original password for file " + QString::fromStdString(lastKey)); - updateAction(); - }); - connect(u.newPassword, &QRadioButton::clicked, [&](){ - u.hint->setText(""); - updatePassword(); - }); - connect(u.password, &QLineEdit::textChanged, [&](){ updatePassword(); }); - connect(u.address, &QLineEdit::textChanged, [&](){ updateAddress(); }); - connect(u.key, &QLineEdit::textEdited, [&](){ updateKey(); }); - connect(u.name, &QLineEdit::textEdited, [&](){ updateImport(); }); - connect(u.showPassword, &QCheckBox::toggled, [&](bool show){ u.password->setEchoMode(show ? QLineEdit::Normal : QLineEdit::Password); }); - connect(u.openKey, &QToolButton::clicked, [&](){ - QString fn = QFileDialog::getOpenFileName(main(), "Open Key File", QDir::homePath(), "JSON Files (*.json);;All Files (*)"); - if (!fn.isEmpty()) - { - u.key->setText(fn); - updateKey(); - } - }); - - if (d.exec() == QDialog::Accepted) - { - Address a = lastAddress; - string n = u.name->text().toStdString(); - string h = u.hint->text().toStdString(); - - // check for a brain wallet import - if (lastKey.empty() && !lastSecret) - main()->keyManager().importExistingBrain(a, n, h); - else if (!lastKey.empty() && !lastSecret) - { - h256 ph; - DEV_IGNORE_EXCEPTIONS(ph = h256(u.passwordHash->text().toStdString())); - main()->keyManager().importExisting(main()->keyManager().store().importKey(lastKey), n, a, ph, h); - } - else - { - bool mp = u.noPassword->isChecked(); - string p = mp ? string() : u.oldPassword ? lastPassword : u.password->text().toStdString(); - if (mp) - main()->keyManager().import(lastSecret, n); - else - main()->keyManager().import(lastSecret, n, p, h); - } - - main()->noteKeysChanged(); - } -} diff --git a/alethzero/plugins/keys/ImportKey.h b/alethzero/plugins/keys/ImportKey.h deleted file mode 100644 index ed233664e..000000000 --- a/alethzero/plugins/keys/ImportKey.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file ImportKey.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include "MainFace.h" - -namespace dev -{ -namespace az -{ - -class ImportKey: public QObject, public Plugin -{ - Q_OBJECT - -public: - ImportKey(MainFace* _m); - ~ImportKey(); - -private slots: - void import(); -}; - -} -} diff --git a/alethzero/plugins/keys/ImportKey.ui b/alethzero/plugins/keys/ImportKey.ui deleted file mode 100644 index 03f62e152..000000000 --- a/alethzero/plugins/keys/ImportKey.ui +++ /dev/null @@ -1,336 +0,0 @@ - - - ImportKey - - - - 0 - 0 - 530 - 389 - - - - Dialog - - - - - - - - true - - - - - - - false - - - Show - - - - - - - &Address: - - - address - - - - - - - ... - - - - - - - false - - - New &Password: - - - buttonGroup - - - - - - - Place the address of the key here - - - - - - - &Name: - - - name - - - - - - - false - - - &Master password - - - true - - - buttonGroup - - - - - - - - - - false - - - &Old password - - - buttonGroup - - - - - - - Enter the password you wish to use for the key here - - - - - - - Enter this key's name here - - - - - - - Password &Hash: - - - passwordHash - - - - - - - Password Hin&t: - - - hint - - - - - - - false - - - Use same password for the key as for the master. - - - false - - - - - - - Brain wallet (no key file) - - - true - - - - - - - &Key: - - - key - - - - - - - false - - - Use the same password as in the key file. - - - - - - - true - - - Unknown Address - - - - - - - - - Qt::Vertical - - - - 20 - 5 - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Cancel - - - Esc - - - - - - - false - - - &Import - - - true - - - - - - - - - name - key - openKey - address - addressOut - noPassword - oldPassword - newPassword - password - showPassword - passwordHash - hint - cancel - import_2 - - - - - import_2 - clicked() - ImportKey - accept() - - - 519 - 378 - - - 449 - 388 - - - - - cancel - clicked() - ImportKey - reject() - - - 433 - 378 - - - 351 - 388 - - - - - newPassword - pressed() - password - setFocus() - - - 80 - 211 - - - 185 - 215 - - - - - - - - diff --git a/alethzero/plugins/log/LogPanel.cpp b/alethzero/plugins/log/LogPanel.cpp deleted file mode 100644 index 41555192e..000000000 --- a/alethzero/plugins/log/LogPanel.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file LogPanel.cpp - * @author Gav Wood - * @date 2015 - */ - -#include "LogPanel.h" -#include -#include -#include -#include -#include -#include -#include -#include "ui_LogPanel.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -static QString filterOutTerminal(QString _s) -{ - return _s.replace(QRegExp("\x1b\\[(\\d;)?\\d+m"), ""); -} - -DEV_AZ_NOTE_PLUGIN(LogPanel); - -LogPanel::LogPanel(MainFace* _m): - Plugin(_m, "LogPanel"), - m_ui(new Ui::LogPanel) -{ - dock(Qt::RightDockWidgetArea, "Log")->setWidget(new QWidget); - m_ui->setupUi(dock()->widget()); - connect(m_ui->verbosity, SIGNAL(valueChanged(int)), SLOT(on_verbosity_valueChanged())); - - g_logPost = [=](string const& s, char const* c) - { - simpleDebugOut(s, c); - m_logLock.lock(); - m_logHistory.append(filterOutTerminal(QString::fromStdString(s)) + "\n"); - m_logChanged = true; - m_logLock.unlock(); - }; - startTimer(100); - - on_verbosity_valueChanged(); -} - -LogPanel::~LogPanel() -{ - // Must do this here since otherwise m_ethereum'll be deleted (and therefore clearWatches() called by the destructor) - // *after* the client is dead. - g_logPost = simpleDebugOut; -} - -void LogPanel::readSettings(QSettings const& _s) -{ - m_ui->verbosity->setValue(_s.value("verbosity", 1).toInt()); -} - -void LogPanel::writeSettings(QSettings& _s) -{ - _s.setValue("verbosity", m_ui->verbosity->value()); -} - -void LogPanel::timerEvent(QTimerEvent*) -{ - if (m_logChanged) - { - m_logLock.lock(); - m_logChanged = false; - m_ui->log->appendPlainText(m_logHistory.mid(0, m_logHistory.length() - 1)); - m_logHistory.clear(); - m_logLock.unlock(); - } -} - -void LogPanel::on_verbosity_valueChanged() -{ - g_logVerbosity = m_ui->verbosity->value(); - m_ui->verbosityLabel->setText(QString::number(g_logVerbosity)); -} - diff --git a/alethzero/plugins/log/LogPanel.h b/alethzero/plugins/log/LogPanel.h deleted file mode 100644 index ff21cdc51..000000000 --- a/alethzero/plugins/log/LogPanel.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file LogPanel.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include -#include "MainFace.h" - -namespace Ui -{ -class LogPanel; -} - -namespace dev -{ -namespace az -{ - -class LogPanel: public QObject, public Plugin -{ - Q_OBJECT - -public: - LogPanel(MainFace* _m); - ~LogPanel(); - -private slots: - void on_verbosity_valueChanged(); - -private: - void timerEvent(QTimerEvent*) override; - void readSettings(QSettings const&) override; - void writeSettings(QSettings&) override; - - Ui::LogPanel* m_ui; - - QMutex m_logLock; - QString m_logHistory; - bool m_logChanged = true; -}; - -} -} diff --git a/alethzero/plugins/log/LogPanel.ui b/alethzero/plugins/log/LogPanel.ui deleted file mode 100644 index 52e7d1dc2..000000000 --- a/alethzero/plugins/log/LogPanel.ui +++ /dev/null @@ -1,99 +0,0 @@ - - - LogPanel - - - - 0 - 0 - 834 - 265 - - - - Form - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - Ubuntu Mono - - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - QPlainTextEdit::NoWrap - - - true - - - - - - - 6 - - - - - 20 - - - 1 - - - Qt::Vertical - - - QSlider::TicksBothSides - - - - - - - - 20 - 0 - - - - 20 - - - Qt::AlignCenter - - - - - - - - - - diff --git a/alethzero/plugins/namers/NameRegNamer.cpp b/alethzero/plugins/namers/NameRegNamer.cpp deleted file mode 100644 index 312fcbc18..000000000 --- a/alethzero/plugins/namers/NameRegNamer.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file NameRegNamer.h - * @author Gav Wood - * @date 2015 - */ - -#include "NameRegNamer.h" -#include -#include -#include -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(NameRegNamer); - -NameRegNamer::NameRegNamer(MainFace* _m): - AccountNamerPlugin(_m, "NameRegNamer") -{ -} - -NameRegNamer::~NameRegNamer() -{ -} - -string NameRegNamer::toName(Address const& _a) const -{ - for (auto const& r: m_registrars) - { - string n = abiOut(main()->ethereum()->call(Address(1), 0, r, abiIn("name(address)", _a), 1000000, DefaultGasPrice, PendingBlock, FudgeFactor::Lenient).output); - if (!n.empty()) - return n; - } - return string(); -} - -Address NameRegNamer::toAddress(std::string const& _n) const -{ - for (auto const& r: m_registrars) - if (Address a = abiOut
    (main()->ethereum()->call(r, abiIn("addr(string)", _n)).output)) - return a; - return Address(); -} - -Addresses NameRegNamer::knownAddresses() const -{ - return m_knownCache; -} - -void NameRegNamer::killRegistrar(Address const& _r) -{ - if (m_filters.count(_r)) - { - main()->uninstallWatch(m_filters.at(_r)); - m_filters.erase(_r); - } - for (auto i = m_registrars.begin(); i != m_registrars.end();) - if (*i == _r) - i = m_registrars.erase(i); - else - ++i; -} - -void NameRegNamer::updateCache() -{ -// m_forwardCache.clear(); -// m_reverseCache.clear(); - m_knownCache.clear(); -#if ETH_FATDB || !ETH_TRUE - for (auto const& r: m_registrars) - for (u256 const& a: keysOf(ethereum()->storageAt(r))) - if (a < u256(1) << 160) - m_knownCache.push_back(Address((u160)a - 1)); -#endif -} - -void NameRegNamer::readSettings(QSettings const& _s) -{ - (void)_s; - while (!m_registrars.empty()) - killRegistrar(m_registrars.back()); - - Address a("047cdba9627a8686bb24b3a65d87dab7efa53d31"); - m_registrars.push_back(a); - m_filters[a] = main()->installWatch(LogFilter().address(a), [=](LocalisedLogEntries const&){ updateCache(); }); - - noteKnownChanged(); -} - -void NameRegNamer::writeSettings(QSettings&) -{ -} diff --git a/alethzero/plugins/namers/NameRegNamer.h b/alethzero/plugins/namers/NameRegNamer.h deleted file mode 100644 index d56e9d41b..000000000 --- a/alethzero/plugins/namers/NameRegNamer.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file NameRegNamer.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include "MainFace.h" - -namespace dev -{ -namespace az -{ - -class NameRegNamer: public QObject, public AccountNamerPlugin -{ - Q_OBJECT - -public: - NameRegNamer(MainFace* _m); - ~NameRegNamer(); - -private: - void readSettings(QSettings const&) override; - void writeSettings(QSettings&) override; - - std::string toName(Address const&) const override; - Address toAddress(std::string const&) const override; - Addresses knownAddresses() const override; - - void updateCache(); - void killRegistrar(Address const& _r); - - Addresses m_registrars; - std::unordered_map m_filters; - - mutable Addresses m_knownCache; -// mutable std::unordered_map m_forwardCache; -// mutable std::unordered_map m_reverseCache; -}; - -} -} diff --git a/alethzero/plugins/namers/NewAccount.cpp b/alethzero/plugins/namers/NewAccount.cpp deleted file mode 100644 index 64a3ea185..000000000 --- a/alethzero/plugins/namers/NewAccount.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file NewAccount.h - * @author Marek Kotewicz - * @date 2015 - */ - -#include "NewAccount.h" -#include -#include -#include -#include -#include -#include "ui_NewAccount.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -bool beginsWith(Address _a, bytes const& _b) -{ - for (unsigned i = 0; i < min(20, _b.size()); ++i) - if (_a[i] != _b[i]) - return false; - return true; -} - -DEV_AZ_NOTE_PLUGIN(NewAccount); - -NewAccount::NewAccount(MainFace* _m): - Plugin(_m, "NewAccount") -{ - connect(addMenuItem("New Account...", "menuTools", true), SIGNAL(triggered()), SLOT(create())); -} - -NewAccount::~NewAccount() -{ -} - -void NewAccount::create() -{ - QDialog d; - Ui::NewAccount u; - u.setupUi(&d); - d.setWindowTitle("New Account Wallet"); - u.hexText->setEnabled(false); - u.passwordText->setEnabled(false); - u.passwordAgainText->setEnabled(false); - u.hintText->setEnabled(false); - - QStringList items = - { - "No vanity (instant)", - "Direct ICAP address", - "Two pairs first (a few seconds)", - "Two pairs first and second (a few minutes)", - "Three pairs first (a few minutes)", - "Four pairs first (several hours)", - "Specific hex string" - }; - u.typeComboBox->addItems(items); - - void (QComboBox:: *indexChangedSignal)(int) = &QComboBox::currentIndexChanged; - connect(u.typeComboBox, indexChangedSignal, [&](int index) - { - u.hexText->setEnabled(index == StringMatch); - }); - - connect(u.additionalCheckBox, &QCheckBox::clicked, [&]() - { - bool checked = u.additionalCheckBox->checkState() == Qt::CheckState::Checked; - u.passwordText->setEnabled(checked); - u.passwordAgainText->setEnabled(checked); - u.hintText->setEnabled(checked); - }); - - connect(u.create, &QPushButton::clicked, [&]() - { - if (u.additionalCheckBox->checkState() == Qt::CheckState::Checked && !validatePassword(u)) - { - u.passwordAgainLabel->setStyleSheet("QLabel { color : red }"); - u.passwordAgainLabel->setText("Invalid! Please re-enter password correctly:"); - return; - } - - d.accept(); - }); - - if (d.exec() == QDialog::Accepted) - onDialogAccepted(u); - -} - -bool NewAccount::validatePassword(Ui::NewAccount const& _u) -{ - return QString::compare(_u.passwordText->toPlainText(), _u.passwordAgainText->toPlainText()) == 0; -} - -void NewAccount::onDialogAccepted(Ui::NewAccount const& _u) -{ - Type v = (Type)_u.typeComboBox->currentIndex(); - bytes bs = fromHex(_u.hexText->toPlainText().toStdString()); - KeyPair p = newKeyPair(v, bs); - QString s = _u.nameText->toPlainText(); - if (_u.additionalCheckBox->checkState() == Qt::CheckState::Checked) - { - std::string hint = _u.hintText->toPlainText().toStdString(); - std::string password = _u.passwordText->toPlainText().toStdString(); - main()->keyManager().import(p.secret(), s.toStdString(), password, hint); - } - else - main()->keyManager().import(p.secret(), s.toStdString()); - - main()->noteKeysChanged(); -} - -KeyPair NewAccount::newKeyPair(Type _type, bytes const& _prefix) -{ - KeyPair p; - bool keepGoing = true; - unsigned done = 0; - function f = [&]() { - KeyPair lp; - while (keepGoing) - { - done++; - if (done % 1000 == 0) - cnote << "Tried" << done << "keys"; - lp = KeyPair::create(); - auto a = lp.address(); - if (_type == NoVanity || - (_type == DirectICAP && !a[0]) || - (_type == FirstTwo && a[0] == a[1]) || - (_type == FirstTwoNextTwo && a[0] == a[1] && a[2] == a[3]) || - (_type == FirstThree && a[0] == a[1] && a[1] == a[2]) || - (_type == FirstFour && a[0] == a[1] && a[1] == a[2] && a[2] == a[3]) || - (_type == StringMatch && beginsWith(lp.address(), _prefix)) - ) - break; - } - if (keepGoing) - p = lp; - keepGoing = false; - }; - - vector ts; - for (unsigned t = 0; t < std::thread::hardware_concurrency() - 1; ++t) - ts.push_back(new std::thread(f)); - f(); - - for (std::thread* t: ts) - { - t->join(); - delete t; - } - return p; -} diff --git a/alethzero/plugins/namers/NewAccount.h b/alethzero/plugins/namers/NewAccount.h deleted file mode 100644 index b0031e7f1..000000000 --- a/alethzero/plugins/namers/NewAccount.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file NewAccount.h - * @author Marek Kotewicz - * @date 2015 - */ - -#pragma once - -#include "MainFace.h" - - -namespace Ui -{ -class NewAccount; -} - -namespace dev -{ -namespace az -{ - -class NewAccount: public QObject, public Plugin -{ - Q_OBJECT - -public: - NewAccount(MainFace* _m); - ~NewAccount(); - -private slots: - void create(); - -private: - enum Type { NoVanity = 0, DirectICAP, FirstTwo, FirstTwoNextTwo, FirstThree, FirstFour, StringMatch }; - bool validatePassword(Ui::NewAccount const& _u); - void onDialogAccepted(Ui::NewAccount const& _u); - KeyPair newKeyPair(Type _type, bytes const& _prefix); -}; - -} -} diff --git a/alethzero/plugins/namers/NewAccount.ui b/alethzero/plugins/namers/NewAccount.ui deleted file mode 100644 index d793849d8..000000000 --- a/alethzero/plugins/namers/NewAccount.ui +++ /dev/null @@ -1,260 +0,0 @@ - - - NewAccount - - - - 0 - 0 - 511 - 600 - - - - Dialog - - - - - - - - - - 16777215 - 50 - - - - <html><head/><body><p><span style=" font-weight:600;">Select new account type:</span></p></body></html> - - - true - - - - - - - - 16777215 - 16777215 - - - - - - - - - 16777215 - 50 - - - - <html><head/><body><p>Enter some hex digits it should begin with.<br/>NOTE: The more you enter, the longer generation will take.</p></body></html> - - - - - - - - 16777215 - 21 - - - - - - - - - 16777215 - 50 - - - - <html><head/><body><p><span style=" font-weight:600;">Enter this account name:</span></p></body></html> - - - - - - - - 16777215 - 21 - - - - - - - - - 16777215 - 100 - - - - <html><head/><body><p><span style=" font-weight:600;">Would you like to add additional security for this key? This lets you protect it with a different password to other keys, but also means that you need to re-enter the key's password every time you wish to use the account.</span></p></body></html> - - - true - - - - - - - Yes - - - false - - - - - - - - 16777215 - 50 - - - - <html><head/><body><p><span style=" font-weight:600;">Enter password:</span></p></body></html> - - - - - - - - 16777215 - 21 - - - - - - - - - 16777215 - 50 - - - - <html><head/><body><p><span style=" font-weight:600;">Enter password again:</span></p></body></html> - - - - - - - - 16777215 - 21 - - - - - - - - <html><head/><body><p><span style=" font-weight:600;">Enter hint:</span></p></body></html> - - - - - - - - 16777215 - 50 - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 83 - 16777215 - - - - Qt::LeftToRight - - - Cancel - - - - - - - - 0 - 0 - - - - - 83 - 16777215 - - - - Qt::LeftToRight - - - &Create - - - true - - - - - - - - - - - cancel - clicked() - NewAccount - reject() - - - 381 - 483 - - - 351 - 506 - - - - - diff --git a/alethzero/plugins/namers/OtherAccounts.cpp b/alethzero/plugins/namers/OtherAccounts.cpp deleted file mode 100644 index 19b602b91..000000000 --- a/alethzero/plugins/namers/OtherAccounts.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file OtherAccounts.h - * @author Gav Wood - * @date 2015 - */ - -#include "OtherAccounts.h" -#include -#include -#include -#include -#include -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(OtherAccounts); - -OtherAccounts::OtherAccounts(MainFace* _m): - AccountNamerPlugin(_m, "OtherAccounts") -{ - connect(addMenuItem("Register Third-party Address Names...", "menuTools", true), SIGNAL(triggered()), SLOT(import())); -} - -void OtherAccounts::import() -{ - QDialog d; - Ui_OtherAccounts u; - u.setupUi(&d); - d.setWindowTitle("Add Named Accounts"); - if (d.exec() == QDialog::Accepted) - { - QStringList sl = u.accounts->toPlainText().split("\n"); - unsigned line = 1; - for (QString const& s: sl) - { - try - { - Address addr = dev::eth::toAddress(s.section(QRegExp("[ \\0\\t]+"), 0, 0).trimmed().toStdString()); - string name = s.section(QRegExp("[ \\0\\t]+"), 1).trimmed().toStdString(); - m_toName[addr] = name; - m_toAddress[name] = addr; - } - catch (...) - { - if (QMessageBox::warning(&d, "Invalid Line Format", "Line format or address given on line " + QString::number(line) + " is invalid:\n" + s, QMessageBox::Abort, QMessageBox::Ignore) == QMessageBox::Abort) - break; - } - line++; - } - main()->noteSettingsChanged(); - noteKnownChanged(); - } -} - -void OtherAccounts::readSettings(QSettings const& _s) -{ - m_toName.clear(); - m_toAddress.clear(); - for (QVariant const& i: _s.value("OtherAccounts", QVariantList()).toList()) - { - QStringList l = i.toStringList(); - if (l.size() == 2) - { - m_toName[Address(l[0].toStdString())] = l[1].toStdString(); - m_toAddress[l[1].toStdString()] = Address(l[0].toStdString()); - } - } - noteKnownChanged(); -} - -void OtherAccounts::writeSettings(QSettings& _s) -{ - QVariantList r; - for (auto const& i: m_toName) - { - QStringList l; - l += QString::fromStdString(i.first.hex()); - l += QString::fromStdString(i.second); - r += QVariant(l); - } - _s.setValue("OtherAccounts", r); -} diff --git a/alethzero/plugins/namers/OtherAccounts.h b/alethzero/plugins/namers/OtherAccounts.h deleted file mode 100644 index d807cdc3c..000000000 --- a/alethzero/plugins/namers/OtherAccounts.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file OtherAccounts.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include "MainFace.h" - -namespace dev -{ -namespace az -{ - -class OtherAccounts: public QObject, public AccountNamerPlugin -{ - Q_OBJECT - -public: - OtherAccounts(MainFace* _m); - -protected: - std::string toName(Address const& _a) const override { if (m_toName.count(_a)) return m_toName.at(_a); return std::string(); } - Address toAddress(std::string const& _n) const override { if (m_toAddress.count(_n)) return m_toAddress.at(_n); return Address(); } - Addresses knownAddresses() const override { return keysOf(m_toName); } - -private slots: - void import(); - -private: - void readSettings(QSettings const&) override; - void writeSettings(QSettings&) override; - - std::unordered_map m_toAddress; - std::unordered_map m_toName; -}; - -} -} diff --git a/alethzero/plugins/namers/OtherAccounts.ui b/alethzero/plugins/namers/OtherAccounts.ui deleted file mode 100644 index 7add0ca73..000000000 --- a/alethzero/plugins/namers/OtherAccounts.ui +++ /dev/null @@ -1,95 +0,0 @@ - - - OtherAccounts - - - - 0 - 0 - 511 - 508 - - - - Dialog - - - - - - Write the accounts you wish to name here, one address/name pair per line, the name following the address split only be a single space character. - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Cancel - - - - - - - &Import - - - true - - - - - - - - - - - create - clicked() - OtherAccounts - accept() - - - 462 - 484 - - - 449 - 504 - - - - - cancel - clicked() - OtherAccounts - reject() - - - 381 - 483 - - - 351 - 506 - - - - - diff --git a/alethzero/plugins/namers/OurAccounts.cpp b/alethzero/plugins/namers/OurAccounts.cpp deleted file mode 100644 index 7f868af05..000000000 --- a/alethzero/plugins/namers/OurAccounts.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file OurAccounts.h - * @author Gav Wood - * @date 2015 - */ - -#include "OurAccounts.h" -#include -#include -#include -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(OurAccounts); - -OurAccounts::OurAccounts(MainFace* _m): - AccountNamerPlugin(_m, "OurAccounts") -{ - connect(main(), SIGNAL(keyManagerChanged()), SLOT(updateNames())); - updateNames(); -} - -OurAccounts::~OurAccounts() -{ -} - -std::string OurAccounts::toName(Address const& _a) const -{ - return main()->keyManager().accountName(_a); -} - -Address OurAccounts::toAddress(std::string const& _n) const -{ - if (m_names.count(_n)) - return m_names.at(_n); - return Address(); -} - -Addresses OurAccounts::knownAddresses() const -{ - return main()->keyManager().accounts(); -} - -void OurAccounts::updateNames() -{ - m_names.clear(); - for (Address const& i: main()->keyManager().accounts()) - m_names[main()->keyManager().accountName(i)] = i; - noteKnownChanged(); -} diff --git a/alethzero/plugins/namers/OurAccounts.h b/alethzero/plugins/namers/OurAccounts.h deleted file mode 100644 index 2b88da50c..000000000 --- a/alethzero/plugins/namers/OurAccounts.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file OurAccounts.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include "MainFace.h" - -namespace dev -{ -namespace az -{ - -class OurAccounts: public QObject, public AccountNamerPlugin -{ - Q_OBJECT - -public: - OurAccounts(MainFace* _m); - ~OurAccounts(); - -protected: - std::string toName(Address const& _a) const override; - Address toAddress(std::string const& _n) const override; - Addresses knownAddresses() const override; - -private slots: - void updateNames(); - -private: - std::unordered_map m_names; -}; - -} -} diff --git a/alethzero/plugins/special/InjectTransactions.cpp b/alethzero/plugins/special/InjectTransactions.cpp deleted file mode 100644 index 27e5c3b79..000000000 --- a/alethzero/plugins/special/InjectTransactions.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file InjectTransactions.h - * @author Gav Wood - * @date 2015 - */ - -#include "InjectTransactions.h" -#include -#include -#include -#include -#include "ui_InjectTransactions.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(InjectTransactions); - -InjectTransactions::InjectTransactions(MainFace* _m): - Plugin(_m, "InjectTransactions") -{ - connect(addMenuItem("Inject Transaction...", "menuSpecial", true), SIGNAL(triggered()), SLOT(injectOne())); - connect(addMenuItem("Bulk Inject Transactions...", "menuSpecial", false), SIGNAL(triggered()), SLOT(injectBulk())); -} - -InjectTransactions::~InjectTransactions() -{ -} - -void InjectTransactions::injectOne() -{ - bool ok; - QString s = QInputDialog::getText(main(), "Inject Transaction", "Enter transaction dump in hex", QLineEdit::Normal, QString(), &ok); - if (ok) - doInject(s); -} - -void InjectTransactions::injectBulk() -{ - QDialog d; - Ui_InjectTransactions u; - u.setupUi(&d); - d.setWindowTitle("Bulk Inject Transactions"); - if (d.exec() == QDialog::Accepted) - for (QString const& s: u.transactions->toPlainText().split("\n")) - doInject(s); -} - -void InjectTransactions::doInject(QString _txHex) -{ - try - { - bytes b = fromHex(_txHex.toStdString(), WhenError::Throw); - main()->ethereum()->injectTransaction(b, IfDropped::Retry); - } - catch (BadHexCharacter& _e) - { - if (QMessageBox::warning(main(), "Invalid Transaction Hex", "Invalid hex character in:\n" + _txHex + "\nTransaction rejected.", QMessageBox::Ignore, QMessageBox::Abort) == QMessageBox::Abort) - return; - } - catch (Exception& _e) - { - if (QMessageBox::warning(main(), "Transaction Rejected", "Invalid transaction; due to" + QString::fromStdString(_e.what()) + "\n" + _txHex + "\nTransaction rejected.", QMessageBox::Ignore, QMessageBox::Abort) == QMessageBox::Abort) - return; - } - catch (...) - { - // Should not happen under normal circumstances. - return; - } -} diff --git a/alethzero/plugins/special/InjectTransactions.h b/alethzero/plugins/special/InjectTransactions.h deleted file mode 100644 index 76941027d..000000000 --- a/alethzero/plugins/special/InjectTransactions.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file InjectTransactions.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include "MainFace.h" - -namespace dev -{ -namespace az -{ - -class InjectTransactions: public QObject, public Plugin -{ - Q_OBJECT - -public: - InjectTransactions(MainFace* _m); - ~InjectTransactions(); - -private slots: - void injectOne(); - void injectBulk(); - -private: - void doInject(QString _txHex); -}; - -} -} diff --git a/alethzero/plugins/special/InjectTransactions.ui b/alethzero/plugins/special/InjectTransactions.ui deleted file mode 100644 index e135130eb..000000000 --- a/alethzero/plugins/special/InjectTransactions.ui +++ /dev/null @@ -1,95 +0,0 @@ - - - InjectTransactions - - - - 0 - 0 - 511 - 508 - - - - Dialog - - - - - - Write the transactions you wish to inject here, in hex, one per line. - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Cancel - - - - - - - &Import - - - true - - - - - - - - - - - inject - clicked() - InjectTransactions - accept() - - - 462 - 484 - - - 449 - 504 - - - - - cancel - clicked() - InjectTransactions - reject() - - - 381 - 483 - - - 351 - 506 - - - - - diff --git a/alethzero/plugins/whisper/Whisper.cpp b/alethzero/plugins/whisper/Whisper.cpp deleted file mode 100644 index cb5d9908f..000000000 --- a/alethzero/plugins/whisper/Whisper.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Whisper.cpp - * @author Gav Wood - * @date 2015 - */ - -#include "Whisper.h" -#include -#include -#include -#include -#include -#include "OurWebThreeStubServer.h" -#include "ui_Whisper.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(Whisper); - -static Public stringToPublic(QString const& _a) -{ - string sn = _a.toStdString(); - if (_a.size() == sizeof(Public) * 2) - return Public(fromHex(_a.toStdString())); - else if (_a.size() == sizeof(Public) * 2 + 2 && _a.startsWith("0x")) - return Public(fromHex(_a.mid(2).toStdString())); - else - return Public(); -} - -static shh::Topics topicFromText(QString _s) -{ - shh::BuildTopic ret; - while (_s.size()) - { - QRegExp r("(@|\\$)?\"([^\"]*)\"(\\s.*)?"); - QRegExp d("(@|\\$)?([0-9]+)(\\s*(ether)|(finney)|(szabo))?(\\s.*)?"); - QRegExp h("(@|\\$)?(0x)?(([a-fA-F0-9])+)(\\s.*)?"); - bytes part; - if (r.exactMatch(_s)) - { - for (auto i: r.cap(2)) - part.push_back((byte)i.toLatin1()); - if (r.cap(1) != "$") - for (int i = r.cap(2).size(); i < 32; ++i) - part.push_back(0); - else - part.push_back(0); - _s = r.cap(3); - } - else if (d.exactMatch(_s)) - { - u256 v(d.cap(2).toStdString()); - if (d.cap(6) == "szabo") - v *= szabo; - else if (d.cap(5) == "finney") - v *= finney; - else if (d.cap(4) == "ether") - v *= ether; - bytes bs = dev::toCompactBigEndian(v); - if (d.cap(1) != "$") - for (auto i = bs.size(); i < 32; ++i) - part.push_back(0); - for (auto b: bs) - part.push_back(b); - _s = d.cap(7); - } - else if (h.exactMatch(_s)) - { - bytes bs = fromHex((((h.cap(3).size() & 1) ? "0" : "") + h.cap(3)).toStdString()); - if (h.cap(1) != "$") - for (auto i = bs.size(); i < 32; ++i) - part.push_back(0); - for (auto b: bs) - part.push_back(b); - _s = h.cap(5); - } - else - _s = _s.mid(1); - ret.shift(part); - } - return ret; -} - - -Whisper::Whisper(MainFace* _m): - Plugin(_m, "Whisper"), - m_ui(new Ui::Whisper) -{ - dock(Qt::RightDockWidgetArea, "Whisper")->setWidget(new QWidget); - m_ui->setupUi(dock()->widget()); - connect(addMenuItem("New Whisper identity.", "menuNetwork", true), &QAction::triggered, this, &Whisper::on_newIdentity_triggered); - connect(_m->web3Server(), &OurWebThreeStubServer::onNewId, this, &Whisper::addNewId); -} - -void Whisper::readSettings(QSettings const& _s) -{ - m_myIdentities.clear(); - QByteArray b = _s.value("identities").toByteArray(); - if (!b.isEmpty()) - { - Secret k; - for (unsigned i = 0; i < b.size() / sizeof(Secret); ++i) - { - memcpy(k.writable().data(), b.data() + i * sizeof(Secret), sizeof(Secret)); - if (!count(m_myIdentities.begin(), m_myIdentities.end(), KeyPair(k))) - m_myIdentities.append(KeyPair(k)); - } - } - main()->web3Server()->setIdentities(keysAsVector(m_myIdentities)); - refreshWhisper(); -} - -void Whisper::writeSettings(QSettings& _s) -{ - QByteArray b; - b.resize(sizeof(Secret) * m_myIdentities.size()); - auto p = b.data(); - for (auto i: m_myIdentities) - { - memcpy(p, &(i.secret()), sizeof(Secret)); - p += sizeof(Secret); - } - _s.setValue("identities", b); -} - -void Whisper::addNewId(QString _ids) -{ - KeyPair kp(jsToSecret(_ids.toStdString())); - m_myIdentities.push_back(kp); - main()->web3Server()->setIdentities(keysAsVector(m_myIdentities)); - refreshWhisper(); -} - -void Whisper::refreshWhisper() -{ - m_ui->shhFrom->clear(); - for (auto i: main()->web3Server()->ids()) - m_ui->shhFrom->addItem(QString::fromStdString(toHex(i.first.ref()))); -} - -void Whisper::on_newIdentity_triggered() -{ - KeyPair kp = KeyPair::create(); - m_myIdentities.append(kp); - main()->web3Server()->setIdentities(keysAsVector(m_myIdentities)); - refreshWhisper(); -} - -void Whisper::on_post_clicked() -{ - return; - shh::Message m; - m.setTo(stringToPublic(m_ui->shhTo->currentText())); - m.setPayload(parseData(m_ui->shhData->toPlainText().toStdString())); - Public f = stringToPublic(m_ui->shhFrom->currentText()); - Secret from; - if (main()->web3Server()->ids().count(f)) - from = main()->web3Server()->ids().at(f); - whisper()->inject(m.seal(from, topicFromText(m_ui->shhTopic->toPlainText()), m_ui->shhTtl->value(), m_ui->shhWork->value())); -} diff --git a/alethzero/plugins/whisper/Whisper.h b/alethzero/plugins/whisper/Whisper.h deleted file mode 100644 index bcc1d16df..000000000 --- a/alethzero/plugins/whisper/Whisper.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Whisper.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include -#include "MainFace.h" - -namespace Ui -{ -class Whisper; -} - -namespace dev -{ -namespace az -{ - -class Whisper: public QObject, public Plugin -{ - Q_OBJECT - -public: - Whisper(MainFace* _m); - -private: - void readSettings(QSettings const&) override; - void writeSettings(QSettings&) override; - void refreshWhisper(); - void addNewId(QString _ids); - void on_newIdentity_triggered(); - void on_post_clicked(); - - Ui::Whisper* m_ui; - QList m_myIdentities; -}; - -} -} diff --git a/alethzero/plugins/whisper/Whisper.ui b/alethzero/plugins/whisper/Whisper.ui deleted file mode 100644 index e143c2f93..000000000 --- a/alethzero/plugins/whisper/Whisper.ui +++ /dev/null @@ -1,176 +0,0 @@ - - - Whisper - - - - - - - 0 - 0 - - - - Data - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - Work to Prove - - - - - - - - 0 - 0 - - - - QFrame::NoFrame - - - 0 - - - - - - - - 0 - 0 - - - - QFrame::NoFrame - - - 0 - - - - - - - false - - - - - - - - 0 - 0 - - - - Topic - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - To - - - - - - - true - - - - - - - seconds - - - 5 - - - 259200 - - - - - - - - 0 - 0 - - - - TTL - - - - - - - - 0 - 0 - - - - From - - - - - - - ms - - - 1 - - - 1000 - - - 50 - - - - - - - Post - - - - - - - - diff --git a/alethzero/plugins/whisper/WhisperPeers.cpp b/alethzero/plugins/whisper/WhisperPeers.cpp deleted file mode 100644 index 07198f93d..000000000 --- a/alethzero/plugins/whisper/WhisperPeers.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file WhisperPeers.cpp - * @author Gav Wood - * @date 2015 - */ - -#include "WhisperPeers.h" -#include -#include -#include -#include -#include "OurWebThreeStubServer.h" -#include "ui_WhisperPeers.h" -using namespace std; -using namespace dev; -using namespace az; -using namespace eth; - -DEV_AZ_NOTE_PLUGIN(WhisperPeers); - -WhisperPeers::WhisperPeers(MainFace* _m): - Plugin(_m, "WhisperPeers"), - m_ui(new Ui::WhisperPeers) -{ - dock(Qt::RightDockWidgetArea, "Active Whispers")->setWidget(new QWidget); - m_ui->setupUi(dock()->widget()); - startTimer(1000); -} - -void WhisperPeers::timerEvent(QTimerEvent*) -{ - refreshWhispers(); -} - -void WhisperPeers::refreshWhispers() -{ - return; - m_ui->whispers->clear(); - for (auto const& w: whisper()->all()) - { - shh::Envelope const& e = w.second; - shh::Message m; - for (pair const& i: main()->web3Server()->ids()) - if (!!(m = e.open(shh::Topics(), i.second))) - break; - if (!m) - m = e.open(shh::Topics()); - - QString msg; - if (m.from()) - // Good message. - msg = QString("{%1 -> %2} %3").arg(m.from() ? m.from().abridged().c_str() : "???").arg(m.to() ? m.to().abridged().c_str() : "*").arg(toHex(m.payload()).c_str()); - else if (m) - // Maybe message. - msg = QString("{%1 -> %2} %3 (?)").arg(m.from() ? m.from().abridged().c_str() : "???").arg(m.to() ? m.to().abridged().c_str() : "*").arg(toHex(m.payload()).c_str()); - - time_t ex = e.expiry(); - QString t(ctime(&ex)); - t.chop(1); - QString item = QString("[%1 - %2s] *%3 %5 %4").arg(t).arg(e.ttl()).arg(e.workProved()).arg(toString(e.topic()).c_str()).arg(msg); - m_ui->whispers->addItem(item); - } -} diff --git a/alethzero/plugins/whisper/WhisperPeers.h b/alethzero/plugins/whisper/WhisperPeers.h deleted file mode 100644 index 2e9ade3a2..000000000 --- a/alethzero/plugins/whisper/WhisperPeers.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file WhisperPeers.h - * @author Gav Wood - * @date 2015 - */ - -#pragma once - -#include -#include -#include -#include -#include "MainFace.h" - -namespace Ui -{ -class WhisperPeers; -} - -namespace dev -{ -namespace az -{ - -class WhisperPeers: public QObject, public Plugin -{ - Q_OBJECT - -public: - WhisperPeers(MainFace* _m); - -private: - void timerEvent(QTimerEvent*) override; - void refreshWhispers(); - - Ui::WhisperPeers* m_ui; -}; - -} -} diff --git a/alethzero/plugins/whisper/WhisperPeers.ui b/alethzero/plugins/whisper/WhisperPeers.ui deleted file mode 100644 index d73c215e8..000000000 --- a/alethzero/plugins/whisper/WhisperPeers.ui +++ /dev/null @@ -1,32 +0,0 @@ - - - WhisperPeers - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::NoFrame - - - - - - - - From a060c46b4c92a3c7f6166aafbbc452a66730c795 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 18 Aug 2015 19:56:10 +0200 Subject: [PATCH 2/3] Cleaned up some of network. Added HostSpec. --- BuildInfo.h.in | 1 + CMakeLists.txt | 5 +- cmake/scripts/buildinfo.cmake | 7 ++ eth/main.cpp | 4 +- libdevcore/Common.h | 7 ++ libdevcore/Log.h | 39 ++++++----- libethcore/BlockInfo.cpp | 1 + libethereum/EthereumHost.h | 4 +- libp2p/Common.cpp | 60 ++++++++++++++++- libp2p/Common.h | 79 +++++++++++++++++------ libp2p/Host.cpp | 52 ++++++++------- libp2p/Host.h | 39 +++++------ libp2p/NodeTable.cpp | 18 +++--- libp2p/NodeTable.h | 40 ++++++------ libp2p/Peer.cpp | 2 +- libp2p/Peer.h | 2 +- libp2p/RLPxHandshake.h | 4 +- libp2p/Session.cpp | 4 +- libp2p/Session.h | 2 +- libweb3jsonrpc/WebThreeStubServerBase.cpp | 14 +--- libwebthree/WebThree.cpp | 8 ++- libwebthree/WebThree.h | 28 ++++---- mix/Web3Server.cpp | 14 ++-- test/libp2p/capability.cpp | 4 +- test/libp2p/net.cpp | 8 +-- test/libp2p/peer.cpp | 6 +- 26 files changed, 289 insertions(+), 163 deletions(-) diff --git a/BuildInfo.h.in b/BuildInfo.h.in index 5e97b71a5..eb4a5e060 100644 --- a/BuildInfo.h.in +++ b/BuildInfo.h.in @@ -5,3 +5,4 @@ #define ETH_CLEAN_REPO @ETH_CLEAN_REPO@ #define ETH_BUILD_TYPE @ETH_BUILD_TYPE@ #define ETH_BUILD_PLATFORM @ETH_BUILD_PLATFORM@ +#define ETH_FATDB @ETH_FATDB@ diff --git a/CMakeLists.txt b/CMakeLists.txt index dc5252071..75ba00a9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,12 +242,14 @@ function(createBuildInfo) set(_cmake_build_type "${CMAKE_CFG_INTDIR}") endif() + message("createBuildInfo()") + # Generate header file containing useful build information add_custom_target(BuildInfo.h ALL WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -DETH_SOURCE_DIR="${CMAKE_SOURCE_DIR}" -DETH_DST_DIR="${CMAKE_BINARY_DIR}" -DETH_BUILD_TYPE="${_cmake_build_type}" -DETH_BUILD_PLATFORM="${ETH_BUILD_PLATFORM}" - -DPROJECT_VERSION="${PROJECT_VERSION}" + -DPROJECT_VERSION="${PROJECT_VERSION}" -DETH_FATDB="${FATDB}" -P "${ETH_SCRIPTS_DIR}/buildinfo.cmake" ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) @@ -375,6 +377,7 @@ message("-- CXXFLAGS: ${CMAKE_CXX_FLAGS}") # this must be an include, as a function it would mess up with variable scope! include(EthExecutableHelper) +message("creating build info...") createBuildInfo() if (ROCKSDB AND ROCKSDB_FOUND) diff --git a/cmake/scripts/buildinfo.cmake b/cmake/scripts/buildinfo.cmake index a0666c9f5..70e2b1c0b 100644 --- a/cmake/scripts/buildinfo.cmake +++ b/cmake/scripts/buildinfo.cmake @@ -9,6 +9,12 @@ # example usage: # cmake -DETH_SOURCE_DIR=. -DETH_DST_DIR=build -DETH_BUILD_TYPE=Debug -DETH_BUILD_PLATFORM=mac -P scripts/buildinfo.cmake +if (ETH_FATDB) + set(ETH_FATDB 1) +else() + set(ETH_FATDB 0) +endif() + if (NOT ETH_BUILD_TYPE) set(ETH_BUILD_TYPE "unknown") endif() @@ -41,6 +47,7 @@ set(INFILE "${ETH_SOURCE_DIR}/BuildInfo.h.in") set(TMPFILE "${ETH_DST_DIR}/BuildInfo.h.tmp") set(OUTFILE "${ETH_DST_DIR}/BuildInfo.h") +message("ETH_FATDB: ${ETH_FATDB}") configure_file("${INFILE}" "${TMPFILE}") include("${ETH_SOURCE_DIR}/cmake/EthUtils.cmake") diff --git a/eth/main.cpp b/eth/main.cpp index 36bafa5aa..5ee9feb7d 100644 --- a/eth/main.cpp +++ b/eth/main.cpp @@ -314,7 +314,7 @@ int main(int argc, char** argv) unsigned peers = 11; unsigned peerStretch = 7; - std::map> preferredNodes; + std::map> preferredNodes; bool bootstrap = true; bool disableDiscovery = false; bool pinning = false; @@ -1089,7 +1089,7 @@ int main(int argc, char** argv) for (auto const& i: Host::pocHosts()) web3.requirePeer(i.first, i.second); if (!remoteHost.empty()) - web3.addNode(p2p::NodeId(), remoteHost + ":" + toString(remotePort)); + web3.addNode(p2p::NodeID(), remoteHost + ":" + toString(remotePort)); signal(SIGABRT, &Client::exitHandler); signal(SIGTERM, &Client::exitHandler); diff --git a/libdevcore/Common.h b/libdevcore/Common.h index 158cea255..7f74ee091 100644 --- a/libdevcore/Common.h +++ b/libdevcore/Common.h @@ -279,6 +279,13 @@ private: #define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__PRETTY_FUNCTION__, MS) #endif +#ifdef _MSC_VER +// TODO. +#define DEV_UNUSED +#else +#define DEV_UNUSED __attribute__((unused)) +#endif + enum class WithExisting: int { Trust = 0, diff --git a/libdevcore/Log.h b/libdevcore/Log.h index 18a66c1a4..f6a11739e 100644 --- a/libdevcore/Log.h +++ b/libdevcore/Log.h @@ -111,11 +111,11 @@ std::string getThreadName(); /// The default logging channels. Each has an associated verbosity and three-letter prefix (name() ). /// Channels should inherit from LogChannel and define name() and verbosity. -struct LogChannel { static const char* name(); static const int verbosity = 1; }; +struct LogChannel { static const char* name(); static const int verbosity = 1; static const bool debug = true; }; struct LeftChannel: public LogChannel { static const char* name(); }; struct RightChannel: public LogChannel { static const char* name(); }; -struct WarnChannel: public LogChannel { static const char* name(); static const int verbosity = 0; }; -struct NoteChannel: public LogChannel { static const char* name(); }; +struct WarnChannel: public LogChannel { static const char* name(); static const int verbosity = 0; static const bool debug = false; }; +struct NoteChannel: public LogChannel { static const char* name(); static const bool debug = false; }; struct DebugChannel: public LogChannel { static const char* name(); static const int verbosity = 0; }; enum class LogTag @@ -259,30 +259,29 @@ public: template LogOutputStream& operator<<(T const& _t) { if (Id::verbosity <= g_logVerbosity) { if (_AutoSpacing && m_sstr.str().size() && m_sstr.str().back() != ' ') m_sstr << " "; append(_t); } return *this; } }; -// Simple cout-like stream objects for accessing common log channels. -// Dirties the global namespace, but oh so convenient... -#define cnote dev::LogOutputStream() -#define cwarn dev::LogOutputStream() - -// Null stream-like objects. -#define ndebug if (true) {} else dev::NullOutputStream() -#define nlog(X) if (true) {} else dev::NullOutputStream() -#define nslog(X) if (true) {} else dev::NullOutputStream() - -// Kill debugging log channel when we're in release mode. -#if NDEBUG -#define cdebug ndebug -#else -#define cdebug dev::LogOutputStream() -#endif - // Kill all logs when when NLOG is defined. #if NLOG #define clog(X) nlog(X) #define cslog(X) nslog(X) #else +#if NDEBUG +#define clog(X) if (X::debug) {} else dev::LogOutputStream() +#define cslog(X) if (X::debug) {} else dev::LogOutputStream() +#else #define clog(X) dev::LogOutputStream() #define cslog(X) dev::LogOutputStream() #endif +#endif + +// Simple cout-like stream objects for accessing common log channels. +// Dirties the global namespace, but oh so convenient... +#define cdebug clog(dev::DebugChannel) +#define cnote clog(dev::NoteChannel) +#define cwarn clog(dev::WarnChannel) + +// Null stream-like objects. +#define ndebug if (true) {} else dev::NullOutputStream() +#define nlog(X) if (true) {} else dev::NullOutputStream() +#define nslog(X) if (true) {} else dev::NullOutputStream() } diff --git a/libethcore/BlockInfo.cpp b/libethcore/BlockInfo.cpp index c0fe1c8e4..27802b582 100644 --- a/libethcore/BlockInfo.cpp +++ b/libethcore/BlockInfo.cpp @@ -20,6 +20,7 @@ */ #include +#include #include #include #include diff --git a/libethereum/EthereumHost.h b/libethereum/EthereumHost.h index 34f3c1948..9cccce625 100644 --- a/libethereum/EthereumHost.h +++ b/libethereum/EthereumHost.h @@ -74,7 +74,7 @@ public: DownloadMan const& downloadMan() const { return m_man; } DownloadMan& downloadMan() { return m_man; } bool isSyncing() const; - bool isBanned(p2p::NodeId const& _id) const { return !!m_banned.count(_id); } + bool isBanned(p2p::NodeID const& _id) const { return !!m_banned.count(_id); } void noteNewTransactions() { m_newTransactions = true; } void noteNewBlocks() { m_newBlocks = true; } @@ -129,7 +129,7 @@ private: h256 m_latestBlockSent; h256Hash m_transactionsSent; - std::unordered_set m_banned; + std::unordered_set m_banned; bool m_newTransactions = false; bool m_newBlocks = false; diff --git a/libp2p/Common.cpp b/libp2p/Common.cpp index 9bc6d7f48..d5811210d 100644 --- a/libp2p/Common.cpp +++ b/libp2p/Common.cpp @@ -20,6 +20,7 @@ */ #include "Common.h" +#include "Network.h" using namespace std; using namespace dev; using namespace dev::p2p; @@ -29,7 +30,7 @@ const unsigned dev::p2p::c_defaultIPPort = 30303; static_assert(dev::p2p::c_protocolVersion == 4, "Replace v3 compatbility with v4 compatibility before updating network version."); const dev::p2p::NodeIPEndpoint dev::p2p::UnspecifiedNodeIPEndpoint = NodeIPEndpoint(bi::address(), 0, 0); -const dev::p2p::Node dev::p2p::UnspecifiedNode = dev::p2p::Node(NodeId(), UnspecifiedNodeIPEndpoint); +const dev::p2p::Node dev::p2p::UnspecifiedNode = dev::p2p::Node(NodeID(), UnspecifiedNodeIPEndpoint); bool dev::p2p::NodeIPEndpoint::test_allowLocal = false; @@ -199,13 +200,66 @@ void DeadlineOps::reap() }); } -namespace dev { +Node::Node(NodeSpec const& _s, PeerType _p): + id(_s.id()), + endpoint(_s.nodeIPEndpoint()), + peerType(_p) +{} + +NodeSpec::NodeSpec(string const& _user) +{ + m_address = _user; + if (m_address.substr(0, 8) == "enode://" && m_address.find('@') == 136) + { + m_id = p2p::NodeID(m_address.substr(8, 128)); + m_address = m_address.substr(137); + } + size_t colon = m_address.find_first_of(":"); + if (colon != string::npos) + { + m_address = m_address.substr(0, colon); + string ports = m_address.substr(colon + 1); + size_t p2 = ports.find_first_of("."); + if (p2 != string::npos) + { + m_udpPort = stoi(ports.substr(p2 + 1)); + m_tcpPort = stoi(ports.substr(0, p2)); + } + else + m_tcpPort = m_udpPort = stoi(ports); + } +} + +NodeIPEndpoint NodeSpec::nodeIPEndpoint() const +{ + return NodeIPEndpoint(p2p::Network::resolveHost(m_address).address(), m_udpPort, m_tcpPort); +} + +std::string NodeSpec::enode() const +{ + string ret = m_address; + + if (m_tcpPort) + if (m_udpPort && m_tcpPort != m_udpPort) + ret += ":" + toString(m_tcpPort) + "." + toString(m_udpPort); + else + ret += ":" + toString(m_tcpPort); + else if (m_udpPort) + ret += ":" + toString(m_udpPort); + + if (m_id) + return "enode://" + m_id.hex() + "@" + ret; + return ret; +} + +namespace dev +{ std::ostream& operator<<(std::ostream& _out, dev::p2p::NodeIPEndpoint const& _ep) { _out << _ep.address << _ep.udpPort << _ep.tcpPort; return _out; } - + } diff --git a/libp2p/Common.h b/libp2p/Common.h index c1334f7a4..6d0239499 100644 --- a/libp2p/Common.h +++ b/libp2p/Common.h @@ -54,12 +54,12 @@ namespace p2p extern const unsigned c_protocolVersion; extern const unsigned c_defaultIPPort; -struct NodeIPEndpoint; -struct Node; +class NodeIPEndpoint; +class Node; extern const NodeIPEndpoint UnspecifiedNodeIPEndpoint; extern const Node UnspecifiedNode; -using NodeId = h512; +using NodeID = h512; bool isPrivateAddress(bi::address const& _addressToCheck); bool isPrivateAddress(std::string const& _addressToCheck); @@ -150,7 +150,7 @@ using CapDescs = std::vector; */ struct PeerSessionInfo { - NodeId const id; + NodeID const id; std::string const clientVersion; std::string const host; unsigned short const port; @@ -163,11 +163,18 @@ struct PeerSessionInfo using PeerSessionInfos = std::vector; +enum class PeerType +{ + Optional, + Required +}; + /** * @brief IPv4,UDP/TCP endpoints. */ -struct NodeIPEndpoint +class NodeIPEndpoint { +public: enum RLPAppend { StreamList, @@ -181,10 +188,6 @@ struct NodeIPEndpoint NodeIPEndpoint(bi::address _addr, uint16_t _udp, uint16_t _tcp): address(_addr), udpPort(_udp), tcpPort(_tcp) {} NodeIPEndpoint(RLP const& _r) { interpretRLP(_r); } - bi::address address = bi::address(); - uint16_t udpPort = 0; - uint16_t tcpPort = 0; - operator bi::udp::endpoint() const { return bi::udp::endpoint(address, udpPort); } operator bi::tcp::endpoint() const { return bi::tcp::endpoint(address, tcpPort); } @@ -194,25 +197,61 @@ struct NodeIPEndpoint void streamRLP(RLPStream& _s, RLPAppend _append = StreamList) const; void interpretRLP(RLP const& _r); + + // TODO: make private, give accessors and rename m_... + bi::address address; + uint16_t udpPort = 0; + uint16_t tcpPort = 0; }; - -struct Node + +struct NodeSpec { - Node(Public _pubk, NodeIPEndpoint const& _ip, bool _required = false): id(_pubk), endpoint(_ip), required(_required) {} + NodeSpec() {} + + /// Accepts user-readable strings of the form (enode://pubkey@)host({:port,:tcpport.udpport}) + NodeSpec(std::string const& _user); + + NodeSpec(std::string const& _addr, uint16_t _port, int _udpPort = -1): + m_address(_addr), + m_tcpPort(_port), + m_udpPort(_udpPort == -1 ? _port : (uint16_t)_udpPort) + {} + + NodeID id() const { return m_id; } + + NodeIPEndpoint nodeIPEndpoint() const; - virtual NodeId const& address() const { return id; } + std::string enode() const; + +private: + std::string m_address; + uint16_t m_tcpPort = 0; + uint16_t m_udpPort = 0; + NodeID m_id; +}; + +class Node +{ +public: + Node() = default; + Node(Node const&) = default; + Node(Public _publicKey, NodeIPEndpoint const& _ip, PeerType _peerType = PeerType::Optional): id(_publicKey), endpoint(_ip), peerType(_peerType) {} + Node(NodeSpec const& _s, PeerType _peerType = PeerType::Optional); + + virtual NodeID const& address() const { return id; } virtual Public const& publicKey() const { return id; } - NodeId id; - + virtual operator bool() const { return (bool)id; } + + // TODO: make private, give accessors and rename m_... + NodeID id; + /// Endpoints by which we expect to reach node. + // TODO: make private, give accessors and rename m_... NodeIPEndpoint endpoint; - - /// If true, node will not be removed from Node list. + // TODO: p2p implement - bool required = false; - - virtual operator bool() const { return (bool)id; } + PeerType peerType = PeerType::Optional; }; class DeadlineOps diff --git a/libp2p/Host.cpp b/libp2p/Host.cpp index f62a66865..23512fdef 100644 --- a/libp2p/Host.cpp +++ b/libp2p/Host.cpp @@ -50,7 +50,7 @@ std::chrono::milliseconds const c_keepAliveTimeOut = std::chrono::milliseconds(1 HostNodeTableHandler::HostNodeTableHandler(Host& _host): m_host(_host) {} -void HostNodeTableHandler::processEvent(NodeId const& _n, NodeTableEventType const& _e) +void HostNodeTableHandler::processEvent(NodeID const& _n, NodeTableEventType const& _e) { m_host.onNodeTableEvent(_n, _e); } @@ -305,7 +305,7 @@ void Host::startPeerSession(Public const& _id, RLP const& _rlp, unique_ptrm_peer->endpoint, ps->m_peer->m_lastConnected, clientVersion, peerCount()); } -void Host::onNodeTableEvent(NodeId const& _n, NodeTableEventType const& _e) +void Host::onNodeTableEvent(NodeID const& _n, NodeTableEventType const& _e) { if (_e == NodeEntryAdded) { @@ -336,7 +336,7 @@ void Host::onNodeTableEvent(NodeId const& _n, NodeTableEventType const& _e) { clog(NetP2PNote) << "p2p.host.nodeTable.events.NodeEntryDropped " << _n; RecursiveGuard l(x_sessions); - if (m_peers.count(_n) && !m_peers[_n]->required) + if (m_peers.count(_n) && m_peers[_n]->peerType == PeerType::Optional) m_peers.erase(_n); } } @@ -450,7 +450,15 @@ std::unordered_map const& Host::pocHosts() return c_ret; } -void Host::addNode(NodeId const& _node, NodeIPEndpoint const& _endpoint) +void Host::addPeer(NodeSpec const& _s, PeerType _t) +{ + if (_t == PeerType::Optional) + addNode(_s.id(), _s.nodeIPEndpoint()); + else + requirePeer(_s.id(), _s.nodeIPEndpoint()); +} + +void Host::addNode(NodeID const& _node, NodeIPEndpoint const& _endpoint) { // return if network is stopped while waiting on Host::run() or nodeTable to start while (!haveNetwork()) @@ -466,12 +474,12 @@ void Host::addNode(NodeId const& _node, NodeIPEndpoint const& _endpoint) m_nodeTable->addNode(Node(_node, _endpoint)); } -void Host::requirePeer(NodeId const& _n, NodeIPEndpoint const& _endpoint) +void Host::requirePeer(NodeID const& _n, NodeIPEndpoint const& _endpoint) { if (!m_run) return; - Node node(_n, _endpoint, true); + Node node(_n, _endpoint, PeerType::Required); if (_n) { // create or update m_peers entry @@ -481,7 +489,7 @@ void Host::requirePeer(NodeId const& _n, NodeIPEndpoint const& _endpoint) { p = m_peers[_n]; p->endpoint = node.endpoint; - p->required = true; + p->peerType = PeerType::Required; } else { @@ -506,7 +514,7 @@ void Host::requirePeer(NodeId const& _n, NodeIPEndpoint const& _endpoint) } } -void Host::relinquishPeer(NodeId const& _node) +void Host::relinquishPeer(NodeID const& _node) { Guard l(x_requiredPeers); if (m_requiredPeers.count(_node)) @@ -524,7 +532,7 @@ void Host::connect(std::shared_ptr const& _p) return; } - if (!!m_nodeTable && !m_nodeTable->haveNode(_p->id) && !_p->required) + if (!!m_nodeTable && !m_nodeTable->haveNode(_p->id) && _p->peerType == PeerType::Optional) return; // prevent concurrently connecting to a node @@ -638,7 +646,7 @@ void Host::run(boost::system::error_code const&) for (auto const& p: m_peers) { bool haveSession = havePeerSession(p.second->id); - bool required = p.second->required; + bool required = p.second->peerType == PeerType::Required; if (haveSession && required) reqConn++; else if (!haveSession && p.second->shouldReconnect() && (!m_netPrefs.pin || required)) @@ -647,7 +655,7 @@ void Host::run(boost::system::error_code const&) } for (auto p: toConnect) - if (p->required && reqConn++ < m_idealPeerCount) + if (p->peerType == PeerType::Required && reqConn++ < m_idealPeerCount) connect(p); if (!m_netPrefs.pin) @@ -658,7 +666,7 @@ void Host::run(boost::system::error_code const&) int openSlots = m_idealPeerCount - peerCount() - pendingCount + reqConn; if (openSlots > 0) for (auto p: toConnect) - if (!p->required && openSlots--) + if (p->peerType == PeerType::Optional && openSlots--) connect(p); } @@ -780,11 +788,11 @@ bytes Host::saveNetwork() const continue; // Only save peers which have connected within 2 days, with properly-advertised port and public IP address - if (chrono::system_clock::now() - p.m_lastConnected < chrono::seconds(3600 * 48) && !!p.endpoint && p.id != id() && (p.required || p.endpoint.isAllowed())) + if (chrono::system_clock::now() - p.m_lastConnected < chrono::seconds(3600 * 48) && !!p.endpoint && p.id != id() && (p.peerType == PeerType::Required || p.endpoint.isAllowed())) { network.appendList(11); p.endpoint.streamRLP(network, NodeIPEndpoint::StreamInline); - network << p.id << p.required + network << p.id << (p.peerType == PeerType::Required ? true : false) << chrono::duration_cast(p.m_lastConnected.time_since_epoch()).count() << chrono::duration_cast(p.m_lastAttempted.time_since_epoch()).count() << p.m_failedAttempts << (unsigned)p.m_lastDisconnect << p.m_score << p.m_rating; @@ -843,13 +851,13 @@ void Host::restoreNetwork(bytesConstRef _b) if (i.itemCount() == 4 || i.itemCount() == 11) { - Node n((NodeId)i[3], NodeIPEndpoint(i)); + Node n((NodeID)i[3], NodeIPEndpoint(i)); if (i.itemCount() == 4 && n.endpoint.isAllowed()) m_nodeTable->addNode(n); else if (i.itemCount() == 11) { - n.required = i[4].toInt(); - if (!n.endpoint.isAllowed() && !n.required) + n.peerType = i[4].toInt() ? PeerType::Required : PeerType::Optional; + if (!n.endpoint.isAllowed() && n.peerType == PeerType::Optional) continue; shared_ptr p = make_shared(n); p->m_lastConnected = chrono::system_clock::time_point(chrono::seconds(i[5].toInt())); @@ -859,7 +867,7 @@ void Host::restoreNetwork(bytesConstRef _b) p->m_score = (int)i[9].toInt(); p->m_rating = (int)i[10].toInt(); m_peers[p->id] = p; - if (p->required) + if (p->peerType == PeerType::Required) requirePeer(p->id, n.endpoint); else m_nodeTable->addNode(*p.get(), NodeTable::NodeRelation::Known); @@ -867,13 +875,13 @@ void Host::restoreNetwork(bytesConstRef _b) } else if (i.itemCount() == 3 || i.itemCount() == 10) { - Node n((NodeId)i[2], NodeIPEndpoint(bi::address_v4(i[0].toArray()), i[1].toInt(), i[1].toInt())); + Node n((NodeID)i[2], NodeIPEndpoint(bi::address_v4(i[0].toArray()), i[1].toInt(), i[1].toInt())); if (i.itemCount() == 3 && n.endpoint.isAllowed()) m_nodeTable->addNode(n); else if (i.itemCount() == 10) { - n.required = i[3].toInt(); - if (!n.endpoint.isAllowed() && !n.required) + n.peerType = i[3].toInt() ? PeerType::Required : PeerType::Optional; + if (!n.endpoint.isAllowed() && n.peerType == PeerType::Optional) continue; shared_ptr p = make_shared(n); p->m_lastConnected = chrono::system_clock::time_point(chrono::seconds(i[4].toInt())); @@ -883,7 +891,7 @@ void Host::restoreNetwork(bytesConstRef _b) p->m_score = (int)i[8].toInt(); p->m_rating = (int)i[9].toInt(); m_peers[p->id] = p; - if (p->required) + if (p->peerType == PeerType::Required) requirePeer(p->id, n.endpoint); else m_nodeTable->addNode(*p.get(), NodeTable::NodeRelation::Known); diff --git a/libp2p/Host.h b/libp2p/Host.h index a13705927..72a39fed1 100644 --- a/libp2p/Host.h +++ b/libp2p/Host.h @@ -47,11 +47,11 @@ namespace bi = ba::ip; namespace std { -template<> struct hash> +template<> struct hash> { - size_t operator()(pair const& _value) const + size_t operator()(pair const& _value) const { - size_t ret = hash()(_value.first); + size_t ret = hash()(_value.first); return ret ^ (hash()(_value.second) + 0x9e3779b9 + (ret << 6) + (ret >> 2)); } }; @@ -73,7 +73,7 @@ public: Host const& host() const { return m_host; } private: - virtual void processEvent(NodeId const& _n, NodeTableEventType const& _e); + virtual void processEvent(NodeID const& _n, NodeTableEventType const& _e); Host& m_host; }; @@ -101,19 +101,19 @@ public: bytes data(Session const& _s, std::string const& _subs) const; private: - std::unordered_map, Reputation> m_nodes; ///< Nodes that were impolite while syncing. We avoid syncing from these if possible. + std::unordered_map, Reputation> m_nodes; ///< Nodes that were impolite while syncing. We avoid syncing from these if possible. SharedMutex mutable x_nodes; }; struct NodeInfo { NodeInfo() = default; - NodeInfo(NodeId const& _id, std::string const& _address, unsigned _port, std::string const& _version): + NodeInfo(NodeID const& _id, std::string const& _address, unsigned _port, std::string const& _version): id(_id), address(_address), port(_port), version(_version) {} std::string enode() const { return "enode://" + id.hex() + "@" + address + ":" + toString(port); } - NodeId id; + NodeID id; std::string address; unsigned port; std::string version; @@ -156,17 +156,20 @@ public: CapDescs caps() const { CapDescs ret; for (auto const& i: m_capabilities) ret.push_back(i.first); return ret; } template std::shared_ptr cap() const { try { return std::static_pointer_cast(m_capabilities.at(std::make_pair(T::staticName(), T::staticVersion()))); } catch (...) { return nullptr; } } + /// Add a potential peer. + void addPeer(NodeSpec const& _s, PeerType _t); + /// Add node as a peer candidate. Node is added if discovery ping is successful and table has capacity. - void addNode(NodeId const& _node, NodeIPEndpoint const& _endpoint); + void addNode(NodeID const& _node, NodeIPEndpoint const& _endpoint); /// Create Peer and attempt keeping peer connected. - void requirePeer(NodeId const& _node, NodeIPEndpoint const& _endpoint); + void requirePeer(NodeID const& _node, NodeIPEndpoint const& _endpoint); /// Create Peer and attempt keeping peer connected. - void requirePeer(NodeId const& _node, bi::address const& _addr, unsigned short _udpPort, unsigned short _tcpPort) { requirePeer(_node, NodeIPEndpoint(_addr, _udpPort, _tcpPort)); } + void requirePeer(NodeID const& _node, bi::address const& _addr, unsigned short _udpPort, unsigned short _tcpPort) { requirePeer(_node, NodeIPEndpoint(_addr, _udpPort, _tcpPort)); } /// Note peer as no longer being required. - void relinquishPeer(NodeId const& _node); + void relinquishPeer(NodeID const& _node); /// Set ideal number of peers. void setIdealPeerCount(unsigned _n) { m_idealPeerCount = _n; } @@ -216,10 +219,10 @@ public: void startPeerSession(Public const& _id, RLP const& _hello, std::unique_ptr&& _io, std::shared_ptr const& _s); /// Get session by id - std::shared_ptr peerSession(NodeId const& _id) { RecursiveGuard l(x_sessions); return m_sessions.count(_id) ? m_sessions[_id].lock() : std::shared_ptr(); } + std::shared_ptr peerSession(NodeID const& _id) { RecursiveGuard l(x_sessions); return m_sessions.count(_id) ? m_sessions[_id].lock() : std::shared_ptr(); } /// Get our current node ID. - NodeId id() const { return m_alias.pub(); } + NodeID id() const { return m_alias.pub(); } /// Get the public TCP endpoint. bi::tcp::endpoint const& tcpPublic() const { return m_tcpPublic; } @@ -231,7 +234,7 @@ public: p2p::NodeInfo nodeInfo() const { return NodeInfo(id(), (networkPreferences().publicIPAddress.empty() ? m_tcpPublic.address().to_string() : networkPreferences().publicIPAddress), m_tcpPublic.port(), m_clientVersion); } protected: - void onNodeTableEvent(NodeId const& _n, NodeTableEventType const& _e); + void onNodeTableEvent(NodeID const& _n, NodeTableEventType const& _e); /// Deserialise the data and populate the set of known peers. void restoreNetwork(bytesConstRef _b); @@ -241,7 +244,7 @@ private: unsigned peerSlots(PeerSlotType _type) { return _type == Egress ? m_idealPeerCount : m_idealPeerCount * m_stretchPeers; } - bool havePeerSession(NodeId const& _id) { return !!peerSession(_id); } + bool havePeerSession(NodeID const& _id) { return !!peerSession(_id); } /// Determines and sets m_tcpPublic to publicly advertised address. void determinePublic(); @@ -302,15 +305,15 @@ private: std::shared_ptr m_nodeTable; ///< Node table (uses kademlia-like discovery). /// Shared storage of Peer objects. Peers are created or destroyed on demand by the Host. Active sessions maintain a shared_ptr to a Peer; - std::unordered_map> m_peers; + std::unordered_map> m_peers; /// Peers we try to connect regardless of p2p network. - std::set m_requiredPeers; + std::set m_requiredPeers; Mutex x_requiredPeers; /// The nodes to which we are currently connected. Used by host to service peer requests and keepAlivePeers and for shutdown. (see run()) /// Mutable because we flush zombie entries (null-weakptrs) as regular maintenance from a const method. - mutable std::unordered_map> m_sessions; + mutable std::unordered_map> m_sessions; mutable RecursiveMutex x_sessions; std::list> m_connecting; ///< Pending connections. diff --git a/libp2p/NodeTable.cpp b/libp2p/NodeTable.cpp index fad9e4958..dca7e3011 100644 --- a/libp2p/NodeTable.cpp +++ b/libp2p/NodeTable.cpp @@ -38,7 +38,7 @@ const char* NodeTableAllDetail::name() { return "=P="; } const char* NodeTableEgress::name() { return ">>P"; } const char* NodeTableIngress::name() { return "< NodeTable::addNode(Node const& _node, NodeRelation _relati return ret; } -list NodeTable::nodes() const +list NodeTable::nodes() const { - list nodes; + list nodes; DEV_GUARDED(x_nodes) for (auto& i: m_nodes) nodes.push_back(i.second->id); @@ -135,24 +135,24 @@ list NodeTable::snapshot() const return ret; } -Node NodeTable::node(NodeId const& _id) +Node NodeTable::node(NodeID const& _id) { Guard l(x_nodes); if (m_nodes.count(_id)) { auto entry = m_nodes[_id]; - return Node(_id, entry->endpoint, entry->required); + return Node(_id, entry->endpoint, entry->peerType); } return UnspecifiedNode; } -shared_ptr NodeTable::nodeEntry(NodeId _id) +shared_ptr NodeTable::nodeEntry(NodeID _id) { Guard l(x_nodes); return m_nodes.count(_id) ? m_nodes[_id] : shared_ptr(); } -void NodeTable::doDiscover(NodeId _node, unsigned _round, shared_ptr>> _tried) +void NodeTable::doDiscover(NodeID _node, unsigned _round, shared_ptr>> _tried) { // NOTE: ONLY called by doDiscovery! @@ -214,7 +214,7 @@ void NodeTable::doDiscover(NodeId _node, unsigned _round, shared_ptr> NodeTable::nearestNodeEntries(NodeId _target) +vector> NodeTable::nearestNodeEntries(NodeID _target) { // send s_alpha FindNode packets to nodes we know, closest to target static unsigned lastBin = s_bins - 1; @@ -611,7 +611,7 @@ void NodeTable::doDiscovery() return; clog(NodeTableEvent) << "performing random discovery"; - NodeId randNodeId; + NodeID randNodeId; crypto::Nonce::get().ref().copyTo(randNodeId.ref().cropped(0, h256::size)); crypto::Nonce::get().ref().copyTo(randNodeId.ref().cropped(h256::size, h256::size)); doDiscover(randNodeId); diff --git a/libp2p/NodeTable.h b/libp2p/NodeTable.h index 66e27084b..ffce243f2 100644 --- a/libp2p/NodeTable.h +++ b/libp2p/NodeTable.h @@ -40,7 +40,7 @@ namespace p2p */ struct NodeEntry: public Node { - NodeEntry(NodeId const& _src, Public const& _pubk, NodeIPEndpoint const& _gw); + NodeEntry(NodeID const& _src, Public const& _pubk, NodeIPEndpoint const& _gw); unsigned const distance; ///< Node's distance (xor of _src as integer). bool pending = true; ///< Node will be ignored until Pong is received }; @@ -56,13 +56,13 @@ class NodeTableEventHandler { friend class NodeTable; public: - virtual void processEvent(NodeId const& _n, NodeTableEventType const& _e) = 0; + virtual void processEvent(NodeID const& _n, NodeTableEventType const& _e) = 0; protected: /// Called by NodeTable on behalf of an implementation (Host) to process new events without blocking nodetable. void processEvents() { - std::list> events; + std::list> events; { Guard l(x_events); if (!m_nodeEventHandler.size()) @@ -78,11 +78,11 @@ protected: } /// Called by NodeTable to append event. - virtual void appendEvent(NodeId _n, NodeTableEventType _e) { Guard l(x_events); m_nodeEventHandler.push_back(_n); m_events[_n] = _e; } + virtual void appendEvent(NodeID _n, NodeTableEventType _e) { Guard l(x_events); m_nodeEventHandler.push_back(_n); m_events[_n] = _e; } Mutex x_events; - std::list m_nodeEventHandler; - std::unordered_map m_events; + std::list m_nodeEventHandler; + std::unordered_map m_events; }; class NodeTable; @@ -123,8 +123,8 @@ class NodeTable: UDPSocketEvents, public std::enable_shared_from_this friend std::ostream& operator<<(std::ostream& _out, NodeTable const& _nodeTable); using NodeSocket = UDPSocket; using TimePoint = std::chrono::steady_clock::time_point; ///< Steady time point. - using NodeIdTimePoint = std::pair; - using EvictionTimeout = std::pair; ///< First NodeId (NodeIdTimePoint) may be evicted and replaced with second NodeId. + using NodeIdTimePoint = std::pair; + using EvictionTimeout = std::pair; ///< First NodeID (NodeIdTimePoint) may be evicted and replaced with second NodeID. public: enum NodeRelation { Unknown = 0, Known }; @@ -135,7 +135,7 @@ public: ~NodeTable(); /// Returns distance based on xor metric two node ids. Used by NodeEntry and NodeTable. - static unsigned distance(NodeId const& _a, NodeId const& _b) { u256 d = sha3(_a) ^ sha3(_b); unsigned ret; for (ret = 0; d >>= 1; ++ret) {}; return ret; } + static unsigned distance(NodeID const& _a, NodeID const& _b) { u256 d = sha3(_a) ^ sha3(_b); unsigned ret; for (ret = 0; d >>= 1; ++ret) {}; return ret; } /// Set event handler for NodeEntryAdded and NodeEntryDropped events. void setEventHandler(NodeTableEventHandler* _handler) { m_nodeEventHandler.reset(_handler); } @@ -143,11 +143,11 @@ public: /// Called by implementation which provided handler to process NodeEntryAdded/NodeEntryDropped events. Events are coalesced by type whereby old events are ignored. void processEvents(); - /// Add node. Node will be pinged and empty shared_ptr is returned if node has never been seen or NodeId is empty. + /// Add node. Node will be pinged and empty shared_ptr is returned if node has never been seen or NodeID is empty. std::shared_ptr addNode(Node const& _node, NodeRelation _relation = NodeRelation::Unknown); /// Returns list of node ids active in node table. - std::list nodes() const; + std::list nodes() const; /// Returns node count. unsigned count() const { return m_nodes.size(); } @@ -156,10 +156,10 @@ public: std::list snapshot() const; /// Returns true if node id is in node table. - bool haveNode(NodeId const& _id) { Guard l(x_nodes); return m_nodes.count(_id) > 0; } + bool haveNode(NodeID const& _id) { Guard l(x_nodes); return m_nodes.count(_id) > 0; } /// Returns the Node to the corresponding node id or the empty Node if that id is not found. - Node node(NodeId const& _id); + Node node(NodeID const& _id); #if defined(BOOST_AUTO_TEST_SUITE) || defined(_MSC_VER) // MSVC includes access specifier in symbol name protected: @@ -202,14 +202,14 @@ private: NodeEntry center() const { return NodeEntry(m_node.id, m_node.publicKey(), m_node.endpoint); } /// Used by asynchronous operations to return NodeEntry which is active and managed by node table. - std::shared_ptr nodeEntry(NodeId _id); + std::shared_ptr nodeEntry(NodeID _id); /// Used to discovery nodes on network which are close to the given target. /// Sends s_alpha concurrent requests to nodes nearest to target, for nodes nearest to target, up to s_maxSteps rounds. - void doDiscover(NodeId _target, unsigned _round = 0, std::shared_ptr>> _tried = std::shared_ptr>>()); + void doDiscover(NodeID _target, unsigned _round = 0, std::shared_ptr>> _tried = std::shared_ptr>>()); /// Returns nodes from node table which are closest to target. - std::vector> nearestNodeEntries(NodeId _target); + std::vector> nearestNodeEntries(NodeID _target); /// Asynchronously drops _leastSeen node if it doesn't reply and adds _new node, otherwise _new node is thrown away. void evict(std::shared_ptr _leastSeen, std::shared_ptr _new); @@ -247,7 +247,7 @@ private: Secret m_secret; ///< This nodes secret key. mutable Mutex x_nodes; ///< LOCK x_state first if both locks are required. Mutable for thread-safe copy in nodes() const. - std::unordered_map> m_nodes; ///< Known Node Endpoints + std::unordered_map> m_nodes; ///< Known Node Endpoints mutable Mutex x_state; ///< LOCK x_state first if both x_nodes and x_state locks are required. std::array m_state; ///< State of p2p node network. @@ -333,13 +333,13 @@ struct Pong: RLPXDatagram * Minimum Encoded Size: 21 bytes * Maximum Encoded Size: 30 bytes * - * target: NodeId of node. The responding node will send back nodes closest to the target. + * target: NodeID of node. The responding node will send back nodes closest to the target. * */ struct FindNode: RLPXDatagram { FindNode(bi::udp::endpoint _ep): RLPXDatagram(_ep) {} - FindNode(bi::udp::endpoint _ep, NodeId _target): RLPXDatagram(_ep), target(_target), ts(futureFromEpoch(std::chrono::seconds(60))) {} + FindNode(bi::udp::endpoint _ep, NodeID _target): RLPXDatagram(_ep), target(_target), ts(futureFromEpoch(std::chrono::seconds(60))) {} static const uint8_t type = 3; @@ -360,7 +360,7 @@ struct Neighbours: RLPXDatagram Neighbour(Node const& _node): endpoint(_node.endpoint), node(_node.id) {} Neighbour(RLP const& _r): endpoint(_r) { node = h512(_r[3].toBytes()); } NodeIPEndpoint endpoint; - NodeId node; + NodeID node; void streamRLP(RLPStream& _s) const { _s.appendList(4); endpoint.streamRLP(_s, NodeIPEndpoint::StreamInline); _s << node; } }; diff --git a/libp2p/Peer.cpp b/libp2p/Peer.cpp index a8b4a993d..04be52c57 100644 --- a/libp2p/Peer.cpp +++ b/libp2p/Peer.cpp @@ -38,7 +38,7 @@ bool Peer::shouldReconnect() const unsigned Peer::fallbackSeconds() const { - if (required) + if (peerType == PeerType::Required) return 5; switch (m_lastDisconnect) { diff --git a/libp2p/Peer.h b/libp2p/Peer.h index 1cf9cd778..703466ccf 100644 --- a/libp2p/Peer.h +++ b/libp2p/Peer.h @@ -58,7 +58,7 @@ class Peer: public Node public: /// Construct Peer from Node. - Peer(Node const& _node): Node(_node.id, _node.endpoint, _node.required) {} + Peer(Node const& _node): Node(_node) {} bool isOffline() const { return !m_session.lock(); } diff --git a/libp2p/RLPxHandshake.h b/libp2p/RLPxHandshake.h index a11f26f0a..337b259ce 100644 --- a/libp2p/RLPxHandshake.h +++ b/libp2p/RLPxHandshake.h @@ -66,7 +66,7 @@ public: RLPXHandshake(Host* _host, std::shared_ptr const& _socket): m_host(_host), m_originated(false), m_socket(_socket), m_idleTimer(m_socket->ref().get_io_service()) { crypto::Nonce::get().ref().copyTo(m_nonce.ref()); } /// Setup outbound connection. - RLPXHandshake(Host* _host, std::shared_ptr const& _socket, NodeId _remote): m_host(_host), m_remote(_remote), m_originated(true), m_socket(_socket), m_idleTimer(m_socket->ref().get_io_service()) { crypto::Nonce::get().ref().copyTo(m_nonce.ref()); } + RLPXHandshake(Host* _host, std::shared_ptr const& _socket, NodeID _remote): m_host(_host), m_remote(_remote), m_originated(true), m_socket(_socket), m_idleTimer(m_socket->ref().get_io_service()) { crypto::Nonce::get().ref().copyTo(m_nonce.ref()); } ~RLPXHandshake() {} @@ -104,7 +104,7 @@ protected: Host* m_host; ///< Host which provides m_alias, protocolVersion(), m_clientVersion, caps(), and TCP listenPort(). /// Node id of remote host for socket. - NodeId m_remote; ///< Public address of remote host. + NodeID m_remote; ///< Public address of remote host. bool m_originated = false; ///< True if connection is outbound. /// Buffers for encoded and decoded handshake phases diff --git a/libp2p/Session.cpp b/libp2p/Session.cpp index c20b39c45..7cd187bfa 100644 --- a/libp2p/Session.cpp +++ b/libp2p/Session.cpp @@ -76,9 +76,9 @@ ReputationManager& Session::repMan() const return m_server->repMan(); } -NodeId Session::id() const +NodeID Session::id() const { - return m_peer ? m_peer->id : NodeId(); + return m_peer ? m_peer->id : NodeID(); } void Session::addRating(int _r) diff --git a/libp2p/Session.h b/libp2p/Session.h index 4d9a12a6c..1d3400ccf 100644 --- a/libp2p/Session.h +++ b/libp2p/Session.h @@ -65,7 +65,7 @@ public: bool isConnected() const { return m_socket->ref().is_open(); } - NodeId id() const; + NodeID id() const; unsigned socketId() const { Guard l(x_info); return m_info.socketId; } template diff --git a/libweb3jsonrpc/WebThreeStubServerBase.cpp b/libweb3jsonrpc/WebThreeStubServerBase.cpp index 11dae47cc..036378e7c 100644 --- a/libweb3jsonrpc/WebThreeStubServerBase.cpp +++ b/libweb3jsonrpc/WebThreeStubServerBase.cpp @@ -525,19 +525,7 @@ bool WebThreeStubServerBase::admin_net_stop(std::string const& _session) bool WebThreeStubServerBase::admin_net_connect(std::string const& _node, std::string const& _session) { ADMIN; - p2p::NodeId id; - bi::tcp::endpoint ep; - if (_node.substr(0, 8) == "enode://" && _node.find('@') == 136) - { - id = p2p::NodeId(_node.substr(8, 128)); - ep = p2p::Network::resolveHost(_node.substr(137)); - } - else - ep = p2p::Network::resolveHost(_node); - - if (ep == bi::tcp::endpoint()) - return false; - network()->requirePeer(id, ep); + network()->addPeer(p2p::NodeSpec(_node), p2p::PeerType::Required); return true; } diff --git a/libwebthree/WebThree.cpp b/libwebthree/WebThree.cpp index eef2c199e..a88b1b6ca 100644 --- a/libwebthree/WebThree.cpp +++ b/libwebthree/WebThree.cpp @@ -128,14 +128,18 @@ bytes WebThreeDirect::saveNetwork() return m_net.saveNetwork(); } -void WebThreeDirect::addNode(NodeId const& _node, bi::tcp::endpoint const& _host) +void WebThreeDirect::addNode(NodeID const& _node, bi::tcp::endpoint const& _host) { m_net.addNode(_node, NodeIPEndpoint(_host.address(), _host.port(), _host.port())); } -void WebThreeDirect::requirePeer(NodeId const& _node, bi::tcp::endpoint const& _host) +void WebThreeDirect::requirePeer(NodeID const& _node, bi::tcp::endpoint const& _host) { m_net.requirePeer(_node, NodeIPEndpoint(_host.address(), _host.port(), _host.port())); } +void WebThreeDirect::addPeer(NodeSpec const& _s, PeerType _t) +{ + m_net.addPeer(_s, _t); +} diff --git a/libwebthree/WebThree.h b/libwebthree/WebThree.h index 4d095b87d..ac4f0b45f 100644 --- a/libwebthree/WebThree.h +++ b/libwebthree/WebThree.h @@ -62,11 +62,14 @@ public: /// Same as peers().size(), but more efficient. virtual size_t peerCount() const = 0; + /// Generalised peer addition. + virtual void addPeer(p2p::NodeSpec const& _node, p2p::PeerType _t) = 0; + /// Add node to connect to. - virtual void addNode(p2p::NodeId const& _node, bi::tcp::endpoint const& _hostEndpoint) = 0; + virtual void addNode(p2p::NodeID const& _node, bi::tcp::endpoint const& _hostEndpoint) = 0; /// Require connection to peer. - virtual void requirePeer(p2p::NodeId const& _node, bi::tcp::endpoint const& _endpoint) = 0; + virtual void requirePeer(p2p::NodeID const& _node, bi::tcp::endpoint const& _endpoint) = 0; /// Save peers virtual dev::bytes saveNetwork() = 0; @@ -79,7 +82,7 @@ public: virtual p2p::NetworkPreferences const& networkPreferences() const = 0; virtual void setNetworkPreferences(p2p::NetworkPreferences const& _n, bool _dropPeers) = 0; - virtual p2p::NodeId id() const = 0; + virtual p2p::NodeID id() const = 0; /// Gets the nodes. virtual p2p::Peers nodes() const = 0; @@ -147,23 +150,26 @@ public: /// Same as peers().size(), but more efficient. size_t peerCount() const override; + /// Generalised peer addition. + virtual void addPeer(p2p::NodeSpec const& _node, p2p::PeerType _t) override; + /// Add node to connect to. - virtual void addNode(p2p::NodeId const& _node, bi::tcp::endpoint const& _hostEndpoint) override; - + virtual void addNode(p2p::NodeID const& _node, bi::tcp::endpoint const& _hostEndpoint) override; + /// Add node to connect to. - void addNode(p2p::NodeId const& _node, std::string const& _hostString) { addNode(_node, p2p::Network::resolveHost(_hostString)); } + void addNode(p2p::NodeID const& _node, std::string const& _hostString) { addNode(_node, p2p::Network::resolveHost(_hostString)); } /// Add node to connect to. - void addNode(bi::tcp::endpoint const& _endpoint) { addNode(p2p::NodeId(), _endpoint); } + void addNode(bi::tcp::endpoint const& _endpoint) { addNode(p2p::NodeID(), _endpoint); } /// Add node to connect to. - void addNode(std::string const& _hostString) { addNode(p2p::NodeId(), _hostString); } + void addNode(std::string const& _hostString) { addNode(p2p::NodeID(), _hostString); } /// Require connection to peer. - void requirePeer(p2p::NodeId const& _node, bi::tcp::endpoint const& _endpoint) override; + void requirePeer(p2p::NodeID const& _node, bi::tcp::endpoint const& _endpoint) override; /// Require connection to peer. - void requirePeer(p2p::NodeId const& _node, std::string const& _hostString) { requirePeer(_node, p2p::Network::resolveHost(_hostString)); } + void requirePeer(p2p::NodeID const& _node, std::string const& _hostString) { requirePeer(_node, p2p::Network::resolveHost(_hostString)); } /// Save peers dev::bytes saveNetwork() override; @@ -182,7 +188,7 @@ public: p2p::NodeInfo nodeInfo() const override { return m_net.nodeInfo(); } - p2p::NodeId id() const override { return m_net.id(); } + p2p::NodeID id() const override { return m_net.id(); } std::string enode() const override { return m_net.enode(); } diff --git a/mix/Web3Server.cpp b/mix/Web3Server.cpp index 94ed3f85c..e6d670720 100644 --- a/mix/Web3Server.cpp +++ b/mix/Web3Server.cpp @@ -44,13 +44,19 @@ class EmptyNetwork : public dev::WebThreeNetworkFace return 0; } - void addNode(p2p::NodeId const& _node, bi::tcp::endpoint const& _hostEndpoint) override + void addPeer(p2p::NodeSpec const& _node, p2p::PeerType _t) override + { + (void)_node; + (void)_t; + } + + void addNode(p2p::NodeID const& _node, bi::tcp::endpoint const& _hostEndpoint) override { (void)_node; (void)_hostEndpoint; } - void requirePeer(p2p::NodeId const& _node, bi::tcp::endpoint const& _endpoint) override + void requirePeer(p2p::NodeID const& _node, bi::tcp::endpoint const& _endpoint) override { (void)_node; (void)_endpoint; @@ -87,9 +93,9 @@ class EmptyNetwork : public dev::WebThreeNetworkFace std::string enode() const override { return ""; } - p2p::NodeId id() const override + p2p::NodeID id() const override { - return p2p::NodeId(); + return p2p::NodeID(); } p2p::Peers nodes() const override diff --git a/test/libp2p/capability.cpp b/test/libp2p/capability.cpp index fffc43c40..4b0682038 100644 --- a/test/libp2p/capability.cpp +++ b/test/libp2p/capability.cpp @@ -73,14 +73,14 @@ public: TestHostCapability(): Worker("test") {} virtual ~TestHostCapability() {} - void sendTestMessage(NodeId const& _id, int _x) + void sendTestMessage(NodeID const& _id, int _x) { for (auto i: peerSessions()) if (_id == i.second->id) i.first->cap().get()->sendTestMessage(_x); } - std::pair retrieveTestData(NodeId const& _id) + std::pair retrieveTestData(NodeID const& _id) { int cnt = 0; int checksum = 0; diff --git a/test/libp2p/net.cpp b/test/libp2p/net.cpp index 7ab8d00cc..e39825918 100644 --- a/test/libp2p/net.cpp +++ b/test/libp2p/net.cpp @@ -159,13 +159,13 @@ BOOST_AUTO_TEST_CASE(requestTimeout) return; using TimePoint = std::chrono::steady_clock::time_point; - using RequestTimeout = std::pair; + using RequestTimeout = std::pair; std::chrono::milliseconds timeout(300); std::list timeouts; - NodeId nodeA(sha3("a")); - NodeId nodeB(sha3("b")); + NodeID nodeA(sha3("a")); + NodeID nodeB(sha3("b")); timeouts.push_back(make_pair(nodeA, chrono::steady_clock::now())); this_thread::sleep_for(std::chrono::milliseconds(100)); timeouts.push_back(make_pair(nodeB, chrono::steady_clock::now())); @@ -385,7 +385,7 @@ BOOST_AUTO_TEST_CASE(nodeTableReturnsUnspecifiedNode) ba::io_service io; NodeTable t(io, KeyPair::create(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), 30303, 30303)); - if (Node n = t.node(NodeId())) + if (Node n = t.node(NodeID())) BOOST_REQUIRE(false); else BOOST_REQUIRE(n == UnspecifiedNode); diff --git a/test/libp2p/peer.cpp b/test/libp2p/peer.cpp index 570c443ec..526388cb3 100644 --- a/test/libp2p/peer.cpp +++ b/test/libp2p/peer.cpp @@ -217,15 +217,15 @@ BOOST_AUTO_TEST_CASE(emptySharedPeer) shared_ptr p; BOOST_REQUIRE(!p); - std::map> peers; - p = peers[NodeId()]; + std::map> peers; + p = peers[NodeID()]; BOOST_REQUIRE(!p); p.reset(new Peer(UnspecifiedNode)); BOOST_REQUIRE(!p->id); BOOST_REQUIRE(!*p); - p.reset(new Peer(Node(NodeId(EmptySHA3), UnspecifiedNodeIPEndpoint))); + p.reset(new Peer(Node(NodeID(EmptySHA3), UnspecifiedNodeIPEndpoint))); BOOST_REQUIRE(!(!*p)); BOOST_REQUIRE(*p); BOOST_REQUIRE(p); From e371e8adb9789a78bb2bc0def30c5085eb62db1b Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 18 Aug 2015 20:06:40 +0200 Subject: [PATCH 3/3] Fix for resolving names. --- libp2p/Common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libp2p/Common.cpp b/libp2p/Common.cpp index d5811210d..e71a19fda 100644 --- a/libp2p/Common.cpp +++ b/libp2p/Common.cpp @@ -217,8 +217,8 @@ NodeSpec::NodeSpec(string const& _user) size_t colon = m_address.find_first_of(":"); if (colon != string::npos) { - m_address = m_address.substr(0, colon); string ports = m_address.substr(colon + 1); + m_address = m_address.substr(0, colon); size_t p2 = ports.find_first_of("."); if (p2 != string::npos) {