diff --git a/contracts/test/data/beefy-fiat-shamir-bitfield.json b/contracts/test/data/beefy-fiat-shamir-bitfield.json index 76215637a..b8f12c003 100644 --- a/contracts/test/data/beefy-fiat-shamir-bitfield.json +++ b/contracts/test/data/beefy-fiat-shamir-bitfield.json @@ -7,4 +7,4 @@ ], "finalBitFieldRaw": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000d00400900006c00180090000040c00380c3020020022031020402800188008200049450c0111200c8d1001202300c03008a001080140060004000810600d000000000000000000000000000000000000000000000480820a940410001a060" } -} \ No newline at end of file +} diff --git a/contracts/test/data/beefy-fiat-shamir-proof.json b/contracts/test/data/beefy-fiat-shamir-proof.json index 9516e004c..ba8ba8335 100644 --- a/contracts/test/data/beefy-fiat-shamir-proof.json +++ b/contracts/test/data/beefy-fiat-shamir-proof.json @@ -8552,4 +8552,4 @@ } ], "finalValidatorsProofRaw": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000010e000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019600000000000000000000000000000000000000000000000000000000000001b800000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001fc000000000000000000000000000000000000000000000000000000000000021e00000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000262000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002ea000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000032e00000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000372000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003b600000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003fa000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000043e0000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000048200000000000000000000000000000000000000000000000000000000000004a400000000000000000000000000000000000000000000000000000000000004c600000000000000000000000000000000000000000000000000000000000004e8000000000000000000000000000000000000000000000000000000000000050a000000000000000000000000000000000000000000000000000000000000052c000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000570000000000000000000000000000000000000000000000000000000000000059200000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005f8000000000000000000000000000000000000000000000000000000000000061a000000000000000000000000000000000000000000000000000000000000063c000000000000000000000000000000000000000000000000000000000000065e000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006a200000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006e60000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000072a000000000000000000000000000000000000000000000000000000000000074c000000000000000000000000000000000000000000000000000000000000076e000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000007b200000000000000000000000000000000000000000000000000000000000007d400000000000000000000000000000000000000000000000000000000000007f60000000000000000000000000000000000000000000000000000000000000818000000000000000000000000000000000000000000000000000000000000083a000000000000000000000000000000000000000000000000000000000000085c000000000000000000000000000000000000000000000000000000000000087e00000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000008c200000000000000000000000000000000000000000000000000000000000008e400000000000000000000000000000000000000000000000000000000000009060000000000000000000000000000000000000000000000000000000000000928000000000000000000000000000000000000000000000000000000000000094a000000000000000000000000000000000000000000000000000000000000096c000000000000000000000000000000000000000000000000000000000000098e00000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000009d200000000000000000000000000000000000000000000000000000000000009f40000000000000000000000000000000000000000000000000000000000000a160000000000000000000000000000000000000000000000000000000000000a380000000000000000000000000000000000000000000000000000000000000a5a0000000000000000000000000000000000000000000000000000000000000a7c0000000000000000000000000000000000000000000000000000000000000a9e0000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ae20000000000000000000000000000000000000000000000000000000000000b040000000000000000000000000000000000000000000000000000000000000b260000000000000000000000000000000000000000000000000000000000000b480000000000000000000000000000000000000000000000000000000000000b6a0000000000000000000000000000000000000000000000000000000000000b8c0000000000000000000000000000000000000000000000000000000000000bae0000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000bf20000000000000000000000000000000000000000000000000000000000000c140000000000000000000000000000000000000000000000000000000000000c320000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000c6e0000000000000000000000000000000000000000000000000000000000000c8c0000000000000000000000000000000000000000000000000000000000000caa0000000000000000000000000000000000000000000000000000000000000cc80000000000000000000000000000000000000000000000000000000000000ce60000000000000000000000000000000000000000000000000000000000000d040000000000000000000000000000000000000000000000000000000000000d220000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000d5e0000000000000000000000000000000000000000000000000000000000000d7c0000000000000000000000000000000000000000000000000000000000000d9a0000000000000000000000000000000000000000000000000000000000000db60000000000000000000000000000000000000000000000000000000000000dd20000000000000000000000000000000000000000000000000000000000000001baf781c68f88bc46479434d330146f01e2eff2b9550a93568a4e870b88f21456874883fbbb0bbf5cb1f7c2e64d1c7ada12608710b57c6390adb6745433714bae3000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000056a9db2dde0d7179ef11190fe40f0999d2dc610d00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a84facfbe4ad1efa05cec2b6a905ef3ea53b1f944ed8284f73457d4ce0d597984a6505d427e1b3b710cd14ab8ee72deb465a6b2415f9a4f08af29bbe2854a4e6b8970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830baf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c5732ada3d3c5dde47954eac5e346a2ec8c528ba6a1ab7697cf15b1351ef8346c20b7345ccf05a212a79e230de1b8ee7f0b70d66858ae88f4ccea2f6ab4f350dd000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000c147bdb254b97a418ec13abe25add85f0465b9cc00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ae98edf243dee03a9e408348bc6a63f1c4776d0874ca94f6405d9947b94a0ba11f33e999f73f666fbb0521c18262c9cb12b17dc7336acc35ffcd539799217e31316e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0af7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c1701f69a0b061909fbc58737711046463669d3e9a80dcc97f67096330498f1f357fec6e2debb222f0d3e76d6d5df21743644e0ef5325171fdf4f4ee35674cc500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000528f86deddd3e80957f761df800e86c82c46657000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ae5a153207c8fe9e23d1fdc238848ba739254c1145d8bb8ee3261d863af88d67d495b219aeb6cb384e38afa1033db0d9d79fbe506dfa3be395095df94566b094e5e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5eca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936edf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c353867922ebe0c4115cc2ed08ebff3447a30530fa13b2aad4ecacdeacb99fde55f85bc0db35feeb030175e1d6bf127e1707095b77594865d95183154cb3318d5000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000005473090d3a9d7b984b31f2d36f2d004a9188796d00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a2d3fe5fcf7e9b1559b73b0055d813911a135fd0f7311e5a69899cf420c418c9f8df6a7abbefe9b2fe4e384876b71ec1eb90d23950c68b78df4e22909590d19307126a8044f997db28aaf469f8f66a8a4c09c25ab03c0b902bf02618d54d5e86e325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c5fea7c347deb6ae44b4b7dccd1f3710455824359b8162670e70cd04777cfe2e608de7fee222ad2aadacad19c08ebcf18f942d48fda4efa937e74108971d1bfd60000000000000000000000000000000000000000000000000000000000000021000000000000000000000000da9272ae81a25731f7c5e41c0a35d167703110e300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a9dc2c43c8041c0776ded2e58777c7a882c08c959fdfcb1b364956b3deafc4118b71a43f8fcffdd983ac18f7c5dbcd69e6aa3e203a9ce09d40a5234e1925153dd8ef3bfbae8f9b410d233cdfe5d7e21a5efa8b14e8101924058008818e14b60799a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bbe904831b566560bb7dbfe3f78ca6936926d64d1ed873d412b353f45291cfafa11b44b3fe2e2c5817cf0ca032536998c5c6000968708a27bb47b98e2335760ac000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000006742544686e53f20af2c142cc16237a00c73de8a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aca98d350b190c5eccb37aa15728b19144c9759d396285a4e7f2a28c7809c8ebade649342947e1988655c618763d70685a13df42aa865cf359589548bc23a2a3edf87aa78616553aa20706bacdbbdd36e1144798c2856e10cdd4499faa7736c821c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c7768ea6b29e9d3fa6a6d6cc1b116429fc8bf8104981b6492d2a93ac4e6ff1b0411e2a0deff9b2e4f27dc620ab28698f08beef4df356d0f367919b0ca3b03a5140000000000000000000000000000000000000000000000000000000000000031000000000000000000000000e1b54fe1ce501b582c4e9bb0df1637730fb7af9100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000acdbcffc7df03d81faa7348cc74f9ee6d67f4ec8275c20b9b225ac1ee04e80d64c1bfe7aae1ec8d84327846f6acfa72c4133d33d5eb410d8ec99b9f35fd3939881f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296a27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4fbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b0e1ad57c9a4d5b46493530975a0eeea62a48721ac555a6ccb76a217bfe2584206c464df86da4b4766d39e3de5b2cf9b2f5bcb96100267a72c46559b1f9e6f54500000000000000000000000000000000000000000000000000000000000000380000000000000000000000003dae00899e4f81e2b447b39a3cff0ea4a8bc327300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a8c53e866a7ff52b8836810ea084a42336d638792ceca9ddb84429b690a9e0a0ee7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc992537b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001ce3fd5cfbe551e0adea0482fd237609cf1983e8f5166ddcb6ae6cf1496d6109a22d890f24bcf1455c14d4eac466e50fd31c3e20fa77fa880784aa192576366bb6000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000718eab0eed89a6b4878787e6b92342f2f11556000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a6adf1246d3ad858654a53901addf49494097bb01bd9509516c8e09c1d5e5af9cd3333ce1dad4f71571d71b58568971e48d501fc843a189320a887500398f5ba03e7c6648ca3318e8b4f95e8de1bd6ec267ba0db4912f63b5441d93664b7d4d98153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b45da185f41b2a9bb1c09c91f2c4b9a2c459caddeff63af1a254d291dc3aa04035e877a7f34752539870110db4db903c5be7b9f9aede42d6a9f7706847ca648b0000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000704c376af60b1a6775e6b3466c1e06615d1effdf00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ac9976c2c86f88816de7b3b421a6a404a20159c1d989f019b2a2cc26859ff838cd3333ce1dad4f71571d71b58568971e48d501fc843a189320a887500398f5ba03e7c6648ca3318e8b4f95e8de1bd6ec267ba0db4912f63b5441d93664b7d4d98153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4b8aefe65af72a69011a5539ab2d19e55a34db316d3b0235a2117d5b6fc42ffdef804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c081cbabcb0de8786d49cef78c205e9e3e8e8ffe1a7ebbfa6d8d2315e923134354e084cccfb496b8e4a397dce7a4c835a1e6df28703b4ed61e34289db238fb7500000000000000000000000000000000000000000000000000000000000000045000000000000000000000000bb771fced4fcc7999626b4f09c0c94d7b20efdfd00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000afa49bdb53556254a24e245e3ab0f65fbdf80761f79037be3f2a09d3e0bb3524b86d13a55fa0b1c88017b7e3dd3b6b4e14c9632bf7975b06e2690e627cdc4701afb8d08773869ebbe2e15f561f06c83a7d905e61cdefdc7b195f01a3c03452f1a83fb7a6c0e1652228e26dcd220a0d372fb4931a9bd46537b4642eab9bc086f0bbd98baef56c26d14cf5b8db432629cd28355c36cb13512fbb6be262fce05899403abdd191345b346cc826490fd23eb43349fab167ad091f4c48d9d2f6d70a5402586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001ba94b54890a61f34fe1dbda2e924f96088939fb2cba112694d03195f1ab97dbf64a3962516354d9a1a629fd7d1c53786b87a85a94cac7292b4250ce8de37c026400000000000000000000000000000000000000000000000000000000000000490000000000000000000000006bba842f1eaa24d3c2696dfaf5acd32b51497b1500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ac64fbe72de8cc7b9397406e0de664c63b9fac1ab2a1dfa8829f990bdf2484e6b34684c2aad2e5da85490a1ce3c0e971ffa62cc3e25c6c945f3c0c3752749afdb92c44049c0e8708ce83280f3e2d4a7efde68aa8ee5b6778cd610762be0b18abb551a87dd159fa88a9d7c1e081ac46570393d530aeb6e52e6a8c73fc7b1063f14bd98baef56c26d14cf5b8db432629cd28355c36cb13512fbb6be262fce05899403abdd191345b346cc826490fd23eb43349fab167ad091f4c48d9d2f6d70a5402586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cac6d4643c606b6792e84b7829793286f4932a5d5eb2aa431a60b39f7d762c263453e0b1f6b4efb983f6603df23ef5a5cb3d73ca335da375e6a1b50784cc1a34d00000000000000000000000000000000000000000000000000000000000000550000000000000000000000006366b6ec3b3dc49638faa0769be4be5180619a9700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a1d2c9cf753d3254cb2791a34c928f3318ddd469fa2fa650f497d66d5b0df941dce384e4e3b1c34a1e3b5d94fce22a7f65d341d5f6fa3ff7df2bcb1b8492edf832e5c40fae8ba9e460c3d65929aa8a7db7597ca48b07ab4aea938086c0843dda97bc44cfe90425291d8c8808375892cb895a9dd67ffd994a74bb0985b7072d98be1f4f439878975a3e8cfc749957c8b204653fd135da9b547d30269713885961303abdd191345b346cc826490fd23eb43349fab167ad091f4c48d9d2f6d70a5402586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c01f95d406ddeae06274a85454f83a7d102e9a886c02d3c504cb5dca71b52d6d82e1061cdd3cf4e17f563ca5d0ea90e6148ef604288dab741a4c4ab01b185c3270000000000000000000000000000000000000000000000000000000000000061000000000000000000000000989f9720ee9b7350b386abc074cdb2c4107ee05600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a7bb4147027228523c16c9afe931d8a9a17f7f0b44bb45f5d8b6e2382c3745bbe3247ab9c80462c8fa3e893858bdd9a8428e7cbc5d771c951c0fa34014309702e364a795593eca5c12dcaa6f7981287b9d2c4c5a980605cd65ea547fc3d263eea5036b805dffcdd5b2e8855505a509803215b09cdecc3ad10d4269feba0ba4184f872ed3e12529c53f89da7df08d369d23c2bb57916e4783a3e07b3955845133d9c88a3c47b71bf6a0902cb29f0acc01a5e6b16f50d9030a2c6b6cc46aa3abfc82586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b515ff914a84c6769e688ecc9d33849bcbd4e5a76bcffa820f7bf45779771616e1a86888f8a19f292007166d74126aaf66e3966bff90d058dbd5601bb6070394a0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000850d26bcdcd3aaaadb9ffb9d422286fef4da372c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aa5fe10c4d1160530a7f0ce7bb8d7ddd6e4ef058c82237bef515e9a153300add008700a8d819c59ef5e9cd72148d9904a2da402133e4a1d418c2dcfdf3f69cb92e075ea89fc4d3fb7b0f1b18e62d6d941a058f1aff13808cfd71272acaca368b33fd245293b80fa562dd20401820b8d6aa2c21a6174cea3a357c0b09b11cdf9dff872ed3e12529c53f89da7df08d369d23c2bb57916e4783a3e07b3955845133d9c88a3c47b71bf6a0902cb29f0acc01a5e6b16f50d9030a2c6b6cc46aa3abfc82586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c3f7d6c004d4a342f33bf3867b8541db111da57b35929a64545f5789a63630d4d0ce66546b259f71fb34992bc52065e98067060dd7051544dd8a7569c4269f2fc0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000c47b278e33fd3b23745fe90728a8dd39eb79cf6200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a99da4dbeae48792e58a9542c4a458df4f8a1f12cfb4bb587f3d0cdf338b6e24b08700a8d819c59ef5e9cd72148d9904a2da402133e4a1d418c2dcfdf3f69cb92e075ea89fc4d3fb7b0f1b18e62d6d941a058f1aff13808cfd71272acaca368b33fd245293b80fa562dd20401820b8d6aa2c21a6174cea3a357c0b09b11cdf9dff872ed3e12529c53f89da7df08d369d23c2bb57916e4783a3e07b3955845133d9c88a3c47b71bf6a0902cb29f0acc01a5e6b16f50d9030a2c6b6cc46aa3abfc82586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c24c88634c9e3675c189f410cbe399c150822d307546c2bc248146ccd569ab58f7227b530723b31ac2e7f8383a440b524a4f793e394f6f25db169ff49dc8e2b8e000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000c3107d62baa42d3f0f7d81d1c04e1bebd51e9c1400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aa42aa917cf80c8c0fa03fb8c4e0a2100bf5cb39205d88ec47fad1f2a92904328607f9141344892793ec4cb42a1816b0ec80d9821fd75f0e3d0c7281fca0e860582d53d4224806f6725d81fa7ef244eaf79652a078bb6e6f0669ee59a6fc9107f3fd245293b80fa562dd20401820b8d6aa2c21a6174cea3a357c0b09b11cdf9dff872ed3e12529c53f89da7df08d369d23c2bb57916e4783a3e07b3955845133d9c88a3c47b71bf6a0902cb29f0acc01a5e6b16f50d9030a2c6b6cc46aa3abfc82586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c9c60eebe38ed2d5a493cbc9d60b46f6b4f66e43c5ab23e1ef658abaaf904f1b9352b92168b461748d69147bef61366e3bcf7620666f97a37479bcd68a0471aed000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000c42dc279054343c4a83ac1efe91e9a2ccb9dce8100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a886fb76dcb5590a021c791db5cf80053236085328f8d402c46c8f90aac24c287607f9141344892793ec4cb42a1816b0ec80d9821fd75f0e3d0c7281fca0e860582d53d4224806f6725d81fa7ef244eaf79652a078bb6e6f0669ee59a6fc9107f3fd245293b80fa562dd20401820b8d6aa2c21a6174cea3a357c0b09b11cdf9dff872ed3e12529c53f89da7df08d369d23c2bb57916e4783a3e07b3955845133d9c88a3c47b71bf6a0902cb29f0acc01a5e6b16f50d9030a2c6b6cc46aa3abfc82586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b18e51bb41c5668b630abae4ee9f32b7ccaca9a267f8d20fcf41a1d0f75d0d9816a8f09e16808b9ec239c535ca665a82e38a316a9b111e67f4bc9eedbbcec41bb00000000000000000000000000000000000000000000000000000000000000770000000000000000000000005f4a90bcb2e1ec3fa15206fbf546497820af999100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a78ee4f529b07d7364d0da714012a2e676698034df9be4c08d504d2dcb62ad45f2f3e8719554d71589ae679692ef3951fdaee3445126323eddf5edfbc78be6aa5a44761bb661fd68431ba5962280d515d2e286060fac0a5893bf5c7a7bc4309d13669134efbdc64823fbca48af53f72ffb0dccdef81c3b0d35f804893d535e8866eafa8fc9b0e67ab52141344ed25288a2bb3d158af038ea9ecc3c2ddf30f32e79c88a3c47b71bf6a0902cb29f0acc01a5e6b16f50d9030a2c6b6cc46aa3abfc82586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001be64d2d94765ce6a44eb3c7512918a3e50b58240ccba566eea59660af492cd0a70925b4ddf81c239e6d21c8150aa642023d0c197cfd5d3da1ec2d91ec177741560000000000000000000000000000000000000000000000000000000000000078000000000000000000000000844ee91fbd8fa05b38aa9ef1bfa456b20133f93900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a9e74b91d63dadc1fbde35ac93a49cff46c26a83a115055e74432eaf7ea86b944edf15f47ed2ec04caf6e781fbeb8b0de5f608eb32fa1f7fd36ca4856c0d244a9cfe80a9f7ce3ccac48dc2669e711102070e02aad82248c4ac61559a54aa1ba9b6a6b11b8ac62156373d12a56d1ea2ac40d9ee23b562aa7a939e864f5492ee7cf6eafa8fc9b0e67ab52141344ed25288a2bb3d158af038ea9ecc3c2ddf30f32e79c88a3c47b71bf6a0902cb29f0acc01a5e6b16f50d9030a2c6b6cc46aa3abfc82586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b6e2ad73392d0f4ccb9b65cd848351433f1cb8500035379dfd19999286d474e283316cc3ac0faa5d8e05952a0d18788ceb368937d30982c0098cbc4929bd3d60700000000000000000000000000000000000000000000000000000000000000790000000000000000000000003533866c9c55c6a99c5a422249816ea63a88d1ea00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aca208ad196b6d1f95fc03567a7712f190ca982170329cc0f022288ebf3f0bff9edf15f47ed2ec04caf6e781fbeb8b0de5f608eb32fa1f7fd36ca4856c0d244a9cfe80a9f7ce3ccac48dc2669e711102070e02aad82248c4ac61559a54aa1ba9b6a6b11b8ac62156373d12a56d1ea2ac40d9ee23b562aa7a939e864f5492ee7cf6eafa8fc9b0e67ab52141344ed25288a2bb3d158af038ea9ecc3c2ddf30f32e79c88a3c47b71bf6a0902cb29f0acc01a5e6b16f50d9030a2c6b6cc46aa3abfc82586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2bf804afe61ff1c61cdcb536df0f29b62f6ca8ae121863b66c826a2ee9823f33653bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b8830dcdcf51b680dcb086ce8533fed40dac9b78f2daf2aaa7eb2f8bc0d9fd4c33d99b30fa22c5859b7cdb7db3d76bb210ebbae62a9e09b6a3d03c27490760e4c0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000ead873b6485bf952cb0e47defb34bc402cd3b71700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a41591ab396661ff2ba2099efbc4c4effb78c3a960f02eab647e8586a2dcca2ac616f057421333e90dd34d4334ab917b9a4eb9ebd6b52a57990730c63f209658d60272e2172a49f7e6731661aed7bc0528dcfde799983a48d3c786a48db3f89c45d43a2158d434edd8ebb2f79eddc0fbadec866324200124198d1074797db51ede05e69cbeca48f72fd3d81601b5419215fb234ba3a76467e8cd973d335c9e83ac72bd3c5ef89cc841cebd46ee834312bbb107ee0b90e729f93eb7ce924ea2d8064aaad909501e44338a8a9191abc63f8def273fb9f03108864016a17cad259dcf2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c239bb7a0f570fc0181122ad3620d373187fa780ea89289f9ceed20a2bbd2c55f0826c9bae9f5a2710e22ebfa0f04324828cbc196419252ecf80de4010f7947bf0000000000000000000000000000000000000000000000000000000000000087000000000000000000000000dca28b90a34fa875e5a2f32424e6b6f35e04340e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a478757d3e2214319f730bfe18e194131b2fbcf59280a01af1f76006120b218ba616f057421333e90dd34d4334ab917b9a4eb9ebd6b52a57990730c63f209658d60272e2172a49f7e6731661aed7bc0528dcfde799983a48d3c786a48db3f89c45d43a2158d434edd8ebb2f79eddc0fbadec866324200124198d1074797db51ede05e69cbeca48f72fd3d81601b5419215fb234ba3a76467e8cd973d335c9e83ac72bd3c5ef89cc841cebd46ee834312bbb107ee0b90e729f93eb7ce924ea2d8064aaad909501e44338a8a9191abc63f8def273fb9f03108864016a17cad259dcf2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b9447db68258d6504d5aa9c5d6af4417b52d9dfcb996b49c4b40730dc8094d26349bd2df8a1ffadf9dfaf352230d6fc63de66ddcdaa3fa74a0897a6cb10a46250000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000009e3cb47cb905ec6d8d3931420fde923316c4031800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a39414b28b2b7f5cae6b7c9dab02918f1137ce3346e2ddbd2d08f9929953ab1731a5f1d003320c798f4381456dcd470bd8e54ee6e5eeb2c1e8059f9461a7445ef1137b81220981703e7f8fb9c13d3052513b17f8fe0dc801500ea64b25eee49fe42a0104a13de7b8090ba2326a97024c1157d88281804ce5fb85ea82abaf1eef4e05e69cbeca48f72fd3d81601b5419215fb234ba3a76467e8cd973d335c9e83ac72bd3c5ef89cc841cebd46ee834312bbb107ee0b90e729f93eb7ce924ea2d8064aaad909501e44338a8a9191abc63f8def273fb9f03108864016a17cad259dcf2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b77c6b21733084a2d2f4504b9f625814c7f792d19208374b404a127370b3822bd13432b3cd7c579f23a26a219a9eb6fc92a3907273256cc6f3545630a249f12ab00000000000000000000000000000000000000000000000000000000000000a40000000000000000000000007887ece42af4b05d28bc785ab93df0f29267c29a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aabd9fde887ba5da180c68273e337ee1ebd7e3abe554a078b0626fa572114415889fa700781c67cff8b56134a08cf07a4975ebb92de34cac98980d587e5e683bd72d21436a96d7a8b79917a8415f1471da2a636ce0808dcfff9e8458628676df568a649c5d1d5b44417b82100e8f3a87587a7affaadd64d88e6d5af06f3878c72a907b494272792d0106ddc58923600fa00a366d0eb6bd7264a9fcea91d5585fb137973435ae824f670344e596684069be579cc265fa6f74b78a23a04ef85d88d64aaad909501e44338a8a9191abc63f8def273fb9f03108864016a17cad259dcf2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bb2041e670f47b7b950f32dacf775f6a9fd0d7bf6173d7db8787a961b46dc1f8c60f2f535916fc426cfd180f43b3af852baaeb31efd3e0888e0286eb596cfa4ea00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000bfdb55161bb5042e0d9f220423d4cba1eaa554ca00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000af7cab80ea6fdff660f87e414cdbf446544abcd366eb8277c63bf1fe31541fbfe7dd96cb2ef176b4b8af627870f4d8cc48341fe264874078a3b52e22efb984b5a72d21436a96d7a8b79917a8415f1471da2a636ce0808dcfff9e8458628676df568a649c5d1d5b44417b82100e8f3a87587a7affaadd64d88e6d5af06f3878c72a907b494272792d0106ddc58923600fa00a366d0eb6bd7264a9fcea91d5585fb137973435ae824f670344e596684069be579cc265fa6f74b78a23a04ef85d88d64aaad909501e44338a8a9191abc63f8def273fb9f03108864016a17cad259dcf2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b5bb6c506e3af9082a3bd8ff327dd419abd94746787b5e552891a882d3e2a976216ae5dc54e0a7cf4de9a75ae3f53d1907845900faaed19ae636df29c13b33bd300000000000000000000000000000000000000000000000000000000000000b30000000000000000000000006dc1fa3b7823817a7d23e1a20a048d183593b34a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ab91c2ebdbac7ba825448d4df48ff1db883fd94bc6dad9459b3b443f6c688e4208fbc4e2b884f495fa4fe58e2aec54824bd5e0c9b962e9dcdd2a79969285b0c53e31a78b89854d1501fb04f50b9c5ea286a0a342a845a396e3aeff75ac82c732eddbf854dc000756d236d47f0a4116bb512b2bdf1c4f93888e2f07fd64fac98ef599a8674d32d090e93042776f9b7c43790c455091892e35deb595b5954a7471e137973435ae824f670344e596684069be579cc265fa6f74b78a23a04ef85d88d64aaad909501e44338a8a9191abc63f8def273fb9f03108864016a17cad259dcf2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b6f95b37a9c55f65c8398c052993824bae936c26cb0f74a06301cba34d46e39b33684411ad9572ba0d10d024903e7da343775ed7702db51102e241f7156f7671700000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000a7475cb7a1c38e37ccf4fbfa946c43f8d668e7e200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a5b06682ba7990b0bd263e0afc5e779dddc139ab140283e1806906eb7e905653c86078876f53c6dd892b07826403211ec157fcf9a443d1dd4f3c3cd0eac6ffcc647d9360d5eb3a1bc03e7bedfd316b169c6fff1c151f5c7baa47d358911e7745addbf854dc000756d236d47f0a4116bb512b2bdf1c4f93888e2f07fd64fac98ef599a8674d32d090e93042776f9b7c43790c455091892e35deb595b5954a7471e137973435ae824f670344e596684069be579cc265fa6f74b78a23a04ef85d88d64aaad909501e44338a8a9191abc63f8def273fb9f03108864016a17cad259dcf2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b5d609d1790bc389409eb0939bf70ebc933d1ed3a3b1726c7076d6bb5120bbf154688a7db872c585d156d6b428ac00fca4b63f63073d84148009b77fde47a059900000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000718c49352d3083b83afe3e33f79e3e4bed0efc7900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a47dc78df9a60745eb61e5e1421a418c746be08f9584e64cd42721c852242e20b4e30370a32c83d3c60f4fa3c5aee9de221756392d709c022855117fd54031d5ea63128ed143ad720b1f7af9c911d2db897c35d73ed03fba455ac90f764deed6b4f03c58bced081866cad2e094bc08befe3576b3212795c609ebd30ba28fca758bf63d3152cbc10972b37d7d02c3ddea3aae664593d5898d50c8114008b4732141bcc228cc309f83f90031fb5c788d2487eed6b8a12c98774d7a9c23c0cee17c6dbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b20b2db05571f3266a21deaeb92a11f6e55cbac246be1b191bd0166a3eaa379045da61215de0040b737f33e2cab1fbd58fe066fdcf996aa12ec769836f7361eab00000000000000000000000000000000000000000000000000000000000000c30000000000000000000000008c301208c7239e5eacb83e8141f8823b973cad3100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aab8c8b5b253a6315dae55137c1db061eb34afba3b35723b5f99c4e7801525d4a4e30370a32c83d3c60f4fa3c5aee9de221756392d709c022855117fd54031d5ea63128ed143ad720b1f7af9c911d2db897c35d73ed03fba455ac90f764deed6b4f03c58bced081866cad2e094bc08befe3576b3212795c609ebd30ba28fca758bf63d3152cbc10972b37d7d02c3ddea3aae664593d5898d50c8114008b4732141bcc228cc309f83f90031fb5c788d2487eed6b8a12c98774d7a9c23c0cee17c6dbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c54aaf590a4133c1b08876a2eb4c9218d2f76e5d5dabdd9962b4a856b5517361f7208832fa94f0de791fc7884dc1d9e27db2548de9b6864a918bcacddaedc9a7b00000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000b9e7bccffcc3463e28886d19e91b51329982c53400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a6a9113f3e5f07f1e1a39dd644597f3ae5b3c3707ab556c92162ce8c9907b610e452429b6f9d2e2c64d9002e14db547153292d94e42a4a40452f66b7b16c5aed6a1c92ee2f308abc9b8fc3faa5c5eb8d5c7a4580c68ce5a2ae4a50ddb8fa65fec4f03c58bced081866cad2e094bc08befe3576b3212795c609ebd30ba28fca758bf63d3152cbc10972b37d7d02c3ddea3aae664593d5898d50c8114008b4732141bcc228cc309f83f90031fb5c788d2487eed6b8a12c98774d7a9c23c0cee17c6dbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cd923c5cec7e64e5f906f47242aad4abfa48a76d21840bc0fe2361f28897c1d5b1095fe207396a21a23ed2d89ecbb0c77ae20968d866ac112362e235e55ae26bf00000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000caf314e91bfca8870fb91ed5cc7cf2340dafdbb800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000afdef8abc0b57d172de2eef6034a25fc2ea8f2abee655a8f09fd59a91f854ac757f56b2ad3e6f3bed18d42c06419f009649d6d286f8581cf921a6c96aeb4dc338a1c92ee2f308abc9b8fc3faa5c5eb8d5c7a4580c68ce5a2ae4a50ddb8fa65fec4f03c58bced081866cad2e094bc08befe3576b3212795c609ebd30ba28fca758bf63d3152cbc10972b37d7d02c3ddea3aae664593d5898d50c8114008b4732141bcc228cc309f83f90031fb5c788d2487eed6b8a12c98774d7a9c23c0cee17c6dbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c0a621c15645437e676dfdc9dc19f73acfecf3bf9a939017ac4f81592e24cc6db2385d2751f3d0557de801e4c5d94983a27c73d92900025d37cde55e00b09198200000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000429e8d0c27a586e5cd3db2fe0119d1e823c1bc9b00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ae8ec57cc0fdd8303580283efa032532cfc20f7fb42f7649dbe6c3367eb0740ac3d7b88ea8492272605473ac50fff59dba065f538c70948c5b87468319d58cff90c3e729d4635828dfe0f32c4d6a968ba1cf7f3683ed2ce982f37340597c2e2d685067ce849428405cf1b407341b9376d504e3ff593b00e4aae4f65e30a36db3ca3e540d32650f8682146d5649323edcf497d1451d505914616d409a89efff9da1bcc228cc309f83f90031fb5c788d2487eed6b8a12c98774d7a9c23c0cee17c6dbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c82204dbdb907622ee24f5c42fb50d82e3fdf4e8403757b13f3143715e7fadf3a5168225b71e1e8de7b3e25578bbf8fff1f2b08870445ac1f32922fe9f107283500000000000000000000000000000000000000000000000000000000000000db000000000000000000000000a94245d777f35e3654e8bec729a9fe5eaa8cd1c400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000abee3ce041a03d5a19776427d57653820cee6339bc530f2eb5253d0c57087dcbe2633e07dd855ec418d206527213c1a4243bbd42d751718f96ad3c8f1337bd4200c3e729d4635828dfe0f32c4d6a968ba1cf7f3683ed2ce982f37340597c2e2d685067ce849428405cf1b407341b9376d504e3ff593b00e4aae4f65e30a36db3ca3e540d32650f8682146d5649323edcf497d1451d505914616d409a89efff9da1bcc228cc309f83f90031fb5c788d2487eed6b8a12c98774d7a9c23c0cee17c6dbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cfb0b46054b34878af7e114ff5745f2743c9a9e7670fc0ecbe4765ae8ed6c4680166ccb292e42dc89626c2a02c20d8319c06f2549fa9c8695bfe5360390948bec00000000000000000000000000000000000000000000000000000000000000e60000000000000000000000006fc0a8e612cda941055d2ccbcb01aa23867758ff00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ae045ba5197c8270d712e9cf68b1292081851430c4201cee39d8df692f6086c22efcad65ff06a58886401d0e92c5416c9e5373caa066182ab3193982b5c0de245a9e732b8c0bba23bea040a18ae30c118e8da6d07e703b31c982c83f7280bbc9ef386d7937f87e8badbeb01c0dd4d5ef80d403cdfda11da258e25ce9c46c35a8373e4deb38b92d51f013388a7ae0191f60a79f25693b78b4ec34e9914d352f1d08527ec55aceec37ad9c2b70e7e14ebe2c51994e496fcbedae2db5aedf4bd4a5edbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bbdef00e7518064c71263533c808eae01ea296069e2795a79a875d2cf299cf0eb61ec54ca6b85c341f4fca80576d375578b5be0c82587531995b7c638c6563b2200000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000bd680f40fca03b619bf96939c52f5306e8b0c3b800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ab6950996b273550ef9b644f2a7665049585aa24ea2c992a5c285f9a1036a817f41e10969877a0885d9707a27318fee4bdeb5086175a8fac3813edf1384213cc0879135b64b2335590bc0d1f4e299f0a83b7a745a5e091a7554e6ee10a15a8b2c8ddd38078c9162d9666624c50239d4ff0f689b14caf97f57a9d82d1445cc2f51ff0e576ff6a911efa30fd9002adcfa5d69f7e14818215b7fe0f22a1c226861618527ec55aceec37ad9c2b70e7e14ebe2c51994e496fcbedae2db5aedf4bd4a5edbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bcf1781c70708e825c6f088673a9d0e664fefdde748932965d92c573ead326b0728b40ed280b4a1cc29fc289eacb74066d1ada4ba84a94c7d8ebe2eca167fc45f00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000057eea0f52e6e0053bbb6523b10e6e06eb094170200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a7c650e7bdd8439c01319f9fc9ef31b2a38b92e79078569710004de7cbe1578fa90850f2527be1889172f738a18432182769d9e4a43401097b9cf729b0f63bd47879135b64b2335590bc0d1f4e299f0a83b7a745a5e091a7554e6ee10a15a8b2c8ddd38078c9162d9666624c50239d4ff0f689b14caf97f57a9d82d1445cc2f51ff0e576ff6a911efa30fd9002adcfa5d69f7e14818215b7fe0f22a1c226861618527ec55aceec37ad9c2b70e7e14ebe2c51994e496fcbedae2db5aedf4bd4a5edbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c08b3cebf8f94b5c607dd8097501a278501bf571cabd81264ba67f89670e12f71471cec18c1492b5c26c10c9508f2841af1928d19c1555744b8ff814e5f3425b900000000000000000000000000000000000000000000000000000000000000f30000000000000000000000004b5a5ad0032b5f17cd62503ffd36deac9481ec7300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a7ad539f4cd7db4b520f2d20ff4c77ab217fc27fa2d33cc9858905e9e82a7288390850f2527be1889172f738a18432182769d9e4a43401097b9cf729b0f63bd47879135b64b2335590bc0d1f4e299f0a83b7a745a5e091a7554e6ee10a15a8b2c8ddd38078c9162d9666624c50239d4ff0f689b14caf97f57a9d82d1445cc2f51ff0e576ff6a911efa30fd9002adcfa5d69f7e14818215b7fe0f22a1c226861618527ec55aceec37ad9c2b70e7e14ebe2c51994e496fcbedae2db5aedf4bd4a5edbf5e78cdca685e455240593bc327f715dbb1552bdcd7e5f821dc6cc41e2cfb0f2683e1db31d79f14ec5f379fa90e6044c55ee73ee1b5280e6dc22235cbb941d3bec9b603830dfaae705f82b423b25e125ceecb5f9790f45e140cfddd434e2a38193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c7c9442836a3e150356fdd680f5bdac853377e4302d13118fb344b89d7d9930687fd89b548291a1d16267e02b46469dea3348b327b659ac33007a70e481b2a1af0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000e94dc0038fad3bee81cd5eb54e02407cddad9a6000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000af66a64c6b93269cbe6648a25111eab894edecc8bfc7146be1b80462982dc76b901840fef395955c1ffab0190e185a1e4e00c39d5bad2d46fc0f0f6ed0c7bf3677a64198bc497a4465cfe60609f06b28b93220df36c48a504ef75feb198868689415afb9adc1b79fc758a10c06b82fbdb020b4c15034aa142031dd8d167383ff74ced2037a4343c973b4f31226b11a0c4ad66f8d3ba93a58abe1ad3f52bee37f2582d40606a37193be9e9e2d5eeaf13e923ed3c85220b9e9d51e001dfe21eba64c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b339b56ec78dead2c355757b7dd4af6f25f74d0fb393c8f35a8d801c0238f135e78cecec6a4e283960699bc40b4588932a9555b3ba6f004c40f13efb2b4bd707a00000000000000000000000000000000000000000000000000000000000001060000000000000000000000001a270f2d5d3851823938ff5bc65a13f138b4fa2d00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000acf6798f1d7e2c5793f685469dad31b601f7641bd3835e50cae7aea595d114f46f679551f0ecc4663a3b432f48bbe1ac7690c1052c105107da9d41d9637aa21fc7a64198bc497a4465cfe60609f06b28b93220df36c48a504ef75feb198868689415afb9adc1b79fc758a10c06b82fbdb020b4c15034aa142031dd8d167383ff74ced2037a4343c973b4f31226b11a0c4ad66f8d3ba93a58abe1ad3f52bee37f2582d40606a37193be9e9e2d5eeaf13e923ed3c85220b9e9d51e001dfe21eba64c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c0eef7151ed4b68d2b7e3ee57fef365dfd7e72f7d00599e98b2d30c8bbcae4f1c04dde12ce8cc9dd31425ba76fb88b0e65372a301deda5f8abda6376c8c2bbb870000000000000000000000000000000000000000000000000000000000000107000000000000000000000000a19d4b9aadbb738ac8b1b1ec445e19b254a9c91e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a953db434517cf06ce4154546c694adf98bfcdcd047faa3349ffcfc7bfdda1475f679551f0ecc4663a3b432f48bbe1ac7690c1052c105107da9d41d9637aa21fc7a64198bc497a4465cfe60609f06b28b93220df36c48a504ef75feb198868689415afb9adc1b79fc758a10c06b82fbdb020b4c15034aa142031dd8d167383ff74ced2037a4343c973b4f31226b11a0c4ad66f8d3ba93a58abe1ad3f52bee37f2582d40606a37193be9e9e2d5eeaf13e923ed3c85220b9e9d51e001dfe21eba64c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b161c87ef23f8595db0e953bbc92260544335dc58836c5e2a6ea3f9ba9e38c8410f9b8447775b675e177e698e510c491e23a9a4dfee972bfcaf5e42bf3841a4620000000000000000000000000000000000000000000000000000000000000111000000000000000000000000641bc562f3c11f997cc0e56d8399e74c5ecaae0800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a1d8edf2739dfa4d4d2c3a5d0c8ce54407950556f7807066ed6a0407993facd5e7a0e1abd47ab79c77daaa0ac76e3f5c80ec18f7e3d45fdc5a57d4de5e5f538f5720be5474f062a96a4f049142ca791a839b8d5449759fbcecdb446f7ac7678faed8009ae99a10ea051a662e160288ce6c79b446f033ec99fc3f5cc45becc956cdb921e4e818f634f563a84696317314da7575d675d637ed04d240094c2205bef582d40606a37193be9e9e2d5eeaf13e923ed3c85220b9e9d51e001dfe21eba64c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c47c52e97b85ee985fb8124ee75def170da60e61f2634db1c4c81bcaeb0d086ee44ae8353fccdefdcfe1d7c8dd39c7eb9050e9c9694478ee4a311494b481aec240000000000000000000000000000000000000000000000000000000000000112000000000000000000000000bafd13cca0f56b919d82ce2304c31e53cd16eac500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a952d1d1feed3ee3b5d2c21c969dd29b61eba1f9ab691f7a7967450b0571800308f0231af09f355016bcb9b410980957159105ed6a05994f4718ea145d86df93c720be5474f062a96a4f049142ca791a839b8d5449759fbcecdb446f7ac7678faed8009ae99a10ea051a662e160288ce6c79b446f033ec99fc3f5cc45becc956cdb921e4e818f634f563a84696317314da7575d675d637ed04d240094c2205bef582d40606a37193be9e9e2d5eeaf13e923ed3c85220b9e9d51e001dfe21eba64c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bf3632bd8c8ace2e9594483f929d621be5c7306d33c8b389ee5cab24c16a7f88b55d4541812191d7e5d9ce10879eb3b6f5c68ff617d0eaff7faa5a101b5d9c28f000000000000000000000000000000000000000000000000000000000000011800000000000000000000000030977d070de8cc5810ff2adbe39300ff841ce34800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a8b0aa9ea8ec094bfe4f5aada91bb52451e44425d5909dae97178a143fc2f8b85838f02ca672a1d982b5748182b769bddb2b67ab39d2c0d638ca213d59f962ebf7dc2aac09de0f0bf51b3b6144211c62bd65aab96f2b8a94e186ff87b829afb3e54501cf67f1687da5a8b785432de1c4e8bd4c9a2f59237a6d890a96621c6f358db921e4e818f634f563a84696317314da7575d675d637ed04d240094c2205bef582d40606a37193be9e9e2d5eeaf13e923ed3c85220b9e9d51e001dfe21eba64c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c87c0d59be87b62dc8b2873206d7af391f487d8f69904c710446fa117a53a8f372bad42df90f608c73acc413cb6af13031015a257cfb773ede45581c6879ac5a9000000000000000000000000000000000000000000000000000000000000011f000000000000000000000000c1ed22181524ed1bab5127e2dd67a822696d297a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ab8d271572a31ca85e8e7f88334612bd83cc178f30480738ad178bfb6dd3320e531f802c87e1948c826aea2ba13e964e86159396172361ecda19b1802422b42735c71c746bdbb5ab0c2f490caac84c2ebd29eb04b867abdc5e66b6b7f47add25154501cf67f1687da5a8b785432de1c4e8bd4c9a2f59237a6d890a96621c6f358db921e4e818f634f563a84696317314da7575d675d637ed04d240094c2205bef582d40606a37193be9e9e2d5eeaf13e923ed3c85220b9e9d51e001dfe21eba64c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cd4847ee17d7c7c5a9d5c37675732a8dab4caea1621ba3a3ee9cdbf2c6badb102655abeec014486b57b5b00e2e59de66d0fb57e07820c81784dc67e2f2bb6519a000000000000000000000000000000000000000000000000000000000000012e0000000000000000000000005502a96f0ffa67c88a7de8e91d7fbdd30002f90c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aaa254e9a06e346aea8f87fb98641309be7eb3800a9381ab9f13f2270ed13c5dbf6c532b3ed9b1a8513f69696c09c6cd593ebc4f792261dbf6acaeecaa61f618767b4644bea2b3ed13a16e64bf6e0bf9cada409232106972c00d0b7070ae5acbee9a6b4626013116c0b0a2d2530597ff9d3d6887e79d2af6905146df0c529018d211302f1f10a4465548452c6a3a41f07b06f6ae1c9d37db2a768c83f25059fd475fda4b696227a082ae644377814cb58e5b22955eaba511048eb6794fbc071f3c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cf36b1ba091074422ef584bc49259ab40957770e8a07c1be638280732957e555942b64d6a0f9f9ad6f6bd26e22b6df60cb2178c09fffd6bfb1a87df1b57aa750d000000000000000000000000000000000000000000000000000000000000013d00000000000000000000000095a1947049fb21f36be24384c76a0fcdb76c6ce200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ab80424dc450cb6c85657542bdc89c5dcefaa9ded4157f702cc8a48b288beec18233c0cb3d6fa3abaa112779355895734dd3e743c28016fc7fc442348ae6bbd4acbd89a831b48562bd8db4f51b618d8ad0576957dac64f7d8659c474b29dc5741b089d1f988f189a9092f3b6ce3c79cb14f499c535c6e7dfed72edb31787922460afb087f5ab1759cdd1b5fe07f9f96b4a7bab88f68c5f285f551418e8de8492875fda4b696227a082ae644377814cb58e5b22955eaba511048eb6794fbc071f3c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cda108254a2467a5077b89bfe0d55622ea4be705754b6fda04aabe1005141a15659e952f69ae25ad3d634d1956383d7698e6ac4e9b69f2c57a834b90216f5911b000000000000000000000000000000000000000000000000000000000000013e0000000000000000000000003670b8345b8f7b4e5db4d0f8fec70ea86157e5c500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a49346ee24b4ccdf7299aa8edb8d80c80dc6f9555c9864b194e6553e55713373fcb15298ae9718420ba80897ff87fe111d541197bfd2bb0164e9ccdd02a1073a8cbd89a831b48562bd8db4f51b618d8ad0576957dac64f7d8659c474b29dc5741b089d1f988f189a9092f3b6ce3c79cb14f499c535c6e7dfed72edb31787922460afb087f5ab1759cdd1b5fe07f9f96b4a7bab88f68c5f285f551418e8de8492875fda4b696227a082ae644377814cb58e5b22955eaba511048eb6794fbc071f3c8f5cb062cbe7328bc2c13375805186db16243414d8bd4e12fbf20591576c94ef0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bb6e47e0a4edfea9d088776230c12a4e320d4e7209b6351e6d5866e9cd7f242e868b021061f1d20f7a9f82bbcd58eb52927280b3da42ca28ca3e4556c99ee3700000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000c027211c9374d01dc8ba48e9c6342c16ffd0d74300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a53982dacfecad99bc748dd002345e052bfc0cd678127d2de680f6f3a62b9f415bf070321e97dad3ca10e5643a4f02abfa796bcc129d0beac90eecf50e5e6ad17aa068ae88c07e4352600666bd14c20dd22410e8670f27b9447962d18336806ab4a6d15e06ed269eeedf4883f41797eea5766199d3bd79da17139ac29694f0b1abfd1db4700ddaf8908bed750614abb95ff05f152154f1b1081783c354225ee45f02c206b4fd3799941f40f596c63ff6f6023d84e4f1e6986fca0b1f0937f3aaaca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cc243b1a02327ba2cefe344f838abefffe0c5e925f3b4ea6eb49e3d7957c232e56ef8c216ccd32c083fad7f7312f094afe08d7b1cd5a469b96425f9fffbcd28b5000000000000000000000000000000000000000000000000000000000000014c0000000000000000000000001f0493dc461f2f8bc5882b166d2f3f4513e9bb4600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a155de7a8e8773041772422e7af3000575974211c9da9f91a4738678bb027f803a5c14caba7788df8f7ea48b68e3deffa29e940ab8572e6da5a64360bc2a3d96ba2218952227f0c491550b9e04abc3bccb2a7de88d123aa8a9d474bd482ae5dc74a6d15e06ed269eeedf4883f41797eea5766199d3bd79da17139ac29694f0b1abfd1db4700ddaf8908bed750614abb95ff05f152154f1b1081783c354225ee45f02c206b4fd3799941f40f596c63ff6f6023d84e4f1e6986fca0b1f0937f3aaaca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001ba4c8aff14e54c5d1f28b857d073777cc88c059b748432596503272d1575351ed319a358895662dd48906a84f9138d8a03bebe9e87f11471d66abc631e03eafa70000000000000000000000000000000000000000000000000000000000000157000000000000000000000000889f5467abc7243993c77d1ac580cbb22a463cc500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aca950f1a17a604627ba199bd7c91cc21d845c511cc4b29a340df019dc0b4433c30c1d68b4cb5bfeb898d26aaecc476331c1357d7de84b707470687659dacb439b863b35f727291e98a0f894fd785c9bd4a96f891f43fe13b476aa2fb2a730b5b093887bed40f82aa176464335337a883f174ff1bd883c798c2cf98deb2ffe278113b2b5da8c9d9a8dad6f65f73d6838daf673150c5c7f6122a44e629ae6e976ef02c206b4fd3799941f40f596c63ff6f6023d84e4f1e6986fca0b1f0937f3aaaca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c982c13b8b69c22acac8674b0f592192f3fedf9701006ab40f9e529f6f3f0d7f4709292a9013454492c6f8b0fbe7b452354e39edafd530744b7c15fe834adf442000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000dfb35e1d7c9e99347e8750a6799901f6b5d7a10b00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a641e4d471c374c36168612e2ffaa349ce90991e3471701f8308b82bd0bb2c3fba2123ea03ffdc5dca70b64c33dc6c805c1230a42ddec7d8b776a1c3c9d6e5de7279f04cb98dabad6cf83786e53f6a68ddf512b3612fc33ef5da71b2df0a4cba8da65b8a8f6f9e6997c5a2fefe3014e5cd381fc1074a6464bea9c881dbecbe530113b2b5da8c9d9a8dad6f65f73d6838daf673150c5c7f6122a44e629ae6e976ef02c206b4fd3799941f40f596c63ff6f6023d84e4f1e6986fca0b1f0937f3aaaca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b942824dd3ce2d433dfc4bad8697b5f860ad9b2596df796810f21560d99964795315b234072b9e974bfc61ce6eefa40b9d925362fb12e9cd4f75a94fb3dc946e30000000000000000000000000000000000000000000000000000000000000169000000000000000000000000b100cfe34b16473fcd653abaabcc9d7702c454cf00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a4e1224f4289ccf56641060dcc8965e55b5671d369a561b558d9ba8c6049e3a1e1a4596a5f60a846ef0e94aa4874dfd84cafcc1c0c45ac62e074712dd836ff68b8e06b399d453dbe75f17ae2b402e19560a9e6f564d26fa19d0a81af69418a8d5ef37a09d59fd72f8a95cdacb2e6eea838dcd52e2fefc8f007c44743337fecddbea16dd896112a0ee886af1c4c013943f001dc8cad80cd4a9d977f84b9623c2a1fe68830165850dbcaeeadf49cb9083a7ae72e1b53d7b669bf7c01a8e67d44fbbca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bd0cf585e555956b49e478e9f6d922630fd6119e053c406dc7958dd49f0406b96289218111cd8382da1b6c6937a5c49d9bfde24c2b62793bf8d40491e0540b894000000000000000000000000000000000000000000000000000000000000016b00000000000000000000000032af409865b190a09ba44005feaa0bbb3586f48d00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a0f83d8166024d547c9dcd34ad05125c56bddbfbfc3f6cd1c39fe7f52be82a5cd0f7f8078d8758071efe4bbfc1502b76c2362a09b89c2728520ef2e9ef42ac2d58e06b399d453dbe75f17ae2b402e19560a9e6f564d26fa19d0a81af69418a8d5ef37a09d59fd72f8a95cdacb2e6eea838dcd52e2fefc8f007c44743337fecddbea16dd896112a0ee886af1c4c013943f001dc8cad80cd4a9d977f84b9623c2a1fe68830165850dbcaeeadf49cb9083a7ae72e1b53d7b669bf7c01a8e67d44fbbca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cd7c34548c26e6db8c4522ab1fa1cdb6298624e10898bbc5894d7fbf7946183ad1bdc79babd76baf24cedf965672b8e956ebc16345fb3ca4548795086d897afdb000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000001ac68d524f2a3fb22721d77625770c337b40828100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000af3571b22abd372bc0b213ef2f6101c09ffa1d4a4ffa7fe414515f1b0fc815364e2208709d678924b3636ded22f726a5b51f4da59990434a25d10807bbbbb9c44d3f517e1221cea524290ecabf7a65042687651096bcfaf7478f4ec12ec37dd63ef37a09d59fd72f8a95cdacb2e6eea838dcd52e2fefc8f007c44743337fecddbea16dd896112a0ee886af1c4c013943f001dc8cad80cd4a9d977f84b9623c2a1fe68830165850dbcaeeadf49cb9083a7ae72e1b53d7b669bf7c01a8e67d44fbbca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cc5e049ad5ae468ee2f7a24581379803d6905dbc677862d3abdead37fc51fabf55db04165b1d6c3f1069cfdb81fbbcbdda54f239d649d0574ccb8e1f137d3f8440000000000000000000000000000000000000000000000000000000000000178000000000000000000000000fd5b1d82a10401d31a5547dfbaf3183c798956f700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a5cfbae1c952d9159ba9e2bba7783f54b7fd28662b3f4103d178fcb7f3471b13e9420ac2c7f5886368ee19da025f277b256c445b10e4cd7d3fc0988ede776f114b0188bfc8d90ed4dc64e20024cc9e342a5aa86ec723198e3a0e499cae307fbb2461b047b5a960240ea28406e7b543ba949fffd87ec185aebc74e02a6a5d32be454d0bbae79cf1c54123ff664d02153859b51a402b91843ef35dd34b19ed9ef2cfe68830165850dbcaeeadf49cb9083a7ae72e1b53d7b669bf7c01a8e67d44fbbca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b381f34a8e3cf020667009ec95d9380a04670504a84345e2429b052e941d2e52f09ffae6dc5ebe0e3e70382befbe713d421ded352e9f0d2e7e7780e828f1efe760000000000000000000000000000000000000000000000000000000000000179000000000000000000000000ef261a963e4c0d775b2a2752407906adb99b1b0d00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000acb9f7f5a828b1e0ee13a252b297e277083745ecb7dc182da24f079770c777d079420ac2c7f5886368ee19da025f277b256c445b10e4cd7d3fc0988ede776f114b0188bfc8d90ed4dc64e20024cc9e342a5aa86ec723198e3a0e499cae307fbb2461b047b5a960240ea28406e7b543ba949fffd87ec185aebc74e02a6a5d32be454d0bbae79cf1c54123ff664d02153859b51a402b91843ef35dd34b19ed9ef2cfe68830165850dbcaeeadf49cb9083a7ae72e1b53d7b669bf7c01a8e67d44fbbca6629ee00b1ab8d92baefdca986801e62efe8bffbef6d3dd876f1e3d7497f09f0a630abce53e8dcebcdf2212129a3ad0485c1b0feee4b48dc15688a68f86520aae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bdd1937397194af9603b5e2ca387f9be49c1868e42794b8dc8d0856bf4f0f1766331a37d2c70ea800cfa23b521f7a88cb1035c544d83e42ef4b96cec65fba1d9e000000000000000000000000000000000000000000000000000000000000018200000000000000000000000087a963f24d3ea915235ea068e4ddc542ebde15fe00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a58e4323d1cd026ead0773511bebc9c83340b9fd885b712c84fad2754d753735777dac9c61abdc66b53cffc8487dd7f68348f60a6c114f539b2f445138e6a7bada009c847fb41a98f75201b176062f1cf57508b306a064f6d1ff5596e68ddd24ac0fcabb2f97f7b1d3dff92772828e80abd352bbc997e0f5a7436350f799a95e4b80ff78312983530ba3df119bd9ea57a6f53018ab91d444ef048c9731aa9e639b39728c86ece5d4900ee2d3670587225a85097f145ef78fc0553aa1af623a913aae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b223636e82f5e4da79b1a0891cbf732b4a2cdbfc969d6b38f6592ae9838db6bf84cab991db877d613072a218a80afc156cbde5a0a40c7489c33f8e8c46adac6cb0000000000000000000000000000000000000000000000000000000000000183000000000000000000000000273defae1c725792980e3b237d75949494cf036100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a3adad6b033bb22985d29becafafdbc5b86db245ff10122b45df903d3d496266c77dac9c61abdc66b53cffc8487dd7f68348f60a6c114f539b2f445138e6a7bada009c847fb41a98f75201b176062f1cf57508b306a064f6d1ff5596e68ddd24ac0fcabb2f97f7b1d3dff92772828e80abd352bbc997e0f5a7436350f799a95e4b80ff78312983530ba3df119bd9ea57a6f53018ab91d444ef048c9731aa9e639b39728c86ece5d4900ee2d3670587225a85097f145ef78fc0553aa1af623a913aae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c822e9ccc567d495ddf56395499a36d3808066e3e2f1925196bb0ae9f44939f1f53b0b9ecfb6e7429cddc87bbc82796efe52a8b1d3f96e9d96d6ebaccdd733a51000000000000000000000000000000000000000000000000000000000000018c0000000000000000000000005320edc5da38e4b244d498eb97df5eee82a379e800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a92b8f9c1327bf629807c03db36c6a79203df48243bd1215a59ae54e68eba62cf816545bd6e8067795252af59d2f689e19235c3cb345f98e676215b3dfda5cce8f54364fc386b4a95027845b50b40cd49c3b169cc85d211f88a1b0fe1cb80250060d32fe7a3f86a13c913d7b9c69859869985391777885d264ddde46029a18542b80ff78312983530ba3df119bd9ea57a6f53018ab91d444ef048c9731aa9e639b39728c86ece5d4900ee2d3670587225a85097f145ef78fc0553aa1af623a913aae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b2accd998f435cc773be4a85a425d67e14a8eab820ed0537fe1aa440a1afb76d178afb5c2c93c5ba762b3ea34a95652ae74991bace5ed44b5446c6a674014f36d000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000beadd51389feebc88193b9afbf5c2e1cba5795e500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a37faec2279844ab62cb255a6e23d75d5a2eab4b014164133fd48920c483f9300816545bd6e8067795252af59d2f689e19235c3cb345f98e676215b3dfda5cce8f54364fc386b4a95027845b50b40cd49c3b169cc85d211f88a1b0fe1cb80250060d32fe7a3f86a13c913d7b9c69859869985391777885d264ddde46029a18542b80ff78312983530ba3df119bd9ea57a6f53018ab91d444ef048c9731aa9e639b39728c86ece5d4900ee2d3670587225a85097f145ef78fc0553aa1af623a913aae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bd7f156280ab8e46484b1c1515b6f4fd2e41ec85eabb2f2d0da58f82307241702325d165210c9a99e9841b8c09025be100af6d2d36bf7a1023a02245f47795a730000000000000000000000000000000000000000000000000000000000000191000000000000000000000000160e015f532d476b9fe3e55136028981dac5a7d100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a5f532bbf5acb633292dcfacffa0be7481e295f485a0ed22f67cfd715472250f7dfa22e72fbab971f1e4ba9ce7dd8e548a52cd10dd0c78b0ce9a102adb6be8e41defbc195252e7a01d28efc185fcd3fd3137da62e601b0aa372632547191a70ef6793f7f718a861e1fa6359bb8c040fb30ade3a563668ed24abbe21f3d0c72b0d04500957409d0b426a57c00d16970951408316592ac4d60d9d38584ca780e787b39728c86ece5d4900ee2d3670587225a85097f145ef78fc0553aa1af623a913aae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b92b0c9917dffa044ede2b545e1d3749a61eb6dcfc9d07fb3d204bf651e86eb8f0eaf27a54f3ccc932ded8b97a31b15c04742f52cce2386868a759a1c62eb902c00000000000000000000000000000000000000000000000000000000000001990000000000000000000000002765a014cf2bed037abf427465f72dd470cccdf000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a9b62c867e6b0fed10d2e41340bb0bf79fa9a9c90454326a9ff25e23ae8ff15f577888e622933f8e892ae2fea95fd42b06ae726f5177404ae694e7a6e8e9b324dc5f00c4c37c0bc684edce3fb12ac91605dca7c83edc21319d5446ddbf7eb597b9b7e0c1896f7f611d6bf49d453624c850fe1d41683b44623ab8404102864d5b004500957409d0b426a57c00d16970951408316592ac4d60d9d38584ca780e787b39728c86ece5d4900ee2d3670587225a85097f145ef78fc0553aa1af623a913aae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bf64727a802a1ed66edb0062db2797bf4794157882bbe598491901561ee25fdc8323348cf0d36c52867031fa5aa5609595d4f7b09f39eea5b544df011950993ac000000000000000000000000000000000000000000000000000000000000019c0000000000000000000000007af2a8e883642e94c6d28785f53f261c5b029b2700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aea420d5f65a5500ca3de2888568c587241e5b4ce6c98bdcd3bbd68e6c540557066af2e7a8265c07dd6026580b87427d0942778367e5c7e38380eeee22a88e6c4ff5db5c82cb56b09976125f97d2e5a16250338ee8bc806da1685a66bb26db7629b7e0c1896f7f611d6bf49d453624c850fe1d41683b44623ab8404102864d5b004500957409d0b426a57c00d16970951408316592ac4d60d9d38584ca780e787b39728c86ece5d4900ee2d3670587225a85097f145ef78fc0553aa1af623a913aae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bfeca3f31b8ac5f8300e9463bbad075075f515d8b1c09ef9541c0a356835f409149f3a82384ec6f9bfc13a69387e09f56f968e8520715da1f118fff0e8164de1300000000000000000000000000000000000000000000000000000000000001a80000000000000000000000008366dd8e4bf8c7a14d33b71be064f69473fa574e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ac5b6a59883720a19b109cf9691c1808c37d54e0a9a6ea1ae5cfc59ea8d6e90094ec3f76a539d5dc72649a90b1c9e998b405cb8cf1058ee49e18a670bd6d6c3ae530d1b4903311bbf42c6d9ca076c5ff734b0e6487b70196ec36c3a4f0588dbe4d3f4c3b8f9e11782d1a485808b448baa1b4177ac0476d8721e323f98b839791e746f0bd89913c749e67cdf28d65376ebde986b913db3fc700c3377ae74c55cb559afb87cf202c85f2df94676d880e9b3457bf0267deaf10534beafface91d02eaae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b3f09f715c40cdb2502383691f5844963f8065d04f4504bb643632392d9704ceb5473302411b6d74a2326f9951aa35a5a6455d0bc1e6bf0834647abcc213ac8ca00000000000000000000000000000000000000000000000000000000000001ac0000000000000000000000001087c02a3b0b0d36f722d56dec3bb1694b95eba200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a4d8ff9f006e6e303ee9e97466890e2091bd323c99500dc316ee78e0296f88520ed85089a528a810e586659adc72dbcc3d22dd920a3977a69d0f91c913f845dfb80881c6a2140d3da2870889c763b6fbd14a99e88c7c1f91e07ffe4c9128c6739d3f4c3b8f9e11782d1a485808b448baa1b4177ac0476d8721e323f98b839791e746f0bd89913c749e67cdf28d65376ebde986b913db3fc700c3377ae74c55cb559afb87cf202c85f2df94676d880e9b3457bf0267deaf10534beafface91d02eaae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cea9be4a6d13215251ba582015d4b1b7df88fd501714acc4956132b7ef62337c7132a5a9a3d5daba19b513f7b4ae572e84da0cc130bb112f33610a8ba0f9b43d500000000000000000000000000000000000000000000000000000000000001ae0000000000000000000000008bb67c503ae16b945699b9a6fae794329db9d4b500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a104d40bd80896744d55e23ae337e13470fce77ec6ef80380aa24148d198644d6c82ac2239271046b15e38fdd5a422c9e474f7e318276ab2319d3d36735cad21180881c6a2140d3da2870889c763b6fbd14a99e88c7c1f91e07ffe4c9128c6739d3f4c3b8f9e11782d1a485808b448baa1b4177ac0476d8721e323f98b839791e746f0bd89913c749e67cdf28d65376ebde986b913db3fc700c3377ae74c55cb559afb87cf202c85f2df94676d880e9b3457bf0267deaf10534beafface91d02eaae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001bb627d8e664488970f2806dd861f56bdf84c7aa840088ef710b73513376e7d5cf126474da9910dfe8a07c972e2ad8c3c32869c0a906783523901736638f37833800000000000000000000000000000000000000000000000000000000000001af0000000000000000000000005b79288296d9067850413c3bda09002fbc452fde00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a123ca3be0f99966e8be4af030878a3fc61ba1d437892dea662cc2f2d8ede130fc82ac2239271046b15e38fdd5a422c9e474f7e318276ab2319d3d36735cad21180881c6a2140d3da2870889c763b6fbd14a99e88c7c1f91e07ffe4c9128c6739d3f4c3b8f9e11782d1a485808b448baa1b4177ac0476d8721e323f98b839791e746f0bd89913c749e67cdf28d65376ebde986b913db3fc700c3377ae74c55cb559afb87cf202c85f2df94676d880e9b3457bf0267deaf10534beafface91d02eaae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b3198b639039ca8108c2d81ec3bdd6bb9d1f85659e9de515c469bcb757b8edcf017b587289baa28e6de184c888fd006fd8ef6024c83b8ce9cda90e1f99c3abd8300000000000000000000000000000000000000000000000000000000000001b300000000000000000000000040bf36395609d3fa7b7d1620e1c16f4af9fe8e1200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a75caf695cafccca3fa91e8d6e3a7047f53cf841dd26d9537b5051f43aa9f0dcccefed7c621947d3a2b87a3bd6822902ef97f07656c92e45d1438a6559f8e0eb376358feb8f6d7c0d3fc6445a9a7738db6eba67ae4760b22a4daca28537bf7ef73a4b8c4ea672d1e65e2867c2bb829acdede677fd6d0bbd88536002ed9ec48b45a6d48332e58fcdd75333237b425cb455611e0001914fc58082e544c2136897cf59afb87cf202c85f2df94676d880e9b3457bf0267deaf10534beafface91d02eaae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c1f6903c5bfe866bb87ba1d549d14f4e41a70661cd1530ee205e5bba7716c253129044a639e6e432384d0c37881daf4238d6964544749603a1f343b54d44282a400000000000000000000000000000000000000000000000000000000000001b60000000000000000000000003e6bb8b3b3fb7e4186db36c415773faac77efcb600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a1844852313f7b12b8fea88da858bbf02e9ead1f4c712dad32989c416137ecad1767fe854fee4db5784283f15fc2ca68f902b2c679825d10eb4f5e769e6232037cfd6616ee462b1d0296aacca7bf7238f8194140a4c6b2acc571b3a60dce78cca3a4b8c4ea672d1e65e2867c2bb829acdede677fd6d0bbd88536002ed9ec48b45a6d48332e58fcdd75333237b425cb455611e0001914fc58082e544c2136897cf59afb87cf202c85f2df94676d880e9b3457bf0267deaf10534beafface91d02eaae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c97a8cc15911991916369b5772038b2f33a942877a5bc2653ee518521ec4db9073caf7b6a94c4b535782dbc37ad46179dfca75ebd093fcf6b0bee0d54d662eb3400000000000000000000000000000000000000000000000000000000000001b700000000000000000000000094219583f11f69f17966b18a8acfa13a46d7cbea00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000aa6ec8ef795c5343f6c128d4a0d085ef0d4a482a6556e7dba707ff060c36c3bde767fe854fee4db5784283f15fc2ca68f902b2c679825d10eb4f5e769e6232037cfd6616ee462b1d0296aacca7bf7238f8194140a4c6b2acc571b3a60dce78cca3a4b8c4ea672d1e65e2867c2bb829acdede677fd6d0bbd88536002ed9ec48b45a6d48332e58fcdd75333237b425cb455611e0001914fc58082e544c2136897cf59afb87cf202c85f2df94676d880e9b3457bf0267deaf10534beafface91d02eaae09b77eab5040f5f309c4af56932aaa7b8be1eadf0311b9790c0499e8c6b186b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c5e49594e561bf90ce6c657aba3d16c6b90608db6af6e4838b9a00681150ade1f2c331635dcdafc50263c3aaf615a06a7bac4bb4fe433b2aeb98024238ae1919500000000000000000000000000000000000000000000000000000000000001c1000000000000000000000000c848f08fbc698644708031fc0bb95cd6d50fa6c200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a93d41b5469931267ae881169acb38b0e8fcfd031a3e07f78b0afccbf2e94875fc2089239cc4b31e03249f149a5a5b19f7b6c43b06f42428fc6c953a2ae7730f50f4834c11ceec20db2ab0934fd25daca9d34cbc2ca4bfce8219176f90cf56ba2dcc34710cb6bc64696a022a2cfc1b09b4e250aebf040667ec49d4e0cd586c219e80e6617a436b3ea7f5d3a83050928284449ad911b7f04034778f0bb551bb37a52283d3023c4236736cec260d6abee78376e3d923d69e6c7741059806f4bf4ab745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b4fdf166b6727e245207b17383bdc4cf4a0c8389bb71634370fc80c2871b20753125e2c2bc86ababd1bbe69d31f554974162644a5d04fdccdb847f2ffb8937dde00000000000000000000000000000000000000000000000000000000000001c400000000000000000000000065593b5aa93bf594a949bcb009bc104f3dfbcbd200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a3a244cd9c79e5d380700368168f8f0c5bcc0c0c6cf09727bf4962f06bca672d2329086fcc175d86424e2ca87db0709fd75f0b9a776ed95cdfce450e4c443c5f82600c8fa6fdfe764430ea6d974a47218d298db2ec609fded491d790b21ef6c61dcc34710cb6bc64696a022a2cfc1b09b4e250aebf040667ec49d4e0cd586c219e80e6617a436b3ea7f5d3a83050928284449ad911b7f04034778f0bb551bb37a52283d3023c4236736cec260d6abee78376e3d923d69e6c7741059806f4bf4ab745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c6894396d4f31dd0a919992cf79a36d0b42bdcbe9c4274e8870c76cb05f29510530fe2106d77d4db628594cc18471d5acba14d4266abc2ad518a023717578150b00000000000000000000000000000000000000000000000000000000000001c8000000000000000000000000eded454f7e0b9e3e89007b8042b33f5f75361dd600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000acda0ab7ec0d7e8ee6d3749f9fe3a25441c3c732f1cb5dd20f83866c1bcae40af74f3996bbaf7bc8042c2df06e68099a4eab70fe68aa812dbf5b05ed345a61c53381c7690f79d829cc9d12d3eecfaf4d3694765db2f2f6c9c8092a20b1f2d9d0b9c39a05dc5f550cbda07d3cec00cdab9a11a68b9ee8699e8a2528ae22fa6b852e80e6617a436b3ea7f5d3a83050928284449ad911b7f04034778f0bb551bb37a52283d3023c4236736cec260d6abee78376e3d923d69e6c7741059806f4bf4ab745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c1b1f4ad780f03c50c814405d1514eea4943d26a983d70368696af60c49291ebd42aae999284252963289fa6ee3b63366fae4d428dce708fbc089bd5fff97fa4100000000000000000000000000000000000000000000000000000000000001cc0000000000000000000000009f0da7e510e22dfaa3061723cf655c4237a9c94800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a6b33212ceda2ebab67d18216bcfc5c241ee2f24652f9408e63ec13b5c837e074172cdaca55fe0981e912d9bef885bb8ca5ca53a288b4104458c24dc1c67e4e83c31bdebab0902023bdf3f908338e0690137334fa298eb9d36af2b08f2823730f9c39a05dc5f550cbda07d3cec00cdab9a11a68b9ee8699e8a2528ae22fa6b852e80e6617a436b3ea7f5d3a83050928284449ad911b7f04034778f0bb551bb37a52283d3023c4236736cec260d6abee78376e3d923d69e6c7741059806f4bf4ab745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001ce96856873da7ecf8947c8cda028321042e7cc7300d3a7c1ee25a89f715bb157031bd12d4a9aed371fe7b824bc367412a41974ccced530d9f4cd1c0fc45770cbb00000000000000000000000000000000000000000000000000000000000001d6000000000000000000000000e2db79f52c9a62353b4ed9dd73d04ede21cac79c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a6a170dab676cd7016da33c3881bddaaa036d20be4b785f77c899bec32d4e52bf33ecfc666f133f6cdffa99a9ea55e1441e8c4446e389365322b73ccad2058853e65c26e91067e8941e2aed94bff2b8bebf94e6f1ae643b0e0e2c9609a8fe9179ba691f5ea6224b0afb1bb2452422d6b4543a44ec1215ea728ad6bda07f6632ac0a8d0f4fcd029f5248dddc26c0f18e19e563dc657248643df5d1d0d37d42663852283d3023c4236736cec260d6abee78376e3d923d69e6c7741059806f4bf4ab745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b0f4783f47bec38bfdd777b342112d814dd5629b83850dfbcf9ebdb0f0329669769d27be0d0288b8b5935e6d5c83b0d9039d96d1529e022cfbef6021481d68a7e00000000000000000000000000000000000000000000000000000000000001d70000000000000000000000009ce7faac4c802c5fc3018844c50bb1a31728757400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ab3773ea2da72e392b9870402de1be8327226fa7b6e447fa64b9f88b0b551ee8233ecfc666f133f6cdffa99a9ea55e1441e8c4446e389365322b73ccad2058853e65c26e91067e8941e2aed94bff2b8bebf94e6f1ae643b0e0e2c9609a8fe9179ba691f5ea6224b0afb1bb2452422d6b4543a44ec1215ea728ad6bda07f6632ac0a8d0f4fcd029f5248dddc26c0f18e19e563dc657248643df5d1d0d37d42663852283d3023c4236736cec260d6abee78376e3d923d69e6c7741059806f4bf4ab745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b7bc5ec7c0663714ddcbc4c4a8c90591295e21888028ad7c5d9dd7a1829ea813f5520709ecde8e0fadefbec88f68d56b369fa2378121e99dfc3beb0144e8a287600000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000050716c86236c58c9dcaa507a4094e59f6ea72e3200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000af1a63ff3ff9e0d13eebd0202326cbc67b5aed893608f9d20843b7c07b1052214404cd6a6a13802a9e48b50e71eb8116ba394675a69479aa15ed19f6e0910a20bd67dc7553129cd9a197825a81dbbb875c14398c4fcb2e891d380c0b7212ea32b1cc72c4ba56703dbab604d603f81e6f1834f03e127bbca2264f56b4daa20ac4d0a8d0f4fcd029f5248dddc26c0f18e19e563dc657248643df5d1d0d37d42663852283d3023c4236736cec260d6abee78376e3d923d69e6c7741059806f4bf4ab745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cd8c3176e20454a19873a53079400615c9be20edc2c39b0becea3e65d7335b72b726ff85549b75c7461d7b3167e4476e5017024c7d84f5a5c86879f003f07a8dc00000000000000000000000000000000000000000000000000000000000001de000000000000000000000000a3cc5515d6555fbd52d30ea8cc56157812a621ec00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000ad50984c869e55539e0f17a769f963b1425f41fdfd7cbf6166c1e0d6d7f29abb1583c6ed75e9804a6f3a9d18586c2a001d20401fc9c52bb9076a48774cab94c3fd67dc7553129cd9a197825a81dbbb875c14398c4fcb2e891d380c0b7212ea32b1cc72c4ba56703dbab604d603f81e6f1834f03e127bbca2264f56b4daa20ac4d0a8d0f4fcd029f5248dddc26c0f18e19e563dc657248643df5d1d0d37d42663852283d3023c4236736cec260d6abee78376e3d923d69e6c7741059806f4bf4ab745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b8e41b3990736e5ac5237092128584e15defacc83c1798d43c11660c8fee81fec3054a07ea3a0fff56f4080f341d96753b2400be0ed12c951e00e200350c03bc800000000000000000000000000000000000000000000000000000000000001e20000000000000000000000000cd36e9f45c6407dc76e3ea0e80bc0a32785798a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a2902fefb2bc7c32b758641e9df8dde03667ccb636f12b6f0edeb8d1db24a926116d061a99de23768e07d820e562abf8b3999c7ad398fe8b3cf2de4b5c690c441363a84782043c50c01682c754927c2662491b25b7ba170bafa502715136d2001a5efbc97f1c17bf02c338d4b4a7b13ab5bd53b5003b67ca7524b0dca4d1a5421b00bf465257ba654a4052cce8cda160691ae4b51b6fc63ea0d98f8296d0cf26387d897da9e67d086b7d414499701b7fa52ad0b65cd535aec3f15d3d4c5a26a36745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c6e5bba2686175f4810154e4303062cd43b14749963b059e8312b22da4f26d9b650b294182cdbf52f4e8b55396f87c3fbaf35e051ca7010e656a4bebb8f4b997400000000000000000000000000000000000000000000000000000000000001e400000000000000000000000066ec7f42a51787948dead1e6bdcba1f75108338500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000adbfc879597d7595a4ef912913a20c29c242261251ad4589f2912efaf1e1d3f4a4765722fb938244ef314f91f7e5168e6f7b7add063bb1ef0a6ee3cc0bd8060a60f6fc297308498a23cd0adf61ce0792151b77e9a69e33c8b0a15d680069b656ca5efbc97f1c17bf02c338d4b4a7b13ab5bd53b5003b67ca7524b0dca4d1a5421b00bf465257ba654a4052cce8cda160691ae4b51b6fc63ea0d98f8296d0cf26387d897da9e67d086b7d414499701b7fa52ad0b65cd535aec3f15d3d4c5a26a36745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001c619bf0b0f0b4ff84b080c86f2bfcdfc1bb6a52804f55e3c62ab7fc5af55b88557757b540d1a9f53a46b8a627856c4955a8f5ae056fe9719a118169fb59080d4700000000000000000000000000000000000000000000000000000000000001e7000000000000000000000000fa0797ef44e710a3c2b7b99258595a2eb3aeb9bf00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a013fe4d014dd15f1aa11787a4f43a40fc7d3a6a9c200aa225b3f6490ac7c5e6e9ed4cc419d04c6fb18aed80bb8a94e94ce55809ce0455357a1a6ce315aaa593c0f6fc297308498a23cd0adf61ce0792151b77e9a69e33c8b0a15d680069b656ca5efbc97f1c17bf02c338d4b4a7b13ab5bd53b5003b67ca7524b0dca4d1a5421b00bf465257ba654a4052cce8cda160691ae4b51b6fc63ea0d98f8296d0cf26387d897da9e67d086b7d414499701b7fa52ad0b65cd535aec3f15d3d4c5a26a36745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b1c8decb85fe00a991e069bf8fbfd073c4f10d7984830e2f1ed6b285e443b1ff8787d65420182a93f9c271d47ee76002e8114d5b220fc3462c1ddb79db0dd9bad00000000000000000000000000000000000000000000000000000000000001ea0000000000000000000000005fbd3c67d5346edfbf58b1bf8ab064eca5da191100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a815159181795602f469f1dfa2cdfecf20e49104759634d8f3d62750875fbd10eb4fadfa5aa27cf1aca6e9c71d7a1729d1910ffaab873c8133bc3b08d319746a30e984f65f11c14968fd0c31f38e3e205074f3eb2b82f8c1c97e4310c0e3f9bea8ac0a3f388f12a28bb99a00c954f0abed5ba3aa585b3739cc149266bfdabfd6db00bf465257ba654a4052cce8cda160691ae4b51b6fc63ea0d98f8296d0cf26387d897da9e67d086b7d414499701b7fa52ad0b65cd535aec3f15d3d4c5a26a36745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001cb452e40cc3fe70d5159ff998ac049b9732b571253fe53d737c8b51bdc6f32a316be4f6542dbdd0387ef99110bb7d1f9272d7d24fa2dbf70d2fffa2ff5e903bb100000000000000000000000000000000000000000000000000000000000001f9000000000000000000000000a78c41ae0d9ffd04d9236529c18c6c5612e2aa9900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a67391240d901757f0fe713f68907c95606591177bf04a8987f1c1d588d04c114bc7605f107c4c6af2f074e5dc1902e9eee1ff2df5ed49c224a856dd22df38b5d9439601534b51bf038b221401a4d14250a9a108cfe6be8870a9e1a2745558262eed299d3bb4f83d14b8fd6e593dd3d85c6c0c5e173a4437c302cd03377bdec139d165aaa06ded43ca5cf7a8c55947e6ed08dc7eef1152bfdc93b424dafab5a1787d897da9e67d086b7d414499701b7fa52ad0b65cd535aec3f15d3d4c5a26a36745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001b50de63b5aa69e542e2acaf28330d6683ac432f436e047215ffb6c7e84053bbe533f9e99a0fa2d6c47bfdb632228d35af0529811b5ba9834cf0666d11842e931e00000000000000000000000000000000000000000000000000000000000001ff0000000000000000000000008df052f0e1b93838fed112039cec6bbdc2d12e3900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a57a7d6de5880f9596588f3287eefd2fe020c828444e26a7a7631967fa15cbf88c6b56aa0167c33ff16d158aa1b4374b4763b677d6895bc593c006d44de9bd99861afb7d43982f91adf61f90637b434e04b15e768b2e001c9de8219fd3fca7f42eed299d3bb4f83d14b8fd6e593dd3d85c6c0c5e173a4437c302cd03377bdec139d165aaa06ded43ca5cf7a8c55947e6ed08dc7eef1152bfdc93b424dafab5a1787d897da9e67d086b7d414499701b7fa52ad0b65cd535aec3f15d3d4c5a26a36745cf2ec74cfa5120ee7da2adf3ba00340ee82581ed9f7b2777c9bf19d250cc76b991e1218fa0733ba6a56a5f8ff3697f6f8fe19a13aa8d19ab8c1a94a3741efaae970f3226e259a58f4a0dda903a5f743d15d606867b7394ccdd139004c24338193bfc62eb4eedda9ebb99222e407e279ea144342d1bcb72084df5f60f6781a000000000000000000000000000000000000000000000000000000000000001ba86a90ce914ccaad9701d674f2438cf6f96afbcd57a19d2b316fd9902d8f30013447bdb1d208d20e266130cec7bdc5090244c2f50e80dff36eac0c9cdd105fb800000000000000000000000000000000000000000000000000000000000002050000000000000000000000007362290657f5863c1cde48a798110f7eda51172700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000008ae775beb251cb9b777a27147e36debfd87c973f16b6cab34c34607fdb3c21842225b67bd70fb7a62da19c7872984cbc13e8f7d1dcfa3e8907ccee5821456f584d9ad840df3e5f8d03c51599c69c7e0ab49b21552605f3ad7bbeb6a2f04dd7a2e3c9e8a42822656824028f13398f5ab3ff9b23f50084f3f92678c6a8f00d0e5ceee130df8fd8df16b2beeaedb08f5579f018f8087a436733369f15619e032340ea482ecdc638bec788ccca89cf7efb0b701ca86d34b950d102bbff529339e0a11506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001bef1634cf9db25780cc015243163d0f681c77d1e4dbf8648135cb19a4cd93f01a059aa5e04b16fa57bb99975574f5e28532c40195f2d36759cda212a3883b6bae00000000000000000000000000000000000000000000000000000000000002060000000000000000000000000b048f11680b27f4cdbb0e607405017521f48ca200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000085b991ab45eb97fe7fc309beb661724ac89fd458f7628b737acc9608bee554daf906ca5b1aa89bc889ca125ba5bf8d11e75b49f9ccb967c2749b25ccab541da7bd9ad840df3e5f8d03c51599c69c7e0ab49b21552605f3ad7bbeb6a2f04dd7a2e3c9e8a42822656824028f13398f5ab3ff9b23f50084f3f92678c6a8f00d0e5ceee130df8fd8df16b2beeaedb08f5579f018f8087a436733369f15619e032340ea482ecdc638bec788ccca89cf7efb0b701ca86d34b950d102bbff529339e0a11506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001c4db3e113b426e7b7746d9c94e95346b5bfeb53d46864283fb77a98e7519c6e9e23775b947b20f88739feb2381ea49beaa52dcd776417dd248f385e7533fb2c8f000000000000000000000000000000000000000000000000000000000000020d0000000000000000000000009837fa6dbddeaea3d297b495749872c710db4f4200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000088a9179276a4c0c02d5387c7103547b6c44fa28c543e7c4c03f289efe698a28d5e054ad9f2c913e54da931b3f5702aa393ce2be2863834978269a659e73b3e4adc13a04ee8a50ee914706da520efaa7cdd99267d6282f09838e8a4fe69302f07accc78f7ffff4b33ff70646505a87d850accd9700e85c1b86af6cbb715a21a108ee130df8fd8df16b2beeaedb08f5579f018f8087a436733369f15619e032340ea482ecdc638bec788ccca89cf7efb0b701ca86d34b950d102bbff529339e0a11506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001c98bf4c40936a61182e40d9aef38ffd24269e26acd3a01b6ea440028e351f92c7380cb4d11dc44e87b84ca4f755c673bd768ba2c49a71f42f21ca1c65195a787e000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000b531441bcd95a9bb5c5948cd8e2d8161a1cf44a800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000084a3095ebd432941dcef63a5e1ffc8d21d1036c25fd2182ebc5b3c80935ba125ab6e3f66d5c07e1c5e919c219a74f0608508704e4f3643c9caf6bfad9ffae0cebc13a04ee8a50ee914706da520efaa7cdd99267d6282f09838e8a4fe69302f07accc78f7ffff4b33ff70646505a87d850accd9700e85c1b86af6cbb715a21a108ee130df8fd8df16b2beeaedb08f5579f018f8087a436733369f15619e032340ea482ecdc638bec788ccca89cf7efb0b701ca86d34b950d102bbff529339e0a11506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001b59b4223e9678f0b5889c0e2c738881b1ceb2256a85ad76ee4862b39f5b7156c717c69d463a6c7e6d0baf16e58cb4268d1c9b1d5e5ce85cacf37241f7de45b2bb0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000d35fcaf19b534edffcc24cd2f1321ffe7d3e8da600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000088559e380d3c48f23234208045311fdf2b4318af6f0285576e2e1af7a68313c15b73bc1ba6c7c130952ff1f8c8649da105513f477845ada1670f0646cc39900c8b969e8324cea1d0487eeaa4d6f329198d2256078e2ee9dbcec89697e21bb91c5af25f09798310d25ec395a314c920c737a18f791f3b281515399d300cef6e417a699c328392abdd80c8d04d974e7ade1d27763b6961246f0cb232c3249896fc6a482ecdc638bec788ccca89cf7efb0b701ca86d34b950d102bbff529339e0a11506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001c75ad5901e57c9e3786f0dbfa59777707f119cd7f4ecbf10fc89f79cb9adbcdda6f48fbc60850cf5c2e99f5ae319d4b3a1ecabec6266eb54b22995abbba95356400000000000000000000000000000000000000000000000000000000000002200000000000000000000000004ca7e524f270b8860072cec83cebecfb5fe7040b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000008290ad9e236abb689703dd1bd9cb7aee54550796670ec429737f8f6fcdded1564a16fc8c8166f68a5a18e633a808e41bdec61207eaf1ca214d69626c923da419fce369ccfe23a6e3a0e7a320ad54a815b14d85b507a2772cab8823a5c953249e7367ad62f2e05b4ef275b676bb822f85af7ba7a9b0e4933f11bd7a95416dbdfff6c2ceb98bb46d586602f60dcff576c54664a136eb357c15744e84406e4f6dccb3c26c66b4f611db8b15e8fc37ba1ed70f96b8b009fbb5aa577aaac90829727ab506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001bc779ebb6bc9d549a71bd7ae9673b449cf94adbe39964898b223836f82701cf846d2399f2d9e8c684f57e97641a0ce3bbb2f6d756ffd5ccc5d313fd063f266d980000000000000000000000000000000000000000000000000000000000000226000000000000000000000000c052e5d8b8bc3cc77b3a2774571eb58f468996bf00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000806ecd6e53bfd5c630c163931923daa00724845031be09334c0c9817021614b192a3f9ca9cc24b1f563b0fa85730c51a9805f234e488cf73fab00738472705a353c082045dd1372214771eee60849841a69435d9551f640a613b524b4a7b665b5367ad62f2e05b4ef275b676bb822f85af7ba7a9b0e4933f11bd7a95416dbdfff6c2ceb98bb46d586602f60dcff576c54664a136eb357c15744e84406e4f6dccb3c26c66b4f611db8b15e8fc37ba1ed70f96b8b009fbb5aa577aaac90829727ab506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001b02fbfb03c9064b136e5c9395425204d52607b2e2f9dbef97e5e51d3fc822d8ff0fbab66f998349305dd91ed481a12ed6241915b07fad15303c95366e2e2e6504000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000efdb20bb54387d012d21f26fa9dda872024621e000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000089286e58c4951c86bee110336a6da08d62eddede13b60051e381054b1777d6bf5e744abecab7448d5480c0ca0c585d7c5d57c011f43fc9432e86fd9916fc8e2d6212d4619c6733f657f4e28734e457906641a765095c2006453a7beb44dc3e472698f6215b573f68145968d7d16e0e2ba2437e2d8f658343c9e82969d27c8f5626c2ceb98bb46d586602f60dcff576c54664a136eb357c15744e84406e4f6dccb3c26c66b4f611db8b15e8fc37ba1ed70f96b8b009fbb5aa577aaac90829727ab506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001c7968b75866298c61fc781d27eadd20da0a78d499f5778dd57a0a3cc80b2e008267c060e412d9ede36cfa5a1bf7743a9822b818b86efffe9d90fda3fffd8042a60000000000000000000000000000000000000000000000000000000000000230000000000000000000000000b35a16e9fca6e8154f3b9dd18be04877c86e195d00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000814eb9bb163ce66cf0b829f24221c8d98aa671633679e8371d241a31eafdf83edb1f69c8f65c57473c0c5b417d671d34cad528c2ecf12249a85417cc725fcb47d6dda8ad8b1b07f20dd96af8b55f4bd25bb79f428f0462d186102921e6eefb402b551eebf75f9b65e0448375e6a20365a3b41d2bcc7557fc8841e83bb7f897c6cce1d4f6f202992bc5052e43609a400a54c67c86dd03173185d74e7b7b30ee7043c26c66b4f611db8b15e8fc37ba1ed70f96b8b009fbb5aa577aaac90829727ab506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001c85d9cda42240357cc452e4501eee8a834744bb317074bace2f286b2492d8e77a1d10075fb9cf82ddcd85fd0f2ceb230bbe696cdea9b3e4496b438f136ddee5ff0000000000000000000000000000000000000000000000000000000000000233000000000000000000000000dc58b55deda1ca2ea630e0d01ba6a29ace897c3500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000888ed7dc9221a432993cd46899597019766d9bdecbb9bbd85c0dc84007d96102d81d4422ffd2ddfadc5c87ea5cfeabc1f45c64459d7ef8049fe46bda216ff913d6dda8ad8b1b07f20dd96af8b55f4bd25bb79f428f0462d186102921e6eefb402b551eebf75f9b65e0448375e6a20365a3b41d2bcc7557fc8841e83bb7f897c6cce1d4f6f202992bc5052e43609a400a54c67c86dd03173185d74e7b7b30ee7043c26c66b4f611db8b15e8fc37ba1ed70f96b8b009fbb5aa577aaac90829727ab506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001c76f0d7b64fedb6bbd342f4f717b7d5a748e467bc85afee3a99aa0c91805b0dfb7b1c26e71171c5ca218601a15812260354a7899e7d76c3988d697eac21460d0900000000000000000000000000000000000000000000000000000000000002350000000000000000000000008ba2497690794406187d08cc3062be92fe06f1b400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000008bccf5cf865b20aa60b3a4cb0671adffe5b9f31dbba8975643de368ce1d72d2e567390bc895000c23551e5469851d54043c284434e69755312233c30cebf506b3bfd631a21865a662a4640be22da41b4919ec29c12adfa273aa8fd05085cca45db551eebf75f9b65e0448375e6a20365a3b41d2bcc7557fc8841e83bb7f897c6cce1d4f6f202992bc5052e43609a400a54c67c86dd03173185d74e7b7b30ee7043c26c66b4f611db8b15e8fc37ba1ed70f96b8b009fbb5aa577aaac90829727ab506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001c1ab815df029b82d7a8aa9e35cc23f1311239b6127fd8a6fcfa8cc7168f14e1ec08602366780dd4ea758964819f5b769708b7df9b5f2a52c8a55b5c68f72d8fa10000000000000000000000000000000000000000000000000000000000000237000000000000000000000000e4d8a9f5aacb71eacd1a8390c00866c2468247e000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000008b5292834d03dd3136565eae75ca360f80b19dda3c1aa69b92bbedeee0caebd35a59c2047f996826c3056325fe2beb06b77ebcd629efb613117039bf98db3b73dbfd631a21865a662a4640be22da41b4919ec29c12adfa273aa8fd05085cca45db551eebf75f9b65e0448375e6a20365a3b41d2bcc7557fc8841e83bb7f897c6cce1d4f6f202992bc5052e43609a400a54c67c86dd03173185d74e7b7b30ee7043c26c66b4f611db8b15e8fc37ba1ed70f96b8b009fbb5aa577aaac90829727ab506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001c0de02112cb96e543408c04386a9ffd66711374cc1773361624152bc3dc2b5fac3c1950b1b8a1e6f92635d6d23e4141978bb45dfd4725990f5d1098356e529113000000000000000000000000000000000000000000000000000000000000023d0000000000000000000000002831dcba046c57d8bce64630314c3a7bd258cb7800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000807c8b406cbfcb9ca32d358230713ef91dd6093d066fe7bdb04e38dc9d5f6ac5217907f08060655c86f368a2b8b7455058a869f728b24938243ff0479f8fab13181deef6d5dcd43567d5872eadd42d1f6240f7b6914a0ece7109af8e62eada89897898df29a77a4d334e8dcebd6434e56399a7d75f0b6190ccfed93fbf3b9ed53ce1d4f6f202992bc5052e43609a400a54c67c86dd03173185d74e7b7b30ee7043c26c66b4f611db8b15e8fc37ba1ed70f96b8b009fbb5aa577aaac90829727ab506c2e29727e4a58faa1fcd967d7f1ba8d42c8e5bd343f7ca7a594645e3ed0d3329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001cad470f6ee2a4f57d49be25898c0269c388509d77c813e1ad2a76be2ec647de2724bc62f0eb5a6cc24f7665219fe01797097eb840e7348e810a8613d4dde1485d000000000000000000000000000000000000000000000000000000000000024300000000000000000000000080cf27b6b872d21a01b04103fd560e9b08b5973600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007a4cae3de8c6c2e057349471003142c9ee39698fa2966e1fda5793329be712edaa8521ac8011aaf2c201bb14c5dec8785f111ff515b809e8285b1e22edab5bf0f5cdd16b9eee7e4e9530df37b65349e0a49de55db4eed645144e64cb97143c8ba9a0a7149e659f76c62891dbf56f6edfff9bbeae2aaf3abe5de2bd992cd671bc7dcda84c4e0062e00b2ad7edf7b0e9cd6385ea42e75900eedb9814e21de174dab5d2f032b0eaa8903175cc3e5e686ee60559551d8f73d82127d8cd3ead8b3517c329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001bf24f0829d8b98ef3b821d945f6cc809e59ed1832594a92206de4c16c48c3b25f33b0c7add472e1c85be70f597bd1ee76e7b0facf69f779590edc3dac1ccc1122000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000a2e712650cca12e50b131ee0d37058a47ebd6b1300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000071dca2a2f3f7d287e313cb42d7f875155315905da626e0b9ec6d5218da16f93c80576af9c00da5cc6fb9cec5e8a72d3a779a0e22ec37fed750e1681a0123c43b59e1093a3c67aa963d86ed51b5c7b1295febe0d1ac3ae01ce48fd4339a85abf3d30a1819396e58b106a6d5b818b7a716dc51c2005c72f6212048d50f7aa21da99dcda84c4e0062e00b2ad7edf7b0e9cd6385ea42e75900eedb9814e21de174dab5d2f032b0eaa8903175cc3e5e686ee60559551d8f73d82127d8cd3ead8b3517c329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b000000000000000000000000000000000000000000000000000000000000001b3948c9b22b2f05f186cd464eeffb3c97d06a544920533eb2b2bab8e3cc8c704b14fa0658fa5e05074bd54e43c0f75f75cc02a9c8f8ecb85c6b1a2eed95110fda000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000037f0ef75bb2a5284efa99f7211e3a64ec44e6f200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000071b34a4471b62e7d974fbb072f3a26f005e01aeb52e7ca4a61776a2f0c08cd5e30c779af9b09e6fc267c2f37aded21603fc0dc9e6e48cf6367c71cac3eec62170827836b49a97f7a9738c96f83fe970bf453fdb6052d0d0e90f3c5dab20186cd830a1819396e58b106a6d5b818b7a716dc51c2005c72f6212048d50f7aa21da99dcda84c4e0062e00b2ad7edf7b0e9cd6385ea42e75900eedb9814e21de174dab5d2f032b0eaa8903175cc3e5e686ee60559551d8f73d82127d8cd3ead8b3517c329309cffd4947008c8d398e22c3d28597b5991643e92c7a87eaf387a647e74b" -} \ No newline at end of file +} diff --git a/relayer/cmd/run/parachain/command.go b/relayer/cmd/run/parachain/command.go index 360f05929..29fefd570 100644 --- a/relayer/cmd/run/parachain/command.go +++ b/relayer/cmd/run/parachain/command.go @@ -11,6 +11,7 @@ import ( "github.com/sirupsen/logrus" "github.com/snowfork/snowbridge/relayer/chain/ethereum" para "github.com/snowfork/snowbridge/relayer/chain/parachain" + "github.com/snowfork/snowbridge/relayer/relays/beefy" "github.com/snowfork/snowbridge/relayer/relays/parachain" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -25,6 +26,8 @@ var ( parachainPrivateKey string parachainPrivateKeyFile string parachainPrivateKeyID string + beefyConfigFile string + onDemand bool ) func Command() *cobra.Command { @@ -38,6 +41,8 @@ func Command() *cobra.Command { cmd.Flags().StringVar(&configFile, "config", "", "Path to configuration file") cmd.MarkFlagRequired("config") + cmd.Flags().StringVar(&beefyConfigFile, "beefy.config", "", "Path to beefy configuration file") + cmd.Flags().StringVar(&privateKey, "ethereum.private-key", "", "Ethereum private key") cmd.Flags().StringVar(&privateKeyFile, "ethereum.private-key-file", "", "The file from which to read the private key") cmd.Flags().StringVar(&privateKeyID, "ethereum.private-key-id", "", "The secret id to lookup the private key in AWS Secrets Manager") @@ -46,6 +51,9 @@ func Command() *cobra.Command { cmd.Flags().StringVar(¶chainPrivateKeyFile, "substrate.private-key-file", "", "The file from which to read the private key") cmd.Flags().StringVar(¶chainPrivateKeyID, "substrate.private-key-id", "", "The secret id to lookup the private key in AWS Secrets Manager") + cmd.Flags().StringVar(&beefyConfigFile, "beefy.config", "", "Path to beefy configuration file") + cmd.Flags().BoolVarP(&onDemand, "on-demand", "", false, "Synchronize beefy commitments on demand together with parachain messages") + return cmd } @@ -79,11 +87,6 @@ func run(_ *cobra.Command, _ []string) error { return err } - relay, err := parachain.NewRelay(&config, keypair, keypair2) - if err != nil { - return err - } - ctx, cancel := context.WithCancel(context.Background()) eg, ctx := errgroup.WithContext(ctx) @@ -103,11 +106,38 @@ func run(_ *cobra.Command, _ []string) error { return nil }) - err = relay.Start(ctx, eg) - if err != nil { - logrus.WithError(err).Fatal("Unhandled error") - cancel() - return err + if !onDemand { + relay, err := parachain.NewRelay(&config, keypair, keypair2) + if err != nil { + return err + } + err = relay.Start(ctx, eg) + if err != nil { + logrus.WithError(err).Fatal("Unhandled error") + cancel() + return err + } + } else { + viper.SetConfigFile(beefyConfigFile) + if err := viper.ReadInConfig(); err != nil { + return err + } + + var beefyConfig beefy.Config + err = viper.UnmarshalExact(&beefyConfig) + if err != nil { + return err + } + relay, err := parachain.NewOnDemandRelay(&config, &beefyConfig, keypair) + if err != nil { + return err + } + err = relay.Start(ctx, eg) + if err != nil { + logrus.WithError(err).Fatal("Unhandled error") + cancel() + return err + } } err = eg.Wait() diff --git a/relayer/relays/beefy/ethereum-writer.go b/relayer/relays/beefy/ethereum-writer.go index d97bdaf87..114411661 100644 --- a/relayer/relays/beefy/ethereum-writer.go +++ b/relayer/relays/beefy/ethereum-writer.go @@ -140,6 +140,21 @@ func (wr *EthereumWriter) submit(ctx context.Context, task *Request) error { return fmt.Errorf("Failed to wait for RandaoCommitDelay: %w", err) } + state, err := wr.queryBeefyClientState(ctx) + if err != nil { + return fmt.Errorf("query beefy client state: %w", err) + } + + // Ignore beefy block already synced + if uint64(task.SignedCommitment.Commitment.BlockNumber) <= state.LatestBeefyBlock { + log.WithFields(log.Fields{ + "validatorSetID": state.CurrentValidatorSetID, + "beefyBlock": state.LatestBeefyBlock, + "relayBlock": task.SignedCommitment.Commitment.BlockNumber, + }).Info("Beefy block already synced, just ignore") + return nil + } + commitmentHash, err := task.CommitmentHash() if err != nil { return fmt.Errorf("generate commitment hash: %w", err) @@ -172,6 +187,19 @@ func (wr *EthereumWriter) submit(ctx context.Context, task *Request) error { }).Info("SubmitFinal is skipped, indicating that a newer update is already in progress.") return nil } + state, err = wr.queryBeefyClientState(ctx) + if err != nil { + return fmt.Errorf("query beefy client state: %w", err) + } + + if uint64(task.SignedCommitment.Commitment.BlockNumber) <= state.LatestBeefyBlock { + log.WithFields(log.Fields{ + "validatorSetID": state.CurrentValidatorSetID, + "beefyBlock": state.LatestBeefyBlock, + "relayBlock": task.SignedCommitment.Commitment.BlockNumber, + }).Info("Beefy block already synced, just ignore") + return nil + } // Final submission tx, err = wr.doSubmitFinal(ctx, *commitmentHash, initialBitfield, task) if err != nil { @@ -320,3 +348,90 @@ func (wr *EthereumWriter) initialize(ctx context.Context) error { return nil } + +func (wr *EthereumWriter) submitFiatShamir(ctx context.Context, task Request) error { + signedValidators := []*big.Int{} + for i, signature := range task.SignedCommitment.Signatures { + if signature.IsSome() { + signedValidators = append(signedValidators, big.NewInt(int64(i))) + } + } + validatorCount := big.NewInt(int64(len(task.SignedCommitment.Signatures))) + + // Pick a random validator who signs beefy commitment + chosenValidator := signedValidators[rand.Intn(len(signedValidators))].Int64() + + log.WithFields(logrus.Fields{ + "validatorCount": validatorCount, + "signedValidators": signedValidators, + "signedValidatorCount": len(signedValidators), + "chosenValidator": chosenValidator, + }).Info("Creating initial bitfield") + + initialBitfield, err := wr.contract.CreateInitialBitfield( + &bind.CallOpts{ + Pending: true, + From: wr.conn.Keypair().CommonAddress(), + }, + signedValidators, validatorCount, + ) + if err != nil { + return fmt.Errorf("create initial bitfield: %w", err) + } + + commitment := toBeefyClientCommitment(&task.SignedCommitment.Commitment) + + finalBitfield, err := wr.contract.CreateFiatShamirFinalBitfield( + &bind.CallOpts{ + Pending: true, + From: wr.conn.Keypair().CommonAddress(), + }, + *commitment, + initialBitfield, + ) + + if err != nil { + return fmt.Errorf("create validator final bitfield: %w", err) + } + + validatorIndices := bitfield.New(finalBitfield).Members() + + params, err := task.MakeSubmitFinalParams(validatorIndices, initialBitfield) + if err != nil { + return fmt.Errorf("make submit final params: %w", err) + } + + logFields, err := wr.makeSubmitFinalLogFields(&task, params) + if err != nil { + return fmt.Errorf("logging params: %w", err) + } + + tx, err := wr.contract.SubmitFiatShamir( + wr.conn.MakeTxOpts(ctx), + params.Commitment, + params.Bitfield, + params.Proofs, + params.Leaf, + params.LeafProof, + params.LeafProofOrder, + ) + if err != nil { + return fmt.Errorf("SubmitFiatShamir: %w", err) + } + + log.WithField("txHash", tx.Hash().Hex()). + WithFields(logFields). + Info("Sent SubmitFiatShamir transaction") + + _, err = wr.conn.WatchTransaction(ctx, tx, 0) + if err != nil { + return fmt.Errorf("Wait receipt for SubmitFiatShamir: %w", err) + } + + log.WithFields(logrus.Fields{ + "tx": tx.Hash().Hex(), + "blockNumber": task.SignedCommitment.Commitment.BlockNumber, + }).Debug("Transaction submitFiatShamir succeeded") + + return nil +} diff --git a/relayer/relays/beefy/on-demand-sync.go b/relayer/relays/beefy/on-demand-sync.go index b925d978e..2bac20e32 100644 --- a/relayer/relays/beefy/on-demand-sync.go +++ b/relayer/relays/beefy/on-demand-sync.go @@ -420,7 +420,7 @@ func (relay *OnDemandRelay) OneShotStart(ctx context.Context, beefyBlockNumber u log.Info("Performing sync") - err = relay.sync(ctx, beefyBlockNumber) + err = relay.syncFiatShamir(ctx, beefyBlockNumber) if err != nil { return fmt.Errorf("Sync failed: %w", err) } @@ -716,3 +716,67 @@ func (relay *OnDemandRelay) queueAll(ctx context.Context) error { } return nil } + +func (relay *OnDemandRelay) syncFiatShamir(ctx context.Context, blockNumber uint64) error { + state, err := relay.ethereumWriter.queryBeefyClientState(ctx) + if err != nil { + return fmt.Errorf("query beefy client state: %w", err) + } + // Ignore relay block already synced + if blockNumber <= state.LatestBeefyBlock { + log.WithFields(log.Fields{ + "validatorSetID": state.CurrentValidatorSetID, + "beefyBlock": state.LatestBeefyBlock, + "relayBlock": blockNumber, + }).Info("Relay block already synced, just ignore") + return nil + } + + // generate beefy update for that specific relay block + task, err := relay.polkadotListener.generateBeefyUpdate(blockNumber) + if err != nil { + return fmt.Errorf("fail to generate next beefy request: %w", err) + } + + // Ignore commitment earlier than LatestBeefyBlock which is outdated + if task.SignedCommitment.Commitment.BlockNumber <= uint32(state.LatestBeefyBlock) { + log.WithFields(log.Fields{ + "latestBeefyBlock": state.LatestBeefyBlock, + "currentValidatorSetID": state.CurrentValidatorSetID, + "nextValidatorSetID": state.NextValidatorSetID, + "blockNumberToSync": task.SignedCommitment.Commitment.BlockNumber, + }).Info("Commitment outdated, just ignore") + return nil + } + if task.SignedCommitment.Commitment.ValidatorSetID > state.NextValidatorSetID { + log.WithFields(log.Fields{ + "latestBeefyBlock": state.LatestBeefyBlock, + "currentValidatorSetID": state.CurrentValidatorSetID, + "nextValidatorSetID": state.NextValidatorSetID, + "validatorSetIDToSync": task.SignedCommitment.Commitment.ValidatorSetID, + }).Warn("Task unexpected, wait for mandatory updates to catch up first") + return nil + } + + // Submit the task + if task.SignedCommitment.Commitment.ValidatorSetID == state.CurrentValidatorSetID { + task.ValidatorsRoot = state.CurrentValidatorSetRoot + } else { + task.ValidatorsRoot = state.NextValidatorSetRoot + } + err = relay.ethereumWriter.submitFiatShamir(ctx, task) + if err != nil { + return fmt.Errorf("SubmitFiatShamir beefy update: %w", err) + } + + updatedState, err := relay.ethereumWriter.queryBeefyClientState(ctx) + if err != nil { + return fmt.Errorf("query beefy client state: %w", err) + } + log.WithFields(log.Fields{ + "latestBeefyBlock": updatedState.LatestBeefyBlock, + "currentValidatorSetID": updatedState.CurrentValidatorSetID, + "nextValidatorSetID": updatedState.NextValidatorSetID, + }).Info("Sync beefy update success") + return nil +} diff --git a/relayer/relays/parachain/beefy-instant-syncer.go b/relayer/relays/parachain/beefy-instant-syncer.go new file mode 100644 index 000000000..7b0911306 --- /dev/null +++ b/relayer/relays/parachain/beefy-instant-syncer.go @@ -0,0 +1,100 @@ +package parachain + +import ( + "context" + "fmt" + "time" + + log "github.com/sirupsen/logrus" + "github.com/snowfork/snowbridge/relayer/relays/beefy" + "golang.org/x/sync/errgroup" +) + +type BeefyInstantSyncer struct { + beefyListener *BeefyListener + beefyOnDemandRelay *beefy.OnDemandRelay +} + +func NewBeefyInstantSyncer( + beefyListener *BeefyListener, + beefyOnDemandRelay *beefy.OnDemandRelay, +) *BeefyInstantSyncer { + return &BeefyInstantSyncer{ + beefyListener: beefyListener, + beefyOnDemandRelay: beefyOnDemandRelay, + } +} + +// Todo: consider using subscription to listen for new finalized beefy headers +func (li *BeefyInstantSyncer) Start(ctx context.Context, eg *errgroup.Group) error { + // Initialize the beefy listener to setup the scanner + err := li.beefyListener.initialize(ctx) + if err != nil { + return fmt.Errorf("initialize beefy listener: %w", err) + } + + ticker := time.NewTicker(time.Second * 60) + + eg.Go(func() error { + + for { + finalizedBeefyBlockHash, err := li.beefyListener.relaychainConn.API().RPC.Beefy.GetFinalizedHead() + if err != nil { + return fmt.Errorf("fetch beefy finalized head: %w", err) + } + finalizedBeefyBlockHeader, err := li.beefyListener.relaychainConn.API().RPC.Chain.GetHeader(finalizedBeefyBlockHash) + if err != nil { + return fmt.Errorf("fetch block header: %w", err) + } + latestBeefyBlockNumber := uint64(finalizedBeefyBlockHeader.Number) + err = li.doScanAndUpdate(ctx, latestBeefyBlockNumber) + if err != nil { + return fmt.Errorf("scan for sync tasks: %w", err) + } + + select { + case <-ctx.Done(): + return nil + case <-ticker.C: + continue + } + } + }) + + return nil +} + +// Todo: Batch the two calls(update consensus & v2_submit) to avoid front-running +func (li *BeefyInstantSyncer) doScanAndUpdate(ctx context.Context, beefyBlockNumber uint64) error { + // Scan for undelivered orders using the latest BEEFY block number on the relay chain. + tasks, err := li.beefyListener.scanner.Scan(ctx, beefyBlockNumber) + if err != nil { + return err + } + if len(tasks) > 0 { + // Oneshot sync with FiatShamir and ensure light client is synced to the BEEFY block number + // before submitting any messages to the parachain + // This is to ensure the light client has the necessary BEEFY proofs + // to verify the parachain headers being submitted + log.Info(fmt.Sprintf("Syncing light client to BEEFY block number %d\n", beefyBlockNumber)) + err = li.beefyOnDemandRelay.OneShotStart(ctx, beefyBlockNumber) + if err != nil { + return fmt.Errorf("sync beefy update on demand: %w", err) + } + beefyBlockSynced, _, err := li.beefyListener.fetchLatestBeefyBlock(ctx) + if err != nil { + return fmt.Errorf("fetch latest beefy block: %w", err) + } + if beefyBlockSynced < beefyBlockNumber { + return fmt.Errorf("beefy block %d not synced to light client, recent synced %d", beefyBlockNumber, beefyBlockSynced) + } + } + for _, task := range tasks { + err = li.beefyListener.waitAndSend(ctx, task, 0) + if err != nil { + return fmt.Errorf("send task: %w", err) + } + } + + return nil +} diff --git a/relayer/relays/parachain/beefy-listener.go b/relayer/relays/parachain/beefy-listener.go index 0616b7355..3ea5f1711 100644 --- a/relayer/relays/parachain/beefy-listener.go +++ b/relayer/relays/parachain/beefy-listener.go @@ -55,6 +55,41 @@ func NewBeefyListener( } } +func (li *BeefyListener) initialize(ctx context.Context) error { + // Set up light client bridge contract + address := common.HexToAddress(li.config.Contracts.BeefyClient) + beefyClientContract, err := contracts.NewBeefyClient(address, li.ethereumConn.Client()) + if err != nil { + return err + } + li.beefyClientContract = beefyClientContract + + // fetch ParaId + paraIDKey, err := types.CreateStorageKey(li.parachainConnection.Metadata(), "ParachainInfo", "ParachainId", nil, nil) + if err != nil { + return err + } + var paraID uint32 + ok, err := li.parachainConnection.API().RPC.State.GetStorageLatest(paraIDKey, ¶ID) + if err != nil { + return fmt.Errorf("fetch parachain id: %w", err) + } + if !ok { + return fmt.Errorf("parachain id missing") + } + li.paraID = paraID + + li.scanner = &Scanner{ + config: li.config, + ethConn: li.ethereumConn, + relayConn: li.relaychainConn, + paraConn: li.parachainConnection, + paraID: paraID, + ofac: li.ofac, + } + return nil +} + func (li *BeefyListener) Start(ctx context.Context, eg *errgroup.Group) error { // Set up light client bridge contract address := common.HexToAddress(li.config.Contracts.BeefyClient) diff --git a/relayer/relays/parachain/on-demand-sync.go b/relayer/relays/parachain/on-demand-sync.go new file mode 100644 index 000000000..3b7779145 --- /dev/null +++ b/relayer/relays/parachain/on-demand-sync.go @@ -0,0 +1,122 @@ +package parachain + +import ( + "context" + "fmt" + "time" + + "golang.org/x/sync/errgroup" + + "github.com/snowfork/snowbridge/relayer/chain/ethereum" + "github.com/snowfork/snowbridge/relayer/chain/parachain" + "github.com/snowfork/snowbridge/relayer/chain/relaychain" + "github.com/snowfork/snowbridge/relayer/crypto/secp256k1" + "github.com/snowfork/snowbridge/relayer/relays/beefy" + + "github.com/snowfork/snowbridge/relayer/ofac" + + log "github.com/sirupsen/logrus" +) + +type OnDemandRelay struct { + config *Config + parachainConn *parachain.Connection + relaychainConn *relaychain.Connection + ethereumConnWriter *ethereum.Connection + ethereumConnBeefy *ethereum.Connection + ethereumChannelWriter *EthereumWriter + beefyListener *BeefyListener + beefyInstantSyncer *BeefyInstantSyncer +} + +func NewOnDemandRelay(config *Config, beefyConfig *beefy.Config, keypair *secp256k1.Keypair) (*OnDemandRelay, error) { + log.Info("Creating worker") + + parachainConn := parachain.NewConnection(config.Source.Parachain.Endpoint, nil) + relaychainConn := relaychain.NewConnection(config.Source.Polkadot.Endpoint) + + ethereumConnWriter := ethereum.NewConnection(&config.Sink.Ethereum, keypair) + ethereumConnBeefy := ethereum.NewConnection(&config.Source.Ethereum, keypair) + + ofacClient := ofac.New(config.OFAC.Enabled, config.OFAC.ApiKey) + + // channel for messages from beefy listener to ethereum writer + var tasks = make(chan *Task, 1) + + ethereumChannelWriter, err := NewEthereumWriter( + &config.Sink, + ethereumConnWriter, + tasks, + config, + ) + if err != nil { + return nil, err + } + + beefyListener := NewBeefyListener( + &config.Source, + &config.Schedule, + ethereumConnBeefy, + relaychainConn, + parachainConn, + ofacClient, + tasks, + ) + + beefyOnDemandRelay, err := beefy.NewOnDemandRelay(beefyConfig, keypair) + if err != nil { + return nil, err + } + + beefyInstantSyncer := NewBeefyInstantSyncer( + beefyListener, + beefyOnDemandRelay, + ) + + return &OnDemandRelay{ + config: config, + parachainConn: parachainConn, + relaychainConn: relaychainConn, + ethereumConnWriter: ethereumConnWriter, + ethereumConnBeefy: ethereumConnBeefy, + ethereumChannelWriter: ethereumChannelWriter, + beefyListener: beefyListener, + beefyInstantSyncer: beefyInstantSyncer, + }, nil +} + +func (relay *OnDemandRelay) Start(ctx context.Context, eg *errgroup.Group) error { + err := relay.parachainConn.ConnectWithHeartBeat(ctx, eg, time.Second*time.Duration(relay.config.Source.Parachain.HeartbeatSecs)) + if err != nil { + return err + } + + err = relay.ethereumConnWriter.ConnectWithHeartBeat(ctx, eg, time.Second*time.Duration(relay.config.Sink.Ethereum.HeartbeatSecs)) + if err != nil { + return fmt.Errorf("unable to connect to ethereum: writer: %w", err) + } + + err = relay.ethereumConnBeefy.ConnectWithHeartBeat(ctx, eg, time.Second*time.Duration(relay.config.Sink.Ethereum.HeartbeatSecs)) + if err != nil { + return fmt.Errorf("unable to connect to ethereum: beefy: %w", err) + } + + err = relay.relaychainConn.ConnectWithHeartBeat(ctx, eg, time.Second*time.Duration(relay.config.Source.Polkadot.HeartbeatSecs)) + if err != nil { + return err + } + + log.Info("Starting beefy instant listener") + err = relay.beefyInstantSyncer.Start(ctx, eg) + if err != nil { + return err + } + + log.Info("Starting ethereum writer") + err = relay.ethereumChannelWriter.Start(ctx, eg) + if err != nil { + return err + } + + return nil +}