diff --git a/.changeset/good-rats-listen.md b/.changeset/good-rats-listen.md new file mode 100644 index 000000000..dff7a8036 --- /dev/null +++ b/.changeset/good-rats-listen.md @@ -0,0 +1,7 @@ +--- +'@sphinx-labs/contracts': minor +'@sphinx-labs/plugins': minor +'@sphinx-labs/core': minor +--- + +Opensource Platform diff --git a/packages/contracts/contract-artifacts/sphinx/PermissionlessRelay.sol/PermissionlessRelay.json b/packages/contracts/contract-artifacts/sphinx/PermissionlessRelay.sol/PermissionlessRelay.json new file mode 100644 index 000000000..bb073dd9b --- /dev/null +++ b/packages/contracts/contract-artifacts/sphinx/PermissionlessRelay.sol/PermissionlessRelay.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"exec","inputs":[{"name":"_to","type":"address","internalType":"address payable"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"payable"},{"type":"event","name":"Called","inputs":[{"name":"relayer","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address payable"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"dataHash","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50600160008190555061069a806100286000396000f3fe60806040526004361061001e5760003560e01c8063be6002c214610023575b600080fd5b61003d600480360381019061003891906102db565b610053565b60405161004a9190610422565b60405180910390f35b606061005d610222565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156100cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c490610464565b60405180910390fd5b82826040516100dd929190610409565b60405180910390208473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d3460405161014291906104a4565b60405180910390a46000808573ffffffffffffffffffffffffffffffffffffffff16348686604051610175929190610409565b60006040518083038185875af1925050503d80600081146101b2576040519150601f19603f3d011682016040523d82523d6000602084013e6101b7565b606091505b50915091508161020e57600081511415610206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fd90610444565b60405180910390fd5b805181602001fd5b809250505061021b610272565b9392505050565b60026000541415610268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025f90610484565b60405180910390fd5b6002600081905550565b6001600081905550565b60008135905061028b8161064d565b92915050565b60008083601f8401126102a357600080fd5b8235905067ffffffffffffffff8111156102bc57600080fd5b6020830191508360018202830111156102d457600080fd5b9250929050565b6000806000604084860312156102f057600080fd5b60006102fe8682870161027c565b935050602084013567ffffffffffffffff81111561031b57600080fd5b61032786828701610291565b92509250509250925092565b600061033f83856104db565b935061034c838584610533565b82840190509392505050565b6000610363826104bf565b61036d81856104ca565b935061037d818560208601610542565b61038681610575565b840191505092915050565b600061039e6032836104e6565b91506103a982610586565b604082019050919050565b60006103c16029836104e6565b91506103cc826105d5565b604082019050919050565b60006103e4601f836104e6565b91506103ef82610624565b602082019050919050565b61040381610529565b82525050565b6000610416828486610333565b91508190509392505050565b6000602082019050818103600083015261043c8184610358565b905092915050565b6000602082019050818103600083015261045d81610391565b9050919050565b6000602082019050818103600083015261047d816103b4565b9050919050565b6000602082019050818103600083015261049d816103d7565b9050919050565b60006020820190506104b960008301846103fa565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061050282610509565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015610560578082015181840152602081019050610545565b8381111561056f576000848401525b50505050565b6000601f19601f8301169050919050565b7f5065726d697373696f6e6c65737352656c61793a205472616e73616374696f6e60008201527f2072657665727465642073696c656e746c790000000000000000000000000000602082015250565b7f5065726d697373696f6e6c65737352656c61793a20746172676574206973206160008201527f6464726573732830290000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b610656816104f7565b811461066157600080fd5b5056fea26469706673582212201d88bc3b8cda621b7d980295ef54db4d2ae21e1f206ea6a59db6551b909fa9fa64736f6c63430008040033","sourceMap":"483:1814:1:-:0;;;;;;;;;;;;;1716:1:110;1821:7;:22;;;;483:1814:1;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061001e5760003560e01c8063be6002c214610023575b600080fd5b61003d600480360381019061003891906102db565b610053565b60405161004a9190610422565b60405180910390f35b606061005d610222565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156100cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c490610464565b60405180910390fd5b82826040516100dd929190610409565b60405180910390208473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d3460405161014291906104a4565b60405180910390a46000808573ffffffffffffffffffffffffffffffffffffffff16348686604051610175929190610409565b60006040518083038185875af1925050503d80600081146101b2576040519150601f19603f3d011682016040523d82523d6000602084013e6101b7565b606091505b50915091508161020e57600081511415610206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fd90610444565b60405180910390fd5b805181602001fd5b809250505061021b610272565b9392505050565b60026000541415610268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025f90610484565b60405180910390fd5b6002600081905550565b6001600081905550565b60008135905061028b8161064d565b92915050565b60008083601f8401126102a357600080fd5b8235905067ffffffffffffffff8111156102bc57600080fd5b6020830191508360018202830111156102d457600080fd5b9250929050565b6000806000604084860312156102f057600080fd5b60006102fe8682870161027c565b935050602084013567ffffffffffffffff81111561031b57600080fd5b61032786828701610291565b92509250509250925092565b600061033f83856104db565b935061034c838584610533565b82840190509392505050565b6000610363826104bf565b61036d81856104ca565b935061037d818560208601610542565b61038681610575565b840191505092915050565b600061039e6032836104e6565b91506103a982610586565b604082019050919050565b60006103c16029836104e6565b91506103cc826105d5565b604082019050919050565b60006103e4601f836104e6565b91506103ef82610624565b602082019050919050565b61040381610529565b82525050565b6000610416828486610333565b91508190509392505050565b6000602082019050818103600083015261043c8184610358565b905092915050565b6000602082019050818103600083015261045d81610391565b9050919050565b6000602082019050818103600083015261047d816103b4565b9050919050565b6000602082019050818103600083015261049d816103d7565b9050919050565b60006020820190506104b960008301846103fa565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061050282610509565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015610560578082015181840152602081019050610545565b8381111561056f576000848401525b50505050565b6000601f19601f8301169050919050565b7f5065726d697373696f6e6c65737352656c61793a205472616e73616374696f6e60008201527f2072657665727465642073696c656e746c790000000000000000000000000000602082015250565b7f5065726d697373696f6e6c65737352656c61793a20746172676574206973206160008201527f6464726573732830290000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b610656816104f7565b811461066157600080fd5b5056fea26469706673582212201d88bc3b8cda621b7d980295ef54db4d2ae21e1f206ea6a59db6551b909fa9fa64736f6c63430008040033","sourceMap":"483:1814:1:-:0;;;;;;;;;;;;;;;;;;;;;1538:757;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;1654:12;2261:21:110;:19;:21::i;:::-;1701:1:1::1;1686:17;;:3;:17;;;;1678:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;1810:5;;1800:16;;;;;;;:::i;:::-;;;;;;;;1784:3;1765:52;;1772:10;1765:52;;;1789:9;1765:52;;;;;;:::i;:::-;;;;;;;;1885:12;1899:16:::0;1919:3:::1;:8;;1936:9;1948:5;;1919:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1884:70;;;;1970:7;1965:324;;2088:1;2074:3;:10;:15;2070:81;;;2091:60;;;;;;;;;;:::i;:::-;;;;;;;;2070:81;2219:3;2213:10;2207:3;2203:2;2199:12;2192:32;2174:64;2275:3;2268:10;;;;2303:20:110::0;:18;:20::i;:::-;1538:757:1;;;;;:::o;2336:287:110:-;1759:1;2468:7;;:19;;2460:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:1;2598:7;:18;;;;2336:287::o;2629:209::-;1716:1;2809:7;:22;;;;2629:209::o;7:155:131:-;61:5;99:6;86:20;77:29;;115:41;150:5;115:41;:::i;:::-;67:95;;;;:::o;181:351::-;238:8;248:6;298:3;291:4;283:6;279:17;275:27;265:2;;316:1;313;306:12;265:2;352:6;339:20;329:30;;382:18;374:6;371:30;368:2;;;414:1;411;404:12;368:2;451:4;443:6;439:17;427:29;;505:3;497:4;489:6;485:17;475:8;471:32;468:41;465:2;;;522:1;519;512:12;465:2;255:277;;;;;:::o;538:554::-;625:6;633;641;690:2;678:9;669:7;665:23;661:32;658:2;;;706:1;703;696:12;658:2;749:1;774:61;827:7;818:6;807:9;803:22;774:61;:::i;:::-;764:71;;720:125;912:2;901:9;897:18;884:32;943:18;935:6;932:30;929:2;;;975:1;972;965:12;929:2;1011:64;1067:7;1058:6;1047:9;1043:22;1011:64;:::i;:::-;993:82;;;;855:230;648:444;;;;;:::o;1120:314::-;1234:3;1255:88;1336:6;1331:3;1255:88;:::i;:::-;1248:95;;1353:43;1389:6;1384:3;1377:5;1353:43;:::i;:::-;1421:6;1416:3;1412:16;1405:23;;1238:196;;;;;:::o;1440:360::-;1526:3;1554:38;1586:5;1554:38;:::i;:::-;1608:70;1671:6;1666:3;1608:70;:::i;:::-;1601:77;;1687:52;1732:6;1727:3;1720:4;1713:5;1709:16;1687:52;:::i;:::-;1764:29;1786:6;1764:29;:::i;:::-;1759:3;1755:39;1748:46;;1530:270;;;;;:::o;1806:366::-;1948:3;1969:67;2033:2;2028:3;1969:67;:::i;:::-;1962:74;;2045:93;2134:3;2045:93;:::i;:::-;2163:2;2158:3;2154:12;2147:19;;1952:220;;;:::o;2178:366::-;2320:3;2341:67;2405:2;2400:3;2341:67;:::i;:::-;2334:74;;2417:93;2506:3;2417:93;:::i;:::-;2535:2;2530:3;2526:12;2519:19;;2324:220;;;:::o;2550:366::-;2692:3;2713:67;2777:2;2772:3;2713:67;:::i;:::-;2706:74;;2789:93;2878:3;2789:93;:::i;:::-;2907:2;2902:3;2898:12;2891:19;;2696:220;;;:::o;2922:118::-;3009:24;3027:5;3009:24;:::i;:::-;3004:3;2997:37;2987:53;;:::o;3046:291::-;3186:3;3208:103;3307:3;3298:6;3290;3208:103;:::i;:::-;3201:110;;3328:3;3321:10;;3190:147;;;;;:::o;3343:309::-;3454:4;3492:2;3481:9;3477:18;3469:26;;3541:9;3535:4;3531:20;3527:1;3516:9;3512:17;3505:47;3569:76;3640:4;3631:6;3569:76;:::i;:::-;3561:84;;3459:193;;;;:::o;3658:419::-;3824:4;3862:2;3851:9;3847:18;3839:26;;3911:9;3905:4;3901:20;3897:1;3886:9;3882:17;3875:47;3939:131;4065:4;3939:131;:::i;:::-;3931:139;;3829:248;;;:::o;4083:419::-;4249:4;4287:2;4276:9;4272:18;4264:26;;4336:9;4330:4;4326:20;4322:1;4311:9;4307:17;4300:47;4364:131;4490:4;4364:131;:::i;:::-;4356:139;;4254:248;;;:::o;4508:419::-;4674:4;4712:2;4701:9;4697:18;4689:26;;4761:9;4755:4;4751:20;4747:1;4736:9;4732:17;4725:47;4789:131;4915:4;4789:131;:::i;:::-;4781:139;;4679:248;;;:::o;4933:222::-;5026:4;5064:2;5053:9;5049:18;5041:26;;5077:71;5145:1;5134:9;5130:17;5121:6;5077:71;:::i;:::-;5031:124;;;;:::o;5161:98::-;5212:6;5246:5;5240:12;5230:22;;5219:40;;;:::o;5265:168::-;5348:11;5382:6;5377:3;5370:19;5422:4;5417:3;5413:14;5398:29;;5360:73;;;;:::o;5439:147::-;5540:11;5577:3;5562:18;;5552:34;;;;:::o;5592:169::-;5676:11;5710:6;5705:3;5698:19;5750:4;5745:3;5741:14;5726:29;;5688:73;;;;:::o;5767:104::-;5812:7;5841:24;5859:5;5841:24;:::i;:::-;5830:35;;5820:51;;;:::o;5877:126::-;5914:7;5954:42;5947:5;5943:54;5932:65;;5922:81;;;:::o;6009:77::-;6046:7;6075:5;6064:16;;6054:32;;;:::o;6092:154::-;6176:6;6171:3;6166;6153:30;6238:1;6229:6;6224:3;6220:16;6213:27;6143:103;;;:::o;6252:307::-;6320:1;6330:113;6344:6;6341:1;6338:13;6330:113;;;6429:1;6424:3;6420:11;6414:18;6410:1;6405:3;6401:11;6394:39;6366:2;6363:1;6359:10;6354:15;;6330:113;;;6461:6;6458:1;6455:13;6452:2;;;6541:1;6532:6;6527:3;6523:16;6516:27;6452:2;6301:258;;;;:::o;6565:102::-;6606:6;6657:2;6653:7;6648:2;6641:5;6637:14;6633:28;6623:38;;6613:54;;;:::o;6673:237::-;6813:34;6809:1;6801:6;6797:14;6790:58;6882:20;6877:2;6869:6;6865:15;6858:45;6779:131;:::o;6916:228::-;7056:34;7052:1;7044:6;7040:14;7033:58;7125:11;7120:2;7112:6;7108:15;7101:36;7022:122;:::o;7150:181::-;7290:33;7286:1;7278:6;7274:14;7267:57;7256:75;:::o;7337:138::-;7418:32;7444:5;7418:32;:::i;:::-;7411:5;7408:43;7398:2;;7465:1;7462;7455:12;7398:2;7388:87;:::o","linkReferences":{}},"methodIdentifiers":{"exec(address,bytes)":"be6002c2"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.4+commit.c7e474f2\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"relayer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address payable\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"}],\"name\":\"Called\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"exec\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Called(address,address,uint256,bytes32)\":{\"params\":{\"dataHash\":\"A keccak256 hash of the input data.\",\"relayer\":\"The address of the account that made the call.\",\"to\":\"The address of the remote contract.\",\"value\":\"The value transferred from the caller to the destination address.\"}}},\"kind\":\"dev\",\"methods\":{\"exec(address,bytes)\":{\"params\":{\"_data\":\"The data that will be sent.\",\"_to\":\"The target address.\"},\"returns\":{\"_0\":\"bytes The return value of the underlying call.\"}}},\"title\":\"PermissionlessRelay\",\"version\":1},\"userdoc\":{\"events\":{\"Called(address,address,uint256,bytes32)\":{\"notice\":\"Emitted when a call is made.\"}},\"kind\":\"user\",\"methods\":{\"exec(address,bytes)\":{\"notice\":\"Allows for the relayers to make arbitrary calls using this contract. We forward the return value of the underlying function call to allow maximum flexibility in future uses of this contract.If `_to` is an EOA then this function will still call it and return successfully.\"}},\"notice\":\"A contract used for the `executor` field in the Sphinx Merkle tree which allows permissionless execution of signed bundles by any address. This allows the Sphinx backend to work with any relayer account.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/PermissionlessRelay.sol\":\"PermissionlessRelay\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@gnosis.pm/safe-contracts-1.3.0/=node_modules/@gnosis.pm/safe-contracts/contracts/\",\":@gnosis.pm/safe-contracts-1.4.1/=node_modules/@gnosis.pm/safe-contracts-1.4.1/contracts/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":ds-test/=node_modules/ds-test/src/\"]},\"sources\":{\"contracts/core/PermissionlessRelay.sol\":{\"keccak256\":\"0xc81ffbd9fd7cfc82f71518fc48f4d224fd45e405b3af996e3d7ae1e25465ff94\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db42b8128409205985118a2f6fc3df440ce4c161d442a2a64f2cd5dd71571f87\",\"dweb:/ipfs/Qmf64Pf3EV1b6buUM35WUtz6nR71KUAuU2Y1nhtC3sQaut\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc117ce50ea746cab6b97ed1a1facee17a715ae0cb95d67b943dacbaf15176fb\",\"dweb:/ipfs/QmYRZ2UGNYwsHwfNu7Wjr8L2j1LBZ1mKv6NvbwgterYMXc\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bb2c137c343ef0c4c7ce7b18c1d108afdc9d315a04e48307288d2d05adcbde3a\",\"dweb:/ipfs/QmUxhrAQM3MM3FF5j7AtcXLXguWCJBHJ14BRdVtuoQc8Fh\"]},\"node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://41319e7f621f2dc3733511332c4fd032f8e32ad2aa7fd6f665c19741d9941a34\",\"dweb:/ipfs/QmcYR3bd862GD1Bc7jwrU9bGxrhUu5na1oP964bDCu2id1\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fb0048dee081f6fffa5f74afc3fb328483c2a30504e94a0ddd2a5114d731ec4d\",\"dweb:/ipfs/QmZptt1nmYoA5SgjwnSgWqgUSDgm4q52Yos3xhnMv3MV43\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.4+commit.c7e474f2"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"relayer","type":"address","indexed":true},{"internalType":"address payable","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false},{"internalType":"bytes32","name":"dataHash","type":"bytes32","indexed":true}],"type":"event","name":"Called","anonymous":false},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"exec","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]}],"devdoc":{"kind":"dev","methods":{"exec(address,bytes)":{"params":{"_data":"The data that will be sent.","_to":"The target address."},"returns":{"_0":"bytes The return value of the underlying call."}}},"version":1},"userdoc":{"kind":"user","methods":{"exec(address,bytes)":{"notice":"Allows for the relayers to make arbitrary calls using this contract. We forward the return value of the underlying function call to allow maximum flexibility in future uses of this contract.If `_to` is an EOA then this function will still call it and return successfully."}},"version":1}},"settings":{"remappings":["@gnosis.pm/safe-contracts-1.3.0/=node_modules/@gnosis.pm/safe-contracts/contracts/","@gnosis.pm/safe-contracts-1.4.1/=node_modules/@gnosis.pm/safe-contracts-1.4.1/contracts/","@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/","ds-test/=node_modules/ds-test/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"contracts/core/PermissionlessRelay.sol":"PermissionlessRelay"},"evmVersion":"istanbul","libraries":{}},"sources":{"contracts/core/PermissionlessRelay.sol":{"keccak256":"0xc81ffbd9fd7cfc82f71518fc48f4d224fd45e405b3af996e3d7ae1e25465ff94","urls":["bzz-raw://db42b8128409205985118a2f6fc3df440ce4c161d442a2a64f2cd5dd71571f87","dweb:/ipfs/Qmf64Pf3EV1b6buUM35WUtz6nR71KUAuU2Y1nhtC3sQaut"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f","urls":["bzz-raw://dc117ce50ea746cab6b97ed1a1facee17a715ae0cb95d67b943dacbaf15176fb","dweb:/ipfs/QmYRZ2UGNYwsHwfNu7Wjr8L2j1LBZ1mKv6NvbwgterYMXc"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57","urls":["bzz-raw://bb2c137c343ef0c4c7ce7b18c1d108afdc9d315a04e48307288d2d05adcbde3a","dweb:/ipfs/QmUxhrAQM3MM3FF5j7AtcXLXguWCJBHJ14BRdVtuoQc8Fh"],"license":"MIT"},"node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol":{"keccak256":"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1","urls":["bzz-raw://41319e7f621f2dc3733511332c4fd032f8e32ad2aa7fd6f665c19741d9941a34","dweb:/ipfs/QmcYR3bd862GD1Bc7jwrU9bGxrhUu5na1oP964bDCu2id1"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0","urls":["bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f","dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b","urls":["bzz-raw://fb0048dee081f6fffa5f74afc3fb328483c2a30504e94a0ddd2a5114d731ec4d","dweb:/ipfs/QmZptt1nmYoA5SgjwnSgWqgUSDgm4q52Yos3xhnMv3MV43"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3","urls":["bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c","dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc","urls":["bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7","dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":59266,"contract":"contracts/core/PermissionlessRelay.sol:PermissionlessRelay","label":"_status","offset":0,"slot":"0","type":"t_uint256"}],"types":{"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"id":1} \ No newline at end of file diff --git a/packages/contracts/contracts/core/PermissionlessRelay.sol b/packages/contracts/contracts/core/PermissionlessRelay.sol new file mode 100644 index 000000000..5b1207d58 --- /dev/null +++ b/packages/contracts/contracts/core/PermissionlessRelay.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.4; + +import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol"; +import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; + +/** + * @title PermissionlessRelay + * @notice A contract used for the `executor` field in the Sphinx Merkle tree which allows permissionless + * execution of signed bundles by any address. This allows the Sphinx backend to work with any relayer account. + */ +contract PermissionlessRelay is ReentrancyGuard { + /** + * @notice Emitted when a call is made. + * + * @param relayer The address of the account that made the call. + * @param to The address of the remote contract. + * @param value The value transferred from the caller to the destination address. + * @param dataHash A keccak256 hash of the input data. + */ + event Called( + address indexed relayer, + address payable indexed to, + uint256 value, + bytes32 indexed dataHash + ); + + /** + * @notice Allows for the relayers to make arbitrary calls using this contract. We forward + * the return value of the underlying function call to allow maximum flexibility in future + * uses of this contract. + * + * @notice If `_to` is an EOA then this function will still call it and return successfully. + * + * @param _to The target address. + * @param _data The data that will be sent. + * + * @return bytes The return value of the underlying call. + */ + function exec( + address payable _to, + bytes calldata _data + ) public payable nonReentrant returns (bytes memory) { + require(_to != address(0), "PermissionlessRelay: target is address(0)"); + + emit Called(msg.sender, _to, msg.value, keccak256(_data)); + + // slither-disable-next-line arbitrary-send-eth + (bool success, bytes memory res) = _to.call{ value: msg.value }(_data); + + if (!success) { + // If the call failed, then decode and forward the revert reason + if (res.length == 0) revert("PermissionlessRelay: Transaction reverted silently"); + assembly { + revert(add(32, res), mload(res)) + } + } else { + return res; + } + } +} diff --git a/packages/contracts/contracts/foundry/Sphinx.sol b/packages/contracts/contracts/foundry/Sphinx.sol index 85c2cd88f..3e9355d48 100644 --- a/packages/contracts/contracts/foundry/Sphinx.sol +++ b/packages/contracts/contracts/foundry/Sphinx.sol @@ -136,7 +136,7 @@ abstract contract Sphinx { FoundryDeploymentInfo memory deploymentInfo = sphinxCollect( ExecutionMode.Platform, - constants.managedServiceAddress(), + constants.permissionlessRelayAddress(), _scriptFunctionCalldata, _callDepth ); @@ -163,7 +163,7 @@ abstract contract Sphinx { // Set the `ManagedService` contract as the deployer. Although this isn't strictly // necessary, it allows us to reuse the DevOps Platform logic for local network // broadcasts. - deployer = constants.managedServiceAddress(); + deployer = constants.permissionlessRelayAddress(); } else { revert("Incorrect execution type."); } diff --git a/packages/contracts/contracts/foundry/SphinxConstants.sol b/packages/contracts/contracts/foundry/SphinxConstants.sol index c2f7deb45..9a2dae322 100644 --- a/packages/contracts/contracts/foundry/SphinxConstants.sol +++ b/packages/contracts/contracts/foundry/SphinxConstants.sol @@ -9,7 +9,7 @@ contract SphinxConstants { address public constant multiSendAddress = 0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761; address public constant createCallAddress = 0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4; address public constant sphinxModuleProxyFactoryAddress = 0x8f3301c9Eada5642B5bB12FD047D3EBb2932E619; - address public constant managedServiceAddress = 0xB5E96127D417b1B3ef8438496a38A143167209c7; + address public constant permissionlessRelayAddress = 0xA2eA7657440875bF916CBFC0cfA88F13e38aD463; address public constant safeFactoryAddress = 0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2; address public constant safeSingletonAddress = 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552; address public constant sphinxModuleImplAddress = 0x8f4E4d51B8050B0ff713eff1F88f3dD8b5e8a530; diff --git a/packages/contracts/package.json b/packages/contracts/package.json index e25f30933..aaf731e5c 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -7,11 +7,6 @@ "files": [ "dist/*", "contracts/*", - "out/build-info/*.json", - "out/ManagedService.sol/*.json", - "out/SphinxModule.sol/*.json", - "out/SphinxModuleProxyFactory.sol/*.json", - "out/SphinxModuleProxyFactory.sol/*.json", "contract-artifacts/**/*.json" ], "scripts": { diff --git a/packages/contracts/scripts/write-constants.ts b/packages/contracts/scripts/write-constants.ts index 5ceeaa1e4..778a71ffb 100644 --- a/packages/contracts/scripts/write-constants.ts +++ b/packages/contracts/scripts/write-constants.ts @@ -2,7 +2,6 @@ import { ethers } from 'ethers' import { remove0x } from '../src/utils' import { - getManagedServiceAddress, getSphinxModuleProxyFactoryAddress, getGnosisSafeProxyFactoryAddress, getGnosisSafeSingletonAddress, @@ -10,6 +9,7 @@ import { getCompatibilityFallbackHandlerAddress, getMultiSendAddress, getSphinxModuleImplAddress, + getPermissionlessRelayAddress, } from '../src/addresses' import { SPHINX_NETWORKS, @@ -45,9 +45,9 @@ const writeConstants = async () => { type: 'address', value: getSphinxModuleProxyFactoryAddress(), }, - managedServiceAddress: { + permissionlessRelayAddress: { type: 'address', - value: getManagedServiceAddress(), + value: getPermissionlessRelayAddress(), }, safeFactoryAddress: { type: 'address', diff --git a/packages/contracts/src/addresses.ts b/packages/contracts/src/addresses.ts index e9ed6833b..5b7be322d 100644 --- a/packages/contracts/src/addresses.ts +++ b/packages/contracts/src/addresses.ts @@ -2,12 +2,10 @@ import { ZeroHash, getCreate2Address, solidityPackedKeccak256, - AbiCoder, ethers, } from 'ethers' import { - ManagedServiceArtifact, SphinxModuleProxyFactoryArtifact, SimulateTxAccessorArtifact, GnosisSafeProxyFactoryArtifact, @@ -20,10 +18,10 @@ import { GnosisSafeArtifact, SphinxModuleArtifact, SignMessageLibArtifact, - DrippieArtifact, CheckBalanceLowArtifact, SphinxModuleProxyFactoryABI, GnosisSafeProxyArtifact, + PermissionlessRelayArtifact, } from './ifaces' import { getOwnerAddress, @@ -35,20 +33,11 @@ export const getManagedServiceConstructorArgs = () => { return [getOwnerAddress()] } -export const getManagedServiceAddress = () => { +export const getPermissionlessRelayAddress = () => { return getCreate2Address( DETERMINISTIC_DEPLOYMENT_PROXY_ADDRESS, ZeroHash, - solidityPackedKeccak256( - ['bytes', 'bytes'], - [ - ManagedServiceArtifact.bytecode, - AbiCoder.defaultAbiCoder().encode( - ['address'], - getManagedServiceConstructorArgs() - ), - ] - ) + solidityPackedKeccak256(['bytes'], [PermissionlessRelayArtifact.bytecode]) ) } @@ -169,21 +158,6 @@ export const getGnosisSafeSingletonAddress = () => { ) } -// Drippie -export const getDrippieAddress = () => { - return getCreate2Address( - DETERMINISTIC_DEPLOYMENT_PROXY_ADDRESS, - ZeroHash, - solidityPackedKeccak256( - ['bytes', 'bytes'], - [ - DrippieArtifact.bytecode, - AbiCoder.defaultAbiCoder().encode(['address'], [getOwnerAddress()]), - ] - ) - ) -} - export const getCheckBalanceLowAddress = () => { return getCreate2Address( DETERMINISTIC_DEPLOYMENT_PROXY_ADDRESS, diff --git a/packages/contracts/src/contract-info.ts b/packages/contracts/src/contract-info.ts index 646e99551..e135582b2 100644 --- a/packages/contracts/src/contract-info.ts +++ b/packages/contracts/src/contract-info.ts @@ -5,17 +5,16 @@ import { CompatibilityFallbackHandlerArtifact, CreateCallArtifact, DefaultCallbackHandlerArtifact, - DrippieArtifact, GnosisSafeArtifact, GnosisSafeL2Artifact, GnosisSafeProxyFactoryArtifact, - ManagedServiceArtifact, MultiSendArtifact, MultiSendCallOnlyArtifact, SimulateTxAccessorArtifact, SphinxModuleProxyFactoryArtifact, SignMessageLibArtifact, SphinxModuleArtifact, + PermissionlessRelayArtifact, } from './ifaces' import { ContractArtifact, @@ -27,19 +26,17 @@ import { getCompatibilityFallbackHandlerAddress, getCreateCallAddress, getDefaultCallbackHandlerAddress, - getDrippieAddress, getGnosisSafeSingletonAddress, getGnosisSafeL2Address, getGnosisSafeProxyFactoryAddress, - getManagedServiceAddress, getMultiSendAddress, getMultiSendCallOnlyAddress, getSignMessageLibAddress, getSimulateTxAccessorAddress, getSphinxModuleImplAddress, getSphinxModuleProxyFactoryAddress, + getPermissionlessRelayAddress, } from './addresses' -import { getOwnerAddress } from './constants' import { remove0x } from './utils' export enum SystemContractType { @@ -71,9 +68,9 @@ export const additionalSystemContractsToVerify: Array = [ export const getSphinxConstants = (): Array => { const contractInfo = [ { - artifact: ManagedServiceArtifact, - expectedAddress: getManagedServiceAddress(), - constructorArgs: [getOwnerAddress()], + artifact: PermissionlessRelayArtifact, + expectedAddress: getPermissionlessRelayAddress(), + constructorArgs: [], type: SystemContractType.SPHINX, }, { @@ -142,12 +139,6 @@ export const getSphinxConstants = (): Array => { constructorArgs: [], type: SystemContractType.GNOSIS_SAFE, }, - { - artifact: DrippieArtifact, - expectedAddress: getDrippieAddress(), - constructorArgs: [getOwnerAddress()], - type: SystemContractType.OPTIMISM, - }, { artifact: CheckBalanceLowArtifact, expectedAddress: getCheckBalanceLowAddress(), diff --git a/packages/contracts/src/ifaces.ts b/packages/contracts/src/ifaces.ts index 0ed13ef29..613b9b2df 100644 --- a/packages/contracts/src/ifaces.ts +++ b/packages/contracts/src/ifaces.ts @@ -2,8 +2,8 @@ import { GnosisSafeContractArtifact } from './types' import { parseFoundryContractArtifact } from './utils' /* eslint-disable @typescript-eslint/no-var-requires */ -export const ManagedServiceArtifact = parseFoundryContractArtifact( - require('../contract-artifacts/sphinx/ManagedService.sol/ManagedService.json') +export const PermissionlessRelayArtifact = parseFoundryContractArtifact( + require('../contract-artifacts/sphinx/PermissionlessRelay.sol/PermissionlessRelay.json') ) export const SphinxModuleArtifact = parseFoundryContractArtifact( require('../contract-artifacts/sphinx/SphinxModule.sol/SphinxModule.json') @@ -12,7 +12,7 @@ export const SphinxModuleProxyFactoryArtifact = parseFoundryContractArtifact( require('../contract-artifacts/sphinx/SphinxModuleProxyFactory.sol/SphinxModuleProxyFactory.json') ) -export const ManagedServiceABI = ManagedServiceArtifact.abi +export const ManagedServiceABI = PermissionlessRelayArtifact.abi export const SphinxModuleABI = SphinxModuleArtifact.abi export const SphinxModuleProxyFactoryABI = SphinxModuleProxyFactoryArtifact.abi diff --git a/packages/contracts/test/SphinxInitCode.sol b/packages/contracts/test/SphinxInitCode.sol index b5d62c808..dd5d7ccc9 100644 --- a/packages/contracts/test/SphinxInitCode.sol +++ b/packages/contracts/test/SphinxInitCode.sol @@ -4,22 +4,60 @@ pragma solidity >=0.6.2 <0.9.0; import { SystemContractInfo } from "../contracts/foundry/SphinxPluginTypes.sol"; contract SphinxInitCode { - function getSystemContractInfo() public pure returns (SystemContractInfo[] memory) { - SystemContractInfo[] memory contracts = new SystemContractInfo[](14); - contracts[0] = SystemContractInfo(hex"60806040523480156200001157600080fd5b506040516200194938038062001949833981810160405281019062000037919062000247565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000b1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a8906200029a565b60405180910390fd5b620000c66000801b82620000cd60201b60201c565b506200036a565b620000df8282620001be60201b60201c565b620001ba57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200015f6200022860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600081519050620002418162000350565b92915050565b6000602082840312156200025a57600080fd5b60006200026a8482850162000230565b91505092915050565b600062000282602a83620002bc565b91506200028f8262000301565b604082019050919050565b60006020820190508181036000830152620002b58162000273565b9050919050565b600082825260208201905092915050565b6000620002da82620002e1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b7f4d616e61676564536572766963653a2061646d696e2063616e6e6f742062652060008201527f6164647265737328302900000000000000000000000000000000000000000000602082015250565b6200035b81620002cd565b81146200036757600080fd5b50565b6115cf806200037a6000396000f3fe6080604052600436106100865760003560e01c806391d148541161005957806391d1485414610157578063926d7d7f14610194578063a217fddf146101bf578063be6002c2146101ea578063d547741f1461021a57610086565b806301ffc9a71461008b578063248a9ca3146100c85780632f2ff15d1461010557806336568abe1461012e575b600080fd5b34801561009757600080fd5b506100b260048036038101906100ad9190610dd7565b610243565b6040516100bf919061103d565b60405180910390f35b3480156100d457600080fd5b506100ef60048036038101906100ea9190610d72565b6102bd565b6040516100fc9190611058565b60405180910390f35b34801561011157600080fd5b5061012c60048036038101906101279190610d9b565b6102dc565b005b34801561013a57600080fd5b5061015560048036038101906101509190610d9b565b6102fd565b005b34801561016357600080fd5b5061017e60048036038101906101799190610d9b565b610380565b60405161018b919061103d565b60405180910390f35b3480156101a057600080fd5b506101a96103ea565b6040516101b69190611058565b60405180910390f35b3480156101cb57600080fd5b506101d461040e565b6040516101e19190611058565b60405180910390f35b61020460048036038101906101ff9190610d1a565b610415565b6040516102119190611073565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190610d9b565b61060f565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806102b657506102b582610630565b5b9050919050565b6000806000838152602001908152602001600020600101549050919050565b6102e5826102bd565b6102ee8161069a565b6102f883836106ae565b505050565b61030561078e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036990611137565b60405180910390fd5b61037c8282610796565b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc481565b6000801b81565b606061041f610877565b7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc46104498161069a565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156104b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b0906110f7565b60405180910390fd5b83836040516104c9929190610fea565b60405180910390208573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d3460405161052e9190611157565b60405180910390a46000808673ffffffffffffffffffffffffffffffffffffffff16348787604051610561929190610fea565b60006040518083038185875af1925050503d806000811461059e576040519150601f19603f3d011682016040523d82523d6000602084013e6105a3565b606091505b5091509150816105fa576000815114156105f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e9906110d7565b60405180910390fd5b805181602001fd5b8093505050506106086108c7565b9392505050565b610618826102bd565b6106218161069a565b61062b8383610796565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6106ab816106a661078e565b6108d0565b50565b6106b88282610380565b61078a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061072f61078e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b6107a08282610380565b1561087357600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061081861078e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600260015414156108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490611117565b60405180910390fd5b6002600181905550565b60018081905550565b6108da8282610380565b610951576108e781610955565b6108f58360001c6020610982565b604051602001610906929190611003565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109489190611095565b60405180910390fd5b5050565b606061097b8273ffffffffffffffffffffffffffffffffffffffff16601460ff16610982565b9050919050565b6060600060028360026109959190611216565b61099f91906111c0565b67ffffffffffffffff8111156109de577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610a105781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110610a6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610af8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002610b389190611216565b610b4291906111c0565b90505b6001811115610c2e577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110610baa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110610be7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080610c2790611342565b9050610b45565b5060008414610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c69906110b7565b60405180910390fd5b8091505092915050565b600081359050610c8b8161153d565b92915050565b600081359050610ca081611554565b92915050565b600081359050610cb58161156b565b92915050565b600081359050610cca81611582565b92915050565b60008083601f840112610ce257600080fd5b8235905067ffffffffffffffff811115610cfb57600080fd5b602083019150836001820283011115610d1357600080fd5b9250929050565b600080600060408486031215610d2f57600080fd5b6000610d3d86828701610c91565b935050602084013567ffffffffffffffff811115610d5a57600080fd5b610d6686828701610cd0565b92509250509250925092565b600060208284031215610d8457600080fd5b6000610d9284828501610ca6565b91505092915050565b60008060408385031215610dae57600080fd5b6000610dbc85828601610ca6565b9250506020610dcd85828601610c7c565b9150509250929050565b600060208284031215610de957600080fd5b6000610df784828501610cbb565b91505092915050565b610e0981611294565b82525050565b610e18816112a0565b82525050565b6000610e2a8385611199565b9350610e37838584611300565b82840190509392505050565b6000610e4e82611172565b610e588185611188565b9350610e6881856020860161130f565b610e718161139b565b840191505092915050565b6000610e878261117d565b610e9181856111a4565b9350610ea181856020860161130f565b610eaa8161139b565b840191505092915050565b6000610ec08261117d565b610eca81856111b5565b9350610eda81856020860161130f565b80840191505092915050565b6000610ef36020836111a4565b9150610efe826113ac565b602082019050919050565b6000610f16602d836111a4565b9150610f21826113d5565b604082019050919050565b6000610f396024836111a4565b9150610f4482611424565b604082019050919050565b6000610f5c6017836111b5565b9150610f6782611473565b601782019050919050565b6000610f7f601f836111a4565b9150610f8a8261149c565b602082019050919050565b6000610fa26011836111b5565b9150610fad826114c5565b601182019050919050565b6000610fc5602f836111a4565b9150610fd0826114ee565b604082019050919050565b610fe4816112f6565b82525050565b6000610ff7828486610e1e565b91508190509392505050565b600061100e82610f4f565b915061101a8285610eb5565b915061102582610f95565b91506110318284610eb5565b91508190509392505050565b60006020820190506110526000830184610e00565b92915050565b600060208201905061106d6000830184610e0f565b92915050565b6000602082019050818103600083015261108d8184610e43565b905092915050565b600060208201905081810360008301526110af8184610e7c565b905092915050565b600060208201905081810360008301526110d081610ee6565b9050919050565b600060208201905081810360008301526110f081610f09565b9050919050565b6000602082019050818103600083015261111081610f2c565b9050919050565b6000602082019050818103600083015261113081610f72565b9050919050565b6000602082019050818103600083015261115081610fb8565b9050919050565b600060208201905061116c6000830184610fdb565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006111cb826112f6565b91506111d6836112f6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561120b5761120a61136c565b5b828201905092915050565b6000611221826112f6565b915061122c836112f6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156112655761126461136c565b5b828202905092915050565b600061127b826112d6565b9050919050565b600061128d826112d6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561132d578082015181840152602081019050611312565b8381111561133c576000848401525b50505050565b600061134d826112f6565b915060008214156113615761136061136c565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4d616e61676564536572766963653a205472616e73616374696f6e207265766560008201527f727465642073696c656e746c7900000000000000000000000000000000000000602082015250565b7f4d616e61676564536572766963653a207461726765742069732061646472657360008201527f7328302900000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61154681611270565b811461155157600080fd5b50565b61155d81611282565b811461156857600080fd5b50565b611574816112a0565b811461157f57600080fd5b50565b61158b816112aa565b811461159657600080fd5b5056fea2646970667358221220e671c3b1c46e395f1d08f7f9c46e9e1a8e6402fd5dddf573a4c24d70e925ea4a64736f6c63430008040033000000000000000000000000226f14c3e19788934ff37c653cf5e24cad198341", 0xB5E96127D417b1B3ef8438496a38A143167209c7); - contracts[1] = SystemContractInfo(hex"60c06040523073ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff1660601b81525034801561004657600080fd5b5060008060001b604051610059906100b9565b8190604051809103906000f5905080158015610079573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050506100c6565b61431b8061091f83390190565b60805160601c60a05160601c6108196101066000396000818161011401526103d00152600081816102540152818161034901526103ae01526108196000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806311ea37fc1461005c5780634501f8db146100785780634c9159b1146100a85780638236d0b8146100c6578063c1059955146100e2575b600080fd5b610076600480360381019061007191906105d1565b610112565b005b610092600480360381019061008d9190610595565b61021f565b60405161009f919061065e565b60405180910390f35b6100b0610347565b6040516100bd919061065e565b60405180910390f35b6100e060048036038101906100db91906105d1565b61036b565b005b6100fc60048036038101906100f79190610546565b610379565b604051610109919061065e565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156101a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610198906106b0565b60405180910390fd5b60006101ae303084610379565b90503073ffffffffffffffffffffffffffffffffffffffff1663610b5925826040518263ffffffff1660e01b81526004016101e9919061065e565b600060405180830381600087803b15801561020357600080fd5b505af1158015610217573d6000803e3d6000fd5b505050505050565b60008083338460405160200161023793929190610679565b6040516020818303038152906040528051906020012090506102797f0000000000000000000000000000000000000000000000000000000000000000826103fe565b91508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f0b28c2323855bc15db8c13b56a44651fbce72c8c916fd653f08851fb9ab1c62a60405160405180910390a38173ffffffffffffffffffffffffffffffffffffffff1663c4d66de8856040518263ffffffff1660e01b815260040161030e919061065e565b600060405180830381600087803b15801561032857600080fd5b505af115801561033c573d6000803e3d6000fd5b505050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610375338261021f565b5050565b60008084848460405160200161039193929190610679565b6040516020818303038152906040528051906020012090506103f47f0000000000000000000000000000000000000000000000000000000000000000827f00000000000000000000000000000000000000000000000000000000000000006104bb565b9150509392505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156104b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ac906106d0565b60405180910390fd5b92915050565b60006040518260388201526f5af43d82803e903d91602b57fd5bf3ff6024820152846014820152733d602d80600a3d3981f3363d3d373d3d3d363d7381528360588201526037600c8201206078820152605560438201209150509392505050565b60008135905061052b816107b5565b92915050565b600081359050610540816107cc565b92915050565b60008060006060848603121561055b57600080fd5b60006105698682870161051c565b935050602061057a8682870161051c565b925050604061058b86828701610531565b9150509250925092565b600080604083850312156105a857600080fd5b60006105b68582860161051c565b92505060206105c785828601610531565b9150509250929050565b6000602082840312156105e357600080fd5b60006105f184828501610531565b91505092915050565b61060381610701565b82525050565b60006106166030836106f0565b91506106218261073d565b604082019050919050565b60006106396017836106f0565b91506106448261078c565b602082019050919050565b61065881610733565b82525050565b600060208201905061067360008301846105fa565b92915050565b600060608201905061068e60008301866105fa565b61069b60208301856105fa565b6106a8604083018461064f565b949350505050565b600060208201905081810360008301526106c981610609565b9050919050565b600060208201905081810360008301526106e98161062c565b9050919050565b600082825260208201905092915050565b600061070c82610713565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b7f537068696e784d6f64756c6550726f7879466163746f72793a206d757374206260008201527f652064656c656761746563616c6c656400000000000000000000000000000000602082015250565b7f455243313136373a2063726561746532206661696c6564000000000000000000600082015250565b6107be81610701565b81146107c957600080fd5b50565b6107d581610733565b81146107e057600080fd5b5056fea264697066735822122066e7b25a147b6fe194a9b2e5464a5f7533dc1922b49ff40749a53baf0b9aee5064736f6c6343000804003360806040523480156200001157600080fd5b5060016000819055506200002a6200003060201b60201c565b620001db565b60018054906101000a900460ff161562000081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000078906200012f565b60405180910390fd5b60ff8016600160009054906101000a900460ff1660ff1614620000f55760ff600160006101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620000ec919062000151565b60405180910390a15b565b6000620001066027836200016e565b915062000113826200018c565b604082019050919050565b62000129816200017f565b82525050565b600060208201905081810360008301526200014a81620000f7565b9050919050565b60006020820190506200016860008301846200011e565b92915050565b600082825260208201905092915050565b600060ff82169050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b61413080620001eb6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638f38f835116100665780638f38f8351461012557806397c4f58914610141578063c4d66de81461015f578063e65ec46d1461017b578063ffa1ad741461019757610093565b80630a04d9e61461009857806329cd7aa9146100b657806372552e49146100d2578063783c567914610107575b600080fd5b6100a06101b5565b6040516100ad9190613534565b60405180910390f35b6100d060048036038101906100cb9190612a03565b6101bb565b005b6100ec60048036038101906100e791906129da565b610a4e565b6040516100fe9695949392919061354f565b60405180910390f35b61010f610b4c565b60405161011c9190613060565b60405180910390f35b61013f600480360381019061013a9190612a03565b610b72565b005b610149611477565b6040516101569190613135565b60405180910390f35b61017960048036038101906101749190612726565b61147d565b005b61019560048036038101906101909190612970565b611828565b005b61019f611fea565b6040516101ac9190613210565b60405180910390f35b60035481565b6101c3612023565b6000801b831415610209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020090613292565b60405180910390fd5b6000801b6004541415610251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610248906133d2565b60405180910390fd5b6000600260008581526020019081526020016000209050600060048111156102a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160030160149054906101000a900460ff1660048111156102ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461032c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032390613392565b60405180910390fd5b60008360000151905061034c84602001518661034784612073565b6120c9565b61038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906134b2565b60405180910390fd5b6002808111156103c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81604001516002811115610401577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610438906132f2565b60405180910390fd5b6000816020015114610488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047f90613232565b60405180910390fd5b60008060008060008086606001518060200190518101906104a99190612778565b955095509550955095509550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053c90613492565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105aa906134f2565b60405180910390fd5b60035484146105f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ee90613432565b60405180910390fd5b600454831461063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290613412565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146106a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a090613252565b60405180910390fd5b468760000151146106ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690613312565b60405180910390fd5b83838c7fbd735b1d507113b14844a118f9b9938b54610adafc574e9cdcd67335131ad717338560405161072392919061307b565b60405180910390a460036002600085815260200190815260200160002060030160146101000a81548160ff0219169083600481111561078b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506000801b6004819055508a7f4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff6360405160405180910390a26001886000018190555060018860010181905550808860020190805190602001906107f39291906121cb565b50338860030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028860030160146101000a81548160ff02191690836004811115610885577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506001840160038190555060007fb03948446334eb9b2196d5eb166f69b9d49403eb4a12f36de8d3f9f3cb8e15c36040518060400160405280600681526020017f537068696e780000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508051906020012060405160200161094393929190613179565b604051602081830303815290604052805190602001207f0cb314254867c611b4ba06dea78882bd68b33649e1ddb950d6db2ee328a55ad08d60405160200161098c929190613150565b604051602081830303815290604052805190602001206040516020016109b3929190613029565b60405160208183030381529060405290508673ffffffffffffffffffffffffffffffffffffffff1663934f3a118280519060200120838d6040518463ffffffff1660e01b8152600401610a08939291906131b0565b60006040518083038186803b158015610a2057600080fd5b505afa158015610a34573d6000803e3d6000fd5b50505050505050505050505050610a496120e0565b505050565b6002602052806000526040600020600091509050806000015490806001015490806002018054610a7d906138ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa9906138ff565b8015610af65780601f10610acb57610100808354040283529160200191610af6565b820191906000526020600020905b815481529060010190602001808311610ad957829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160149054906101000a900460ff16908060030160159054906101000a900460ff16905086565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b7a612023565b6000801b831415610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790613292565b60405180910390fd5b6000801b60045414610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe906133f2565b60405180910390fd5b600060026000858152602001908152602001600020905060006004811115610c58577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160030160149054906101000a900460ff166004811115610ca2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613392565b60405180910390fd5b600083600001519050610d02846020015186610cfd84612073565b6120c9565b610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d38906134b2565b60405180910390fd5b60006002811115610d7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81604001516002811115610db8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def906132f2565b60405180910390fd5b6000816020015114610e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3690613232565b60405180910390fd5b60008060008060008060008760600151806020019051810190610e629190612819565b9650965096509650965096509650600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef790613492565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f65906134f2565b60405180910390fd5b6003548514610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990613432565b60405180910390fd5b60008411610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613472565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105a90613252565b60405180910390fd5b46886000015114806110725750805b6110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a890613312565b60405180910390fd5b8015806110c2575060008860000151145b611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890613452565b60405180910390fd5b848c7f382c7aec02462c9b086aba9a7f8dbb1fb8bf336e7b624b0149eeca6726d0fb4a338786604051611136939291906130f7565b60405180910390a383896000018190555060018960010181905550818960020190805190602001906111699291906121cb565b50338960030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808960030160156101000a81548160ff021916908315150217905550600185016003819055506001841415611261578b7f4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff6360405160405180910390a260028960030160146101000a81548160ff02191690836004811115611257577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112bc565b60018960030160146101000a81548160ff021916908360048111156112af577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055508b6004819055505b60007fb03948446334eb9b2196d5eb166f69b9d49403eb4a12f36de8d3f9f3cb8e15c36040518060400160405280600681526020017f537068696e780000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508051906020012060405160200161136b93929190613179565b604051602081830303815290604052805190602001207f0cb314254867c611b4ba06dea78882bd68b33649e1ddb950d6db2ee328a55ad08e6040516020016113b4929190613150565b604051602081830303815290604052805190602001206040516020016113db929190613029565b60405160208183030381529060405290508773ffffffffffffffffffffffffffffffffffffffff1663934f3a118280519060200120838e6040518463ffffffff1660e01b8152600401611430939291906131b0565b60006040518083038186803b15801561144857600080fd5b505afa15801561145c573d6000803e3d6000fd5b50505050505050505050505050506114726120e0565b505050565b60045481565b600060018054906101000a900460ff161590508080156114ae575060018060009054906101000a900460ff1660ff16105b806114dc57506114bd306120ea565b1580156114db575060018060009054906101000a900460ff1660ff16145b5b61151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290613372565b60405180910390fd5b60018060006101000a81548160ff021916908360ff16021790555080156115575760018060016101000a81548160ff0219169083151502179055505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be906133b2565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1663a619486e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561160f57600080fd5b505afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611647919061274f565b905060008173ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b15801561169157600080fd5b505afa1580156116a5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116ce9190612a82565b90506000816040516020016116e39190613012565b6040516020818303038152906040528051906020012090507f6a08c3e203132c561752255a4d52ffae85bb9c5d33cb3291520dea1b8435638981148061174857507f7015c1a48403d132ad83884b326109f1b309c42f752b2abd1db79522ee07467381145b611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e90613332565b60405180910390fd5b84600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505080156118245760006001806101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161181b91906131f5565b60405180910390a15b5050565b611830612023565b60008151905060008111611879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187090613272565b60405180910390fd5b600060045490506000801b8114156118c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bd906132b2565b60405180910390fd5b60006002600083815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690613252565b60405180910390fd5b600081600101549050838161198491906136ea565b826000015410156119ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c1906132d2565b60405180910390fd5b60008260030160159054906101000a900460ff1690506119e8612251565b606060005b87811015611f3657888181518110611a2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001519250888181518110611a75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001519150611a968288611a9186612073565b6120c9565b611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc906134b2565b60405180910390fd5b60016002811115611b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b83604001516002811115611b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b83906132f2565b60405180910390fd5b84836020015114611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990613232565b60405180910390fd5b4683600001511480611be15750835b611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790613312565b60405180910390fd5b831580611c31575060008360000151145b611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613452565b60405180910390fd5b6000806000806000808860600151806020019051810190611c9191906128cf565b95509550955095509550955060018b611caa91906136ea565b9a506000612710603f604087611cc09190613771565b611cca9190613740565b611cd491906136ea565b5a1015611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90613352565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663468721a786898988886040518663ffffffff1660e01b8152600401611d7894939291906130ab565b602060405180830381600088803b158015611d9257600080fd5b5087f193505050508015611dc457506040513d601f19601f82011682018060405250810190611dc191906129b1565b60015b611dcd57611dd2565b809150505b8015611e19578d7fa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa078b60200151604051611e0c9190613534565b60405180910390a2611e56565b8d7f05612698ed8f42586165f420abc8164c188065d389e9ba48b1df7795b5a21d4d8b60200151604051611e4d9190613534565b60405180910390a25b80158015611e615750815b15611f1c578d7f32188c23fa533cb5bdaaf4eb969c99d38e0faf67f824e694d3d53c3ad5104fa08b60200151604051611e9a9190613534565b60405180910390a260048d60030160146101000a81548160ff02191690836004811115611ef0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055508b8d600101819055506000801b600481905550505050505050505050505050505050611fdf565b505050505050508080611f2e90613962565b9150506119ed565b508385600101819055508460000154841415611fd757857f4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff6360405160405180910390a260028560030160146101000a81548160ff02191690836004811115611fc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506000801b6004819055505b505050505050505b611fe76120e0565b50565b6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60026000541415612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612060906134d2565b60405180910390fd5b6002600081905550565b6000816040516020016120869190613512565b604051602081830303815290604052805190602001206040516020016120ac9190612ff7565b604051602081830303815290604052805190602001209050919050565b6000826120d6858461210d565b1490509392505050565b6001600081905550565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b845181101561217e576121698286838151811061215c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612189565b9150808061217690613962565b915050612116565b508091505092915050565b60008183106121a15761219c82846121b4565b6121ac565b6121ab83836121b4565b5b905092915050565b600082600052816020526040600020905092915050565b8280546121d7906138ff565b90600052602060002090601f0160209004810192826121f95760008555612240565b82601f1061221257805160ff1916838001178555612240565b82800160010185558215612240579182015b8281111561223f578251825591602001919060010190612224565b5b50905061224d91906122b1565b5090565b60405180608001604052806000815260200160008152602001600060028111156122a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001606081525090565b5b808211156122ca5760008160009055506001016122b2565b5090565b60006122e16122dc846135dc565b6135b7565b9050808382526020820190508285602086028201111561230057600080fd5b60005b8581101561233057816123168882612522565b845260208401935060208301925050600181019050612303565b5050509392505050565b600061234d61234884613608565b6135b7565b9050808382526020820190508285602086028201111561236c57600080fd5b60005b858110156123b657813567ffffffffffffffff81111561238e57600080fd5b80860161239b89826125f4565b8552602085019450602084019350505060018101905061236f565b5050509392505050565b60006123d36123ce84613634565b6135b7565b9050828152602081018484840111156123eb57600080fd5b6123f68482856138bd565b509392505050565b600061241161240c84613634565b6135b7565b90508281526020810184848401111561242957600080fd5b6124348482856138cc565b509392505050565b600061244f61244a84613665565b6135b7565b90508281526020810184848401111561246757600080fd5b6124728482856138cc565b509392505050565b60008135905061248981614067565b92915050565b60008151905061249e81614067565b92915050565b6000815190506124b38161407e565b92915050565b600082601f8301126124ca57600080fd5b81356124da8482602086016122ce565b91505092915050565b600082601f8301126124f457600080fd5b813561250484826020860161233a565b91505092915050565b60008151905061251c81614095565b92915050565b600081359050612531816140ac565b92915050565b600081519050612546816140ac565b92915050565b600082601f83011261255d57600080fd5b813561256d8482602086016123c0565b91505092915050565b600082601f83011261258757600080fd5b81516125978482602086016123fe565b91505092915050565b6000815190506125af816140c3565b92915050565b6000813590506125c4816140d3565b92915050565b600082601f8301126125db57600080fd5b81516125eb84826020860161243c565b91505092915050565b60006040828403121561260657600080fd5b61261060406135b7565b9050600082013567ffffffffffffffff81111561262c57600080fd5b61263884828501612670565b600083015250602082013567ffffffffffffffff81111561265857600080fd5b612664848285016124b9565b60208301525092915050565b60006080828403121561268257600080fd5b61268c60806135b7565b9050600061269c848285016126fc565b60008301525060206126b0848285016126fc565b60208301525060406126c4848285016125b5565b604083015250606082013567ffffffffffffffff8111156126e457600080fd5b6126f08482850161254c565b60608301525092915050565b60008135905061270b816140e3565b92915050565b600081519050612720816140e3565b92915050565b60006020828403121561273857600080fd5b60006127468482850161247a565b91505092915050565b60006020828403121561276157600080fd5b600061276f8482850161248f565b91505092915050565b60008060008060008060c0878903121561279157600080fd5b600061279f89828a016124a4565b96505060206127b089828a016124a4565b95505060406127c189828a01612711565b94505060606127d289828a01612537565b93505060806127e389828a016124a4565b92505060a087015167ffffffffffffffff81111561280057600080fd5b61280c89828a016125ca565b9150509295509295509295565b600080600080600080600060e0888a03121561283457600080fd5b60006128428a828b016124a4565b97505060206128538a828b016124a4565b96505060406128648a828b01612711565b95505060606128758a828b01612711565b94505060806128868a828b016124a4565b93505060a088015167ffffffffffffffff8111156128a357600080fd5b6128af8a828b016125ca565b92505060c06128c08a828b0161250d565b91505092959891949750929550565b60008060008060008060c087890312156128e857600080fd5b60006128f689828a016124a4565b965050602061290789828a01612711565b955050604061291889828a01612711565b945050606087015167ffffffffffffffff81111561293557600080fd5b61294189828a01612576565b935050608061295289828a016125a0565b92505060a061296389828a0161250d565b9150509295509295509295565b60006020828403121561298257600080fd5b600082013567ffffffffffffffff81111561299c57600080fd5b6129a8848285016124e3565b91505092915050565b6000602082840312156129c357600080fd5b60006129d18482850161250d565b91505092915050565b6000602082840312156129ec57600080fd5b60006129fa84828501612522565b91505092915050565b600080600060608486031215612a1857600080fd5b6000612a2686828701612522565b935050602084013567ffffffffffffffff811115612a4357600080fd5b612a4f868287016125f4565b925050604084013567ffffffffffffffff811115612a6c57600080fd5b612a788682870161254c565b9150509250925092565b600060208284031215612a9457600080fd5b600082015167ffffffffffffffff811115612aae57600080fd5b612aba848285016125ca565b91505092915050565b612acc816137dd565b82525050565b612adb816137cb565b82525050565b612aea816137ef565b82525050565b612af9816137fb565b82525050565b612b10612b0b826137fb565b6139ab565b82525050565b6000612b2182613696565b612b2b81856136ac565b9350612b3b8185602086016138cc565b612b4481613aa0565b840191505092915050565b6000612b5a82613696565b612b6481856136bd565b9350612b748185602086016138cc565b612b7d81613aa0565b840191505092915050565b612b9181613875565b82525050565b612ba081613887565b82525050565b612baf81613899565b82525050565b612bbe816138ab565b82525050565b6000612bcf826136a1565b612bd981856136ce565b9350612be98185602086016138cc565b612bf281613aa0565b840191505092915050565b6000612c08826136a1565b612c1281856136df565b9350612c228185602086016138cc565b80840191505092915050565b6000612c3b6020836136ce565b9150612c4682613ab1565b602082019050919050565b6000612c5e6023836136ce565b9150612c6982613ada565b604082019050919050565b6000612c816002836136df565b9150612c8c82613b29565b600282019050919050565b6000612ca46022836136ce565b9150612caf82613b52565b604082019050919050565b6000612cc7601a836136ce565b9150612cd282613ba1565b602082019050919050565b6000612cea601c836136ce565b9150612cf582613bca565b602082019050919050565b6000612d0d6026836136ce565b9150612d1882613bf3565b604082019050919050565b6000612d30601f836136ce565b9150612d3b82613c42565b602082019050919050565b6000612d53601e836136ce565b9150612d5e82613c6b565b602082019050919050565b6000612d766022836136ce565b9150612d8182613c94565b604082019050919050565b6000612d99601e836136ce565b9150612da482613ce3565b602082019050919050565b6000612dbc602e836136ce565b9150612dc782613d0c565b604082019050919050565b6000612ddf601f836136ce565b9150612dea82613d5b565b602082019050919050565b6000612e026022836136ce565b9150612e0d82613d84565b604082019050919050565b6000612e25601f836136ce565b9150612e3082613dd3565b602082019050919050565b6000612e486020836136ce565b9150612e5382613dfc565b602082019050919050565b6000612e6b6024836136ce565b9150612e7682613e25565b604082019050919050565b6000612e8e601b836136ce565b9150612e9982613e74565b602082019050919050565b6000612eb16025836136ce565b9150612ebc82613e9d565b604082019050919050565b6000612ed46023836136ce565b9150612edf82613eec565b604082019050919050565b6000612ef7601f836136ce565b9150612f0282613f3b565b602082019050919050565b6000612f1a6023836136ce565b9150612f2582613f64565b604082019050919050565b6000612f3d601f836136ce565b9150612f4882613fb3565b602082019050919050565b6000612f606027836136ce565b9150612f6b82613fdc565b604082019050919050565b6000608083016000830151612f8e6000860182612fd9565b506020830151612fa16020860182612fd9565b506040830151612fb46040860182612ba6565b5060608301518482036060860152612fcc8282612b16565b9150508091505092915050565b612fe28161385e565b82525050565b612ff18161385e565b82525050565b60006130038284612aff565b60208201915081905092915050565b600061301e8284612bfd565b915081905092915050565b600061303482612c74565b91506130408285612aff565b6020820191506130508284612aff565b6020820191508190509392505050565b60006020820190506130756000830184612ac3565b92915050565b60006040820190506130906000830185612ad2565b81810360208301526130a28184612bc4565b90509392505050565b60006080820190506130c06000830187612ad2565b6130cd6020830186612fe8565b81810360408301526130df8185612b4f565b90506130ee6060830184612b97565b95945050505050565b600060608201905061310c6000830186612ad2565b6131196020830185612fe8565b818103604083015261312b8184612bc4565b9050949350505050565b600060208201905061314a6000830184612af0565b92915050565b60006040820190506131656000830185612af0565b6131726020830184612af0565b9392505050565b600060608201905061318e6000830186612af0565b61319b6020830185612af0565b6131a86040830184612af0565b949350505050565b60006060820190506131c56000830186612af0565b81810360208301526131d78185612b4f565b905081810360408301526131eb8184612b4f565b9050949350505050565b600060208201905061320a6000830184612bb5565b92915050565b6000602082019050818103600083015261322a8184612bc4565b905092915050565b6000602082019050818103600083015261324b81612c2e565b9050919050565b6000602082019050818103600083015261326b81612c51565b9050919050565b6000602082019050818103600083015261328b81612c97565b9050919050565b600060208201905081810360008301526132ab81612cba565b9050919050565b600060208201905081810360008301526132cb81612cdd565b9050919050565b600060208201905081810360008301526132eb81612d00565b9050919050565b6000602082019050818103600083015261330b81612d23565b9050919050565b6000602082019050818103600083015261332b81612d46565b9050919050565b6000602082019050818103600083015261334b81612d69565b9050919050565b6000602082019050818103600083015261336b81612d8c565b9050919050565b6000602082019050818103600083015261338b81612daf565b9050919050565b600060208201905081810360008301526133ab81612dd2565b9050919050565b600060208201905081810360008301526133cb81612df5565b9050919050565b600060208201905081810360008301526133eb81612e18565b9050919050565b6000602082019050818103600083015261340b81612e3b565b9050919050565b6000602082019050818103600083015261342b81612e5e565b9050919050565b6000602082019050818103600083015261344b81612e81565b9050919050565b6000602082019050818103600083015261346b81612ea4565b9050919050565b6000602082019050818103600083015261348b81612ec7565b9050919050565b600060208201905081810360008301526134ab81612eea565b9050919050565b600060208201905081810360008301526134cb81612f0d565b9050919050565b600060208201905081810360008301526134eb81612f30565b9050919050565b6000602082019050818103600083015261350b81612f53565b9050919050565b6000602082019050818103600083015261352c8184612f76565b905092915050565b60006020820190506135496000830184612fe8565b92915050565b600060c0820190506135646000830189612fe8565b6135716020830188612fe8565b81810360408301526135838187612bc4565b90506135926060830186612ad2565b61359f6080830185612b88565b6135ac60a0830184612ae1565b979650505050505050565b60006135c16135d2565b90506135cd8282613931565b919050565b6000604051905090565b600067ffffffffffffffff8211156135f7576135f6613a71565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561362357613622613a71565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561364f5761364e613a71565b5b61365882613aa0565b9050602081019050919050565b600067ffffffffffffffff8211156136805761367f613a71565b5b61368982613aa0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006136f58261385e565b91506137008361385e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613735576137346139b5565b5b828201905092915050565b600061374b8261385e565b91506137568361385e565b925082613766576137656139e4565b5b828204905092915050565b600061377c8261385e565b91506137878361385e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137c0576137bf6139b5565b5b828202905092915050565b60006137d68261383e565b9050919050565b60006137e88261383e565b9050919050565b60008115159050919050565b6000819050919050565b60008190506138138261402b565b919050565b60008190506138268261403f565b919050565b600081905061383982614053565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061388082613805565b9050919050565b600061389282613818565b9050919050565b60006138a48261382b565b9050919050565b60006138b682613868565b9050919050565b82818337600083830152505050565b60005b838110156138ea5780820151818401526020810190506138cf565b838111156138f9576000848401525b50505050565b6000600282049050600182168061391757607f821691505b6020821081141561392b5761392a613a42565b5b50919050565b61393a82613aa0565b810181811067ffffffffffffffff8211171561395957613958613a71565b5b80604052505050565b600061396d8261385e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139a05761399f6139b5565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537068696e784d6f64756c653a20696e76616c6964206c65616620696e646578600082015250565b7f537068696e784d6f64756c653a2063616c6c65722069736e277420657865637560008201527f746f720000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f537068696e784d6f64756c653a206e6f206c656176657320746f20657865637560008201527f7465000000000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e76616c696420726f6f74000000000000600082015250565b7f537068696e784d6f64756c653a206e6f2061637469766520726f6f7400000000600082015250565b7f537068696e784d6f64756c653a206578747261206c6561766573206e6f74206160008201527f6c6c6f7765640000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e76616c6964206c656166207479706500600082015250565b7f537068696e784d6f64756c653a20696e76616c696420636861696e2069640000600082015250565b7f537068696e784d6f64756c653a20696e76616c6964205361666520766572736960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e73756666696369656e74206761730000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20726f6f7420616c7265616479207573656400600082015250565b7f537068696e784d6f64756c653a20696e76616c6964205361666520616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a206e6f20726f6f7420746f2063616e63656c00600082015250565b7f537068696e784d6f64756c653a20616374697665206d65726b6c6520726f6f74600082015250565b7f537068696e784d6f64756c653a20696e76616c696420726f6f7420746f20636160008201527f6e63656c00000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e76616c6964206e6f6e63650000000000600082015250565b7f537068696e784d6f64756c653a206c65616620636861696e206964206d75737460008201527f2062652030000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a206e756d4c65617665732063616e6e6f74206260008201527f6520300000000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e76616c6964205361666550726f787900600082015250565b7f537068696e784d6f64756c653a206661696c656420746f20766572696679206c60008201527f6561660000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f537068696e784d6f64756c653a20696e76616c696420537068696e784d6f647560008201527f6c6550726f787900000000000000000000000000000000000000000000000000602082015250565b6005811061403c5761403b613a13565b5b50565b600281106140505761404f613a13565b5b50565b6003811061406457614063613a13565b5b50565b614070816137cb565b811461407b57600080fd5b50565b614087816137dd565b811461409257600080fd5b50565b61409e816137ef565b81146140a957600080fd5b50565b6140b5816137fb565b81146140c057600080fd5b50565b600281106140d057600080fd5b50565b600381106140e057600080fd5b50565b6140ec8161385e565b81146140f757600080fd5b5056fea26469706673582212204e7cbc9883288763a0a52ee490bf0d3f2a67d12b48b8b730701eae2220c2e67c64736f6c63430008040033", 0x8f3301c9Eada5642B5bB12FD047D3EBb2932E619); - contracts[2] = SystemContractInfo(hex"60a060405234801561001057600080fd5b503073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060805160601c6103526100656000398061017052506103526000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80631c5fb21114610030575b600080fd5b6100de6004803603608081101561004657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561008d57600080fd5b82018360208201111561009f57600080fd5b803590602001918460018302840111640100000000831117156100c157600080fd5b9091929391929390803560ff169060200190929190505050610169565b60405180848152602001831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561012c578082015181840152602081019050610111565b50505050905090810190601f1680156101595780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806102e46039913960400191505060405180910390fd5b60005a9050610269898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050885a610297565b92505a8103935060405160203d0181016040523d81523d6000602083013e8092505050955095509592505050565b60006001808111156102a557fe5b8360018111156102b157fe5b14156102ca576000808551602087018986f490506102da565b600080855160208701888a87f190505b9594505050505056fe53696d756c61746554784163636573736f722073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca2646970667358221220405c212754c23731ee9658f3175dafa74dea363d2619aad9d5576f5a9d4982f764736f6c63430007060033", 0x59AD6735bCd8152B84860Cb256dD9e96b85F69Da); - contracts[3] = SystemContractInfo(hex"608060405234801561001057600080fd5b50610ebe806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631688f0b9146100675780632500510e1461017657806353e5d9351461024357806361b69abd146102c6578063addacc0f146103cb578063d18af54d1461044e575b600080fd5b61014a6004803603606081101561007d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156100ba57600080fd5b8201836020820111156100cc57600080fd5b803590602001918460018302840111640100000000831117156100ee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061057d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102176004803603606081101561018c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101c957600080fd5b8201836020820111156101db57600080fd5b803590602001918460018302840111640100000000831117156101fd57600080fd5b909192939192939080359060200190929190505050610624565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61024b610751565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561028b578082015181840152602081019050610270565b50505050905090810190601f1680156102b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61039f600480360360408110156102dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561031957600080fd5b82018360208201111561032b57600080fd5b8035906020019184600183028401116401000000008311171561034d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061077c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d3610861565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104135780820151818401526020810190506103f8565b50505050905090810190601f1680156104405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105516004803603608081101561046457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156104a157600080fd5b8201836020820111156104b357600080fd5b803590602001918460018302840111640100000000831117156104d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061088c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600061058a848484610a3b565b90506000835111156105b25760008060008551602087016000865af114156105b157600080fd5b5b7f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2358185604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a19392505050565b60006106758585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505084610a3b565b905080604051602001808273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156107165780820151818401526020810190506106fb565b50505050905090810190601f1680156107435780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60606040518060200161076390610bde565b6020820181038252601f19601f82011660405250905090565b60008260405161078b90610bde565b808273ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f0801580156107c7573d6000803e3d6000fd5b5090506000825111156107f05760008060008451602086016000865af114156107ef57600080fd5b5b7f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2358184604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a192915050565b60606040518060200161087390610beb565b6020820181038252601f19601f82011660405250905090565b6000808383604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012060001c90506108e786868361057d565b9150600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a32578273ffffffffffffffffffffffffffffffffffffffff16631e52b518838888886040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156109ca5780820151818401526020810190506109af565b50505050905090810190601f1680156109f75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015610a1957600080fd5b505af1158015610a2d573d6000803e3d6000fd5b505050505b50949350505050565b6000808380519060200120836040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050600060405180602001610a8890610bde565b6020820181038252601f19601f820116604052508673ffffffffffffffffffffffffffffffffffffffff166040516020018083805190602001908083835b60208310610ae95780518252602082019150602081019050602083039250610ac6565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001925050506040516020818303038152906040529050818151826020016000f59250600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f437265617465322063616c6c206661696c65640000000000000000000000000081525060200191505060405180910390fd5b50509392505050565b6101e680610bf883390190565b60ab80610dde8339019056fe608060405234801561001057600080fd5b506040516101e63803806101e68339818101604052602081101561003357600080fd5b8101908080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156100ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806101c46022913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060ab806101196000396000f3fe608060405273ffffffffffffffffffffffffffffffffffffffff600054167fa619486e0000000000000000000000000000000000000000000000000000000060003514156050578060005260206000f35b3660008037600080366000845af43d6000803e60008114156070573d6000fd5b3d6000f3fea2646970667358221220d1429297349653a4918076d650332de1a1068c5f3e07c5c82360c277770b955264736f6c63430007060033496e76616c69642073696e676c65746f6e20616464726573732070726f7669646564608060405273ffffffffffffffffffffffffffffffffffffffff600054167fa619486e0000000000000000000000000000000000000000000000000000000060003514156050578060005260206000f35b3660008037600080366000845af43d6000803e60008114156070573d6000fd5b3d6000f3fea2646970667358221220d1429297349653a4918076d650332de1a1068c5f3e07c5c82360c277770b955264736f6c63430007060033a26469706673582212200c75fe2196b9f752c82794253f2ebce0d821afef5997e1d5a35ec316ce592f6664736f6c63430007060033", 0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2); - contracts[4] = SystemContractInfo(hex"608060405234801561001057600080fd5b506108dd806100206000396000f3fe608060405234801561001057600080fd5b506004361061007c5760003560e01c8063a3f4df7e1161005b578063a3f4df7e14610312578063bc197c8114610395578063f23a6e611461052b578063ffa1ad741461062b5761007c565b806223de291461008157806301ffc9a7146101b9578063150b7a021461021c575b600080fd5b6101b7600480360360c081101561009757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561011e57600080fd5b82018360208201111561013057600080fd5b8035906020019184600183028401116401000000008311171561015257600080fd5b90919293919293908035906020019064010000000081111561017357600080fd5b82018360208201111561018557600080fd5b803590602001918460018302840111640100000000831117156101a757600080fd5b90919293919293905050506106ae565b005b610204600480360360208110156101cf57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506106b8565b60405180821515815260200191505060405180910390f35b6102dd6004803603608081101561023257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561029957600080fd5b8201836020820111156102ab57600080fd5b803590602001918460018302840111640100000000831117156102cd57600080fd5b90919293919293905050506107f2565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61031a610807565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035a57808201518184015260208101905061033f565b50505050905090810190601f1680156103875780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104f6600480360360a08110156103ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561040857600080fd5b82018360208201111561041a57600080fd5b8035906020019184602083028401116401000000008311171561043c57600080fd5b90919293919293908035906020019064010000000081111561045d57600080fd5b82018360208201111561046f57600080fd5b8035906020019184602083028401116401000000008311171561049157600080fd5b9091929391929390803590602001906401000000008111156104b257600080fd5b8201836020820111156104c457600080fd5b803590602001918460018302840111640100000000831117156104e657600080fd5b9091929391929390505050610840565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6105f6600480360360a081101561054157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001906401000000008111156105b257600080fd5b8201836020820111156105c457600080fd5b803590602001918460018302840111640100000000831117156105e657600080fd5b9091929391929390505050610858565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61063361086e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610673578082015181840152602081019050610658565b50505050905090810190601f1680156106a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b5050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078357507f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107eb57507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600063150b7a0260e01b905095945050505050565b6040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b600063bc197c8160e01b905098975050505050505050565b600063f23a6e6160e01b90509695505050505050565b6040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508156fea26469706673582212200bbabd2b02039e0c6d17ac82e70232971fd892df99a0509daa50ef3d6edad0bc64736f6c63430007060033", 0x1AC114C2099aFAf5261731655Dc6c306bFcd4Dbd); - contracts[5] = SystemContractInfo(hex"608060405234801561001057600080fd5b50611574806100206000396000f3fe608060405234801561001057600080fd5b50600436106100ce5760003560e01c80636ac247841161008c578063bc197c8111610066578063bc197c81146107bb578063bd61951d14610951578063f23a6e6114610a63578063ffa1ad7414610b63576100ce565b80636ac24784146105ea578063a3f4df7e146106d9578063b2494df31461075c576100ce565b806223de29146100d357806301ffc9a71461020b5780630a1028c41461026e578063150b7a021461033d5780631626ba7e1461043357806320c13b0b146104e9575b600080fd5b610209600480360360c08110156100e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561017057600080fd5b82018360208201111561018257600080fd5b803590602001918460018302840111640100000000831117156101a457600080fd5b9091929391929390803590602001906401000000008111156101c557600080fd5b8201836020820111156101d757600080fd5b803590602001918460018302840111640100000000831117156101f957600080fd5b9091929391929390505050610be6565b005b6102566004803603602081101561022157600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610bf0565b60405180821515815260200191505060405180910390f35b6103276004803603602081101561028457600080fd5b81019080803590602001906401000000008111156102a157600080fd5b8201836020820111156102b357600080fd5b803590602001918460018302840111640100000000831117156102d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d2a565b6040518082815260200191505060405180910390f35b6103fe6004803603608081101561035357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103ba57600080fd5b8201836020820111156103cc57600080fd5b803590602001918460018302840111640100000000831117156103ee57600080fd5b9091929391929390505050610d3d565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6104b46004803603604081101561044957600080fd5b81019080803590602001909291908035906020019064010000000081111561047057600080fd5b82018360208201111561048257600080fd5b803590602001918460018302840111640100000000831117156104a457600080fd5b9091929391929390505050610d52565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6105b5600480360360408110156104ff57600080fd5b810190808035906020019064010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184600183028401116401000000008311171561055057600080fd5b90919293919293908035906020019064010000000081111561057157600080fd5b82018360208201111561058357600080fd5b803590602001918460018302840111640100000000831117156105a557600080fd5b9091929391929390505050610f0a565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6106c36004803603604081101561060057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561063d57600080fd5b82018360208201111561064f57600080fd5b8035906020019184600183028401116401000000008311171561067157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061115b565b6040518082815260200191505060405180910390f35b6106e16112cd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610721578082015181840152602081019050610706565b50505050905090810190601f16801561074e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610764611306565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107a757808201518184015260208101905061078c565b505050509050019250505060405180910390f35b61091c600480360360a08110156107d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561082e57600080fd5b82018360208201111561084057600080fd5b8035906020019184602083028401116401000000008311171561086257600080fd5b90919293919293908035906020019064010000000081111561088357600080fd5b82018360208201111561089557600080fd5b803590602001918460208302840111640100000000831117156108b757600080fd5b9091929391929390803590602001906401000000008111156108d857600080fd5b8201836020820111156108ea57600080fd5b8035906020019184600183028401116401000000008311171561090c57600080fd5b909192939192939050505061146d565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6109e86004803603604081101561096757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109a457600080fd5b8201836020820111156109b657600080fd5b803590602001918460018302840111640100000000831117156109d857600080fd5b9091929391929390505050611485565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a28578082015181840152602081019050610a0d565b50505050905090810190601f168015610a555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b2e600480360360a0811015610a7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610aea57600080fd5b820183602082011115610afc57600080fd5b80359060200191846001830284011164010000000083111715610b1e57600080fd5b90919293919293905050506114ef565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b610b6b611505565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bab578082015181840152602081019050610b90565b50505050905090810190601f168015610bd85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b5050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cbb57507f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d2357507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000610d36338361115b565b9050919050565b600063150b7a0260e01b905095945050505050565b60008033905060008173ffffffffffffffffffffffffffffffffffffffff166320c13b0b876040516020018082815260200191505060405160208183030381529060405287876040518463ffffffff1660e01b8152600401808060200180602001838103835286818151815260200191508051906020019080838360005b83811015610deb578082015181840152602081019050610dd0565b50505050905090810190601f168015610e185780820380516001836020036101000a031916815260200191505b508381038252858582818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060206040518083038186803b158015610e6357600080fd5b505afa158015610e77573d6000803e3d6000fd5b505050506040513d6020811015610e8d57600080fd5b810190808051906020019092919050505090506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610ef657600060e01b610eff565b631626ba7e60e01b5b925050509392505050565b6000803390506000610f608288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061115b565b905060008585905014156110755760008273ffffffffffffffffffffffffffffffffffffffff16635ae6bd37836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fc157600080fd5b505afa158015610fd5573d6000803e3d6000fd5b505050506040513d6020811015610feb57600080fd5b81019080805190602001909291905050501415611070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f48617368206e6f7420617070726f76656400000000000000000000000000000081525060200191505060405180910390fd5b611147565b8173ffffffffffffffffffffffffffffffffffffffff1663934f3a1182898989896040518663ffffffff1660e01b81526004018086815260200180602001806020018381038352878782818152602001925080828437600081840152601f19601f8201169050808301925050508381038252858582818152602001925080828437600081840152601f19601f82011690508083019250505097505050505050505060006040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050505b6320c13b0b60e01b92505050949350505050565b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b8573ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b815260040160206040518083038186803b15801561120957600080fd5b505afa15801561121d573d6000803e3d6000fd5b505050506040513d602081101561123357600080fd5b81019080805190602001909291905050508360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040528051906020012091505092915050565b6040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b6060600033905060008173ffffffffffffffffffffffffffffffffffffffff1663cc2f84526001600a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060006040518083038186803b15801561138057600080fd5b505afa158015611394573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060408110156113be57600080fd5b81019080805160405193929190846401000000008211156113de57600080fd5b838201915060208201858111156113f457600080fd5b825186602082028301116401000000008211171561141157600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561144857808201518184015260208101905061142d565b5050505090500160405260200180519060200190929190505050509050809250505090565b600063bc197c8160e01b905098975050505050505050565b60606040517fb4faba09000000000000000000000000000000000000000000000000000000008152600436036004808301376020600036836000335af15060203d036040519250808301604052806020843e6000516114e657825160208401fd5b50509392505050565b600063f23a6e6160e01b90509695505050505050565b6040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508156fea26469706673582212204251d58f2a197439239faafa82818b7696d25bb75655794a81cc773a0e39ed2b64736f6c63430007060033", 0xf48f2B2d2a534e402487b3ee7C18c33Aec0Fe5e4); - contracts[6] = SystemContractInfo(hex"608060405234801561001057600080fd5b5061045f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634847be6f1461003b5780634c8c9ea114610134575b600080fd5b6101086004803603606081101561005157600080fd5b81019080803590602001909291908035906020019064010000000081111561007857600080fd5b82018360208201111561008a57600080fd5b803590602001918460018302840111640100000000831117156100ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610223565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101f76004803603604081101561014a57600080fd5b81019080803590602001909291908035906020019064010000000081111561017157600080fd5b82018360208201111561018357600080fd5b803590602001918460018302840111640100000000831117156101a557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610327565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008183518460200186f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156102d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f436f756c64206e6f74206465706c6f7920636f6e74726163740000000000000081525060200191505060405180910390fd5b7f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51181604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a19392505050565b600081516020830184f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156103d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f436f756c64206e6f74206465706c6f7920636f6e74726163740000000000000081525060200191505060405180910390fd5b7f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51181604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a19291505056fea26469706673582212203aa87bc5f141a4ee0319caa1412f294b7a71e2ffc270a0cc5e506a8b320df24464736f6c63430007060033", 0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4); - contracts[7] = SystemContractInfo(hex"60a060405234801561001057600080fd5b503073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060805160601c6102756100646000398060e052506102756000f3fe60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c63430007060033", 0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761); - contracts[8] = SystemContractInfo(hex"608060405234801561001057600080fd5b5061019a806100206000396000f3fe60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c63430007060033", 0x40A2aCCbd92BCA938b02010E17A5b8929b49130D); - contracts[9] = SystemContractInfo(hex"608060405234801561001057600080fd5b506103c6806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630a1028c41461003b57806385a5affe1461010a575b600080fd5b6100f46004803603602081101561005157600080fd5b810190808035906020019064010000000081111561006e57600080fd5b82018360208201111561008057600080fd5b803590602001918460018302840111640100000000831117156100a257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610183565b6040518082815260200191505060405180910390f35b6101816004803603602081101561012057600080fd5b810190808035906020019064010000000081111561013d57600080fd5b82018360208201111561014f57600080fd5b8035906020019184600183028401116401000000008311171561017157600080fd5b90919293919293905050506102f4565b005b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b3073ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b815260040160206040518083038186803b15801561023157600080fd5b505afa158015610245573d6000803e3d6000fd5b505050506040513d602081101561025b57600080fd5b81019080805190602001909291905050508360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260010183815260200182815260200194505050505060405160208183030381529060405280519060200120915050919050565b600061034383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610183565b905060016007600083815260200190815260200160002081905550807fe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e460405160405180910390a250505056fea264697066735822122078bcee081c884d5fea3f900c2ac03d317d726d0f404059fcb5776fd4235768ea64736f6c63430007060033", 0xA65387F16B013cf2Af4605Ad8aA5ec25a2cbA3a2); - contracts[10] = SystemContractInfo(hex"608060405234801561001057600080fd5b506001600481905550615cf880620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506126fc565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b810190808035906020019092919080359060200190929190505050612732565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b81019080803590602001909291905050506127b9565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d1565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612b63565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c9d565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612edc565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612f01565b005b348015610d3457600080fd5b50610d3d612f90565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613139565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061313f565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613161565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff16906020019092919050505061331f565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613447565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613639565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137d8565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613805565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b96565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b34801561148957600080fd5b5061149261428c565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614296565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061443e565b005b3480156116a457600080fd5b506116ad61449f565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061451d565b005b34801561174a57600080fd5b50611753614950565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614989565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612b63565b5b5050565b611bd2604182614a2c90919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614a66565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614a2c90919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614a9590919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614a9590919063ffffffff16565b614a9590919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b60007fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e3386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183600181111561266b57fe5b8152602001828103825284818151815260200191508051906020019080838360005b838110156126a857808201518184015260208101905061268d565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a16126f285858585614ab4565b9050949350505050565b6000606061270c868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561275057600080fd5b506040519080825280601f01601f1916602001820160405280156127835781602001600182028036833780820191505090505b50905060005b838110156127ae57808501548060208302602085010152508080600101915050612789565b508091505092915050565b60076020528060005260406000206000915090505481565b6127d9614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128435750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612b6b614989565b600354811115612be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000606060055433600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed8d8d8d8d8d8d8d8d8d8d8d8c604051808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612d5057fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528e8e82818152602001925080828437600081840152601f19601f820116905080830192505050848103835286818151815260200191508051906020019080838360005b83811015612e0a578082015181840152602081019050612def565b50505050905090810190601f168015612e375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612e70578082015181840152602081019050612e55565b50505050905090810190601f168015612e9d5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390a1612eca8d8d8d8d8d8d8d8d8d8d8d614c9a565b9150509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612f7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612f8a84848484611bbe565b50505050565b6060600060035467ffffffffffffffff81118015612fad57600080fd5b50604051908082528060200260200182016040528015612fdc5781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613130578083838151811061308757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613046565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6131ac8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050896151d7565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131ea576131e9846156d7565b5b6132388787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615706565b60008211156132525761325082600060018685615941565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a9050613376878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615b47565b61337f57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340c5780820151818401526020810190506133f1565b50505050905090810190601f1680156134395780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561346257600080fd5b506040519080825280602002602001820160405280156134915781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135645750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561356f57508482105b1561362a578084838151811061358157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506134fa565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006137ed8c8c8c8c8c8c8c8c8c8c8c614296565b8051906020012090509b9a5050505050505050505050565b61380d614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156138775750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6138e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613b9e614989565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613c22614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c8c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613cc457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613ea15750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561432757fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6143b361449f565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b614446614989565b61444f816156d7565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6144cd6125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b614525614989565b8060016003540310156145a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561460a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61467c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461477c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461494b5761494a81612b63565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614a3f5760009050614a60565b6000828402905082848281614a5057fe5b0414614a5b57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614aaa57600080fd5b8091505092915050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614b7f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b614bf1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b614bfe858585855a615b47565b90508015614c4e573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2614c92565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000806000614cb48e8e8e8e8e8e8e8e8e8e600554614296565b905060056000815480929190600101919050555080805190602001209150614cdd828286612f01565b506000614ce8615b93565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ece578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115614d8b57fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015614e5d578082015181840152602081019050614e42565b50505050905090810190601f168015614e8a5780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015614eb557600080fd5b505af1158015614ec9573d6000803e3d6000fd5b505050505b6101f4614ef56109c48b01603f60408d0281614ee657fe5b04615bc490919063ffffffff16565b015a1015614f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a9050614fd48f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d14614fc9578e614fcf565b6109c45a035b615b47565b9350614fe95a82615bde90919063ffffffff16565b90508380614ff8575060008a14155b80615004575060008814155b615076576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156150905761508d828b8b8b8b615941565b90505b84156150da577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a161511a565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146151c6578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156151ad57600080fd5b505af11580156151c1573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b60006004541461524f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81518111156152c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600181101561533d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b835181101561564357600084828151811061535d57fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153d15750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561540957503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561544157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6154b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615346565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461593d576158ca8260008360015a615b47565b61593c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461597e5782615980565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615a98576159ea3a86106159c7573a6159c9565b855b6159dc888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615b3d565b615abd85615aaf888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b9150615aca848284615bfe565b615b3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600180811115615b5557fe5b836001811115615b6157fe5b1415615b7a576000808551602087018986f49050615b8a565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015615bd45781615bd6565b825b905092915050565b600082821115615bed57600080fd5b600082840390508091505092915050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615ca55760208114615cad5760009350615cb8565b819350615cb8565b600051158215171593505b505050939250505056fea2646970667358221220047fac33099ca576d1c4f1ac6a8abdb0396e42ad6a397d2cb2f4dc1624cc0c5b64736f6c63430007060033", 0x3E5c63644E683549055b9Be8653de26E0B4CD36E); - contracts[11] = SystemContractInfo(hex"608060405234801561001057600080fd5b5060016004819055506159ae80620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033", 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552); - contracts[12] = SystemContractInfo(hex"60806040523480156200001157600080fd5b5060405162002b3138038062002b3183398101604081905262000034916200008c565b600080546001600160a01b0319166001600160a01b03831690811782556040518392839283929091907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350505050620000be565b6000602082840312156200009f57600080fd5b81516001600160a01b0381168114620000b757600080fd5b9392505050565b612a6380620000ce6000396000f3fe6080604052600436106100e15760003560e01c80636e2d44ae1161007f5780639bc94d01116100595780639bc94d01146102b0578063e551cdaa146102d0578063edee6239146102f0578063fc3e3eba1461030357600080fd5b80636e2d44ae1461021d5780638da5cb5b1461023e5780639456fbcc1461029057600080fd5b80634782f779116100bb5780634782f779146101845780634d7fba6e146101a457806367148cd2146101dd578063690d8320146101fd57600080fd5b806313af4035146101225780634025feb21461014457806344004cc11461016457600080fd5b3661011d5760405134815233907f4103257eaac983ca79a70d28f90dfc4fa16b619bb0c17ee7cab0d4034c2796249060200160405180910390a2005b600080fd5b34801561012e57600080fd5b5061014261013d366004611af9565b610333565b005b34801561015057600080fd5b5061014261015f366004611b1d565b61040f565b34801561017057600080fd5b5061014261017f366004611b1d565b610587565b34801561019057600080fd5b5061014261019f366004611b5e565b6106fe565b3480156101b057600080fd5b506101c46101bf366004611c2f565b610834565b6040516101d49493929190611d3a565b60405180910390f35b3480156101e957600080fd5b506101426101f8366004611e94565b610a66565b34801561020957600080fd5b50610142610218366004611af9565b610c6f565b61023061022b366004611ef6565b610ce3565b6040516101d4929190611f4f565b34801561024a57600080fd5b5060005461026b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d4565b34801561029c57600080fd5b506101426102ab366004611f6a565b610dc3565b3480156102bc57600080fd5b506101426102cb366004611fa3565b610ec4565b3480156102dc57600080fd5b506101426102eb366004611ffe565b611363565b6102306102fe366004612063565b61177f565b34801561030f57600080fd5b5061032361031e366004611e94565b61185c565b60405190151581526020016101d4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461039f5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104765760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390528416906323b872dd90606401600060405180830381600087803b1580156104ec57600080fd5b505af1158015610500573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f30b478a5e196e55886228aa87ba74a7dfeba655e0a4d7ba275eabfc22aabb7a88460405161057a91815260200190565b60405180910390a4505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105ee5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610663573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068791906120c1565b508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6b00f1c7883f053ba83e907fd1965b22fffe3c4111383e725f04638a566cdbfa8460405161057a91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107655760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146107bf576040519150601f19603f3d011682016040523d82523d6000602084013e6107c4565b606091505b505090508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f1f12aa8b6d492dd9b98e2b00b0b20830c2a7ded65afac13b60d169a034ae90bc8460405161082791815260200190565b60405180910390a3505050565b805160208183018101805160018083529383019483019490942093905282546040805160a081018252938501805460ff90811615158652600287015494860194909452600386015473ffffffffffffffffffffffffffffffffffffffff169185019190915260048501805493909216949392909160608401916108b6906120de565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906120de565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a4e576000848152602090819020604080516060810190915260038502909101805473ffffffffffffffffffffffffffffffffffffffff16825260018101805492939192918401916109b3906120de565b80601f01602080910402602001604051908101604052809291908181526020018280546109df906120de565b8015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b505050505081526020016002820154815250508152602001906001019061095d565b50505091525050600682015460079092015490919084565b600060018383604051610a7a929190612131565b90815260200160405180910390209050610a94838361185c565b50426006820155600781018054906000610aad83612170565b9091555050600581015460005b81811015610c13576000836001016004018281548110610adc57610adc6121a8565b6000918252602082206003909102018054600282015460405192945073ffffffffffffffffffffffffffffffffffffffff90911691610b1f9060018601906121d7565b60006040518083038185875af1925050503d8060008114610b5c576040519150601f19603f3d011682016040523d82523d6000602084013e610b61565b606091505b5050905080610bfe5760405162461bcd60e51b815260206004820152604c60248201527f447269707069653a20647269702077617320756e7375636365737366756c2c2060448201527f706c6561736520636865636b20796f757220636f6e66696775726174696f6e2060648201527f666f72206d697374616b65730000000000000000000000000000000000000000608482015260a401610396565b50508080610c0b90612170565b915050610aba565b508383604051610c24929190612131565b60405180910390207fea21435419aad9c54a9d90e2522b6f60bd566401f36fcef661f5f5a28cc0d2c685853342604051610c619493929190612296565b60405180910390a250505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cd65760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b610ce081476106fe565b50565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314610d4e5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b8473ffffffffffffffffffffffffffffffffffffffff168385604051610d7491906122d3565b60006040518083038185875af1925050503d8060008114610db1576040519150601f19603f3d011682016040523d82523d6000602084013e610db6565b606091505b5091509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e2a5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610ec0908390839073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017f91906122ef565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f2b5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6000816003811115610f3f57610f3f611c80565b03610fd85760405162461bcd60e51b815260206004820152604160248201527f447269707069653a2064726970207374617475732063616e206e65766572206260448201527f6520736574206261636b20746f204e4f4e45206166746572206372656174696f60648201527f6e00000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b600060018484604051610fec929190612131565b9081526040519081900360200190205460ff169050600081600381111561101557611015611c80565b036110ae5760405162461bcd60e51b815260206004820152604160248201527f447269707069653a206472697020776974682074686174206e616d6520646f6560448201527f73206e6f7420657869737420616e642063616e6e6f742062652075706461746560648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b60038160038111156110c2576110c2611c80565b0361115c5760405162461bcd60e51b8152602060048201526044602482018190527f447269707069653a206472697020776974682074686174206e616d6520686173908201527f206265656e20617263686976656420616e642063616e6e6f742062652075706460648201527f6174656400000000000000000000000000000000000000000000000000000000608482015260a401610396565b81600381111561116e5761116e611c80565b81600381111561118057611180611c80565b036112195760405162461bcd60e51b815260206004820152604860248201527f447269707069653a2063616e6e6f74207365742064726970207374617475732060448201527f746f207468652073616d6520737461747573206173206974732063757272656e60648201527f7420737461747573000000000000000000000000000000000000000000000000608482015260a401610396565b600382600381111561122d5761122d611c80565b036112b957600181600381111561124657611246611c80565b146112b95760405162461bcd60e51b815260206004820152603860248201527f447269707069653a2064726970206d757374206669727374206265207061757360448201527f6564206265666f7265206265696e6720617263686976656400000000000000006064820152608401610396565b81600185856040516112cc929190612131565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600381111561131357611313611c80565b02179055508383604051611328929190612131565b60405180910390207f407cb3ad05e60ec498fb39417c7a4f6b82d5ba80f82fe512a37b02c93181a2a1858585604051610c6193929190612308565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113ca5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6000600184846040516113de929190612131565b9081526040519081900360200190205460ff16600381111561140257611402611c80565b146114755760405162461bcd60e51b815260206004820152602b60248201527f447269707069653a206472697020776974682074686174206e616d6520616c7260448201527f65616479206578697374730000000000000000000000000000000000000000006064820152608401610396565b611482602082018261232b565b15611504576020810135156114ff5760405162461bcd60e51b815260206004820152603e60248201527f447269707069653a20696620616c6c6f77696e67207265656e7472616e74206460448201527f7269702c206d7573742073657420696e74657276616c20746f207a65726f00006064820152608401610396565b6115a5565b60008160200135116115a55760405162461bcd60e51b8152602060048201526044602482018190527f447269707069653a20696e74657276616c206d75737420626520677265617465908201527f72207468616e207a65726f2069662064726970206973206e6f74207265656e7460648201527f72616e7400000000000000000000000000000000000000000000000000000000608482015260a401610396565b6000600184846040516115b9929190612131565b9081526040516020918190038201902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815591506116009083018361232b565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556020820135600282015561164b6060830160408401611af9565b6003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561169f6060830183612348565b60048301916116af9190836123fc565b5060005b6116c060808401846124f9565b905081101561173357600582016116da60808501856124f9565b838181106116ea576116ea6121a8565b90506020028101906116fc9190612561565b81546001810183556000928352602090922090916003020161171e8282612595565b5050808061172b90612170565b9150506116b3565b508383604051611744929190612131565b60405180910390207fe38d8d98e6cc66f6f520d483c6c5a89289681f897799c4c29d767cf57e76d9a6858585604051610c619392919061286a565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146117ea5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b8373ffffffffffffffffffffffffffffffffffffffff168360405161180f91906122d3565b600060405180830381855af49150503d806000811461184a576040519150601f19603f3d011682016040523d82523d6000602084013e61184f565b606091505b50915091505b9250929050565b60008060018484604051611871929190612131565b90815260405190819003602001902090506002815460ff16600381111561189a5761189a611c80565b1461190f576040805162461bcd60e51b81526020600482015260248101919091527f447269707069653a2073656c6563746564206472697020646f6573206e6f742060448201527f6578697374206f72206973206e6f742063757272656e746c79206163746976656064820152608401610396565b60028101546006820154429161192491612971565b11156119985760405162461bcd60e51b815260206004820152603660248201527f447269707069653a206472697020696e74657276616c20686173206e6f74206560448201527f6c61707365642073696e6365206c6173742064726970000000000000000000006064820152608401610396565b60038101546040517fc64b3bb500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063c64b3bb5906119f29060048086019101612984565b602060405180830381865afa158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3391906120c1565b611acb5760405162461bcd60e51b815260206004820152604260248201527f447269707069653a2064726970636865636b206661696c656420736f2064726960448201527f70206973206e6f742079657420726561647920746f206265207472696767657260648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b60019150505b92915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce057600080fd5b600060208284031215611b0b57600080fd5b8135611b1681611ad7565b9392505050565b600080600060608486031215611b3257600080fd5b8335611b3d81611ad7565b92506020840135611b4d81611ad7565b929592945050506040919091013590565b60008060408385031215611b7157600080fd5b8235611b7c81611ad7565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611bd457611bd4611b8a565b604051601f8501601f19908116603f01168101908282118183101715611bfc57611bfc611b8a565b81604052809350858152868686011115611c1557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611c4157600080fd5b813567ffffffffffffffff811115611c5857600080fd5b8201601f81018413611c6957600080fd5b611c7884823560208401611bb9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611ce6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60005b83811015611d05578181015183820152602001611ced565b50506000910152565b60008151808452611d26816020860160208601611cea565b601f01601f19169290920160200192915050565b611d448186611caf565b600060206080818401528551151560808401528086015160a084015260408087015173ffffffffffffffffffffffffffffffffffffffff80821660c0870152606091508189015160a060e0880152611da0610120880182611d0e565b60808b01518882037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80016101008a0152805180835291925086019086830190600581901b8401880160005b82811015611e3657601f1986830301845284518781511683528a810151898c850152611e198a850182611d0e565b918b0151938b0193909352948a0194938a01939150600101611deb565b50968a019b909b52505050509093019390935250949350505050565b60008083601f840112611e6457600080fd5b50813567ffffffffffffffff811115611e7c57600080fd5b60208301915083602082850101111561185557600080fd5b60008060208385031215611ea757600080fd5b823567ffffffffffffffff811115611ebe57600080fd5b611eca85828601611e52565b90969095509350505050565b600082601f830112611ee757600080fd5b611b1683833560208501611bb9565b600080600060608486031215611f0b57600080fd5b8335611f1681611ad7565b9250602084013567ffffffffffffffff811115611f3257600080fd5b611f3e86828701611ed6565b925050604084013590509250925092565b8215158152604060208201526000611c786040830184611d0e565b60008060408385031215611f7d57600080fd5b8235611f8881611ad7565b91506020830135611f9881611ad7565b809150509250929050565b600080600060408486031215611fb857600080fd5b833567ffffffffffffffff811115611fcf57600080fd5b611fdb86828701611e52565b909450925050602084013560048110611ff357600080fd5b809150509250925092565b60008060006040848603121561201357600080fd5b833567ffffffffffffffff8082111561202b57600080fd5b61203787838801611e52565b9095509350602086013591508082111561205057600080fd5b50840160a08187031215611ff357600080fd5b6000806040838503121561207657600080fd5b823561208181611ad7565b9150602083013567ffffffffffffffff81111561209d57600080fd5b6120a985828601611ed6565b9150509250929050565b8015158114610ce057600080fd5b6000602082840312156120d357600080fd5b8151611b16816120b3565b600181811c908216806120f257607f821691505b60208210810361212b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121a1576121a1612141565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083546121e5816120de565b600182811680156121fd57600181146122305761225f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416875282151583028701945061225f565b8760005260208060002060005b858110156122565781548a82015290840190820161223d565b50505082870194505b50929695505050505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6060815260006122aa60608301868861226b565b73ffffffffffffffffffffffffffffffffffffffff949094166020830152506040015292915050565b600082516122e5818460208701611cea565b9190910192915050565b60006020828403121561230157600080fd5b5051919050565b60408152600061231c60408301858761226b565b9050611c786020830184611caf565b60006020828403121561233d57600080fd5b8135611b16816120b3565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261237d57600080fd5b83018035915067ffffffffffffffff82111561239857600080fd5b60200191503681900382131561185557600080fd5b601f8211156123f757600081815260208120601f850160051c810160208610156123d45750805b601f850160051c820191505b818110156123f3578281556001016123e0565b5050505b505050565b67ffffffffffffffff83111561241457612414611b8a565b6124288361242283546120de565b836123ad565b6000601f84116001811461247a57600085156124445750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556124f2565b600083815260209020601f19861690835b828110156124ab578685013582556020948501946001909201910161248b565b50868210156124e6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261252e57600080fd5b83018035915067ffffffffffffffff82111561254957600080fd5b6020019150600581901b360382131561185557600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126122e557600080fd5b81356125a081611ad7565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782555060018082016020808501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe186360301811261261a57600080fd5b8501803567ffffffffffffffff81111561263357600080fd5b803603838301131561264457600080fd5b6126588161265286546120de565b866123ad565b6000601f8211600181146126ac576000831561267657508382018501355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178655612723565b600086815260209020601f19841690835b828110156126dc578685018801358255938701939089019087016126bd565b5084821015612719577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c198785880101351681555b50508683881b0186555b50505050505050604082013560028201555050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261276d57600080fd5b830160208101925035905067ffffffffffffffff81111561278d57600080fd5b80360382131561185557600080fd5b81835260006020808501808196508560051b81019150846000805b8881101561285c578385038a5282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18936030181126127f5578283fd5b88016060813561280481611ad7565b73ffffffffffffffffffffffffffffffffffffffff16875261282882890183612738565b828a8a015261283a838a01828461226b565b60409485013599909401989098525050998601999450918501916001016127b7565b509298975050505050505050565b60408152600061287e60408301858761226b565b82810360208401528335612891816120b3565b151581526020848101359082015260408401356128ad81611ad7565b73ffffffffffffffffffffffffffffffffffffffff1660408201526128d56060850185612738565b60a060608401526128ea60a08401828461226b565b91505060808501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe186360301811261292257600080fd5b850160208101903567ffffffffffffffff81111561293f57600080fd5b8060051b360382131561295157600080fd5b838303608085015261296483828461279c565b9998505050505050505050565b80820180821115611ad157611ad1612141565b6000602080835260008454612998816120de565b808487015260406001808416600081146129b957600181146129f157612a1f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550612a1f565b896000528660002060005b85811015612a175781548b82018601529083019088016129fc565b8a0184019650505b50939897505050505050505056fea26469706673582212208d60ccb026b0dcc2e3511887db1b30dfd98f123af2a2a96714cbeca8ed21494464736f6c63430008100033000000000000000000000000226f14c3e19788934ff37c653cf5e24cad198341", 0x319c0e4e82FB0Cb7B608565653849b65bf558afE); - contracts[13] = SystemContractInfo(hex"608060405234801561001057600080fd5b50610239806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c64b3bb514610030575b600080fd5b61004361003e3660046100c3565b610057565b604051901515815260200160405180910390f35b6000808280602001905181019061006e9190610192565b6020810151905173ffffffffffffffffffffffffffffffffffffffff1631109392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156100d557600080fd5b813567ffffffffffffffff808211156100ed57600080fd5b818401915084601f83011261010157600080fd5b81358181111561011357610113610094565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561015957610159610094565b8160405282815287602084870101111561017257600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000604082840312156101a457600080fd5b6040516040810181811067ffffffffffffffff821117156101c7576101c7610094565b604052825173ffffffffffffffffffffffffffffffffffffffff811681146101ee57600080fd5b8152602092830151928101929092525091905056fea2646970667358221220cc86d01120737597addcccffd841244801dcb64ce402d73b8d8569a52348996464736f6c63430008100033", 0xc3a9e8E4e823DC39c1415290366Cc62A186B268b); - return contracts; - } -} \ No newline at end of file + function getSystemContractInfo() public pure returns (SystemContractInfo[] memory) { + SystemContractInfo[] memory contracts = new SystemContractInfo[](13); + contracts[0] = SystemContractInfo( + hex"608060405234801561001057600080fd5b50600160008190555061069a806100286000396000f3fe60806040526004361061001e5760003560e01c8063be6002c214610023575b600080fd5b61003d600480360381019061003891906102db565b610053565b60405161004a9190610422565b60405180910390f35b606061005d610222565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156100cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c490610464565b60405180910390fd5b82826040516100dd929190610409565b60405180910390208473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d3460405161014291906104a4565b60405180910390a46000808573ffffffffffffffffffffffffffffffffffffffff16348686604051610175929190610409565b60006040518083038185875af1925050503d80600081146101b2576040519150601f19603f3d011682016040523d82523d6000602084013e6101b7565b606091505b50915091508161020e57600081511415610206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fd90610444565b60405180910390fd5b805181602001fd5b809250505061021b610272565b9392505050565b60026000541415610268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025f90610484565b60405180910390fd5b6002600081905550565b6001600081905550565b60008135905061028b8161064d565b92915050565b60008083601f8401126102a357600080fd5b8235905067ffffffffffffffff8111156102bc57600080fd5b6020830191508360018202830111156102d457600080fd5b9250929050565b6000806000604084860312156102f057600080fd5b60006102fe8682870161027c565b935050602084013567ffffffffffffffff81111561031b57600080fd5b61032786828701610291565b92509250509250925092565b600061033f83856104db565b935061034c838584610533565b82840190509392505050565b6000610363826104bf565b61036d81856104ca565b935061037d818560208601610542565b61038681610575565b840191505092915050565b600061039e6032836104e6565b91506103a982610586565b604082019050919050565b60006103c16029836104e6565b91506103cc826105d5565b604082019050919050565b60006103e4601f836104e6565b91506103ef82610624565b602082019050919050565b61040381610529565b82525050565b6000610416828486610333565b91508190509392505050565b6000602082019050818103600083015261043c8184610358565b905092915050565b6000602082019050818103600083015261045d81610391565b9050919050565b6000602082019050818103600083015261047d816103b4565b9050919050565b6000602082019050818103600083015261049d816103d7565b9050919050565b60006020820190506104b960008301846103fa565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061050282610509565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015610560578082015181840152602081019050610545565b8381111561056f576000848401525b50505050565b6000601f19601f8301169050919050565b7f5065726d697373696f6e6c65737352656c61793a205472616e73616374696f6e60008201527f2072657665727465642073696c656e746c790000000000000000000000000000602082015250565b7f5065726d697373696f6e6c65737352656c61793a20746172676574206973206160008201527f6464726573732830290000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b610656816104f7565b811461066157600080fd5b5056fea26469706673582212201d88bc3b8cda621b7d980295ef54db4d2ae21e1f206ea6a59db6551b909fa9fa64736f6c63430008040033", + 0xA2eA7657440875bF916CBFC0cfA88F13e38aD463 + ); + contracts[1] = SystemContractInfo( + hex"60c06040523073ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff1660601b81525034801561004657600080fd5b5060008060001b604051610059906100b9565b8190604051809103906000f5905080158015610079573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050506100c6565b61431b8061091f83390190565b60805160601c60a05160601c6108196101066000396000818161011401526103d00152600081816102540152818161034901526103ae01526108196000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806311ea37fc1461005c5780634501f8db146100785780634c9159b1146100a85780638236d0b8146100c6578063c1059955146100e2575b600080fd5b610076600480360381019061007191906105d1565b610112565b005b610092600480360381019061008d9190610595565b61021f565b60405161009f919061065e565b60405180910390f35b6100b0610347565b6040516100bd919061065e565b60405180910390f35b6100e060048036038101906100db91906105d1565b61036b565b005b6100fc60048036038101906100f79190610546565b610379565b604051610109919061065e565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156101a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610198906106b0565b60405180910390fd5b60006101ae303084610379565b90503073ffffffffffffffffffffffffffffffffffffffff1663610b5925826040518263ffffffff1660e01b81526004016101e9919061065e565b600060405180830381600087803b15801561020357600080fd5b505af1158015610217573d6000803e3d6000fd5b505050505050565b60008083338460405160200161023793929190610679565b6040516020818303038152906040528051906020012090506102797f0000000000000000000000000000000000000000000000000000000000000000826103fe565b91508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f0b28c2323855bc15db8c13b56a44651fbce72c8c916fd653f08851fb9ab1c62a60405160405180910390a38173ffffffffffffffffffffffffffffffffffffffff1663c4d66de8856040518263ffffffff1660e01b815260040161030e919061065e565b600060405180830381600087803b15801561032857600080fd5b505af115801561033c573d6000803e3d6000fd5b505050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610375338261021f565b5050565b60008084848460405160200161039193929190610679565b6040516020818303038152906040528051906020012090506103f47f0000000000000000000000000000000000000000000000000000000000000000827f00000000000000000000000000000000000000000000000000000000000000006104bb565b9150509392505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156104b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ac906106d0565b60405180910390fd5b92915050565b60006040518260388201526f5af43d82803e903d91602b57fd5bf3ff6024820152846014820152733d602d80600a3d3981f3363d3d373d3d3d363d7381528360588201526037600c8201206078820152605560438201209150509392505050565b60008135905061052b816107b5565b92915050565b600081359050610540816107cc565b92915050565b60008060006060848603121561055b57600080fd5b60006105698682870161051c565b935050602061057a8682870161051c565b925050604061058b86828701610531565b9150509250925092565b600080604083850312156105a857600080fd5b60006105b68582860161051c565b92505060206105c785828601610531565b9150509250929050565b6000602082840312156105e357600080fd5b60006105f184828501610531565b91505092915050565b61060381610701565b82525050565b60006106166030836106f0565b91506106218261073d565b604082019050919050565b60006106396017836106f0565b91506106448261078c565b602082019050919050565b61065881610733565b82525050565b600060208201905061067360008301846105fa565b92915050565b600060608201905061068e60008301866105fa565b61069b60208301856105fa565b6106a8604083018461064f565b949350505050565b600060208201905081810360008301526106c981610609565b9050919050565b600060208201905081810360008301526106e98161062c565b9050919050565b600082825260208201905092915050565b600061070c82610713565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b7f537068696e784d6f64756c6550726f7879466163746f72793a206d757374206260008201527f652064656c656761746563616c6c656400000000000000000000000000000000602082015250565b7f455243313136373a2063726561746532206661696c6564000000000000000000600082015250565b6107be81610701565b81146107c957600080fd5b50565b6107d581610733565b81146107e057600080fd5b5056fea264697066735822122066e7b25a147b6fe194a9b2e5464a5f7533dc1922b49ff40749a53baf0b9aee5064736f6c6343000804003360806040523480156200001157600080fd5b5060016000819055506200002a6200003060201b60201c565b620001db565b60018054906101000a900460ff161562000081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000078906200012f565b60405180910390fd5b60ff8016600160009054906101000a900460ff1660ff1614620000f55760ff600160006101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620000ec919062000151565b60405180910390a15b565b6000620001066027836200016e565b915062000113826200018c565b604082019050919050565b62000129816200017f565b82525050565b600060208201905081810360008301526200014a81620000f7565b9050919050565b60006020820190506200016860008301846200011e565b92915050565b600082825260208201905092915050565b600060ff82169050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b61413080620001eb6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638f38f835116100665780638f38f8351461012557806397c4f58914610141578063c4d66de81461015f578063e65ec46d1461017b578063ffa1ad741461019757610093565b80630a04d9e61461009857806329cd7aa9146100b657806372552e49146100d2578063783c567914610107575b600080fd5b6100a06101b5565b6040516100ad9190613534565b60405180910390f35b6100d060048036038101906100cb9190612a03565b6101bb565b005b6100ec60048036038101906100e791906129da565b610a4e565b6040516100fe9695949392919061354f565b60405180910390f35b61010f610b4c565b60405161011c9190613060565b60405180910390f35b61013f600480360381019061013a9190612a03565b610b72565b005b610149611477565b6040516101569190613135565b60405180910390f35b61017960048036038101906101749190612726565b61147d565b005b61019560048036038101906101909190612970565b611828565b005b61019f611fea565b6040516101ac9190613210565b60405180910390f35b60035481565b6101c3612023565b6000801b831415610209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020090613292565b60405180910390fd5b6000801b6004541415610251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610248906133d2565b60405180910390fd5b6000600260008581526020019081526020016000209050600060048111156102a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160030160149054906101000a900460ff1660048111156102ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461032c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032390613392565b60405180910390fd5b60008360000151905061034c84602001518661034784612073565b6120c9565b61038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610382906134b2565b60405180910390fd5b6002808111156103c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81604001516002811115610401577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610438906132f2565b60405180910390fd5b6000816020015114610488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047f90613232565b60405180910390fd5b60008060008060008086606001518060200190518101906104a99190612778565b955095509550955095509550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053c90613492565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105aa906134f2565b60405180910390fd5b60035484146105f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ee90613432565b60405180910390fd5b600454831461063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290613412565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146106a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a090613252565b60405180910390fd5b468760000151146106ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690613312565b60405180910390fd5b83838c7fbd735b1d507113b14844a118f9b9938b54610adafc574e9cdcd67335131ad717338560405161072392919061307b565b60405180910390a460036002600085815260200190815260200160002060030160146101000a81548160ff0219169083600481111561078b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506000801b6004819055508a7f4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff6360405160405180910390a26001886000018190555060018860010181905550808860020190805190602001906107f39291906121cb565b50338860030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028860030160146101000a81548160ff02191690836004811115610885577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506001840160038190555060007fb03948446334eb9b2196d5eb166f69b9d49403eb4a12f36de8d3f9f3cb8e15c36040518060400160405280600681526020017f537068696e780000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508051906020012060405160200161094393929190613179565b604051602081830303815290604052805190602001207f0cb314254867c611b4ba06dea78882bd68b33649e1ddb950d6db2ee328a55ad08d60405160200161098c929190613150565b604051602081830303815290604052805190602001206040516020016109b3929190613029565b60405160208183030381529060405290508673ffffffffffffffffffffffffffffffffffffffff1663934f3a118280519060200120838d6040518463ffffffff1660e01b8152600401610a08939291906131b0565b60006040518083038186803b158015610a2057600080fd5b505afa158015610a34573d6000803e3d6000fd5b50505050505050505050505050610a496120e0565b505050565b6002602052806000526040600020600091509050806000015490806001015490806002018054610a7d906138ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa9906138ff565b8015610af65780601f10610acb57610100808354040283529160200191610af6565b820191906000526020600020905b815481529060010190602001808311610ad957829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160149054906101000a900460ff16908060030160159054906101000a900460ff16905086565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b7a612023565b6000801b831415610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790613292565b60405180910390fd5b6000801b60045414610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe906133f2565b60405180910390fd5b600060026000858152602001908152602001600020905060006004811115610c58577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160030160149054906101000a900460ff166004811115610ca2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613392565b60405180910390fd5b600083600001519050610d02846020015186610cfd84612073565b6120c9565b610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d38906134b2565b60405180910390fd5b60006002811115610d7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81604001516002811115610db8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def906132f2565b60405180910390fd5b6000816020015114610e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3690613232565b60405180910390fd5b60008060008060008060008760600151806020019051810190610e629190612819565b9650965096509650965096509650600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef790613492565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f65906134f2565b60405180910390fd5b6003548514610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990613432565b60405180910390fd5b60008411610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613472565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105a90613252565b60405180910390fd5b46886000015114806110725750805b6110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a890613312565b60405180910390fd5b8015806110c2575060008860000151145b611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890613452565b60405180910390fd5b848c7f382c7aec02462c9b086aba9a7f8dbb1fb8bf336e7b624b0149eeca6726d0fb4a338786604051611136939291906130f7565b60405180910390a383896000018190555060018960010181905550818960020190805190602001906111699291906121cb565b50338960030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808960030160156101000a81548160ff021916908315150217905550600185016003819055506001841415611261578b7f4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff6360405160405180910390a260028960030160146101000a81548160ff02191690836004811115611257577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112bc565b60018960030160146101000a81548160ff021916908360048111156112af577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055508b6004819055505b60007fb03948446334eb9b2196d5eb166f69b9d49403eb4a12f36de8d3f9f3cb8e15c36040518060400160405280600681526020017f537068696e780000000000000000000000000000000000000000000000000000815250805190602001206040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508051906020012060405160200161136b93929190613179565b604051602081830303815290604052805190602001207f0cb314254867c611b4ba06dea78882bd68b33649e1ddb950d6db2ee328a55ad08e6040516020016113b4929190613150565b604051602081830303815290604052805190602001206040516020016113db929190613029565b60405160208183030381529060405290508773ffffffffffffffffffffffffffffffffffffffff1663934f3a118280519060200120838e6040518463ffffffff1660e01b8152600401611430939291906131b0565b60006040518083038186803b15801561144857600080fd5b505afa15801561145c573d6000803e3d6000fd5b50505050505050505050505050506114726120e0565b505050565b60045481565b600060018054906101000a900460ff161590508080156114ae575060018060009054906101000a900460ff1660ff16105b806114dc57506114bd306120ea565b1580156114db575060018060009054906101000a900460ff1660ff16145b5b61151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290613372565b60405180910390fd5b60018060006101000a81548160ff021916908360ff16021790555080156115575760018060016101000a81548160ff0219169083151502179055505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be906133b2565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1663a619486e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561160f57600080fd5b505afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611647919061274f565b905060008173ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b15801561169157600080fd5b505afa1580156116a5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116ce9190612a82565b90506000816040516020016116e39190613012565b6040516020818303038152906040528051906020012090507f6a08c3e203132c561752255a4d52ffae85bb9c5d33cb3291520dea1b8435638981148061174857507f7015c1a48403d132ad83884b326109f1b309c42f752b2abd1db79522ee07467381145b611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e90613332565b60405180910390fd5b84600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505080156118245760006001806101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161181b91906131f5565b60405180910390a15b5050565b611830612023565b60008151905060008111611879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187090613272565b60405180910390fd5b600060045490506000801b8114156118c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bd906132b2565b60405180910390fd5b60006002600083815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690613252565b60405180910390fd5b600081600101549050838161198491906136ea565b826000015410156119ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c1906132d2565b60405180910390fd5b60008260030160159054906101000a900460ff1690506119e8612251565b606060005b87811015611f3657888181518110611a2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001519250888181518110611a75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001519150611a968288611a9186612073565b6120c9565b611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc906134b2565b60405180910390fd5b60016002811115611b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b83604001516002811115611b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b83906132f2565b60405180910390fd5b84836020015114611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990613232565b60405180910390fd5b4683600001511480611be15750835b611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790613312565b60405180910390fd5b831580611c31575060008360000151145b611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613452565b60405180910390fd5b6000806000806000808860600151806020019051810190611c9191906128cf565b95509550955095509550955060018b611caa91906136ea565b9a506000612710603f604087611cc09190613771565b611cca9190613740565b611cd491906136ea565b5a1015611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90613352565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663468721a786898988886040518663ffffffff1660e01b8152600401611d7894939291906130ab565b602060405180830381600088803b158015611d9257600080fd5b5087f193505050508015611dc457506040513d601f19601f82011682018060405250810190611dc191906129b1565b60015b611dcd57611dd2565b809150505b8015611e19578d7fa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa078b60200151604051611e0c9190613534565b60405180910390a2611e56565b8d7f05612698ed8f42586165f420abc8164c188065d389e9ba48b1df7795b5a21d4d8b60200151604051611e4d9190613534565b60405180910390a25b80158015611e615750815b15611f1c578d7f32188c23fa533cb5bdaaf4eb969c99d38e0faf67f824e694d3d53c3ad5104fa08b60200151604051611e9a9190613534565b60405180910390a260048d60030160146101000a81548160ff02191690836004811115611ef0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055508b8d600101819055506000801b600481905550505050505050505050505050505050611fdf565b505050505050508080611f2e90613962565b9150506119ed565b508385600101819055508460000154841415611fd757857f4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff6360405160405180910390a260028560030160146101000a81548160ff02191690836004811115611fc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506000801b6004819055505b505050505050505b611fe76120e0565b50565b6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60026000541415612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612060906134d2565b60405180910390fd5b6002600081905550565b6000816040516020016120869190613512565b604051602081830303815290604052805190602001206040516020016120ac9190612ff7565b604051602081830303815290604052805190602001209050919050565b6000826120d6858461210d565b1490509392505050565b6001600081905550565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b845181101561217e576121698286838151811061215c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612189565b9150808061217690613962565b915050612116565b508091505092915050565b60008183106121a15761219c82846121b4565b6121ac565b6121ab83836121b4565b5b905092915050565b600082600052816020526040600020905092915050565b8280546121d7906138ff565b90600052602060002090601f0160209004810192826121f95760008555612240565b82601f1061221257805160ff1916838001178555612240565b82800160010185558215612240579182015b8281111561223f578251825591602001919060010190612224565b5b50905061224d91906122b1565b5090565b60405180608001604052806000815260200160008152602001600060028111156122a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001606081525090565b5b808211156122ca5760008160009055506001016122b2565b5090565b60006122e16122dc846135dc565b6135b7565b9050808382526020820190508285602086028201111561230057600080fd5b60005b8581101561233057816123168882612522565b845260208401935060208301925050600181019050612303565b5050509392505050565b600061234d61234884613608565b6135b7565b9050808382526020820190508285602086028201111561236c57600080fd5b60005b858110156123b657813567ffffffffffffffff81111561238e57600080fd5b80860161239b89826125f4565b8552602085019450602084019350505060018101905061236f565b5050509392505050565b60006123d36123ce84613634565b6135b7565b9050828152602081018484840111156123eb57600080fd5b6123f68482856138bd565b509392505050565b600061241161240c84613634565b6135b7565b90508281526020810184848401111561242957600080fd5b6124348482856138cc565b509392505050565b600061244f61244a84613665565b6135b7565b90508281526020810184848401111561246757600080fd5b6124728482856138cc565b509392505050565b60008135905061248981614067565b92915050565b60008151905061249e81614067565b92915050565b6000815190506124b38161407e565b92915050565b600082601f8301126124ca57600080fd5b81356124da8482602086016122ce565b91505092915050565b600082601f8301126124f457600080fd5b813561250484826020860161233a565b91505092915050565b60008151905061251c81614095565b92915050565b600081359050612531816140ac565b92915050565b600081519050612546816140ac565b92915050565b600082601f83011261255d57600080fd5b813561256d8482602086016123c0565b91505092915050565b600082601f83011261258757600080fd5b81516125978482602086016123fe565b91505092915050565b6000815190506125af816140c3565b92915050565b6000813590506125c4816140d3565b92915050565b600082601f8301126125db57600080fd5b81516125eb84826020860161243c565b91505092915050565b60006040828403121561260657600080fd5b61261060406135b7565b9050600082013567ffffffffffffffff81111561262c57600080fd5b61263884828501612670565b600083015250602082013567ffffffffffffffff81111561265857600080fd5b612664848285016124b9565b60208301525092915050565b60006080828403121561268257600080fd5b61268c60806135b7565b9050600061269c848285016126fc565b60008301525060206126b0848285016126fc565b60208301525060406126c4848285016125b5565b604083015250606082013567ffffffffffffffff8111156126e457600080fd5b6126f08482850161254c565b60608301525092915050565b60008135905061270b816140e3565b92915050565b600081519050612720816140e3565b92915050565b60006020828403121561273857600080fd5b60006127468482850161247a565b91505092915050565b60006020828403121561276157600080fd5b600061276f8482850161248f565b91505092915050565b60008060008060008060c0878903121561279157600080fd5b600061279f89828a016124a4565b96505060206127b089828a016124a4565b95505060406127c189828a01612711565b94505060606127d289828a01612537565b93505060806127e389828a016124a4565b92505060a087015167ffffffffffffffff81111561280057600080fd5b61280c89828a016125ca565b9150509295509295509295565b600080600080600080600060e0888a03121561283457600080fd5b60006128428a828b016124a4565b97505060206128538a828b016124a4565b96505060406128648a828b01612711565b95505060606128758a828b01612711565b94505060806128868a828b016124a4565b93505060a088015167ffffffffffffffff8111156128a357600080fd5b6128af8a828b016125ca565b92505060c06128c08a828b0161250d565b91505092959891949750929550565b60008060008060008060c087890312156128e857600080fd5b60006128f689828a016124a4565b965050602061290789828a01612711565b955050604061291889828a01612711565b945050606087015167ffffffffffffffff81111561293557600080fd5b61294189828a01612576565b935050608061295289828a016125a0565b92505060a061296389828a0161250d565b9150509295509295509295565b60006020828403121561298257600080fd5b600082013567ffffffffffffffff81111561299c57600080fd5b6129a8848285016124e3565b91505092915050565b6000602082840312156129c357600080fd5b60006129d18482850161250d565b91505092915050565b6000602082840312156129ec57600080fd5b60006129fa84828501612522565b91505092915050565b600080600060608486031215612a1857600080fd5b6000612a2686828701612522565b935050602084013567ffffffffffffffff811115612a4357600080fd5b612a4f868287016125f4565b925050604084013567ffffffffffffffff811115612a6c57600080fd5b612a788682870161254c565b9150509250925092565b600060208284031215612a9457600080fd5b600082015167ffffffffffffffff811115612aae57600080fd5b612aba848285016125ca565b91505092915050565b612acc816137dd565b82525050565b612adb816137cb565b82525050565b612aea816137ef565b82525050565b612af9816137fb565b82525050565b612b10612b0b826137fb565b6139ab565b82525050565b6000612b2182613696565b612b2b81856136ac565b9350612b3b8185602086016138cc565b612b4481613aa0565b840191505092915050565b6000612b5a82613696565b612b6481856136bd565b9350612b748185602086016138cc565b612b7d81613aa0565b840191505092915050565b612b9181613875565b82525050565b612ba081613887565b82525050565b612baf81613899565b82525050565b612bbe816138ab565b82525050565b6000612bcf826136a1565b612bd981856136ce565b9350612be98185602086016138cc565b612bf281613aa0565b840191505092915050565b6000612c08826136a1565b612c1281856136df565b9350612c228185602086016138cc565b80840191505092915050565b6000612c3b6020836136ce565b9150612c4682613ab1565b602082019050919050565b6000612c5e6023836136ce565b9150612c6982613ada565b604082019050919050565b6000612c816002836136df565b9150612c8c82613b29565b600282019050919050565b6000612ca46022836136ce565b9150612caf82613b52565b604082019050919050565b6000612cc7601a836136ce565b9150612cd282613ba1565b602082019050919050565b6000612cea601c836136ce565b9150612cf582613bca565b602082019050919050565b6000612d0d6026836136ce565b9150612d1882613bf3565b604082019050919050565b6000612d30601f836136ce565b9150612d3b82613c42565b602082019050919050565b6000612d53601e836136ce565b9150612d5e82613c6b565b602082019050919050565b6000612d766022836136ce565b9150612d8182613c94565b604082019050919050565b6000612d99601e836136ce565b9150612da482613ce3565b602082019050919050565b6000612dbc602e836136ce565b9150612dc782613d0c565b604082019050919050565b6000612ddf601f836136ce565b9150612dea82613d5b565b602082019050919050565b6000612e026022836136ce565b9150612e0d82613d84565b604082019050919050565b6000612e25601f836136ce565b9150612e3082613dd3565b602082019050919050565b6000612e486020836136ce565b9150612e5382613dfc565b602082019050919050565b6000612e6b6024836136ce565b9150612e7682613e25565b604082019050919050565b6000612e8e601b836136ce565b9150612e9982613e74565b602082019050919050565b6000612eb16025836136ce565b9150612ebc82613e9d565b604082019050919050565b6000612ed46023836136ce565b9150612edf82613eec565b604082019050919050565b6000612ef7601f836136ce565b9150612f0282613f3b565b602082019050919050565b6000612f1a6023836136ce565b9150612f2582613f64565b604082019050919050565b6000612f3d601f836136ce565b9150612f4882613fb3565b602082019050919050565b6000612f606027836136ce565b9150612f6b82613fdc565b604082019050919050565b6000608083016000830151612f8e6000860182612fd9565b506020830151612fa16020860182612fd9565b506040830151612fb46040860182612ba6565b5060608301518482036060860152612fcc8282612b16565b9150508091505092915050565b612fe28161385e565b82525050565b612ff18161385e565b82525050565b60006130038284612aff565b60208201915081905092915050565b600061301e8284612bfd565b915081905092915050565b600061303482612c74565b91506130408285612aff565b6020820191506130508284612aff565b6020820191508190509392505050565b60006020820190506130756000830184612ac3565b92915050565b60006040820190506130906000830185612ad2565b81810360208301526130a28184612bc4565b90509392505050565b60006080820190506130c06000830187612ad2565b6130cd6020830186612fe8565b81810360408301526130df8185612b4f565b90506130ee6060830184612b97565b95945050505050565b600060608201905061310c6000830186612ad2565b6131196020830185612fe8565b818103604083015261312b8184612bc4565b9050949350505050565b600060208201905061314a6000830184612af0565b92915050565b60006040820190506131656000830185612af0565b6131726020830184612af0565b9392505050565b600060608201905061318e6000830186612af0565b61319b6020830185612af0565b6131a86040830184612af0565b949350505050565b60006060820190506131c56000830186612af0565b81810360208301526131d78185612b4f565b905081810360408301526131eb8184612b4f565b9050949350505050565b600060208201905061320a6000830184612bb5565b92915050565b6000602082019050818103600083015261322a8184612bc4565b905092915050565b6000602082019050818103600083015261324b81612c2e565b9050919050565b6000602082019050818103600083015261326b81612c51565b9050919050565b6000602082019050818103600083015261328b81612c97565b9050919050565b600060208201905081810360008301526132ab81612cba565b9050919050565b600060208201905081810360008301526132cb81612cdd565b9050919050565b600060208201905081810360008301526132eb81612d00565b9050919050565b6000602082019050818103600083015261330b81612d23565b9050919050565b6000602082019050818103600083015261332b81612d46565b9050919050565b6000602082019050818103600083015261334b81612d69565b9050919050565b6000602082019050818103600083015261336b81612d8c565b9050919050565b6000602082019050818103600083015261338b81612daf565b9050919050565b600060208201905081810360008301526133ab81612dd2565b9050919050565b600060208201905081810360008301526133cb81612df5565b9050919050565b600060208201905081810360008301526133eb81612e18565b9050919050565b6000602082019050818103600083015261340b81612e3b565b9050919050565b6000602082019050818103600083015261342b81612e5e565b9050919050565b6000602082019050818103600083015261344b81612e81565b9050919050565b6000602082019050818103600083015261346b81612ea4565b9050919050565b6000602082019050818103600083015261348b81612ec7565b9050919050565b600060208201905081810360008301526134ab81612eea565b9050919050565b600060208201905081810360008301526134cb81612f0d565b9050919050565b600060208201905081810360008301526134eb81612f30565b9050919050565b6000602082019050818103600083015261350b81612f53565b9050919050565b6000602082019050818103600083015261352c8184612f76565b905092915050565b60006020820190506135496000830184612fe8565b92915050565b600060c0820190506135646000830189612fe8565b6135716020830188612fe8565b81810360408301526135838187612bc4565b90506135926060830186612ad2565b61359f6080830185612b88565b6135ac60a0830184612ae1565b979650505050505050565b60006135c16135d2565b90506135cd8282613931565b919050565b6000604051905090565b600067ffffffffffffffff8211156135f7576135f6613a71565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561362357613622613a71565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561364f5761364e613a71565b5b61365882613aa0565b9050602081019050919050565b600067ffffffffffffffff8211156136805761367f613a71565b5b61368982613aa0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006136f58261385e565b91506137008361385e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613735576137346139b5565b5b828201905092915050565b600061374b8261385e565b91506137568361385e565b925082613766576137656139e4565b5b828204905092915050565b600061377c8261385e565b91506137878361385e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137c0576137bf6139b5565b5b828202905092915050565b60006137d68261383e565b9050919050565b60006137e88261383e565b9050919050565b60008115159050919050565b6000819050919050565b60008190506138138261402b565b919050565b60008190506138268261403f565b919050565b600081905061383982614053565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061388082613805565b9050919050565b600061389282613818565b9050919050565b60006138a48261382b565b9050919050565b60006138b682613868565b9050919050565b82818337600083830152505050565b60005b838110156138ea5780820151818401526020810190506138cf565b838111156138f9576000848401525b50505050565b6000600282049050600182168061391757607f821691505b6020821081141561392b5761392a613a42565b5b50919050565b61393a82613aa0565b810181811067ffffffffffffffff8211171561395957613958613a71565b5b80604052505050565b600061396d8261385e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139a05761399f6139b5565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537068696e784d6f64756c653a20696e76616c6964206c65616620696e646578600082015250565b7f537068696e784d6f64756c653a2063616c6c65722069736e277420657865637560008201527f746f720000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f537068696e784d6f64756c653a206e6f206c656176657320746f20657865637560008201527f7465000000000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e76616c696420726f6f74000000000000600082015250565b7f537068696e784d6f64756c653a206e6f2061637469766520726f6f7400000000600082015250565b7f537068696e784d6f64756c653a206578747261206c6561766573206e6f74206160008201527f6c6c6f7765640000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e76616c6964206c656166207479706500600082015250565b7f537068696e784d6f64756c653a20696e76616c696420636861696e2069640000600082015250565b7f537068696e784d6f64756c653a20696e76616c6964205361666520766572736960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e73756666696369656e74206761730000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20726f6f7420616c7265616479207573656400600082015250565b7f537068696e784d6f64756c653a20696e76616c6964205361666520616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a206e6f20726f6f7420746f2063616e63656c00600082015250565b7f537068696e784d6f64756c653a20616374697665206d65726b6c6520726f6f74600082015250565b7f537068696e784d6f64756c653a20696e76616c696420726f6f7420746f20636160008201527f6e63656c00000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e76616c6964206e6f6e63650000000000600082015250565b7f537068696e784d6f64756c653a206c65616620636861696e206964206d75737460008201527f2062652030000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a206e756d4c65617665732063616e6e6f74206260008201527f6520300000000000000000000000000000000000000000000000000000000000602082015250565b7f537068696e784d6f64756c653a20696e76616c6964205361666550726f787900600082015250565b7f537068696e784d6f64756c653a206661696c656420746f20766572696679206c60008201527f6561660000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f537068696e784d6f64756c653a20696e76616c696420537068696e784d6f647560008201527f6c6550726f787900000000000000000000000000000000000000000000000000602082015250565b6005811061403c5761403b613a13565b5b50565b600281106140505761404f613a13565b5b50565b6003811061406457614063613a13565b5b50565b614070816137cb565b811461407b57600080fd5b50565b614087816137dd565b811461409257600080fd5b50565b61409e816137ef565b81146140a957600080fd5b50565b6140b5816137fb565b81146140c057600080fd5b50565b600281106140d057600080fd5b50565b600381106140e057600080fd5b50565b6140ec8161385e565b81146140f757600080fd5b5056fea26469706673582212204e7cbc9883288763a0a52ee490bf0d3f2a67d12b48b8b730701eae2220c2e67c64736f6c63430008040033", + 0x8f3301c9Eada5642B5bB12FD047D3EBb2932E619 + ); + contracts[2] = SystemContractInfo( + hex"60a060405234801561001057600080fd5b503073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060805160601c6103526100656000398061017052506103526000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80631c5fb21114610030575b600080fd5b6100de6004803603608081101561004657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561008d57600080fd5b82018360208201111561009f57600080fd5b803590602001918460018302840111640100000000831117156100c157600080fd5b9091929391929390803560ff169060200190929190505050610169565b60405180848152602001831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561012c578082015181840152602081019050610111565b50505050905090810190601f1680156101595780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806102e46039913960400191505060405180910390fd5b60005a9050610269898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050885a610297565b92505a8103935060405160203d0181016040523d81523d6000602083013e8092505050955095509592505050565b60006001808111156102a557fe5b8360018111156102b157fe5b14156102ca576000808551602087018986f490506102da565b600080855160208701888a87f190505b9594505050505056fe53696d756c61746554784163636573736f722073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca2646970667358221220405c212754c23731ee9658f3175dafa74dea363d2619aad9d5576f5a9d4982f764736f6c63430007060033", + 0x59AD6735bCd8152B84860Cb256dD9e96b85F69Da + ); + contracts[3] = SystemContractInfo( + hex"608060405234801561001057600080fd5b50610ebe806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631688f0b9146100675780632500510e1461017657806353e5d9351461024357806361b69abd146102c6578063addacc0f146103cb578063d18af54d1461044e575b600080fd5b61014a6004803603606081101561007d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156100ba57600080fd5b8201836020820111156100cc57600080fd5b803590602001918460018302840111640100000000831117156100ee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061057d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102176004803603606081101561018c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101c957600080fd5b8201836020820111156101db57600080fd5b803590602001918460018302840111640100000000831117156101fd57600080fd5b909192939192939080359060200190929190505050610624565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61024b610751565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561028b578082015181840152602081019050610270565b50505050905090810190601f1680156102b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61039f600480360360408110156102dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561031957600080fd5b82018360208201111561032b57600080fd5b8035906020019184600183028401116401000000008311171561034d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061077c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d3610861565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104135780820151818401526020810190506103f8565b50505050905090810190601f1680156104405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105516004803603608081101561046457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156104a157600080fd5b8201836020820111156104b357600080fd5b803590602001918460018302840111640100000000831117156104d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061088c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600061058a848484610a3b565b90506000835111156105b25760008060008551602087016000865af114156105b157600080fd5b5b7f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2358185604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a19392505050565b60006106758585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505084610a3b565b905080604051602001808273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156107165780820151818401526020810190506106fb565b50505050905090810190601f1680156107435780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60606040518060200161076390610bde565b6020820181038252601f19601f82011660405250905090565b60008260405161078b90610bde565b808273ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f0801580156107c7573d6000803e3d6000fd5b5090506000825111156107f05760008060008451602086016000865af114156107ef57600080fd5b5b7f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2358184604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a192915050565b60606040518060200161087390610beb565b6020820181038252601f19601f82011660405250905090565b6000808383604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012060001c90506108e786868361057d565b9150600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a32578273ffffffffffffffffffffffffffffffffffffffff16631e52b518838888886040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156109ca5780820151818401526020810190506109af565b50505050905090810190601f1680156109f75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015610a1957600080fd5b505af1158015610a2d573d6000803e3d6000fd5b505050505b50949350505050565b6000808380519060200120836040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050600060405180602001610a8890610bde565b6020820181038252601f19601f820116604052508673ffffffffffffffffffffffffffffffffffffffff166040516020018083805190602001908083835b60208310610ae95780518252602082019150602081019050602083039250610ac6565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001925050506040516020818303038152906040529050818151826020016000f59250600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f437265617465322063616c6c206661696c65640000000000000000000000000081525060200191505060405180910390fd5b50509392505050565b6101e680610bf883390190565b60ab80610dde8339019056fe608060405234801561001057600080fd5b506040516101e63803806101e68339818101604052602081101561003357600080fd5b8101908080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156100ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806101c46022913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060ab806101196000396000f3fe608060405273ffffffffffffffffffffffffffffffffffffffff600054167fa619486e0000000000000000000000000000000000000000000000000000000060003514156050578060005260206000f35b3660008037600080366000845af43d6000803e60008114156070573d6000fd5b3d6000f3fea2646970667358221220d1429297349653a4918076d650332de1a1068c5f3e07c5c82360c277770b955264736f6c63430007060033496e76616c69642073696e676c65746f6e20616464726573732070726f7669646564608060405273ffffffffffffffffffffffffffffffffffffffff600054167fa619486e0000000000000000000000000000000000000000000000000000000060003514156050578060005260206000f35b3660008037600080366000845af43d6000803e60008114156070573d6000fd5b3d6000f3fea2646970667358221220d1429297349653a4918076d650332de1a1068c5f3e07c5c82360c277770b955264736f6c63430007060033a26469706673582212200c75fe2196b9f752c82794253f2ebce0d821afef5997e1d5a35ec316ce592f6664736f6c63430007060033", + 0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2 + ); + contracts[4] = SystemContractInfo( + hex"608060405234801561001057600080fd5b506108dd806100206000396000f3fe608060405234801561001057600080fd5b506004361061007c5760003560e01c8063a3f4df7e1161005b578063a3f4df7e14610312578063bc197c8114610395578063f23a6e611461052b578063ffa1ad741461062b5761007c565b806223de291461008157806301ffc9a7146101b9578063150b7a021461021c575b600080fd5b6101b7600480360360c081101561009757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561011e57600080fd5b82018360208201111561013057600080fd5b8035906020019184600183028401116401000000008311171561015257600080fd5b90919293919293908035906020019064010000000081111561017357600080fd5b82018360208201111561018557600080fd5b803590602001918460018302840111640100000000831117156101a757600080fd5b90919293919293905050506106ae565b005b610204600480360360208110156101cf57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506106b8565b60405180821515815260200191505060405180910390f35b6102dd6004803603608081101561023257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561029957600080fd5b8201836020820111156102ab57600080fd5b803590602001918460018302840111640100000000831117156102cd57600080fd5b90919293919293905050506107f2565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61031a610807565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035a57808201518184015260208101905061033f565b50505050905090810190601f1680156103875780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104f6600480360360a08110156103ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561040857600080fd5b82018360208201111561041a57600080fd5b8035906020019184602083028401116401000000008311171561043c57600080fd5b90919293919293908035906020019064010000000081111561045d57600080fd5b82018360208201111561046f57600080fd5b8035906020019184602083028401116401000000008311171561049157600080fd5b9091929391929390803590602001906401000000008111156104b257600080fd5b8201836020820111156104c457600080fd5b803590602001918460018302840111640100000000831117156104e657600080fd5b9091929391929390505050610840565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6105f6600480360360a081101561054157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001906401000000008111156105b257600080fd5b8201836020820111156105c457600080fd5b803590602001918460018302840111640100000000831117156105e657600080fd5b9091929391929390505050610858565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61063361086e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610673578082015181840152602081019050610658565b50505050905090810190601f1680156106a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b5050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078357507f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107eb57507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600063150b7a0260e01b905095945050505050565b6040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b600063bc197c8160e01b905098975050505050505050565b600063f23a6e6160e01b90509695505050505050565b6040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508156fea26469706673582212200bbabd2b02039e0c6d17ac82e70232971fd892df99a0509daa50ef3d6edad0bc64736f6c63430007060033", + 0x1AC114C2099aFAf5261731655Dc6c306bFcd4Dbd + ); + contracts[5] = SystemContractInfo( + hex"608060405234801561001057600080fd5b50611574806100206000396000f3fe608060405234801561001057600080fd5b50600436106100ce5760003560e01c80636ac247841161008c578063bc197c8111610066578063bc197c81146107bb578063bd61951d14610951578063f23a6e6114610a63578063ffa1ad7414610b63576100ce565b80636ac24784146105ea578063a3f4df7e146106d9578063b2494df31461075c576100ce565b806223de29146100d357806301ffc9a71461020b5780630a1028c41461026e578063150b7a021461033d5780631626ba7e1461043357806320c13b0b146104e9575b600080fd5b610209600480360360c08110156100e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561017057600080fd5b82018360208201111561018257600080fd5b803590602001918460018302840111640100000000831117156101a457600080fd5b9091929391929390803590602001906401000000008111156101c557600080fd5b8201836020820111156101d757600080fd5b803590602001918460018302840111640100000000831117156101f957600080fd5b9091929391929390505050610be6565b005b6102566004803603602081101561022157600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610bf0565b60405180821515815260200191505060405180910390f35b6103276004803603602081101561028457600080fd5b81019080803590602001906401000000008111156102a157600080fd5b8201836020820111156102b357600080fd5b803590602001918460018302840111640100000000831117156102d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d2a565b6040518082815260200191505060405180910390f35b6103fe6004803603608081101561035357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103ba57600080fd5b8201836020820111156103cc57600080fd5b803590602001918460018302840111640100000000831117156103ee57600080fd5b9091929391929390505050610d3d565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6104b46004803603604081101561044957600080fd5b81019080803590602001909291908035906020019064010000000081111561047057600080fd5b82018360208201111561048257600080fd5b803590602001918460018302840111640100000000831117156104a457600080fd5b9091929391929390505050610d52565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6105b5600480360360408110156104ff57600080fd5b810190808035906020019064010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184600183028401116401000000008311171561055057600080fd5b90919293919293908035906020019064010000000081111561057157600080fd5b82018360208201111561058357600080fd5b803590602001918460018302840111640100000000831117156105a557600080fd5b9091929391929390505050610f0a565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6106c36004803603604081101561060057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561063d57600080fd5b82018360208201111561064f57600080fd5b8035906020019184600183028401116401000000008311171561067157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061115b565b6040518082815260200191505060405180910390f35b6106e16112cd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610721578082015181840152602081019050610706565b50505050905090810190601f16801561074e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610764611306565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107a757808201518184015260208101905061078c565b505050509050019250505060405180910390f35b61091c600480360360a08110156107d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561082e57600080fd5b82018360208201111561084057600080fd5b8035906020019184602083028401116401000000008311171561086257600080fd5b90919293919293908035906020019064010000000081111561088357600080fd5b82018360208201111561089557600080fd5b803590602001918460208302840111640100000000831117156108b757600080fd5b9091929391929390803590602001906401000000008111156108d857600080fd5b8201836020820111156108ea57600080fd5b8035906020019184600183028401116401000000008311171561090c57600080fd5b909192939192939050505061146d565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6109e86004803603604081101561096757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109a457600080fd5b8201836020820111156109b657600080fd5b803590602001918460018302840111640100000000831117156109d857600080fd5b9091929391929390505050611485565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a28578082015181840152602081019050610a0d565b50505050905090810190601f168015610a555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b2e600480360360a0811015610a7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610aea57600080fd5b820183602082011115610afc57600080fd5b80359060200191846001830284011164010000000083111715610b1e57600080fd5b90919293919293905050506114ef565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b610b6b611505565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bab578082015181840152602081019050610b90565b50505050905090810190601f168015610bd85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b5050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cbb57507f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d2357507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000610d36338361115b565b9050919050565b600063150b7a0260e01b905095945050505050565b60008033905060008173ffffffffffffffffffffffffffffffffffffffff166320c13b0b876040516020018082815260200191505060405160208183030381529060405287876040518463ffffffff1660e01b8152600401808060200180602001838103835286818151815260200191508051906020019080838360005b83811015610deb578082015181840152602081019050610dd0565b50505050905090810190601f168015610e185780820380516001836020036101000a031916815260200191505b508381038252858582818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060206040518083038186803b158015610e6357600080fd5b505afa158015610e77573d6000803e3d6000fd5b505050506040513d6020811015610e8d57600080fd5b810190808051906020019092919050505090506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610ef657600060e01b610eff565b631626ba7e60e01b5b925050509392505050565b6000803390506000610f608288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061115b565b905060008585905014156110755760008273ffffffffffffffffffffffffffffffffffffffff16635ae6bd37836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fc157600080fd5b505afa158015610fd5573d6000803e3d6000fd5b505050506040513d6020811015610feb57600080fd5b81019080805190602001909291905050501415611070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f48617368206e6f7420617070726f76656400000000000000000000000000000081525060200191505060405180910390fd5b611147565b8173ffffffffffffffffffffffffffffffffffffffff1663934f3a1182898989896040518663ffffffff1660e01b81526004018086815260200180602001806020018381038352878782818152602001925080828437600081840152601f19601f8201169050808301925050508381038252858582818152602001925080828437600081840152601f19601f82011690508083019250505097505050505050505060006040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050505b6320c13b0b60e01b92505050949350505050565b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b8573ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b815260040160206040518083038186803b15801561120957600080fd5b505afa15801561121d573d6000803e3d6000fd5b505050506040513d602081101561123357600080fd5b81019080805190602001909291905050508360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040528051906020012091505092915050565b6040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b6060600033905060008173ffffffffffffffffffffffffffffffffffffffff1663cc2f84526001600a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060006040518083038186803b15801561138057600080fd5b505afa158015611394573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060408110156113be57600080fd5b81019080805160405193929190846401000000008211156113de57600080fd5b838201915060208201858111156113f457600080fd5b825186602082028301116401000000008211171561141157600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561144857808201518184015260208101905061142d565b5050505090500160405260200180519060200190929190505050509050809250505090565b600063bc197c8160e01b905098975050505050505050565b60606040517fb4faba09000000000000000000000000000000000000000000000000000000008152600436036004808301376020600036836000335af15060203d036040519250808301604052806020843e6000516114e657825160208401fd5b50509392505050565b600063f23a6e6160e01b90509695505050505050565b6040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508156fea26469706673582212204251d58f2a197439239faafa82818b7696d25bb75655794a81cc773a0e39ed2b64736f6c63430007060033", + 0xf48f2B2d2a534e402487b3ee7C18c33Aec0Fe5e4 + ); + contracts[6] = SystemContractInfo( + hex"608060405234801561001057600080fd5b5061045f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634847be6f1461003b5780634c8c9ea114610134575b600080fd5b6101086004803603606081101561005157600080fd5b81019080803590602001909291908035906020019064010000000081111561007857600080fd5b82018360208201111561008a57600080fd5b803590602001918460018302840111640100000000831117156100ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610223565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101f76004803603604081101561014a57600080fd5b81019080803590602001909291908035906020019064010000000081111561017157600080fd5b82018360208201111561018357600080fd5b803590602001918460018302840111640100000000831117156101a557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610327565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008183518460200186f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156102d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f436f756c64206e6f74206465706c6f7920636f6e74726163740000000000000081525060200191505060405180910390fd5b7f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51181604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a19392505050565b600081516020830184f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156103d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f436f756c64206e6f74206465706c6f7920636f6e74726163740000000000000081525060200191505060405180910390fd5b7f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51181604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a19291505056fea26469706673582212203aa87bc5f141a4ee0319caa1412f294b7a71e2ffc270a0cc5e506a8b320df24464736f6c63430007060033", + 0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4 + ); + contracts[7] = SystemContractInfo( + hex"60a060405234801561001057600080fd5b503073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060805160601c6102756100646000398060e052506102756000f3fe60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c63430007060033", + 0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761 + ); + contracts[8] = SystemContractInfo( + hex"608060405234801561001057600080fd5b5061019a806100206000396000f3fe60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c63430007060033", + 0x40A2aCCbd92BCA938b02010E17A5b8929b49130D + ); + contracts[9] = SystemContractInfo( + hex"608060405234801561001057600080fd5b506103c6806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630a1028c41461003b57806385a5affe1461010a575b600080fd5b6100f46004803603602081101561005157600080fd5b810190808035906020019064010000000081111561006e57600080fd5b82018360208201111561008057600080fd5b803590602001918460018302840111640100000000831117156100a257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610183565b6040518082815260200191505060405180910390f35b6101816004803603602081101561012057600080fd5b810190808035906020019064010000000081111561013d57600080fd5b82018360208201111561014f57600080fd5b8035906020019184600183028401116401000000008311171561017157600080fd5b90919293919293905050506102f4565b005b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b3073ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b815260040160206040518083038186803b15801561023157600080fd5b505afa158015610245573d6000803e3d6000fd5b505050506040513d602081101561025b57600080fd5b81019080805190602001909291905050508360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260010183815260200182815260200194505050505060405160208183030381529060405280519060200120915050919050565b600061034383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610183565b905060016007600083815260200190815260200160002081905550807fe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e460405160405180910390a250505056fea264697066735822122078bcee081c884d5fea3f900c2ac03d317d726d0f404059fcb5776fd4235768ea64736f6c63430007060033", + 0xA65387F16B013cf2Af4605Ad8aA5ec25a2cbA3a2 + ); + contracts[10] = SystemContractInfo( + hex"608060405234801561001057600080fd5b506001600481905550615cf880620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506126fc565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b810190808035906020019092919080359060200190929190505050612732565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b81019080803590602001909291905050506127b9565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d1565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612b63565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c9d565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612edc565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612f01565b005b348015610d3457600080fd5b50610d3d612f90565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613139565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061313f565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613161565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff16906020019092919050505061331f565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613447565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613639565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137d8565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613805565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b96565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b34801561148957600080fd5b5061149261428c565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614296565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061443e565b005b3480156116a457600080fd5b506116ad61449f565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061451d565b005b34801561174a57600080fd5b50611753614950565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614989565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612b63565b5b5050565b611bd2604182614a2c90919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614a66565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614a2c90919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614a9590919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614a9590919063ffffffff16565b614a9590919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b60007fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e3386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183600181111561266b57fe5b8152602001828103825284818151815260200191508051906020019080838360005b838110156126a857808201518184015260208101905061268d565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a16126f285858585614ab4565b9050949350505050565b6000606061270c868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561275057600080fd5b506040519080825280601f01601f1916602001820160405280156127835781602001600182028036833780820191505090505b50905060005b838110156127ae57808501548060208302602085010152508080600101915050612789565b508091505092915050565b60076020528060005260406000206000915090505481565b6127d9614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128435750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612b6b614989565b600354811115612be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000606060055433600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed8d8d8d8d8d8d8d8d8d8d8d8c604051808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612d5057fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528e8e82818152602001925080828437600081840152601f19601f820116905080830192505050848103835286818151815260200191508051906020019080838360005b83811015612e0a578082015181840152602081019050612def565b50505050905090810190601f168015612e375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612e70578082015181840152602081019050612e55565b50505050905090810190601f168015612e9d5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390a1612eca8d8d8d8d8d8d8d8d8d8d8d614c9a565b9150509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612f7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612f8a84848484611bbe565b50505050565b6060600060035467ffffffffffffffff81118015612fad57600080fd5b50604051908082528060200260200182016040528015612fdc5781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613130578083838151811061308757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613046565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6131ac8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050896151d7565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131ea576131e9846156d7565b5b6132388787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615706565b60008211156132525761325082600060018685615941565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a9050613376878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615b47565b61337f57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340c5780820151818401526020810190506133f1565b50505050905090810190601f1680156134395780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561346257600080fd5b506040519080825280602002602001820160405280156134915781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135645750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561356f57508482105b1561362a578084838151811061358157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506134fa565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006137ed8c8c8c8c8c8c8c8c8c8c8c614296565b8051906020012090509b9a5050505050505050505050565b61380d614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156138775750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6138e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613b9e614989565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613c22614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c8c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613cc457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613ea15750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561432757fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6143b361449f565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b614446614989565b61444f816156d7565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6144cd6125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b614525614989565b8060016003540310156145a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561460a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61467c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461477c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461494b5761494a81612b63565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614a3f5760009050614a60565b6000828402905082848281614a5057fe5b0414614a5b57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614aaa57600080fd5b8091505092915050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614b7f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b614bf1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b614bfe858585855a615b47565b90508015614c4e573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2614c92565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000806000614cb48e8e8e8e8e8e8e8e8e8e600554614296565b905060056000815480929190600101919050555080805190602001209150614cdd828286612f01565b506000614ce8615b93565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ece578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115614d8b57fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015614e5d578082015181840152602081019050614e42565b50505050905090810190601f168015614e8a5780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015614eb557600080fd5b505af1158015614ec9573d6000803e3d6000fd5b505050505b6101f4614ef56109c48b01603f60408d0281614ee657fe5b04615bc490919063ffffffff16565b015a1015614f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a9050614fd48f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d14614fc9578e614fcf565b6109c45a035b615b47565b9350614fe95a82615bde90919063ffffffff16565b90508380614ff8575060008a14155b80615004575060008814155b615076576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156150905761508d828b8b8b8b615941565b90505b84156150da577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a161511a565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146151c6578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156151ad57600080fd5b505af11580156151c1573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b60006004541461524f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81518111156152c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600181101561533d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b835181101561564357600084828151811061535d57fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153d15750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561540957503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561544157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6154b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615346565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461593d576158ca8260008360015a615b47565b61593c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461597e5782615980565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615a98576159ea3a86106159c7573a6159c9565b855b6159dc888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615b3d565b615abd85615aaf888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b9150615aca848284615bfe565b615b3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600180811115615b5557fe5b836001811115615b6157fe5b1415615b7a576000808551602087018986f49050615b8a565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015615bd45781615bd6565b825b905092915050565b600082821115615bed57600080fd5b600082840390508091505092915050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615ca55760208114615cad5760009350615cb8565b819350615cb8565b600051158215171593505b505050939250505056fea2646970667358221220047fac33099ca576d1c4f1ac6a8abdb0396e42ad6a397d2cb2f4dc1624cc0c5b64736f6c63430007060033", + 0x3E5c63644E683549055b9Be8653de26E0B4CD36E + ); + contracts[11] = SystemContractInfo( + hex"608060405234801561001057600080fd5b5060016004819055506159ae80620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033", + 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552 + ); + contracts[12] = SystemContractInfo( + hex"608060405234801561001057600080fd5b50610239806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c64b3bb514610030575b600080fd5b61004361003e3660046100c3565b610057565b604051901515815260200160405180910390f35b6000808280602001905181019061006e9190610192565b6020810151905173ffffffffffffffffffffffffffffffffffffffff1631109392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156100d557600080fd5b813567ffffffffffffffff808211156100ed57600080fd5b818401915084601f83011261010157600080fd5b81358181111561011357610113610094565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561015957610159610094565b8160405282815287602084870101111561017257600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000604082840312156101a457600080fd5b6040516040810181811067ffffffffffffffff821117156101c7576101c7610094565b604052825173ffffffffffffffffffffffffffffffffffffffff811681146101ee57600080fd5b8152602092830151928101929092525091905056fea2646970667358221220cc86d01120737597addcccffd841244801dcb64ce402d73b8d8569a52348996464736f6c63430008100033", + 0xc3a9e8E4e823DC39c1415290366Cc62A186B268b + ); + return contracts; + } +} diff --git a/packages/core/config/local.ts b/packages/core/config/local.ts deleted file mode 100644 index 5b094bd1c..000000000 --- a/packages/core/config/local.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SphinxSystemConfig } from '../src' - -const config: SphinxSystemConfig = { - relayers: ['0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'], -} - -export default config diff --git a/packages/core/config/standard.ts b/packages/core/config/standard.ts deleted file mode 100644 index 56ae581f1..000000000 --- a/packages/core/config/standard.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { SphinxSystemConfig } from '../src' - -const config: SphinxSystemConfig = { - relayers: [ - '0x42761FAcF5e6091fcA0e38F450adfB1E22bD8c3C', - '0x4F2107d09B095B92f80ecd5b66C4004B87DC2652', - '0x791Cf9e43E0ca66b470E2a82Ec103d9e712623e2', - '0xC034550B542b83BA1De312b21d1C94a9a52B1595', - '0x808923399391944164220074Ef3Cc6ad4701526f', - '0xb7e97060DE2DFfDcB39d765079A3ddd07d6E30A2', - ], -} - -export default config diff --git a/packages/core/hardhat.config.ts b/packages/core/hardhat.config.ts index cc6ce468d..cfb394301 100644 --- a/packages/core/hardhat.config.ts +++ b/packages/core/hardhat.config.ts @@ -14,7 +14,7 @@ import { Wallet } from 'ethers' import ora from 'ora' import { SphinxJsonRpcProvider } from './src/provider' -import { SphinxSystemConfig, deploySphinxSystem } from './src/languages' +import { deploySphinxSystem } from './src/languages' import { verifySphinxSystem } from './src/etherscan' import { ExecutionMode } from './src/constants' import { isVerificationSupportedForNetwork } from './src/networks' @@ -61,49 +61,38 @@ const config: HardhatUserConfig = { task('deploy-system') .setDescription('Deploys the Sphinx contracts to the specified network') - .addParam('systemConfig', 'Path to a Sphinx system config file') - .setAction( - async ( - args: { - systemConfig: string - }, - hre: HardhatRuntimeEnvironment - ) => { - // Throw an error if we're on the Hardhat network. This ensures that the `url` field is - // defined for this network. - if (!('url' in hre.network.config)) { - throw new Error( - `Cannot deploy Sphinx on the Hardhat network using this task.` - ) - } - const provider = new SphinxJsonRpcProvider(hre.network.config.url) - const signer = new Wallet(process.env.PRIVATE_KEY!).connect(provider) - - const systemConfig: SphinxSystemConfig = - require(args.systemConfig).default + .setAction(async (_, hre: HardhatRuntimeEnvironment) => { + // Throw an error if we're on the Hardhat network. This ensures that the `url` field is + // defined for this network. + if (!('url' in hre.network.config)) { + throw new Error( + `Cannot deploy Sphinx on the Hardhat network using this task.` + ) + } + const provider = new SphinxJsonRpcProvider(hre.network.config.url) + const signer = new Wallet(process.env.PRIVATE_KEY!).connect(provider) - const spinner = ora() - const logger = new Logger({ - name: 'Logger', - }) + const spinner = ora() + const logger = new Logger({ + name: 'Logger', + }) - await deploySphinxSystem( - provider, - signer, - systemConfig.relayers, - ExecutionMode.LiveNetworkCLI, - true, - spinner - ) + await deploySphinxSystem( + provider, + signer, + [], + ExecutionMode.LiveNetworkCLI, + true, + spinner + ) - if ( - isVerificationSupportedForNetwork((await provider.getNetwork()).chainId) - ) { - await verifySphinxSystem(provider, logger) - } else { - spinner.info('Verification unsupported on this network') - } + if ( + isVerificationSupportedForNetwork((await provider.getNetwork()).chainId) + ) { + await verifySphinxSystem(provider, logger) + } else { + spinner.info('Verification unsupported on this network') } - ) + }) export default config diff --git a/packages/core/src/actions/execute.ts b/packages/core/src/actions/execute.ts index e8a14ec93..98bb2c421 100644 --- a/packages/core/src/actions/execute.ts +++ b/packages/core/src/actions/execute.ts @@ -4,7 +4,7 @@ import { SphinxLeafWithProof, ManagedServiceABI, SphinxMerkleTree, - getManagedServiceAddress, + getPermissionlessRelayAddress, SphinxLeafType, getGnosisSafeSingletonAddress, GnosisSafeProxyFactoryArtifact, @@ -35,7 +35,6 @@ import { getReadableActions, getSphinxWalletsSortedByAddress, removeSphinxWalletsFromGnosisSafeOwners, - setManagedServiceRelayer, toSphinxLeafWithProofArray, } from '../utils' import { @@ -558,10 +557,6 @@ export const injectRoles: InjectRoles = async ( ) } - // Before we can execute the deployment, we must assign the relayer role to the signer so they - // will be able to execute transactions via the managed service contract. - await setManagedServiceRelayer(wallet.address, deploymentContext.provider) - // Before we can approve the deployment, we must add a set of auto-generated wallets as owners of // the Gnosis Safe. This allows us to approve the deployment without knowing the private keys of // the actual Gnosis Safe owners. @@ -596,7 +591,7 @@ export const removeRoles: RemoveRoles = async ( ) } -export const approveDeploymentViaManagedService: ApproveDeployment = async ( +export const approveDeploymentViaRelay: ApproveDeployment = async ( merkleRoot, approvalLeafWithProof, executionMode, @@ -604,8 +599,8 @@ export const approveDeploymentViaManagedService: ApproveDeployment = async ( deploymentContext ) => { const { moduleAddress } = deploymentContext.deployment - const managedServiceReadOnly = new ethers.Contract( - getManagedServiceAddress(), + const relayReadOnly = new ethers.Contract( + getPermissionlessRelayAddress(), ManagedServiceABI ) const packedOwnerSignatures = ethers.solidityPacked( @@ -623,7 +618,7 @@ export const approveDeploymentViaManagedService: ApproveDeployment = async ( [merkleRoot, approvalLeafWithProof, packedOwnerSignatures] ) - const execData = managedServiceReadOnly.interface.encodeFunctionData('exec', [ + const execData = relayReadOnly.interface.encodeFunctionData('exec', [ moduleAddress, approvalData, ]) @@ -631,7 +626,7 @@ export const approveDeploymentViaManagedService: ApproveDeployment = async ( return deploymentContext.executeTransaction( deploymentContext, { - to: getManagedServiceAddress(), + to: getPermissionlessRelayAddress(), data: execData, chainId: deploymentContext.deployment.chainId, }, @@ -648,7 +643,7 @@ export const executeActionsViaManagedService: ExecuteActions = async ( const { provider } = deploymentContext const { moduleAddress, chainId } = deploymentContext.deployment const managedService = new ethers.Contract( - getManagedServiceAddress(), + getPermissionlessRelayAddress(), ManagedServiceABI ) @@ -679,7 +674,7 @@ export const executeActionsViaManagedService: ExecuteActions = async ( return deploymentContext.executeTransaction( deploymentContext, { - to: getManagedServiceAddress(), + to: getPermissionlessRelayAddress(), data: managedServiceExecData, chainId: deploymentContext.deployment.chainId, }, @@ -935,7 +930,7 @@ const executeDeployment = async ( executionMode === ExecutionMode.Platform ) { estimateGas = estimateGasViaManagedService - approveDeployment = approveDeploymentViaManagedService + approveDeployment = approveDeploymentViaRelay executeActions = executeActionsViaManagedService } else if (executionMode === ExecutionMode.LiveNetworkCLI) { estimateGas = estimateGasViaSigner diff --git a/packages/core/src/actions/types.ts b/packages/core/src/actions/types.ts index e0819f994..26906e708 100644 --- a/packages/core/src/actions/types.ts +++ b/packages/core/src/actions/types.ts @@ -164,7 +164,6 @@ export type ProposalRequest = { projectName: string chainIds: Array projectDeployments: Array - gasEstimates: Array diff: SphinxPreview compilerConfigId: string | undefined deploymentConfigId: string | undefined diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts index dbab95cfb..471954993 100644 --- a/packages/core/src/constants.ts +++ b/packages/core/src/constants.ts @@ -1,11 +1,7 @@ -import { ethers } from 'ethers' - export const WEBSITE_URL = `https://sphinx.dev` export type Integration = 'hardhat' | 'foundry' -export const RELAYER_ROLE = ethers.keccak256(ethers.toUtf8Bytes('RELAYER_ROLE')) - export enum ExecutionMode { LocalNetworkCLI, LiveNetworkCLI, diff --git a/packages/core/src/languages/solidity/predeploys.ts b/packages/core/src/languages/solidity/predeploys.ts index 35e99fdb0..a98e8d85d 100644 --- a/packages/core/src/languages/solidity/predeploys.ts +++ b/packages/core/src/languages/solidity/predeploys.ts @@ -1,15 +1,8 @@ import { assert } from 'console' -import { AbiCoder, Contract, ZeroHash, ethers } from 'ethers' +import { Contract, ethers } from 'ethers' import { DETERMINISTIC_DEPLOYMENT_PROXY_ADDRESS, - DrippieArtifact, - ManagedServiceArtifact, - OWNER_MULTISIG_ADDRESS, - getCheckBalanceLowAddress, - getDrippieAddress, - getManagedServiceAddress, - getOwnerAddress, getSphinxConstants, } from '@sphinx-labs/contracts' import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' @@ -18,17 +11,10 @@ import ora from 'ora' import { isContractDeployed, getGasPriceOverrides, - isLiveNetwork, - getImpersonatedSigner, fundAccountMaxBalance, } from '../../utils' import { SphinxJsonRpcProvider } from '../../provider' -import { ExecutionMode, RELAYER_ROLE } from '../../constants' -import { - fetchDripSizeForNetwork, - fetchDripVersionForNetwork, - fetchDecimalsForNetwork, -} from '../../networks' +import { ExecutionMode } from '../../constants' export const ensureSphinxAndGnosisSafeDeployed = async ( provider: SphinxJsonRpcProvider | HardhatEthersProvider, @@ -119,154 +105,6 @@ export const checkSystemDeployed = async ( return codes.every((code) => code !== '0x') } -export const assignManagedServiceRoles = async ( - provider: SphinxJsonRpcProvider | HardhatEthersProvider, - signer: ethers.Signer, - relayers: string[], - executionMode: ExecutionMode, - spinner?: ora.Ora -) => { - // Next, we get the owner address, which differs depending on the situation: - // 1. If the owner is the multisig and we're deploying on a test node then we can use an impersonated signer. - // 2. If the owner is the multisig and we're deploying on a live network then we have to use the gnosis safe ethers adapter (which we have not implemented yet). - // 3. We also allow the user to specify a different owner via process.env.SPHINX_INTERNAL__OWNER_PRIVATE_KEY. This is useful for testing on live networks without using the multisig. - // In this case, we need to create a signer using the SPHINX_INTERNAL__OWNER_PRIVATE_KEY and use that. - let owner: ethers.Signer - - // If deploying on a live network and the target owner is the multisig, then throw an error because - // we have not setup the safe ethers adapter yet. - const isLiveNetwork_ = await isLiveNetwork(provider) - if (isLiveNetwork_ && getOwnerAddress() === OWNER_MULTISIG_ADDRESS) { - if (!process.env.SPHINX_INTERNAL__OWNER_PRIVATE_KEY) { - throw new Error('Must define SPHINX_INTERNAL__OWNER_PRIVATE_KEY') - } - - owner = new ethers.Wallet( - process.env.SPHINX_INTERNAL__OWNER_PRIVATE_KEY!, - provider - ) - } else { - // if target owner is multisig, then use an impersonated multisig signer - if (getOwnerAddress() === OWNER_MULTISIG_ADDRESS) { - owner = await getImpersonatedSigner(OWNER_MULTISIG_ADDRESS, provider) - } else { - // if target owner is not multisig, then use the owner signer - // SPHINX_INTERNAL__OWNER_PRIVATE_KEY will always be defined if the OWNER_ADDRESS is not the OWNER_MULTISIG_ADDRESS - owner = new ethers.Wallet( - process.env.SPHINX_INTERNAL__OWNER_PRIVATE_KEY!, - provider - ) - } - - if (!isLiveNetwork_) { - // Fund the signer - await ( - await signer.sendTransaction({ - to: await owner.getAddress(), - value: ethers.parseEther('1'), - }) - ).wait() - } - } - - const ManagedService = new ethers.Contract( - getManagedServiceAddress(), - ManagedServiceArtifact.abi, - owner - ) - - spinner?.start('Assigning relayers roles...') - for (const relayer of relayers) { - if ((await ManagedService.hasRole(RELAYER_ROLE, relayer)) === false) { - await ( - await ManagedService.grantRole( - RELAYER_ROLE, - relayer, - await getGasPriceOverrides(provider, owner, executionMode) - ) - ).wait() - } - } - spinner?.succeed('Finished assigning relayers roles') - - const Drippie = new ethers.Contract( - getDrippieAddress(), - DrippieArtifact.abi, - owner - ) - - spinner?.start('Creating relayer drips...') - for (const relayer of relayers) { - const chainId = (await provider.getNetwork()).chainId - - const currentDripVersion = fetchDripVersionForNetwork(chainId) - const baseDripName = `sphinx_fund_${relayer}` - const dripName = - baseDripName + (currentDripVersion > 0 ? `_${currentDripVersion}` : '') - - const reentrant = false - const interval = 1 - const dripcheck = getCheckBalanceLowAddress() - const checkparams = AbiCoder.defaultAbiCoder().encode( - ['address', 'uint256'], - [ - relayer, - ethers.parseEther(fetchDripSizeForNetwork(chainId)) * BigInt(10), - ] - ) - const actions = [ - { - target: relayer, - data: ZeroHash, - value: ethers.parseUnits( - fetchDripSizeForNetwork(chainId), - fetchDecimalsForNetwork(chainId) - ), - }, - ] - - const [status] = await Drippie.drips(dripName) - if (status === BigInt(2)) { - spinner?.info(`Drip ${dripName} already exists`) - } else if (status === BigInt(0)) { - spinner?.start(`Creating drip ${dripName}...`) - await ( - await Drippie.create( - dripName, - { - reentrant, - interval, - dripcheck, - checkparams, - actions, - }, - await getGasPriceOverrides(provider, owner, executionMode) - ) - ).wait() - await ( - await Drippie.status( - dripName, - 2, - await getGasPriceOverrides(provider, owner, executionMode) - ) - ).wait() - } else if (status === BigInt(1)) { - spinner?.start(`Setting status for drip ${dripName}...`) - await ( - await Drippie.status( - dripName, - 2, - await getGasPriceOverrides(provider, owner, executionMode) - ) - ).wait() - spinner?.succeed(`Finished setting status for drip ${dripName}`) - } else { - throw new Error(`Drip ${dripName} has archived status`) - } - } - spinner?.succeed('Finished creating relayer drips') -} - export const deploySphinxSystem = async ( provider: SphinxJsonRpcProvider | HardhatEthersProvider, signer: ethers.Signer, @@ -306,16 +144,6 @@ export const deploySphinxSystem = async ( } spinner?.succeed(`Finished deploying Sphinx contracts`) - - if (includeManagedServiceRoles) { - await assignManagedServiceRoles( - provider, - signer, - relayers, - executionMode, - spinner - ) - } } export const getDeterministicFactoryAddress = async ( diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index 859775533..efe13d3e4 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -24,8 +24,6 @@ import { SphinxTransaction, SphinxLeafWithProof, SphinxLeafType, - getManagedServiceAddress, - ManagedServiceArtifact, Operation, SolidityStorageLayout, SPHINX_LOCAL_NETWORKS, @@ -54,7 +52,7 @@ import { MerkleRootStatus, HumanReadableAction, } from './actions/types' -import { ExecutionMode, RELAYER_ROLE } from './constants' +import { ExecutionMode } from './constants' import { SphinxJsonRpcProvider } from './provider' import { BuildInfo } from './languages/solidity/types' import { @@ -376,9 +374,13 @@ export const getDuplicateElements = (arr: Array): Array => { } export const fetchSphinxManagedBaseUrl = () => { - return process.env.SPHINX_MANAGED_BASE_URL - ? process.env.SPHINX_MANAGED_BASE_URL - : 'https://www.sphinx.dev' + if (process.env.SPHINX_MANAGED_BASE_URL) { + return process.env.SPHINX_MANAGED_BASE_URL + } else { + throw new Error( + 'You must define a SPHINX_MANAGED_BASE_URL environment variable pointing to your Sphinx instance.' + ) + } } export const readSphinxLock = async (): Promise => { @@ -1208,32 +1210,6 @@ export const getMappingValueSlotKey = ( ) } -export const setManagedServiceRelayer = async ( - address: string, - provider: HardhatEthersProvider | SphinxJsonRpcProvider -) => { - const managedServiceAddress = getManagedServiceAddress() - - const accessControlRoleSlotKey = findStorageSlotKey( - ManagedServiceArtifact.storageLayout, - '_roles' - ) - const roleSlotKey = getMappingValueSlotKey( - accessControlRoleSlotKey, - RELAYER_ROLE - ) - const memberSlotKey = getMappingValueSlotKey( - roleSlotKey, - ethers.zeroPadValue(ethers.toBeHex(address), 32) - ) - - await provider.send('hardhat_setStorageAt', [ - managedServiceAddress, - memberSlotKey, - '0x0000000000000000000000000000000000000000000000000000000000000001', - ]) -} - export const getReadableActions = ( actionInputs: ActionInput[], chainId: string diff --git a/packages/plugins/package.json b/packages/plugins/package.json index 43f62cf17..f50c8264e 100644 --- a/packages/plugins/package.json +++ b/packages/plugins/package.json @@ -15,8 +15,7 @@ "scripts": { "start": "ts-node ./src/index.ts", "build": "yarn build:ts && forge build", - "build:ts": "tsc -p ./tsconfig.json && yarn copy-hardhat-config && chmod +x dist/cli/index.js", - "copy-hardhat-config": "cp src/hardhat.config.js dist/hardhat.config.js", + "build:ts": "tsc -p ./tsconfig.json && chmod +x dist/cli/index.js", "clean": "rimraf out/ dist/ ./tsconfig.tsbuildinfo ./forge-cache", "test": "yarn kill-nodes && yarn test:ts", "test:ts": "npx mocha --require ts-node/register --timeout 500000 'test/mocha/**/*.ts'", diff --git a/packages/plugins/src/cli/context.ts b/packages/plugins/src/cli/context.ts index 1422ce31a..1540743c3 100644 --- a/packages/plugins/src/cli/context.ts +++ b/packages/plugins/src/cli/context.ts @@ -19,7 +19,6 @@ import { SphinxMerkleTree } from '@sphinx-labs/contracts' import { assertNoLinkedLibraries, - getNetworkGasEstimate, makeGetConfigArtifacts, } from '../foundry/utils' import { ProposeArgs, buildNetworkConfigArray, propose } from './propose' @@ -28,7 +27,6 @@ import { AssertNoLinkedLibraries, BuildNetworkConfigArray, FetchRemoteArtifacts, - GetNetworkGasEstimate, } from './types' import { fetchRemoteArtifacts } from './artifacts' @@ -57,7 +55,6 @@ export type SphinxContext = { receipts?: Array configArtifacts?: ConfigArtifacts }> - getNetworkGasEstimate: GetNetworkGasEstimate buildNetworkConfigArray: BuildNetworkConfigArray storeDeploymentConfig: StoreDeploymentConfig relayProposal: RelayProposal @@ -72,7 +69,6 @@ export const makeSphinxContext = (): SphinxContext => { isLiveNetwork, propose, deploy, - getNetworkGasEstimate, buildNetworkConfigArray, storeDeploymentConfig, relayProposal, diff --git a/packages/plugins/src/cli/deploy.ts b/packages/plugins/src/cli/deploy.ts index 28d05a96c..30d8323d4 100644 --- a/packages/plugins/src/cli/deploy.ts +++ b/packages/plugins/src/cli/deploy.ts @@ -56,7 +56,6 @@ import { } from '../foundry/utils' import { getFoundryToml } from '../foundry/options' import { decodeDeploymentInfo, makeNetworkConfig } from '../foundry/decode' -import { simulate } from '../hardhat/simulate' import { SphinxContext } from './context' export interface DeployArgs { @@ -333,8 +332,6 @@ export const deploy = async ( merkleTree ) - await simulate(deploymentConfig, chainId.toString(), forkUrl) - spinner.succeed(`Built deployment.`) let preview: SphinxPreview | undefined diff --git a/packages/plugins/src/cli/propose/index.ts b/packages/plugins/src/cli/propose/index.ts index f91b11219..360bb1e75 100644 --- a/packages/plugins/src/cli/propose/index.ts +++ b/packages/plugins/src/cli/propose/index.ts @@ -308,8 +308,7 @@ export const propose = async ( networks, testnets, mainnets, - foundryToml.rpcEndpoints, - sphinxContext.isLiveNetwork + foundryToml.rpcEndpoints ) spinner.succeed(`Validated networks.`) @@ -371,17 +370,6 @@ export const propose = async ( merkleTree ) - const gasEstimatesPromises = networkConfigArrayWithRpcUrls - .filter(({ networkConfig }) => networkConfig.actionInputs.length > 0) - .map(({ networkConfig, rpcUrl }) => - sphinxContext.getNetworkGasEstimate( - deploymentConfig, - networkConfig.chainId, - rpcUrl - ) - ) - const gasEstimates = await Promise.all(gasEstimatesPromises) - spinner.succeed(`Simulation succeeded.`) const preview = getPreview(networkConfigArray, merkleTree.root) if (confirm || isDryRun) { @@ -455,7 +443,6 @@ export const propose = async ( safeAddress, moduleAddress, projectDeployments, - gasEstimates, diff: preview, compilerConfigId: undefined, deploymentConfigId: undefined, diff --git a/packages/plugins/src/cli/types.ts b/packages/plugins/src/cli/types.ts index 76080e591..c27adaaf2 100644 --- a/packages/plugins/src/cli/types.ts +++ b/packages/plugins/src/cli/types.ts @@ -1,12 +1,10 @@ import ora from 'ora' import { ethers } from 'ethers' import { - DeploymentConfig, ConfigArtifacts, GetConfigArtifacts, NetworkConfig, BuildInfos, - NetworkGasEstimate, } from '@sphinx-labs/core' import { FoundryToml } from '../foundry/types' @@ -45,12 +43,6 @@ export interface ArtifactsCommandArgs { silent: boolean } -export type GetNetworkGasEstimate = ( - deploymentConfig: DeploymentConfig, - chainId: string, - rpcUrl: string -) => Promise - export type BuildNetworkConfigArray = ( scriptPath: string, scriptFunctionCalldata: string, diff --git a/packages/plugins/src/foundry/utils/index.ts b/packages/plugins/src/foundry/utils/index.ts index dc4112bca..f367ea4bb 100644 --- a/packages/plugins/src/foundry/utils/index.ts +++ b/packages/plugins/src/foundry/utils/index.ts @@ -15,13 +15,11 @@ import { execSync, spawnSync } from 'child_process' import { BuildInfo, CompilerOutputContracts, - SphinxTransactionResponse, } from '@sphinx-labs/core/dist/languages/solidity/types' import { decodeDeterministicDeploymentProxyData, exceedsContractSizeLimit, execAsync, - fetchNetworkConfigFromDeploymentConfig, formatSolcLongVersion, getBytesLength, hasParentheses, @@ -35,7 +33,6 @@ import { } from '@sphinx-labs/core/dist/utils' import { ActionInput, - DeploymentConfig, ConfigArtifacts, DeploymentInfo, GetConfigArtifacts, @@ -55,11 +52,8 @@ import { streamObject } from 'stream-json/streamers/StreamObject' import { streamValues } from 'stream-json/streamers/StreamValues' import { ExecutionMode, - NetworkGasEstimate, ParsedContractDeployment, SphinxJsonRpcProvider, - EstimateGasTransactionData, - TransactionEstimatedGas, } from '@sphinx-labs/core' import ora from 'ora' import { @@ -85,18 +79,15 @@ import { FoundrySingleChainDryRun, FoundryToml, } from '../types' -import { SimulationTransactions, simulate } from '../../hardhat/simulate' -import { AssertNoLinkedLibraries, GetNetworkGasEstimate } from '../../cli/types' +import { AssertNoLinkedLibraries } from '../../cli/types' import { BuildInfoTemplate, trimObjectToType } from './trim' import { assertValidNodeVersion } from '../../cli/utils' -import { SphinxContext } from '../../cli/context' import { InvalidFirstSigArgumentErrorMessage, SigCalledWithNoArgsErrorMessage, SphinxConfigMainnetsContainsTestnetsErrorMessage, SphinxConfigTestnetsContainsMainnetsErrorMessage, getFailedRequestErrorMessage, - getLocalNetworkErrorMessage, getMissingEndpointErrorMessage, getMixedNetworkTypeErrorMessage, getUnsupportedNetworkErrorMessage, @@ -1076,102 +1067,6 @@ export const convertLibraryFormat = ( }) } -const toSphinxTransactionEstimatedGas = ( - response: SphinxTransactionResponse -): EstimateGasTransactionData => { - return { - to: response.to, - from: response.from, - data: response.data, - gasLimit: response.gasLimit.toString(), - value: response.value.toString(), - chainId: response.chainId.toString(), - } -} - -/** - * Estimates the gas used by a deployment on a single network. Includes a buffer of 30% to account - * for variations between the local simulation and the production environment. Also adjusts the - * minimum gas limit on networks like Arbitrum to include the L1 gas fee, which isn't captured on - * forks. - */ -export const getEstimatedGas = async ( - transactions: SimulationTransactions, - provider: SphinxJsonRpcProvider -): Promise<{ - estimatedGas: string - transactionsWithGasEstimates: Array -}> => { - // Estimate the minimum gas limit. On Ethereum, this will be 21k. (Technically, since - // `eth_estimateGas` generally overestimates the gas used, it will be slightly greater than 21k. - // It was 21001 during development). On Arbitrum and perhaps other L2s, the minimum gas limit will - // be closer to one million. This is because each transaction includes the L1 gas used. The local - // simulation that produced the transaction receipts doesn't capture this difference. We account - // for this difference by adding `estimatedMinGasLimit - 21_000` to each receipt. This provides a - // more accurate estimate on networks like Arbitrum. - const estimatedMinGasLimit = await provider.estimateGas({ - to: ethers.ZeroAddress, - data: '0x', - }) - const adjustedGasLimit = Number(estimatedMinGasLimit) - 21_000 - - const transactionsWithGasEstimates = transactions - .map((transaction) => { - return { - transaction: toSphinxTransactionEstimatedGas(transaction.response), - estimatedGas: Math.round(Number(transaction.receipt.gasUsed) * 1.3), - } - }) - .map((transactionWithEstimatedGas) => { - const gasWithBuffer = transactionWithEstimatedGas.estimatedGas - // Add the adjusted gas limit amount. We add this after multiplying by the 1.3x buffer because - // the estimated minimum gas limit already includes a ~1.35x buffer due to the fact that the - // `eth_estimateGas` RPC method overestimates the gas. ref: - // https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas - const totalGas = gasWithBuffer + adjustedGasLimit - // Check that the total gas isn't negative out of an abundance of caution. - if (totalGas < 0) { - throw new Error('Gas used is less than 0. Should never happen.') - } - return { - transaction: transactionWithEstimatedGas.transaction, - estimatedGas: totalGas.toString(), - } - }) - - const estimatedGas = transactionsWithGasEstimates - .map((receiptWithEstimatedGas) => receiptWithEstimatedGas.estimatedGas) - .map(Number) - .reduce((a, b) => a + b, 0) - - return { - estimatedGas: estimatedGas.toString(), - transactionsWithGasEstimates, - } -} - -export const getNetworkGasEstimate: GetNetworkGasEstimate = async ( - deploymentConfig: DeploymentConfig, - chainId: string, - rpcUrl: string -): Promise => { - const { transactions } = await simulate(deploymentConfig, chainId, rpcUrl) - - const provider = new SphinxJsonRpcProvider(rpcUrl) - const { estimatedGas } = await getEstimatedGas(transactions, provider) - - const networkConfig = fetchNetworkConfigFromDeploymentConfig( - BigInt(chainId), - deploymentConfig - ) - - return { - chainId: Number(chainId), - estimatedGas, - fundsRequested: networkConfig.safeFundingRequest?.fundsRequested ?? '0', - } -} - /** * Recursively replaces environment variable placeholders in the input with their actual values. * This function does not mutate the original object. @@ -1600,8 +1495,7 @@ export const validateProposalNetworks = async ( cliNetworks: Array, configTestnets: Array, configMainnets: Array, - rpcEndpoints: FoundryToml['rpcEndpoints'], - isLiveNetwork: SphinxContext['isLiveNetwork'] + rpcEndpoints: FoundryToml['rpcEndpoints'] ): Promise<{ rpcUrls: Array; isTestnet: boolean }> => { if (cliNetworks.length === 0) { throw new Error(`Expected at least one network, but none were supplied.`) @@ -1655,12 +1549,6 @@ export const validateProposalNetworks = async ( } } - if (!(await isLiveNetwork(provider))) { - if (process.env.SPHINX_INTERNAL__ALLOW_LOCAL_NODES !== 'true') { - return { type: 'localNetwork', network } - } - } - return { type: 'valid', rpcUrl, @@ -1689,6 +1577,7 @@ export const validateProposalNetworks = async ( if (value.type === 'missingEndpoint') { missingEndpoint.push(value.network) } else if (value.type === 'failedRequest') { + console.log(value.rpcUrl) failedRequest.push(value.network) } else if (value.type === 'unsupported') { // Narrow the TypeScript type. @@ -1726,12 +1615,6 @@ export const validateProposalNetworks = async ( throw new Error(getUnsupportedNetworkErrorMessage(unsupported)) } - if (localNetwork.length > 0) { - if (process.env.SPHINX_INTERNAL__ALLOW_LOCAL_NODES !== 'true') { - throw new Error(getLocalNetworkErrorMessage(localNetwork)) - } - } - // Check if the array contains a mix of test networks and production networks. We check this after // resolving the promises above because we need to know all of the network types. const networkTypes = valid.map(({ networkType }) => networkType) diff --git a/packages/plugins/src/hardhat.config.js b/packages/plugins/src/hardhat.config.js deleted file mode 100644 index dadb8a07d..000000000 --- a/packages/plugins/src/hardhat.config.js +++ /dev/null @@ -1,48 +0,0 @@ -// This file is written in JavaScript instead of TypeScript because Hardhat throws an error -// if the file is written in TypeScript and the current repo (i.e. Sphinx's repo) uses ESM. - -require('@nomicfoundation/hardhat-ethers') -const dotenv = require('dotenv') - -const { simulateDeploymentSubtask } = require('./hardhat/simulate') - -// Load environment variables from .env -dotenv.config() - -const forkUrl = process.env.SPHINX_INTERNAL__FORK_URL -if (!forkUrl) { - throw new Error(`Could not find fork RPC URL.`) -} -const chainId = process.env.SPHINX_INTERNAL__CHAIN_ID -if (!chainId) { - throw new Error(`Could not find chain ID.`) -} -const blockGasLimit = process.env.SPHINX_INTERNAL__BLOCK_GAS_LIMIT -if (!blockGasLimit) { - throw new Error(`Could not find block gas limit.`) -} -const blockNumber = process.env.SPHINX_INTERNAL__BLOCK_NUMBER - -subtask('sphinxSimulateDeployment', simulateDeploymentSubtask) - -module.exports = { - networks: { - hardhat: { - chainId: Number(chainId), - forking: { - url: forkUrl, - blockNumber: - typeof blockNumber === 'string' ? Number(blockNumber) : undefined, - }, - blockGasLimit: Number(blockGasLimit), - // We don't use Hardhat's genesis accounts, so we set this to an empty array. This eliminates - // 20 RPC calls that Hardhat sends at the beginning of every simulation to get the nonce of - // each genesis account. (There's one RPC call per genesis account). Hardhat needs to get - // these nonces on forked networks because the private keys are publicly known. - // - // If a user's script uses one of these genesis accounts, Hardhat will fetch its nonce on an - // as-needed basis, which is the behavior that we want. - accounts: [], - }, - }, -} diff --git a/packages/plugins/src/hardhat/hardhatRunner.ts b/packages/plugins/src/hardhat/hardhatRunner.ts deleted file mode 100644 index 7cf850b40..000000000 --- a/packages/plugins/src/hardhat/hardhatRunner.ts +++ /dev/null @@ -1,71 +0,0 @@ -// This file is meant to be called in a child process to simulate a deployment using a forked -// Hardhat node. For more info, see the documentation inside the `simulate` function in -// `simulate.ts`. - -import hre from 'hardhat' - -import { - simulateDeploymentSubtask, - simulateDeploymentSubtaskArgs, -} from './simulate' - -process.stdin.setEncoding('utf8') - -let inputData = '' - -process.stdin.on('data', (chunk) => { - inputData += chunk -}) - -process.stdin.on('end', async () => { - const taskArgs = JSON.parse(inputData) - await runHardhatSimulation(taskArgs) -}) - -const runHardhatSimulation = async ( - taskArgs: simulateDeploymentSubtaskArgs -): Promise => { - const { - transactions, - }: Awaited> = await hre.run( - 'sphinxSimulateDeployment', - taskArgs - ) - - process.stdout.write(JSON.stringify({ transactions })) -} - -let getaddrinfoErrors = 0 - -// If an error occurs, we write the error message and stack trace to `stdout` then exit the process -// with exit code `1`. We write the error to `stdout` instead of `stderr` because `stderr` may -// contain warnings that were written via `console.warn`, which are indistinguishable from the -// actual error message in `stderr`. By using `stdout`, we can throw an error that doesn't contain -// warnings in the parent process. -process.on('uncaughtException', (error) => { - /** - * This catches a common error where the DNS lookup for an rpc url fails. For some reason, this - * error is not caught by ethers and is also not caught by our try/catch. So instead we catch it - * specifically here and just silently handle it. - * - * It is safe to silently handle this because the user definitely has a valid RPC url if the process - * made it to the simulation at all. So we can reasonably expect that if we handle this and then the - * simulation retries, it will succeed. - * - * It's worth mentioning, that we've already had logic that handles this running in the website backend - * and it very reliably works for handling this exact issue. - */ - if ( - error.message.includes('getaddrinfo ENOTFOUND') && - getaddrinfoErrors < 25 - ) { - getaddrinfoErrors += 1 - return - } else { - process.stdout.write( - JSON.stringify({ message: error.message, stack: error.stack }) - ) - - process.exit(1) - } -}) diff --git a/packages/plugins/src/hardhat/simulate.ts b/packages/plugins/src/hardhat/simulate.ts deleted file mode 100644 index fa26fd63d..000000000 --- a/packages/plugins/src/hardhat/simulate.ts +++ /dev/null @@ -1,618 +0,0 @@ -import { join } from 'path' -import { existsSync } from 'fs' - -import { - spawnAsync, - getSphinxWalletPrivateKey, - SphinxTransactionReceipt, - ExecutionMode, - MerkleRootStatus, - SphinxJsonRpcProvider, - fetchNameForNetwork, - isFork, - stripLeadingZero, - isLiveNetwork, - fundAccountMaxBalance, - signMerkleRoot, - Deployment, - DeploymentConfig, - DeploymentContext, - HumanReadableAction, - executeTransactionViaSigner, - getSphinxWalletsSortedByAddress, - injectRoles, - removeRoles, - fetchNetworkConfigFromDeploymentConfig, - NetworkConfig, - fetchExecutionTransactionReceipts, - convertEthersTransactionReceipt, - InvariantError, - getContractAddressesFromNetworkConfig, - sphinxCoreExecute, - convertEthersTransactionResponse, - SphinxTransactionResponse, - sphinxCoreUtils, -} from '@sphinx-labs/core' -import { ethers } from 'ethers' -import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' -import { - FALLBACK_MAX_REORG, - getLargestPossibleReorg, -} from 'hardhat/internal/hardhat-network/provider/utils/reorgs-protection' -import pLimit from 'p-limit' - -import { - HardhatResetNotAllowedErrorMessage, - getRpcRequestStalledErrorMessage, -} from '../foundry/error-messages' - -export type SimulationTransactions = Array<{ - receipt: SphinxTransactionReceipt - response: SphinxTransactionResponse -}> - -/** - * @property maxAttempts - The maximum number of attempts that Sphinx will make for a single network - * request before throwing an error. - * @property timeout - The maximum number of time that Sphinx will wait for a single RPC request - * before timing out. An RPC request can stall if the RPC provider has degraded service, which would - * cause the simulation to stall indefinitely if we don't time out. We set this value to be - * relatively high because the execution process may submit very large transactions (specifically - * transactions with `EXECUTE` Merkle leaves), which can cause the RPC request to be slow. We also - * set it high because the Hardhat provider appears to make a few retries (in - * `hardhat/internal/core/providers/http.ts`), which can contribute to the duration of a single RPC - * call sent from our provider proxy. - */ -export const simulationConstants = { - maxAttempts: 5, - timeout: 150_000, -} - -/** - * These arguments are passed into the Hardhat subtask that simulates a user's deployment. There - * can't be any functions as arguments because we pass them into a child process. There also - * shouldn't be any fields that contain BigInts because we call `JSON.parse` to decode the data - * returned by the subtask. (`JSON.parse` converts BigInts to strings). - * - * @property {Array} networkConfigArray The NetworkConfig on all networks. This is - * necessary to create the entire Merkle tree in the simulation, which ensures we use the same - * Merkle root in both the simulation and the production environment. - */ -export type simulateDeploymentSubtaskArgs = { - deploymentConfig: DeploymentConfig - chainId: string -} - -/** - * Simulate a deployment on a fork of the target network. We use Hardhat instead of Foundry to run - * the simulation for two reasons: - * - * 1. Running the simulation with Hardhat allows us to reuse the TypeScript logic that executes the - * deployment in production. If we use Foundry, we'd need to rewrite all of this logic in - * Solidity. Also, adding complex Solidity logic to the Sphinx plugin contracts can lead to - * unpredictable IR compilation failures. - * - * 2. Running the simulation with Hardhat allows us to accurately calculate the gas used by the - * deployment, which determines the estimated cost that we provide to the user. The estimate is - * more accurate with Hardhat because we're able to use the `gasUsed` field of the transaction - * receipts instead of relying on the `gas` field of Foundry's transaction responses. The latter - * gives estimates that are anywhere between 35-55% higher than the actual gas used because it - * uses `eth_estimateGas` under the hood. - * - * 3. It's non-trivial to pass a very large Merkle tree from TypeScript to Foundry. Particularly, - * `spawn` is prone to input size limits, and EthersJS can't ABI encode extremely large amounts - * of data (i.e. it'll fail for a Merkle tree that contains 250 contract deployments, where the - * contract is near the maximum size limit). - */ -export const simulate = async ( - deploymentConfig: DeploymentConfig, - chainId: string, - rpcUrl: string -): Promise<{ - transactions: SimulationTransactions -}> => { - const rootPluginPath = - process.env.DEV_FILE_PATH ?? join('node_modules', '@sphinx-labs', 'plugins') - - const provider = new SphinxJsonRpcProvider(rpcUrl) - - const networkConfig = fetchNetworkConfigFromDeploymentConfig( - BigInt(chainId), - deploymentConfig - ) - - const expectedHardhatConfigPath = join( - rootPluginPath, - 'dist', - 'hardhat.config.js' - ) - - if (!existsSync(expectedHardhatConfigPath)) { - throw new Error( - 'Failed to locate simulation configuration. This is a bug, please report it to the developers' - ) - } - - const envVars = { - SPHINX_INTERNAL__FORK_URL: rpcUrl, - SPHINX_INTERNAL__CHAIN_ID: chainId, - SPHINX_INTERNAL__BLOCK_GAS_LIMIT: networkConfig.blockGasLimit, - // We must set the Hardhat config using an environment variable so that Hardhat recognizes the - // Hardhat config when we import the HRE in the child process. - HARDHAT_CONFIG: expectedHardhatConfigPath, - } - - const taskParams: simulateDeploymentSubtaskArgs = { - deploymentConfig, - chainId, - } - - if ((await isLiveNetwork(provider)) || (await isFork(provider))) { - // Use the block number from the Forge script minus the largest possible chain reorg size, which - // is determined by Hardhat. We must subtract the reorg size so that Hardhat caches the RPC - // calls in the simulation. Otherwise, Hardhat will send hundreds of RPC calls, which frequently - // causes rate limit errors, especially for public or free tier RPC endpoints. - // - // Subtracting the reorg size can lead to the following edge case: - // 1. User executes a transaction on the live network. - // 2. User calls Sphinx's Propose or Deploy command using a script that relies on the state that - // resulted from the transaction in the previous step. - // 3. The collection process works correctly because Foundry uses the latest block number. - // 4. The simulation uses a block where the transaction doesn't exist yet, causing an error. - // - // This edge case is unlikely to happen in practice because the reorg size is pretty small. For - // example, it's 5 blocks on Ethereum, and 30 blocks on most other networks. A reorg size of 30 - // blocks corresponds to 15 minutes on Rootstock, which is one of the slowest networks that - // Sphinx supports as of now. If the edge case occurs, it will naturally resolve itself if the - // user continues to attempt to propose/deploy. This is because the corresponding block will - // eventually be included in the simulation after there have been enough block confirmations. - const blockNumber = - BigInt(networkConfig.blockNumber) - BigInt(getLargestReorg(chainId)) - envVars['SPHINX_INTERNAL__BLOCK_NUMBER'] = blockNumber.toString() - } else { - // The network is a non-forked local node (i.e. an Anvil or Hardhat node with a fresh state). We - // do not hardcode the block number in the Hardhat config to avoid the following edge case: - // 1. Say we create an Anvil node with Ethereum's chain ID: `anvil --chain-id 1`. The block - // number will be extremely low on this network (i.e. less than 100). This is standard - // behavior for Anvil nodes. - // 2. Hardhat detects that the block number is extremely low and throws an error because the - // block number corresponds to a hardfork that's too early to be supported. Here's the thrown - // error: - // https://github.com/NomicFoundation/hardhat/blob/caa504fe0e53c183578f42d66f4740b8ec147051/packages/hardhat-core/src/internal/hardhat-network/provider/node.ts#L305-L309 - // - // Some notes about this edge case: - // 1. We only ran into this error when creating an Anvil node with Ethereum's chain ID, but it - // may also occur on other popular networks. - // 2. We attempted to resolve this error by specifying the desired hardfork in the Hardhat - // config's `hardfork` option as well as its `chains.hardforkHistory` option. Neither - // resolved this error. - // 3. This error is only thrown when hardcoding the block number in the Hardhat config. When we - // don't hardcode it, Hardhat uses the default hardfork, which is the behavior we want. - - // Fast forward the block number. This is necessary to prevent the following edge case: - // 1. Some transactions are executed on the local network. These transactions could either be - // sent by the Sphinx team (during testing) or by the user during local development. - // 2. The Deploy CLI command is executed, which creates a simulation using a block that's - // multiple confirmations behind the latest block. This is Hardhat's default behavior, which - // is meant to protect against chain reorgs on forks of live networks. - // 3. The simulation fails because the transactions executed in step 1 don't exist on the - // Hardhat fork. - const blocksToFastForward = getLargestReorg(chainId) - const blocksHex = stripLeadingZero(ethers.toBeHex(blocksToFastForward)) - await provider.send( - 'hardhat_mine', // The `hardhat_mine` RPC method works on Anvil and Hardhat nodes. - [blocksHex] - ) - } - - const hardhatRunnerPath = join( - rootPluginPath, - 'dist', - 'hardhat', - 'hardhatRunner.js' - ) - // Execute the simulation in a child process. We don't run the simulation in the - // current process to prevent the following edge case that was discovered in Sphinx's test suite. - // First, some context: When Hardhat creates an in-process node that forks a standalone Anvil - // node, the Hardhat node listens to the Anvil port from the process in which the Hardhat node is - // created. In other words, if we create the Hardhat node in the current process and then call - // `lsof -t -i:`, one of the returned PIDs will be the current PID (i.e. - // `process.pid`). Then, if we attempt to run `kill $(lsof -t -i:)`, the current - // process will exit with a mysterious `SIGTERM` error. This issue caused Sphinx's test suite to - // exit early because we kill Anvil nodes after some test cases complete. It's possible - // (although unlikely) that this same situation could happen in a user's test suite. We resolve - // this by creating the Hardhat node in a child process via `spawnAsync`. This child process exits - // when `spawnAsync` returns. - const { stdout, stderr, code } = await spawnAsync( - 'node', - [hardhatRunnerPath], - envVars, - JSON.stringify(taskParams) - ) - - if (code !== 0) { - const networkName = fetchNameForNetwork(BigInt(chainId)) - let errorMessage: string = `Simulation failed for ${networkName} at block number ${networkConfig.blockNumber}.` - try { - // Attempt to decode the error message. This try-statement could theoretically throw an error - // if `stdout` isn't a valid JSON string. - const error = JSON.parse(stdout) - - // If the stack trace includes the error message, we only use the stack trace so that we don't - // display the error reason twice. - if ( - typeof error.stack === 'string' && - error.stack.includes(error.message) - ) { - errorMessage += `\n\n${error.stack}` - } else { - // Display both the error message and the stack trace. - errorMessage += `\n\n${error.message}\n\n${error.stack}` - } - } catch { - // An error occurred while attempting to decode `stdout` into an error message. We'll display - // the raw `stdout` to the user in case it's useful. - errorMessage += `\n\n${stdout}` - } - throw new Error(errorMessage) - } - - /** - * Occasionally an unexpected error can cause stdout to not conform to JSON format. This should never - * happen, but if it does we will error when attempting to parse stdout. So we use a try catch here - * and exit with the real value of stdout if an error occurs. - */ - try { - const transactions = JSON.parse(stdout).transactions - return { transactions } - } catch (e) { - console.log(stdout) - console.error(stderr) - process.exit(1) - } -} - -export const setupPresimulationState = async ( - provider: any, - executionMode: ExecutionMode -) => { - let signer: ethers.Wallet - if (executionMode === ExecutionMode.LiveNetworkCLI) { - const privateKey = process.env.PRIVATE_KEY - if (!privateKey) { - throw new Error(`Could not find 'PRIVATE_KEY' environment variable.`) - } - signer = new ethers.Wallet(privateKey, provider) - } else if ( - executionMode === ExecutionMode.LocalNetworkCLI || - executionMode === ExecutionMode.Platform - ) { - signer = new ethers.Wallet(getSphinxWalletPrivateKey(0), provider) - await fundAccountMaxBalance(signer.address, provider) - } else { - throw new Error(`Unknown execution mode.`) - } - - return signer -} - -/** - * Fetches the transaction response objects for all of the transactions in the simulation. There's some additional - * data in the responses that is not in the receipts (data, value, etc) which is not available in the receipts. We - * use this information to calculate deployment cost estimates on the website. - */ -export const fetchTransactionResponses = async ( - receipts: Array, - provider: HardhatEthersProvider -): Promise => { - const chainId = (await provider.getNetwork()).chainId - - // Since the size of receipts array is unbounded, we use pLimit to reduce the number of simultaneous calls. - // This reduces the chance of us triggering a rate limit in the RPC provider. - const limit = pLimit(5) - const transactions = await Promise.all( - receipts.map(async (receipt) => { - const response = await limit(async () => - provider.getTransaction(receipt.hash) - ) - const sphinxResponse = convertEthersTransactionResponse( - response, - chainId.toString() - ) - - return { - receipt, - response: sphinxResponse, - } - }) - ) - - return transactions -} - -/** - * A Hardhat subtask that simulates a deployment against a forked Hardhat node. We need to load the - * Hardhat Runtime Environment (HRE) because Hardhat doesn't document any lower-level functionality - * for running a fork. We could theoretically interact with lower-level components, but this would - * be brittle because Hardhat could change their internal functionality in a future minor or patch - * version. - */ -export const simulateDeploymentSubtask = async ( - taskArgs: simulateDeploymentSubtaskArgs, - hre: any -): Promise<{ transactions: SimulationTransactions }> => { - // Wrap the Hardhat provider with a Proxy, which implements retry and timeout logic. - const provider = createHardhatEthersProviderProxy(hre.ethers.provider) - - const { deploymentConfig, chainId } = taskArgs - const { merkleTree } = deploymentConfig - - const networkConfig = fetchNetworkConfigFromDeploymentConfig( - BigInt(chainId), - deploymentConfig - ) - - const { executionMode } = networkConfig - - const signer = await setupPresimulationState(provider, executionMode) - - // Create a list of auto-generated wallets. We'll later add these wallets as Gnosis Safe owners. - const sphinxWallets = getSphinxWalletsSortedByAddress( - BigInt(networkConfig.newConfig.threshold), - provider - ) - const treeSigners = await Promise.all( - sphinxWallets.map(async (wallet) => { - return { - signer: await wallet.getAddress(), - signature: await signMerkleRoot(merkleTree.root, wallet), - } - }) - ) - - let receipts: Array | undefined - const deployment: Deployment = { - id: 'only required on website', - multichainDeploymentId: 'only required on website', - projectId: 'only required on website', - chainId: networkConfig.chainId, - status: 'approved', - moduleAddress: networkConfig.moduleAddress, - safeAddress: networkConfig.safeAddress, - deploymentConfig, - networkName: fetchNameForNetwork(BigInt(networkConfig.chainId)), - treeSigners, - } - const simulationContext: DeploymentContext = { - throwError: (message: string) => { - throw new Error(message) - }, - handleError: (e) => { - throw e - }, - handleAlreadyExecutedDeployment: async (deploymentContext) => { - receipts = ( - await fetchExecutionTransactionReceipts( - [], - deploymentContext.deployment.moduleAddress, - deploymentContext.deployment.deploymentConfig.merkleTree.root, - deploymentContext.provider - ) - ).map(convertEthersTransactionReceipt) - }, - handleExecutionFailure: ( - _deploymentContext: DeploymentContext, - _networkConfig: NetworkConfig, - failureReason: HumanReadableAction - ) => { - throw new Error( - `The following action reverted during the simulation:\n${failureReason.reason}` - ) - }, - handleSuccess: async () => handleSimulationSuccess(networkConfig, provider), - executeTransaction: executeTransactionViaSigner, - deployment, - provider, - injectRoles, - removeRoles, - wallet: signer, - } - - const result = await sphinxCoreExecute.attemptDeployment(simulationContext) - - if (!result) { - throw new Error( - 'Simulation failed for an unexpected reason. This is a bug. Please report it to the developers.' - ) - } - - const { finalStatus, failureAction } = result - receipts = result.receipts - - if (!receipts) { - throw new Error( - 'Simulation failed for an unexpected reason. This is a bug. Please report it to the developers.' - ) - } - - if (finalStatus === MerkleRootStatus.FAILED) { - if (failureAction) { - throw new Error( - `The following action reverted during the simulation:\n${failureAction.reason}` - ) - } else { - throw new Error(`An action reverted during the simulation.`) - } - } - - return { - transactions: await fetchTransactionResponses(receipts, provider), - } -} - -export const handleSimulationSuccess = async ( - networkConfig: NetworkConfig, - provider: HardhatEthersProvider -) => { - const contractAddresses = getContractAddressesFromNetworkConfig(networkConfig) - - // Check that the contracts have all been deployed. This ensures the contract addresses in - // Foundry's `AccountAccess` structs match the actual deployed contract addresses. It's dangerous - // if these don't match because it indicates that the `ActionInput` array contains incorrect - // contract addresses, since this array is created from Foundry's `AccountAccess` structs. If - // there's a mismatch, the preview will contain the wrong contract addresses, and the user may use - // the wrong contract addresses as inputs to functions in their script. - // - // We use a small batch size to speed up this logic. We don't use a Promise.all because this could - // always cause a rate limit error if the deployment contains a lot of contract deployments. - const limit = pLimit(3) - await Promise.all( - contractAddresses.map((address) => - limit(async () => { - if ((await provider.getCode(address)) === '0x') { - throw new InvariantError(getUndeployedContractErrorMesage(address)) - } - }) - ) - ) - return -} - -/** - * Create a Proxy that wraps a `HardhatEthersProvider` to implement retry and timeout logic, which - * isn't robust in the native provider. - * - * This function uses a linear backoff strategy for retries. We use a multiple of 2, and start with - * a backoff period of two seconds. - * - * This function uses the `evm_snapshot` and `evm_revert` RPC methods to prevent a 'nonce too low' - * bug caused by the Hardhat simulation (context: https://github.com/sphinx-labs/sphinx/pull/1565). - * The fact that we use these RPC methods means that an edge case could occur: - * 1. Say we simultaneously submit state-changing transactions from Account A and Account B (e.g. via - * `Promise.all`). - * 2. Say the transaction from Account A reverts but the transaction from Account B finalizes. We'll - * call 'evm_revert' in the transaction for Account A, potentially causing the transaction from - * Account B to be undone. - * - * This edge case currently isn't an issue because we don't parallelize state-changing transactions - * in the execution process. - */ -export const createHardhatEthersProviderProxy = ( - ethersProvider: HardhatEthersProvider -): HardhatEthersProvider => { - const proxy = new Proxy(ethersProvider, { - get: (target, prop) => { - return (...args: any[]) => { - // Return the result directly if the method isn't asynchronous. - if (!sphinxCoreUtils.isPublicAsyncMethod(ethersProvider, prop)) { - return target[prop](...args) - } - - // A helper function that implements the timeout and retry logic for asynchronous calls to - // the Hardhat provider. - const invokeWithRetryAndSnapshot = async () => { - // We don't allow the 'hardhat_reset' RPC method to avoid an infinite loop bug caused by - // Hardhat. More context is in this pull request description: - // https://github.com/sphinx-labs/sphinx/pull/1565 - if (args.length > 0 && args[0] === 'hardhat_reset') { - throw new Error(HardhatResetNotAllowedErrorMessage) - } - - let snapshotId: string - for ( - let attempt = 0; - attempt < simulationConstants.maxAttempts; - attempt++ - ) { - // Create a snapshot of the Hardhat node state. We may revert to this snapshot later in - // this function to prevent a 'nonce too low' bug in Hardhat. We must queue the snapshot - // before calling `target[prop](...args)` to avoid this nonce bug. - // - // More info on the nonce error is in this pull request description: - // https://github.com/sphinx-labs/sphinx/pull/1565. - // - // This RPC method is outside of the try...catch statement below because this call - // should never error, so if it does, it'd preferable to throw the error immediately. - snapshotId = await target.send('evm_snapshot', []) - - try { - // Forward the call to the Hardhat provider. We include a timeout to ensure that an - // RPC provider with degraded service doesn't cause this call to hang indefinitely. - // See this pull request description for more info: - // https://github.com/sphinx-labs/sphinx/pull/1565 - - const result = await sphinxCoreUtils.callWithTimeout( - target[prop](...args), - simulationConstants.timeout, - getRpcRequestStalledErrorMessage(simulationConstants.timeout) - ) - - if (prop === 'getSigner') { - // By default, the `HardhatEthersProxy.getSigner` method returns a signer connected - // to the `HardhatEthersProvider` instead of this Proxy, which prevents our timeout - // and retry logic from being used when the signer executes transactions. To avoid - // this, we set the signer's provider to be the current Proxy instance. - return (result as ethers.Signer).connect(proxy) - } else { - return result - } - } catch (error) { - // The most likely reason that the call failed is a rate limit. - - // NOTE: Don't include any RPC calls to the remote node in this 'catch' block because - // they may stall indefinitely if the user's RPC provider has degraded service. It's - // safe to call RPC methods that begin with 'evm_' or 'hardhat_' because these - // shouldn't be sent to the remote node, so there shouldn't be a risk of a rate limit - // occurring for these calls. - - // We revert the Hardhat node state to ensure that there weren't any local state - // changes made by the failed RPC request. There should be no state changes because - // the call threw an error. This is a precaution against the "nonce too low" error, - // which is described in this pull request description: - // https://github.com/sphinx-labs/sphinx/pull/1565 - const success = await target.send('evm_revert', [snapshotId]) - if (!success) { - throw new InvariantError(`Failed to call 'evm_revert'.`) - } - - // Pass the error up if we're out of attempts. - if (attempt === simulationConstants.maxAttempts - 1) { - throw error - } - - // We use linear backoff starting at 2 seconds. This serves as a cooldown period - // for rate limit errors. - const sleepTime = 2 * (attempt + 1) * 1000 - await sphinxCoreUtils.sleep(sleepTime) - } - } - } - - // Return a thenable promise for asynchronous calls, which ensures that the asynchronous - // operations in `invokeWithRetryAndSnapshot` occur after the asynchronous method call is - // awaited. - return Promise.resolve({ - then: (resolve, reject) => { - ;(async () => { - try { - const result = await invokeWithRetryAndSnapshot() - resolve(result) - } catch (error) { - reject(error) - } - })() - }, - }) - } - }, - }) - return proxy -} - -const getLargestReorg = (chainId: string): bigint => { - return getLargestPossibleReorg(Number(chainId)) ?? FALLBACK_MAX_REORG -} - -export const getUndeployedContractErrorMesage = (address: string): string => - `Simulation succeeded, but the following contract wasn't deployed at its expected address:\n` + - address diff --git a/packages/plugins/src/index.ts b/packages/plugins/src/index.ts index bb1550624..87c2da69a 100644 --- a/packages/plugins/src/index.ts +++ b/packages/plugins/src/index.ts @@ -1,3 +1,2 @@ export * from './sample-project' export * from './foundry/utils' -export { simulateDeploymentSubtask } from './hardhat/simulate' diff --git a/packages/plugins/test/mocha/cli/propose.spec.ts b/packages/plugins/test/mocha/cli/propose.spec.ts index 3dce855df..75cd6cf55 100644 --- a/packages/plugins/test/mocha/cli/propose.spec.ts +++ b/packages/plugins/test/mocha/cli/propose.spec.ts @@ -3,7 +3,6 @@ import chaiAsPromised from 'chai-as-promised' import { Create2ActionInput, ExecutionMode, - NetworkConfig, ProposalRequest, SphinxJsonRpcProvider, SphinxPreview, @@ -11,7 +10,6 @@ import { execAsync, fetchChainIdForNetwork, getSphinxWalletPrivateKey, - isLiveNetwork, } from '@sphinx-labs/core' import { ethers } from 'ethers' import { DETERMINISTIC_DEPLOYMENT_PROXY_ADDRESS } from '@sphinx-labs/contracts' @@ -19,7 +17,6 @@ import { DETERMINISTIC_DEPLOYMENT_PROXY_ADDRESS } from '@sphinx-labs/contracts' import * as MyContract2Artifact from '../../../out/artifacts/MyContracts.sol/MyContract2.json' import * as MyLargeContractArtifact from '../../../out/artifacts/MyContracts.sol/MyLargeContract.json' import * as RevertDuringSimulation from '../../../out/artifacts/RevertDuringSimulation.sol/RevertDuringSimulation.json' -import * as Owned from '../../../out/artifacts/Owned.sol/Owned.json' import { propose } from '../../../src/cli/propose' import { deploy } from '../../../src/cli/deploy' import { makeMockSphinxContextForIntegrationTests } from '../mock' @@ -29,7 +26,6 @@ import { getSphinxModuleAddressFromScript, getAnvilRpcUrl, } from '../common' -import { SphinxContext } from '../../../src/cli/context' chai.use(chaiAsPromised) const expect = chai.expect @@ -182,8 +178,7 @@ describe('Propose CLI command', () => { chainId: '11155111', safeAddress: proposalRequest.safeAddress, }, - ], - networkConfigArray + ] ) // Check that the DeploymentConfig array contains a contract with the correct address. @@ -192,15 +187,6 @@ describe('Propose CLI command', () => { expect( (networkConfig.actionInputs[0] as Create2ActionInput).create2Address ).equals(expectedContractAddress) - - await assertValidGasEstimates( - proposalRequest.gasEstimates, - networkConfigArray, - networks, - scriptPath, - targetContract, - context - ) }) it('Proposes without preview using --mainnets', async () => { @@ -328,8 +314,7 @@ describe('Propose CLI command', () => { chainId: '10', safeAddress: proposalRequest.safeAddress, }, - ], - networkConfigArray + ] ) // Check that the DeploymentConfig array contains contracts with the correct addresses. @@ -341,15 +326,6 @@ describe('Propose CLI command', () => { expect( (optimismConfig.actionInputs[0] as Create2ActionInput).create2Address ).equals(expectedContractAddressOptimism) - - await assertValidGasEstimates( - proposalRequest.gasEstimates, - networkConfigArray, - networks, - scriptPath, - targetContract, - context - ) }) // We'll propose a script that deploys a contract near the contract size limit. We'll deploy it @@ -445,8 +421,7 @@ describe('Propose CLI command', () => { chainId: '11155111', safeAddress: proposalRequest.safeAddress, }, - ], - networkConfigArray + ] ) // Check that the DeploymentConfig array contains contracts with the correct addresses. @@ -457,16 +432,6 @@ describe('Propose CLI command', () => { (networkConfig.actionInputs[i] as Create2ActionInput).create2Address ).equals(expectedContractAddresses[i]) } - - await assertValidGasEstimates( - proposalRequest.gasEstimates, - networkConfigArray, - networks, - scriptPath, - undefined, - context, - sig - ) }) it('Dry runs for a Gnosis Safe and Sphinx Module that have already executed a deployment', async () => { @@ -552,8 +517,7 @@ describe('Propose CLI command', () => { chainId: '11155111', safeAddress: proposalRequest.safeAddress, }, - ], - networkConfigArray + ] ) // Check that the DeploymentConfig array contains a contract with the correct address. @@ -562,15 +526,6 @@ describe('Propose CLI command', () => { expect( (networkConfig.actionInputs[0] as Create2ActionInput).create2Address ).equals(expectedContractAddress) - - await assertValidGasEstimates( - proposalRequest.gasEstimates, - networkConfigArray, - networks, - scriptPath, - targetContract, - context - ) }) // We exit early even if the Gnosis Safe and Sphinx Module haven't been deployed yet. In other @@ -681,8 +636,7 @@ describe('Propose CLI command', () => { chainId: '10', safeAddress: proposalRequest.safeAddress, }, - ], - networkConfigArray + ] ) // Check that the DeploymentConfig array contains a contract with the correct address. @@ -693,15 +647,6 @@ describe('Propose CLI command', () => { ).equals(expectedContractAddress) const optimismConfig = networkConfigArray[1] expect(optimismConfig.actionInputs.length).equals(0) - - await assertValidGasEstimates( - proposalRequest.gasEstimates, - networkConfigArray, - networks, - scriptPath, - undefined, - context - ) }) // This test checks that the proposal simulation can fail after the transactions have been @@ -753,224 +698,18 @@ describe('Propose CLI command', () => { expect(errorThrown).to.be.true }) - - describe('Issues', () => { - // We reuse the CHU-676 test to cover CHU-760 since they don't conflict with each other - describe('CHU-760: Can propose and deploy against local node with SPHINX_INTERNAL__ALLOW_LOCAL_NODES env variable', async () => { - let context: SphinxContext - - beforeEach(async () => { - // Store the original environment variables. We'll reset them after this test suite is finished. - originalEnv = { ...process.env } - - // Configure the SPHINX_INTERNAL__ALLOW_LOCAL_NODES env variable which allows local nodes - process.env['SPHINX_INTERNAL__ALLOW_LOCAL_NODES'] = 'true' - ;({ context } = makeMockSphinxContextForIntegrationTests([ - `contracts/test/script/issues/Owned.sol:Owned`, - ])) - - // Mock isLiveNetwork with a function that always returns false. - // In the rest of the test suite, we mock isLiveNetwork with a function that is always true which - // is why it's possible for us to run our integration tests against local nodes. - // We don't import and use the real isLiveNetwork function here because it's not necessary for this - // test and we don't want to accidentally use it in other parts of the test suite. - context.isLiveNetwork = async () => { - return false - } - }) - - afterEach(() => { - process.env = originalEnv - }) - - it('CHU-676: Deploys with call to safeAddress() in script', async () => { - const CHU676Path = './contracts/test/script/issues/CHU676.s.sol' - const isTestnet = true - - const { - proposalRequest, - networkConfigArray, - configArtifacts, - merkleTree, - } = await propose({ - confirm: false, // Show preview - networks: ['sepolia'], - isDryRun: true, - silent: true, - scriptPath: CHU676Path, - sphinxContext: context, - targetContract: 'CHU676', - }) - - if ( - !networkConfigArray || - !proposalRequest || - !configArtifacts || - !merkleTree - ) { - throw new Error(`Expected field(s) to be defined`) - } - - const sphinxModuleAddress = await getSphinxModuleAddressFromScript( - CHU676Path, - sepoliaRpcUrl, - 'CHU676' - ) - - const expectedContractAddress = ethers.getCreate2Address( - DETERMINISTIC_DEPLOYMENT_PROXY_ADDRESS, - ethers.ZeroHash, - ethers.keccak256( - ethers.concat([ - Owned.bytecode.object, - coder.encode(['address'], [sphinxModuleAddress]), - ]) - ) - ) - - assertValidProposalRequest( - proposalRequest, - 'Simple_Project', - isTestnet, - [11155111], - [ - { - networkTags: ['sepolia'], - executing: [ - { - referenceName: 'GnosisSafe', - functionName: 'deploy', - variables: {}, - address: proposalRequest.safeAddress, - value: '0', - }, - { - referenceName: 'SphinxModule', - functionName: 'deploy', - variables: {}, - address: proposalRequest.moduleAddress, - value: '0', - }, - { - referenceName: 'Owned', - functionName: 'deploy', - variables: { - _owner: sphinxModuleAddress, - }, - address: expectedContractAddress, - value: '0', - }, - ], - skipping: [], - chainId: '11155111', - safeAddress: proposalRequest.safeAddress, - }, - ], - networkConfigArray - ) - }) - }) - }) }) -/** - * Validates the `gasEstimates` array in the ProposalRequest. This mainly checks that the - * estimated gas is 30% greater than the actual gas used in the deployment. - */ -const assertValidGasEstimates = async ( - networkGasEstimates: ProposalRequest['gasEstimates'], - networkConfigArray: Array, - networks: Array, - scriptPath: string, - targetContract: string | undefined, - context: SphinxContext, - sig?: Array -) => { - // Check that the number of gas estimates matches the number of NetworkConfig objects with at least - // one action. - expect(networkGasEstimates.length).equals( - networkConfigArray.filter( - (networkConfig) => networkConfig.actionInputs.length > 0 - ).length - ) - - // Iterate over each network - for (let i = 0; i < networkGasEstimates.length; i++) { - const { chainId, estimatedGas } = networkGasEstimates[i] - const network = networks[i] - const networkConfig = networkConfigArray.find( - (config) => config.chainId === chainId.toString() - ) - - if (!networkConfig) { - throw new Error( - `Could not find the NetworkConfig for the current network.` - ) - } - - // Change the SphinxContext's `isLiveNetwork` method to be the standard function, which is - // necessary to accurately estimate the gas in the deployment below. Using the mocked function - // causes the deployment to use the `LiveNetworkCLI` execution mode because the mocked function - // always returns `true`. This causes an inaccurate gas estimate because the `LiveNetworkCLI` - // mode doesn't route transactions through the Managed Service contract. - context.isLiveNetwork = isLiveNetwork - - const { receipts } = await deploy({ - scriptPath, - network, - skipPreview: false, - silent: true, - sphinxContext: context, - verify: false, - targetContract, - sig, - }) - - if (!receipts) { - throw new Error('deployment failed for an unexpected reason') - } - - // We don't compare the number of actions in the NetworkConfig to the number of receipts in the - // user's deployment because multiple actions may be batched into a single call to the Sphinx - // Module's `execute` function. - - // Calculate the amount of gas used in the transaction receipts. - const actualGasUsed = receipts - .map((receipt) => receipt.gasUsed) - .map(Number) - // Sum the gas values - .reduce((a, b) => a + b, 0) - - const expectedGas = Math.round(actualGasUsed * 1.3) - const lowerBound = expectedGas * 0.99 - const upperBound = expectedGas * 1.01 - expect(Number(estimatedGas)).to.be.at.least(lowerBound) - expect(Number(estimatedGas)).to.be.at.most(upperBound) - } -} - const assertValidProposalRequest = ( proposalRequest: ProposalRequest, projectName: string, isTestnet: boolean, chainIds: Array, - previewNetworks: SphinxPreview['networks'], - networkConfigArray: Array + previewNetworks: SphinxPreview['networks'] ) => { expect(proposalRequest.apiKey).to.equal(sphinxApiKey) expect(proposalRequest.orgId).to.equal('test-org-id') expect(proposalRequest.isTestnet).to.equal(isTestnet) expect(proposalRequest.chainIds).to.deep.equal(chainIds) expect(proposalRequest.diff.networks).to.deep.equal(previewNetworks) - - // Expect funding estimate size to exactly match funding request listed in the deployment config - for (const estimate of proposalRequest.gasEstimates) { - const networkConfig = networkConfigArray.find( - (config) => config.chainId === estimate.chainId.toString() - ) - expect(networkConfig).not.undefined - expect(networkConfig?.safeFundingRequest?.fundsRequested).to.eq( - estimate.fundsRequested - ) - } } diff --git a/packages/plugins/test/mocha/common.ts b/packages/plugins/test/mocha/common.ts index ca5847d13..0e5c1535b 100644 --- a/packages/plugins/test/mocha/common.ts +++ b/packages/plugins/test/mocha/common.ts @@ -49,7 +49,6 @@ import { getSphinxModuleProxyFactoryAddress, Operation, SphinxMerkleTree, - getManagedServiceAddress, makeSphinxMerkleTree, parseFoundryContractArtifact, ContractArtifact, @@ -62,6 +61,7 @@ import { getCreateCallAddress, getGnosisSafeProxyAddress, getGnosisSafeInitializerData, + getPermissionlessRelayAddress, } from '@sphinx-labs/contracts' import { expect } from 'chai' @@ -237,7 +237,7 @@ export const makeDeployment = async ( } executorAddress = owners[0].address } else { - executorAddress = getManagedServiceAddress() + executorAddress = getPermissionlessRelayAddress() } const ownerAddresses = owners.map((owner) => owner.address) diff --git a/packages/plugins/test/mocha/foundry/utils.spec.ts b/packages/plugins/test/mocha/foundry/utils.spec.ts index 8dd6fb4b2..ee0245a7c 100644 --- a/packages/plugins/test/mocha/foundry/utils.spec.ts +++ b/packages/plugins/test/mocha/foundry/utils.spec.ts @@ -933,7 +933,6 @@ describe('Utils', async () => { const unsupportedNetworkOne = 'unsupported1' const unsupportedNetworkTwo = 'unsupported2' - let isLiveNetwork: sinon.SinonSpy let rpcEndpoints: FoundryToml['rpcEndpoints'] let getNetworkStub: sinon.SinonStub @@ -948,7 +947,6 @@ describe('Utils', async () => { getNetworkStub = sinon.stub() - isLiveNetwork = sinon.fake.resolves(true) sinon .stub(SphinxJsonRpcProvider.prototype, 'getNetwork') .callsFake(getNetworkStub) @@ -960,7 +958,7 @@ describe('Utils', async () => { it('throws an error if no CLI networks are provided', async () => { await expect( - validateProposalNetworks([], [], [], rpcEndpoints, isLiveNetwork) + validateProposalNetworks([], [], [], rpcEndpoints) ).to.be.rejectedWith( `Expected at least one network, but none were supplied.` ) @@ -969,26 +967,14 @@ describe('Utils', async () => { it('throws an error for missing RPC endpoints', async () => { const unknownNetworks = ['unknown1', 'unknown2'] await expect( - validateProposalNetworks( - unknownNetworks, - [], - [], - rpcEndpoints, - isLiveNetwork - ) + validateProposalNetworks(unknownNetworks, [], [], rpcEndpoints) ).to.be.rejectedWith(getMissingEndpointErrorMessage(unknownNetworks)) }) it('throws an error for failed requests to RPC endpoints', async () => { getNetworkStub.rejects(new Error('Request failed')) await expect( - validateProposalNetworks( - validNetworks, - [], - [], - rpcEndpoints, - isLiveNetwork - ) + validateProposalNetworks(validNetworks, [], [], rpcEndpoints) ).to.be.rejectedWith(getFailedRequestErrorMessage(validNetworks)) }) @@ -1012,8 +998,7 @@ describe('Utils', async () => { [unsupportedNetworkOne, unsupportedNetworkTwo], [], [], - rpcEndpoints, - isLiveNetwork + rpcEndpoints ) ).to.be.rejectedWith( getUnsupportedNetworkErrorMessage(unsupportedNetworks) @@ -1024,13 +1009,7 @@ describe('Utils', async () => { getNetworkStub.resolves({ chainId: BigInt(1) }) isLiveNetwork = sinon.fake.resolves(false) await expect( - validateProposalNetworks( - validNetworks, - [], - [], - rpcEndpoints, - isLiveNetwork - ) + validateProposalNetworks(validNetworks, [], [], rpcEndpoints) ).to.be.rejectedWith(getLocalNetworkErrorMessage(validNetworks)) }) @@ -1046,13 +1025,7 @@ describe('Utils', async () => { getNetworkStub.onThirdCall().resolves({ chainId: BigInt(11155111) }) // Test network (Sepolia) await expect( - validateProposalNetworks( - validNetworks, - [], - [], - rpcEndpoints, - isLiveNetwork - ) + validateProposalNetworks(validNetworks, [], [], rpcEndpoints) ).to.be.rejectedWith(getMixedNetworkTypeErrorMessage(mixedNetworks)) }) @@ -1064,8 +1037,7 @@ describe('Utils', async () => { ['mainnets'], [], [validTestnetOne], - rpcEndpoints, - isLiveNetwork + rpcEndpoints ) ).to.be.rejectedWith(SphinxConfigMainnetsContainsTestnetsErrorMessage) }) @@ -1078,8 +1050,7 @@ describe('Utils', async () => { ['testnets'], [validMainnetOne, validMainnetTwo], [], - rpcEndpoints, - isLiveNetwork + rpcEndpoints ) ).to.be.rejectedWith(SphinxConfigTestnetsContainsMainnetsErrorMessage) }) @@ -1092,8 +1063,7 @@ describe('Utils', async () => { [validMainnetOne, validMainnetTwo], [], [], - rpcEndpoints, - isLiveNetwork + rpcEndpoints ) expect(result.rpcUrls).to.deep.equals([ rpcEndpoints[validMainnetOne], @@ -1110,8 +1080,7 @@ describe('Utils', async () => { ['mainnets'], [], [validMainnetOne, validMainnetTwo], - rpcEndpoints, - isLiveNetwork + rpcEndpoints ) expect(result.rpcUrls).to.deep.equals([ rpcEndpoints[validMainnetOne], @@ -1127,8 +1096,7 @@ describe('Utils', async () => { ['testnets'], [validTestnetOne], [], - rpcEndpoints, - isLiveNetwork + rpcEndpoints ) expect(result.rpcUrls).to.deep.equals([rpcEndpoints[validTestnetOne]]) expect(result.isTestnet).to.be.true diff --git a/packages/plugins/test/mocha/mock.ts b/packages/plugins/test/mocha/mock.ts index bbce2ddb0..1df7bbdc3 100644 --- a/packages/plugins/test/mocha/mock.ts +++ b/packages/plugins/test/mocha/mock.ts @@ -27,16 +27,6 @@ export const makeMockSphinxContext = ( .stub(sphinxContext, 'isLiveNetwork') .returns(Promise.resolve(true)) - const getNetworkGasEstimate = sinon - .stub(sphinxContext, 'getNetworkGasEstimate') - .returns( - Promise.resolve({ - chainId: 0, - estimatedGas: '0', - fundsRequested: '0', - transactions: [], - }) - ) const relayProposal = sinon .stub(sphinxContext, 'relayProposal') .returns(Promise.resolve()) @@ -97,7 +87,6 @@ export const makeMockSphinxContext = ( propose, deploy, buildNetworkConfigArray, - getNetworkGasEstimate, storeDeploymentConfig, relayProposal, prompt, diff --git a/packages/plugins/test/mocha/simulate.spec.ts b/packages/plugins/test/mocha/simulate.spec.ts deleted file mode 100644 index c4298cc98..000000000 --- a/packages/plugins/test/mocha/simulate.spec.ts +++ /dev/null @@ -1,439 +0,0 @@ -import chai, { expect } from 'chai' -import chaiAsPromised from 'chai-as-promised' -import { - DeploymentConfig, - ExecutionMode, - SphinxJsonRpcProvider, - fetchURLForNetwork, - fetchNameForNetwork, - isFork, - isLiveNetwork, - NetworkConfig, - InvariantError, - sphinxCoreExecute, - sphinxCoreUtils, -} from '@sphinx-labs/core' -import { ethers } from 'ethers' -import { - SPHINX_NETWORKS, - getGnosisSafeProxyAddress, -} from '@sphinx-labs/contracts' -import sinon from 'sinon' -import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' -import sinonChai from 'sinon-chai' - -import { - getAnvilRpcUrl, - killAnvilNodes, - makeDeployment, - makeStandardDeployment, - promiseThatNeverSettles, - startForkedAnvilNodes, - sumEvenNumbers, -} from './common' -import { - simulationConstants, - createHardhatEthersProviderProxy, - getUndeployedContractErrorMesage, - handleSimulationSuccess, - simulate, - simulateDeploymentSubtask, -} from '../../src/hardhat/simulate' -import { - dummyUnlabeledAddress, - getDummyDeploymentConfig, - getDummyNetworkConfig, -} from './dummy' -import { - HardhatResetNotAllowedErrorMessage, - getRpcRequestStalledErrorMessage, -} from '../../src/foundry/error-messages' - -chai.use(chaiAsPromised) -chai.use(sinonChai) - -describe('Simulate', () => { - let networkConfigArray: Array - let deploymentConfig: DeploymentConfig - - before(async function () { - // Skip the tests if the environment variable `CIRCLE_BRANCH` is defined and does not equal - // 'develop', which enforces that these tests only run in CI when the source branch is - // 'develop'. These tests will also run on local machines because the `CIRCLE_BRANCH` - // environment variable isn't defined. - const CIRCLE_BRANCH = process.env.CIRCLE_BRANCH - if (typeof CIRCLE_BRANCH === 'string' && CIRCLE_BRANCH !== 'develop') { - console.log('Skipping tests since this is not the develop branch') - this.skip() - } - - process.env['SPHINX_API_KEY'] = 'test-api-key' - - const ownerWallets = [ - '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', - '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d', - '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a', - ].map((pk) => new ethers.Wallet(pk)) - const threshold = 3 - const safeAddress = getGnosisSafeProxyAddress( - ownerWallets.map((o) => o.address), - threshold, - 0 - ) - const { accountAccesses } = makeStandardDeployment( - 0, - ExecutionMode.Platform, - safeAddress - ) - - const productionNetworkNames = SPHINX_NETWORKS.filter( - (n) => n.networkType === 'Mainnet' - ).map((n) => n.name) - const testnetNames = SPHINX_NETWORKS.filter( - (n) => n.networkType === 'Testnet' - ).map((n) => n.name) - const networkNames = productionNetworkNames.concat(testnetNames) - - const deployment = await makeDeployment( - 0, // First deployment - networkNames, - 'Project_Name', - ownerWallets, - threshold, // Threshold - ExecutionMode.Platform, - accountAccesses, - fetchURLForNetwork - ) - networkConfigArray = deployment.deploymentConfig.networkConfigs - deploymentConfig = deployment.deploymentConfig - }) - - // The main purpose of this test is to check that there aren't conditions on live networks that - // would always cause the simulation to fail. These conditions may not be captured when testing on - // local nodes. For example, networks like Arbitrum Sepolia have a block gas limit that's several - // orders of magniture higher than standard local nodes, which caused a bug in the simulation - // logic. - it('succeeds on every live supported network', async () => { - const results = await Promise.allSettled( - networkConfigArray.map((networkConfig) => - simulate( - deploymentConfig, - networkConfig.chainId, - fetchURLForNetwork(BigInt(networkConfig.chainId)) - ) - ) - ) - - results.forEach((result, index) => { - if (result.status === 'rejected') { - const chainId = networkConfigArray[index].chainId - const networkName = fetchNameForNetwork(BigInt(chainId)) - console.error(`Error on network ${networkName}:`, result.reason) - } - }) - - // Check that all promises were resolved - expect(results.every((result) => result.status === 'fulfilled')).to.be.true - }) - - // This test checks that we can simulate a deployment on an Anvil node that's forking Ethereum. We - // added this test because we were previously receiving a `HeadersTimeoutError` originating from - // undici, which is called by Hardhat during the simulation. The error was occurring because we - // were fast-forwarding the block number on forked local nodes. It was only occurring ~50% of the - // time in this situation for an unknown reason. - it(`succeeds on anvil fork of ethereum`, async () => { - const ethereumChainId = BigInt(1) - await startForkedAnvilNodes([ethereumChainId]) - - const networkConfig = networkConfigArray.find( - ({ chainId }) => chainId === ethereumChainId.toString() - ) - if (!networkConfig) { - throw new Error(`Could not find Ethereum NetworkConfig.`) - } - - // Get the Anvil RPC url, which is running the Ethereum fork. - const rpcUrl = getAnvilRpcUrl(ethereumChainId) - const provider = new SphinxJsonRpcProvider(rpcUrl) - - // Sanity check that the provider is targeting a forked network which isn't a live network. - expect(await isFork(provider)).equals(true) - expect(await isLiveNetwork(provider)).equals(false) - - // Run the simulation. If an error is thrown, the test will fail. We don't use `chaiAsPromised` - // here because it truncates the error message if an error occurs. - await simulate( - deploymentConfig, - networkConfig.chainId, - getAnvilRpcUrl(ethereumChainId) - ) - - await killAnvilNodes([ethereumChainId]) - }) -}) - -describe('simulateDeploymentSubtask', () => { - const testInvariantErrorMessage = 'Test InvariantError' - const hre: any = {} - hre.ethers = {} - - let providerStub: sinon.SinonStubbedInstance - - beforeEach(() => { - providerStub = sinon.createStubInstance(HardhatEthersProvider) - hre.ethers.provider = providerStub - - sinon - .stub(sphinxCoreExecute, 'attemptDeployment') - .throws(new InvariantError(testInvariantErrorMessage)) - }) - - afterEach(() => { - sinon.restore() - }) - - it('should rethrow the InvariantError thrown by attemptDeployment', async () => { - const taskArgs = { - deploymentConfig: getDummyDeploymentConfig(), - chainId: '1', - } - - try { - await simulateDeploymentSubtask(taskArgs, hre) - // If the function doesn't throw, force the test to fail - expect.fail('Expected function to throw an InvariantError.') - } catch (error) { - expect(error).to.be.instanceOf(InvariantError) - expect(error.message).to.include(testInvariantErrorMessage) - } - }) -}) - -describe('handleSimulationSuccess', () => { - let providerStub: sinon.SinonStubbedInstance - - beforeEach(() => { - providerStub = sinon.createStubInstance(HardhatEthersProvider) - - providerStub.getCode.resolves('0x') - }) - - afterEach(() => { - sinon.restore() - }) - - it('should throw an InvariantError if a contract address has no deployed code', async () => { - const networkConfig = getDummyNetworkConfig() - - try { - await handleSimulationSuccess(networkConfig, providerStub) - // If the function doesn't throw, force the test to fail - expect.fail('Expected function to throw an InvariantError.') - } catch (error) { - expect(error).to.be.instanceOf(InvariantError) - expect(error.message).to.include( - getUndeployedContractErrorMesage(dummyUnlabeledAddress) - ) - } - }) -}) - -describe('createHardhatEthersProviderProxy', () => { - const asyncMethods = [ - { name: 'send', isAsync: true }, - { name: 'hardhat_reset', isAsync: true }, - { name: 'getBlockNumber', isAsync: true }, - { name: 'toJSON', isAsync: false }, - ] - - let ethersProvider: any - let proxy: HardhatEthersProvider - let timeSum: number = 0 - let sendStub: sinon.SinonStub - let isPublicAsyncMethodStub: sinon.SinonStub - - beforeEach(() => { - sinon - .stub(sphinxCoreUtils, 'sleep') - .callsFake(async (time: number): Promise => { - timeSum += time - }) - isPublicAsyncMethodStub = sinon.stub(sphinxCoreUtils, 'isPublicAsyncMethod') - - for (const { name, isAsync } of asyncMethods) { - isPublicAsyncMethodStub.withArgs(sinon.match.any, name).returns(isAsync) - } - - sendStub = sinon.stub().resolves('defaultPromiseValue') - sendStub.withArgs('evm_snapshot', []).resolves('snapshotId') - sendStub.withArgs('evm_revert').resolves(true) - ethersProvider = { - send: sendStub, - } as any - - proxy = createHardhatEthersProviderProxy(ethersProvider) - }) - - afterEach(() => { - timeSum = 0 - sinon.restore() - }) - - it('CHU-768: throws error if hardhat_reset is called', async () => { - await expect(proxy.send('hardhat_reset', [])).to.eventually.be.rejectedWith( - HardhatResetNotAllowedErrorMessage - ) - }) - - it('CHU-768: throws timeout error for a promise that never settles', async () => { - const originalTimeout = simulationConstants.timeout - const timeout = 4 // We use a timeout of 4 ms so that this test executes quickly. - simulationConstants.timeout = timeout - - ethersProvider.getBlockNumber = sinon - .stub() - .resolves(promiseThatNeverSettles) - - const callWithTimeoutSpy = sinon.spy(sphinxCoreUtils, 'callWithTimeout') - - await expect(proxy.getBlockNumber()).to.eventually.be.rejectedWith( - getRpcRequestStalledErrorMessage(timeout) - ) - - // Check that we made `maxAttempts` attempts. In production, we still make repeated attempts - // when there's a timeout in case this fixes the stall issue. - expect(callWithTimeoutSpy.callCount).to.equal( - simulationConstants.maxAttempts - ) - for (let i = 0; i < simulationConstants.maxAttempts; i++) { - expect(callWithTimeoutSpy.getCall(i).args[1]).to.equal(timeout) - } - - simulationConstants.timeout = originalTimeout - }) - - it('throws error after max attempts', async () => { - const methodError = new Error('Test method failure') - - ethersProvider.getBlockNumber = sinon.stub() - ethersProvider.getBlockNumber.rejects(methodError) - - await expect(proxy.getBlockNumber()).to.be.rejectedWith(methodError) - - expect(ethersProvider.getBlockNumber.callCount).to.equal( - simulationConstants.maxAttempts - ) - - // Verify linear backoff timing - const expectedDuration = - sumEvenNumbers( - 2, - // We subtract one because we throw the error after the last attempt instead of waiting. - simulationConstants.maxAttempts - 1 - ) * 1000 - expect(timeSum).equals(expectedDuration) - // Check that the time is denominated in seconds - expect(timeSum % 1000).equals(0) - - // The following is a regression test for the 'nonce too low' bug described in this pull request - // description: https://github.com/sphinx-labs/sphinx/pull/1565 - // - // We check that each iteration follows the pattern: evm_snapshot -> forwarded method -> - // evm_revert. - for (let i = 0; i < simulationConstants.maxAttempts; i++) { - const baseIndex = i * 2 - - const callOne = ethersProvider.send.getCall(baseIndex) - const callTwo = ethersProvider.getBlockNumber.getCall(i) - - expect(callOne.calledWith('evm_snapshot')).to.be.true - expect(callOne).calledBefore(callTwo) - - const callThree = sendStub.getCall(baseIndex + 1) - expect(callTwo).calledBefore(callThree) - expect(callThree.calledWith('evm_revert')).to.be.true - } - }) - - it('successful call on first attempt', async () => { - const expectedReturnValue = 42 - ethersProvider.getBlockNumber = sinon.stub().resolves(expectedReturnValue) - - const result = await proxy.getBlockNumber() - expect(result).to.equal(expectedReturnValue) - expect(ethersProvider.send.withArgs('evm_snapshot', [])).to.have.been - .calledOnce - expect(ethersProvider.send.withArgs('evm_revert', sinon.match.any)).to.not - .have.been.called - expect(sendStub.withArgs('evm_snapshot', [])).to.have.been.calledBefore( - ethersProvider.getBlockNumber - ) - }) - - it('successful call on last retry', async () => { - const expectedReturnValue = 42 - const methodError = new Error('Test method failure') - - // Make every call reject except for the last one - ethersProvider.getBlockNumber = sinon.stub() - for (let i = 0; i < simulationConstants.maxAttempts - 1; i++) { - ethersProvider.getBlockNumber.onCall(i).rejects(methodError) - } - // Make the last call resolve successfully - ethersProvider.getBlockNumber - .onCall(simulationConstants.maxAttempts - 1) - .resolves(expectedReturnValue) - - const result = await proxy.getBlockNumber() - - expect(result).to.equal(expectedReturnValue) - - // Check that 'evm_snapshot' was called first (i.e. before `getBlockNumber`). - expect(ethersProvider.send.firstCall).to.have.been.calledWith( - 'evm_snapshot', - [] - ) - // Check that we made `maxAttempts` attempts. - expect(ethersProvider.getBlockNumber.callCount).to.equal( - simulationConstants.maxAttempts - ) - - // Verify linear backoff timing - const expectedDuration = - sumEvenNumbers( - 2, - // We subtract one because we throw the error after the last attempt instead of waiting. - simulationConstants.maxAttempts - 1 - ) * 1000 - expect(timeSum).equals(expectedDuration) - // Check that the time is denominated in seconds - expect(timeSum % 1000).equals(0) - - // Check that the last call was successful - expect( - ethersProvider.getBlockNumber.lastCall.returnValue - ).to.eventually.equal(expectedReturnValue) - }) - - it('returns value for synchronous function call', () => { - const expected = 'myValue' - ethersProvider.toJSON = () => expected - expect(proxy.toJSON()).to.equal(expected) - }) - - it('forwards async call to the proxy after being awaited', async () => { - ethersProvider.getBlockNumber = sinon.stub().resolves(42) - const callWithTimeoutSpy = sinon.spy(sphinxCoreUtils, 'callWithTimeout') - - // Call an asynchronous method on the proxy without awaiting it. - const resultPromise = proxy.getBlockNumber() - - // Check that the call to the Hardhat provider wasn't made yet. - expect(callWithTimeoutSpy.called).to.be.false - - await resultPromise - - // Check that the Hardhat provider was called. - expect(callWithTimeoutSpy.called).to.be.true - }) -})