From 4aca2f5e35c7f62b01f6260b4838339a26a24c70 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Wed, 20 Mar 2024 19:01:06 -0300 Subject: [PATCH] chore: Remove unused isInternal flag in contract classes --- .../kv_archiver_store/contract_class_store.ts | 7 +-- .../__snapshots__/contract_class.test.ts.snap | 44 ------------------- .../src/contract/artifact_hash.test.ts | 2 +- .../src/contract/contract_class.test.ts | 25 ++++++++--- .../src/contract/contract_class.ts | 2 - .../src/contract/contract_class_id.test.ts | 2 - ...te_function_broadcasted_event.test.ts.snap | 1 - .../private_function_broadcasted_event.ts | 3 -- .../src/contract/private_function.test.ts | 4 +- .../src/contract/public_bytecode.ts | 3 +- .../circuits.js/src/tests/factories.ts | 3 -- .../src/noir_test_gen.test.ts | 6 +-- .../types/src/contracts/contract_class.ts | 11 ----- 13 files changed, 28 insertions(+), 85 deletions(-) delete mode 100644 yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts index f446372b021..0d17369dcd6 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts @@ -68,9 +68,7 @@ function serializeContractClassPublic(contractClass: Omit - serializeToBuffer(f.selector, f.bytecode.length, f.bytecode, f.isInternal), - ) ?? [], + contractClass.publicFunctions?.map(f => serializeToBuffer(f.selector, f.bytecode.length, f.bytecode)) ?? [], contractClass.privateFunctions.length, contractClass.privateFunctions.map(serializePrivateFunction), contractClass.unconstrainedFunctions.length, @@ -85,7 +83,6 @@ function serializePrivateFunction(fn: ExecutablePrivateFunctionWithMembershipPro return serializeToBuffer( fn.selector, fn.vkHash, - fn.isInternal, fn.bytecode.length, fn.bytecode, fn.functionMetadataHash, @@ -120,7 +117,6 @@ function deserializeContractClassPublic(buffer: Buffer): Omit ({ selector: reader.readObject(FunctionSelector), bytecode: reader.readBuffer(), - isInternal: reader.readBoolean(), }), }), privateFunctions: reader.readVector({ fromBuffer: deserializePrivateFunction }), @@ -135,7 +131,6 @@ function deserializePrivateFunction(buffer: Buffer | BufferReader): ExecutablePr return { selector: reader.readObject(FunctionSelector), vkHash: reader.readObject(Fr), - isInternal: reader.readBoolean(), bytecode: reader.readBuffer(), functionMetadataHash: reader.readObject(Fr), artifactMetadataHash: reader.readObject(Fr), diff --git a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap deleted file mode 100644 index 3b6fb55754f..00000000000 --- a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ContractClass creates a contract class from a contract compilation artifact 1`] = ` -"{ - "version": 1, - "artifactHash": "0x0000000000000000000000000000000000000000000000000000000000001234", - "publicFunctions": [ - { - "selector": { - "value": 2381782501 - }, - "bytecode": "0x1f8b08000000000000ffed9d09941545bee6b38a62d16b95b82bb8948a82acb72ec58e50b8e0ae08222020140508c84eb183b28328822cb243b1ef8be0d26def76b7bda96d2f6adbfdba5f77bff7fabd7ef3ce9cf3e6cc3b33f366c69e8c7be33ff511449675cb8cf2bb12794ed48dfc2a32e3175f46462e9199911764a6bf86214fc71b84a14570fe24ff2fd3bfc92f3695c4b8aea44bcebc1ce1cccf11ce0639c25990239c0d7384b3518e7036ce11ce2639c279518e705e9c239c891ce1bc2447380b7384b32847382fcd11cea639c279598e705e9e239c57e408e79539c279558e705e9d239cd7e408e7b539c2795d8e7036cb11cee639c2797d8e70de90239c37e608e74d39c2599c239c37e708e72d39c2796b8c9c6d8053eed9dfa67f6fd7bf2df56f2bfd7b87fe6dad7fdbe83216e8f9b661681786f661e860fc4f19a36edca7c2d0d1f85f69183a85a17318bae8ff15ebff750d43b730740f438f30f40cc39d61e81586deda8f3e61b82b0c7787e19e30dc1b86be61b82f0cf787e181303c188687c2f070181e09c3a361782c0cfdc2f07818fa876140189e08c3c0303c19864106cbe0300c09c35361181a866161181e86a7c330220c23c3501e865161a808c3e8308c09c3d8303c13867161181f86096178360c13c330290c93c330250c53c3302d0cd3c330230c95619819865961986d7836270c73c3302f0cf30dce0561581886e7c2f07c1816856171189684616918968561791856846165185685e18530ac0ec38b6178290c6bc2f07218d686615d185e09c3fa306c08c3c6306c0ac3ab61d81c862d61d81a866d61d8ae596447d811869d61d81586dd61a80ac39e30ec0dc3be30ec0fc381301c0cc3a1301c0ec391301c0dc3b1301c0fc389309c0cc3a9309c0ec36b61381386b361783d0c6f84e1cd30bc1586af85e1eb61783b0cdf08c337c3f0ad307c3b0cdf09c377c3f0bd30bc1386ef87e10761f86118de0dc38fc2f0e330fc240c3f0dc3cf0ccfdf0bc3fb61f8200c3fd7da87faf717faf797faf757faf7d7faf723fdfbb1fefd44fffe46ff7eaa7f7fab7f7fa77fff4efffe5efffe41fffebdfefda3fefd93fefdb3fefd07fdfb8ffaf79ff4ef5ff4ef3febdf7fd1bfaa1f6f75f34cbc49503d950531b539a563cad57d7c31d3ec27547d500df4ffe4b758eb057a5e7ef3b4de50cf3734f4467abe91b19e267abe89a117e9f922436faae79b1afae57afe7243bf52cf5f69e837ebf99b414fe8ff650a96f9515a032de58126f52f1fb4865a6b005a23591d688db5d61034d9be8d40bb486b8d41bb586b4d404b68ed22d02ed1dac5a0156a2d015a91d62e01ed52ad1582d6546b45a05da6b54b41bb5c6b4d41bb426b978176a5d62e07ed2aad5d01dad55abb12b46bb4761568d76aed6ad0aed3da35a035d3dab5a0e95d2cb80eb4ebb5d60cb41bb4d61cb41bb5763d683769ed06d08ab5762368376bed26d06ed15a3168b76aed66d05a68ed16d0e45ce156ada97a266d5f7a19ade783769becdfa0dd2efb36682d65bf06ad95ecd3a0dd01798bd65af671d0da684deab8fa5f671d2f0be26adf52156abd5de25e6fb866b5de6ef1af37a9dacbee41b5d765904f17f0aa878ec7f83c4309e69da783e4237a01c4ef83b4924efc90764ad855dbd355c77bd4b05c6763b92248d3d552feb220def2773378ba19cc6a9bf4048ef8eb6cc7a4afb3b59eb2aeb30321ad59f7e498f955acb30f0287833a5beaeb6cada7aceb6c05a435eb9e9cbf7d15ebec60e0705067bbbaa9b3a9a4afb3997b264160af7b722df155acb3638123fe3adbc9d7d9da4f59d7d9e721ad59f7e4baf6ab58672b8123fe3adba5ab3f37a8f594759d5d0369cdba27f758be8a7576097038a8b315be9dadf594759ddd0e69cdba27f7fbbe8a75761d70c45f67bb39aab31d7d9d0d32fd5f4160af7b72eff9ab5867770147fc75b6c2df9fadfd94759d7d0bd29a754ffa41be8a75f6b88eab7e860f753fc3f5a0fd426b3780f64baddd08daafb4761368bf86fe42d13e92be44d03ed6da2da07da2b55b41fb8dd1f7aab44fb5761b68bfd5daeda0fd4e6b2d41fb3badb502edf75abb03b43f68ad35687fafb536a0fd516b6d41fb93d6da81f667adb507ed1fb4d601b47fd45a12b47fd25a09687fd15a0ab47fd65a47d0fe456ba5a0fd556b9db4a6fa29a5efeb5dad3501aeb220be3a9a000f64ca33e6cb20dec12d4fb2087830af92f8f3eaa8ca7ecec3569f53f612e04939287b02f2a80d4f0a783ac6cf937ec7af34fef5a6b771d2f034017925a15c9d1c942b0ff29275cbbce457041aeed39d2c8cb19f6784175e799097ac5be63b03a368d8c6489b2bfb8f3ac6fc2bf03ad897d2e719929fbcbb2c1c25a04b9ae2e6d56cff556b85f07f6c6f3b1a9aa37a99ae179297ac5be64b8151cad3b1fe1953b5654c198caeda883cc84bd6edf3aede0e126f0f3c5d1df1986d9ae4ddb51ef2ee6ce45d62e48d6da74c351ddb3a03b383ebad922fe37a0bcf1f18aeb72ecbab4e6b5e37493b9cedf556276339c6ebad4679d51c0ef687741de86a70c87c0978d72dc2bbaee09da4b90dbc7370ee99f6ae8bc123f329e09176ac1478dad7334f7b82bcf11c56b61b5e4be17980abedd5de609479dbf6ea0c8c290ba38373c2544dc7c81260140def47251d7916b55d932479bbb8aec47729e4dcdcbcb6298034ff273ff3abdaca76794ed95278ee2c536daf79e3df4ea924ee1fb5e171bc0f9538aa8f49bc7ff359106f5d33db25b3bd89bac7e3aa2d4f1a3c322ff97966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563cd29f80cf6d49ba8e248ce6f36faeeef3a7bf8522ebd2bfaa5fe7dbd0af137fbf452a897d7ff21c444ba3cc0590e6c3bceab4efe8b87ae640faa9f0592bf3f92b977d76f83c6619cc4b7ef8ac156e4b86e79d8a63cb3bf35d1a17fd6d9706996fea98cf7e76b478eae2f967f434cff0149f03bfc3e051f5f46ff9d56c2efafeb2ed8b44af241e67df5e5160afebf16f97d4397dd6f9c1b9ed071e675c3dbf236db5f4977735f22e80347f80e7a8e4d92a196728692c87cffdc8ba659996a07733d6dd542f2b1c0d8df597c2b292e64fd0a62e83baeaa0ad4c65fbec3af69bc77f1ccef4e327b3e0690f3c2eda1947e71b49dc07e2eec7379f4fb39dc7481a7cb6cfc17395353eef24f97966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563c665f2bbe5f5b42c2289ae3671fd2fd19adf4ba64fdaa5f677a7e75beaefbe1a4cfa99551667c77f46c7e75da593a5e189cffbc43d4b674f57d8aa86d29f9e1b767da038f8b7edd3cc84bd6ddc1e285c48b63cb3bd38f1fbfc7d5fdf849c3d7128ba7aef657ec63454f717f4d193cd8371af56d9f0e86e6681fafb15e487eb82f75004de2f87eb48bed8cc712f3b91ec90ffbaf5fd6de360d5c6dfb54d265bb81df4d290bceafdff83d950dd0f66dd2717c86039f1dd96ff9bf4c35f5538b7faacc3de32f737afbde099c65900fe6dd0b5863cabb04f3ced341f211bd00e2fbf2abd34a3af143bc1676b58fc8376090dd5c2e652c5704697a58ca5f16c45bfe9e064f4f83596d932d50cff6c3f1df559bd423c2a396e091a4c1f32057cfe4996da4f97c233eb7d7c84883e72c92e638b451aa2cb6e7476dcf1cba3a8e453d73683b376e0f8c6619cde73c2ff4e7b4be09ed45dccf697d13ea103ea71518eb6f05eb17ae4641f4b145d27cd758bf794e2ecbe0736092e6fbd05efc471dcec9bfaceb2bdb39392e175576c58cdf412b8b9119eb04b2e07982a479dfd866dd22b83b5b96fd306259f1cafc56586170be7f6ebeb396d9e77b1a65917add03ca22693e36ce01e33f6fc99c03bafaa61c9e7ba8f576b09455d2fc0ef6b5dfc3399e6c27dc6fffcdf27f996a3a07c4f11c7bc75fe624ee33b27d7b5bf2ee03ac31e55d82eb9273c03e86070510ff2fd0a64b3a492b5e0bbbda47e43c0ad9cde5ba1acb15419a5e96f29705f196bfb7c1d3db6056dbe48f50cffe0dce015db5d5bd223c6a051e491abca768fb0ea8ed18e3ead9fea8634c076034db4d3c4eba6433df1332efabd9ce11248d2c8be708ff09ed6cc292d6bc5f28c7cb389f1bc677254a21dfbf59f22d8bd9cf2ee05b19cce379c19799b783ef84a7df11c1ef0a0a034e6510c76f87cb72f9c0e8e27beb89e0dcef037f1e237e835d966b008c2eb661b6df272e054659ae00185dbcff85dfc8af0d634760c47d51185d7c97b4aedf73c4ebee46c0c8f45e15de3f6e0c8c2eee73d4f57d1a3ce636815f57638724b360c463ae2c771130bab87f85f7ef6bc388e72eb2dcc5c0e8e23e73b663b0e0f7a1f1fe8f30ba3807ccf61a05ef55c97297006377478cddb260ec0e8c78cf41185d5c4f2620dfda30f60046e41546077d0069c61e5930e2bd7259ee5260bcd31163cf2c18ef044659ae2930bab89f9f807c6bc3d80b1865b9cb80d1c1b57e9ab157168c784d2ccb5d0e8c658e187b67c158068cb2dc15c0e8e2ba3d61307c1e631f6014fd4a60bccb11639f2c18ef024659ee2a60bcdb11e35d5930de0d8cb2dcd5c0788f23c6bbb360bc071865b96b80f15e478cf764c1782f30ca72d702635f478cf766c1d8171865b9eb80f13e478c7db360bc0f1865b966c078bf23c6fbb260bc1f1865b9e6c0f88023c6fbb3607c001865b9eb81f141478c0f64c1f82030ca723700e3438e181fcc82f1216094e56e04c6871d313e9405e3c3c028cbdd048c8f38627c380bc6478051962b06c6471d313e9205e3a3c028cbdd0c8c8f39627c340bc6c7805196bb0518fb39627c2c0bc67ec028cbdd0a8c8f3b62ec9705e3e3c0d8cfc2d8df11e3e35930f6074659ee0e601c103f63fa3b34fdb3601c003c4fc4cf93f66c40163c4fb8e5497fc3698025af27e3cf2bbd2d0606b52ffb93c033287e9ef4b678320b1e612882e5d0b3c1f133a63d1b9405e360e019123f4fdab3c159f00c01cf065b3c7b2a7ec6b46743b2607c0a7886c6cf93f6eca92c788682674f593c1b163f63dab3a159300e039ee1f1f3a43d1b9605cf70f06c98c5b3a7e3674c7b363c0bc6a7816744fc3c69cf9ece82670478f6b4c5b391f133a63d1b9105e348e0298f9f27edd9c82c78cac1b39116cf46c5cf98f6ac3c0bc651c053113f4fdab35159f0548067a32c9e8d8e9f31ed5945168ca381674cfc3c69cf4667c133063c1b6df16cac23c63159308eb5f0c4fd7dd13196bcc6392afb3341edcb2e0c45b01c328e77c4382e0bc6f1c028cb61fffa04478ce3b3609c008cb21cf6af3feb887142168ccf02a32c87fdeb131d313e9b05e3446094e5b07f7d9223c68959304e0246590efbd7273b629c9405e36460445e619ce2887172168c53804b96c3fef5a98e18a764c13815186539ec5f9fe688716a168cd3805196c3fef5e98e18a765c1381d186539ec5f9fe188717a168c33805196c3fef54a478c33b260ac0446590efbd7673a62accc82712630ca72d8bf3ecb11e3cc2c186701a32c87fdebb31d31ceca82713630ca72d8bf3ec711e3ec2c18e700a32c87fdeb731d31cec982712e30ca72d8bf3ecf11e3dc2c18e701a32c87fdebf31d31cecb82713e30ca72d8bfbec011e3fc2c181700a32c87fdeb0b1d312ec882712130ca7278cdf59c23c68559303e078c0b3de305c1883cc5f1f124b1ec98d7f304657fdec29317b8293be6b588a0ec8bf46fae313e97038c637380d1fbe8193de3578fd1efd7de472646efa3f7d1337a46cfe8192f74c65c68c33d634ed4c7545d1915cfe2f879d29e2dca8267317826cb3d91038ccfe700e3736e19537565543c4be2e7497bb6380b9e25e0992cf7845bc6545d1915cfd2f879d29e2dc982672978b6c4e29903c6545d1915cfb2f879d29e2dcd82671978b6d4e29903c6545d1915cff2f879d29e2dcb82673978b6cce29903c6545d1915cf8af879d29e2dcf82670578b6dce29903c6545d1915cfcaf879d29eadc882672578b6c2e29903c6545d1915cfaaf879d29eadcc82671578b6d2e29903c6545d1915cf0bf1f3a43d5b9505cf0be0d92a8b67ac8c637380f1b91c60cc051f3da3676462f4fbb5f79189d1fbe87df48c9ed133e62ee3f339c0e8b7b56764655c1d3f632a5bc6d58e3d7354cef4385e2fea75c5f86d8994f2ea25c3ab5586574590e645f0ef2507fee541beb26e9997fcb2656e41c0ec28ef948c2fbdcac8ef39c30f35add1bf0d411f0b9ebeace332869fa47f1e744933570f98226383caf42c94774dfce52da969df96fc90673419cf22329ea7c9789692f10c26e35941c6f33819cf43643cf792f1f426e36943c633878ca72519cf74329e14194f03329eb6643cddc8784690f18c21e31942c633918ca73f19cfc3643cadc878fa92f19491f17427e3994bc65342c633838ca70b19cf24329e67c8781693f18c24e35948c6f31419cf32329e01643c2bc9781e21e3b98f8ca70719cf3c329e24194f25194f67329e3e643ce3c8782693f19493f10c25e31948c6f328194f0b329efbc978ee22e3e949c6339f8ca70319cf4c329e4e643c53c878c693f12c21e31945c6b39c8c671819cfed643c4f92f13c46c6731b19cf03643c7793f1dc49c6b3808ca71d19cf2c329e52329ef6643c13c878a692f15490f10c27e31944c6d38f8ce741329ed5643cf790f1f422e3e94ac6339b8ca73519cf34329e8e643c79043c89e0fc775213f0ffd5a0e51bcb360e4345f3eaffafd57a3e2cb34ec71b58d6bd16b497757c9d6559f4692d94a54cc7935f6c4afb847995c1bce457081ceb48783a92f14c23e3694dc6339b8ca72b194f2f329e7bc8785693f13c48c6d38f8c671019cf70329e0a329ea9643c13c878da93f19492f1cc22e36947c6b3808ce74e329ebbc9781e20e3b98d8ce731329e27c9786e27e31946c6b39c8c671419cf12329ef1643c53c8783a91f1cc24e3e940c6339f8ca72719cf5d643cf793f1b420e379948c672019cf50329e72329ec9643ce3c878fa90f17426e3a924e34992f1cc23e3e941c6731f19cf23643c2bc9780690f12c23e3798a8c672119cf48329ec5643ccf90f14c22e3e942c633838ca7848c672e194f77329e32329ebe643cadc8781e26e3e94fc633918c670819cf18329e11643cddc878da92f13420e34991f14c27e36949c633878ca70d194f6f329e7bc9781e22e3799c8c670519cf60329ea5643c4f93f12c22e3194dc6f3ac85c7c1f88e691e793f4fd62df3ab49f276b01dd2e35abee2a84cebf5ba1aeaf50abfe45700693e699cf96d1a64ea83e8c2b546c7b16e8837ebc1a3f58eca22db23cfd83e8ef34ee17ba3013004863f8185c7c5fbb68eca794e3d8c7b7cd50d8657e6b62b8234af807f1b1cf867abdb322ff965cbdc828019eb4571106fbdd8187f99feffb8ade2eb46c35f2cd7ab3a1e63bd4caa756cd2eb6a08f9bd0af96ed1f1bc18f355ebdaacd725e3cc0ac716d025cd7f83761999d524ed2f7e636dab8e97c5c79c1e071bc7d1154f702a83f856e0d9ec80c75139d3db669b51a6d546998a20cd2628e73607e5cc837c65dd32bf0d7864c2b1875dd483da6cf3a8b18719781691f13c4dc6b3948c673019cf0a329ec7c9781e22e3b9978ca737194f1b329e39643c2dc978a693f1a4c8781a90f1b425e3e946c633828c670c19cf10329e89643cfdc9783691f13c4cc6d38a8ca72f194f19194f77329eb9643c25643c33c878ba90f14c22e379868c673119cf48329e85643c4f91f12c23e31940c6b3928ce711329efbc8787a90f1cc23e34992f15492f17426e3e943c6338e8c6732194f3919cf50329e81643c8f92f1b420e3b99f8ce72e329e9e643cf3c9783a90f1cc24e3e944c633858c673c19cf12329e51643ccbc9788691f1dc4ec6f32419cf63643c1bc8781e20e3b99b8ce74e329e05643cedc8786691f19492f1b427e39940c633958ca7828c673819cf20329e7e643c0f92f1dc43c6d38b8ca72b19cf6c329ed6643cd3c8783a92f1e411f0448d3d2cffdf009abc5387e3116fd7f1cda0e55bf29067cfb78156a0e3b20ef52ae7e4e6e7af1b7d72f51e21e65506f3921f8e3dbc9d84a72319cf34329ed6643cb3c978ba92f1f422e3b9878ce741329e7e643c83c8788693f15490f14c25e39940c6d39e8ca7948c6716194f3b329e05643c7792f1dc4dc6f30019cf06329ec7c8789e24e3b99d8c671819cf72329e51643c4bc878c693f14c21e3e944c633938ca70319cf7c329e9e643c7791f1dc4fc6d3828ce751329e81643c43c978cac9782693f18c23e3e943c6d3998ca7928c2749c6338f8ca70719cf7d643c8f90f1ac24e31940c6b38c8ce729329e85643c23c9781693f13c43c633898ca70b19cf0c329e12329eb9643cddc978cac878fa92f1b422e379988c6713194f7f329e89643c43c878c690f18c20e3e946c6d3968ca701194f8a8c673a194f4b329e39643c6dc8787a93f1dc4bc6f31019cfe3643c2bc8780693f12c25e3799a8c671119cf68329e67eb87a754bd8b87e37d0a174e6510df063c9b1cf8e3a89c497c0f33ceb13495573b0caf36185e15419aade0df0e07fee541beb26e9997fc3cb3678e62563cd2b7637b3f782109a3689b9cf29426135066996a6a1f77008f8be38723dfd3edd84ea34c0b2dbe4b1aacab3b1d94d3b6efc8fc4e4bdec541bc5eecaa8517bb2c3cbbead90bc92f5be6ad39c8ec7df63e47317b9fbdcf51ccde67ef7314b3f7d9fb1cc5ec7df63e47317b9fbdcf51ccdee7fa61f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcf7563563c8b745c5813906e1109a368dbdcf2a4df375a149c3be519f36510df053c3b1cf8e3a89ce967c8771b655a149cefbba4c1fd6bb78372daf61d99df0ddb211be69d39c8ec7dae1bb3e259ace38bf46f02d22d2661146d875b9e743bb6383877aaa91ddb0d3c2eda7947e54cb763554699165b7c9734b87f553928a76ddf91f92ad80e559ed9335b9815cf121d17d604a45b42c228da2ea73ca9f4fb8d4b8273a79adab12ae071d1ce3bf23ddd8eed31cab4c4e2bba4c1babac741396dfb8ecc4b7ed932efcc4166efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fb7ce1f8ac78e49bc0c29a80744b491845dbed94a763badf616970ee9467cc97417c0ff054c5ce93e97770e07bbadf61af51a6a516df250dee5f7b1d94d3b6efc8fc5ed80e5f75e69d39c8eceb46fd30fbbae199a3987dddf0cc51ccbe6e78e628665f373c7314b3af1b9e398ad9d70dcf1cc5eceb86678e62f675c3334731fbbae199a3987dddf0cc51ccbe6e78e628665f373c7314b3af1b9e398ad9d70dcf1cc5cc503714cf321d17d604a45b46c2285a955b9ef4770f9605e74e79c67c19c4f702cf1e07fe382a67fab99d7d469996597c9734b87fed73504edbbe23f3fb603b7866cf6c63563ccb755c5813906e3909a3687bdcf2a4dbb1e5c1b9534dedd83ee071d1ce3b2a67ba1ddb6f9469b9c57749837575bf8372daf61d99df0fdbc1337b661bb3e259a1e3c29a80742b481845dbeb9627dd8ead08ce9d6a6ac7f6038f8b76de5139d3edd801a34c2b2cbe4b1aacab071c94d3b6efc8fc01d80e9ed933db9815cf4a1d17d604a45b49c228da3eb73ce9766c6570ee54533b7600785cb4f38eca996ec70e1a655a69f15dd2605d3de8a09cb67d47e60fc276f0cc9ed9c6ac78faebb8b026205d7f1246d1f0fce750fc3ca50983474d35b563871cfbe3a89ce976ec7060f7fd10f82e69b0ae1e7650ce3cc857d62df387613b64c3bc330799bdcf7563563c03755c5813906e2009a3680781e748fc3ca50983474d35b563471cfbe3a89ce976ec6860f7fd08f82e6970ff3aeaa09c7990afac5be68fc276c88679670e327b9febc6ac7806e9b8b02620dd201246d10e03cfb1d87932df37461e35d5d48e1d73ec8f9b7266dab1e381ddf763e0bba4c1fdebb88372e641beb26e993f0edbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219a2e3c29a8074434818453b0a3c2762e7c9f43b208f9a6aea7738e1d81f37e5ccf43b9c0cecbe9f00df250dd6d5930eca9907f9caba65fe246c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a67a88e0b6b02d20d256114ed38f09c8a9fa73461f0a8a9a67e87538efd7154ce74bfc3e9c0eefb29f05dd2605d3deda09c7990afac5be64fc376f0cc9ed9c6ac7886ebb8b02620dd701246d14e02cf6bb1f364fa4f91474d35b563af39f6c74d3933edd899c0eefb6be0bba4c1ba7ac64139f3205f59b7cc9f81ed900df3ce1c64f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcf178ecf8a67848e0b6b02d28d206114ed34f09c8d9da7633261f0a8a9a67e87b38efd7153ce4cbfc3eb81ddf7b3e0bba4c1fdeb7507e5cc837c65dd32ff3a6c87af3af3ce1c64f675a37e987dddf0cc51ccbe6e78e628665f373c7314b3af1b9e398ad9d70dcf1cc5eceb86678e62f675c3334731fbbae199a3987dddf0cc51ccbe6e78e628665f373c7314b3af1b9e398ad9d70dcf1cc5eceb86678e6266a81b8aa75cc7853501e9ca4918453b033c6fc4cf539a3078d454d3733b6f38f6c75139d3cfedbc19d87d7f037c9734b87fbde9a09c7990afac5be6df84ede0993db38d59f154e8b8b026205d0509a368afbbe549250c1e35d5d48ebd093c5f8b9f27ddaebe9905cfd780e7adf8794a1c9533a9d6fb75608f6bbdcaabb70dafde34bc2a8234c8f0b603fff2205f59b7cc4b7e9ed9334731635b28ac0948f70609a3686f018f8b764395bdb55e97acbf61180637adcef76cfcf996e2354b43bd5ee190fc0a20cdfdcdaad30ed36c85f07fd96eaa3c670ccdd1b76f4a6cef4bc8bce45718d4db35448dd734e8858be7fcb33deea31712ff2c88af5ee37e8e79b9f8b652b6ef5c9cb6f0c458f692a8f74d5c7cc74e95bd8d5e97ac5feda3539b3af5bc14f73d693fda18652e80342da0fda884f6c3d656b8de37f302fbbe991f54b767c255ac75f3dec4675a977467213db639fdf52fee9ffda1acaedac5a86b126c17cdb6dba5f7e6fd3133ef22f0e52ca967b6eb38f471a0857b200137d6c7fadccf64ddb67b08030d1fd93cc36d7dd6e2e3200bf720026ec6fd7a90e1239b679fb75f0fb1700f21e066dcaf87183eb279f679fbf5500bf750026ec6fd7aa8e1239b679fb75f0fb7700f27e066dcaf871b3eb279f679fbf5080bf708026ec6fd7a84e1239b679fb75f975bb8cb09b819f7eb72c34736cf3e6fbfaeb07057107033eed7b5ed2765daaf1dddff4ef793a2676aaae99ee159a7fe64be579fcdf327af018f8b3ae5a81e241ddd734df7939ae30f9c35bcc2f1071cdf97adf1bb44929f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e667cbf17fb5724ddeb248ca2397e363fdd9fd156af4bd6af9efd9d7d99cb7c5349ecf794e7924d8e0248f3efd756a79dafd9b07f11fb454f1b9acb6d698e3f2df3925f219407ebbfab77b5a3ead6eb96bc8b63cb3b55e1c6e354f2d2701d1705d5dbf994511ef4f464ecf99feb699ee1e949c77967fbbe04f238e88b2d7154ce745b70c22893e97111a46901e53ce1a09c7990afac5be64f008f4cf9c0e3aa0e06064f60f147a6d1643c83c9781e22e3b9998ca73719cf55643c73c87852643c6dc8782e22e39948c633828ca73f194f5f329eebc978ba93f13425e39941c6d3858ca7808ce719329ea7c8781e21e3b9958ca70f19cf1d643cd790f1cc23e34992f124c8782693f19493f10c24e3b99f8ce746329e9e643c9793f1cc24e3e944c6d3888c673c19cf30329edbc9781e23e3b98d8ce76e329eebc8781690f1b427e32924e3994ac65341c633888ce741329e62329e5e643c5792f1cc26e3e948c6d3848ce759329ea7c9781e27e3b9978ca739194f37329e96643c9792f14c27e36940c633868ca72d19cf10329e87c9785a91f1dc42c65346c6733519cf5c329e12329efa7827201b9e8bc9782691f18c24e31940c6731f19cf0d643c3dc8782e23e3a924e3e94cc6d3908c671c19cf50329e47c9785a90f1dc45c6732d19cf7c329e0e643c9790f14c21e31945c673868ce749329e07c8786e22e3b9938ce70a329e59643ca5643c8dc9782690f1b423e3194ec6d38f8ce71e329e66643c5dc9788ac878a691f1b426e3c923e04904e77f4b2701ff7f0d34f9e60b7e2f2cdfb23ee9a796f4eab838a7f9f9ebceb7acfba485017d3a0e6529d3f1e4179bcef9ce4d9e5eafcc4b7e85c0719284a73519cf34329e22329eae643ccdc878ee21e3e947c6339c8ca71d19cf04329ec6643ca5643cb3c878ae20e3b9938ce726329e07c8789e24e33943c6338a8c670a19cf25643c1dc878e693f15c4bc67317194f0b329e47c9788692f18c23e36948c6d3998ca7928ce732329e1e643c3790f1dc47c633808c672419cf24329e8bc9784e93f19490f1cc25e3b99a8ca78c8ce716329e56643c0f93f10c21e3694bc633868ca70119cf74329e4bc9785a92f17423e3694ec6732f19cfe3643c4f93f13c4bc6d3848ca72319cf6c329e2bc9787a91f11493f13c48c633888ca7828c672a194f21194f7b329e05643cd791f1dc4dc6731b19cf63643cb793f10c23e3194fc6d3888ca71319cf4c329ecbc9787a92f1dc48c6733f19cf40329e72329ec9643c09329e2419cf3c329e6bc878ee20e3e943c6732b19cf23643c4f91f13c43c65340c6d3858c6706194f53329eee643cd793f1f425e3e94fc633828c672219cf45643c6dc87852643c73c878ae22e3e94dc6733319cf43643c83c9784693f1e41b3cf87ff56e8f3caf7d42ff16c0ff97e987099aea75491a3946ab7b27c70c4d95f7a8a3f21e0baaa732983f0ae515f663c073cc11cf7183c7ccbb10e203c1b32386a6180f3b623c6230cafc616014ff8e00cf11473c470d1e33ef42880f02cf0e199a623ce888f190c128f3078151fc3b043c871cf11c3678ccbc0b213e043c3b60688a71bf23c60306a3ccef0746f1ef00f01c70c473d0e031f32e84f850f06c9fa129c6bd8e18f7198c32bf1718c5bf7dc0b3cf11cf7e83c7ccbb10e2c3c1b33d86a618ab1c31ee311865be0a18c5bf3dc0b3c711cf5e83c7ccbb10e223c0b3dd86a618773962dc6d30cafc2e60acd2f1ddc0b3db114f95c163e65d08f172f06ca7a129c61d8e18771a8c32bf0318c5bf9dc0b3d311cf2e83c7ccbb10e215e0d97643538cdb1c316e3718657e1b308a7fdb8167bb239e1d068f997721c4fb8126bc5d40dbaae39d41dba2e39d40dbace3a5a0bdaae31d41dba4e329d036ea7809681bc40fd0d6eb7807d05ed1f1f6a0add3f1aea0add5f16ea0bdace3dd415ba3e33d407b49c77b82f6a28edf09da6a1def05da0b3ade1bb4553a5e06da4a1def03da0a1dbf0bb4e53a7e3768cb74fc1ed096eaf8bda02dd1f1bea02dd6f1fb405ba4e3f783f6bc8e3f00da733afe20680b75fc21d0c6eaf8c3a03da1e38f80f6868e3f0ada9b3afe18686fe9f8e3a07d4dc70780f6751d7f12b4b7757c3068dfd0f1a740fba68e0f03ed5b3afe3468dfd6f191a07d47c74781f65d1d1f0ddaf7747c0c68efe8f833a07d5fc7c781f6031d1f0fda0f757c0268efeaf8b3a0fd48c72782f6631d9f04da4f747c32683fd5f129a0fd4cc7a782f69e8e4f03ed7d1d9f0eda073a3e03b49feb7825681feaf84cd07ea1e3b340fba58ecf06ed573a3e07b45febf85cd03ed2f179a07dace3f341fb44c71780f61b1dc7ef68ff56c78b8378dbf74f83eaa918f296fc549adfe97823238d2c5b00690af5cd4875bfa328a86effe578a03469ffb78226edff16d0a4fddf0c9ab4ffaf8226edff26d0a4fddf089ab4ff1b4093f67f3d68d2febf029ab4ffeb4093f67f2d68d2febf0c9ab4ff6b4093f6ff25d0a4fd7f113469ff578326edff0ba095e9f82ad0a4fd5f099ab4ff2b4093f67f3968d2fe2f034ddaffa5a049fbbf043469ff178326edff22d0a4fd7f1e3469ff9f034ddaff85a049fb3f163469ff9f004ddaff374093f6ff4dd0645ffb14343926bc059a1c13be069a1c13be0e9a1c13de064d8e09df004d8e09df044d8e09df026da48e7f1b3439267c073439267c173439267c0f343926bc039a1c13be0f9a1c137e009a1c137e089a1c13de054d8e093f024d8e093f066db28eff04343926fc14343926fc0c343926bc079a1c13de074d8e091f8026c7849f8326c7840f419363c22f409363c22f419363c2af409363c2af419363c247a0c931e163d0e49820c78826a0c9fd6a3525bfe05414544ff99097309505f11e73702a83f87c28bb4c8bc978d690f16c25e3b9998ce72a329e36643c1791f18c20e35941c6d39f8c673d19cf6e329e5d643cd793f11c23e3394ac6d3948ca7808ce745329ecd643cb792f1dc41c6730d194f828ca79c8c671919cf40329e75643c3bc9787690f1dc48c673848ce73019cfe5643c8dc8785e20e3b99d8c671319cf6d643cd791f11492f15490f12c21e31944c6f33219cf27643cdbc8788ac9780e91f11c24e3b9928ca70919cf4a329e0d643ccdc9785a92f15c4ac6d3808ca72d19cf22329e21643c2f91f17c4ac6d38a8ce716329e2d643c07c878f693f15c4dc6739a8ce762329eed643c6f92f12c27e379858ce706329ecbc8781a92f10c25e3594dc6f32a19cf3e329ebd643cd792f15c42c6f31619cf52329e33643c6bc9786e22e3b9828ca731194f3b329ee1643cabc8783692f1ec21e3a922e36946c673828ce738194f11194f6b329e3c029e047004a0c9ff1b8026efeb9e014ddeef3d0d9abcebbb1d347937780168bfb668f9163e61f818347937631e6872bdff1168f2cce05cd0e4bc41f257f38b9a9fcf9f6f2967030bff479672ceb32c8bdb5b96290be2ddde98575970fefbd785c0318f84a735194f1119cf71329e13643ccdc878aac878f690f16c24e35945c6339c8ca71d194f63329e2bc8786e22e3594bc673868c672919cf5b643c9790f15c4bc6b3978c671f19cfab643cabc9788692f13424e3b98c8ce706329e57c8789693f1bc49c6b39d8ce762329ed3643c5793f1ec27e33940c6b3858ce716329e56643c9f92f1bc44c633848c6711194f5b329e06643c9792f1b424e3694ec6b3818c6725194f13329e2bc9780e92f11c22e32926e3d946c6f30919cfcb643c83c8789690f15490f11492f15c47c6731b19cf26329edbc9785e20e36944c6733919cf61329e23643c3792f1ec20e3d949c6b38e8c672019cf32329e72329e0419cf35643c7790f1dc4ac6b3998ce745329e02329ea6643c47c9788e91f15c4fc6b38b8c673719cf7a329efe643c2bc8784690f15c44c6d3868ce72a329e9bc978b692f1ac21e3594cc6936fe139ed8847de9d9475cbfce9af78de478dbc8f5e20791f36f23e7c81e47dd0c8fbe00592f77e23effd1748de7b8dbcf75e2079571979575d2079ef32f2de7581e4bdc3c87bc7059237f3798bfa3e865c639fd0bf09f83f8edbbddd11e3698351e6b703a368f85da4fe8e78a2ce79fa13e4adbc18a8e372af2f01ff1f088caeea547f8351e66d750ac7a51ee88827ea5c6d2041deca0b79c64bfaca13f07f1cf7cb559d1a6830cabcad4e1d069e418e78a2ce310711e4adbc907724e459d304fc1fc7057155a706198c326fab5338aed510473c51e7c64308f2565ec83bcff2ee5802fe8fdfe97655a786188c326fab5338cec450473c51e7f44309f2565ec83771e4db0209f83f7ee7d4559d1a6a30cabcad4eed059ee18e78aa0c9e2a8b175f56deca0be963d8a37f13f0ff11c0e8aa4e0d371865de56a7aa806784239ea86ba81104792b2fca755cfa1613f0ff72607455a746188c326fab53bb80a7dc114fd4b55f3941deca0b79c65d9ecd4bc0ff71dc5c5775aadc6094795b9dc271e82b1cf1445db356d443de51d75ff59177d4b5447de41d755e5c1f79479de3d547de51e72bf59177959177553de61d751ca98fbca3da44bf7ffbfd3beebcbfcc6349959177553de6fd65eedf5f669bfa65b62dfebcc5b76bf595b73f6fe13e6ff92cbebc93787dda24c6f5e27d816dfa17efed6c054deeb56c014dee976d064dee79be0a9adcb7de049af43d6c044dfa8fde024dfa00b16f52bef97b1c3479260dfbc4648c89a3a0c95814d817f32b1d3f0cda1c1dc73e80d93a7e10b45fea38de7b9ea5e3fb41fb858eef036da68eef05ed431ddf03dacf75bc0ab44a1dc77b3c33747c17681fe838de5b98aee33b407b5fc7df046d9a8e7f0ada7b3a5e01dacf2cda541ddf00da141d5f0fda4f75fc15d026ebf83ad07ea2e36b419ba4e32f83f6631d5f03da8f74fc25d026eaf88ba03dabe3ab417b57c75f006d828eaf02ed873abe12b4f13abe02b41fe8f872d0beafe3cb401ba7e34b417b46c79780f68e8e2f066d8c8e2f02ed7b3afe0968a375bc1cb47c1d1f015a031d1f0e9abc17341434f9d6eb10d0e47dee41a0c937df0782d644c7fb8326cf92e37834f27d491c8f46de01c4b16ce43bd31f8126df6ec0b167647c101ca346be71f52bd09aeaf81cd0e45bb2b34193f7c57f099a7c537e1668f29d9f5f8026cf86cf044dbe17f92168f28ee1cf4193ef58578226df8698015a331dff0034f966d574d0e4bd9df741936fd54e034ddeb77e0f34f966fdcf402bd6f1a9a0ddace35340bb45c77f0adaad3a3e19b4163afe13d0e4db13934093ef2dfc1834f966d88f406ba5e313419377279f054dc6b77917b4363a3e0134f98edc0f416ba7e3e3416bafe33f00ad838e7f1fb4a48e8f03ad44c79f012da5e3ef80d651c7c78056aae3df03ad938e4bbba0f63fb55fbea6e7cb82f8cea7547e678373a73c63be0ce2c2803c719e6315010fe6752af6b2a792f8cc53be5eafd4975390f789d8f34ea6f33ea9d755a0d77bc2c8bb00d2fceddaea6d734c6b0df472a78de5f01a58d62dcbb405fdb8b1eea6babc271d95f784c124dce883a469a01b4d752c3ba8e38e9ea54aa97d40ea5a001ee25406717c5e307eaf52493c07af0dcf49e0897f3f4996b8aa13b86fc5d986d8ee019975ad08d2e09893c71df887fbbaac5be6253fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8a47fa13b0cf5cd2bd46c2281af6759d8c9f27897daeb27ed5afb311fa755cf7ef35d4eb6d6794b900d27c047d4e5b74bc10fe2fdb2d6a5b3ae827ac715b4a7e85509e93c0e3a2bf380ff292759fb27821f1e2d8f24e55b8f1389554cf99a83ef6d386afaf593c75b5bf62df2d7a8afbeb598307fb460b81f775fd9b80f5bc0e6570b08fd7582f243fdc974e8126f1b3c0e8623be3b144da83b67a1efba625cd69edadf48bc7bfed534997edc631285359707efd2e80346f40dbf7968ee3b321af816fef5afe2f534dfdd4e29f2af391f8cb9cc467e065fb1eb1e47d085863cafb9ce7eff374907c442f80f80fafab4e2be9c40ff15ad8f1fbd6c86e2e77d658ae08d21cb594bf2c88b7fc470c9e2306b3da266f433d7b178effaedaa4a3111eb5058f240d9e07b9fa668fd9460a87e4a7d2c8f66f64a4c1731649f301b451aa2cd2ce4b39f1d9163c06b83a8ebd66944fe66de7c62781d12ca3aa1fb32fabe6bdd09ffffa03b417713ffff507a843f89c5660acbf1dac5fb81a05d1c71649f367e338eae21a03b7a5e927fa2c69fe02edd00dfa61dc6ccef5bfacebb6a873fda30e7812c1b9d7de6aaae9f88ec798630e781c9533693b761d37ca5404695a40391d9cc7d4f81ee111c8dbc536472fe41cea84e14501a4f99f46db11e5235eab9eac97b2a4ace783ed2c6591349f19edd461074c2eb7db2128935aef294b59254d8366d5be34d4f1046c27bc6f72a5e5ff32d5d41e887faacc07e22f7312dffd94ed7bc092f73e608d29ef73de3b95f37dc947f402885fd1ac3aada4133fc46b6157fb88bcdb86ece672278ce58a20cd414bf9cb8278cb7fc0e0396030ab6dd204ea99d42397ede6c1088fda81479206ef1fcbb11ddf6fb41df75d3c5f5dd371ff14309aed269ebbb86433bf0b6bde43b59d0f4a1a3c279334b768e6a6c1b9efe3609bb3d1ed33ff25f8fe6a00e5088cb206069b239f4bd167f31e601bd04d9fe57fb66b86b6e0737ddc9f166ef35a00af4784db3ccee0f5480970ab7a2fdb09ef238af686fe75744e5e8ad75b728c31cfc9f13e5a1760c76585eb754b59c403499b0fff97ff7d16d8af4f3e6f39337ec65846f9fb8691ce964f135836b677354a924993ffb4c1896db3a4b3f92afb01d6395997b9afe07d5149d3d76893ccb46adb4f6d5aed8f6c47f10edb13ac93aefa60ce18e59779c94f31ca3da033c0e3e23e4ab6ef4fb9becfe6a88d4ee2bd8bf8beffd06d94ed9ecb6b865745c1f9f7335cb6e9517d39272c79c7e7456ab4adbfdfe6457df6f7477971dc92777c5e74aeb0b573362f8e59785cdc7fa9c98b6396bc63f462aced9e88cd8ba3161e57d7db515e1cb5e41d9f175dacf7ab6c5e1cb1f0b8baee8af242f2cb96f918017313231e4fdea5a3f0be544d5e1cb6f0c47f4faa662f0e5bf28ecf8b92ce35f57fa217872c3caefa31a3bc3864c93b3e2fba76b3ddbfb07971d0c273b09ebd3868c93bc67a31c6767fc9e6c5010b8f837b8d357a71c092778ce7879df15e634d5eecb7f0ecaf672ff65bf28ed18b72db7d509b17fb2c3caeee834679b1cf92777c5e8ceaa4f2de5b0b2ff65a78f6d6b3177b2d79c7e745795795f79e5a78b1c7c2b3a79ebdd863c93bc66ba874bda8aa851755169eaa7af6a2ca92777c5e8c4e9f6bedae8517bb2d3cbbebd98bdd96bce3f322993ea6eeaa8517bb2c3cbbead98b5d96bc63ac17e9ebc99db5f062a78567673d7bb1d392778cc79174bdd8510b2f76587876d4b3173b2c79c7e7c5d8f4fda7edb5f062bb85c7d5b88c515e6cb7e41de33d9774bdd8560b2fb65978b6d5b317db2c79c7e745c7f431756b2dbcd86ae1d95acf5e6cb5e41d9f1763d27d625b6ae1c5160bcf967af6628b25ef18cf3bd3edc5e65a78b1d9c2b3b99ebdd86cc93bc6f3cef4fd8b576be1c5ab169e57ebd98b572d79c7d876a6cf3b37d5c28b4d169e4df5ecc5264bde319e77a6bdd8580b2f365a7836d6b3171b2d79c778de993e8e6ca885171b2c3c1bead98b0d96bc63ac17e9b6737d2dbc586fe1595fcf5eacb7e41de37dad74dbf94a2dbc78c5c2f34a3d7bf18a25ef18af47d2f7f8d6d5c28b75169e75f5ecc53a4bde31f615a5cfc1d7d6c28bb5169eb5f5ecc55ac8dbd5fb3a92873c8bd5daf0a200d2fc87f12c56948fb20e7cae0ccbf272ec65c93c57b626a22c2f435924cdff369ee55be380c95159d375e62528935aef594b59258d7c085ff992afe309d826af836f9759fe2f534dcf20897faaccabe32f73baaebe009c65900fe6bd0a5863cabb04f39667d3251fd10b20deb479755a49277e88d7c2aef69117751cd9cde5d61acb15419a172de52f0be22dff6a8367b5c19c7eef01ea99d423376d5786e9c5088f5a834792069fd93beb88c77c865038243f9546b67f23238d2c5b0069aed31eca73bbf21ca49433119cffdca4a3b6ac04d965dd322ff9e1fbb2a780d12ca3aa1f83e1d9cf0e5a6f1f546b25c20deb29353455d64e8eca2a79c9ba65be1330ca9814a5f5cf98aa2d63478351f17471e0198eb321534dc78b2ec0d3d9018fa372a68f435d8d327532ca540469f0ddc6ae0eca9907f9caba65be2be4ed629ba317724cbeddf0a200d27481f6ac261f651daafe965acad2c3715964ddd22ef5a887bcbb1979a78cbc13c1b9db39086adebfba01737707cc6abd3de35f6f7affba53af4bea94e4938232f5020fe22a13e62de779928fe805107f18cef3249df821c72f61577559b625b29bcb7531962b82343d2ce52f0be22d7f4f83a7a7c1acb6491f38b773b03fa4eb400f8343e653e05dcf08ef7a807792068f7f1d1c79d7dde091f90ec023e7385d41937305e14fc0ff93f5c06db67b5d2ddca27503c60e16c6d2f819d3e73a1d0c46992f0546d1ba034f37479e99dbfa76c31f3c2e3732d2c8b20590a61c8e8d094b5ab5dffd2b944bc62e8c719c9f749bdec8815f38ae6200fe04868701f825e56ce880e7e2a07a6cc5199553a6973f33a6ff984cd7a3a0151898f89b6729463e68186f60d182e0dc21240b409321241b82966fd88243574a7a19d2ce855de887acbbc0e06c022c71e68dc36fca5453d5690c3c2eaab2aa3a97e875e9aa3368faf8ca31583f1a1a9c75a93bea7f0d6a4817b52e57dbc1dc27ca60deac83058ef26f00e52d8379c94f6d9b421d9f5a5ef16c9fe9cfcc9c346672e50c34cadcb1319e179cbb01ccdf28c35ded745801b0c0d8383434ca850d86fc4f36ccc5f17396e218b7a63701e427d3c5e0db450e7c53eb97b16a2bca274eec3773d4c4f1157d674eaea81c3f65326ecd268673515b5afedf08345b138f69d584cd162edbd8a2d9261c15b8096872e4ba0834e1b918b4061097f4e69671525d5bc0fa659752ff53e634d4056f1c545701391cab7655edbfea54eed220732a745990d99c6aa86135b4b01a4a580d1dac860a56a36caaaf5aa89e1c75f6a486f65543f9aaa17bd550bdc5416628de5b82eaa176d5f42e70de16644eb5d4d0b9ad82ccd0b8ea76a57a5d5d7dda4d7d4a439db2ab534b759aab2eebd42588baada64e3dd52d0b75fb4a9dc6a9536475faa74ed9d42588baf450978aead2a9b7f6ba4f18ee0ac3dd61b8270cf786a16f18ee0bc3fd6178200c0f86e1a1303c1c8647c2f068181e0b43bf303c1e6486921e10862782cc50d34f069961a807079921aa9f0a32c3570f0b32435b3f1d6486bd1e196486c41e156486341f1d6486ce1d1b6486da1d176486f09d106486069e1864861c9e1c6486329e1a64864856c329aba197d590cc6a486735fcb31a2a5a0d213d370cf382ccb0d30bc2b0300ccf85e1f920336cf7e22033ccb71afe7b5990192e5c0d23ae8617575d09aa0b45752da8dbf6aafb4add5a565d5aea96b7ea8a555dd3aaab5e3dbaa01ee5508fb6a8477dd4a34fea5130f5689c7a54503d3aa91e25558fd6aa478dd5a3d75541e6d1fcbd41e6d50df52a8b7ab547bdeaa45efd3a1c645e0d54af77aad725d5ebbfea75e89341e676b67ab55e7571aadbd8ea96bebad5ad6ebbaba1e5df0ac3d7c2f0f530bc1d866f84e19b61f85618be1d86ef84e1bb416658e27782cc10c83f0832c328abfaa8866cfe719019f6f9a7416688e9f782cc30d51f049921b13f0c32c36aab21b8d510debf0e32c380ab61bfd5f0e7bf093243daff360cbf0bc3df85e1f761f84318fe3e0c7f0cc39fc2f0e730fc4318fe310cff1486bf84e19fc3f02f61f86b503df4353616bfd73337ebf9f2caca3193a65616574e299e347362e5f8a913e716cf1e5f39ae78caac31d3c74e9c321b175ea39b2719b7bbcff4e9e5738bc74f1e3d664ef1949995c553c6168f9a3273f2e8730ed4c7f442d79f9f63f9e8d1d1997d23ff0b907ea78e99bea7979311d11fa8b96c3faf8b211fd565a1ff55c702cdd1472fb97d322073ae5b3c63e294cae264f1e4f06f78709d327bcce8f6c5f8bf19a1c9332a8b6754964faf2c1e3b7dcaa4e292f6b8de8f1bd7a110ffded80dcc2557d5cd9ccff4f8ce75aa62a7aeab8303ef5f5737d2df5ff70548ff54c74cff475d4af87febb2d0cdcdea46d8a659a42d33668eaa9c5e5e5119bd70f28b2cdcb9591d8a796f1d8bf9dfeb92d97fd665a16b9bd78db073f33a6436328bcc82ff07d6af973f08fc0400", - "isInternal": false - }, - { - "selector": { - "value": 2603445359 - }, - "bytecode": "0x1f8b08000000000000ffed9df77f1cd5d5c667d55cd65acbbd0202e322abad569265b9ca40006363834d31cdb8c960b02d638b964220150209bca9d4407a25bd92de437a4842494823fd87fc0bf9bce7cedef3ead1f51dbd5a31573963ce7c3ec773e7f1ddb9dffbcc99bbab3bb3b3b9a8bcfc932267cbd5148ba2e317feff3ebb2ebeb8a523c57d154372e632c2599511ceea8c70d66484b336239c7519e19c9011ce8919e19c9411cec919e1cc6784734a4638eb33c259c808e7d48c70366484735a4638a767847346463867668473564638676784734e4638e76684735e4638e7678473414638176684f3a48c709e9c11ce5332c2d99811ce5333c2795a8a9ccdc0c973e1a7dbf562bb5e62d74bed7a995d37d9f572dbc71abb6df6d942d14ad1e6fc5fbb61a63093e225e7ff3a29ba28ba2956d8ff6bb4ffd743b192a2976215c56a8a35146b29d651acb79e6ca03883e24c8ab3285e467136c53914e7526ca4388f6213c5668af329b6506ca5b880e2428a6d14db292ea2b898e21287e5528a1d1497515c4e7105c595145751eca4b89a6217c56e8a3d147b29f651f453eca7b886e25a8a0314d7515c4f7190e210c5618a018a231437501ca5384631487123c54d8e673753dc42712bc5cb1dce5750bc92e25514b751bc9ae2768a3b285e43f15a8ad751bc9ee20d146fa4b893e22e8a3751dc4d710fc59b29de42712fc57d14ff43f1568ab751bc9de21d14efa47817c5fd140f503c6859f8447888e2618a4728de4df128c56314efa1782fc5fb28de4ff1018a0f527c88e2c3141fa1f828c5c7283e4ef138c527283e49f1298a4f537c86e2b3149fa3f83cc51728be48f1258a2f533c41f1158aaf527c8de2eb14dfa0f826c5b728be4df11d8aef527c8fe2fb143fa0f821c593143f723cff31c54f287e4af133abfddcae7f61d7bfb4eba7ecfa5776fd6bbbfe8d5d3f6dd7cfd8f5b376fd9c5dffd6ae7f67d7cfdbf5efedfa0f76fd47bbfe935dffd9ae5fb0ebbfd8f55fedfa6f76fd77bbfe875d9beb6333a695cb13a3a1a52f4a69cce9eaef35f3e36ca67bfdcd5cdba9b6ffc7eb46abd7d86d5ee7ac5e6bb76b1dbdce6ed739fb9968b7273a7ac16e171cbdc16e3738fa74bb3dddd167daed998e7eaadd3e15f4bcfdbf72c7ca2ba3555b29071ae75f1568b556ab06ad8e7707da04abd582c6c7b70eb449569b00da64ab4d042d6fb549a04db1da64d0eaad9607ad60b529a04db55a3d680d562b806653339a0ada74ab358036c36ad3409b69b5e9a0cdb2da0cd0665b6d266873ac360bb4b9569b0dda3cabcd016dbed5e682b6c06af3405b68b5f9a09d64b505a09d6cb585a09d62b593406bb4dac9a09d6ab553403bcd6a8da0f179792a68a75bed34ab999ce2712e7e8dd5ab403b9dcf65d016f3790cda123e87415bcae72f68cba06dd69af87c066db9d5389fcdffadb0e5be28adb1acb4c7ecb727edfdd29ecd7e7bd3df6fd18c8daba221affba09d1ef06ab52da7784f4007b69db3c1edb05e03e5b3a12ed7633f784c627633ceacb4e5d523bc6e85f3ba02d459e9e97f5f946eff7b1d9e5e87b916ca817276bfe6eca8978a73f622a8ebe61ebf3f9e8839bb1138d2cfd9ce4ecdd9512f15e7ec1ea8ebe61e7f563b1173f652e00890b33d6172b654d49c2dcf8f44913ff7f8ef86133167fb8123fd9cedd69c1dfd5271cede0675dddce3bf614fc49c3d061ce9e76c4f8f7e3618f55271cede0375dddce3f994133167ef008e0039bb47c7d9512f15e7ec8350d7cd3d9edb3b1173f65ee0483f677b03e56ca7e66c54bed61545fedce379e61331671f018ef47376afcecf8e7ea93867bf0075dddce36b1e2762ce7ecc96cd75869fdbeb0c0b41fb85d54e02ed97563b19b4a7ac760a68bf826b83acfd9aaf1b82f61bab9d06dad3ce3555a33d63b5d3417bd66a8b417bce6a4b40fbadd59682f63bab2d03ed79ab3581f67bab2d07ed0f566b06ed8f566b01ed4f566b05edcf566b03ed05abb583f617ab1541fbabd53a40fb9bd54aa0fddd6a9da0fdc36a5da0fdd36add5633d724f9dad7f7ad3611fade17a597a3f1f5ae68f89273b6fba0bc3c2c4fb1100dbf0f88db6a49bfad4ed3f7e668f47d6f019ed6007dcf431ba3e169059eb6f479e2efc9b5a7bfdff818373b9ee6a1ad66e8573140bf72d016ef9bb7b9bd0268386e143d8c1de93396f05e27de376f7700236b388ef138cce78f798ff917f0063897e2cf19dc1e7fff97395a40e73adf6a1862fbb7d5eae1ff714c6f73b4407919e705b7c5fbe6ed7660e4feb48d3f6369b48cad0e63a83122076df1beddb6f17c5f3efe9e8deab81640fb2f8c49a5b18e49f5c0d6048c4d817c4c3ad652da0ef17e958336786c63cfdb41e73acf5595d7666c9b9c1b620b70fe952afdfc86e341fa795c2ae2793d1a9e22f08438f7039daf457cdfff4f946eae951cafda1caf0a50a703fc2b05f06fa4cf21dc9e322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb67c6fb2ff0fa26d76b12c2c85a3bf08498e78fbf4bcefbb26b735de721b8ae93fe758b5211af59f27d7b4b9c3ed7409dc77343751fb565dfb541bca6d914d6bb51dd67511f1d7f2d36e435c4a4ebc0beeb978da9b55dda1bea7a9b79ce85792641b3e36b93c7d300f7a90cf334e7788af7c72d73784c9e3e5f35c416e2da5fa5d722d12b2ea7796d0fef31087b5ccae307e74255347cfcc0f799ced4db1e7e0d93af97773a6dd7409dafe4868e0ddf03c9bf75e0def364ea7439fbe6d72c01bdcbd977837d2d73d43afb6f86d7729dafc398ba1b7235c4fd1f382e47d0575cfaa08cd7cdd37f1f2e5fc72f56c053029e10e34ca0cf1b453c07d2be8edfe578e5fb1cc3753ac1bfae00fef93e8bf236b7a7cccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccf299f1bba2cc9a877aed4218c7e9de87f87a063f7784f76faeeb6cad1a6a37f47538bee6b4d4e9730dd4b9af6aa8ee765bae8f8ebfdf21e95806b89e37e2b1e4f6eaa13f782d28d4f7b93b1c9e0e8f175c6e4cadedf275fcf43d1eba8e5f747c6df7781aea7cc56bace8299eaf6d0e0f5e1bad8f8ebfb7240ffb198f7b8792f282dbc373a903342ee3f7a3431c677c2f71efebe1f6f0faf5f5d6db8628d4b12f15438e1bddd0a7bee8f8fcae813a4760ec3b6acb780f07de3b7287e7ff7919e93a35fb17e8396ef1f15d099c7dd00eb6dd0bac29b5dd816de76c703bacd740f9f6aaa1baee73cad86b6637e788fb2c35dfebda9cd715a0ce0a4ffffba274fbdfe3f0f438cce698dc08797607bcff871a93562478b4043ce23af83928d43d79ee18e9dedf88f7edd53975f0330bd7b90bc6a8a4fb477df71c867a1f4bbae7d0f7d9b8048c6e1fddfb3c5feaf7693d00e345daf7693d003984f76945cefe97c2fe99ab2e4a7e6fe13a8f38fb773f93f36bf03e30aef3188c174fc1671df7f337de33351e7f5f25dd27cdede1e71a3cb7ffbfbe1be66ea8df972233e604b2e0e704aef351e798752570b7785efb78c26bd92b7e0e15fefde2fa677c48fd19b2f69cef71fac279bd02fac2753eeb7c060cf59ceff4fb3afc33098f031d9ebe729d2fc1b9f6047cc6e3e3847f773ce9f97f5e46fa0c88cfbd5d957e9fe3e38bcf77ed8376b0ed35c09a52db1dd8367f06e47658af81f20f614ce77aec077bcdece61ce1cf51c8eebeaed3795d01eaf47afadf17a5dbff550ecf2a87d91c93af419e3d099f01438dd5bd091e2d058fb80e7e3788df47f019b2bef79850f7f627bdc7f89e4189e3f35341e7d5fc6ceebc9aef3302d7e1d7e2678467609ccd7beabaf385fc7e99e67dc3f85d896668f7794fbb7d29fbd90abef5c1367e2ef86fb61de0b9a5f17744f0b982cc804b1f9499a100afabca00637506186b32c0589b01c6ba0c304ec800e3c40c304eca00e3fffddeb760c67c0618a76480b13e038c850c304ecd0063430618a76580717a06186764807166061867658071760618e76480716e0618e76580717e0618176480716106184fca00e3c919603c25038c8d19603c35038ca76580719132a6c2b82c2c6369ac8c8627d4ef1356f29b78e3f1fb842d9eb6025c172955da77bc5612e2f96995fe5e223314a2e37fff2b106369ac8c86a72d7d9e8a7f5fb30d3cf3fd0e6600c617f51b52929edb86f7a72f0fcb587a31cf960b715fe7589f1f86f7182c0fcbf8a29e7116e21e824a9f71e6bbe7617958c6d2581943ddcf8cdfe7180d0f7e3faec3e35900c6d25819437d0f02bfab351a9e4ef0ace4f12c006369ac8ca1ee99aaf49e3ebcb7bbd3e3992446e449fbf9a29d9eb6ba05f49d19b2c63829038c9333c098cf00e3940c30d66780b19001c6a919606cc800e3b40c304ecf00e38c0c30cecc00e3ac0c30cece00e39c0c30cecd00e3bc0c30cecf00e3820c302ecc00a3fe5da88cff6d46e4694c8f67d8fc07b615e27bad95f67d858727c5ef7d0eeb3bb615e0192715f71d9f059225c6ee0c30067e9e8dfaa88ccaa88c7a5eab8fe219d547f5511995511995f1a5ce9885315c1933918fa5b1321a9e95813ceba980672578c6af5b9e01c6151960ec0ecb581a2ba3e109f18ce13cb4311a9e5ef08c5fb73c2c6369ac8c8627c0f31063cf7a2be0c1e706f67a3c0bc0581a2ba3e1591dc8b35515f0ac06cf56793c0bc0581a2ba3e109f1ecc73cb4311a9e35e0d96a8f6701184b6365343c6bd3e7893d5b5301cf5af06c8dc7b3008ca5b1321a9e75e9f3c49eadad80671d78b6d6e35900c6d258190dcffaf47962cfd655c0b31e3c5be7f12c006369ac8c13414f9127f66c7d053c7de0d97a8f675219bb32c0d89d01c62cf8a88cca288951cf6bf55112a3faa83e2aa3322a637619576480518fb5324a65dc903e63a952c60dc0d3973e4f47a07ec6bfe37586dd578acf962819afce74bc5aef7855803a67807f6706f02f07edf2be799bdbab94f97401cc81da2ef1ef4baf77daeb76fc30cb59765d0b7a1778fa325be6dff0e3faf87b6e5ce712fb8329fcdba0bc54417fcf4abfbf1d239ddbdc1ef2ac11c6b340184faf309e59c278a60ae399248c6789309e6a613c0b85f12c15c6335b184f49184f83309e76613c9385f1340be3a911c6b34118cf22613c6b85f1ac12c63347184f8f309e69c2789609e3c90be3a915c6b35818cf5c613cd385f11485f14c11c6d3248ca74e184fab309e75c278560be399278c67a5309e19c2783a85f1d40be399208c67be309e99c2783a84f11484f1b409e399288ca745184f4e004f3e3afe9e853cfcff06d0aa9cd79af1b366dad0ff9f6df52a78cd39b65cedd9f7d9a0f1b5dd733caf459fce86bef4d972f1c52db14fd8561f6c737bf5c0718e109e16613c1385f1b409e32908e3e910c6335318cf7c613c1384f1d40be3e914c6334318cf4a613cf384f1ac16c6b34e184fab309e3a613c4dc278a608e3290ae3992e8c67ae309ec5c2786a85f1e485f12c13c6334d184f8f309e39c2785609e3592b8c6791309e0dc2786a84f1340be3992c8ca75d184f83309e92309ed9c278960ae359288ca75a18cf12613c9384f14c15c6334b184faf309e05c278d608e3a9f2f06c08c4c3d76f79dfbcbd4148db018e43fcbdf87303f569a3dd57addd2ff3737b3550e7b1baf2da7c7ec2d732977bbd1dff76d8081e6d0cd4173e1e39e7f8046ebb0bef2b88802172fc893c3c21eec708d4cf617998e2f3198ac6abf31cafdc6357803ae7827fe705f0cf97dbbccded29b3322731e3ef5b306b1eea750a6164edaca03c5dc54a7f83e33ce009f15e11c8f7781cdbe4f4a9d3e33bd7c15cdd14a09fbe7387b73779da6e8cd2f562f328bcd8ece1d93cce5e707b95329f9b4166f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466093e1b1e7ea606b3e6a15e8f1046d63686e589bf6fd4130d5f72ce761f943703cf7901fc09d4cff81ef2f39d3ef5787ce73a787e9d1fa09fbe7387b7cf87e35009f3a60c32abcf6363363cfc6c4466cd43bd954218593b2f2c4f3c8ead8c862f238d63e7034f88713e503fe3716c8bd3a7951edfb90e9e5f5b02f4d377eef0f616380ecaaccc3e66c3c3cf6860d63cd4eb15c2c8dae6a03ca5f8fb8dbdd1f065a4716c0bf08418e703f91e8f635b9d3ef57a7ce73a98ab5b03f4d377eef0f656380e95306fca20b3faac3e2731abcfea7312b3faac3e2731abcfea7312b3faac3e2731abcfea7312b3faac3e2731abcfea7312b3faac3e2731abcf2f1d9f0d0fff7608b3e6a1de2a218cac9d1f94a733beeeb02a1abe8c74dd612bf06c499da77cdd2180eff175870b9c3eadf2f8ce75f0fcba20403f7de70e6f5f00c7e14467de944166cd8df161d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e6296901b8667b52d336b1eeaad16c2c8da96b03cf1730f5647c39791eedbb90078b606f027503fe3fb762e74fab4dae33bd7c1f3ebc200fdf49d3bbc7d211c076556661fb3e15963cbcc9a877a6b8430b2b6352c4f3c8ead89862f238d6317024f88713e503fe3716c9bd3a7351edfb90ee6eab600fdf49d3bbcbd0d8e83322bb38fd9f0acb56566cd43bdb5421859bb202c4f3c8ead8d862f238d63db8027c4381fa89ff138b6dde9d35a8fef5c0773757b807eface1ddede0ec7419995d9c76c78d6d932b3e6a1de3a218cace1e71f66fb4f7a3cdd0560a982b6428de191d3775e305f78d9208c6781309e59c278a60ae399248c6789309e6a613c0b85f12c15c6335b184f49184f83309e76613c9385f1340be3a911c6b34818cf1c613cd384f12c13c69317c6532b8c67b1309eb9c278a60be3290ae399228ca749184f9d309e56613cf384f1cc10c6532f8c6782309ef9c278660ae3e910c65310c6d3268c67a2309e16613c39013cf9e8f8eb9c78fda41a34be9eb10eb48b6c790368559e36783fdb41e3bfcf791f663c9e3aedf8f6aa3ced6df7708d879fd8561f6c737bf5c0b15d084f8b309e89c278da84f11484f17408e399298c67be309e09c278ea85f1cc10c6334f184fab309e3a613c4dc278a608e3290ae3992e8c67ae309ec5c2786a85f1e485f12c13c6334d18cf1c613c8b84f1d408e36916c63359184fbb309e06613c25613cb385f12c15c6b350184fb5309e25c2782609e3992a8c6796309e05c2783608e3a9f2f05c9c3e4ffc9d32ee7b045cb8f441f9e2c0fe04ea67d1ecf712bbaf14bfcb127f57ed52c7ab0d8e5705a87309f8776900ff72d02eef9bb7b93d6556e62466c3c373ab78bd94ebb50a61646d5b589e787c6c8d862f238d8f97024f8071ac23503fe3716c87d3a7568fef5c07737547807eface1ddedee169bb314ad78bcb46e1c5651e9ecbc6d90b6eaf52e64b32c82cc167c3c3f72a306b1eeab5086164ede2b03cf1f8d8120d5f461a1f2f039e10ef1f81fa198f09973b7d6af1f8ce75f0fcba3c403f7de70e6f5f0ec7a112e61d1964569fc7c66c78784e9b59f350af5908236b9706e529c5bf51d91c0d5f461ac72e079e10e37c20dfe371ec0aa74fcd1edfb90e9e5f5704e8a7efdce1ed2be03828b3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb36c66c3c3df4d63d63cd46b12c2c8da654179cad71d9aa2e1cb48d71dae009e10d76502f91e5f77b8d2e95393c777ae83b97a65807eface1ddebe128e83322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb66363c6db6ccac79a8d7268491b5cbc3f2c4dfdb6a8b862f235d77b81278425c9709d4cff8bac3554e9fda3cbe731dccd5ab02f4d377eef0f655701c9459997dcc86879fb5c5ac79a8d72e8491b52b82f294af9fb647c39791c6b1ab8027c4381fc8f7781cdbe9f4a9dde33bd7c15cdd19a09fbe7387b777c271a88479470699d567f53989597d569f9398d567f53989597d569f9398d567f53989597d569f9398d567f53989597d569f9398d567f53989597d7ee9f86c78f837b398350ff58a421859bb32284f677cdda1180d5f46baeeb01378425c9709e47b7cdde16aa74f458fef5c07cfafab03f4d377eef0f6d5701c4e74e61d1964d6dc181f66cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e6246609b961783ab83dbbce43bd0e218cac5d1596277eee4147347c19e9be9dab816767007f02f533be6f6797d3a70e8fef5c07cfaf5d01fae93b77787b171c875dcaaccc1e66c353b26566cd43bd921046d67686e589c7b152347c19691cdb053c21c6f940fd8cc7b1dd4e9f4a1edfb90ee6eaee00fdf49d3bbccded29b33227319bb6f7a4df763c1e60dbec4fe4f0f0b227b01781fa198f077b23bfc7dc5e01eae031df1ba09f396897f7cddb7be13854c2bc2383cceaf3d8984ddbfbd26f3b1e0fb06df627727878d917d88b40fd8cc783fec8ef31b757803a98a7fd01fa99837679dfbcdd0fc7a112e61d1964569fc7c66cdade9f7adbe5e7a461dbec4fe4f0f0b23fb01761fa591e0fae89fc1e737b05a883797a4d807ee6a05dde376f5f03c7419995599995599995599995599995599995599995599995599995599995599965339bb6af4dbdedf2fc3db6cdfe440e0f2fd706f6224c3fcbf3f70722bfc7dc5e01eae0313f10a09f396897f7cddb07e03828b3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb36c66d3f675e9b71d7f1f07db667f22878797eb027b11a89ff1fcfdf591df636eaf0075f0985f1fa09f396897f7cddbd7c371506665f6319bb60fa6de76f97a1eb6cdfe440e0f2f07037b11a69fe5f1e050e4f798db2b401d3ce68702f43307edf2be79fb101c874a98776490597d569f9398d567f53989597d569f9398d567f53989597d569f9398d567f53989597d569f9398d567f53989597d569f9398d5e7978ecfa6edc3a9b7dd19cfdf63dbec4fe4f0f07238b01761fa599ebf1f88fc1e737b05a883793a10a09f396897f7cddb03701c4e74e61d1964d6dc181f66cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e6246609b961da3e927edbf1f7d9b16df6277278783912d88b40fd8cef7fb921f27bcced15a00ee6e90d01fa99837679dfbc7d031c076556661f339e2713d36b3bbe1f8edba8b26ba31db5e56ad08ed9720d6883b65c0bda8db65c07da4db63c01b49ba13facdd62cbcb40bbd5964ba0bddc96af06ed15b6bc0bb457daf26ed05e65cb7b40bbcd96f782f66a5bde07daedb6dc0fda1db6bc1fb4d7d8f235a0bdd696af05ed75b67c00b4d7dbf275a0bdc196af07ed8db67c10b43b6df9106877d9f261d0de64cb03a0dd6dcb8b40bbc7a3bdd9962f01ed2d1eed5e5b9e04da7db63c19b4ff8132afdf6acb53407b9b2dd783f6765b2e80f60e5b9e0ada3b6db901b477d9f234d0eeb7e5e9a03d60cb33407bd0966782f6902dcf02ed615b9e0dda23b63c07b477dbf25cd01eb5e579a03d66cbf3417b8f2d2f00edbdb6bc10b4f7d9321ea3f7dbf211d0781cb801341e078e82c6e3c031d0781c18048dc7811b41e371e026d0781cb81934ce9d5b40e3dcb91534ce9d9783c6b9f30ad038775e091ae7ceab40e3dcb90d34ce9d5783c6b9733b689c3b7780c6b9f31ad038775e0b1ae7ceeb40e3dc793d689c3b6f008d73e78da071eedc091ae7ce5da071eebc0934ce9dbb413bc996ef01ed645b7e3368a7d8f25b406bb4e57b413bd596ef03ed345bc67181c79fb78276ba2dbf0db4c5b6fc76d096d8f23b405b6acbef048ddf73de055a932ddf0fda725b7e00b4665b7e10b4165b7e08b4565b7e18b4365b7e04b4765b7e3768455b7e14b40e5b7e0c347e9f7c0f689db6fc5ed0ba6cf97da075db328f0be6fc33e70cf799fda887fe357bb85933e73473f745e97e66e2b678dfbccded1946f69bff6f1c194ba3656c73180d4f2980679843bc8cf4b75f09783a02f004ea67fcb75fa7d3a7a2d3a702d4391dfad919a09f396897f7cddb9dd07688638e5ed4dafd2e76bca8813acfda3739b31ac947de87c9df764f5f5604ee0bef9bc7a515e3d07697d376abd3368ebdbc8c747e750173770066b3df9ef4f71b9f5f2bedbe38a7b89d56e8532f7890569fb0ed9c0d6e87f51a28ffbb61a82ed7633ff8fd8bd94d2ef3b14476f77525e77505a8b3c2d3ffbe28ddfef7383c3d0eb339262f340c7104381fe21c58e170f0762b78d793e0dd0af08eebe0fb5f7b20efba1d9e6ea76dc3c39f713a41e3cf0a3807c1ffdf3c0edceeb8d7e9e166ad0b187d9f75dad2671cf1b34e1b30b2d60d3c5d813c738ff562c71f7c5fae73eaf06b6ba04e95fd63af211afeb706d735e7ddbfa05ffc37f37fa274c7f4ba007ee1dff311f813391e46e017f7b33600cfe468e86ffa63830347775fd3bfad7ff7be1ca0d53898b8ce79ba51051a96ab3d5a140d9fbac0294f9ebac029cf2ac7169c32e1fae64f29d32d9e1ee83f7460f0e2c3fd87f71ebdf5c860ffbecd03d72075ad438fa4493d4052d47c3d1a897e5274fcc14ff5cc64b845b0ff9c05a9b69da8b540c6be89d1907d3cb363deadcd8862666acc19694e4e63ad996931332b6626c5cc9c9899123333626642cccc8799e930331b6626c3cc5c98998ac6a83c13711af07c1f18cd5f08e66c37330966e6c0cc14987709f3e9d38cace6938479d733239d19e1cca764f317931939cca86c461c334a98773df36e673e9d9877eb5514ab29d650aca55847b1de7abd81e20c8a3329cea27819c5d914e7509c4bb191e23c8a4d149b29cea7d842b195e2028a0b29b6516ca7b888e2e2a83cf3776954bec27919c5e51457505c497115c5cea83ca3be2b2acf989b197233236e66c0cd8cb799e13633da6606dbcc589b19eaeba3f20cb499713633cc6646d9cc269ad943335b686607cd6ca099fd33b37d6676cfcce699d93b335b6766e7cc6c9c997d33b36d6676edf6a83c7b6666cbccec98990d33b35f66b6cbcc6e99d92c337b6566abee8ecab35166f6c9cc3699d925339b64668fcc6c91991d32b34166f6c7ccf698d91d339b63666fcc6c8d999d31b33166f6c5ccb698d995c7a2f2ec89992d31b3236636e403141fa4f810c587293e42f1518a8f517c9ce2718a4f507c92e253149fa6f80cc567293e47f1798a2f507c91e24b145fa67882e22b145fa5f81ac5d729be41f14d8a6f517c9be23b14dfa5f85e54cec91f50fc90e2498a1f51fc98e227143fa5f819c5cf297e41f14b8aa7287e45f16b8adf503c4df10cc5b314cf51fc96e27714cf53fc9ee20f147fa4f813c59f295ea0f80bc55f29fe46f1778a7f50fc331a9a49c581e209bbc1b37abb0707fb0f1d196c1c1c683c74e3c1c103470ededa78f381c16b1b076eea3fbaffe0c0cdf8e2ebec30c453961b8e1edd7d6be381c3fbfa6f691cb871b071607fe39e811b0fef3b862fbad3be68e1f12deedeb72fb9b1fbab5e04e9c3636cf423f6753c19bc71e4be7d7c2c867c662c2f7a7a8c1dbad8be8bacb1dbdbcbefd48dc70e0e0c36161b0fd3bfbb0fd26bfaf7b535e2ff1d23938f0d361e1bdc7d74b071ffd181438d1d6db8df47ebc6d089671ac6f0a2dcb4d1f73cfa5f16540aa2d9140300", - "isInternal": false - } - ], - "packedBytecode": "0x000000028df71de50000003d361f8b08000000000000ffed9d09941545bee6b38a62d16b95b82bb8948a82acb72ec58e50b8e0ae08222020140508c84eb183b28328822cb243b1ef8be0d26def76b7bda96d2f6adbfdba5f77bff7fabd7ef3ce9cf3e6cc3b33f366c69e8c7be33ff511449675cb8cf2bb12794ed48dfc2a32e3175f46462e9199911764a6bf86214fc71b84a14570fe24ff2fd3bfc92f3695c4b8aea44bcebc1ce1cccf11ce0639c25990239c0d7384b3518e7036ce11ce2639c279518e705e9c239c891ce1bc2447380b7384b32847382fcd11cea639c279598e705e9e239c57e408e79539c279558e705e9d239cd7e408e7b539c2795d8e7036cb11cee639c2797d8e70de90239c37e608e74d39c2599c239c37e708e72d39c2796b8c9c6d8053eed9dfa67f6fd7bf2df56f2bfd7b87fe6dad7fdbe83216e8f9b661681786f661e860fc4f19a36edca7c2d0d1f85f69183a85a17318bae8ff15ebff750d43b730740f438f30f40cc39d61e81586deda8f3e61b82b0c7787e19e30dc1b86be61b82f0cf787e181303c188687c2f070181e09c3a361782c0cfdc2f07818fa876140189e08c3c0303c19864106cbe0300c09c35361181a866161181e86a7c330220c23c3501e865161a808c3e8308c09c3d8303c13867161181f86096178360c13c330290c93c330250c53c3302d0cd3c330230c95619819865961986d7836270c73c3302f0cf30dce0561581886e7c2f07c1816856171189684616918968561791856846165185685e18530ac0ec38b6178290c6bc2f07218d686615d185e09c3fa306c08c3c6306c0ac3ab61d81c862d61d81a866d61d8ae596447d811869d61d81586dd61a80ac39e30ec0dc3be30ec0fc381301c0cc3a1301c0ec391301c0dc3b1301c0fc389309c0cc3a9309c0ec36b61381386b361783d0c6f84e1cd30bc1586af85e1eb61783b0cdf08c337c3f0ad307c3b0cdf09c377c3f0bd30bc1386ef87e10761f86118de0dc38fc2f0e330fc240c3f0dc3cf0ccfdf0bc3fb61f8200c3fd7da87faf717faf797faf757faf7d7faf723fdfbb1fefd44fffe46ff7eaa7f7fab7f7fa77fff4efffe5efffe41fffebdfefda3fefd93fefdb3fefd07fdfb8ffaf79ff4ef5ff4ef3febdf7fd1bfaa1f6f75f34cbc49503d950531b539a563cad57d7c31d3ec27547d500df4ffe4b758eb057a5e7ef3b4de50cf3734f4467abe91b19e267abe89a117e9f922436faae79b1afae57afe7243bf52cf5f69e837ebf99b414fe8ff650a96f9515a032de58126f52f1fb4865a6b005a23591d688db5d61034d9be8d40bb486b8d41bb586b4d404b68ed22d02ed1dac5a0156a2d015a91d62e01ed52ad1582d6546b45a05da6b54b41bb5c6b4d41bb426b978176a5d62e07ed2aad5d01dad55abb12b46bb4761568d76aed6ad0aed3da35a035d3dab5a0e95d2cb80eb4ebb5d60cb41bb4d61cb41bb5763d683769ed06d08ab5762368376bed26d06ed15a3168b76aed66d05a68ed16d0e45ce156ada97a266d5f7a19ade783769becdfa0dd2efb36682d65bf06ad95ecd3a0dd01798bd65af671d0da684deab8fa5f671d2f0be26adf52156abd5de25e6fb866b5de6ef1af37a9dacbee41b5d765904f17f0aa878ec7f83c4309e69da783e4237a01c4ef83b4924efc90764ad855dbd355c77bd4b05c6763b92248d3d552feb220def2773378ba19cc6a9bf4048ef8eb6cc7a4afb3b59eb2aeb30321ad59f7e498f955acb30f0287833a5beaeb6cada7aceb6c05a435eb9e9cbf7d15ebec60e0705067bbbaa9b3a9a4afb3997b264160af7b722df155acb3638123fe3adbc9d7d9da4f59d7d9e721ad59f7e4baf6ab58672b8123fe3adba5ab3f37a8f594759d5d0369cdba27f758be8a7576097038a8b315be9dadf594759ddd0e69cdba27f7fbbe8a75761d70c45f67bb39aab31d7d9d0d32fd5f4160af7b72eff9ab5867770147fc75b6c2df9fadfd94759d7d0bd29a754ffa41be8a75f6b88eab7e860f753fc3f5a0fd426b3780f64baddd08daafb4761368bf86fe42d13e92be44d03ed6da2da07da2b55b41fb8dd1f7aab44fb5761b68bfd5daeda0fd4e6b2d41fb3badb502edf75abb03b43f68ad35687fafb536a0fd516b6d41fb93d6da81f667adb507ed1fb4d601b47fd45a12b47fd25a09687fd15a0ab47fd65a47d0fe456ba5a0fd556b9db4a6fa29a5efeb5dad3501aeb220be3a9a000f64ca33e6cb20dec12d4fb2087830af92f8f3eaa8ca7ecec3569f53f612e04939287b02f2a80d4f0a783ac6cf937ec7af34fef5a6b771d2f034017925a15c9d1c942b0ff29275cbbce457041aeed39d2c8cb19f6784175e799097ac5be63b03a368d8c6489b2bfb8f3ac6fc2bf03ad897d2e719929fbcbb2c1c25a04b9ae2e6d56cff556b85f07f6c6f3b1a9aa37a99ae179297ac5be64b8151cad3b1fe1953b5654c198caeda883cc84bd6edf3aede0e126f0f3c5d1df1986d9ae4ddb51ef2ee6ce45d62e48d6da74c351ddb3a03b383ebad922fe37a0bcf1f18aeb72ecbab4e6b5e37493b9cedf556276339c6ebad4679d51c0ef687741de86a70c87c0978d72dc2bbaee09da4b90dbc7370ee99f6ae8bc123f329e09176ac1478dad7334f7b82bcf11c56b61b5e4be17980abedd5de609479dbf6ea0c8c290ba38373c2544dc7c81260140def47251d7916b55d932479bbb8aec47729e4dcdcbcb6298034ff273ff3abdaca76794ed95278ee2c536daf79e3df4ea924ee1fb5e171bc0f9538aa8f49bc7ff359106f5d33db25b3bd89bac7e3aa2d4f1a3c322ff97966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563cd29f80cf6d49ba8e248ce6f36faeeef3a7bf8522ebd2bfaa5fe7dbd0af137fbf452a897d7ff21c444ba3cc0590e6c3bceab4efe8b87ae640faa9f0592bf3f92b977d76f83c6619cc4b7ef8ac156e4b86e79d8a63cb3bf35d1a17fd6d9706996fea98cf7e76b478eae2f967f434cff0149f03bfc3e051f5f46ff9d56c2efafeb2ed8b44af241e67df5e5160afebf16f97d4397dd6f9c1b9ed071e675c3dbf236db5f4977735f22e80347f80e7a8e4d92a196728692c87cffdc8ba659996a07733d6dd542f2b1c0d8df597c2b292e64fd0a62e83baeaa0ad4c65fbec3af69bc77f1ccef4e327b3e0690f3c2eda1947e71b49dc07e2eec7379f4fb39dc7481a7cb6cfc17395353eef24f97966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563c665f2bbe5f5b42c2289ae3671fd2fd19adf4ba64fdaa5f677a7e75beaefbe1a4cfa99551667c77f46c7e75da593a5e189cffbc43d4b674f57d8aa86d29f9e1b767da038f8b7edd3cc84bd6ddc1e285c48b63cb3bd38f1fbfc7d5fdf849c3d7128ba7aef657ec63454f717f4d193cd8371af56d9f0e86e6681fafb15e487eb82f75004de2f87eb48bed8cc712f3b91ec90ffbaf5fd6de360d5c6dfb54d265bb81df4d290bceafdff83d950dd0f66dd2717c86039f1dd96ff9bf4c35f5538b7faacc3de32f737afbde099c65900fe6dd0b5863cabb04f3ced341f211bd00e2fbf2abd34a3af143bc1676b58fc8376090dd5c2e652c5704697a58ca5f16c45bfe9e064f4f83596d932d50cff6c3f1df559bd423c2a396e091a4c1f32057cfe4996da4f97c233eb7d7c84883e72c92e638b451aa2cb6e7476dcf1cba3a8e453d73683b376e0f8c6619cde73c2ff4e7b4be09ed45dccf697d13ea103ea71518eb6f05eb17ae4641f4b145d27cd758bf794e2ecbe0736092e6fbd05efc471dcec9bfaceb2bdb39392e175576c58cdf412b8b9119eb04b2e07982a479dfd866dd22b83b5b96fd306259f1cafc56586170be7f6ebeb396d9e77b1a65917add03ca22693e36ce01e33f6fc99c03bafaa61c9e7ba8f576b09455d2fc0ef6b5dfc3399e6c27dc6fffcdf27f996a3a07c4f11c7bc75fe624ee33b27d7b5bf2ee03ac31e55d82eb9273c03e86070510ff2fd0a64b3a492b5e0bbbda47e43c0ad9cde5ba1acb15419a5e96f29705f196bfb7c1d3db6056dbe48f50cffe0dce015db5d5bd223c6a051e491abca768fb0ea8ed18e3ead9fea8634c076034db4d3c4eba6433df1332efabd9ce11248d2c8be708ff09ed6cc292d6bc5f28c7cb389f1bc677254a21dfbf59f22d8bd9cf2ee05b19cce379c19799b783ef84a7df11c1ef0a0a034e6510c76f87cb72f9c0e8e27beb89e0dcef037f1e237e835d966b008c2eb661b6df272e054659ae00185dbcff85dfc8af0d634760c47d51185d7c97b4aedf73c4ebee46c0c8f45e15de3f6e0c8c2eee73d4f57d1a3ce636815f57638724b360c463ae2c771130bab87f85f7ef6bc388e72eb2dcc5c0e8e23e73b663b0e0f7a1f1fe8f30ba3807ccf61a05ef55c97297006377478cddb260ec0e8c78cf41185d5c4f2620dfda30f60046e41546077d0069c61e5930e2bd7259ee5260bcd31163cf2c18ef044659ae2930bab89f9f807c6bc3d80b1865b9cb80d1c1b57e9ab157168c784d2ccb5d0e8c658e187b67c158068cb2dc15c0e8e2ba3d61307c1e631f6014fd4a60bccb11639f2c18ef024659ee2a60bcdb11e35d5930de0d8cb2dcd5c0788f23c6bbb360bc071865b96b80f15e478cf764c1782f30ca72d702635f478cf766c1d8171865b9eb80f13e478c7db360bc0f1865b966c078bf23c6fbb260bc1f1865b9e6c0f88023c6fbb3607c001865b9eb81f141478c0f64c1f82030ca723700e3438e181fcc82f1216094e56e04c6871d313e9405e3c3c028cbdd048c8f38627c380bc6478051962b06c6471d313e9205e3a3c028cbdd0c8c8f39627c340bc6c7805196bb0518fb39627c2c0bc67ec028cbdd0a8c8f3b62ec9705e3e3c0d8cfc2d8df11e3e35930f6074659ee0e601c103f63fa3b34fdb3601c003c4fc4cf93f66c40163c4fb8e5497fc3698025af27e3cf2bbd2d0606b52ffb93c033287e9ef4b678320b1e612882e5d0b3c1f133a63d1b9405e360e019123f4fdab3c159f00c01cf065b3c7b2a7ec6b46743b2607c0a7886c6cf93f6eca92c788682674f593c1b163f63dab3a159300e039ee1f1f3a43d1b9605cf70f06c98c5b3a7e3674c7b363c0bc6a7816744fc3c69cf9ece82670478f6b4c5b391f133a63d1b9105e348e0298f9f27edd9c82c78cac1b39116cf46c5cf98f6ac3c0bc651c053113f4fdab35159f0548067a32c9e8d8e9f31ed5945168ca381674cfc3c69cf4667c133063c1b6df16cac23c63159308eb5f0c4fd7dd13196bcc6392afb3341edcb2e0c45b01c328e77c4382e0bc6f1c028cb61fffa04478ce3b3609c008cb21cf6af3feb887142168ccf02a32c87fdeb131d313e9b05e3446094e5b07f7d9223c68959304e0246590efbd7273b629c9405e36460445e619ce2887172168c53804b96c3fef5a98e18a764c13815186539ec5f9fe688716a168cd3805196c3fef5e98e18a765c1381d186539ec5f9fe188717a168c33805196c3fef54a478c33b260ac0446590efbd7673a62accc82712630ca72d8bf3ecb11e3cc2c186701a32c87fdebb31d31ceca82713630ca72d8bf3ec711e3ec2c18e700a32c87fdeb731d31cec982712e30ca72d8bf3ecf11e3dc2c18e701a32c87fdebf31d31cecb82713e30ca72d8bfbec011e3fc2c181700a32c87fdeb0b1d312ec882712130ca7278cdf59c23c68559303e078c0b3de305c1883cc5f1f124b1ec98d7f304657fdec29317b8293be6b588a0ec8bf46fae313e97038c637380d1fbe8193de3578fd1efd7de472646efa3f7d1337a46cfe8192f74c65c68c33d634ed4c7545d1915cfe2f879d29e2dca8267317826cb3d91038ccfe700e3736e19537565543c4be2e7497bb6380b9e25e0992cf7845bc6545d1915cfd2f879d29e2dc982672978b6c4e29903c6545d1915cfb2f879d29e2dcd82671978b6d4e29903c6545d1915cff2f879d29e2dcb82673978b6cce29903c6545d1915cf8af879d29e2dcf82670578b6dce29903c6545d1915cfcaf879d29eadc882672578b6c2e29903c6545d1915cfaaf879d29eadcc82671578b6d2e29903c6545d1915cf0bf1f3a43d5b9505cf0be0d92a8b67ac8c637380f1b91c60cc051f3da3676462f4fbb5f79189d1fbe87df48c9ed133e62ee3f339c0e8b7b56764655c1d3f632a5bc6d58e3d7354cef4385e2fea75c5f86d8994f2ea25c3ab5586574590e645f0ef2507fee541beb26e9997fcb2656e41c0ec28ef948c2fbdcac8ef39c30f35add1bf0d411f0b9ebeace332869fa47f1e744933570f98226383caf42c94774dfce52da969df96fc90673419cf22329ea7c9789692f10c26e35941c6f33819cf43643cf792f1f426e36943c633878ca72519cf74329e14194f03329eb6643cddc8784690f18c21e31942c633918ca73f19cfc3643cadc878fa92f19491f17427e3994bc65342c633838ca70b19cf24329e67c8781693f18c24e35948c6f31419cf32329e01643c2bc9781e21e3b98f8ca70719cf3c329e24194f25194f67329e3e643ce3c8782693f19493f10c25e31948c6f328194f0b329efbc978ee22e3e949c6339f8ca70319cf4c329e4e643c53c878c693f12c21e31945c6b39c8c671819cfed643c4f92f13c46c6731b19cf03643c7793f1dc49c6b3808ca71d19cf2c329e52329ef6643c13c878a692f15490f10c27e31944c6d38f8ce741329ed5643cf790f1f422e3e94ac6339b8ca73519cf34329e8e643c79043c89e0fc775213f0ffd5a0e51bcb360e4345f3eaffafd57a3e2cb34ec71b58d6bd16b497757c9d6559f4692d94a54cc7935f6c4afb847995c1bce457081ceb48783a92f14c23e3694dc6339b8ca72b194f2f329e7bc8785693f13c48c6d38f8c671019cf70329e0a329ea9643c13c878da93f19492f1cc22e36947c6b3808ce74e329ebbc9781e20e3b98d8ce731329e27c9786e27e31946c6b39c8c671419cf12329ef1643c53c8783a91f1cc24e3e940c6339f8ca72719cf5d643cf793f1b420e379948c672019cf50329e72329ec9643ce3c878fa90f17426e3a924e34992f1cc23e3e941c6731f19cf23643c2bc9780690f12c23e3798a8c672119cf48329ec5643ccf90f14c22e3e942c633838ca7848c672e194f77329e32329ebe643cadc8781e26e3e94fc633918c670819cf18329e11643cddc878da92f13420e34991f14c27e36949c633878ca70d194f6f329e7bc9781e22e3799c8c670519cf60329ea5643c4f93f12c22e3194dc6f3ac85c7c1f88e691e793f4fd62df3ab49f276b01dd2e35abee2a84cebf5ba1aeaf50abfe45700693e699cf96d1a64ea83e8c2b546c7b16e8837ebc1a3f58eca22db23cfd83e8ef34ee17ba3013004863f8185c7c5fbb68eca794e3d8c7b7cd50d8657e6b62b8234af807f1b1cf867abdb322ff965cbdc828019eb4571106fbdd8187f99feffb8ade2eb46c35f2cd7ab3a1e63bd4caa756cd2eb6a08f9bd0af96ed1f1bc18f355ebdaacd725e3cc0ac716d025cd7f83761999d524ed2f7e636dab8e97c5c79c1e071bc7d1154f702a83f856e0d9ec80c75139d3db669b51a6d546998a20cd2628e73607e5cc837c65dd32bf0d7864c2b1875dd483da6cf3a8b18719781691f13c4dc6b3948c673019cf0a329ec7c9781e22e3b9978ca737194f1b329e39643c2dc978a693f1a4c8781a90f1b425e3e946c633828c670c19cf10329e89643cfdc9783691f13c4cc6d38a8ca72f194f19194f77329eb9643c25643c33c878ba90f14c22e379868c673119cf48329e85643c4f91f12c23e31940c6b3928ce711329efbc8787a90f1cc23e34992f15492f17426e3e943c6338e8c6732194f3919cf50329e81643c8f92f1b420e3b99f8ce72e329e9e643cf3c9783a90f1cc24e3e944c633858c673c19cf12329e51643ccbc9788691f1dc4ec6f32419cf63643c1bc8781e20e3b99b8ce74e329e05643cedc8786691f19492f1b427e39940c633958ca7828c673819cf20329e7e643c0f92f1dc43c6d38b8ca72b19cf6c329ed6643cd3c8783a92f1e411f0448d3d2cffdf009abc5387e3116fd7f1cda0e55bf29067cfb78156a0e3b20ef52ae7e4e6e7af1b7d72f51e21e65506f3921f8e3dbc9d84a72319cf34329ed6643cb3c978ba92f1f422e3b9878ce741329e7e643c83c8788693f15490f14c25e39940c6d39e8ca7948c6716194f3b329e05643c7792f1dc4dc6f30019cf06329ec7c8789e24e3b99d8c671819cf72329e51643c4bc878c693f14c21e3e944c633938ca70319cf7c329e9e643c7791f1dc4fc6d3828ce751329e81643c43c978cac9782693f18c23e3e943c6d3998ca7928c2749c6338f8ca70719cf7d643c8f90f1ac24e31940c6b38c8ce729329e85643c23c9781693f13c43c633898ca70b19cf0c329e12329eb9643cddc978cac878fa92f1b422e379988c6713194f7f329e89643c43c878c690f18c20e3e946c6d3968ca701194f8a8c673a194f4b329e39643c6dc8787a93f1dc4bc6f31019cfe3643c2bc8780693f12c25e3799a8c671119cf68329e67eb87a754bd8b87e37d0a174e6510df063c9b1cf8e3a89c497c0f33ceb13495573b0caf36185e15419aade0df0e07fee541beb26e9997fc3cb3678e62563cd2b7637b3f782109a3689b9cf29426135066996a6a1f77008f8be38723dfd3edd84ea34c0b2dbe4b1aacab3b1d94d3b6efc8fc4e4bdec541bc5eecaa8517bb2c3cbbead90bc92f5be6ad39c8ec7df63e47317b9fbdcf51ccde67ef7314b3f7d9fb1cc5ec7df63e47317b9fbdcf51ccdee7fa61f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcf7563563c8b745c5813906e1109a368dbdcf2a4df375a149c3be519f36510df053c3b1cf8e3a89ce967c8771b655a149cefbba4c1fd6bb78372daf61d99df0ddb211be69d39c8ec7dae1bb3e259ace38bf46f02d22d2661146d875b9e743bb6383877aaa91ddb0d3c2eda7947e54cb763554699165b7c9734b87f553928a76ddf91f92ad80e559ed9335b9815cf121d17d604a45b42c228da2ea73ca9f4fb8d4b8273a79adab12ae071d1ce3bf23ddd8eed31cab4c4e2bba4c1babac741396dfb8ecc4b7ed932efcc4166efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fb7ce1f8ac78e49bc0c29a80744b491845dbed94a763badf616970ee9467cc97417c0ff054c5ce93e97770e07bbadf61af51a6a516df250dee5f7b1d94d3b6efc8fc5ed80e5f75e69d39c8eceb46fd30fbbae199a3987dddf0cc51ccbe6e78e628665f373c7314b3af1b9e398ad9d70dcf1cc5eceb86678e62f675c3334731fbbae199a3987dddf0cc51ccbe6e78e628665f373c7314b3af1b9e398ad9d70dcf1cc5cc503714cf321d17d604a45b46c2285a955b9ef4770f9605e74e79c67c19c4f702cf1e07fe382a67fab99d7d469996597c9734b87fed73504edbbe23f3fb603b7866cf6c63563ccb755c5813906e3909a3687bdcf2a4dbb1e5c1b9534dedd83ee071d1ce3b2a67ba1ddb6f9469b9c57749837575bf8372daf61d99df0fdbc1337b661bb3e259a1e3c29a80742b481845dbeb9627dd8ead08ce9d6a6ac7f6038f8b76de5139d3edd801a34c2b2cbe4b1aacab071c94d3b6efc8fc01d80e9ed933db9815cf4a1d17d604a45b49c228da3eb73ce9766c6570ee54533b7600785cb4f38eca996ec70e1a655a69f15dd2605d3de8a09cb67d47e60fc276f0cc9ed9c6ac78faebb8b026205d7f1246d1f0fce750fc3ca50983474d35b563871cfbe3a89ce976ec7060f7fd10f82e69b0ae1e7650ce3cc857d62df387613b64c3bc330799bdcf7563563c03755c5813906e2009a3680781e748fc3ca50983474d35b563471cfbe3a89ce976ec6860f7fd08f82e6970ff3aeaa09c7990afac5be68fc276c88679670e327b9febc6ac7806e9b8b02620dd201246d10e03cfb1d87932df37461e35d5d48e1d73ec8f9b7266dab1e381ddf763e0bba4c1fdebb88372e641beb26e993f0edbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219a2e3c29a8074434818453b0a3c2762e7c9f43b208f9a6aea7738e1d81f37e5ccf43b9c0cecbe9f00df250dd6d5930eca9907f9caba65fe246c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a67a88e0b6b02d20d256114ed38f09c8a9fa73461f0a8a9a67e87538efd7154ce74bfc3e9c0eefb29f05dd2605d3deda09c7990afac5be64fc376f0cc9ed9c6ac7886ebb8b02620dd701246d14e02cf6bb1f364fa4f91474d35b563af39f6c74d3933edd899c0eefb6be0bba4c1ba7ac64139f3205f59b7cc9f81ed900df3ce1c64f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcfdee72866efb3f7398ad9fbec7d8e62f63e7b9fa398bdcf178ecf8a67848e0b6b02d28d206114ed34f09c8d9da7633261f0a8a9a67e87b38efd7153ce4cbfc3eb81ddf7b3e0bba4c1fdeb7507e5cc837c65dd32ff3a6c87af3af3ce1c64f675a37e987dddf0cc51ccbe6e78e628665f373c7314b3af1b9e398ad9d70dcf1cc5eceb86678e62f675c3334731fbbae199a3987dddf0cc51ccbe6e78e628665f373c7314b3af1b9e398ad9d70dcf1cc5eceb86678e6266a81b8aa75cc7853501e9ca4918453b033c6fc4cf539a3078d454d3733b6f38f6c75139d3cfedbc19d87d7f037c9734b87fbde9a09c7990afac5be6df84ede0993db38d59f154e8b8b026205d0509a368afbbe549250c1e35d5d48ebd093c5f8b9f27ddaebe9905cfd780e7adf8794a1c9533a9d6fb75608f6bbdcaabb70dafde34bc2a8234c8f0b603fff2205f59b7cc4b7e9ed9334731635b28ac0948f70609a3686f018f8b764395bdb55e97acbf61180637adcef76cfcf996e2354b43bd5ee190fc0a20cdfdcdaad30ed36c85f07fd96eaa3c670ccdd1b76f4a6cef4bc8bce45718d4db35448dd734e8858be7fcb33deea31712ff2c88af5ee37e8e79b9f8b652b6ef5c9cb6f0c458f692a8f74d5c7cc74e95bd8d5e97ac5feda3539b3af5bc14f73d693fda18652e80342da0fda884f6c3d656b8de37f302fbbe991f54b767c255ac75f3dec4675a977467213db639fdf52fee9ffda1acaedac5a86b126c17cdb6dba5f7e6fd3133ef22f0e52ca967b6eb38f471a0857b200137d6c7fadccf64ddb67b08030d1fd93cc36d7dd6e2e3200bf720026ec6fd7a90e1239b679fb75f0fb1700f21e066dcaf87183eb279f679fbf5500bf750026ec6fd7aa8e1239b679fb75f0fb7700f27e066dcaf871b3eb279f679fbf5080bf708026ec6fd7a84e1239b679fb75f975bb8cb09b819f7eb72c34736cf3e6fbfaeb07057107033eed7b5ed2765daaf1dddff4ef793a2676aaae99ee159a7fe64be579fcdf327af018f8b3ae5a81e241ddd734df7939ae30f9c35bcc2f1071cdf97adf1bb44929f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e667cbf17fb5724ddeb248ca2397e363fdd9fd156af4bd6af9efd9d7d99cb7c5349ecf794e7924d8e0248f3efd756a79dafd9b07f11fb454f1b9acb6d698e3f2df3925f219407ebbfab77b5a3ead6eb96bc8b63cb3b55e1c6e354f2d2701d1705d5dbf994511ef4f464ecf99feb699ee1e949c77967fbbe04f238e88b2d7154ce745b70c22893e97111a46901e53ce1a09c7990afac5be64f008f4cf9c0e3aa0e06064f60f147a6d1643c83c9781e22e3b9998ca73719cf55643c73c87852643c6dc8782e22e39948c633828ca73f194f5f329eebc978ba93f13425e39941c6d3858ca7808ce719329ea7c8781e21e3b9958ca70f19cf1d643cd790f1cc23e34992f124c8782693f19493f10c24e3b99f8ce746329e9e643c9793f1cc24e3e944c6d3888c673c19cf30329edbc9781e23e3b98d8ce76e329eebc8781690f1b427e32924e3994ac65341c633888ce741329e62329e5e643c5792f1cc26e3e948c6d3848ce759329ea7c9781e27e3b9978ca739194f37329e96643c9792f14c27e36940c633868ca72d19cf10329e87c9785a91f1dc42c65346c6733519cf5c329e12329efa7827201b9e8bc9782691f18c24e31940c6731f19cf0d643c3dc8782e23e3a924e3e94cc6d3908c671c19cf50329e47c9785a90f1dc45c6732d19cf7c329e0e643c9790f14c21e31945c673868ce749329e07c8786e22e3b9938ce70a329e59643ca5643c8dc9782690f1b423e3194ec6d38f8ce71e329e66643c5dc9788ac878a691f1b426e3c923e04904e77f4b2701ff7f0d34f9e60b7e2f2cdfb23ee9a796f4eab838a7f9f9ebceb7acfba485017d3a0e6529d3f1e4179bcef9ce4d9e5eafcc4b7e85c0719284a73519cf34329e22329eae643ccdc878ee21e3e947c6339c8ca71d19cf04329ec6643ca5643cb3c878ae20e3b9938ce726329e07c8789e24e33943c6338a8c670a19cf25643c1dc878e693f15c4bc67317194f0b329e47c9788692f18c23e36948c6d3998ca7928ce732329e1e643c3790f1dc47c633808c672419cf24329e8bc9784e93f19490f1cc25e3b99a8ca78c8ce716329e56643c0f93f10c21e3694bc633868ca70119cf74329e4bc9785a92f17423e3694ec6732f19cfe3643c4f93f13c4bc6d3848ca72319cf6c329e2bc9787a91f11493f13c48c633888ca7828c672a194f21194f7b329e05643cd791f1dc4dc6731b19cf63643cb793f10c23e3194fc6d3888ca71319cf4c329ecbc9787a92f1dc48c6733f19cf40329e72329ec9643c09329e2419cf3c329e6bc878ee20e3e943c6732b19cf23643c4f91f13c43c65340c6d3858c6706194f53329eee643cd793f1f425e3e94fc633828c672219cf45643c6dc87852643c73c878ae22e3e94dc6733319cf43643c83c9784693f1e41b3cf87ff56e8f3caf7d42ff16c0ff97e987099aea75491a3946ab7b27c70c4d95f7a8a3f21e0baaa732983f0ae515f663c073cc11cf7183c7ccbb10e203c1b32386a6180f3b623c6230cafc616014ff8e00cf11473c470d1e33ef42880f02cf0e199a623ce888f190c128f3078151fc3b043c871cf11c3678ccbc0b213e043c3b60688a71bf23c60306a3ccef0746f1ef00f01c70c473d0e031f32e84f850f06c9fa129c6bd8e18f7198c32bf1718c5bf7dc0b3cf11cf7e83c7ccbb10e2c3c1b33d86a618ab1c31ee311865be0a18c5bf3dc0b3c711cf5e83c7ccbb10e223c0b3dd86a618773962dc6d30cafc2e60acd2f1ddc0b3db114f95c163e65d08f172f06ca7a129c61d8e18771a8c32bf0318c5bf9dc0b3d311cf2e83c7ccbb10e215e0d97643538cdb1c316e3718657e1b308a7fdb8167bb239e1d068f997721c4fb8126bc5d40dbaae39d41dba2e39d40dbace3a5a0bdaae31d41dba4e329d036ea7809681bc40fd0d6eb7807d05ed1f1f6a0add3f1aea0add5f16ea0bdace3dd415ba3e33d407b49c77b82f6a28edf09da6a1def05da0b3ade1bb4553a5e06da4a1def03da0a1dbf0bb4e53a7e3768cb74fc1ed096eaf8bda02dd1f1bea02dd6f1fb405ba4e3f783f6bc8e3f00da733afe20680b75fc21d0c6eaf8c3a03da1e38f80f6868e3f0ada9b3afe18686fe9f8e3a07d4dc70780f6751d7f12b4b7757c3068dfd0f1a740fba68e0f03ed5b3afe3468dfd6f191a07d47c74781f65d1d1f0ddaf7747c0c68efe8f833a07d5fc7c781f6031d1f0fda0f757c0268efeaf8b3a0fd48c72782f6631d9f04da4f747c32683fd5f129a0fd4cc7a782f69e8e4f03ed7d1d9f0eda073a3e03b49feb7825681feaf84cd07ea1e3b340fba58ecf06ed573a3e07b45febf85cd03ed2f179a07dace3f341fb44c71780f61b1dc7ef68ff56c78b8378dbf74f83eaa918f296fc549adfe97823238d2c5b00690af5cd4875bfa328a86effe578a03469ffb78226edff16d0a4fddf0c9ab4ffaf8226edff26d0a4fddf089ab4ff1b4093f67f3d68d2febf029ab4ffeb4093f67f2d68d2febf0c9ab4ff6b4093f6ff25d0a4fd7f113469ff578326edff0ba095e9f82ad0a4fd5f099ab4ff2b4093f67f3968d2fe2f034ddaffa5a049fbbf043469ff178326edff22d0a4fd7f1e3469ff9f034ddaff85a049fb3f163469ff9f004ddaff374093f6ff4dd0645ffb14343926bc059a1c13be069a1c13be0e9a1c13de064d8e09df004d8e09df044d8e09df026da48e7f1b3439267c073439267c173439267c0f343926bc039a1c13be0f9a1c137e009a1c137e089a1c13de054d8e093f024d8e093f066db28eff04343926fc14343926fc0c343926bc079a1c13de074d8e091f8026c7849f8326c7840f419363c22f409363c22f419363c2af409363c2af419363c247a0c931e163d0e49820c78826a0c9fd6a3525bfe05414544ff99097309505f11e73702a83f87c28bb4c8bc978d690f16c25e3b9998ce72a329e36643c1791f18c20e35941c6d39f8c673d19cf6e329e5d643cd793f11c23e3394ac6d3948ca7808ce745329ecd643cb792f1dc41c6730d194f828ca79c8c671919cf40329e75643c3bc9787690f1dc48c673848ce73019cfe5643c8dc8785e20e3b99d8c671319cf6d643cd791f11492f15490f12c21e31944c6f33219cf27643cdbc8788ac9780e91f11c24e3b9928ca70919cf4a329e0d643ccdc9785a92f15c4ac6d3808ca72d19cf22329e21643c2f91f17c4ac6d38a8ce716329e2d643c07c878f693f15c4dc6739a8ce762329eed643c6f92f12c27e379858ce706329ecbc8781a92f10c25e3594dc6f32a19cf3e329ebd643cd792f15c42c6f31619cf52329e33643c6bc9786e22e3b9828ca731194f3b329ee1643cabc8783692f1ec21e3a922e36946c673828ce738194f11194f6b329e3c029e047004a0c9ff1b8026efeb9e014ddeef3d0d9abcebbb1d347937780168bfb668f9163e61f818347937631e6872bdff1168f2cce05cd0e4bc41f257f38b9a9fcf9f6f2967030bff479672ceb32c8bdb5b96290be2ddde98575970fefbd785c0318f84a735194f1119cf71329e13643ccdc878aac878f690f16c24e35945c6339c8ca71d194f63329e2bc8786e22e3594bc673868c672919cf5b643c9790f15c4bc6b3978c671f19cfab643cabc9788692f13424e3b98c8ce706329e57c8789693f1bc49c6b39d8ce762329ed3643c5793f1ec27e33940c6b3858ce716329e56643c9f92f1bc44c633848c6711194f5b329e06643c9792f1b424e3694ec6b3818c6725194f13329e2bc9780e92f11c22e32926e3d946c6f30919cfcb643c83c8789690f15490f11492f15c47c6731b19cf26329edbc9785e20e36944c6733919cf61329e23643c3792f1ec20e3d949c6b38e8c672019cf32329e72329e0419cf35643c7790f1dc4ac6b3998ce745329e02329ea6643c47c9788e91f15c4fc6b38b8c673719cf7a329efe643c2bc8784690f15c44c6d3868ce72a329e9bc978b692f1ac21e3594cc6936fe139ed8847de9d9475cbfce9af78de478dbc8f5e20791f36f23e7c81e47dd0c8fbe00592f77e23effd1748de7b8dbcf75e2079571979575d2079ef32f2de7581e4bdc3c87bc7059237f3798bfa3e865c639fd0bf09f83f8edbbddd11e3698351e6b703a368f85da4fe8e78a2ce79fa13e4adbc18a8e372af2f01ff1f088caeea547f8351e66d750ac7a51ee88827ea5c6d2041deca0b79c64bfaca13f07f1cf7cb559d1a6830cabcad4e1d069e418e78a2ce310711e4adbc907724e459d304fc1fc7057155a706198c326fab5338aed510473c51e7c64308f2565ec83bcff2ee5802fe8fdfe97655a786188c326fab5338cec450473c51e7f44309f2565ec83771e4db0209f83f7ee7d4559d1a6a30cabcad4eed059ee18e78aa0c9e2a8b175f56deca0be963d8a37f13f0ff11c0e8aa4e0d371865de56a7aa806784239ea86ba81104792b2fca755cfa1613f0ff72607455a746188c326fab53bb80a7dc114fd4b55f3941deca0b79c65d9ecd4bc0ff71dc5c5775aadc6094795b9dc271e82b1cf1445db356d443de51d75ff59177d4b5447de41d755e5c1f79479de3d547de51e72bf59177959177553de61d751ca98fbca3da44bf7ffbfd3beebcbfcc6349959177553de6fd65eedf5f669bfa65b62dfebcc5b76bf595b73f6fe13e6ff92cbebc93787dda24c6f5e27d816dfa17efed6c054deeb56c014dee976d064dee79be0a9adcb7de049af43d6c044dfa8fde024dfa00b16f52bef97b1c3479260dfbc4648c89a3a0c95814d817f32b1d3f0cda1c1dc73e80d93a7e10b45fea38de7b9ea5e3fb41fb858eef036da68eef05ed431ddf03dacf75bc0ab44a1dc77b3c33747c17681fe838de5b98aee33b407b5fc7df046d9a8e7f0ada7b3a5e01dacf2cda541ddf00da141d5f0fda4f75fc15d026ebf83ad07ea2e36b419ba4e32f83f6631d5f03da8f74fc25d026eaf88ba03dabe3ab417b57c75f006d828eaf02ed873abe12b4f13abe02b41fe8f872d0beafe3cb401ba7e34b417b46c79780f68e8e2f066d8c8e2f02ed7b3afe0968a375bc1cb47c1d1f015a031d1f0e9abc17341434f9d6eb10d0e47dee41a0c937df0782d644c7fb8326cf92e37834f27d491c8f46de01c4b16ce43bd31f8126df6ec0b167647c101ca346be71f52bd09aeaf81cd0e45bb2b34193f7c57f099a7c537e1668f29d9f5f8026cf86cf044dbe17f92168f28ee1cf4193ef58578226df8698015a331dff0034f966d574d0e4bd9df741936fd54e034ddeb77e0f34f966fdcf402bd6f1a9a0ddace35340bb45c77f0adaad3a3e19b4163afe13d0e4db13934093ef2dfc1834f966d88f406ba5e313419377279f054dc6b77917b4363a3e0134f98edc0f416ba7e3e3416bafe33f00ad838e7f1fb4a48e8f03ad44c79f012da5e3ef80d651c7c78056aae3df03ad938e4bbba0f63fb55fbea6e7cb82f8cea7547e678373a73c63be0ce2c2803c719e6315010fe6752af6b2a792f8cc53be5eafd4975390f789d8f34ea6f33ea9d755a0d77bc2c8bb00d2fceddaea6d734c6b0df472a78de5f01a58d62dcbb405fdb8b1eea6babc271d95f784c124dce883a469a01b4d752c3ba8e38e9ea54aa97d40ea5a001ee25406717c5e307eaf52493c07af0dcf49e0897f3f4996b8aa13b86fc5d986d8ee019975ad08d2e09893c71df887fbbaac5be6253fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8a47fa13b0cf5cd2bd46c2281af6759d8c9f27897daeb27ed5afb311fa755cf7ef35d4eb6d6794b900d27c047d4e5b74bc10fe2fdb2d6a5b3ae827ac715b4a7e85509e93c0e3a2bf380ff292759fb27821f1e2d8f24e55b8f1389554cf99a83ef6d386afaf593c75b5bf62df2d7a8afbeb598307fb460b81f775fd9b80f5bc0e6570b08fd7582f243fdc974e8126f1b3c0e8623be3b144da83b67a1efba625cd69edadf48bc7bfed534997edc631285359707efd2e80346f40dbf7968ee3b321af816fef5afe2f534dfdd4e29f2af391f8cb9cc467e065fb1eb1e47d085863cafb9ce7eff374907c442f80f80fafab4e2be9c40ff15ad8f1fbd6c86e2e77d658ae08d21cb594bf2c88b7fc470c9e2306b3da266f433d7b178effaedaa4a3111eb5058f240d9e07b9fa668fd9460a87e4a7d2c8f66f64a4c1731649f301b451aa2cd2ce4b39f1d9163c06b83a8ebd66944fe66de7c62781d12ca3aa1fb32fabe6bdd09ffffa03b417713ffff507a843f89c5660acbf1dac5fb81a05d1c71649f367e338eae21a03b7a5e927fa2c69fe02edd00dfa61dc6ccef5bfacebb6a873fda30e7812c1b9d7de6aaae9f88ec798630e781c9533693b761d37ca5404695a40391d9cc7d4f81ee111c8dbc536472fe41cea84e14501a4f99f46db11e5235eab9eac97b2a4ace783ed2c6591349f19edd461074c2eb7db2128935aef294b59254d8366d5be34d4f1046c27bc6f72a5e5ff32d5d41e887faacc07e22f7312dffd94ed7bc092f73e608d29ef73de3b95f37dc947f402885fd1ac3aada4133fc46b6157fb88bcdb86ece672278ce58a20cd414bf9cb8278cb7fc0e0396030ab6dd204ea99d42397ede6c1088fda81479206ef1fcbb11ddf6fb41df75d3c5f5dd371ff14309aed269ebbb86433bf0b6bde43b59d0f4a1a3c279334b768e6a6c1b9efe3609bb3d1ed33ff25f8fe6a00e5088cb206069b239f4bd167f31e601bd04d9fe57fb66b86b6e0737ddc9f166ef35a00af4784db3ccee0f5480970ab7a2fdb09ef238af686fe75744e5e8ad75b728c31cfc9f13e5a1760c76585eb754b59c403499b0fff97ff7d16d8af4f3e6f39337ec65846f9fb8691ce964f135836b677354a924993ffb4c1896db3a4b3f92afb01d6395997b9afe07d5149d3d76893ccb46adb4f6d5aed8f6c47f10edb13ac93aefa60ce18e59779c94f31ca3da033c0e3e23e4ab6ef4fb9becfe6a88d4ee2bd8bf8beffd06d94ed9ecb6b865745c1f9f7335cb6e9517d39272c79c7e7456ab4adbfdfe6457df6f7477971dc92777c5e74aeb0b573362f8e59785cdc7fa9c98b6396bc63f462aced9e88cd8ba3161e57d7db515e1cb5e41d9f175dacf7ab6c5e1cb1f0b8baee8af242f2cb96f918017313231e4fdea5a3f0be544d5e1cb6f0c47f4faa662f0e5bf28ecf8b92ce35f57fa217872c3caefa31a3bc3864c93b3e2fba76b3ddbfb07971d0c273b09ebd3868c93bc67a31c6767fc9e6c5010b8f837b8d357a71c092778ce7879df15e634d5eecb7f0ecaf672ff65bf28ed18b72db7d509b17fb2c3caeee834679b1cf92777c5e8ceaa4f2de5b0b2ff65a78f6d6b3177b2d79c7e745795795f79e5a78b1c7c2b3a79ebdd863c93bc66ba874bda8aa851755169eaa7af6a2ca92777c5e8c4e9f6bedae8517bb2d3cbbebd98bdd96bce3f322993ea6eeaa8517bb2c3cbbead98b5d96bc63ac17e9ebc99db5f062a78567673d7bb1d392778cc79174bdd8510b2f76587876d4b3173b2c79c7e7c5d8f4fda7edb5f062bb85c7d5b88c515e6cb7e41de33d9774bdd8560b2fb65978b6d5b317db2c79c7e745c7f431756b2dbcd86ae1d95acf5e6cb5e41d9f1763d27d625b6ae1c5160bcf967af6628b25ef18cf3bd3edc5e65a78b1d9c2b3b99ebdd86cc93bc6f3cef4fd8b576be1c5ab169e57ebd98b572d79c7d876a6cf3b37d5c28b4d169e4df5ecc5264bde319e77a6bdd8580b2f365a7836d6b3171b2d79c778de993e8e6ca885171b2c3c1bead98b0d96bc63ac17e9b6737d2dbc586fe1595fcf5eacb7e41de37dad74dbf94a2dbc78c5c2f34a3d7bf18a25ef18af47d2f7f8d6d5c28b75169e75f5ecc53a4bde31f615a5cfc1d7d6c28bb5169eb5f5ecc55ac8dbd5fb3a92873c8bd5daf0a200d2fc87f12c56948fb20e7cae0ccbf272ec65c93c57b626a22c2f435924cdff369ee55be380c95159d375e62528935aef594b59258d7c085ff992afe309d826af836f9759fe2f534dcf20897faaccabe32f73baaebe009c65900fe6bd0a5863cabb04f39667d3251fd10b20deb479755a49277e88d7c2aef69117751cd9cde5d61acb15419a172de52f0be22dff6a8367b5c19c7eef01ea99d423376d5786e9c5088f5a834792069fd93beb88c77c865038243f9546b67f23238d2c5b0069aed31eca73bbf21ca49433119cffdca4a3b6ac04d965dd322ff9e1fbb2a780d12ca3aa1f83e1d9cf0e5a6f1f546b25c20deb29353455d64e8eca2a79c9ba65be1330ca9814a5f5cf98aa2d63478351f17471e0198eb321534dc78b2ec0d3d9018fa372a68f435d8d327532ca540469f0ddc6ae0eca9907f9caba65be2be4ed629ba317724cbeddf0a200d27481f6ac261f651daafe965acad2c3715964ddd22ef5a887bcbb1979a78cbc13c1b9db39086adebfba01737707cc6abd3de35f6f7affba53af4bea94e4938232f5020fe22a13e62de779928fe805107f18cef3249df821c72f61577559b625b29bcb7531962b82343d2ce52f0be22d7f4f83a7a7c1acb6491f38b773b03fa4eb400f8343e653e05dcf08ef7a807792068f7f1d1c79d7dde091f90ec023e7385d41937305e14fc0ff93f5c06db67b5d2ddca27503c60e16c6d2f819d3e73a1d0c46992f0546d1ba034f37479e99dbfa76c31f3c2e3732d2c8b20590a61c8e8d094b5ab5dffd2b944bc62e8c719c9f749bdec8815f38ae6200fe04868701f825e56ce880e7e2a07a6cc5199553a6973f33a6ff984cd7a3a0151898f89b6729463e68186f60d182e0dc21240b409321241b82966fd88243574a7a19d2ce855de887acbbc0e06c022c71e68dc36fca5453d5690c3c2eaab2aa3a97e875e9aa3368faf8ca31583f1a1a9c75a93bea7f0d6a4817b52e57dbc1dc27ca60deac83058ef26f00e52d8379c94f6d9b421d9f5a5ef16c9fe9cfcc9c346672e50c34cadcb1319e179cbb01ccdf28c35ded745801b0c0d8383434ca850d86fc4f36ccc5f17396e218b7a63701e427d3c5e0db450e7c53eb97b16a2bca274eec3773d4c4f1157d674eaea81c3f65326ecd268673515b5afedf08345b138f69d584cd162edbd8a2d9261c15b8096872e4ba0834e1b918b4061097f4e69671525d5bc0fa659752ff53e634d4056f1c545701391cab7655edbfea54eed220732a745990d99c6aa86135b4b01a4a580d1dac860a56a36caaaf5aa89e1c75f6a486f65543f9aaa17bd550bdc5416628de5b82eaa176d5f42e70de16644eb5d4d0b9ad82ccd0b8ea76a57a5d5d7dda4d7d4a439db2ab534b759aab2eebd42588baada64e3dd52d0b75fb4a9dc6a9536475faa74ed9d42588baf450978aead2a9b7f6ba4f18ee0ac3dd61b8270cf786a16f18ee0bc3fd6178200c0f86e1a1303c1c8647c2f068181e0b43bf303c1e6486921e10862782cc50d34f069961a807079921aa9f0a32c3570f0b32435b3f1d6486bd1e196486c41e156486341f1d6486ce1d1b6486da1d176486f09d106486069e1864861c9e1c6486329e1a64864856c329aba197d590cc6a486735fcb31a2a5a0d213d370cf382ccb0d30bc2b0300ccf85e1f920336cf7e22033ccb71afe7b5990192e5c0d23ae8617575d09aa0b45752da8dbf6aafb4add5a565d5aea96b7ea8a555dd3aaab5e3dbaa01ee5508fb6a8477dd4a34fea5130f5689c7a54503d3aa91e25558fd6aa478dd5a3d75541e6d1fcbd41e6d50df52a8b7ab547bdeaa45efd3a1c645e0d54af77aad725d5ebbfea75e89341e676b67ab55e7571aadbd8ea96bebad5ad6ebbaba1e5df0ac3d7c2f0f530bc1d866f84e19b61f85618be1d86ef84e1bb416658e27782cc10c83f0832c328abfaa8866cfe719019f6f9a7416688e9f782cc30d51f049921b13f0c32c36aab21b8d510debf0e32c380ab61bfd5f0e7bf093243daff360cbf0bc3df85e1f761f84318fe3e0c7f0cc39fc2f0e730fc4318fe310cff1486bf84e19fc3f02f61f86b503df4353616bfd73337ebf9f2caca3193a65616574e299e347362e5f8a913e716cf1e5f39ae78caac31d3c74e9c321b175ea39b2719b7bbcff4e9e5738bc74f1e3d664ef1949995c553c6168f9a3273f2e8730ed4c7f442d79f9f63f9e8d1d1997d23ff0b907ea78e99bea7979311d11fa8b96c3faf8b211fd565a1ff55c702cdd1472fb97d322073ae5b3c63e294cae264f1e4f06f78709d327bcce8f6c5f8bf19a1c9332a8b6754964faf2c1e3b7dcaa4e292f6b8de8f1bd7a110ffded80dcc2557d5cd9ccff4f8ce75aa62a7aeab8303ef5f5737d2df5ff70548ff54c74cff475d4af87febb2d0cdcdea46d8a659a42d33668eaa9c5e5e5119bd70f28b2cdcb9591d8a796f1d8bf9dfeb92d97fd665a16b9bd78db073f33a6436328bcc82ff07d6af973f08fc04009b2d6c6f000000212f1f8b08000000000000ffed9df77f1cd5d5c667d55cd65acbbd0202e322abad569265b9ca40006363834d31cdb8c960b02d638b964220150209bca9d4407a25bd92de437a4842494823fd87fc0bf9bce7cedef3ead1f51dbd5a31573963ce7c3ec773e7f1ddb9dffbcc99bbab3bb3b3b9a8bcfc932267cbd5148ba2e317feff3ebb2ebeb8a523c57d154372e632c2599511ceea8c70d66484b336239c7519e19c9011ce8919e19c9411cec919e1cc6784734a4638eb33c259c808e7d48c70366484735a4638a767847346463867668473564638676784734e4638e76684735e4638e7678473414638176684f3a48c709e9c11ce5332c2d99811ce5333c2795a8a9ccdc0c973e1a7dbf562bb5e62d74bed7a995d37d9f572dbc71abb6df6d942d14ad1e6fc5fbb61a63093e225e7ff3a29ba28ba2956d8ff6bb4ffd743b192a2976215c56a8a35146b29d651acb79e6ca03883e24c8ab3285e467136c53914e7526ca4388f6213c5668af329b6506ca5b880e2428a6d14db292ea2b898e21287e5528a1d1497515c4e7105c595145751eca4b89a6217c56e8a3d147b29f651f453eca7b886e25a8a0314d7515c4f7190e210c5618a018a231437501ca5384631487123c54d8e673753dc42712bc5cb1dce5750bc92e25514b751bc9ae2768a3b285e43f15a8ad751bc9ee20d146fa4b893e22e8a3751dc4d710fc59b29de42712fc57d14ff43f1568ab751bc9de21d14efa47817c5fd140f503c6859f8447888e2618a4728de4df128c56314efa1782fc5fb28de4ff1018a0f527c88e2c3141fa1f828c5c7283e4ef138c527283e49f1298a4f537c86e2b3149fa3f83cc51728be48f1258a2f533c41f1158aaf527c8de2eb14dfa0f826c5b728be4df11d8aef527c8fe2fb143fa0f821c593143f723cff31c54f287e4af133abfddcae7f61d7bfb4eba7ecfa5776fd6bbbfe8d5d3f6dd7cfd8f5b376fd9c5dffd6ae7f67d7cfdbf5efedfa0f76fd47bbfe935dffd9ae5fb0ebbfd8f55fedfa6f76fd77bbfe875d9beb6333a695cb13a3a1a52f4a69cce9eaef35f3e36ca67bfdcd5cdba9b6ffc7eb46abd7d86d5ee7ac5e6bb76b1dbdce6ed739fb9968b7273a7ac16e171cbdc16e3738fa74bb3dddd167daed998e7eaadd3e15f4bcfdbf72c7ca2ba3555b29071ae75f1568b556ab06ad8e7707da04abd582c6c7b70eb449569b00da64ab4d042d6fb549a04db1da64d0eaad9607ad60b529a04db55a3d680d562b806653339a0ada74ab358036c36ad3409b69b5e9a0cdb2da0cd0665b6d266873ac360bb4b9569b0dda3cabcd016dbed5e682b6c06af3405b68b5f9a09d64b505a09d6cb585a09d62b593406bb4dac9a09d6ab553403bcd6a8da0f179792a68a75bed34ab999ce2712e7e8dd5ab403b9dcf65d016f3790cda123e87415bcae72f68cba06dd69af87c066db9d5389fcdffadb0e5be28adb1acb4c7ecb727edfdd29ecd7e7bd3df6fd18c8daba221affba09d1ef06ab52da7784f4007b69db3c1edb05e03e5b3a12ed7633f784c627633ceacb4e5d523bc6e85f3ba02d459e9e97f5f946eff7b1d9e5e87b916ca817276bfe6eca8978a73f622a8ebe61ebf3f9e8839bb1138d2cfd9ce4ecdd9512f15e7ec1ea8ebe61e7f563b1173f652e00890b33d6172b654d49c2dcf8f44913ff7f8ef86133167fb8123fd9cedd69c1dfd5271cede0675dddce3bf614fc49c3d061ce9e76c4f8f7e3618f55271cede0375dddce3f994133167ef008e0039bb47c7d9512f15e7ec8350d7cd3d9edb3b1173f65ee0483f677b03e56ca7e66c54bed61545fedce379e61331671f018ef47376afcecf8e7ea93867bf0075dddce36b1e2762ce7ecc96cd75869fdbeb0c0b41fb85d54e02ed97563b19b4a7ac760a68bf826b83acfd9aaf1b82f61bab9d06dad3ce3555a33d63b5d3417bd66a8b417bce6a4b40fbadd59682f63bab2d03ed79ab3581f67bab2d07ed0f566b06ed8f566b01ed4f566b05edcf566b03ed05abb583f617ab1541fbabd53a40fb9bd54aa0fddd6a9da0fdc36a5da0fdd36add5633d724f9dad7f7ad3611fade17a597a3f1f5ae68f89273b6fba0bc3c2c4fb1100dbf0f88db6a49bfad4ed3f7e668f47d6f019ed6007dcf431ba3e169059eb6f479e2efc9b5a7bfdff818373b9ee6a1ad66e8573140bf72d016ef9bb7b9bd0268386e143d8c1de93396f05e27de376f7700236b388ef138cce78f798ff917f0063897e2cf19dc1e7fff97395a40e73adf6a1862fbb7d5eae1ff714c6f73b4407919e705b7c5fbe6ed7660e4feb48d3f6369b48cad0e63a83122076df1beddb6f17c5f3efe9e8deab81640fb2f8c49a5b18e49f5c0d6048c4d817c4c3ad652da0ef17e958336786c63cfdb41e73acf5595d7666c9b9c1b620b70fe952afdfc86e341fa795c2ae2793d1a9e22f08438f7039daf457cdfff4f946eae951cafda1caf0a50a703fc2b05f06fa4cf21dc9e322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb67c6fb2ff0fa26d76b12c2c85a3bf08498e78fbf4bcefbb26b735de721b8ae93fe758b5211af59f27d7b4b9c3ed7409dc77343751fb565dfb541bca6d914d6bb51dd67511f1d7f2d36e435c4a4ebc0beeb978da9b55dda1bea7a9b79ce85792641b3e36b93c7d300f7a90cf334e7788af7c72d73784c9e3e5f35c416e2da5fa5d722d12b2ea7796d0fef31087b5ccae307e74255347cfcc0f799ced4db1e7e0d93af97773a6dd7409dafe4868e0ddf03c9bf75e0def364ea7439fbe6d72c01bdcbd977837d2d73d43afb6f86d7729dafc398ba1b7235c4fd1f382e47d0575cfaa08cd7cdd37f1f2e5fc72f56c053029e10e34ca0cf1b453c07d2be8edfe578e5fb1cc3753ac1bfae00fef93e8bf236b7a7cccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccf299f1bba2cc9a877aed4218c7e9de87f87a063f7784f76faeeb6cad1a6a37f47538bee6b4d4e9730dd4b9af6aa8ee765bae8f8ebfdf21e95806b89e37e2b1e4f6eaa13f782d28d4f7b93b1c9e0e8f175c6e4cadedf275fcf43d1eba8e5f747c6df7781aea7cc56bace8299eaf6d0e0f5e1bad8f8ebfb7240ffb198f7b8792f282dbc373a903342ee3f7a3431c677c2f71efebe1f6f0faf5f5d6db8628d4b12f15438e1bddd0a7bee8f8fcae813a4760ec3b6acb780f07de3b7287e7ff7919e93a35fb17e8396ef1f15d099c7dd00eb6dd0bac29b5dd816de76c703bacd740f9f6aaa1baee73cad86b6637e788fb2c35dfebda9cd715a0ce0a4ffffba274fbdfe3f0f438cce698dc08797607bcff871a93562478b4043ce23af83928d43d79ee18e9dedf88f7edd53975f0330bd7b90bc6a8a4fb477df71c867a1f4bbae7d0f7d9b8048c6e1fddfb3c5feaf7693d00e345daf7693d003984f76945cefe97c2fe99ab2e4a7e6fe13a8f38fb773f93f36bf03e30aef3188c174fc1671df7f337de33351e7f5f25dd27cdede1e71a3cb7ffbfbe1be66ea8df972233e604b2e0e704aef351e798752570b7785efb78c26bd92b7e0e15fefde2fa677c48fd19b2f69cef71fac279bd02fac2753eeb7c060cf59ceff4fb3afc33098f031d9ebe729d2fc1b9f6047cc6e3e3847f773ce9f97f5e46fa0c88cfbd5d957e9fe3e38bcf77ed8376b0ed35c09a52db1dd8367f06e47658af81f20f614ce77aec077bcdece61ce1cf51c8eebeaed3795d01eaf47afadf17a5dbff550ecf2a87d91c93af419e3d099f01438dd5bd091e2d058fb80e7e3788df47f019b2bef79850f7f627bdc7f89e4189e3f35341e7d5fc6ceebc9aef3302d7e1d7e2678467609ccd7beabaf385fc7e99e67dc3f85d896668f7794fbb7d29fbd90abef5c1367e2ef86fb61de0b9a5f17744f0b982cc804b1f9499a100afabca00637506186b32c0589b01c6ba0c304ec800e3c40c304eca00e3fffddeb760c67c0618a76480b13e038c850c304ecd0063430618a76580717a06186764807166061867658071760618e76480716e0618e76580717e0618176480716106184fca00e3c919603c25038c8d19603c35038ca76580719132a6c2b82c2c6369ac8c8627d4ef1356f29b78e3f1fb842d9eb6025c172955da77bc5612e2f96995fe5e223314a2e37fff2b106369ac8c86a72d7d9e8a7f5fb30d3cf3fd0e6600c617f51b52929edb86f7a72f0fcb587a31cf960b715fe7589f1f86f7182c0fcbf8a29e7116e21e824a9f71e6bbe7617958c6d2581943ddcf8cdfe7180d0f7e3faec3e35900c6d25819437d0f02bfab351a9e4ef0ace4f12c006369ac8ca1ee99aaf49e3ebcb7bbd3e3992446e449fbf9a29d9eb6ba05f49d19b2c63829038c9333c098cf00e3940c30d66780b19001c6a919606cc800e3b40c304ecf00e38c0c30cecc00e3ac0c30cece00e39c0c30cecd00e3bc0c30cecf00e3820c302ecc00a3fe5da88cff6d46e4694c8f67d8fc07b615e27bad95f67d858727c5ef7d0eeb3bb615e0192715f71d9f059225c6ee0c30067e9e8dfaa88ccaa88c7a5eab8fe219d547f5511995511995f1a5ce9885315c1933918fa5b1321a9e95813ceba980672578c6af5b9e01c6151960ec0ecb581a2ba3e109f18ce13cb4311a9e5ef08c5fb73c2c6369ac8c8627c0f31063cf7a2be0c1e706f67a3c0bc0581a2ba3e1591dc8b35515f0ac06cf56793c0bc0581a2ba3e109f1ecc73cb4311a9e35e0d96a8f6701184b6365343c6bd3e7893d5b5301cf5af06c8dc7b3008ca5b1321a9e75e9f3c49eadad80671d78b6d6e35900c6d258190dcffaf47962cfd655c0b31e3c5be7f12c006369ac8c13414f9127f66c7d053c7de0d97a8f675219bb32c0d89d01c62cf8a88cca288951cf6bf55112a3faa83e2aa3322a637619576480518fb5324a65dc903e63a952c60dc0d3973e4f47a07ec6bfe37586dd578acf962819afce74bc5aef7855803a67807f6706f02f07edf2be799bdbab94f97401cc81da2ef1ef4baf77daeb76fc30cb59765d0b7a1778fa325be6dff0e3faf87b6e5ce712fb8329fcdba0bc54417fcf4abfbf1d239ddbdc1ef2ac11c6b340184faf309e59c278a60ae399248c6789309e6a613c0b85f12c15c6335b184f49184f83309e76613c9385f1340be3a911c6b34118cf22613c6b85f1ac12c63347184f8f309e69c2789609e3c90be3a915c6b35818cf5c613cd385f11485f14c11c6d3248ca74e184fab309e75c278560be399278c67a5309e19c2783a85f1d40be399208c67be309e99c2783a84f11484f1b409e399288ca745184f4e004f3e3afe9e853cfcff06d0aa9cd79af1b366dad0ff9f6df52a78cd39b65cedd9f7d9a0f1b5dd733caf459fce86bef4d972f1c52db14fd8561f6c737bf5c0718e109e16613c1385f1b409e32908e3e910c6335318cf7c613c1384f1d40be3e914c6334318cf4a613cf384f1ac16c6b34e184fab309e3a613c4dc278a608e3290ae3992e8c67ae309ec5c2786a85f1e485f12c13c6334d184f8f309e39c2785609e3592b8c6791309e0dc2786a84f1340be3992c8ca75d184f83309e92309ed9c278960ae359288ca75a18cf12613c9384f14c15c6334b184faf309e05c278d608e3a9f2f06c08c4c3d76f79dfbcbd4148db018e43fcbdf87303f569a3dd57addd2ff3737b3550e7b1baf2da7c7ec2d732977bbd1dff76d8081e6d0cd4173e1e39e7f8046ebb0bef2b88802172fc893c3c21eec708d4cf617998e2f3198ac6abf31cafdc6357803ae7827fe705f0cf97dbbccded29b3322731e3ef5b306b1eea750a6164edaca03c5dc54a7f83e33ce009f15e11c8f7781cdbe4f4a9d3e33bd7c15cdd14a09fbe7387b73779da6e8cd2f562f328bcd8ece1d93cce5e707b95329f9b4166f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466f5597d4e62569fd5e72466093e1b1e7ea606b3e6a15e8f1046d63686e589bf6fd4130d5f72ce761f943703cf7901fc09d4cff81ef2f39d3ef5787ce73a787e9d1fa09fbe7387b7cf87e35009f3a60c32abcf6363363cfc6c4466cd43bd954218593b2f2c4f3c8ead8c862f238d63e7034f88713e503fe3716c8bd3a7951edfb90e9e5f5b02f4d377eef0f616380ecaaccc3e66c3c3cf6860d63cd4eb15c2c8dae6a03ca5f8fb8dbdd1f065a4716c0bf08418e703f91e8f635b9d3ef57a7ce73a98ab5b03f4d377eef0f656380e95306fca20b3faac3e2731abcfea7312b3faac3e2731abcfea7312b3faac3e2731abcfea7312b3faac3e2731abcfea7312b3faac3e2731abcf2f1d9f0d0fff7608b3e6a1de2a218cac9d1f94a733beeeb02a1abe8c74dd612bf06c499da77cdd2180eff175870b9c3eadf2f8ce75f0fcba20403f7de70e6f5f00c7e14467de944166cd8df161d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e6296901b8667b52d336b1eeaad16c2c8da96b03cf1730f5647c39791eedbb90078b606f027503fe3fb762e74fab4dae33bd7c1f3ebc200fdf49d3bbc7d211c076556661fb3e15963cbcc9a877a6b8430b2b6352c4f3c8ead89862f238d6317024f88713e503fe3716c9bd3a7351edfb90ee6eab600fdf49d3bbcbd0d8e83322bb38fd9f0acb56566cd43bdb5421859bb202c4f3c8ead8d862f238d63db8027c4381fa89ff138b6dde9d35a8fef5c0773757b807eface1ddede0ec7419995d9c76c78d6d932b3e6a1de3a218cace1e71f66fb4f7a3cdd0560a982b6428de191d3775e305f78d9208c6781309e59c278a60ae399248c6789309e6a613c0b85f12c15c6335b184f49184f83309e76613c9385f1340be3a911c6b34818cf1c613cd384f12c13c69317c6532b8c67b1309eb9c278a60be3290ae399228ca749184f9d309e56613cf384f1cc10c6532f8c6782309ef9c278660ae3e910c65310c6d3268c67a2309e16613c39013cf9e8f8eb9c78fda41a34be9eb10eb48b6c790368559e36783fdb41e3bfcf791f663c9e3aedf8f6aa3ced6df7708d879fd8561f6c737bf5c0b15d084f8b309e89c278da84f11484f17408e399298c67be309e09c278ea85f1cc10c6334f184fab309e3a613c4dc278a608e3290ae3992e8c67ae309ec5c2786a85f1e485f12c13c6334d18cf1c613c8b84f1d408e36916c63359184fbb309e06613c25613cb385f12c15c6b350184fb5309e25c2782609e3992a8c6796309e05c2783608e3a9f2f05c9c3e4ffc9d32ee7b045cb8f441f9e2c0fe04ea67d1ecf712bbaf14bfcb127f57ed52c7ab0d8e5705a87309f8776900ff72d02eef9bb7b93d6556e62466c3c373ab78bd94ebb50a61646d5b589e787c6c8d862f238d8f97024f8071ac23503fe3716c87d3a7568fef5c07737547807eface1ddedee169bb314ad78bcb46e1c5651e9ecbc6d90b6eaf52e64b32c82cc167c3c3f72a306b1eeab5086164ede2b03cf1f8d8120d5f461a1f2f039e10ef1f81fa198f09973b7d6af1f8ce75f0fcba3c403f7de70e6f5f0ec7a112e61d1964569fc7c66c78784e9b59f350af5908236b9706e529c5bf51d91c0d5f461ac72e079e10e37c20dfe371ec0aa74fcd1edfb90e9e5f5704e8a7efdce1ed2be03828b3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb36c66c3c3df4d63d63cd46b12c2c8da654179cad71d9aa2e1cb48d71dae009e10d76502f91e5f77b8d2e95393c777ae83b97a65807eface1ddebe128e83322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb66363c6db6ccac79a8d7268491b5cbc3f2c4dfdb6a8b862f235d77b81278425c9709d4cff8bac3554e9fda3cbe731dccd5ab02f4d377eef0f655701c9459997dcc86879fb5c5ac79a8d72e8491b52b82f294af9fb647c39791c6b1ab8027c4381fc8f7781cdbe9f4a9dde33bd7c15cdd19a09fbe7387b777c271a88479470699d567f53989597d569f9398d567f53989597d569f9398d567f53989597d569f9398d567f53989597d569f9398d567f53989597d7ee9f86c78f837b398350ff58a421859bb32284f677cdda1180d5f46baeeb01378425c9709e47b7cdde16aa74f458fef5c07cfafab03f4d377eef0f6d5701c4e74e61d1964d6dc181f66cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e6246609b961783ab83dbbce43bd0e218cac5d1596277eee4147347c19e9be9dab816767007f02f533be6f6797d3a70e8fef5c07cfaf5d01fae93b77787b171c875dcaaccc1e66c353b26566cd43bd921046d67686e589c7b152347c19691cdb053c21c6f940fd8cc7b1dd4e9f4a1edfb90ee6eaee00fdf49d3bbccded29b33227319bb6f7a4df763c1e60dbec4fe4f0f0b227b01781fa198f077b23bfc7dc5e01eae031df1ba09f396897f7cddb7be13854c2bc2383cceaf3d8984ddbfbd26f3b1e0fb06df627727878d917d88b40fd8cc783fec8ef31b757803a98a7fd01fa99837679dfbcdd0fc7a112e61d1964569fc7c66cdade9f7adbe5e7a461dbec4fe4f0f0b23fb01761fa591e0fae89fc1e737b05a883797a4d807ee6a05dde376f5f03c7419995599995599995599995599995599995599995599995599995599995599965339bb6af4dbdedf2fc3db6cdfe440e0f2fd706f6224c3fcbf3f70722bfc7dc5e01eae0313f10a09f396897f7cddb07e03828b3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb36c66d3f675e9b71d7f1f07db667f22878797eb027b11a89ff1fcfdf591df636eaf0075f0985f1fa09f396897f7cddbd7c371506665f6319bb60fa6de76f97a1eb6cdfe440e0f2f07037b11a69fe5f1e050e4f798db2b401d3ce68702f43307edf2be79fb101c874a98776490597d569f9398d567f53989597d569f9398d567f53989597d569f9398d567f53989597d569f9398d567f53989597d569f9398d5e7978ecfa6edc3a9b7dd19cfdf63dbec4fe4f0f07238b01761fa599ebf1f88fc1e737b05a883793a10a09f396897f7cddb03701c4e74e61d1964d6dc181f66cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e62466cd0d654e62d6dc50e6246609b961da3e927edbf1f7d9b16df6277278783912d88b40fd8cef7fb921f27bcced15a00ee6e90d01fa99837679dfbc7d031c076556661f339e2713d36b3bbe1f8edba8b26ba31db5e56ad08ed9720d6883b65c0bda8db65c07da4db63c01b49ba13facdd62cbcb40bbd5964ba0bddc96af06ed15b6bc0bb457daf26ed05e65cb7b40bbcd96f782f66a5bde07daedb6dc0fda1db6bc1fb4d7d8f235a0bdd696af05ed75b67c00b4d7dbf275a0bdc196af07ed8db67c10b43b6df9106877d9f261d0de64cb03a0dd6dcb8b40bbc7a3bdd9962f01ed2d1eed5e5b9e04da7db63c19b4ff8132afdf6acb53407b9b2dd783f6765b2e80f60e5b9e0ada3b6db901b477d9f234d0eeb7e5e9a03d60cb33407bd0966782f6902dcf02ed615b9e0dda23b63c07b477dbf25cd01eb5e579a03d66cbf3417b8f2d2f00edbdb6bc10b4f7d9321ea3f7dbf211d0781cb801341e078e82c6e3c031d0781c18048dc7811b41e371e026d0781cb81934ce9d5b40e3dcb91534ce9d9783c6b9f30ad038775e091ae7ceab40e3dcb90d34ce9d5783c6b9733b689c3b7780c6b9f31ad038775e0b1ae7ceeb40e3dc793d689c3b6f008d73e78da071eedc091ae7ce5da071eebc0934ce9dbb413bc996ef01ed645b7e3368a7d8f25b406bb4e57b413bd596ef03ed345bc67181c79fb78276ba2dbf0db4c5b6fc76d096d8f23b405b6acbef048ddf73de055a932ddf0fda725b7e00b4665b7e10b4165b7e08b4565b7e18b4365b7e04b4765b7e3768455b7e14b40e5b7e0c347e9f7c0f689db6fc5ed0ba6cf97da075db328f0be6fc33e70cf799fda887fe357bb85933e73473f745e97e66e2b678dfbccded1946f69bff6f1c194ba3656c73180d4f2980679843bc8cf4b75f09783a02f004ea67fcb75fa7d3a7a2d3a702d4391dfad919a09f396897f7cddb9dd07688638e5ed4dafd2e76bca8813acfda3739b31ac947de87c9df764f5f5604ee0bef9bc7a515e3d07697d376abd3368ebdbc8c747e750173770066b3df9ef4f71b9f5f2bedbe38a7b89d56e8532f7890569fb0ed9c0d6e87f51a28ffbb61a82ed7633ff8fd8bd94d2ef3b14476f77525e77505a8b3c2d3ffbe28ddfef7383c3d0eb339262f340c7104381fe21c58e170f0762b78d793e0dd0af08eebe0fb5f7b20efba1d9e6ea76dc3c39f713a41e3cf0a3807c1ffdf3c0edceeb8d7e9e166ad0b187d9f75dad2671cf1b34e1b30b2d60d3c5d813c738ff562c71f7c5fae73eaf06b6ba04e95fd63af211afeb706d735e7ddbfa05ffc37f37fa274c7f4ba007ee1dff311f813391e46e017f7b33600cfe468e86ffa63830347775fd3bfad7ff7be1ca0d53898b8ce79ba51051a96ab3d5a140d9fbac0294f9ebac029cf2ac7169c32e1fae64f29d32d9e1ee83f7460f0e2c3fd87f71ebdf5c860ffbecd03d72075ad438fa4493d4052d47c3d1a897e5274fcc14ff5cc64b845b0ff9c05a9b69da8b540c6be89d1907d3cb363deadcd8862666acc19694e4e63ad996931332b6626c5cc9c9899123333626642cccc8799e930331b6626c3cc5c98998ac6a83c13711af07c1f18cd5f08e66c37330966e6c0cc14987709f3e9d38cace6938479d733239d19e1cca764f317931939cca86c461c334a98773df36e673e9d9877eb5514ab29d650aca55847b1de7abd81e20c8a3329cea27819c5d914e7509c4bb191e23c8a4d149b29cea7d842b195e2028a0b29b6516ca7b888e2e2a83cf3776954bec27919c5e51457505c497115c5cea83ca3be2b2acf989b197233236e66c0cd8cb799e13633da6606dbcc589b19eaeba3f20cb499713633cc6646d9cc269ad943335b686607cd6ca099fd33b37d6676cfcce699d93b335b6766e7cc6c9c997d33b36d6676edf6a83c7b6666cbccec98990d33b35f66b6cbcc6e99d92c337b6566abee8ecab35166f6c9cc3699d925339b64668fcc6c91991d32b34166f6c7ccf698d91d339b63666fcc6c8d999d31b33166f6c5ccb698d995c7a2f2ec89992d31b3236636e403141fa4f810c587293e42f1518a8f517c9ce2718a4f507c92e253149fa6f80cc567293e47f1798a2f507c91e24b145fa67882e22b145fa5f81ac5d729be41f14d8a6f517c9be23b14dfa5f85e54cec91f50fc90e2498a1f51fc98e227143fa5f819c5cf297e41f14b8aa7287e45f16b8adf503c4df10cc5b314cf51fc96e27714cf53fc9ee20f147fa4f813c59f295ea0f80bc55f29fe46f1778a7f50fc331a9a49c581e209bbc1b37abb0707fb0f1d196c1c1c683c74e3c1c103470ededa78f381c16b1b076eea3fbaffe0c0cdf8e2ebec30c453961b8e1edd7d6be381c3fbfa6f691cb871b071607fe39e811b0fef3b862fbad3be68e1f12deedeb72fb9b1fbab5e04e9c3636cf423f6753c19bc71e4be7d7c2c867c662c2f7a7a8c1dbad8be8bacb1dbdbcbefd48dc70e0e0c36161b0fd3bfbb0fd26bfaf7b535e2ff1d23938f0d361e1bdc7d74b071ffd181438d1d6db8df47ebc6d089671ac6f0a2dcb4d1f73cfa5f16540aa2d9140300", - "privateFunctions": [ - { - "selector": { - "value": 283286945 - }, - "vkHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "isInternal": false - }, - { - "selector": { - "value": 332459554 - }, - "vkHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "isInternal": false - } - ], - "id": "0x1310e0230fe8fa9a6c99193217d165b85d180bb916fc60afbedbe85721600ae5", - "privateFunctionsRoot": "0x2dc1f38d7be98a8e72227d6f8aec393c60db813a1819c9c86b02a00cc18f6687", - "publicBytecodeCommitment": "0x2bbeaacc4ec3ee2fa51a3e2720a5772c6b079629e26e39c4a187fc6e4a56e46a" -}" -`; diff --git a/yarn-project/circuits.js/src/contract/artifact_hash.test.ts b/yarn-project/circuits.js/src/contract/artifact_hash.test.ts index ca49088fa9e..f4611d72b8c 100644 --- a/yarn-project/circuits.js/src/contract/artifact_hash.test.ts +++ b/yarn-project/circuits.js/src/contract/artifact_hash.test.ts @@ -5,7 +5,7 @@ describe('ArtifactHash', () => { it('calculates the artifact hash', () => { const artifact = getSampleContractArtifact(); expect(computeArtifactHash(artifact).toString()).toMatchInlineSnapshot( - `"0x1d1e8f03c63b76d26cfd04ce728586c014768cec6765fdb8f3f24cb931b5ec17"`, + `"0x19dcd971117d72ceed658023cf16036d912de56c75a54da414d2d6bd645c99f2"`, ); }); }); diff --git a/yarn-project/circuits.js/src/contract/contract_class.test.ts b/yarn-project/circuits.js/src/contract/contract_class.test.ts index 2f8d7123092..45a6c282caa 100644 --- a/yarn-project/circuits.js/src/contract/contract_class.test.ts +++ b/yarn-project/circuits.js/src/contract/contract_class.test.ts @@ -1,17 +1,32 @@ +import { FunctionSelector, FunctionType } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; -import { toFriendlyJSON } from '@aztec/foundation/serialize'; -import { setupCustomSnapshotSerializers } from '@aztec/foundation/testing'; import { getSampleContractArtifact } from '../tests/fixtures.js'; import { getContractClassFromArtifact } from './contract_class.js'; describe('ContractClass', () => { - setupCustomSnapshotSerializers(expect); it('creates a contract class from a contract compilation artifact', () => { + const artifact = getSampleContractArtifact(); const contractClass = getContractClassFromArtifact({ - ...getSampleContractArtifact(), + ...artifact, artifactHash: Fr.fromString('0x1234'), }); - expect(toFriendlyJSON(contractClass)).toMatchSnapshot(); + + // Assert bytecode has a reasonable length + expect(contractClass.packedBytecode.length).toBeGreaterThan(100); + contractClass.publicFunctions.forEach(publicFunction => { + expect(publicFunction.bytecode.length).toBeGreaterThan(100); + }); + + // Check function selectors match + const publicFunctionSelectors = artifact.functions + .filter(fn => fn.functionType === FunctionType.OPEN) + .map(fn => FunctionSelector.fromNameAndParameters(fn)); + const privateFunctionSelectors = artifact.functions + .filter(fn => fn.functionType === FunctionType.SECRET) + .map(fn => FunctionSelector.fromNameAndParameters(fn)); + + expect(new Set(contractClass.publicFunctions.map(fn => fn.selector))).toEqual(new Set(publicFunctionSelectors)); + expect(new Set(contractClass.privateFunctions.map(fn => fn.selector))).toEqual(new Set(privateFunctionSelectors)); }); }); diff --git a/yarn-project/circuits.js/src/contract/contract_class.ts b/yarn-project/circuits.js/src/contract/contract_class.ts index a8529ac3992..8f270051f87 100644 --- a/yarn-project/circuits.js/src/contract/contract_class.ts +++ b/yarn-project/circuits.js/src/contract/contract_class.ts @@ -22,7 +22,6 @@ export function getContractClassFromArtifact( .map(f => ({ selector: FunctionSelector.fromNameAndParameters(f.name, f.parameters), bytecode: f.bytecode, - isInternal: f.isInternal, })) .sort(cmpFunctionArtifacts); @@ -49,7 +48,6 @@ export function getContractClassPrivateFunctionFromArtifact( return { selector: FunctionSelector.fromNameAndParameters(f.name, f.parameters), vkHash: computeVerificationKeyHash(f.verificationKey!), - isInternal: f.isInternal, }; } diff --git a/yarn-project/circuits.js/src/contract/contract_class_id.test.ts b/yarn-project/circuits.js/src/contract/contract_class_id.test.ts index 37ec36e340d..2700c248159 100644 --- a/yarn-project/circuits.js/src/contract/contract_class_id.test.ts +++ b/yarn-project/circuits.js/src/contract/contract_class_id.test.ts @@ -14,14 +14,12 @@ describe('ContractClass', () => { { selector: FunctionSelector.fromString('0x12345678'), vkHash: Fr.fromString('0x1234'), - isInternal: false, }, ], publicFunctions: [ { selector: FunctionSelector.fromString('0x12345678'), bytecode: Buffer.from('123456789012345678901234567890', 'hex'), - isInternal: false, }, ], }; diff --git a/yarn-project/circuits.js/src/contract/events/__snapshots__/private_function_broadcasted_event.test.ts.snap b/yarn-project/circuits.js/src/contract/events/__snapshots__/private_function_broadcasted_event.test.ts.snap index 81072f1eedb..e72d0bd347b 100644 --- a/yarn-project/circuits.js/src/contract/events/__snapshots__/private_function_broadcasted_event.test.ts.snap +++ b/yarn-project/circuits.js/src/contract/events/__snapshots__/private_function_broadcasted_event.test.ts.snap @@ -14,7 +14,6 @@ PrivateFunctionBroadcastedEvent { "contractClassId": Fr<0x26222cd450fe6beecf6cbe6495e118412940ee0da5744629dabcaf010a2a4e38>, "privateFunction": BroadcastedPrivateFunction { "bytecode": Buffer<0x1f8b08000000000000ffed7d077c1dc5b5fe4a5c0b8390e8d8a68a9a80917575d58dc11770c01d375c31b66cc9058c0db6e909a407d21b2190062124109200792185f4c64b5e3ae9e5a591e4e5252fc94bf9bf24af38ff9dabf9ac4fc73357d2b2e7eaca3bfbfbcd6f6667cfccf9ce99d9993365676ba281eb9735517469cd40d878b5b13b20764d749fb361dc4f10f775827ea2b83f5cdc1f29ee8f16f793c47d93757c59c851d1fa6df9cef6f6feae427f6b5b6b6fbed0b3a1bb23dfdeb1a1b3bbb5bbb5a3bba3afd0ddd6d6dfdddeddd5b3a1a72bdfd3daded6dfbaa9a3a76d537ee03a95f2ca3fcdab867460ae9363b72776a758ffd48cf967c7ee345b66ac97d332aa0fd6cbe9d1c0fb86facc97ace3f9a777b5a698579ef19e110db409e6aa73e0c77580233c91e8f6a42c2bf392580e77e0dca70c8a2982d128cc3314f27d46945ea3aa25f733d22fa37ca55ec29a28fd97d0f878f19e19bb33637756eca646038d4c73ec4eb0cf270adda582a53ddf55e29f1baa335cf5d140471e11cd81d18021004cb9f431b59a7c27a49d6f3edf39d1e24f39dfbd864364711789cf04d2d541d1a09e53e2ddcabc61dc1d443c5174081f41b4a0833e50d6c0de100dd6cf83caa4cb89748d4453e790bf18a52bff8102cf8102f3048a331d484d6e5f6c1af5cdbc3fdc79427f91c01b114ee049fdbd8a75757034f8ee6eeedf7de18eedbb77f66edc3d67fbaeddbddb37f673b304d87502764d345404f9dc5cb58eb87a12ef008a43fa1cc5d50a75d43bf01c1429f6fb18c09836f89e68d0000648d3561ba367aaf5cf8c060d43e31f17bb69940e029d659f4f23ba16075db37dde62fd438d4c42d65a21f3d3edf3d36c93f251fa6d2be43dc0eae474eb9b36aa7518dde49fded53a35453db7a6a89b4ad93e6746e99627ae42140620c382d128cc8242be6d51750f408cdc6de997515e5698b4cb3f2d9d9e99625eedd1f86bc4d2c4cc783ba2d0880d0b46a3303b14f2ed8caabb11337277a65f464eac4f57fe368b356d6bacad4acb3b2c1fec3b4dde15edbb7cd095517db05ebaa3a10d33469c7ca5dd769c1ca56ff4a48df19448a793ee890646d1e6529a496de3995459963c824d91677e6234d4e84c25dfb81ccc6c1966cc4a533242aec329ae8664d498b5e2e928e48d7bf033335b0d367c75efc62bcfdfb9f9daabfab7efdec59500c41ce77a016b1dcf5cf35b4ad3864304ae1102f39cd80421976bee4c759e2c722825adbcbba3f47ae69ef47095862b75d1be5735af3739e03eedbcfbfbbabbbb3a4bc5a4a6836e251da48db3699ce09c1055779dda0b94f29c6efd73ac3fc3fae75aff3cebcf1418ceb7fe05d6bfd0fab3ac5ed1683e2b7617c5eee2d8cdb67173a2a16b747363372f76f363b720760b637749ec16c56e71ec96c46e69ec96c5eed2d82d8fdd8ad8ad8cddaad8ad8edd9ad85d16bbb5b1bb3c76eb62b73e76bdb1db10bb8db1eb8b5d7fec36c56e73ecb6c46e6becae88dd95b1db16bbab62b73d763b627775ecae89ddced8ed8addeed85d1bbbeb62777dec6e88dd8db1bb297637c7eed9b17b4eec6e89ddadb17b6eec9e17bbe7c7ee05b17b61ec5e14bb17c7ee25b1bb2d76b70b7dbd34762f8bddcb63f70af1ec95b17b55ec5e1dbbd7d8674df6d96b63f7bad8bd3e7677c4ee0db1bb33766f8cdd5db1bb3b766f8add9b63f796d8bd35766f8b06d65fee8ddddb63775fecde11bbfb63f7ced8bd2b760fc4eec1d8bd3b760fc5ee3db17b6fecde17bb8763f748ec1eb5585069df1fbb7f8add0762f758ec3e18bb0fc5eec3b1fb48ec1e8fdd4763f7b1d87d3c769f88dd2763f7a9d87d3a769f89dd6763f7b9d87d3e764fc4ee9f63f785d87d3176ff12bb2fc5eecbb1fb4aecbe1abbafc5eeebb1fb46ec9e8cdd3763f7add87d3b76df89dd7763f7bdd87d3f763f88dd0f63f7a3d8fd6bec7e1cbb9fc4eea7b1fb99d0f9cf63f754ec7e11bb5f8a67bf8addbfc5eed7b1fb77f1ec37b1fb6decfe2376bfb371bfb7fe1fa2a106d17fc6ee8f22ee4fb1fbb30dffc5faffcffaff65fdbf5aff6f22eddf63f7df22ee7f62f7bf22eeffa2811193b9fe617d348a35d6afb5fe01d6cf597f82f5ebac7fa0f5275aff20eb1f6cfd7aeb1f62fd06eb37c6fe8c636dda68f02a466959f17d1b78e4206d0ba30bac57c36fb2f107d8fb03447ccedee7c84237f113ecfd048a77edf1e005d71a8a43dda9a5b8bd8bba14b7775197e2f6ee87a07d24a82fa5346284514a03f9286e2264a3b8832017c51d2cf469e2ea8937e20eb1711329aec1c61d44718d36ee608a3b94e4837f988d3b241acc177d51314aabceb496f6c85c9076be71ce26df59e9e75b1a8d3f2b1a2ca722f1b9807475910da7bd47e659946f0df1417c8ec267102de8a00f8c3281dddcc3b6b8a84cbaf345ba46a2b9d0217f314a57fe5902cf2c81d994c971366ceaf1d1b61ef3ac89423deed4a9c7edf9508f075648a2c85d1f0fb3e1fdb11e9f4538d2afb31d9da1ed1df135ea3a7b21d1caba87bd8bfb639ded261c0a75b637d4d9115fa3aeb38b8956d6bda36c787facb317110e853adbaf53670bc1368806e69fa2c85df78eb1e1fdb1ce2e231ce9d7d92ea53adb16ea6c3430f71945eeba37d986f7c73abb8170a45f677bfb836d30e26bd475f666a29575cf4e2bee9775f66ac2917e9ddd50087576c4d7a8ebeced442bebdef136bc3fd6d95b0887429d0df30623bf465d67ef245a59f74eb4e1fdb1cebedc86cd9cede3b9817013c57dd4c69d4c7815eaf646a5ba5d08757b609d3b8adc75f4141bde1febf69b0987429ded0f7576c4d7a8ebec63442bebde6936bc3fd6d977dbb0697b3f65dbde3328eed336ee1914f7191bf74c8afbac8d3b93e23e67e374d737367684f762c4d7a8df8b2f10adacdf536d787f7c2f3e4e3814ea6c57a8b323be465d67bf43b4b2ee35dbf0fe5867bf443814ea6c4fa8b323be465d677f41b4b2eeb5d8f0fe5867bf6fc3c65ef892b5175a29eecb36ae40715fb1716d14f7551bd74e715fb3711d14f7751bd74971dfb0715d14f7a48deba6b86fdab81e8afb968d9b4e71dfb671e750dc776cdc0c8afbae8d3b97e2be67e3cea3b8efdbb89914f7031b57b471e60b27ec49fcb68d33650b7bac18a555b67d1d863f9f8d66ae1a715fa4f09984e799a9e3197a4ed0c6de6ddb16eddc7a5defeefe8baeddbe71f7d61ddb6b0822607f5bc0ae89868a80e77514574b61fec02b47e10914e6b4073ae25c974e910dbc8ecf243e45ba3f33f0ce2cefb3d2e75da8271eb8ca350f3c3c9caaa08b7ae231123c5375f1e41b090ff33a5b41f672f5e0ec2ae1dd9c3eef521d3c3b1a7a952bf366c2d3a2a08b7ae231123c2d84679a021e25394bdb3ef0d9528a27c4944cf956a1ab66a1ab46a2c993fe5a15f457437c9137ee5b090fea20b0d613ddd955821171d3088fc63b50ae3d68a902de4617e8b778ba13cfb9dfac86f2e2e9d789368cfec4d8a1cd35837815dad8d23b097e399b2f7034533c68f64c19c4d66ab135d0739e3a9e26e234eb0578216fdc835f03c9338de21066fb25af84b1c58311fcb87dacf3c891239a1956ffe6b30ab6475866d94ed5537a6ebb0a4a32cbf61ef705c208195b098f962dd32cf0343b74b13ff2f6bd1fcafd575eb36e61ea08d382b26ee5886601bd2b9c16b8641bdd40ba69231db529c982f2a811e5c3bc356cc872f5725ae03da6bc15faca02f7cbb8463a8651788f0b6c9b8d044f81f068bc8b4a7296da414c6ba73da6ea10ba6a11ba6a249a76d25f8782fe6a882ff2c63d7f1a3ade301b3cd216ab27ba6955821171dc6f68f5bfbe36ac5005bc791c88b10997178f49aaa1bc786e014740c01631f6cd4d340e5498cf2cb04e614f1d24f497239a4fd138f0161a07360bfdfac6de951a63e11efc78acea1a27f13850c11e2ee939efc1087e5c77ea3c72e488e676cf3890654618ed94afedd2b26f7def421b61947d80a6fd3555e099ead0c5fec8dbf77e306f2dfb47a16e95de27d80768b764ddca11cddd621c8878e0c27be29a9f006d2de58d674d36be5df0de63e3651e4d91ae0dabd0a79574dd29740dfc1da46bd0bc43e8bad3a36b6e03a01fd0d646fbda813536be53f086ae651e3556d79de9eb64c83b85b17b8be0af39efe96b4b2a31171f78fb792bd837a31e2bf3fa59faed415f094f7e14783a088fc6bba8d4ee95fa2e6c2b4b7becde2d749517ba6a249a2ed25fb782fe5ce372dc835fc01c3007cc0173c01c3007cc0173c01c3007cc0173c01c3007cc0173c01c3007cc0173c01c3007cc017331600e9803e68039600e98a38039fff4ae8039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e68039600e9803e6803960ae3acc064f0bf859bf9ee85aaa0423e23a094f87129ea9020fee3baa80b7d1c59936dc6c7d2eaf3309633594d754c278b00d17ac3f2176474d18c45b481d6f5fc1e06d237e45078e1cd13c7fca20ed648bad819e9f49f2b48a3823433e751906740e5ec81bf7e0d740f2b4521cc26711c6e6d4310ee839efc1087e5cbfeb3c72e488e654abffc3a2813a7596436684d14ed5537a6ebbc6ea7de532984a785a94f014049e82431763c59bdb2ebc4ff5f49cdfa3a94a185b0446dc4f258c882b109ef4dba6f2ef75e03db6bcdbd2e75da88f86be23e6aa11f7450ab7111e8d77b69e788c048f721b926f243ccc4bab2df0d583a955c25ba1cf2a70ff88ab5c99b3cddb953e9e2eb65d478287c74c9de9e369559233cff6f89e14f335baea11baea10ba6a249a6ed25f8f82fe6a882ff2c63df805cc0173c01c308f16b3c123c757f54437b54a30228ee7aa14fa94b276445715f036ba80bdcb738b78cef6763594572b61acb761d8a1662ae2669aab4a7f0e25df5523f8150907f8e5886616cd55dd4a735572fcca3616eb5cc37e2a373f087e0d240fcf9320cce31e0d9bb386b0488ce0c773f9751e397244f3529aab625978feb347c419f9a6a72f5fabab6dc73df83510f61ec2a335de6916789a1dbad81f79cbf5a06e076f85b62faf54b74aefce39362fb451b26ee588e66e7a2f382d70e13d411e0da49b7348471aef89c97786928ece153a02fe19a423d0dc2b748478a9237e77a19b7349470ab2144cbee729e968a6d011f09f473a02cd03424788973a9a413a826e405b4b613cdb637557a4fba72be3267b997ccf4f90efa6612e93ef054f1f6fab8c8828af5a0a83d7489ebb68cfa734e709ba3de2fec068b08cb81ee0f963540f26126d314aad6eb6b17e53ccb754e7a10bd4f99942fe1cd13c2eea3ce2810b751e793490ce58e717087d36d9f8f305ef3dd1d0323a9fe89574d2ceef5e8af996747da1cd0bba66fce6ca11cde784ae110ffa0ea1ab06d20f68f99dc0b31a1b7fa1e00d5dcb3c0cbd924e3a4cbeb3d2cfb7a4eb67d9bc2688bcc12f47345f15ba463c70f1bcb7b91a483fa0ada5bc5977b54483e7d0b5cc03ba56d049a7c9f7a2f4f32de9fae268a8ae81ff22d23568be27748df848e87a16e91afab998747d91d05d938dbf58f086ae651e4d56d717a7af932176764d34d4ce063fcdfd30bef14577e03da6bcd35f3f1bd8e722df3fcc07801fbf7fbf1de6fdc35c0dcf8dc8baeb4a07fae94403fe7582e662c2059a3f8abd356d8256f35df5955db5f05698172badbb72199aabdc3a27cf1d2bf423edf5d1d039b0e1f05c447834f65229c9599a07996df34a7bdd758ed055a7d05523d1cc26fdcd51d05f0df145deb807bf803960f6613678d03e016b3dd15d5c251811c7fb5214da8db27dc54555c09bd7d678ef2b9ef33a4f359417ef553fc48631e76b4c9193ea06f12a8cc7da192fec36e0e0312a68ea686ded548badc1a15f23cf05224e69fc5ed23978216f39a7d140f2f05c05c2bcb6a63077d65e130db51b1823f8191accd3d645feb919d04cb3fa3f4cc88236c994c17411a7b9a60c5ec81bf7bc8601ecd3098f964d3b4be099e5d0c5fec87b86e03d2323728f8477faeb6503635f6eb3396f5efb03cdf9f4de725ae0e2bed35c0d24438faa2cee3572290bef1fa913343d242f686693bc3ca66659b4da245f9da806deb5c48fe7036b05267361fe50d683a648ad5f2df0de0c5ce5c6c208ebcc15b4e7eb05bfe1f068ef33539a13c9f35c42da6373f99d4f51e88abff3e1b184d6b75172bf11ee5ddf543445e9eaa27904ba6876e051d8e3565617fc9de06830778c43cc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3ecc41cf41cf3eccd5a0673e0f167cf93bf29e2ac18838edb3c20d1edfb70f9d55c09bbf11c5b7365c5efcbd623594d72cc2a3f00d68e9bb8a06c1cb7cc774e5819a7c0ba53df8f2db538983bf3d3d62f220ed0e8bad819ee33de3ef44f8dd53f8aeb35496c84be6cde78fb1fe10076cfccdec4c11a7f99d973c2b10f77c9ea294652cf5a8c9dbd766ccd42d87029739ae1a715fa4307f37abd07eb6f337c323c1c3ed79f8c6cafd8dd574a1ab2c7f63e5d245b5dbcce53057abcd5ced7a3678647fc336d8cc2ac158499bb928f0e0be1236f370bcd966663bab5a6de622e129a68fa76433370a5ec62e7d806c660d7ba146f02b120e3e6b0034274e1aa47d0fd9cc788ef78cbff5e6774feb1f19be73f8c1af21729f1f22ed63df7f33b4de13df7f333a09a394652cf5a8c9db77de8b725b59e032c735521b55c1c61af59981daff5f559233cf6d7bda36f36ca12b69a336124d33e96fb682fe5c363ceec12f600e987d985dffbae2fff9765509c64a8e417dfd544b15f066db96ed21d7ff8eaba1bc94cf2e2ad9b6870a5ec67efcc581ba7c794e1236acc4c1ff3ef9f6d183d87e4db62d9ee33de3fe99df3dad7f9ffbc629fc4f2fc8c376a3b4637dff27d37a4f7cff276b218c5296b1d4a3266f5f9ba1dc561646fbdf5f6e3fd36f9b0a796e0747826736e1d19807506a834bb62dce674ddbb69d2b74e56adb413387f43757417f2e7b0af7731dbc9ba27475316f04ba98e7c033afc2ba00bfd1629e330e31073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d073dfb30073d27c36cf0c8f5a17aa2eba8128c88abc4be00df7ad5ec2ae0cd6bdcbc2e8ae7bcbe580de5a5bce7b5b4ae7598e065d6915f3351936f6b9ef71062ffa6c4c1ff4efad95183b477586cbc568cf7ccc8e3dacfa1b517d7b75f01fc78ad98d78fe57a763da5a9c43e0bb94f1ef7b309a394652cf5a8c97bb8fdd44ae550e032c735d235e5f4d744dbf2dc0e8e040ff7bf1aff10d59173608d1b6d6dda6bdcf385ae660b5d3512cd3cd2df7c05fdb9d6dc710f7ee31133f36e8ad22dbf0523d0c502079e0515d605f88d16f3bc80b9229843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d9843dd08987d98aba16ef099a3c05a4f74cd5582117195387bc1b7df6b6e15f0e63da2bcaf10cf797f5e359497f2d951a57d61870b5e661fe62d0769f21dd823da41fc8a0e1c39a2f9f49183b4cfb7d81ae839de33dee7c6ef9ec61eb672fb7dc1af21da779f7b43b4ef7ed07a4ac37550eb3d992370e37e2e6194b28ca51e3579fbda0ce5b6b2c0658e6ba47b3215f6e7b5733b38123cdcff6aeca7579233cf6d7bda7b44170a5dcd15ba6a249a05a4bf850afa73edffc43df805cc01b30fb3c123fb857aa29b5325182bb97fd9d74fcdaf02de6cdbb23d84e76c57544379cd263cb3d3c753b26d8f10bc8cfdf838d9b6cde9f36daf11fc8a8403fc7244f302b26d3f41b62d9eb38de81aa7687dcbe61ba7801fdbb16c3722dc461835ec959a68df6f4a659bca730a751e397244f345ab7ff3bd5a23c9c032cbef6aeb297d25da44394782fb8584518e2935ede76681a7d9a18bfd91b7effd60de0a7308a31e37701db8247d3ced5cff4782e712c2a3f18e28c9591a372cb279a53d6e582c74b540e8aa91681691fe162be8af86f8226fdc835fc01c30fb30f3b80158eb896e4e956044dc42c2a3d06e94eda72ea902de3c6ee0350c3c675bb31aca8be77515ecf7d2b8e148c1cbd8e6ff18837183c4c1e38667d1b8e1808307c2be71836b0ca8b5bee11b03821f8f1be6531cc23c6e50b00fda5d36b46bbe06f5adce23478e681aadfee5b881659663045f9bb8287d99cbbe638b082364e476298c1b2af37e306f85be60d4e306ae030aed7e3bd7ff91e0594c7834de1125394be3862536afb4c70d4b85ae5cfd26689690fe962ae8cf65abe21efc02e680d98799c70dc05a4f7473aa046325c75abe7e6a7115f0f68d1bf09c6dcd6a28af4a8c1b8e12bc8c6d3eeb6055be05d7b841e2e071c39c230669673bc60d6c9f2e14719ae354b93e8a7bf0e37103cf75cb7d33beb1eb58dad55296b1d4e3fe3acf3196728fa4ee22cce3dbf4dbeebe527b80fe1ced81ecfb7344b38ec6ae9c16b8e6386441dd5e5271f906f42d31bae64dd107d4099a25a403d06c261d64b58ed6923e50be4d361e3478bec7c62f12793465587f3a76cec0fbbccce685f77989288f1cd15c27dee7650237de67d7bb0b5a573ad0977bc796887c7244f36ccf1c19682752b81855a6ecaa81772de98ddfa35aa2e1f9037e1f97113dcf3314d393a1346fc475c15ce5e669782c79a9129e25a3c07329e1d1188728c9599a375a6ef34a7bde6885d0d512a1ab46a2594efa5ba1a0bf1ae28bbc710f7ee311b3c123dfdf7aa25b56251811b794f028d4e7b26de1a555c09be733780c8ce73c96ac86f2e2756b8575b2d27cc6d18297b13fde49f3191afd0ddb15b07780c365bbd7d37cc6bb693e03cf795ec03537a5b54fcf3737c57317d2a66aa0308fa314d6a20aae7742ceb5729dacf3c891239ac73c361ecb2ced1f5f9bb83c7d99cbbe63cb092364e47649cb3e9463d9250e5dec8fbc7def07f3d6b21f4763cf721d5068f70b5cff47826705e1d1784794e42cd9b32b6d5e69dbb3ab84ae5cfd26685692fe5629e8cf65abe21efcc62366b66781b59ee8965509c64a8e017cede78a2ae0cdf6ec5e5b899eb30d540de5c5f3060a7665c99e3d46f03236e3536360cf4a1c6ccf7ee5f041da7f1bc69e757d33ae357ef27d330e7e6ccff2f7ef08b33dabd06f155cb61d78831fd7c93a8f1c39a2f913d9b32c0bdbae2b459ce6fb045ec81bf7e0d740d8b9cf08b66b65dab5fd5dee91f05e993aef813510d471b4a1785fc12fc734f5033ed640a4ad85b694db2ec8b04a5596013dfa6c3ff03334ab6db84ed0ac2279417308c9abd907f8cabf12f37781b79ff7ead4790fbc736b6c5e78e750f7c02f473493c53bb746e0c63bc77d156400ad2b9d1c03b9de8d55221f7e374e245c3c2705da89142e469529bbc07b6c792bd867a5791caebbe62a378fc3fdcc65a9e369edaa8f86f633c3e1b98cf0a4df9e0ccc2ba52fe7c0bcd25a9b57daf34a970b5dad12ba6a249ab5a4bfcb15f457437c9137eec12f600e9803e68039600e9803e68039600e9803e68039600e9803663dcc060fe67e80b59ee8d6540946c4ad263c0a733265e7e12eab02debebd1178ceebe9d5505e95d81b3149f03273fe6fa91fe49bfe9c696b17cfe5638d01385ceb5cafa2bd11f75a6c0df49cf746ac14719a7b4a7debf2bca754ae63345098f746a4ff8dca809e977b30f2991128fb3a8f1c39a2798f675d85654618ed1f7fbbc36de258b5035c06fc8e69ad4dc875df550e5d8c156f6e13f13ef19a06bf470a6d50ab6bed0ff74b08a3ec6795d67346b4df466bad64b46b37ab75f1e4792f2af3d2fade7034eb68fcdeae55c2339aef0dd91ed568d794e4ccb3adb327c57c8daed6095d2d11ba6a249acb497feb14f457437c9137eec16f3c62e6b691bf3704dd9a2ac188381e0728d4e7b2edf75ad2cf641b663bf44764f72a7c335c70d9bdc0c1dff483660dd9bd3f75d8bdd56c5fb9ce18d3b271788f5091ee2b615fc9f3d6960ade0d91db7651289b82ab6cd688b2e1f7b52e72db5b39a2f983b0f757095acdfe7734f600f7bf0aed5c17b7a923c1b38ef068cc2528c959b207d6dbbcd2b6077a85ae5cfd0468d693fe7a15f4e7eaeb710f7e0173c01c3007cca3c5cc3639db9ca05b5325182b398ef1d9e4eb747997e6b8a7085ec69e3ee99041be0af64b17cff5c3d6070ef0cb11cda964eb9f6ab1f1b7756cebbbc6765aeb15beb11df835900c6c83ed8fb6be6fed66385b5fa16cba5c65b346940db703d2d6e73a089a82ad77d2d657b6ad476deb739ba1d07e76735b3d123cbd84677dfa785a95e42cd9fa1b6c5e69dbfa1b85ae5cfd0f683690fe362ae8cf6543e01efc02e68039600e98b38099c727c05a4f746baa046325c774bef149af2eefd2f8e458c1cb8c0136d1f844c1e6ea36325f4efc8a8403fc7244f3dbc30669afa0f1891c8bf8c6b9ebd397a1ec3817fc1a4806b61bf7c7f189dc3f79b9e0ed1b9fac4f1f4fb7ab6cc07b3de908755e8e4fb80e82e646cff844b95c0ba3dd97c165bd217d3c9da31d2f719fa3d17e2ac999e7fe27edf1499fd0d51aa1ab46a2d948faeb53d05f0df145deb807bf8039600e98c71633f7396cef806e559560441cdbae0aed7359bb79832eef92dd7c9ce0656cd3fbc96e5e9f3edf4e23b33c1f0738c08fcfc7f927b29b1f24bbd9f5ddc87a11a739de012fe48d7bf03318a52d5d893db7d26eaec47e5fdf18a212bc7dfb8794edf3bc52dd2a701b85f703f8c12f47341f219bded5be61af1bf2e06f2a2a61d72acc7f14b8ef838ee4fc478e683e2574d4e7d111bfbbb25fa88df69d836ab2f1b28fc5ff66641e4d916edfc6dfa414e91efc94f665965ddbe3ff6328ecb1ef72d585f5f69ecf5b03cd5786a90b582f461e0d1e3d6a7dbfc078a26864df2fb09dc7368bc6bb574f7c478291edce4d4a78368e02cf26c2d39f3e9e5625394bfdcd669b57da63f92d42571b85ae1a896633e96f8b82fe6a882ff2c63df88d47cc060fde1b60ad27bad555821171fd8447a13e97ed3336917e8eb7e1f5d6376dfcef688ca265836d247e45c2c13618686ea531ca1f698c82e7fc5de07a11a7d50e951ba3805f43e45e23d2e8dbb8bc619fb8beabd7e20d399177afe0cddf85703faf50360557d980773fe908ef415de4b6e573445312201a9cdbef13b49afdef68ec01ee7f15dab902b7a923c1b385f06c4e1f4fab929c257b60abcd2b6d7be00aa12b573f019aada4bf2b14f4e7eaeb710f7ee31133db03dcdf816e759560aca40de5b307b6e8f22ecd859e207899befcf88641be1a6da791b99ff8150907f8e588e662b2339a2c36e3adb7cfd9ce70d9951aed5b39bb12fc1a48066efff7473b037222ef7ec1db676728944dc15536ab45d9703b20ed0cae83a069f1d819cae55a483a37c2fd64da784663f7709fa3d17e2ac999e7fe276d3be34aa1abd542578d447305e9ef4a05fdd5105fe48d7bf01b8f98f91de5fe01747d55821171dcd72bd4e7b276c6565dde253be344c1cbf4e5f3c8ced0ea07e4b909c0017e7c6ec2a164675c427686ecb7ea293dd7232dfb10bc9037eec1cf6094b687e67a8bcfcee8ab006f9fcd5509debeb9944af0f6d957fbbbce4752d7b4ce2bf1957725cea4f495772578fbcabb12bc7d7b9199b7c679727c9e27ae7276adf6199bbef33c35fac9d18e31b88fd11a636c1e059e30c6187ab9ecf5cd4257e3618c51ed98798c01ac591f63f8daefada49f936c98cf0e7e4905c602ccaf4838782c009a1f1e3a48fb321a0be0398f05b688384dfd8217f2de22f4db10ed3b3ed0b4cff8cc8022dd57c236f48d8bfa4817085fa65b360557d9f489b2e1f59a3a4183b439a2b95bcc39bad60514745b18ad2da4dcce758ed63eb992f068ac2129c959b207b6d9bcd2b607ae12baea13ba6a249a6da4bfab14f4e7eaeb710f7e0173c01c308f2d66ee73d8de01dd655582b19263029f7d7ba52eefd21c7a93e0656cd327c86e56b06b3a5dfbcc8103fc789ff97d6437ff0bd9cdd20ee37112d723ad3d1fbe7112f8198cd296aec43c97b49b2b31c7e61b435482b7cf6657b6cff34a75abc06d14de0f59b77244f303b2e95ded1bc6973c9e836e2a61d76e53d2d1554247c0bf8d74049a9f091d5de5d111bfbbb25fa8a5bcf1acc9c6cb3e16df2dc93c9a22ddbe8df7a214e91efc34f72ef9da009edb5598d7ee74d505d4753e471c34bf1fa62ec8317683478f5ab26c13b25ce19005347f11b2205ecac2f55ad6d55aca9beb29d7773c47bd967934e9e9a460f2dd9e7ebe255def8886ea1af8b793ae41b347e81af191d035f26820fd805649963693efd54a3aba46e808f8af261deda5691caa23c44b1d6d271d4137a0ada5bcf1acc9c65f2378a33eca3c9aacae1574d26ef2dd997ebe255def821e6dbec0bf93740d9a4385ae111f095d5f4dba867e40ab244b87c977b7928eae153a02fedda423d01c23748478a9a39da423e806b4b594379e35d9f86b056fd447994793d5f5b5e9eb6448df8b7e7f8be0afb997c837eee03965ad33a17de725f039e20a676a77b2cea5cdc1e71983e674510fa5ad843338d8e670e9514b16391ebfc2210b68a60a597c67e7b8c6c17d159045b60f4b1cb280a67598f641fe8f86e71daead802cbb852cdb1db280a64bc88278290bf7bdb2fdd294e53a21cbd50e594073ae9005f15216eedb2003686b29ccedb391f17aba2f3e4d1937d9cbe47b43827c370d73997c6f7cfa785b6544447aa8a530788de4b98bf6064ab356d0ed11f707468365c4f500cfe7523d9848b4c528ddba097ed2a6b8ce8169a1a89bac03931675936d0aa9072ed3627ab20ce913d11faf73f0d6feb70678bbfeadb15289776f34b41c70bfb202bc7d7b2b2bc1dbb7b7d2f59fe782f5f96c5cfeafaed679b03e3b8dcf83c5bf9a95ffc352c223ff455d49debe7a5a09debe7a5a09debe7ababf97f770bcf97c3bfe0f7bfafd435fc16587c9fe81edb0ab87b1c3563a64c13b7d5d19f95c798186bf4507a63a41e3ea97af17b64216eb5296796bbd2fb067f1bea0eef1fb029a1788f7e506811bef8bebdd00ad2b1de8cbbd1bd7897cf8ddb89d7099609ba09d4871c5a83265d75605bc8d2e60ffa06ceae939db460a638f12c6368111f7d71146c42d273c05253c33049e190e5d68f19e2578cfaa20efe982f7f40af2ee11bc7b2ac8bb53f0eeac20ef16c1bba582bce70ade732bc87bbee03dbf82bc9b05efe60af25e2c782fae20ef1582f78a0af2f68df92ac1db37e6ab046fdf98af12bc7d7d3ff34edfee18b019c12367f3859dd546f1a0794c8c5b6e481dd3507dd4087db00db85c8977abe08d7bb6675a9578fbec99d60af0f6d93395e0edb3672ac1db67cf5482b7cf9ea9046f9f3d5309de3e7ba612bc7df64c2578fbec994af0f6d93395e0edb3672ac1db67cf5482b7cf9ea9046f9f3d037e0d143ed3fa663e61b988d35c0ff2d93dbc1e94b761ee7fb5fafebcc0237937925e5aab54678d1497273c672ae1f1d92c675680b7cf66a9046f9fcd5209de3e9ba512bc7d364b2578fb6c964af0f6d92c95e0edb3592ac1db67b35482b7cf66a9046f9fcd5209de3e9ba512bc7d364b2578fb6c964af00efd58e8c72ac53bf463a11fab14efd08f555f3fd640e1b308cf594a787ce35ae69dfe98baafa38678607d01722fa778d034d9f3130e532e1fc85f23f4c17523afc4fb998237eec1cfcc27602c7f36c561ed631ac561df453bc5611fcd548ac37ef77328ee261b3e97e26eb6e1f328eed9367c3ec53dc7862fa4b85b6cf8591477ab0d7753dc736df8028a7b9e0dcfa0b8e7dbf0c514f7021bbe88e25e68c3b328ee45365ca4b817dbf0748a7b890dcfa4b8db6cb887e26eb7e12e8a7ba90d7752dccb6cb883e25e6ec32d14f70a1b9e4771afb4e1b914f72a1b5e4071afb6e1f914f71a1b9e4d71afb5e1668a7b9d0d2fa2b8d7dbf0251477870d2fa4b837d8f0628abbd386e750dc1b6d7805c5dd65c3cb28ee6e1bbe94e2de64c3fc7fe737dbf0068a7b8b0d2fa5b8b7da30ff67ef6d36dc4b71f7d8f07a8abbd786fb29eeed36cce7e7df67c3fcef9e77d8309fed72bf0d5f4971efb4613e2bf35d367c15c53d60c3db28ee411bde4171efb6e16b28ee211bde4571efb1e1cb29eebd36bc85e2de67c37cd6d1c3367c2dc53d62c3bb29ee511b5e4b71efb761fee7fb3fd9f03a8aabb561ded376800ddf4071391bbe8ee226d8f08d145767c3d753dc81367c13c54db4e19b29ee201b7e36c51d6cc3cfa1b87a1bbe85e2ec2f00f7b67926ce7e86bfb7cd337176097d6f9b67e26cb7b7b7cd3371f638febd6d9e893bdc865f487147d8f08b28ee481b7e31c51d65c32fa1b8a36df8368a3bc6866fa7b84936fc528a9b6cc32fa3b82936fc728a3bd6865f4171f8f7fb2b29ee781b7e15c5e1bf48afa638fcc3e0351487b34c5f4b714d36fc3a8a3bd9865f4f71a7d8f01d1477aa0dbf81e24eb3e13b29ee741b7e23c59d61c37751dc336cf86e8a43bfff268a83fdf1668a836df4168a9b6ac36fa538d80a6fa338b4fdf7501cec877b290e7dd3db290ef6c87d1487358f77501cf686dc4f71d83bf24e8a838df22e8a433ff900c5a13f7d90e2d0efbe9be260533c4471e8b3df4371e8efdf4b71b083de4771b03d1ea638d8468f501c6ca347290ef6c3fb29ae68c368f34cdbe23b0bec0a1167daa62b6db818a56b7fca7fe6e11efc0cc6ad365cee5f7b4d36bc856890479da0719d05f51e61eb2b9cbdd46d308de6eca5470813a705aeb5421ed7d94b4ab294befddc2e646972c8029a0f0afd6a9c4ba3246ba99eee20994cbe5b1db282e6a374eedec76d98df2b3e33e0cb8ee7b86ac47d91c2d09f91f99af4652e9d53bb937016890ff3de455853e2ddcabc6ba2a167b4f0792e087fe9d0415adf592ec06ede117cfbced865ba2b44ba46a2b9da217f314a577e79fe8f3c7fc694c9a7a89ea11e194c5a67a45dedd15113e9083457928eb4ce5fbf52e0010e3ee31be52ffb00a4e5f339be456d149fb70a39eb23f719e60a6d592b6347def20c28fee7018fd99a848c7c36e9783e375f014f37db12f25f047ca62a687e21fa646987a04f3e8964810cca67e296f64f6ff3c8c2f51d34bfd1b7790a9ab6e3552493c977b34356d0fc81daca3f3afa5cfe1f0506bba3ed93f99ce81de9cb9ce73618e5bbc3c1fb1ac29a12ef21ed3ffa6479a65c8ec2ffa03e59f665d035b09b77046d1a6397e9ae10e91a23b74da2600f0db10191b73c3bcf94c95fa89ea11e69b6a5db23b78e4e221d8186dbd24a9d652affeb626850fe75820669f9df2f13ad0ee5bf7eb94f96fd99e63800bc9037eec1af31daf7dce07a878cfc9f1ddf7f2dabbd4f76a5c37cd826a2411e758286cb1b3493a9bc8dbc0a672b77b1ed3841c8eb9a1b389e30b9ecce25421e9eb3603b58ebcc6bd9e79fe8900534a708fd6af5f95a67c7fbfa7c961534cfa07fc89e497d3aca89ff47dbed788e2bf4f923ebf3bb0e1ba4957d37743dda3e7f8b48578d7dfed954cfbaa9cfd7b27bb77b747422e90834fcff04ad3e5ffecf41fed7d9d0a0fc651fc0632cd0143d7d3eaf0fcafe52b3cf072fe48d7beef311c76bace5feb36d3caceff29aee66113731aaae7f59bbd2615d6c3dd1208f3a41c3fff703cd22d12729d8385dae71befca7258ff397893e5f8ef39708797ce37cadffdb49fbe504872ca0592df4ab31f7a0699bf21cbbc977934356d0aca3b6b897fa7494533fe9ed6ac7735ce5fa7cb6e914e6fef2dcefc8f36b9937f7cd29f11ed2e7a1cf9767caf35ac70eeaf3e5fc3074cde7e6c23663ec32dd66918ee795af72c85f8c74fb57796ebf29933eaa6757539faf6df74a1d9d403a020d8ff3fb95f0c83da5c0017ee5fa00a4e53ee006d1e7a3ffe3fd49d26ed7b4b17ce361f06b8cf66defeb1d329afa713cf5f91b850c26cd7a875c5ae5065ec81bf7e06730f6daf0fa31c073bcc0c375ad4ed0206d8e686e177d9d82cddbc5f56382d0a3cbbe7985b02564dd5a22e461bb4b79fda3e0b28ba05f975df43afdf919555b82d7064cbebd0e5941f3466ae3ef76cc0f6c24bd3d9870fe806d458575dbbc6b9fc6550ededce7a7c47b485f0a5b027cf83f41083f40b6841c7743d7c0eefa47902bdd1691ae3172cf9f28ccdd38fbedab046653266fa17af620d9125ae3f56d1e1d1d4f3a02cd268a43ffc4e370bc3fdc776d54c2dd2b70e37e2361441cdb0db2bf307afe9ddd20cbe7eeae72c8b58ae4da5061b9c0af81b0e3992b1df6b1f239f6c8a34ed0206d8e683e26daf6f4cbb1b58bf7354c88dce5c87b323e25fa4eb92762b990a781e4e1b921853a59da03d72f6439ce210b689e10fa55b0a93a35df3fb6db4dbeeb1db282e64bd4a67d85fa4694d31ad2db8f1ccf7195eb3ba13fa539b23ccf6dca7522e6cdfb5253e23d645e157d27f8b0ad82f00fa9ef947355d035cfebc9751357ba5e91ae9168363be42f46951983b1bdfa75aa673fa2beb34f09d3668f8e8e231d816603e948ebff10eb051ee000bf727d00d2721ff00b310e47ff0739eb8996fb46adf12178216fdc835f63b46f7b5fef90d1d48ffba9cfbf5ce889c7e16b48ae5e25b9c00b79e39efbb1754206573a7ccfb2966890479da041da1cd1fc45f449e9db38037d3e8f9558de0d8409347f137d3ee2816bb99087e72c40ab64af75bbec97631db280668fd0af42bbd4ad699bf6934c26df750e594173c0e1837a9960c3fc5e5d4e7a3bcaf11c57b93e9f6d3a85f151de35b7b3d9c19bfbe694780fe9f3d0e7830fef9541f8c8c30769e51a2c74cdeb5372ddc4956ebd48d748349b1cf21723ddfe55aed199329948f50cf5a81276afd4d1b1a423d0f4928e2af51f24e0e0711fca5ff6013cee03cdf15687e8f3d1ffadb77e7db46f7fa969638117f2c63df835521c7f5f2d6534f56313f5f99709197c7269959b4f2efe0710fa71fe37ac4c87ef5a97100df2a81334489b239ab3a9bc8dbceb539777a0cfe7726079d71326d0e40993ab8e2f17f2b07dc4efdcfad4651998efdf206499e29005349d42bf0a7d739792acad6c6fa1cf5feb901534e7505b7c2ef5e928a7cb486ff31dcf7195ebf3791ca530cec8731b8ff2ed77f0e63d3029f11ed2bfa0cf071f9e6f41781ef5f9b2af84ae792d0f6d66b9fd3b978b743c8655b6b7ca9e8d047ea532a17a369ffa7cadf1599f4747534847a0e17f6929fc03b895db77e40d1c3cee43f9cb3e00697344b3ccd3e7f3b91cb2bfd41c678017f2c63df8f1f7783c17216534f5e324eaf3570b19f87b0196eb3225b97cdf0b809fc188736396a8e219e893d7929e4cbe93059e1cd1f4893e19f1c0853e7932c922ff196e6451f8877d81df09298bcbe6b942f4c90a365e4149d621f345e893973a6405cd0e6a2bafa13e1765c2fbde9feb788eab5c9fcc6d9e429b9077cd196d70f0ee23ac29f11e6203a14f061fb68d10be95fa64d96f40d7c0ce73558c5da65b2bd2717fd3eb90bf185566de95e7be76533d7b2ef5c95a6d69af4747934947a0e1b674a9121ed9b60307f8191ab9ef7db2c0c7fbde6ff3f4c97c8e95eccf34c7abbe7defe0c77b02f8fc182963696da67e20eceb93573ae4d2faaf0278216fdc839fc188b58de1fe05be54c44d24b98b29e35e2a704bbb81ff05be94e210e67f082ff1e4358968a43d29f9b13df956d1bfa6df060cfc1f4cda2fd29e62fbe5edc3d82f2b853cac2bb65fd22f4fb72d36c9a15fd03c20f49bfe38a3b54bb3ee72f9987c57396405cd7ba95f7998ec13d46db65f3ee1788eab9cfdc2e5abd07ee6d96693ff0b67debd843525de43ec45d82fe08378b6173f4ef68bec63659bcf6ba7e5f622c9ff4c73df7cb943fe62a43b5e967385a64cde4ff5ec1364bf68fd2be7728f8e26918e40b39474b45a09cf2a810738c08ffb9c3a4183b439a279c263bf404eee2fb99fd79a33f1f597e0d748717cdea794b1b44793ec17a4e1f363e7883823d7a54a728117f2c63df8f1387c0ec521ccf68bebdf9e2b9470fbfe15b582304206b6c5e4bfc76ba27dcf9107cd31448332adf3f0cb11cd8f44ff9a7e1b3060bf709d2a1296958409343f15f68b7c5fe708795857bc37674eeab2e49db240f7731cb2fc4ae8779502262559878c1960bf2c71c80a9adf52bff23bb24f504e4b496fffeb788eab9cfdc2e5abb0b72ccf361bca778d8337cf3fa7c47b88bd08fb057cd88e44f87fc87e9136beec6f78fcc9d865ba15225d63b4effc9966dfb546e0917301a64cfe93ead9ff92fda2d5efacf6e8e818d21168f8ff88959a7f010e9e7f018e3a41c3e38ebdff7e3862c087fd82be9ccf8e072df7f30a6d59d9fe12fcf8df8a7c6ebd94d1d48fa70e1e08fbec97c50eb9162ac9e5fbff0cf8b1fdb298e2e43fefd9ee62fb652ced2ec8e0b2bbd87eb9d493d7d14423ebaee4c775f758aabb3a736703f60bde05f409d25ecb11cd8984c965b32d16f2b0ae403b91e88aa9c99277ca02dd2f76c8729ad0af828d5c509275485b22ed179675ef7f638f18d4cb541baea77262fb65bae339ae72f60b97af42fb99e7fe0ae5bbcac19bf7c9a7c47b485f09fb057c10cff3fe3d470cd2ca7e1fba06769e8766ec32dda5221d8fc7573ae42f46ba730bab04665326d3a89ea11e69f63b2b3d3a3a9a74049a39a423ad3951d99f0007efeb93f32f470b7c3cff7281c77e61db40f6fd9ae37ddffc0bf8f1fc0bffdb47ca68eac73bc97e992d9ed747fbf6bb46ae4b94e4022fe48d7bf033189b855c6c1bb0fdb248c469f6018b046edcb38d051916119e454a782e11785cbc35fa7ed63bae727dd562c2a3309629b0fd3d123c3c37acd13629c99937f9a2ddd99362be2e7b7ab1d05523d154628ed6d7f681df78c46cf0c83683fb94455582d1b59f4e6b0ec2d7862dad02de4617e857b87f75ed59a886f2ba84f028f4dd7923fbc98297b12daed7b53d0b35825f9170805f8e680e3c7290f6668b8dfb66b61fe49c88a6bdea9bb7e1fd1390c7356fd3461835fa51d79ca06c530d0ddad23a8f1c39a279b1b0a9db1c32238cf6af9ed257a24d042fe42ded7e2e03ee47b4ec3a9f7d5c099b722c79fbde0fe6bd2c7dde79a5ba55e07923b45bb26ef1bcd19d62be4fce5fe33d411e0da41bd0d65218cff64443c7a969d88e9becc56bbda3c977d33017cf6b3d0dbcad3222223dd45298e75b867beea25d4969e4dcd11e717f60b4efba03aff5be437d2e7a608ca2b186ccf344a8f372dd85d77a1f14755ece31a1cef37e06e88ce7e1b4f61ca10dc2fce662076fadf9065f5bbcb80a78b36dccff9aae267baa31da776d8c65abb5e9f02fdda5ba7acdb31d9b8bdcf615dbb19fa0796dd4b703a2a1e5c176d9129137d21c45f14b44de7afb75f2ed8c6982c0bdd281e933029342bd69d76c2b5609fd373b6405cd3fd3dcfd17690d08f56136e9ed7b8ee7b8cacd73f1f85d610f649ed74d50beab1dbc792f4a4abc87ecf1c01a91fcde3247e1efd2bb24bf9584ae81ddf431e8d719bb4cb758a4e36f2c5738e42f46e9caeffbbe84f71d7d99ead9f7689cae35b7ef5ba35e483a02cd22d26db34807fae5448372aa1334489b239a9f88b64461cce26cdf9a856cdcbe3d55a1f64d6b7c26dbb74b1cb282e6d754ef7e43ed97b423ccf3bf3b9ee30aeddbc8dab7bf9569df643b35d2f66da148578deddbefa89efd9ddab7d94a98567874d44c3a020dcfd1625d95e791f1fef09aab963def9beb667b1e71d01db7b948075b92db65c85427689036473413ecdcec61560792d694e32c5aab966d0cdb403c2f54ad73b63cd7ec5a375098cf2abb6ec073479061b86f1d9779f23a996850d7eb3cfc7244730cd5019db9b7be51cfbd1d4b985c736f72fe9775c57b75b5f6da4959a07bd7feb326a15f85f923d5bd765c3e26df850e5941733aadf53cc38679fd80d78d3a1dcf7195b333b87c15c68e79d7b7202b1dbc794f5c4abc87d875b033c087ed3d843b8e1ca495fd3374cddf7ca32f64ec32dd32918ef7c1af70c85f8cd295dff73d3bef7f3c8bea19ea9166bfb3c2a3a3934947f27b18cdbd7fb23f91ebaf6c63d4091ad7dcd679d446f1be08de53efdacfa475a681cf3e023fb68f9610462923af87fbf6dacd177146ae054a728117f2c63df8f15ebbf9148730db2f72ffdd58ef11840cae3d826cbf5ce2c9eb48a2411dabf3f0cb11cd32d1bfa63fde1eb05f788c5c8cdce3edbdeb11c27e9176eb7c218fcb6e9d4874c5d46419982791b240f7f31db25c2ef4ab6067b42bc93a649fa89c07665941b391fa957eb24fe458ac745e90e339ae31dc7f99e73102ca77a98337efdd4b89f790fd1bb05fe49e3fde8fb28bec17b97f10bae6f110dafa72fb0e5dfbc640b3c4217f31aacc580ffc4c996ca17ab69bec17ad7e6789474747928e40b39074d4ac8447f627c0017eaef9e523053e9e5f7eb6b05fd097f35aa8ecfb35c74c729e06f73cbf83b8058451ca68eac73f0e1a08fbec97b90eb9e629c9055ec81bf7e0c7f6cb5c8a4398ed1769d38cb5dd05195c7617db2f0b3c791d4134720e4ef2e339b8d78afe35fd31439f73cfa6b4d7783cf00661bf489b6dae908775c5fb5e15cab3dd25cb110efd82e6cd42bf0a3672bb66dde5f231f9363b6405cdbdd4afdc47f609ea36db2fef773cc755ce7ee1f2d5da9721d7f1163b78f35e8b94780fe92b61bfb8ce8943f851b25f64bf2fdb7cde1fc8d865ba79221def295fe490bf1855668e9dc7d4efa47af67eb25fe62a615ae4d1d111a423d0cc271d69ad3bc9f571e0e0b51ae0a81334bc3e0e9ac73df60be4f4cd53688df77dfd25f83552dc5cc2286534f5e371b25f3ac473b6cb9a492ead736f7c76199f6fd062c3b3290e61b65fa44d33d6761764984b78b4de47dfd9117375755160bde32ad757cd233c0afd73db68fbce05844763be4349ce3cdba5697feb286dcb7942573cd7cb6353adb64fdaf7b807bf80b932980d1ed9ced513dddc2ac18838b63bb4c602be76774115f0e63de8e82fb9bc2ab14e319af2623b4ac1de287d9f798ae065eca13f93bdac609fb6d5087e45c2c17b804073df5183b47fb5d8d89e609b679e88d39cb7e77eb518b9e767200fdb4108f3f7991a7dbfcb4e966daa6b2e48cac1e3f75a5b16f2fb4cd79c14dbdd0b45dc58af054246ee47b46c519f4d5f093b782c79fbde0fe6adb0ff20af54b7da789c2fbf4f71adfb1e49ef8a6b8e00ef09af4743373c8fa2f19e28cd8db5b9e6c6e4de519e9f3a56e868894747fcee4237bc56a6b18f4e690eabcdb5fee9faae6bef1e1ea1a3651e1df13c9efcf6b736da779eb0c9c62f13bcf7d878994753a4bb0715ed03e64be709fe9af317be76725e15f066bb95d7d5aac9d6698cf69dc367d96a6dbac3edfd025dbde6d9c6cc456edb876dcc9ea30631a3bee1db49b90eca7615f2469ac3297ebec81beb3be9bf3f6d79c63441e05ee6c074aec0947ebd69cb6bb6154b85fe5b1cb2ee3da78fc60fb36c98df9f0ed2db52c7735ce5e6cd786cadb0e730cf7b3ce577f2cc7b25614d89f790fda55873021f3edb1fe125f42ec9bdb2d075b9eff35de9e689747c76e4a50ef98b51baf2fbce86e6b30b2ea67a867aa4b95670a94747b34947a0994bba6d11e940cf737128a73a4183b439a2592dda92f4c713eef6ad45c8c6eddbe5156adfb4c64eb27d9be39015341ba9def553fb25ed88d25e2ec7735ca17d1b59fbb6ab4cfb26dba991b66fb345ba6a6cdfb6503ddb4ded5b871226df7ecb16d21168f8db7039ce063db76f789fea040defc505cdcda22d49df5e75b76fc0328f3081e6d60ab56f5a631ed9be75386405cd0ba9debd98da2fb90e6e9edfe1788e2bb46f236bdf5e5fa67d93edd448dbb71691ae1adbb7dba99edd3106f69b6c835cfbc24d5cb30d839ecf57e63d2a5aedb2ef5ceb0ec28838e8ceb53e87b132b7cb90a94ed0f0581e34f7521b58efa035e5780beded9136148ff1784eba5ad78b789dcbb566a9f52d9f6fcd92e7ad5dfb9511e6bdc90b3d799d4234f2bbc072fb80df2ffac1f4e7ca07f6268f66deff83c3ccfbcbb527d615cffb2bf4bdce350ce87e9e43968f09fd2a9c15d3a66967c8f3d3663b6405cda7a9fdff2cd911f25f07e6f9938ee7b8cad919ca6750e4d9b692ff6c769d8b9ab69dc1fb86792e95ed3d84bfe19873853ea06b3e37439ea9e04ab750a46b249ac50ef98b51baf2cbf52bb98662cae409aa674f929da1d5ef2cf6e8e814d21168785ebe527b5c81836d05e0a81334bc3f04343f107b12d097f3d939ae3d595ae75ef9fa4bb6ebe49eac7a878cbc17c7d4ff2e1bdf41695a449c91ab59492e396f887bf033183b6db885e21066fb45ee571eeb3dd5906136e1a9d4de7c176f8d7fc88e76ce4ff97bbd02ff4f702478782d5663de556b2d92dbf6b4f726cbb6467e9751e9fd9fbe310eaf9d8e37ccfc2dac6bfd7d769560748d65b5ec6a5f1b5689fd12c3f1e6fd123c47e2da2f510de5c573360a7d77699fefa98297b12d0e3d5a956f816d068c45240e9ecfb9f3e841da236dd8673fb8fe433b56df12b1fd50ee3fb45afda8ebfb2bd9a6babef773ad2982e644ab7fb9cfd7f5cd3cefa59f2fe234dfb1917c330f19c7e29bcb6ab329b578fbde0fe6ad30b6cd2bd5ad02cf53a2dd2a773e420bbd2bae394ebc27ae795ede7faef19ee8cc89e69d73a2f25b169e47ec143a5ae4d111bfbbf25f42b5d1bedf7f35d9f8458237f6b0ca3c9a22ddb13fcf6114e99ee7deb4c6b9be3640f93ba211f1f6d964d5d48ff377edc0cfb2d5da7487d9fb79ba7acdb3fd24f701f1fc3568161e3d8819f50d7b58a58dcc3603f2469ac3287eaec85b6f1da090674ce5cec707cd128129fd7a53c86bb615726da2d3212b6856906dbcca86f9fde922bd6d713cc7556e7e85c78d955e9b60ded5b036b199de25b9c6005d8f766d42ae6954e3dac46554cfb6d0f8b04509d3628f8e9a4947f21f37ae395dd0f33c13dea7bac86d13e7886687684bba5297d7ddbe014b176102cdae0ab56fe9cbea6edf5a1cb282e606aa773751fb25ed88d23e1dc7735ca17d1b59fb765b99f62de9da6bb348578deddb73a89edd4eed5ba712a6c51e1df11e7dd73f8f5ce710e139aff5698de97ddf50336ec44177dce6221d6c496e9721539da041da1cd1dc416d60bd83d694e36b260e8479ae90e7a45cf311d53a5758cd6719b8ce74926719b8e6e540732ad1c8f57dd79903a079a7e807d39f27e91bf59ccfbb8799f391f38ebe330734d6795db240f7731cb23c22f4abb08fb0a039f7c0e563f26d76c80a9ac7a8fdff10d91128275eaf78c2f11c57393b83cb5761ec98e77e457e2bc0bcf99cc894780fe9d36067800f7fdf8ff0e7c9ce90fdb3dcef6cde11f9cf0457baf9221d9f0d7d8943fe6294aefcbefdcf7ceec1e354cf9e203b43abdfb9c4a3a3534947a0e1792badbd42b23f91eb7eaebddea70a7c3cb7f555b11e85be9cf74fc9be5fa92d2bbb178a6d38f97d62bd43465e8735f57fa68defa2349d224e736fbfb4df700f7e06638f0d77521cc26cbfc875dbb1de9b06195a088fd6bc4687c0e3e2adb1e63edaef9e78ef8142ffdc3eda313aaf55688c6db4e6eab96d4f7b8f976c4b5d6b2b95dcfbe31be3f0da42c01c30bb3073bfc8731ba06ba9128cae3903adf18bafafa8c4baed70bc79dd167dbc6fddb61aca8be7c6146ca4d25ebad3042f63c3d51fa3cab79d6d338cf9240e5ecff8e93183b487dab0cf4e6b167163b94f89ed34b6dd10e6bd741af64ab9b525dedb81b6b4dcda12688eb5fa977be9586684796fc45c11a7f98e25f96fce58dbcffb236fdffbc1bc15e610b4ce7a68e7f960b45bb26ef1bed3a9f4aeb8e692f19ef07c3a74c37b3c35de13a53d7aedaef95ab95f9ce76b0b42470b3d3ae277579e35aab5775269bf61fb68f71bf6081d2df2e8a8dc7e4325594adf3b6bfca392e74a4772f66a51e868894747c39dbdaa35cfca7385c568dff565cdf9245f1fa0fcadc68878fb6cf26ab2e3f89c12e067d96a6dba43edfd1c5dbde6d97e2eb74e049a4b8f19c48cfa86bd94728cc43623f2469a43297eb6c81beb6d0aefcf103b7682c0bdc4816995c0a4506fda35db8ac542ff3d0e59f7fe2f98c646eb6d98df9f99a4b71d8ee7b8cacd63f2bc81c27e97527dbe947016890ff35e4e5853e23de4ec22ac01820fe27314de4eef923c8709ba0676d3c7608f126397e99a45ba46a259ea90bf18a52bbfdcfbb44c603665b291ead90e9a1fd0da6bb4d4a3233e9709342da4db1e914e9ec56668504e758206697344739d684b14c64acef6ad47c8c6eddb4d156adfb4f7c9cabde22c2b686ea57af73c6abfa41d619ebfdaf11c5768df46d6bebdaa4cfb26dba991b66f1d225d35b66f2fa47af66a6adf662a615aead1510fe90834f349b7720e01f4dcbec9bde23d221fb60def146d8982bdea6cdf8085bf9d06cd9b2ad4be698d7964fb36d3212b68eea17af7766abf50663c2fffa8e339aed0be8dac7d7ba44cfb26dba991b66f3d225d35b66ff7533d7b740cec37d90671fbb690742be7ff405fce7e93f3816cbf7d58b4255aeb59b27d93fbdbb97dfb5885da37ad7d553efb8d6505cda7a9de7d96daafbdff1321bd3de9788e2bb46f236bdfbe51a67d93edd448dbb7f9225d35b66f4f503d7b720cec37d906b9fe236fe2b0ef91f77a220def89d46a977ddfc2741246c44177dce6221de602cb9dc972a8c887d7c67e4c6d60bd83d694e32f0e1c08f35a3faf29bbd613ab75adbf9acffb810ce5cefb71adab83e634a2417d28772e0f68fe20fac1f4d73907be8519cd9aed9f8759b395fb065857bc66ab358e92b240f7cd0e59fe2ef4abf0bd95ea388acbc7e4dbe19015347ba8fd8f260d8479df09ef373ad4f11c57393b83cb57612ffe90ffb34b3b9279f3ff4152e23de4bb0bd819f21c1afec6b971d220ad5c8f86aecb9d09ee4a27cfbae5b3f71738e42f4695e91b79adfe80498361d423cd7e67814747a7918e40c3eb8e5af6835ccf050efe6e56fe8fc6b5b70f3493ac0eb19fccf59d896b3fadd6b7a3befe92c7ad723fed70fb281b08e34c4ad323e28c5c5ae717c87511dc839fc138dd867b280e61b65fe4becbb1fe86073274121eadfadf25f0b8782be8a2c07ac755aeaf523e43bb30da3516de6ba2b1aea4b5d782dbf6b4bf85916d8d6b6f4c25f7eefbc638e5fe7b53ed980d1ed966f0d8b1b34a30bac6b25a76b5af0dabc47eb0e178f37e30f43dbefd60d5505e3c67a3d07797bed1385df032b6c5fc49aa7c0b6c33602c2271e488e65b64172fb2619ffdd021e234f71a0cb7ff9ded07b62910e66f3434fad19a68dfef7d659bcaeb0b751e39787d618db0a9db1c3223cc7b2e678b38cd770cbc90b76b0e0a32723f329676ddfec8dbf77e306f85b16d5ea96e0d393f5c9e4bc77b6341b38dde15d71ca73c8781e7a2f9db218df744674e34ef9c13759dc50a9a5d4247f33d3ae277579e135d1bedfbed6e938d976bbc38ef58e6d114e98efd796f7791ee79ee4d6b9ceb6b0394bf011d116f9f4d564dfd389f3307fc2c5bad4dd768ef9b75f59a67fba9dcfc35685e46f3a9a86fd8a32f6d64b6199037cf4f21be45e4adb90ec0982608dcf31d985e253069ecabd56c2be4dac47487aca0793dd9c66fa0b507ae77787ebfe339ae72f32b3c6eacf4da04f3ae86b5897794599b00a6d1ae4d748874d5b8367117d5b3fb697cd8a384698147475da423d0f0fa809cd3053dcf33e17daa8bdc36718e68de23da9262faf23adb37b6c98109348f54a87d5390d5d9bef5386405cd6354ef3e44ed97b4234afb741ccf7185f66d64eddbe7cbb46fb29d1a69fbd625d25563fbf638d5b327a87d9bae8469814747bc570a34fcdf0dd7b97778ce6b7d5a637adff9178c1b71d01db7b948075b92db65c8542768903647344f521b58efa035e5f800edf19267f1b10dc4f311d53a5758cde7d0b8ce1094e7d0b8e6e540733ad1c8f57dd77931a0794af483e9cf93f48d7acee7df8699f391f38ebef36234d6795db240f71d0e597e27f4abb08fb0a039f7c0e563f2ed72c80a9a3f51fbff17b223504ebc5e71c0e47d9fe32a676770f96afce78dfb15f92d14f3e66f2252e23da44f839d013e7c360bc2b593076965ff2cbfe730ef883c13dc956eb648c7fb8de739e42f46e9caeffbcf229f59f357aa67a8479afdce3c8f8e4e271d8186e7adb4f60ac9fe44aefbf1dc569da071cd6dd55b1d623d0a7d39ef9f927dbf525b56762f14db70f2fbeb7a878cbc0e6beaff45369ee7488b224ef39b04e425f3063f8371163d471cc26cbf4c17719af54dda9db8e7bd6990613ae1d1b2fbe5b70e2ede1a6beeac775ce5fa2ae533b40ba31da3f35a85c6d8466bae9edbf6b4f778c9b6d4b5b652c9bd3fc39dc7341e311b3cb2cde0b1e3f42ac1e81acb6ad9d5be36ac12eb89c3f1e6f544f0f5ad27564379f19c8d42df5ddae37586e0551a1b4c56e55b609b016311892347345f983c483bcb867df64397881bcbfd336c3fb04d8130eff1d21ad3fbd63c78cf81fc87886bcd033497089bbacd2133c268fff87f0a95681347f21f0bc8c8fdc858da75fb236fdffbc1bc15c6b679cd3d93183ba2dd92758bf743aea777c535c729bf2de66f6178efa1c67b52c97d70721f33cf236e163a9aebd111bfbbd00d686ba37df7fe374543f772e139f678c93c9a22ddb13fcf6114e99ee7deb4c6b9be3640790ff98878fb6cb26aeac7f9fc04d7d904b5365d83bdefd0d56b9eeda772f3d7a0b995e65351dfb0c74bdac86c33200ffee61cf19d226fbd7580f621e7ce4e10b8e73a30bd40604abfdeb4e735db0ab93631cb212b686e23dbf8a5b4f680fa7011e9ed2ec7735ce5e65778dc58e9b509e65d0d6b136f2cb336015d8f766d42ee57acc6b58957503dbb8bc68745254cf33c3a9a493a020def259825d2c933f00c0dcaa94ed0206d8e68ee116d49fab6b2bb7d9b2564e3f6ed1d156adfb4c605b27d2b3a6405cd8354ef1ea2f64bda11a57d3a8ee7b842fb36b2f6ed2365da37d94e8db47d9b29d25563fbf63eaa678f53fb769112a6791e1dcd221d816636c5c9b31bea290daff5159570cbf655aeeb35521c74c76d2e68614b72bb2ccf576c10f9f0f98a4f501b58efa035e57825edf12ada789e9372cd4754eb5c61357fc7ea3a1b437ec7ea9a9703cd194483fa50ee7b53d07c57f483e9cf93f48d7acee787c3ccf9c87947dff7a65adf564b59a0fb2e872c3f13fa55d84758a8c47e12791e32cb0a9a5f51fbff6bb223f8bdc2f3bf3a9ee32a676770f96afc7f8cfb1579e61cf3e673bd53e23da44f839d21bfafe4bdfbff457686ec9f81a9dc5977ae74f20ca746a299e390bf98b2fcbefdcffccdeb6fa99efd95ec0cad7e678e474767908e5cfffd2c2ae191f3816750d85cdce7d4091a5e1b04cd3fc47a14fa72de3fe55a8fd7da13edeb2fd98693ebf1c3adc3f21eaf8b29cd05224eb3dcc00b795f40616084dd7701c521ccf6cb4c116770cf50c2ed9b7f9e4118c18ff7ab21ccf6cb0c4f5e87108dfc7e4cf2e3efc78e9e32e0ebcd2df439cf5301161e6f83660a61e2b4c07581908775c5e38f0b529765e05b38290b747f81439693847e15be476c579275c8fe44390fccb282e6b429837a39c386eba99c785cd4e1788eab9cfdc2e5abd05fe5b9fd94df3a326ffeef524abcf7398781c72bbca68270fb94415a39ae81ae796c27ed7e57ba19221d9f4bd9e590bf18a52bbfefcc43fefef44caa67a8479afd4e97474787908ee4dcb0c1334b098fec4f8003fc5cf3cb87087c3cbf7c2eb5514616f4e590b33edab7ef576acb5a5df334726f796334744e0c18a58ca67e9c543710e6efc0a6529a0e11a769070f77de107f6b35dc3776aeb5e96e25dcbe79a36ec20819caed31aba13432af7aa291df57487edcbf2e55ef5f07ec17fe6eb34858f89c13d0ac10f68bdce3df21e4615df1f840613f5e974b16e8bec321cb5a75fb30dfa524eb90ef5de4bf625956d06ca07ea58fec139413f741bb1ccf7195b35fb87c15c61b25fbe55cc2598cf6b5b50deff3086b4abc5b9937ec17f0417c8ec23bc97e011df4015db38d7f8e0d337699ae5ba46b249a731cf217a374e597e3b31902b32993cd54cf7691fda2d5ef9ce3d1513de908346ce369ed8d95fd0970b8ce78aa13343c6f0a9a9b85fd82be9ce5947dbfe6dab26fef2ff8b14dcdf32f5246533f6e9e301036f55f9e6569e85b459c912baf241778216fdc839fc1087ba495e2103e9370378b38837baa126ef94d0feea71246c8e03a23e02cebd7501a99d7c14423e70e253f1ec3bd46f4afe9f7837d1daebd1dc0c2fd2068ee10f68b1c93b50a795857bc9720fdf2ec2bb86439d8a15fd0bc49e837fd36b6afa05977e55eca824356d0dc43fdcadbc93e41dd6e23bd3dea788e6ba4fb5414c61b79d7fc5ab78337efb74a89f7107b11f68bfc2f04db8b8f90fd226d7ce8ba9c8def4a9717e95cdff769f65d727cd62d3097ce57a37af628d92fad4a98ba3c3a3a987424cf893478da94f014041ee0e071aedc43001aa4e575df8f08fb057d39e4f4fdef4dcb5ef4f5973c2788b856c2286534f5e328b25f90661aa56911719af68bcf2e63fb05edaaebbc70b65fa44d33311afa0d413145dc3ebbab40182183cbee62fba5e0c9eb20a2413daef3f0cb11cdd744ff9afe3b3760bfb4dbbcd027004b1b6102cd3785fd8278e06a11f2b0ae40ab34c75d70c902ddb73864f9bed06fbb0226cdf97c2e1f93ef5487aca0f931f52b3f25fb04e5c4678ffcc1f11c5739fb85cb576bfd88c76f45e2c3bcbb096b4abcf7f9c68bfb731e3723fc7bb25f64bf2fdb7c9e8766ec325d41a46b249a0e87fcc5a832eb47e067cae429aa677f20fb45abdfe9f0e8e820d211685a49475af32f720c0b1c3cff021c758286c71da0f9abb05fd097f37a0568b99f5768cbcaf697e0d718ed3b7751ef90d1d48f9b6c63c2b6c1d994669a88d36c4bc10b79e39e6d156963355098ed97bc88d3b4dff302b7cb5671d96208b3fdd2eac96b22d1a0ded579f8e588a6e1d8011ffd6bfa36dc80fdc263ef6254dea63a9c30715ae09a26e4615df1790ed3529765689f0e59a0fb690e592609fd6a8cc93465e5f231f9363b6405cdf1c70eeae5441be6b68fdb9566c7735ce5ec17e5f33a9cdf81b9fe0725bf254f81f790fe1bf68beb1c1084cf3e769056ce11c8f94df38ea0fd77fd2303e95a453a9e5b6877c85f8c746d0579aebc299393a99ea11e69f63bed1e1d4d241d8186db632dfb45f627c0c1f60bcabf4ed0206d8e683aa88d32b2a02fe7b90dd9f76bce2f49fb0cf7e0c76b5cbc1624652cd58f9a419d0cb98a2902ae8d06163af1d2d6dafc9be8fe02f1fc42f17c8eb89f27ee1788fb4bc4fd6271bf54dc5f2aee5788fb55e27e8db85f2beed789fb5e71bf51dcf78bfbcde27eabb8bf52dc5f25ee7788fb6bc4fd2e717fadb8bf5edcdf28ee6f16f7cf11f7b78afbe789fb1788fb1789fb9788fbdbc5fdcbc4fd2bc4fdebc4fd1de2fe4e717f97b87f93b87f8bb87f9bb8bf57dcdf27eeef17f7ef12f70f8afb87c4fd7bc5fdc3e2fe5171ff0171ff2171ffb8b8ffb8b8ff94b8ffacb87f42dc7f51dc7f59dc7f4ddc3f29eebf2deebf27ee7f28ee7f2cee7f26ee7f2feeff20eeff2aee4d80ef6bc57d4edcd7d97bbe6aad5fb47e5bbeb3bdbdbfabd0dfdad6da9b2ff46ce8eec8b7776ce8ec6eed6eede8eee82b74b7b5f577b77777f56ce8e9caf7b4b6b7f5b76eeae869db641bcfa628bd76f8c2f4f2ca8f17997f5f2199f34fef6afd438afa3bb426fdbefbd011d4f5fcd3bb861cd2fc7475303dd229f79a94653e270599f385aeaeee9efe1ecdb2e94eb16c668d93b2393f1a1fede5841465be609cc85c93a2cce76550e673a3cabc834f57e6c352e8cbfafbbabbbb3a5bbb0d363300fe366135072d1a1ec69f61ef6b843f331a3cf8dcf8a75a7f82f59bacdf6dfd6759ff22eb5f6cfdd9d69f63fdb9d69f67fdf9d65f60fd85d6bfc4fa8bacbfd8fa4bacbfd4facbac7fa9f5975b7f85f5575a7f95f5575b7f8df52fb3fe5aeb5f6efd75d65f6ffd5eeb6fb0fe46ebf759bfdffa9bacbfd9fa5bacbfd5fa5758ff4aeb6fb3fe55d6df6efd1dd6bfdafad7587fa7f577597fb7f5afb5fe75d6bfdefa3758ff46ebdf64fd9badff6ceb3fc7fab758ff56eb3fd7facfb3fef3adff02ebbfd0fa2fb2fe8badff12ebdf66fddbadff52ebbfccfa2fb7fe2bacff4aebbfcafaafb6fe6bacff5aebbfcefaafb7fe1dd67f83f5efb4fe1bad7f97f5efb6fe9bacff66ebbfc5fa6fb5fedbac7f8ff5efb5fedbad7f9ff5df61fdfbadff4eebbfcbfa0f58ff41ebbfdbfa0f59ff3dd67faff5df67fd87adff88f51fb5fefbadff4fd6ff80f51fb3fe07adff21eb7fd8fa1fb1fee3d6ffa8f53f66fd8f5bff13d6ffa4f53f65fd4f5bff33d6ffacf53f67fdcf5bff09ebffb3f5bf60fd2f5aff5facff25eb7fd9fa5fb1fe57adff35eb7fddfadfb0fe93d6ffa6f5bf65fd6f5bff3bd6ffaef5bf67fdef5bff07d6ffa1f57f64fd7fb5fe8fadff13ebffd4fa3fb3fecfadff94f57f61fd5f5aff57d6ff37ebffdafaff6efddf58ffb7d6ff0febffcefa4dd6ff83f5ffd3fa7fb4fe9facff67ebffc5faffcffaff65fdbf5aff6fd6ffbbf5ffdbfaff63fdffb5feff591fee1fd68f6c3f5163fd5aeb1f60fd9cf52758bfcefa075a7fa2f50fb2fec1d6afb7fe21d66fb07ea3f58f88dde1e858ed95b67dcf63c6a7db671fa130fe3c82c69f69dbf926df6744e9db2e47d654c6aecc3fbdab354d998f1a2732a739d770f43891b93645998f1927321f90a2cc93c689ccb914659e3c4e649e90a2cc53c689cc7529ca7cec3891f9f414653e6e9cc87c6a8a321f9f41994fc8a0cc276650e693c689cc47a638d66aca60399f9c41994fc9a0cca76650e6d33228f3e91994f98c0ccafc8c0ccafccc0cca7c6606653e2b83324fcda0cc676750e6e60cca3c2d8332b76450e67c06656ecda0cc850ccadc964199db332873470665eecca0cc5d1994b93b8332f76450e6e91994f99c0cca3c2383329f9b4199cfcba0cc333328733183329f9f41992fc8a0cc176650e6591994f9591994f9a20cca7c7106659e9d4199e76450e6b91994795e06659e9f4199176450e6851994f9920ccabc2883322fcea0cc4b3228f3d20ccabc2c83325f9a4199976750e6151994796506655e954199576750e6351994f9b20ccabc3683325f9e4199d76550e6f51994b93783326fc8a0cc1b3328735f0665eecfa0cc9b3228f3e60ccabc2583326fcda0cc576450e62b3328f3b60cca7c550665de9e4199776450e6ab3328f335199479670665de954199776750e66b3328f3751994f9fa0cca7c430665be318332df9441996fcea0cccfcea0cccfc9a0ccb76450e65b3328f3733328f3f33228f3f33328f30b3228f30b3328f38b3228f38b3328f34b3228f36d19fc1fdded192ce7978e1399d3fccfe6cb3258ce2fcfa0ccafc8a0ccafcca0ccafcaa0ccafcea0ccafc9a0ccafcda0ccafcba0ccafcfa0cc776450e6376450e63b3328f31b3328f35d1994f9ee0ccafca60ccafce60ccafc960ccafcd60ccafcb60cca7c4f0665be378332bf3d8332df974199df914199efcfa0ccefcca0ccefcaa0cc0f6450e6073328f3bb3328f3431994f93d1994f9bd1994f97d1994f9e10ccafc4806657e348332bf3f8332ff530665fe4006657e2c83327f3083327f2883327f789cc87c788afb7a3f92c1727e3c83327f3483327f2c83327f3c83327f2283327f3283327f2a83327f3a83327f2683327f3683327f6e9cc8dc94a2cc9f1f27321f91e218e3890cd6ed7fcea0cc5fc8a0cc5fcca0ccff924199bf944199bf3c4e643e304599bf324e649e98a2cc5f1d27321f94a2cc5f1b27321f9ca2cc5f1f2732d7a728f337c689cc87a428f393e344e6861465fee63891b9314599bf355ecea14951e66f8f13990f4b51e6ef8c9775c91465feee7899274951e6ef8d13998f4c51e6ef8f13998f4a51e61f8c13998f4e51e61f8e13998f4951e61f8d139927a528f3bf8e139927a728f38fc789cc535294f927e344e6635394f9a7e344e6e35294f967e344e6e35394f9e7e344e6135294f9a97122f38929cafc8b7122f34929cafccb146536e7081f60f33a95e4afb13a30cf72b19b10bbbad899797a336f6de671cdbca699e733f35e661ec8cc8b987902336e36e34833ae32e30c63771b3bd4d865c64e31fdb6e9c74cbb6eda39f3de9bf7c0d40ba3a7a6d89d1cbb5308cf93d63f2a067674ec8e89dda4d84d8edd94d81d1bbbe362777cec4e88dd89b13b29764db13b3976a7c4eed4d89d16bbd3637746ec9e11bb67c6eeccd89d15bba9b13b3b76cdb19b16bb96d8190599c3960bb16b8b5d7bec3a62d719bbaed875c7ae2776d363774eec66c4eedcd89d17bb99a69c62777eec2e88dd85b19b15bb67c5eea2d85d1cbbd9b19b13bbb9b19b17bbf9b15b10bb85b1bb24768b62b738764b62b73476cb627769ec96c76e45ec56c66e55ec56c76e4dec2e8bdddad85d1ebb75b15b1fbbded86d889df93fbcf95fbaf97fb8f99fb6f9bfb4f9dfb2f9ffb0f91faff93fadf95fabf97fa9f99fa7f9bfa5f9dfa3f9ffa1f91fa0f93f9ef95f9cf97f9af99f98f9bf96f9df94f9ff92f91f91f93f8ff95f8df97f8bf99f89f9bf87f9df85f9ff83f91f82f93f80392fdf9c1f6fce5337e78b9bf3b6cdf9d3e63c66733eb139afd79c5f6bce7335e79b9af33ecdf997e63c48733ea2392fd09c9f67ce9333e7ab99f3c6ccf95be63c2a733e9339afc89cdf63ceb331e7bb98f34eccf91fe63c0c733e84392fc19c1f60bea737df979befadcdf7c7e67b5cf37daaf95ed37cbf68bee733dfb799efbdccf74fe67b20f37d8cf95ec47c3f61be2730fbebcd7e73b3ffdaec4736fb73cd7e55b37fd3ec6734fbfbcc7e37b3ffcbec8732fb83cc7e19b37fc4eca730fb0bcc7abb597f36ebb1667dd2acd799f52bb39e63d637cc7cbf99ff36f3c1667ed4cc179af933339f64e657cc7c83197f9bf1a8199f99f18ab1df8d3d6bec3b63ef98fedff487a67f30eda5693f7e42efd6e1d63fcefa1b7bb76d6bdabda3a977d7aefe9dbbd75dd57bc3ba0d5b77afdbb5f5a6fec8bec211bd9e73b66fddbdb577dbd69b7a776fddb1bd694befae2d4d7d3bfa77356ddfb1bbe9aadedd1bb744f6c52e35583255ffcea6debebe9dfdbb76356d1d48b37b4b7fd3c61ddb77efecddb8bba9afffea6d3b6eecdf69d25c67d31e6ffddeddbbfbafba7a77096b5f5fd3f55b776f69da715dffce4ddb765c6f9e3f6f14f4b14ea2d32c9d799193a49b6fd34db1f7e7efdcd97b63d3d6ed7dfd3734edb87677d38e4d4d1b765cbbbd6f1727ba2d21b3bb9230bb2f49a253262443787bc274774d4800f29e2489de9524d1076ca211bc2e9cec2349787d3649a2af2449f4dd24897e9324d17f26ac16cd75c9d215eb1280bc3821b32f1c942c5dc3c1c9d25d7e7002e1362564766d1266372764f68184e9fe98305dae3e8170f5f5c9984d4ac2ec8484cc1e4a98eef709d39516c213a4bb2161ba0f1f9240999f4c92e8cb4912fd23a158d31a92a5bb2b61baef372410eea74912fd2e49a23f2749f47f4912e51a13246a4c92e8e824894e4b92e8ac2489f24912752649342349a23936d1280db1054978ed4892e83a9b68b46fe2f39330bb2d21b30f88744bfa7bfbe23159dfd6bed2606c677cdb6414dbd7bbbb97d39d7468b2740f1d9a0ce7c3872650ca6349127d3321c2a79230fbf724890e3c2c19c24909d31d77580290272749343321c24b12a65b9a04e4aa2489ae4f88f0b684e95e9e04e46b9324fa6842849f4cc2ecf349123d9510e19f13a6fb6b1290ff9724d171872743383561ba96c31380ec4892686942841b9330db9a24d14b12227c4bc274f72601f9ae24893e9f10e10f13a6fb491290bf4c92e8802392219c9230dd09472400796a9244e72744f8a284e9de9004e47d36d1284df60792f0fab84d74f2be825d75edb6dd5bafde76a35fba4f27e1f8e384aafc791266b92393313b3a61ba2947260079529244e72644b83461ba154940ae4d92e8e684085f9330dd1d4940be2949a28f2444587354b274471c9500e49424899a9224eab68912b53d3392705c9550916b9330bb2921b35b9230bb2721b34713a67b2c09c88f2649f4fd84084f383a59ba69472700d99124d1029b2851fd5f9c84e3f6843ad99984d9eb1332bb3f61ba0793807c3849a2af244438e59864e9ce3a2601c8d62489ba93249a9924d1329b2851e55f9984e3b509b57f6312666f48c8ecee24cc3e9490d9479330fbd784cc7e9f30dd9f9280fc5b9244c74c4a867075c274574e4a00726792442fb58912bd6caf4cc2f1a1843a793809b36f2464f6f384e97e9504e47f244974f0e4640817264cb76e7202909b9224bac5264a54259f9f84e3db12eae4be24cc3e9f90d97712a6fb4112903f4d92684f4284474d49966ef29404204f4c92684642844b12a65b9e04e4654912dd9410e1ab13a67b7d1290772749f4e18408bf9a30dd9349407e2f49a2ff4a88f0906393a53becd804208f4992a87d1408a3ff0f6b53bb893d910500>, - "isInternal": false, "metadataHash": Fr<0x1eef7f2eaafa09e24b0475a918bd7388c4dec305145849f5f84d1b822202b944>, "selector": Selector<0x038cda46>, "vkHash": Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, diff --git a/yarn-project/circuits.js/src/contract/events/private_function_broadcasted_event.ts b/yarn-project/circuits.js/src/contract/events/private_function_broadcasted_event.ts index 9fb9569e3c7..a11c23de56d 100644 --- a/yarn-project/circuits.js/src/contract/events/private_function_broadcasted_event.ts +++ b/yarn-project/circuits.js/src/contract/events/private_function_broadcasted_event.ts @@ -107,9 +107,6 @@ export class PrivateFunctionBroadcastedEvent { } export class BroadcastedPrivateFunction implements PrivateFunction { - // TODO: Deleteme - public isInternal = false; - constructor( /** Selector of the function. Calculated as the hash of the method name and parameters. The specification of this is not enforced by the protocol. */ public readonly selector: FunctionSelector, diff --git a/yarn-project/circuits.js/src/contract/private_function.test.ts b/yarn-project/circuits.js/src/contract/private_function.test.ts index 1d4487b744b..e39d828bf3b 100644 --- a/yarn-project/circuits.js/src/contract/private_function.test.ts +++ b/yarn-project/circuits.js/src/contract/private_function.test.ts @@ -8,8 +8,8 @@ import { computePrivateFunctionsRoot, computePrivateFunctionsTree } from './priv describe('PrivateFunction', () => { setupCustomSnapshotSerializers(expect); const privateFunctions: PrivateFunction[] = [ - { selector: makeSelector(1), vkHash: fr(2), isInternal: false }, - { selector: makeSelector(3), vkHash: fr(4), isInternal: false }, + { selector: makeSelector(1), vkHash: fr(2) }, + { selector: makeSelector(3), vkHash: fr(4) }, ]; it('computes merkle tree', () => { diff --git a/yarn-project/circuits.js/src/contract/public_bytecode.ts b/yarn-project/circuits.js/src/contract/public_bytecode.ts index e7a77a887ac..0292fd55b9d 100644 --- a/yarn-project/circuits.js/src/contract/public_bytecode.ts +++ b/yarn-project/circuits.js/src/contract/public_bytecode.ts @@ -15,7 +15,7 @@ import { FUNCTION_SELECTOR_NUM_BYTES } from '../constants.gen.js'; */ export function packBytecode(publicFns: ContractClass['publicFunctions']): Buffer { return serializeArrayOfBufferableToVector( - publicFns.map(fn => serializeToBuffer(fn.selector, fn.isInternal, numToInt32BE(fn.bytecode.length), fn.bytecode)), + publicFns.map(fn => serializeToBuffer(fn.selector, numToInt32BE(fn.bytecode.length), fn.bytecode)), ); } @@ -28,7 +28,6 @@ export function unpackBytecode(buffer: Buffer): ContractClass['publicFunctions'] return reader.readVector({ fromBuffer: (reader: BufferReader) => ({ selector: FunctionSelector.fromBuffer(reader.readBytes(FUNCTION_SELECTOR_NUM_BYTES)), - isInternal: reader.readBoolean(), bytecode: reader.readBuffer(), }), }); diff --git a/yarn-project/circuits.js/src/tests/factories.ts b/yarn-project/circuits.js/src/tests/factories.ts index 7ea44f95e03..aeec6e1ef03 100644 --- a/yarn-project/circuits.js/src/tests/factories.ts +++ b/yarn-project/circuits.js/src/tests/factories.ts @@ -1294,7 +1294,6 @@ export function makeExecutablePrivateFunctionWithMembershipProof( functionMetadataHash: fr(seed + 5), unconstrainedFunctionsArtifactTreeRoot: fr(seed + 6), vkHash: fr(seed + 7), - isInternal: false, }; } @@ -1333,7 +1332,6 @@ function makeContractClassPublicFunction(seed = 0): PublicFunction { return { selector: FunctionSelector.fromField(fr(seed + 1)), bytecode: makeBytes(100, seed + 2), - isInternal: false, }; } @@ -1342,7 +1340,6 @@ function makeContractClassPrivateFunction(seed = 0): PrivateFunction { return { selector: FunctionSelector.fromField(fr(seed + 1)), vkHash: fr(seed + 2), - isInternal: false, }; } diff --git a/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts b/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts index 8ec8f5f6dbd..1586c8c3bbe 100644 --- a/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts +++ b/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts @@ -32,8 +32,8 @@ describe('Data generation for noir tests', () => { publicKeysHash: new Fr(45678), salt: new Fr(56789), privateFunctions: [ - { selector: FunctionSelector.fromField(new Fr(1010101)), isInternal: false, vkHash: new Fr(0) }, - { selector: FunctionSelector.fromField(new Fr(2020202)), isInternal: true, vkHash: new Fr(0) }, + { selector: FunctionSelector.fromField(new Fr(1010101)), vkHash: new Fr(0) }, + { selector: FunctionSelector.fromField(new Fr(2020202)), vkHash: new Fr(0) }, ], toString: () => 'defaultContract', }; @@ -44,7 +44,7 @@ describe('Data generation for noir tests', () => { packedBytecode: Buffer.from([3, 4, 3, 4]), publicKeysHash: new Fr(4545), salt: new Fr(5656), - privateFunctions: [{ selector: FunctionSelector.fromField(new Fr(334455)), isInternal: false, vkHash: new Fr(0) }], + privateFunctions: [{ selector: FunctionSelector.fromField(new Fr(334455)), vkHash: new Fr(0) }], toString: () => 'parentContract', }; diff --git a/yarn-project/types/src/contracts/contract_class.ts b/yarn-project/types/src/contracts/contract_class.ts index b6714bd03c4..a532dfb9e1c 100644 --- a/yarn-project/types/src/contracts/contract_class.ts +++ b/yarn-project/types/src/contracts/contract_class.ts @@ -27,11 +27,6 @@ export interface PrivateFunction { selector: FunctionSelector; /** Hash of the verification key associated to this private function. */ vkHash: Fr; - /** - * Whether the function is internal. - * @deprecated To be reimplemented as an app-level macro. - */ - isInternal: boolean; } /** Public function definition within a contract class. */ @@ -40,12 +35,6 @@ export interface PublicFunction { selector: FunctionSelector; /** Public bytecode. */ bytecode: Buffer; - /** - * Whether the function is internal. - * @deprecated To be reimplemented as an app-level macro. - * TODO(@spalladino) Remove this - */ - isInternal: boolean; } /** Unconstrained function definition. */