diff options
author | Amir Bandeali <abandeali1@gmail.com> | 2018-08-20 11:56:21 +0800 |
---|---|---|
committer | Amir Bandeali <abandeali1@gmail.com> | 2018-08-22 04:53:38 +0800 |
commit | 3d25758b1d107528b0bc8a578e3c5ecf020395b3 (patch) | |
tree | fe1a32ce5caa37e0549e3c9577e7ed4ebbda768b /packages | |
parent | dafb282432f51b670e5117e70e7a15cd64aea899 (diff) | |
download | dexon-sol-tools-3d25758b1d107528b0bc8a578e3c5ecf020395b3.tar.gz dexon-sol-tools-3d25758b1d107528b0bc8a578e3c5ecf020395b3.tar.zst dexon-sol-tools-3d25758b1d107528b0bc8a578e3c5ecf020395b3.zip |
Add OrderValidator to migrations
Diffstat (limited to 'packages')
-rw-r--r-- | packages/0x.js/package.json | 2 | ||||
-rw-r--r-- | packages/contract-wrappers/package.json | 2 | ||||
-rw-r--r-- | packages/migrations/artifacts/2.0.0-beta-testnet/OrderValidator.json | 570 | ||||
-rw-r--r-- | packages/migrations/package.json | 8 | ||||
-rw-r--r-- | packages/migrations/src/2.0.0-beta-testnet/artifacts.ts | 2 | ||||
-rw-r--r-- | packages/migrations/src/2.0.0-beta-testnet/migration.ts | 10 | ||||
-rw-r--r-- | packages/migrations/src/2.0.0/artifacts.ts | 2 | ||||
-rw-r--r-- | packages/migrations/src/2.0.0/migration.ts | 12 | ||||
-rw-r--r-- | packages/order-watcher/package.json | 2 |
9 files changed, 603 insertions, 7 deletions
diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json index 63b271170..4005ef452 100644 --- a/packages/0x.js/package.json +++ b/packages/0x.js/package.json @@ -38,7 +38,7 @@ "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, "config": { - "contracts": "ZRXToken AssetProxyOwner DummyERC20Token DummyERC721Token ERC20Proxy ERC721Proxy Exchange Forwarder WETH9", + "contracts": "ZRXToken AssetProxyOwner DummyERC20Token DummyERC721Token ERC20Proxy ERC721Proxy Exchange Forwarder OrderValidator WETH9", "postpublish": { "assets": [ "packages/0x.js/_bundles/index.js", diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json index 3399c7a9f..1dc55020a 100644 --- a/packages/contract-wrappers/package.json +++ b/packages/contract-wrappers/package.json @@ -29,7 +29,7 @@ "manual:postpublish": "yarn build; node ./scripts/postpublish.js" }, "config": { - "contracts_v2_beta": "AssetProxyOwner Exchange ERC20Proxy ERC20Token ERC721Proxy ERC721Token WETH9 ZRXToken Forwarder", + "contracts_v2_beta": "AssetProxyOwner Exchange ERC20Proxy ERC20Token ERC721Proxy ERC721Token WETH9 ZRXToken Forwarder OrderValidator", "contracts_v2": "DummyERC20Token DummyERC721Token" }, "repository": { diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/OrderValidator.json b/packages/migrations/artifacts/2.0.0-beta-testnet/OrderValidator.json new file mode 100644 index 000000000..1dc6fdecb --- /dev/null +++ b/packages/migrations/artifacts/2.0.0-beta-testnet/OrderValidator.json @@ -0,0 +1,570 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "OrderValidator", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "makerAddress", + "type": "address" + }, + { + "name": "takerAddress", + "type": "address" + }, + { + "name": "feeRecipientAddress", + "type": "address" + }, + { + "name": "senderAddress", + "type": "address" + }, + { + "name": "makerAssetAmount", + "type": "uint256" + }, + { + "name": "takerAssetAmount", + "type": "uint256" + }, + { + "name": "makerFee", + "type": "uint256" + }, + { + "name": "takerFee", + "type": "uint256" + }, + { + "name": "expirationTimeSeconds", + "type": "uint256" + }, + { + "name": "salt", + "type": "uint256" + }, + { + "name": "makerAssetData", + "type": "bytes" + }, + { + "name": "takerAssetData", + "type": "bytes" + } + ], + "name": "order", + "type": "tuple" + }, + { + "name": "takerAddress", + "type": "address" + } + ], + "name": "getOrderAndTraderInfo", + "outputs": [ + { + "components": [ + { + "name": "orderStatus", + "type": "uint8" + }, + { + "name": "orderHash", + "type": "bytes32" + }, + { + "name": "orderTakerAssetFilledAmount", + "type": "uint256" + } + ], + "name": "orderInfo", + "type": "tuple" + }, + { + "components": [ + { + "name": "makerBalance", + "type": "uint256" + }, + { + "name": "makerAllowance", + "type": "uint256" + }, + { + "name": "takerBalance", + "type": "uint256" + }, + { + "name": "takerAllowance", + "type": "uint256" + } + ], + "name": "traderInfo", + "type": "tuple" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "target", + "type": "address" + }, + { + "name": "assetData", + "type": "bytes" + } + ], + "name": "getBalanceAndAllowance", + "outputs": [ + { + "name": "balance", + "type": "uint256" + }, + { + "name": "allowance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "makerAddress", + "type": "address" + }, + { + "name": "takerAddress", + "type": "address" + }, + { + "name": "feeRecipientAddress", + "type": "address" + }, + { + "name": "senderAddress", + "type": "address" + }, + { + "name": "makerAssetAmount", + "type": "uint256" + }, + { + "name": "takerAssetAmount", + "type": "uint256" + }, + { + "name": "makerFee", + "type": "uint256" + }, + { + "name": "takerFee", + "type": "uint256" + }, + { + "name": "expirationTimeSeconds", + "type": "uint256" + }, + { + "name": "salt", + "type": "uint256" + }, + { + "name": "makerAssetData", + "type": "bytes" + }, + { + "name": "takerAssetData", + "type": "bytes" + } + ], + "name": "orders", + "type": "tuple[]" + }, + { + "name": "takerAddresses", + "type": "address[]" + } + ], + "name": "getOrdersAndTradersInfo", + "outputs": [ + { + "components": [ + { + "name": "orderStatus", + "type": "uint8" + }, + { + "name": "orderHash", + "type": "bytes32" + }, + { + "name": "orderTakerAssetFilledAmount", + "type": "uint256" + } + ], + "name": "ordersInfo", + "type": "tuple[]" + }, + { + "components": [ + { + "name": "makerBalance", + "type": "uint256" + }, + { + "name": "makerAllowance", + "type": "uint256" + }, + { + "name": "takerBalance", + "type": "uint256" + }, + { + "name": "takerAllowance", + "type": "uint256" + } + ], + "name": "tradersInfo", + "type": "tuple[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "makerAddress", + "type": "address" + }, + { + "name": "takerAddress", + "type": "address" + }, + { + "name": "feeRecipientAddress", + "type": "address" + }, + { + "name": "senderAddress", + "type": "address" + }, + { + "name": "makerAssetAmount", + "type": "uint256" + }, + { + "name": "takerAssetAmount", + "type": "uint256" + }, + { + "name": "makerFee", + "type": "uint256" + }, + { + "name": "takerFee", + "type": "uint256" + }, + { + "name": "expirationTimeSeconds", + "type": "uint256" + }, + { + "name": "salt", + "type": "uint256" + }, + { + "name": "makerAssetData", + "type": "bytes" + }, + { + "name": "takerAssetData", + "type": "bytes" + } + ], + "name": "orders", + "type": "tuple[]" + }, + { + "name": "takerAddresses", + "type": "address[]" + } + ], + "name": "getTradersInfo", + "outputs": [ + { + "components": [ + { + "name": "makerBalance", + "type": "uint256" + }, + { + "name": "makerAllowance", + "type": "uint256" + }, + { + "name": "takerBalance", + "type": "uint256" + }, + { + "name": "takerAllowance", + "type": "uint256" + } + ], + "name": "", + "type": "tuple[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "token", + "type": "address" + }, + { + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getERC721TokenOwner", + "outputs": [ + { + "name": "owner", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "makerAddress", + "type": "address" + }, + { + "name": "takerAddress", + "type": "address" + }, + { + "name": "feeRecipientAddress", + "type": "address" + }, + { + "name": "senderAddress", + "type": "address" + }, + { + "name": "makerAssetAmount", + "type": "uint256" + }, + { + "name": "takerAssetAmount", + "type": "uint256" + }, + { + "name": "makerFee", + "type": "uint256" + }, + { + "name": "takerFee", + "type": "uint256" + }, + { + "name": "expirationTimeSeconds", + "type": "uint256" + }, + { + "name": "salt", + "type": "uint256" + }, + { + "name": "makerAssetData", + "type": "bytes" + }, + { + "name": "takerAssetData", + "type": "bytes" + } + ], + "name": "order", + "type": "tuple" + }, + { + "name": "takerAddress", + "type": "address" + } + ], + "name": "getTraderInfo", + "outputs": [ + { + "components": [ + { + "name": "makerBalance", + "type": "uint256" + }, + { + "name": "makerAllowance", + "type": "uint256" + }, + { + "name": "takerBalance", + "type": "uint256" + }, + { + "name": "takerAllowance", + "type": "uint256" + } + ], + "name": "traderInfo", + "type": "tuple" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "_exchange", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "0x608060405234801561001057600080fd5b506040516020806117f2833981018060405261002f9190810190610067565b60008054600160a060020a031916600160a060020a0392909216919091179055610099565b6000610060825161008d565b9392505050565b60006020828403121561007957600080fd5b60006100858484610054565b949350505050565b600160a060020a031690565b61174a806100a86000396000f3006080604052600436106100775763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166304ad1e53811461007c5780632cd0fc73146100b35780634b95de13146100e1578063690d31141461010f578063b69884631461013c578063f241ffb014610169575b600080fd5b34801561008857600080fd5b5061009c610097366004611020565b610196565b6040516100aa929190611569565b60405180910390f35b3480156100bf57600080fd5b506100d36100ce366004610ece565b610263565b6040516100aa9291906115b1565b3480156100ed57600080fd5b506101016100fc366004610f85565b610794565b6040516100aa9291906114d4565b34801561011b57600080fd5b5061012f61012a366004610f85565b61086b565b6040516100aa919061150a565b34801561014857600080fd5b5061015c610157366004610f20565b610925565b6040516100aa91906114ab565b34801561017557600080fd5b50610189610184366004611020565b610970565b6040516100aa9190611595565b61019e610adf565b6101a6610aff565b6000546040517fc75e0a8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063c75e0a81906101fc908790600401611584565b606060405180830381600087803b15801561021657600080fd5b505af115801561022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061024e9190810190611002565b915061025a8484610970565b90509250929050565b60008080808080808061027c898263ffffffff6109b316565b955061028f89601063ffffffff610a2016565b6000546040517f6070410800000000000000000000000000000000000000000000000000000000815291965073ffffffffffffffffffffffffffffffffffffffff16906360704108906102e690899060040161151b565b602060405180830381600087803b15801561030057600080fd5b505af1158015610314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103389190810190610ea8565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209094507fffffffff00000000000000000000000000000000000000000000000000000000878116911614156104ed576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906370a08231906103eb908d906004016114ab565b602060405180830381600087803b15801561040557600080fd5b505af1158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061043d9190810190611067565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815290985073ffffffffffffffffffffffffffffffffffffffff86169063dd62ed3e90610494908d9088906004016114b9565b602060405180830381600087803b1580156104ae57600080fd5b505af11580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104e69190810190611067565b9650610787565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190207fffffffff000000000000000000000000000000000000000000000000000000008781169116141561074c5761055c89602463ffffffff610a8116565b92506105688584610925565b91508173ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146105a45760006105a7565b60015b60ff1697508473ffffffffffffffffffffffffffffffffffffffff1663e985e9c58b866040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016106039291906114b9565b602060405180830381600087803b15801561061d57600080fd5b505af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106559190810190610fe4565b8061073157508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1663081812fc856040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016106c791906115a3565b602060405180830381600087803b1580156106e157600080fd5b505af11580156106f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107199190810190610ea8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061073f576000610742565b60015b60ff169650610787565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90611539565b60405180910390fd5b5050505050509250929050565b6000546040517f7e9d74dc000000000000000000000000000000000000000000000000000000008152606091829173ffffffffffffffffffffffffffffffffffffffff90911690637e9d74dc906107ef9087906004016114f9565b600060405180830381600087803b15801561080957600080fd5b505af115801561081d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108639190810190610f50565b915061025a84845b606060006060600085519250826040519080825280602002602001820160405280156108b157816020015b61089e610aff565b8152602001906001900390816108965790505b509150600090505b808314610918576108f886828151811015156108d157fe5b9060200190602002015186838151811015156108e957fe5b90602001906020020151610970565b828281518110151561090657fe5b602090810290910101526001016108b9565b8193505b50505092915050565b60006040517f6352211e000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa801561096757815192505b50505b92915050565b610978610aff565b61098b8360000151846101400151610263565b602083015281526101608301516109a3908390610263565b6060830152604082015292915050565b6000816004018351101515156109f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90611559565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b600081601401835110151515610a62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90611549565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6000610a8d8383610a94565b9392505050565b600081602001835110151515610ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90611529565b50016020015190565b604080516060810182526000808252602082018190529181019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b6000610a8d8235611664565b6000610a8d8251611664565b6000601f82018313610b5157600080fd5b8135610b64610b5f826115f3565b6115cc565b91508181835260208401935060208101905083856020840282011115610b8957600080fd5b60005b83811015610bb55781610b9f8882610b28565b8452506020928301929190910190600101610b8c565b5050505092915050565b6000601f82018313610bd057600080fd5b8151610bde610b5f826115f3565b91508181835260208401935060208101905083856060840282011115610c0357600080fd5b60005b83811015610bb55781610c198882610cec565b84525060209092019160609190910190600101610c06565b6000601f82018313610c4257600080fd5b8135610c50610b5f826115f3565b81815260209384019390925082018360005b83811015610bb55781358601610c788882610d47565b8452506020928301929190910190600101610c62565b6000610a8d82516116ab565b6000610a8d825161167d565b6000601f82018313610cb757600080fd5b8135610cc5610b5f82611614565b91508082526020830160208301858383011115610ce157600080fd5b61091c8382846116b0565b600060608284031215610cfe57600080fd5b610d0860606115cc565b90506000610d168484610e9c565b8252506020610d2784848301610c9a565b6020830152506040610d3b84828501610c9a565b60408301525092915050565b60006101808284031215610d5a57600080fd5b610d656101806115cc565b90506000610d738484610b28565b8252506020610d8484848301610b28565b6020830152506040610d9884828501610b28565b6040830152506060610dac84828501610b28565b6060830152506080610dc084828501610e90565b60808301525060a0610dd484828501610e90565b60a08301525060c0610de884828501610e90565b60c08301525060e0610dfc84828501610e90565b60e083015250610100610e1184828501610e90565b61010083015250610120610e2784828501610e90565b6101208301525061014082013567ffffffffffffffff811115610e4957600080fd5b610e5584828501610ca6565b6101408301525061016082013567ffffffffffffffff811115610e7757600080fd5b610e8384828501610ca6565b6101608301525092915050565b6000610a8d823561167d565b6000610a8d82516116a5565b600060208284031215610eba57600080fd5b6000610ec68484610b34565b949350505050565b60008060408385031215610ee157600080fd5b6000610eed8585610b28565b925050602083013567ffffffffffffffff811115610f0a57600080fd5b610f1685828601610ca6565b9150509250929050565b60008060408385031215610f3357600080fd5b6000610f3f8585610b28565b9250506020610f1685828601610e90565b600060208284031215610f6257600080fd5b815167ffffffffffffffff811115610f7957600080fd5b610ec684828501610bbf565b60008060408385031215610f9857600080fd5b823567ffffffffffffffff811115610faf57600080fd5b610fbb85828601610c31565b925050602083013567ffffffffffffffff811115610fd857600080fd5b610f1685828601610b40565b600060208284031215610ff657600080fd5b6000610ec68484610c8e565b60006060828403121561101457600080fd5b6000610ec68484610cec565b6000806040838503121561103357600080fd5b823567ffffffffffffffff81111561104a57600080fd5b61105685828601610d47565b9250506020610f1685828601610b28565b60006020828403121561107957600080fd5b6000610ec68484610c9a565b61108e81611664565b82525050565b600061109f82611660565b8084526020840193506110b18361165a565b60005b828110156110e1576110c7868351611318565b6110d08261165a565b6060969096019591506001016110b4565b5093949350505050565b60006110f682611660565b8084526020840193508360208202850161110f8561165a565b60005b8481101561114657838303885261112a838351611355565b92506111358261165a565b602098909801979150600101611112565b50909695505050505050565b600061115d82611660565b80845260208401935061116f8361165a565b60005b828110156110e157611185868351611458565b61118e8261165a565b608096909601959150600101611172565b61108e8161167d565b61108e81611680565b60006111bc82611660565b8084526111d08160208601602086016116bc565b6111d9816116e8565b9093016020019392505050565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f41535345545f50524f5859000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b8051606083019061132984826114a2565b50602082015161133c602085018261119f565b50604082015161134f604085018261119f565b50505050565b805160009061018084019061136a8582611085565b50602083015161137d6020860182611085565b5060408301516113906040860182611085565b5060608301516113a36060860182611085565b5060808301516113b6608086018261119f565b5060a08301516113c960a086018261119f565b5060c08301516113dc60c086018261119f565b5060e08301516113ef60e086018261119f565b5061010083015161140461010086018261119f565b5061012083015161141961012086018261119f565b5061014083015184820361014086015261143382826111b1565b91505061016083015184820361016086015261144f82826111b1565b95945050505050565b80516080830190611469848261119f565b50602082015161147c602085018261119f565b50604082015161148f604085018261119f565b50606082015161134f606085018261119f565b61108e816116a5565b6020810161096a8284611085565b604081016114c78285611085565b610a8d6020830184611085565b604080825281016114e58185611094565b90508181036020830152610ec68184611152565b60208082528101610a8d81846110eb565b60208082528101610a8d8184611152565b6020810161096a82846111a8565b6020808252810161096a816111e6565b6020808252810161096a8161123c565b6020808252810161096a8161126c565b6020808252810161096a816112c2565b60e081016115778285611318565b610a8d6060830184611458565b60208082528101610a8d8184611355565b6080810161096a8284611458565b6020810161096a828461119f565b604081016115bf828561119f565b610a8d602083018461119f565b60405181810167ffffffffffffffff811182821017156115eb57600080fd5b604052919050565b600067ffffffffffffffff82111561160a57600080fd5b5060209081020190565b600067ffffffffffffffff82111561162b57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b151590565b82818337506000910152565b60005b838110156116d75781810151838201526020016116bf565b8381111561134f5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820f3ee475b41704465a0387b69ce2ff701a90a77977bf4a2b774f50140b3cfe3656c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0x17F2 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH2 0x2F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x67 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x60 DUP3 MLOAD PUSH2 0x8D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x85 DUP5 DUP5 PUSH2 0x54 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x174A DUP1 PUSH2 0xA8 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x4AD1E53 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x2CD0FC73 EQ PUSH2 0xB3 JUMPI DUP1 PUSH4 0x4B95DE13 EQ PUSH2 0xE1 JUMPI DUP1 PUSH4 0x690D3114 EQ PUSH2 0x10F JUMPI DUP1 PUSH4 0xB6988463 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0xF241FFB0 EQ PUSH2 0x169 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x1020 JUMP JUMPDEST PUSH2 0x196 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP3 SWAP2 SWAP1 PUSH2 0x1569 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0xCE CALLDATASIZE PUSH1 0x4 PUSH2 0xECE JUMP JUMPDEST PUSH2 0x263 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP3 SWAP2 SWAP1 PUSH2 0x15B1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x101 PUSH2 0xFC CALLDATASIZE PUSH1 0x4 PUSH2 0xF85 JUMP JUMPDEST PUSH2 0x794 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP3 SWAP2 SWAP1 PUSH2 0x14D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x11B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x12F PUSH2 0x12A CALLDATASIZE PUSH1 0x4 PUSH2 0xF85 JUMP JUMPDEST PUSH2 0x86B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP2 SWAP1 PUSH2 0x150A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x148 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH2 0x157 CALLDATASIZE PUSH1 0x4 PUSH2 0xF20 JUMP JUMPDEST PUSH2 0x925 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP2 SWAP1 PUSH2 0x14AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x189 PUSH2 0x184 CALLDATASIZE PUSH1 0x4 PUSH2 0x1020 JUMP JUMPDEST PUSH2 0x970 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP2 SWAP1 PUSH2 0x1595 JUMP JUMPDEST PUSH2 0x19E PUSH2 0xADF JUMP JUMPDEST PUSH2 0x1A6 PUSH2 0xAFF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x1FC SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1584 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x24E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1002 JUMP JUMPDEST SWAP2 POP PUSH2 0x25A DUP5 DUP5 PUSH2 0x970 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x27C DUP10 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x9B3 AND JUMP JUMPDEST SWAP6 POP PUSH2 0x28F DUP10 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xA20 AND JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP7 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH2 0x2E6 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x151B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x314 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x338 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xEA8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP5 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP8 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4ED JUMPI PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x3EB SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x14AB JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x419 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x43D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1067 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP9 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x494 SWAP1 DUP14 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x14B9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x4E6 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1067 JUMP JUMPDEST SWAP7 POP PUSH2 0x787 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP8 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x74C JUMPI PUSH2 0x55C DUP10 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0xA81 AND JUMP JUMPDEST SWAP3 POP PUSH2 0x568 DUP6 DUP5 PUSH2 0x925 JUMP JUMPDEST SWAP2 POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x5A4 JUMPI PUSH1 0x0 PUSH2 0x5A7 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND SWAP8 POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xE985E9C5 DUP12 DUP7 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x603 SWAP3 SWAP2 SWAP1 PUSH2 0x14B9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x61D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x631 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x655 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xFE4 JUMP JUMPDEST DUP1 PUSH2 0x731 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x81812FC DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6C7 SWAP2 SWAP1 PUSH2 0x15A3 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x719 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xEA8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST SWAP1 POP DUP1 PUSH2 0x73F JUMPI PUSH1 0x0 PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND SWAP7 POP PUSH2 0x787 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77E SWAP1 PUSH2 0x1539 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E9D74DC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E9D74DC SWAP1 PUSH2 0x7EF SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x14F9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x81D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x863 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF50 JUMP JUMPDEST SWAP2 POP PUSH2 0x25A DUP5 DUP5 JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP6 MLOAD SWAP3 POP DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x8B1 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x89E PUSH2 0xAFF JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x896 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP1 DUP4 EQ PUSH2 0x918 JUMPI PUSH2 0x8F8 DUP7 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8D1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8E9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x970 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x906 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x8B9 JUMP JUMPDEST DUP2 SWAP4 POP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0x6352211E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 DUP8 GAS STATICCALL DUP1 ISZERO PUSH2 0x967 JUMPI DUP2 MLOAD SWAP3 POP JUMPDEST POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x978 PUSH2 0xAFF JUMP JUMPDEST PUSH2 0x98B DUP4 PUSH1 0x0 ADD MLOAD DUP5 PUSH2 0x140 ADD MLOAD PUSH2 0x263 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE DUP2 MSTORE PUSH2 0x160 DUP4 ADD MLOAD PUSH2 0x9A3 SWAP1 DUP4 SWAP1 PUSH2 0x263 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x9F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77E SWAP1 PUSH2 0x1559 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xA62 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77E SWAP1 PUSH2 0x1549 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP4 DUP4 PUSH2 0xA94 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xAD6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77E SWAP1 PUSH2 0x1529 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 CALLDATALOAD PUSH2 0x1664 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 MLOAD PUSH2 0x1664 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xB51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xB64 PUSH2 0xB5F DUP3 PUSH2 0x15F3 JUMP JUMPDEST PUSH2 0x15CC JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xB89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBB5 JUMPI DUP2 PUSH2 0xB9F DUP9 DUP3 PUSH2 0xB28 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xB8C JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xBD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xBDE PUSH2 0xB5F DUP3 PUSH2 0x15F3 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x60 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xC03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBB5 JUMPI DUP2 PUSH2 0xC19 DUP9 DUP3 PUSH2 0xCEC JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xC06 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xC42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xC50 PUSH2 0xB5F DUP3 PUSH2 0x15F3 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBB5 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xC78 DUP9 DUP3 PUSH2 0xD47 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xC62 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 MLOAD PUSH2 0x16AB JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 MLOAD PUSH2 0x167D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xCB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xCC5 PUSH2 0xB5F DUP3 PUSH2 0x1614 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0xCE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x91C DUP4 DUP3 DUP5 PUSH2 0x16B0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD08 PUSH1 0x60 PUSH2 0x15CC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD16 DUP5 DUP5 PUSH2 0xE9C JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0xD27 DUP5 DUP5 DUP4 ADD PUSH2 0xC9A JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0xD3B DUP5 DUP3 DUP6 ADD PUSH2 0xC9A JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD65 PUSH2 0x180 PUSH2 0x15CC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD73 DUP5 DUP5 PUSH2 0xB28 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0xD84 DUP5 DUP5 DUP4 ADD PUSH2 0xB28 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0xD98 DUP5 DUP3 DUP6 ADD PUSH2 0xB28 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0xDAC DUP5 DUP3 DUP6 ADD PUSH2 0xB28 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0xDC0 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0xDD4 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0xDE8 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0xDFC DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0xE11 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0xE27 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE55 DUP5 DUP3 DUP6 ADD PUSH2 0xCA6 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE83 DUP5 DUP3 DUP6 ADD PUSH2 0xCA6 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 CALLDATALOAD PUSH2 0x167D JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 MLOAD PUSH2 0x16A5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xEBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC6 DUP5 DUP5 PUSH2 0xB34 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xEE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEED DUP6 DUP6 PUSH2 0xB28 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF16 DUP6 DUP3 DUP7 ADD PUSH2 0xCA6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xF33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xF3F DUP6 DUP6 PUSH2 0xB28 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xF16 DUP6 DUP3 DUP7 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEC6 DUP5 DUP3 DUP6 ADD PUSH2 0xBBF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xF98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xFBB DUP6 DUP3 DUP7 ADD PUSH2 0xC31 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF16 DUP6 DUP3 DUP7 ADD PUSH2 0xB40 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xFF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC6 DUP5 DUP5 PUSH2 0xC8E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1014 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC6 DUP5 DUP5 PUSH2 0xCEC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1033 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x104A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1056 DUP6 DUP3 DUP7 ADD PUSH2 0xD47 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xF16 DUP6 DUP3 DUP7 ADD PUSH2 0xB28 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1079 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC6 DUP5 DUP5 PUSH2 0xC9A JUMP JUMPDEST PUSH2 0x108E DUP2 PUSH2 0x1664 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x109F DUP3 PUSH2 0x1660 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x10B1 DUP4 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x10E1 JUMPI PUSH2 0x10C7 DUP7 DUP4 MLOAD PUSH2 0x1318 JUMP JUMPDEST PUSH2 0x10D0 DUP3 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x60 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x10B4 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10F6 DUP3 PUSH2 0x1660 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x110F DUP6 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1146 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x112A DUP4 DUP4 MLOAD PUSH2 0x1355 JUMP JUMPDEST SWAP3 POP PUSH2 0x1135 DUP3 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1112 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x115D DUP3 PUSH2 0x1660 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x116F DUP4 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x10E1 JUMPI PUSH2 0x1185 DUP7 DUP4 MLOAD PUSH2 0x1458 JUMP JUMPDEST PUSH2 0x118E DUP3 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x80 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1172 JUMP JUMPDEST PUSH2 0x108E DUP2 PUSH2 0x167D JUMP JUMPDEST PUSH2 0x108E DUP2 PUSH2 0x1680 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11BC DUP3 PUSH2 0x1660 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x11D0 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x16BC JUMP JUMPDEST PUSH2 0x11D9 DUP2 PUSH2 0x16E8 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F41535345545F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x1329 DUP5 DUP3 PUSH2 0x14A2 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x133C PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x134F PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x136A DUP6 DUP3 PUSH2 0x1085 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x137D PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x1085 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x1390 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x1085 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x13A3 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x1085 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13B6 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x13C9 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x13DC PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x13EF PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x1404 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x1419 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x1433 DUP3 DUP3 PUSH2 0x11B1 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x144F DUP3 DUP3 PUSH2 0x11B1 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x1469 DUP5 DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x147C PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x148F PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x134F PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST PUSH2 0x108E DUP2 PUSH2 0x16A5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x96A DUP3 DUP5 PUSH2 0x1085 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x14C7 DUP3 DUP6 PUSH2 0x1085 JUMP JUMPDEST PUSH2 0xA8D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1085 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x14E5 DUP2 DUP6 PUSH2 0x1094 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xEC6 DUP2 DUP5 PUSH2 0x1152 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA8D DUP2 DUP5 PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA8D DUP2 DUP5 PUSH2 0x1152 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x96A DUP3 DUP5 PUSH2 0x11A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x96A DUP2 PUSH2 0x11E6 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x96A DUP2 PUSH2 0x123C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x96A DUP2 PUSH2 0x126C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x96A DUP2 PUSH2 0x12C2 JUMP JUMPDEST PUSH1 0xE0 DUP2 ADD PUSH2 0x1577 DUP3 DUP6 PUSH2 0x1318 JUMP JUMPDEST PUSH2 0xA8D PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x1458 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA8D DUP2 DUP5 PUSH2 0x1355 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x96A DUP3 DUP5 PUSH2 0x1458 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x96A DUP3 DUP5 PUSH2 0x119F JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x15BF DUP3 DUP6 PUSH2 0x119F JUMP JUMPDEST PUSH2 0xA8D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x119F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x15EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x160A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x162B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16D7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x16BF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x134F JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 RETURN 0xee 0x47 JUMPDEST COINBASE PUSH17 0x4465A0387B69CE2FF701A90A77977BF4A2 0xb7 PUSH21 0xF50140B3CFE3656C6578706572696D656E74616CF5 STOP CALLDATACOPY ", + "sourceMap": "898:6876:0:-;;;1584:99;8:9:-1;5:2;;;30:1;27;20:12;5:2;1584:99:0;;;;;;;;;;;;;;;;;;;;;;1645:8;:31;;-1:-1:-1;;;;;;1645:31:0;-1:-1:-1;;;;;1645:31:0;;;;;;;;;;898:6876;;5:122:-1;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:263;;249:2;237:9;228:7;224:23;220:32;217:2;;;265:1;262;255:12;217:2;300:1;317:64;373:7;353:9;317:64;;;307:74;211:186;-1:-1;;;;211:186;404:128;-1:-1;;;;;473:54;;456:76;;898:6876:0;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "0x6080604052600436106100775763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166304ad1e53811461007c5780632cd0fc73146100b35780634b95de13146100e1578063690d31141461010f578063b69884631461013c578063f241ffb014610169575b600080fd5b34801561008857600080fd5b5061009c610097366004611020565b610196565b6040516100aa929190611569565b60405180910390f35b3480156100bf57600080fd5b506100d36100ce366004610ece565b610263565b6040516100aa9291906115b1565b3480156100ed57600080fd5b506101016100fc366004610f85565b610794565b6040516100aa9291906114d4565b34801561011b57600080fd5b5061012f61012a366004610f85565b61086b565b6040516100aa919061150a565b34801561014857600080fd5b5061015c610157366004610f20565b610925565b6040516100aa91906114ab565b34801561017557600080fd5b50610189610184366004611020565b610970565b6040516100aa9190611595565b61019e610adf565b6101a6610aff565b6000546040517fc75e0a8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063c75e0a81906101fc908790600401611584565b606060405180830381600087803b15801561021657600080fd5b505af115801561022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061024e9190810190611002565b915061025a8484610970565b90509250929050565b60008080808080808061027c898263ffffffff6109b316565b955061028f89601063ffffffff610a2016565b6000546040517f6070410800000000000000000000000000000000000000000000000000000000815291965073ffffffffffffffffffffffffffffffffffffffff16906360704108906102e690899060040161151b565b602060405180830381600087803b15801561030057600080fd5b505af1158015610314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103389190810190610ea8565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209094507fffffffff00000000000000000000000000000000000000000000000000000000878116911614156104ed576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906370a08231906103eb908d906004016114ab565b602060405180830381600087803b15801561040557600080fd5b505af1158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061043d9190810190611067565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815290985073ffffffffffffffffffffffffffffffffffffffff86169063dd62ed3e90610494908d9088906004016114b9565b602060405180830381600087803b1580156104ae57600080fd5b505af11580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104e69190810190611067565b9650610787565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190207fffffffff000000000000000000000000000000000000000000000000000000008781169116141561074c5761055c89602463ffffffff610a8116565b92506105688584610925565b91508173ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146105a45760006105a7565b60015b60ff1697508473ffffffffffffffffffffffffffffffffffffffff1663e985e9c58b866040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016106039291906114b9565b602060405180830381600087803b15801561061d57600080fd5b505af1158015610631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106559190810190610fe4565b8061073157508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1663081812fc856040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016106c791906115a3565b602060405180830381600087803b1580156106e157600080fd5b505af11580156106f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107199190810190610ea8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061073f576000610742565b60015b60ff169650610787565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90611539565b60405180910390fd5b5050505050509250929050565b6000546040517f7e9d74dc000000000000000000000000000000000000000000000000000000008152606091829173ffffffffffffffffffffffffffffffffffffffff90911690637e9d74dc906107ef9087906004016114f9565b600060405180830381600087803b15801561080957600080fd5b505af115801561081d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108639190810190610f50565b915061025a84845b606060006060600085519250826040519080825280602002602001820160405280156108b157816020015b61089e610aff565b8152602001906001900390816108965790505b509150600090505b808314610918576108f886828151811015156108d157fe5b9060200190602002015186838151811015156108e957fe5b90602001906020020151610970565b828281518110151561090657fe5b602090810290910101526001016108b9565b8193505b50505092915050565b60006040517f6352211e000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa801561096757815192505b50505b92915050565b610978610aff565b61098b8360000151846101400151610263565b602083015281526101608301516109a3908390610263565b6060830152604082015292915050565b6000816004018351101515156109f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90611559565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b600081601401835110151515610a62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90611549565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6000610a8d8383610a94565b9392505050565b600081602001835110151515610ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90611529565b50016020015190565b604080516060810182526000808252602082018190529181019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b6000610a8d8235611664565b6000610a8d8251611664565b6000601f82018313610b5157600080fd5b8135610b64610b5f826115f3565b6115cc565b91508181835260208401935060208101905083856020840282011115610b8957600080fd5b60005b83811015610bb55781610b9f8882610b28565b8452506020928301929190910190600101610b8c565b5050505092915050565b6000601f82018313610bd057600080fd5b8151610bde610b5f826115f3565b91508181835260208401935060208101905083856060840282011115610c0357600080fd5b60005b83811015610bb55781610c198882610cec565b84525060209092019160609190910190600101610c06565b6000601f82018313610c4257600080fd5b8135610c50610b5f826115f3565b81815260209384019390925082018360005b83811015610bb55781358601610c788882610d47565b8452506020928301929190910190600101610c62565b6000610a8d82516116ab565b6000610a8d825161167d565b6000601f82018313610cb757600080fd5b8135610cc5610b5f82611614565b91508082526020830160208301858383011115610ce157600080fd5b61091c8382846116b0565b600060608284031215610cfe57600080fd5b610d0860606115cc565b90506000610d168484610e9c565b8252506020610d2784848301610c9a565b6020830152506040610d3b84828501610c9a565b60408301525092915050565b60006101808284031215610d5a57600080fd5b610d656101806115cc565b90506000610d738484610b28565b8252506020610d8484848301610b28565b6020830152506040610d9884828501610b28565b6040830152506060610dac84828501610b28565b6060830152506080610dc084828501610e90565b60808301525060a0610dd484828501610e90565b60a08301525060c0610de884828501610e90565b60c08301525060e0610dfc84828501610e90565b60e083015250610100610e1184828501610e90565b61010083015250610120610e2784828501610e90565b6101208301525061014082013567ffffffffffffffff811115610e4957600080fd5b610e5584828501610ca6565b6101408301525061016082013567ffffffffffffffff811115610e7757600080fd5b610e8384828501610ca6565b6101608301525092915050565b6000610a8d823561167d565b6000610a8d82516116a5565b600060208284031215610eba57600080fd5b6000610ec68484610b34565b949350505050565b60008060408385031215610ee157600080fd5b6000610eed8585610b28565b925050602083013567ffffffffffffffff811115610f0a57600080fd5b610f1685828601610ca6565b9150509250929050565b60008060408385031215610f3357600080fd5b6000610f3f8585610b28565b9250506020610f1685828601610e90565b600060208284031215610f6257600080fd5b815167ffffffffffffffff811115610f7957600080fd5b610ec684828501610bbf565b60008060408385031215610f9857600080fd5b823567ffffffffffffffff811115610faf57600080fd5b610fbb85828601610c31565b925050602083013567ffffffffffffffff811115610fd857600080fd5b610f1685828601610b40565b600060208284031215610ff657600080fd5b6000610ec68484610c8e565b60006060828403121561101457600080fd5b6000610ec68484610cec565b6000806040838503121561103357600080fd5b823567ffffffffffffffff81111561104a57600080fd5b61105685828601610d47565b9250506020610f1685828601610b28565b60006020828403121561107957600080fd5b6000610ec68484610c9a565b61108e81611664565b82525050565b600061109f82611660565b8084526020840193506110b18361165a565b60005b828110156110e1576110c7868351611318565b6110d08261165a565b6060969096019591506001016110b4565b5093949350505050565b60006110f682611660565b8084526020840193508360208202850161110f8561165a565b60005b8481101561114657838303885261112a838351611355565b92506111358261165a565b602098909801979150600101611112565b50909695505050505050565b600061115d82611660565b80845260208401935061116f8361165a565b60005b828110156110e157611185868351611458565b61118e8261165a565b608096909601959150600101611172565b61108e8161167d565b61108e81611680565b60006111bc82611660565b8084526111d08160208601602086016116bc565b6111d9816116e8565b9093016020019392505050565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f41535345545f50524f5859000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b8051606083019061132984826114a2565b50602082015161133c602085018261119f565b50604082015161134f604085018261119f565b50505050565b805160009061018084019061136a8582611085565b50602083015161137d6020860182611085565b5060408301516113906040860182611085565b5060608301516113a36060860182611085565b5060808301516113b6608086018261119f565b5060a08301516113c960a086018261119f565b5060c08301516113dc60c086018261119f565b5060e08301516113ef60e086018261119f565b5061010083015161140461010086018261119f565b5061012083015161141961012086018261119f565b5061014083015184820361014086015261143382826111b1565b91505061016083015184820361016086015261144f82826111b1565b95945050505050565b80516080830190611469848261119f565b50602082015161147c602085018261119f565b50604082015161148f604085018261119f565b50606082015161134f606085018261119f565b61108e816116a5565b6020810161096a8284611085565b604081016114c78285611085565b610a8d6020830184611085565b604080825281016114e58185611094565b90508181036020830152610ec68184611152565b60208082528101610a8d81846110eb565b60208082528101610a8d8184611152565b6020810161096a82846111a8565b6020808252810161096a816111e6565b6020808252810161096a8161123c565b6020808252810161096a8161126c565b6020808252810161096a816112c2565b60e081016115778285611318565b610a8d6060830184611458565b60208082528101610a8d8184611355565b6080810161096a8284611458565b6020810161096a828461119f565b604081016115bf828561119f565b610a8d602083018461119f565b60405181810167ffffffffffffffff811182821017156115eb57600080fd5b604052919050565b600067ffffffffffffffff82111561160a57600080fd5b5060209081020190565b600067ffffffffffffffff82111561162b57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b151590565b82818337506000910152565b60005b838110156116d75781810151838201526020016116bf565b8381111561134f5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820f3ee475b41704465a0387b69ce2ff701a90a77977bf4a2b774f50140b3cfe3656c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x4AD1E53 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x2CD0FC73 EQ PUSH2 0xB3 JUMPI DUP1 PUSH4 0x4B95DE13 EQ PUSH2 0xE1 JUMPI DUP1 PUSH4 0x690D3114 EQ PUSH2 0x10F JUMPI DUP1 PUSH4 0xB6988463 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0xF241FFB0 EQ PUSH2 0x169 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x1020 JUMP JUMPDEST PUSH2 0x196 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP3 SWAP2 SWAP1 PUSH2 0x1569 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0xCE CALLDATASIZE PUSH1 0x4 PUSH2 0xECE JUMP JUMPDEST PUSH2 0x263 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP3 SWAP2 SWAP1 PUSH2 0x15B1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x101 PUSH2 0xFC CALLDATASIZE PUSH1 0x4 PUSH2 0xF85 JUMP JUMPDEST PUSH2 0x794 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP3 SWAP2 SWAP1 PUSH2 0x14D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x11B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x12F PUSH2 0x12A CALLDATASIZE PUSH1 0x4 PUSH2 0xF85 JUMP JUMPDEST PUSH2 0x86B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP2 SWAP1 PUSH2 0x150A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x148 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH2 0x157 CALLDATASIZE PUSH1 0x4 PUSH2 0xF20 JUMP JUMPDEST PUSH2 0x925 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP2 SWAP1 PUSH2 0x14AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x189 PUSH2 0x184 CALLDATASIZE PUSH1 0x4 PUSH2 0x1020 JUMP JUMPDEST PUSH2 0x970 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAA SWAP2 SWAP1 PUSH2 0x1595 JUMP JUMPDEST PUSH2 0x19E PUSH2 0xADF JUMP JUMPDEST PUSH2 0x1A6 PUSH2 0xAFF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x1FC SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1584 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x24E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1002 JUMP JUMPDEST SWAP2 POP PUSH2 0x25A DUP5 DUP5 PUSH2 0x970 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x27C DUP10 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x9B3 AND JUMP JUMPDEST SWAP6 POP PUSH2 0x28F DUP10 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xA20 AND JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP7 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH2 0x2E6 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x151B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x314 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x338 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xEA8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP5 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP8 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4ED JUMPI PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x3EB SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x14AB JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x419 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x43D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1067 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP9 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x494 SWAP1 DUP14 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x14B9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x4E6 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1067 JUMP JUMPDEST SWAP7 POP PUSH2 0x787 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP8 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x74C JUMPI PUSH2 0x55C DUP10 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0xA81 AND JUMP JUMPDEST SWAP3 POP PUSH2 0x568 DUP6 DUP5 PUSH2 0x925 JUMP JUMPDEST SWAP2 POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x5A4 JUMPI PUSH1 0x0 PUSH2 0x5A7 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND SWAP8 POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xE985E9C5 DUP12 DUP7 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x603 SWAP3 SWAP2 SWAP1 PUSH2 0x14B9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x61D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x631 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x655 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xFE4 JUMP JUMPDEST DUP1 PUSH2 0x731 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x81812FC DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6C7 SWAP2 SWAP1 PUSH2 0x15A3 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x719 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xEA8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST SWAP1 POP DUP1 PUSH2 0x73F JUMPI PUSH1 0x0 PUSH2 0x742 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND SWAP7 POP PUSH2 0x787 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77E SWAP1 PUSH2 0x1539 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E9D74DC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E9D74DC SWAP1 PUSH2 0x7EF SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x14F9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x81D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x863 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF50 JUMP JUMPDEST SWAP2 POP PUSH2 0x25A DUP5 DUP5 JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP6 MLOAD SWAP3 POP DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x8B1 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x89E PUSH2 0xAFF JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x896 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP1 DUP4 EQ PUSH2 0x918 JUMPI PUSH2 0x8F8 DUP7 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8D1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8E9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x970 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x906 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x8B9 JUMP JUMPDEST DUP2 SWAP4 POP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0x6352211E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 DUP8 GAS STATICCALL DUP1 ISZERO PUSH2 0x967 JUMPI DUP2 MLOAD SWAP3 POP JUMPDEST POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x978 PUSH2 0xAFF JUMP JUMPDEST PUSH2 0x98B DUP4 PUSH1 0x0 ADD MLOAD DUP5 PUSH2 0x140 ADD MLOAD PUSH2 0x263 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE DUP2 MSTORE PUSH2 0x160 DUP4 ADD MLOAD PUSH2 0x9A3 SWAP1 DUP4 SWAP1 PUSH2 0x263 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x9F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77E SWAP1 PUSH2 0x1559 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xA62 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77E SWAP1 PUSH2 0x1549 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP4 DUP4 PUSH2 0xA94 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xAD6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77E SWAP1 PUSH2 0x1529 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 CALLDATALOAD PUSH2 0x1664 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 MLOAD PUSH2 0x1664 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xB51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xB64 PUSH2 0xB5F DUP3 PUSH2 0x15F3 JUMP JUMPDEST PUSH2 0x15CC JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xB89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBB5 JUMPI DUP2 PUSH2 0xB9F DUP9 DUP3 PUSH2 0xB28 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xB8C JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xBD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xBDE PUSH2 0xB5F DUP3 PUSH2 0x15F3 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x60 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xC03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBB5 JUMPI DUP2 PUSH2 0xC19 DUP9 DUP3 PUSH2 0xCEC JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xC06 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xC42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xC50 PUSH2 0xB5F DUP3 PUSH2 0x15F3 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBB5 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xC78 DUP9 DUP3 PUSH2 0xD47 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xC62 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 MLOAD PUSH2 0x16AB JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 MLOAD PUSH2 0x167D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xCB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xCC5 PUSH2 0xB5F DUP3 PUSH2 0x1614 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0xCE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x91C DUP4 DUP3 DUP5 PUSH2 0x16B0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD08 PUSH1 0x60 PUSH2 0x15CC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD16 DUP5 DUP5 PUSH2 0xE9C JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0xD27 DUP5 DUP5 DUP4 ADD PUSH2 0xC9A JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0xD3B DUP5 DUP3 DUP6 ADD PUSH2 0xC9A JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD65 PUSH2 0x180 PUSH2 0x15CC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD73 DUP5 DUP5 PUSH2 0xB28 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0xD84 DUP5 DUP5 DUP4 ADD PUSH2 0xB28 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0xD98 DUP5 DUP3 DUP6 ADD PUSH2 0xB28 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0xDAC DUP5 DUP3 DUP6 ADD PUSH2 0xB28 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0xDC0 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0xDD4 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0xDE8 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0xDFC DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0xE11 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0xE27 DUP5 DUP3 DUP6 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE55 DUP5 DUP3 DUP6 ADD PUSH2 0xCA6 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE83 DUP5 DUP3 DUP6 ADD PUSH2 0xCA6 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 CALLDATALOAD PUSH2 0x167D JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA8D DUP3 MLOAD PUSH2 0x16A5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xEBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC6 DUP5 DUP5 PUSH2 0xB34 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xEE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEED DUP6 DUP6 PUSH2 0xB28 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF16 DUP6 DUP3 DUP7 ADD PUSH2 0xCA6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xF33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xF3F DUP6 DUP6 PUSH2 0xB28 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xF16 DUP6 DUP3 DUP7 ADD PUSH2 0xE90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEC6 DUP5 DUP3 DUP6 ADD PUSH2 0xBBF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xF98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xFBB DUP6 DUP3 DUP7 ADD PUSH2 0xC31 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF16 DUP6 DUP3 DUP7 ADD PUSH2 0xB40 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xFF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC6 DUP5 DUP5 PUSH2 0xC8E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1014 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC6 DUP5 DUP5 PUSH2 0xCEC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1033 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x104A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1056 DUP6 DUP3 DUP7 ADD PUSH2 0xD47 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xF16 DUP6 DUP3 DUP7 ADD PUSH2 0xB28 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1079 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC6 DUP5 DUP5 PUSH2 0xC9A JUMP JUMPDEST PUSH2 0x108E DUP2 PUSH2 0x1664 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x109F DUP3 PUSH2 0x1660 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x10B1 DUP4 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x10E1 JUMPI PUSH2 0x10C7 DUP7 DUP4 MLOAD PUSH2 0x1318 JUMP JUMPDEST PUSH2 0x10D0 DUP3 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x60 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x10B4 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10F6 DUP3 PUSH2 0x1660 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x110F DUP6 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1146 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x112A DUP4 DUP4 MLOAD PUSH2 0x1355 JUMP JUMPDEST SWAP3 POP PUSH2 0x1135 DUP3 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1112 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x115D DUP3 PUSH2 0x1660 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x116F DUP4 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x10E1 JUMPI PUSH2 0x1185 DUP7 DUP4 MLOAD PUSH2 0x1458 JUMP JUMPDEST PUSH2 0x118E DUP3 PUSH2 0x165A JUMP JUMPDEST PUSH1 0x80 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1172 JUMP JUMPDEST PUSH2 0x108E DUP2 PUSH2 0x167D JUMP JUMPDEST PUSH2 0x108E DUP2 PUSH2 0x1680 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11BC DUP3 PUSH2 0x1660 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x11D0 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x16BC JUMP JUMPDEST PUSH2 0x11D9 DUP2 PUSH2 0x16E8 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F41535345545F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x1329 DUP5 DUP3 PUSH2 0x14A2 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x133C PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x134F PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x136A DUP6 DUP3 PUSH2 0x1085 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x137D PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x1085 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x1390 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x1085 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x13A3 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x1085 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13B6 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x13C9 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x13DC PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x13EF PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x1404 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x1419 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x1433 DUP3 DUP3 PUSH2 0x11B1 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x144F DUP3 DUP3 PUSH2 0x11B1 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x1469 DUP5 DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x147C PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x148F PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x134F PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x119F JUMP JUMPDEST PUSH2 0x108E DUP2 PUSH2 0x16A5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x96A DUP3 DUP5 PUSH2 0x1085 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x14C7 DUP3 DUP6 PUSH2 0x1085 JUMP JUMPDEST PUSH2 0xA8D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1085 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x14E5 DUP2 DUP6 PUSH2 0x1094 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xEC6 DUP2 DUP5 PUSH2 0x1152 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA8D DUP2 DUP5 PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA8D DUP2 DUP5 PUSH2 0x1152 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x96A DUP3 DUP5 PUSH2 0x11A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x96A DUP2 PUSH2 0x11E6 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x96A DUP2 PUSH2 0x123C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x96A DUP2 PUSH2 0x126C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x96A DUP2 PUSH2 0x12C2 JUMP JUMPDEST PUSH1 0xE0 DUP2 ADD PUSH2 0x1577 DUP3 DUP6 PUSH2 0x1318 JUMP JUMPDEST PUSH2 0xA8D PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x1458 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA8D DUP2 DUP5 PUSH2 0x1355 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x96A DUP3 DUP5 PUSH2 0x1458 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x96A DUP3 DUP5 PUSH2 0x119F JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x15BF DUP3 DUP6 PUSH2 0x119F JUMP JUMPDEST PUSH2 0xA8D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x119F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x15EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x160A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x162B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16D7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x16BF JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x134F JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 RETURN 0xee 0x47 JUMPDEST COINBASE PUSH17 0x4465A0387B69CE2FF701A90A77977BF4A2 0xb7 PUSH21 0xF50140B3CFE3656C6578706572696D656E74616CF5 STOP CALLDATACOPY ", + "sourceMap": "898:6876:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1936:352;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1936:352:0;;;;;;;;;;;;;;;;;;;;;;;;;;4914:1359;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4914:1359:0;;;;;;;;;;;;;;;;;;2618:384;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2618:384:0;;;;;;;;;;;;;;;;;;4016:452;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4016:452:0;;;;;;;;;;;;;;;;;6558:1214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6558:1214:0;;;;;;;;;;;;;;;;;3261:439;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3261:439:0;;;;;;;;;;;;;;;;;1936:352;2063:35;;:::i;:::-;2100:28;;:::i;:::-;2156:8;;:28;;;;;:8;;;;;:21;;:28;;2178:5;;2156:28;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2156:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2156:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2156:28:0;;;;;;;;;2144:40;;2207:34;2221:5;2228:12;2207:13;:34::i;:::-;2194:47;-1:-1:-1;1936:352:0;;;;;:::o;4914:1359::-;5031:15;;;;;;;;5103:23;:9;5031:15;5103:23;:20;:23;:::i;:::-;5081:45;-1:-1:-1;5152:25:0;:9;5174:2;5152:25;:21;:25;:::i;:::-;5208:8;;:36;;;;;5136:41;;-1:-1:-1;5208:8:0;;;:22;;:36;;5231:12;;5208:36;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5208:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5208:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5208:36:0;;;;;;;;;977:32;;;;;;;;;;;;;;;;5187:57;;-1:-1:-1;5259:29:0;;;;;;;5255:975;;;5343:36;;;;;:28;;;;;;:36;;5372:6;;5343:36;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5343:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5343:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5343:36:0;;;;;;;;;5437:48;;;;;5333:46;;-1:-1:-1;5437:28:0;;;;;;:48;;5466:6;;5474:10;;5437:48;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5437:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5437:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5437:48:0;;;;;;;;;5425:60;;5255:975;;;1065:41;;;;;;;;;;;;;;;;5506:30;;;;;;;5502:728;;;5570:25;:9;5592:2;5570:25;:21;:25;:::i;:::-;5552:43;;5664:35;5684:5;5691:7;5664:19;:35::i;:::-;5648:51;;5796:5;5786:15;;:6;:15;;;:23;;5808:1;5786:23;;;5804:1;5786:23;5776:33;;;;5920:5;5907:36;;;5944:6;5952:10;5907:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5907:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5907:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5907:56:0;;;;;;;;;:114;;;;6011:10;5967:54;;5980:5;5967:31;;;5999:7;5967:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5967:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5967:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5967:40:0;;;;;;;;;:54;;;5907:114;5889:132;;6137:10;:18;;6154:1;6137:18;;;6150:1;6137:18;6125:30;;;;5502:728;;;6186:33;;;;;;;;;;;;;;;;;;;5502:728;4914:1359;;;;;;;;;;;:::o;2618:384::-;2861:8;;:30;;;;;2761:38;;;;2861:8;;;;;:22;;:30;;2884:6;;2861:30;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2861:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2861:30:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;2861:30:0;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;2861:30:0;;;;;;;;;2848:43;;2915:38;2930:6;2938:14;4016:452;4150:12;4185:20;4231:31;4310:9;4208:6;:13;4185:36;;4282:12;4265:30;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;4231:64;;4322:1;4310:13;;4305:129;4325:17;;;4305:129;;4380:43;4394:6;4401:1;4394:9;;;;;;;;;;;;;;;;;;4405:14;4420:1;4405:17;;;;;;;;;;;;;;;;;;4380:13;:43::i;:::-;4363:11;4375:1;4363:14;;;;;;;;;;;;;;;;;;:60;4344:3;;4305:129;;;4450:11;4443:18;;4016:452;;;;;;;;:::o;6558:1214::-;6664:13;6777:2;6771:9;6874:66;6865:7;6858:83;6978:7;6974:1;6965:7;6961:15;6954:32;7400:2;7347:7;7290:2;7243:7;7194:5;7149:3;7121:332;7580:7;7577:2;;;7621:7;7615:14;7606:23;;7577:2;-1:-1:-1;;6558:1214:0;;;;;:::o;3261:439::-;3380:28;;:::i;:::-;3479:64;3502:5;:18;;;3522:5;:20;;;3479:22;:64::i;:::-;3450:25;;;3424:119;;;3645:20;;;;3608:58;;3631:12;;3608:22;:58::i;:::-;3579:25;;;3553:113;3554:23;;;3553:113;3261:439;;;;:::o;15559:559:13:-;15679:13;15741:5;15749:1;15741:9;15729:1;:8;:21;;15708:105;;;;;;;;;;;;;;;;-1:-1:-1;;15869:2:13;15862:10;15856:17;16012:66;16000:79;;15559:559::o;10259:886::-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:13;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;14699:195::-;14820:14;14865:21;14877:1;14880:5;14865:11;:21::i;:::-;14857:30;14699:195;-1:-1:-1;;;14699:195:13:o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:13;13620:2;13718:13;13712:20;;13281:490::o;898:6876:0:-;;;;;;;;;-1:-1:-1;898:6876:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:122;;208:39;239:6;233:13;208:39;;277:707;;387:4;375:17;;371:27;-1:-1;361:2;;412:1;409;402:12;361:2;449:6;436:20;471:80;486:64;543:6;486:64;;;471:80;;;462:89;;568:5;593:6;586:5;579:21;623:4;615:6;611:17;601:27;;645:4;640:3;636:14;629:21;;698:6;745:3;737:4;729:6;725:17;720:3;716:27;713:36;710:2;;;762:1;759;752:12;710:2;787:1;772:206;797:6;794:1;791:13;772:206;;;855:3;877:37;910:3;898:10;877:37;;;865:50;;-1:-1;938:4;929:14;;;;957;;;;;819:1;812:9;772:206;;;776:14;354:630;;;;;;;;1028:788;;1171:4;1159:17;;1155:27;-1:-1;1145:2;;1196:1;1193;1186:12;1145:2;1226:6;1220:13;1248:102;1263:86;1342:6;1263:86;;1248:102;1239:111;;1367:5;1392:6;1385:5;1378:21;1422:4;1414:6;1410:17;1400:27;;1444:4;1439:3;1435:14;1428:21;;1497:6;1544:3;1536:4;1528:6;1524:17;1519:3;1515:27;1512:36;1509:2;;;1561:1;1558;1551:12;1509:2;1586:1;1571:239;1596:6;1593:1;1590:13;1571:239;;;1654:3;1676:70;1742:3;1730:10;1676:70;;;1664:83;;-1:-1;1770:4;1761:14;;;;1798:4;1789:14;;;;;1618:1;1611:9;1571:239;;1856:732;;1984:4;1972:17;;1968:27;-1:-1;1958:2;;2009:1;2006;1999:12;1958:2;2046:6;2033:20;2068:98;2083:82;2158:6;2083:82;;2068:98;2194:21;;;2238:4;2226:17;;;;2059:107;;-1:-1;2251:14;;2226:17;2346:1;2331:251;2356:6;2353:1;2350:13;2331:251;;;2439:3;2426:17;2418:6;2414:30;2463:55;2514:3;2502:10;2463:55;;;2451:68;;-1:-1;2542:4;2533:14;;;;2561;;;;;2378:1;2371:9;2331:251;;2596:116;;2671:36;2699:6;2693:13;2671:36;;2719:122;;2797:39;2828:6;2822:13;2797:39;;2849:432;;2939:4;2927:17;;2923:27;-1:-1;2913:2;;2964:1;2961;2954:12;2913:2;3001:6;2988:20;3023:60;3038:44;3075:6;3038:44;;3023:60;3014:69;;3103:6;3096:5;3089:21;3139:4;3131:6;3127:17;3172:4;3165:5;3161:16;3207:3;3198:6;3193:3;3189:16;3186:25;3183:2;;;3224:1;3221;3214:12;3183:2;3234:41;3268:6;3263:3;3258;3234:41;;3770:684;;3892:4;3880:9;3875:3;3871:19;3867:30;3864:2;;;3910:1;3907;3900:12;3864:2;3928:20;3943:4;3928:20;;;3919:29;-1:-1;4005:1;4036:58;4090:3;4070:9;4036:58;;;4012:83;;-1:-1;4161:2;4194:60;4250:3;4226:22;;;4194:60;;;4187:4;4180:5;4176:16;4169:86;4116:150;4339:2;4372:60;4428:3;4419:6;4408:9;4404:22;4372:60;;;4365:4;4358:5;4354:16;4347:86;4276:168;3858:596;;;;;5216:2204;;5323:5;5311:9;5306:3;5302:19;5298:31;5295:2;;;5342:1;5339;5332:12;5295:2;5360:21;5375:5;5360:21;;;5351:30;-1:-1;5439:1;5470:49;5515:3;5495:9;5470:49;;;5446:74;;-1:-1;5589:2;5622:49;5667:3;5643:22;;;5622:49;;;5615:4;5608:5;5604:16;5597:75;5541:142;5748:2;5781:49;5826:3;5817:6;5806:9;5802:22;5781:49;;;5774:4;5767:5;5763:16;5756:75;5693:149;5901:2;5934:49;5979:3;5970:6;5959:9;5955:22;5934:49;;;5927:4;5920:5;5916:16;5909:75;5852:143;6057:3;6091:49;6136:3;6127:6;6116:9;6112:22;6091:49;;;6084:4;6077:5;6073:16;6066:75;6005:147;6214:3;6248:49;6293:3;6284:6;6273:9;6269:22;6248:49;;;6241:4;6234:5;6230:16;6223:75;6162:147;6363:3;6397:49;6442:3;6433:6;6422:9;6418:22;6397:49;;;6390:4;6383:5;6379:16;6372:75;6319:139;6512:3;6546:49;6591:3;6582:6;6571:9;6567:22;6546:49;;;6539:4;6532:5;6528:16;6521:75;6468:139;6674:3;6709:49;6754:3;6745:6;6734:9;6730:22;6709:49;;;6701:5;6694;6690:17;6683:76;6617:153;6820:3;6855:49;6900:3;6891:6;6880:9;6876:22;6855:49;;;6847:5;6840;6836:17;6829:76;6780:136;7004:3;6993:9;6989:19;6976:33;7029:18;7021:6;7018:30;7015:2;;;7061:1;7058;7051:12;7015:2;7097:54;7147:3;7138:6;7127:9;7123:22;7097:54;;;7089:5;7082;7078:17;7071:81;6926:237;7251:3;7240:9;7236:19;7223:33;7276:18;7268:6;7265:30;7262:2;;;7308:1;7305;7298:12;7262:2;7344:54;7394:3;7385:6;7374:9;7370:22;7344:54;;;7336:5;7329;7325:17;7318:81;7173:237;5289:2131;;;;;9670:118;;9737:46;9775:6;9762:20;9737:46;;9924:118;;10000:37;10029:6;10023:13;10000:37;;10049:263;;10164:2;10152:9;10143:7;10139:23;10135:32;10132:2;;;10180:1;10177;10170:12;10132:2;10215:1;10232:64;10288:7;10268:9;10232:64;;;10222:74;10126:186;-1:-1;;;;10126:186;10319:470;;;10449:2;10437:9;10428:7;10424:23;10420:32;10417:2;;;10465:1;10462;10455:12;10417:2;10500:1;10517:53;10562:7;10542:9;10517:53;;;10507:63;;10479:97;10635:2;10624:9;10620:18;10607:32;10659:18;10651:6;10648:30;10645:2;;;10691:1;10688;10681:12;10645:2;10711:62;10765:7;10756:6;10745:9;10741:22;10711:62;;;10701:72;;10586:193;10411:378;;;;;;10796:366;;;10917:2;10905:9;10896:7;10892:23;10888:32;10885:2;;;10933:1;10930;10923:12;10885:2;10968:1;10985:53;11030:7;11010:9;10985:53;;;10975:63;;10947:97;11075:2;11093:53;11138:7;11129:6;11118:9;11114:22;11093:53;;11169:436;;11331:2;11319:9;11310:7;11306:23;11302:32;11299:2;;;11347:1;11344;11337:12;11299:2;11382:24;;11426:18;11415:30;;11412:2;;;11458:1;11455;11448:12;11412:2;11478:111;11581:7;11572:6;11561:9;11557:22;11478:111;;11612:674;;;11801:2;11789:9;11780:7;11776:23;11772:32;11769:2;;;11817:1;11814;11807:12;11769:2;11852:31;;11903:18;11892:30;;11889:2;;;11935:1;11932;11925:12;11889:2;11955:96;12043:7;12034:6;12023:9;12019:22;11955:96;;;11945:106;;11831:226;12116:2;12105:9;12101:18;12088:32;12140:18;12132:6;12129:30;12126:2;;;12172:1;12169;12162:12;12126:2;12192:78;12262:7;12253:6;12242:9;12238:22;12192:78;;12293:257;;12405:2;12393:9;12384:7;12380:23;12376:32;12373:2;;;12421:1;12418;12411:12;12373:2;12456:1;12473:61;12526:7;12506:9;12473:61;;12557:315;;12698:2;12686:9;12677:7;12673:23;12669:32;12666:2;;;12714:1;12711;12704:12;12666:2;12749:1;12766:90;12848:7;12828:9;12766:90;;12879:496;;;13022:2;13010:9;13001:7;12997:23;12993:32;12990:2;;;13038:1;13035;13028:12;12990:2;13073:31;;13124:18;13113:30;;13110:2;;;13156:1;13153;13146:12;13110:2;13176:75;13243:7;13234:6;13223:9;13219:22;13176:75;;;13166:85;;13052:205;13288:2;13306:53;13351:7;13342:6;13331:9;13327:22;13306:53;;13382:263;;13497:2;13485:9;13476:7;13472:23;13468:32;13465:2;;;13513:1;13510;13503:12;13465:2;13548:1;13565:64;13621:7;13601:9;13565:64;;13652:110;13725:31;13750:5;13725:31;;;13720:3;13713:44;13707:55;;;13836:748;;14015:76;14085:5;14015:76;;;14109:6;14104:3;14097:19;14133:4;14128:3;14124:14;14117:21;;14178:78;14250:5;14178:78;;;14277:1;14262:300;14287:6;14284:1;14281:13;14262:300;;;14327:101;14424:3;14415:6;14409:13;14327:101;;;14445:82;14520:6;14445:82;;;14550:4;14541:14;;;;;14435:92;-1:-1;14309:1;14302:9;14262:300;;;-1:-1;14575:3;;13994:590;-1:-1;;;;13994:590;14651:857;;14822:72;14888:5;14822:72;;;14912:6;14907:3;14900:19;14936:4;14931:3;14927:14;14920:21;;14984:3;15026:4;15018:6;15014:17;15009:3;15005:27;15052:74;15120:5;15052:74;;;15147:1;15132:337;15157:6;15154:1;15151:13;15132:337;;;15219:9;15213:4;15209:20;15204:3;15197:33;15245:94;15334:4;15325:6;15319:13;15245:94;;;15237:102;;15356:78;15427:6;15356:78;;;15457:4;15448:14;;;;;15346:88;-1:-1;15179:1;15172:9;15132:337;;;-1:-1;15482:4;;14801:707;-1:-1;;;;;;14801:707;15597:748;;15776:76;15846:5;15776:76;;;15870:6;15865:3;15858:19;15894:4;15889:3;15885:14;15878:21;;15939:78;16011:5;15939:78;;;16038:1;16023:300;16048:6;16045:1;16042:13;16023:300;;;16088:101;16185:3;16176:6;16170:13;16088:101;;;16206:82;16281:6;16206:82;;;16311:4;16302:14;;;;;16196:92;-1:-1;16070:1;16063:9;16023:300;;16353:110;16426:31;16451:5;16426:31;;16470:107;16541:30;16565:5;16541:30;;16584:289;;16680:34;16708:5;16680:34;;;16731:6;16726:3;16719:19;16743:63;16799:6;16792:4;16787:3;16783:14;16776:4;16769:5;16765:16;16743:63;;;16838:29;16860:6;16838:29;;;16818:50;;;16831:4;16818:50;;16660:213;-1:-1;;;16660:213;16881:397;17036:2;17024:15;;17073:66;17068:2;17059:12;;17052:88;17174:66;17169:2;17160:12;;17153:88;17269:2;17260:12;;17017:261;17287:296;17442:2;17430:15;;17479:66;17474:2;17465:12;;17458:88;17574:2;17565:12;;17423:160;17592:397;17747:2;17735:15;;17784:66;17779:2;17770:12;;17763:88;17885:66;17880:2;17871:12;;17864:88;17980:2;17971:12;;17728:261;17998:397;18153:2;18141:15;;18190:66;18185:2;18176:12;;18169:88;18291:66;18286:2;18277:12;;18270:88;18386:2;18377:12;;18134:261;18464:693;18675:22;;18599:4;18590:14;;;18709:57;18594:3;18675:22;18709:57;;;18619:159;18859:4;18852:5;18848:16;18842:23;18877:62;18933:4;18928:3;18924:14;18911:11;18877:62;;;18788:163;19050:4;19043:5;19039:16;19033:23;19068:62;19124:4;19119:3;19115:14;19102:11;19068:62;;;18961:181;18572:585;;;;19974:2417;20187:22;;19974:2417;;20109:5;20100:15;;;20221:61;20104:3;20187:22;20221:61;;;20130:164;20378:4;20371:5;20367:16;20361:23;20396:62;20452:4;20447:3;20443:14;20430:11;20396:62;;;20304:166;20561:4;20554:5;20550:16;20544:23;20579:62;20635:4;20630:3;20626:14;20613:11;20579:62;;;20480:173;20738:4;20731:5;20727:16;20721:23;20756:62;20812:4;20807:3;20803:14;20790:11;20756:62;;;20663:167;20918:4;20911:5;20907:16;20901:23;20936:62;20992:4;20987:3;20983:14;20970:11;20936:62;;;20840:170;21098:4;21091:5;21087:16;21081:23;21116:62;21172:4;21167:3;21163:14;21150:11;21116:62;;;21020:170;21270:4;21263:5;21259:16;21253:23;21288:62;21344:4;21339:3;21335:14;21322:11;21288:62;;;21200:162;21442:4;21435:5;21431:16;21425:23;21460:62;21516:4;21511:3;21507:14;21494:11;21460:62;;;21372:162;21627:5;21620;21616:17;21610:24;21646:63;21702:5;21697:3;21693:15;21680:11;21646:63;;;21544:177;21797:5;21790;21786:17;21780:24;21816:63;21872:5;21867:3;21863:15;21850:11;21816:63;;;21731:160;21977:5;21970;21966:17;21960:24;22030:3;22024:4;22020:14;22012:5;22007:3;22003:15;21996:39;22050:66;22111:4;22098:11;22050:66;;;22042:74;;21901:227;22214:5;22207;22203:17;22197:24;22267:3;22261:4;22257:14;22249:5;22244:3;22240:15;22233:39;22287:66;22348:4;22335:11;22287:66;;;22279:74;20082:2309;-1:-1;;;;;20082:2309;24946:866;25158:22;;25081:4;25072:14;;;25192:61;25076:3;25158:22;25192:61;;;25101:164;25351:4;25344:5;25340:16;25334:23;25369:62;25425:4;25420:3;25416:14;25403:11;25369:62;;;25275:168;25527:4;25520:5;25516:16;25510:23;25545:62;25601:4;25596:3;25592:14;25579:11;25545:62;;;25453:166;25705:4;25698:5;25694:16;25688:23;25723:62;25779:4;25774:3;25770:14;25757:11;25723:62;;26880:104;26949:29;26972:5;26949:29;;26991:193;27099:2;27084:18;;27113:61;27088:9;27147:6;27113:61;;27191:294;27327:2;27312:18;;27341:61;27316:9;27375:6;27341:61;;;27413:62;27471:2;27460:9;27456:18;27447:6;27413:62;;27492:766;27816:2;27830:47;;;27801:18;;27891:142;27801:18;28019:6;27891:142;;;27883:150;;28081:9;28075:4;28071:20;28066:2;28055:9;28051:18;28044:48;28106:142;28243:4;28234:6;28106:142;;28265:413;28459:2;28473:47;;;28444:18;;28534:134;28444:18;28654:6;28534:134;;28685:429;28887:2;28901:47;;;28872:18;;28962:142;28872:18;29090:6;28962:142;;29121:189;29227:2;29212:18;;29241:59;29216:9;29273:6;29241:59;;29317:387;29498:2;29512:47;;;29483:18;;29573:121;29483:18;29573:121;;29711:387;29892:2;29906:47;;;29877:18;;29967:121;29877:18;29967:121;;30105:387;30286:2;30300:47;;;30271:18;;30361:121;30271:18;30361:121;;30499:387;30680:2;30694:47;;;30665:18;;30755:121;30665:18;30755:121;;30893:503;31133:3;31118:19;;31148:113;31122:9;31234:6;31148:113;;;31272:114;31382:2;31371:9;31367:18;31358:6;31272:114;;31403:329;31555:2;31569:47;;;31540:18;;31630:92;31540:18;31708:6;31630:92;;31739:298;31899:3;31884:19;;31914:113;31888:9;32000:6;31914:113;;32044:193;32152:2;32137:18;;32166:61;32141:9;32200:6;32166:61;;32244:294;32380:2;32365:18;;32394:61;32369:9;32428:6;32394:61;;;32466:62;32524:2;32513:9;32509:18;32500:6;32466:62;;32545:256;32607:2;32601:9;32633:17;;;32708:18;32693:34;;32729:22;;;32690:62;32687:2;;;32765:1;32762;32755:12;32687:2;32781;32774:22;32585:216;;-1:-1;32585:216;32808:258;;32967:18;32959:6;32956:30;32953:2;;;32999:1;32996;32989:12;32953:2;-1:-1;33028:4;33016:17;;;33046:15;;32890:176;33643:254;;33782:18;33774:6;33771:30;33768:2;;;33814:1;33811;33804:12;33768:2;-1:-1;33887:4;33858;33835:17;;;;33854:9;33831:33;33877:15;;33705:192;34171:143;34302:4;34290:17;;34271:43;34627:129;34739:12;;34723:33;35580:128;35660:42;35649:54;;35632:76;35715:79;35784:5;35767:27;35801:151;35880:66;35869:78;;35852:100;36045:88;36123:4;36112:16;;36095:38;36275:92;36348:13;36341:21;;36324:43;36642:145;36723:6;36718:3;36713;36700:30;-1:-1;36779:1;36761:16;;36754:27;36693:94;36796:268;36861:1;36868:101;36882:6;36879:1;36876:13;36868:101;;;36949:11;;;36943:18;36930:11;;;36923:39;36904:2;36897:10;36868:101;;;36984:6;36981:1;36978:13;36975:2;;;-1:-1;;37049:1;37031:16;;37024:27;36845:219;37072:97;37160:2;37140:14;37156:7;37136:28;;37120:49" + } + } + }, + "sources": { + "2.0.0/extensions/OrderValidator/OrderValidator.sol": { + "id": 0 + }, + "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": { + "id": 1 + }, + "2.0.0/protocol/Exchange/interfaces/IExchange.sol": { + "id": 2 + }, + "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": { + "id": 3 + }, + "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": { + "id": 4 + }, + "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": { + "id": 5 + }, + "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": { + "id": 6 + }, + "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": { + "id": 7 + }, + "2.0.0/protocol/Exchange/libs/LibEIP712.sol": { + "id": 8 + }, + "2.0.0/protocol/Exchange/libs/LibFillResults.sol": { + "id": 9 + }, + "2.0.0/protocol/Exchange/libs/LibOrder.sol": { + "id": 10 + }, + "2.0.0/tokens/ERC20Token/IERC20Token.sol": { + "id": 11 + }, + "2.0.0/tokens/ERC721Token/IERC721Token.sol": { + "id": 12 + }, + "2.0.0/utils/LibBytes/LibBytes.sol": { + "id": 13 + }, + "2.0.0/utils/SafeMath/SafeMath.sol": { + "id": 14 + } + }, + "sourceCodes": { + "2.0.0/extensions/OrderValidator/OrderValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/interfaces/IExchange.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\nimport \"../../tokens/ERC721Token/IERC721Token.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\n\n\ncontract OrderValidator {\n\n bytes4 constant internal ERC20_DATA_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n bytes4 constant internal ERC721_DATA_ID = bytes4(keccak256(\"ERC721Token(address,uint256)\"));\n\n using LibBytes for bytes;\n\n struct TraderInfo {\n uint256 makerBalance; // Maker's balance of makerAsset\n uint256 makerAllowance; // Maker's allowance to corresponding AssetProxy\n uint256 takerBalance; // Taker's balance of takerAsset\n uint256 takerAllowance; // Taker's allowance to corresponding AssetProxy\n }\n\n // Exchange contract.\n // solhint-disable-next-line var-name-mixedcase\n IExchange internal EXCHANGE;\n\n constructor (address _exchange)\n public\n {\n EXCHANGE = IExchange(_exchange);\n }\n\n /// @dev Fetches information for order and maker/taker of order.\n /// @param order The order structure.\n /// @param takerAddress Address that will be filling the order.\n /// @return OrderInfo and TraderInfo instances for given order.\n function getOrderAndTraderInfo(LibOrder.Order memory order, address takerAddress)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo, TraderInfo memory traderInfo)\n {\n orderInfo = EXCHANGE.getOrderInfo(order);\n traderInfo = getTraderInfo(order, takerAddress);\n return (orderInfo, traderInfo);\n }\n\n /// @dev Fetches information for all passed in orders and the makers/takers of each order.\n /// @param orders Array of order specifications.\n /// @param takerAddresses Array of taker addresses corresponding to each order.\n /// @return Arrays of OrderInfo and TraderInfo instances that correspond to each order.\n function getOrdersAndTradersInfo(LibOrder.Order[] memory orders, address[] memory takerAddresses)\n public\n view\n returns (LibOrder.OrderInfo[] memory ordersInfo, TraderInfo[] memory tradersInfo)\n {\n ordersInfo = EXCHANGE.getOrdersInfo(orders);\n tradersInfo = getTradersInfo(orders, takerAddresses);\n return (ordersInfo, tradersInfo);\n }\n\n /// @dev Fetches balance and allowances for maker and taker of order.\n /// @param order The order structure.\n /// @param takerAddress Address that will be filling the order.\n /// @return Balances and allowances of maker and taker of order.\n function getTraderInfo(LibOrder.Order memory order, address takerAddress)\n public\n view\n returns (TraderInfo memory traderInfo)\n {\n (traderInfo.makerBalance, traderInfo.makerAllowance) = getBalanceAndAllowance(order.makerAddress, order.makerAssetData);\n (traderInfo.takerBalance, traderInfo.takerAllowance) = getBalanceAndAllowance(takerAddress, order.takerAssetData);\n return traderInfo;\n }\n\n /// @dev Fetches balances and allowances of maker and taker for each provided order.\n /// @param orders Array of order specifications.\n /// @param takerAddresses Array of taker addresses corresponding to each order.\n /// @return Array of balances and allowances for maker and taker of each order.\n function getTradersInfo(LibOrder.Order[] memory orders, address[] memory takerAddresses)\n public\n view\n returns (TraderInfo[] memory)\n {\n uint256 ordersLength = orders.length;\n TraderInfo[] memory tradersInfo = new TraderInfo[](ordersLength);\n for (uint256 i = 0; i != ordersLength; i++) {\n tradersInfo[i] = getTraderInfo(orders[i], takerAddresses[i]);\n }\n return tradersInfo;\n }\n\n /// @dev Fetches token balances and allowances of an address to given assetProxy. Supports ERC20 and ERC721.\n /// @param target Address to fetch balances and allowances of.\n /// @param assetData Encoded data that can be decoded by a specified proxy contract when transferring asset.\n /// @return Balance of asset and allowance set to given proxy of asset.\n /// For ERC721 tokens, these values will always be 1 or 0.\n function getBalanceAndAllowance(address target, bytes memory assetData)\n public\n view\n returns (uint256 balance, uint256 allowance)\n {\n bytes4 assetProxyId = assetData.readBytes4(0);\n address token = assetData.readAddress(16);\n address assetProxy = EXCHANGE.getAssetProxy(assetProxyId);\n\n if (assetProxyId == ERC20_DATA_ID) {\n // Query balance\n balance = IERC20Token(token).balanceOf(target);\n\n // Query allowance\n allowance = IERC20Token(token).allowance(target, assetProxy);\n } else if (assetProxyId == ERC721_DATA_ID) {\n uint256 tokenId = assetData.readUint256(36);\n\n // Query owner of tokenId\n address owner = getERC721TokenOwner(token, tokenId);\n\n // Set balance to 1 if tokenId is owned by target\n balance = target == owner ? 1 : 0;\n\n // Check if ERC721Proxy is approved to spend tokenId\n bool isApproved = IERC721Token(token).isApprovedForAll(target, assetProxy) || IERC721Token(token).getApproved(tokenId) == assetProxy;\n \n // Set alowance to 1 if ERC721Proxy is approved to spend tokenId\n allowance = isApproved ? 1 : 0;\n } else {\n revert(\"UNSUPPORTED_ASSET_PROXY\");\n }\n return (balance, allowance);\n }\n\n /// @dev Calls `token.ownerOf(tokenId)`, but returns a null owner instead of reverting on an unowned token.\n /// @param token Address of ERC721 token.\n /// @param tokenId The identifier for the specific NFT.\n /// @return Owner of tokenId or null address if unowned.\n function getERC721TokenOwner(address token, uint256 tokenId)\n public\n view\n returns (address owner)\n {\n assembly {\n // load free memory pointer\n let cdStart := mload(64)\n\n // bytes4(keccak256(ownerOf(uint256))) = 0x6352211e\n mstore(cdStart, 0x6352211e00000000000000000000000000000000000000000000000000000000)\n mstore(add(cdStart, 4), tokenId)\n\n // staticcall `ownerOf(tokenId)`\n // `ownerOf` will revert if tokenId is not owned\n let success := staticcall(\n gas, // forward all gas\n token, // call token contract\n cdStart, // start of calldata\n 36, // length of input is 36 bytes\n cdStart, // write output over input\n 32 // size of output is 32 bytes\n )\n\n // Success implies that tokenId is owned\n // Copy owner from return data if successful\n if success {\n owner := mload(cdStart)\n } \n }\n\n // Owner initialized to address(0), no need to modify if call is unsuccessful\n return owner;\n }\n}\n", + "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n", + "2.0.0/protocol/Exchange/interfaces/IExchange.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n IExchangeCore,\n IMatchOrders,\n ISignatureValidator,\n ITransactions,\n IAssetProxyDispatcher,\n IWrapperFunctions\n{}\n", + "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n", + "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n", + "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n", + "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n", + "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n\n /// @dev Fetches information for all passed in orders\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory);\n}\n", + "2.0.0/protocol/Exchange/libs/LibEIP712.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n bytes32(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n", + "2.0.0/protocol/Exchange/libs/LibFillResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n", + "2.0.0/protocol/Exchange/libs/LibOrder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // bytes32(order.makerAddress),\n // bytes32(order.takerAddress),\n // bytes32(order.feeRecipientAddress),\n // bytes32(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n \n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, makerAssetDataHash)\n mstore(pos3, takerAssetDataHash)\n result := keccak256(pos1, 416)\n \n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n }\n return result;\n }\n}\n", + "2.0.0/tokens/ERC20Token/IERC20Token.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract IERC20Token {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address _to, uint256 _value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n )\n external\n returns (bool);\n \n /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address _spender, uint256 _value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n \n /// @param _owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address _owner)\n external\n view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n external\n view\n returns (uint256);\n}\n", + "2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract IERC721Token {\n\n /// @dev This emits when ownership of any NFT changes by any mechanism.\n /// This event emits when NFTs are created (`from` == 0) and destroyed\n /// (`to` == 0). Exception: during contract creation, any number of NFTs\n /// may be created and assigned without emitting Transfer. At the time of\n /// any transfer, the approved address for that NFT (if any) is reset to none.\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 indexed _tokenId\n );\n\n /// @dev This emits when the approved address for an NFT is changed or\n /// reaffirmed. The zero address indicates there is no approved address.\n /// When a Transfer event emits, this also indicates that the approved\n /// address for that NFT (if any) is reset to none.\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 indexed _tokenId\n );\n\n /// @dev This emits when an operator is enabled or disabled for an owner.\n /// The operator can manage all NFTs of the owner.\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// perator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT. When transfer is complete, this function\n /// checks if `_to` is a smart contract (code size > 0). If so, it calls\n /// `onERC721Received` on `_to` and throws if the return value is not\n /// `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n /// @param _data Additional data with no specified format, sent in call to `_to`\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data\n )\n external;\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev This works identically to the other function with an extra data parameter,\n /// except this function just sets data to \"\".\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external;\n\n /// @notice Change or reaffirm the approved address for an NFT\n /// @dev The zero address indicates there is no approved address.\n /// Throws unless `msg.sender` is the current NFT owner, or an authorized\n /// operator of the current owner.\n /// @param _approved The new approved NFT controller\n /// @param _tokenId The NFT to approve\n function approve(address _approved, uint256 _tokenId)\n external;\n\n /// @notice Enable or disable approval for a third party (\"operator\") to manage\n /// all of `msg.sender`'s assets\n /// @dev Emits the ApprovalForAll event. The contract MUST allow\n /// multiple operators per owner.\n /// @param _operator Address to add to the set of authorized operators\n /// @param _approved True if the operator is approved, false to revoke approval\n function setApprovalForAll(address _operator, bool _approved)\n external;\n\n /// @notice Count all NFTs assigned to an owner\n /// @dev NFTs assigned to the zero address are considered invalid, and this\n /// function throws for queries about the zero address.\n /// @param _owner An address for whom to query the balance\n /// @return The number of NFTs owned by `_owner`, possibly zero\n function balanceOf(address _owner)\n external\n view\n returns (uint256);\n\n /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE\n /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE\n /// THEY MAY BE PERMANENTLY LOST\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n /// @notice Find the owner of an NFT\n /// @dev NFTs assigned to zero address are considered invalid, and queries\n /// about them do throw.\n /// @param _tokenId The identifier for an NFT\n /// @return The address of the owner of the NFT\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address);\n\n /// @notice Get the approved address for a single NFT\n /// @dev Throws if `_tokenId` is not a valid NFT.\n /// @param _tokenId The NFT to find the approved address for\n /// @return The approved address for this NFT, or the zero address if there is none\n function getApproved(uint256 _tokenId) \n public\n view\n returns (address);\n \n /// @notice Query if an address is an authorized operator for another address\n /// @param _owner The address that owns the NFTs\n /// @param _operator The address that acts on behalf of the owner\n /// @return True if `_operator` is an approved operator for `_owner`, false otherwise\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n}\n", + "2.0.0/utils/LibBytes/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n", + "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n" + }, + "sourceTreeHashHex": "0xdd9c7a48a94334d7b34f7df884f9eee20880140fee67b373acfea4082559bd1d", + "compiler": { + "name": "solc", + "version": "soljson-v0.4.24+commit.e67f0147.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + } + } + }, + "networks": {} +}
\ No newline at end of file diff --git a/packages/migrations/package.json b/packages/migrations/package.json index 85bef2b96..4ec9c1b59 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -24,14 +24,14 @@ "generate_contract_wrappers:v2": "abi-gen --abis ${npm_package_config_abis_v2} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0/contract_wrappers --backend ethers", "generate_contract_wrappers:v2-beta-testnet": "abi-gen --abis ${npm_package_config_abis_v2BetaTestnet} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0-beta-testnet/contract_wrappers --backend ethers", "compile:v1": "sol-compiler --artifacts-dir artifacts/1.0.0 --contracts Exchange_v1,DummyERC20Token,ZRXToken,WETH9,TokenTransferProxy_v1,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry", - "compile:v2": "sol-compiler --artifacts-dir artifacts/2.0.0 --contracts AssetProxyOwner,ERC20Token,DummyERC20Token,ERC721Token,DummyERC721Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,ZRXToken,WETH9,IWallet,IValidator", - "compile:v2-beta-testnet": "sol-compiler --artifacts-dir artifacts/2.0.0-beta-testnet --contracts AssetProxyOwner,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,IWallet,IValidator,ERC20Token,ERC721Token,DummyERC20Token" + "compile:v2": "sol-compiler --artifacts-dir artifacts/2.0.0 --contracts AssetProxyOwner,ERC20Token,DummyERC20Token,ERC721Token,DummyERC721Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,ZRXToken,WETH9,IWallet,IValidator,OrderValidator", + "compile:v2-beta-testnet": "sol-compiler --artifacts-dir artifacts/2.0.0-beta-testnet --contracts AssetProxyOwner,DummyERC20Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,IWallet,IValidator,ERC20Token,ERC721Token,OrderValidator" }, "config": { "abis": { "v1": "artifacts/1.0.0/@(DummyERC20Token|TokenTransferProxy_v1|Exchange_v1|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|WETH9).json", - "v2": "artifacts/2.0.0/@(ERC20Token|DummyERC20Token|ERC721Token|DummyERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|ZRXToken|WETH9|IWallet|IValidator).json", - "v2BetaTestnet": "artifacts/2.0.0-beta-testnet/@(ERC20Token|ERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|IWallet|IValidator|DummyERC20Token).json" + "v2": "artifacts/2.0.0/@(ERC20Token|DummyERC20Token|ERC721Token|DummyERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|ZRXToken|WETH9|IWallet|IValidator|OrderValidator).json", + "v2BetaTestnet": "artifacts/2.0.0-beta-testnet/@(ERC20Token|ERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|IWallet|IValidator|OrderValidator).json" } }, "license": "Apache-2.0", diff --git a/packages/migrations/src/2.0.0-beta-testnet/artifacts.ts b/packages/migrations/src/2.0.0-beta-testnet/artifacts.ts index c9a341eb3..5fcf14328 100644 --- a/packages/migrations/src/2.0.0-beta-testnet/artifacts.ts +++ b/packages/migrations/src/2.0.0-beta-testnet/artifacts.ts @@ -4,10 +4,12 @@ import * as AssetProxyOwner from '../../artifacts/2.0.0-beta-testnet/AssetProxyO import * as ERC20Proxy from '../../artifacts/2.0.0-beta-testnet/ERC20Proxy.json'; import * as ERC721Proxy from '../../artifacts/2.0.0-beta-testnet/ERC721Proxy.json'; import * as Exchange from '../../artifacts/2.0.0-beta-testnet/Exchange.json'; +import * as OrderValidator from '../../artifacts/2.0.0-beta-testnet/OrderValidator.json'; export const artifacts = { AssetProxyOwner: (AssetProxyOwner as any) as ContractArtifact, Exchange: (Exchange as any) as ContractArtifact, ERC20Proxy: (ERC20Proxy as any) as ContractArtifact, ERC721Proxy: (ERC721Proxy as any) as ContractArtifact, + OrderValidator: (OrderValidator as any) as ContractArtifact, }; diff --git a/packages/migrations/src/2.0.0-beta-testnet/migration.ts b/packages/migrations/src/2.0.0-beta-testnet/migration.ts index 19fe5f02c..c5780615f 100644 --- a/packages/migrations/src/2.0.0-beta-testnet/migration.ts +++ b/packages/migrations/src/2.0.0-beta-testnet/migration.ts @@ -12,6 +12,7 @@ import { AssetProxyOwnerContract } from './contract_wrappers/asset_proxy_owner'; import { ERC20ProxyContract } from './contract_wrappers/erc20_proxy'; import { ERC721ProxyContract } from './contract_wrappers/erc721_proxy'; import { ExchangeContract } from './contract_wrappers/exchange'; +import { OrderValidatorContract } from './contract_wrappers/order_validator'; /** * Custom migrations should be defined in this function. This will be called with the CLI 'migrate:v2-beta-testnet' command. @@ -75,6 +76,15 @@ export const runV2TestnetMigrationsAsync = async ( ); artifactsWriter.saveArtifact(assetProxyOwner); + // Deploy OrderValidator + const orderValidator = await OrderValidatorContract.deployFrom0xArtifactAsync( + artifacts.OrderValidator, + provider, + txDefaults, + exchange.address, + ); + artifactsWriter.saveArtifact(orderValidator); + // Authorize Exchange contracts to call AssetProxies txHash = await erc20proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address); logUtils.log(`transactionHash: ${txHash}`); diff --git a/packages/migrations/src/2.0.0/artifacts.ts b/packages/migrations/src/2.0.0/artifacts.ts index 8bbd1fcd9..da0dec6c0 100644 --- a/packages/migrations/src/2.0.0/artifacts.ts +++ b/packages/migrations/src/2.0.0/artifacts.ts @@ -7,6 +7,7 @@ import * as ERC20Proxy from '../../artifacts/2.0.0/ERC20Proxy.json'; import * as ERC721Proxy from '../../artifacts/2.0.0/ERC721Proxy.json'; import * as Exchange from '../../artifacts/2.0.0/Exchange.json'; import * as Forwarder from '../../artifacts/2.0.0/Forwarder.json'; +import * as OrderValidator from '../../artifacts/2.0.0/OrderValidator.json'; import * as WETH9 from '../../artifacts/2.0.0/WETH9.json'; import * as ZRX from '../../artifacts/2.0.0/ZRXToken.json'; @@ -20,4 +21,5 @@ export const artifacts = { ERC20Proxy: (ERC20Proxy as any) as ContractArtifact, ERC721Proxy: (ERC721Proxy as any) as ContractArtifact, Forwarder: (Forwarder as any) as ContractArtifact, + OrderValidator: (OrderValidator as any) as ContractArtifact, }; diff --git a/packages/migrations/src/2.0.0/migration.ts b/packages/migrations/src/2.0.0/migration.ts index 0566e67e8..bddb020d2 100644 --- a/packages/migrations/src/2.0.0/migration.ts +++ b/packages/migrations/src/2.0.0/migration.ts @@ -14,6 +14,7 @@ import { ERC20ProxyContract } from './contract_wrappers/erc20_proxy'; import { ERC721ProxyContract } from './contract_wrappers/erc721_proxy'; import { ExchangeContract } from './contract_wrappers/exchange'; import { ForwarderContract } from './contract_wrappers/forwarder'; +import { OrderValidatorContract } from './contract_wrappers/order_validator'; import { WETH9Contract } from './contract_wrappers/weth9'; import { ZRXTokenContract } from './contract_wrappers/zrx_token'; @@ -75,6 +76,7 @@ export const runV2MigrationsAsync = async (provider: Provider, artifactsDir: str secondsRequired, ); artifactsWriter.saveArtifact(assetProxyOwner); + await web3Wrapper.awaitTransactionSuccessAsync( await erc20proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner, @@ -139,4 +141,14 @@ export const runV2MigrationsAsync = async (provider: Provider, artifactsDir: str assetDataUtils.encodeERC20AssetData(etherToken.address), ); artifactsWriter.saveArtifact(forwarder); + + // OrderValidator + const orderValidator = await OrderValidatorContract.deployFrom0xArtifactAsync( + artifacts.OrderValidator, + provider, + txDefaults, + exchange.address, + zrxAssetData, + ); + artifactsWriter.saveArtifact(orderValidator); }; diff --git a/packages/order-watcher/package.json b/packages/order-watcher/package.json index 9c8f7f411..510b3f023 100644 --- a/packages/order-watcher/package.json +++ b/packages/order-watcher/package.json @@ -29,7 +29,7 @@ "manual:postpublish": "yarn build; node ./scripts/postpublish.js" }, "config": { - "contracts_v2_beta": "AssetProxyOwner ERC20Proxy ERC20Token ERC721Proxy ERC721Token Exchange Forwarder WETH9 ZRXToken" + "contracts_v2_beta": "AssetProxyOwner ERC20Proxy ERC20Token ERC721Proxy ERC721Token Exchange Forwarder OrderValidator WETH9 ZRXToken" }, "repository": { "type": "git", |