From 98031ae4c56295576ebb33e53bbd7547fc3b9bc3 Mon Sep 17 00:00:00 2001 From: Uncle Fatso Date: Tue, 28 Oct 2025 21:31:05 +0300 Subject: [PATCH] extend tests Signed-off-by: Uncle Fatso --- src/MathTester.sol | 106 +++++++++++++------- test/GhostVerifier.t.sol | 209 +++++++++++++++++++++++++++++++++++++++ test/MathTester.t.sol | 92 +++++++++++++++-- 3 files changed, 362 insertions(+), 45 deletions(-) create mode 100644 test/GhostVerifier.t.sol diff --git a/src/MathTester.sol b/src/MathTester.sol index 4a63b11..aecb65f 100644 --- a/src/MathTester.sol +++ b/src/MathTester.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import {EllipticCurve} from "./libraries/ECMath.sol"; import {EllipticCurveProjective} from "./libraries/ECMathProjective.sol"; +import {GhostEllipticCurves} from "./libraries/GhostEllipticCurves.sol"; contract MathTester { // Constants are taken from https://en.bitcoin.it/wiki/Secp256k1 @@ -29,6 +30,12 @@ contract MathTester { return EllipticCurveProjective.projectiveAdd(x1, y1, 1, x2, y2, 1); } + function addGhost( + uint256 x1, uint256 y1, uint256 x2, uint256 y2 + ) public pure returns (uint256, uint256, uint256) { + return GhostEllipticCurves.projectiveAdd(x1, y1, 1, x2, y2, 1); + } + function doubleJacobian(uint256 x1, uint256 y1) public pure returns (uint256, uint256, uint256) { return EllipticCurve.jacDouble(x1, y1, 1, A, P); } @@ -37,7 +44,11 @@ contract MathTester { return EllipticCurveProjective.projectiveDouble(x1, y1, 1); } - function addProjectiveMixed( + function doubleGhost(uint256 x1, uint256 y1) public pure returns (uint256, uint256, uint256) { + return GhostEllipticCurves.projectiveDouble(x1, y1, 1); + } + + function addMixedProjective( uint256 x1, uint256 y1, uint256 x2, @@ -46,16 +57,16 @@ contract MathTester { return EllipticCurveProjective.projectiveAddMixed(x1, y1, 1, x2, y2); } - function mulEcTriplet( - uint256 x1, - uint256 y1, - uint256 k1, - uint256 x2, - uint256 y2, - uint256 k2, - uint256 x3, - uint256 y3, - uint256 k3 + function addMixedGhost( + uint256 x1, uint256 y1, uint256 x2, uint256 y2 + ) public pure returns (uint256, uint256, uint256) { + return GhostEllipticCurves.projectiveAddMixed(x1, y1, 1, x2, y2); + } + + function mulTripletEc( + uint256 x1, uint256 y1, uint256 k1, + uint256 x2, uint256 y2, uint256 k2, + uint256 x3, uint256 y3, uint256 k3 ) public pure returns(uint256, uint256) { (x1, y1) = EllipticCurve.ecMul(k1, x1, y1, A, P); (x2, y2) = EllipticCurve.ecMul(k2, x2, y2, A, P); @@ -67,27 +78,17 @@ contract MathTester { return (x1, y1); } - function mulProjectiveTriplet( - uint256 x1, - uint256 y1, - uint256 k1, - uint256 x2, - uint256 y2, - uint256 k2, - uint256 x3, - uint256 y3, - uint256 k3 + function mulTripletProjective( + uint256 x1, uint256 y1, uint256 k1, + uint256 x2, uint256 y2, uint256 k2, + uint256 x3, uint256 y3, uint256 k3 ) public pure returns(uint256, uint256, uint256) { return EllipticCurveProjective.mulAddProjectiveTriplet(x1, y1, k1, x2, y2, k2, x3, y3, k3); } - function mulEcPair( - uint256 x1, - uint256 y1, - uint256 k1, - uint256 x2, - uint256 y2, - uint256 k2 + function mulPairEc( + uint256 x1, uint256 y1, uint256 k1, + uint256 x2, uint256 y2, uint256 k2 ) public pure returns(uint256, uint256) { (x1, y1) = EllipticCurve.ecMul(k1, x1, y1, A, P); (x2, y2) = EllipticCurve.ecMul(k2, x2, y2, A, P); @@ -95,18 +96,39 @@ contract MathTester { return (x1, y1); } - function mulProjectivePair( - uint256 x1, - uint256 y1, - uint256 k1, - uint256 x2, - uint256 y2, - uint256 k2 + function mulPairProjective( + uint256 x1, uint256 y1, uint256 k1, + uint256 x2, uint256 y2, uint256 k2 ) public pure returns(uint256, uint256, uint256) { - return EllipticCurveProjective.mulAddProjectivePair(x1, y1, k1, x2, y2, k2); + return EllipticCurveProjective.mulAddProjectivePair(x1, y1, 1, k1, x2, y2, 1, k2); } - function mulEcQuartet( + function mulPairGhost( + uint256 x1, uint256 y1, uint256 k1, + uint256 x2, uint256 y2, uint256 k2 + ) public pure returns(uint256, uint256, uint256) { + return GhostEllipticCurves.mulAddAffinePair(x1, y1, k1, x2, y2, k2); + } + + function mulSingleEc( + uint256 x1, uint256 y1, uint256 k1 + ) public pure returns (uint256, uint256) { + return EllipticCurve.ecMul(k1, x1, y1, A, P); + } + + function mulSingleProjective( + uint256 x1, uint256 y1, uint256 k1 + ) public pure returns (uint256, uint256, uint256) { + return EllipticCurveProjective.mulAddProjectiveSingle(x1, y1, k1); + } + + function mulSingleGhost( + uint256 x1, uint256 y1, uint256 k1 + ) public pure returns (uint256, uint256, uint256) { + return GhostEllipticCurves.mulAddAffineSingle(x1, y1, k1); + } + + function mulQuartetEc( uint256 x1, uint256 y1, uint256 k1, uint256 x2, uint256 y2, uint256 k2, uint256 x3, uint256 y3, uint256 k3, @@ -124,7 +146,7 @@ contract MathTester { return (x1, y1); } - function mulProjectiveQuartet( + function mulQuartetProjective( uint256 x1, uint256 y1, uint256 k1, uint256 x2, uint256 y2, uint256 k2, uint256 x3, uint256 y3, uint256 k3, @@ -146,7 +168,15 @@ contract MathTester { return EllipticCurveProjective.toAffine(x, y, z); } + function toAffineGhost(uint256 x, uint256 y, uint256 z) public pure returns (uint256, uint256) { + return GhostEllipticCurves.toAffine(x, y, z); + } + function isOnCurve(uint256 x, uint256 y) public pure returns (bool) { return EllipticCurveProjective.isOnCurve(x, y); } + + function isOnCurveGhost(uint256 x, uint256 y) public pure returns (bool) { + return GhostEllipticCurves.isOnCurve(x, y); + } } diff --git a/test/GhostVerifier.t.sol b/test/GhostVerifier.t.sol new file mode 100644 index 0000000..5cae449 --- /dev/null +++ b/test/GhostVerifier.t.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {Test, stdJson, console} from "forge-std/Test.sol"; +import {GhostVerifier} from "../src/Verifier.sol"; + +contract GhostVerifierImpl is GhostVerifier { + function setPubkey( + uint256 pubkeyX, + uint256 pubkeyY, + bytes32 signersHash, + uint256 totalSingers + ) public { + _setPubkey(pubkeyX, pubkeyY, signersHash, totalSingers); + } + + function verify( + uint256 s, bytes32 m, + bytes calldata nonces, + bytes calldata proof, + bytes calldata missedIndexes + ) public view returns (uint256) { + return _verify(s, m, nonces, proof, missedIndexes); + } +} + +contract GhostVerifierTest is Test { + GhostVerifierImpl verifier; + + function setUp() public { + verifier = new GhostVerifierImpl(); + } + + function test_verify_5_of_5_works() public { + verifier.setPubkey( + 0x8130920b6287c01abd7d67c2f5376144394dd980bef209737f795455cd4f8fb1, + 0xaf6076b45828ab89c516622403e85ecce4d52e00d466b07f0156d4180ef1ae9c, + 0xa2c374145231bdfd4733489dc60db6534e7d42008ad74a1d876f7aa156ca0d8a, + 5 + ); + verifier.verify( + 0x34eb7a0e8bf8999f9aaa20da11215939fb5b89a277d21a19cd644a071a5b8d36, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"b94c7370e1ab8646e79e8fc15992408335c45b2b73c2ed03383283671e917b28aa3bac7ec3437263e4fad31ad1c07ffc4e3f59fe55fef907d594278a8a82b84f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000853b1887feb7df30b5a794396e41f10ba3a9531230ff9185f462b030646127a284ffccc5c82ede0a2e385755ace6b0dba1b2139d2d0df811e8ce01616889225c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + // proof + hex"dd9d54b47114e7383d1dd3724997f9a7187a79da3c1f884dcdc2ced090ae2df84cb27442affec738e8685f3105955e11940f5a650dbfa8459f39b6452e94ce6f067a2ae6ed182d4cc873f30d16b1ee9ee5ab0fe1f9d6680ba70e1186b4b69f4601cc631de06daefdab70449adc46417560ee08fb1b5b45945d4d0f07ba006bcf317da9a6003c1fcfe205e74e249cefca6a591b203c4089764ed151884ed391b019f15dee766729cf16cdd144f72f2db84a0fcd418e444642e89cb772e083453017bcb381e21457ebe2f6b9d01cbdf51543020cac7d557333ceca9f65f2bbb8b4ad7318c06d8f5e422fac94f84e6bdaa2f810f3b2031b7922e570f6186efcbee580ced188515bf741857542494bfef37c00a3addcd4b02c6c8c17caeaa4ff3c842e3c9a06c94d5d9ac2f050f128b5b70d3f4a6955a43672d24b2834bbbe858f0f", + // missedIndexes + hex"0000000000" + ); + } + + function test_verify_5_of_5_fails_on_wrong_nonce() public { + verifier.setPubkey( + 0x8130920b6287c01abd7d67c2f5376144394dd980bef209737f795455cd4f8fb1, + 0xaf6076b45828ab89c516622403e85ecce4d52e00d466b07f0156d4180ef1ae9c, + 0xa2c374145231bdfd4733489dc60db6534e7d42008ad74a1d876f7aa156ca0d8a, + 5 + ); + vm.expectRevert(); + verifier.verify( + 0x34eb7a0e8bf8999f9aaa20da11215939fb5b89a277d21a19cd644a071a5b8d36, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"0afb89f54ba8f546a5c22a8826e44a66dba710a87d01028bdadcb22aecb52d91874a0e4cc89e8d7e4fcd52368c01f9a21e3d50dd8761742080af875c5405877c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c3a6e9576f3e4ebb79a27f3818e311090ea9400dcf5518c8b9df1adfb3f649817030543517548819561092d30f452e8b06596852a097ef39247676819f8cbfa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + // proof + hex"dd9d54b47114e7383d1dd3724997f9a7187a79da3c1f884dcdc2ced090ae2df84cb27442affec738e8685f3105955e11940f5a650dbfa8459f39b6452e94ce6f067a2ae6ed182d4cc873f30d16b1ee9ee5ab0fe1f9d6680ba70e1186b4b69f4601cc631de06daefdab70449adc46417560ee08fb1b5b45945d4d0f07ba006bcf317da9a6003c1fcfe205e74e249cefca6a591b203c4089764ed151884ed391b019f15dee766729cf16cdd144f72f2db84a0fcd418e444642e89cb772e083453017bcb381e21457ebe2f6b9d01cbdf51543020cac7d557333ceca9f65f2bbb8b4ad7318c06d8f5e422fac94f84e6bdaa2f810f3b2031b7922e570f6186efcbee580ced188515bf741857542494bfef37c00a3addcd4b02c6c8c17caeaa4ff3c842e3c9a06c94d5d9ac2f050f128b5b70d3f4a6955a43672d24b2834bbbe858f0f", + // missedIndexes + hex"0000000000" + ); + } + + function test_verify_5_of_5_fails_on_wrong_proof() public { + verifier.setPubkey( + 0x8130920b6287c01abd7d67c2f5376144394dd980bef209737f795455cd4f8fb1, + 0xaf6076b45828ab89c516622403e85ecce4d52e00d466b07f0156d4180ef1ae9c, + 0xa2c374145231bdfd4733489dc60db6534e7d42008ad74a1d876f7aa156ca0d8a, + 5 + ); + vm.expectRevert(); + verifier.verify( + 0x34eb7a0e8bf8999f9aaa20da11215939fb5b89a277d21a19cd644a071a5b8d36, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"b94c7370e1ab8646e79e8fc15992408335c45b2b73c2ed03383283671e917b28aa3bac7ec3437263e4fad31ad1c07ffc4e3f59fe55fef907d594278a8a82b84f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000853b1887feb7df30b5a794396e41f10ba3a9531230ff9185f462b030646127a284ffccc5c82ede0a2e385755ace6b0dba1b2139d2d0df811e8ce01616889225c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + // proof + hex"bb9d54b47114e7383d1dd3724997f9a7187a79da3c1f884dcdc2ced090ae2df84cb27442affec738e8685f3105955e11940f5a650dbfa8459f39b6452e94ce6f067a2ae6ed182d4cc873f30d16b1ee9ee5ab0fe1f9d6680ba70e1186b4b69f4601cc631de06daefdab70449adc46417560ee08fb1b5b45945d4d0f07ba006bcf317da9a6003c1fcfe205e74e249cefca6a591b203c4089764ed151884ed391b019f15dee766729cf16cdd144f72f2db84a0fcd418e444642e89cb772e083453017bcb381e21457ebe2f6b9d01cbdf51543020cac7d557333ceca9f65f2bbb8b4ad7318c06d8f5e422fac94f84e6bdaa2f810f3b2031b7922e570f6186efcbee580ced188515bf741857542494bfef37c00a3addcd4b02c6c8c17caeaa4ff3c842e3c9a06c94d5d9ac2f050f128b5b70d3f4a6955a43672d24b2834bbbe858f0f", + // missedIndexes + hex"0000000000" + ); + } + + function test_verify_2_of_5_threshold_fails() public { + verifier.setPubkey( + 0x8236d338938555fffa4ee7979d093386f60b84ec146571069fc853be5a814324, + 0x231972f3026d90e8694c48c2a737c9ea5d6acb4fba59bd7c8b89539c067c0648, + 0xb24b443c5b3079a2f16c917902386ff955f9b727530952cd200fae50e7a80f5e, + 5 + ); + vm.expectRevert(); // remove threshold check to make test pass + verifier.verify( + 0xb098d50af4a82549eeeb36aa9a5c4af488cfc8666ae8a987b53e75b8be1f0a1e, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"63d14f00d61e3841b98820f43609d4d03f396d0bd771725d38c73d5848f67f898a5792c8a95eeccd2e7336a6d3ea462343f8ef935d0044ae795362c2ba217f35dcafdc862fb38676920f753b1ef52e693eb600fde1c56a51ca99f3dedd5ce460d9c2bc8d9c75ca0b10eb9821d21914f392b0a00ba2f6df41f6a8eabd036c552ed4f7b286b271de64961d76abe2150ed5fa78a57a33c3307ba4d632dda470ba36dfd6613d62565aedf60d58ac42252a19401943444f1ec3f8f9bdf87c81e321b3319a9cd20c2a894c2f3bf4a0ee9cc56abb3e24d486df1945263958b84dc3d522790fc0dd662268f4c5b4cc84446aa15ac9be480b1260b4b7a305c2f32875aa61", + // proof + hex"8b38ced1c28a767ba7db6f3c53bc2100f8d8a0df12b3976a6bac5a42919b8720efafa8731632f1858b5a483926f3aad6824299c154bf1e1405a0de7bb5f4d0d0db4dd1c51abbe34348670a4ea5c08ce402281a56f139f4cedddfdb7c139bec15c317042abb38f848e43012bf21de2d0ad311f276ab8a3db4c9ecfe5441d21df29b96e48a3c4068e423351ee54ea3f3b432f1208d3bf2ea8359775459db95bb3aa668aa20d6c29a56a762207ef08a6d726e53e6dcf153c2276e778c1dbefcd9872eaa868334848091a41efa59b72ae63bee4dc913ab2a27f789fc8e4b9364f992fe0104fd786fb179619be599d279e43108768559b78d81b5419eb39ec32e3546df72af4cdcf9280b82bf49cb86047c3b822c740360b216ccc2222d4692f2946e79dd17c84be78a33b33015160d46793a16026533e604b442adb1b47f9804439b", + // missedIndexes + hex"0001010001" + ); + } + + function test_verify_3_of_5_threshold_fails() public { + verifier.setPubkey( + 0x3e037b68e827f9a5084abcf04b733a04ce4a0d50c9f8b06b34887fc2a49188a0, + 0xe8de3836985651087330ef16dc60c18a7e7a1214137a6d84f8ed89ac3a98cf2c, + 0x5cc8b3908d3d1eebdb4265c507f3707ed31de9465958be91410df43bba128959, + 5 + ); + vm.expectRevert(); // remove threshold check to make test pass + verifier.verify( + 0x2d407d2b8001f98f82f29f9695fb5725fc17805f47f911114e8eefd32664e003, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"74c7a36649c42661be6924be755d5f154bb740c553e0d0d0925f1d01c4b39b1ed158d1c2bb6bca8752ca27069d3616c608bd409e27b7b7da29684f66b730350f3ede6f2c5cb9192d94a58d1eca7689bf7d9bc06fc1605a351d9111c69411a8ff489f47d3b30192f67ea42f235eb1e1a13bb3bbb57f1d55fb0f9b7b00d6e15965310d76994ca75e20d8f57dbe1e9b47d294440b1abaa95d50081e0fd47cec602d391181b3590f0a550dcc79b417a9babba853201649b2f1d0fb53fe5fad688955c0bff78047a8133836b136ea5c0fe22cd2810a325e0354a716504f9cce8a09c2c42c3ad7f55005d45b5df7d10d5ec736ffdb5c0c8b9df5e5be35c2b3ac5f4d91", + // proof + hex"0e7714d49a553be8173b4759ed366b0638c8899882b971043396688671b9a6387824b6dc9198deafdc40d02e88b54b71eef2e194921e7b25192454140cfc1d866d8790c96d4fe74343725006154fdefd787896de8c4e0b7aac7f2260941162e40ac0fe87b6551151ac787c5c2dc20cd2c02992aeaded119e39092a38fbcc829793cc8c12bd16bdcf9abe65dcc24dba2ebb23e05d3ebecb7cd1a3f26cf28d0a3c5ce59da293000e92bf5a785acb7734e77a7981086b212f867a0075dc150b131245816d51b4c01effdefae67482221638384f662ff0a043b2b891e86ff983d7320b034d82b07417b707d581564f1adb2c47100b9a1341606279bf1ddf7d19cdad51d6ad7c66010a10be8090bb036a4d4e644d5b8a92323a060509daad1482a3baab04b6a5f42f3044533a78d70c366a29373aa7c79611a3294b71114564642890", + // missedIndexes + hex"0100000100" + ); + } + + function test_verify_4_of_5_works() public { + verifier.setPubkey( + 0x83982c1484808cc8932edc6ca9fcfeca70b0fabb6e50b5fa720a5aa04d583897, + 0xb4581cdaf4d2f4d7b290ba2083c9cb746cf884c514b6936a93a08a3ab9826e5a, + 0x7ef3641d960d4c3a6c9e52db1b5d0db8638111830d877f250013e4e90cec9090, + 5 + ); + verifier.verify( + 0xd2d476140240a75f8e6499caac10036d37fd95ae8aca02a9e3f41f4e2a993ac4, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"400fd494006925d6aeb5b485f41db13c1c3e78376d5b2d7c039c670a7f0310ac489bca6eaac05d3279cd6fb69efe9efb30a7d83bc45edba7393877e3ca728949ba356eb9966d858e840e9cea9aad1820c675e5f5b0a530aea633c464c7a7a08fc2e74e58ac95674fc7e72835b2f759a667e752f8ee37c80f65e62b4ee96e24f32c81b8ea7807d857f0cb9a5a76364968bbedf7b5b353effa9ed6268c33fc564f9960c44ba3d7568be8796f6bef1713dce8d63fc13530e5b829e37012c3c6793baf43fabcae569ac9355b19934c2e3ef1fa95cb95c701896cbbe863035bb14c92e52d0c17bd2c1dce678649dfbb5a8456d7ac37b8fea29267d1e17740abebb4c9", + // proof + hex"2ac896c16dc4f19e9e4b6a904f4656f5aa828f4dafeeb040feae549a141adf042e7fcfc9662ac94b7de092cbe706eaccfc342a80d457750417afe704fbf7bddc128f9902bc2f4b8c2f6bba0e0e6dd0a0456395f7eca53ce36abd710b1b08e01ebef10ec574542b237408cdd475e5ff05d14cf2d3bf6fb6da58997d58a01f27e724af3ee881bd1341610d5ad363368748c254e4415702ff4ac022adf65711b5282251c84030b69dcc65a580c183dd4463aff3962a3538e7765ed6a77ce1e371e4d9d38d68a542446cd13e21461f7551ed62e502a554c6cb93f5315d06c92d970ff855fed0d6a2e5074bf912c76c47ad62512a05dde9262aba738f24f6c2af3f35263df8197c38062362109183b97c3229dd3b9eb398963998e99c4622cae95990001012792850cfb1c6876cba4ab6044ff69328ceac68ad3089cef9d71402e3af", + // missedIndexes + hex"0000000001" + ); + } + + function test_verify_4_of_5_fails_on_incorrect_indexes() public { + verifier.setPubkey( + 0x83982c1484808cc8932edc6ca9fcfeca70b0fabb6e50b5fa720a5aa04d583897, + 0xb4581cdaf4d2f4d7b290ba2083c9cb746cf884c514b6936a93a08a3ab9826e5a, + 0x7ef3641d960d4c3a6c9e52db1b5d0db8638111830d877f250013e4e90cec9090, + 5 + ); + vm.expectRevert(); + verifier.verify( + 0xd2d476140240a75f8e6499caac10036d37fd95ae8aca02a9e3f41f4e2a993ac4, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"400fd494006925d6aeb5b485f41db13c1c3e78376d5b2d7c039c670a7f0310ac489bca6eaac05d3279cd6fb69efe9efb30a7d83bc45edba7393877e3ca728949ba356eb9966d858e840e9cea9aad1820c675e5f5b0a530aea633c464c7a7a08fc2e74e58ac95674fc7e72835b2f759a667e752f8ee37c80f65e62b4ee96e24f32c81b8ea7807d857f0cb9a5a76364968bbedf7b5b353effa9ed6268c33fc564f9960c44ba3d7568be8796f6bef1713dce8d63fc13530e5b829e37012c3c6793baf43fabcae569ac9355b19934c2e3ef1fa95cb95c701896cbbe863035bb14c92e52d0c17bd2c1dce678649dfbb5a8456d7ac37b8fea29267d1e17740abebb4c9", + // proof + hex"2ac896c16dc4f19e9e4b6a904f4656f5aa828f4dafeeb040feae549a141adf042e7fcfc9662ac94b7de092cbe706eaccfc342a80d457750417afe704fbf7bddc128f9902bc2f4b8c2f6bba0e0e6dd0a0456395f7eca53ce36abd710b1b08e01ebef10ec574542b237408cdd475e5ff05d14cf2d3bf6fb6da58997d58a01f27e724af3ee881bd1341610d5ad363368748c254e4415702ff4ac022adf65711b5282251c84030b69dcc65a580c183dd4463aff3962a3538e7765ed6a77ce1e371e4d9d38d68a542446cd13e21461f7551ed62e502a554c6cb93f5315d06c92d970ff855fed0d6a2e5074bf912c76c47ad62512a05dde9262aba738f24f6c2af3f35263df8197c38062362109183b97c3229dd3b9eb398963998e99c4622cae95990001012792850cfb1c6876cba4ab6044ff69328ceac68ad3089cef9d71402e3af", + // missedIndexes + hex"0001000000" + ); + } + + function test_verify_67_of_100() public { + verifier.setPubkey( + 0x53dd2ef1663829ca067e0a5c2b418671dac6cca42d6d6b305169f3923967c46b, + 0x7e7d376483c9fb40477a2c0b206529a4e8fa64344dbcb2b08c646ac3642ef9c0, + 0x7440a2448185df74a6998d27c2d6e1caebb2e1f1cec39ce62502d8a99509b9bd, + 100 + ); + verifier.verify( + 0xfc9639c8e416f8517b1d87428cd45b702af8448b844e487285a81b2afd50aaff, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"e9b32cd8ba7b8a886f3e77c02d313fe0b5a5151c195f0347084be442a16e852c7e6c2ea3425a0386c2ff28729832fc19c44d1d6e6c84beb2ef4ad99367e466936f93851a8950366a396dcb04e1debed5f359bc8d309a1c8ddf0956ee6de6ba63815b29cff244e3d2b707f72845046ffd2ec9db56144f12850ff85e923d0070fb13e9ba719e99f4725ff62034179fd72519c826ffddfd6f7fa18156d967bb6ed4d61b08801e9e27bc5519a601d592fa582bdfa0cc75a4a4d79e064817078dc6975159f930a4525986b6c5bc121f35d7668227859a687e4d2f9caafa0ae4aba1b2adac0a3df55696c0661daf87c53952a26b5208ab0e919d870765400c297c7931", + // proof + hex"338a88607780bd607e001fdb28d70df7c5822535be947ec7bf9ac4cfe464d51ee2fcb6350e260261891796455fb6ddc91cf08cdf93bb6c9dec1745c2cb3000416f73a90758a9bb69cdcecef4bfe3ea1ad4ce92c59e984e3c0372861dfad7c27858f9e2b6f56c4a6362faa95798e042d9a8be63fbb9fbd42f4e30009716f4c941b597c8aa53f9026ca53dae7a0632f97813ddbc347134c7bd806df7aacd5c5584ead8eea5cb476390426bb5aacf105689ca82fd2b9f5df4c2c937aebb6ee764bf34f8c1dbc22f482063e588295499abc16d5de496a25874ad1f556489110c3d5725b52904daf683325b9ce57008c46c289048ac6667013a8e69c6273572d15ea3f69cb711cd746c01fa1f52ac62398d5094356bafacadafca8b39f328b0a3a6a0a44154c394c75b7ab6956be1c1d88aac45dd3574986ab585d1c052f082c207971282ddd03aef085b8cbd1d00cc1ea64de09002558549801ae2cf98e353645043460e06849bd17d809ab6d9f1758a6f92d28f85b2c21ebad67481a6b2141d78c31dd8ec188397e3a78a82384ce8fc09bbc9acb8f8363b8c55c25a3f27a470084a8a7bf140ebb61a4a87f7d78c6a3c37af6d1cd773a7e049d158000c5fe388cec83009479d2fa769315c9c0b389966cea19503cfe77a902c9c8b78130266c04471836745f9ae272259f1466e36ef567854689d6ac3a565c13d1b4fbcf151ca23c5c967c722f78ba2fdc55cbdb72f342d7ae18da462428c2d4fc2e3c6f10c034719979b3496c6bad5efeec48b5716440df13f5f1c475da1aa58b48ea07cb83c0c1b1fd27d4f4e33f3ff93f07b0390beefd70b6681880b4aaad48a58a8a31e8b2c472c0940c2b2c70ea1cc17e58da0f77fd5b226d986d1d2f017196e13fd34c67fd22ba44be5b33c8ebf8ea637f8b33585f268582cc9c68f1ec386ce6d25988ad70f5965d71d2ba5fa8f5d22b3bcf9827953f8eef9bc60cc22bca34d344196262821936e91b9fa63991f09bcd4896fd79e29b7f17d96906bd568679c81c942eb58131e6b08a5a597cc7869239c0ef9e46087a19803ccf3f90afcc2606577253da510bb02d6970ec2698630235aa459b0b0bbf32c555538e7b87eb8ff0aed3e559dd372f9b7c16d29b6fe88552d364f157ddfa0128b2702a1be805f38fdcd3e540c396ca99f16c011a4e5d9758b63e3e3dcbbf2952a9e00be6fced788631abfb3273b8ad2cd73309b09d7c329430aee7f087556ca59b00e6bf16a1d483c70665ca77843c004796e9d7af30dbb91d6896fb03417629200fd11570554c7d00737a563b8c8da4b5754b2e344441a8c426758fd71bf45142a366276d7e741431d23fb63bbd3ce2a0474a3304517ff34c8236802dfb2988285a12d5fc663f01c255c6dc66b857df6821b48dd8b4ca49b8d78b57e30e7f8436409eca8d6a1431ca99dcf14e360387b25ed57162f160aab63f294fd962e6d78e82caacc051421968a2d236ca80baae28c5283958d2229db566e24875bddedbe49b8485ab767e06204441e61a4172a855d030411940c45f7bc626d63a10a872e6976ca8355a58c252286d8bb5461416aa46e04eb6860bf87f9678f67dbcaab588c2140ee8bcbba643787532843fdcf32111cdf62dcf2f4511417ed4297372c82ee2d9937ee5708935151df4fa7448dc66e7e228f56e144eecfc2baa614d72757e54a0fd203f3027d2404aa412cbb127c06c0b884be7d730437580e0162547ac45840d37884aad66fc199210fe65df69666727a0cf23150bd66a66b998f0ac4bbf2d9e4bacd6352af11ac43fcda95e8e2c3459b2d8e3fb5aba975f63a7c11edceb50482883794d9ab11f5f0c93b0bb5ad9cc88d230b51f54edca0d5fce874f5abaeed82fc651c9e37369175d6aae5c1aea25fcce27ab1f82ed84bc52ce06e29ff280e0b2c1f49b63d65a311f84596f307b2fb7b5422167c8ef794b03f928e2f6ff943214efa969847e7b416039feb93e0e72e4a5fb2e3a3f7a36f1c6cae39737086cc3d0e43fa0cbb27faea7f9e40abea427da5651a605cfb8959e326cd19ba9a1807116194611f843549486c5dfb29542545ad3278135de65d8ca22ca85999e5d7bd121fc6fa7536d546a27438ba9cfef1ac66ea51f7bca47093d3ed57ec7a2ed061f15679437eeb5dad340276a2721d85abf2e16db2abfea046b663545a847700d0cd88fdd45b3063da840fa87ab8713dfbd69152392b2cd1f57f1768bc36121bb73f0e82d446be2d6c3dd2a3bf361965a13f5c2968abcc6221cc61447d2b5389a99e35a68f84a8d388ccba919ad5f50c43e5f2c1cecea6bb2e710805630a23fe61c138a7fa3f6826897c9b2f495ffae1b9a91e57346b35d4b2c2cacd3ea8ce79ad20518e61d473066bb0424633941e665361b15a8bf57bd3d40c62b3696c4b1e97f16b932e0e58dab91cda020e7833b6ac9c5763a5bd5636f0c9aa5293068febe7be4be31d553b4a42ad94ae25b7658e3a874b06e4e05f21ea4ad1382e8162d6c4a615e932afa3f829f248a9de05be9327f29e0dc0ab610acdde3fe00b2a6de2220b5d9b28b52030b0be537cae08897080696ac840945625e53deb9efd8662b35a869e5e135253703793aeef591df092f2fc8650edcc0c51439625271956d226d95857f973bd471c733181b8319156a608476e6a819402babc535799383f94909fbc4eb7d9e9a5b647b90569f8b470c3ce9c1da36cd6732043fd2726f4f7c89d91d7bd9a2119282bfe66f8c078f030717bdccb7d64586989452c0b2ba9c5cf04898503b17d1889793f4e935995e2da6ada6d3d036d97c85e2fb79325cda55b301889af64a532bc36bae19ecd71ffc02ce826ee2739993c2d3464a9aca72cd59a90eb5b322534d9c7826b8abe0bb4d21639ef3bc34204c7b0dd8a5760f996a67d9313b2d89ad7190152beca44d7bf5701accd47974cc950c6349614b7223bf05a8d6faba530ac5fa65bae0d877544b568a7eb46aa8c34e06ed435b8342ec813e45faf47a474d19bf25f098bae89df1f5423894bb616e969bcf0e44d51d0c9c973261276a44aa613738253d26e141647e0ee73d210d5dd4b475e91687957b55d0b28ccd0d433d2431b6609e0f783964577782f6e065243e789fb2fa28b92cd51ecfe07c9d180c50cece32b9280663e18c70959afea37a1335c50bdb670d13d09d0c1d9fede8aab5dce3fd44fca634ec376a39deda052e3eb570da79930132969d7fea3c7d6b7985170632d56cb6816bbdb1ebc284cda71d6ac875228ee8c6ffe722ece81f60a49ff79ddf2c060085455d1fcb57a05d58809513694f302f27fc753d0d3cb1ab510276dc9c21689a2b618d4b559d54ee7897185490c03186509de616e15ef6e8e19b5406e5c8444b0fe000425930fd202c51be2d99d8cbea975feeaf6d0839cb576f6ca3c14f768c62c3de4ebd34ff2321792cee4c9696336b9a547d25b1cd67760dc4678e604754c96e233b431a40acb1305176905996ee5522cb535728f791e6c4a50014bf6f2e606afd0f928f2cc44cd93a4a694aa08d8f8f609be13e9d7c51c06a9ed6b4b2150ef2c9ade006a4094efd0f184b48922b14709bc4c9b8432c4fef944c8a7175271c3997e34cb61ff0586a08367e3b3eb79ae9967b8ef1a92997f6b7df14eb6b7d860f8e51c1f97ddfa8b7673a3a361d2ac2b05308c653c3adc68b4f7002957d1864365d3190c332950ab10420a182394baf6ad1949bff016475851861b11527a20b921e2941fcfc3163d5b01e5bf00b53355cc0aa6590926d614d442ca383dab063c94fdac63b7134a615171d87c64cf15fb72e2e9cb6252d8cd5e0d3269118c04b255e0896bc07a34c1f3664ae81c632755aaa36339c560ca6141a837a8047ce5d67f194907c038c9b163f0fcdbea9135c3ef18a2490d9d672ba2770a4761f36e1d25208a11d612055003568f2af5b49dd5f49002a4226b631678dd86922dd0cb1d65619e7a1e5f5eb73dd5df0e6178e46f9b00f73935cd460b74d85a11d62949e21ce26b9bfa3251d5be1f442332ccc49b388a5ba19e4a43a0c620fbece3d18466eef55e66413ca65f669b8b80fd764900627d7696158ff79ac04d5ba859740d3c4daaa9d118d89879b4befb5df44a3d32e14dbacd0f7e2fb5c58c753bb58e9c443a93c5fac6b1cd73e4c701f0fc96d9997f658526f4846fe3d96cdd9ac885bbb93e8e11a370ba62120eae0b58831b69ae25dfe04d4a92f45d285139b826510c154233010e4d5f83c49cf6fdb357320eedc762ae04b5197ca26be9c87bfa9f862561ca1f77adedfeb8b16aff8f87bb074ca5c41339adbf67379903438a6fb535abc3e477518991126eab2d5fa22f834982b1e068aa55000950247fdf350225125151fdd30a0e2ca289b7253cee4295aeedff67a304fa3719aee1f62e18d88c6cfc65a40c1be97061b95ceb2f6db2f985ad6f334d07c5401eb08bbf3c875f1b3845151d654e84377fa394e5290b2b56ba9663c57de82d1c4178eb948e64d0f9e742aeb4742cd0622b6ff64299af9a9f67d0a88f6d5a43865a8a9102e3374ee89c767bf9d57a1f694ddc89fceead4db41d929b0ed9ed7ca18f111b122d1018a9ec712e7998947c271fa53c08b7084374ece04ee51e2ee07faaa5d75a59ca6100826533bdd49d120b586a200bf816514974ccabf04e7028a9e1f85655eec228256f35f599ffcd5dc7fc4341e6f33b9b850d10b7fb583617408fc6d03f7da680a5891b87f2783b2950b3797de59c94d5cfd7796ad132b21bdfafd1cf6b72846032ee2e13b7c1e4258afb22ce0b878aaab161bbbbc1e257fdd9eba60482c7af2db966ed23550501e386f88a7541fd557d323096179a0932384cf7e535a20d4d63b1c608e3bcbc0ec1db0e7fabba57f719877dd1c1bf558ebb9041e688b7a14591edbe526495c0eab6506b017adf801fa056a3c459a36cdf7d44b0282dfb9438b1b0f020b7511dbbb847c507899d59a27d9c8fe891f946ec6c273e882bd95162438a330aa94cd2b0cc47eff05f698c5fd2e69dbd7ea5d8f44566c8b114dea39a83514bbbf8fe22f617671759df2feb068a632348db7668c6171a3fc8ddcd185277f2ac7929f2a2e6ffcb89cad9b613cc577289b567fc7e61c4ccf0c12eeb41975ee72cebfe25cd64601c2e5572f9997f5fd3a1051bcb4a8e0c338e9800e814d099aee9416572938975f8ee55dcb1440663d2b833f72e9d2ed02775aa7635928ae715a90050be322f9aec5dd4fb06a1824c2ece8be0332cc2259916a0c7c8f8e8df53104e46012aea60535da2b6df10f0a1176f29155c1f572f3ed27cbe9033921b80ddd8b0bc82a05985d0181fca15103ff50c3b63f32e984e2087a067833925597f21c2a6bbad5a9ad80561810dec1dc4326cfaaf5073a00088a9126ec397e4de162b261f2c2aa6b8cccf01f2fcce41a4ab8593a1a9d21070d32698a1d2476df6b73106332f06ced0e1121021930908741f7795dacbab32e7d665dce4fc59c341b14109f33ef5728c8b44243a328d3714ab735ea8776bed6dc62ea4f82a4e8abd91895792c7066c954a1f14610eef58f87f9ff1775cd34db0232fdc06579063cb798497f68eedcbe6c033baefbb78f8f271a8fffdff51c7e17e9e860ce8534bbd5ad05014cf0e56e42db2fe5e21b6e48d54d069920a30edca0f7cbd98749f47f07393813bd8642d5185e5dc53cb2c9441a1795addcb5441801b3411525e93deb0824be2fa3f0465860cb212e2c0414aa879495830b2f4a7e03825351e33f0e5ab153c2facfc31e5368fe82d14d29174566a8ade9edb5a52cf30a2072b7a108b0f52e9de1ee1bd8b2011ce8f805769fca77164d71eee7e4e39d9de855d2de9800744efe15b80087311125097c4c1f29fce73089bca6d0a822fedc225ab23b63852aabaf3b89728fca92e3742075fe500d15c0bc7661e093213da687e358b8cacd02872b6dd09ee7ba1a1ff9b455a2522ead49e97887925306b007f1ae93a4d0f4661100bf3dd3cd7c80b3e12192798af045c6a4c6b381f278d65c0cd4e6ace2b0631cddaa51b090c3e1b051c8cd71f76fea2c98338dc937c0ed49eb2640dddf3d987b4e6ec884a049467bb22d01f0e34650f4f6e00ba1666db6fe655049132fcfc85a2b8cd55f3df5a086ba469f0b9faf2eec469e65989dda9f2d8ce9e78a214a25e3854faedd834edd30bdb84f4abba6465f50203b36736fd834fea057e1293f435c2d7deae00bb2caf6b7adb7b493f2a607796768d8f65ccb4aa4a5e2c24e2f991bba76bbc8c3c0231d65265b1c5824bd50abfbdd432062f4cfd905514da8f403ddb46cc745a6455ec14b3709fcb08b2d1470b6bfb8901d73f2a34f133e9c90999ccfa0d97d3bff8c239840d624b6ab40bbc99cca12837afb63a87c85aa5b08888ac371941e8fc509d94fbd30535f51760fa8da77155d80154b85ce81328bae1b82407c35c97d8cfaa7189e21b15063ec59384da2ade04dfac0135d621fc4b177c1c42c674a53b3e4d8aaabbd799e17570c38c06cf7192003432f1ccd3f18566dbce5b9a61b7ffd77ff3618462f098991d78af8fcefa2469b840a1773a31cfe2afc984c852a51f68fff7c4166a3d4b8bdd128d572b63017510ef2e19b056ad5966cf32803c6c52197a1ea307ce758664c5161b7842619657b0c152fa768f8cbb9572a7d650a419874855a8082481f9dd60b02b551bf24ae8e46fbeb93c1b432067fb3095c087b2908d59fef7c3fe52d5df1852c21a8ce6e61376f3e1fc9b68ac1d741d112e5a874c959af09b17a6ab484438d448e8da92dd76fad1b0340e55c8ca2740a7a8d9059d5e442eefd6aa9e727b5c82941278bd19d140bebc7ae26cefc3497ad6a68cde1ccec7831f80d9dc150bf1d0fd7c8239ef68c8ee148771e9a098ed73af654458e134712e6d8a1a688dca565b870a49fd6b3152e40b2555498684317e2e0d69aa3667a6f8ea6b38911d64a0c0dfbbb998b1a4ab96cb3658b64703262bf60c5c77eff71e17d9eda2ccc9c6f4078625dadb83a027a5ec875df27031574175deb2477a0a0ff12efa41260e9d05b189f8604298aa955f1399c2485637c50f1cff56040ced9c736957dc1eb2bcfbfdf6721ea3930dc3b85a23d24638dfb2a22a20fda83c4164dba3c30d3b66e98dabebcb8c1a322613842df86f411c20bd407a6a24044ec07b543a650448232a86e9c7475c31f7aecd1649275943b3b2daa03e13e8c059fcd26ce0a3b161a586bb72ab1c45aa1b3cd312f392a214a1c9b2d74ec6b1a32b7f1f9d190bafcb28ec802cbb0cc4105708ec96a46f3d4934dca6173925aa158fb6fd1b5ce2a88f3773dfc400338ef314c8dafda6169d0701e8a1e48544724d34b9074a29167dd3cba69443da270e64d94c573ffa357d98052675f124bf3b82f06d0c46686c6ef33090d7adaf5cc059cc6c1c0fc7d94e3ffac42dfac7c4423ef959b848aa0bfe5ea866049d84b3776eb1a0fd7f0ea69caa2030fc80a5ab513d986168087b1c545deaede423237db54365dc992bb7ce10900660472c0467bf49248da359ceaec383d4156de410d6bd9b0092b1603286e1b67d615a90189423d8b7c9b6c3ccb9afc20c738faed8e09d8c83fc43b6bbb4bf3d9b4b6b1d985b394cfe5acafd142aff7d527de223eee060635a37a9747861f567108433ec8405e03bdf7c5b4ed632c843253e187de88e14fc56afe8b5d62ef7c75cd9d87bcbafcdc96b2aea3673c4fed79f310d5481dc2bfe312499d490101ee663e7241ba96e5bb1d2d2bcc031699493959b2e93504b96501d4fb3f2c5ac18345deaa54f9dbfbbf7628f1a413c86a41a1d2b09fb5ccced50392617b308eca1cd40b11fd01ca0e2be4af3a4f74da74055c1276765921a99b7c4d42259e76fc765bec2b0e09c8afec478bc894fc1932455bc82db4b8c276f721579a3c6f092f1b82637441a91793e5a1660481ca28cefccc3b3f6e62c250a33ba49e90677e26c9eba5b37e00e2789702424792ce6875e45f5613f9d02bac6abb640c9367a5aa3f823cde29bcdbc542ef92b56070b311490e0eeba0cb86c5a818a7f6287536a3734d67260f9242ece6fad632e6c0263648339a1fc242eb2f3996a7362acb45665c9ab098e4b2c089051e764c18066aca0eaf2044c24b10b77a0a9122ed592f3b571ca7593538911044063d1bfcd8d524e9998785ca72385af494c3f3dfe058ad2bd9fde0c75da9d22d9e2d25536eeaca57ccc6856231bd78d6ed6eb1639e4392db98bb3651e9223798de96f0e6fcc5a2a842d931b674a220b173b6e6db2aacd76b52010b0426cc427a655d89dd1f89c7465f506cbfbf5d61a4d9e895eae3867e577b827a5ebe386d46a9f1d8c001fb374e8ac99333118ad3c15748583f794191e2a1b883a3b2eb2af0d00ab9f6dac279230f4cfe93a5394676fd864270eab7132bdd701e9f8a9cb9889ae23c34d6f7704c127ff665b32f36e4c668595e3501aedf00dd496e9357ad1673d28c36fd5a186fe75979f2889c0c8a4a7bd819ba90eb40d323fe01c76911d64791e866e509cc05cfcf80ed933390a65e0f98e9afbeff0cbfad903d0c9dd258bde43789c6e26c29ad052a05243b5ff6d7c802502fb777f697464d9716fbbb3871e6845a44580d1ac89a5c2a1769b77e4b11c0b6bbe7c3667575352dfdae11b3cce79ba8e74057222e102a74728836f07062042a3dc44790232c7ebc246a3f1dcfc4833e67be405fadf25669b6176c2e11b07efa0b1e0b88ce72c6a35dd8c124eed451258562a934f80d44bdfff8887b7f994f680c17b741eceb360447e312993ccae941dae6e4e7a9b3f7729cb9c08a8473a90e6b27e0ba90f5559d0bef47cff0f0c343bc078f0bb3211ad82803c30b7498ab3ae1111ef6d0e0e2d2decb6cdad4703993249c654a20d5aa8018121ec7050d78f6f53320219bbdcce6fbfd3a5112a43c5eebdb2ecfc357500a0823850a5d68f74254c7b1eead450b4ab36451b04222e562a81ea229223e6ca66d90d55bec4698f51d91ae68904d4", + // missedIndexes + hex"01010001010000000100000000000000010100000000010000000100010001000000010000010000000000010100010000000000010100010100010000000100000100000101010100010000000001000001000000000000010100000000000000010000" + ); + } + + function test_verify_700_of_1000() public { + verifier.setPubkey( + 0x6535d635c7ca985852c2f690cefb0f93bfeef16a7b32eed457290d164fbf5750, + 0xb1b1db5b933ef888b3ddd16e8b2af8feab844305379c9c711f5b5b20b2d52fbe, + 0xcca8876dd1b6f58a1078d1f71d7c8bfea4637f62b2531a5500417fdbdca8dba8, + 1000 + ); + verifier.verify( + 0x856bbd9f0f923abc9d8f738cab59281cc19bdc3d938f56ae10119bf37c9e3c5a, // s + 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8, // m + // nonces + hex"31fab974c9dd899a6722c000d5019ca1048ec62b9432c908c213399f3aeb5c79e63498dea79b9ceebba9fc8178f99f85fd2e647779209e4735e4f49abb31f689494848c7c3888e7e2306164405cbf169fa203b68dfe7f64c0f5ab1342393c55a3873105979d8ebcc21602f608503e1a31e9524e1098934ea61ba849b4dfd29e662519f1e7cd0c776007a8953d759488fe66d63dc2b5313a3511a03ad7ea0ec97c474bbc7e9afb05c3e93839cfa1575de9ec9eb3923a43e0b33e3e2cf9515540e7993211751144a48c2b2eece3b342b3277c5b62373f9a3b3b8669f5d0e6f04cac1886f3740face24dca2b614ec635a37785e637ff65c5f2c1bbfa7127d0361e7", + // proof + hex"bfa8d71d52f3737f3741d612ddb54d5077f41e33db35c61cfc713c64fe0a2c87b6580619bc9a6307fe9856b52b25370e2886ebe9b551f40adc117d94d0f1eee93f8cc488312315c3cb9c781cafaa709ea8629887d985bba0e15d22a9fff1596034d9fae2c0c34b0fb28474ac548c3468a2b932a9c4c8b1cef3ae4571f4111976a6669c06c8fa315826838ec4cd645c5d9be5da0702fa963cc2a89e893a61b00c5defc428d4bdb11692b90af696a12cbc0c9f7f59826ed295125efb95acd33cbb72fc31611b3099343a8df94a9603234cb01950fb631c9cb62333befaac4b3aaaca68842fa4164a4414b2d552f7219b9dcd46c90d4bd66fbe721d8ef07784e655e75d9d3294c8f4052f8768d65e906106b093e122742d82e2d7570eaff083a6039e27e7cd05bb5a1c9011406479472c3249f7b6e261bb088b2b36c9dc060986c312cd7df0ba336ca4b269935da916bdee7927985753dc4596210dce7fd52b9ccd3f931945a9c3cac91cb89db8767eef819bfac17f5d40d1c8a9d31819f9850c2a2637a1f6ea088c9d53d367405cb472e7177a65f5e566437744f22ce94884376e8a57d6ec1b678386ac225307a80631690033055b92863ee7bd4701306dc85d367f281b0cc8122af731ec8d583969b885183b01ea52d3af9be6e23d5f375026d331b5d430dd0a00da80d8d9a10cd095992886679250aa810448945bf5a00339b7afc520c57815e2df39390149735001151a0c8dc242d3c927cc610b1e932fc39b5dd7a815fc25729fcb12668a18673558b36053dd03fafefc8f3ac5074ede09df208da39b16c785602f11275deeabf1349e4c4ffd856b6678f46bd7b2b32fd64a4dfd81f6f395e06404b65257acb5d99dbe2e2cddac36f98a4cf4a4bfa70545392d587a1be4126ba1c0a76fc0f8c5ad6927b16d9f983b82865f944f8650cbdf8fadaa19dfb80548811a18f80522b5e426c40485b65d9aed49d95ecdbdc6d0f2b6af73e24303eaaea4d5524dc5dd9fd7019c1e2c1bb390e6ee540709e71916adadc3cd3d0ba1e91cefb780fb0c69e81ebfa1898dcb454ba7f83244d1a476f7df0df880d08b7fc82a90b3f3e5b7a6be5b0edb7b6841fa09889e0bdb6672c68948af415a441dff43fff425d6efb69cd73a174010ec776975a2a7706462d67509456deef9ac2691635cd7fccd24dd02c5835894398e67f146e650327aa026c07728a8e0a0883271163568bb957e5745699e4083d0e8bf27e1aa42296fb3a83f4157f697ac9a6e03365fd1d3997cfcf49cde8ee0c24713a5c0c86d657ad43d873e95f90bf3d503d3596203f1b0c0f74fee666177465a64c20920087ef1a02d25b2cfe32ea3bc72ed4da495ef33a227d91c8bcd008b105b6a80c11a944aa1458837c4e2531d2d370154dbe5b4c3741c7bf0f5d538c24cf2c39274737fd0134588704721e65d39bfb5818d3a9436fae7c70d97643741318b980ba7f6c29474257c97f77b00cbfa4db4bb2747f8c6797c4ba13992c8954b9d8409c2e8c8c5c6e6a6056be455834f3b1b412276bf89241bc0570df65ee1399cf61d110a03ed4dfd6e76c0138a15735fc1a3c81413f872555e11c0eb468833f826beaab32c369bf40ecdecd1fb96cb057f8a09a55c2fd4e8e8e753325e1bf9122b14c5fd45d68c2b1b419de2f856b3ae65182160d3956aca2f7a957bf5735270de52efbce9c3f002ab2a78afb835997a521b3b88fc3192e3be219ef7390a7d7aba908d19d0a655eea768fc0ae9f507d1391a0559b991a9097c56d928d8f886a9fe453706f59437a2392cae1fa8a3353a496d325c65dfbdce132cb4f94c1e21d389c2c129bc2157c38b908c8a19608edfb5629fda65eee475aa004b4571716f55951f94a5e23494d1a0faa26c3a29626eba740be6898e16215392ea67b2b90c424e7c90f165b9e6292daacdf703e3cede17d22e8e005634526b7771de06960199bb9d80f01a55ca35401392ce2163907d20041e0250a5c6c7c4b40de4cbdfa6a93c9211f4dfaa4d30a869aab5cf8215a105aa7717cd55401c126f32885d106dd9b2dcdab9884a5ffbd753ec24f84b645e3c4f4b6e049beaed1987830d4c7585fba778c17d088d4fe7ac228345e6febba64ce131277455c77bc97b7ad1de9e2e651c3164378f8936c7b90e4d0f6dd761c8fabbea9622b3b80910312bf7352bfe413c5156aa45ffe0580d58689b10536939ec3cdf0d80dbe649f72ba6afd0ed044f35082ac9ad210ed55991c8c8001f44e034b00eb9ed2866f15a56a17cf381b12953e3c0d3b402074d055f816f5410d578d4e405ee15dd087922cd8615ba358282791e6b0dd5aa2b004391a1c8319f5afc033e7670f25b9b796f25fd60aec3a1399522513904146250003906a91016da3b07d03229b7fc78240039aec04908c9716ae6b902c9d679da0e8f2e901793112190f76d49f56a50d222923f1fd564ec4bd4f263a2ffc1b0ce7ef91b89a6076084f9dbe7f6d8a8d925ae0e2f763687b48e83a0e7218d4cc23b3621b356ba4416b4873e600604449e5e915fc1bf9b5f56fe9e08960e3a8c65118232a4c34b29420fb972ccf4de7607effe17ac60fba2c6751889e3dc12bf447d0658af6fc50a084c5d4fc5b58c863fae386fb988702ade295704c2612acbc2eb20f9aebdf09bdcd42de4ea9131645a06d4e8ff8425fab9f2666bb82a0add201b01f4cbd802f12b98344f07017c37473275c1ce1c3e08521bc7f80377b7297775cdf758c0a9e3ae247b858cbe8c4ac7820255069bc853fed216290c3b3d7a59c07a5228a193c1141a999c13d16e933097dcaf2c4ae6e506aa4c14a63bf5d781d92d0ac0214c6a9c142d986b8dcd3506a8bac82cfa321947d9436493ea1a56f33f1d243fb0db33eaa2e4b7110e6c3e87d08f5cbd3a38c84867b66ec1f7e76ece652b65344b4b7e12be6bb40b8fa263e22bd27a095ffaae62b40f7d12e28cb148e3dde549f8140e62559ced4c55748c4756854bda04f53b5de024db402b978c5b828e84fd513f608cee12532680358109f079bda815c39e9253ce96903b977ed3bd5927ea50d67117bab312697ad0e789470f76647aca9552962e06990bfaa57b663634833077313aaf24476fe1e8dc6487554f44dd112b3a5819e411c5d53a40bb119adf14534f4da272146867b669d8c4b1ff416f72f0052278c22218c136ca6ce84d12b23e8ebfef290f068c7b65d80e9e9ece65e410bfad4180b12184f722adb1921af46c9fddea5d7d5375a20f3d9c2d5e61d1bcd7bd56b868059db13582f177e7512d24044fab84feb473b33ed37325cdc5b3fc2f90fb57be3a8a5f508a29cd8ed022550206b657f27364ba1bfdceb2e8f40b1057f997b4092b79a28c130a78001a3c759991e6850a2df10cb8617f18118df2c294f6d5eb86b33b246c83226b4266313538eb9fb7e3f89274d8d75b8510bdf99eec5f0934fc8b3645ea5d96b05b9cc251e40f77ceb3eb5f05ba16c1daea01a94c6d7b9176a7246c635a63b5c152fce81cec8e915d78145cc21b50e203c65a9365ca13fe1b445b5925f72b9df36484e9affae59014bbff0b42d878fa77c13479c6523918d369479b238922273afc876599aae942077d899da9f5d19495e6c8718458284c5731aa609378c3c1d1120816c6f3e1d2abf8cab9d8fff214fff002c853b65b5831ffd7115b51075d6e423bbed52c1b7b1d9f767556de0dfe86da586a25ea64b15ebf9fb8ce2144ed7e5afd923fa280099c9fbd350a2a5132e58a580a81ecc200e46558549958712ccb00308b2cf17b727aee3f20faf19aac4c674dec5ff9b1008208480d873398d014d08f7e9e25f4dea2e2c795ce604badc3aaaba2df9ca190db734414a541eee78bfa578b374e8668c04aa1a6c1ee398fcc1de5191334420a4c181aa793d9fe74851f02809bb4c1e4fc33cca693b7012df08bd7633ddbf977734d2953c3ca33eff54c86e75bce126d8c53d9423c33d770305482f56476494fccf2241a046ed8bcaf11398e30a1b7030d70ea618e3eb91b3fee0d659c05282e2316ccaf800967e2f1312f8ffe646bcdecb511d9508986b85bb654b215a4470b4546249563a13bc2f08289241dd1b9c8adb4a50e11ffa90ad6262d83e8feae957762e4f89c8a423472309cf5b4ef53392588302cc21b8762fbcf2ad57d3713a46779f6c44da4af1dafbef7025b790081770b39c1b7d4b1aa50ce8ba9048bec6616a3b2b7a8c29f975271f47790a2fd6948a5850bd5813edd37ea1acf49a7fb56bf4e7a492256016d49795661ffc0abb66e1cd862643c6f0f8fd560c7cc60a18ffbf07c50040d4f78d1f5bc61edc9a1ad19bb156e12a10935d5b650536aefb6811a852da9caaa45b60e9ead7180493ec2b8ee02abadf0585b985ccdfabfd407b78d847afb680f001c7c11bd62e00f162191416c637f6d154f9073e3b19ebc5a800eeaa0d72b3d122b1e2cb6667ddef7ed7ae53053392e7464ff7e6c5111db8e7ba7e92294214f0895dcfa2a2d313b767cf78a0cc912a3382b1ddfed55c4138dbe72a517b509b7bca40cbe30ad83a4ab4e615344946c2744cff5962f079b9e0ceb20f1b56ad7d4d465fd5b8a83ff303d6c7fbfe26a3c941d77d4889c6760d588b54b46d5d5c5d89583e092a14c345234235a00cefe2943b23e496ef2b61620c09cfedd0f57bfd2bb8c2602d569c3f6817cba8832c329040e2a2c9b2fcbc6f23f1e25e3db7d5536fc87574a70321ff04ff09d8e7003b47f1400535c5e4b4b192c91a9d55a13e6045b924ca60452e697f899d378e6e7c08e2dd7ca4614cf807bd349d245b8c69e645137fe72f85e01f39d644bb497b678343b3a7c3c9fd6b5a054f81cd43bfcd549e89c824640305276b0d81bd2ec57c3e075ca0a9b85ced4129ae0f8822fa47df79be3af5af65a26edfd851a86aea0853e104d943ea28609efff79eb3975667d2760bd286c8d5bcecd760571b8b5beae9b768c03797295c0b627bf154383c7f65766faf3b0a9c5450a3aee34f9430c6df024dae81f87db9e85f3de56bc153be7dcad1082d358c28d43b1a8e7d028e5d93618378966722e714a058be1ae926c85ffd9a690dd64583c13e0502dc4eef168ec783fc458e8ddb0784fc07c056c76279d9a67f70ae4ed54a4830e9deb265b6b880a01fdfb0a966b1ceaed27d4ddb2c2b22892f0fece57922a6fea0f41d2487f69ea0029d167a245c9b1472396e54d7e273f2ffcf8735ab504e45a9487a4301abd9052409ac923ee1117a461bb31639e33c098a05bfcf73e5375f147a151784c43303eeaa8a1273a04468c32e322b6b19656088588a47db18efe155446e3f6fe8a4fadbb2c95f82d345bd3f7c2cab23c245984ea7270cb2c99ac684187a7292567036283a5442f92013fa20bce2c8315f7be98dac4fa2b05ee2403d737d327f76db6951688d09cc9fb0428b2463beb73b327599524dcff61198d6450c230224b95b1f51db2496bc65ff7291227af26e071739310c7d8c4da0150627f2dabd79e8809c6937463ef5ca35432c19429f2f2ce79f48adc6b11e69de63f2ce1c6eba8e787dcb6f5d3e9f5a9d62887b4b121e0a0030dcc0ee249c3894ab9a162254150998e9d5575da62273dbde6ed60e8e377cf93aa2eef5241a20f0ad2097d3c215db5db8e9519a42555c5e9c3b07f1a5393fffc94d347cc72aeb6f1c08e2ee67cb02b78ac4952e674c687263f816d60e066e58aace136d61a858cc84ae34d87426fe4798a352246bcc406372c5ed66e89f5aeceda62a1b116f83b56f72570ae61bd1ad3b922aa3a651e559a22e6e8d1daa70149b3e12f47b001e751f52c686424c937c0fc1a9e9fe53bc16143b0352a47588da063f1f6f8c66ed4e78cd785500bbfaf711f96ac3b75b0fa08bf5158f94ce4280515bc4e0913b3b3b9e90d02aae2b70eae7083afd9e5a4bc5a00ee54dd77e0f2f16e9f24a3ede4d764053b620561213aab22a5f4f1a4ff2c42870a49bd66a5147448df804590d68d889da6013a6290a4ba09fabb99f739e9acee231a34b318284a02d586e671c22e9949b5659d307be1c53a3016e7437fe95c239bd22d2e47a520227dc1e5e95b91dbb4c7a7da5445881ff89d3eec73c195196c7c76492ddf011ab6ac3ac71c66f828e89abd2d968c39cfab461ad264b560381ebd02fc974d05c14897f49397657890ccd9f1e3b6d2785a4b4d744df30266a04ece079d6d58182b7a67be4ac86b23922e37e3818527dd75f768a03a50aaa035a239852cb5c92371871e5d2d528f5b4b71060855c32fb473cf8ab1f95f0e008d82f4b0727b4c17c1a9192f6dacf7579eeede4d494ce8d23f064987d474c5657697aa3e84582649677b3f013da48f5918f45a26a84cd890ed54b9f3374b8866a70fbcfc678e204fe7db08a58365e11ebde582467f28dc6fca15e906d0e51c241cd9afdd7c5a651d35004816ae29bff5fc6fe647cd2364945ec93cb25647a96158709b364fb579bd5a713657d2afddd2347d5d02679995bbcce1257276e695decf4612ac353eb655550f4e94798962515e1de95efdcb80ec57e56091394789826ef0b2e8cd798a7cc4239358b0c426cd6223d129da4e873d0dcf2a0e510899252737d3bdffc4b4644598545e15b5684d3e80b9d2850b9c3f2d54445db4b632fff115f889d569c02012e2178cafcdf475d568a8ae0bf1565a46afb23700d30c15d0cbc64d5bf7cd56c80fc4e6c8aa4ee369cd3cb6a7421f4def41e302b2a0790cbb742a273cff39b9f5b637a2a59fbbcf81cf08f8a9243d95e08c27636db945e4fe36ccf72ffb7a8dabf4a626dff77ea97fa946ebe1a0f859eef9e2143513b151b4dad6dc09b08862dd4d9f1b7483cdfebed6ba608ce31c3b552f12a6b6c165180a5c991d1896739568d64a087038182dd3e1ccca9cef62e8823df4223008d2fda8b40b833761d54bdbe3a66e65d390a5f69b1b6d06442225e6642cda86e896e1c97c8d13e73088171a3591357f4155c98bb239d46638bfd72ed1c07e2ca9a970fc4da03061bd0b8205b7fa9c6cf32f262d9e69a1fc7fbd283992a84df76817f73c46a8760f5ee4e92478afe58fe36923b40e25be96b1089b4a7fbf0c70c90668f2aa46175fa16d4ec13a849864b52fa43befe93d2dd57e238f27f222135d1bf1aaa300912913e7eda5cb76ea8845c4048df4931bd1e081eeca74987210ed640588f184789acde2b7b5e259bda5b00d64f16cfe26ea3f71e6639b83d290644a33e52b12f37ec20a694d5ceb5e2f2fbcc72419a8e64a9d7cdfa0bc8beab524df20717a2785283a653bbd0f34c26acf44f33f2828e1a330837f40a8299934aa1d75f2ca868f9136aa6637b8e510159ec756903c627787aee5f26b720d1a9940904fc0bcb5bd6d759995161c55f596de6a4445284afb8ac1889c34bbd02075ee19e28bbd7992d560aa1bf31af2ba9cf9433519b3497e512003a212573ed4e83cfd71bc077e28131a08b228f0d9157adf763f3280723203ebb9c0f4eec340a123494ca8b3c78c697eca6db20d6e5f6e4f73afcc276e0baf5bd7199bd0542a744e60c472145a0e03aaae3fdc400e92292a2ea9969f4c5a4cae7bcf006b6135ba2512c848b7370c6c640082eff0eda4de54331211e2c4fe962c0fbbff869296ca95bea365fe1d04e464ec467faf08c718d2f4694154306b4986fb0d749c70ee9dc2615ec8ca3481c16c4e1188212012cfa6faed29f59f534423bf29597f8d6e6161056933f6aa79700a8934ab5fbcb11c3254ae74a4e05c59602865c220ba543d30539e5d3cfab2b04bccdd47400723c45cb2b33ea559134f091660cdcbf4aa533089b6ecc30bae7bffb8ce2f42f2ec9930cf99cbce43a4c057d89a92fc7953b7c4a27b0d09eca4eb836f652ce59fd45ca06dca8639fd118b500c3132fb67e0548a219dc833162a1882c806f978f1ace37e103cd1db30566720716a9645b7a693719365cf05fd277012d108be7cf26923cdcb261b950e1733f0343f5b0eae55100b700db8e1a5c718fd8a6fa02e3b130527898576aab9b70dea069d41a3fbd12de5016ae5bf2f35c87397a5a1bfa89b841cea59db484c0a6940faaae16f0e9467a3990b67496aa7002089754907c4e75e8ad7b7dad9ee1d1941640b12eaa62b84d551d2473b94b52dd60f8de76342316ac94e259d66bae32dc0f0998987e9bc8ce7e4d8213664b62eb113df23cdd4a30c469a4d19d89e38608e8ef0a352273b306095fef63a56db89ef6ab93add0d71b9453ec15850a6fd6349bf3a3bf2b921e301d36a0e7c7fd075b4d899ec1e35f6be8921d69cece1073ac24fc0462bde28497011f88d083fc4834783ae0c6d10caa6d0c83e429db6637fad47ac309e84934ac3ffd82a0b4bbf81056ec8efdd33f22bee3e21f5913163dfde9f8c657426b9c78a37ab78880d29c728a4f2dee2a01c082de5047acf5a52a2c5022e6f0c012600df455e17f420fca4a85b965d4e0f3b5549411aab5794824ccedfbfdead604c8ab918b676330491de6e1834813d945bd2a6a3420b9d8d1fee93a3f317ba424f6384cbad32cb4c16eeccac46d6a1c151170948280dcc61e352c2978c9485cd5c3908ba40513cf47fdf548d378b1ccaed29acedba2c02c26bd926958d805f6b8f5c32ca39681b9ac34517111fc3a64d0f6660a8910ed029de2f6d6ff4045f1082fdc95afe4f89dd0db3c0a3ca02feec6e1ff502fcf464f2ef262cf5ec2370a840e31e611042d39baab15b468b5c6b1179dea2c86a01ea494c849dd163d259b5f1bc2b2a844afbab5032f19dfa937666ecc5c2f6bbb6fb4a320ea4a55a61c8b0a5c7b88b8af4d08fc79e9c0a351cb46f1eef3a4ccbd484626dcab1f8dd8f48e4d06ef9b76450b1a02d68ce595f4c2f85e335e3ac19a2f002dda21695e1e9726d58996789fcc1f7bc197677fbf45b5f9149fc44e7773dfd48bad3bb0f3c6ad59c805f4313c4d66aed1b4e9ff989334fbc16efc4be412d9337c9088e628e15fefba86d28789590724dfff8688f03f9594e9a8e7568202362e2d1e97d91b9b6849591ff025c0f06a6159136bef120411ef7347437d22c1ffdf02447ed38d11a7a7a839596529e99b4c87b95e37178ffd8467fbba1aae428c1f76a385a6fdfc43a1aff767cbff1e2c4594c73691ef11bdc1925af33ba2620b3ccff343263a28538efa51fba094145ebc22d8013ac913ef3d8af215893a8ccef50db6aa2539376841e76bac13f390f2ae0409024795f1f963aa5036ebf623256d2f35e387ba69a9630aba1de62d51813dba2f1f5aee5ebc724c0ae2e6d95537082ae5cb2b8ace7ec95c90bf2b882bf253f84e954882a662bd7432ba64387ce0c5bf0cdc10e9b5f6f1fee6e3ab78f960c2c54c05e3e3ff307ccc2e1f87378ed7169627803c83adb54b7f67185f6aa262c3a7d782f43e057916da57214e0080ce49fbe45f30b131423ee59e35d4647992bf9895f39908377c057c07b882f913eac431622be8b127efbb44a9217e8011bc01f7421db108661b0cba184400427b76d24a79748898e0e6b62d8983f6a014803c5ff6731e61396899ea41c607e77f2b941e03ffe3250b614f43ffcd6bbdd02ca609dd1e47e643fb1a4ac93d4425bf3dc4032a4e517d45490054a313112d87ed7ba9fe7ba41acbfcbcef90459a97f8554c81584e0d1bdbba0cf89c2d2a93b1b6ffd821ad3aad7617396a83e12adc2b2768e9af689c2b66a780d7e5374cc1b3ad4c94dbbde6c2cf070fe5409b6554c4d98c3b1810b64a9b1d30d2efd8b1cdaaefd4e480fb608179a207a8d69caa3bde8d4b4977bcfdcc4d3f07f24c67b3b64873ab67fb7a052151934be554a04d137f2062b524af51b355963cab4a7882013df50785d1c0a54c61f6855f360ae9029d2077269a8407b10010ac8a79971a1c392788fc47d2935d16932f6a091d7cc7d912d93f2985835e00eccd529c2cec3855f366854d0401e889409c5c26ef99002471f52aae64bab36c31e235500460fb46e2775c0567abcec305893e1523c277dd172e240463e88cc0dabcd3d9dea1b9f0b6d5e5d8ffd2863181a5fba6a95afb57406767d6559da19acd339ef88e13f5c6a2d900ca141fcb5b5156ed780f03c0710fc9eb6e3e8c278a99a13b6034c752ce394d1936213e449faf5d8270a9e7e5e805789f1adb6ec3a24e1e52ce6722a6d303885e3e2520fb4c29ee27f1f2b3e9ec39c907418fbe066f9137d2d05ae9a042649d66d54077cb46485ce4df792b9f1113ad65fd6c4d410448486f204e446a807ad9417f757aa1507fc6056d0b90e1e2aaeca421e3d77736a590c2fd12fdb98da26a6072b6109faec5a609e45a53eeb5ae314aab6dd082d4144916301e5c2b4c1cd2f5dc7e37c531f591c2cf268d94a5b39d897c61f08e0e5b374f460dc21e2ac722e0b06f2eb3ed7572076b7139d25f1182eff9fd832f48ceb83d0520e51b9d9b5667ce098e10176e83509c464c2bce5d3be79fd8074e2ab420b0d648378b8ba6598270f2a48d0d8a7c434887d871fb6c90a5af27d1a95d2d1e604e09a54f5962cbc3ad98c4dcc2934d0023a92094865213a2eb667ddd12656e572504fa90f1e552f2b2b8310840c3f48a83d476d46671180d309ff28201c806a7a265ce0f18546899587e7a56e2993874e5cc4d043e1ff048f2b6cb13ce59e9ac1b17db4f8b9e3adb0f7638602a71799ec30194bd6962b77fcf1aedbec66a796430d42d4d4adb67aa4a34ae862e2cb26d2df80cf7ad57cde2354926e314036e51e6f079a576e18c03d02cb29c322963f35bb2a830a6a28c9c07f2455ed9cb5805d900f2f9fdef5b90a531dab39e7cd658672c6f72d218071251957f90c1d2d852620e442d3066383e419fd1a2a1e2f4874bde43ef47253d5910e9c4af3af517709a3850bad30b02f02262e952ead6ba80e4b8386aed4a26a55118d1100ef2a5fb6c5871469d3e0e908f24d0aace40ff6e2b57dd9ed0a1855420ef2527fe9316d56b056f7b32a1f7ac20eef0c21b5f6baad3af88c57e8db4975b5b4e0a1c2a64d4358581a1a7e43dc71665ac99c8cb283ca376af22c0e5392f7b1be74d73e368276a0ef056eccf48695f4f95ff3c04af9fba8dda9fbbb51b0b12af1260d1afa9acc7c7520b618772eb695e7af66e995602f9ddf49890b546b323683cbff4c2c46c132a0f6ebded703909ea0b7e782880eaee2a5c91821c040bdbfabb322eda0b9a3069099933a938925e5ffbd989440c076f7d11c650671f7934429f51fe2ac3dca82aa050bc0ae38d5ec9a7404aa3f732eaeeec8f0fc859eea510d9924555e5c926ac9a0066a541af56a1f9ca0034bb60365d100617e04ef2b9a14c20dfcad6b3b83d218a71c07501d5462d9552762d862ee3cbdbdab2aba029174471fd7225df009465fbce6fe148d6609ef72ccc3c418e48049ebb6e2a7185881a791a3ec2d7c3d8a22488dad12cf599c6ce6a4aea4296c238df10d6573a58d4c1a4130be0bf92f277e0731e76188effc888fbd6b8019063eaa0ce3565f8263fb7a8d12e3d6bde49c8698e62baabbf1f46c02c766d3d8c6614ba0cdc9b66ce6df2e5076104122ff4ca116f97ec401efd6b79d9afedca70d11d0038e6c2e8073b7b30dd092fb8a08fda7a8a60ce508accbce21c6035adf15e6e71db32bcc3abfb2c6874e9437aa2d3a559498db068c2436ff947259bc8f789164c9985aa6760f1f36c5a06d8fea721b60797745f228492e9f3cbe931cd8ac54920dd6a7a787299287c9ceeb3b436e9830c7cfcb5088e58ee9ab370c6516abefc56a37ac9df9ff2e846d088558d3aaa1e4d81d0c0082111b1f20be2d0a3cb4374a1702befccda22d6c1a3249b6a43c49eb7ff6c2fcdd8c4060e51b718b42cef601fd55cf08aa960fb2b2a47e3dffecc346a994e61a9e24c02cdf9ee27b483cb0f2da6a6049498d490f6896232abf9a885b56d08d4384c6921bb9f8f260bc5e7548c4f0a67789d9e4e14c0b0facaac5c83ee8177f1275b868fd4afc8f678e157f84803b4dbcd21974bbbdf66bbead7ad6f0cfe30801c8ef287682255d00dc8acc43947adef2bc4e52b8e2b0c7f73278432bed575eab2d5f3947c53b5d4c64e8203b070843dad5d0998dc497deda35b83c3918e12d9eb5507803f909f53fb667cdacacac7e7c2b585ef6fda5469c1317388074aa81c6539d94da4d7800d0bbeb13e0cbadd7e0cfa06dfdcf6f3b788b1d17683a8f9f38146c39c00084e1178751ba3a6540f1477f3234273a41b9e22f973b5ec801c7322bc705bf2d7c61d138a6b0f5483612b314fac7c1302b236389476a91dac026ab79a36060b433c05b0eac8387c10a9844f297c7f237c21226a3dfaa8328210f5e48ffaeac1409aadde7cd3a51f9f4cb9a2f8fcf189481c8c89a770fe420e73ba1a1940d2df3f3a674cb5882107e6d438b0fb9080e87476a7419a8562d5e6f15ce20476f6df0a9278f149fb685490eba63104186edbef8db394d54777c72eaf8c02e0890572d4680e1c008e0102b4443849d637e2f031111c44502845f2a582ac3d8b6fe0b1d93ffdcf448b42104e2cf3ebeb112e76096bc0f43904662fae0cf85086e1c5443d6de108c303400a12af416769e3a978affa29ac1dad0f8ce0a53947cb72805bc676ddb1929eba88c6af89862d24f78b1b6ffcd8ac838336e905d03925ba3ef9c7c7ea42ed8723dcb7b9d99a5b55f5ed0f989260605882f89bb816e7371d504499dbafa4a7d475d44fa5e9ab047a4b0d5af56ca9a3671611333b22932c1aafff517d3e399345a40664951b08c5e620d1b166966e0596d331372395d6609656c975edd364897ec47aa89ac6826b8c212f3de156d668618f95d6fdc8001d38a524ebc8e5a284dce35cb38480639c1a2c319307f86bd94dab987dafc2045c39286b89b5d0d932d1940c8bb9370368b41f115141fda6fcbebf085158e767cd4e8f77d9a3b8233408fccbc58284b2e3cf84a02e1681c35ed85380b25d16610e5abc5a749a5e546b4afaaaa7d3ce7a912a47a023bbe7ab750444ea8739e792c918c49344da4c8f261f0dff07c7f6ddec9d82da39d210330f302f1a7e96ae8212358257728aaba755c17dafc26e033e6905b16c8d2e8e95408f4580a3698712dcbf370a5ea66f1145433e1f6480ae026301e02b150b91cd4b5444e00f8c891d22d3a55e44435db0d1f8a3606737a82cb9f2088d66b89f7391a7fc8d930bea97e3defce9bad087e9410f3fe18462b34b9892bb7362c12ac8ab059b1c4fa9f11fa7c8b101e56ae5265c1b54a42562e9e692fab99094895da0cbe3eed448658aca9e67b4f12876f78b34df9970757d008a360fc38595c9efc61657980d8a777037d8cf2169b97ce0f880b1f2022fe495654719917ad6935a652205b6e066eb50339ec9b1ba5f1dff2bbaed3c0a3f47eff1ff34294b5151bdb526a01ee2393316c5490f5be8a94fa397ea06786434255e8cd3fde0846ab7383250027baf255248e2b998e022154f6fa6e87416b772e7e6feb46117852a068a4e6c86b8e0e23cac65fdda5de92ebed986ad68bfeb85d54c2ee48bb15c42feed06a7b5bc1de3f0f5bdc6330ac53c21021dee006f65a187f07ea68bc1d3e80d5cd9e9f7c18a56dc6fbc81eefea553b13184916883a4171b32ee9b0bad703fa3224c8733af02752f43ba11c0ae36c0b43ead54323b427ea920885700811591f2ff6486e27feec5003ec1a9fc6a9206026888c10f85defddb32349f0de7f47429ec89e8feca33c2630ff35234c03a738535fbedf9876c842ab46133108849e87f15f3db08b512d7603abbcb362fe660dd5a3ae130cb990730cc6ad79baed99cbcf9a620cc3fdadc3c71817af4f2249e933afad1a2221f5383c009b927eed5865c47ba397d8973c4ecc2dd5a984520d53f5c1e1072ee403e5ab2fbf2f2a162fa0af33052cbbec3e297a09e9d249e05a24022251c1376d4b652877b25f347e66ff8e3ac000df05d305e6a397075e830616e47ce155e83ff58a4a3855e2c45523227b3cb2fc6301595143fd73b976ad94df821c6f1ca7aa3b0986b25370f32baec78b50b318a00b6398e8a64249566cc1e8fb82fbaaf73380e1242625d7a9c1fa2c27d5da1aaacd10c75660485e0f79b9003866023c8f65893afb63640f6de158d8a74cc26370358ddf9e9086b65d63bf1d347c0ae09a899d30216fef109b3327945e582c6c80fdf41f116dec40fdb312b6ccb4043cf26e78c7247f28b546b37e2eae9853150eab4331bedabe158bbf6cfee9bb54e46a6d8510ca4a3df8138e8cb1219a9b1acd8648901ba37b2b8ab51d1bfa75b1d952ebcdba69fa39105aae7eb0af8e24be2b89e796a046442ca70c27651525b5498bd65f1b80ee2d1f33005c43d1d087542e9f00e48989331c2db74240b8062690eb0e1268407d218de8afc1dcb6f639e9e5d5818436cc624470a2a407f30dd6f6d805657d02b75973de383118a38e74803b85ece16d012a229c5514bf83b6fd3efb4798c627130ed36b7cd4333e90c1bad2081514245cd2a5d0a8cfdcf85d3c2fd866abdb17b71c247e9c93d5e3df098483d1e8306e4aab23e818c1ab05829c3ebfeb50deadb0618372e6c98aebc9d9f6177232ac3af3c9627df0f682c9a84b8cc55d23c1433ea0db6fbc4cb2996d2ce4a7b0f26a2c9abdd76bd7630c69af47961c75088d222936f9253dc1a2a62b42091084633f93a5d4b2e0c006b1751f03e52202e03ecab395ea7e7879929cfa7811f3329e45b9be48f9d00ec2793acea84146d60e2bde4da7ee3dd24b656b987dcbbdc814623911678794c3ee2a5f134b5a96436b00e0b7341d3f398b44259b0093d9844406e2cab4e83503d3143180427da097c17cbbdafd17e0641e9c13c9e495dba84f270e88a5fa5a1c82d01380916d1cdf7b8c1bafa710eed1cce4757330cfb24557b583711c12de01e4f93ccb16dd36ba68fb17fba1dd9a1e45c528dba4ca0b5bb995cdaf9dddbf075566713078210815018cc3b3f4ee15a682065e4fe1c24ca530adb5104d15fced5f7cbecdfa422353aae7e3178466a757f9e6999ff3b2b25ae434c4cb0b7c9fcdedc0f94af124bf3739f816e99e83219b17a532cf9e8734e5cd75c0c42ea9b621821c67c877e478591f8cb7bf086abbcf04a691fc813c0cbc68c79a70a0f527fa3365dbeaa1d12830bf65e5775ce3514d690bac06260389c8ac5958b46a62425dfa75220906b053ccba8101bca2e9892c038d2489ba972faef3e4075c20ce1273b2c72dfaa3ae4ca65b09991392f2eff5a560a737435c0f9edbc27ba0476c3bad148258b77f7e2374a50076c5f49701391a23eeaf62af0f2b658bfe279ffd40e5facad600652992983b3857ecd6354cce32e975f2772342a90f82f74dba1498d802e7500d589b66ebaa49a32d360261f9332f0afbaeccd2778fe1136c3432068b573aa8baa6002577dd3c358b34d72fb0f0cbfccb6ccd513914215b14e2e548825b634e9d088ba4e856724b757f763f393a27f7ef0eafaf68930b20a2a209034b9141750000faeada5ff0b6e71e963355be6444f139cc1e9851180b2b6f21d9965af1be6b98c56fa678410860f12429a7169c2fa7119f3a7f65974de3bfafaa87172b1b9205ce49283c60d328db832bc8808592711e9a74b55e7eac13e624561abf875afcb74e3eef8b9c894608bfc098c7ece0b59afb97cdfa4ccfcce65a1c3141e37a51a895f5ab2ba2c77c4bfa6001e0dec9f2c3342e95c073db7d853e141ebeaa8b3e3570fbdc5452ae20680e5ca6756d848363eecc843b8cfae1190a2f4f1a3d249c401d8e2112fce84295ee8ce2553dd4217909839e10633f03c66f75f5e66c6a8d96abae37fbbfa171b6fc14c185a3ac3d4f279db4c09fa337ccc775d655674517e47aa76051466a9193ead62479db524676d90416296b0290c157486b1b341e78f0d4ab7d580178299e6c82c350bc4f5ddfb63a9d2bf53f9709f0d6c913b044d7af0b7b8abc2d5c4b81e3a3565a0a255ad546b775c6f3087be14a28611f3a411d7644e5ec0aa1a9921b778aa115651411d83f223c64f6963fe6aa8402a9315de3031ab188dc4e5ffc00a8dfe7980c28f3a3085cc27a919e86ab60728a275dbecca28b7c444883a12e136da7960c71a1800db2e441a31036519b61ad7964c73186c124ce5cd5a108c3b4724efbf55be96793d4e1c7333b37766fdc720f63ee8f42803b6903f111a65d60e4ebe67b47ed06956875c7b07a9b70ccb17d0e2bcc29550a25133358dcd984051f3c92d57a2b7f9428cf2bcb50d19f9df953d3926e25b60fca3bd59ebb6a2f4a61501919cdbe3fd47b4a7fb527be21cc70341996b6de7103627a2a744ee6a806cb172b53d2fd2cda882a15c73597b951d853e57cc7034650acc717dbf0142931bb01179e27c73ca561856749fa5323521249f1fc1882454eb619bdca71af641e7307c7cfa9974bd98aa2a30877cea64ace3527e463a5e8474f6e4f0776f384094e452984c9c0118ce5a839512be0f82301399e2419e21b0247103bf39a366871b799a45130b0a1152fd02e30066a94753cec2a4612f6c3eee6f48390697447e3176462a078ac7335bb8d58ffbf8d59c47098b4a04a083f1dc7fff90b241c5fc6c8e5e32f4627a68b38d89a10ddf10d39473aa55dac43054f2e099b8d5045e75ad164fbb5490b94c03740215d12cd87a96e665860d74f7ad92f347f62b181f613b7e1cfc708531c01a924c5df6f2641e0d6418289a9616ffcff5f96318839421f62ae88c838af32699efbc96ce5663594ca2cbbe6f932db71072cfd84e281b3b809647683a11e74d9c7907958284941e89c474731e4c82336632941389a1bc06d803c64c8c2e6a68e1d88898bafc8447acc0272cc84560bb783671483a5d7b5a8d0324882acb30b7160ccf8be0893a5614db8e60cb30db3429e79ca0c36c026e4a18f299d5a7d5407ceb80a1f527797906d02aad98bccbc3b4bc6959943f7c9c4188aae34442aa8fca8d9794b4666fd036ed2f220d9a68cf7673d2908fd992ff235ac96dc374612e301ee4ddec1aee9fb01d8ba2824c6808bb54bb22b34ce12a7c2e5d63819c247557ffde8dc0c9f013912ea821a06c2b7cfc6a4c32614f27201427cc2e48c2ff389bf0798deed077b4765ba52ae37a5ce03399334a556196ed6f804094013f5e4ac6e8829e44658a989f57f88ecc3bd738d80f50ff144ccc9721ee9e2a508b93313479ef764b4e2e79d5bc4b4da70fa0d17992898ef6557ff6ca95c05ae48ac456c62df98a393b6e88552adf1372c1889904c92e60a6d46a07c0a8b2b06d32554b9cd1ac2470e1b71bcd86ba4246d81a088c0cfdf55b61455551db0ceacebea50327f297dcfc2cbc1b20c4823dd75c6b062a3d4443a9d2cbabf873d2775accaed9ea080cbd3f23550b49be835399cacf22179ac49df1c9629cfb7e83d667dc6ac980e93f70ba24398cceda1d80134a87e497cd2e553689299dab95b8ee7771d91f89d235f41eb8ac78f1a85f3bac472fed276bc0e6f9539ec525db60d0852178d69eb5f6015398af9a05ee289bc4bbbf30562d32db77c7cf157505df5ae04ac718021d66c97e3a81c554290d514eeddbc9e3b95411a4b74371e551d17d89a363a23d79d21ffc7eb5fc0692156f2f4bec0d644e7b2f703a2fd674cd2c3268507f500656489d4a3aa2bd25729d65270ff3495b115f7af2026c639f2798f81d1a2c14a80026f9e7a330e639226d15704d118f30ab942dd77aec76be4c6d54d69b9816ae6461c49841d45c5b7ab592596a9bb0861452fadb8028cfdf449bdc83a3a0a2bccadaddf02cf45bee57b51eb9c17a206bf528d6d827af87bb64b52a7d16a2212fd01faced1f5d5b80e9d313d32947b6f49c14bf6266c46c9ccd45d25c0264a7726c99967e3cdef18740598386b559ee0763e08c4576ff13b865b128c3a72711baf081bb797e860edea7cc44a47ec7930d891c39f21d500e98eec61571d9ecec38fc439ab24244cc2552892280bc0096d1fe27faf14250c834d9e2020fbf321d7ee960eb204219978b8f6925def4f79e525b300bb7b1a5b10cd0f396ce00e9e890df2d95eb5568bf0c9464e0f363b336b77ee22e4dddc296c3cca1df08a8bfe9dc96fb44b4ab3344f6a9e115de5a3ae0851fe27f6d977de87b84e9a0a86786d28a69a82962be2786c9001e0ad0581266c081544d89f923584e1fddc9face2da1a1c27968a9b1c0b1256f4d0c68d28aac419fa9e2972481013dcc9b63d04849d862d44542f8fb6647e744385347eb0a1ef9ea6afb9f736ddcd62acfca692ded7f149d9f641e9ae90d037699c7a89a8a07b93d508c800fab7c2d61cad48b6351b2efa8ea048bbf08e2e8275cab1417f8ef4af2344e528f6dc2d0df7e12cd75a3a5dbb69e8c7e3f4d92d2cc0f6928c640733917cb314505015d673e59c155549a2d5a506dfd5f9441e993ad471a35db3ad276d78a3dbe23e33f5fabcba9a5b4a17c0e8b18173102f1318de54604e63023ea6dede45a92efa3acb90f9e296999e9a6ea06a0148b707736a9e5cc9eb9fcbddcb74e4c3040c75a01a9f75706dc0b0054ac40bd4c2e1dd9b89c546d9879fa883f6762d7bc99bf34d292d5ed9480c04a753631fdc25c07188f61778952d2edf098b4b41a56079848eb2cc7392eb2428c7076fa5f7a4f43319580d655dab8abbacaf4941f946a61c61c8e828b34845ad2ba0628ab74d91a67ed2cb84e561157e50baa0a1cbbbaf1e91be14a98bf999419b805dc9444dee04843a9125d2ad28f5754d6de2f77a13cf48fa7d3f4faef5e166679c057f223b7c337f36254e310df8c9ab2a1a180d752c3ecfb5a5273e4c4cccf988031e2dbbbc8cf1fe50f17c65f4a96fdabb60c9ae34b5b5020228c3ae99b95f3c68e04a1e0d0fdcc5274f1051fff5ea82d8e74af1960b5ebaf1b0af03a89732f4c14b9ffacb564200f059b42697f00c71d1578a3ff08c313e07caf372bc66d07f952b037a8d2073d65d23a67736a91a4ebd8909955c9fa6910ea19c6f75a100b1d649b3f084ed8552b7d486f5e1955ac1e57bb5323c0f03037e605a9800990a91118da4486ecfaf8917bfd02a033345067847190f6c248911f48265c2fda1b8b4a0f7d2538c5e4e40900d49b5949170e7ef19c1453f8ac4abff98035eb18510b69b45236d3f5c7e2b3e9a37bbc111ce2f9a112c92fe176d966a7684cb77b15ac031dae3470eec0b5721950edbaeff450a63e9663644f0be292a851d191e22d70c961344bfebaffc19e616905386df82f9122f4cd79886bede8274f86a9b35ca83fa03950f3270cd336f04e5a2ed9258b6daee58f8a11af91ddca40ece7a82934a826daff45f1010d728490e12c8d46f81fa20d6d49440f3050caee768592a08003707622ec3033e19ecadfd391b799ec480b07f9fb86054dec24535fe5f677f69c79d7f4377bef1e33701ba576eef47f7a58518ea82a19d3bea6aa2cb208def9f0c0f5951e997aae0f5917d95614357a34fc8a1d47a9649e5a423f232ceed41ff06a7a36dadb248525b8709ef1fde902438a124cb9ff2a1111bb19191aba790ae01c69cfc5ab85703c837967fc03be43b4d96d1ad784fbc96ee714f3ec316f7c8d0ba417cf8e132c5296bdeddd0412460016d3f84e4530cd2d0ad67d89b49f56afbd2f54e1a97739d0325f26f606f92395f44915cac4860c49e49ab63bb97361df779590326c3266a1e220c1a041051cdc9e8ff2c3c87a91e0c0916d1576cc51e6a4bdbfa8160348b4d370900d166e1132be888f3fe8bffb4e028f86e25eea142421ea18da1ca7019335ea1a8fa938164892791120937e51320b9232dad39810678d6b38677a9acf9b6510d89a59edbc74a3cfc8be39f8c5d5bb934f3de31fe889948812787bdee685738e3ac20f807cdbcc85edb85d304a7945b459091c28c78c84748da0f4a3d89042a95c1747227af0524afcfc5045fc3f1795a46f028da11e9bbca58189f08f874d827326daceb5fd9af673770d289aee29443ff874cce4bdf01dea538a8288b57b7c90e86f01bd6d3d1f81b13041732388ac2205d7dcd419099376267e16b2c21874aa7c04fce16aef26fa0a7eb80c7a0751c5cae575d6188302ec54eea4a7ddc5e75c15d7b1fee9b95bd0fda84b26f8679c98b4c34a7c75b3b5be62d7fe6ba81873b279372e0be342be1339249958c4025b8fbd51cda345a5666a40c7b8d51a2b8064d038b01977b8ebf66f03d34c9210f1fca8480b687663e3e6f2234e4adf5e960d28666ffd66d430302aca741356d5d0ff996dae47bd234c338d2366534c9c3842f87ecedb461156eb6850e7e418f79d95c09cb4e0e3cc9a4088ed72cc4d350ba309bdf572df9af4cd8160422a0764a1b5322c0a46f091461bdb54af66e6938fcd344bb7e598645425914e76e5ac9907e6cce333cb207f4712471a8e5ce42101678d1548d7756d8f5017c5fca38dc10cdb2f79101b19dfb2b1de9d2ab4d209907b73f217ffd56890fc2de154d8e4dc070950a334b66ab0a66af2db5c19b65a80775e76754eb74300b84bcbfd9013f2bc985a5f164e9dd5efe0aa7573aeffd3e097bdb191deb580625871a37f0bbb0fc0c7ad99243cb5e739030d9354929bc0aadda56fcfffdd14aa79a7ab50285090cb24031296d2d80216137a7e92d239fef2f7b5336f5f6dc3c7187f4ecca1fbeb554e645548c8753134db44ec69d43ba2a4846946abf3e89d860ac7aa70c0409fb7e494014dafc144c0f175d665b31bfd243e8b5c597b2b3fd67e3b31fbdd0c3787815c489cc61fcee91a2a94dd31383eb80b29c9d83911a0c50054de49ddd8bafe19dfff8c54069d304d27c7a33bf1c1e01895473ab47716049ed09285e9507b7ea9ae3b8e5dc1ae1199ac4672b602c5053c1708099a055912475b564fb8ff78584ad45e926acfabe70bbad3f545528fa6e29a555d476ce5eeb3b8e7d5cff4772bf876d72bc47e802428ce742f7a8914beda17880d32412de844e5eb5aeadb00a030760f6fbc957670f37738e9a0a60cc94fdc23265370c8d6d31460df4ca85b199f179b6da89c62594f709e0fbbf57c1225e0f98a234aad2bbc16071802720600d89cd8f1ba86c35067127b7ce316394798e9e08d2996d6c3f7b46ca3f59d4147c11a4ee24ded8c96c2304c23e311917a9cf58592b749cd2bbf4c0725dae8b28036c5cf153dc1e673d060e9267faa58a85bd55f899a36c29bcc6e84b48f85a68abe6d3ad37888944eaea754b1854f1a5b606b6e8a32a32e61afe28cfd801be037e5b000ec91a431d1f09d96b970d846f7ee444f431502f0811ee206dd3f78840b951076b53ae61b40a5b500d4b4ef79a5a086835627e4820570aeb6669c63396e90300dad6c1889d5a51a2210010ac72e6a514b4edaa16c20e7a32216e219799d730a360e13035fb48277771f911cbabe87832f9af0c53e9e173f246ec8954f641bcfa3d2810ff6971d48aad73559f36f702adfa5e044eb9d79e60b02762f3c85387e0f2a2a50388303be15300b41d31486831efe59d2564a71b19319136f6c1872593068eb0eff30d37fafab6723e7bbecdc5cc75ff2bfebecb8d54231f62f1a21b93b3f5aed5df2789bc84110d857f0a0a46c413c8446521f4f55eaebc0f84715f61c86559e2d0986d641332f547bf2466b4d6bf369f52d66f6619186e2bdc1a6af178ab35d5204be6391b8a701752063f177f2b630f5669513fcbbd7aae8ab9663823bab7c60a8e6420cd76d0ad33623692c62c6fabf9dc842ca99facbc4242b00a009ad96c4d46869993181e976320e1681d6dbf1bb611b03ed9af984282b4326ed39a0c8dbb62a11c31d47a7f6318c41524c3d551bf0d8f007ff3b8cdc52540cc50a6878ed0ddff2a9885e901ca127a935daf554fada9090474a3f1a0092ad3362b874762a5853cd39847c534371149655082b55e7f71b086f408f7bc3162fb0e56468ac07d8152525c9f5a2ff89af709f027a713c443f45097b83a5d9de94d174aadb6ac018c3192630dcd4bdc85ee9f2206f8259a5a07ee7bb4874445c1025e562a64830e40b6a5378d22568eeccb80209b455487554dd4ea3f0c8bbd98585463d3aa077f26b904b5ab69a8b838c2a90f27037e2f46af90ce7f3b2cd6ceb1c0ea4a1627ac08fc77b0eb4987e8a32054be41f9afa7570d60846384e430abee1d18cd45c97c5ae07731e54312ebdb4ed66465eabc1cfe8c20368c4ecd2c87b4b96d7ff57068a1d6bd053761411549551210fce0a354ce3f6bd53a2f1ab167bde0a9fe2a8a6c080a75e5a9d04a3a71b173fa2be2c1489bf62b5f06c5fda3d88cb6c53d8ea1a7caf1066ee60bb34e6fca5ef68f67cda7109ef1bbf8b2f232568ca9c33ef38eecbebcbec9af16ea6684cf3598db3497b1cd116903b7100bf078cc3e6666b3456cfb326ff1aacb9a1e2480db41f2d3df3817884adff14d12dc43a6a99794eb35917024ad6203bdc7006b94852568450d6c8085595535bca6a344099d7b0acbbe5385d504e25a4a0726f051ddb1db150e00860f20f8515cfd9835b10ebe7fc65b2cd56f0af049edc90609bf5828f8b1243dabe373f4cfd2209cbf5a91582e59722e01f8e647aab8743396a088c8060d4b4e0b9d9fcdfe0cbbf4a6053de581e6339faaa472adcf671f98dbcd57b38006ef524f772bcdfdaad7ac03dff7aa32f36b954d64326b79d1776c0b8b87119acc4ea7be7c123e8a73f0f69c3f0fa42ad1e1a23afeef8c91d5d2c108931b80da5bb77d7b3f3393b7a2588544a31d272d4c0a477f570439ab529fbd7e2af938f5ba54199db6b7a441fc5a6c1bbcec475fb1116a25492754cb3e54beff7171788a0ad1efc877794a008c83d3cb40bbbf3c888afba5f7538071cec3e8489263e54cf84c59063fc1d280cf20cda91870b1e785957d3c96a5d6e4950ed8c58afe5ddc56dde82961722e7e67725e472c7e3d2b8e9e317ecbdbfd28cb24c4023c6f6839cbd107400064c80f9c24deead46d2e5a4e6920101d2c901547d8065f06dc5ccb21321cd077834d9ba5e1b7585f7acb3653cffe264bc4c3248cee83ee64eb83b5d3cb84bb86136cce6d345a43410796a475922f6d35d35134a9e3df35ce260bfbb4e4653af56d5ed56f9cf558734b07377f54e665fc490eec682698535ac54807112cb82cda6c226780c350e39c8c22f70575179d54eebc1f1a6667e0ee42320c296393a8732db86e82a0fa76d22e2e2b530e9349b98ee08b08fe709c4b4a8100022208b4b4a08121183c0399342a7ba714b1ca4c797b3ef8d15eca07b01dca521fef8bb2b781b0f3f712a4a8cf712bfc963df1ae53a98b282b237770d85a32fd4587f970c087d1e376da51e9b6dcb97177fb428c5819adcacc9002034000691a287362808a3cb45bc513ff48d2e9f708146c736705a8c868090843abd40354b60cc707cd76b07ffb909fa19038557114ffd0b067b8de72b7f0e892c10fde6dfddc8f6c53833c9d03427a7f2dae2bd77cbca1ef3418fe6b7be4260007d9fe4b8114d2fdb4b87fa11ca745af1629992eaab43961a5b691157079999eabb6367005531b54ee2e96609389f98e63b8e18c17577792b9c91f5471c8aaeeb1a9637b63c8e9d63824d41a8b2cf81aba6ee9793e6113ae8ee029dc90ebc2e05324512da2a8c1646b4037c4bbf924f0b81539b6a79b96c6479694dd50f9645d33d8114dbcea75f176eb922207c4873a00afccc4924a4b168fb0af54c3324d9aa490c1ddd22e0212db376c895117fb22e1b9a4a9b005e331fa8297078538e49905fa9b6e3e6dcfeff3c01b26dba13d07577cd92f6e0321a80071907f226c3cdb3ef09ad13696de0befa9175b4a477a20b08958e9d8a3b02e097089c43825f2c5aa2a262c16b8fd6fe9b94bfb5ba7816f00b9b427c6fdf8ec234247d31e1d37ec43724553588106fcbc56b3983024fab9a78345f6cde188b40fea27e99d5afa4f6b5e1323b8ee764cb881d9deb1d062fcaf9ff74a415097157963a6d463f65e3708ee99ab3f90bc5aeff0e01ef368c435951200e34fb5e4a296f386e49c01020ce024b84088a4336b3bf6dd027558655991a9a25f10cdc723e73def0a45bfa36087270bcd1ad7793177f36b924a8c8cf593225e803dcab739a3067f71254a93169798b4ff3d55682a3a9032aabebe0109df093f485a4728a758feb1f1f04122d7e3aede6b7eda1f1dff7d9befa8c11ed8d8c387691b48ff1be6d59c869e57257e03a217c06e880917234a6ad604785b2be93880888f98b332d9b89e58920062a34348e823454b035041a819db3faadec65e5ed8729858daf405289685656a4436f6d5fd1d361f988ab207664d05635796208e9c1379e087976f28cf2af283d374a766e30afc2cb1ba5e3e19351daeca988550e59c900e75ae81bc295b43b9fdaeaead8b24aa7c550215c01e43ce654b8abfc0803cbdde86fd2c9d5c59d8ec2b52fa8de9e3b821cad71066a15f3b87567128ed86f9b110934a3ecaa6310936e0661e0c16c0d840522e692fb3ac3bf297977c2c0dbdea165447028bda8e799b0c6db3afb776905919b38654b48fd985dd34a106aa6f6f6a5702fa0534767e36570d94e8b85b46f1db65a83046fe729bfe644a1cdc40427c7cc6e15a5a6dde6d2d969bd46de8b22ca658088a42fafd5b9dbbf44591c22faaba14158529e3ac94c579523522b749c77d4cdfb1f7f65989725304f252fac4d3d3dba659d296af92acbc5d245e547cd60a20dd8aeb68e4cbbcac9ccb6dd6d400d9d599efe344b19257fdc0917df899ac2cc7dcbdfa7ecdb63ac38ebde19cf531c28161ffcd797956f1dde3356e068a6f8af89cc57bfbe05f89694d6160131608405af497121fdda013c9a71316609fe5838a6e94b3c02a25d09c324b9b3aa1d5b0670d14da510f3eb98f459258ba189f1b9d7dccc6c370851791ab96fa33e5ead6c4bac6a1234792a42316ed43bb41bccae89f5cbf0c25585ca596c3677814354f7d7411d734807f8299e8b9813c97bc19474f447edebcbe724efedb4f91f341105c71f392175f13311a67f677ca427b65913d0031266a87e9e6005b9f6efc7608d842bc882a8f2a6d93fa073e51fcfcc76faeb253296e671fc64a00dbf0b1f6d342ba09aabbc90ded26fbbfab71e97221866ebe2997fa262902e903492ff9876d6862a71e728cfa0c460da6aabee91c900d0af317a2ada15de60b13bc9c7f4e68bef351059e46016f8ae6a220ef9f0275fbd7620e390d4b9e5ae2192d78b5dfed0d6f88f1c5e7eba14a781911baca944424287a484a7b64ca66472766f7a2e5fc0ccf1d3e81bebfe23b8c01420410d50f78f5a80cc2713b5fe892fc8e27b2c526d4ddf438c494c800c61fef1af87bae8e6d8daabbcca04a94d1007dfb8de6c2fe934b77288f5d6b43ae2518e4b5ec7c0aee5175b9de9be0cc8d1357261780cc669fb73bafc7085edce72126348bf139ae919876f184958fc0caea3d747641c92298518be8c3cd1071e93f3035deeb208b87df4da2dbd677ae592c83aa98287e0e61163e62afd5bd6827ba9bddd96fb3831231bfc9057be818e35908c263b08c2268203fe16ea36e17fd1942e6ae73495249c3b5c01196e984b05997f50a5fad61baa0fee86cb977be4711519c677809d80beb380baba07f6dca3f3cf9755cbbc669412352919448f7515e12990448cda973403155923f251ae0e244644e078bf51cc7af814afb9e97567254002eaba281eef4ff511652c726419fc73ed6545fb505d1b62533a8a6e3ed9a69255bf7f89827ec0c4f0439bf53b669b19b367a36d9a626cda90604d0eb8d3c3913b235ddbac3ef02efa55074a9b18c911d386d71155bec79b533cee37ffbd3547e3c2895b5b9ec0c8a96972fd0d7c8e17198af770fa2d9178a1ee1d267268d4deb4a99bc01c3c9b0f84fefb595011358084577bf5d1f6539814051a985308aee44a704ed2be571de4e79d17d28030d206efe159d3180741ee6d18211604f6476e89e4e79c75dec41e1ceb2a1638fef011ce8c962ae28a0bb00d5d8216a7e963c63504e93d1e66493713bae8c84591d72931129815e18783d4d091f9d81df2edd76514c750d10f16971254dbb178adcef2a5a040def02bf339bcf9392f8a484af9d2f814631054fbcad0dc5558c7502cd74003f9654a913e81b24e5356f36ff2462a7759fd5bb9f7f30c44f31cf89d8619069180259752804f7b199f81c5b37fbf939a91d98cc8149cc5f044205dea83c07ea8dbf35b7e72fcb40777c5d85e844e4868412738a727ed8f29966728e2facab3b736f588c29232158f19d38f9bfb295ca90d14c395a92a7592972c0c7d36143064d9e4b16f4f233092e311ac635895bfd0a7b66eb8d75e46cbc26f94c9df706804757b18b0a435f3350ede505e9292cb391c44ed992b217f3c845eadeb9f9df5d188d6717a6b1926302fe1b5c590190bb68b2190e94903f2e1e8d2d88147cb9bcbf366532a2c51a2f492cb73a268354bd3fdd657f42abd02543e7b4fbe48f0ba861ed15d9b730c6ce7bdea0c486a00d98b43e1f3c06c53e37fd990969ef08b4e111dde05c98e1db6263ea4c6e0c7dd3744bfa2b699eaaf80cac1a6a0ac0d38230e57d6257420495050b88d9b470b0767b67897e092cdfd0f3a0adc0a22f07f1eb8d68d772a08a1dc573aa302322aef8dd20787c5eb264a319fbcc1fce6cc54d1e94af5995904533fe6d48833fc9f198bb53e6af55765d958dc4b65f561c10b0375a99ae8cac2f3e6625db348ce02befbfe1f169fe41e9ef1d137b1345cc33dafd28559f3a9bc29b05e635441df6559061e81ec123873c78a65da4f8dadd047c5dd583d49ddfa380c41d984981b25f825ea315490723da93246e46b181af0dde91340a713f64ccc6256af2cd598cd80f1fc5f94b67728fa0dd7fffd9e6d674cc25b8e82cd91123c95f2c648bcdf70490b02f6ce98ed5be24a0e47cd9f2ec576b9ab9bd9bb0745bd7a46d14454d220fbd1c1bc218d2043d1b87dec04c097d29a1aeb6c8edf0639e8766c4dd649f18e7380f60c2726a4b503b736588f2f2fc47014b5b90c92e4998d00d6a42ba0a026e3f8e08a8e51346c59f410f095d352dde18797d5b782ca9ec4655d4c7bb31fc3dbe4cc994c94ebd64723b29057786aad6063e520c61e6da6c21dddd29af7ba01d1ef3a7ec538b6e2119cc178836a8ad7ac52be0dfe875cb93960ee73b1ceef66670bf7601200ccf66092774ef636ea4debd803c7c225e9af5e435cd79c568e89c92465587a5f71c4158a810779af49e341b49fdd337896a3225144841df7ca126f144e74090fa477870deaf435d056e8a379eb2851c9440db851f6e6c55cf7b9484f2bf736da89efb9decac4bb09503da11d2007bc04d12e55cb2cf95955676a80a39a7ff7650ea2f160c0e1dfa8966d6b1afcd3b5458b6a96a4fd03603eb40dd5c5494c4bce53974cba09b1df0e867788a63cd72be28a984f0ae1be93aa4be4162a19ae1e6cc39a23c68063dd4c4cbeab0a9f4cd9b07238e4c5e393e04ad1674e79dedf12c6969b3ef27fe346869e924716e4f4f3632d77d2cac6a366297f8aae57cf78178929fe7a92338538368013eac5c45500f425bbcda250955b66e08304b4603c70075f60accc507d0d361d6dd28768d41d6f75cb8d4749a6ec322a7b879c978ccf25823ac859d8d1f232390dbb0252475206ab9e1791994f30be8e6b20c77c64fdeec13f663812770cb7151ec9da417d0130d4e0dcbdacfe2fdfbf0ae9eea1dc0c26364122a8eb6f33e2c6acae75131165c56c5ddce8c2725e136b6f1588955ab9dd12f5474571cad9b5ee90e73889772add6474f9948339674150357b45ede8e7b33ff5e0991427d0b79308de691ed5c42856599ab5128a81cc5f293fc3fbabd0811b39f64e2c9a04622fc3c4bf9a64fb63dd170d2dd1659fc7f02113b1ececf9c0a70b5021bc7a34dedfcd17b31b7c118995e96f014ead70e0f6fe71a3a18892809ae296a57601087846d05dd9aadc6a7d78bd4b30fba96ce1fc56fc384ee77c83c1e29ebab8edaba6da53f9ba0b6e08161936ad76744bfa58dd5e3a24ab7191849bcc311d719ef2fe13470f06725ecc1b718d9bada0e0ccd9ce42ce86d8def5dc392b5bedc28b6cb11ad31997791da4d8e53a2215745ec0efaa9b9304eb4748ff4f18305a571b98c5a29642a21907ad01aa7c0892c9eff7511e4ce0aef55e2b3504d2d75109816e6d894b0bca3a0a1ca980dc87365e6bb99dc1a3e1230ea8b3f1d9af50bf7987e428b927b885fd628e872b7ac1987dcd14dde5478fc93f6de264787849b6337524a626aad233473f07cd4cf9e7ebf22b13c33629ee2446a0e8752fec91125e7019be1d4821816782aafe8b96a0d5386923d731026883255894fe34ae11421bc11d755fd3945a5dd7cbab29af46dccd531ec8969df26be0fb2b0356544ae28bfb6ac84caf1c075402afc29b391072779e14ef2444941b277a66c7fb669b27eeb335a743e7963d978630fbcb984af61c2807dd00361390ec80d57b5b3abf4cd126fdc18430edb1865352b62d33988810d8d7a006f12ac20604c50071536d4ed98620e6a288e7aa36c3744cefdc4abf03f336fdfc804936d4704384efc158c388bd7e537df5780fc97325d43400ada4ac54a9dc14512b31ed0129fcdaa97c2e90336b7fc520cac343daa57d497031211fe79a3660205d6e150e33282e0e15a4b948c54885e1ce5a3ec58fa3cf8eaac7d9f966b054655915a8d3f28ae74be89a3a30c4db7646bfcd4e48b2e2681fd5e962e4c297eff2c00d8bc31325240f371e549b82b48b1b2d12578baaef3bd15f65e5ef57937c0daff70420e6b229c241776114d913bc26f42600c5f94e8023618b9ab18f1ab44766b699dfbd2e42c27f309a7b93e24c734fb3ce02f907a4ee7881eee5ec8fb43f522ee324372aaac46f3d8b531e67674e941b3cb2ea11334e04e521f2c423f11d6124df3c6f3afaf58dc0c8c26ba4ecbabeafdf282178799c91970aed2588c979ef21105c36cc4834d121b6628578bd073cf800b776d8d50e1ba869875eef5ee9acb786d97e87da781ac3da88f195317e1f1616562af3ab2f7c5ea5d4b5cff570d6028472ff656e2149b7a9d66ab6c90cb0eba3286b1157d62fd44a78eee548f3aab6ae473bab56a77bf9b795c1bb6f3c5d74e995265b97c62bddb13232d1b06fb51518f9b405bda3de3785c3d6fa2c9c355f8ef8cb29c7298fa05dd4784c8661a323e0e8aeeecb3fab1079d21bf71cb5f46e5e7b282c0532dc01594692b53a3f68032bafe67a9f5a344bee4f611bd07264dd8da773a01215a9add46dcf036b5ee3325c9a450430a5d7a687f270a34c52b2af4fac33006f791317c1119791ac7b968c483117872fc58fd17de1250d3e014d0a6d7ee6e27086a69ba14e35f261155f08cb50a36fe74635752343711131236ee09bf24c3f0853bf9a302499bacccf24b4e84dc7d710315f1fdba664f7dcafab1b96d7cc9d9cf09ce65cdb53982a53032b80e366d701b85ce3532d44581d4e93c8f59a9f4dee72e243b30a66122dcdf1eafb31b390f29fcf91b035eeef086146237b45ba3356017489da0c1189ae25dc74b5dd81f3826c78c48327f28cfd0daacf6f9ced40a10b8a967f79264a8e2801d9b39829ade43ec393ac2dbcf2f2d07ac8223c9c9063ffc4fb15943520b7ee6e1daefc92b97c5b07a7976ed1432eada3fe777a4371307c928815b30f7cc52669828302e1b42a0b96d46c4cc11a3496406ca0421e26fc04d83846cfe332675f4098ade8705a95edcd08271e3dca99a962d46f5dea23cf3f1bfd54a993e127ea5ffbbad1ae065557d7d9ec6b421051c8e99e9b2cb282f377602d07b15cb7ad28cd11c6cdbb9e3979f9acf70ce4fc7473a3930279303bb8a48e2c6ef0c84a19d28e054cb68d2d23beb7467952b461fae30972727b235a843600bd1919bc10f4ffbd1448eb7e39396b7e9fd08ce3f51c9a07337c0a1e3761763996792e9424185935ae7d507f2fc6bc300036d8fadec662e7daff0218e235e652da8f878d050d260fcccf70ca63601f5d2931605215714a5c51e9cb4d8a985061426a9aefd45ca5ca5e282d83ac2c3e68ac808e6a59365615d95c3a0193a5fdbd0172cf210d9a569ac0ff70e01f1b4d8fe690c4177cf12b781cb9b0fc6ee4af3b47f716fe08520c5595b152b03dce86c6e5e00591ed9fd78ec9c75115e7af9809fcade09b414c69d7ac485b704bf9083584a6c1f6b221712fa28079df606e65b37331288257c3a04008471eab7d4b8162718eeeebf20ee581543fcab7abd7041f460b29650167e56fddc89488cdc6fcc7e990410ea42dc17c9d2b7bb2a0e92ba2460d3582073e2d844bb2396c8d0874cc2d13633f1d576710b8487ac9dbfd64e815ec762c5c16beb5e7a237c4eebdcfe07272da9522008b79a0bc50b1480e02846190620e732fc9c7cb963e3da5e56e6bb1b027e80e05c05ded1439613e25ae803647793779f3b7f0927eea0140a5836cf96f8e2f137ef7fa727768f53e03ce2b214e3ecf96f02a432510ce5e1436b04a5829f52caf7d84b0c8904de096d98307baead198b4e6d21304d0e03d006db2a09e2dab325ea9a9220671ea1c7fcbe70e560da7723a3d6119f925c1521b0bc147473f57077edd7fb3069a187c9b750b4891e672e4699fede47f1397e3b173c580a55c83104c2f8f472154094ac5a2617d58001647b5f13ebaf920f471a968ec20f5abbc4ccd94133f9a0294e1747012f2bb2817863191acbd29c9c810a26f1a519a202de6ebb775f36b41d715aad951367ac9f071bc2f7a5588bef72cc33eec0c6fbf591fd6fc730fdfbe75366136418016c4fb985717f7bd805fbeb03ed03c726b4d1eb300a5f0d1a5c9f59c8311f3a68d53f8d1a8ea38dade0cc78b9cee97c6712fd52fb208f36828887dbc7df92794ffea7af5d279b04b362ccf2bfe7cabc6fadeea205e65fc6074d918bf5ef957e5a9010c9c2020abb529f92f0f3296adc2b989696a115d9f55d8dfd59747bf5eed9603b06b6086ea3a6a0a5eb981f0c29ca3020957822d873256c006958a12091b7ae04f1cef958add06c97afd49e34d73762f43d84361d148b1651edbafa541c07e3a1ff5b9ffbc1c5c6094a3c43d452accff90aa35068cf6554f941bb6a2f5b71307844da1614a5d1e36cbbc6e304ef067c14283eebb3431024eef94f48354075a0c1ad3acfe2120e07d2f37572dec99976ae70c1764a725733ac174756dcf998d653b27beec7ac4338bc8ac8fc87dcb53a1ebfa804c719dd6e149fb070467f49938cba438fc2ab13e1dcdccbeb7872c8df426a6057aef77ef9bd1977fd6f1c75792e2b89f698c2a73ea6db28ff5e57a9e87ae148c552e8ed7a9df9030ecaec6067966f3bed585ba29d6c1895336af11e0d39c21dcab130fb2aeb85ea5aaaa3976cf3b57da1370fb0443b50fd27198cb64d1353bad384f70e8880000a7bfef40859eadc183bd2897df85d553f7856369134cb8272a880cbdd411221c17530814b99798161ae781b537e8015a085af393e364dad7e2e10ee8ce8c9be6fb6012dff0687e418c52404ed62374cabe420ebcaa12e4692efb0a5bc8e28e85021ef7bc2be488280bdb974192cbadc82fc4971e17f3e9682071730d794d2652c28bcd325751deb18c3952ccdf65a3b5d350a1bceee48fe14c7f9c63e797b5ad5eba21abfb9f4e6312e11bd1c44ad273426e19f785c349ae66daedb78b89837972a9460ca3fac84b8489a4395ee22a5d80468bc7a7b4ecaf47192c3da13d562c1198956de97a4dd002bae963e379b9287babdfbc5313622fc393af04d037e021573dfa05c8484eee611abe5d817820172741dc9e7bd1a53db2f300fb99dfa9a0867a491f1280071e92aca17396ac93ee4077d6ad8059e5704049e34d505e1fc48422f39dfdc8c184f8b57e5190e33cb7fc91cddcefc61a7179f4451b8ddc38bb781e7e16358f2cb34e955fe46abbf1e405d4475b6ad48f1311176e969d78245e29ec8efcb938c2e02236d80248d3defa24a1e396ea184df6d9c4189a9d54e444f5a28fa5dd8dbca866bc1e975b906f07437fb7497da052cd359c00135a15148bed64768ef41bf6b40c9f028f56518bd99cef6cf596df97c52a5e42af45395e1de1d54e43c5bffc717f0da6af0e20ab8e83062f084ed18e91c56c157130604ec55a8e4077c6a9f8e9253524f5fe24b637c2d66289502723942e1ca147390ed94cf268cf03755f6557ddc3d2dd827c3bd21840be07423bbb99f7f4941d11d8dab1e3c17e3151ca9aa660abbbb922de62f0f78c25999f6242f304b3d5b0c7b8eb504468017cf156f45a52e769a33a404a8d811846826761e89e6871e97266fb3d7f03affd051bdfa46f3bfe8d2a3bf1baa86cbad154cf25fc3eec857077da425f84cc1db7f5801b9c6ce7e421744dbda9e3f24085f40f083a7ad3fc86908dcb4afaa1d9f647485bc1aaf57e067f16c0a8ab8c1737018449b04cf8bf991ee3ebc7be9faf0d43b90d6b261346ee0f39c62ea29c71ed2ce3c2896bbafda436d5e6a5ed207129830637c565178765f2516ba8a86f70101ae6fdd3d4794f75c059cfb2789082a172186ae12a8cc2d773eb4e4c336708c67ef184dfb04fdfb7a0d82a519970a23891a900dd2535986f1b65d87b4e894e58ba9f74f61d1b14395dec69b0080ccef23d997a5126ac0210953ff71eefd867b69309e689ba18994f4c7f1cff811073f68e817dad9ca84456c2fd25c33beca10ca1a062088b764e6b53a59de01e66716c8952d382a178dd53b10c6edec65bc58bd1e16fc45e188951d8394bdd34d7b95a3a80154e1da28f30b65c50821ae2e8d5e45e950707c1caaba6609cb37b4528c8b3e81fa2b4d798ca37f52ba4b889a9f8d6f69806bc2a5a62f4238aca2560fbc9b4547e7763fdd445f62805785131bf29e40488480e6a54b479df6191fa407fc568c963a5640a7e69520bf40445d3622f6aa995c0a2ac5f0ca1b41cc1d3edddd84244193ec3933d1f1ae5cec166d6137dba6eddf80a23d3bacda42bc46fa6095461c67ef21047c8cdd67baed4607eac51492427e56f1fe1b1e6a69a50b4f2bb068a5fb85c9cc5031eb123f50b6cef490fe3c59f80ae23c7fb7b893f387ea406de02531c46b5e995b9b8149e741b2aacb45ee4dbf87b357bfeac4652c09c834c58f3076c15103af727e98d0d2eeaf1612622e1814c7e7bc8ec3eddffd97c364a1d47a1a821f222aabeab435cd5e4b77db5ffc5f88bfb47adaedbd979af53f8f210cc2be911d79f0cdc39fc19318fa9607e75cda9959259c223ea969ae4e23510ad2119252b9c18e0892db929790b4fdb1df127be4f6f7ce5d7d9c5d8575f74e16e866f8919dd8b842467e1222cbe025cf5a7a649f6eb9228dec533b9b655d1ff2cd6e24605caca43bca3d2e22eafaa3e09dd2d8cf709a7947c93a17c068d74a08a36801d1e5650cb2af1e7305f8a7d8cdbf9a8e4568d502eeb248b2ea3dcdfc1cc4008ff3cea8cb16002c1e12f5f77872b825ac3fb9fd10cb84475271cb459f30e9e032aca61200ab4c9db8b7137d39de5abb3b115c1eb9cf02f590a965406474af63ddea92aec77f1f68f3dd2bc0d8523abd42d06bfa8a487e2546933028644b9d33e83461484392817418b2496ee34b9540a863326235cf487c3aa019b8b27840e2bc2e5986f7558b19c8686abaa6ea22a0e8e3e84f1b0d7d162c1503829c6b15175f5752763b96f4a2aecdb1e28d61beefc24719ba2410ebcff1e5291ad028113d0044cc2d1703b4b22085c6a4f277c884746e8b52a743fbb9d0ff8bc47c39d4655bc0ced18544c0ff79f86004ac2d851158aa0f637a3962122be284733bff4df34e4c8864a517786866e9c64005052f8f13ce39cafe70ba779746ecb1cd30407e2a772f881cba5db3407472d019203493fc4e6f2e9c21a6592a04e55911f4db7a0e2ee230495e6318409a29226332afee482d915d85402575abb0d3730408883fd02e61287ce9f9f5295815a27ac9efb9988b7957f51c7bdacfd05dd0c03f5e114485803311519a9d02cc76d4f0da11e6763e7a2a0ddb334f7e4c8671c50ef6418cc1b0c8d19a35f7ceabe9b2a8a3a34f3e2c1f2debab1c0b0e51046ce9ea11f13fb1bb7e7d5df07701e9a0f0f29dcc88d73e36d98fceb0d681a4521b104d95400ca1cb929efb68d72a929eb0d99aa986f3bfb77d49f1e96ad1fb049090092c4f1e112f11d288a9af8a2000a7c94cef85245f808daaf46942d788248c0b6632384120ea4a16e8e4bd2fdd1458c0d4f3bf029021946a3cab67033c01e40b53db580605bd05ed53bdf69d302fd8423043f4a6cbd941befe6b446a4b91f22ebaf9a81ca155061684c95e10674e1f81afa814d4f4f6e272d70c3beed3ea755720c0a0b0a4a234a2429245c671055e3e604745a92f14c3d0683250ad774574db18738909606d0b56b894f60303fa4aa128816536eaa5ca97c7e7f37e678ed4bfc87b179d5638b74aa3ea551429db5c505ee4d6f37b8cb80a11c831bdefb11ec7ba09e2146870403495a1aad1c028e27188aa98d8c3e4b9a65d011aa62352edea75595c650573baee61cb2f23540b78ea321cd24bfcafbe19789a553da7a2cd3efdbcfa3f9e01b5f029d06193765846640ec350d1fc20c57effe79cec03604e56258c450a8ac9ef6bd39c6d83dd0099b6afff8f99610d5d5ddd359bb4aae3d86eeabcf2a371d8822c387e791a25b9869f7a674a0d17c84b6ffe72347641d357c6e3f236ff9afeccc590f3f1e9d353f26e1df7212ac022929f0a5a107ee20e3a7a42336f1c170711733e7c285dfaf404931f1ba7749ba321485a6883ec15954cd3b80e5c98d20b8304f264ff512928b262d63e2b8bd6688e5d5799b9d92ed1296265db93f2a496b6056a57a17703b2794a4874d6622c53f305b5ed0d21b72ae8754bb49f7c7aa5229cf08c607c041528fda918eb7901a80d7189fa9c0bc71520450a58a2b6babeb59a40abb6a6062a11f99a00f5ae73e9cbaaeb1685646343bb6e4c341fb5617156d933c826bf6468c80205430bb6dc84d177e81f37aaed3edd25039f5cdbf46616e684bed0d79023e2a3da8b15dae2f2a46b35ce21b66f78aebd2de6740af9c87e5f9edf212c237ec0111ae2c560ce3340e34a5ef184f84450233bff9f1fb3ed352a429acefb941c04cb44c35176aab3b75a1ac74c87afdde8f8e2c69fc95b4f128ed59b4ad7f8197cf86de6a197dd16dac236dcbc4dbb2a8caf065b944a0b34f9ec11e9e03c5eb8f4b3910c056c2846abcb95386e62fedf728c2825018fb846c284389ce217a22f9a0815067f5074bcc15117b8a3a6a3fccff8865cd1c4cc58464d23ec6bc94ef214dfef675ae34fdfd323cd304b4edd345b439f4c3c008a8da725e2624e5fda4671327b2b8f5fa3293e5a77edac83e86b6142df674784eba1be2e4ec969c37d98d449a33e1efbd10b9132c6fda44e63652cf311d0cd26eb5da8aec8dce4d8808050a746d0b7ea1d50ebc4c7ee5efac35911aba83e15645dd6e987c67406f53ab18bc1b66849e3d373c74bc0a4940b2733010538ee064e69a844bd84ebe9c5f7994851014f5f044ae531acbac1c0cbc50f9c8c23e1744d94bc72c0049b808b9565a3853ae21ae4d34f96326192e8cb103e76350ef36ae76b572d376636e5a7831d73e81af1d6f1c08284af14a19bbac6a7774989ce6b5e528eb0ef0d8d2582b850d84c72ad789e2b930defb632e85fa4cafdb4b0b63411a1672376443dd229c2ae3cd5492bf03627468b7530168d20709c61ec3d319a26861fbdb1c23498111a5aa56c0335f84abbb0813a6c40bb790cdf4e2747ad6330763636292d3484278c951d6dbd704168ba36b454c00c7819122c6cbbe44b84cf1362387b7601cd6baa0cd0568813b62deb67487dd667e54b8eabbce63300583bd7dc2c38e6c1e8d6e58313c586d89aa083993e68e537dce1a8dfb4ae6ce5cca4680e6ffde559ae3dcf0c96a7b287436b619533feafe4e90081d59711f942cbeabe128336a645034558135e2be6b6159743a2e6d31f6d8feeb418d85f49063b80bec6beda6b64b773e1fdab7576c04dd5fdb78a8ff0b45f82a01b5270eeb897f25310215fb8b6e46bc9333ae4318465d90a2a9078a50f566951170436d8d135e4ccd781e329097fa8014a6e6d474945925aa2015dcb907bcc6ab68e2a09f43d33ae2dc0a4d56a83ac2d3069e59674136e0562bf9cd8d737b0a12a144d1a87f1c79556283ce998701294ce534086525d3a2ea4145674dff94ce884cec653df1593309ee4cdb75ef626047a7eea03e8a14be4e653dab2f348a195b6fd7fbd8dfd8a4073c47d46d09de777dc4b1f9916d3c37ffa1a5f124e114cf373b4c3ae81b1c1352cab174ef3b1c3ff2f3ef8709af112385e50f44c3ae4233a68178ca0b96f780e50de2bed91c59b2fa508dda8074f074d9d9dac790982a6e4d11e73e6f3e47fd4be6d2d7d1228f4d4c9fc3c963c4c42dedef3370571b7ea12051b36b612f580fc2e57a942a314a4c9d9e23967607b366d4de921d296fb2bd213f5c69e6ad09d963970f8c7ec6659a6cbefe6bee64e8af8a4d935474374d2603f02f4d160657874c65d0be5a91f55addc8826ebf7c9605602bfb6aad4cae799c57eb043b12aade2f5c26c5db4bf38751ca86425cce36abe3269d20cb40258e5ded29accb6959fda344b4b4870aeb71e8beaed41e926588fc13799e95bccf86d6f76cd1cd9083822e86069511674bf07827d077e228ce63add71cd97c78052ed39c74b7d15b8af76a7becb0676a9780752e2d6beddf0b6659efa5bb659274c957c81cb13e9b212be4c7dc05291962fa995044d606ae39ccf8f9bdd00f3bf9dfc3794ad8e38e7fbe777b52fb060d5cb31f00c87046e25af0850ead70cbdce5cb9734f7f3a5b15148a1d954b66eea2c3e94e96759144c8fad8a45d45f706c49a663852c6dc27be7ffc9be1d08ee38da9214e06407bb8197b78be76e299b6c2f5b17eb03fc6a94380f5bfa362a6d09a1e47515acd5139531893b7ae26c2b1f6f100c23e22ba104d70ede59004ffaf06c3f088fd52f6f342729856daff78a9be55ccc32b694b740cc5edd1eeea20055d9522c7d16a8852a0389b02a4285214a40ed9490e9089c3187fb6df5cbe1d026071711b1883ad712c99c8b04ea30364cca4b8ffb4c4c58e70f8f3ea6f64274b16255fe5217ea97d355fd381d981171eb535463f145e2dd2caf5044aa362f56bafb7117fa2f26e00771db50949f081935ae250255d5d4f8ac073a0e15bb286f78a68600d0c780c95ffa5120a4e70dd8a85d9e933f9fc977e457a17d6894d4586326bf6128637cecc9aba1ab40649c3945e344685b7df23033f184bda2491f0e34d19025e670c125bd6444802d8b162467e89f04bbb01b2d7fe0e22154d70a6a39b7ad4d776f3d0c2e4cd7e80c5565483be03c22586f3233ec3579aa3a65a2bfe4de38a672dd6f816b10ca42d642c4f1274c46b84d5805e02ab34eb9da0d21dbdacf4936d1e55817733ddb03d09c5f58d9f054890a716dd121e57ed76d98387eb8a9bd949be9384c1a29f7819691aeca7f577c8cd5d521a06f68f353ec47a77934567da6a711675c559af2d41782214235f3a23fdeb4e621b20e649990856bde3b7fc3c8f77ee80b247719dec1ddcddd95b7e8afb320adf26a4957338d0d3f682c9888872ccd17d14ae7e0bf7771496f65425c06438007b07c3972f63afc6ce3b6d2d3f0ae292bcafb098b938e3446601a100d5b2e1ef37cf5100284e24791c762ffab0e32eef07ea3118d9496db292dc69eb055016a7274d8706bfb05d883c356c484532878d1dc21f0e508a75698366faa100413a5e21d85960d7643836922f802161d78b2f146baa17775a09359e6302efd8fb16fc8949ec6cc8bd8a3cae0c6f27d1c53f234472ca9285b78be8ccf8654ece014e7f952f29aef9890e12595b919c20ce943ba821c927902b3b9f34b714d34ab09b467bb7c60715dfe7991485b99912160ee253889d8848ea52977db310ebc4e4d91d322d7c3c4152a91c50018b5db96bf96a7f719aeadca19cd11f731e9b7ed599ee072664b27dbb201bc44723a8113abaca81a22d6675b8c66f029c31658f0db75311fc82bbbc66c27c8e2ad7480666b2035d44aabe75681c6c6c94326f80a61d4ccdb66ea5cd7a1d2a4cfca310aa5bf30f8edf149347ce75852ffb4f944d20976eca1ee6fceb8c56892b336ca3ffdf3142e9b82af1f0c7c4b4261cecd30c6edd853e1800b9fb8013ddd72d5d6ce38a90fed5200ec12e62ff31d83e0b8a9dddddb827b769cd165994956174deb3be04e62c4c8f042be3c40e5f7bf89ac0d256a02e0741c76cd3a4cb4b54e771b7648aca397bb71d730d81ccfbcb245bbf64990ed00876631f50531ed9603d640383d6ff1cd11752f0d7b0cd9e3f555783257e5b12cafa7ae293e52204166b284a3572b9cc320a8b5628f061893ae47221794f925b787d45b75a9ca39b5a5e78e21a6e44fad8f62be0c9dbea2b40b089e44fe2aa08d04281d37a682234410f56d9612eecaf79af8e3d1f1b2f3d635ebc9ca63f0837d7369de7e4b11730cc7b504863a46bd817932a14d91e140e7d1472f897d917da3dd39a870ab5a18a21ad9794bb2f08d90585318fbefb8db25644384d0cf531d0a5c9f054da99db0921aecd447ae2a5c9e23948419317203183b773750eacf88f1781347f96089a833d7bfdddb1fb0d389a7620cff54141bf75886905b1ece2d5566b119a695d58c45798dffa7243e1997815a04f6a9946d576cbc3b6e0dd5950c3650c3df4a9a871528677d9e60f93e68684e8842cd9f677ee744d2c6f3e1854ecf83b95fedd6011440b3d1957901ef3abd30c0102cc5115691418c491e75b16de7c153cd039bf543b201b6a7e8c0f397ec9e09778ae59c5f47a74f5a592393568ec3ce33cbbdb63f4b93ef8fd513083a45255d2a6855ce984136010b9485e26515cf9a3719bf1c2b4f8b0c3600924c9bb5d5cd763954131ea1c1947f0bfc56d77c72df415e545556270cc156a64b5b9002fedfbb3263670132704614220bff8eff394a7f34a733ec5a09899f11f81e9be31539975afcaf63128ff99faaa8e415b2822eea23a5f95a70038f39b0633e4035c7584a24da871a92ad3ab9dbb63e7b309bfff2aa19c3ffe899d785ea96aa62ede4c67ba543921a7951780b38364e710422571223f75bd263e7cc67eba6433ea24265f9f60fc1da8e03cf45ddcfb83868a374cd7a4386b885c00572fb20ae630c5430155d037bca1310c53c53ad4d38ec754157d8c162b5a47378999b520b040f9b10162abeec3386bdaf254600990b426cf9cdfb605ba4b6a1929da5fc30ca7f43b9a40d9bb2b2747f3ad52d74ded0cb723c33859dcc954f315c9d9bed0cea418cd79c5357b6e450bd62c74b78cdf4d35f362ed292d2e53630b6c435ff9114a615957ef53b90d204b84964fdf228fdfbd7d28de169233f77c63e73b3e41eaeea2209c5ebd688f7c1d9d00164d21d7cbab271fffd114503ad6edf8e6c9be137cfda4487a12e8abfb811c500f0fb10b857c56ecb5adf74131f8e461848765b2640298a39191add12edb237cbf8b58abfd8fb8b4da763b28da387e23053783ec4dd01bd83ef23843e33b9d0d2b0747b8c8fe0bc497bbac1625d6abbcb4ea6933a8c3c7f8d878c1637740ab2cc5f96a85f47efe1ee7eeb3d480425252f12e72873613dab8a1160f2d76e7ab67cad66282897000ff96bb057a2e57a43ea38ad2a57312cf52a951b1d0541061ee0c74cb9b96579617d79bdb6b868aaab7c5eeb2ff1c4948dfca038248eb7fd4dfd282f43d9e80ed68852f26569f381999b94d5d5b23043ec99f146dbcae646781493208ab6e9f176fc21dead01d1f7a919c6ab62310e4ac6735279592490dd9cbbd65c27428577458d3afa155d8b2695c9c70e3ace2e8f88b5de2fd19ef49586f2b5f8f389f3e2ac78ffb3f11b42a29ab3b8181d4f4da180f596b0cbe9110681ebd49ecce1871ddc055c7f4dfb1e38da0a6e3fef5de61246981c088cbb260a1697e881b1e6e57a030c162aab0ba4de482dbaa0920a2bd07542822fe69497cb5df77799981f0a2a249b61a20fd327d12e4b54c8f9020423377c923d85d0767ffa8b8264d80c8ba74f7de12adb0218cdb93c62d84b1753d1ed5647ef63e434ef18aa9794c3037c3c1cb921a7572882132af1778041767bc0c4081c4bc6cb5608b9ea6a9f57f44eab18e082893c397925e1900d54d2848dc343b328103517b247decf2cf60ec11465604871321f9ace049cac83317c2c543fa5455c00e470c83386e41a34645d070b2c4fee91968dd1b3c4513294ed126212ef51a48f686dae2e2bd8d7865861ca768c4c5263d7b61e04ce71e00775eaec07c372860b90952964936c8a5458a615ca02375a75b5e32e90569795a74abf8a543688e7a55d007a0dfecaab51f7703368e2b21c95ad8c3c5254fe7797dae060e153bb7ee64657ada5c1b78148038c961a4b78360e27d9a4fdb87b77e35c98c2919af9329bb2e65790eb0449d6d9626f78645c9b4faa50bedf22af154d54a3fc9236c85e5a21e515ee09b459ae1120a20bb6fd37901b1b614840fcaf1ff7deb7e2ec727aaa36765e023024a09c94f275d4efd086c34d178b52a8bd30d68c580363f2fa9e3008c042eefc6abc8a38469074109945bf58c2a85f56e767afbcc0537f77e00eb5ca1514c5cac1568ceedb6b91530f06791d7a14809333133e9e1175979e3bb96961e7ecc62a5a4042b3d411a2c13c3b5af1d82d855c61997c5540e3cefebbfad0752f4fe42a53ea2fc010bd3d7f860f0df3eb0031ec4f061eb20599769d328e9a0869ec2b9af636b282a09f26a8c32ed153063174e564ab02caa737e62e0fb25216a85d58c76535d313d7eeb005eca9fd07bf13a8280a94a75e206842d78f96ab8ad8546a08cf21cc5e17264769b466f62fd4485b6e691fe351a7111cf2009171df84f3beed79563eb30d62816d18b0813cd2c1f12c7c6ce8b9ada7bde50dd08aedce127fd069e7c15f04004d73330d8005656699da10d6e0731edc4ee3c07812ab6577991e843194f1d87eaeaa8c2feaf04848ad7d4c5f5c1620b3fbf0ab805bfad2793f433bcc4557a615488ad48144523bd9b2d09e083f29faabc66a34c9ba48a8b4d7033ea83eed98dabb74986ae0fdf28a03bb99659f2abdb48aa92cadd593aef28fb3c48582d08abffd34832444cf3a5f66a16b48e33e503babddf462e726ed1e234cb348c9006a85f93e7c8629525d2a64ef87ead5d9b180216bfe196de79f0f317c0dc5706e1389b11a4b8ff326d1a139b0cbea3bcfc69b65edb4f4551b9920067bb4517e509abbd9542c515c286cd6c05ec3d4d5d3eb29b2f48dc7390e293b084a4abb63d1df92837ad3714ebd1b6223a5dfbc8909111c3b4e49384b08d787398c6f1fcd39db51362eca53e224cc33c0ad7dff77f48610121c18131484a222dcffa094a4385d7fd5289d6fb556010128cf435ed9d94d53c668c970247ad26a322a83ce7a7cd959e92c60a03223d2aab26d56a7a6b3f528145e36cfa993912dca988a8d5d21f46b940828e8de0547765786f106bf0daf32442be9c4af606d815eb9f68212d7292c1d33e048bffa60266aa862add8675e717ce4d775b535a97704654a3d2052109aac073ded9b3ad9b99edea9727851f29fb7cf872bfc9ac1b05321207daf9a92e05d09fda550e62c45b90eadb5f62ec0da3caa42ea9114b2570831ba69f6931665c7e23ec173da3f76e712c8e421c4cff0ed7592ac3fe772cd462e0e3852e5bf55c01f11098b2fd3f2a52f48b789b9a5b66f18f8d8dbae5bd1002fbf892f749ecd18e7a51dc2d6657b2222b237a5acd6c1043e9c6bde3c3c7e22ea5d3eddb7e233afcf3b2eb1aa8f46a69386f8c42d997f187c965538d392b9ba0a31de93d134532b79f873752921d2eb49c3dd34c7582e449a99024e6229fc9a96347d3716c6e192a4614233edcc96cea63deae716848c6bb85376a81a43d6e52568706006dc628690f5fb9dd69cf4959097075b070959c6007ca9e69477c6b0c2bf4cd3e04a4db8f38f8dec4315291fb0b5345d0be08ab884410003aaeeea0ce1492db24ece09e0995ff837182e3a25e0497f8360cc522e14bb0aec24800a52af1f873d55e4a3303596112575dc2fe17f13edf910c43515d1fc8b29a4126736829106fe97f373f7faa62469ac34cddd9a4b50a6dbfe403397afc09827d3e3c82fa989ed00bbe39de6f69e6dd2e352b3185a3f4be14a43d56cb8f0435149349c52318c1756a68aaf3d1ecb60026048634216ce5d731d290f8f083f72e50923b5d10dbf56fb721345896cd78d673e475e58e7ad26b3ec82af8b042b6d94077c5868bdc55717eced0c4f2f9af2e493c5aca20b9c00bc679b9bf594cf6e5a882e2ef253e3ec21502fb8239a58a7f513e3007f044dfa0061e55a4e3e60b6eaf452630d6582c4ab6efd495aa11944e1afa8e334fd630e3b8f25464615d7be924a0e5c0908bebd641c8f0b999da9cfa615979fd7877ee4c31c00cd7580c5ad5a24f571c19a55f73225cadf187371f9af278418c31dbe4738e125cf3a9b86097a7e106ad7196e30818d719fc0ff902b8b60573f4194d86a2e9ce7379a3dd6033ced85467c24cfc1b88df663a40899def9f8ebc4f42c67365b35337b1594ae94b9ef5eacc313dfc4c8958f32549b9e985bb9b8d55b70243cd624da20a5548148fc62411011a54bd481517e2d4ee616dec79120f3b36bfdf1007b38eac12f5452328f4b6d6a576ce0e08b781904b153fc916f7d99f184260af44856836715f09c4bf752f1ebeb6b9ac429c0182fdd80e07cfdf4c367f185ffdb79e5a3c29318aef35d4bb6c14e19da224be1624c3b951b775fd7a9f091ae9ebfa640b3396776633579821a22e19b9e6d561e1612b7f328373d304d896ed2c37de1b87a2321e87adfd4478b2e31c1f35942e719f9cbf8230e018ce9ff1a54ca5ffb194f18b4ae3585ae39891c4c3a71ccd775052988aa8173d62103e32ad8eb361798b891d81e0abff0e36d61b618aa5a5a25ef896e376eeb0becaed785aa2438bdb6bd9111540f234b78c649620e36ecf36a96fd15eaea04db51327d4b0802875c6af7481f70bc6f593fe2c66db6f14c320797d0de81294783dcca43abb02f9acb4655730879809957acdfbf8e9f99c04967895effce2568e362d4bc7178694e7a36f5a549182e453fe2fbe6b8fa5e888af920e2b97b327ff7469d8d1148df9ed131605259e249c7fde522510ea93d37ef07d84eb8980e638da03dd065a5c2a69b8ba450c95e054f26b82bc8b0f7049106b2cfa6b0b1c21d5d7635ec3e38977206881ba7158eb1dad7031e632556b44057a7b5f60c3166ede26238d714a5812ba51fc351a433b0f2f0ea578bf3b1c9c5a8960a03fc92488fd0a904fdbce10167385873a281ff0446f39f3ae2de6077fc6f655ac04619ff5aa48f1307bee684512bb48601c77b335f46b51063e4cedc73928da437e3f90fe2652fd1a13e8f7d4e30494a7c1181d35243cbc78584ef90b647be9237c857433634316bb164264d3bfb5c283c8c26abcd3ccd1b56a1a3c061c00dbb2eba84535b779e9b8b4f90ede0ed04cfac45ee10ef6f760ad4707cb1c7c9080024df52cc7c510d43ea718d3c178cb6433c96c2f70efc2d1ca8d9f573093263f1b0140c6af0bde90ea15e948c5141beb2ee459898691fcfb075e74acd203ef19cc66633c26f151cf266e2b5c5a29e87f656fb42a584383b99ee1885a6db0d3055a68d6420bdb93680838ba46afc4b9ce4bfb47eca6aa17dc12ae029a8c861b1f3fbf067d85939f7aa0d63d99e74f61bcac60879f0e7fa64e96ffa1766e397878b87d5d452bc284087782994d287d6fb210b42645588dff61ff72d2580c601b69964e5eff2d500ef6cabdaef0ac548957dbe55c8d17a7da614b9f0c2404d772e1bf6088b5471cb4995853b98fb06fb8f757ce7471e28b9bc687a3cb9c5199e7bfb0d94059e0f3adba2715a7b9d325f3419f79e317196f021817d152e6c03ba25d0170a8342db3b5454dea5ef5acb378055b078a32319ce54ad68492bb06fb6b313d668d87d59dd2c686a39ef3f1410592b32d77f7e168604a3ec14a36fbbf1f0b7ccffc069a9a23f1d5053db3cd4ee18bfcfe99f9332fb68b0da942ea3432401ad457517aac841a2428c1fd21ff140b5d69f63399aabd2946f64ce2ca28d329d6cee68e37388b27cc4c3d7fdd4504f27b3e9e1a4d8f6420b46fdfb61500837d66075f5a96ae706826d6c470f4a318555bc98edbf691bb4873d4ecfef34d1b6313cb99dc3a069d9a8bc01b8695d601f08ca2f7ff22a84f4d6ecdee6e16299c8fa2e7f0d050cd2b1341baa6b48ad736fadf2b3f8c0ba2c2e7aea0fb20a28e4ad93ddac7735ff7d8d76678b3dc5efedd39862a7a8d7b1436ccf5724136cd84b4edfa1642a85c6662dc5ca047eabf63b901b9a7e86706655209e654334ff01d8a65fb1c640840df77d94cd2ad206473b388efdcb3bd49a15c59fbce7d30816fd4ee890e8dd34b43e519f575e8e23595457582d870638bceab0932f0c3bfcec81b2c4f4a8fd15cbc1dc1aff6c72a3ead8470085df2859e1ec2f9bf3bac4bbf085220e192d18957dcc70d262520cf1edf1fc1082ee5fcbef979c85211f2126d003a6b9ce28fe4898ac60c37469d82b00f5932d237fa30cae63f300df4da43ce7a6ea5655f3fcadd8c684f33fb30bd72184dd277367f0c67e88aeafb4698ca7f52ee46ede8f088748391b0ff531697fc417424fb5350a1202a008afc86152cc00c1c232ab85b2f586c32da0134269383ff1e7a13de8ec7058e4c182c4f735c11e08a6358e1e54537e42f311d0a601a7a0e2fcf0f957a9d04d95e4c07ca38b5d7441ce54af1d72e3104453888ac5243b7a388aa5cce6306d941260937d653c89861185de43bf251198c1c3e30633113f03104ef9ece984e7c4d1b10154cd51d3ad7056004e2a07aa6c76bc4bb073800e73c839274f584c0a4977fa78fe1118efa914d433f9ab81509b5e6c0bffcf6806a1a741ad2683e3232677cd8707c35ef76d5667475691993bd795b5c8408d482c6bd17ee9c603cdcc43ac925ea78bd4992458326023bf34cbe7ee9cc673cf69d0e83d37266d22426cc9e501922d563c351b7f11bb7ce118998c1c0a0cebd856fec85da6f6f5e84235bb309f6d9dfaaa53406e08a834a694a21f6bc0915b6aba64c199721e9c045ae9f09cba8c693e36f669aebadd533121d06236768f5d798d91685cdcfa93bc4e8c62d9a416d51b4382e53cb911040d7b35a4c00056a0899b182cac71c361b2d61ca53d4d45c9e6906274fa8cf7eb9534f5e5b8dfb6162370bbde02b76cb651aec3de1330f6e3380fbb82d46f78ab7612059f7aa8aba486552b71e52fd7fefb3ab8729f67f99cd7b688d223c6a9f12f2163626953f0331ab51fb337c7948c3174767410a2efd869b1150a81c7fc63cf5b9942ed57a7d45a67a57650dcee1f33709ece96314e36aa44ffb6004b4a2089c0f263f0120022516004d82c55f3d4f3e359811a30e44f031df34ec03ee2b2fcb94a0ac0905dfb206eb7f365b57c4dcf49a80d652fa791ebb9862862334c40473abfef9ad79ad61af3ab71350644fe365ae256df581f703c6e76845adba96b2305c698d9018e9aaa6a68590bdfbf106eda1c056c1ee8bc2902945e003c5f393a35e747afd9f0866350299811983e146388be471120202e0565757637341f49b932f0e1d127b263496a1429818accd102f80663784a2ed516d7715581fe6c697bb3a0c3b6576de8fb4bb99882240ee43e239a62728bcec5b00791169dc1ab8e19cb32a81e904065caf3389023b1d6958dcf4c673e951bf8a1a7798ae4a88f13f43a212383a4f5b67197311c265088b457680df25ab17fedf03ff30cdacdcb0da6e6004e621c878c1d9afbd78c1906c80de3a1940cb3ca1133154d49a0105d350e225dba1735e846818716f1d6c127e1c04800718d78d82e2a97267371ff0a6ec31f3baeb6b97cc42a7791bf0abcc67bf7898f7c39ba4b400fb4adb238f4883067d07d1ed4a9c384a6f20a33069b9d334084e6ee59c177f7c446005359a4d2a26284f5dc00596312f340a5fb0aba1e0c97c2b9d37a3b8a08dc39f914b456e092e41069e0c3469b4079303faf0aba762a5bdb33af64a2f23310b9db7b1a9253657c7e8928df7ad969c5203e1bb6f69b3a633b3381dabbb3dc0c96ff21a118f8f57bf2444d42b99984fae948dc0691190c5368ea2407108dcff2780be653f10726b5284cd7f2d82e4e887c201dffaef5718e3ff461710a6519232d55025962d66b1a6f16a759b843e07ce71a79efa585c750252d33e01ee70d9139c369a7ebef6f8df08bb0eb727d2f556d74312f447e0650c9fa1c07ad399d54823e6616cf526d08ab29290c8c733f40a92b1d9f35e0827c017e984c3f9146705f4ddd7095428636be58a196471f148b88b7c2e08e67848616433b37240cc8f6d603cb43fddd4ba7217b7d53e68920a22245d4bffddf81945b32d14d3006cc77449a107d000bfaca17eabc5021a8111b72a180785c6f4674d85815d88c9bff36c4109e623641bf42808f0144e9728ccac2ba7c30375a280438494a06ec57ff1fdb5a5de8a86f47b2c05b2ed403c79f4443c32eca3f4a0acf9cdd25adf4d30b81a6542224205e65d69f2757694659d686170d1d90e24b05af1b9260c06541d9e10cf5f2409149ee2a02a05b765fb8b0fb47518dd9ebeb3e7a4eb719ed76181875656cffb379f1e2d4b8568fa68141d30831defa35f8347c05ab2eac5d78cb234e7cfde0eb7c52204326aa887544e13aabe25cced1c6675ac98226565613b6631502053013aef1da1176269c8452f56f3a649e96e536629c463ea6dd1e504f3f4d330c943256287dfb1c9f5d7c917318feeb55b7f005bc245ffbbaec19f9b79c294d8c37cdf3e5860abe5c9d71e9c607f7e3fcf2d83be83b5f7a437bba6b9e55633e0b695d75479dd9eb226fb9f129539882ffd2aeea34e57581fedd00e7fccdef83a47a5db8943575898eafa3ad22741beac171cc40f952bc6d19a828cd8511072832ae1137057663e77a22cfd990a673d820b47383b7651ec78f6eebb1b7404e65dcd4db3e3e56a7c6e3abfbea45b4da2958b38b3456cdb791a4feab66e09853504aae336f938b5a2c8ea4a8760bc67fbc74ca8216470510a1d1e388b73790aeac003e341535114c117fe416f46133f9b9508b36ac337ea2d3ca88c20923110df7c4cf7c22200525e5117f8b806012972aa6ce2860729e09b7c0ac43ddcd82c4582a7df96daa078b6296d4baf81278b5fddeff89f4ecaaf78e389da205f8f59b45914344e18d262f689771b2d5f96023cb7a919612e093849003869b711fbcc11c02861ef89736fae4d9f812f6c44216335ca566875e9f12ee1981b6649c8964f7a5a0f66aaf0957ad75e5c13c8b538a169a59190cd5f33b31548f95c368ccf4b688b8bd18474f195ba8909af7bd45f9dfa337af8d19c4e2606a0c12137ff82e944557bb2a6c1e88cc27744281982eaabcfa68695335223c8f6cc3ce0eb19a599a5e845aebae55415ec4144658f19816ed52d6f7219888e73de6e4338048399bdef0b86ac5e7e1d3cb434c2ee655c8195aabaafa9acdf5f91d8844dc7c7def89d0fa96e4f4652621a14d3027091c83b9ddf6b264c99da8e688e6e712c4ca7e6534c9e3c6df98efa8c26dafd8db3f2a51ce917d9a313172b58c6194588d3185268bfa70ecf1cec56aaea9c50a4d0289140093599bbf5efd3116b964272dd1106400f91759c46cfac49dd6ff75559dbcd1eb84e5a1240b74edce362d4b07c82e3f3cff0af804e0e67179181b571f4f37acf94f3b150635201fc176b1a21ab79c489e786208ff6cfb02c3511254d7c0a20327e7ecd41780eac5c6467750d4dc5ab154e36c6684715b326e64840f94e1934c61da1818ce0aa6c5b96254889d2747a0fad4f5debbde92185136587e293a191e0a89ee3e4365c6068edc069896ccd232c30906d06fd46b91063709b97231d063a06b890bae82f2962a1709079a5912546affa6aaf53b76bbbc929715ed82074c004f110d26337a4ba341802422837dc4d31bc12a35b415133356fa791eb2bcdb465a89670558d6295ba07ca5775c1d5957892ce78202e54ae8c0801f0347606147880f5540816e4f43ba1e65fb2d0e07a8d0255481fb1d3937dfc74541fb42801fc670354ad18313e2b3dddb2d23e0a3b55da38d471dcb46e02bd05ec05bb943ed62485b45d1ab83bfc001cab37489288939007075caee0a68a32455552f601efcf6d000e7fe36d4de6f7587e46d237446996836b9a3f6f8d608a41f967562c3dcb35c42b3e81dbf5dee9d9900e57317f2b69c7b3ba5c376040b351205844873f8f25c8f2741d445aa121e7151f6dcc10e2b339f99fd305cc2bf219169d8a396ea66007e0c4debeb21609aa63e3ac251721af21eaf93d82dd438952caa82ec4b98072fc5f9f286f4ec004a289402df2d9abe023840f03663f70638a7293c277c5bb90b45f4623cd496f9f5e6b11db5b9b723a5052f846889d81b648751b3f426d028da7e86fbb22f9b1f7e4cadfb2c8f8bc2c047423a873283615a1df5911f46b6c18ac0e8a801af5ec77bbea6590d7b590ab17bb992af17f16ad3806e3b19475416dd987912bc68b94e77059dd90dd5e5e1a2c8ff64c6ad6572e1dda62d0f4257f3dccff87e61e38b3ca5d2ea86affc4519687df3f93801b5288df34746ce3c92520f399946b7384639e5a360206a89f657918ae31fa2d413fe1dbe7b518de5df971869854c9e2d54524a3db90c7b9d75ff4d0f36cbdd3123513e8217a8e02ede308ec67bccaa2e9b9c485d5f58ad90be295a63bb53628ee6f0560d1ab7d2d490bc38e533961d56457004e5b27d9ac492b06998410f4ef864f4e2b69d936575d6a114355f8d85261ccde15110310c6b0d04c8bb42573059b935249e6dd04082dddeebffea649d315eab140d5e4a6f83f720e58d0f98bd4b7ea601d897f7a70b96592d7b928209962c7dc9688b43730fb185338ed414c2f3d7f97065308256340637956fa368c99d0e34e95f2866845ab9745d7dd7b0bb4b66e510df93f29f4b3fc6f9d1a8474eeb9a78e583bd1a89f2ac68ee2f18ffef088931189a3550ebe056eca0eaf607d5bbff165fa8f89fabadce9f861b343a910668ac0b2176799205370a4dcc0259312d2c5de5b5ba17de8996862c514d2f4d7505c9a4cc4777f1bffbdc40f268d1d3429b842135934ec1d698121e054d40b2ff166d4c371d3293c91d25875f95d943e23fec8149c14a380c7c736519a677c1501a6e2c0904667ce415b5fc08c5f6c83152911ce2469492fafa63b3c01363d2badeee1bd2eb47f2ae3a72695e4898946175b1d0a0f388d23516757ad1d4a8375fb49ed989735d7cf3d64889ae04df194eac61bff014d828b3daf703db80a4297acf3d2280e0042405097fe6727526e79826e9e0c7c067b726fc4822708ef24409363dc0df1fde4a931b341495d7fb5503d70a9ad5e70dfd642a93ae3d9717ce2cbd698fad83b5aa63fa63b694f868060f494388288adb55f2d044628c96799a4cb8c91b387cb35312d652ebd50c4c2b2cf0a760df0faaf09900afa58c671afccbe2740d4e388550e4d147907e749e8decac4215ebf0f5ffd85c19f5302dc67500a7b4a0d1626cbd89fc2d322fa410f79b58f4aba6900a075a0348df61c41390202883bb57e276f5d7b9dfe41829cc752103a4aad8dfa32033cdd2e7dc003bc0611956dd8c1ef5d6f69f25413be6e3c1964c0216b38b10d92e5e35ea863e34a94e6a4efbc1298b78331c0e4e6e69bc3cbb8ea0e94bcec244063d98e3802bf251f7130c5412e0e856e554ac75174ab5b1958738a9d89f233d4414dfe4a5c35de33336718a536a68cdb9120db5688a1ca7f280f49df0b96c18cc6ae68373e502e12e59035b1642cfb4118a568d68751f0ff4fd1d857bcd6c6fb2cd94d6084effd2447ff7fd9c3aaad105bc5ce65037fac32c599888186b08ad21e678c6cfc9a62e899d9302ccc0ece42bf9e51549b8e2d8cb039ca0f180a13b7ed215ccc5d7a070e4cc7450bc4b120c4aaaee68eda7d069c1074631212380c54aeeea706983cac53311c43813c8d3f3d1c808a1d5d11f5f90ff525c365d855628c6942cb16271b130ffe684d36c0e30712666780c6f8be1c65be4618b246da4acc028f8210bdbc9b6c416dc5039912da2a60df73f2ce8fbdb9f316c4035c6a1212d99bcb1ece9c53e7eb3c561c1b8819cb76e9e5851eae2da90e427ee0ccc1010fae5bdf17229005953808f6b77b2a6d8481d39ee6d3c5e43d2c6f6f2962b424ca5596fda71aa2689b8f0d2cf914147f368d72bfd08bdb14dc4263ad45fae91e5a48d5282900d47cdffbc140a1613e1b1eb68326e516c3dd1d480e3527d815b448e84f3ed5d025cbef1ec2223db383b293619827f483bcdc5518c34eaf3d63e6350a7140b98d4f79f1f8fddf52dfa9c92141253c2d9702a421f17a675cf76ea4e8d146cad7ba8a3eebbee357d3e3b6cd74cc6da294b06e10790936a00005dd8117615ee4ceae388418a75c1b435a010bfd40e0ea98f449e7524fc15a3e46b4e32e1513931aac3586bd77e983496657e30a208bff11fbec9ffefc625903906b6e300950ed26c4ecea8707e4140ad170fc63e4f8b479fb82a4528f6c43405ceabf905a7923467b86243cf5b1e8bde9c1c6ecd8c63b4e417f88c8f9475e776d7f15a2f05a65832f9499d295fe43d6715c3510b5a3a15c75f93191d14c8ea82016042d7511f2c7b205a18f4023360eab5da7e77bee50df6e74ea79acd38514b28e202c02b8172ff5a0988bfa0443f7c718dc685ecdcf8a480b3dd9649c0d11d6faa094817cbfdb7b3dacf5ef3c51249dc29c17b6ed921399a16b49285c9db2e28c15cdf4f188aeb3440c3a1308a986b28b426c6205feb0bb5e19dc2483119a07e18888d68a55ffdb9036eb53bfd01562bc1d5b58be76b46900231b48ec17056b5df816640e380287f97e0845ff215cb5120e93d58164b554ecd8436652fe6e7c61099a075b70b7528efb1c65cfe32cb625f7a026a4d93dc4804ecc9d36db0af8504090e7663a438ad86842335ec82e5cea23995edb1b473aa42b2546da3ff69f93f63cab2974d2b476b729d64af9880182d71b4fa8b8605aa45616c75668098088c5e57d0ed66f855a1e2feaa363ba6aaa3f32e145d2e6043fad256a289ea9db38e0ebf2ab507f3e92faebab56e38338a485f19538148636f80b7ab4bfe52e9258ba416c293489bb719ca988987c2d01460e26a86cd301601fd82cbe4f00b92326b36aca68bcf9c25fdff1033599f4042f0171d9e0084459b5ca74f76305e7c1a18ca54fa1cca715aa475f0b2fa669715fd4e3ffe17d3bbc555fe807d373df9146655e84ce98fba56770607ca0c5b636c72459ba6483b28b2b5b557d2f1d3bc583770841c62e451b67b95115e77653f95ae1ab292a18eb781790f0bc5d595559f3c2cf22a11892a6859311ae76a6a84c04f7b82451d6fc852fdca1f94728f01d532a13c211e83c94f8b75a7a6177c32f74c1e582d754417fc165aa9e5205ee4fcb1be3f210c9abb6a643cfd27f5e26e2b3e1695da5aa967c3ba30faabf46e73c88b5b48fdbdf7e2ca7652700e05e92b691413f50e00ec8ae6f6b4974a85db36018d3905aa308019efbefa12a0920e8bc8c79979846d8ac917cb72b385209b71a567e81d4762370df9c4e06622407b61b06be7bb2c42f7c89a95aef5ac963603fe4debadb973f7e62efa74aa7e56c1fb35ff2bbfa4396b18574307f638375dc708a3754f05b91c9e618dbea21a35703a9399e20c1106229338e6b3f31896aa6774f098feb3d5987f5a7149af77b6ce6604a3e54d567212051aab6519b261ddf70576f4bd890ac43acd94935edf42c837a2966dd29e81263749476add35c0b9f363f72a926ef0d87668d9dcc77284c4c49c3bdc1bdc27f42cb62e81bb006802de261606fb2b1a1918a5210da7ee7ad23580722f74ffab7afaa18c01e56e1362c403ef1ebe1a52db044d11c4caefd6145b33c7ab9c7e5acbe8f1293dd7ebaf225b53c6bc11085dc1c0ff72d43ccd1f9014cd28f054eb72f6e3d51ac9b7d85f6cb8cb3495de960928afe35d95618af17671c56265620cd450343a6a1c54245731126a2f520f9eb04347775c76fff9864704606f51df663ffe85e7e5d8abf7e225ce5b6e728de373b6149af0b596238837b750544199dd5030c29de00fbec6f3450043762ee4833c29036ceac166a8330822b433aa5dfbe2a8c16b5db52d965e4631bcff0ada2f9dfe87f53c28265d025bb82f6b66fdcafb973f2aebe60d59359dc30a0a868580d1fb34c65ff87d96e55ce1fd60923ccdf122ea5ea58590b01d0cacfbaa0a896a9c6bdf7241c92ed7275b677b20c656f48c0d6d14663c03a368ace5d261d636eb85c13678575e2db8701475bc8ad8c07c11461e6fca2dbbdf2a9b04ce932546164689b6f120c3a8b358ecdbac1d8ddd51b7b145c7fd505a28f592a560aab7260dc5daacc1cd1c5a9c6bc1dd6fb6089f53393172c492363ede399d3a0e157dc52982cd96fd23895846458b33aa33b5340e5de4997f0301f86468b5416adb5fdcb8110d22bef8a374ec6a797e9869a53d3188e7e186ea1b54033aef95f90bf06c0a51264534f28093bbd42371d70761ef188dfcbca0c4cd1a7a4c48a343eac88a327eb60ac3a20082d3638c762bae3922241d59dbc0a568dfce6573f7392d9227498be3beeb6f1627497903930237cab983c9f15610f637a843cfae008f6bf0d2e3b91e79cfdf7770ff05ca7c59f2a3b0c268ea533c3e8df4d619c48d61f1db0412da9bac37bd6a3745c38360aa2b8c6ef510a7b57c176c195240647d0ed85c852fb13b7eb44423015e513929a12224ca24ca36e88d390f11427abfc2612a1cae64072fc805c49e4b5740808568e094ee1340f921bba6bd0251480ae6890177b41fa7854f46a6bdb99afc1c090700a89618d76dbfdcb0a039bf939653229f7422e03a4f4b1039194f0107296a2a49725f627931883dca3c61019c2af7b1a6a38947d74ad3493179e3105fee43ae35e64d3e9267e7a9f02b96c71c751196a04818b5e6bbf8a7a12acd1eef55ef586b094c13fbbe88ccde5c6feefb8abb8d76094e30e03131e96a854ddfe94e746982e45b730332a5f0acfed755e5723648abfc6951dac27c2b078072f6cea7e168e50467bd3335a329d9ed426a462a82e996efdbb3330ec80d75bcdbec4fd9e24ba389a1aa57b868376b7d060401327a19283d4a4ae38018fdb8a32961e25fedd02e529c70c175658cf1a20cd8fb2d80433a8415e89464555e14b9073e69acc5199fe214b89e36e1705800ed8837a60b908fbd06d4375b3dcc759ba8cdc3e75121cfe1a8ab8d297265328361ac590749a01337d10773250a9e344d5480f7f3eff6165aaade89b7b0f4deeeffe838ae6af19fbe11e171ff7cf04824d826bd71ba2cb2de337b023ab2b1da6af43e2b79f0cb3cbba875291a709ebce8d6e4c56a202d56a2c5559376a32be709c00e59601ceb65b9f5993be4da5ed055f266c37d0cb8fdc7b03ec32e84bbbb9da3dda025999e7f4ce29c2c70ee0ec3d5127ec92c2408e9425ed51c93d85cde5ec08d2ec896cd700959844ec52ab3b60bb16042c64123398a7476664929f925d114ca0982adf6063995f6064d4d4fe0aeaa09f6db11e37dc4b21d9055ccf7c5106578a4dd5bdb428c25a995809856afb9801242da9db45abcabc658bb364440da992f26e82c280fbd1db2d8f91597e70b6c09150fa07037e0fc5f58e7a2c9f3683b9bd6db0f69c51135dfa5d613239c9ced52b10a55380b2b89fd3849124ce17aadecb677f2a1249c140fe349a830347b4d4938904a947bd67d716681eb2a4ae75bd23a826495192ccc1cb5eee33d7644eac7a426f03411f5e948cc93e92fee9ab3b5e2391ff44afff0c1a9d4bb52c39b98a36a887d71a19457aeabedccce5506898f39b49177f1eecb3b7f977d4e72cb19831703863dcba07b091a0c642e60ed76ca6d347ee50bf1fcee07188a1285de0bd380f685f4499c823d248909494b01c0c147ff1c530cb997d1aac2c99320bc7ea0181fddd9261d2b0c69ab4e17c6be658d54ede9ddc015c6754435b0603bee10dc2422bb4e528c2b8963ceda4dc4c16a74886a544e568efe5735d2679e1aa0c928f8abbbaa7f7fb9b60a3ff88248c85ff34e77c4ed88e3ba05bbaeb079ec3cd7a356a92e638bf8e735ea46834ac41edf815b3b4c7449344f410b97a5fd1ad10dbef03b26660fffc0725053ffd68ae2d945c989aa9bb9bc4ee4bb5fe5e1ef64d9dd5fc17815aa19051a9aa66ffe15bb19b39dcc89594c8001aad08902cb584e043eea40d689432c62daa0f7a39c6f8efd283c46cf4be4d96f49213acb19033cf3990783f842242dbc110127ee7d9cadd8061de5290a515c74dbf0f75993ab2d3a0803b959a9da02aed088d424321d9b0981ef5d5cc2a3a0f2adde877169a0a92ea3e2e46e2b166842f5a88d90175663fd0421977554db16aba969fbb7596a115bd4677aa13866aa425b1fb5429964b1f7ac252b7075e50bfedf132bc6338f28d1ed6e7b508a7198e25e37552524119504a2c35f2e39da610f1e687c828bbad23ab7a3b4b4d85dc454c2a2ab1819e26ae70317848613f23f7e1d95f7f74a0c556351ae6a02470e226c9ff2797e2f24c91e1aebaebd79389673039e649a98cd3131b7152af82f168541ce78e2dad1d17ce2920e29fb87e54fd734aec05005fae183facf7e124f20c1bc5cf8708cc0bdb2afe6e50ecb5ffc5011c040984b3e3e66ac21fe6e3aab0cb1fb985009f91fa9253712b153bfb42a616fc98c49ddcf0f7fdaf1c7eb1991d8b3f481ab108764d49793eabd5e42c5d28a87f3eb2248becdacaf3d8f3dd5226698866cba23151536ca9e5c1cb69bd0956d29900d9ba8a20ab1b7c8f0c092ad23ae25338bb1e174d1e87cf88b4daf70773cd57069dace63c6e7697875f7795010cbeb8ec08a926887cffb39755de38c1db611efbac58b8cded8f4f9e487b8bf87caf6a178f6a8758a4ad070758e16f2094ff81c39fb9faaa73388bf39b5c0c67b6b6f5b82e8df5b0411cde3af751410859e95676efd127b3ea3e229e4304cf3a6185298fb77a6239411cfebd239e052e907f3b409f96f730583a300b991c5da46b0db6fdfef641f2b6678ab28d6d7a80e16c6274fb98742b4efe314cad94f278910b70f16bad8b71ce23ba25c6263fa2306829561c5c2369d457f1d673269718c9bfc4fd37f6ddfb28060c16cc365542cdc68a4acf7c990ebb4e5affe68cb93f4a1a5539c456602ec4abf5d8b49474eed42b3356265f99d80158578e792f56d34313c40da017e0289e0ba4586f4508a55924160eb7ec9c48be4cee2580e5065382071481d9c99eccdb51edda6fa35b011f05868853e8e6f62d1c55d78d120ff814f0df63163cf178f5aa6dfc5b644e7965d96d33184b88a45a142db2a34642f519bbbccad9b4a2e70a8b07bb90d0f56ddb72f1540b0d5c0092ed5a2ee3cc348a06335054f306640daabf49d6cb6660e420d9d1fe90babdfb396ec940ba6745f56d06dfd0be87cf9ae1d9453fc3ef5d815e6793b963aba953e611591bee8b09f3fa9808fcaf2bb107abd4a837cf3874ac142fe64c7d628829f4d654b2f4dd254afe51f3a0e813b4eb79b881874f95fe53260b5aa7cc7e70a5aaa31adf688ab78bc146d48cd6c21d39e08e3001e1898219e97ac1cfc251907419fabdcae5dede5455c2d50f9da8fff0499f94b225a2523ab8239bd335bba5766bc9774a8ef2d1e0d37fbd9cf30ea58987a5ab1b29a5aa37abf0c816f9d10c8c303974e4763cfae27cde328c36bd63dbb3f82d42fcfce1bcfd9709679d7b200004855b299538eb23451979bd17c84c7c11bc642a694530d603ce7345dea55acb5f314389b891d83ceedcea1ec7b750e68a548505a73d25a722b9ea8850442a12314fdd8fd5f7d52c1612f58bb7a640b9e8737ce10a5640499574099c125a07beb865c4bac0ec587db99712f6d955a7a130c68d50bb8c057027357bb3690f102aa567220a2b9857d33c0f5cb67a36162020272d07d8247231277b193bae860b783888695c64611d72afdb80866ebddeb5bba97410a67335a147d652b06ca07060082583c93cde07fcac81659bcb0612e04726d2e034c92646e286131cfba1df6ca518358dc45e3d6f60185cb98bccc41293a75015e826aea1763672ac27084f40f2d21de7df0f94cf530e8b02aad6f14af5f20787f97cd90cd5d716af58e79d2e95429ba5b17c25ce0703c334744072459bca6becacbd0e9f2bf79685e6b0ae439690a2f67082dd9d117b481d5ad791056a236835aff686ca448423c986555e159fd1d4f3596c1929e1b4faccb681b97e396f7e819b6e594e4f65f725c70b731bfc7cd4e77f0692f7d5925567ff5c912175aabe9c89bf275108dfc79b5fbcb3e0c5ff5ec95aed77ac4ee0396c1b19f1ee537d3e53b03600fe6c657bad0c6a32d691c07f0dbe05768953fa085fbec028fb6229605f184fb175763cc3cecce1b00db051d57ec2840d94c4ac49a1462939a4eea6736f0e2ee7108a2d6d4ed91c7d4b4dafada1aa7f010a73fd16e4ba9d3e38d1bb9c4085b297e484f28ec4abda7fec01383ccfd7f3091e2af19b5d111493da2f760e4b715777840ad586d93e7eaa6859d538142f975e3a8e2f805f132a2f8b8cb27f9558e800abd619ce9d9a2741fddb09c03073c0d3d7f9f764ea61413d54d9d0d57b16ede0bd85d4987abc7836c09e4e2c88e6e9629636e2b7561eb215e64ef1c926275b1a28be2484c4d9627371f22cf44aeceb24c3887d1b8529eec5bebf2809323e6d97cf83da6411026bb0ccfe81894d6f91e50590be49849637e92b7dcdbff57a82ba4d345d10de13e195151f35f8290e4157b6640d3e935abc293e9f494acf7e3524aabcb9068e52f4ca52fde453d4b0ca8ec64699433c9f958820cefecf48a3a6c3d5a6405c1d0b1f78e52a8428bd8a9f547eb9457f5bf0081782453f180d7dfe310c44a0b1e7672b3eb8f45032397f1a610b9964da6274208b76f54f68d1aae680b7785583b0e4ce88efc8f389c05ecb06f4e613ff65f1cd6cda47697505325988d28067ac940b2d0c270e52361e1451cd501b46410a635c20387d0eacc3d37dbc1ed20275c38d50de6345c272ce4162a44b900e7840b70c4c4c35135ea21897913b33edcb0b839107544b3a83f3d337be3a891b1c40721d1907ec1cc3d7f797e0dfb9252d1ed8b66e44fac7eeb418b5531972a494be1417a208eda7c17775fd6bca098f3391d845e25367f3a390472edc3bce9fba052d402c704eb351c7ffd0e57b660b20b38a5238ecc49a2023a8d1cebdcb242ce9cc5c3c45cab5fbc310b5bd1ea80936b7adfe890b7aedbeca142de973d9090323fa4431b72b37931194794e7602af0000a87eeefaf9599f5351ff68ee6d957913a9a36442860e47dfda13e0b88603cb6c990ecc296aad63ca9f9acf87d6ef6697c87e31c87ed83f310113b67813a3b6028237dcde8c1983e83ddc4a3333089fa4199b0595b2bfa7817858e7922d03ceaafbff40e9a99d3f55eb0d6786bd8209fc07c97518b2b28fefcd0e4df78ca9fa418746fac528aac83ba4991fc0dab89046b89203dbac60188a2cfdea8f539b1f47388615c63317b34fadfec4e6c1f170583ae7282266def9c5dd7ebc2978575bbd658f384d59554e1bf750419d52b8299e3ce7e404f03d8bf09ec959bdf189a0ccaf22705d003eb436099040262bdc08067e560253484a37965ebabf0d4d4e0821994c7f7c637658f99f1b1000951103c2f0c50f9995d5a405eb18ccca8572a4afa9946691ad8131911cdeecb410d473acf33323a7aba3212964721c02ba9e8183f67076c54b73301d5e1e8af3503164e60aa83f5046d7be0eff16f7d3b477a8219972dbb3315556f753fc3cf5aa6a788b5fd7edbf74075c6ba6a35f599662e6d49b8ab314512cff7b41a4b2a54c13296e9942df3144f05f6301fd2d4f70956cbf02ec5b2c957dfaa8b631c0b14462e9d4a2f2a1cc6292e8026a35f175e8cee76431c7e61fd412eba8e5154d8c76937ee37caf64db9ffaf3e1976ca35f82ab932fd6125bedefbb16ff778d71115a10ee2ef940d3d880a62418368fa0dcd42ad6ed51fcad1d2cde9885fabfeef692455d0c55f1af46f23d16ad0029c01a295d089363fa59c28fbe59411d42ac8b53be81514073c58a661867fa52954935919816bd4f590dbc26b107366e7cba23cefbcd3aa8b8da53d855ce1880a437432fe8745dc1b4ce9ce10f76d44869a62c93563cad24ac535a8bf6524dc1e7a8c15effebc8076ec2c822b536515ce7658ff23aa3e8ef0f10baa5ab62ffa1654f1fc541509160eb43bc72a207c1823521165d1b7a9f236dbd74a5d5d24bd64bd87a2290234634acd05d5c1ee95f2360ea91fad8810945a94198dc07e7f849d472f55cd70a733da3c5e231d9d08753d3d25344233e3f566a4b247c294256f7f2e6996154c807c76949c4a375289bd694905966bd723ab010195db5db9d72a09d442d0605d64b731b5f306806699d1cdfb6cb5d8488eda3aeb91ca95403cb631dc1916031fd58e3840a60f6680a266e1f0e4c520885b49aef21eb560416134319e62dc4e43bfda7632ba618991aafd0eef1ce36d049915519371e8199ae3b315b1902d5f30b4789805fb76eacb31dedb1a668784b317673c8727056ec9aab39feaf02d98a75e291aefcb1ffdd6558cdc97d6aea561ed99146b90df4a735c2c095187ae35009b72cdf83689e91924716517677ee7a39c39db5770afaf2df3751a8f826f94c19e3a595400510cc96765cfc8e93deb7fd898c1a440b05fd0bf00fa4bb9ea8e73559faab376daf5ba49dc3ca75d9ed958137c2e766aebc4862699bd95b39341fef4fdef6184c0ba44b8268930caad1ff2082b2eb09f1df66323db602dbcb97fc37024a058d9cc508a5a3c01724479decc036746f8088cf2e45c29e16ea455179a5398a1ab57ed9ae242cd2e18eef4aefd95e49996041f7ec356a46e9a53d3fe8c1c4c2d1a9bd4afc8b9ffcac7c1ce73e281ece33b05093226475e85d799bb27bc1e5cc77fe8db8ab198be82e65b4d84133514855c87b45b3b1b124e7da07c70b2e91e76f32d7f4025735b848bf6649e0f324c85bd27c2a443239649e062299fbf5997a5f3cec2b5a017a7327ea9e8f27c40199b68fa0c33ddfb8dc07b7a66cf0b906e401b3754d754f5e62e6d7a22546f0642251150c127c02aefdf698ffc237fa41bbe0e097cf10b3234107382efca98ccd4da6401379e4ef53e460e1d9805b9164ec34f62b72df6c256fd72e59e198a45e6cf44240c53636ef9dcf02e0bf6f15f38c7385ea421c4da88c12d32acf06b7ea8422f41876fd1edac911b9775ce0a2220cac587e3432d040c36f75f4845df9ef67ec7f8d27f898c29cb573bbf475fbb22ce5c72d1e2d8fc732ab2073c08aaa69e6ebd1059f6a24e62a6afa6828783c61884c03af25d8b50275705934d67b86c99781e56e972b493ea3c92a9997d0cd0aa2935f9f1f0d05bfaf8daa42fe7004ff1b27d035e3fc0a1ae79d6fc93149e2891408b3d3f054d8bb6fba6563fe0cb26b8b3c9752aa5f45275b61b4cf82c5acbd509a4af876fbd90d67e508046b41ad1b40c77e62f785a5c8a169f7ec9f2b19e9c4a7749120d091866fce4451fb6dd77dcd727dea510618845146f4b8b0696ff82d48dc46b4c376cff114bd6edd96076e35632e56613ee5c7e8e818c4ed4bf651002439239c3bfa379fb07f81467824f74b41ec3f834c408e44486ffdfa10ca92b9966e52ef150817f6d1ba16908a61b60075d9b468a9527624e98c0076fe793ce4508f22db7e81589c3e9c2c3f95e8929db9764b4a3c02eada53b606610f81b93a945ce7895580cfef039a2947a83ffbc96a2481fcfe2e1133c86b444702c3827b1171f71b3ccd69bf4c2eab308b7612912cbc87648acc92622e37efc1bb8e1238625befb9ea0948f76ee78f7c3ac2cfc57c9e480e6914d69b52aff68c1ec3bd0374236bbd07d4d6c3c94cdf71ed721b716fdbfa7da6ce8b5eec8a6bb21ae52343eb26878df8d10f3e1c8f7215b297368e024386c1cbe38d3deefd0cce73ff93cbbe3cd8c42930b9f8533a51126540cd4d3be319834d10445a47b9282652da4feb52fe00f925809b4780fbc256cb983388cd9a931f29c16b048c0d9d43b0c86d77d2748c40d6caa731306df6bda5bf85a1eeaf92cbfd9607cfd8654509ba62a11fffb8c9838f1fe486b9292383d6dbda52d7e0d8d733e6ffd46087d6a77fefab1b3559cb365d1fcce8e8a247e8d8047940068c773a61cf8dd2caaf2acd9f0a03a94a676d7feacb037b8ef1e4cb58b1d01958cbd2dd123c6de9e17cf361748c131c995df305b9ae260706fc4f5b31ffae23304ae62f518cd27ab92bfa330eb518f0b48c41f475e0386fe01cf368e63fff8d0c1dc59d1be8002cb790192100190e0f5d27356507f65621365b9c37bc5cbb34b1ccc5511eeb73781546e1d2a0beb8985e0b093100ce6c23d6ab892c29af9c2dbe0814cf787eb6d1ea436e437fecac89534b7e0b6fc75f9cf0aac0cd48c52b862a6cf203c86847119231b5661139aa87d727dc2a7c81ed84804a75510fc703d6ae57bc240a1a71d56aacd821b9ee47a8b19396446dfad70f372b0d3a58a841b0dbf4767e35d1a716dafde1abed8366485b0d734081084ba867ed3afded8e5cd814775db7fabd88db29e8a211a7bac916fc0ecb08304eaeb67b9fb644e75227a047e46ab12671905b284b251cf0b17f8316d76e817d40d895bd5accd701ea1de36caaf1c3c6d48dbcd642131d3d47e906d0620dd1a40e483a65a19f690e3990cf031b359fd8ae95881f038cdd29d7ef10557c2943757f0dca5bf035651d3cd53e10fb6eb09c7f5f7c985693c4b7397039ddb20e4484ebae87c34c87d70da7dfc07c7188065d22d307378a31128f4b53557c29fd25cf5102163de200ca000469cc13148289ab54b6f6afd0d602f19a1a6545aeaf175db0aa8da1642a36dadd4faa3f09c1405c17ab522586c094ed9f7e65bd51b721e32e7600fc69a5ce6099b96f2da45cfc38e56bca69c03d5e0db917711a22719a22456414615835b2c9bb21f42220d0b5f67ec057c03e3c88d353334a194c04ab05f8347351f075e25956464258945776ceaac555d1f415a6a8a975ff82cf182ca60b72831c82c8d004f8d38ba7ab16bc2581abfbf02e17275f6453a6e8c8d4ca4317e0a7958685cbbc09a4ba89ec5fd6d8c678e828715a3114c225d119e6c5507720efd744d2076c37697f61b283865d477f75cdacb983ad41474b105a78f71922daedae0441d37e91adb75488f242a15df5562ba042ee1ef467d13547d87af5ffccca7d734b2028bcf305885bcc923ab58a8e6463702bf13afd64e0a48fe6084cef4f2308b0690794978f3985182ce04a948e295657cf196af1d9b39bfda820af2446ebdd49c4da3b7a87f4a4cd94a14c2cbced69e2762b3bcf780151468c5df50994b622dc2323e0cc200cef5e2dffdd8ee67d7101f14e9216c88abd43af478b70f398f0f6b7cd71c16906bcb795a1a496ce70b06c0dbe9188cd3dc28aa5296d2e22f05c0c51668110738009a3f5d74d2a4de1aa20fa7cf9d4ace3a2f36c590d40469e515e0b18e711b35ad9c8d9c5fe1dcbc217dd6977c247886981412573d55693a4c2e4d46f616332fb2afdb003ac9db9596159312af26107d625b0619f14f1f645d45d0e88c7124ba30dfda175c5947ea5cd5d4a9c6aea8d23d20930796b9aec494dac04c932cdb744254bf62f6e3b71e082603bc9337e180e46f72a7c9d542ca699916952e03364193284fa7b0a74e809096328d8cc6c6e3a463d5b057eb23176fcd8316aafbfb6f2bdc5afadb1eac4848583b0220659cf46b12935b75053d6aef700dbbe78d928bdebb25e9de48ff50318137a3eb75f5e71f9bf6542071405909d28c68b4174fa432ed451343f818bcc5648c504e356a9fdedf9a1a4d3a0c814afa5be0c4c44424b436326ab320750c1b8ae4420d792638466b267c4eb0ed1e596c29107ddf6d8dec6ac011d4201d46a244292ed23e79f995af2f8673b7aec669742fc2b0624fd1175ddba245b68f6d9127861486c5dace03d915bdf9805c43d95a8313258e895afba6b673219d144cdfa37a569c8ac25c053236b816689b826c9b759c5028037e8c671023fb17fef3c72f09c8cf4b239ec49daa3461ae4abd4e32502a96ca98fe79163bdab5db7e36f972edbb5e2cf01ae4959f00bfee275ca7221bd3f819e8466dc202a427997dee4c6d3655b0845eb2d0e850cd2a2e2777d71263119e09aaa79715d14cf4a3bd37d946bcf5e11e3911ce50e73db11eda81365fcc77a035bc657732d02db84fc85b761c9565c9f296ff942611a144979bc59d28b2247564f8fdc73b15f97e525467fbff12f2498d1c667acf75a7acfeb2822a48afa67a1fb834f36395584a3963ebf22823f52c085e03bbe0f72d0df36cad176a121b54b8efb842d3b76115c5835b9c28cd523ada8e840739b502bbcbec66174a823ef01d3e404f55434ec86e3c56252d33d0683ee00ddc671700764ca394d0fb45f453e2429dabfad6289198581776acb34dd2366095af894513f1553963120199772567814b52fca7c39a043a4d30df08c732c001a411a9e5eb23a4da28288fc7663c1ac34c8a1dda3a07bee4fa9f819c930ea90b2d563708825c81891bb73f071f0b65a468be6e3e02c145c432dfe560b3fe727d8c127b5b00f769b23ad69c728645618e5e8f3bbb5b8a96c4b017d4186b598689c88b801ae8480b6ada14561e5314d6226368b55a9c797dbe82685ee2399d46882dd9ad5f85bbcbb234e305a6d1260ce96425e98e9654b5b3f7a7403ddd1e34a3b1a415c4df8a4c3c60b89028d9198fbfcdb959fa3ab0ea85ff2c2808605b3e9015b93f9104c4f7ec4a2abc82b47a5e6c95144cd2a0b27a42be7ec4413e1ece6955b6ab894c18e9b03f00c19d4055e08a2e8fda883c577e50ebb836135fb59c7e3629b4aec505aecc9ac08d2f003923f43b857b9dd75afb0e3d44f5724ef6d4187411da3cf5a0974a96d3764b96a5c0d33919005c0d5b0690e0874d84e945f29a73d8f5e8e39dcda3a1fcce24851870f26f812fe0a6b8b9450fc4b90dcfee859c6fda3550408520a51edc23ea2326741600d2794e1abadc3426c7fc7d9953e7276e764c916c1e9e684832d15cd43bb6afca98f973ae7ea569a8c9eb1acdbafa8da759575375815fd0bff1b56d0ddc2fd7c8786d688692bd576e1b234df16007d60c39b7ef9200a4247d578cdc5246bfd9911d8aa2074ac6eb5f62f5caf5e2ec3c6008b72023799864d7a23a1ccf5fce95a5add1b150127c76b0c1e05dc084e56416e7e8b183bf3d9020b2fdbb7d86f8d5d1a6c64cb38d573fe4241331ac347092366782ece6efbfc3ee3eb67794376075886213949de156ce96757941315a9c0fe0c28c6c431c53149c9247292ce72c1b512b32f72e528d81cbac209a2b011affab3edb73fe67a1c7c89726cdd08a33529677350644531ff883473776bc545d91297952ad1f58b552d66fac94e3d246cb22eb904b9cf18042a19597f7e005c5fa75f46fd552fd2cd5ab514921f522155789f029db0ffe1de8abf7055b4e60a5176503bc7d6c6471552c9f043e8a63f50451aba2a67ce0741a5950eec27915a05372b87df2d14f53d1a5d688e674381615ae97989adc2f99d037ff7d2a8eed23ccb8494a3e665f638bac366104ce969e9a073bdc998df9ae1e72214e7269ffa466ca8ba74638b9d6393a758a1e8fa8b423a626ceada994ebcdb71c4701294849973df5392cb3bf931001e6b856fddbff3f5dabcecc76bc83d0f99d66ef067cdbdfb40b71cb11162a9a16b224dc1b738e9f06cbe613f5fd5d00c5262cc907c4872ca4cb60e16388a60a3bd0fe45d1a997c44f3f85061008fca094495f1895922aaad4f1c254c73884a6eb25892a1020e961c1e5f2aead5414327b91933d2a8b59c6313c5e5441b3db498c46423d7c940f0ce9f47fea4aee295d5311bebca29257a870851881f1b565d5830acfd6d99b8f35f3cfa7bc3736b1fc15adc339e363142b2984591551e50a61de15065f8463d56975249be8c5120a624da566e5bd1e1a130809f5430151516a5d7212f11a636af572beb9dd1dde46932098d3ef9ebd5949f3eef0240674c8e422eb583c7e61bb02bf2ed3a62474f766027acfdd2a5227addd1e406888a3631c37e924ca9f794a10594b9d168d05c8f773db3d7b5e32a025a0f8771723a2f87323886c5e6e70d33b9880ed00de05260c4837d8c0becfd541e37235aa35fc5b37c3e347e1c0cfbae0c6287a5020ee9a28c368ba424465fdf21ef754e07318ba05ef69df9d4329d4d5828385187aabaa4c966dfff007495402dc9b0e391421745a2dff26bd3cca2a1b9ec6c3c7deffe17efc62c6e76fc9aff8100093f65ebdb6fd6ff34c16153815f4c3a4eda3dd5add9b3466f104e482de974af127cb6d6782b40c49571c3374fe96b0ff4b9dcac51ebc2909cba12a04ddae2be0670a9e3b9ae6c5cff9fcf4385fce4196e2caa1cc6e7e568a775ce59f0576ac65a0d6a56a8d461990860f327a4ffc405360f64695ae6c78c150077bc270b473f91ffcbf1d24dbc5aeeec6f09ce184632bb1200e39854279bb7570e3ba472801199bb18cc4c05e4b47464d3c3a6b7c8e72351263cefd03d7f6630c056ba013559d5ccde9cd35333840cc5b89d22d47ba80b544b1ab0af836e301f2685d4e2c21d7c5f7f077032f246a5026eeb980ee1bc0882a3efcff5640fa4e048d02c01527d4521ea938d31861f2a1972f5fbe68501e6291b3d8d9e35ab8409731eb2b14fb6b1c42bfee3757b9ab54e546a34bda22d607fc48852385f1a5ec89622031ffad24999f5afc23bc2929055028afb652b33b01c444df32396aa99ca2387e8f75e687772571dd429d004bbcf0bc07557e51ce8677ad3d9a214e8562a2292b4322d8c9f02090a8472d398c74e11dddb4695e7d394e624ac38e4f9eacd6ebfa6193c0329af1be6bb30866ad516698050248c42b7612d452486d3f61970cd3073c63068070b7f40816a4a9dffbf8333711654bc3855cc40f6ee6c3a0ef069563b90a8bd209aa7004338b9782faaee7865fc264c0caa3c61e5f0e76f3a63970e06c8a5aec3a846f15a2cd9b40e3f97ffb48481f55ca6e4d1ca5638c421fe1d13473d82b8d2fb9a3e30a82f23ffbc2a1f749458af938567f8c09ee6f26b12eea7e92c516c943c02b64762f73e667b4e4e47cfa37a19e3dfbc0e4ea1f3ce57ad7089a1cf1f308359474ae3a35a878eb25de02dedaeefbc93a730e27c9423092d88f9cbf511c03642b3f9b36895a38adbd7bc7a415591fc46b5f4c333a5bd583562b2a6869c7a838fdb954d860851fac1953c95b73a84ec96377ee5596103fa295bf2cb7ba015500debb6d0735d4e604fcf81858a0e624dacd63e3a4c9363e3753dd7f8d0a812b2ff94a4a67c40d892cc9535878fa15357ae6589b299dfa5ea3c51ef24de8b2bc3b3694a460207b85c95f5f98959f5aa43b5c93fbc3b60ffc333faac1f92a6e68f2437ea5d2699643b51823ebbb6a747fe7689fe94326ce04b457571d7d7f81c5ba42c5c5d6a7b95f708aace634082e889ac5b298485231a60bc093bc3614bb5ccaa384d07acf9bd2d26c159260e978c5e705637bbbb93a51d19eff287ee84467ed1d9e3ed6c2563d8add462ce42d3e6bf9f5339d8eb8faefcdc6bedc5dd396204a9a93bea0987d0bc533eae9f9c7fb69713809e8ad57e47f33ee35bfe94b96b028a3b441e674b05ef695742c09091cca9fddad3c6ac69c46dcd11de65f6fb3560e6a38e1aa012bd67bdfa1395ae8ed5d78a1c854d6adc0f92449d3bb57d46edcea71e1d05d0c0ee8cc0254212b624e26276dc84bb678dfa8ffd2e681f5852aab1d72d315d89cebad71e036f2e24f7c141fb272aacc6bb37f172c33c779a4461da1d293bc1053e9d6b69f559d087d8eb5faee22fe3b42e0f11325fab1b0dbf29187c5456e9ba1f7c33f516bb85572158c81be514c6bbcf6fc4743e86752daa9e67c7f4f7c6440fc22eaec11bf55ff299d3bae37b5535e2db3e2d569e696ed08e5b46d778efe10ebf0dc988f8e2dbd2636d436b1cb77885477ce6a6c0c20f92bae177521de47955be2b4b8370f8ed27c3dd88c66c98fd3e276100cca77bd6d6605cd0adff9128ed1365120a23ddb33b8e56c0cb48a85ef3d79de436aaa671a14bbe6abddc37852946dc0edc25589e4e2534b491158bff2aaad749edc7049ec1e4d14bae038e0748f8dcb8f616feee79827ee16516939572372c8d42485e7ed1714da43bee2d89cf78595ff4cfbb9a50ca2b9814492c1d174d65e9b79dbc225d8c18e8cabc2a289a714cb69b863898beb855995264fc494f9cf5ba3fd5d8e51f1d2e84e2f00cae2da7d98a9bcc1017ff29e2972e40252049e9e6e97e8dee3c76ea6b9bba93fc099a5a63dcd0b8b86fffa21f7d98171f0bca7012e8497d4620e493be302a48963176fa0f7bfab149ac02714134dcadd2ea6de733bdd1144a009f52da4947f837600093e3d0f1b3ebdb0a99a40fc722b159c032c84e7aa63da4365f282204e0362751e235493f329a401ecdab20e7da5075a765fe27cd00caf9e220f88066c11cd5e733a43c888a734fd441ef26dbb708c242d54339860da665a803768b9de6d63364f80b9e53e8b88fad15e9294fe91e85bcf58ab99eaffa24d2a72bdb126339be3d547ce0bd16e1c870b04f9ff9102ab74c8a60111d902b4b67a125dfbf623d2cbede8b0a9357d0386fbbcaa3985b82bfba29f636f390c337bb06adabfa89cad6eac382218f0b56c4314859fa28c94dcc122e7ea627885ee47be49e81f06f700236915f2ccdd0f05491d269fbcacc93a0b724c55ecbce6f77e15b2715f9f063333ca749cd538da4745cc3e029c388cec683325512eb86cff783c3ecd1d5e700543c9fcde92b1bcc8679d6013a3239affe918a65fe0738dbc2b84e3465a399e2c5dbbe463c36bb3f0231d8a394c680d4278dee9d6eb9abd0649d3d21040ce25680da4ca033aa1d2c088a0e6602c82db8ccfbe881994ba3535475b2b91e48cd5a1cb0e55e11a875c94dca00401d67d8aa73d462d9b67642843d87be66adc92181ba7263ff6172dab355ffd31c335d315d47c20695643fe16827c9eee9a170815b770ac5a604d7f2baae8211443d6cd414ec32c220fd6fe6e82b41743ae365054484fd3a6db48e1083e610e19a648338ee3933642e2c687cee292fd3bd00cc27c8ebcafce62927e4f50ee07fcd698d08ab0eeb889e4c3624a2c133d48c0a21de616a358500d6599556424fd494b85b9bae9d9af893580df8d03eb0e96e3761a883ca1db457f5847e67da1315926203e786b39f68243e74b0d678e23e76075cf353fe23a9af0723835de6ae4876f67d73c902ea4ed87b8e703fe099c534ea925612f3ff1ef43cebc0de4c1c0ca032939342c623274af547588a26ae32f194983fdb9f69742529d40504bea9686626a354d4517cdd0ab10575e25657fe7a047f8b5f8c88e020cd1daf11479d7490f10eae95107363019c92f82f377e030a13662274623387f67ae36917cfb7e71fbd5033cfaa45e075f572547e980d4190a9cac664a4ae18b453769d0eb8b61845d45ab2e9361aae7487dee6e55e2d899ff5982e7831654ab78cf271d284bc99cc7916d639a8860d3ef1354467cce948efad400362f956cfef34b86c77f4a7fcaf15e2abf4cdf1b7b70b17f61a8db5723db1c6bb63db392bf0a7a60489d0632c25cf61eafe69a057f0bdaf62c162ee6541aa2aa75984d81c583e45e1ba328c0adf2a4ebb004bd12b38d85eaadbf98b8df11f22f08769a496a2a120be919dd22ffab7798b6215424657df9176ae322ee57e182c25a38c38b6ae7863507f19b76937f0023b5fa55cad760e5981edd0988adae2baf3cc30a223ab78238eff7b35a45b642ae19a7ec9e0aed7489b7660b9bad4dcd333fce0bbe3bf6f52135f80fc04a7bdb1c522a6a73181e0cdfc2e725c4140fc084de860dde00d6c8a08c5fad51ce1f8b741c8a43684b37be425a764f7855afa342fd8d640c8b444481301cd420e9dfc9c57c9c3f27955466290908fd54ed7b318595b475af2049b68e5161a353b4105a86c4683e2648b3dafbf0c02f3542f6c1b26aa14a76e976885692d8388623a48789e775fd73d614f10e9a0dbeb5ec6b2e685a58d6bbbb3f38b4a7e48e5382f3a45139376796891b19b974d4197c253fa61231fc7688d1a1d2bf20040ec081557c2e65d5593ee84875d66a7e3af2c4f250a715e80600cc092c18b7508c1ddd2a42bbb23be1786f7309d249186cc9437755fdb09fd437f8c6de4528ba8384e8266551098d35c3c44c662305810ff20ccb4051d5108716b05179a45a4d23f309d04b61932e531f47793594ec944bac8eff2a15e2259d28c5114fe193cf6787a2179868402f94788223ab1ef9f50aa4cfe6de3511b5f3f9cdb16eefc55a4360675adfb412946b66409856d022ff86798c2e1e1d0e8fa1b9cbf3e899f2ed6006a3b807126dca1d36dee41fdd1f6b9e9866fc7332f893d3446aa2c71d2b187f4f9ec6627f195d0feec6d83cc52cecd61aaf5208cdf3315df926a7bb509abb9dd4e593eb34f0b53951206bae531c77859184e8bb7db36a6b1fb021fecc32c1ac3d18b92c28fabeb039a17c936598020ff60d88e88ec82c4a6a4c58eb27afd1415d7b3b8f2eaf45772de3a22ad4edf648822775133adecba26c6b0d164611a24b64d9f7d007f9a606389bec92f137377727112c7a754b60dec885fd91b4ee46b641627ca77bfbac61a5da0293e10e27022ba7069e511b8e15d91449bf33f3f9e60bff2f65c2533749b0b43c4867277ef0a7a4ddf17aba66e230f5c74b6f04f9c964e686461af63e90b5ab85578f73aabde5ab2179badeec9e99015e0e9f71f0a11688f2cfc9ffb4d7462813383bee6e23989a70db5055ed67bb390d861eae101ed1891d324f08fe33d7e43e7445f8292a3da5a259d7df6b2d85887e10ce963e99b26a95eab93a3e9b8f85a3a56a92619d0e0d6086d46fa8525047c1a2c783cb0847ea7c6e0ae83cf498ee66c71b0fecdf018e27a45b51448faa3c51395dc6e21007c6451783603802e0ade5137326c996a65cc40f81d670a6c36e951cc84b2395807c7473e2badf6fc4282983817dd57a329f8cf4b64184fa7864556d1e7a5ed44ab10c3d399e8d10c0d040926ab8159d9f23c894221c69c9c6ba9d781eba45769f69f37f41f40e2927e1018543fdf8cf51b9c4e581e8384a653e6962b0ce3d4075b77503e4a95b4a3eef8edbd25f7c38fce8f22caf4667d847c302cb1546060cb775abdde0a8623da795192854554f23e36ed0f255698e563ab143a94e703368e1e1d760a55b6dccb6bd72ffa7772be545bc6eae00d8dbfbad84d052efd04c5ae200b17140c3712ad17a748714e08b117eff4c4871b40fd4adfa7448bf06485abbb2e211df2b6badc7cce161b2103b86c92b9500faa7540bacbde95da78509e7a267a9665e9b0b00d99bbbc5c29a8d4143b582b547acfeb9bdc48f2adf81ca882827fe6b8881c873273da9fd5e940245523bc9abef5abf632a99bce609dc706b58d78bc425732205bce564b11483eb8bc5c56e9644b820f3acbaf83511bfe2e43e22a46b86d15935cfbadd5192107609dfe32366e567e1580371be65e408a3864cc3cfd60597149459ae35c54b4a575b5df49c5740bd2e77799ae9bdb6df5132643c74ecc17be2b77cf16d8f0573ffd7b0c478fa807200e3c4bc0803f0d0873bbcb2885c50b084b1e81bf2bf23dbb5058a106b01624864c5badec369569349d8cc9e1a2315826627735bb3c91c7e34899138be127d23f028eb9242ceecef0ce0364ffe51b4591e60c8c92f79719fcb1616d8ba151f1f4dc5dbf4fe469fd99c4bd66362b0b2b32289f115f54dc376d1244f092ef21c915c71cf83084f97775835433a3d5dfabfd5b5c01c257a2a1669cc0d963108cdff53793738438567b2a2f05d26faa9e225c55eb22ce46e99cf6338fb0e9c03482e6c99e9fa942c6cc04ebbb5d2b964debb02d7700193060c214689fd46e1880ae5dcc0bf9905d78258700f66072f61fb6528e262fd52c75ff0834b40b364a1a65c5b3393836f7f5114d8782a97ce0205bf6941a4e61d3fce8104d6b331592c845f95fd1a75c5e542e6b74542529045d93d942a5505c6a8079eaddc878079087ac7cd7d46ba91e8aef0306a7733961fe9a3d1a80427c57ade731a85d0a6a4495c03663e22e1b9300024dece735814708ae934a4ec61d13dde722d69b409d1e619208dc70c0c78e1cebe48b76785f35b98013b3acbfb93206ce694467470f878678f0926d5fe88f2afe9c6fed5209b4325326f5f3ffa43bf51fd7fdd6c3de3635772700451fda5777af07c0d6f13e498ce406a17c994ae55f6094c10326ec6f805b35a9325e32b82654ff0141ee7255f3f06062d3cfe17ccb56f5467feaade0260d51cfef29611366912600e9b849c9439456d2721aeb8e1536acd11531001a6e17a7432bbb7ee417476518debd9af786bed0b3fda52ed74a0b3c8cf178225bb695468dbfb5c37be9e0d9624fc36d57bdef0117955df0952e3f94e52ca3411e7fb77f53331b9d766f1a6896690b2091b2e24e4c72002b244c7e3d7b5c828df6015db7a1ac03c5ed028167b71c2bf9c927e666d84fe8ca53e0e883d2ae386f351194072418c8794683e0b270a4f4967777451ec9033ce411dfbfeaf2f8189685e25a628bbfd3e8eb438a022c786aef600b93dcfd269b2e186cc445787ac23b5a45d1b661e098f43df8334e00f971b51b865d7e22105e0eb04ec8b840203fca046aae4de7cdc07c15cba5f7191f51209afbd46fa2169c310f0870b6c39cf1b03edfa437961eb6de8f9a93731b1e7b7f40761a7a2cf4f2d572cead1773b65d7b908fbc7bc4de026e477375e62989931749ef5e7041d70c8ce7f7eed1265d93ab5def79d6c275c6a249ee92bdbd23378e3276143fdbee1df01a4ee766a69a144050738180da66ecef87a84694a8d7aca76f8486efafd7da2ecb88282e42901b965d0f6996094725dccc3f8b25c1a4c8dad71b2bc5c11b19e463f420432407de77046a8422fbd1666c4c6b20991b29786d10af64009fc43ad50b4187b5d5de3861933a3fde2c4402ac15a32a33eeed09d3062769ee9fcc3a17612ffd30c2dde83bd8f4d91bcbec9498c7b6d14afa5970e48fc679c3a154623e3c22dd7b68788d5e37c52500e081def094ecaa873b57103f6a0ecfc4bdb2ad3a0201913664848089205487c231f353ba01b9a236dc30fb84ede9928a6fee0f434446a66ac408f36efb95940214687c1b78d3683260f2f69acf64fdb9febdbf466299137b64e992652ac6f048c5033d28513597fa8f8f865eed320cd876610e85a0c57033c16d6ec0a8e07eb1d7ad2b7f8afb114e4486d108f5083bee74e8c2e8c1a8d09832d44ee180c2f46d513af719f778062907bd9c8031129b680eb536aeedf005bb03760abb1fe7803095fe5ddc96945e54b919d5edbfd995869a4022b0345e220ea67fcc097511c55190b31bda4ce97be52165568fc5b709e1facf10ffe66c406ff7af7760ba4857985cb5c87efaf60c5f117687543986de311c6916004c0e91e4dcbb483dbd6e600cd7d5dac20718e8d6a7b7262899abfe9f789d1b7bbff4bb9a0db38300d24f7b0dd14811b2eeebf1e8b81737da2bc7a0df036d84ee015c3118f150c1b43d663ad4a5379dc71f3fcc550d7d789c3bf96cdebcf919fdbc6a3d7e85acdd671708c19cb49f36f9e4eb30188d6c7c35284485467f98c963eeaa4fc7c1fd4ae8ee6b9d9e201b2abb9b6a259ac965c3b922efa7a588e470a58cf70b33c3edbd3985c0ca9f5ea922f40c780ca7e74e1db15b80c85885f02ec394f34fd9c57d1bfa12f7a771e1e10e0755d5dfbed06ea64cb15509dccf0f2dd77ef8f11dc38bf552712e876e8a7a29d091ee71f5bd02d20433c22e680a4968c013b356084f152ea64b0be16df77837ea11cbb246b3d1a405d42351f7a9447bc41acdebef05fc4a33f96b0c1a9fadc3fdcc1bc71ae82278482363f785a7cd46bffb34fa04011d8f01b753f6dbb6dd6409043da93d42b79a1d2f1f3959c2f8f6658e0f4a45f78df6cc1c6c8a5f8a2980a265a9e7dd82ca0a6690937a464476845b8859c02073ba8d648ad22550b98cfc91d207e53d5e1930d36615de89dd08aa5253c729b47acc5da4b2c830ec1b10334476fabac3d355fa0469a45aa3ecb971bf224f7f8b8b11631da09782657f2b73dbee248f36cae8da74ae43dc262f1b36781fa0a5f38b8a9950d9eb4d6041fca6d13cc749fc87dee40ee02a232c8d3069089d5c971ff3178d5dd9a64f77cacd24f14b073f51e109dc5fd60258088bb8dd326d01c2b1221b925e9a8656a973e6222e153533fc072ec4882a6b4e9766c7aeef040f721f5e86369f69d01673479095cc10d6f37d6bd4ae0bb42868b2f30bbabfc618e73fe9634b752974f9d07f894e0eaee4b84b5ddb7988434f911b3c47765a24bd2c6aeb3ef389bbc729b8cd5421404bd6e73cc41870afd6b2b72eaf4567667e68ea8db1da88cc04590be3a05fac5d2689bea2cc0d8c21f09117372367fe2615c8eb1e77e80451686fd4c10d9c537649c25c610bbbd7b5562cdc23eeba4d37a1a4ccd568ef99a96651b2e46a95f391417d796394b1fe103ebd4364f9feb76a3f02846e0a3a3cddf63e0c7f6f2546fd4253f5b79aef90c55d9339ffa49c1b5448743e9808b19f2654dd2dc0e73df731b289437154e6406484d4574c29ae7945bf1286e26b9d24848311faf2f13cb7fb907a53403817edefba594b7e8c29c34fafa827f01f5da4ee9453c5d323e858a01b2da35cd4eec42933bb3e55b90782f5cdcba9ede44c314acb8c819f33a906d59eb271d7769ac9fbb92ff20ff6282dd169219757be664adc316acd14cfa86b9438d11e4635d7797427d0546e90213965bfde05ccd07a59b535aa49a3ff08ca5b82b7ed0e6aa6a9eca82a792ca8af1365730fc92d81298c4396cf9475b231fe7e1e4d901ce4c2dcf0876f874b51fbcbf9198baea751d0e71914c1617f856db215407de95dc678d5ffade257c23b98fdb03d16f4daa09733891cf53a3161e8e36cf42e990b2bcb75864c1fbaac69ad5f6a96cb666983dbce94983f9d9f25b2d8a7f8931a16f43e7db9133d981996f118254de8df2a810f54f90b5bcd01b7d2cad0a2c104c75f3eb51ba34f2321b5005d703654d60ac71d75ffb067fe6304de19ad2c78e190852cf51c7ffe9b849b67e40ea1d31bda37afd3ad3230f3a7e4cd01040a5e3449ea06d0e53287385025ae9ddcabb60f0aa96bed93ea54b9ea85b97c37c3d9608140a67ee47d66dfff4ac22bececfd3ced38573bd1ed08dc1a08bca06c2de98681e06b0d39205beb776e18148d979b66a21539bebd326e83777e9402f3a63a5ae1025d8e55a5e79f7e1d974b3065cdd6ba3f16b0da0c99790d2a2f7aa218e0ac510ab4816f373be566a734c3c1261d4959c7deb905546a61b34fda0c35747658ca9415fc4e5ecf7b246f9aeec8d01a13d2368f6a47aa0628ccb3f5e414c78ecc77cd699ee56ed4faaa18aea0be6601c6b7749437e4495a366da8615db435a80fcb4b3e2cff7654034fa11421d0147c4fb381a45f32c1b419322a2fd45e505f24720b8ef7b79ec817ab6a5ca2b5d101e1e0ab5027dcd5864630e792f5c4f033de871357b2fb33ebb603349c833b2a98cff490ee20bb90a0d53279913eb8f4d6446eef2010c3dbfd5c803ccc98df64d66343d852842fa9214ca7e822fafc3faa0d43f665e07db70ef58d89c034c54b3358590d2bb996ee04583373df19f68a9e18641d8a24a62e88ec5eb6f5ca4678b15154da1e3864a56597a77e4d6edfa1d687ceb08dabdf871632fba95d9bd63a4aa8da82f604e4e6851819ac692eb54e5eaa0cedbfd6b357b0ce7d520d0f490874df2436f4899c49ec846216a1d2f9345bebae541f5999c62276e510b72ffce65a66d648d7d0ee3586ea275f0954a4a3dc8f77a0c8260cd96c7e80a63754fcf5c2ec74c35c250febdde5d44cbfbbc35e45570cc114eeed1caf1264fe349b725826063ad158c2d2b1aaeec432c44263cbb5e1ecef6966456c7a618b3048f07cb453e8edb6daf81855427b9f4b1faa5f1b2f8cf84226664a1e3b52e9f76f57ae88bcffe46e18b0b7a76903e8e2c173dc2ecadf863b45e165b6f2dc2c7ec3badb5d5c7b05a66559494db028d078d3c6c32c6e7cf1b64957be8e5d213e33d2e4f27844f366f12744a06dcbe38d7f6050ad57d1c7470c81549f35b0938c6d066c28a9f3ee3a9ce4fe4c8912b1f192cb4707d57bff24fbc5b23b549f5434ac7520a2503897a70c3825a2e2da2914226f98edf588926b757c8f86a5118fe501429d4f7e261033d7ad9be4f31ac343273e9cd51f5f6a588e049341b9147661a388949432502eae729c651fb9ffcb58dbfe2f0faf657efa4ebe04255f3bdb945e817c023a5994f928f3f11eeb2a3cd410424fa771cc7809a6a2f093fcc7ac2c18920d4513a5720107c76697e675c69d32f09060b1c41093c6e736bf965e3b1989dd2916760c66cb865d517f2c0fd904de516f9ae91ce2d83e48cd0fff64832dc4e312c6c3f542e214436fd0094d3d592e6feb1417a3117ef1d162d641cc558887e068eda6fb7988166b719d6f7d264a1093536c8a87481aa8511fe17f686963d4fa29615a3b3b37f98a2dafec0a73270aa90fce25715dc0d9f8888ae3fd8e275ad284e7b14c774bb4c52348129b3216bbdd226556cf7618609e33e4742182e6570a56b7dfe11311490482edfa2e50c7edd6013229986d83daad0a054bd00d573f82d407454c43a0fc20025a4fb497c11812a0dfac8c77a615222cbf262fd178d974b11e170dc1ca155a7b29a0bd0b4864b7a0cb031ee5d4d0595f84a12df77f5d15f2422138b549495e9db5b4bb259a9b5e8b040f15ec7732d30a0f71b7046fa4b6b26dc52c62ef145209c867e911ca83df00c2944b8ad3748590f5c334580a6f72e15b94cf66e1ad197094dc3e77c80712192782d63111aeb1d0a5440423b0032e1031489bc40780cb93a75b49633fa6cc62cf421d6f6c0d42976641050dffd5f1fb8836fdf2b4e817464b985fe59f32c45dc3100e02bbb915d9b5c88f42bc283441ce3cfa4f2d491977fc6f464587d1de50d7e752be0d837b24a563ae43c27e21856918b5c60644911a8d5c4d3474c4c2f5ae4a885af0986b49b21f2519673cf27b98626bd8f99c7b4c4653a0941c40b313a42986ed3523a31daff295701d2414a5a01c36fa185a0da60a8907c3af4ab986dad3d79419fe5b65dc97f070db25194c3574aed2405912db08a9ddc818ba48fd0d8a9d397858d67dcf0571ffe3d8abcf09bcf1b1ebc368b57f3938421291d5e4c292add463e18f6cd9a62f8ca18d8e106e2504c3e3befef24d77c85b2283d33b0127e7d506998a254577786c1c1339fc2857d082e1a345bd9d01430488925aed27b8d1e9a7e99f53206d3bfb3c6d6cd5dbc275b9caef9106700baeba157dcb68073eea006fc3929c674c6f0fa3f4c4fd3be4fbb58d94a3bcf09e767e31284aeea4b7c5e41d730fc9c7861e8a9f1176cf6abb5b71ebef3f0839238bcac9f8892778faf8360032105222ab5e7971647edee455d6c6924e77fea3ec144e9cf1ac481a2d5f88dc40024613723faf9372d7f0d463be5077da49547c1c2e87b3252549da0dab77dbeb97ec19ea699bb3e7632427a313d7f61c413a1c7f3e99377801f85a68e8038965a097651d3ae474d6e6782bf4f56e42d29a4707a5f82340204fb57845fec553277095c241d9afbbc029ae81c495f2705724ae147818feb66e017648b93f9e3d9c3e63fc9e2867d8a5c1f9f478dd88d2334a7216f3f7d99824d923aaee2b8a51714b68186833e639717e2b2eec986c7b16b79d4f49fec4848e18aff48d66f307c12504ac6be239eabef4cd7c8dbec1a89573e22986cdbaeba4335c16f5c812f61c5d7807a55a91933e8c24bb8c3e3775d7c5fa13d6eb7a55b78fc708b05b86befe230238ff73816c067844d1a37c35cf252e0031c06b80026361cbc60a1437f29ccf657c9b063cf92b80d5179ad5da937b8a4177bda0097dba3efb63a38a1a6e9516b0478aa8cad4686166cb8be0bc3cca9eeb2f350a9902a6c8aaf423fb696723b3d97eeb291264f38da41be11fd18bc9abc8e85ce26100d043e04bb115ca4681e867089731c2985d44660bfb4aefd6575f8e4effe3804b79c9c65df2a5833404a4679562c4e4148302778525f686cbaa0253f1100feef3782850f86616815f3d43c1b09965ef25691990f19381298781ddffe592ad75f61482b07119c144abb19d7fa6ec6bcad761ba58ae6ee32d403d8b88ae678b8a30abc88a3b2a78556a2fe3bddfe4968f3e29e709981ad96a818f00594fa8c407374050a62f86a85ddfd3e507fbe4da75e03e22ecefad8ce09b5e35f9d58d8e97b237d04edec2355c1ca564d5fe07bace7fd50245dc38c81c46e7e91e312dbcd08f5af9c7c361dc64fa42460d958550bee4d0c1c2238d8377a81a7759ae82ac75d37a6d7f3d9ac7384816f12f90d0f16487b0d275087e3c0ba5acdfa91673afd594d976cf11de0158d068d865f3166354b8128d0dc56168c91938f27b9753cdd11e06e46a64d9ef327f00521846dd4f2945c5a6ea11dfaaa1d2905d066f5d24e143fa93ecff390b0928995d9df7f9d73c68362cc5ac04651a03d62afef469049cc8bbe97d700cdaf2e94be7db275d6f7b5c28279232e9640b2a556adf8d1e553024a0f200eed20bd10f03efdf9b0bc59c95d0341193714d1dd0b83b6b61c89ac6856b840fe84ca43dd394efa0d00895ff317e9d5b57ac018086c58c3b8a7184e5df42714181a9d9794d97fc18dd140e455a3af1b5705d1bf4f2533d675e30ccce04ac743958da8458ea8efcf93f78bdb286f2f69d4b0766a234a11ca0355594d8f265d42d3c65a3d26d9b20ab53f31056a703d451c9ccdc56eebff96c2436d0e73b5e486efa953aa416f6b551537947e512adb7facab89cbe11a2c64a6135ee82bf74fd003ad29aa8f5aac87277d4bd14617bb9e85207054cd6df38bba917bbe95ad3d63213fd45ebd74493fedeffeb4aa14a845969a4c69dc7fbf7d0f3891f1ae01ed71cff2198fdf0f9313b1d5c8d91dcfe4a1d5d9b847d056f7f60588856e58fddfefab0f6fbe9fc80c21ef782242bb8c6fb1fed6b081e6736debe55de8459f6ff41a89534d977d13d4141c5b642ded51565cd04985dc7a562ebd5bbfb51a2468cefab27ff827b14cc9a8da692d78c489925ffb7c2b4d861c5558b901f0d9450ee3eb4d359f965d1234054f81c77fbc9971c6e1fd715aba5ef5ad43cb242db6d45a4ceac23521e6c88f7b6831f8f72a168c6c6bb03dc4b2744514cf2a43ad171f5aab3af897db23eb26c285b5e083c36e5f66c32879771e62c7a2dbc8b40137189482a1177c323427879a5255b52f59bdc71790f8862e6b2073f0c645e430c675b9ab0f455abca5e7c7b415b3b7fedd030b2a00c69f52a56f62a20deb61c62d66daca7de2602793125cc1b44fc63077d978f2f043a1f0160ee33fe7fd62c90565a9e2b5b4867ed6c446002423473b34d46bbbda7f30e8a0bc822a00962dd38531cf927bb65b423b5d7200d87d5b8fb5c152669f4d31b3f669d253f9f32ea84702802457c4eb2f674a98c62a0efc34b810c8e9ed7b3862a2d561b065baa0786c629aa2f8d9aedc1af49a5c00e8c890f45eebae737a2945255e65ca729ccb2e49237994715f3b27f45d865cc006a63b00e5661a7bbd7513750b37c12f0e6c0cd1a00eb2ac56d708d7087e80cff8dbe6ff0efce4bdfd61d2fee089191864215459be1729cfb4a588f24c5f4a83bdfd84a900faeda93dc62ad927ad23ce95a5e8dd78586c9ceec9a6222ea8c00a2b38b1b9048255d0d87b70266c101e7a867a051b5388ee843be74c474295fbf06d68fcfd611df45743b094fa002b3d49190aba28a4320da0c52286ec1d5901566ba7386b43d66adca8869ccf55e9f93484a4923a1ca42d36c05b09da90b696310da961415a635ef7253cc3ad00ef78d32c1bb3f8f38bc570c7fafac1c265844d8558032fe50f572eaf2a366b6b27aae00f100577212c9de3a23da21e259ef9c332cfdc2fab1bdb321aa460af0836ce3076de869586626e0e9a330857b1058233c781dfc751ed197bd9314853a1aadc7ba1dde6861c2fc047997e77fc5efdf344891adeb1ebe906036bdbbfdaee63aa88dc071e5366ee21a5ec6529fc4d30c4f538ce390877ed9499b4068cdf8e6c9f706d18159380ca96df5563a8ee58bf17d9d4a67bb45fc3a9d68e227fbf0d59f3852f1d2c47e396a215dfb926b1d898da9de4ba4ebc3f8a65157e89d3ba1e9b13d439c9e689b755115dcea10bb26ac8dd8d5cb600220086c1edb81117afb7018d64c3212c7507ffe58256f5e0c79729dba94bb3ee62b011b71eb9d46612854c4e0a7b28cb7426786ba4618265ac8da922a4830e40f72eb33e907318b5abf99e7cae180e4f1e5822ed7dec9c45059bdc01ffcc83976f07fe98c4de33e75e6a90e10092aa2f901422a5c035a50e587b7ed4e894ebfe5f461e5b7fd8374623916b95fa7085303b4e766b6255d45c036761ebb7ec231383ea3d36a085508fba4605a3189a0b170049ba933e3271e053fe084fffe81124ba4ff39505a616ca0656f8cc229d49793f375f40308a3a89ca09cd9510c1db5b8721bf99980368f475af5840230b24001272813fcc991f1323275777d1c975878245df4c3dfff0b81c9c940dc550e650ba310be83026468e888525e0d8bf17cfdfd38bb045ee21195d1b156694403f594d7de84d0eb07e5fbbb1e9b697b26cd0b6fb1b6ad308bc0bdeef4151a16f49408e9c7f37d2a9aab9507d74572ac8b5cdb1cd10e9608b232804a936471c11c6c92e1821adc986e159dbfbc3249c16f8502c4449f613ad28535b4edc5ef723f575bedac93e140bc0b13f2d15e73643630eb6cc6f859e42e1887214554cadb68df34b3afe1b4157de4dd6b80e07404e69214dc00172e4e565cfa26d24400f6bbe029d126d9523efd47c16fc364a3b9c193f4aee0e35881e07a913a0a5a9ef83538cd79c58df70b26ac78ba35c34d4f42ecb5d62a0a8c37565afc73c7029aba4ae42c3b14d967605371273ffb0e872064fbe2ec9e1604a40d04ec2e38ff09b5a9f2186f64251025ea51af3052ecb55f238301958a1a058753947dae790e6b03fb96d1d8f876316c8f7ec309d53a181ab717438a47e17d07a25aa47527635b9657ece3c643c8eb4fac53ac4814debfee5b26bbb593440641a33368bb5efa511b8e971ff328575849d677bc864d131e2e0b238960cd306855fc5d59378e3504ef09773585a5b6a2f3f92d4b0a43c2df4a6a52d89b38e5c5c9d972483077b4ecbeadc9a9770059037349fb4c585b16e5000681aa8d5aaea2e124c4f2259a96da7a53c3213b6879089d7acfce4058a38d37801a3a46848aec5f2bcca399fcd75fdbde772532e522b3c6540c998e4ad41518c6a2fc890ad6c0d3824c2f292624e776f7b0070a09aa3a02fc854122e4859a782c60eee727e8433581bbf4d40fdcd331db02c1f89e66122db449304ffee6ecd3e0f4a7452355bf5da9da3a8291efe6ca844facef44e0fe69f57a49a909b3ded792410c055c121cb26af130799d35f7f28217f0d76fb57a07a19639ddd1c29759d27235a40bdf6c59c243fa6f90e2c7d5daf7dc9efab5502810736045db8b27f0fc1d66e05c19ed54dc34238dd9a71d0348bd9120d2fd3aed6ddc057a5d93787997189836c54499ffe511e795b943acee8e8eb06d52c6d33407c46e28dd01a173e0e7f044c316da04953355f35bf2efb87cbab6aa3892a4cb5cf90420f79ab2037b83f44fa86e130a21d2fe9df42aa48246edb0a1fbf29853bb4538625923ea0f314300c6fe533f31e2a4b28f64d1e577b147f28531f20dd56d9ba7fef0a54d478136d799c680e0ee5db96911c6800bbd4b44382f67707d98fac1a8ec3c546db0a86851f3f10461ee98f513fe53eb5659e170471544506331d7d16fd05fa546bc8ea61ab1c7451e53b69063e8766221b9c350e6c72129419d4faaf3b6da1e74bff9e28f7518dd27fcb5bf0c0e7c5eaaea9cef1a9906b5d0e8f6a48cdeadc033d981af013ea4b07612f8d3bfb0ee40bbbf1166ba3e5cce3ecf41697e14f992d09b2b4fa917829bab4ea9744029436981c26800a6b1559fdae6c65d1ffc7e201d41e717128f3c190d838a2ea147d8b04f55e90f770d5a60d8be00e5d88467bc0eaaf804cd6c3852e30ff3fa12674233a8677e514dbdb179f4d2b756c53224215a327d7e47188b1e1ec41fd9dffcef4d8e9901a4797d8cdff478034cd48a31b9082b4f506a3f1467c3669287541f7c8c6d5f6ebc58a9179c90a07195bd440ebc31cc7ffc6924308c747a1202e51c4d118000d651ff63efa8f36d234359c88f3f536a5ebf4edf647425541fea56eda087d0811bdec4e23d9b7129cb73b0bed081f0cfcf43493996e3bc90670ebc76123aa0c17d302fbeb2aae81537ae5abacf369c7d435bffac7213c3c5a17698d12cdf01cf67fb9090e053cf0656ce288c1094f5f404453009e41e73f47eb4a565153a3089c9a4da4afa767f257ba4602795f6fee534324fc2d36cc77cba110af031aca3788201b24c4e1e83618b8d7293dd9ed29d0970a28963860718c5ac471658ae1849b53cdb39e3c58065ef8ea4c0d5e590c4f88db8bca64ff83f1772a964fa19ac6ab2d3c049a5330d0d2bbf060d66d8f83bacd995e6b3462583f4d402efe8727155626c05b173d2ae99091e7e31dcd3c62acb9363757e587928e6474d4314159205b939a32bf70a5ecf92149ed283ab788a1e15e7871533d9786698e6a5ac6dfaaaa12617d24ba15da1944c559f049da3dc305a8e2a0f423015eb7aca9d897c0fa10bb1c3b475daf1fe6491d516b1b829e240e89b250803efcc7ed4333fe9ade293116aae2efa135256fab55ded014963c6d26d4248c7fcfeeaece0ee0fdee43051062850ac560ba0b5c96c03c114bf4cfc00a8c19788ec7f4bd505decbb75739192c47bd6c89567a83c898877437fb316218d2cc303395723ae6776cd0508d1fe9bf32986a9a005354dfdff81a7929faefcc6fabbc1601d24996353c6eb49583db421900deecaed20769766a3cf69cb008ec9422f0cdb358a815228bb402ba1cd2a2db6c4f89bf29e03e657f88d187273e693fd4394f6693afe34856f0be72cf7615d78c89a4e87366c28793253dbe59d2b171142bba584d96d59c25fac001a438d83b26180766cb323a56e3195f72546b6230c4b1c18ccb8a2dba577e577b03308c7fa2b954973725f5dac5ac45f191308593ec01f0b04c57b49766f858dfb111b8161173bc3bc2c2a78a0837559ec975be38783530ff0b3ef4c93adfc2451558f2588d6634202406f0d20f0e27c8d303173206bb6bdbf54a7115587c7fe20610ac586448b89501d870434c7629916efb06b72ab37eaa9f5d30ad3ef40e0a1cf2752fa56b2227a79d73cd43679ff2d5a445a764252ccb88a89240ed8e63eb8ee88638c2a438259ae24853e808caf1d462263ea35f6efca7ad3f3a69a51d6652ad1afb522c5602fade2e59d59ed57cebaae8937ea1a75bda6fcb2b5b55be291f7a5afa250ff6bc736e819d01aad08d560ba0a5ec90c6c87a7f7c8934d30bec1293a0ad5d66f85deed76471e08a3ee99f7e38f4d36868ea380a8d9cc4a31d0a2c498ddda5eeb80cceab243a9211cafb3dfcb3206eeefb504e329806cdaa108e0b84bfe335a2afea49103b9c39aaa77e05507d60ac292afef5bb8b54fd4d1dd5f8bc653a8289e5ed8716f268d68b06b9b670497914ab855e32f528c629b2b804393038c0d686f0dd0896667d78f26298fd7cfb107a4fe81a8081ddcc5140e19e4e13b43e56836e8e7235dbfd55ad1ff4c4d688f0fe6005dc31cb038e70b259d327cfbc16b49dce05c141f4930b898e741d7a40b5bf2830f4b1de7e6e1eeed3f1998ff14630e74572c5ed4b86901ec3749910164e352f47063d5c34c4609cabef160d5f6702b2c537269e315d9e05aafd434a8ce084468157081634d80640677786bdf746d38c35ba57a3e7fb8ecb42003175710ff677bb96ddda2372c79147a5fccc138ee100ff903f1695dca83132daf277ea8562f381e7db5095a9c05f5db27b27c97abb78f4d25e211c2f699fdb1b978ba183d046ace775e6da67d79f0236b21652ddde5b1d67a886e799c5e17d2c525d4ac59b99edfb08ff460645e3f14ef6919b7b6bcc101155c6bb0340909ff44942772411e4908219866d170ede82dd6bac40ee5d52933066f4616e79450aa8e9a889c89656c3622ffb74daec0e39bebd9930c514549b216b6e2345c8ac606d37419fb03ba6d7d54daee12d045e77a6e154cb6d17a6e310a699fd13283f5714cf2236302199aad29b3d86ab9ac8249d5025af1e60781a426fd703e3820b310791f6304f621d2a1bf6fc8b896d854a78918c566f70bbd87e96a3d43f89ff9863cf66d5819bffa946a496ff6a600fd676d84b3d948db1c21c9485b1bfd2678b4c27e2bae7720019f8b678c7ba2a8dac974313e5c7f185d0ba85b8f90c8461a6b6a4be925af5b4d1caa9ae7e536c2d30cee7a5fe27eac742f60eddede4d3c90cdbddc173918a4afac56346732dd387381748d083d5c7752ba34afbfa8eda4e2841d7046f9825ab2fb5c70f4434606bd36107c07d57c486be0e9e2a69e8ed13813e83ef7f226bdae2f439b9dd994b52d8a60cf9945f05e96df0611754af94571ad2da3eb561cec8a517edcf6621152d47eae82f6f3739aae72e4b1d50e8ba3c22be4ba3e8b5a9a810f66e3d1fa883991d334cf3bb7f03b2fb7fa0a924f45f0297b150721381fc2b81fac4a5f3724832c8396f6ac3cd4e6cc9b7b851ae5107b318414c40de4fd97643f4ab096af048ad8814e7be1a1f21bbdf692b084a436ae087032265006ba3ac0058bb58f9b1002f9945602f440e33bc01b8d6c4c63361c5900ab22319d12d2899fed470dac93d963756a25556708a5d63d85e26b53372d7beef230f608d607d9c0691d741e49af8b8b4d696c806411f83cba09d4590e2e77a888a6ff3b6bafe3f404e5b47a97443dc3535169710a1a565d174e2336740a0b63a58a20d582877f01f72388559f1d7a9cb0705e29c55750b0a9bad0209505a36342dcff619d120cd4ff2f88bb8679377bbed2c4431c4c13c0e74ba48f3a76abce37fbff754a5ccc1ecd21861672e37ec47da6e282c2d9a679a075ca6277dfdd8d55437f8bfd7c3f2127c8fa5f0a1bb178786164a6b27251e007d8575ae418b35d49a362214ea624fb969fae5704e6f0f080c5fba54d65a00b14e4f2b945d716cd690b3bd9675a69d298b5ac7a09bd38bf084f85fa25955c7a045dfb0a898b116765696536b5c5437a814d54faa3742f5eb9820c1d716c92344d0274afa09a78a9b6570ffd0610e193186d9fbe4e8d69ad449969ec95b3e9b39bac1d7c9c52d5423e99ff16795651664e6e471c104df721641754f8db2e2cb42598fcbc0351fe4277605c25c3686bf373a76b7cf8b6b57894270ec498363951c1d0d54a4d7640b2900e09d2016295c2e9bb03b419b37f202e420d558af0eb84761da3549f0a5a77deb291823a1080577ecb9aa6458359e7a8e16b0c8d15c4cac2fcf71a8f105acedc5cc1768fb462e770e48826ce73c95b866194680c20df5749ea5fb1d40b496a59f5153c93e46b72196cbc089c7d1ace6d6050e6d02d3bc4d0657a00b0774b1f2b230f6af3bbc90eb82fc984c2cd0871327f7ff87913f221753b9b5a0231ed1ecb8020c98b569629ba3025b0d0b42f902ada5a854b4963a3b0f935c5bfd3cdf84e56291f6e60448f98fc321e7fb4a3b17b3dd3d1a00b82acf49ecb622bc7ce01dde7c36ac99b7fa460d291bf6f25cae9b7fdc09d995d92485b26bde76dccc6ecad3112ac22c7b1c6513299acd4b670f5929107478ebb1c2e2757bd011392092bc438c43a89b74268d882bcf8196bdf0a04d680417f6ef3e325257693419564169ed69b8626608a1832003b61a0757156ae9a9813f4060f9e350c9fa17a5419fdbe43bfd57d26d7c496b92bacc991001adb2c285489657c10604ba8df3495bb259cf6293a1b1ac31e37288597476a8497654d996cbecb85616a1d8f8d89988a4413b782b79679526633b64f6b1c4f0d553b23ba02221aaac1d6c99c46925a4a7cf9e0c73d830a97b31e8d073108cd5837aaa1d5a12acf2bcb8fe5a4b02ec4b27dc90f1cfb912b8ef41a764c554897a38a333e0657250180fec8a59b6ce8ef9ccea43a361cb3ab782e7f72c2e98339b1216c4e22778c4fe72e05b2737dd7fa581e9209387141bbef654a6612670f7f753cf8afb667222b9922be3b9c7839f785d525a728b4569f33b94a8352d3f23d9f432e96af3b14453a8835a5631744230e2e34faf7383ea2927b7cdff99f0df020491569ca8b674cc3c28f59b9214f4cbcb8e55ad27c078a557a755893a0a74a936e95a521c200543c0e0af0a5626d4a2ca2d6b75ba3ee9c1e51040b000a05007fd6a80ec2f7c5b0a2554d7e43cbd2959a3e5052b005644d914f6f26a51c5ab3010656d23a217f15f1bf08587a29da9d7a57a5249f54c8047153863f1df63adf08db16fa4581d2494a1f0a06f24bf0ec75a1c959638f001f5d8abd6a11cd82aa1eaa68f503b2910cd59399e3ce3b325e6cb36d2a45425f8bfb0977e03dfd99490c0d1e48619f000695fbdc81b3f9af289a3187d2fbdd4404d87a93b2c1bb2caf05883faf831fbcd450548402d25ae1269cf3fb9a5dc41b6349037e95e59665b612d0681c847d0636d2824a4e70d2d39f2eeb9d87b5f34d9e64e08fc16c4539db8c5b1cbc8661eec5f059d68d002fbe899717daaabb7988a54993f1d50620901228206233c13898b365098ebfca7f451c2edf1bced33261d809a73a42bb438b2f3c67d49bc9a07019b8780409fd18e712b371885de8d9cbe01b90b2e791ab7df5f643c92458527b0abf9179b91f4e8b1f400a20fa5b66b3ee6a8feb995db84040121c85ceeb10b7fbbefa495b67af923a0ef42de9cd7fa33ab8a8c6bebc46df6d9f115e16a6b18b47cfe2dd1ea326ab4e0033babab0d73ca8c9cec552485bc454ac3f89787c569c0895ff8056147ba1d6fff40b49a7815b39ae98218f9f32fe6bd55bf91634e17bcc87a71fdb1d7652afac8b9463a065829791434be3851d62763a0ae76ce6942805f330ea5d01323205c3544e647db765dc601c8d11469cbacf9dad537bcb27075a0f5e42c89824deb78e8f22cfdc38698c69c8f576ab907c9582525bb8c1527a46f8a740f0974fba6948a8194eeb3cbb4e3ddc39471f75a8ec63a99045a66b1e4b4aeadbc2d5c68b1be50dba698849025b935f735f7e74f8bfa81055c29049a6a28ac56d057f2ef23f962fe2656b5e3e38777dca2311ff0e0a7dc9dca39078ae54da6cf21373bfb6e19b7f7ad10a4a9caa266c4946756de3e0ff162ab04e861591545655984c2a5ec3712f5bdc463bb417de69e5a1716e6468249c20f659a1b3ce11347ce5e55f874863ca35614b91f3af4e89b4da60bd56579fe51a356bfafce1d8fbad66b98f4225107c9ed90a590805b7217f294a31f5b613123277f4d5c4c0b6ca3e9d98c699101c6eaf3398de90010061297c599d368d3da95d5837c9fe27452781b395b865d5ed361c0f28bd25879dfd4b5f97ab8ae379ab30def0440c19b09b73e9f20ab38e4cc0cd16a6749e5751cda003f5d3c08dada5bb028f876fe925626f0188866e63afd109839e8a614a57810f079b447d67cabdd5ee85a879ed12baa0fb8cfe6823b251ce0d7b978daf0741bec4b246d2b0c6101457da3018e976486cb07310ee37528aa17661180cbaae4fd40b70753b135853710bdd2dc8e3cba7376b57de24c3242c878d02bc597c53a336c844bd68031ecf15acb31d8049618eaa7e87a62ba072d9b400ef3259ef1e54862082a6a420928c1272374676aa2f4445fef58979707a314efe1372ea2d0974c7d313bfbeb6ee80316ea2187baa42f4b242ec2c02029d9fee18ab6e2f7453f8b720d7de8b53400a26c7a808216974b05743258b11c8bada558f2e9b2a76ce058f767078d41865883b9e974bcfbefa9ea33d058cb7419b368f4c9e1b55d6441f769e3e056a12ee44660eea1e42ccb91552bb3b43f5430d616ec0f34a876039404361303370a922c51ca97cb8f380f22400d7d72801152b6cde130fd5963f6b72fc0faff8fb7c01bd8719ad3651b3a99bff59dbf2d88500604f3de7899fad3635fe662e5945c1d478fd44e5ce2e06dab4a0057115fd96d8b1ef6115878c764bb42a63458fb6b5f4c13af7ab5c45e5416bea08ad4ae3d9198b760f0b3f4f50a1473a1f25d13cfb8959452eb5c8bbc849f9163520693d06e5a7f9e983700fd8e1a8a99686bd870494e6a4fb09cf2342980d546c280f622cbf6a985c63ea3bd970dabf9bc03ae322bfde674100fc797b810efcbd53ebc8259292860c4bc823e11bcef5b05455eaa565d676d6e6dab96d322bd75d8453668dab558d107e0ba3f8b99a48f4409abd25efd4d5974b07c8dd85ad14ec49b1e475d1cdd440c86099f286454e897307f6c2b68a9e097300184b273f1241efa790321c03398f98b33b62d643014f6f7e06af809f5d99f354f368b82fce8b86ded820afb8a4acc29dd2d3548767f353b3f23ac30429e1dbe74e06bd6171cf56fb0ffccd4bb8a49f2441d37da43dc7dc8a169c1cbb33e6b3e153723646cf2f9a612672cfe21405dccddc0e7e1855416ce8d526e059732dba85a2b317ded0247b1317e87dfe9893fd0741aecdd3840ed2e0657587ec3c925b283dbe0b73d3bddc13ca15605ae501887d05171088c9b61b42fbfde4e931eb0be1b2f06a2cf0315ea6ee04e15882dd09f518349f9b60b7061d4bddbbee07360fe256fd0628053124aa922cf40520dd4561be62fc0213b51774c9f305a4d0834e42da57e76bcc7cad44501a7a6d82f952aefcd84f7c099c4e648af63927b31a25f7bdf1b8acd03f4fb5e11ba847e34c2de7ab26c3211793a2dd5250e0053fcf7807f3c62225f2ac764927474e21b5b60ffe1067f58d13d07eb4202eda227a9e9924e7602f6c1170c9723f9e73db21e12f7f567255c54aec3f75b510b3183312e59608bffc02bc050f58312083e4ab2ef5a401f7cf6471aae40172db163454960a6eee5c712d509d899fdac8293bbaca7c4aa5f43e6d46cf8879f4b70e87729ca35ae2551fcd9bc078a283af8b1b26a15e7331b9ef8c328819893c5bab93003c36aca769ffc01271b49082721f5d6799c208b05f7b6c30b2fc951b3c22d337cfe01a280bdbb178be376cc895b281df80c70a1c9210a7ca5ea532c4976f3a8791f72eb26d1c56ccd33cff1e09a4d8ed69b42b944604cd9153d9fb405c58688dd2c70c5159ad184369395b23c31c0f52a5d31bbfeda597f6560dd95d397f0a0e7a08953cd4d023414f1dc067649ef59fbdfd6677f90615828d911be5c051d93575eb08f5dd88c3f286e803e116e158686ef426d4622dbaead05943d5716bca8545cc5215e878b39c1a084eae62b7e14727186c718b35a5cbebee675524339d504971a8b98a85a92634491cfe22f6055fa43c7a60a75b90bb1b7567c4eabdadf358750d36c6b9aba19047701f33f393ae7090d4c14b4119d18ce1724c4032cd5453cccfc780d3ab878f006d2231f9cfcd91ccb08484f318e2f10fc96c884bd8f0a08aa2e2279a475d39fa8a186911d5970647409ec45550c8842b7fc3b5037a0d899d041568cf9d88b005ec087c5dc6d90bc10f9d229ce7dc2b3b4b28ccdb1c5c8f9bab70e4103650804609812aa2fca8b570d89afdbf23f49621321d2df360bbd50c7b01b3b804bf3d8dd17118a7ca2b98605d2320dca71bf52399aa844db0d1b41cdb1394e009a99ccbadb74ebae6a2dda7dc6d48fc2c0a95738838614cecd767e86a3a2dd38acfdd93a65340b8bd7b450df29d2d3421822b9cd6833a4903c0eabe4a96bb82281b96ad5b5b21194a18622106b11a62d68ca573d242e9f7b15a30e62a9595b68064a755c0111780f18811aeaa28d9614bef327d5a41c742b7c67871926f75974d76e881968ce2b400a851a00057cc8c30549313fcdd82a64c1db6532fc3e06e7f1ad285d68c7d5a77a3ef458eef0df70374952e86a506bdf5cf207a6d4e6145c554e803f245e4ffca8e1ed285ac7203dc0572cc791d150b4d61756581c8f443ee7d6cce7f5b0d6f978c9e7187a87208db2da920a4a9737f1e04182d2ac9b282dac7ea9847eadf026fd57deb4bccea50db2823ef99b8cd6f33c89404cb6eab188287dfa4916c05bddf1a606b2e21e306fa006d19394e0363e009088c987fe8c5f80dd753f311ac30415d5efc983e431e737731e1b9f7d84b1002c114d1fc8f6efca2d9b1417fff3ba578f015a1f8ffa953345019393f0c94ac3c9a3ef92b989470b5d861fe3cb17e188a9a4a8de9921977b5dfe2334735c48977fd5dabf9f702d1efcd5cf191f6f06cf8fc7263709e03a9f39d93f3672dfeb9a30a3d83cde717e93dbc8aada53c31f76dfa9444a3607d35f1e75e4e043e1e3ce0982876cead3b436dfa73151c20c6b92390c32a0125d4d623b2a1a26a13c3c107229631091e5a327683741c9ad440d361e907c78308595c4e592d00199030064fd43768331174534140a4613b2fae673def970031bbd174ed6233658460a7833f5d0d11bd639a51c33dee3fbf98338523148824e1410ef0cadd7c958c98060fdd32acd214c11ba2917879a69ee23d0253bcc7254ce50e99fc827531e9017398f32f592bab83ed3bdd7f28d00fc89900d49a78830526c1d271cb99074d74a8b3a8c30c44180f36c3b5f7478a327f37d411affd095fd12ad910c1499123503bc151a3d2486564e4ff28aa0515b4dbb9ced1af98d0c6c66967f77e33c96eeda7cdde165c341d31b8364efc34f3e5c07c6f1233fb0fd5668626e6b49155385f769805b87f77312da45b6a9fe654fdc9c171af1efa72bd0cba71f01a868a291770f4eea920b2309783abdbe5e7c1513e7fe70ad8837d3c9a7c44a3c81bfb702de66eb75d21179858c88b13b40d2b1a3c0a4264a89bd9dcb35958c8a4a3d2e02a1ed55015396f9efc98892d4013e16fa682357fd4c212c088f41feaaf891777f3d8706ea6bfbc0ea841569b20d5e01e00cd8de33b4bae563ff053e838b19ec0eced7245a6e94784802e85d4997d875e485e7bec6dce491c2073098e8d9006fcc3c56d750479cc5006d434d747761c8d296e00ef291c96bb92e5822890ce19c7bd8d1cae170ad8baaa5fd6a570ab52ab6bb844e02b276d7f69961b95d44ab95730ab30887977775b8a329c422d1043ef630ab1d154b3e09b976e08651e2eefc3dcd9c88d02e62f68b6492ad533a9b25467f32cd035c5b832b73fc5cbd27cd72d32fdc2cf4e5c770b72b107fef4c09c1b62763510916f3c3ff29414e8d76150a33c354e0eaf237053e2ce7081645e74cb8cc61b38bb93849527569f18e8953e4b55bda71cec3a6d944d80f07fa69a4ebf3c6cdcbab137669dea4a231a073577af78258b0310ba08928e4a5dc5f4e816922333b80637529f8b9ee517a3c9e663d0693f2c8a38006f789e2658113ffdc223613aeaef1a0dc852a93996da88cc0394fea3a9de67a204f8ea12e65c51f83c49bcbb24fc80843e818001bcdf65f247e56c7f460cf243722c4fd5d54577994ad99157e47", + // missedIndexes + hex"00000000000000000000000000010000000000000000000000000000000100000000010000010100000101000100010101000101000101000100000101000000000100000000000000000101000100010100000001000101010000000001000000010100000001010101000000000001010000010000010000000001000000010000000000000100010000000000000000000000000000000101010000000000000000000000000100000000000000000000000000000000010001000000010100010001000000000100010000010100010100010000010000000100000101010100000000000100000000010100000000000100000000000000000000000100000000000100000100000000000000010000000100000001000101010000000000000000010000000000000100000000000100010000000000000001000001000101000000010000010101000000000000000100000000010000010001000000000001000100000001000000010000000000010101010001000000010001000000000000000000000100010101000001010100010000010000010100000000010100000000010001000000000000000100000100000000010000000100000000010100000001000000000000010000000000000101000000010000000000000000000000000000010001010000000000010000000001010000010100000000010100000000010001010101010101000000000100000100000101000000010001010100000000000100010000000100010101010000000001000000010000000101000001000000010100000000010000010000000100010000000000000100010100000000000101010000000100010001000101010101000000000001000001000101000000010000000000000001000000010000000100000101000100000001010000010000000100000000000000000000000001000001010000000100000000000000000001000000000100000000000000010001010000010000000000000001000000000000010100010000000000000101000001000101010000000000000100000000000000000001000000000000010101000000000000000100010001000001000101000000000100000000010100000101000100010001000000000001010000000100000000000100000100010000000000000000000001000100000000000000000100000100010000000100000100010000010101010001010000010000010000000001000100000100000100010000010000010001000101000100000101000100010001000000010000010100000001010000010000000000000001000000000000000001000001010001000100010001000000000001010000000001000100" + ); + } +} diff --git a/test/MathTester.t.sol b/test/MathTester.t.sol index 4bc58e9..46fa1f6 100644 --- a/test/MathTester.t.sol +++ b/test/MathTester.t.sol @@ -22,10 +22,44 @@ contract MathTesterTest is Test { points = abi.decode(data, (Point[])); } + function test_single() public view { + uint256 len = points.length - 1; + for (uint256 i; i < len;) { + (uint256 x_p, uint256 y_p, uint256 z_p) = math.mulSingleProjective( + uint256(points[i].x), + uint256(points[i].y), + uint256(points[i].k) + ); + (x_p, y_p) = math.toAffineProjective(x_p, y_p, z_p); + + (uint256 x_g, uint256 y_g, uint256 z_g) = math.mulSingleGhost( + uint256(points[i].x), + uint256(points[i].y), + uint256(points[i].k) + ); + (x_g, y_g) = math.toAffineGhost(x_g, y_g, z_g); + + (uint256 x_j, uint256 y_j) = math.mulSingleEc( + uint256(points[i].x), + uint256(points[i].y), + uint256(points[i].k) + ); + + assertEq(x_p, x_j); + assertEq(x_p, x_g); + assertEq(y_p, y_j); + assertEq(y_p, y_g); + assertEq(math.isOnCurve(x_p, y_p), true); + assertEq(math.isOnCurveGhost(x_p, y_p), true); + + unchecked { ++i; } + } + } + function test_quartet() public view { uint256 len = points.length - 3; for (uint256 i; i < len;) { - (uint256 x_p, uint256 y_p, uint256 z_p) = math.mulProjectiveQuartet( + (uint256 x_p, uint256 y_p, uint256 z_p) = math.mulQuartetProjective( uint256(points[i].x), uint256(points[i].y), uint256(points[i].k), @@ -41,7 +75,7 @@ contract MathTesterTest is Test { ); (x_p, y_p) = math.toAffineProjective(x_p, y_p, z_p); - (uint256 x_j, uint256 y_j) = math.mulEcQuartet( + (uint256 x_j, uint256 y_j) = math.mulQuartetEc( uint256(points[i].x), uint256(points[i].y), uint256(points[i].k), @@ -59,6 +93,7 @@ contract MathTesterTest is Test { assertEq(x_p, x_j); assertEq(y_p, y_j); assertEq(math.isOnCurve(x_p, y_p), true); + assertEq(math.isOnCurveGhost(x_p, y_p), true); unchecked { ++i; } } @@ -67,7 +102,7 @@ contract MathTesterTest is Test { function test_pair() public view { uint256 len = points.length - 1; for (uint256 i; i < len;) { - (uint256 x_p, uint256 y_p, uint256 z_p) = math.mulProjectivePair( + (uint256 x_p, uint256 y_p, uint256 z_p) = math.mulPairProjective( uint256(points[i].x), uint256(points[i].y), uint256(points[i].k), @@ -77,7 +112,17 @@ contract MathTesterTest is Test { ); (x_p, y_p) = math.toAffineProjective(x_p, y_p, z_p); - (uint256 x_j, uint256 y_j) = math.mulEcPair( + (uint256 x_g, uint256 y_g, uint256 z_g) = math.mulPairGhost( + uint256(points[i].x), + uint256(points[i].y), + uint256(points[i].k), + uint256(points[i+1].x), + uint256(points[i+1].y), + uint256(points[i+1].k) + ); + (x_g, y_g) = math.toAffineGhost(x_g, y_g, z_g); + + (uint256 x_j, uint256 y_j) = math.mulPairEc( uint256(points[i].x), uint256(points[i].y), uint256(points[i].k), @@ -87,8 +132,11 @@ contract MathTesterTest is Test { ); assertEq(x_p, x_j); + assertEq(x_p, x_g); assertEq(y_p, y_j); + assertEq(y_p, y_g); assertEq(math.isOnCurve(x_p, y_p), true); + assertEq(math.isOnCurveGhost(x_p, y_p), true); unchecked { ++i; } } @@ -97,7 +145,7 @@ contract MathTesterTest is Test { function test_triplet() public view { uint256 len = points.length - 2; for (uint256 i; i < len;) { - (uint256 x_p, uint256 y_p, uint256 z_p) = math.mulProjectiveTriplet( + (uint256 x_p, uint256 y_p, uint256 z_p) = math.mulTripletProjective( uint256(points[i].x), uint256(points[i].y), uint256(points[i].k), @@ -110,7 +158,7 @@ contract MathTesterTest is Test { ); (x_p, y_p) = math.toAffineProjective(x_p, y_p, z_p); - (uint256 x_j, uint256 y_j) = math.mulEcTriplet( + (uint256 x_j, uint256 y_j) = math.mulTripletEc( uint256(points[i].x), uint256(points[i].y), uint256(points[i].k), @@ -125,6 +173,7 @@ contract MathTesterTest is Test { assertEq(x_p, x_j); assertEq(y_p, y_j); assertEq(math.isOnCurve(x_p, y_p), true); + assertEq(math.isOnCurveGhost(x_p, y_p), true); unchecked { ++i; } } @@ -141,6 +190,14 @@ contract MathTesterTest is Test { ); (x_p, y_p) = math.toAffineProjective(x_p, y_p, z_p); + (uint256 x_g, uint256 y_g, uint256 z_g) = math.addGhost( + uint256(points[i].x), + uint256(points[i].y), + uint256(points[i+1].x), + uint256(points[i+1].y) + ); + (x_g, y_g) = math.toAffineGhost(x_g, y_g, z_g); + (uint256 x_j, uint256 y_j, uint256 z_j) = math.addJacobian( uint256(points[i].x), uint256(points[i].y), @@ -150,8 +207,11 @@ contract MathTesterTest is Test { (x_j, y_j) = math.toAffineJacobian(x_j, y_j, z_j); assertEq(x_p, x_j); + assertEq(x_p, x_g); assertEq(y_p, y_j); + assertEq(y_p, y_g); assertEq(math.isOnCurve(x_p, y_p), true); + assertEq(math.isOnCurveGhost(x_p, y_p), true); unchecked { ++i; } } @@ -160,7 +220,7 @@ contract MathTesterTest is Test { function test_mixedAddition() public view { uint256 len = points.length - 1; for (uint256 i; i < len;) { - (uint256 x_p, uint256 y_p, uint256 z_p) = math.addProjectiveMixed( + (uint256 x_p, uint256 y_p, uint256 z_p) = math.addMixedProjective( uint256(points[i].x), uint256(points[i].y), uint256(points[i+1].x), @@ -168,6 +228,14 @@ contract MathTesterTest is Test { ); (x_p, y_p) = math.toAffineProjective(x_p, y_p, z_p); + (uint256 x_g, uint256 y_g, uint256 z_g) = math.addMixedGhost( + uint256(points[i].x), + uint256(points[i].y), + uint256(points[i+1].x), + uint256(points[i+1].y) + ); + (x_g, y_g) = math.toAffineGhost(x_g, y_g, z_g); + (uint256 x_j, uint256 y_j, uint256 z_j) = math.addJacobian( uint256(points[i].x), uint256(points[i].y), @@ -179,6 +247,7 @@ contract MathTesterTest is Test { assertEq(x_p, x_j); assertEq(y_p, y_j); assertEq(math.isOnCurve(x_p, y_p), true); + assertEq(math.isOnCurveGhost(x_p, y_p), true); unchecked { ++i; } } @@ -193,6 +262,12 @@ contract MathTesterTest is Test { ); (x_p, y_p) = math.toAffineProjective(x_p, y_p, z_p); + (uint256 x_g, uint256 y_g, uint256 z_g) = math.doubleGhost( + uint256(points[i].x), + uint256(points[i].y) + ); + (x_g, y_g) = math.toAffineProjective(x_g, y_g, z_g); + (uint256 x_j, uint256 y_j, uint256 z_j) = math.doubleJacobian( uint256(points[i].x), uint256(points[i].y) @@ -200,8 +275,11 @@ contract MathTesterTest is Test { (x_j, y_j) = math.toAffineJacobian(x_j, y_j, z_j); assertEq(x_p, x_j); + assertEq(x_p, x_g); assertEq(y_p, y_j); + assertEq(y_p, y_g); assertEq(math.isOnCurve(x_p, y_p), true); + assertEq(math.isOnCurveGhost(x_p, y_p), true); unchecked { ++i; } }