diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index cf38466fe2..b2676d8b6b 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -29,6 +29,7 @@ include_directories(SYSTEM ${OPENSSL_INCLUDE_DIR}) set(common_sources + base32.cpp base58.cpp command_line.cpp dns_utils.cpp diff --git a/src/common/base32.cpp b/src/common/base32.cpp new file mode 100644 index 0000000000..fa6c179649 --- /dev/null +++ b/src/common/base32.cpp @@ -0,0 +1,249 @@ +// Copyright (c) 2023, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "base32.h" + +#include +#include +#include + +// you might see a lot of the syntax a / y * x + a % y * x / y used in the code below. +// this is an equivalent way to write the expression a * x / y, but without overflowing. + +namespace +{ +static constexpr const size_t ENCODED_MAX = static_cast(std::numeric_limits::max()); +static constexpr const size_t RAW_MAX = ENCODED_MAX / 8 * 5 + ENCODED_MAX % 8 * 5 / 8; + +//-------------------------------------------------------------------------------------------------- +template // ALLOW_PARTIAL=false is faster b/c branches are trimmed +static void encode_block(const char *binary, const size_t binary_len, char *encoded, const base32::Mode mode) +{ + // this function looks complicated, but it's just the handwritten bit smashing operations for + // a block of 5 binary bytes / 8 base32 symbols with `if` branches inserted to exit when + // applicable. we encode bytes from left to right, from the MSB in each byte to the LSB. notice + // that when mode == binary_lossy, we don't encode parts of bytes at the tail, we return early. + // otherwise, when mode == encoded_lossy, we take the bits we can from the tail byte and use it + // as the MSB of the alphabet index to the last symbol. + using namespace base32; + if (ALLOW_PARTIAL && 0 == binary_len) return; + encoded[0] = JAMTIS_ALPHABET[(binary[0] & 0b11111000) >> 3]; + if (ALLOW_PARTIAL && 1 == binary_len) + { + if (mode == base32::Mode::binary_lossy) { return; } + else { encoded[1] = JAMTIS_ALPHABET[(binary[0] & 0b00000111) << 2]; return; } + } + encoded[1] = JAMTIS_ALPHABET[((binary[0] & 0b00000111) << 2) | ((binary[1] & 0b11000000) >> 6)]; + encoded[2] = JAMTIS_ALPHABET[(binary[1] & 0b00111110) >> 1]; + if (ALLOW_PARTIAL && 2 == binary_len) + { + if (mode == base32::Mode::binary_lossy) { return; } + else { encoded[3] = JAMTIS_ALPHABET[(binary[1] & 0b00000001) << 4]; return; } + } + encoded[3] = JAMTIS_ALPHABET[((binary[1] & 0b00000001) << 4) | ((binary[2] & 0b11110000) >> 4)]; + if (ALLOW_PARTIAL && 3 == binary_len) + { + if (mode == base32::Mode::binary_lossy) { return; } + else { encoded[4] = JAMTIS_ALPHABET[(binary[2] & 0b00001111) << 1]; return; } + } + encoded[4] = JAMTIS_ALPHABET[((binary[2] & 0b00001111) << 1) | ((binary[3] & 0b10000000) >> 7)]; + encoded[5] = JAMTIS_ALPHABET[(binary[3] & 0b01111100) >> 2]; + if (ALLOW_PARTIAL && 4 == binary_len) + { + if (mode == base32::Mode::binary_lossy) { return; } + else { encoded[6] = JAMTIS_ALPHABET[(binary[3] & 0b00000011) << 3]; return; } + } + encoded[6] = JAMTIS_ALPHABET[((binary[3] & 0b00000011) << 3) | ((binary[4] & 0b11100000) >> 5)]; + encoded[7] = JAMTIS_ALPHABET[(binary[4] & 0b00011111)]; +} +//-------------------------------------------------------------------------------------------------- +[[noreturn]] void throw_by_err_code(const base32::Error err) +{ + switch (err) + { + case base32::Error::invalid_char: + throw std::runtime_error("invalid base32 character encountered in encoded string"); + case base32::Error::not_enough_space: + throw std::runtime_error("not enough buffer space provided for base32 operation"); + default: + throw std::logic_error("unexpected base32 error code"); + } +} +} // anonymous namespace +//-------------------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------------------- +namespace base32 +{ +//-------------------------------------------------------------------------------------------------- +const char JAMTIS_ALPHABET[32] = +{ + 'x', 'm', 'r', 'b', 'a', 's', 'e', '3', '2', 'c', 'd', 'f', 'g', 'h', 'i', 'j', + 'k', 'n', 'p', 'q', 't', 'u', 'w', 'y', '0', '1', '4', '5', '6', '7', '8', '9' +}; +//-------------------------------------------------------------------------------------------------- +const unsigned char JAMTIS_INVERTED_ALPHABET[256] = +{ + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, IGNC, BADC, BADC, + 24, 25, 8, 7, 26, 27, 28, 29, 30, 31, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, 4, 3, 9, 10, 6, 11, 12, 13, 14, 15, 16, 25, 1, 17, 24, + 18, 19, 2, 5, 20, 21, 21, 22, 0, 23, 8, BADC, BADC, BADC, BADC, BADC, + BADC, 4, 3, 9, 10, 6, 11, 12, 13, 14, 15, 16, 25, 1, 17, 24, + 18, 19, 2, 5, 20, 21, 21, 22, 0, 23, 8, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, + BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC, BADC +}; +//-------------------------------------------------------------------------------------------------- +ssize_t encoded_size(const size_t binary_len, const Mode mode) noexcept +{ + if (binary_len > RAW_MAX) + return static_cast(Error::not_enough_space); + + const ssize_t rem5 = binary_len % 5; + const bool extra_tail = (mode == Mode::encoded_lossy) && rem5; + return binary_len / 5 * 8 + rem5 * 8 / 5 + extra_tail; +} +//-------------------------------------------------------------------------------------------------- +ssize_t decoded_size_max(const size_t encoded_len, const Mode mode) noexcept +{ + if (encoded_len > ENCODED_MAX) + return static_cast(Error::not_enough_space); + + const ssize_t rem8 = encoded_len % 8; + const bool extra_tail = (mode == Mode::binary_lossy) && rem8; + return encoded_len / 8 * 5 + rem8 * 5 / 8 + extra_tail; +} +//-------------------------------------------------------------------------------------------------- +ssize_t encode(epee::span binary_buf, + epee::span encoded_str_out, + const Mode mode) +{ + const ssize_t actual_encoded_len = encoded_size(binary_buf.size(), mode); + if (actual_encoded_len < 0 || static_cast(actual_encoded_len) > encoded_str_out.size()) + return static_cast(Error::not_enough_space); + + while (binary_buf.size() >= 5) + { + // use encode_block when we are encoding exactly 5 bytes + encode_block(binary_buf.data(), binary_buf.size(), encoded_str_out.data(), mode); + binary_buf.remove_prefix(5); + encoded_str_out.remove_prefix(8); + } + + // use encode_block when encoding a partial block on the tail + encode_block(binary_buf.data(), binary_buf.size(), encoded_str_out.data(), mode); + + return actual_encoded_len; +} +//-------------------------------------------------------------------------------------------------- +std::string encode(const std::string &binary_buf, const Mode mode) +{ + ssize_t r = encoded_size(binary_buf.size(), mode); + if (r < 0) + throw_by_err_code(static_cast(r)); + std::string enc(r, '\0'); + if (0 > (r = encode(epee::to_span(binary_buf), {&enc[0], enc.size()}, mode))) + throw_by_err_code(static_cast(r)); + if (r > (ssize_t) enc.size()) + throw std::logic_error("base32::encode buffer overflow occurred. this should never happen"); + enc.resize(r); + return enc; +} +//-------------------------------------------------------------------------------------------------- +ssize_t decode(const epee::span encoded_str, + epee::span decoded_buf_out, + const Mode mode) +{ + size_t byte_offset = 0; + unsigned char bit_offset = 0; + + if (encoded_str.size() > ENCODED_MAX) + return static_cast(Error::not_enough_space); + + // zero out resulting buffer since we only |= the buffer from here on out + memset(decoded_buf_out.data(), 0, decoded_buf_out.size()); + + for (size_t enc_i = 0; enc_i < encoded_str.size(); ++enc_i) + { + if (byte_offset >= decoded_buf_out.size()) + return static_cast(Error::not_enough_space); + + // grab next alphabet index + const unsigned char v = JAMTIS_INVERTED_ALPHABET[static_cast(encoded_str[enc_i])]; + if (IGNC == v) + continue; + else if (v >= 32) + return static_cast(Error::invalid_char); + + // write symbol bits to current pointed-to byte + decoded_buf_out[byte_offset] |= v << 3 >> bit_offset; + + // if we are in encoded lossy mode (default), then don't extend the binary buffer to write + // only part of a symbol, we can just end here + if (enc_i == encoded_str.size() - 1 && mode == Mode::encoded_lossy) + return byte_offset + 1; + + // step byte & bit pointers, and determine if any symbol bits wrap to the next byte + byte_offset += bit_offset >= 3; + const bool write_next_byte = bit_offset > 3; + bit_offset = (bit_offset + 5) & 7; + + if (!write_next_byte) + continue; + else if (byte_offset >= decoded_buf_out.size()) + return static_cast(Error::not_enough_space); + + // write wrapped symbol bits to next byte + decoded_buf_out[byte_offset] |= v << (8 - bit_offset); + } + + return byte_offset + (bit_offset != 0); +} +//-------------------------------------------------------------------------------------------------- +std::string decode(const std::string &encoded_buf, const Mode mode) +{ + ssize_t r = decoded_size_max(encoded_buf.size(), mode); + if (r < 0) + throw_by_err_code(static_cast(r)); + std::string dec(r, '\0'); + if (0 > (r = decode(epee::to_span(encoded_buf), {&dec[0], dec.size()}, mode))) + throw_by_err_code(static_cast(r)); + if(r > (ssize_t) dec.size()) + throw std::logic_error("base32::encode buffer overflow occurred. this should never happen"); + dec.resize(r); + return dec; +} +//-------------------------------------------------------------------------------------------------- +} // namespace base32 diff --git a/src/common/base32.h b/src/common/base32.h new file mode 100644 index 0000000000..63d9c39b0f --- /dev/null +++ b/src/common/base32.h @@ -0,0 +1,123 @@ +// Copyright (c) 2023, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/** + * @file Encode/Decode using Jamtis base32 encoding + * + * We use the alphabet "xmrbase32cdfghijknpqtuwy01456789" + * + * This alphabet was selected for the following reasons: + * 1. To have a unique prefix that distinguishes the encoding from other variants of "base32" + * 2. To contain all digits 0-9, allowing numeric values to be encoded in a human readable form + * 3. To normalize the symbols o->0, l->1, v->u and z->2 for human transcription correction + * + * Hypens can be used to space base32 encoded strings, and are ignored during the decoding process. +*/ + +#pragma once + +#include +#include +#include + +#include "span.h" + +namespace base32 +{ +enum class Error: ssize_t +{ + invalid_char = -1, // encountered invalid character when decoding + not_enough_space = -2 // not enough space in pre-allocated buffers +}; + +enum class Mode +{ + encoded_lossy, // when decoding, discard odd encoded LSB bits left at end of tail (default). + binary_lossy // when encoding, discard odd binary LSB bits left at end of tail. +}; + +// table of the base32 symbols, in Jamtis order +extern const char JAMTIS_ALPHABET[32]; + +// table that converts ascii character codes into base32 symbol indexes +extern const unsigned char JAMTIS_INVERTED_ALPHABET[256]; + +// constants in the inverted table that signal an ascii code is invalid or ignoreable, respectively +static constexpr const unsigned char BADC = 255; +static constexpr const unsigned char IGNC = 254; + +/** + * @brief calculate size of encoded string, returns not_enough_space if binary_len too big +*/ +ssize_t encoded_size(const size_t binary_len, const Mode mode = Mode::encoded_lossy) noexcept; + +/** + * @brief calculate maximum size of decoded binary, returns not_enough_space if encoded_len too big + * ("maximum" size because hypens are skipped over) +*/ +ssize_t decoded_size_max(const size_t encoded_len, const Mode mode = Mode::encoded_lossy) noexcept; + +/** + * @brief encode a binary buffer into a base32 string + * @param binary_buf + * @param[out] encoded_str_out null terminator is not included + * @param mode + * @return the size of the encoded string, if successful, otherwise a negative Error enum value +*/ +ssize_t encode(epee::span binary_buf, + epee::span encoded_str_out, + const Mode mode = Mode::encoded_lossy); + +/** + * @brief encode a binary buffer into a base32 string + * @param binary_buf + * @param mode + * @return the encoded string +*/ +std::string encode(const std::string &binary_buf, const Mode mode = Mode::encoded_lossy); + +/** + * @brief decode a base32 string into a binary buffer + * @param encoded_str + * @param[out] decoded_buf_out + * @param mode + * @return the size of the decoded buffer, if successful, otherwise a negative Error enum value +*/ +ssize_t decode(epee::span encoded_str, + epee::span decoded_buf_out, + const Mode mode = Mode::encoded_lossy); + +/** + * @brief decode a base32 string into a binary buffer + * @param encoded_buf + * @param mode + * @return the decoded buffer + * @throw if an invalid character is encountered +*/ +std::string decode(const std::string &encoded_buf, const Mode mode = Mode::encoded_lossy); +} // namespace base32 diff --git a/tests/data/base32/future_modification_protection.txt b/tests/data/base32/future_modification_protection.txt new file mode 100644 index 0000000000..eb672bb680 --- /dev/null +++ b/tests/data/base32/future_modification_protection.txt @@ -0,0 +1,249 @@ +29 sa +676f g7yk +9ecad1 q5shr +b6e93fd9 w5tq9w2 +50f8336253 db6be0pq +4491312fbeda 2p2qrf7852 +6c5013f1a4d8e3 hn2m36ha5bnk +8174a9b5ad1a3db4 ks4dqhhhb2852 +7680d6579e9d4e1f98 i4xhgu68qu3m9ex +154df1fc68edc264db65 rue9b9b27ymecw5s +f7a96a0495c8b13d74128f 88twtmau1r0q47xpn6 +a2c03c54bcac23074422eba7 tfxb0us6uknkinmr7iqk +6c6cb8697fd460ffd046a73742 hnwfk4f94nkj9tret65ta +0875d33c7d4511e835a4cd525136 mm47ejb72t28khha1ucsrhk +9d709c0df10f5c6ccf4d6f04234eba qu0c0bjnm7ie1q4hh6rrequ4 +3c7bbb9922ada878c967bead473a436c 3n75yecruwt3npf3y4wtiipbhk +0a2ec16ce5c31aeef93d4636f07c200bba m2ygr53s0ghi78c7205jx9mxmi7x +47a6fcbd261cdf6bb47b75c66ba5fb9ff25a 28qj1jcebqjwyhb5iybeycj5q91st +d397ab14b73c8b2c60f7b8b401193e33f6e423 4if4wssy3psp003yyr4xrec8ej5i220 +e84cc21f4606ffb5fc9a1fdb6d99da5bb8702ad9 7mega34ex595f9a4b9hw5ei4fi63xdw1 +f65771e554874a1a06d13f594d5a02cd6bfa222fcc 81fyb1dtk7smtmwn37gt4wkr1uu9t2nj1k +544d4f0c74ceceff7506a919e1f07bc671d0274c2a9c dnet8bbt153j872euag8b6b50107xc4gsdix +507ade097d9f31e4180dc1537ee915c2325baff5662eb2 dm7h6rf7q6082exh0scy742u021syf9ug0yfa +624f128e9061f768e636365c943278639f68cd1a9e4b9d43 gc3nsbtkg35wn1nwe1ic2gq0gijwnq24q1s14k0 +b8d7080aa3bea182180559a7cac11a1eedd040da96afce3c1d ybfkkruby4k0aexsfeq6uk24b5w7xke4p4y66jx7 +51f64a50ffca3281ea8e227f38fa110cbed365bd38fbd6c5bde0 d35att391212b4tiac9qn8knmp9he1h73b77hnh76x +d0552b1c225e898f33294ce6b9bcc58d10fb705e491af9632dd37a 4mdpw3mrf4a08g1ccqqfqjesnt2jw6r8cahjp01h4h7x +58bceb3dd89586b2c6a185a5bd7ec2164b55a98079373d363d7a0840 fr8iwji0pwbfsnumkwp549wrr1sufdgxja5q4hn7j2aax +a72b4ab6edae402953541653bacb86a38e218a4e16fcaf39edd08cf5a3 t6utuhyhu1xrpt4tr1c5up6eti3rbrpir58d8ijh4rejf20 +50d61ed95e0d0bb88668c25f9fac820195e31b9c6f768427645baf33e94a dbfm7wd8mts5nmq20cj19farxed8ee66h7522c5afiyq34dd +15cc3fa90761e4bb13878c41d0f7efae5fc93a361e74e313a1e388d6287794 ryeb9d23g3pfwa63nnx7m79ju1j6pinwb14iea7m6iahgdbypk +f4d1b147c1b4734c8ba9a60ebc0369aa0593bf967ef9b619cf73738f391ba3b6 8q25rn8mwn1t1r7ct03f0x5cu2r13j6wj565geijih108i25ti5x +3a31056f30a915c0b3e90b23cc6971bb0b9b85d6a22a343fe5c4c4505c2f29fbf7 320kd51kuad6mg9cmgn604fnygs1ymiwt2ub2j9s0qrsxymjs379i +854b4cb52e618f87476057074d3cc4c1d409e5a80cf7915ed43b42645feb9e8c5f62 kust1hcige30in5xd6bt4jea03dxq1h2mq51rywt3hme2y9fq4es80k +69a10cbe43e851a8a08ae25b95f1fe1f2d996ffae06e0f0218cf0299291105c3d92f4f hekk1jpb7m24n2ad6ch1f6j8b6w1p5946myx8xk016mcpd2nxym7pf4j +697804c9b4f49b321f0965bf10206a59e04c06712e883e4df2220c55eb176001a9ebe35b hs6xcpht8phqa30cgw9nx2bdf3ka0mqns4ab6qjpa2esf40ygxx4q49bfg +88ec44d871872df3f4cab8b4028b09c50544dce94a5f25aed0d1a552c0b2b593997721d174 nbwacwbnk6w937edyr4xsr0c0trtcy3cccjpffwk4epuskspwwc1p71m4s4x +1ec77e889ca7fb390c53790f86c5ee749b6a400e2517dd5d9a4cc2fe551867ae24243ff49771 b5by7ra6t97qpbrqja30hnjiiphwtkxiatf74yg4cqmj6u20g8yr2cm98pfyr +eb2fc2d99463b0a4c0e3e14e855dd0d23e376e1d32f68963361a8f5cfa56bc6930db36673e08ac 7gy6swgtgi0dck3b6s32dyik429bi5k7ef52p01wbd3u18pwyntqmw1wg69xnfx +e3c583caffac788bc29c5625a4c36542834ab642be3a186f10545bde1f17069ddfdc0523db150053 6jr03py9un62ykt6d0p4ck5s2dmtuhpry07mk50kdnh7630yx4i79yxsajhndxrq +c22630835721a0ea744137a704c296cc1bbafcdb5454d04eea04d579dca4f4239ab848f8e70f5096ab 02qbmx4yaekit7rme8qkcktw1kh5u9e5dndhxqydxqdyqysa8kn1uir29bqk8tawug +3ba7828996662c0b002eb99591d87b36a056a2a3dcd507eb361a14ee4043a36b9b71b8012e739985fcc2 3iq0srgwg0wxwxmiyed1bwb5e4ksh2ub5qdkj41wb2di6krbthu1w6h0xay33egs9qmx +cec9536feed2d637c05f395ec15d347a87507c9832867225ffc0b4ba04249651560293fccd3a5fce4ddc6b 15aue59i4ffbjkr93sjgryctjdbux9a0edb3acj90r4ftmmap12ugxtq9qeqty8icyiew +dd5067b6dcd7bf0623763cdba7c1500c20cffd43812228d4bb71dcf2c1dc6df3d6420f0b904d2d400500947a 5u2ejhw6489kg25w3qh4jkdkmkkg99dbkanrnus5i3ijski6hy17gkkjmi2a4fdxxtxc28k +63e3480c0c60fa6343a398fdc08818eaee93e82388a6621310eb8a27fd66b3a536a4a1fb12727dfc448f1f3eda gjntkbxggb7eek7bqb86mrx07fyc34mbnrqeaa0k7isrj9fewipqhcsm9gc3a9j62p3n8jw4 +fe3143373f7183cac63aa5ec25d9bcf48721d6ed933723f76ec6fa81b1402ed4cf2883a0f8e76305d77ee3229fb9 900teh19iem6unn4tywrfwh68pbpbuyhpg5p375i0572bgdxs5dg8dabtb6ii00s479ie2t9ya +87d8e2e9a9e954c6d9a7663f1a6c0a8206cfc837c35b1c54a441b9c83e7b6b2b181a83623ff5ece2ff43ad63648952 k9gis4hc7sdghwh3g09nt5xdk2bg9pmy0hhn0usa2e66kjq5hgunketbg299f53r97m4405anscx +2277913a8c6ee2131d0a18801132e08d6bedb21b499355555191b0a15ff5cbb19b0e352a450eb716e7140a343e86c788 ac51ritgh5nme32dbrxmrgyxnuu85gk5cecududnpe0dry9u1i01wbnuscrk7h0w66dxthm8k5b0k +83c072294f8b79c12ed9656639660ac487d5b716946d99f8a4b5c52e435f0b2d734c99df4979dd869f93f085655d195c50 kjx3addjnh66rfw1guqbp1kd0pb7fh0wpnw1q8sawyrp6k49mgwyeqa157ayqygeq8c9mmfsftgu0tx +ca75a9efec5edf5c0075eed05a55712abd49e3b00d9749569a3a6aebbeee04f86818d0e2c7f216d9d67049c13d0c525d90ac 1c44q59gf5ju0xbu752stufnsd8tq07kmwftput43cuiyjyixq6ekeek6fb9asw1410aqkc7mncs5asg +455e309df803aa3973de62a78c18b22f4c8ad7b9c58e2f6af6cc07cc0142158cc47b452da3e8aa5df29728b837102bf6e833bb 2ujbm3j0xiubp688gdq00esps7e2uu710w3r84yw1kb60xdrrweg284sswn8ndp78dfpnimyrxu9h4mqyg +a6b680f05ad90b9fcc7535626ad0236e407abedf3fb70a392e3b8d6dbd59db563dcf351cde7990eb0a23871c01fbd7123ef77d44 t452m6r45as19qbueuneutmbh1x3ujw9385ktici3iew5jd15hfb5q1ubqj3qa3fm2n0i3xm9jfnajyyjurx +8a28352f26ca9fa796fbe22adf71ba38d9ffc345015e81e816d799ebf65e0daaf4ae661cbf93ee654c66971d37f8c7c5064a208d3e n2tbdf1e1dj4jsy562uh86h43bg99k4sxsj2b4xw48g8y7p8mwujcfqebp9135qscnqci3cy9bb6dmpdareq6 +54692088c32fee581afc5208122fceb763ca61853b59e4f358c61ccb8dc09c443b583bf97dc47cc6487013f96dc5bde3e93277d3cc9a dntpmrebs9yskey6d2amaf8iw7n6t0gs3hg8c64000igybixqnrbwwm59s8629eecm0m38fh0w8834cpi9c61ek +695e168158930bcc5f8ce77c7c49d97de7820a7a11b4e927e4e4811713c392748168122bccba7127fdb747927d8a08ccd930c828c3d699 hsjmhxd0pgs60y6g67830pi1jyq0arq4re4ipc9a6pxnia8bpc42r4xpsjeft6c39w5tjaq7n2ag1wck1xtg3ut1 +ad2a3a307f0eb5e8cfa3d3243a4ca356cb86c7644eddc0f749fb5acb8b7d00b87031d43a0759a7188f7b5749ae1fee271cbfe3c677b1c07b utubtgb9m448nq7b4gpbtqsbd5s0hn5ac5i6m74c9hhgyr57xr63xgit32buqc00n77uiphib9yri3s96jb3jgixjg +831b133bf9b7f5a4d96f170582534d18670330d66be7af91a04a6cec6087d8217acae80664161029e4a88b73a8a452814dae8146656964a0e7 kghnei91w944cwfjr6r0at4hbmqkegewhjq49ahxccwi00a35xkyupy2x1pmgamc6pt2w672tnc2rqhiksbed4fatbqk +7700abe767c3994688f19eb8d8966e25ba91e69bd289cfd6b20a4f48ca0116d7eee03b7976cc92cf48ca7a0cea124d2c828e580aed527d6580f3 i6xdy1530igthr3nq46hnsqiaw7cb1t54da69uupmc3tnpkmr5f870m5js5g1awjcbs3tb3drcep1xtifxsi4tq7gwxje +3d049372a4438cf2937607eb329242e76e150d07d0a652a1540410d9955ca9d5b2f1645faa218f2472ca3e4407d87668976c270071072b0a0d154d 3trce6ua2iejsa5wx9uqsapr67ymdb234rqss2dtxk2hqsd6u3d5s6faf8urbb1aifsb6nx35m5ens5ga6x3rm1fm2endq2 +8dfc49f800451b1e613abf8adf5477161feac5568cb832321145c162c05b4e7e0927defa6f31584a8ae8eb13d902f117c5716cd40999566f03a203a3 ny8aq8xx2thn60c4y8sh8ubyr0j8undwnp6bagkn2yxwskr5c19xpc889cyqrwrdnftiwa81xf0njnfnhqdxqedwh6m4ax7b +d0eb29452e66eae125d2d7cf7ad78f935880b7cdb6aa077bab4a79440eb85081b8a6aab4907652df872d9d2bad8ddf8a5072de6d36391e55939c03b24e 4buppncig5uircip493yuu6jphg2mh8hw4uxi87fcc6t2bu0drx5ncudwp23gtw9k6w14d7hnyj0ttbp51wqgi28dwc10x7pc0 +2b3455ca1bce4c9e414fc31097ceee0b5b0bcd07200529bf0c0c42c962845c0ca9ef62b075a161cc0a75e2a68d493a6f8aa6647793aa68cb93ef4f2342c0 sg4sfpk511ec6kdj0g2cjqyimhhkyq23axrpqj0gmnmgp0tafkedq55rwm44r0igmc48scthca7e9ruegn513dq21ic88q1b2fxx +75025eeb584474d46f62a99b80018825c986bd9f43888d892e941a6aaf9dbec11a7b3b4c304b6e5ee7a75c4a289246f56913cede3a696caea3840348c68081 itms74402n4h255rueh0xxg2aya0hjg92ia25rcipkheuf67y5xnt815ck0aw5p868qu0pn2pcbjd42q15jbt4fgu4n02x4204x2r +6e4d538b55f64bd346ebff868c75b74ca10d07de67c86050a289c51f72298a9765474cb43fc6f0ab6cc04a43b599164c7385bb2222d4543bb2ea7eea05554115 h1eu3r4u81s7enyf98b207hycpkk4m88g9aextsrn3rn86ncndfwdn4gwk96h6sfhqxatk7uqafa066sygnrsurt3i1it9ydxudtrs2 +6c826d3257bd23b919a0184c18e894833dfacd704155bdd1aa553548f3ab16fa9ba25a97c8fa8b918b35f1cc5b41c4853bc2c3dacddeaa4456836e31042813447b hpme4gpyytn5pehxbmemn4atkg89uqfk2sd55thddt4tn67fr57cy2p4p9ajur6nng49bqr523r2di8r0jhg5yud2nf2e5nnxktmenb5 +e63395d1519cfb35936df715731629deaa9afd9e2472ffd6ca5cc2611d8756b932d2e4f4446984fe468136797d6866ef6c624df2b90526dd4d99400bea568d379027 6011ftdnqq7qfa5h86dyesnc54ucu9g8an1j9uwdfqmer3g3d46qstya8nreqm3824xqg8f7hmqi85brcy1fpmce5ue1pkxf7cf24h6ka6 +52890ef62a42815b61a5edab12e8e9ed00cf45a5ae7e1ae5f2bcc25bdd4c978f2b77d2024e28b3f981c94ab7fdbeea96b069ab197aba0802acdfc05a72ea9ddc1995e7 ddak77nd2dxuw0hs7wuns43c7txg8nhsu19mu1jpyqmsyydgp83pw78pxc3rng91k3atuh97y5uchgbcuggyuik2xdwh9kr4ifuc5yx1pyqk +ec3a0d83bd40b38d3477be77ef394b4ec63025b5d257ec9136f0a0ba615b0406bd4b9c71e204f969d2d9a57f6f7db24099df3ec098ce2c593d19de479424d1aaee38a1d0 7k7x5x772r104hbyy1588idfc5bbxchu4cf81acw8rkft0d5xkbf4p66i3nxc8fc4fg4d95jjw1amei935xcnqngfa8nqyp3pkphbdyi3rk7x +6d43a8754b8cffd4cc10175f30c0f4fdda663bb36f4346fbbdef8258af6c38e4ce5d6b2c9cac038d93092f4631bf747bc689bd06d3c697e06976364d689a269346c4ddf06b hum4k7dfnq97cqxkr7jqmk3t9yhegi7qh7mth87778msnf5g3bpg6yffspid0x6hpgap8nnny743yntcytbh3nty6mtyghphhrhrha4e0qi9x40 +ec4a66e91233a023d83446beb3ec309138c9975661e8f270bd3ec0b17ae12bac457c496f96c2743588e4996af11671f06bb12c0cee37483b972869ee15a557d4efe316d95420 7nseh42peikr3wmt249f35mkpa6gqs4wg3tja6s735xfr8ymsiwad9rch8fga7munbpcp4ynr109x47nskei6h423ifpk4jirwpuju3j6gfhpumx +3d04ddc0edfe5b4b150e34a9e31cf81bd83260d3c6b0090cc0172e26d75fd6961cd14e7d2047674f9eaa18cba708475067e3190503de34c565f0760a9cc5e85f3fa0bfdcbf7dfd 3trh5k3h91htws2iept8e330bjgba0eq040xpbexr6yrhu4944fm1tdijtkai14jq4umnp73mmbux19bbark3ynt0up9x7kdqqr8ky19tr971j579t +fb7a91be717bd864c4a636975412c9f85455b0e2d2a35664a9e19fcb2403410c301bc35d39a30d9c7899affe0a48e176c28fce1ad624bdc0093d29bd71ff430e376b4f0167198c71 9h7cbjqnjjgecnsee4fu2awc9mdsfg3r4dnug1sc6ej6wcxb2aebxe8bft64ebg6jrg499kdcbkyhktj10hhgcs70xaq4dh7i39tebnyhh3kr101nn0k +209c41937338271b6f54f995da6037a82389df93cf0d956300a0f64d8e2a456356430ff62c3a0ea8d5eefed599a8b8f3800103ebfd940d04afe873833e630e743d97989a81948b23d8 ariaba5q3xqnw54t9ed7t0myuxn0qy6q16e1d00xtb5a5bnd2unugk0j80wbtbu24yyj7ug1ur6j3xxmxju95sxhxpy8k66b31nk67m7p8gcuxgtngn7k +28597736d106337af427bf0c8e9d3530662306e9ec63ebf0621d4e8c9aa12166137ad77c7c645e95d4cb90a59b0f1619e76a458de4d5bf70570f5271d73e5d79084078fadbc653d1dead smgyihwnx01yu7m3y6e273cuemqremyc7nn8y6brbu321eumasqme8wyjn8e2ytu4qs1mcg5m6fmq15d2we8cuh9imfk8tqn469s48222m6juw8edj277f2 +f12eda2fc9906f85ae364dbd9681bdd6d0c77721cae3a2bc366bda08df39aae0facf3803efedb856340bfaf3b0510f716349b6940f9d3f3c8263e712bd4949c4a07ca5d175cd79ce17995b 8ayhtf8cpmy0ffnwcw81hxh7452gi71m1fn4sjmwhjhxny11ufkjuq10xjy85irweks9u67kda3yr04cw4dx93c93pme310pyuatqnsxjpp7r7ihj33mjed5 +a8ed382280551fbf5d854ffb9bc011680e116de946734b49f56f3a011ee31986ef80bb69881b32371d353215e078e8c125b94658b81a14d13bdd0a1d081149ddd5cdc80e0e4264289dbf04c2 ubwqk2txdtj58ygsc971ykxnhx3mr5jc211twpjuh67xr3ybbebi9xs5heamwgnybt4qasjxjbtgrch121gfkekt4a774rk7mx2tqyiu1yax6bprgktc5j0a02 +bebd14d2034e35d4a7c4c276e352fe1258bf4d77b4eb00801fdee70c97671e2de737563be12ada4608750108356b66410479c5e52d41cfb9a6e12ab1fc31b2bad244ce8904c0cf42966e4714a8 y48nctkbc047cc8a0c5iety8rcgf8qfywqukmxx955qk1s53b0w8ih4w3jkpuwpemm4krrmuhhqarmb10ypp4kijyeqirdun9k05siwp2q32pmex17mcg5p3rptx +33608121c856f8c6c4e683f632b356a92297aefee6fae16e2bd01b8de18cb5a593928dbb9e7622570dc824faafca5553812b540a799e82c7f46efbfbee26c59a1b3347f34d74f0ac93b837b7a722 ehk2r2i2d56ghn3ekj5bsg4wuancjfy8657ir5nf4xh050ggwwp13athyij3g2pymyarc8uj1cdu3xcfdks3q3tr094e789570qgfek5ehb9eqft8rwc3imyw8qpa +53b7bf69cada25c82cc7c552122bd18b323ae031870e8ab92fc4f649062e59f2b6a1ddd161458499d7c586f78cb0dfec572d30e2374e05648a7b7b0a5df8c89b6b1e7300dc29e6b2f17bbef6cbc828 di5584id52p6kfe30ucmad8nng1bu0mnk632uicj0q5apmnif31fh2i74sktfma149r0h76gwbj80u1hebnbiqksgps3w80dfy6gne5fb11kmymc641jr87885s6kdx +6a81a8a855a7fc622db8c95c6b1d8825486c57bdd596e8e6607fbd04c0bc12f5023536b8d8440926b01987f5b80df68bf5e4ac008ebcb3ed9b248c72ba95ff7338987f30d1f95fbc629e111fd299c7d8 hdx4ndrut98eafh01siew3g2auae0u774wfin1qxj88kcks6rf4kahcwybga2rcewxg0j7h0my52y7jaukx27jsq7whpcbbpydd98610qm9qmtj1f88es3knb9ccqn80 +2c8e6bf35ca20ec2e4f0a9931da7df43873f0214d32cc8bf065fdb8ff6b553908032928e959daa48e226611b546cfc4e05eb79d67b1da16fb769cab8fe3b4e0c44119823f56798f7558a4e8f71f29c4f07 sp3ey646t23gs13kuecn5c892ibq8xkt4gwgnj0ef9h097uudi22xgtpn4d15dp262qere4thq8a6mjfj3f3w3hmh85wqpu0907t6braregr37f3qb5ufrpin709s3rjx6 +9ad79c5e668e96dbf631d73adcd725d5404b997c904bd0fc564c01d0705080f85b6ae58077fa3fee819a0814bccc2c15f9eecebc7a72245f5dcc420ea648b5643fe4e839654002fe720ad022d220f4cac6a6 qff10yqen4fhy7nn467h1u1s4uxayef6pms7m9rwckx7x6rkkb6sw4yskm59tj9ikehxkss61kwmf8ji1483t6naf7i60kkit1afd1m96qtbp1dxxf93arwkafcrm7ed04qx +60c9a968290439b31333a6579b244f4708071d9334d87e153b53d474b57ee35680811b6d35f75d5387af4e80cc1b90ab8f303bfe5648b18e98ac59a033f9413ecb5421659749d06507fe14272285ba121d76f7 gba4p4mcxk65ea1qt1f1wcrj26axi3gqeqg36sc5djd3chf86hf2mx25ht49iydqk8yt7xegbi2dyb1k3j9sgpsnn4gd0whxej6trjwfdkkwfs4c4mpkj9kta6n2fikpbu5ji +fc55a9c3b6c33eda501e191760e5f19b2cd856a3065b68262d7bc80c631689274fcc436f282cc1bb5d3fdbdb1ad5f55717f412eb011ac5ec4b818f7cfc94a39a0a850a174ce5b5d83eb16708262063c6ad082e42 9nd4qk7w0g9httx8bafwm1jnqgwhkuubx1hwkcnhjjax000wnaqt9qrbh6tr1kh5ft97yw044y4uis9trfukrews7ns0bb569pdd3ekdktsmiq3swygb7gf3mxqrx08eutar6kk +10a123992a964782f7421a943c5bcca4033914f39f9a196d5992d2c342c421934ea50cd4be2bbad8757a7f2cc819e47e502669d024555d49ee4a41fc04865d92437802306cb6d9481fc952f1f207526ed925c816a5 rrkp3ecdp1b0s74rbddb0w8gtkmqps3qq8hmp5d1pfcgekwaaect7c2g4p9ryiw0iu738fe2b3p36tmeh32r2ud7c3yatkj6xpbs5apbjxmbx5sw5sam9pdp831xitqi5ap6ksus +1a75ce61280614ebe153fcac0375a1817429a1bd45099b82c591459c5f14521e656c67874e6e92a1f8676d6305e7730c037c4da225ab3af3ba96a3beaae427b32ff1cc89455606364a189f28b1edc8613dd1356cceb5 bc4660c2x0diy0dq9pwxe7hmks4rq2h72ta1yxwspsr10y0td2jed5b3k73e7aum9mqw400s671k0x56cwnrfd148i7ch278ufprjg1j83e2pndwx05atea9sr085pbm3y2qd5eiwt +77fa1f7210328cd7bc2843ddf4aa52bfa5ae761151e8f2bb7d94e0058ee621523788b2eceee68a38d46763e9321ab8c700721c236be9ddd1da8be184c06492b555729c7eb7dafd0bff70ad78e6851e0676b00bc45a2201 i97m86kkedehjjm22ji9cdppy8p467knd3tjsi57pqkxfbyeascbjrsp7qyihrn04nqw34cpbd6gixbpbknwy4i743h2y0ga0mpcshduidi37h849ts986shjbq2d3kei40xynr4a2xk +b86f33a2c3691b237638aee2f57446781bc5b99e401d3e696042d63377ea54077e7488402e4def03e700f6fbbe2d549dd2294746b483790810511153d01f6208a64fbcce8f4afc234ff505844f301777d106b2b02289ac61 ymyq32wbhahpe7n0u5njd7rejxh6fig82xiq64fx2ffbe79ddkby67a22xya550b66xjh878sudc5tnc27bfcx51mx2sradq4xjwarsec88g7b4d9knt972skn3qxs5y4abfsgmrnewer +8e9edfd77127c124d01254d199648dc283893ad5b032601ac86d1d87bc198f8e16528c3692622c8206e51d0e6985428497af9ef09a6605cfb7dbae57a7bea77ac17b76eb06b0a53f79fb79b824eb71d8b6d788bdd3a8bd006f n4jh9u5na9xpctxpdq21p1ah0dm0piwuwx1exew2hti0jjx1n83mgttge4ceafarx5pn4bqckum2cs7jq50ct1ks1857yfpyt89di8wmjh5iwmuktt9yq851yxpiw6i0w5f0njiqur8kx50 +a4f6fa357228d693c106295a971cbb6ca37570c1cf101e046d671e0e1558f7888bb5b5b029f55c0b4309ccecba3e6196b60d2ade8b060f23ff3a451373102ca59d06456ccd08f40b62ba6567198f5c504e490ba82e3954586a51 tq5jthfpsbfc3k2esshci3s5hpnyd6em162m6mbhg6jx6sd088a2yhhuwxt9dyxf2ga615s431k1hhkhsfj2wmkjaj9qtn2qig2r1cg7x1rw1q228kswsiqsg6g08yrkc1akydmi3sdsk4pn +cb9cab9136fa03f535224d52a1c246267c3975e79a6227782df855b5bb86160a07d80c86f074b581edcc35aa4df2be251f34fa29dd8e48c2842d54066ea93c5952ec65ac40e87c52d3d7a7b0d77d4f555944c429e7c8c41417e132 1iidyacw92m9dhcrcucdbkpea18bp7j3qcnri8mh9md5fi6er0sxjwxgk503chgm7yebfdph8d9rd31t92t75bp20drr4uxeh4tq0wdp7np40k32jnch3u73wbfy4q4ufsrg2dj31brm2s9me2 +f343b8c72aee8dc38719d6b069baec1010aadf7f00653d035f5600c55fb0c4f443bbf24da8fbc6f39217a8d472fca1b1b42019cf380f9d1ed9bbc857443ac316d41ee3fb7d627a2a7cf9ce50a7970ac0b8ebbc3aeb4f40d0c3f26124 8hm5nn1d74e63m01440eqiygrx2duy59xmpq4x49d0xgdy7k0q4a3i9pcwtjynyqp2f4nubp9pk5bhmxb33qkb67b5g5ypry2k7geswtb5n9w9frj2u318iidrq1irwxybu50iyfc7xhmk9pgapx +d3b5323ca55006ca9010b43c7ed1c86311a3c3405ed78d2f94077c6518f897698da5fb38c7b8254603b82fda0ac000a39e9663d0cdb446158b66d2b0d088c7ab63cc7ac27f5700de06499191f32ca1596da1360e609d4bdbbd4bd1f932 4i4qajssdxbguaxkwk837ti2gg243k4xf5f04f6tx78ede30p7t05cj53bb5kcdexi6r9wkd0xxd33twgj2g5hrerwswhtuk4ragjd5b1n7ga94yxbjxgpgnp31p12d1hwkqgbqxqus7yjdf436qa +e5718918f3957fa64d3642aa823e2f99d8c6dce40329a56068d59fb0bd4af04c9fd7e4b7c32e75889d8082746c2e27e5d230a0b76e1e01d798049bdc5454043534e83445892fb0c6e9bd94cfcfcd79282dff4768ef97a35470ee2fbe666c 6u00pe3qpu94gqcw2du2ajnjq3gghy3axgt4d0b24wj5mjdd8mec9u9aw9mp67g2qwx2a7bgs0q8ftnktr5w63km48gxce86dndx2hct7x4afrcjwbbiqjgt193648c2sy9ti43jp8nu263is89eg5x +9c9e7d404ad27d53b9220fa2f7d57a878ee63cbd59eb90c97b972f9ebd2cc6abdc67afe604bbeb72072fac8991dc0399b21f4061e2d9ac014e25527cd1859ae84b93f78f805ba2110b5b6f3a8f453d1e81d97f9cbc9d5cd19cc9884a3be668 qpj34krd4c8u3icrm8njjuf4k83igjs7f3u1mpf5p6y17jcg04u7017j60rfy45px6y41rgn5km1qgk92mk8swhgxs3rdtq64er1u4rfpj509xr5t22kww5j3d3tdj28k3gy93s6quihb3ecnmsby1q2 +0c9f908df4e8377ee924400ecb358df2659f2e8120f466caaf62bcf14123ef72848e319d6c85d80e04d419344120a15f3a6e74a85fa8dd9cabf46c566ee10b60abd3fc5475a5f81529b42e715e56822df4142596476d3ffdb6ef701b771b66fc mpj1mbjt7x5y74ca2x3gwhgh8cp18ftmab4ehpujgd8jrkcb7712cbnnquw2fwxixqdmphrmarku8iqiipts9de7qpu925rwh5kkw0sf4j8s27hs9xdpqhmiisjshxnh8kdrfsp3ht995hyjixhyie5e9k +06c6b489bee0488a34480dc98f52fbac2d192528c74cd87898d12ffe2268cd18718b9428ec8b4f9a6629da02dafbadf8a9f2920dbd763121f364389bfc603a6ed7fb94794f2fc4a164650e96f0747d047a3fde27772189b0bf3aba852af4367718 x5bfcrh86ma2thr2mya08ty5ukwnpcc207ehk8a04ay962q21tg3br6tsbw2wq64g0t7txw49iw9ndjpp2e547nna31w2ia59nkbt5wy9id3pq1j0pkw212ip503292aj2976c5yaea5mj14ydrpu7mwi6gx +ff1c7dc3fd6c9e07d43198f84afce9831f8086f9c68aa04c7c381007e38c9d2800cff04e0b878656ee90f10c02df85acce2a7600031b3f560a714169c8ef333ff6c028c654fe81a6a6e2667c9e26f90fc4505a5438e40896241dd7169899a5d469f4 96i35k97hpjxjumnqb6au93ckgj0mmy104sdxqb63x2xj06gqttxmq9kc0s0jmpw742jrbxr58r41qndi0xxee19d0s3rkfc1byqej9w0xtggu38keqdh0qejpjrh82j0n2stum06kacgcx746fcnehs4nt92 +ad9c76fab8824d4d115ea5d98c6b445ad6a4c3e50f5a1c5591b950c250fa2c622082f51b204e4c446eb08f99528c280cf86bd9f1eff19206a1e3d07061adf13d3eb73b3c829189dac3f540e441d917e7ef2d5d6e3fcc81e73745003e78f7fb116fb42d uwi3h8u0kcet4ad8tyg0044afffdck9sm7hm0ugnys2gat34snnrmxyubgka6qrah4029edpnktx18bf530896gpx4k83tbkgew9rjc8w67q1xtnn3hg37dx6nx7ps9376wu45n91px8ih4sxx93n795rsy52f2 +8d0a0eb34aeb9b8aaa2701998ce566f39e5b070123877d6650ed813b721a4871f08f7057886012c4204f7fbc35447a4c5c4d377d23c6e2193b0d3b60ca4711966cd5a4a9ded2754d4aad19f5608af3cf037c0a13bd50b93c8bc3425cbc485236f7850282 ntsx7g4d7ih0udn3xeg011fe8ijswm0maiby41pk7wxqw6k4cm09mb5kd8aexawaam3y9jmu2n7a0yrhe78p3nyrba7k4i5x1cbnbsqg4wpdqywpiuetuf218uk2u68jxh8xta77dr6q1r8b2cif0prpe550dxtr +0b89d4ee57f431c350227d700f6e04347f181652aa07473c0e40e48aeacbd35bc1ae544dfdf6c00dec02fa8fb166799abbbac21292324910cfce8218af67a04e57b6ce1339b703c1ed1dc63d6c8deacd2c995d609291f9aa4bbb416f0b40407b9c61d91e9e mia7c5py8k06etmrju0x85kaen9nksppu2btijxi2bp2u4wf4hh6bfptcy89hkxh7kmjub7ng161ui7402ccagpcrb367xk0u7q4xqpyw53meihyxjx843ie3uw254whspgu40app364tp752sykwkrxjiiebw28q0 +11e903a4cd0a20b37e552a0ce2f6f2ff9e5a815b8dd1acff2b07f0cc5b25c4b0c5e57697ff31c651afc39e8a8ee94ae70c83c40ff78fc18cd849c6df89120f8b000e8df113a9dc8b77bd50e80d8bf7ae95381dff727c498eab170b1b730dcee11ee6da2242ff r3tk3cehm2kfe9pus2eis7yp98jsuxd5ny24191fx90g0w1s0p0gf1fwp99qbnpnu9m17rti7ssiibab0k39jb8mnqgaqnw9nacx9r0xm4e9ra7c5psyjjdk7xe0y77ipt6m595pjna07d0ymghyebii6ajihwnr2f9k +5057d50ae8f7f3cddaa080bb2a8b4034ffca90e1bba9a81f66df4c9dc160018be6cce0cdae463d7ac9460eeab0dfdb467769efdba255da6b206e44efa64bbf1275e8f5b00a40e80844eda84dfe1c99a0ebe659d4ae940cdfd0fdf3e61dda6e8a51fb27411812e5 dmf7dry289165wuxkr7pur4xeq96ua3myit4k35e57ec5kfxxes8hq3x1wyagjf41sbx74uk59htg75c79h4aui4hgke6n3jt1s58aqu7b45xrpx7xaac5h2cy9m1ehx7jqsqusipkeh9t378jqm5wqinc29wc4mbxcid +66e85671d88315527f43db120a55fd02432fd92e41d2f98749de456255bfd3d63b6b8115e0ce874d47844dc07e64a623fe3f6b53d9357837620398d0b0d769e23eaf47ce53033b17662ae1b3f32d4301e337d55f3b5528527f9a1755a687a61863670ce18d05858f g5tsg6i0kgdua94b5gcxtuj7xcmp9wci23cjqm4c51rwauh94jfbw46mrykg7m4h28ra5kb8gpqr39n9hhc7phf0e7nx3eekwbfwq0n8u7b66t0b3gfwgdymwj1p4k0m6g57dy15dttsa964r7d4hm7ebmnwib3mntr0fb0 +98c916bc499ead641c7f868cc883a471bb58aac5138702b4eaf76758c5bf6ebefe2f0934f14bbc41b8cb447d83e672b85828764e335881a19c2ae48546b787999f00ce592fe72533738efb8c0c0727207fc1de5a4ce87f0054957b8e380a38f1fc7bb075d36806b945 qbanhjrcq4ww23b9k4egnx7aie7undwsribksh3d87qunnh9h49j6f0ceq0tyjrmybst29gb611fkwm2i13bewamteiru1as2450jeg9xb3spf93at1y3by5nkexic1xj9x76wpg7m9kxuauji3bkrn08383ygbu4htxhids +33c9415c49a6c5f4911d422badd8129d7bcbad52f24faecb05cf84c4323ddb0bd82c3a4251a23a66afd24a8eb7a6c1b85a85071196c999538ab7c101af36585114d9727106e04aeb0c398bdf289eb9aa129852b00cd274cc3dd8a9648fa05d2a7a98d1125a8cc4f39a6e ejatryrct5r9ca2722u45wxpqu76yfdp8c347p0s18rg2gn75gs7kfm42c24aiqeu9caubuyt5x5kwtsx621hpg1disfjk2mu65skt2t5s13rmyxcfuk0igf56tc7ihdrdgssgxg4c4g0ji0usp292r7sc7cnt2pfdegc664h0 +f44d604a3d53738b6f105738bc9f141998b3757969f55eb26ad3134be23e4d506c2c38f60123f6ba204e7f9faf1b0f3d4ccf484cb3ee1d8141fab0f62c1cb5dae56a77d4987ac04100405d408e2811ba05ebf87c787cfaffa7f3911bcac475905ca6816c678029c66aeea4 8newxpn7dh10w50kd66f130tbegfe7f1h34u7gqd4gcty0n8cu2e0fm080xp37u4am33937jbg3q4qejcmef35k7ksx9ug3wskiffwyshc57ceb40mxkxkr72r3rkah4xyu9k9b0jq7j9c9qpah6unbupmidhxfgg8xrqnqd74px +e54a68a0646c79d29e03b2cd9034c9a8afd80df03db6079f669461c8f8a3eec3abe7e69becf3b690de7d72c8d81fb3ffb0001c54cd70856fbdda2f0d9981b5402312d0b54819bcdcd983142349835f32211f2cce621566faec6e300c56307dd821337b84ee11ce7e64a36dba 6usen2bahn67s3kbwfe1xhecury7kbjk3w5xj35epnk6n8sb75m4y19eqjwj3htk518yspe0b8199gxxbndg46ash887tf0hqex5dkmbrf2fdpx1yqihqx0taha0ey1paajp1qqrruqju5biexesggb75xkqe86a702669qathw5t +1cc735c1b030672116e7fc2b0a35e9042c6888ceb27c0c2f9bb6d6d945ead3e69f16003423afdbf8079821af861574ff492d841228dbb11d56c059288f473b5e184d1fbcbdfd93a471fe5ca568f3067aa6ad4d924baa8e4f310f725375c4ff7b46bb09bb5bb1f1f4977282dabe bqbqfkhkemqprsy39kukthjcxkwenreiwc8x0f65w5fhpnjd4jqc8skxekn49w90x8grbf6eru4j8pchkkcrnw7nbufgxwc2n7bqwyk0ctj51jj7pip3b9p6tutjemq4t4wt5apfud3a8g2jiccyfn39jhbfwrh5fi09b7ayidmhujk +2ac628cfc7a91ddaf3231477b7a2f4ab80df438347a8f069262e4b1e39aba8205e18052ae78acbe006090425fb069c02a73f7d1f29183cc425bd6af7bf7329cbca7595fbe155b6423f814f779d861ee719c50ce12641cfba7f60f0d6ae2ec8984598784afbf8f440d6969ff50df1 sfbrnq83uai7u61brn55j2ytuixh8k6b28tjx4ces1sn6ihfuxks6exssfq0up9xx0ak2cj5x4ixsc19jtjppem60kp544yyy71pqp8diwd9y0duw1mb9xdji8i0g3y3b3rk10ce2335t95x8bfd6fw2qmr1k8rd9j6j2kewp4j9dbjn +1d8acf3e366e8cac0a8896c8d44aaeb36481937313326a4f02c942be1f68cb183ab79e8c8f65eb6684d2fe0fddb635cba9596d0ef955182394ed12876e24bdf8a3a040598a6ade69090fb351b31cc47ea29cb4bcf3334392abce9cd726112d082e390d2b6068dd36c6cc338e4cd6df bwsg8jnwh4ed0rt2p5ah2puiwhp2ba5qrg1etq0r1smf63521ggbuh68np3wf45ekqcj6b87w046ydd1ht3jpu20aidi4at3h0pf58sbtmxsqrqd51tkpb7qde1n1nb8tdifcj3qehm1sd8iqqfpgachmxybpbcfgmth4hwe1k106qew56 +04a9e399ba07c8af47704c13dbcd1db0bc699e66d0312750b04bf709e055ea598a21697d6a3f61e9d366d9e1a5dd5f8948105941bccb3ceb0aaa95374169191cfb4f8065dd3cf6ef90891ebfb2461ee0719c31541a50beac85abb32434dc91f51b4056cf3584c63250b4b66b3ed76c8f xpt83eh4x9ad8n5kckc7yq27wr8eq3qe4x0pitskcj5kq0ru7cg0t2fcjuub80jc4hqhq0hs5uj0ppxkfsx51p167gsduscy2stnp335c8xefyc685y1mr28y81ag3yxieibrux4dr9d1mhfwgpbcyan8thtxuwjewrgggpkwp5ewjwyhp3k +851714d96d0f3c0db0ff850d99fe7cd42d2846b5a07bcd3edeec2c8fad0add18d3e835c1c12306fdb6809262a3539b5b6714d39c8dfcf0e2e674c8486278a26ee9255b66200673624656bdfc9f63882820161ecc83a85ec551144f703e37aa5e0c1cbfa6c387c46f0b06b6fccd576066a5 ktfncwfhm68x5g39kte1q9q64kwpknuutm764jw87kw29f2d5tgh34mu03xpemy7w4xca0ubdihuw10t4ii2593k6fq3cpr2gc6da5ycauhwg2xeihnaguu79pjw3rm2axfm7qabumjgdt2tc70b6h7df0em1j7e0ib6250fx45j1qdygmqdd +11b7e67df5c692a4570e8eac4b2bdfab3a74e037a607402a9251c1c4eecdafd9ddb22f821b82e51b8c1033decddca05e89996a1588f6959fc1d9ea0e11f64cfa0becfa2ff6719d960a9b78ca268c2d7149e8515e9856f449eaac749ab0f4983e8634afaad74832b7251b846c4cefdfa68d2a re58g9ju04cd2u0in4wawd89ug73c0myt0btxdtpd3x6c5whu9g75gnjk2h0s125nk2b3ywh5pks7rg1h2d0n7tuq9x7q4kir35a18kf7q7r97qnqwfxue5012q20ffnc3tsryt0d54aq4ugiphfm7a034bbcf7d47absh1sbire0q3j58q24dk +1112ae6ffa60b69a5d5b9a5da640c9780f82e81c3537f46ac32c1be4d591a0321ada4dedcdd9831f0d0ff6e6bf297a82480cfae5e216a4a18d48f293ea54b1ca0982420a8171f5a269848d78a50772f505edb77e73323aa73411e6795f703b15d8dd261a060837c17ee76fc3367c02f682c069 racd6594gr5ctyd5qci4gkecjx30s4x6et5924wbskh8cugntx1muwph7ye7qx09mt39h1u9ss72apxg9fp8asuateetn6tq7cdfbpkckcmxuxfn8wneqmahjrpki6yuxyw5i9qqe27dihxn616u86m5rygh4ck4x0abjkf867y6ehq6xf52skbc +cd8539cb7da36f7b2435250391c0a7643fff4011366dc652a61a7b95cf9a0a9fdbca4a69f20687dee6cdbecd82f4eacabd40e1b2d91b71f89ef68033ecb021beb635289ee12428402f1d037396e913b297cc1ab095da91f3820fb56af6b80476c62e7028c593dae11929ed084fa2e6ac5fd2f79a 1wrqqp57thyywcmuatm1bks3gk998kxne1w6gtuebc71fq64mdj7yppdh31xhm8865e57qgr8qugujdx6e1hpe5n9rjjhxmq7p0rbjuwettc70casmxr832biifipa7pp9emugau5d293xkjwuujhixai5br66m20wc7u021s3wkkq7r64ws9tyyq2 +0acf918068008e4629ca06ddf344b3ef2492704405262a4a229d520b5984ea2d22a5953a4b7e1208c6182796728954229a76d8e17122418ed7238e60d0a6a8a75b1896f61ddced508181507224f6c26f3e08eb7808c13bee71b046e32b7cd89aeac4c740ae9f35dedf406ae3bf15c463704927adfa mf31bxb2xr3agdidx5i9ensq76pca6raxtqrtpnrqucxwwga72wpscgu3csy6ak200grjsqpnsdrseqw5bkyr2pmn5fp3bqx4rqdnc45brfjg3i67u22bxdki2pjhkqj30aiw8x20a7866hk25npw9e0qfugcn4xu4jqfyw92mui3j0u0nnyxpc3uy7x +5409471b8194a457a5b01fc47cc521b16374d43b429be4c4f4e067d02ea6f107d80a401c38f406d6c2a3311ead8c4dc975a652ccb9a0b3ea94efeb5320fb45d868ee5cbeae2900855af4d6c66680c7f6b2a18bd74fc142a504db77840a95809c781bbb2cf3a374b27763508f06f046cc60a681e4371e dkatie6mpppsjchkb9r31ncmwsnycum52dh8cn3t6mq7xfue8ab7krpxbk6j2mww0dnqr3uhnne6p7hedfefq2sq7ddi944qab7tfwb271if7fncxrruu7ew01q2mn9wwdk0yu4j0smddme5i8rxusgxqn6myi1g8inycgqygh228myk25eemctm6k5n6 +e2aa08e6beec89e319dba2ff349cf96e69a04a9e3eed58bc797f3274b21364815c35126e918e22d0ae11bf2b7f279e344b5ffd7040b9e84f0b77f9febdebe2a3e789a359cd330819dd55eab64f75c7afa8e2d47deea1bdfe499121115eac6b1e084037dd4500fe18280822c40c9e44d009391feba13682 6duxn1u87pa8eei5tf9qc331h1t4xpt835wunjb1j613cgkqgpxu0h2ph42062wku0258d59a8jb2p499u0amij2c6syj8j8yyu8s293nenuqqcqmxg74ujdw13yfn7jubnh29jite896pgnaa2u7fbfb0aaxh872txj6em2mxng2ba82q2xpi297ikqhxk +2dbcdd3b98f051bb723408f472720104426a856af63ca5be6ab3a9bacbef134bfd0dc1946811440ce8c3e6f7ec5f74cf6802f97e99a03ade1974afa739ee762c85d1035a3f79229b2a94e2a85b6d1e6295547a2cab991dfca537476d3102f14ad7cddc7624ebae2a1456f332d895f4e829b9206ef3acab90 sw8h4i608m25w6ntmb43a6kmxnmeumfd808dfjqdwit5up9jrhs94bimpntmrnxg7bm8h79gf74g84xr9s9cq2m450gycf7333y3gfas4amutj51adhpus3rumhw43qrpud3tfsfqai91ccy27wqrxyncff65ybwaqu46dktd51qswau8qtrqicxh5141d6k +04be67b1e91e0d90b93415f706ea1bcc4609d98d600f19b514bc0f8f18a0f2359949b52084b024042d89e88d02119b9c33057ac5acb32a81346d4dd828c3bb05c8893200714eab40668e71b9de38fe79fc20bd0114afa1a1bcdff50192a04137e4ebd95c1f280d3506daa517950f4940ead139b3a3ef4f3c4c xp9ejgjcb0e1mictry5kh4k51nbxqwghgx3nqh2tyk308esx8241pphuarrfxcxaswa8nb2rreh10g0sjfr41g1dka4e4qi0sbm5wmi2na1xx6diuhxehbqny3jbn9q19kkf4x2tu8k4bje98tx1s2rme9piywd6b6tx4h2e5dpnjs2jcsxiutc1win88q16ck +f16dd1cb3e9270784f51cf2283b4992f609ad372e81266f9bea2da19eeca2edc43134186176e1f5f090af4467ec615d68185bb60d56a50c35ddd0924ac3d96a11cb33cc6adda0e19618011903c616dff179f5b8cf0944357798c583cb679c5e6a88581b4b39a4ea8c20cfed517a9e9adebe6121408e307a3e103 8sw7bp18pc03kq4n16n23ha1s7kcut5p7xceh8h8tfhmq5wds5iaea4mk0fw6349masj2nq800d7hxgsyhkhd4pk0hi74rcauk81h226wg8ghfi4m0gwbxxnpx8er5j9r8juyb3kpnmui8ggfx8fg8is64t2fxhtwiha7dermq9hds7c7ew8y1kprkaiem7b6amk +47f22cbbdaf1c0fb2c6851fcf917e6bc03ae5dce46282b471857e1d375377e5c1154726d2c7de00e1c60ecf3098b0479f95f7c6994f0ff8ab3cfcd662cb7c45f667bad7f725326cc1e7329f9a4f433f5b70dba38b77ebc02d27e5832e970a4defa57d0520ddf11e57b4ff0c6ade605cc2f142cb441c480ab871280 291r1i8483xjwfb2d38jps9eykm46yii20trwn00d9k7e7cyj1imrubphtw350xibnki160cngr3q8d9jnt1c639nd169qfesp562y5ejiwy86pqa5em661c9epj2g9uw6e5tisyj48xstq8fx1ip6sa557sjtrpmyjnb1f5c90ghfjexyer8smgwnx6cxsfk6c2x +670676d47f96b6585bbdd563433d7db20cccd66d4ba8c7ecd56993b088bc5599d256af5cad0f426157bad67fba181cb57b2e15fb11937bc054bd26730ff9c28c5c997bf98700886b5b8ccd465c4d0b848db7c1e5738ceec7a8b268953b41230b0b199a933f49b3af3715cc7d3b9269e356381d9c7c24844b68ed3f1b g6b3hub9p45skw774untejf7w2eg1uqhcitgj5euhec5mrs6dwg7auujfpwk8kqmd87hg974bxifd81iry7nba550mdf4cqqm966sbr6qs79qm0xnmuuybeh21ia4r6anw56b1fqnqygjdsphrdqwkcbmgsnqetq37a53f1yrye34i6ph3nugix7qn8rcmrfhbwq8e0 +1da76cef9a29a24b6f319d9554bd2e38b54029e0f6e39f32b26e9ec3605828397eef5016685c5a16e2244b7dc8015b3f4b311c07ab1cff3b894d37321c8b00857ac3e942d5eb2029f0f7627b2dc044edcc319b08cbcce0595c54c108270dd6f2fcd348af79632dcc65afe5210dd9762a865140fff0a0233dcc2beadfbe bwqw1564senaw51nqwducjci3r4txdjx85n18guph4jge0r0sx6y754kr1ts0wkw62paw9i2xshq8p1nbkb4w3393iat4h1pbpskmmf40jttsujfaxt9m75rjgw6xn3h1k01wref1qkspyrt0aaribiw8f8hepsjjsnp5qbsu9pprbi1i0u2gtdx990dx2171ku8uy78 +c9b5f01961aca691d768ac9a87974ab9c81a06c5bdd649d7617c88f88c89089acda9b36e9b062b745144129e2dc245dc6dc798db1c141340f2c4cf37fb9d22f044d26241fab9f7e63b4e557dd5e7d3f616c56b2157c1305ecf75787ee687fdb0a1509c9218f2b3cb8ab840aa754e991bb2440a0e15b81384ce3767df4a78 1e49xefmupqcbu52uph2js4dy3amtmwsyyfaqu5mjpajnbacmrhg5dhqh4hkgd5tdsrms3nh0cr705i3qbhn0sxq2b1gcq1y9iips6ra4cnab8u189qbwqpujyd8jt9wr5rww2dy0a0s7q5ujm9ihm97wrkum3apbb1f3p6dymxdt7diqah5anxdm0d5ka6a105wjy4djx +479d0d77213588323f8dcfa0ac66d84791f4b606343d40053d96b0ad2ea0ea6863e1f5b7d026c94b7337a4241c2e1f0578f298ceeaa13e970c78eef85e3891da7bca9c3e60869b41674f9a9418cce4d9c93d2151f4c1b5475afd990b002d313dcaba6b0a79ed828f91ab555094bee73bd69e2df6063a65f89990e6d9c4fad0 28ik471mewabaj6h18kd01w02829chkeek8txmc7p40d4fux7cte30juw92rhpdfig542cx6s0jkd83pqb3iu2c8p6e3n5y0f06cbwq51dib60aeqhxwiq64pkgg11e11a8prtjt0e4tiwy7qaskxfcn3ysft40dj3w0sb6nuhdumss86677h3nh80bbt1j0qe2ihwia9f2x +abd792101aa76ee743999318117bd1099fca49d4588208a323d5fcabad5ae5f75a0c4700cc7b1224d19fd421133d2c0342e7c6b9904f9554db5cd7879119abbe37b63cfe9d1b95466acd4fcbd8ff318288bcb612ac7b8eb18208520a04e7a67f5c05483b1fe5768cc3e89c60e1406c00e2f9c0786eb9819f0ac07d98d0c54dd2 ujf1aax4t7yiik61pggmr88nmej6tpitfrmxn21b4y8dyfd46y5utbr3xbe3wana4ej7222q3twxeky30461xq6udqhu1u63pag4yjnyw08j7325pubeuqdj1jgj8ggrnr8fgaugji3fbxk2d2sxc17ej7ixdpm5b9pyhbeb7riem0dxhkxis8ixjmyfqxg9mfx35eek0ue7a +e2a41f8a2e2d09308babb3a47acbdec7063cabf35399ab9d9ee8e0340fa3f0d58b768db0c95631c5148d38812dc28c64ca8c77988fa406aee33cf88c9d631bd71a07963719766d530486fb3acc7df1b25391120eafd6b247fdafba6aaeeb911140ac13f5e58978b7a77b27cab64ff85445ae260713195f6aa7b6d9c787e116054e 6dpm9rnistaqmr7fwip3up8806bb1d9qdig4y3g87bkb2b7b8bd0w7thwbauggisrpeqnxch0deecptgi8g29cxeu5nq18agqunnyu04x8fbiefwhuckcmy53fe356hpdi2nabuj441aj9hjycud746nrsxd0a9u6waynh73jgq6uhpj9mdaffnex6cnpy5dt85hqn636afxdqk +4003ceb7fe1b6ef4d6195b6708d302dc50232a8a3908f01b1f95b7fa90f83673ca8a41b92cb751d788f6e626a723241604c435dce1a09910235c7c56577c5ee7ae4cbe6d2b3baf0f8a5828c9b52538072045840da9e6c52ea607297261cbc4e221b46f765c2099cf3d79a2d70b22fcda247b5196e10a88d27fea71a088850755970e 2xm67h98bhyjcuk1fhqknt0r5n2redtd3aajxe09pw59ua30e116urpmyawfitiynb5igcu3agpmgmeaeyiib2a1rxnu09rwd78s717icp9e4d15u630twm21e4pdix3amr02bhc65rp7ck3ss1ebp8a62k5255wfkkcqq17jenhir1r9qhr284np5kkurepj9u3b2a2ktbufs0i +91b706299dc326cf06b888f452411a157fe7ed59aa3212b27c9c7ed094f3407217dd850cd91a171637f6c31c6fdaa0e8b3f93509e0f4fc4b979cc3db6f33dbddab5d0c6a6fc30a153e884d5a006e49eb4fafdd6347d0408a1d728338c1c489c425bee2ddf9d6263dc27abcea245a702ae6cde824e26c31da8f68c4dbc973b09558a916 pe5kgdg70gqg8mu0nb4sak24ru98j5d1u21msgq6qn9hms3q2m1mjygsmqgnts0we95ge3bj5dking91eta8m736cif11k85h617yyhffteet58bm2dq7rrhf2xe6pjfc8y740434mx2t3fpkg6gbnac0kp570w793frgjirjd8itcr4ixuihqj2aqne0gi4n7tgcw8cii0cdwscr0 +115a0aa1afcd1d7b8c2b81c61268a03d7b86166ef0400ddf346cf22927bb51fbafac0d2b6a16d0600f52bdabf0fb88d297c5b6c1da7163bbf0591e024da02947706ef7b0477e57d8db7c3631e79e439d2026bd2956626a4a1b3a88a4ef31d23f5e7da93dcb0ca1b955a2b6a99624fd1c7ec70d06274aff064e9368b12c966c97ecead8c9 rshxu2hj1tiyybmfk3bma4sx3u70gsqi8mxx5y1thq1rpc75d3749fxhshumhtbxm7cf5d9k9iahss8sw5x7t6fbyj0sp3krcwkrpn5kh555xn58d9ghw9mwe3q16k67axqf4ddwgcuate14nrpi8gip37j35dc71gedbidutd5dqsna9ti37n0hx0qtu90ec4cwngcgp1wcj53d5bak +242374e6200b6a1389ad5ac9b98811ceb2ae399702693cf8589221cb8ff0a3be483eb32bc4df0de9578f7e6132703419a1c430d57d1a2bd92f3c79d5af794f43415b0cb55650fd77fefe47202d812feb969e5417ce7603bdbf01227b2970651c060b37e9075908b5c07fae734b0a9bd692064b6c87fdcf48e1d1bf9ce4ad152ccca24decb0 aknyc1nxmhum3rhhffa5qrxn141d6igyxctq18r0p2k6yb9kti9akjuqsjrh8bjcd83y60cpix4mq2iaebdy4enf5ayq08iuu76t8k4mfgefdupk9u5979p3axw0rf9fp4js2s8ii0m55j0mac7pp6bsbkbxwh9cx7gknhixj8y3ep0dqjfcampfhpb95q426325933autdp1qsrcywfx +b8a5e98a1c5c9f9154a30412949769d998658dacf2a7201374ceb2da8d173699826ee9ceec904b29cb64aaa549f0437ff7b08fdea17d06ee4d153f500bdf115336e8b1626a09300f219e363a219007edac615228b8f5a31379497935240adaede42538beb8289c65292ed3856fb2c5eb4d59fe1edda25d4166a83f6ea3aace78411a43b7f60d yrp8qrk6fpj1rusbxkcccs5c5egefbhg8dqpxa5t141hub2ye4g0a5yc15wcxp1c1hpducdc8mmy977kn9jdr92e71endj4kmjjnrt1w7r0wa4kcex3pb3nw32k1xm9hunkuads08wnne8dcja4p2rw47yprdis8yxtc01ccs5c0d57p0yut4wj8b5i4aydmg4tb85ubuf33kk242i59gb2 +579752581fa515642cc7273d360cce1d345c47485169ceef23fadf3642ffa0e548db254c404aded16f52aed317ab50bd5270f13752669ed48dc720fa113ef66d2801416f02956042591ae5ed76145693b12bc7317d59eef89cd7dbe2855c8ee76d9615284130f2ee34be97519cae7122b36001bc9851fc6b1ff91f176bee281306876f8dcf4483 d8fuawx9ttdw2fe3a68qgbeibt4s0n42dst6751b9fjqgky9tbptnw1scnxauywnh7cd7t0yuh2f4tqk8a5ua1t84pe6i234ra9jg5c2xsxw8xtugmmspeys7u5m2utqwau6igf7f3yjn3ey5jn2dyai67w1gsc22a0js5nty4fub3siianfe0xmypgsb9bfb96n8s5f70tmemt3h8e68nab +1ad28ce0e072079bf22c81c6bf388dcca63e97c8e588b478121bf16f19ac993dca9198ce19cf3a6ca25b7323f2bc720db52f98779be6e9fa20254b9643198397906807d1d50c7345c2508f2dab252d11ae14032e2adebf7b5267742f8f7164f8ecd145b7744b60a77ab042efd94e62c463601ffbc53dca819cfcf20477fc949f97fafefe54017b5b bfc2103xi2b1y6ngk3bf8iah1pqb7s826waf28xpbj0w8ehgqa86uag010g68iqgtchye29pyn1x5hcjqm51y1yc92krdp6w2gg03s6khxb7bu2gihr6atajswupdf2nu0dxefnd549ywtq3iky086fa9bwhrnhyinswmc54wmmi9wdigfree0x99jrq5ptmqq8jamby9pdc9s94959s2xf5fg +5c64ee213f172efce95986875a49e814806a76f54b5b3d5b91a45e1b08e4723a14542d7f129c46562a7072dad98c54aff46637b774c420ab26d3859cb595c8d905dbd487002f7197ae0a43f4864d0202b3cd8200163b71611c28a528953f8ae6a84c21cda4e4adab97282a77ca9736149f002498d7c9f555b2637a1ebfeecf09f336238a174204729b fnpi62c9r6yj14d1k4butpj2rpxet7yuchhq4w6ntnjmwr3ai27m2umhj6cc0npwsc03sww1nndd97bee85ycnmxugqh3mg6wwd6nw2s5jd2ixmjief46rpb8pba4xkrwje0axxw3h0wr3m2tttcdj6d64ta02ihtqpd5d6ysxu3jptye0dc8xmaqbf6q7duwcnyt3u9753kq61waismikkaidhk +894540f3c048797e2b5782bf4384a4793dd1a5919152d863369dec165575920e19954f6e3037d07cd0af19dbf5eda3c68cdb9d34d2b9353cb1ff43ad9dd8f628a5da99579149c1af480286d8da7c8b36874039e0cafe0ea4953b445e779c077826bde06076713c5734f61bc22d6d65e80cec2f540df7eaf64b83ba15e14bb6719b4e7c1746b11382084a nsrtm68xcm6y6d4ykd9t3msaja87bcgnpschk01wqywmgufup23mqsdjh00bjtb64rynqw9u7wn6hbe5qt4hsicu3p098k7hqygjgdss5dgujadc0eytkxte5bh31r1wk7xbq0ed903dcsc52nj3j3x3jxqf50bxi10q0u1t80h6affhgytx15mjdke9j4ywcim5tsjmci53be4ijkfthg2qk2aat +c90c9bf74bb88954ee22012bd655b5fc8018ed05ec0c2bf66edc921776e12d4f4af24841b0b9dcf2bf1e94476ad76e2e8a6a80bc20c87d9cd4eb803cd43ea339e760cf7526a645a98d68a6d562afe794d7e1c2e44bf3deea265bdf31c8a002531fa04a590415f728dd6c959062374b1c30fb8f9bbe25120d426d3beb89440cc1b7ae8f94bf350310cb3a39 1aecy74fyrauc5nrxau7guhu9pxmn52s7kery7qi5pcmi7ymsu3tu6p22e0fqy3py6jc2n5d47yr7rqdkr8rmpb7qqdiyxm64k9deij3gb3ydcue2wt044se4und916t49k6s1rf8jjitcp55606n2xrdgj4xpp1xkd9ide7hpd1x0nycgibm86jqi9rdakh2cwqy46c2kegbh7in8df8h2brbsqti2 +dc247cb7ff5ceedb7a161bfb4e11f4788160f53400fddbc54a324786e1ad436b8316a5c43764cfd5bf0d3b3287c1d337b19f598d426486fbccce94dfa3bbb12eef5ca416577fd5895ebfb83bcb21f4948f84f9421fbd98dc425a3778e942bbae16f16dfc3c2f56149d9f173701bb6916cfc9ad4c4ea02007760222d9b570d71b74e2ff3fb398aee2dc7fc3a0 5kp31h99fqyhw8kwbj7t6ajtjrxwm7ctxb87ynddecb0h0hh2hu0esus0k5wcq8uy6eqwgt303cqjgg9feeta1ae9jeg7se9ti75rfyjfppmgu594wau7j703jspb7atn8rjpkk9ywgh0kp4e76ipku5u0fjr5j63kyugsa7q6fqixh5hafg9phhcn3dx2x3i0mrswhuibfnw73r96953esi6fi39k7x +5d0c3e76c1b1f14b18bdc97b743b91ab49f20ab31f2c1445f20b8d0bcd205c0cefa8ec1b7c6c0cf413bddd8fa4074ea136563ef3bfd2cc890791f778d40b886e85f240349f3114102719cffff16667983fe7708a6d24a4574965babae1015ede34d32d6b08f9d1bb7783cb7cb8855ea9bc43d2ca0cba232c55e10ae5a6706219a402fa133f75c83ee7dc667995 fteb67wmw30twes71s7y2i6nuha9aruqb6wm2njpmiekyqcxfkei9d3gbh8e0b3tri875b7ax73drhpw35159twgnab1b7504ks0k5ts8cxbc31nrk2rieij990wg16039qymrqhappsipfsyd7irxd8504hefffmb67bi5ykjsy1iasf4t50k8p12eft21gdykku1heimnmqcxr92cq87i235q701q1pt +1f4633f52df3434d333d20c07d6c962fe5f2b6f2f3fd04b21857270c790f07a5e6078fa66688fd0902fb0a759b6cf55dd33833c85965fdd30d22c799eede633c8f6376fe82f9f803fd076e9cf4051f241a040f6a63669b48ce3cff9f0031cf278e79cee39b4e6e14e43c3a66c48b921bef9d402cf7d1bf05619c8735e51990783d774abd7d7b586a39b668b2d53b b7bb37ch8hmt4g17abx345aws9p9shyp8j8kcgk0d6qk082jx8p8gm6jt1q2n92cxf7kt7g5hq4u5t10ejasp1j74gepsn6175jeejajgh5j7xy19xm94m5iqq4xd31ab2rx84qbg4htnqn698jkxgija833qqybqh3e6s3a3k7ehnafp2h893dxsq57bj0sgei2ihjsbe23kjfycd8y4840h265g4sp4t7k +eceec718f0b4234dfa5dfb8cd013aefdf1674e9f727bde4758e293727e1bc833bd0651348c38db100ba872aa06db19d55b2f0091290b8ff5f21d5003dbe3c82fcdea1b7154ea57c71b4a3b28a3f6d0e8ea3de56b7bd0849fad9433acdcc9ecd1e3be409d474913be57afd0dc26715ff07227fe39ad7c3807e63bc3706d7466cad68f107677bedc55fd5a4798bf07bd 7qygie3kwknt58p79iehxa7i9y0wiqt9ic776n406dcya9k51x154mpnepebnw0kmit3sdke5gg7dw1jxr2ppr6j8y1m4txb5jn6kf8h72hyru3dd9bnwpn5srn9ht327288d4554rrc9fgteiwh1pjg43n56ka727an3jpyu92h0cqnf903ac983ewy0ix36076e6bhinqguutjrm53jjw6dy8utn60y6b54 +57ff0451b9b9b6d7a9ed4fce8262be1c5fff2be5221277da1fa8d17ccb3dab1163ffdd51381de4500adb193fa9bc5d74744b49b0ce21c12e3b0c4d69075fd3f078dd69ef1e0283af405ad6746846fd3d09b9ea1ba636dad4af4e319de303a0ca428e1d6f6cb902fb6bbcdf005e4642eb614df51383bf160c617675371a511a260377cc0f5399f82545cf065b64bbccbd d99k2th1ye5hjdjhc932a0u8bnj98d9sa2c3jwk9ub2y1p17ug2w3987da6m51rkmfhnpj7cyniy27rfce0g62ims07k0qfcx7j736b05ut883krkiytxwwwintah9c7me68te7ee5hhcf4ieei8ex7x1cm263fjhp6ks85fyqjkxype2fuwrqjurim58skggs53dh04dahrgx5y1k3u3ej0aur68mp5gp761j2 +2934fda5018b498ffce0acfafaee61367fad3b845f09b63f254c59a4dff02e8da3419041fdfc25296fccff1af5d9fcfd8aa5ed9fa34c52fb8932ff79e8192a6229c7a95f2146bb7ceddfb6beb9b12e7092f088c888de84057c7c72b436f8b3653873701b705f4f639a89d262119bc9a25db6360f48933c0f5eb0d136cc574e0218a138bf3f081ebcfba7fe37b025fd4bee sa4j5c2mnha0993xuq7ju5qme1944i6af6a5gj1scng4cy9ks4e4ekgk23890ccch9ej8eyu538j5rus7wj4eqrp9iaqs9517xgpt0nc08tu82deyh8i5y7wy465rfqkpf02npa254rxd9b6id4bh8sqgt63e6x5imjt8064n3ceaag51ens5hnwm7acejxjf40hrhwgd73xaesm3r9q8rx8yq74j9nywxp94p9i +392ee3b97e146c2dc186b905e0a49a8f3d73265ee23c1d6333e327f6f730285ca10c62f3cc3440dffe9047af74cdceab715e73d87c95e21e815d2a2741688354342b48181d70ac82644be201863ed391d4bb1a2fe15cef5023dca629b20b80ce476499387336f3899ee4b34d7a2257d93da25160afb5cbbeaece952570ebd5e68fac069ebd9355421095a3aae1af8bfee182 3ayi3if8rnwr5kgeyar8mca4n68yecp8628m401q6gq9h71ksmidrbbr8jeb2ke9942ajf5t1y3dw6d8ijg31sjrb4xu4dn32st2eumtshamk3fkupme2p9rxebb7t6n4p7ntf9mfqyux286t0t5ar6x11bwcec0ig5j3rg86p1t48nrd9gq52pngry5fp78u53cdcfk7jd8hb7gx4jf5a4u222cf27d6ey0y9ymk2 +7df882fc7f09fdaf0ca8dfd24eaa575bdfd883c513eb92cb4b6e338a28632014284835151403a24443b37448ec1919b70a2e911c2d2ce8080a1e8df1580d5e42849d363b3eef12bef9a96f2b96e309a43db7e4b39bd6e6749ca92edee64ba43d6a5251ad6cf026b3b60883d7134806a4bb7468e20195cf64a6fabba511ff744601b3b45be10faeb700d1f7e1046d533788147a jy62s9b9m3848bs259ca7dpyfjj7nx8srju1sp4fh010tdbbaxdrkpmurtdx32pa2i1y2p3gbag5irnipair4f32mxsm7bjnfxeu6ktaqt5bwjyjrd9jqdfjsifierha3w58cg6545q3c3scs5jigp7a3uusathhhq0rhg7wmrm7ia42x4pfw7b262x1fq5at57fyc2n974agxhqwnh8rb7iw6xhb79mxnwueh62rn7x +17c3336fc7541a7eb1df3e927595591d7a73f753afd214cc209da66c1d0025f5963e2f97ff3fd7d509d49421868939f48a7d34049f0e5d83dee2e334b69366572ffad3c15a03990e7483ec785920f8d2f9aceb81326f42751afbf24a1ecfb1b21df45679eddc97fccd85495552367e78387d418ec0130617b789acfdbb7576f8b5722e95fb1bf7c73e7b218e6610c2c992aa7fc6 r9mqe583dkh37gi934c3fsd1bu73374qu9cmcqmxqwqe032xay41gjnjp99q9u8um3dc22gena69crq7ekrc8bp7kjjis01tw4cwgu1j9fc6rwkbqa33cx9gjmgpm8ep9ewiyxcph7m3dey58csm7q7nw2i92uq17yicj9ehkuaudtnwj16bk9dmn5xmemkyw8a419h5iu5jnhfps4d9we9y0693w2gig02gspgpuc96g +c0d3f5d8b2cbc7b82034e5ca0b178b40fbe890be67d27b07c656731844930153ebcfade3de4b57c5f8f11d5182f0f7ea523ef6541feaefcf913e4ee1752112ac89518cfe2e2515e613bfd19fe4053c167a0b14a4637c77eb94d693a5ffe02f1aba187f2566f6070934c2b7f84bd373d5c88bb37c6913335620452694748b6aac02840c160360bd3cef8e89a68d347813739a0c66d8 0bc9fwsp1jb5k2mt6ysxws6f2b78nas8g9c3wm8ed11nknaqxsc8yq7h6jjawu8s9b0n4tgr8b58ttn881dm94yj182q6qymitknsfacdeej6fnsryqm3j8nq9pxdjxwj2snccbbjn58ysewpip990mjbd7mk91sg55xirct0d59kp8qijd6nr7qjntneg4wamrphsbtnhud0xtamkfxe0s73qy07rhent43ka5qq2eehwx +de3c9250e58061eb293f66407762eb41cf63c4f14c3defb7d6fa012a93ab79036daf33a433dc6451ea0786d901c1bb147243c63749adbfb37e7e517fd070cbc0c133bc662a79bdfe3f4f31ceb3e6e288848b70466dce8b37b741e08a38938d56020bde0b7d4dda5cf2a07df64f5590e2a12da9383681701ad4b72c847c666fc499a4a63d9458767fc189c3ad32941f7eb800b3e759fe 508cat3skmk8wdc9g1x3i0yf233w3n3nck889h8w92xpua7fjamw5f1qtk1701rn72b0hw2m0e7n26pb005tqfh9wh936tf94m0gykemei8egdq1yy9b8q1n1418h0t2kpsyxnqh14sqjh4m6rsbna6hd0mxyykfjue7ty3ptm89gq4upbndrfhc3x52r6x44p5p1mb6g1y6cehat0812wbwj9x0qk7heddm89u0xr18iwj8 +eb4dc3b4d4f86d2a54b02cdf69331636c9b87f80cd4411df72f657137569a5a9d104848dee3bc5beb9aab4e62f4bda698daba45209259e94c4a1c5c6f4eec1742e257d3dfb36d0b9822c62c47328a0eb2493bc9007635c1e463e58969c6e4950e730315fdb88bfa8a028aeb775140ad4fbf6d6c9b832c124fb53a29631bb924cafff59c269823bbe107c760b7a1ec7af5165624f1c27ec 7he63het9mwptusksqjwpg0we5a5k96x1urmby5p81fne7fctwt7rmaanyybynh8yeufc1njcjheqbhftncxpcg8pqrdbnie8qygr7miau8q581w4r60afbr0n1pn23fapc51ax3ghim6nn8frfc05pcdbqqxgd95iaf9dsxsryfi72tmfdjy7ww1e6bskca9hc4ssnnyica1f99f3meqxn5y02307kfj2jgjf4nguna83m37k +7e1aa54f55fe98ebfeaa7ccd7ca54a62a68fd6531876fd48ff5c3d5faf850a6835d867704411f792a7d4543ebc2c094204aeaa6365cf84fabf222405ae70987a1868f9f06bd6ef7dadb64a72db83aa845ced015d089ad643976e12b3a1ccbe00da3584230c0352f62d846e8a82922170cb36ec0666ab3cb1ea2a3d79506c3389310e97ee7abd2246f9493756074212739e31d7be3fd14119 j0hddq4u94giy9udjqey1cddgdq29upqbm5j4p39fk8u9f6smctbfwb3imrmb76pt9ds2ju6skatamsiucnwfq6a9d9pacxsu10ck8k0hb69x48w77845hpdifh03dtafqwkry22qffa3s5ird14bqs8xbhbfmmbmkmus7nhkny2uxtpas0gwhygx1qdwjsn72ub48dkhk10pg2ip9y3ujcr256tph4wx7mma668e3f56j8n2agk +c4f0c9a09f139a785c23a4a3eccc59c85963e2c8acc9ea41aa685dbc0ec2ba27521432e1f61ee6d585813c76c3103e413233c35001180700dbd5ed4dc74d910fb325e3b38073bfcd0f7dd22b0c9bc9b29dd3720357e011938c5c830aad7fdb51767ff74f5fbc250393e5496c7028e3cc941f6dbfb969310a9a983b57440022dc9b5b879983e713c82c878b62782e8c02a3f1ca08c0422a97ec 0q0gq2a9rih3kymbtpn81qr11mgw30w2uqa8tkhdhmi50bwry2quasmp635m71wukwxq07wbrx9argnq0h2xrex3xbh7f5dh07e1rb7qayn53xbqy9ek89ipsgecyphpqycyax4y6x213br6kgsd4985ds53974jf88rdx6q6uaw06m26jec235hy86wpg2dqdgbwu4axxnh1e45k8g0310q1xw2jr5rjxy20xub83sxnkrrsdf80 +9a69f93e8c59ab7fae8a9130e107660ef4d6cab044537a06e935e397a58f7ca50139eee6ebcf6ce8b637fed61183451773ff601486c73896718010121a525c2d4a483837f29a86ac629905a153f0c13ca94c58d697c80579191c151d0ed4ea0dcf225cb75b471b3188a4a237d0da8a337eee815af69f1b8d97bf87c4a74ad368db4fbf8dc1133e4e07a3987a561571c7451c82ce8dbcb65be6bc qct9pjtgfeuy9ftdpa0irm5em54hhpuk2ncytmyceyn1jcgjjppkriji65u68532w0597uknkhrni699gxd2hn10p100xaxpbccs0fddcx6bj6t4k4wese2stsc9mkc6usesnuty1xrype26rtik7u3dmy3paysyfhbnwgg2tpnbjte4n21y75tmff5c8e6hp890jns3cfcwnw4jy8e6ra18c0b43eb4d0dybn4sbpmg7bh6w1h8hjx +55bc312ef59ddcde95b74c251824b98f14eed9b308b962423c5494f04a05adc92e4391db5f4797c1587d214c4f93e293775cb406c020a283bcc897da640a7a0ad420d565b70e58879f224484e20425a0e3b67eddbce363e8fa7352e74b2888648b41906703d639bc675cf8e92f4e876a3e3e3f0587a419ddcdc50557dc61008062c0e8324d89638d6e76604ba09d2de60fac1a16293fad6ac2494e dw8brfyuqyih7shyckpnkcs1n6di7whqmr6wakn6dpdjxpksuyap6k6n5hjtjs8mfm8prqrjpjnce746wkbgx2srki8gns84gks3trwtabdwfh0ifrb182pakqnx2chx6i537yh66hn8n8qqdfqtwda2gpstbab3xjfbqjb3fq6ipf4ik7ub6jn9xwb42ei71yrkdu86gax2x0wx7x1a5rfbnuy3g0rftrip51kjukhmgdc9uuugapdi +aec8ec12ff0032492751a25961f0eb4ae2b59774e9ab08f112b8dcf8f34059bbbfc251f37ce0bab6e6eab14b2671197b1748ecad45c73fe45a81b2ea3cff976ba8074804c9caadadfc910880c9bede5d767caa09ea28b0cefcc4327c3ce2293fa32a465282ba23f8747f8eeb0b069ee82ca522249b3408475038be2c3e4b0b53c28081c67d693ca5b1448591301307b4932bf5d71dee52b85a97e374 u5ai0ay9xx1apc4ntcgwb63fcfnffs5t7eukn62pybijn64xfe759kpn8h8imiuw65ufrp1eiagyws427pwtfn196nh2bgyd3q91i472x7axcpiduww91a22kba57yp7i18dtrjdsr0g79eaec8b10nc38nptnppkd7r38btj83iwr0eq5tr1ccraphq2rr3dx6f6fm8cgsu3ktxk3b344c6tw0tcmgnexckjhaqsj47i3jidd6sus9bik +ff073bded9eed7b5be8bd72b9288982c583a709c916d4073cc32151e166442350cfa4b2ba7144152aced83845c323fc4aa85d82bb55d381489b064eb9e1f6b5182c7c20813ddc7f25df0cf072d744e845157683a37e4e8c71d8ea00c386ce2a7563e903c17bc368fa4db99a6659cc00ca3a934713032bc9db31148e4a2d9548fcbb0d3bdffa64da1cc07100a2e5e20977451efb284020978f93378fea6 96bqyyw175f5fjtf46u1sra0sngbt6a6pswtx68ge2dn6sqa224k18pfsiqn2kdpuqw03mr6e296cdts5xu5dyc0rpa5x13fq0jwwtgr09mxka87091s56ejx6wy2qtadsfwkiny6qtgi3gitxebk53rt7fb7am6r88bhb7a5ig4g1g60xed3dctia0bsja7wg2tn1sr5sd29p7k4i899cpht3exiaxds1jrms5td3y5smxrms6jpg5094qx +c58d051f0561332c4a411183205dc258feccf7bf0c0ea4b02879760d4ced18010daa0917cec7f3373c8ef1cb0fc93b0abe4c600def9157db67ac16e94626a99fc58cc143c319d1f7867009531a48bf0d4137006c532ffb16d91e6c606dcea85fccb565a0b1d1e11e2f53779d53dc3ec2a19789ba48248feeaf022e26334fd3a9f8b69526aa2f56183275803d21b73408ca1182cc2a87a2f853adbb6ef3ff 0wekd30sga1p0ppmrempxyirfb9g1779mk3dcgm2js5x4q3hbxxk5dkcr93gj61y3p3jbp0j1a7kujpggxe89ady5hq40syc20qdq38snqxt3k014350g6xcdghanj0h2a5kx5rqs97nhw28hnke5qu2f9efd1hxw328r3njdh514t8635mdbs6cycarcb9iu6mr6cnqc9c4q8swptqdtf4wbx13fxm7ae5q2redremg0dt3tf6s3fh5h5198 +e659299e0e1593612d5682aef9d70150a9ace6adeeab89fcf1334d7771bb29f376a167443e87858ea4f81dde1473232869af42dbf43655a07b6c6a50d7d79f4b6d89d269a5c88ec8094636c290d1c30fe0771ec06247912233eba686cc249a060e53fa863d49f3e953952fe34180c5fe71a328de3fc8b4fa8b0f582c6492093003db1e44e394c07fb6bc974a196aa33d23561dfd9ca27c68a823da178069fc 61gpq3kirwcwrfdwkdyjqu0mdrt411uh74u0q93neheyi6h5s31yh2f32k92jmgitq6m5yktignpk4hj2fh92hputm7w04pk49f18p5hn3ceqci2n5axpnnw0d2hbk0j6m5n7kbr282pag9ft4bg0ca4x03s38te3ua934dqpty8ekgx0y93b2125096nh34ng3ukfbap2aqxx85b1ri3sexj85f1s4dbsudejcbd0i953srjntdk284r8xeq9x +db1f75a16dea3d5d86916659dec05c797e08e233cfb72a3be1e3aecf04cee2afb5dd9a76220406d3283699b6b64ac74d80bac7f68947e3335f44d366618cf7bb5a4c143aaf5bc62cb2e0663e52f2bb9540521292fbc32a0b151782aab363402de5d71e0b1cdaa1cc675090cc1e4f9553b3b37a767423de8adc1d2f48c308dc723c2c5885de65f5edaac1ff6db785f6ef3b145f4cb79455101b1457fe7d2983ed 5gjyf2fh728u5mtng1g77kr6js9xn0nq185pti9m6iyg8mei6dy5fyg4i0nx2mwqsx5cqhuwcfbt5xs40952pn9behjtct5egeejji44ckdbuf4500wfs0be31cjsi6u2mcmsay50guxws2ykdufe04xsyp7i3kfbqhdbqb3dr2g03pjpuc53g54i14r3ytd5kip8pebmbi3ajmgfrr761ju7wugb95hw8r9h515rnjt1h6tdt2mwsry918pqx9h +6afa0e3ca4d4dc69bc9312a6be6e44476397ab67be94d0d5c577bd06e2982db0b7b4cb423093e9b2f652a9e589ef688b3fc2bd521ca8da002ecc820618fa3835d6798383e4339c9263baed2ba54760cbfc733748ad649b0d0773dd2d709042a152003c075dc57cee9f3e567be2435f40badc4c450f865032fa8caf8e464e3f9d312c1d56459714f3e4ffe1e4da664f5262ef5787c0585b48dd219b11a1a7dc3fd9 hf7x6jsa4qieqjaqrdqf65pa27n1jd53y4dhmuisi88kh0t0sw0fjhef220c34hp81cdq1gc77t2wj8ryucm1de4xxyg1xkebb7bkhiwjem031mqqpce3iyhsipti0ef9n1qipshgphk4m5q5twymarrtscxxjx3fyry15t931f3y0pbf7xfuyrg2t30gtmp9ded9bpec0914gcgbufafs0t8jpj90ja5cqa8tqr77f0jkr0fhah42g5rek4jym95a +6c00c8ba0e39d5ebe43a36c9ab45effe60080596866cfa270cc3f73ac265f8753dba0f5a34cac8ee3f1b2165e7531c8be8c2398a4297be21773fc6df1abffb106e4b6a495e8b43cbc25fa0fb1f92940437ec3f69c9afe311efd7eba4fe3b953937fa8a37ef3280a1c21ce40f4cba37d0b5f9f0648e5424460355c57628363a7f19009036f2b5e22be8487c4f16a45021e38f41b305ad0f8bf7dcf8801b653a164cad hkxgniki33d8y1m4e5a4wnjj91kxkmgwk1wjtc0g0j5qukqs9m4q5ikjf24gup3i36hpr1j3dgi2y4er3esass78as5q9nw9bd99wabichuapytf2js6ay7x9gj1ssxae9wb84icu9nnb58y7ipj6i6u3a59urny7612m2irbqpx8qs4e92ff8jkgp3s2crexhd6d7n2e0738e2xpx5jshjrsjtak9rjr4psx2jbn7x5emhhm8s9jy30kxhwdikwcpwk +4965ee3bbcd528fd9670d1f30131fd6a4cced4f13fc1149ed6b037ccd698e9762add2899242eb8c221d7c916b6b190d2404b0d27b64470ec46fa508a347d8425093d6e02e3cc2347c16b9b01e0af94d42cb6a20adccdd75d41db95ac995bc063e49b855501aa50cf68147710d686a8ffee28aba4328c454925db757df5b916343b3d6d43f30de2ab3aa1e55102b4d7e8a8b6e5f4c98f10e9fb47dd227ae4db254009c0 csp86i764ttj5sqk431krgj7hceg7u3n39xnc3wwwx561ut07s5ruyc2qapr7iera3f6psuwwe2hakrfmtq5gnbk7nbjttaden802c2c3uyxs08gahb6r465x3kd9setsp5darw61yfu4ki5pwwcpw8xgjpcymduxeusmq52rn5nmuteub986dsftk120ndcayhyd9juyafb2i17hum9ebjrug7db1dnxd4hj4s2w5p9cpgjrbt9wn87ac7icw1s2xa6x +48a7637c0d6900a7d7b0f13060aeee6694028fe9ebe0ebeaad34a80e2373901eedd0e4644169a4098cfca36523a7ef6e2213119d75ea29e56370833e9b96039be2c596f5d2edf4422d892174ed5108bb7d94722fc379b7ad489b3bdbf80c2c8e3f1120cfb5bc081c819377481cc536ef0d5ed766975e2960a487484f48c66c6f7f6e5498c31bc431005a24523ebfef05e14babc6ab0f7c00360f0563d5f06ca7ec813b52 crqwe9xhhaxdju7k8a0emfyig4dxsb9c7jkiy4uheptx625qpxji5t3agnxwqcxcnq8de1cbt9yw62kqreiyf4nc6unymx18qifx3e9r0wfjftyh8nmr5rcmiqwurrs5jwd3af8bje544pa53jh9kbmgn09nr2ejww8xk3amph5tk3ese5yk4ywyg4fu6dfxtpbtkq4201we895idpggee8aeaxstcrp34988mjmciu6hd0jjkxbgb0sgjd9x5s37pxqwtk +f6c29678dde4f73e943a6762adac3ca07d384917e014aa43378c4c19431ed118d7a4bcf471d831cd14753f13ead8a396d4f4aaefce1950a386b06742307a8870d12f41c60aba765d05c9485e925b958b0704baebf3422ecda8d2f55cfe5a1c8c545e39a96250c50315f7a7b5dbd4cd726f27841bbb69ff849e5fa3510ed3cdb3136e5bd19ba8a1d8852e3f6834ba8331723fbdbd4dcb86256a55a768cf6e7ecb05d6e0ec0d 85mcg8e76q5q7sm4g7nd5fm6tm8qkp2y6xddtk1ynnempk084aghjcs68n07kgihrn4q8a9d5rn1hu3tufy66edktibfx14rem72k6ens7x6gru4i1ikfpd2f4csysgfx6rfu49q22yg5dep8uij6wk6nnds6ihcgc2gdx0u88q5fw8t1u1e8c6abi7wq96aq1j4et2i4je5ea5ifj21ydsm5rrp6j52ep72egfp38854qifk0pwtuh3hb3w69wfxyfim5xh +a177e1489465acad151c98aaa0e32dcb0c3ae39c64eeba2740563f65d2028baad6be9de8cb62a5c6ef89691f180b6882cf834c5946f3c9c3ab302fdd326d67359d5ef4c86bdf66f582c78451af9b7b5351ff5aa7e1dc50c0f8e99f209e18fe37d05f85b4d724bbeed5d79cafa94a1ba7b5981b11d2b2b950b24df39ab3fb4bc98b8f2fad784299c9d4008bbbadeaae2f359489865cd752e971cb0650a466e990e1042e8e2c00 ts58rpatgwwd4s26qrudm01h1gebu066gqyftc4xd09wftkrniuhhjt77bswscie78awp300mht2sq6bcngth68c0iuqxf87ecwwihg7f54gk489g540sn6adey1w84qd39uuc9m5n2gm83cq6kc6e38e92s9mht46pfy5wu48id9dddbiq5fex5r3cfsidkwce93euq9hs6qr6js8wykkt113dxmr75uyud6f1uppa0gyeydftybp0edrpeh4gk6arr7bngxx +8715a5e243c38050991e309eb332d6463b6f93672a515594c1af798d53ce9163bbec309fb2e40707de12e96a298ab04fbc9a8405a910e180ab90191a35b639e5f725c0504e39cc6a45b052ee5b48c9b80c098280784029104cdca05f9069792ceee55f4069fbf8c70f15c57618054305733ea5ae6dec8310e5dec1a14e5b05883c7c8031177cabd3f53b7418917e24b775ee52ee1ecca50e54c812249e0076a626786c0873ee94 k6d4f0pb0ixsme28erjfegww207w9a53sc2ufsemu7604t8ipsn5y5mkq81i2m0350cip4ncnd0a9ja4kkr4pa3mkru1xe24ew5bq1jyayxsxqn11nuafgrp71htnph0mka0sxb02xtnxqe6tmj1x4f1sqyidy4xh379nn0jryrygexs2gryejusu1w81x0k6yjgb2difgr0kjb6kx0ni9sf4j4qw7x0ps9rch5u71ci63wgtt3scpxpapjxx7uea16e0rbq74dx +a3926f41e128eae09e41cb545f0b8fc7961d69933e3c9fecdd98843466106d0d461232757f632d8345e896a3fe9017d5d719752a3570ea88cafc791e2aaf6e6d48b9467906607be5fc501660a512771e406fc2dcd2b3d5fc8052d943fb6ec66e88ec1a1cc72bc2f2e7e2bd66056a89990bbcd27872ce7adb165a2ecc9c2baaa4dc5c417d107dd52cf62b82f8379e78dac1e4aa14e9ea74d37506d2c4094c00a618774fb43bc6f3d5 tice8kjmsbuim3pm1hds8r6j08fm44gq308c95e7qrrb21kkhtetganpiu9wefgb2ytch298pxf7fu01itubd63dnbsj0828sdyw65d2ysb3pmqxjjp90txwgrpna7082my6syepwjd91xrp5sm9w5weh4ai0ek606u6s6y36d8wgmfdnegkyjepjm1g68w5r1hr7qa6siudcyr62s8nx9iusq5ryxy0e8j3nwwm6pumc4jdiqcydmwp0kat0xsebm5t9hm50517d +dcbd1fd09262444a7b278dbaea37cd8c6ec3c8330a6427459011043eff1f268c939d7b5591a4005a81c50ce6d06571903c1d1314aa0f3b6ec957bb1c4974fb71636e1066918912de499bef36b7deb03bbb9a2ee6202628033cf49d2c270dd601ff70b37e3024e35d26f3d8cb1e7913399dd911c04f1548957a8403df67cbf0c3602661d059db3992b66ef485f770bb47f4fae1972059f2bab850974eb643cc101100411f4ccd2fc6c5 5p8n9tapgcrat813nw7ith8hnnyg3pmqmcpringkrarb7909a4ec33f5dw242xr4k3rk11wkgu01xjx7rgddtb15h5auji06cs4jw6fbh02ehagcrfjaqe9je4577gm5yihr71nxa0txej3tqtwribiwx39ymg58expieyce8jggw3q1rg615w2n0m3ndpaujdrx3y531j0ge0meg32sqw11pd5e77as870fwn9t9fk1i2r18d7fktayc45a3qxkraxar34g1ty6hn2 +32f27e8a9bff350ec9e28b4df3e7f86cee47569755d5253f20b50049e6546b17000045fffcbd36f7c28ad5f6e517b58967dd61fbaf466459ffdc826848a93a526152ac23f33f023ca712ff2fb35161b717bebde72f285d8e027f7449bf5d0fc9083685e9642d07f700b4dd8c7bcf12b411efea3ae64874841308de902daab015d8ffc8edad977a04ee12a6deedeb91a071b63f86a70bafe8e459affc8d826a3111174524fbb0700b9f25 ef137rt5964k7pjrnhe93190hqyaiutydydpdj1xwtxaq1pthgfkxxrs998f4hyy0dshf7ysr840p187g3748nqaf3971xq2crtqttqmddwr3619x28diay9s81ur0hyr89f511jsmi06xq9ina58y2j1aabhmjcgkwkj70xwqi0088jrd4mb59d3fqak7aargah7amhud0mfw391bw45s54xqymscw87yu1b2bnw090hc0fu9ti2whj9pe0a4nnraftdc35wm0xy31s +dd944d40ea87cd38aa4b0a8a6247338bc20fdd3dd26f7e895ef69dc66d55ab3043edc6c54ff25df389fbacb970ab3fd63f407a411b42dda029d7b37a4bd6bbcf1375e72a032ee9cd9440d8e77f3b6cd6c6b34e22858e054f1cd57d26dfd1c039ad814861ccf9ddccf340a67297c06c80f0f58a71025a24f084a6b61246084f5d4cadfcb1b42999510944f30f62a33b21af18f8ecf025939b5a24a8358df5b654df30695ca80ede25b3142b 5wda4k3dk9eqndpfmdsean1qnjmx9yc74cyy7rd884i6g5duug0a35ie0u39ayjqn3741ifkug97gj4xjcxnwkw7txt7jg54cjffyq0qiyqptx1i73e12ke0679qw5ew041t62tsn0rt83eujtqh9tix3ew0rpbm1q675q3q2rq3ss8xhpxjm7gdiamstc3kkpqfgapemm3u4qsh9p052dg1daatc60jgdnqw2hjbb6i16mspihutcs2ewe9fhpt560epys2m5jrfg0tsg +80dd107da061671a6fa936279f5189b6bf70be99175a7d0a2d5cddd88ce9d8e4a7829d745020a36f3941435d9778388b8baa41e185b2fdabfa75893872979974ba7d16a220d8c97b6112f7d9ca3804fbd80d9f11fc610815f7ab1e446a6b32ccd10e62d99f5bef345e742637f64b4a01a2e87add4b174d0a13c86140fccba62497dab58ac24a3c6afcfc0f42a3f7ac9398bc5d0809b5943e6f1c1659b57d3f77b90080db26877d29360330cc kbinx9hxgsqnt57ce0q18tgcw49ymjt1r7h34rnhfqi7nb3c5bpdjxt7in2rm25j3sxteygyjx62yr7d23k0fgy7uj73frc0idf1p7s4jtfda2e01s7wrayy53sbkm355xe18aj6gaamf77fb1ret41p1q2k60w1q7h88hr8ikqbj7pfc2x4s4b45usniq2drjaerk361iqrcs84wwsgapn6hf8j0b4rtj541a60ynikkrhupk9e83xwfe4y4j5yyax2mw1ek78pphkbebex +b3915c82d1bbf5539eae9211f97f53f1537798a852ae8307a9cb00780669408e47713fd11fc1cd15196fe0bf2c44c505eb598be08d8a7a658156d623ad845e54c88da172884d6caacd4b3ced8590a86d4ac49bfa0983cccbff85c67bc90ee45e6df61a318b998aabd870d19212ff1f99cb1548c0dd50e11bb31997135ec1cb49414f8906d5fb2cd6279b805f6d118786dcf7e0d34a696fa9fb41f79cc5e15d9b834c50e121b980e59a4d6cd694 wi2u1xwnyj4u33uip229p94q8scyjes2ddy2em7c1gx3kmqc2r3ai6c94aj6bq2ubsy8mj1g2qrkf441njk25rq4gwxuhunbuwrs6ue2nwkysrrhhpug4p167wr1mdbhcfrcy8kckjegy96s0176pbyaf1w9gennnig0ud80ib21aay9b8g6wsd20bium025wgg1ia4803stpkdjnabhf81g40q1yxr9ht20jmw689khepqch8t9wkjyqqr8ryg5khesm0cmyexifephhqfc2 +5fe8986983344db7ad13df8efdc2594c3bafa136e664dc2b8d2c7e9666dd6e6302a660ca6612643c2c14ed4b78d34050c170a19740f58afc6bea9a7476c5a6e459d05aa4feaef85aa95eb4bb2decde97679a9886685b1875503307ce47b6a7f5341eb716aef24178dfa111aac5a584a39a3c6d79bccab01f9951cf92bad94b0b3269bbd9b90c138bcb79b985b27a02b60218bd5ccfa75abe7a65847bd070854130e0e8db96233a61edb2ce749cea f9tck4gbene5jf2q583j5kp1ck7492cw61ph0d6hsn9cg1w7h1nkscqx1cqma1m6skdi4p504hxsmkfkteftm7gd9nu8ueqti5r4h1r14mhdc9ui9mhdpyutygw81ytyg8hcnmq2fgg3dtmqx93ajhu38t4m7h0wu51ar8e9ta24unhskpn1tjbhje8gugx9qs269au45sskwgqcyjg5pbxqnjsyqigswc7xshkrbr8u1q73fd93t1gajj23mmdmebkinw6wag7eb5hp114c14k +adcb89eccc044a600ae9eec3d2bc0023257f4bdae51103cb1d3fef0f80de1f7ddddea07195d885bad35b4b7a34732be6e0fff92ea2112060df57c8505f717e7cc4267c3f03894ffd40ab789606131e6de8f1ddd12707f0ad8a154572097d499e8453fbb09aafa79c8965ef6482a49921b1b0c14d4edd30153c4c562c02511b7bdd4c53a0e181eef2354f796a2521af405ee37c8fc633c6712a895faca2608d0cdddfbc7a8b80e14b13862dd49a0a87 uys0q5egxnsexryc75m7sjxxagpy8p846t2k3p0739yk9xe8b7875yuxied7nmh44hhtw8ntigu8h0399aydaacxgbjujprkf70y69eaa18b8x6cc98tmd50p0bme3qh7b075tc3x90d5rku2u1xp9dcq4rs387kqdy4j3acgyywcxuaqak5bgemcu3h4gxu3nesgfxrdahyyydgdikibxji824t88fdatk48kr86h829nnq010purd9upnemb2g5yj508tfkbktwa6esydctrt3 +2f9c4dac6141681f1b584bd62e74fc0e155bed6b3498577f7207113f22dacc0ab407ca26c57c6172d08240853888296ffb46bf4291dd69270be48c5ed12562ddda44e0bfd6fe914d2baa42b5cdbb3a095d887d9794d3945c2632e1e2fd10cd0acc484a43e8c78a12c911979f2b2e68cf0faedcf56ae9b4d90236ccd85fabf9272e8d548d426e9d1193fdd18ebd95dcfb61c82095a66ed164f5eced8dbf96c84e77c813b4a15fa0772b0acabe412134c6 s8ia5fbm2stm8e40cjfr6736m0duy5ffepgsi95px62q82w41ksf2m8da5ry00fp4rmammc0nxtw984ey7mcbyfca6s8cbr84apwsyi42qkf9uy8psepydprwye5wikcfwa35s6t4ids0cnp63nj4aehmfeakppb7bb0tawcref18d1ihb3k9fw68uuiqhe1x25g1wr9uj6pifthdpeta5t7rec95tgiywd7185m1xkcfcqi4spjf53hnw91hprii9am3hsmf8k3id0d1d9ar2ct00 +49aef88c12b1a63938777b49cd9787b2aafa9d7e99cb77fc5b83c2a136456107c665b81f50ded0686198d23d190eba887a0f6b7eebfb937bc54fda8c4ef6547a3bbd22389684c511ad0d0bd777152439de2af264b12ff8220ab2ddd3551265ae8e05c9379555711a8e4c5868c7227eff12f731e3beecf52f9001015c485ef1126666914b413ff590156188cdb00e8331f33bea276fe778ae3fb315691a4cc6b6de8480ce805da42d9a8b9c95da003b772d ceyjnbxpweqbpibyjha65s63wduju3f8q3syj9r5kjmdrhpsgab6g1h0b72h7tb2geghaj21m472k8kjhh9iy86qjjrt9wtgc55s28n5ytnbnsta0t244b2f475ndcm150uja1sns96rarup5ycudaqsu43xfpcypudyreticngenn1rj59ns71n6i9i17cjpxxkryr2f50na1qepsstrj9upxdwbrehwx32egjq3juri593jryb9g0uhaha1nuw54r2mqtxfwpr5etfqpd7txm5i6wk +aa13a7a93a1eacc8118a07c9f0f4ff530acd1ba145e5c5a2b970282438a58fb77a7e0e8b55ee48f5b04c91214a507ef44d494fb32a23348b39a5309b12162e13288ab4360826f5771e9400d66283f35197e8584618250899c61c958d0f42682e8c453e3bcd3f2c41948fd2bde5506515f08c2d7d3ac3d012ed9fa8ade78fcaf69045055ecc82116ef76756757557a4b2849fea3d5d606d840d0c33e4e1bd6e50ef8779f0df72dae795e82f73431460081304 u2c4jdc4b4wgkagdx9a9m739dgsg4e7m2yp6f2u1ixtr2issn85yt9kinhd86p3uwmecr2dddm9j2qdcc81pt21tng64dga5r2fr6a12nd4bgrme8u5n7sxx41n2364np9tsknk0atacqnk6pwek8kq2s4eadjn51t9p0kgtn9cf51dkgtd9mbmhjt7g3txp7wj4nfj3n9sjharsxujg1xknh55wiuquiuf4cgtaq9ub4yfxhwrx4bmq6qk545pk78byq6e9ifhijsj2s71tesbxmxck2 +15adb576813edf349e65bc02c0180bc4b5155c5054dd01fbe5b39bdebfa421233573d2d26e7b3fcc7c370e1888ddac30eb42bed5dca7027b342700b03b260590db53d840dfbdfcf9ec80a4ff3e282bd34b633d573b483a794e8cc0be2463be4f633b3fdf3f6b83605bcf4d4ee3bf1e3faa69ce0715be3a7f8708140fee861f9eca4fb947e5a05768fef31b8173399d6faf1f44e72d135fd2ae8347230e5428a3d593e599c00348586a6b4a27a15f79001bd12d rww5d7tm35jqc3qsykmgxexf0p4ndyrkdqikb89swih77j7aaanqd68p4cy3wj8gjk5k6ea25wwbm44ry5d71c0rjg4rixsk3gqxfae5djgamy779q681xsa969rkd8qchnq4u15cx73pqtg0r9r2078c7nqwj8937u0e0r517et7079b094t4iix6d56iq9k6am2b9ik0j17ppjysb8f2ryhb9jee6mig61457jb7riif2qf9cd7x43ag3s2dsb4wc8feixxhask4qfc2q4ry51xxh7rf2 +56188a84f020fb90ceb22fae0bb026646eb088fdf05562ebaaf8d4c3e8b6a7a4e39198fcd50ec3a6cea65117ba08f4c9405a6b9b4eb0f5fa18e869ea010e5a09ac208020271652ee8ffa7f3799b695d229b33ebabf9cf99a22e6bb728dc90386832c4bd6b09d73908d9f274370cbe34b9603c420592345c87a023a657c5bfbc572d62569cce49bc76b1fa6a760edaf452d0db97aac15a79a88b71d2911c5de9c338333150d44bf11bd487d9eb5434a88f8e27347 d0g2um3kab71mqups8yxygmegnyfmr378mdws47d9bdg34swt8pi3ag09qdk7k7e14qsrs74mb4gpkr4hiht7g3u92gik4jdxa3strhgarxrxc0wdfy298q9e8g5hsipse1q7iu9qq61t2yeyh125p2bk4mp0p8wwriy3aahq6qte6ef6hs1gx8aamgpeni2j2mbt1f6fj76d6wwaut611a507un9cu3gbw48nchmw6yufxut8h2nh07sa26fyt6eimqes2h2p9nbjd2jwjfdk4dnb6ia643 +aef961f45a28e5e540d4a685c9889ddfbca8d8af3eb75457253b1d05adbc2af85ceeeefbf263d04f928ee52ee936c1b2cf9d5cd2b8ba98804b4a0b6050a1d4dcc1bed7d6ab2105a4f9fed317f4e659435e500273c1cbeb571b5ab4662b51e480f5c9456a858adee36c0342a8159ac2233f5926eb2a222ba12f7535ed299da5167831e6fe8f9cabd1c85ee2c565adeda8521c7db1d9d9de2da192cd008ad32b871b33f5d60ec1ad03c5b0ea57c85d4b64bc379ae577 u56wb7r4sbp8dkett4r6qra7588dnwsj345u2u1s3gikffh6sf6s15yi9j1e3trjpd3idfyce5x5sq67fqcfnit0kmsttr5xdrk7cyemy5f7hd1mxwpjq9wqr94igwdbf12xa68m1juuie44wnqrwtjakb46pnfdkwsh705gxhmdksg402nq8wce7gurad7ms74qf5ccqwpng8mn659293sf43as70wsgww85drpbn85bwi150w4bawhxrshed63bg19fuki0ewk3nhk7cf6kydfgp8bjeysi6 +64ff870dd1b85e5cb61a2444482415f4e7a8bbf15feda52b54d6653b235e13a79bea946f04c5fac0e2fb271f01958b8524a8e1be1232012c1cbaa20ff2dd5e146a50ed95a0fc62f87129f96b9c642d8c9ac4d78106a4af6052581dc77a5cd0b712afa6964bab7c4a6c2b146fdeaa6db2cb76e0f83915e0b20e0bc6319da468ca210d68b0509db45c4d0bfce7b9821a283daeab9c6c1517109e0814ed4a1b935c96083cffae60e421732c058047c1391185c3422e6b2f gq90ibinymjs1hk4anrakcxu8qq4ni9nf9w4dd4t41pqw248riq1y4tth6rgf8wx6f7pi30mpws0dcs26e9magkmskifu2kj8fiu6sbddbw1f236gf63rdj1hiie2fggqfrhjx2etpywxtp0bybytyekw6cd9ctwciuy0pqgsgde9yudhw1gw7yx9x6nf0spm0s6ggg7tntgt22hhr0sm3htfneky933yemmtdm7u4u105xur62c6rxt7usmya46p0ab197igbprr61gxwxajkc1rer6eknihgyk +669ed58535f5980b28400c91dc41a70a12f4271c6ab853cd21029c07fd2f67d89614d663a5c3319957ef137dd79d3a5a955527683d48dc5cf8df49332dbd42ee6af2947ee84241a8c0384cb886e1ecb8115f8f9001614f5fb75cc0e1d240f235394050b6ae2c627a49f8995f7102cc11d41dcb5c862a438e440ac8113de1130b80f093b0adff58fb4076a85e57bdfc0c3a800a9489fdfa07d086027962469820a15e95dcc5c7fa0cdd2162653730457fa3d1c6942716f4 g4jhfmcu8wgxwdrxmp270kh3m2cj2c06hd6s3qcmxdixj9cjg9gcgsewgip6egg1d9yne9iyqt7susdua7tb4pe6fq6h8pcqsw8ts5qd8dd374rr2etgxirgyrbib5s0rsj09axmgs3u9h460bk7ak3pet6txtswu0wea8pc9rgu862r1k2723iffpbrtk6i2ksgkac76ackyx3kpi0d59409hx3hdr8d8890bm4kxsccrj792b7mmkrjsnahemxtsjcfyes097x1ycmgcpqigrsj8n7bntta6fj2 +14428262d81094da521e4baa56bb92766fce938d3bf4254fcd588857d9f08d5400c680557501261d859a5bc7d7e10c5dab00c307205ebf041d2274bd6311abde66a6ddfd916599e2a14519a83a35945b92237173dffd8fb7e54534060e4ec124518c7a963ff96a91c7236ad66664855a28d2abf0c6a00d1fcefdf7266a5c67de462ae4da71dbcbcf52c21b41703af7691b7ce4273dd6aa5ff70dacd6a2645a3f56b4d8bf3bfe48f217edb1fe3d3d758e92b4f0241e6a6b4a rnm2a0w0rrdhttk8ciushi6pi1y67a6h3j4rdq8hfrasjwjknudxmntxdu4krck7kwhsyn8y6aes5d0x0gbpxyu9xkipa7s7gg24yyqet5i95afsq3ndrn21ux7bfsr5p2nyr6899w35j1dsekbx6qwman2008tw396wuai3ahuhg1qakuhrntuf8bbdxb291589icqdfnq76nnd6qh3bw8f17cgae4mix7ji425jqprijiwucj9ibhg44ne2wn9d44hnj1591ajas9hw39b4jfun4cfc6mab1uewpk +d2b68f3b4602e0363581ebffda1f6c7078cdeb31638154229724a83c36d9ede2f053cd4eba01697958b1621809458a2ded22680a25796949d78ea3476fe6833e2319083a82f7f23918377f5ada7f0564e24d9d0204cbfaf2538397f403271b443f6ec80bba5ae6d12275462ce92143be38c95104cb1d7e29a03beac51efd57c3f2d8b6eb28ba578ea294342ccce0df580b09d9768ce793833781d30efde68f73c61fb8f8a891b7871f516bb669890d60929e01d99b033cbb10 4d528i4exfkbghgm7j97t35gim6g541ngixu22tyaptb0hw17ynjxt8hc47xr4f1fr0waexc2wsr55crhxsrd8fcc3f07243h9q2ejnbbaabuxyy826nkh59ffh38mfa6ce14xka1j7jat6bp94xec052k9w7pxfychihtcriubr14cm2i9bnpdnxqsn49nctx78un289uf636w0w5upnipyn4nc2hmg1qkh8wxfm3gyhb33pimqjxiqm588hb5q00j5n8s2pe50i34nhi5eqr2hgrcc6xi1qgmq1i0k +187a2d5a2e7be48ddc0cbbccc87fbeacaa7389e55d45b7eaee32c2ebefd0ac792b3da9ef6b2d2fd823f808cc6c9593f515359a1a544a6eb18d91f52ac8e6602d9d664b3839e1ce3e5a13900af93c5ab113a5ba5a1ae5765531ceff1cd7389a9de47066b360f09a410b5a07a7cb3f4819d52453a75708c68df4e9965809a9de79c7c2bc4431f43eb42d643f7f311c4b7db7489d974275707d6f2eb85350141c76701e3b597410eef5be3cda10dbd057affa14800620deaf23e344 bm7r4wnijjp25yxgyjegk978upu33rjsfur5j4yiefmiy58kun6pwjhc77up4f80aj6xnqbgpwc9dscuq2hs2pqiwee1b7cd1bqexfg7g1sqkijm109sta6kmf6q0wunrip5twk46u5sdgii96ihiia4qyp3x1uqgb0ctk2ff2b4jp19cxg7dcrqt7fknnth8qt1gwxcu3j3qn8rynrbb7m8wkww2j59eaiaw9hycri1ikquim8w8fu0dh2m23bwixjbwwftrbyjfjn6522hytryu97mcxxeabjd829b2k +88855521f6f5d0a3dc8e27d28177ec9145ecd80a8b04846f9eb4e7ffa4f5a34b11279e3d851546a286f1fec8e03dbc1473d4652aa8a1ae3a4b9248362db07a641a22cb0839cda2209e1c4c627bbd3982a1e902d8b3c2f2c3818d8e53c5c6253624d1eabbc544fda8518214c777be6b3401d5a559639cb1888a172c68a3f3473e69e1cc1ed15f9d37a8a9d48ebbeb725e99766c46c3306feed519c851fb37acc5f4ca81fb4da4a35ede00314ec93bf9c8f188e4f8c8dd79fa306ea4 nrrud2jw8y2d3yaia9c2r79gpsr81wxdngr22568wqq99c3uthsnrc683wrndnurk5097p3x3w8m268tgtudn2hi3cs1apmwsw03t1x4afskkiiht2kc63rggc754igrt3tkswsq0f1g3xghn1c6fnnse0phb4u50urj5drnk2dgi778hg4xbuhsfsn11gg2n2fp04sb8hbq64jm1kjhry67e8tdquaiyjuyayt1i1wahk1kh9yhdei2d37qjfes8qs2b84htpnu7ykxes3gpi911b00n1301biyq8nkh4px +afb47df27aca4bd4a7bf8662d241a40dd5ac40545c9e2b39835ed1b58b6f041c15d2c1a0e2ec0276934f58aef5c62d9ea2b466e45c7c33ed8f06d55f1f07706e7d34dc682d1eb296e9da92dfcb87d9952b56616650e845db712b5056d74de85ebd580e813e2cb3bef00862e2dac365f109abeadda9ae54adc74dd25a9900e7f7fc21d6f75a7abbc4eddd07d9492c4e862b8dbd5aa71232b17bccff8bd750ba602ecca95bee0ce7b55b35a786d8caf82b77e01ac21b2c2f0fc08a8201 u84356q41cs7cc79k1nhakhamyd40krtfpjrwigbf525fr5jxkimftwmtbni0xqwph3unfyu00w172utg5ps09mq7w3khud9b6byx5q7eqiekf28wdfiqwtp59s0jwgushfer1pk7mr7w6cfdmfhiqj2f48ukbtm30wf3jykmmniswwbgy0kqd9d5wt46ush07e7awt1xbq9j9mm455ut8u50qw74m81cawa7mnfnw8uuc0ped0yyq39njfumiqxs5edpw9imqq5dw1ut8bhnpy0sh58xewrbgwr8b8xndmxr +4ea779c047e7b3db3c3fc9485c956d05ff74c90bd4779dfb2b34b875adb21e16ea6e1b3539ffd823926e3c73b62e9bcba54f921353955378a0fc28ebdf8eee4a48b6853e71804f0e6f383ea0888625f8c5076d4d1167803ea64f6ba47135ef4ac7eb4ed45a58c50b98fb2b4e17559158588980d519b23b10428fded4180c574ad93edc950ecf6802c8f6ebe0566f007521e66eec2ffc74f0f75686b13abfe81f166235c6c3a32ca4e4562eda1426738572b6dbdefe192c9b6563ce18ba c4qyqkr36817wjm91sas1sfhxy9ycp2f4n51581fep63ffhpb0fit5k5et699wmbpcyb067ws4h6ycdjp2cu3sdqjrkj0d3f583i6pp2w4rq66gxc63e8im8tra2gcj00tbw4q2ng8xb7cpjhip3rhjjcfb8wqwtfcggdr609gut6s4upsgsnrgx4tg5ai0k2d377ux0mnftuwc85pdk7q52xfajh49xd1ykx7cm61yi0f96iq0jiutewa7f94x9r1nbfnwbtgwdc1rws5hm2cqqku1fhw8890gp1e5sgj3mnik +16f0ebbd3c9dcb58264a39133a601ee13ad4f5170d69f910ca7c8158b32fa1fbeea43877190e1f712ff36f13e74c38635a4b44164d9b4268224de94a47c1785da5ed37decf756a3b0dacea01af5142f7439d9e31376432a616ea07b4d866c54af39275d11af283840c8b20bdc93c99a04e7ca8a88126a914d9b8a1628803f9b9ef7592d3dbaa2dd419448c537e2ee8d8e1526b9bbecddcb7c5d0a8a484441e2af2bcf1232c7cd875b2aaeede60c663567b033668e6aab2fbeb1bb4df7574 r50iyjc6qysukcpd3acqt0x86a7hc72ymut9paedjpxung1jt3787cm0i6gk635ns91w8a93ck6eewpf2kfa5e4rhxna54dd29xykyhs7t577q5uh27k5f3dxeyurkyy2ii16gcygk1dgsydx84hk1wscf11a7inbf123mxgngkf5pc6qeka69s2urxphd2t5e6dr0t2xj65q55upfc7ydnh4kgtcbrqj0yinw3mdcu1yjwh5p56fts2tpra23nd8d8jr21gjqg3fgud75jemnqbd17kehq264ufs89fbi4h87ft +8f701bbdce0ff371b4f69f045df23b554c1ef4f8f2f5ed479d67b2ec1ce7a43c6662105274c16c1151220a53c5cc1569179479c13211eb1c044d02dd850dcc5a189877510ff0bec944001482075accd51c8a887945f51e735e9f4935b5e9ce837d0bff8321d09019b8a165a4496a6cedca0f64d57a41e94c21c2910c63b75a0ce87925d3be5a0a08811d692763eac06eb07fdfbbb875e5c3125a8e284e7703459e809c271e98f14da35d753b721060f3dc32dffedf6339d741947d315edadc n70myjiim91ybh3wq6rs56n5duem77308f484n67g81i0333tk8eg0kkdc4gr5xndanxtt8s1kdwps6tj3xqaajfbkra4xw7kte60wk0qm5urb9ky5at2xxtk2buuqeubps2k8ds8tj3eyt9ca45f4iikh8ky96ba32cxeh0tsp42pfdhqw6tb5a4u7ab4dga3mcrbbbw7hx14b1ayc56wkdmrxn44c3gjugx5ukj9j5yibu6ymnawtism33ix4sq4xc0c08qb0t5247it7yaabx8jibsy9857nqqu4mpn8qryw45k +545569ab6511ae5b238774f98152e1af337dc6e74195f1440ea87eb0b5a9850bf18405e3403cede2a9ddd3aa609b436f127ff517aa0ded154af7f4edf182940659347c649b3f90941bc9de0713ecc8e7109cce4942820688a68109db2f90ddc94c7738821b0fa98ae1666267b89d8c3e4b9e347eecbadb8e2b5ac0d80aecfba3e9b29f5089ecd5c55ee3b473702d447dc01e9416b54477e695dc0220ed7bcaad1195673a4e43e85728c784e0f6f158a8ee51c79de8f5ede7798580ea728c6381 dndwqd5sreysw263iq60rtymu61y5ny32ed9rnxium9fmhhckts9bmxs6hxb15jru3i73dqxqhmw8aq98tf4tbjhrusjj73h8emc2mp1en8ece19prdmypi8x6c81p33rrig6pdrk2b2nctmm3hp9ae71se3iiarbg34qrymg1nejia7nk9ay3ntj5wfuw6ishhgmwxd7q7434hpq722q5eu0uji3hbqixwt29ixb4dmhhdai9qcfyxrabwyypuhredwiipi2jtside3kqkjh6d0ubysbn677b485151kwxit6tggixk +0b42ca4fe9d852e65556c493b7cbab0c262e9ca2ee059000070e9a3108c0947957f8ed265a8f0a45657b13a7bd63b91c0cf068eda1ad34176c71999c9e1ad023eb697cb8616fc0a4072246bd7394108c31693961cfe5886c1e24befa62148dabe67ff14847f9496079dc62d2fa170f758e05baaee6ef5d140ac7cc684f7f0379ccb1bd42f54bbe504f84387240f43cf4d801bb07ea690e505cbf0b59cfb6ef417b0a86d81590bdae779b46030ac58cb01e3d128032d240d48e45b4f1915adbf498 mhmgtq9c5mcigudw0pc5jp7fmkqr73sr70r1xxx3m4hbrrexpn6uj83ha1h28rpsgu7n3c77gi6n0b3khbw4bfctr7w3beg6q0hhx29fhs8fk0fj0rpxi2peyu112aagestqp0ij6wae03nay57easahujq396d2296tp0b15nnhs8kym7406mh4u5qi8y2tmfb604rjj6myqqsnyumjdp78dm302ibp2b4b17e0xe7kj4qcm12s1j0ff335h54mjgs2hwxupr84676520mkunggwxjb4atxefcamuai2w4jbad45j4ck +4ce7b66b58dabe3c7f9431b55b9131d7ea6bdee611a033d9076a291e1f6fe6dacdd8a49f4ca48ff23722e74dba62eaf741bfdd4d95d676037af4f027fc0c6780b23908a46ee9ccbee114c835b4386491f04062c6dcb5a1611e820b7933a8699366f982c5928ed451a591a0b6a4bd6304d063217002f907d56e052ffab9ab9147745111a7e3d6de88427361eb320ae729309f5611a05b1a5fc6fc023150e846bb39a4ce38930b96178091cc012303b738b9e0a37ac86145cd7782379e2e80c367278c cqq5g4405d9b096tee4uyacn49ueyyyerekb3w23h2tn635j65hg5wsaq7edcb9pe6niiqh4gfujikh95ue1fuqwxh7jc6m39keejxsp3aad25yc1p9irse2ew4bk1an8mxesnw6wwkwr3trmh6q3dbcphqjqxwspd3h2thspekfhcs7ggrhx01mixmjpm8uh0rp98u1ui2ti7rnreq83uw8nmm3e0jfe2siidckq7fmb2r5bcj6h9xres2iknu53epg6iaqmifmjxan1kxpex7y3r68m2541mktfqfyk2516ftx0hqpjbx +5d477f2d302bab0e7eb73b83bb763d692bf3e9224b44d1b7d1f1f48b380c3924043a126210fcc18eb41827fff7b8b5ade211ddf4db1773a69896989879964e7a3b603803dac91aef1ceb35ca5ae9956ffb345b1b9e72afe3ecb07fb42a22ef138207b2cb827d922a76d15010dcd2ef9c50886e49591a73eba388e60f9a2fa47df1e542c6fc2504386e3b05beb50d9189f41ae780a04f3ad9fd225c65c34fbc3680e95f6dd256ed0408fce3be186d49ee0503b9dbdfcc3417dfb07296803f2c7602e50a fuby8fcksiuk69uy3im5w7n7hau934crchrhbh8n8342wixg3apx2ikpg22j1kgiwkgrj99yyr4450kn5y4hws5qt4gchea0jefa68n5gx6x3wwcbfyn141u1chiqsfj9g4swe68idy835skj84rt2yjrimxjgwfkc81adqw4s2mmyep78ismrbicsgnt69ftiaigb64s8p356js2fbj0c2a3mybwmh8wte1brjtbfq0m2rj3fg942p6gymt9jmwkbtu85ipd5wk2r366i9mk5dc70rk3ii559eb2s89wm1chxm9sn5xs12d +15aa5716e7222f1fd2691b03aa1b20e15fd29f0ef5629f792eb243921bb105d5078b79d1c7c12aa163116219a58df1f2633917d449700e35b376bcb2c3624229cc36d603d27dbf079bcc7bb7558d56b54dcde09ac9ceed0bb305aa72b2392c129cc83be0b7534365a8404ce797b671227a778ab9fb800b60596126ca260324be36bbb07598ee689a03179ae490d3f658e3fe950837124cd498b1807ae31b45ad14146ec13b9bde56b0dc71bfd27021bb0b7445b3ddfdcb36dce27dc93c25941d2c830cfe rwusisy3a2yn9tqcbgm4te1x6sj7s30i8unc88ciwcm1ae7nxydkjr5143b6rdumgg2waehsny09a011r9dap6xiew1yhjsp0hnaadige5fx3tq7y6b1yqb5w7d04uuucye8mewc15wkyg0suc1faicgrdigki9xw7cte1h22meijs7wian3t76dy370xr5xfskphpnexgpf6hu5wm41n5q2q2mnjeyapbc9gw3b94dkkh0pcqdcnggxjfnnwnhhrkde7kc5qjjshge6ie97a6mmygsy2nhq5y86whw66c86pjmspkip1x0g90 +21e39891a2a876f45987d831a0489095e0b925dbb7346321a2371a1f9b318c94e2406a53fea36b5643225b05a7894eab385e03548928a800ec8b549bb3b56429828bf4e1106d82074c25bfbcdd13b485e661bf8ca52d04724869497b9e376390aacdbf65b92370b256650b1bfb4bdd76595e768e1c00f2bfa05bc64e3b0a9c48587239ee9e2df81fe6ee974a1a1242ab0043cd5b41b35b2a1b4e75d48a7be09d2897ecac336959c56b825da762329c7501c2acde82d211f980e3871dd6442ebc095f34b877 a3n1nahrum5j2wg35x04xpakpykfpci5w64ee2hre6hm9e1nnpdiakbddj9de44w2gnswmh3ns3dwir8xhd2pds2xbw2wua5wi4w2dgrnj4irabhk2bt0ch9yqin3has61k59bssstr3apbccs716h5bprug5j5syanymgpwgtsny84f5u5spyqwn0ixm6u9tmh6gqn5mdiakwbp33yc6fj0b9qi7s4db2casd0x2jeuwkhqfgumwqqu4ps3y0a7srf81fmqhsg6d46rfwqwagt6itx6sfe8kfcmb8gx6ibn5upas48xpy1tym5k +f3da795ed6a3297bc220517ea788c4862a4def701092baf553a47c9f0199d1f84ce92615ae67add387739bf3e534b06475a75dacf2662e048e029eb889801b35172beb5bf85927819ea1e201b79eda135be07eac3d4a0d950a0eb65f76d31babd74021b1c24d988f7e75003021e590a05a8b9b82f3145e8d81545a8724ddf9b3a00968ebca45c835cd1ea2fa4c4002f9a915a96a5fcacceacb1f502efa8934714973253784d278c39f4f1b6f09d17fd31dbd30ce37632e745e48660393d3e4e1febc0c9be048 8jh3pywwtgtyyknxds9djreak0ua555krrcfu7dqtn8c8xg1436a14cerwyejfiqk711y69sep0e27h3fwwja1nixp3xs3u0nexmwh2ysjuuy8r1a8x172jrxe517wkqfjk37fm7c2e1drkiw1jyht05ujftx2hn0ce1nb58itxbx2jsprksur65kf1n2ythksdsum1a5y6532xchbu6tni2eyen72y4cnxxs8hcrwtwty8d1qugw34ks572phbncs1pdh6a4c6g334jbhykqtf94gi54geie7np67r8cmqx3a8q6qk97jxgqjkak +a347e889abc1440caf97527022d679d0a482a78e8245ae550753a40fda7093d818804eee60818302e3f6577bdafdd1b8d82c521f9195028d80060a4572d3a704c52782c7982dfc7157bbde0990a7ee7c78582c793a417272b102e8105840e1996fff72f46c6bf54373ad84a646c4b4aa3b993c1c719a2cb5e5acc1111d2e1e90569a01b3afee005ca357daf6546524ada8f450995bd4100c599bac097f72cb2fd734e3237d950b54d191914ba3c9a12b161259207f2eb581c244ad09e442c1eb7a404b7849e441 thb8nrhf0srx1f6ydc0rsuq14rp2sc6ikcr46u23dipx9wqkpjgmnxri71k2bx0r6j5si8849y25nwmgd2j1bs2rnwxxgrpsifc4imesa8mgjemh9n0uji88me2dj5q6jmgr08c42s13sg2r7x2skk3mqsy986ythnu9dk5quwrdgnwawpubyec6bn01tfsu6wwgra27s0jcxut4xe1495kxfpnujwywdnppcfh28n2cpw8trxesqe7gms9ysp1j464ie257ptsuctgnpss43phmsgfmawcxj6yffxir2pwkq1rr03uytkrfjma82k2 +d4d12faca69afa07ce50c9008007050d0e9d9335c82c2c7b55d81fa63e7c023935d7c12402ec72fe75dfd3f819e558a68ddbd1591e0463dbc07ffabb8e60496cd6b96f359b4e3a7dc1f8cf72ed2691a5d866d9e5984c502f1f22e8239ab0482215238dd789b2f99366775c34a7321e3a5a71c5694f905ea5124ce14bd05e2b666bcbdf6318a85eee9b77a869445daba61bb5683dfb955875d0a6d796156bc7345e14cfa4929ecd90e70f979510186922a445aa96905d8220d162665c28e562e0e33873d0b5c19eb3 4q2p9fseqf7xjqpk1ax2xm0smt3c5a1u1xwr084u5xj4gjq6x26qfu8makmi06y8iyj738x16ugdhbi54sgn6mbb5jx398u5n1kap5ewysyqfe4i3c86b8ejifwphahs5mqhq1g0cn2r831r7xn1ugr2a2dp3biyne1jqa5ei7ibcc1pb07st6ishs31xyusrceirp8kf0uwg48f57nnndr874hyjdbc2ni4yck5wutb586ufm47mcwyp0dwyn1tf0dg9capq5e1m10jp8dnxebcadpafdtwpmi0a2engcqs0d3sgfkieibq4r46b3uq +576474dfd26e3866676a88cc654a141957bf86e1bdb270e5ca7fe4ec2e0fbc64f7865aa79745407e23731a5f8376594e292eaa405b6749e78f248900cd0e2c211b06d85f1596f9324ef811554d572dac8b721373a2bfdb2f6bb3bd0459889b6e65862db643849a102ce737e9e9f21221ab6dd8c358aaf381096f57d88cc5e99e6374abea3667c6eafdedcc5091108cc28afde8a7b361c4bc25bdd0492e8c12c1eccc0346658715e15a9f2ec8575ed5b0e11e8c563758240dd9a55f5b7f37d2c639f8e1b034c0ec9c70 d7p3cy8ph06eg15dnbeedpktbsf59mymyw13m1idj9pi0fkjynpjjmp4t8ftdkb8ah1nty6bi1gt6dciucxsw14c683pcr2x1t3r0225x5gs8sgw9a1a78xndueuifhgnh1me67ry9hp847qytrsqra5h1p0gfhw2irctamg6658q4jpr2k4w5i00hgdu66mmsyujwag0yt1605tujubg18e7f885qrkpa221ktd9ytdjg5m0p8rfjikcay20awm7qexenqsk6d8rwt9s5asiywuwbkn7brwe7gr2bi1tujuw91y4fbbq83mwx4gm5a6ix +0661f270b1831b00ca0b4d963a4d88d242343c2f7cb6740129ee4d0800cadd3e1da5ae2ad920d7d02ab3fb9faae62c223c0a9b7a5c5a629da0636096abbc7dd601f22c6dd3da03c52a3a132ba0e41d36c67e70a11c8c8013147ec15e7ed9f4a3c512dc3fdab59a52990a19cc94d481fa95ae4c623546ca01049d8db1cad8aea9b216f02e1d6162b182aa8eacdbd31b94cd9af672ff386bab9545964bcff1a1ed2611fc13957e80fc1f64512d57e8bf7e229230f7d46c1888d6da393a24626115b112d31cf9579806bd9a x1k9a6snkghkmpkfcwfbtqg24cmb2jmjjp532xcc71ekkxed5t9m5chisfgpmu8ksd19y37d60wrajxdqh7s0wqrqwkee0awui835ukm82we5t84xjrptikqsiki23cw0193m226npxmesb80sj37wjttjrnsym95d41ttt1m2g61setk37cffpgg24thpkmxpi05gid5rydqgkw8xym40frwemdubug5jcnysehqf53s910hiu1dngwcj39b2jha0290a6uj4xj035adawuj4s9j0ncag3y4nwmnrew526qtcbrgad5rawqbq6ujexeywhx +42efd696fbd9431d904a5372206e426c12caffc40f2ee2642d2fdb7d45e836dd32fa8d215fe0607de2d4b8ade999867535b546db76c83b9e7cc4380ec1bac8a748d54a312da65b6f4133a2abe7d8c915692fcaf470f9901c2a08136737389d4f5732207960fe5327e08d6096594d8948e4a2fd204bf45f1ddffef12b8adb02916d6087451414c81172abbaa2088ee5996d29044cfe2c6ce3d004e6a156b5ecd68e9098c2efac846d5f185ace9c723a9beffb2fb3cf297f0f805e62dea730741e613ffe32dae8cfa8f0129d 2fy7hsy55smn5arddh1rx5prhkcgu98am6yia1mhs9hy4nj2e5iqs8thasj8x0b76fdfnfjcqeb3dhhu25hyhpm5q18g2ixi0e7gnc424usbrfhefhytrg7rujq7np2uhay6u7bk9e2m0dk2rhqqiia7c7fqa2b1gb9sec9xnukcgwdhnsaic2y7ams92y07599jrd6d5gmcr5fxk7rn2se2rs1dyiurmr3ifefhsara19nghqn7xm3etsfff5ewn42cnkyjupre4y00ff3c06n4qjy9wf7q16ty8b6xf1nh7c1kikjerj98efhinq728xcc4 +885a0297efe8f4083bb9a13f2025e01ea1ae163492163e99f535824fc70458cb42be8c36a4f1f528a7c17a737e390feab5194cb0cd8772cb0f151cb4a667a3ce6b6cbb56b76af2e459f7b6dc61650ff0a8c4b078803a25bc957757f25ae0922b36942dcad4ca2525036452ac1c299a20e8ecebdbcf60d9d9efeb4299915da36708199cf6c4b717af38d86c56689c80253fb188f4caf47aa0cbb316303809517597ca97d179eac04ae2130899d441efc253c760637ccd4e22fde8adf3ab3e42415255622a1278196f2dfcdaf6 nmhxss9j7b4xki71ta9pxcjxb4k46sntp2fb7ejuewma9n0afbstsjtge4pjb7c2t9xyt6583a38uh21cp0g5m5p1g3nd3stt1q43qqfhp7uhh5d8fpsq77w5nkwdb9kubrfx8ax32p51sfyd91su0apsg5c2fid4qsrdc2bgncd03mcq2kin53f5j3wmwi179utsegnfwnwirx1qq5gch0yu66hk5rwhri2xcc9weajcpytjdkgyg0wex6xptfup9scjtf17fxau0kqmrg72kjj0cc6i0bbjqet62y77rw93d182cxuaufrs2c3kefjsy8hu7k +a1eea4094b64343c721fceea7a5f7b5650a971b537281d5711e2f50a2c2e738347921cda10496ca24f375928dc64602c0e6b37171017001d3d9d009c4c6d494e3dce200caf2e05d3e3b4e9c0333d749a6b6dbf3a9dd4599e298337fcb17bdfbff3d01853ec6bfb778e86ff0c0e3581e132647d1b6b525a27d7bd8a28c5cdf63bc5fcc4105019ba0e3c0c0bc02517b40010c02cddec650a37ca9c560bb4ea8a4e4834343ed7911fc887c2af1411ca018df12b7c4860fe795c231b5b07f01d6f50a19ef0010d2a01e453486b5b23 t3yd2rdfgk4b06k915u3ty55d12dp6hue6tm4u0n6f4ktfmiiimtjak6522ap5src65upde6gnkr0bqfe6fnxs0xbt814xa6cnwtpqn710kx1f1ixyc83h3c0x1q47a4hhw58it74ng16dgbe98fr889y917xerq7nu9w76ik59k0bnuk3kqa1b7bhuuawn34880tdes1y5bynj60k2sxeh4m08x0r8xatf52xxk0xwh55bsm256u3rwmi4iurpicx4b2jwypaj6nm8ru6dmbpkmny0pw9r2gb93pymbbhhkj6x7h72db3ykxaeptxjadhaeww1b +605315d31225ea6470d136e004de70d9a07faa3fc5f5c71c2a62396227f12e18e9632b2b13f95e71f43a4527b7d590ab62d932b408382aa3af2bccf108d52b32c264b5d33bb3f4fbc9cad5277180cd7bbb06c684d3adadf6c0c8537dc7eb8f4dc08c2f92611338b32d1d2f88b3426ae45209109bd9c2296c30a118f905d04ee12176373a6f6d45f93bb54cda81c87e90839ecc34435496f082b072e2faa8f03b5d8c05fe04d33555779a601b62f03287b81d72f19a324447f3d871e465808672206ef10c10811ed709eba304001f gmcnft0payue26ene5kxcyqk5ek39dn90y46i3mdg26wac9ns0gip01fsgc9pyqn8k7adc7y4w2dw0w1ed4xkimdtiypyq3nmbdpwgwrgp47ei7q8q76qpwua700mqf5ygbghmequww9hke2dh86j46jcyx20f6pgacqng1hbty0ng4rhfpsar2kqjg6adfgerknn82s4m3ir2fwe67e85ds9a75dqe4k3a37aabq5eb2k4tp502sgbp6f7dn6m5fwexf9ka4g4ud764gxhws6mpk86m46ynq21a2n9q5m0821gxk11rx5ynmk22r3wym3u4emxxb6 +675e9700e464ba49906a234ed29e2b7fe095cf9252257da1287df2c80466bf40b53b18a3a674f107c69171c96be3562f7f4b6eb35aa6cc49a3abb606875b17be2e9cb356df2cba8887e613060247b861b5d9be5934594e831e635f5e659b1ad8a66450f22c1b78b8ed38569118b5f15c289b8ad6793538212507779c71e97e4663eabdf749d9156e724a3d03d5c88343bd7d1ac3c91faf742be303a9c2eefc537e54fcecbbe8ad21238f63be82f7c37f23edcdf4dc764eb74a1231d73ce96bd096cbae2248671132a1db2cefe4c29b g7jcix3agp7aqabdah3hs3nfj9kcfq6pd2py52c2jy1gkmbey7xfdi00tiq3c623042ybpff6hfr894fh41uucwgcen4yhkek7hnjjniqp1uhy1gyda2j1kqx0majibmwyg56wctfs32e3qbf7jefe045rqe2t3pskhyni3h3mfcresu8sirne6d416qdimmatbyj3bn7s9ag09dyy5tqw2uh11atj2b4ya2ek77jthg3p29u74ry00bu3mi79rqj1dj15s57rwpr26jgi92s78bj6n85qjt5n5a7h4dr207ij3chj2chp7iacaeiacpt3hp159a0dhk +cbcaf0c2ebc76d0d3c1336434a33da8238789e036869126ddd524a26204385cfd1e5ad943d4352510c9aa9a16d38a83869061f3348ca6bce462dc3b4bb124686afe17963bb4d2b217fc664527b42e57b764ed03ad6c5f087b0b88e2d93d3cc8b9cba57dbda294cd766972194b3abff170fee8782fb9432d757497b4218e0f2a2a76170d036daac91a5afca438a576b3b230c3a11514f80c060df53ccd2ca723b9e42b2427fe02f333ddf0ffab45b0c038d888e0bdf3733a4bdd2fc9ffcdcd15f11333939ada7770bf9f9eed86783174a 1jsjmkyf07wk4jxqe1mttg84k263n3kbhmtna5i7dcsrg2rbky37b1hhpk8tetpnmphdq2fh3rtbk42eb61tnpqf11br5k7tygcahmuj6s6w3i4hsgky9nqadc7ts1f5i13hxiww0y02jgs0n0w13t8gniiftu8552tt1u5ep6k1cg7f96fk95t3kf712gwyd7aywkk06b1dsc5mib2bhwugpep49ppbncfwwi1bmk7mrtdjkbxemy4q1qcgt6n5q1mfakq96xyqeji9m97f2w0gxie0nbkf565q3cs74f8c99e64sjnrg113ew4i70f93687wb3kgftt +6df714d066d3b5bf1067092f7b2a0f3a969756c3a0521d3d202d07358c74cb0415a4931e4cf7eaf3d2201eaa8d60be50cd56692556e7d2cc629dd99dde8533989b57c02a51846866142105e9626c56a5d1c0ecabb9acb1c22f4397f080ee57d2b2c9fd5cc5212d79ea4edd29632396789bf0850c4991e403758cfdad440dccaef994fff9fc7a3b8b0a72fbc4c65552313dc5832dd48dc97e22597c19804c800995ab828028ff54dcd38e8de28781cb74d8e1ab6119dab4d596c23473d65a5b1b12c1fb563e7c6d2b7a39bb56cb865cd7d4 hy5nctbe4i458ab3mayywdkj3dfciuwbtmcm4jcxstbqfbbt1grmfcaqb1ejj4yq42km7dthgr9smqdwhapuh18p1nnc5wg754rq3ea5d9xrttgahmqm222s7sne0uus43xi1d71up06af4bp902m5py4d1gq9d60tkp48jdc5ipp01bp16cy6asmna1b1xbiwej5fdamyed78gt996908n5ngs3s88a01duagc70wmp5uah1s9rawf6bexa1xxcpwu0sxm297dh1t6inyn2jxifiqgibd5mb3hfcugw02433up4fghnskj5d09305cfj265wuwfk1ihjux +bb8f6333dd90675ed37b58e27a1335eed441eb2243778d5a017c084ef0a3c1071c9db3f89d44cf93c7993dd2cf5022bb20156ffeb34cb8c5c8b1c3fdffbbbb7965cae9fb9e93be5893dc0b396bb9d6dde73f8685412721560413fd3165dc9a2dbe07422bdb0b49ee6273509c5fac094bff356b15e42f4ebbb09ff5a7e425c7c655f0070da0a964eb1335b477771da395ce9047b4fd15683ae124ad314903a9fd981099f452553c32b8e71a5703c768ea1d5f855cc4a2e6ddea9e3c3af157499cebddf86b6e26e47f4ee37f6a24fd5f204c37 yi3weg87pmqu7t55fbn3ta1u75dab41r2h504wkmjkaa76sb0abn13hq9ritcq6q08gq5twjdxnfw2xuh99feqs00yafbk979875w8fs1ft9y3tqy1gc3yxf3su5quw76690hmdma6kugmxq9t0wfya4sw9xiknf5gstq5qrih2c0y7gmss98hffrypr8qu5wrj9fc9aayb6gujkx6e4mdfa7gcqfhbyi6i43siipmb5c92uhx7ircshesak3dj7qx2cq7rpdt8bsi33bcfk3n5272iu9md60pnihyjdq08bu6dyceiiyyj0hhyrh1b9c5ny84na9ujpxqmy +ea6c48c2f0399ebc0c8fe5a25722001d2a7d99ba54bc717e9bd7ff9ac44e9eb8eec1521d1317efd6ea43135e8bc3a92be69190ca73d8ee12776abdb2e83d45e7276bb3606162224dfc7b024e773c1a7218ac444227d8df68f76d104d19f155391c10dee4d9c71365806ca0c03e355629b5ca4223a855b749f1c86bfdf5f6b08d3a254d0c74557159941ec1b8c08dab678a3e94617029bef0239d825836aee87b3b47e749c5d7b0c4a66917d5566587067aa768f08ab42826fc79caccc3834d7f960c1ed5a62d4d961b76064cbff7e83023558c 7cwankyk3ejf0baj6wnsi2kxbtu35eh4dp83r9t54991unriq46i7kdpbtcnj58w7cmneytf0itpy1tnpbs33w3irc5wujhp7x8tf113hi1wx0frace9080rc15q0eqpbrwa2kn35bjwn75hrmenq6du3aimmyya53bne1gxhpkgxjnud0t5fppraitsfh4c83aey9ju84024inscte32ufnfedm7kh00re4w16d34der6mcy50r33grfx5d74b53hb8ipis480gccqcr9dug1g3x17di43knd4rkcy6j3sg1k6bcu91gbx84wqr4qgwbh5xgqs989tbx24unk +ddd46f89e43fa1ac3ebb227a71283c737493eb002f9afce8d613bcbe5fde96d1c38dbeaf70c726ccab62089c621f5ca60746d05fd2a2da0f644c1866641bc1089bfebdb655cd50c6c94fceffc903f42acb4bcfe5bbf8c45417ec097913413f0140b2e3819f5aac8d4b11e784ed69abd526bb59277828651f726352e53c87cbeff2181eafd325af7d8bba9ad310f7d91a3a30d8ae5f3523a8988fda66f38b93f7a53dc5a2225fee72bbe00acd73cf61ff2d7b47485f0fe82100860a0589737d920873684a354d539d5876ff8f582f46da6693be40 5yde9rja38k40ju5ac73rdm6ih4c340xs8hj14ewri8f6y88p5263bh8u70gicwguhnxn3brb7idgm4e4mj7s2w4m7pa0ebegkh6rra59485guihdbbgpq8i99ak37md1hs691h59brs2s9gms6nekc9xsxfs06mq7hd1bdfr3q0c5fcujdphi41a76rk129icnus1c6k9s896k0b4y7echjjws5uewqrb57pen4ebgd6y1uaitcnb84g510ya9ytt86f2nrf9y3si9xmfey3q5m96wywn42f638k22xk0sxfrfqjwcxk652c24t4t67fm5j9b40s7bht1tqy1xx +19b8b03942893758f15bf0075d6db08cbc3acc7b9e28b7dcb26cb239417f7883ba1eb9e9a66e9fd92ed740479f890781057bca9abec7ffd4b3c2dc909850a6c044cafe1dbf612c74928f0e6865ac561369e98e6199b6afa312f7dcb9367b293114505f9e07744b9e9d8b9ca51bbeaad8a00565d2428d6a0e56e1de5fac134dc9a2ddb90f32cf4609c794393a76855ce1e43ee4fbf4d02771d3b5d66c73256fc43f48a420bb91db6e2a95c0259cf4250df07f65ce208884a55615e7cb9aaa61d4ff467380ddf6aeb94c0883b6f4d86961be80a8c812 be6fxidrna5un6d58xbu45hknp8buqb5q0tfjysphp1bpkf9jrm5t3u17eqe7381s5ftxn69nab0rmf51dhf7n994p16syakqm2dhkra1f9m5j5msn4csb0ihmp40ukqh3t060g1w4y4eayy5p6qg81ceadsxy68x74ay3t7niidde78ufgdxmfs4cm244kid5k76y7grhe6q2w7ya3qsq4em3b12ic4i4ru10ja35pjy7eka7073hiwhn1pd58a37ad22s5p3hw6dtu0xp117msmy0381iiara2ccdwryq6yeudg3dj8nqqkbi9hfu1cka23hyt5mtwbjtxubama +07f38b21eea3f72e5e5f9e9f5fcfd45c0f2bde7de48139d38d274622f22efca25c1e3bfadf1a735abbe1732d55c202d63dec8960cf09606ff2023daa8b9f12a67b8df4402610e928c8022bda6ccd797d5dd3531f27c189971d9da1314bf3e37a6ab5e97290baff95635119981f7651099d618f040aa891a9aed1219e823642f23755270059e3e331df38aaf39834c9a3f3ca696b331656ead971c6408b0e746a0d8f23b89b50716effb85a3ccad94fdd08daa1621b51d6116981ff1f459fe4630873e9cf911147ce71ab16a1cb8127602d5c3c48caf5 x910w2jitj5p6yp9q4ju9q8tfk3pyyq76pxqqt6ha7brs6ni9pns03n59fjnt644yjkyefdu02mhgjjgnskg8rfxh91xajhdnijnscq5ny4axckk7atgkxnf5cwg48f7fycue3130ea1i3g7ta0ty69bjcuff4fppr7j9sfbdag1k35wdaa140gjxksdnahcu52pb3tre1mjah4ua6xsq09be3jqndyqqx4gq29q1ctwwg0wd5uhp6ie2rsk67bdmw3p3ia5dm0w7970f28guwdj5tahu2frbh27gafck39n8ng96nnkk69c182nrn8iieunh2ifkaqwxfd63nagu72 +fd935c49bbf83099c01dab5c1a63d954324df704a676f95464717741249590d16a1b9e2898abe23c1edf70130fb947b721c953f3d03b3c0948527cf2f5b2cdc535cd32b27ab3e3b9003c3038d09f2bf2309a7d4b386f36a30981974e6e2cbc24e0b36eb1c9642fc659b25b81bce926890b2fc8083fe1c136888834fd63467d3dd13042a4bdd4d5250b2f9551a65178b050a75fd5ccb9741bca8da377a198fd87f49cbccc1258117ad6b06a2303df8065b5da16c1dc50bec00161046996f6418068df5a831a6ceba8a3c71547a7fa2f6ebfad16de35a289 9wcu0ph59x0cqkx7uhimt081dk1a570at15jpubais5trcaupb2wte68srgdy0n6b5jyxa0jysb5i2icdj17xi16msasa93p8w1g5ncu1t1fa8uq6i6kxjmk3b2c8d9perh34p10h65dergmp73e6fs6aqkfe5un1spr9np1wch0bj3ca4akwf82mx98bkcwnrabc9fb218q5tck2dpf5ueuatsp9sdnt12yngrkt7j7fqs1ikh6ubhbi8k1n9g38pif1qxpfx2yuuukh2nk3y6xgw47tswm5n2f7kxmgareqsyw2exeny44kghe1472tjbndn7392yw7j7hr5jbf2tc +3838647cd6619cbdb5b1068a21066a7f1b269753a8b2a45563128b3d46022d26121838ba9c7353e60a3e4cb660b8e5df3fd70963f4dd2c6b65043c881f855643ca3bab2f8ee60d158dd2c6f38f2d6a9e17e6a9827bbc22029b34296997a499f58615b5e461ecca079b9cfa7c18dcd4de94a97ea0348088c269156c4343566d1b5958382386bf1b92b94e18f32da8b7dc09a237e566d09f01be4a9704775d5b51ce2cbdcaed380927ea66e336bf4399828e656d4799e663478f566aa216d80c8a35d2de54fea6a046736d3380740adc5becc2801badb2a384 3x6e29ewgeif5hhnx4srrmqdj6hphs4qur1d2ufbrdsq4nkrstqmaem0ydi3et9em29a1hqxybp78j8ymsn9cycghhpk2ja2b8rugk8d3iup9byemtd05twe8i3p44t8r9qdqxq5yknxse1tsst1jca18wbmfhjag3wgtm65qq730ee64qjccdf8tx42mrerhadw0k4bd1wnwwd03xn0hj05pd6t6e3qswtfjyxct258d1wkq6x56ptyxn5u4w4n10wf5pyh3xapj4qe6g5f8k61kd3ed5d3q3qeen6jd1udasw0mpsbftw8dq9dh2reihwq3xbtmfisy5erkxh45gubkk +5121a97247d67b82ccdafa2e07bb942f18fcdb962177129f212765ebf8b52be037440143be82954cdad400ebbff481611041acbd64dee9b991fd1862f621fb2f058fd2e48589cdbd5c44dbd3cbd1d00acf5f9632874b36effa0fdc64b136dc675253996b30b60d956339245aa9b2e42d766ed159aa0a771ab2016a73772387ccc56dc60968183f55fc5989f85c4f21b7ef39eafadf582eedd5a8032efed28bee66d16f1baa8188359e40a8428a2ca3c5d5d66bf50b602db5e0a570dc305b7f2b8466772ced1bb1318e1a38a759ff2bd686148f2e785f029d84 dak4p6p34170sqe492yxji6ts6gj1w6was5ns31ma7p8y8susjkbinxm2i92ssdg5fdxm4798pxwrarmup8wcyycye294ebr80k9wf0sn9cicmgc1w8u0ne54js7btxd17j1ggt3cg5i98kj5npfrhw6g7cs3effer5x5sfb3apsudhp6kwyg5wnfeuxt704w2xwt65yaib61nfh00awkem9dy8sqrj0fn3pbh9j33ujuy40s5w7fdxbs59hsr9ig52w8e7dkeabf3pxumm2tfsb0yd7g49umhkr5hjxtu0h0gr5j6u021qysqwnygcnn0hbnc4196u7hmktn6y3ky0rqwrx +c9c28047b144624bea30e107ba2e341eb1bd9c9d87a619737d58cdca2e9fde70aba1eda76fcecc31ce353876f23ca27b202f840a0019b13982e67c51bb299f75eb64aab33d00fcb2e5a85a181c26c6f78af7bf91ac0b0c00bfc12b04f313f3e56d8cabab16fdf46e2ef0f2569d9b0468974d30cbdef8946ca4db6b48bd0d7e32bad70602f799e2a1e6d9b7fd3912458a02f525f97f7ec00418677c4da0cf8a437b90a1651b9f7c2ed874f7703b87b130620a764a98a693199d723cb060d433e6baa466368fcfde4f864170f602a5ae8826a7d8c8b305aea6b60b 13m2xn7n2nnay4nk6ab5tfntb40553a7k8qmp657fbe6tft9510dy2jht7y67qmn104qk7yp3pn3w2mjkksxxehn3emig9rnygt187jfgpufej2x9p1ifdr4bxirhnyynf559ahgmgexmj8msgrjea9q6uw01d7fr58925ni8b1sh3g5xntciqck1jjjnsbgtqhwwps7mu9bsiwyx0mjjejrt3qhqh973acafrkr8tp9p9580xrmk156cwkg9rpbji2dr125q78r7wbt870bym7nemnxt7pdqrqceeg7i28fx0etejqfucbee4369ypjk1xym7krtwy2kcu35bafemhit45xw +7cb5c9ac3dd7fe8e6464a94223d9ea1857744967c93e76fbc792b1e3bf5a3ee05f7bd6b4a9ed00b424169f80c2b4aa7a013fe6939f6bb8a7bd2066824174cc25b5ab432bc2c7aae452e8fe03447889aa1f6ef19794a7373a42e81ca5dec2e79437fd4a7f06a923748434c94117090659e0a9e2810b743181e5bd68eb0c6fe8d08164abfe320a8cbe076817f9cac54fb92bb8f1b2f0d68c544113229556e7d2558f6d9845d1e9364af855700ea36a88d566ca5a6df472751cac9804f779a9d39f4155fb2730e4cbfac4e32cda75036c5acd288f3d7ed17a455854cb jp46qfm7499261bausmr3wjdbmfy2pf31a93h883pd083j4435ks888wwpt84xstakfc9xerwpu3txc964c18470t88px1tr2s4g0chuuhmpykw3ufpss438xhr3nrhdb7yjbs6tt65qtky2bpp77ky3pk594pq9x4tpe7aaeqatrs0cx1g8mdjrkasy2ggm6w8wn40gh9thmxfauj9bartgy0bwks911frt9icfyb05s6ewnndara1rpufijtpun7w1knin7a5au8ruix3de4t24uqgtwqh8n13d3sgqxrji8hc4ijtruj5a60icp940qnp1wquxhwsuqc2n68y7tf42ugscp0 +ea82e004bcf2a30f5984a23cb127af7891878928febb68c764d94dc5726fd657dcb22a8cf5e05c023201073dc1b4c4a39f479fd46dfd8b17d7807bd2a21d19f026cef6801789a63db195031952941fbf37a1f2058bf17b4e3a9429763302fc23c7b3ed42fcfcd0fe0a21def7700665fb13b8e759ba6b4d4a73b01bfff5a377dcb2ee6ec0be248161ba8a4d18730dc9cedfcb1b1f5cddff928fd85b018ebf48ad32464f935b5cb9dfdb06375d5edf1a6473f2e05df195a23f565bb32aa894c3af27f02de390446050ea884e737aae2b85291f334882b2cc065d325f78 7dmixms68dnk8wgat28frc7jjr20jrc2947wnn5a5se6d6qj41f71gndnq48xyxre2xkijimwqrd3343q9de59gfr9f0x88pt2inq6me1552xs6ct085bs2bbscc2379e8k9amgf8s7t6ittss5bexy6ajb535dr9q8hm9kda3jji6xegy7n3i33fe7ewqddii0my99uth571gyih5xf6camge72tq20ige6qqw91ghn8ye798c29wr5xe3f8pshecba9a45fp679w0ee7iu7y04gn19s0r78ed4aj4wfi1pudat0iypj6mh6i2a20rk7daa6654u0u0dd29eha2sgwgx1iqay50 +b13bbe231d0fbbc7b9b423bb05d7b32200cbf59bd032367c7776dca804371a6407d10b6bd79cc2ee3158e1fc5dcd0655c87093751163ef1e1a8763aa20cc8bde0d85bb48d7a202d83b50182f33eee665affe716014438d137337bb2aee8b7475c199b352f67529cba761edd12674fec34bbad47b80f5f76378aa04b08a7dfae598cc5e466ca04fa1f8af07639d7a854b38b74eb304801d396dfe94fbe8843ae255ebd17ed29b7f68622fb537d51b9c9b0e3ac3d90a4a666f48d6830aea9ef20d4e6f0e03eab49ae8650804988c9b2fca12e564fb99979c0c95c7f645aa wa756207m876jihtai7kfu7qa2xgy7g54x1bg9byi5idkmmybcpxjt2fhjf11kyiesgib9r71tbsfpbkph4nr09jb0h2i07dabe2yykhkw7tnu7rxfgbwtx0s61871qsu993r0xt2iene61yygui7r5tiyx1qg4p814pqp73g3w7rcqt95mtyiwtjixjf75bjruxcgadjy7ifeegf1be12rjt36d8m5bqu72dp10w73femaxbt6w59tt9jt22iyrdyu7r9wpqh9wk0njwt57de66qg3buk81mcseg54244mku4t882et650ixjufcey2gtaxceagqgy6taysgq71qs66mpd6j7psu2 +13a6a4d06020699487f29cb84b14a112d1f94f6a266d5a519f607fc18a3889f7cfeb7775e32a3f01ac026ec230109f731766ded3dd3a796419aa8dada177223ce60cf707c5cf260f6028ce352328ca0194e4981be6eda34aaadf020114feaedeab7126ad9aab9aa93bdeaf9d64cd08c925caceaca396f55f3ce34cf1e5277f4779d9a40de2aac9d8cac828a0d1f29aedd90fe07c16dccfc483949099ee3cb36a2b430911ebf2b6b243dc674981b6bcd72e5498613fb31b3db6b84454e57178e840bcab315b58be52e7e510dac0a19f6631587edf5cb0a6ad1be781f63d1d riqdctbxamt1cm9pqp6awssmrf29pq5da1wuttg9gm96brn0n356945yiynptj0mukme7knkrrjyes5e55c74iq1gkg4ubhhts5paj3emq5kjnija03wxdeietnpnpkmpqpcke9e7wntudw9x2xnc9ui54uyrcuhqdu1udc554y141ehmbapfpwiupn1h7d93qnt16jsa79ti8i1tke8sdwc5bsgkdsx431cu5i1m9k30sw619r23sakq3yb1g5dshmkpajf8d5fak86g7a0bhu646yscebm381nwjhwymrsc1fnjbtamjsfeshunjpp69pnmwwxtejwggd0j5ju1gseuth8jxjw3tik +fbee42396746d12b0010580a38485aff9203814ae3c1d5d03633cc6632a0ba631d89b44012d3235e6deceb7cf0f64a4d5a4a0575157cbfb487a32e6a915b667896499ed044b45915e7b4052194f92771bce3da831691c046754303872a7b5c2d3b44f396ccd09db450b292abeedb7018cce27404f1b85b6914eb715cebff69beec87c407231ba120962241981da85481cabfe41fe9edecf724eff517bb5e3499cdbb84eb93e2b8ee5990a1477a18b3c1fcc57c43f18138eea0f4eb9db77425b6f32499a11c5d2421c2dfe4990a69cd7c5a45472d788bc27f359268a76ba820 9jyaaif3252pwxxkfxsbkpr498cx3xdd6jx7ftmwejeegguxycnn5rht2xche248hywiw93k81sa4wpdxu4nd9s9wpb4efqdpshwg8awcejhxnstfad8jhxsaedjpc5nyqn7ux0wp3xag7dbxibpt846st7tc66w1q2c5hrkwdcdy5w5ixgg10qtxq05kw5crquyry3f97t575a30kbpee7marfrakg0bwtscxidy9pm94jh7q5pc59ur87u6ha11w70c46q6d6i6wgktsbytesq038gd9rb8exqn5ux8qu15h5taw5jeca1tais4cmm0fj8ce2dh3ey0wps26wynr8rj641a4s3hitrx +81ae65ccc6ad282d0ed67dfc0ccdc84a33cb4f4a1e299005759b7fee627cf9a29c0cb69ae76d52e58833798b191c621fddaa3f3803fe4bfa1f7d95909bd98221dd33c5e8746815c40bb98fd3c6cf74b23871067bd0d8ab870490346cbc293c9db11ebf699cf1e1ab3d3f1bf33a3ff08686d9115d903c8991bf1e2fc78342c8593ca7383fb009d8cc3e9442b628dc4293318f4e5154728ba19c9375f6be4d38d7f59685226a722d96152cf6889541ffbd710b37bd3dfb406c1d1334166cb8c8d2548c9b69c02c56d9fee6fd7213aa24af34d20d8467783fd5bffa9bf27cb4bd8f keyefqeeuttr4bwwjy8x1qi2c216wq4db0t1xmfuqh9860q69enc0bswqfqw4tysnx1yqr01bnnm9yhd366x39pf92jy5sgkqjg0a2i7ejr8k7b2ryrxyigj4jbg87sp3m0kg88k5ru0imakenwf0dc6qw0n7j5cqq08bd1736h9ein98rb2hw2nfw2b1rgny6jr9n6b2faspjs33x95xri01k9c2kuwsbiasa1nn73srubpnik11a5u849a4iey8wf2d2qdi2w1gscg84acdkj9yu0kwh773y7tx5x7rg4mg5s01bcscba5h3xr0uw195qj46kqu2pd8hepmwrei8m94w99ue9pjp4f5b0 +d9453d7002f0b3e249c346aca8504f6ad4dd3efc009820e540c6294fd300f5b210be6c799037d261794dad4c4ae3ca706b6e39178c6077bbfc68fff196248f3e3bd760e98ac6b79cca980b2185213190fd1f8e316c95decb5143eab31308b3a944dcd388edc943d3c82c4336cb5d8b01eadbedfb2fc6a8a46fc68347baf76ad440defaa5f64c5b6a209a3d92b083b22567a58d06c0b9ed90bb30eaac8ff1e543327a64d46b9acca163479f38a1952bf39a55690689ebf0c071a6d9b0839fd4641c939777c276ee68653def13a991398b5059161e44f51f1416c34e47e45a791f5a 5srq46xr8r18apib24wdktrjhfdh4jy6xrgrm1dx00tt9t0x8w1mmjqgje2bjtqmjse44qrd6js3x45i3af000byyj8en99np0p28jn547kiqrwew8iguexfaerprggk9tj06gfgpyjgwtdb7d1nersqusrh1t627yat3t82snmqhp47ngx8uw9h9gy6hdsah9b2en7487uh2ke89dp9gqr5h2kctjgpwrm5acf3twekhks17w2fwg3dup39b1dbec7ecubfqfedr043q66dbscf8ihsd42en3u9mkbnt5g5mx694npm1a6yi9m3h5q2gt888a7cpa60wtr1r0jac729rkfgeqp36nh3p344 +3d2f28a418f9d998bf5b2312a70fa0cd19f5bfdc79fedf3fcbedf062951bbecdc4a0bb2d82275a3939036e0ac2bff371f842dccad6341d8a34acf6ee72ded9f7b94edddace69565af66666606c4e1ed868e7dc16e932ea892fa11c2cd4e684f99b16c8d075f928dc6f0154b60437d443ee88f7c007fc0db3576da3653ecc11fde7c306bd257910fa46cd29a3afed33ecfced2f460fa3926a3d0165b55d5a00c794c9ed1d411f9f018da68fc15ffe748049258c5403be18b1f6ca0f557ea143e3eca7d4b0c07432f1d72800bb2eba5ea54f113199c3b200db8136b21a433c9a109340 3typncx093g1nj45agcdib7x1tg9fj86j39h8j8f7y0ess25y5e6c2s5swmriwn13amw6rwry91yb8rr5qshghx7n24d17yiifjhq771c5i7uqqcd1hjg1qegmwa63w0hbq70sycefu2pf7mbkwhc1ta9ehnhpekiy6pnybjxsdfgmmy4nm87r3y0xb90bhqd7w4e1c81k29518bx48pd82k9cbg4dhbu9wq35367tytgb7bpcub4xfswuiutxe3pqa843dmb8jkbbhen9xu99qtkmapfbrtxi9mngjw123ud9um2jn81c8twbx32gyn46txmi1iycjddq0neeg63gkx5ixqhgk42g8ctaaq2x +8de65e4ae3957d0a74a81714a0eda3fac4a6bcf0527e49dfc7831a23d219c26d05ee2b747b99a9ac50ac406dc8f03681b47dc3fdc7d63fb71ea987c805e9d0b1921bec601cb1e18a3798cdc8ed51eb24062256ec08d7e3cf98fc3dd986cc6a9e50e3eb36160b66567ff569005100808536a07a60b27a48e331e5df8b31c4ea95d933a4d1bdb58f855ddeea89afb7cd4a10d94f74da392344004c6de2f42ff2b0295e707e4cc4c478854252fa195aae37f6f4fabce9fe781a0a71979c13fc0accdf43da5b0b39c5c7d20f0be492db5b4ef57c34704cfa14b8c49bfa58a944458fcf00f3 nyqs6pybpu8kt7s2r6ddm5hb9frdhj3kdc9aqy83kghr3tk10cwkf5nfin71qdhgdrwax5i28x52bhb70j86jun9w6jdqm82xyt7mggpbjwex3sn6esbjeeh1bwub41ax0nsh5x249n69e363yg0hqbdq12i341wr0swguq98utkxt2xkrrqh2b4gr13tp3be3p79r1n0qucfwcqtq255hgjkui774tcu8564pkk5s3ycwn1ahrxxqbh6f4r96ukssj3x9pg0qr3nmdrdf7mpwuie95jc8u67393kekdief10a96mfeh8k84fgsqqni3423ky1ap5hht77f6en0a18ktybrcy8p0usrafb8jxb1k +46336a724ff1e03d1b4b7417a81816f23f513711a599b2d2fddc7fed62cb30d76278dac887acf699eac49b26e536055f2a39e25d624554234abdf7b88978924ec4c7c14ba006f9b9cfbbcd4e704192144bc8aa8a30f51a5e5793ed33248b801de80488c98d4da1f82cf13ca8ea365c0f9d1be5f38ec38d6f7360fce02bf52c08dcef29842e7265956bfcd3e7d62ebf2eab56cdcac0c6b81f4f6a56e76dea433effda7d0ea06d810e1b1c5bb43a344a2974cdf084bb4f30e256ca1796a336ffb02c48e15fea7d2c5f4595eebad7a66b30f0057974c111cbc31252e6439f27f68b09ee6600 201wt6pj83kb4e4fikf4kexw829urh0ntwg5sty75n9840wfebfwa8e41rb417t17frcwcyse0ru8dn16ciwandtahsf5770ns6caqwa09xty2xe9e669i8hc10abaktcjadurnk8ths6u6q7t1pcr6xbytxcrecnue4b8mg8a8dn4nwfk314e9s8i3g3bfjihkj10mf8twxny3jserr66qspuu91t9340yf8fufd5e6ukeeyxjt84pw67w8tk1899h34buxhwxk6e06fi4bthrdss4g56aayh3qm0pw12f1h21w980r0p3mf9u34fr92wd87iwyt1uqm6xsjs4graif0gcss1pbq6q9hr0c71qxx +09637e2bf95838d6f29047e2ea86531e2fdaeda8f965024f38da0279d6416cec0ca98a9ff22b39d0d9d62f44aa8a7b5113fec20845229dfce8caec847b2117812c12571d0368e4caa9e8a602d42ae0e7c45ecc90115f67a86fcb1cb0dd4398100465651ab15c5eda8e9e49e2f3c2ef8e7e0c0107c65f0975c59de6abbb7e329525b812c7afe044903286fde0b34c636d0c40d41508fd4ce9b3c866dcc27584118f264db56eaa3dac347c6d9172b50e250b1defefc5697f64cb7247cb47af33f16d86c217fa8ee291b76013d9d138c2338e731146f2156593486dc39d82bb52b7980c7174b8 msny6d91fx6hh6tk29niumpqb0y7u5h29spkaq1052m3qupmhqwx1dgdq91rwiik53fr8nsdnc7ura9802aad2t79qtgu5aajgknjxcgrcfn4x526qsdq4sexfdru0330njg1axnf7q4k58fbp0h4k60rxred124wsis7wtiq1a8s68r78336bxmx9bs8rfu0wi8hd75j01cdch0rfb490rapx12h9jxwheee52g2bdmdr37cqt53pbe5qm3fmxnn6qa5hfiu2840hb6hw2ysh2iatsn559j0uty81eficb6wn7jej0w5mwrr97270tnw7km3win3bmb3bqqrsbjasfsphae5k67kd7ush60mn0ycix +99ba771ab112205c9dfa520972b4723250edd317d18662cc76d774955ba99bf82f765e66fb79e023ba0187182032dab25bd8a574dfef6329858dad044ee6c627ee30a274a6992de0b6af06a45fb119d30d0b2bfc2e313a96231849355288a355634ffa4d15f72bbd92e43e41fb3892da8c2daa8fb8ea2aa350dc620e128ad4cba070794beb8cfd5386826cf131c5bb7e786aa64a4c01bfe5a66b59ae3ee36b6cd490d35663adf95283386479f2e09836219efb80e2cd765bf77ac32c46a65c2c3cdebf735f13abef097e4567adc394f1e25355ee65dba2c92cc2cfd3771edd338afb485c98b2 qe73ieunr2ks13j4d2ayshbpec2i5t0y4ebesqbw474cdw7cqj6r87p8g57yq0mby2x0iemxefhfaw80tu4h955bser05f2ac5qggc9iern3cct1sykfhf0etnj5reiqmtspy9miea7cg200ca4usrsbdunt98phry5pyjgp6k9ab810pfh20fhdn86itdubdbieabkpnfdgy2bkjss8yb37dib2a53ne3r5w9q0hdqatqxmy9p4g441u09ie45g4p2heuqbuy6usx10gn69s0a0e0k1786x6feygw9yjfmp0nuefkwb1yu9ihjn3d9jms9ad17h0idjb0pqdyyefw7r1awgsq8qi6jh4g6d9has1esp +c3efc5e5d1c9dbc5099502ca91dc810d152d2caf516ef87d045994334d366d2ae84db296e38625806c8a90396d5afdf31a74666c0f0fe12ac6902e54a615339c36a4acce89d8163b062640bbbf2031cadb1ecfa3e72a13d6629fba17947d3c2e63fb106f059f7ca66ad2c2c0960384004135d9066881bfcf106b5b4cbe735f08eef601cc5ab32858f1e1fd1016865a345997dbeb3a49addfd4289378ed081ce015f5f6890f379d03c9cf821396d13bcabe5cd0e46edafac9185f63fd64f3acb83b693dc8f910c2a3f5d4bf44f2bb6da91f598a62abdd354dd36cfbf4ca5a72dda8293ad40d3291 0jy6f1in13h6drguxfscbyammtdp4fsjdsyjk92afedbeqcwhtuikqhpp5n0gcgxhpscxifhff89eeqtg1wx8b9msfbcxfptt0dq33mwtpwg7ri0r07kgcpxyi9pxgid5gjg9293s2c7g0t9y2f129c6s1n9wabjxwjy1cqd4fmgmskbkkxarhi1x1t2bj8jrmuuwqs8ihjkn5ywx3esug12fb08b92kr4bsthr1p9h8wipcuyj72daqjbwkk33xry49hr2je8ik3pijk2c1htc51d9s1t3ah5hjup20f7n9413qup6bw4c71b6nmkub8ydf8n3pyhw4p341ncndyycucycw189t1ch3syh2sa7h2bcppa +f53ab6396447646e757a71e1fbd61f94fed47471623a1f6cdc7f23db8d826fbd93535c8852d3945950cdf1542892f4172e3ead1e0bc397372e3fb10a4876cd98a9f7fe03dd064e870346ac40d163e6f367ff379c13045420575947f2f2594620703579df2944c280edabeb2520c2fddf8225a019caaf20e4347d867073da5742441ebf024a93ee6caaa0f0c5f9a5263c15015eb31c3d2d7fad3c5581957208b00d9f331ac9be35fdd51f22dffbbab0bb6fce78360f97f2163cc3ac7b58465b3d157cea20be50638697e7b90fe616ef6ae2a4549a5e278264bb2f2645fa4617783dd3e7e850b794a4 8t7fgifa27pe67f4i3k9yuk9pq9h27bng27m85e6j6n7ybgrh881et46nmch3sr1dbe9rum2pf4mifn8utjxyk6ye6yb9g2dcm5g5esc899x3y2ec4bkenug2b2w31yqg99qj3xqxndrxu41291jawdeam0bd8i9ssrgsx3hujupd2er9yj0achxb3sd823aen80g6bq5cftanx8y6maua9ihpudm6es9eppgjxuxsjfe3m7su944jrukedyarskmwjqeewcy0495u29afj9yiukyhy668mwm8f9asn60iw3wwrefg8nd93dar9sx06ep9q5pb9er5ywu0uadphs6c6rgp7p8cps9cbmi8m74jq8ktsypppx +393be03fe79db1ef9ba33abed155f0b96d2425e35139c65117d6435ff3a96645a1cc0a039b5c681085205ed2c5b90fd18caa1413d8d3306f51f83735f7c156241f9a494b1bef8069f6adf5d279219c7b7be4183265be7f1ab5a3a7b27312bc3a106084e8e7152ad123fc9e053376476a6ef2d2497ae6858f7a0bfe99b4d7aa7fe6faeaa2374c0c92a9a5ec1836814d41c9b9e0b7370e2491f2cc57772e6a91b4d29aac955d7f3045c833cf8fa06084f519dd975b26de04d0881a75ebcefd278a1be9d6a4c9e5c793b0232aa5fbae6ab2087c2722e61eec0dee3ee4e8fc21a1139c2f11dba16721fccf 3a78xj93qw089e7b3d9hrujkyswp2cjbda66gt2y41mu967cg1r4bqxdxihu04xkktks7twsya37bbsdrkc7nt1kh729kh1u89xugcx9qcatwe9jkmt9hfju4c6pb3b5jjpmkgqsy19nuhhbt813eau6322emm3266dputcb9pjxdg5w27ue76wpcs7ihmgjj2s97eht48u391y47dnbiqxgpdt4f5x0e4xt4kicy3kfih0iap29sqryi6yeuaht4dhd1sd7j60afpmq1834x0aa8tg75s45a5jxcta2bc48yqy7a8smy4iwtqa8fn6qwxnpucj5u1ufarb6a6nig3ygmyyb71329kk4ra66s627y2f3a38g8 +232759b064bba551e45b7e455f13d9020cb9c1c2355b14cab2388ad64e43625d1614aef3c7eee25b026beacd06df3983b82b62d9e209a38dd3c60fd7aaad74663c6654c7ac8e6ce9c366d31b8afb0f2db27ff03a0e6fe24e0e302e07e36613f20fdf253ce58fbc719509819e6e574feaf148d5f3a64572de098df5a728ba57c23be9544f60bf7de388e854d2153c5211dd2f99ad2b375866e039427984dcef320b8bb073b9107e3b37259dfcdaef2b57aab9c93ee8eb4eb3a20e3cf50bf597d8f04c221956c0e73634f9358189340e89ca68cf22bbf28bc36bb9fbbfba1b67263e57a14c03dce291491f agquqgbayipub1r5j1ru8a81x2efqkireuhncpup3rshgqpbgcingssi8jb870p5xcu8uq2e56603imfgfg8arhbnyc6gb8yudwy21n6g1dgjfaihqt6e1wqbisjwb1hwc99xikih9na6bnks0b8e1kq82378cc66w3506gumex165pyc9ujrpeu8iqad6w8mee9fc12ycf6ai9cdn3wmj576iaikueprt8saai7s8g44d1yfmqixidrjerh151pmis5x671rm9bwh1sqy8hu51fd8ufqpc87but7g7rm08jdr9up9gjxqmrbsfgm11weq6qfxgcek32qpq216nfy6tf0hu5q879y2hwicn8d8kt0x866d2tp30 +43054697471ecdaec29c315982677926668db27e2e0d775ad697adf5acfa107b81e6de5a5ead1a688defae56f2542e468526b9c0348f6bef86fa927543f658916b90313ce58a93196c1a863c6b62f77ddcbce76575c31bc32e1a1871be1b5ae23dd2ecda0126b835fd1588ab362148cccec9b1ddaf1dd455b79cb27568d5e9000670a61864c899aeee7b0f014c9690a008799f85060dd6ded2940b0b5191b37fd80fdbd62d92eb68552a20e8e9d5e64469c724ceb50d9b4e0f128e0a993ea10b263dd183cf8feac71e75a62c6cb42554a182be26fea447dc597697ec8b03b14b0afe8674b1e3b6aaf711e9 2grths43b5e47kt6esg0a151a1q25gq8s0eyiwwwp8w9ff34rm70b1w8fcjd4eq2nyy46uypdkyahmcey3xbcb5f78bjuaqu2j5snaffpx0q11gdpggw0ete3nuws7575p8ii1fu0gh6efk4bm056e446287s5e4xaqfkhj7rwadwhnmcbeg7phn5wyn5uruw8ifa7f24ytkxmqkt0gecpa1u5y3wb0mcpfcm2x2jej0dmkh45jhssxfmh21bg595x37yunhpfuwkucdabtiquje2nt6iceiwte1wqkjrd3xuec8taspgjinkj3094w3b144gfbgwkpuc2gry0qj7cr35ngyhs9gngm5rp0d94b3cgjbw4ujiajc +7018d49470190f00cf9ed9b95f4a9be8f4ec28a246f3e484c2c2a8d3d5c7902b86b397012dc60fe7989f3ad924017d3e234a9aa0edeaf33b66e6dc10c7b6e5d94725ef5ef050130dde4a64b56c4ff29e5a753848a28b1c5611ea824f1b3f0e4a00b1acd7ecc1f42ffc7a383657854d925040e08df44b270b0de51a2a342f8c10682eddf2d22294acd0b8a3b0d3fd6f727ceaa4a1c2703fe0b5070ffc70db41d6e98f41bff81fb3980217bf0be277d561e3a18b9339021b956e394c2b0762e8ba3a97651a0c780f0fe51ac0586aac84c8162ee2e4a6b570679edb8fe443350315b575864a870ebedf2fb7a1e6 ixghcsbkba3kmq685e6u8pt57b4i0dsr2518cmer0dth3ui3pxu0hg6yxaw6gb93qrjquwcaxs8q624dqdki54yq3hqihyxk085ifwd3ayyu76rkrge76pqawuwa96t8fc4qkpsrngisgajdkc3nwj0ic2xfbfey7qx92f96j26bgu6scwcsxk3xny4awc0fmypntdnts8emx4mi5y1ha2ttuq2fn27k4j8w86q67dpdbkqk39kfdm0j9n0hwkiw7e3tbj90b811kxkyy6s8a78ug3n4br6q3ammysfi3serwm5r7r7bus5sb2e3kb0j6thgxwbduprgksni6fpdhhfkg8jhyb9a2g4keshuiwbaum0iy5jp9h7m60 +2c5d7ab8af34447d705994d2e502c2aa7b08efe5cef705ecb224acb49d858871451f151e56dd5e007d3a8947be4fe9cd7f051b0204f0356cac45f84c2821e4bc80fec15a1f84a6cc6908ab22e5c2681edd65f74e06deefe4add431bcae8efd8fba9fa9110688041eecff2dfcfff989beeeaac0589b7e87be8645a5d5fadd5499513b3c9daa99595718e12cb1b8110950ebbda25e842a0c231aabed47b060c0b29e449e142f40c29a69025013bcdcbf68a21eca04c7c12c06e8942bc83aa8d4e0f4cc844b88b84fd15d149db033ce3fd64a545d949d4a83e2e36fec7a830acded2119527c95cce6f6fb353b09e8 sniyuisjenr346r1pqcidxwruc7kn59s155kf5spapwfc3gsnm0td30ub1fh4ykxjt72pn78c9t6490sbgmxc6muhpwaf8rgsxk8cjax95xut36at5eeprsfafp6a4x85up9iqke55y8cfitee8d7by7n87c9d2nx4ax23yg96w91991ne9i7dwxfrhy7m78k1r4fuj45udcptc53pi4ued1d6girfsnyx2kpt3fywns7mmdmknnud9h280emkspq1rc6smj2bmct42rdxc51ys9hrnm7pka09xp0my2pku6kiu24qkjcqaaciafkq8nftdc5gmq1097gpptfwdc4ptb6fnw95b4kgsg55cmbsc31sig655jwhc5m3tx +01ff96b09b4a10c0667686ba2f05f697859c2876ef8791ee4bef029e2f4c494d60f31cf42ca65daff0ff0ba932307bfe04c4640e56f5534f15fc692dbefc235a79947205c2d2d9d8868b32016c816491e3fa93ee2305d358c93f42e283fd3c045534a50197eac8204967755ef306affe948bdf000403c817a0f4a1281c7a4f89a18afc875ad504855d9eadd3b4ca5b1899a224c3bf6de3d5208ec83e35b795edd7db424c56a5ebd66cca9caa98680ff02b3e0bd940875448524ec9308c121b9388c566383f739b003d7d158742b82e6e85c9e31e8378c23c55fbcbeb6f6da93b28ae9a48a3dbfde43f9e20a0df5f x391hga5c22gx1qwk47r8mjwp8r10dbw78b1b5pf76mc6f4gcsewm6068kwdgyhj8b9kydcpem796meagk3sh7dqc6d904chy58rewq1pn1xfkwp53g2hr1pxsw2r1an6j7c35nbxycunpc92fn239c6xndqcc2mp9ugk2rcg74u760eu99ccr89xxrx3pxytb4drdx6jc30q2gd9pbuuu2akui17fiqwqsswea1t2pg3j5h6jdpmbw23045jsjh49htaqrwtyu7g5edqpuck4xj8xuq6r812rbu2prpc5aqmbxpbic0nnfe3x9y3e0x3u8nfm4ryxye7mic6gj2e8er3nd9yp9fh7w4pi12u4han2859ypb93nxtbju8 +8ab8ed289ffef3c6d154eb7e0badc6058109eb53c64afa0bcf830c4cfc7414923d35751bb226817e3a6a27e56d0f80464178b9394bcfaf602269b7579cefa03809691594b94dc59eab1c608d406fb0b3c8fd60de72a9148c102f82ad37460f31b2f89547186e154b46610b71cdb55ca5e44d2c3e68d4dab52d15dc3d4e51ad60a5acad15874aebeeb52088ac5e85c98ae20941672602c37f0e7aae137859b51aee1e295d3083b26e7844f07001774c53df1878463c994c642b484ca0e061e91a81d023842709e09dd262adefc02e803a22b42700fd3ba7b819c36b7464e902dfd58a8d6cd2ee536283e2f83d43a60e nd6i4da99516htdt7h9xyfiexwxkq44q01sjtr8jkgea19btrpcb4hfubi1rhxf83curj1fhm8xagkf0ya6tyq7jgxneqh4yqqy4xixchad1cidh0wjdw3bxnuxe9gsq1b8wmyqpuad20amjkdwqinkjee1jnsd3bmymdp4egasybqhufpp82qcg31thcwuustd70jdidewwmchgutd0ipyf744pmrsgf4r6qryrmsxwickr0h9k68uirh6sqh2470jrpyckki1e68ra8m0xr74gdjjnk8re3pgt01mfcmedm0bm7ah2btmbkkqkq0a74cnd558xs4xbt2uta6xj4i73yxg6e45tgqtksy8undew1tyidhn230y03um4gbk +d637a82e224a65d3ebafaeb1e8e8a6179cf602c38f2aac1e7b9c5f7804b73607350900f30cb4054d0b5eaa698f93714720e491cb4ebb9908fefbf19ca01dd10c22772a1a65b44efa90b4b30e3b2b1f4dc3544b4fc6e8543ae05292888b9e3c07ae5711afb25bc4ca7194f43ae10dfcd98509baa061caa420fee693b1e8285e63d2094114498d929c1c3588321d294c084d79863d877581903697cd2449000f2b0bd34c42835fc99f78046f6556b3edbfe4520ebbae596cf7d01ea96880c932167955aaea803bfb3caa22a6ad34fe4fc546eab322ed140fdf3b27c97d9834745c4ff97c53d19f9ce1f60c097d4bbedaff 4054kfnrccp7347ju408n4ser8ijgxwbn6ud03q5qnjykmsye0bqdr2x8gef2mdhmhjdt4gjph0ti23ap3st7i61mb9jy6g6txi7rbmri6umt1htc57cmhsqm07pw34h0hdawq8e7mdbu0rppda2y3n6x8ysiahjwch6cpqnpq4bu02h9qg0drh4tmk6ucmx95qc3gj2smje3tkc2adaqbgpqkibfrmpbttt0rrhjebb5m5uke2bhs8hanakxb1fmjct0ktbf9a188xah7puhg9hy9psabu5u1gw178kb4twnxece2f3puhd7dxby816u2ndhfct9136dnydwgni4sxj567pjpf7qx432yrj9s8s3tg9qqk9gbxcjus57wy9 +6c58eee551aa870d649b789604ee658f9c9bbfa81f3cbfe7d2d197b9e3c9383b649d2dbadcf70f3ad02c754126d692a21f59c9c2d755e44a77ef9dcfde6ea7000a34d1b3103164cf9feeb0279dcc8637d4d106005acbe59438d3d45cf6b25b9dc976d2692f5f489509e808cc002618d9e601291c8961c5eb8edfb372ef0486f55dea93b3882cc08aedbbe9cf8f890ac07d8967d84bcf564fc45950cfde65bc2a5f9badb323a5d7e73b2e47a055b8d4c1a61c6c12db9d8589d260a3e1911f2174195133e450e54916d0ab5ce704f4dff5bd7428acaeddbdf495f5f484ca2a365c91623794e1343e90575e64dcbc3de6a712 hngi71dnudbk41a5jrfxc5qsn8icyj72b68f918p4ef5q08c3x7wc3chyfijib144xw3dkce44cda34113mhiujacc5893ij51ydixxdeq25eamngq3195uka8i61mny4q2kgxr41jp12ieq4nijhgp5qyayhtqcs7jtns2c7xag0xmebbg8gxccbpawbnjfn5j5e6yjxpbjdyjdpi10kfexnfw5y4ijn8akukb7nsq7kp8jd1362wdk19jefjmdf8h45g1btyf8ii1i28ksfiet0eqm05xp5ii0fripgrn8ba29as4mptcq6n2idp2w4ruu110a8qj9fjftsrwd7yh78pd9f7aa12ubgyang251c0ct342siyqa5p8b51u3r2 +c1e444663fd9da5626ac8f875f92a4bf251cfdffab477192c1797c1a566a1e654675d5b71322172ec3734829a4db98735868c17639810e3e249fbc8992051a10b0702aaecb7fd23af893a3de6e7cf6b4edb7fd562a7aec2a9b47ae0e38f4647122c1212982aed2dedc656075b891f3c5ee13a9f90789d8da3f7d35cbe7a2a1ed2686e42fafec13c09999dbcdb734e86fff67586fe6c5101bbe3553a29810702643bb23093b0942ca34e277dbdb35f5220250d8c2513cbe0580ab2eb0b03cff5bd802600eea0c54120a025d25dcbc94b7c7309c75d72fa0b27d73acbccb287f0cf23c58878a1f992f4a76b3e8b21bd07a321d 03pa21n953hsgcugn8bu9auay6pn19j9uhbybawmjs8mtuqdb1ptg7iuw6cpas1i0h1tkdha5ig3ewb20s5bqx2i30pc9jacp2rntaskixud7p59427jna7b51y317ut7w594undjfwrue43u03bn7baiangr2cckdyhsyw6guk3fian8jr86a7c9ab0qwe4378qfp93tdk84cte6ky495xq0rg1qw8hw64ik599g7ge91wsrxh56hdqtdgmx6me2i7perc5msmgth3ri9h7whjua2msmwerda8f6mgxugyfmgm697h7kxqxm5ux0uxpm2ms4ci6ypdfjn1kqn47if7xwc8y3fs61gt38b3p3ng2jrk9qaytt7uq7r1mytb4e2ik +c205358598023ab78fd08bfc430ad470d33a03733e8281350d9d92da5f8a6d23aaba16239b0b9a8bbd5b1cd62245e9c0a8fa8a7744c5eb22fa974a0715cfea571a5742d4f7a60ab250843e15e0fc2a114a360c7566114fa21fca15c12b86300809527a304f4da33039b26d8e4b482cf7b00880a3a0af46be33a8a591de0eb80979d6a453a3bd0a1623e0efa255e45da666b342977cee736584378e3448e7c23eae7e3f7248bdd00bbc6d7379e723294b21c218ac825a319f808f4e7c0ed2b7aebe3c11e5633cd8b38aa1dad8c135231a7c002c499dd7281bbdff0eb662834bfd0f4e5de56e8cda03942ceff71b11bfcc0f22cd 02rqfmg0x27fjb8knj8aerwtibcqtx5q34m2rh2hqwchty6dhtn4uikwaihkyetfyuhn1unr2yt6md34nc5tcnjfaf7cipk3ry38tu04d7mhc77emd1smmm8rykj0dknc25x07fers34a38dryxpymnkmxaua8nkc7e4egm1wcw06p42sq55xraxtikd8nu8eitdfai8m46xp8iwtnc43j2dr0n8m57rdyps5cqewhmci93iihp02h6ienaijkn8u19b86p2yy2xyjbhih68i21ccgk6aesgkchbb36xn7330bwpw8yf6jxn6unq1wsqndk7uwemetnnt9xxsna15u12bi898buwgdmty92jc1i8d5tg52m12f3j86hnbj8gm6ng4 +fd16117d96bb86025364fde97413002c0bc38a902687f314e1679fe40107febb7af5301013b58efd6aaff6a54c236e0edfdc9ef43c276372584f99c0406f37de5a2d86e648407fae6c300b9bda0a3aef5a8584e7799a77ce82bf321ec2bac0787de49e8f6a85087f0eae58e757e8dbd62b3479df065fa472d57bab53b50f5fcfd163bcb9930af10a58acf379614ff858eb290aa630c668a0905655341570b27d1eb1d1026be2af5aaaed36f7eb62281ba88eeb72d85886172f1065013644c4eb0e3b0e3158a6c3158c524cc370c4151c5c441ccc1171a2e9a8e0fdd93fb6b296081a7774d12d3756613329c4289b885054d4ce1c 9tfmr9gwyibxat5a9yty2a0xsks63rtka4b9es3mg8j82x23947yu7ckrxc5fby7hdy9hcdgahyx7y86q54b0c5bicga9eix2myqjyp4swbigprxj8ye0gxfqjhxtiyjfdr0c151qc567xu9e2jgsiwxjm88c3tjhdrkk90iu1giiu925jfrwhb156bs9cbp4u74wt7um7j69tfbyp61erynmcgd1651gs39kw3fsasdggeehrkcxupuekdymgq7b407rxqf6dyuudyhe558w0n2bit2745p5mg2gs1jrmpkrhpa0quk6i0iesgdhk0unnca1k5k0kdn0yrabqemr6hr7etim9i1385fssk2bc5yctche7ferg1c0ktcyrrkdqdg63x +3e1dcb3224690ed1abff76dfa864882361f209951a378eae2b7456774d2905121e14a1bf1f7cff59db8c67b2df2296af98f00ae4b5c29f190253133581395aa460d5e0a707d727c030f7878ba2620ec006d27d1ded85e171577a28d0d07d38f1a3cba9d09e6959d69650172292e4f1d94f4ee950b2671b70c610bd09c52affe257f75d0517c69eab58d5c7b2a5a851cc46d9bffabfa1476339f16d45db0f9f2ec30ea6daddc5c66b8ab3aa58e2fb52f9e053b307406b49e8edc556aa44aca797179d06ac6546fdf936d5c7faf55383973c9f8be52bea9b17c469bf027d804df1698eb4b988b3b226109d20df4e1177499fd5fbbf07 30i6wgnaha3hbd99i5j4k1a2ahk9argub2507fnfinf3iqccxtcm6ssmy6jy19415ieejgw9adfd9e3kmfpffkt9bamsea1uka6uucbx4ykdim8ya9xbm763nineabwxx5c343jhkykyru54sb2hx9c08en6ydikq1tuqutwdxfpsaya83gt8qycdr1eie5k002f4rissf98au9yftrnjnt8uhghfn7ptwtsbqre5e99uj7m27nqq6fh2yhk931i0g3dhww70ybeyruqucgis84p93ks3g032mutq43h0ufdtnsgt8fnj32eunpth9j1e5d6j8yudim1ija9njppy4t5r9reqj0rjwxa56fcn44fqrsqw2qmm3cx573mr74cq9d9yj03 +aec423eb30ea3910dd45faf70b873a371611e3bc681fd9c5bba74d6cd45687466875a0f1dd1eb48334af5b723e76e087087b15eb420a47db047ba2202ea3705cce89bdab662f57d1ecf8482f4d5f019df3addeae39aab241b292b04854d2f17a862c1a8187de87121efe61c23d7cd16d43913670404308134b437653add2172241b5f864b00ae4fe1442520749d76eb99883bb328077a2756c99689960c80cdaeb031bdbcda6ee0e1b4bbe48fdb3f69acfda4ffecc4acacf69738c69d11d39dc9c34bb79aa85843651bfb44b73e1010c711c8080bb91986c62af306fd8159336e4fc8140859d78910606b1774d82ce8fe6232ef495da u5rr341k726nmyds9f5kym14e6fmb076hxj7qnh5t7ew1urwk7bek7hx83in7habepyuw6n8i5k2irb5ryutarp35gr3y2nxs4nyxyeine84w1njd92818r2s7eu8xg78iw77fn1ud1abgtpwmasctynjdbr0etmk9j2iak891k6ajf64swt3acwimxaerxqchmygt7h42fpakhu9mpfxrya90daatk3c3fw7ig0ki7qsxbytc4w1ef2qskgkbe47gmnyw8ht5yx6e4fy1aj5g9wqf37tq981nsguq5ciieeqt2733ic0hs5jeu2fmmwde952p5q6axk0626krxfyag0hnnd8gbj5xd1ehya9pxtmmg7jr2kgmuni7e0sqtj60np77au52 +6bcd13689c6eeba2351cd7e4322a3c60b454217bca0f778e023c34c4f324363f37a1e7aa24f5bccd2fcd8cbf8f83e16fd5b88e724d521d821c0d9354ff25e927de01e84a90dec5752f2f8a04aa030cd52293e606e91cc1b0e42a6fbb8c9a0576d6a9d5c1576f74aa44e59cb7858b2e54dc9c78c2446eca03010f6fcc453e1824254cde3679a422d89af900b73d43209932107a021a7326e349e4b4268e6b1caec3a1a90e39510de2ac6b526bc0df4ad60e6e7a5cf9bedb2c205353c1c18e576339bc6ea1dfb3a01bbe86d99d1739eb315cc0cc4353c5091c1e4bf0713967e0e9a6bf519223bbb477e44e7261b8d7ecd4dc22064d86c1f9 hjene4a6h5u4ah2649pbadn6gr4s22f5123yjbkr3k4gc61ae09qj2j3u2pjfjehs9e01j6jkjkw9uh0n11a4tk7k2ix5a4t96p8pc88x3tauae80u4p8f6dxpuxebeuadc8gmycbqx5m1mdh8701eksi5fdquimd7yycdpa6wifjmgfs1dh13b00cre7pkbxa3w9qrs30gr2cdg5053qcmr5rhjpxsy3umpmecprm7xaeqqa5ntq1sta43ew3si0ik4pbn1dae8sfbfdcu6my4d403e68p69e9hwfmxdhc6bkgid7nqqjbit3j532x5y4bhq32y33uqryex1nmu3n2cbkjay6bn3sq8m4hey721a275wn582qqpge6hj5et5knxgqge036k +d6337bbd611b37f4e4bdb4dd5eec9a9852a52578797e706700373eae335980f86f942698a6a5cf948471b2e7abd6d3d693bad66d7b1ba09f007e074e126fbc5b2abe83edb4156ad95426d7f8e41af3f0f9ad73e5217bd28a6da765734cd27b06c800144224ba88369d04602f90e374fb00deeebeb8ef7e95d2a939e95197541bd93a657478afe7d205612b43de931f5d4d8ff0b8d40990ca7340b9f36d4768873b0f0ae9d87eb48807e1c49a9b78e84441a139ca0b68a56810a70ab307a4b74ee86aa9edc63e3e1c582cd2baf5b5e5adfb410a58ba09bc1d9a7ca427d3b98e578ec5c6e517c91eab16c994b6fce249b190e0c26101f2ef1b 401yyjfmbg59c1s7wqiu75a4qmcddcf0js93x10xe69d6g41kb6e9smeqrqdfq6tkn05s17f45c7ha7441wywe7xq6x36m4ircy50w1dy4m85hxuhfgu2cwy9bpmu69k9ewy31cmjjc2t5h3gu1t1tq5x5axxsrrap72kht7xnkr9a3biq7kmyyiy46i89tu4dtqq4dnp7dmywc4gu43nf9342rwrd4b54cn8ydhn90fnuxcpbs3eks18hwti4a33g3ku4i0j442km9m0phcw8322nx4riidmhtdd4xkt6sfem7aw73ik4uc7ybb6jk6fxwhsiyuwyp4584mmcgftrh6bwh31cm34i606u6i0ybids8cb4unhpgtw58iaphnpbkga02m8fynw +7bd46ad7c1cccc43ac5c8bfbe8d610b6de0c4adfa75c1becf3de93e0cd717dc6f0b61d20193adc1fee87b1b37c6242a9bf961324d38e8931c2f3b341ad2df72c7d45c04e77bdc2040f361a18e9a8db5548eb2321ed9f9abdcb18685b5aab5dd42de644921f36a30961b0b32599cdde4af6c017c22642d3603f73278511adc628c013eefb1c13f48aa1ec742604b134a0eacd3e78d3a5dcd02c71637a3730c79cb43830dcaf2caf99125968c8dfcb3cee04bbb97d2ab5e5a663d31b8424d13a5a5f6ee55c1858b2c507aba34d415c613735716d99d60bccad0ade7f1c6cae7c3f9328e4f6b902b8fb9e5906cbb7d7639af668e8b40fc2257e12 jjdeuu8m1qea3fr6nj78nukkw5jx0pw9t7imy53q54c8mqfnjybjmhk7axgquyx974b5bg56gcmdqj6wrgph3btce3mj3g4mutw9ifb72yxa677702rx8hk4bbt4nw4ucbupe2jhq8hf5p00hmhuud474kw8gnapb65derfmwr1pfeih51sjhkxy02qast5x371pjm2nuybrnkxq757n0a9tndk807mexp0qc23d1t93nt7s5q2r06fbj25qmn66wk6bmysjspy1pap1hbah9p1670rfyif7sd48fcqb4gh02cen3chs85ysfkgsngwsx8u4eqdmfnkqihfnhwg7gr8gutsh6906hpy30j6qsbpjhi2ryb716w2e1i57i06481tinhxj02py6ak diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt index ddcf64f7f5..4c1c6e19e2 100644 --- a/tests/unit_tests/CMakeLists.txt +++ b/tests/unit_tests/CMakeLists.txt @@ -31,6 +31,7 @@ set(unit_tests_sources apply_permutation.cpp address_from_url.cpp async.cpp + base32.cpp base58.cpp blockchain_db.cpp block_queue.cpp diff --git a/tests/unit_tests/base32.cpp b/tests/unit_tests/base32.cpp new file mode 100644 index 0000000000..9c8f72293b --- /dev/null +++ b/tests/unit_tests/base32.cpp @@ -0,0 +1,374 @@ +// Copyright (c) 2023, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "gtest/gtest.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include "common/base32.h" +#include "crypto/crypto.h" +#include "string_tools.h" +#include "unit_tests_utils.h" + +#ifndef SSIZE_MAX +#define SSIZE_MAX (SIZE_MAX / 2) +#endif + +static size_t num_prefix_similar(const char* a, const char* b, size_t n) +{ + // find the number of leading characters that are equal in both strings + size_t i; + for (i = 0; i < n && a[i] == b[i]; ++i) {} + return i; +} + +static std::string hex_decode(const std::string& s) +{ + std::string res; + if (!epee::string_tools::parse_hexstr_to_binbuff(s, res)) + throw std::runtime_error("hex decode"); + return res; +} + +static ssize_t encoded_size_mp(const size_t binary_len, const base32::Mode mode) +{ + boost::multiprecision::cpp_int res = binary_len; + res = res * 8 / 5 + (res % 5 && mode == base32::Mode::encoded_lossy); + boost::multiprecision::cpp_int max_res = std::numeric_limits::max(); + if (res > max_res) + return static_cast(base32::Error::not_enough_space); + return static_cast(res); +} + +static ssize_t decoded_size_max_mp(const size_t encoded_len, const base32::Mode mode) +{ + if (encoded_len > static_cast(std::numeric_limits::max())) + return static_cast(base32::Error::not_enough_space); + boost::multiprecision::cpp_int res = encoded_len; + res = res * 5 / 8 + (res % 8 && mode == base32::Mode::binary_lossy); + boost::multiprecision::cpp_int max_res = std::numeric_limits::max(); + if (res > max_res) + return static_cast(base32::Error::not_enough_space); + return static_cast(res); +} + +TEST(base32, encode_decode) +{ + for (size_t raw_len = 0; raw_len < 250; ++raw_len) + { + for (size_t i = 0; i < 10; ++i) + { + std::string raw_buf; + raw_buf.resize(raw_len); + crypto::generate_random_bytes_not_thread_safe(raw_buf.size(), &raw_buf[0]); + + const std::string encoded_buf = base32::encode(raw_buf); + const std::string decoded_buf = base32::decode(encoded_buf); + + ASSERT_EQ(raw_buf, decoded_buf); + } + } +} + +TEST(base32, jamtis_address_prefix_compat) +{ + static constexpr const char NETTYPE_CHARS[3] = { 't', 's', 'm' }; + + // use 'v' chars here VV since it's invalid and we're forced to overwrite + std::string addr_prefix = "xmravv00"; + + // for version 1..9 + for (int ver = 1; ver <= 9; ++ver) + { + addr_prefix[4] = static_cast(ver) + '0'; // xmra1v00, xmra2v00, ..., xmra9v00 + + // for nettype in { t, s, m } + for (const char netype_char : NETTYPE_CHARS) + { + addr_prefix[5] = netype_char; // xmravt00, xmravs00, xmravm00 + + std::string raw_addr_bytes; + EXPECT_NO_THROW(raw_addr_bytes = base32::decode(addr_prefix)); + EXPECT_EQ(5, raw_addr_bytes.size()); + + // re-encode and check equality + EXPECT_EQ(addr_prefix, base32::encode(raw_addr_bytes)); + } + } +} + +TEST(base32, future_modification_protection) +{ + const boost::filesystem::path test_file_path = unit_test::data_dir / "base32" / "future_modification_protection.txt"; + + // pairs of (hex encoding of random bytes, base32_monero encoding of random bytes) + std::vector> test_cases; + + // read test cases from data file + std::ifstream ifs(test_file_path.string()); + ASSERT_TRUE(ifs); + while (ifs) + { + std::string hex_enc; + ifs >> hex_enc; + + if (hex_enc.empty()) + break; + + std::string base32_enc; + ifs >> base32_enc; + + ASSERT_FALSE(base32_enc.empty()); // we shouldn't run out of data on this part + + test_cases.push_back({hex_enc, base32_enc}); + } + + ASSERT_EQ(249, test_cases.size()); // there should be 249 test cases in the file + + for (const auto& test_case : test_cases) + { + std::string raw_buf; + ASSERT_TRUE(epee::string_tools::parse_hexstr_to_binbuff(test_case.first, raw_buf)); + + // test that base32_encode(hex_decode(test_case.first)) == test_case.second + const std::string encoded_buf = base32::encode(raw_buf); + EXPECT_EQ(test_case.second, encoded_buf); + + // test that base32_decode(test_case.second) == hex_decode(test_cast.first) + const std::string decoded_buf = base32::decode(test_case.second); + EXPECT_EQ(raw_buf, decoded_buf); + } +} + +TEST(base32, right_append_affects_right_enc) +{ + // test that we can append randomness on the right side of the unencoded message and keep + // the same prefix. this property makes Jamtis address headers less annoying + + for (size_t left_len = 0; left_len < 250; ++left_len) + { + const size_t expected_prefix_untouched = left_len / 8 * 5; + + std::string left_buf; + left_buf.resize(left_len); + crypto::generate_random_bytes_not_thread_safe(left_buf.size(), &left_buf[0]); + + const std::string left_encoded = base32::encode(left_buf); + + for (size_t right_len = 1; right_len <= 16; ++right_len) + { + std::string combined_buf = left_buf; + combined_buf.resize(left_len + right_len); + crypto::generate_random_bytes_not_thread_safe(right_len, &combined_buf[left_len]); + + const std::string combined_encoded = base32::encode(combined_buf); + + const size_t prefix_sim = num_prefix_similar(left_encoded.data(), combined_encoded.data(), left_len); + + EXPECT_GE(prefix_sim, expected_prefix_untouched); + } + } +} + +TEST(base32, right_modify_affects_right_enc) +{ + // test that we can randomly modify on the right side of the unencoded message and keep + // the same prefix. this property makes Jamtis address headers less annoying + + for (size_t total_len = 0; total_len < 250; ++total_len) + { + std::string unmodded_buf; + unmodded_buf.resize(total_len); + crypto::generate_random_bytes_not_thread_safe(unmodded_buf.size(), &unmodded_buf[0]); + + const std::string unmodded_encoded = base32::encode(unmodded_buf); + + for (size_t right_len = 0; right_len <= total_len; ++right_len) + { + const size_t left_len = total_len - right_len; + + std::string modded_buf = unmodded_buf; + crypto::generate_random_bytes_not_thread_safe(right_len, &modded_buf[left_len]); + + const std::string modded_encoded = base32::encode(modded_buf); + + const size_t prefix_sim = num_prefix_similar(unmodded_encoded.data(), modded_encoded.data(), total_len); + const size_t expected_prefix_untouched = left_len / 8 * 5; + + EXPECT_GE(prefix_sim, expected_prefix_untouched); + } + } +} + +TEST(base32, jamtis_address_size) +{ + constexpr size_t HEADER_SIZE = 4 + 1 + 1; + constexpr size_t CHECKSUM_SIZE = 8; + + constexpr size_t PUBKEY_SIZE = 32; + constexpr size_t ADDR_TAG_HINT_SIZE = 2; + constexpr size_t ADDR_INDEX_SIZE = 16; + + constexpr size_t JAMTIS_FR_BODY_SIZE_RAW = 3 * PUBKEY_SIZE + ADDR_INDEX_SIZE + ADDR_TAG_HINT_SIZE; + constexpr size_t JAMTIS_DENSE_SPARSE_BODY_SIZE_RAW = 4 * PUBKEY_SIZE + ADDR_INDEX_SIZE; + + const size_t JAMTIS_FR_BODY_SIZE = base32::encoded_size(JAMTIS_FR_BODY_SIZE_RAW, base32::Mode::binary_lossy); + const size_t JAMTIS_DENSE_SPARSE_BODY_SIZE = base32::encoded_size(JAMTIS_DENSE_SPARSE_BODY_SIZE_RAW, base32::Mode::binary_lossy); + + EXPECT_EQ(182, JAMTIS_FR_BODY_SIZE); + EXPECT_EQ(230, JAMTIS_DENSE_SPARSE_BODY_SIZE); + + const size_t JAMTIS_FR_TOTAL_SIZE = HEADER_SIZE + JAMTIS_FR_BODY_SIZE + CHECKSUM_SIZE; + const size_t JAMTIS_DENSE_SPARSE_TOTAL_SIZE = HEADER_SIZE + JAMTIS_DENSE_SPARSE_BODY_SIZE + CHECKSUM_SIZE; + + EXPECT_EQ(196, JAMTIS_FR_TOTAL_SIZE); + EXPECT_EQ(244, JAMTIS_DENSE_SPARSE_TOTAL_SIZE); +} + +TEST(base32, binary_lossy) +{ + auto subtest = [](const char *raw_hex, const char *encoded, bool raw_zeroed) + { + const std::string raw = hex_decode(raw_hex); + + const std::string enc_actual = base32::encode(raw, base32::Mode::binary_lossy); + EXPECT_EQ(encoded, enc_actual); + + if (raw_zeroed) + { + const std::string dec_actual = base32::decode(encoded, base32::Mode::binary_lossy); + EXPECT_EQ(raw, dec_actual); + } + }; + + subtest("", "", true); + subtest("ff", "9", false); + subtest("f8", "9", true); + subtest("ffff", "999", false); + subtest("fffe", "999", true); + subtest("ffffff", "9999", false); + subtest("fffff0", "9999", true); + subtest("ffffffff", "999999", false); + subtest("fffffffc", "999999", true); + subtest("ffffffffff", "99999999", true); +} + +TEST(base32, normalization) +{ + EXPECT_EQ(base32::decode("00ii111--uuuu222-"), base32::decode("o0iI1lL--uUvV2zZ-")); +} + +TEST(base32, sizes) +{ + static constexpr const ssize_t SPACE_ERR = static_cast(base32::Error::not_enough_space); + static_assert(SPACE_ERR < 0, "error value sanity"); + + const auto encode_subtest = [](size_t in, ssize_t exp_default_out) + { + ssize_t exp_binary_lossy_output = exp_default_out - (exp_default_out > 0 && (in % 5)); + ASSERT_EQ(exp_default_out, encoded_size_mp(in, base32::Mode::encoded_lossy)); + ASSERT_EQ(exp_binary_lossy_output, encoded_size_mp(in, base32::Mode::binary_lossy)); + ASSERT_EQ(exp_default_out, base32::encoded_size(in, base32::Mode::encoded_lossy)); + ASSERT_EQ(exp_binary_lossy_output, base32::encoded_size(in, base32::Mode::binary_lossy)); + }; + + const auto decode_subtest = [](size_t in, ssize_t exp_default_out) + { + ssize_t exp_binary_lossy_output = exp_default_out + (exp_default_out >= 0 && (in % 8)); + ASSERT_EQ(exp_default_out, decoded_size_max_mp(in, base32::Mode::encoded_lossy)); + ASSERT_EQ(exp_binary_lossy_output, decoded_size_max_mp(in, base32::Mode::binary_lossy)); + ASSERT_EQ(exp_default_out, base32::decoded_size_max(in, base32::Mode::encoded_lossy)); + ASSERT_EQ(exp_binary_lossy_output, base32::decoded_size_max(in, base32::Mode::binary_lossy)); + }; + + encode_subtest(0, 0); + encode_subtest(1, 2); + encode_subtest(2, 4); + encode_subtest(3, 5); + encode_subtest(4, 7); + encode_subtest(5, 8); + + decode_subtest(0, 0); + decode_subtest(1, 0); + decode_subtest(2, 1); + decode_subtest(3, 1); + decode_subtest(4, 2); + decode_subtest(5, 3); + decode_subtest(6, 3); + decode_subtest(7, 4); + decode_subtest(8, 5); + + encode_subtest(SIZE_MAX, SPACE_ERR); + decode_subtest(SIZE_MAX, SPACE_ERR); + + boost::multiprecision::cpp_int enc_max = SSIZE_MAX; + enc_max = enc_max * 5 / 8; + + encode_subtest(static_cast(enc_max), SSIZE_MAX); + encode_subtest(static_cast(enc_max) + 1, SPACE_ERR); + + decode_subtest(static_cast(SSIZE_MAX), static_cast(enc_max)); + decode_subtest(static_cast(SSIZE_MAX) + 1, SPACE_ERR); + + // huge encode/decode test +#if 0 + static constexpr const uint32_t SSIZE_MAX_32 = 0x7fffffff; + static constexpr const uint32_t RAW_MAX_32 = static_cast(SSIZE_MAX_32) * 5 / 8; + char *huge_in = (char*) malloc(SSIZE_MAX_32); + ASSERT_NE(nullptr, huge_in); + char *huge_out = (char*) malloc(SSIZE_MAX_32); + ASSERT_NE(nullptr, huge_out); + + ASSERT_EQ(SSIZE_MAX_32, base32::encode({huge_in, RAW_MAX_32}, {huge_out, SSIZE_MAX_32})); + for (size_t i = 0; i < SSIZE_MAX_32; ++i) + { + // check that entire output is filled with valid base32 symbols + ASSERT_LT(base32::JAMTIS_INVERTED_ALPHABET[(uint8_t) huge_out[i]], 32); + } + + memset(huge_in, 'q', SSIZE_MAX_32); + ASSERT_EQ(RAW_MAX_32, base32::decode({huge_in, SSIZE_MAX_32}, {huge_out, RAW_MAX_32})); +#endif +} + +TEST(base32, bad_chars) +{ + static constexpr const char BASE32_UNALLOWED[] = "~`!@#$%^&*()_=+[{]}\\|;:'\",<.>/? "; // hyphen not included + + for (const char c : BASE32_UNALLOWED) + EXPECT_EQ(base32::BADC, base32::JAMTIS_INVERTED_ALPHABET[(unsigned) c]); + + EXPECT_EQ(base32::IGNC, base32::JAMTIS_INVERTED_ALPHABET[(unsigned) "-"]); +}